imperion helper

By Adelaide Last update Nov 18, 2009 — Installed 9,731 times.

There are 6 previous versions of this script.

Add Syntax Highlighting (this will take a few seconds, probably freezing your browser while it works)

// ==UserScript==
// @name           imperion helper
// @namespace      ru.adeliade
// @include        http://*.imperion.*/*
// @exlcude        http://forum.imperion.*/*
// ==/UserScript==

try {

// simple associative storage wrapper
// currently used only GM_* functions
function Storage(namespace) {
	function _load(var_name, default_value) {
		return GM_getValue(namespace+var_name, default_value);
	}
	function _store(var_name, value) {
		GM_setValue(namespace+var_name, value);
	}
	this.load = function(var_name, default_value) {
		try {
			return JSON.decode(_load(var_name, default_value));
		} catch(e) {
			return default_value;
		}
	};
	this.store = function(var_name, value) {
		_store(var_name, JSON.encode(value));
	}
}

// JSON encoder. BTW why Greasemonkey still have no such object?
var JSON = {
	decode: function(value) {
		return eval("(" + value + ")");
	},
	encode: function(value) {
		if(typeof value == "object") {
			if (typeof value.length != "undefined") { // array
				var a = [];
				for(var i = 0, l = value.length; i < l; i++) {
					a[i] = this.encode(value[i]);
				}
				return "[" + a + "]";
			} else { // object/hash
				var a = [];
				for(p in value) {
					a.push("'" + p + "':" + this.encode(value[p]));
				}
				return "{" + a + "}";
			}
		} else if (typeof value == "number") {
			return value.toString();
		} else if (typeof value == "undefined") {
			return "undefined";
		} else {
			return "'" + value.toString() + "'";
		}
	}
}

//var GAME_VERSION = $("serverTime") ? 0.91 : 0.9;

/* game data */
var ships = [
[	{cost: [865,	745,	790],			time:3000,		hp:320,	armor:0,	fire:1,	reload:1,	ec:4,		speed:200,fuel:1,	tank:15,	payload:0,		research:220,	type:'C'},
	{cost: [275,	230,	140],			time:1550,		hp:70,	armor:0,	fire:18,	reload:5,	ec:1,		speed:14,	fuel:1,	tank:4,		payload:60,	research:170,	type:'M'},
	{cost: [2225,	1940,	1535],	time:11400,	hp:595,	armor:5,	fire:22,	reload:40,	ec:19,	speed:15,	fuel:7,	tank:49,	payload:475,	research:500,	type:'M'},
	{cost: [3860,	3260,	1460],	time:21450,	hp:550,	armor:16,	fire:75,	reload:7,	ec:9,		speed:10,	fuel:20,	tank:200,	payload:330,	research:550,	type:'M'},
	{cost: [105000,67000,38000],	time:600000,	hp:7350,armor:25,	fire:160,reload:50,	ec:100,	speed:8,	fuel:400,tank:4000,payload:4000,research:8000,	type:'M'},
	{cost: [4080,	3000,	4920],	time:30000,	hp:1600,armor:0,	fire:1,	reload:1,	ec:20,	speed:4,	fuel:24,	tank:168,	payload:0,		research:7500,	type:'M'},
	{cost: [13500,13000,9360],		time:90000,	hp:4200,armor:6,	fire:1,	reload:1,	ec:60,	speed:3,	fuel:72,	tank:360,	payload:0,		research:5000,	type:'M'},
	{cost: [5280,	3600,	3120],	time:22500,	hp:1200,armor:3,	fire:1,	reload:1,	ec:15,	speed:9,	fuel:20,	tank:5000,	payload:0,		research:250,	type:'C'},
	{cost: [2735,	2880,	1585],	time:13500,	hp:720,	armor:5,	fire:1,	reload:1,	ec:9,		speed:9,	fuel:11,	tank:110,	payload:2000,research:120,	type:'C'},
	{cost: [25000,21000,15500],	time:167400,	hp:2000,armor:30,	fire:1,	reload:28,	ec:93,	speed:6,	fuel:180,tank:2160,payload:20000,research:1200,	type:'C'},
	{cost: [995,	845,	650],			time:6230,		hp:320,	armor:5,	fire:1,	reload:1,	ec:6,		speed:12,	fuel:20,	tank:100,	payload:500,	research:150,	type:'C'},
	{cost: [21000,17500,13000],	time:72000,	hp:4800,armor:10,	fire:1,	reload:1,	ec:30,	speed:6,	fuel:300,tank:3000,payload:2400,research:400,	type:'C'}
],
[	{cost: [575,	910,	915],			time:3000,		hp:320,	armor:0,	fire:1,	reload:1,	ec:4,		speed:160,fuel:1,	tank:20,	payload:0,		research:200,	type:'C'},
	{cost: [380,	495,	205],			time:3150,		hp:125,	armor:1,	fire:17,	reload:8,	ec:2,		speed:15,	fuel:2,	tank:12,	payload:0,		research:140,	type:'M'},
	{cost: [6215,	6720,	3865],	time:24000,	hp:1600,armor:10,	fire:18,	reload:76,	ec:18,	speed:20,	fuel:29,	tank:464,	payload:0,		research:400,	type:'M'},
	{cost: [4800,	11500,2880],		time:42000,	hp:1600,armor:4,	fire:45,	reload:24,	ec:16,	speed:12,	fuel:24,	tank:240,	payload:800,	research:1000,	type:'M'},
	{cost: [6720,	8065,	2015],	time:36000,	hp:1550,armor:6,	fire:200,reload:4,	ec:14,	speed:8,	fuel:29,	tank:290,	payload:0,		research:2500,	type:'M'},
	{cost: [103500,149000,71500],time:675000,	hp:18500,armor:5,	fire:20,	reload:1500,ec:120,speed:7,	fuel:500,tank:7000,payload:0,		research:8500,	type:'M'},
	{cost: [1440,	5160,	5400],	time:30000,	hp:1600,armor:25,	fire:1,	reload:1,	ec:20,	speed:5,	fuel:24,	tank:24,	payload:0,		research:8000,	type:'M'},
	{cost: [14000,19500,13000],	time:97500,	hp:4550,armor:5,	fire:1,	reload:1,	ec:65,	speed:4,	fuel:78,	tank:468,	payload:0,		research:6000,	type:'M'},
	{cost: [1025,	1570,	605],		time:6000,		hp:320,	armor:5,	fire:1,	reload:1,	ec:4,		speed:12,	fuel:6,	tank:48,	payload:800,	research:120,	type:'C'},
	{cost: [11000,16500,4800],		time:60000,	hp:2850,armor:5,	fire:1,	reload:1,	ec:24,	speed:10,	fuel:48,	tank:480,	payload:16000,research:800,	type:'C'},
	{cost: [1765,	2620,	1315],	time:12540,	hp:445,	armor:5,	fire:1,	reload:1,	ec:7,		speed:10,	fuel:45,	tank:450,	payload:1000,research:150,	type:'C'},
	{cost: [27000,32500,20000],	time:120000,	hp:6400,armor:5,	fire:1,	reload:1,	ec:40,	speed:4,	fuel:400,tank:6000,payload:3200,research:400,	type:'C'}
],
[	{cost: [145,	125,	90],			time:750,		hp:80,	armor:0,	fire:1,	reload:1,	ec:0,		speed:2,	fuel:0,	tank:0,		payload:0,		research:5,		type:'C'},
	{cost: [720,	720,	960],			time:300,		hp:320,	armor:0,	fire:1,	reload:1,	ec:1,		speed:2,	fuel:24,	tank:480,	payload:0,		research:270,	type:'C'},
	{cost: [1015,	725,	800],			time:3750,		hp:370,	armor:0,	fire:23,	reload:12,	ec:5,		speed:13,	fuel:3,	tank:15,	payload:285,	research:120,	type:'M'},
	{cost: [870,	750,	540],			time:4500,		hp:285,	armor:0,	fire:12,	reload:44,	ec:6,		speed:16,	fuel:4,	tank:48,	payload:225,	research:350,	type:'M'},
	{cost: [1585,	745,	1045],		time:3750,		hp:240,	armor:12,	fire:45,	reload:6,	ec:5,		speed:11,	fuel:5,	tank:60,	payload:330,	research:2000,	type:'M'},
	{cost: [47520,26400,31680],	time:108000,	hp:14800,armor:0,	fire:60,	reload:128,ec:144,	speed:9,	fuel:200,tank:3000,payload:6400,research:7000,	type:'M'},
	{cost: [870,	750,	640],			time:4500,		hp:80,	armor:0,	fire:300,reload:1,	ec:6,		speed:10,	fuel:3,	tank:15,	payload:0,		research:2200,	type:'M'},
	{cost: [725,	625,	1650],		time:3750,		hp:400,	armor:0,	fire:1,	reload:1,	ec:5,		speed:12,	fuel:6,	tank:48,	payload:0,		research:2500,	type:'M'},
	{cost: [2610,	4080,	3820],	time:13500,	hp:1400,armor:0,	fire:1,	reload:1,	ec:18,	speed:2,	fuel:21,	tank:63,	payload:0,		research:6000,	type:'M'},
	{cost: [11400,9900,	8700],	time:37500,	hp:3500,armor:6,	fire:1,	reload:1,	ec:50,	speed:5,	fuel:60,	tank:420,	payload:0,		research:4500,	type:'M'},
	{cost: [1720,	1320,	955],		time:6750,		hp:510,	armor:8,	fire:1,	reload:1,	ec:9,		speed:10,	fuel:30,	tank:270,	payload:800,	research:160,	type:'C'},
	{cost: [17010,15875,23815],	time:26250,	hp:5600,armor:10,	fire:1,	reload:1,	ec:35,	speed:5,	fuel:350,tank:7000,payload:2800,research:400,	type:'C'}
]
];

var traders_capacity = {
	terrans: 4000,
	titans: 3000,
	xen: 5000
}

var galaxyNr = 0;
/* game functions */
function id_from_xy(c) {
	return (400-c.y)*801 + (c.x+400) + 1 + (galaxyNr-1) * (801*801);
}

function xy_from_id(id) {
	id -= 1 + (galaxyNr-1) * (801*801);
	var x = (id % 801) - 400;
	var y = 400 - (id - x - 400) / 801;
	return {x:x, y:y};
}

function distance(c1, c2) {
	return Math.sqrt(
		Math.pow(c2.x - c1.x, 2) +
		Math.pow(c2.y - c1.y, 2)
	);
}

/*if (GAME_VERSION < 0.91) {
	CU2EP = function(CU) { return 3000*Math.pow(CU, 2.1); }
	EP2CU = function(EP) { return Math.pow(EP/3000, 1/2.1); }
} else {*/
	CU2EP = function(CU) { return 2500*Math.pow(CU, 2.3); }
	EP2CU = function(EP) { return Math.pow(EP/2500, 1/2.3); }
//}

// helper functions
if (typeof Array.prototype.each == "undefined") {
	Array.prototype.each = function(callback) {
		for (var i = 0, l = this.length; i < l; i++) {
			callback(this[i], i);
		}
	}	
}

Array.prototype.sortBy = function(fieldName, sign) {
	if (!sign) sign = 1;
	return this.sort(function(a, b){
		return sign * (a[fieldName] - b[fieldName]);
	});
}

Array.prototype.clone = function() {
	var a = [];
	for (var i = 0, l = this.length; i < l; i++) {
		a[i] = this[i];
	}
	return a;
}

String.prototype.to_i = function() {
	return parseInt(this.replace(/[.,']/g, ""), 10) || 0;
}

$ = function(id) {
	return document.getElementById(id);
}

// usage example: $$("tr[2n+3]/td[3]")
$$ = function(path, nodeList) {
	if (typeof nodeList == "undefined") {
		nodeList = [document];
	} else if (typeof nodeList.length == "undefined") {
		nodeList = [nodeList];
	}
	
	m = path.match(/^([^\/]+)(\/)?(.*)$/);
	var selector = m[1], remainderPath = m[3];
	m = selector.match(/([\w.]+)(\[([\w+]+)\])?/);
	var eltSelector = m[1], nodeIndexSelector = m[3];
	m = eltSelector.match(/(\w+)(\.(\w+))?/);
	var tag = m[1], className = m[3];
	
	if (nodeIndexSelector) {
		m = nodeIndexSelector.match(/(\d+)?(n)?(\+)?(\d+)?/);
		if (m[2]) {
			start = parseInt(m[4]) || 0;
			step = parseInt(m[1]) || 1;
		} else {
			start = parseInt(m[1]);
			step = Infinity;			
		}
	} else {
		start = 0;
		step = 1;
	}
	var newNodeList = [];
	nodeList.each(function(node){
		var elts = node.getElementsByTagName(tag);
		for (var i = start, l = elts.length; i < l; i += step) {
			var elt = elts[i];
			if (!className || elt.className.match(className)) {
				newNodeList.push(elt);
			}
		}
	});
	if (remainderPath && newNodeList.length) {
		return $$(remainderPath, newNodeList);
	} else {
		return newNodeList;
	}
}

function toggleActive(elt) {
	if (elt.className.match(/active/)) {
		elt.className = elt.className.replace(/active/, "");
	} else {
		elt.className += " active";
	}
}

function blinkTroopsMovement(elt) {
	toggleActive(elt);
	var next_time = $$('a/span[1]', $(elt.id+'Content'))[0].innerHTML;
	var dateObj = new Date();
	var seconds = next_time - dateObj.getTime() / 1000;
	if (seconds > 0) {
		var next_blink = Math.round(200+200*Math.log(seconds));
		setTimeout(blinkTroopsMovement, next_blink, elt);
	}
}

/* language part */
function latin_decline (n, key) {
	var forms = this[key];
	return n + " " + forms[n==1?0:1];
}

function rus_decline(n, key) {
	var forms = this[key];
	var s = forms[2];
	var L = n % 100;
	if ((L < 10) || (L > 20)) {
		var X = L % 10;
		if (X == 1) s = forms[0];
		if ((X >= 2) && (X <= 4)) s = forms[1];
	}
    return n + " " + s;
}

var translations = {
	'en':{
		'decline':latin_decline,
		'day':["day", "days"],
		'hour':["hour", "hours"],
		'less_than_hour': "less than hour",
		'next_planet_in': "Next planet available in:",
		'with_expansion_research': "With Expansion research:",
		'center_map': "Center Map",
		'recycle': "Recycle",
		'distance': "distance",
		'name': "Name",
		'action': "action",
		'debris': "Debris fields",
		'asteroid': "Asteroid"
	},
	'de':{
		'decline':latin_decline,
		'day':["Tag", "Tage"],
		'hour':["Stunde", "Stunden"],
		'less_than_hour': "Stunden weniger als",
		'next_planet_in': "Näschte Planeten in:",
		'with_expansion_research': "mit Expansionsforschung:",
		'center_map': "Karte zentrieren",
		'recycle': "Recycle",
		'distance': "Distanz",
		'name': "Name",
		'action': "Aktion",
		'debris': "Trümmerfeld",
		'asteroid': "Asteroid"
	},
	'ru':{
		'decline':rus_decline,
		'day':["день", "дня", "дней"],
		'hour':["час", "часа", "часов"],
		'less_than_hour': "меньше часа",
		'next_planet_in': "Следующая планета доступна через:",
		'with_expansion_research': "С исследованием экспансии:",
		'center_map': "Центрировать карту",
		'recycle': "Переработать",
		'distance': "расстояние",
		'name': "имя",
		'action': "действие",
		'debris': "Поля обломков",
		'asteroid': "Астероид"
	}
}

function showDays(days) {
	var fullHours = Math.round(24 * days);
	var hours = fullHours % 24;
	days = Math.floor(fullHours / 24);
	var a = [];
	if (days) {
		a.push(this.decline(days, "day"));
	}
	if (hours) {
		a.push(this.decline(hours, "hour"));
	}
	if (!a.length) a.push(this['less_than_hour']);
	return a.join(" ");
}

// domains and language processing
var m = location.host.match(/(\w+)\.imperion\.(\w+(\.\w+)*)$/);
var zone = m[2];
var server_id = zone + "-" + m[1];
// NOT: co.uk, ee, no, pl, com.ua, co.ee
domains = {
	'asia': 'en', 'at':'de', 'be':'en', 'bg':'en', 'cc':'en', 'cl':'en', 'cn':'en', 'com':'en', 'co.il':'en', 'cz':'en', 'de':'de', 'dk':'en', 'fi':'en', 'fr':'en', 'hk':'en', 'hu':'en',
	'in':'en', 'ir':'en', 'it':'en', 'jp':'en', 'lt':'en', 'lv':'en', 'mx':'en', 'net':'en', 'nl':'en', 'org':'en', 'pt':'en', 'ru':'ru', 'se':'en', 'sk':'en', 'si':'en', 'tw':'en', 'us':'en'
}
if (lang = domains[zone]) { // do not trust imperion.* sites not belonging to TravianGames

	// init language 
	lang = translations[lang];
	lang.showDays = showDays;
	
	// init player-related data
	var player_name = document.links[0].innerHTML;
	var storage = new Storage(server_id + "/" + player_name + "/");
	
	var Player = {
		research: storage.load("research", {
			levels:[], production:[], points:[]
		}),
		planets: {},
		race: document.styleSheets[2].href.match(/\/(\w+)[.]css/)[1],
	};
/*	var planetNavigationLinks = $$('a', $('navigation'));
	if (planetList = $('planetListContent')) {
		$$("ul/li/a", planetList).each(function(elt){
			if(m = elt.href.match(/\d+$/));
			Player.planets[m[0]] = {name: elt.innerHTML};
		});
	}
	var id = planetNavigationLinks[0].href.match(/\d+$/)[0];
	var name = planetNavigationLinks[1].innerHTML;
	Player.planets[id] = {name: name};
	var current_planet = Player.planets[id];*/
	var Planet = {
		resources: {
			current: [],
			income: [],
			capacity: []
		}
	}
	
try{
	
//	if (GAME_VERSION > 0.91) {
		var incomeData = $$("table[0]/tr[0]/div[2n]", $("planetResourcesContent"));
		var capacityData = $$("table[0]/tr[2]/td[2n]", $("planetResourcesContent"));
/*	} else {
		var incomeData = $$("table[0]/tr[0]/th[2n+1]", $("planetResourcesContent"));
		var capacityData = $$("table[0]/tr[1]/th[2n+1]", $("planetResourcesContent"));
	}*/

	for (var r = 0; r < 3; r++) {
		Planet.resources.current[r] = $("storageR"+(r+1)).innerHTML.to_i();
		Planet.resources.income[r] = incomeData[r].innerHTML.to_i();
		Planet.resources.capacity[r] = capacityData[r].innerHTML.to_i();
	}


/* buildingYard */

if (location.pathname.match(/\/buildingYard\//)) {
	var byTables = $$("table", $('buildingYard'));
	var EP = byTables[0].rows[0].cells[1].innerHTML.to_i();
	var EP_day = byTables[2].rows[2].cells[1].innerHTML.to_i();
	var CU = Math.ceil(EP2CU(EP||1));
	var next_EP = CU2EP(CU);
	var EP_by_research = 0;
	var phrase = lang['next_planet_in'];
	var expansion_research_level = Player.research.levels[15];
	var research_cost = 0;
	var last_row = 6;
	var days = (next_EP - EP) / EP_day;
	var i = 0;
	do {
		var base_days = days;
		var RP = Player.research;
		var days = Math.max(
			(next_EP - EP - EP_by_research) / EP_day,
			(research_cost - RP.points[3]) / RP.production[3]
		);
		if (days > base_days) break;
		var cell = byTables[0].insertRow(++last_row).insertCell(0);
		cell.colSpan = 2;
		cell.className = 'spacer';
		
		var row = byTables[0].insertRow(++last_row);
		var cell = row.insertCell(0);
		cell.className = "p13 fontBold borderNone";
		cell.innerHTML = phrase;
		var cell = row.insertCell(1);
		cell.className = "p13";
		cell.innerHTML = lang.showDays(days);
		
		++expansion_research_level;
		phrase = lang['with_expansion_research'] + " (" + expansion_research_level + ")";
		EP_by_research += expansion_research_level * 1250;
		research_cost += expansion_research_level * 250;
		if (i++ > 100) break;
	} while (true);
}


/* researchCenter */

if (location.pathname.match(/\/researchCenter\//)) {
	// just a "shortcut"
	var RP = Player.research;
	var productionTables = $$('table.toggleTable', $('researchCenter'));
	productionTables.shift();
	// collect current RP disposition
	for (var t = 0; t < productionTables.length; t++) {
		var table = productionTables[t];
		RP.points[t] = parseFloat($$('tr[0]/td[2]/div', table)[0].innerHTML.replace(/,/, '.'));
		RP.production[t] = parseFloat($$('tr[2]/td', table)[0].innerHTML.replace(/,/, '.').match(/\d+\.\d+/));
	}
	var researchTables = $$("div.extraTable/table[0]", $("researchCenter"));
	// replace "unavailable" text on buttons by cmount of remaining time;
	researchTables.each(function(table, idx) {
		$$("tr[2n+2]", table).each(function(row) {
			var button_link = $$("a[0]", row.cells[3])[0];
			if (button_link.className.match(/error/i)
			&& !button_link.className.match(/disable/i)) {
				var cost = parseInt(row.cells[2].innerHTML);
				var days = (cost - RP.points[idx]) / RP.production[idx];
				button_link.lastChild.nodeValue = lang.showDays(days); // lastChild is a DOM text node
			}
		});
	});
	
	// collect data about Research levels
	researchTables.each(function(table) {
		$$("tr[2n+2]", table).each(function(row) {
			var info_link = $$("a[0]", row.cells[0])[0];
			if (m = info_link.href.match(/research\/(\d+)/)) {
				RP.levels[m[1]] = $$("div.active", row.cells[1]).length;
			}
		});
	});
	storage.store("research", RP);
}

/* combat reports */

if (location.pathname.match(/^\/report\/show\/id\/combat\/hid\/\d+/)) {
	var RECYCLER_IDX = 10;
	
	var cap_eff = {
		'C': 1+0.05*(Player.research.levels[18]||0),
		'M': 1+0.05*(Player.research.levels[21]||0)
	}

	var combat = { 'off':{resources:[0,0,0]}, 'def':{} };

	var maindiv = $$("div.content")[0];
	var results = $$("h3", maindiv);
	var xh1 = $$("h1", maindiv)[0];
	
	var id = $$("a", xh1)[1].href.match(/(\d+)$/)[1];
	xh1.innerHTML += '<div id="informations" style="position:absolute; left:392px; top:10px;">' +
		'<a class="interface_informations_outgoing_attack" style="width:32px; background-position:-5px -56px; height:26px; border:4px solid #0C0D0D; border-right-width:0px; -moz-border-radius:11px 0px 0px 11px; cursor:pointer;" id="outgoingAttack" href="/fleetBase/mission/1/planetId/'+id+'/m/302"/>' +
		'<a class="interface_informations_outgoing_support" style="width:32px; background-position:-1px -56px; height:26px; border:4px solid #0C0D0D; border-left-width:0px; -moz-border-radius:0px 11px 11px 0px; cursor:pointer;" id="outgoingSupport" href="/fleetBase/mission/1/planetId/'+id+'/m/303"/>' +
	'</div>';
	var bounty = 0;
	var debris = 0;
	var bounty_idx = -1;
	var debris_idx = -1;
	results.each(function(r, i){
		var m = r.textContent.match(/\s(\d+)/g);
		if (m.length == 3) {
			bounty = eval(m.join("+"));
			bounty_idx = i;
		}
		if (m.length == 2) {
			debris = eval(m.join("+"));
			debris_idx = i;
		}		
	});
	var fleetTables = $$("div.fleetTable/table[0]", maindiv);
	var races = [];
	fleetTables.each(function(table, side) {
		var unit_img = $$("tr[0]/td[1]/img", table)[0];
		races[side] = unit_img.className.match(/fleet_(\d)/)[1] - 1;
	});
	
	var myFleet = fleetTables[0];
	var myRaceShips = ships[races[0]];
	
	var fleet = $$("tr[2]/td[n+1]", myFleet);
	var losses = $$("tr[4]/td[n+1]", myFleet);

	var capacity = 0;
	fleet.each(function(cell, u) {
		var ship = myRaceShips[u];
		var cap = ship.payload * cap_eff[ship.type];
		if (u != RECYCLER_IDX) {
			capacity += (cell.innerHTML - losses[u].innerHTML) * cap;
		}
	});
	if (bounty_idx > -1) {
		results[bounty_idx].innerHTML += " [ " +
			(100 * bounty / Math.round(capacity)).toFixed(1) +
			"% ]";
	}
	if (debris_idx > -1) {
		results[debris_idx].innerHTML += " [ " +
			Math.ceil(debris / myRaceShips[RECYCLER_IDX].payload / cap_eff['C']) +
			"×<span style='position:relative;top:7px;'>" +
			myFleet.rows[0].cells[RECYCLER_IDX+1].innerHTML
			+ "</span> ]";
	}
	
	losses.each(function(cell, u){
		var ship = myRaceShips[u];
		var amount = cell.innerHTML;
		for(var r = 0; r < 3; r++) {
			combat.off.resources[r] += ship.cost[r] * amount;
		}
	});
	
}


/* MAP */
if (location.pathname.match(/^\/map\//)) {
	var galaxyNr = document.getElementsByName('galaxyId')[0].value;
	
	function iterateMap(callbalck) {
		for (p in mapData) {
			if (p.match(/^\d+$/)) callbalck(mapData[p], p);
		}
	}
	
	function iteratePlanets(callback) {
		for (s in mapData) if (s.match(/^\d+$/)) {
			var pp = mapData[s].planets;
			for (p in pp) if (p.match(/^\d+$/)) {
				callback(pp[p]);
			}
		}
	}
/*	var a = [];
	function searchAll(planet) {
		if (planet.alliance_name == "ISP") {
			a.push(planet);
		}
	}
	iteratePlanets(searchAll);*/

	// reading page data through unsafeWindow object
	var mapData = unsafeWindow.mapData;	
	
	var coords = {
		min: {x: Infinity, y: Infinity},
		max: {x:-Infinity, y:-Infinity}
	};

	iterateMap(function(system, p){
		var c = xy_from_id(p);
		coords.min.x = Math.min(coords.min.x, c.x);
		coords.min.y = Math.min(coords.min.y, c.y);
		coords.max.x = Math.max(coords.max.x, c.x);
		coords.max.y = Math.max(coords.max.y, c.y);
	});
	coords.mid = {
		x: $('x4').innerHTML,
		y: $('y3').innerHTML
	}
	var recycleables = [];
	for (p in mapData) {
		if (p.match(/^\d+$/)) {
			var system = mapData[p];
			var c = xy_from_id(p);
			if (system.comets) {
				system.comets.each(function(comet) {
					comet.distance = distance(c, coords.mid);
					comet.x = c.x;
					comet.y = c.y;
					comet.link = "c" + comet.id;
					//comet.r0 = comet.r1 + comet.r2 + comet.r3;
					recycleables.push(comet);
				});
			}
			if (system.asteroids) {
				system.asteroids.each(function(asteroid) {
					asteroid.distance = distance(c, coords.mid);
					asteroid.x = c.x;
					asteroid.y = c.y;
					asteroid.link = "a" + asteroid.id;
					asteroid.name = lang['asteroid'];
					recycleables.push(asteroid);
				});
			}
			if (system.debris) {
				for (d in system.debris) if (d.match(/^\d+$/)) {
					field = system.debris[d];
					field.distance = distance(c, coords.mid);
					field.x = c.x;
					field.y = c.y;
					field.link = "d" + field.planet_id;
					field.name = lang['debris'];
					field.r3 = 0;
					recycleables.push(field);
				}
			}
		}
	}
	recycleables.sortBy('distance');
	
	var str =
		'<div class="tLeft interface_dialog_tLeft">' +
		'<div class="tRight bgNoRepeat interface_dialog_tRight" style="background-position: right center;">' +
		'<a href="#" style="padding: 13px 20px 0pt 0pt; float: right;">x</a></div></div>' +
		'<div class="mLeft bgYRepeat interface_dialog_mLeft"><div class="mRight bgCenterRight bgYRepeat interface_dialog_mRight">' +
		'<div class="content"><table style="text-align:right;width:500px;"><tr><td>#</td><td>'+lang['name']+'</td>'+
		'<td><img src="/img/interface/icon/metal.png"></td>' +
		'<td><img src="/img/interface/icon/crystal.png"></td>' +
		'<td><img src="/img/interface/icon/deuterium.png"></td>'+
		'<td>'+lang['distance']+'</td><td>X</td><td>Y</td><td>'+lang['action']+'</td></tr>';
	recycleables.splice(0, 20).each(function(comet, idx){
		str += '<tr>' +
			'<td>' + (idx+1) + '</td>' +
			'<td>' + comet.name + '</td>' +
			'<td>' + comet.r1 + '</td>' +
			'<td>' + comet.r2 + '</td>' +
			'<td>' + comet.r3 + '</td>' +
			'<td>' + comet.distance.toFixed(2) + '</td>' +
			'<td>' + comet.x + '</td><td>' + comet.y + '</td>' +
			'<td>' +
				'<a href="/fleetBase/mission/1/planetId/'+comet.link+'/m/301">'+lang['recycle']+'</a>' +
		//		' |	<a href="/map/index/comet/'+comet.id+'">'+lang['center_map']+'</a>' +
			'</td></tr>';
	});
	str +=
		'</table></div></div></div><div class="bLeft interface_dialog_bLeft">'+
		'<div class="bRight bgNoRepeat bgCenterRight interface_dialog_bRight"></div></div>';
	var div = document.createElement('div');
	div.id = "buildingQueue";
	div.className = "fontLeft dialog";
	div.style.display = "block";
	div.style.zIndex = 10000;
	div.style.top = "220px";
	div.innerHTML = str;
	$$("a", div)[0].addEventListener('click', function(){
		document.body.removeChild(div);
	}, false);
	
	function drawMapOverlay() {
		if (document.body.lastChild == div) {
			document.body.removeChild(div);
		} else {
			document.body.appendChild(div);
		}
	}
	
	var formTable = $$("table", $('mapToolbar'))[0];
	var colgroup = $$("colgroup", formTable)[0];
	formTable.style.marginLeft = "auto";
	
	colgroup.innerHTML = '<col/>' + colgroup.innerHTML;
	var cell = formTable.rows[0].insertCell(0);
	cell.style.paddingTop = "3px";
	cell.style.width = "80px";
	cell.innerHTML = '<a class="buttonStd interface_forms_buttons_standart" onclick="this.blur();" href="#"><span class="interface_forms_buttons_standart"></span>info</a>';
	$$("a", cell)[0].addEventListener('click', drawMapOverlay, false);
}

/* PLANET OVERVEIW */
if (location.pathname.match(/^\/planet\//)) {
	var a = $('incomingAttack');
	if (a.className.match(/active/)) {
		setTimeout(blinkTroopsMovement, 0, a);
	};
}

/* fleetBase */
if (location.pathname.match(/^\/fleetBase\//)) {
	var res = Planet.resources.current.clone();
	$$("div.fleetTable/table[0]/tr[6]/td[1]/ul", $("fleetBase")).each(function(elt){
		$$("li", elt).each(function(li, r){
			res[r] += li.innerHTML.to_i();
			if (res[r] >= Planet.resources.capacity[r]) {
				li.style.color = "red";
			}
		});
	});
}

/* marketplace */
if (location.pathname.match(/^\/market\//)) {
	//var description = $$("table[0]/tr[1]/td[0]", $('market'))[0].innerHTML;
	var capacity = traders_capacity[Player.race] * (1 + 0.2 * (Player.research.levels[61] || 0));
	
	for (var r = 1; r <= 3; r++) {
		var input = $("resourceInputR"+r);
		input.className = "textShort";
		var cell = input.parentNode;
		cell.innerHTML += " <a href='javascript:;' onclick='i=$(\"resourceInputR"+r+"\");i.value=-(-i.value-"+capacity+");'>[+]</a>";
	}
}

} catch(e) {
	window.status = 'IH error: ' + e;
}
} else {
	window.status = m;
}

var elt = $$("div.planet/a.icon", $("navigation"))[0];
elt.style.MozTransformOrigin = "48.5% 48.5%";
function rotatePlanet() {
	var d = new Date();
	var angle = (d.getTime() % 86400000) / 120000;
    elt.style.MozTransform = "rotate("+angle+"deg)";
}
//setInterval(rotatePlanet, 60000);

/* DIALOG WINDOW
<div id="buildingQueue" class="fontLeft dialog" style="display: block;">
<div class="tLeft interface_dialog_tLeft">
<div class="tRight bgNoRepeat interface_dialog_tRight" style="background-position: right center;"/>
</div>
<div class="mLeft bgYRepeat interface_dialog_mLeft">
<div class="mRight bgCenterRight bgYRepeat interface_dialog_mRight">
<div class="content">
</div>
</div>
</div>
<div class="bLeft interface_dialog_bLeft">
<div class="bRight bgNoRepeat bgCenterRight interface_dialog_bRight"/>
</div>
</div>
*/

} catch(e) {
	window.status = "IH: wrapper error";
}