// ==UserScript==
// @name iks: virtonomica оптовое строительство (добавил выбор региона и страны)
// @namespace virtonomica
// @description Автоматический запуск постройки нескольких подразделений одного типа, кроме офисов. origin: https://greasyfork.org/ru/scripts/9228-iks-virtonomica-%D0%BE%D0%BF%D1%82%D0%BE%D0%B2%D0%BE%D0%B5-%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D1%81%D1%82%D0%B2%D0%BE
// @include http*://*virtonomic*.*/*/main/unit/create/*
// @include http*://*virtonomic*.*/*/main/unit/view/*
// @include http*://*virtonomic*.*/*/main/company/view/*/*
// @version 10.46
// @grant none
// ==/UserScript==
function test(){
var data = [];
data.push({"unitCreateData[unit_class]":"2043"
,"unitCreateData[unit_type]":"423140"
,"unitCreateData[country]":"2931"
,"unitCreateData[region]":"2939"
,"unitCreateData[city]":"422088"
,"unitCreateData[produce]":"423150"
,"unitCreateData[produce_bound]":"423145"
,"unitCreateData[techno_level]":"1"
,"numUnit":"1"
,"timeUpClik":"0"
});
data.push({"unitCreateData[unit_class]":"2043"
,"unitCreateData[unit_type]":"423140"
,"unitCreateData[country]":"2931"
,"unitCreateData[region]":"2939"
,"unitCreateData[city]":"422088"
,"unitCreateData[produce]":"423150"
,"unitCreateData[produce_bound]":"423145"
,"unitCreateData[techno_level]":"1"
,"numUnit":"1"
,"timeUpClik":"0"
});
data.push({"unitCreateData[unit_class]":"2043"
,"unitCreateData[unit_type]":"423140"
,"unitCreateData[country]":"2931"
,"unitCreateData[region]":"2939"
,"unitCreateData[city]":"422088"
,"unitCreateData[produce]":"423150"
,"unitCreateData[produce_bound]":"423145"
,"unitCreateData[techno_level]":"1"
,"numUnit":"1"
,"timeUpClik":"0"
});
function setVal(spName, pValue){
window.localStorage.setItem(spName, JSON.stringify(pValue));
}
setVal("nextCreateUnitCount", 1);
setVal("nextCreateUnits_1", data);
}
/**************************************************/
var run = function() {
function getVal(spName){
return JSON.parse(window.localStorage.getItem(spName));
}
function setVal(spName, pValue){
window.localStorage.setItem(spName, JSON.stringify(pValue));
}
function delVal(spName){
window.localStorage.removeItem(spName);
}
function getLocale() {
return (document.location.hostname === 'virtonomica.ru') ? 'ru' : 'en';
}
function getRealm(){
var svHref = window.location.href;
var matches = svHref.match(/\/(\w+)\/main\//);
return matches[1];
}
function getCountry(numOfAddition) {
return $('#choose_country_'+ numOfAddition).val();
}
function getRegion(numOfAddition) {
return $('#choose_region_'+ numOfAddition).val();
}
function loadCountries(callback, numOfAddition) {
var realm = getRealm();
var suffix = (getLocale() == 'en') ? '_en' : '';
$.getJSON('https://cobr123.github.io/by_trade_at_cities/'+realm+'/countries'+suffix+'.json', function (data) {
var output = '';
$.each(data, function (key, val) {
output += '<option value="'+val.i+'">'+val.c+'</option>';
});
$('#choose_country_'+ numOfAddition).html(output).trigger("chosen:updated");
if(typeof(callback) === 'function') {
callback();
} else {
loadRegions(callback, numOfAddition);
}
});
return false;
}
function loadRegions(callback, numOfAddition) {
var realm = getRealm();
var svCountryId = getCountry(numOfAddition);
var locale = getLocale();
var suffix = (locale == 'en') ? '_en' : '';
var allRegions = (locale == 'en') ? 'All regions' : 'Все регионы';
$.getJSON('https://cobr123.github.io/by_trade_at_cities/'+realm+'/regions'+suffix+'.json', function (data) {
var output = '<option value="" selected="">'+allRegions+'</option>';
if (svCountryId == null || svCountryId == '') {
$.each(data, function (key, val) {
output += '<option value="'+val.i+'">'+val.c+'</option>';
});
} else {
$.each(data, function (key, val) {
if(val.ci == svCountryId){
output += '<option value="'+val.i+'">'+val.c+'</option>';
}
});
}
$('#choose_region_'+ numOfAddition).html(output).trigger("chosen:updated");
if(typeof(callback) === 'function') {
callback();
} else {
loadTowns(callback, numOfAddition);
}
});
return false;
}
function updateTotalBuildCnt() {
var total_build_cnt = 0;
var impNumUnitMain = parseInt($('#impNumUnit').val()) || 0;
total_build_cnt += impNumUnitMain;
$('select[id^="choose_town"]').each( function() {
var sel = $(this);
var suf = sel.attr('id').substr('choose_town'.length);
var impNumUnit = parseInt($('#impNumUnit' + suf).val()) || 0;
if(sel.val() == ''){
var current = impNumUnit * ($('> option', sel).length - 1);
total_build_cnt += current;
} else {
total_build_cnt += impNumUnit;
}
});
$('#total_build_cnt').val(total_build_cnt);
}
function loadTowns(callback, numOfAddition) {
var realm = getRealm();
var svCountryId = getCountry(numOfAddition);
var svRegionId = getRegion(numOfAddition);
var locale = getLocale();
var suffix = (locale == 'en') ? '_en' : '';
var allTowns = (locale == 'en') ? 'All cities' : 'Все города';
$.getJSON('https://cobr123.github.io/by_trade_at_cities/'+realm+'/cities'+suffix+'.json', function (data) {
var output = '';
var cnt = 0;
$.each(data, function (key, val) {
if(svRegionId != null && svRegionId != '' && val.ri == svRegionId){
output += '<option value="'+val.i+'" region_id="'+val.ri+'" country_id="'+val.ci+'">'+val.c+'</option>';
++cnt;
} else if(svCountryId != null && svCountryId != '' && val.ci == svCountryId && (svRegionId == null || svRegionId == '')){
output += '<option value="'+val.i+'" region_id="'+val.ri+'" country_id="'+val.ci+'">'+val.c+'</option>';
++cnt;
} else if((svCountryId == null || svCountryId == '') && (svRegionId == null || svRegionId == '')){
output += '<option value="'+val.i+'" region_id="'+val.ri+'" country_id="'+val.ci+'">'+val.c+'</option>';
++cnt;
}
});
output = '<option value="" selected="" region_id="" country_id="">'+allTowns+' ('+ cnt +')</option>' + output;
$('#choose_town_'+ numOfAddition).html(output).trigger("chosen:updated");
updateTotalBuildCnt();
if(typeof(callback) === 'function') {
callback();
}
});
return false;
}
$(document).keydown(function(e) {
if( e.keyCode === 27 ) {
delVal("createUnit");
delVal("newUnit");
delVal("nextCreateUnitCount");
}
});
var cooki = getVal("createUnit"),
nextCreateUnitCount = getVal("nextCreateUnitCount"),
nextCreateUnits = getVal("nextCreateUnits_" + nextCreateUnitCount),
o = {};
//console.log('cooki = ' + cooki);
//if(nextCreateUnits){
// console.log('nextCreateUnits = ' + true);
//}
if (nextCreateUnits) {
var tmpArr = nextCreateUnits;
//console.log('tmpArr = ' + tmpArr);
console.log('nextCreateUnits.length = ' + tmpArr.length);
if (tmpArr.length > 0) {
//The shift() method removes the first item of an array, and returns that item.
var nextUnit = tmpArr.shift();
var getNext = false;
if (cooki) {
o = cooki;
if(parseInt(o["numUnit"]) <= 0) {
getNext = true;
}
} else {
getNext = true;
}
if(getNext){
cooki = nextUnit;
//console.log('cooki = ' + cooki);
setVal("createUnit", cooki);
if(tmpArr.length == 0){
delVal("nextCreateUnits_" + nextCreateUnitCount );
setVal("nextCreateUnitCount", parseInt(nextCreateUnitCount) - 1 );
} else {
setVal("nextCreateUnits_" + nextCreateUnitCount, tmpArr );
}
}
}
}
if (cooki) {
o = cooki;
var n = parseInt(o["numUnit"]),
timeUpClik = parseInt(o["timeUpClik"]) *1000;
console.log('numUnit = ' + n);
if(n>0) {
var prov = 1;
$("input:radio").each( function() {
if ( o[ $(this).attr('name') ] ) {
if ( $(this).val() == o[ $(this).attr('name') ] ) {
prov = 0;
$.when(this).then(function(id){
$(id).prop('checked','checked');
}).then(function(id){
if(timeUpClik > 0) setTimeout( function(){ $('input.button250[name="next"]').click(); }, timeUpClik);
else $('input.button250[name="next"]').click();
});
}
} else if( window.location.href.indexOf('/main/unit/create/') + 1 ) delVal("createUnit");
});
$('input.button250[name!="next"]').each( function() {
prov = 0;
o["numUnit"] = n - 1;
setVal("createUnit", o );
var numberOfUnitsTitle = (getLocale() == 'en') ? 'Number of units' : 'Количество подразделений';
$("div#mainContent > table > tbody > tr > td > form > table.list").append('<th>' + numberOfUnitsTitle + '</th><td style="color:blue"> <b>' + n + '</b></td>');
// если вы хотите подтверждать вручную создание подразделений
// при последней стадии то заблокируйте две строки ниже;
// поставив перед ними две косые //
if(timeUpClik > 0) setTimeout( $(this).click(), timeUpClik);
else $(this).click();
});
$('a:has(img[src="/img/icon/unit_build.png"])').each(function() {
prov = 0;
$(this).attr("href", $(this).attr("href") + "?old");
if(timeUpClik > 0) setTimeout( this.click(), timeUpClik);
else this.click();
});
if ( prov > 0 ) {
$('a:contains("Предприятия")').each(function() {
if(timeUpClik > 0) setTimeout( this.click(), timeUpClik);
else this.click();
});
}
} else {
delVal("createUnit");
$('a:contains("Строящиеся")').each(function() {
if(timeUpClik > 0) setTimeout( this.click(), timeUpClik);
else this.click();
});
$('a:contains("Under construction")').each(function() {
if(timeUpClik > 0) setTimeout( this.click(), timeUpClik);
else this.click();
});
}
} else {
// Запомним параметры создаваемых подразделений
cooki = getVal("newUnit");
if (cooki) o = cooki;
//скрываем чтобы не возникало вопросов по правильному выбору
if (/\/\w+\/main\/unit\/create\/\d+\/step1-type-select/.test(window.location)) {
$('#product-all').hide();
$('ul[class="category_select"]').hide();
$('div[class="new_down"]').hide();
$('div[class="hr_boldest"]').hide();
//
$('input[id^="utp-"]').click(function() {
var ed = $(this);
o[ ed.attr('name') ] = ed.val();
setVal("newUnit", o );
});
}
$("td:contains('образованности')").next().each(function() {
$('div#mainContent > table > tbody > tr > td > form > table.list > tbody > tr').each(function() {
if( $(this).find('td > input:radio') ) {
var n = parseFloat( $(this).find('td:nth-child(4)').html() );
if(n>0){
var n1 = $(this).find('td:nth-child(5)').html().replace(/\s+/g, '').replace(/\$/g, '');
n1 = parseFloat( n1 );
$(this).find('td:nth-child(4)').append(' <span title="цена за единицу образованости" style="font-size:x-small; color:blue">(1<span style="color:#000">/$</span>'+(n1/n).toFixed(2)+')</span>');
}
}
});
});
$("input:radio").click( function() {
$('table.list > tbody:nth-child(1) > tr:nth-child(1):contains("Технология")').each( function() {
var alertTitle = (getLocale() == 'en') ? 'You do want to buy technology you not studied?' : 'Вы хотите купить не изученную вами технологию?';
if( parseFloat( $("input:radio:checked").parent().next().next().text().replace(/\s+/g, '').replace(/\$/, '') ) > 0) alert(alertTitle);
});
if( $(this).attr('name') == "unitCreateData[unit_class]" ) o = {};
});
var addition_num = 0;
var additionallyTitle = (getLocale() == 'en') ? 'Additional' : 'Дополнительно';
var addAdditionallyTitle = (getLocale() == 'en') ? 'Add an additional' : 'Добавить дополнительно';
var delAdditionallyTitle = (getLocale() == 'en') ? 'Delete an additional' : 'Удалить дополнительно';
var countryTitle = (getLocale() == 'en') ? 'Country' : 'Страна';
var regionTitle = (getLocale() == 'en') ? 'Region' : 'Регион';
var townTitle = (getLocale() == 'en') ? 'City' : 'Город';
var totalNewUnitsTitle = (getLocale() == 'en') ? 'Total new units' : 'Всего новых юнитов';
// Установим количество создаваемых подразделений
$('input.button250[name!="next"]').each( function() {
if (o["unitCreateData[unit_class]"] != "1815") {
var n = 1;
if (o["numUnit"] ) n = parseInt(o["numUnit"]);
else o["numUnit"] = n;
var numberOfUnitsTitle = (getLocale() == 'en') ? 'Number of units' : 'Количество подразделений';
var latencyTitle = (getLocale() == 'en') ? 'Latency (sec.) between click in transitions' : 'Задержка сек. клика при переходах';
var paramList = $("div#mainContent > table > tbody > tr > td > form > table.list");
paramList.append('<tr><th>'+ numberOfUnitsTitle +'</th><td><input type="text" value="' + n + '" id="impNumUnit" style="width: 100%"></input></td></tr>'
+'<tr><th>'+ latencyTitle +'</th><td><input type="text" value="0" id="impTimeUpClik" style="width: 100%"></input></td></tr>'
+''
+'<tr><th> </th><td><input type="button" id="add_addition" style="width: 100%" value="'+ addAdditionallyTitle +'"></input></td></tr>'
+'<tr><th>'+ totalNewUnitsTitle +'</th><td><input id="total_build_cnt" value="1" style="width: 100%" readonly></input></td></tr>'
);
function loadCountriesRegionsTowns(numOfAddition) {
var loadTownsCallback = function() {
if(numOfAddition == 1) {
$('#choose_town_'+ numOfAddition).val(o["unitCreateData[city]"]);
}
updateTotalBuildCnt();
};
var loadRegionsCallback = function() {
if(numOfAddition == 1) {
$('#choose_region_'+ numOfAddition).val(o["unitCreateData[region]"]);
}
loadTowns(loadTownsCallback, numOfAddition);
};
var loadCountryCallback = function() {
if(numOfAddition == 1) {
$('#choose_country_'+ numOfAddition).val(o["unitCreateData[country]"]);
}
loadRegions(loadRegionsCallback, numOfAddition);
};
loadCountries(loadCountryCallback, numOfAddition);
$('#choose_town_'+ numOfAddition).change(function(){
updateTotalBuildCnt();
});
$('#choose_country_'+ numOfAddition).change(function(){
loadRegions(null, numOfAddition);
});
$('#choose_region_'+ numOfAddition).change(function(){
loadTowns(null, numOfAddition);
});
}
$('#add_addition').bind("change keyup input click", function() {
++addition_num;
$('#add_addition').parent().parent().before('<tr><th>'+ additionallyTitle +' '+ addition_num +'</th><td id="addition_build_'+ addition_num +'">'
+ countryTitle +'<select id="choose_country_'+ addition_num +'" style="width: 100%"></select><br>'
+ regionTitle +'<select id="choose_region_'+ addition_num +'" style="width: 100%"></select><br>'
+ townTitle +'<select id="choose_town_'+ addition_num +'" style="width: 100%"></select><br>'
+ numberOfUnitsTitle +'<input type="text" value="' + n + '" id="impNumUnit_'+ addition_num +'" style="width: 100%"></input><br>'
+'<input type="button" id="del_addition_'+ addition_num +'" style="width: 100%" value="'+ delAdditionallyTitle +' '+ addition_num +'"></input></td></tr>'
);
loadCountriesRegionsTowns(addition_num);
$('#del_addition_'+ addition_num).bind("change keyup input click", function() {
$(this).parent().parent().remove();
updateTotalBuildCnt();
});
});
}
});
// Пропускаем только цифры
var numVal = function(v, v1) {
var num = $(v).val().replace(/[^0-9]/g, '') || 0;
$(v).val( num );
o[v1] = num;
};
$('#impNumUnit').bind("change keyup input click", function() {
numVal(this, "numUnit");
updateTotalBuildCnt();
});
$('#impTimeUpClik').bind("change keyup input click", function() {
numVal(this, "timeUpClik");
});
//
$("input.button250").click( function() {
if ($(this).attr('name') == "next") {
$("input:radio:checked").each( function() {
o[ $(this).attr('name') ] = $(this).val();
});
setVal("newUnit", o );
} else {
delVal("newUnit");
var dataNextUnitList = [];
var impNumUnit = parseInt($('#impNumUnit').val());
$('select[id^="choose_town"]').each( function() {
var sel = $(this);
var suf = sel.attr('id').substr('choose_town'.length);
var impNumUnitAdd = parseInt($('#impNumUnit' + suf).val());
if(sel.val() == ''){
$('> option', sel).each( function() {
var option = $(this);
if(option.attr('value') != ''){
var tmp = {
"unitCreateData[country]": option.attr('country_id')
,"unitCreateData[region]": option.attr('region_id')
,"unitCreateData[city]": option.attr('value')
,"numUnit": impNumUnitAdd
};
// Merge defaults and options, without modifying defaults
var item = $.extend( {}, o, tmp );
dataNextUnitList.push(item);
}
});
} else {
var option = $("> option:selected", sel);
var tmp = {
"unitCreateData[country]": option.attr('country_id')
,"unitCreateData[region]": option.attr('region_id')
,"unitCreateData[city]": option.attr('value')
,"numUnit": impNumUnitAdd
};
// Merge defaults and options, without modifying defaults
var item = $.extend( {}, o, tmp );
dataNextUnitList.push(item);
}
});
//alert(JSON.stringify( data ));
var i, j, temparray, chunk = 10, cnt = 0;
for (i = 0, j = dataNextUnitList.length; i < j; i += chunk) {
temparray = dataNextUnitList.slice(i, i + chunk);
// do whatever
++cnt;
setVal("nextCreateUnits_" + cnt, temparray );
}
setVal("nextCreateUnitCount", cnt );
if(parseInt(o['numUnit']) > 0) {
o['numUnit'] = parseInt(o['numUnit']) - 1;
}
setVal("createUnit", o );
var alertTitle = (getLocale() == 'en') ? 'Press Esc to cancel the script' : 'Для отмены работы скрипта нажмите клавишу Esc';
alert(alertTitle);
}
});
}
}
function getVal(spName){
return JSON.parse(window.localStorage.getItem(spName));
}
if(window.top == window && ( getVal('createUnit') || window.location.href.indexOf('main/unit/create') + 1 ) ) {
var script = document.createElement('script');
script.textContent = ' (' + run.toString() + ')();';
document.documentElement.appendChild(script);
}