Travian: Resource++ v1

By usr8472 Last update Jun 10, 2007 — Installed 2,637 times.
// ==UserScript==
// @author		usr8472@gmail.com  based on luckyman script, modified by tomasz.frelik (at) enzo.pl, modified by Otyugh with resource overflow based on wannes 
// @namespace	http://userscripts.org/
// @name		Travian: Resource++ v1
// @description	Travian Page Resource++ v1
// @include		http://s*.travian.*/*.php*
// ==/UserScript==

if ( navigator.appName == 'Opera' ) {
     eventSource = document;
} else {
     eventSource = window;
}

function TimeFieldToSecond(maxtime) { // convert a hh:mm:ss time stamp to seconds
   var limit = maxtime.split(":");
   return (limit.length == 3) ? (parseInt(limit[0]) * 3600 + parseInt(limit[1]) * 60 + parseInt(limit[2])) : 0;
}

var autotime;

function StartTimer() { // clock for launching a new page
var go = 0;
var resource = [];

	for(var i=0;i<4;i++) {
	  rtd  = returnObjById("l"+(i+1));
	  if(!rtd) return;
	  prod  = parseInt(rtd.title);
	  store = parseInt(rtd.textContent.match(/\-?(\d+)\//));
	  storeMax = parseInt(rtd.textContent.replace(/(\d+)\//,""));  
	  resource[i]=[prod,store,storeMax];
 
	auto="res"+i;
	parselimit=returnObjById(auto);
	if(!parselimit) return;
	
		parselimit=TimeFieldToSecond(parselimit.innerHTML)-1;

		var sec=0;
				
		if(prod >0){
				sec= parseInt(3600*(storeMax-store)/prod);
		}  else if( prod < 0) {
				sec= parseInt(3600*-store/prod);
		}	

		if(sec<parselimit) parselimit=sec;
					
		if(parselimit>0) {
		    var insertArea=document.getElementById(auto);
			    go=1;
				
					if(parselimit<300) {
						insertArea.style.color="red";
					} 
					else {
						insertArea.style.color="green";
					}

				insertArea.innerHTML = formatORG(parselimit);
		}

		

		if(parselimit<=0){
			var insertArea=document.getElementById(auto);
			if(insertArea.innerHTML.indexOf("00:00:00 h")==-1) {insertArea.innerHTML="00:00:00 h";insertArea.style.color="red";}
		}

		
	}

	

	if(go==1){
		updateBar(parseInt(100*(resource[0][1]/resource[0][2]) ).toFixed(0),"wood");
		updateBar(parseInt(100*(resource[1][1]/resource[1][2]) ).toFixed(0),"clay");
		updateBar(parseInt(100*(resource[2][1]/resource[2][2]) ).toFixed(0),"iron");
		updateBar(parseInt(100*(resource[3][1]/resource[3][2]) ).toFixed(0),"crop");
		autotime = window.setTimeout(StartTimer, 1000);
	} else {
		clearTimeout(autotime);
		return;
	}

 }
 
function RGB2HTML(blue, green, red)
{
    var decColor = red + 256 * green + 65536 * blue;
	
	decColor=decColor.toString(16);
	
	while( decColor.length < 6){
		decColor="0"+decColor;
	}
	
    return "#"+decColor;
}

function formatTime(maxtime,hours, minutes, seconds, off){
     var hrs = Math.floor(maxtime/3600);
     var min = Math.floor(maxtime/60) % 60;
     var sec = maxtime % 60;
     hours=hrs+hours+off;
     minutes=min+minutes;
     seconds=seconds+sec;
     return [hours,minutes,seconds];
}

var military=0;
var dayOff=0;

function EstGen(time){
     var days=0;
     var head="";

     var tail=" Clock ";

     while(time[2]>=60){
     time[2]-=60;
     time[1]+=1;
     }

     while(time[1]>=60){
     time[1]-=60;
     time[0]+=1;
     }

     while(time[0]>=24){
     time[0]-=24;
     days+=1;
     }

     if(military==-1){
     if(time[0]>12){
          time[0]-=12;
          tail=" pm";
     } else{
          if(time[0]==0) {time[0]=12;}
          tail=" am";
     }
     }

     if(time[0]<10){
     time[0]="0"+time[0];
     }
     if(time[1]<10){
     time[1]="0"+time[1];
     }
     if(time[2]<10){
     time[2]="0"+time[2];
     }

     if(days==0){
     head="Enough resources today at ";
     } else if(days==1){
     head="Enough resources tomorrow at " ;
     } else {
     head="Enough resources in " +d + " days at ";
     }
     

return head+time[0]+":"+time[1]+":"+time[2]+tail;

}

function formatORG(maxtime){

     var helper=formatTime(maxtime,0, 0, 0, 0);

     var hrs = helper[0];
     var min = helper[1];
     var sec = helper[2];
     
     var t = hrs + ":";
     if(min < 10){t += "0";}
     t += min;
     t += ":";
     if(sec < 10){t += "0";}
     t += sec;
     return t+" h";
}

function returnObjById( id )
{
    if (document.getElementById)
        return document.getElementById(id);
    else if (document.all)
        return document.all[id];
    else if (document.layers)
        return document.layers[id];
}

function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
     
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];      
        if(oRegExp.test(oElement.className)){
       arrReturnElements.push(oElement);
        }   
    }
    return (arrReturnElements)
}

/* ----------------------------------------------------- */

function updateBar(store, id){
var c=returnObjById(id+"color");

if(c.innerHTML.indexOf(store+"%")!=-1) return;

returnObjById(id+"bar").width=store+"%";
	
var tol=255;
var font="white";
var sec=tol-100-store;

	if(store<50){
		tol=150;
		font="white";
	} else {
		tol=255;
		font="black";
	}

var red=parseInt(tol*(store/100));


	if(store>=90){
		c.style.textDecoration="blink";
	} 
	else {
		c.style.textDecoration="none";
	}
		
	c.innerHTML=store+"%";
	var color =RGB2HTML(red,sec,sec);
	c.style.background=color;
	c.color=font;
	
}

function quickBar(store, elbar, elcol, img ){
var newmenu="";

var tol=255;
var font="white";
var sec=tol-100-store;

if(store<50){
tol=150;
font="white";
} else {
tol=255;
font="black";
}

var red=parseInt(tol*(store/100));
if(store>=90){
font=font+";text-decoration: blink;";
}
newmenu += "<tr>";
newmenu += "<td colspan=2><table id="+elbar+" width="+store+"% cellpadding=0 cellspacing=0><tbody><tr><td width=1%><img src=http://s3.travian.com/img/un/r/"+img+".gif></td><td id="+elcol+" style='background-color: rgb("+red+","+sec+","+sec+");font-size:8pt;color: "+font+"'>"+store+"%</td></tr></tbody></table></td>";
newmenu += "</tr>";

return newmenu;
}

function quickMenu(store_wood,store_iron,store_clay,store_crop, out){

var mymenu_div = document.createElement( 'div' );

mymenu_div.setAttribute('style', 'z-index:5;');
mymenu_div.className = "unem";
mymenu_div.style.position = "relative";
mymenu_div.style.left = "130px";
mymenu_div.style.width = "550px";
mymenu_div.style.top = "120px";
mymenu_div.style.clear = "both";

var newmenu = "";

newmenu += "<table cellspacing=1 cellpadding=1 class=tbg id=mymenu><tbody>";
newmenu += "<tr class=rbg><td colspan=2>Resource Meters</td></tr>";

newmenu += "<tr><td width=270>"+out[0]+"</td><td>"+out[1]+"</td></tr><tr><td width=270>"+out[2]+"</td><td>"+out[3]+"</td></tr>";

newmenu += "<tr>";
newmenu += "<td colspan=2 class=rbg>Resource Bars</td>";
newmenu += "</tr>";


newmenu += quickBar(store_wood, "woodbar", "woodcolor",1);
newmenu += quickBar(store_clay,"claybar", "claycolor",2);
newmenu += quickBar(store_iron,"ironbar", "ironcolor",3);
newmenu += quickBar(store_crop,"cropbar", "cropcolor",4);

newmenu += "</tbody></table>";

mymenu_div.innerHTML=newmenu;


//if you want you can add other page specific pos info, if you want you can append to body but you would need to change top for certain pages
if(window.location.href.indexOf("build")!=-1 || window.location.href.indexOf("statistiken")!=-1 || window.location.href.indexOf("allianz")!=-1){
mymenu_div.style.top = "10px";}

document.getElementById("ce").appendChild(mymenu_div)
}

/* -------------------------------------------------- */

function onLoad(){

     var results = document.evaluate('//td[@id]/text()',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);

     if (results.snapshotLength == 0) {return;}
	 	 
	var out = [], resource = [], ele = [];
	ele[0]="Wood";
	ele[1]="Clay";
	ele[2]="Iron";
	ele[3]="Crop";

	for(var i=0;i<4;++i) {
	 rtd  = returnObjById("l"+(i+1));
	  if(!rtd) return;
	  
	  prod  = parseInt(rtd.title);
	  store = parseInt(rtd.textContent.match(/\-?(\d+)\//));
	  storeMax = parseInt(rtd.textContent.replace(/(\d+)\//,""));  
	  resource[i]=[prod,store,storeMax];
	  
	    if(store>0){ 
			if(prod > 0) {
				secFull = (3600*(storeMax-store)/prod);
		  	    out[i]="Overflow: <span id=res"+i+" >"+formatORG(Math.ceil(Math.max(0,secFull)))+" </span>";
			}  else if(prod[i] < 0) {
			    secFull = (3600*-store/prod);
				out[i]="Depleted: <span id=res"+i+" >"+formatORG(Math.ceil(Math.max(0,secFull))) +" </span>";
			} else {
				out[i]="Unknown: <span id=res"+i+" > 00:00:00 h"+"</span>";
			}
			out[i]="<span style='font-size:8pt;'>"+ele[i]+" "+out[i]+" </span>"
		} else {
			out[i]="Unknown: <span id=res"+i+" > 00:00:00 h"+"</span>";
			out[i]="<span style='font-size:8pt;'>"+ele[i]+" "+out[i]+" </span>"
		}
		
		
	} 
	 
     var wood = resource[0][1];
     var clay = resource[1][1];
     var iron = resource[2][1];
     var crop = resource[3][1];

     var woodp = resource[0][0];
     var clayp = resource[1][0];
     var ironp = resource[2][0];
     var cropp = resource[3][0];
	 
	var wood_storage = resource[0][2];
	var clay_storage = resource[1][2];
	var iron_storage = resource[2][2];
	var crop_storage = resource[3][2];

	var store_wood = parseInt(100*(wood/wood_storage) ).toFixed(0);
	var store_iron = parseInt(100*(iron/iron_storage) ).toFixed(0);
	var store_clay = parseInt(100*(clay/clay_storage) ).toFixed(0);
	var store_crop = parseInt(100*(crop/crop_storage) ).toFixed(0);


     var woodsn=0,claysn=0,ironsn=0,cropsn=0;
     if (wood<woodneed) woodsn=woodneed-wood;
     if (clay<clayneed) claysn=clayneed-clay;
     if (iron<ironneed) ironsn=ironneed-iron;
     if (crop<cropneed) cropsn=cropneed-crop;
	 	
	quickMenu(store_wood,store_iron,store_clay,store_crop, out);
		
     var need = document.evaluate('//table[@class="f10"]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
     if(need.snapshotLength==0) {return;}

     var hours;
     var minutes;
     var seconds;
     
     var servertime=returnObjById("tp1").textContent.split(":");
     
     if(servertime.length!=0){
     hours=parseInt(servertime[0]);
     minutes=parseInt(servertime[1]);
     seconds=parseInt(servertime[2]);
     military=0;
     dayOff=0;
     } else {
     var Digital=new Date();
     hours=Digital.getHours();
     minutes=Digital.getMinutes();
     seconds= Digital.getSeconds();
     military=0;
     dayOff=0;
     }
     
     for (var i=0;i<need.snapshotLength;i++){

     if (need.snapshotItem(i).textContent.indexOf("|")==-1||need.snapshotItem(i).textContent.charAt(0)=="\n") continue;
     var needs = need.snapshotItem(i).textContent.split(" | ");

     var woodneed = parseInt(needs[0]);
     var clayneed = parseInt(needs[1]);
     var ironneed = parseInt(needs[2]);
     var cropneed = parseInt(needs[3]);

     var woodsn=0,claysn=0,ironsn=0,cropsn=0;
     if (wood<woodneed) woodsn=woodneed-wood;
     if (clay<clayneed) claysn=clayneed-clay;
     if (iron<ironneed) ironsn=ironneed-iron;
     if (crop<cropneed) cropsn=cropneed-crop;

     var maxtime=0,time,t;
     woodtime = woodsn/woodp*3600;
     if (maxtime<woodtime) maxtime=woodtime;
     claytime = claysn/clayp*3600;
     if (maxtime<claytime) maxtime=claytime;
     irontime = ironsn/ironp*3600;
     if (maxtime<irontime) maxtime=irontime;
     croptime = cropsn/cropp*3600;
     if (maxtime<croptime) maxtime=croptime;

     maxtime=parseInt(maxtime);

     t=formatTime(maxtime,hours, minutes, seconds, dayOff);

     t=EstGen(t);
        maxtime=formatORG(maxtime);

     croptime=parseInt(croptime);
        irontime=parseInt(irontime);
     claytime=parseInt(claytime);
     woodtime=parseInt(woodtime);

     if(woodtime>0){
     woodtime=formatORG(woodtime);}

     if(claytime>0){
        claytime=formatORG(claytime);}

     if(irontime>0){
     irontime=formatORG(irontime);}

     if(croptime>0){
     croptime=formatORG(croptime);
     }

         var timeo=0;

     if (wood>woodneed && woodsn==0)
     {
        woodsn=wood-woodneed;
        woodsn="+"+woodsn;
     }
     else if(woodsn!=0)
     {
        timeo=1;
        woodsn="-"+woodsn;
     }

     if (clay>clayneed && claysn==0)
     {
        claysn=clay-clayneed;
        claysn="+"+claysn;
     }
     else if (claysn!=0)
     {
        timeo=1;
        claysn="-"+claysn;
     }

     if (iron>ironneed && ironsn==0  )
     {
        ironsn=iron-ironneed;
        ironsn="+"+ironsn;
     }
     else if( ironsn!=0 )
     {
        timeo=1;
        ironsn="-"+ironsn;
     }

     if(crop>cropneed && cropsn==0 )
     {
         cropsn=crop-cropneed;
          cropsn="+"+cropsn;
     }
     else if( cropsn!=0 )
     {
          timeo=1;
          cropsn="-"+cropsn;
     }

        if ('0'!=woodsn && '0'!=claysn && '0'!=ironsn && '0'!=cropsn)
     {
          var resource_div = document.createElement( 'div' );
          resource_div.style.background="transparent";
          resource_div.style.cssFloat = "left";
          var iner = '<b>Needed</b> for upgrading: (+) surplus, (-) needed <br/><table border=0><tr><td></td><td><b><font color=green>Balance</font></b></td><td><b><font color=green>Status</font></b></td></tr><tr><td colspan=3 height=10px><hr size=1></td></tr><tr>';
iner+=imageTag(1, "Wood", woodsn,woodtime,woodneed);
iner+=imageTag(2, "Clay", claysn,claytime,clayneed);
iner+=imageTag(3, "Iron", ironsn,irontime,ironneed);
iner+=imageTag(4, "Crop", cropsn,croptime,cropneed);

          if(timeo==1)
          {
          iner+='<tr><td colspan=3><span>'+t+" | Please wait : "+maxtime+"</span></td></tr>";
          }
          iner+="</table>";
          resource_div.innerHTML=iner;
          need.snapshotItem(i).appendChild(resource_div);


     }
     }
	 
	 
StartTimer();
}

function imageTag(numberid, resourceid, resource,time, need){
    var text='<tr><td><img src="img/un/r/'+numberid+'.gif" width="18" height="12"></td><td>'+resource+"</td><td>";
     if(time==0){
     text+="<font color=navy>"+((parseInt(resource)/need)*100).toFixed(2)+" % enough </font> - <font color=green><b>OK</b></font><br/>";
     } else {
     text+="<font color=red><b>" +resourceid+" will complete in : " + time+"</b></font><br/>";
     }
     text += "</td></tr>";
     return text;
}

eventSource.addEventListener( 'load', function( e ) {  onLoad();  } ,false);