Ogame Redesign: Resources in Flight

By Vess Last update Nov 30, 2011 — Installed 100,420 times.

There are 18 previous versions of this script.

// ==UserScript==
// @name           OGame Redesign: Resources in Flight
// @description    Displays how many resources are in flight on the overview page
// @namespace      Vesselin
// @version        1.27
// @date           2011-11-30
// @author         Vesselin Bontchev
// @include        http://*.ogame.*/game/index.php?page=movement*
// ==/UserScript==

(function ()
{
	// Settings:
	const colors = ["crimson", "deepskyblue", "cornflowerblue", "yellow"];	// MetalColor, CrystalColor, DeuteriumColor, TitleColor
	const below = false;
	const onlyToCurrent = true;
	const inEventList = true;
	const totalStr = "=";
	const titleImg = "data:image/jpg;base64," +
		"/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcU" +
		"FhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgo" +
		"KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAUACEDASIA" +
		"AhEBAxEB/8QAGwABAAICAwAAAAAAAAAAAAAAAAYHAQMCBAX/xAArEAACAQMDBAAEBwAAAAAAAAAB" +
		"AgMEBREABhITFCExIjJBURUjQ2GBkbH/xAAXAQEBAQEAAAAAAAAAAAAAAAAEAQID/8QAHBEAAgMB" +
		"AAMAAAAAAAAAAAAAAAECESEDBDEz/9oADAMBAAIRAxEAPwCqdn2O3Wujo6++VUkNJJ1ahZOAJcom" +
		"FSJDjqNydcrkA5GcAEiW1N3tkMdVVDaVY0FOsTNUVFSIiQxAXlCqNwZh6Tnk5yCQDiIistW3rFHe" +
		"7DVyT3rqRU6sKZWiSPgS+RImesCvzYZQDgfc9QbxlrrLt22XLt56BblUVFQskIVmaRhyYsjcsYkc" +
		"jAXB9csDEnrosXhYN3uVooYY6u4We2NBUusa9O6ZKocHDII2OMBiWPHAP9+DSWK0Q3+ottYgldFZ" +
		"zJRTCeKJeR8lwuG4qPi458g41t2Durb9o2Xb/wAbpurcYamVYsOF/LR0eMOWGCOQdcZ+Vjrnddz2" +
		"2us9HbaG21EFPHCyCslgLMFWHpIxUsFduGR4IwzcvGPPGV00jcaUk6IX0E01p7j99NOwLpjay09O" +
		"7zyUVJVmCOQqlVEJFPj6g+/X8atnb+wNrVRSontAZOAVYO6nCI3EsXGJOWTkD3j4R49ktNC7tpYK" +
		"gvRK4np9u1NRWWa30VPWNH1u6aPqz5HL9ZyZDn65bz69eNUbfqqaZpTI5Leck+Sxx7P++Pvppq+O" +
		"2+VsxL6kZ6jaaaaSYo//2Q==";
	const closeImg = "data:image/gif;base64," +
		"R0lGODlhFwAWANUAABYaHgsNEAECAgwQEBUaHRYdHxASFREUFxUYHAoMDhIVFxIUFxETFw4QEhsf" +
		"IxgfIA4RExETFhwhJS2sQBofJAkKDBofIxwgJAkLDRgfIRofIi6xQRsgJRoeIhkdIQgKCxkeIQ8S" +
		"FA4RFBkfIAwPEwkLDBgeIAwODy6tQBASFhgdIBgdIQ8SFhccHw0QEi6vQQ8SFRoeIwwOEBsgJA4Q" +
		"Ew8RFA0PEQAAAQ0PEhsfJC2tQBwgJQAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAXABYAAAb/wIRC" +
		"sWAcDgxGJJJsKg7DYcAQMYRgBph2q2XBUobUclmriSDltHpdu8JCEAhtTq/b4yJRLe5q+BsugTiD" +
		"OH2BgXSAODaMhI6Pji6Mk5SMh5WVMpqbMjYyAwMboIyanpwBAScnmwGhGxsnqLKomgkVGBgluRgn" +
		"L76+FR/CHxXFAgI3ycoCEzrOOs3IysvHycfNz84vE8jSNwIECAQEAAQv2dkvKOMA7R8qLfEtKOfo" +
		"z74F8R77KisrHiZMPMgwMAPBESMeKAQBooOHGDE0SNQAsaJFiw4sOAAxw4FHBzlChqRAMkdJkTlm" +
		"dJjBcsaFCyhjomy5suWOmzh3cNjJISdOGAstZ/gcStSCBAkviSr9SeKohKVKJZAIAgA7";
	const openImg  = "data:image/gif;base64," +
		"R0lGODlhFwAWANUAABYaHgsNEAECAgwQEBUaHRYdHxASFREUFxUYHAoMDhIVFxIUFxETFw4QEhsf" +
		"IxgfIA4RExETFhwhJS2sQBofJAkKDBofIxwgJAkLDRgfIRofIi6xQRsgJRoeIhkdIQgKCxkeIQ8S" +
		"FA4RFBkfIAwPEwkLDBgeIAwODy6tQBASFhgdIBgdIQ8SFhccHw0QEi6vQQ8SFRoeIwwOEBsgJA4Q" +
		"Ew8RFA0PEQAAAQ0PEhsfJC2tQBwgJQAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAXABYAAAb/QJJk" +
		"Rywaj0SJkmRBOo+Xi7L5rM6uM+qRw+U4sbMONkcum8tRsPhMoeTabrNj7piBHBZHbM/v8zWAGnse" +
		"HSAgD4gjIw8ZjYwPJiYeKysqHpctLQUvLzqen58vKJmZKh8AqAQEKJ2goQQAqggEAje2tQITraAT" +
		"ArU3vr+2wwI6E7zCxAIVzB/OHxWc0icYJdUYGBUJMjIB3t8BJxvjAwHcMicn3ufcNu02AwMb8TLu" +
		"7O82+fr5Lv37//xwCBxIsCAOfThcNKDBsF+/Bi4IOmxAESIECDVEiLjIsKPHjzQuhoABI0SNkyhT" +
		"qoQg4mSElxFSGEgBgwXJmzcNlDQQwUAAEwVAFRxQwKBo0ZdFDxxgsABogiAAOw==";
	// Code:
	if (! (typeof PRO_setValue == "function") && (! this.GM_getValue || (this.GM_getValue.toString && this.GM_getValue.toString ().indexOf ("not supported") > -1)))
	{
		this.GM_getValue = function (key, def)
		{
			return localStorage [key] || def;
		}
		this.GM_setValue = function (key, value)
		{
			return localStorage [key] = value;
		}
		this.GM_deleteValue = function (key)
		{
			return delete localStorage [key];
		}
	}
	getElementsByClassName = function (element, cl)
	{
		var retnode = [];
		var myclass = new RegExp ('\\b' + cl + '\\b');
		var elem = element.getElementsByTagName ('*');
		for (var i = 0; i < elem.length; i++)
		{
			var classes = elem [i].className;
			if (myclass.test (classes))
				retnode.push (elem [i]);
		}
		return retnode;
	}
	if (document.location.href.indexOf ('/game/index.php?page=movement') >= 0)
	{
		var expanded;
		if (typeof GM_setValue == "function") // greasemonkey
			expanded = GM_getValue ("expanded", false);
		else if (typeof PRO_setValue == "function") // ie7pro
			expanded = PRO_getValue ("expanded", false);
		else
			expanded = below;
		var div;
		var planetRes = [0, 0, 0];
		var curPlanet = "";
		var curPlanetCoords = "";
		function doTable ()
		{
			function addDots (n)
			{
				n += '';
				var rgx = /(\d+)(\d{3})/;
				while (rgx.test (n))
					n = n.replace (rgx, '$1' + '.' + '$2');
				return n;
			}
			function createFontElement (text, color)
			{
				var myFont = document.createElement ("font");
				myFont.color = color;
				var myTextNode = document.createTextNode (text);
				myFont.appendChild (myTextNode);
				return myFont;
			}
			function createCell (row, text, width, alignment, color)
			{
				var myTd = row.insertCell (-1);
				myTd.style.width = width;
				myTd.style.paddingRight = "1em";
				myTd.style.paddingLeft  = "1em";
				myTd.setAttribute ("align", alignment);
				myTd.setAttribute ("nowrap", true);
				if (text.indexOf ("data:image") < 0)
					myTd.appendChild (createFontElement (text, color));
				else
				{
					var myImg = document.createElement ("img");
					myImg.setAttribute ("src", text);
					myTd.appendChild (myImg);
				}
			}
			function addEvent (el, evt, fxn)
			{
				if (el.addEventListener)
					el.addEventListener (evt, fxn, false); // for standards
				else if (el.attachEvent)
					el.attachEvent ("on" + evt, fxn); // for IE
				else el ['on' + evt] = fxn; // old style, but defeats purpose of using this function
			}
			var mya;
			var span = document.createElement ("span");
			span.className = "current";
			if ((mya != null) && (mya.onclick != null))
				mya.removeEventListenet ("click", redrawTable, false);
			var mySpan = document.createElement ("span");
			mya = document.createElement ("a");
			mya.setAttribute ("href", "#");
			var myImg = document.createElement ("img");
			myImg.style.position = "absolute";
			mya.appendChild (myImg);
			mySpan.appendChild (mya);
			if (expanded)
			{
				planetRes [0] = parseInt (document.getElementById ("resources_metal").innerHTML.replace (/\D+/gi, ""));
				planetRes [1] = parseInt (document.getElementById ("resources_crystal").innerHTML.replace (/\D+/gi, ""));
				planetRes [2] = parseInt (document.getElementById ("resources_deuterium").innerHTML.replace (/\D+/gi, ""));
				resInfo [curPlanet] [3] = 0;
				for (var i = 0; i < 3; i++)
				{
					resInfo [curPlanet] [i] = ((onlyToCurrent) ? toPlanet [i] : resInfo [totalStr] [i]) + planetRes [i];
					resInfo [curPlanet] [3] += resInfo [curPlanet] [i];
				}
				var myTable = document.createElement ("table");
				myTable.setAttribute ("border", "2");
				myTable.setAttribute ("bordercolor", "yellow");
				myTable.setAttribute ("rules", "all");
				myTable.setAttribute ("width", "100%");
				var myTr = myTable.insertRow (-1);
				//createCell (myTr, titleStr, "24%", "center", colors [3]);
				createCell (myTr, titleImg, "24%", "center", colors [3]);
				for (var i = 0; i < 3; i++)
					createCell (myTr, rstrings [i], "19%", "center", colors [i]);
				createCell (myTr, totalStr, "19%", "center", colors [3]);
				myImg.style.left = "96%";
				myImg.style.top = "0%";
				//myImg.setAttribute ("src", "img/layout/fleetCloseAll.gif");
				myImg.setAttribute ("src", closeImg);
				myTr.lastChild.setAttribute ("height", "23");
				myTr.lastChild.appendChild (mySpan);
				for (var resIndex in resInfo)
					if (resInfo [resIndex] [3] > 0)
					{
						myTr = myTable.insertRow (-1);
						myText = resIndex;
						if ((resIndex != curPlanet) && (resIndex != totalStr))
							myText += ' (' + addDots (resInfo [resIndex] [4]) + ')';
						createCell (myTr, myText, "24%", "center", (resIndex != totalStr) ? "silver" : colors [3]);
						for (var i = 0; i < 3; i++)
							createCell (myTr, addDots (resInfo [resIndex] [i]), "19%", "right", "silver");
						createCell (myTr, addDots (resInfo [resIndex] [3]), "19%", "right", "silver");
					}
				span.appendChild (myTable);
			}
			else
			{
				span.style.marginLeft = "6px";
				span.style.color = "silver";
				var myImg2 = document.createElement ("img");
				myImg2.setAttribute ("src", titleImg);
				myImg2.style.verticalAlign = "middle";
				span.appendChild (myImg2);
				span.appendChild (createFontElement (": ", colors [3]));
				span.appendChild (createFontElement (rstrings [0], colors [0]));
				span.appendChild (document.createTextNode (" " + addDots (resInfo [totalStr] [0])));
				span.appendChild (document.createTextNode (", "));
				span.appendChild (createFontElement (rstrings [1], colors [1]));
				span.appendChild (document.createTextNode (" " + addDots (resInfo [totalStr] [1])));
				span.appendChild (document.createTextNode (", "));
				span.appendChild (createFontElement (rstrings [2], colors [2]));
				span.appendChild (document.createTextNode (" " + addDots (resInfo [totalStr] [2])));
				span.appendChild (document.createTextNode ("."));
				mySpan.style.cssFloat = "right";
				mySpan.style.styleFloat = "right";
				mySpan.style.marginRight = "28px";
				myImg.style.bottom = "0%";
				//myImg.setAttribute ("src", "img/layout/fleetOpenAll.gif");
				myImg.setAttribute ("src", openImg);
				span.appendChild (mySpan);
			}
			div.appendChild (span);
			if (below)
				document.getElementById ("inhalt").appendChild (div);
			else
			{
				var fleetDetails = getElementsByClassName (document, "fleetDetails");
				fleetDetails [0].parentNode.insertBefore (div, fleetDetails [0]);
			}
			addEvent (mya, "click", redrawTable);
		}
		function redrawTable ()
		{
			while (div.hasChildNodes ())
				div.removeChild (div.firstChild);
			div.parentNode.removeChild (div);
			expanded = ! expanded;
			if (typeof GM_setValue == "function") // greasemonkey
				GM_setValue ("expanded", expanded);
			else if (typeof PRO_setValue == "function") // ie7pro
				PRO_setValue ("expanded", expanded);
			doTable ();
		}
		function getResName (resName)
		{
			var title = document.getElementById (resName + "_box").title;
			if (title.indexOf ("|") >= 0)
				return (title.substring (0, title.indexOf ("|")).replace (/<[^>]+>/g, ""));
			else
				return (title.split (/[<>]/) [2]);
		}
		if (document.getElementById ("resourcesInFlight") != null)
			return;
		var resInfo = new Object;
		var directions = new Array ();
		var flightTypes = new Array ();
		var destinations = new Array ();
		var destinationNames = new Array ();
		var origins = new Array ();
		var originNames = new Array ();
		var myRes = new Array (0, 0, 0);
		var allFlights = getElementsByClassName (document, "mission");
		for (var i = 0; i < allFlights.length; i++)
		{
			flightTypes [i] = allFlights [i].innerHTML;
			var matches = flightTypes [i].match (/\(.+\)/);
			if (matches != null)
			{
				flightTypes [i] = flightTypes [i].replace (matches [0], "");
				directions [i] = "<";
			}
		}
		allFlights = getElementsByClassName (document, "tipsTitleArrowCloseFleet");
		for (var i = 0; i < allFlights.length; i++)
			directions [i] = (allFlights [i].className.indexOf ("reverse") > -1) ? "<" : ">";
		allFlights = getElementsByClassName (document, "originCoords tipsStandard");
		for (var i = 0; i < allFlights.length; i++)
		{
			origins [i] = allFlights [i].firstChild.innerHTML;
			var mySpans = allFlights [i].parentNode.getElementsByTagName ("span");
			if (mySpans.length < 1)
				originNames [i] = "";
			else
			{
				var mySpan = mySpans [mySpans.length - 1];
				originNames [i] = (mySpan.title == "") ? mySpan.textContent.replace (/^\s+|\s+$/g, "") : mySpan.title.substring (mySpan.title.indexOf ("|") + 1);
			}
			//originNames [i] = allFlights [i].parentNode.getElementsByTagName ("span") [1].innerHTML;
			if (typeof (directions [i]) == "undefined")
				directions [i] = ">";
		}
		allFlights = getElementsByClassName (document, "destinationCoords tipsStandard");
		for (var i = 0; i < allFlights.length; i++)
			if (directions [i] == "<")
			{
				destinations [i] =  origins [i];
				destinationNames [i] = ((onlyToCurrent) ? "=>" : "+") + originNames [i];
			}
			else
			{
				destinations [i] =  allFlights [i].firstChild.innerHTML;
				var mySpans = allFlights [i].parentNode.getElementsByTagName ("span");
				if (mySpans.length < 2)
					destinationNames [i] = "";
				else
				{
					var mySpan = mySpans [mySpans.length - 2];
					destinationNames [i] = ((onlyToCurrent) ? "=>" : "+") + ((mySpan.title == "") ? mySpan.textContent.replace (/^\s+|\s+$/g, "") : mySpan.title.substring (mySpan.title.indexOf ("|") + 1));
				}
				//destinationNames [i] = ((onlyToCurrent) ? "=>" : "+") + allFlights [i].parentNode.getElementsByTagName ("span") [0].innerHTML;
			}
		var flightCargo = new Object;
		allFlights = getElementsByClassName (document, "fleetinfo");
		if (allFlights.length > 0)
		{
			for (var i = 0; i < allFlights.length; i++)
			{
				var trs = allFlights [i].getElementsByTagName ("tr");
				var any = false;
				var shipInfos = trs.length;
				if (trs [shipInfos - 1].id == "freeSpace")
					shipInfos--;
				for (var j = 0; j < 3; j++)
				{
					myRes [j] = parseInt (trs [shipInfos - 3 + j].getElementsByTagName ("td") [1].innerHTML.replace (/\D+/gi, ""));
					if (myRes [j] > 0)
						any = true;
				}
				flightCargo [i] = new Array (myRes [0], myRes [1], myRes [2]);
				var type = directions [i] + flightTypes [i];
				if (resInfo [type])
				{
					for (var j = 0; j < 3; j++)
						resInfo [type] [j] += myRes [j];
					if (any)
						resInfo [type] [4] += 1;
				}
				else
					resInfo [type] = new Array (myRes [0], myRes [1], myRes [2], 0, (any) ? 1 : 0);
			}
		}
		else
		{
			allFlights = getElementsByClassName (document, "anti_fleetDetails");
			for (var i = 0; i < allFlights.length; i++)
			{
				var trs = allFlights [i].textContent.split (/\n/);
				var any = false;
				var shipInfos = trs.length;
				if (trs [shipInfos - 1].id == "freeSpace")
					shipInfos--;
				for (var j = 0; j < 3; j++)
				{
					myRes [j] = parseInt (trs [shipInfos - 3 + j].replace (/\D+/gi, ""));
					if (myRes [j] > 0)
						any = true;
				}
				flightCargo [i] = new Array (myRes [0], myRes [1], myRes [2]);
				var type = directions [i] + flightTypes [i];
				if (resInfo [type])
				{
					for (var j = 0; j < 3; j++)
						resInfo [type] [j] += myRes [j];
					if (any)
						resInfo [type] [4] += 1;
				}
				else
					resInfo [type] = new Array (myRes [0], myRes [1], myRes [2], 0, (any) ? 1 : 0);
			}
		}
		var rstrings = ["", "", ""];
		rstrings [0] = getResName ("metal");
		rstrings [1] = getResName ("crystal");
		rstrings [2] = getResName ("deuterium");
		curPlanet = ((onlyToCurrent) ? "=>" : "+") + document.getElementById ("selectedPlanetName").innerHTML;
		allFlights = getElementsByClassName (document, "planet-koords");
		if (allFlights.length == 1)
			curPlanetCoords = allFlights [0].innerHTML;
		else
		{
			for (var i = 0; i < allFlights.length; i++)
				if (allFlights [i].parentNode.className.indexOf (" active ") != -1)
				{
					curPlanetCoords = allFlights [i].innerHTML;
					break;
				}
		}
		resInfo [totalStr]  = new Array (0, 0, 0, 0, 0);
		resInfo [curPlanet] = new Array (0, 0, 0, 0, 0);
		toPlanet = new Array (0, 0, 0);
		for (var i = 0; i < destinations.length; i++)
			if ((destinations [i] == curPlanetCoords) && (destinationNames [i] == curPlanet))
				for (var j = 0; j < 3; j++)
					toPlanet [j] += flightCargo [i] [j];
		planetRes [0] = parseInt (document.getElementById ("resources_metal").innerHTML.replace (/\D+/gi, ""));
		planetRes [1] = parseInt (document.getElementById ("resources_crystal").innerHTML.replace (/\D+/gi, ""));
		planetRes [2] = parseInt (document.getElementById ("resources_deuterium").innerHTML.replace (/\D+/gi, ""));
		for (var resIndex in resInfo)
			resInfo [resIndex] [3] = 0;
		for (var resIndex in resInfo)
			for (var i = 0; i < 3; i++)
			{
				if (resIndex == curPlanet)
					resInfo [curPlanet] [i] = ((onlyToCurrent) ? toPlanet [i] : resInfo [totalStr] [i]) + planetRes [i];
				else if (resIndex != totalStr)
					resInfo [totalStr] [i] += resInfo [resIndex] [i];
				resInfo [resIndex] [3] += resInfo [resIndex] [i];
			}
		if (resInfo [totalStr] [3] > 0)
		{
			div = document.createElement ("div");
			div.setAttribute ("id", "resourcesInFlight");
			div.className = "fleetDetails detailsOpened";
			div.style.height = "auto";
			div.style.fontWeight = "bold";
			div.style.lineHeight = "18px";
			doTable ();
		}
	}
}
) ();