// ==UserScript==
// @name Supremacy Ressource Helper
// @version 0.1
// @description Can calculate various important statistics for the browsergame Supremacy 1914.
// @match http://www.supremacy1914.de/play.php?L=1&gameID=*
// @copyright 2014, Zahlii
// @namespace https://greasyfork.org/users/6229
// ==/UserScript==
function addGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
head.appendChild(style);
}
function clone(item) {
if (!item) { return item; } // null, undefined values check
var types = [ Number, String, Boolean ],
result;
// normalizing primitives if someone did new String('aaa'), or new Number('444');
types.forEach(function(type) {
if (item instanceof type) {
result = type( item );
}
});
if (typeof result == "undefined") {
if (Object.prototype.toString.call( item ) === "[object Array]") {
result = [];
item.forEach(function(child, index, array) {
result[index] = clone( child );
});
} else if (typeof item == "object") {
// testing that this is DOM
if (item.nodeType && typeof item.cloneNode == "function") {
var result = item.cloneNode( true );
} else if (!item.prototype) { // check that this is a literal
if (item instanceof Date) {
result = new Date(item);
} else {
// it is an object literal
result = {};
for (var i in item) {
result[i] = clone( item[i] );
}
}
} else {
// depending what you would like here,
// just keep the reference, or create new object
if (false && item.constructor) {
// would not advice to do that, reason? Read below
result = new item.constructor();
} else {
result = item;
}
}
} else {
result = item;
}
}
return result;
}
addGlobalStyle('td, th { text-align:center; }');
function handleGameSite() {
var GAME_ID = location.href.match(/gameID=(\d+)/)[1];
function ArmyCalculator() {
var mainDiv;
var mainDocument;
var mapContainer;
var ressourceContainer;
var newspaperContainer;
var diplomacyTable;
var diplomacyContainer;
var provinceContainer;
var _this = this;
var hideOverriddenContainer = function() {
newspaperContainer.style.display = 'none';
newspaperContainer.style.zIndex = '-1000';
ressourceContainer.style.display = 'block';
diplomacyContainer.style.display = 'none';
};
this.init = function(main, cont) {
mainDiv = main;
mainDocument = cont;
mapContainer = mainDocument.getElementById('mapContainer');
ressourceContainer = mainDocument.getElementById('resource_bar');
newspaperContainer = mainDocument.getElementById('newspaperContainer');
diplomacyContainer = mainDocument.getElementById('diplomacyContainer');
provinceContainer = mainDocument.getElementById('provinceListContainer');
window.setTimeout(function() {
//mainDocument.getElementById('func_btn_diplomacy').click();
//diplomacyTable = mainDocument.getElementById('func_diplomacy_table');
//_this.getDiplomacyData();
}, 1000);
_this.Ressources = new Ressources();
_this.Provinces = new Provinces();
};
/*
var data = [{
num:30,
moral:89
},{
num:80,
moral:76
},{
num:70,
moral:89
}];
function calcValForPlayer(x) {
var res = data[x].num * (16 * data[x].moral/100 - 4);
console.log(x,res);
return res;
}
function calcForPlayer(x) {
var sum = 0;
for(var i=0,l=data.length;i<l;i++) {
sum += calcValForPlayer(i);
}
console.log(sum);
return calcValForPlayer(x)/sum*2000;
}
alert(calcForPlayer(2));
*/
var diplomacyData = [];
this.getDiplomacyData = function() {
var r = diplomacyTable.getElementsByClassName('func_player_row');
var detail;
var i = 0;
function handleNext() {
if (i >= r.length) {
handleStop();
return;
}
var td = r[i].getElementsByTagName('td');
i++;
td[10].getElementsByClassName('info_button')[0].click();
window.setTimeout(function() {
detail = mainDocument.getElementById('playerDetailContainer');
var ent = detail.getElementsByClassName('detail_entry');
var ind = ent.length > 6 ? 5 : 3;
diplomacyData.push({
playerCountryFlag: td[0].getElementsByTagName('img')[0].src,
playerCountryName: td[1].textContent,
playerName: td[3].textContent,
playerProvinceCount: parseInt(td[4].textContent, 10),
playerPowerIndex: parseInt(td[6].textContent),
playerIsKI: (td[7].innerHTML.match(/inactive/) ? true : false),
playerAvgMoral: parseFloat(ent[ind].getElementsByClassName('sg_float_l')[0].textContent.replace(/%/, ''))
});
handleNext();
}, 200);
}
function handleStop() {
window.setTimeout(function() {
console.log(diplomacyData);
detail.getElementsByClassName('close_button')[0].click();
diplomacyContainer.getElementsByClassName('close_button')[0].click();
}, 100);
}
handleNext();
};
var stringFill = function(x, n) {
var s = '';
for (;;) {
if (n & 1)
s += x;
n >>= 1;
if (n)
x += x;
else
break;
}
return s;
};
var pad = function(n, l, p) {
if (l == null)
l = 2;
if (p == null)
p = '0';
n = '' + n;
return stringFill(p, l - n.length) + n;
};
var formatInterval = function(time) {
if (time < 0)
return '-';
if(time == Number.POSITIVE_INFINITY)
return '∞';
var days = Math.floor(time / (24 * 3600 * 1000));
time -= days * (24 * 3600 * 1000);
var hours = Math.floor(time / (3600 * 1000));
time -= hours * (3600 * 1000);
var minutes = Math.floor(time / (60 * 1000));
time -= minutes * (60 * 1000);
var seconds = Math.floor(time / 1000);
var dayS = (days > 1 ? days + ' Tage, ' : (days > 0 ? '1 Tag, ' : ''));
var hoursS = hours > 0 ? pad(hours) + 'h ' : '';
var minS = minutes > 0 ? pad(minutes) + 'm ' : '';
var secS = pad(seconds) + 's';
return dayS + hoursS + minS + secS;
}
var formatTime = function(date) {
if (date == null)
date = new Date();
return pad(date.getDate()) + '.' + pad(date.getMonth() + 1) + '.' + date.getFullYear() + ' ' + pad(date.getHours()) + ':' + pad(date.getMinutes()) + ':' + pad(date.getSeconds());
};
var formatNumber = function(n) {
return number_format(n, 0, ',', '.');
};
var getTime = function(dateStr) {
var parts = dateStr.split(/[\.\s:]/);
return new Date(parts[2], parts[1] == 0 ? 11 : parts[1] - 1, parts[0], parts[3], parts[4], parts[5]);
};
this.displayOverriddenContainer = function(title, content) {
var html = ' <div class="main_popup_container">' +
' <div class="dialog_background_layer_80" id="func_modal_dialog"></div>' +
' <div class="metal_panel metal_dialog_header popup_shadow">' +
' <div class="metal_dialog_header_deco">' +
' <div class="deco-Scharnier"></div>' +
' </div>' +
' <div class="wooden_panel">' +
' <h1 class="capitals autoResizeLine">' + title + '</h1>' +
' </div>' +
' <div class="metal_dialog_close_area">' +
' <div class="close_button metal_dialog_close_button func_close_button">' +
' </div>' +
' </div>' +
' </div>' +
' <div class="metal_panel metal_dialog_body popup_shadow_bottom">' +
' <div class="wooden_panel">' +
' <div class="wooden_panel_content">' +
' <div class="paper_panel">' +
' <div class="paper_panel_content func_dialog_content">' +
content +
' </div>' +
' </div>' +
' </div>' +
' </div>' +
' </div>' +
' </div>';
ressourceContainer.style.display = 'none';
newspaperContainer.style.display = 'block';
newspaperContainer.innerHTML = html;
newspaperContainer.style.zIndex = 1005;
window.setTimeout(function() {
newspaperContainer.getElementsByClassName('metal_dialog_close_area')[0].addEventListener('click', hideOverriddenContainer);
}, 100);
};
// type IN 'date', 'interval', 'number'
this.format = function(n, type, symbol) {
var symbol = symbol === null ? '' : symbol;
switch (type) {
case 'date':
return formatTime(n);
case 'interval':
return formatInterval(n);
case 'number':
return formatNumber(n) + symbol;
}
}
function Provinces() {
var self = this;
var provinces;
var sumInfo;
var table;
var extract = function() {
provinces = [];
var tr = table.getElementsByTagName('tr');
var slots = 0;
for (var i = 0, l = tr.length; i < l; i++) {
var t = tr[i];
var td = t.getElementsByTagName('td');
var res = td[0].innerHTML.match(/icons-resource_(\d+)(_double)?/);
var buildings = td[2].getElementsByClassName('prov_list_building_slot');
var bName = ['Festung', 'Hafen', 'Eisenbahn', 'Wehramt', 'Kaserne', 'Fabrik'];
var bInfo = {};
for (var j = 0, k = buildings.length; j < k; j++) {
var b = buildings[j];
if (b.innerHTML == ' ') {
bInfo[bName[j]] = {
buildingType: bName[j],
buildingLevel: 0,
buildingIsActive: false,
buildingProgress: 0
};
} else {
var level = b.getElementsByClassName('upgrade_level')[0] ? parseInt(b.getElementsByClassName('upgrade_level')[0].textContent, 10) : 1;
var progress = b.innerHTML.match(/condition_(\d+)/) ? parseInt(b.innerHTML.match(/condition_(\d+)/)[1], 10) : 100;
bInfo[bName[j]] = {
buildingType: bName[j],
buildingLevel: level,
buildingIsActive: level > 1 || progress == 100,
buildingProgress: progress
};
}
}
var data = {
provinceID: parseInt(t.getAttribute('province_id'), 10),
provinceRessourceID: parseInt(res[1], 10),
provinceIsDouble: (res[2] == '_double'),
provinceName: td[1].textContent.trim(),
provinceIsCapital: (td[1].innerHTML.match(/non_capital/) ? false : true),
provinceBuildings: bInfo,
provinceIsBuilding: td[3].innerHTML.match(/icons-infoicon_building/) ? false : true,
provinceIsProducing: td[4].innerHTML.match(/icons-infoicon_production/) ? false : true,
};
var prod = data.provinceIsDouble ? 3136 * 2 : 3136;
var tax = data.provinceIsDouble ? 2598 * 2 : 2598;
var inc_prod = prod;
if (data.provinceBuildings.Hafen.buildingActive) {
inc_prod += 0.25 * prod;
}
if (data.provinceBuildings.Eisenbahn.buildingActive) {
inc_prod += 0.33 * prod;
}
data.provinceMaxProduction = Math.floor(inc_prod, 0);
data.provinceMaxTax = tax;
data.provinceMightProduce = data.provinceBuildings.Fabrik.buildingIsActive && !data.provinceIsProducing;
if (data.provinceMightProduce)
slots++;
provinces.push(data);
}
var mapping = {
0:'Nahrung',
1:'Nahrung',
2:'Baumaterial',
3:'Baumaterial',
4:'Energie',
5:'Energie',
6:'Energie',
20:'Geld'
};
var totalConsume = {
'Geld': 0,
'Nahrung': 0,
'Baumaterial': 0,
'Energie': 0
}, baseConsume = {
'Geld': 0,
'Nahrung': 0,
'Baumaterial': 0,
'Energie': 0
}, totalProduce = {
'Geld': 0,
'Nahrung': 0,
'Baumaterial': 0,
'Energie': 0
}, totalResult = {
'Geld': {},
'Nahrung': {},
'Baumaterial': {},
'Energie': {}
};
for (var y = 0, o = provinces.length; y < o; y++) {
var d = provinces[y];
var id = d.provinceRessourceID;
var am = d.provinceMaxProduction;
totalProduce[mapping[id]] += am;
totalProduce['Geld'] += d.provinceMaxTax;
totalConsume['Geld'] += 250;
totalConsume['Nahrung'] += 800;
totalConsume['Baumaterial'] += 800;
totalConsume['Energie'] += 800;
/*baseConsume['Geld'] += 250;
baseConsume['Nahrung'] += 800;
baseConsume['Baumaterial'] += 800;
baseConsume['Energie'] += 800;*/
if (d.provinceBuildings.Kaserne.buildingIsActive) {
totalConsume['Nahrung'] += 1000 * d.provinceBuildings.Kaserne.buildingLevel;
totalConsume['Geld'] += 500 * d.provinceBuildings.Kaserne.buildingLevel;
}
if (d.provinceBuildings.Eisenbahn.buildingIsActive) {
totalConsume['Energie'] += 500;
}
}
var k = ['Geld','Nahrung','Baumaterial','Energie'];
for(var i=0,l=k.length;i<l;i++) {
var ck = k[i];
var dif = totalProduce[ck] - totalConsume[ck];
totalResult[ck] = {
amountPerDay:dif,
amountPerHour:Math.round(dif/24,2)
};
}
console.log(totalResult);
sumInfo = {
provinceCount: tr.length,
freeProducingSlots: slots
};
};
var init = function() {
table = mainDocument.getElementById('province_table');
extract();
}
init();
};
function Ressources() {
var self = this;
var ressources = [];
var buildingQueue = [];
this.addBuildingToQueue = function(type) {
buildingQueue.push({
buildingType: type,
buildingPosition: buildingQueue.length,
buildingRequirements: neededMap[type],
buildingInfo:{}
});
self.recalculateQueue();
};
this.removeFromBuildingQueue = function(index) {
if(index < 0 || index >= buildingQueue.length)
return;
buildingQueue.splice(index,1);
self.recalculateQueue();
};
this.recalculateQueue = function() {
var currentRes = clone(ressources);
for(var i=0,l=buildingQueue.length;i<l;i++) {
var e = buildingQueue[i];
var n = e.buildingRequirements;
var t = self.getTimeNeededForRessource(n, currentRes);
for(var prop in n) {
if(!n.hasOwnProperty(prop))
continue;
prop = parseInt(prop,10);
self.getRessourceById(prop, currentRes).ressourceAmount -= n[prop];
}
buildingQueue[i].buildingInfo = t;
}
}
var ressourceIdMap = {
20: 'Geld',
0: 'Getreide',
1: 'Fisch',
2: 'Eisenerz',
3: 'Holz',
4: 'Kohle',
5: 'Öl',
6: 'Gas'
};
var lastChosenQueueItem = '';
this.displayBuildingQueue = function() {
var img = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACV0lEQVQ4T4WTzW8SQRiH3wUsGNKFXRCwH5hqldoEq0TiB22RIuXixavXGtN40z/EkzFooiaePHlqpQlfbWlSlR6qoiJtNWnV8jml1MpSdl13sLM0gHGS3U1m3ueZ3+zMULDf7gMYhjznE+lEcmLiJxcj/Qe/T7Va38mLg4E3kYTzLgDCYxR+YXj42mi676yNRZm8EH0+42uWYNhzYzzImI3KteVPhdmpBRuWUBh2+S+nj5/uZ8lsxVxBiL2I+ia4v0meabX+0eueacbIKknNWjJdmA2/slHxc4Nfzjjtfc2Ri3kkxIJxX4dSVI/43VOMkZFhUvs28W6FeqzReK64L4QMhoZdTlJEgoJSAMPqW+Ai2uKj4YWx+j+oS5yOEMs0FYoiiLU9gBoPoiAA/JYeqa9Y3uGjHz57J3l+vi4gErfdHmJpWinWagAcB+KeBEvAwYZ2d/nw6urYbYC4vAuyRKXyDHdZQ6zqUEtkXIO4ijD3Y917C2COMHIC3PEEwO8y9UzrOzTtBVVOiOe/tRc8BBgfMfe81P0DJjMiSbKYa0jqCQIAPpe5N0j/ByaSUrUivN6XUI8ArjrN1hla3Rp7WyrEkE59uGVJeGwpu+Glgp36lROsqb/5IJWrFX4ps+FVSMfdYemN0G0kaZRNUfcAWDtjSnXrmCNEUuYq/HJm3TsJMI/7HgC4HRZrhNY0knwvoWyylB+QL9Mp1pyy6BjjDveLf7/ZgIkUS4aOHot0SpLNbZT9iHIDdwBK8jbiS9VN6xez5dJNMnPzsrCki2YCX8tblzCMx/8AF+H3pjKo/BIAAAAASUVORK5CYII=';
function getIcons() {
var s = '';
for(var prop in ressourceIdMap) {
if(!ressourceIdMap.hasOwnProperty(prop))
continue;
s += '<th>' + self.getRessourceById(parseInt(prop,10)).ressourceIcon +'</th>';
}
return s;
}
function getQueue() {
var s = '';
for(var i=0,l=buildingQueue.length;i<l;i++) {
var b = buildingQueue[i];
s += '<tr><td>' + (i+1) +'</td><td>' + b.buildingType +'</td>';
for(var prop in ressourceIdMap) {
if(!ressourceIdMap.hasOwnProperty(prop))
continue;
var t = typeof b.buildingRequirements[prop];
var a = t !== 'undefined' ? _this.format(b.buildingRequirements[prop],'number',self.getRessourceById(parseInt(prop,10)).ressourceSymbol) : '-';
s += '<td>' + a + '</td>';
}
var cls = b.buildingInfo.isPossible ? 'resource_bar_rate_positive' : 'resource_bar_rate_negative';
s += '<td class="'+cls+'">' + b.buildingInfo.possibleFromString +'</td><td class="'+cls+'">' + b.buildingInfo.possibleUntilString +'</td>';
s += '<td><img class="remove_building_queue" id="remove-' + i +'" src="'+img+'" style="cursor:pointer;" alt="X" /></td>';
}
return s +'</tr>';
};
var tbl = '<table class="full" id="building-queue" style="width:800px"><thead><tr><th>#</th><th>Typ</th>' + getIcons() + '<th>Möglich ab</th><th>Möglich bis</th><th> </th></tr></thead><tbody>'+getQueue()+'</tbody></table>';
var sel = '<select id="select_projects">';
for(var prop in neededMap) {
if(!neededMap.hasOwnProperty(prop))
continue;
var issel = lastChosenQueueItem == prop ? 'selected="selected"' : '';
sel += '<option value="'+prop+'" '+issel+'>'+prop+'</option>';
}
sel += '</select><div id="input_queue_submit" class="default_button">Einreihen</div>';
_this.displayOverriddenContainer('Bauwarteschlange','<h2>Folgende Projekte sind eingereiht</h2>'+tbl+sel);
window.setTimeout(function() {
var sub = mainDocument.getElementById('input_queue_submit');
sub.addEventListener('click',function() {
var v = mainDocument.getElementById('select_projects').value;
lastChosenQueueItem = v;
self.addBuildingToQueue(v);
self.displayBuildingQueue();
});
var t = mainDocument.getElementsByClassName('remove_building_queue');
for(var i=0, l=t.length;i<l;i++) {
var x = t[i];
x.addEventListener('click', function(event) {
var e = event.target || event.srcElement;
var index = parseInt(e.id.split('-')[1],10);
self.removeFromBuildingQueue(index);
self.displayBuildingQueue();
});
}
},100);
}
var neededMap = {
'Wehramt': {
20: 1000,
2: 250,
3: 250
},
'Werkstatt': {
20: 1000,
2: 500,
3: 500,
5: 500
},
'Kaserne': {
20: 4000,
0: 1500,
3: 1500
},
'Festung': {
20: 4000,
2: 2000
},
'Hafen': {
20: 10000,
3: 10000
},
'Eisenbahn': {
20: 10000,
3: 5000,
2: 3000,
4: 1000
},
'Fabrik': {
20: 10000,
2: 2500,
3: 2500,
5: 2500
},
'Panzerwagen': {
20: 7000,
2: 2000,
5: 1500
},
'Artillerie': {
20: 10000,
2: 3000,
5: 2000
},
'Panzer': {
20: 20000,
2: 5000,
5: 3000
},
'EBG': {
20: 50000,
2: 10000,
3: 5000,
4: 5000,
5: 10000
},
'Schlachtschiff': {
20: 50000,
2: 15000,
3: 5000,
4: 10000,
5: 5000
}
};
var lastInput = {};
var extract = function() {
ressources = [];
var li = ressourceContainer.getElementsByTagName('li');
for (var i = 0, l = li.length; i < l; i++) {
var liE = li[i];
var amnt = liE.getElementsByClassName('resource_bar_amount')[0];
if (typeof amnt === 'undefined')
continue;
var entry = amnt.parentNode;
var rate = entry.getElementsByTagName('div')[1];
var resID = parseInt(liE.getAttribute('resource_id'));
amnt = parseInt(amnt.textContent.replace(/\./, ''), 10);
rate = parseInt(rate.textContent.replace(/\./, '').replace(/\s\/h/, ''), 10);
var time = (rate >= 0 ? -1 : amnt / Math.abs(rate) * 3600 * 1000);
ressources.push({
ressourceName: ressourceIdMap[resID],
ressourceBarEntry: entry,
ressourceID: resID,
ressourceAmount: amnt,
ressourceRate: rate,
ressourceTimeLeft: time,
ressourceTimeLeftText: _this.format(time, 'interval'),
ressourceSymbol: resID === 20 ? '£' : 't',
ressourceIcon: '<div class="icons-resource_' + resID + ' resource_bar_icon"></div>'
});
}
}
this.getRessourceInfo = function() {
return ressources;
}
this.getRessourceById = function(id, res) {
res = res == null ? ressources : res;
for (var i = 0, l = res.length; i < l; i++) {
if (res[i].ressourceID === id)
return res[i];
}
}
this.getRessourceByName = function(name, res) {
res = res == null ? ressources : res;
for (var i = 0, l = res.length; i < l; i++) {
if (res[i].ressourceName === name)
return res[i];
}
}
this.updateTimeLeftDisplay = function() {
for (var i = 0, l = ressources.length; i < l; i++) {
var res = ressources[i];
if (mainDocument.getElementById('time_left_for_' + res.ressourceID) == null) {
res.ressourceBarEntry.innerHTML += '<div id="time_left_for_' + res.ressourceID + '"></div>';
}
var timeLeft = mainDocument.getElementById('time_left_for_' + res.ressourceID);
timeLeft.className = res.ressourceTimeLeft > 0 ? 'resource_bar_rate_negative' : 'resource_bar_rate_positive';
timeLeft.innerHTML = res.ressourceTimeLeftText;
}
};
this.getTimeNeededForRessource = function(need, base) {
var mintime = Number.NEGATIVE_INFINITY; // from when to
var maxtime = Number.POSITIVE_INFINITY; // when can it be built
var isPossible = true;
for (var prop in need) {
if (!need.hasOwnProperty(prop))
continue;
var r = self.getRessourceById(parseInt(prop, 10), base);
var dif = need[prop] - r.ressourceAmount;
var time = dif / r.ressourceRate * 3600 * 1000;
if (need[prop] <= 0) {
continue;
} else {
if (dif < 0 && r.ressourceRate < 0) {// mehr da, nimmt aber ab
if(time < maxtime)
maxtime = time;
}
if (dif < 0 && r.ressourceRate > 0) {// mehr da, nimmt zu
continue;
}
if (dif > 0 && r.ressourceRate < 0) {// weniger da, nimmt ab
isPossible = false;
break;
}
if (dif > 0 && r.ressourceRate > 0) {// weniger da, nimmt zu
if(time > mintime)
mintime = time;
}
}
}
mintime = Math.max(0,mintime);
maxtime = Math.max(0,maxtime);
return {
isPossible:isPossible,
possibleFrom:mintime,
possibleFromString:_this.format(mintime +'','interval'),
possibleUntil:Math.max(0,maxtime),
possibleUntilString:_this.format(maxtime +'','interval'),
};
};
var addTimeButton = function() {
var ul = ressourceContainer.getElementsByTagName('ul')[0];
if (mainDocument.body.innerHTML.indexOf('time_button"') === -1) {
ul.innerHTML += '<li><input type="button" value="Ressourcen zu Zeitpunkt" id="time_button" class="default_button" /></li>';
}
window.setTimeout(function() {
mainDocument.getElementById('time_button').addEventListener('click', function() {
var dn = new Date();
_this.displayOverriddenContainer('Ressourcen zu Zeitpunkt', '<h1>Bitte das Datum eingeben, für das Du die Ressourcen hochrechnen möchtest</h1>' + '<input type="text" value="' + formatTime() + '" id="input_date" /><div id="input_date_submit" class="default_button">Hochrechnen</div><br />' + '<table class="full" id="input_date_result" style="width:500px;">' + '<thead>' + '<tr><th> </th><th>Ressource</th><th>Vorrat</th><th>Veränderung</th></tr>' + '</thead>' + '<tbody>' + '</tbody>' + '</table>');
window.setTimeout(function() {
mainDocument.getElementById('input_date_submit').addEventListener('click', function() {
var d = mainDocument.getElementById('input_date').value;
d = getTime(d);
var time_dif = d.getTime() - (new Date()).getTime();
var tbody = mainDocument.getElementById('input_date_result').getElementsByTagName('tbody')[0];
tbody.innerHTML = '';
for (var i = 0, l = ressources.length; i < l; i++) {
var r = ressources[i];
var c = time_dif / (3600 * 1000) * r.ressourceRate;
var a = r.ressourceAmount + c;
var txt = _this.format(a, 'number', r.ressourceSymbol);
var chng = _this.format(c, 'number', r.ressourceSymbol);
var cls = c < 0 ? 'resource_bar_rate_negative' : 'resource_bar_rate_positive';
var rowHtml = '<tr><td>' + r.ressourceIcon + '</td><td>' + r.ressourceName + '</td><td>' + txt + '</td><td><div class="' + cls + '">' + chng + '</div></td></tr>';
tbody.innerHTML += rowHtml;
}
});
}, 100);
});
}, 100);
}
var addRessourceButton = function() {
var ul = ressourceContainer.getElementsByTagName('ul')[0];
if (mainDocument.body.innerHTML.indexOf('time_button_2"') === -1) {
ul.innerHTML += '<li><input type="button" value="Zeit für Ressourcen" id="time_button_2" class="default_button" /></li>';
}
window.setTimeout(function() {
mainDocument.getElementById('time_button_2').addEventListener('click', function() {
var selStr = '<table style="width:500px;" id="input_projects"><thead><tr><th>Projekt</th><th>Anzahl</th></tr></thead><tbody>';
for (var prop in neededMap) {
if (!neededMap.hasOwnProperty(prop))
continue;
selStr += '<tr><td>' + prop + '</td><td><input type="number" style="width:50px;" name="amount_' + prop + '" size="3" value="'+(lastInput[prop] ? lastInput[prop] : 0) +'" min="0" class="project"/></td></tr>';
}
selStr += '</tbody></table>';
_this.displayOverriddenContainer('Zeit für Ressourcen', '<h1>Wähle aus folgenden Bauprojekten:</h1>' + selStr +
'<br /><div id="input_date_submit_2" class="default_button">Zeitbedarf berechnen</div><br />' + '<table class="full" id="result_total_need" style="width:500px;">' + '<thead>' + '<tr><th> </th><th>Ressource</th><th>Insgesamt Benötigt</th><th>Zeit verbleibend</th></tr>' + '</thead>' + '<tbody>' + '</tbody>' + '</table>');
window.setTimeout(function() {
mainDocument.getElementById('input_date_submit_2').addEventListener('click', function() {
var el = mainDocument.getElementById('input_projects').getElementsByClassName('project');
var need = {};
for (var i = 0, l = el.length; i < l; i++) {
var descr = el[i].name.split('_')[1];
var n = neededMap[descr];
var am = parseInt(el[i].value, 10);
lastInput[descr] = am;
if (!n)
alert(n);
for (var prop in n) {
if (!n.hasOwnProperty(prop))
continue;
if (!need[prop])
need[prop] = 0;
need[prop] += am * n[prop];
}
}
var tbody = mainDocument.getElementById('result_total_need').getElementsByTagName('tbody')[0];
tbody.innerHTML = '';
for (var prop in need) {
if (!need.hasOwnProperty(prop))
continue;
var r = self.getRessourceById(parseInt(prop, 10));
var dif = need[prop] - r.ressourceAmount;
var time = dif / r.ressourceRate * 3600 * 1000;
var str = '', cls = '';
if (need[prop] <= 0) {
str = 'Nicht benötigt.';
cls = 'resource_bar_rate_positive';
} else {
if (dif < 0 && r.ressourceRate < 0) {// mehr da, nimmt aber ab
str = 'Möglich bis in ' + _this.format(time, 'interval') + '.';
cls = 'resource_bar_rate_positive';
}
if (dif < 0 && r.ressourceRate > 0) {// mehr da, nimmt zu
str = 'Vorhanden.';
cls = 'resource_bar_rate_positive';
}
if (dif > 0 && r.ressourceRate < 0) {// weniger da, nimmt ab
str = 'Nicht möglich.';
cls = 'resource_bar_rate_negative';
}
if (dif > 0 && r.ressourceRate > 0) {// weniger da, nimmt zu
str = 'Möglich ab ' + _this.format(time, 'interval') + '.';
cls = 'resource_bar_rate_negative';
}
}
var rowHtml = '<tr><td>' + r.ressourceIcon + '</td><td>' + r.ressourceName + '</td><td>' + _this.format(need[prop], 'number', r.ressourceSymbol) + '</td><td><div class="'+cls+'">' + str + '</div></td></tr>';
tbody.innerHTML += rowHtml;
}
});
}, 100);
});
}, 100);
}
var addQueueButton = function() {
var ul = ressourceContainer.getElementsByTagName('ul')[0];
if (mainDocument.body.innerHTML.indexOf('queue_button"') === -1) {
ul.innerHTML += '<li><input type="button" class="default_button" value="Bauwarteschlange" id="queue_button" /></li>';
}
window.setTimeout(function() {
mainDocument.getElementById('queue_button').addEventListener('click', function() {
self.displayBuildingQueue();
});
});
};
var init = function() {
hideOverriddenContainer(); //nicer layout
addTimeButton();
addRessourceButton();
addQueueButton();
extract();
self.updateTimeLeftDisplay();
};
init();
var run = function() {
extract();
self.updateTimeLeftDisplay();
};
window.setInterval(run, 2000);
}
};
var intervalStart = window.setInterval(handle, 500);
function number_format(number, decimals, dec_point, thousands_sep) {
number = (number + '')
.replace(/[^0-9+\-Ee.]/g, '');
var n = !isFinite(+number) ? 0 : +number,
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
s = '',
toFixedFix = function(n, prec) {
var k = Math.pow(10, prec);
return '' + (Math.round(n * k) / k)
.toFixed(prec);
};
// Fix for IE parseFloat(0.55).toFixed(0) = 0;
s = (prec ? toFixedFix(n, prec) : '' + Math.round(n))
.split('.');
if (s[0].length > 3) {
s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
}
if ((s[1] || '')
.length < prec) {
s[1] = s[1] || '';
s[1] += new Array(prec - s[1].length + 1)
.join('0');
}
return s.join(dec);
}
function handle() {
var ifm = document.getElementById('ifm');
if (ifm == null || typeof ifm === 'undefined' || ifm.contentWindow == null || ifm.contentWindow.document == null)
return;
var contWind = ifm.contentWindow.document;
var main = contWind.getElementById('s1914');
if (main == null || typeof main === 'undefined' || main.innerHTML == null)
return;
if (~main.innerHTML.indexOf('Global')) {
window.clearInterval(intervalStart);
(new ArmyCalculator()).init(main, contWind);
}
}
}
handleGameSite();