Travian: Resource++ v4

By usr8472 Last update Mar 16, 2008 — Installed 38,750 times. Daily Installs: 27, 29, 23, 16, 29, 19, 17, 21, 19, 13, 22, 25, 18, 31, 21, 17, 19, 26, 16, 25, 21, 20, 27, 24, 17, 22, 23, 28, 23, 14, 30, 9

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

// ==UserScript==
// @author		usr8472@gmail.com 
// @name		Travian: Resource++ v4
// @namespace	http://userscripts.org/
// @description	Travian: Resource++ v4 Added move function to menu bars.  
// @include	http://*.travian.*php*
// @include	http://*.travian3.*php*
// @exclude 	http://forum.travian.*
// @exclude 	http://*.travian.*/index.php*
// @exclude 	http://*.travian.*/anleitung.php*
// @exclude 	http://*.travian.*/login.php*
// @exclude 	http://*.travian.*/logout.php*
// @exclude 	http://*.travian.*/chat.php*
// @exclude 	http://*.travian.*/impressum.php*
// @exclude 	http://*.travian.*/karte2.php*
// @exclude 	http://www.travian.*
// @exclude 	http://forum.travian3.*
// @exclude 	http://*.travian3.*/index.php*
// @exclude 	http://*.travian3.*/anleitung.php*
// @exclude 	http://*.travian3.*/login.php*
// @exclude 	http://*.travian3.*/logout.php*
// @exclude 	http://*.travian3.*/chat.php*
// @exclude 	http://*.travian3.*/impressum.php*
// @exclude 	http://*.travian3.*/karte2.php*
// @exclude 	http://www.travian.*
// ==/UserScript==

var eventSource= (navigator.appName.indexOf('Opera') == -1) ? window : document; // I use this because I might want to make it cross browser later
eventSource.addEventListener( 'load', function( e ) { onLoad(); }, false); //to be run on load of the page
var loc=eventSource.location.href; // the current page href

var links='true';
var res='true';
var nav='true';
var tools='true';

//the different movable menus
var thepop; 
var res_m;
var nav_m;
var tools_m;

var resWidth=254; //254 default
var navWidth=150; // 150 default
var toolsWidth=254; // 254 default

var startform;
var lang;
var order=0;// what is the order of the resources lumber to crop or crop to lumber
var fields=[]; //setup the space for the resource names
var langfile=[]; //multi lang support, the space for the different translations
var resource=[]; //setup the space for the resource data
var ratio=[]; // ratio of resources
var overflow;//setup the space for the overflow data
var autotime; // the timeout control, to update the countdown of overflow
var pagetime; //the time on the page server
var military=true; // is the pagetime 24 or 12 based clock

//for drag effect
var mouseOffset = null;
var iMouseDown = false;
var lMouseState = false;
var dragObject = null;
var curTarget = null;

function location(){
	lang = loc.match(/travian(\.[a-zA-Z]{2,3})+/);
	if(!lang) {
		lang = loc.match(/travian3(\.[a-zA-Z]{2,3})+/).pop(); 
	} else {
		lang = loc.match(/travian(\.[a-zA-Z]{2,3})+/).pop();
	}
}

function onLoad(){ // runs the differnt functions and procedures, 

	location();
	
	if(!lang) {
		return;
	}
	
	gatherFields(); 
	
	if(!fields[lang]) {
		return;
	}
		
	switch(lang){ //load only the lang you need into memory
		case '.se':
		langfile[lang]=['Behöver för uppgradering:','överfullt om','förbruka om','Resurs Meters','Resurs Bars', 
		' ','Tillräckligt med råvaror idag klockan ','Tillräckligt med råvaror imorgon klockan ', 'Tillräckligt med råvaror om ',
		' dagar, kl ' , ' Efter max väntan: ',  'Överskott: ','Vänta: ','Saknar','Klar',' Vänta: ' ,'Blanserad',
		'Förbruka överskott om: ','Uppgradera ', ' resurs produktion.','Neutral balans.', 'Bygg ut magasin', 'Bygg ut silo'];
		break;  
		case '.uk':
		langfile[lang]=['Needed for upgrading:','Overflow', 'Depleted','Resource Meters','Resource Bars', 
		' Clock' ,'Enough resources today at ','Enough resources tomorrow at ', 'Enough resources in ', 
		' days at ' , ' After max wait: ' , 'Storage: ','Wait time: ','Deficit' ,'Surplus',' Max wait: ','Balanced',
		'Surplus depleted in: ','Upgrade ',' resource production.','Neutral balance.', 'Extend Warehouse' , 'Extend Granary'];		
		break;
		case '.com':
		case '.us':
		langfile[lang]=['Needed for upgrading:','Overflow', 'Depleted','Resource Meters','Resource Bars', 
		" o'clock",'Enough resources today at ','Enough resources tomorrow at ', 'Enough resources in ', 
		' days at ', ' After max wait: ' , 'Storage: ','Wait time: ','Deficit','Surplus', ' Max wait: ','Balanced', 
		'Surplus depleted in: ','Upgrade ',' resource production.','Neutral balance.' , 'Extend Warehouse' , 'Extend Granary' ];						
		break;
		case '.hu':
		langfile[lang]=[ 'Fejlesztéshez kell:', 'betelik', 'betelt', 'Nyersanyagok' , 'Nyersanyagok',
		' órakor' ,'Elég nyersanyag ma ','Elég nyersanyag holnap ', 'Elég nyersanyag ',
		' nap múlva ' , ' Max várakozás után: ' , 'Készleten: ','Várj: ','Hiány' ,'Többlet',' Max várakozás: ','Kiegyensúlyozott',
		'A többlet elfogy: ','Fejlesztés ',' nyersanyag termelés.','Semleges egyensúly.', 'Fejlesztd hozzá a raktárat!' , 'Fejlesztd hozzá a magtárat!'  ];
		break;
		case '.de':
		langfile[lang]=['Für Ausbau benoetigt:','Überschuß', 'Erschöpft','Resourcenmeter','Resourcenbalken', 
		' Uhr','Genug Resourcen heute um ','Genug Resourcen morgen um  ', 'Genug Resourcen in ', 
		' Tagen um ', ' Nach maximaler Wartezeit: ' , 'Vorrat: ','Wartezeit: ','Defizit','Überschuß', ' Maximale Wartezeit: ','Ausgeglichen', 
		'Überschuß aufgebraucht in: ','Ausbau ',' Resourcenproduktion.','Neutrale Bilanz.' , 'Rohstofflager erweitern' , 'Kornspeicher erweitern' ];
		break
		case '.sk':
		langfile[lang]=['Stavba vyžaduje:','pretečie', 'vyčerpané','Merač surovín','Ukazatele zásob', 
		' hod','Dostatok surovín dnes o ','Dostatok surovín zajtra o ', 'Dostatok surovín za ', 
		' dní o ', ' Po max. čakaní: ' , 'Sklad: ','Čakacia doba: ','Chýba nám','Prebytok', ' Max. doba čakania: ','Vyvážené',
		'Prebytok vyčerpaný za: ','Vylepši ',' produkciu surovín.','Vyváženosť.' , 'Rozšír sklad' , 'Rozšír sýpku'];		
		break;
		case '.cz':
		langfile[lang]=['Stavba vyžaduje:','přeteče', 'vyčerpáno','Merič surovin','Ukazatele zásob',
		' hod','Dostatek surovin dnes v ','Dostatek surovin zítra v ', 'Dostatek surovin za ',
		' dny v ', ' Po max. vyčkávaní: ' , 'Sklad: ','Čekací doba: ','Chybí nám','Přebytek', ' Max. vyčkávaní: ','Vyvážené',
		'Přebytek vyčerpaný za: ','Vylepši ',' produkci surovín.','Vyváženost.'
		, 'Vylepši sklad' , 'Vylepši sýpku'];
		break;
		case '.bg':
	   langfile[lang]=['Нужни за upgrade:','запълване', 'изчерпване','Resource Meters','Графики на ресурсите',
	   ' часа','Достатъчно ресурси днес в ','Достатъчно ресурси утре в', 'Достатъчно ресурси в ', ' дни в ', ' След максимално изакване: ' , 
		 'Склад: ','Време заизчакване: ','Недостиг','Излишък', ' Максимално изчакване: ','Балансирано', 'Изчерпване на излишъка след: ','Upgrade ',
		 ' Добив наресурси.','Neutral balance.' , 'Разширете склада' , 'Разширете хамбара'];
	   break;
		case '.sk':
		langfile[lang]=['Stavba vyžaduje:','preteèie', 'vyèerpané','Meraè surovín','Ukazovatele zásob', 
		' hod','Dostatok surovín dnes o ','Dostatok surovín zajtra o ', 'Dostatok surovín za ', 
		' dní o ', ' Po max. èakaní: ' , 'Sklad: ','Èakacia doba: ','Chýba nám','Prebytok', ' Max. doba èakania: ','Vyvážené',
		'Prebytok vyèerpaný za: ','Vylepši ',' produkciu surovín.','Vyváženos .' , 'Rozšír sklad' , 'Rozšír sýpku'];		
		break;
		 case '.nl':
		langfile[lang]=['Needed for upgrading:','vol', 'Depleted','Meters','Grondstof meter', 
		' Klok' ,'Enough resources today at ','Genoeg grondstof morgen om ', 'Genoeg om ', 
		' dagen om ' , ' After max wait: ' , 'Ruimte: ','wacht tijd: ','Deficit' ,'Surplus',' Maximale wachttijd: ','Balanced',
		'Surplus depleted in: ','Upgrade ',' resource production.','Neutral balance.', 'Extend Warehouse' , 'Extend Granary'];					
		break;
		case '.fi':
		langfile[lang]=['Päivitykseen tarvitaan:','Ylivuoto', 'Loppunut','Materiaali mittarit','Materiaali palkki',
		' aikaan' ,'Tarpeeksi materiaaleja saavutetaan tänään ','Tarpeeksi materiaaleja saavutetaan huomenna ',
		'Tarpeeksi materiaaleja saadaa ',
		' päivässä ' , ' Maximi varttumis aika: ' , 'Varasto: ','Varttumis aika: ','Vaje' ,'Ylijäämä',' Max varttuminen: ','Tase',
		'Ylijäämä kulutettu: ','Päivitä ',' materiaalin tuotanto.','Neutraali tase.', 'Laajenna varastoa' , 'laajenna Viljasiiloa'];
		break;
		case '.lt':
		langfile[lang]=['Sąnaudos:','| pertėklius po', 'įšnaudota','Resursų matuokliai','Resursų grafikai',
		'' ,'Pakankamai resursų bus šiandien ','Pakankamai resursų bus rytoj ', 'Pakankamai resursų bus po ',
		' dienų ' , ' Kiekis sulaukus: ' , 'Talpa: ','Laukti: ','Trūkumas' ,'Pertėklius',' Laukti: ','Subalansuota',
		'Pertėklius bus išnaudotas už: ','Atnaujinti ',' resursų gamyba.','Neutralus balansas.', 'Praplėskite sandėlį' , 'Praplėskite klėtį'];
		break;
		case '.dk':
	    langfile[lang]=['Behov før opgradering:','overløb','tømt','Råstof-målere','Råstof-bjælker',
	    ' ','Råstoffer nok i dag kl. ','Råstoffer nok i morgen kl. ',  'Råstoffer nok om ',
	    ' dage, kl. ' , ' Efter maks ventetid: ',  'Overskud: ','Vent: ','Mangler','Klar',' vent: ' ,'Balanceret',
	    'Forbrug overskud om: ','Opgrader ', ' råstofproduktion.','Neutral balance', 'Udvid råstoflager', 'Udvid kornkammer'];
	    break; 
	default:
		langfile[lang]=['Needed for upgrading:','Overflow', 'Depleted','Resource Meters','Resource Bars', 
		" o'clock",'Enough resources today at ','Enough resources tomorrow at ', 'Enough resources in ', 
		' days at ', ' After max wait: ' , 'Storage: ','Wait time: ','Deficit','Surplus', ' Max wait: ','Balanced', 
		'Surplus depleted in: ','Upgrade ',' resource production.','Neutral balance.' , 'Extend Warehouse' , 'Extend Granary' ];						
		break;
	}
		
	//if somehow the lang file is not in the script, return because it can't display the information correctly , 
	if(!langfile[lang]) {
		return;
	}
		
	readSettings();
	var side=getElementsByClassName(document, 'td', 'menu')[0].getElementsByTagName('a')[0].parentNode;
	if(side){
		var opt=[];
		opt.push( makeEventlink('++ Settings', '#', showSettings) );
		addElementArray(side, opt );
		pop();
	} else {
		return;
	}
	
	
	if(links=='true') {
		msg();
		linksPlus();
	}
		
	intResource();
	
	resWidth=parseInt( GM_getValue('ResBlockPx', 254) );
	navWidth=parseInt( GM_getValue('NavLinksPx', 150) );
	toolsWidth=parseInt( GM_getValue('ToolsBlockPx', 254) );

	menu();
	
	document.addEventListener('mousemove', mouseMove, false);
	document.addEventListener('mousedown', mouseDown, false);
	document.addEventListener('mouseup', mouseUp, false);
	
	if(res=='true'){
		if(returnObjById('ResBlock')){ 
			autotime = window.setTimeout(countdown, 1000); 
		} else { 
			return;
		}
	}
	
}

function returnObjById( id ){ //compatibility, gets the object by id, based on different returns of document 
  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){ // searches the oElm for strTagName objects with strClassName class
  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 addElement(theElement) { // adds an element to the page either by the center object lmidlc or appends to html
	var htmldoc=returnObjById('lmid2');
	if(!htmldoc) {
		htmldoc=document.getElementsByTagName('body')[0];
		if(!htmldoc) return;
		theElement.style.marginLeft='130px';  
		theElement.style.marginBottom='10px';
		theElement.style.width = '550px';
		
		if(loc.indexOf('dorf2')!=-1){
			theElement.style.top='150px';
		}
		else {
			theElement.style.top='50px';
		}
			
	} else {
		theElement.style.width = '500px';
		theElement.style.top='50px';  		
		if(loc.indexOf('karte.php?d=')!=-1){
		theElement.style.top='400px'; 
		}else if(loc.indexOf('karte.php?newdid')!=-1 && loc.indexOf('d=')!=-1 ){
		theElement.style.top='400px'; 
		} else if(loc.indexOf('karte.php?newdid')!=-1){
		theElement.style.top='50px'; 
		} 
	}
	
	htmldoc.appendChild(theElement);
}

function addElementArray(root,element){
	if(root && element){
		var end=element.length;
		for (var i = 0; i < end; i++) {
			var c=element[i];
			if(c) root.appendChild( c );
		}
	}
}

/************************ Drag n drop*******************************/
/*** from Risi of http://userscripts.org/ **/
function mouseCoords(ev){
	return {x:ev.pageX, y:ev.pageY};
}

function getMouseOffset(target, ev){
	var docPos  = getPosition(target);
	var mousePos  = mouseCoords(ev);
	return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
}

function getPosition(e){
	var left = 0;
	var top = 0;
	while (e.offsetParent){
		left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
		top += e.offsetTop  + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
		e   = e.offsetParent;
	}
	left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
	top  += e.offsetTop  + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
	return {x:left, y:top};
}

function mouseMove(ev){
	var target = ev.target;
	var mousePos = mouseCoords(ev);

	if(dragObject){
		dragObject.style.position = 'absolute';
		dragObject.style.top  = (mousePos.y - mouseOffset.y) +'px';
		dragObject.style.left   = (mousePos.x - mouseOffset.x) +'px';
	}
	lMouseState = iMouseDown;
	return false;
}

function mouseUp(ev){
	if(dragObject) {
		setOption(dragObject.id, dragObject.style.top +'_'+ dragObject.style.left);
	}
	dragObject = null;
	iMouseDown = false;
}

function mouseDown(ev){	
	var target = ev.target;
	iMouseDown = true;	
	if(target.getAttribute('DragObj')){
		return false;
	}	
}

function makeDraggable(item){
	if(!item) return;
	item.addEventListener('mousedown',function(ev){
		dragObject  = item.parentNode;
		mouseOffset = getMouseOffset(item.parentNode, ev);
		return false;
	}, false);
}

function setOption(key, value) {
	GM_setValue(key, value);
}

function getPos(key, defaultValue) {
	var myOption = GM_getValue(key, defaultValue);
	return myOption;
}

/************************ End Drag n drop*******************************/

/************************ Links ++ *******************************/
function msg(){
	if(loc.indexOf('berichte')!=-1  || (loc.indexOf('nachrichten')!=-1 && loc.indexOf('t=4')==-1  && loc.indexOf('t=1')==-1) ) {
		addChkAll();
	}
}

function sel(){
form_all=startform;
var topend=form_all.length;
	for(var i=0;i<topend;i++){
		form_input=form_all[i].getElementsByTagName('input');
		var end=form_input.length;
		for(var x=0;x<end;x++){
			var y=form_input[x];
			if(y.name.indexOf('del')==-1 && y.name!='s10' ) y.checked=!y.checked;
		}
	}
}

function addChkAll(){
	var form_all=getElementsByClassName(document, 'table', 'tbg' );
	if(!form_all) return;
	var topend=form_all.length;
	for(var i=0;i<topend;i++){
		var form_input=form_all[i].getElementsByTagName('input');
		var end=form_input.length;
		for(var x=0;x<end;x++){
		var y=form_input[x];
			if(y.name.indexOf('del')!=-1) {  
				var select=document.createElement( 'input' );
				select.type='button';
				select.setAttribute('style','font-weight: bold; font-size: 8pt; height: 14pt;');
				select.value='Inverse Select';
				select.style.marginLeft='4px';
				select.addEventListener('click',sel,true);
				y.parentNode.appendChild(select);
			}
		}
	}
	startform=form_all;
}

/*************** End Links ++ *******************/

/*************** Page info  *******************/
function intResource(){
		getResourceInfo(); // gathers the current store, capacity and production of each resource
		if(!resource) return; // if no resources exist on the page, return to stop the script
		calOverflow(); // computes the overflow information using resource information
		if(!overflow) return; //if overflow can't be computed, return to stop the script
		if(loc.indexOf('build')!=-1){
			getTime();
			resourcePerBuild();
		}
}

function gatherFields(){//gathers the name of each resource
	var orgbar=returnObjById('lres0');
	if(!orgbar) {orgbar=getElementsByClassName(document, 'div', 'div4')[0];}
	if(!orgbar) {orgbar=returnObjById('lres');}
	if(!orgbar) {fields[lang]=null; return;}
	
	var idbar=orgbar.getElementsByTagName('td');
	if(idbar[1].id.indexOf('1')==-1) order=1;
	
	var resbar=orgbar.getElementsByTagName('img');
	fields[lang]=[resbar[0].title,resbar[1].title,resbar[2].title,resbar[3].title];
}

function getResourceInfo(){ //using the resource values on the page, return the production, store, and capacity values as an array
	resource=new Array();
	
	for(var i=1;i<=4;i++) {
		var rtd  = returnObjById('l'+i);
		if(!rtd) { resource=null; return;}
		resource.push( [parseInt(rtd.title),parseInt(rtd.textContent.match(/\-?(\d+)\//)),parseInt(rtd.textContent.replace(/(\d+)\//,''))] );
	}
	
	if(order) {
		resource=resource.reverse();
	}
}

function getTime(){ // gets the time from the page or use java time
	var servertime=returnObjById('tp1').textContent;
		
	if(!servertime) {
		var Digital=new Date();
		pagetime=[Digital.getHours(),Digital.getMinutes(),Digital.getSeconds()];
		if(pagetime[0]>12)military=true;
		return;
	}
	
	pagetime=timeField(servertime);	
	servertime=pagetime;
	
	if(servertime==-1) {
		var Digital=new Date();
		pagetime=[Digital.getHours(),Digital.getMinutes(),Digital.getSeconds()];
	} 

	if(pagetime[0]>12) military=true;
	
}

/*************** End Page info  *******************/


/*************** Calc. resource info *******************/
function calOverflow(){ //using the resource values, return the overflow information as an array
	overflow=[];

	for(var i=0;i<4;i++) {
		if(resource[i][0]>0){
			overflow[i] = [ Math.ceil(3600*(resource[i][2]-resource[i][1])/resource[i][0]),langfile[lang][1]];
		} else if(resource[i][0]<0){
			overflow[i] = [ Math.ceil(3600*(-resource[i][1])/resource[i][0]), langfile[lang][2] ];
		} else {
			overflow[i]=[ 0, langfile[lang][16] ];
		}
	}
	
}

function formatTime(maxtime, hours, minutes, seconds, off){ // given maxtime in secs and and offset values, returns a array of [hrs,min,sec]
   return [Math.floor(maxtime/3600)+hours+off,(Math.floor(maxtime/60)%60)+minutes,(maxtime % 60)+seconds];
}

function estTime(time){//using the pagetime and the wait time for the resource, returns a time field of when the resource will be ready
   var days=0;
   var head='';
   var tail=langfile[lang][5];

   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(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=langfile[lang][6];
   } else if(days==1){
		head=langfile[lang][7];
   } else {
		head=langfile[lang][8] +days + langfile[lang][9];
   }
   
	return head+time[0]+':'+time[1]+':'+time[2]+tail;
}

function timeField(time) { // convert a hh:mm:ss time stamp to seconds
 var limit = time.split(':');
 return (limit.length == 3) ? ([parseInt(limit[0]) , parseInt(limit[1]) , parseInt(limit[2])]) : -1;
}

function formatTimeString(maxtime){ // maxtime in seconds returns it in hh:mm:ss h format
   var helper=formatTime(maxtime, 0, 0, 0, 0);
   if(helper[1] < 10){helper[1] = '0'+helper[1];}
   if(helper[2] < 10){helper[2] = '0'+helper[2];}
   return helper[0]+':'+helper[1]+':'+helper[2]+' h';
}

/*** End Calc. resource info ***/


/*** color helper ***/
function rgb2HEX(red, green, blue){ // given red green blue values return their hexcode
  var decColor = red + (256 * green) + (65536 * blue);//offset each value and create a new int
	decColor=decColor.toString(16);//convert to a base16 string
	while( decColor.length < 6){//append 0 till it is a 6 length string
		decColor='0'+decColor;
	}
  return '#'+decColor;
}
/*** End color helper ***/

/**** The menus actions*******/

function selfoff(e){
	if(e.id=='ResBlock') {
		clearTimeout(autotime); 
		returnObjById('Resource++').value='false'
		res='false';
		resTog();
		updateSetCookie();
	} else if(e.id=='NavLinks'){
		returnObjById('Navigator++').value='false'
		nav='false';
		navTog();
		updateSetCookie();
	} else if(e.id=='ToolsBlock'){
		returnObjById('Tools++').value='false'
		tools='false';
		toolsTog();
		updateSetCookie();
	}
}

function resize(e){
	var answer = prompt('Enter new size in px: ', 0 );
	
	if(!answer) return;
	
	answer=parseInt(answer);
	if(!answer) {
		if(e.id=='ResBlock') {
			GM_setValue('ResBlockPx', 254);
			resWidth=254; //254 default
		} else if(e.id=='NavLinks'){
			GM_setValue('NavLinksPx', 150);
			navWidth=150; // 150 default
		} else if(e.id=='ToolsBlock'){
			GM_setValue('ToolsBlockPx', 254);
			toolsWidth=254; // 254 default
		}
		return;
	}
	
	if(e.id=='ResBlock') {
		GM_setValue('ResBlockPx', answer);
		resWidth=answer; //254 default
	} else if(e.id=='NavLinks'){
		GM_setValue('NavLinksPx', answer);
		navWidth=answer; // 150 default
	} else if(e.id=='ToolsBlock'){
		GM_setValue('ToolsBlockPx', answer);
		toolsWidth=answer; // 254 default
	}
	
}

function jump(on){
	on=on.target;
	var opt_key = on.selectedIndex;
	if(!opt_key) return;
	var uri_val = on.options[opt_key].value;
	window.open(uri_val,'_top');
}


function makeOption(text, value){
var co=document.createElement('option');
	co.appendChild(  document.createTextNode(  text  )    );
	co.value=value;
	return co;
}


function showSettings(){
		var frame=document.getElementById('NavPop');
		if(!frame) return;
		
		var cur=document.getElementById('Links++');
		cur.value=links;
		
		cur=document.getElementById('Resource++');
		cur.value=res;
		
		cur=document.getElementById('Navigator++');
		cur.value=nav;	
		
		cur=document.getElementById('Tools++');
		cur.value=tools;	
		
		var state=frame.style.visibility;
		if(state.indexOf('visible')==-1){
			frame.style.visibility = 'visible';
		} 
}

function toggle() {
		var frame=document.getElementById('NavPop');
		if(!frame) return;

		var state=frame.style.visibility;
		if(state.indexOf('visible')==-1){
			frame.style.visibility = 'visible';
		} else {
			frame.style.visibility = 'hidden';
		}
}

function readSettings() {	
	var value = GM_getValue('TravNavSet','Links++:=true||Resource++:=true||Navigator++:=true||Tools++:=true||');
	if (value == '' ) {resetSetting();return;}
	
	var arr = value.split(/[|]{2}/);
	var ret = new Array();
	
	for (var i = 0; i < arr.length; i++) {
		var b = arr[i].split(/[:][=]/);
		if(b.length==2)	ret.push(b);
	}
		
	if(ret.length!=4) {resetSetting();return;}
		
	if(ret[0][0]!='Links++' ) {resetSetting();return;}
	if(ret[1][0]!='Resource++')  {resetSetting();return;}
	if(ret[2][0]!='Navigator++')  {resetSetting();return;}
	if(ret[3][0]!='Tools++')  {resetSetting();return;}
	//I know that this seems strange but just go with it, I have reasons....
	if(ret[0][1]=='true' ) {links='true'; } else {links='false';}
	if(ret[1][1]=='true' ) {res='true'; } else {res='false';}
	if(ret[2][1]=='true' ) {nav='true'; } else {nav='false';}
	if(ret[3][1]=='true' ) {tools='true'; } else {tools='false';}
}


function resetSetting(){
	defSetting();
	links='true';
	res='true';
	nav='true';
	tools='true';
}

function eraseSetting() {
	GM_setValue('TravNavSet', '');
}

function defSetting(){
	GM_setValue('TravNavSet', 'Links++:=true||Resource++:=true||Navigator++:=true||Tools++:=true||');
}

function makeEventlink(text, href, event ){
var link=document.createElement( 'a' );
	link.href=href;
	link.title=text;
	link.appendChild(  document.createTextNode(  text ) );
	link.addEventListener('click',event,true);
return link;
}

function onoff(targ){
	if(targ.target.value=='true'){
		targ.target.value='false';} 
	else {
		targ.target.value='true';	
	}
	var res_start;
	var nav_start;
	var tools_start;
	if(targ.target.id=='Links++') {tools_start=links; links=targ.target.value;} 
	else if(targ.target.id=='Resource++') {	res_start=res; res=targ.target.value;} 
	else if(targ.target.id=='Navigator++') { nav_start=nav; nav=targ.target.value;}
	else if(targ.target.id=='Tools++') { tools=targ.target.value;}
	if(res_start!=res) {resTog();} 
	if(nav_start!=nav) {navTog();}
	if(tools_start!=tools) {toolsTog();}
	updateSetCookie();
}

function resTog(){

	if(res=='true'){  
		intResource();
		if(!res_m){ 
			resourceMenu('visible'); 
		}
		res_m.style.visibility = 'visible';
		clearTimeout(autotime); 
		autotime = window.setTimeout(countdown, 1000); 
	}else {
		clearTimeout(autotime); 
		res_m.style.visibility = 'hidden';
	}
	
}

function navTog(){
	if(nav=='true'){
		if(!nav_m){quickLinks('visible');}
		nav_m.style.visibility = 'visible';
	} else {
		nav_m.style.visibility = 'hidden';
	}
}

function toolsTog(){
	if(tools=='true'){
		if(!tools_m){
			toolMenu('visible');
		}
		tools_m.style.visibility = 'visible';
	} else {
		tools_m.style.visibility = 'hidden';
	}
}

function updateSetCookie(){
	GM_setValue('TravNavSet', 'Links++:='+links+'||Resource++:='+res+'||Navigator++:='+nav+'||Tools++:='+tools+'||');
}

function makebutton(opt0, opt1){
	var one=document.createElement('tr');
	var incell=document.createElement('td');
	incell.appendChild(document.createTextNode(opt0));
	one.appendChild(incell);
	incell=document.createElement('td');
	var but=document.createElement('input');
	but.type='button';
	but.style.width='100px';
	but.id=opt0;
	but.value=opt1;
	but.addEventListener('click',function (e){onoff(e);},true);
	incell.appendChild(but);
	one.appendChild(incell);
	return one;
}

function countdown(){ //updates all countdown values and displays

	var go=false;
	getResourceInfo();
	if(!resource) return;
		
	for(var i=0; i<4; i++){
	
		if(overflow[i][0]>0){
			go=true;
			overflow[i][0]--;
			var leftval=parseInt(resource[i][1]/resource[i][2] *100);
			var color=(overflow[i][0]<300) ? 'red' : 'green';
			var newSpan = document.createElement('div');
			newSpan.style.cssFloat='right';
			
			newSpan.id=fields[lang][i]+'timer';
			newSpan.appendChild(  document.createTextNode(formatTimeString(overflow[i][0])));
			
			if(newSpan.style.color.indexOf(color)==-1){
				newSpan.style.color=color;
			}
			
			var old=returnObjById(fields[lang][i]+'timer');
					
			old.parentNode.replaceChild(newSpan,old );
			old=returnObjById(fields[lang][i]+'value');

			if(parseInt(old.title)!=leftval){
				calOverflow();
				old=returnObjById('resbar'+i);
				var n=rowOpera(i,leftval);
				n.style.cssFloat='right';
				old.parentNode.replaceChild(n,old );
			}
			
		} else {
				var old=returnObjById(fields[lang][i]+'timer') ;
	
				if(old.textContent.indexOf('0:00:00 h')==-1){  
					old.textContent='0:00:00 h';
					old.style.color='red';
					old=returnObjById('resbar'+i);
					old.parentNode.replaceChild(rowOpera(i,100),old );
				}
		}
	}
	
	if(go){
		autotime = window.setTimeout(countdown, 1000);
		} 
	else {
		clearTimeout(autotime); //kill the timeout
		return;
	}
	
}
/**** End The menus actions*******/

/**** The menus*******/
function menu(){ //create an resource menu
		var send;
		
		if(tools=='true'){
			send='visible';
		} 
		else { 
			send='hidden'; 
		}
		
		toolMenu(send); 
					
		if(res=='true'){
			send='visible';
		} else { 
			send='hidden'; 
		}
		
		resourceMenu(send);

		if(nav=='true'){
			send='visible';
		} else { 
			send='hidden'; 
		}
			
		quickLinks(send);
}

function toolMenu(vis){

		var map_insert=document.createElement( 'table' );
		var row=document.createElement( 'tr' );
		var cell = document.createElement('td');
		
		map_insert.id='ToolsBlock';
		map_insert.setAttribute('style', 'z-index:5;');
		map_insert.setAttribute('cellspacing', 1);
		map_insert.setAttribute('cellpadding', 1);
		map_insert.className = 'tbg';
		map_insert.style.clear = 'both';
		map_insert.style.position='relative'; 
		map_insert.style.width = toolsWidth+'px';
		map_insert.style.fontWeight='bold';
					
		cell.setAttribute('colspan',1);
		cell.setAttribute('align', 'center');
		cell.className = 'rbg';
		
		var con=document.createElement('div');
		con.style.cssFloat='left';
		con.style.height='15px';
		con.style.width='15px';
		con.appendChild( makeEventlink('X', '#',  function (e){ selfoff(map_insert); } ) );
		cell.appendChild( con );	
		con=document.createElement('div');
		con.style.height='15px';
		con.style.cssFloat='left';
		con.appendChild( document.createTextNode(  'Tool Bar' ) );
		con.style.width=(toolsWidth-32)+'px';
		cell.appendChild( con );
		con=document.createElement('div');
		con.style.height='15px';
		con.style.cssFloat='left';
		con.appendChild( makeEventlink('^', '#',  function (e){ resize(map_insert); } ) );
		cell.appendChild( con );
		row.appendChild( cell );
		map_insert.appendChild( row );
		row.style.cursor='move';
		makeDraggable(row);			

		var map=mapit();
		row=document.createElement( 'tr' );
		cell = document.createElement('td');
		map.style.cssFloat='right';
		cell.appendChild(map);
		row.appendChild( cell  );
				
		var name=lookup();
		
		name.style.cssFloat='right';
		cell.appendChild(name);
		row.appendChild( cell  );
		
		map_insert.appendChild( row  );

	  var listCoords = getPos(map_insert.id, '448px_157px').split('_');
	  map_insert.style.top = listCoords[0];
	  map_insert.style.left = listCoords[1];
	  map_insert.style.position = 'absolute';
	  map_insert.style.zIndex = 100;
	  map_insert.style.visibility=vis;
	  tools_m=map_insert;
	  document.body.appendChild(tools_m);	
}


function mapit(){
var formpost=document.createElement( 'form' );
	formpost.method='post';
	formpost.action='karte.php';
var xp=document.createElement( 'input' );
	xp.className='fm fm25' 
	xp.maxlength=4;
	xp.size='2';
var yp=xp.cloneNode(true);
	xp.name='xp';
	yp.name='yp';
var button=document.createElement( 'input' );
	button.type='submit';
	button.value='ok'; 
	button.border='2';
	button.name='s1';
	button.style.marginLeft='10px';
	formpost.appendChild( document.createTextNode( 'Map: ')  );
	formpost.appendChild( document.createTextNode( 'x ')  );
	formpost.appendChild( xp  );
	formpost.appendChild( document.createTextNode( ' y ')  );
	formpost.appendChild( yp  );
	formpost.appendChild( button  );
	return formpost;
}

function lookup(){
var formpost=document.createElement( 'form' );
	formpost.method='post';
	formpost.action='statistiken.php';
	formpost.style.marginLeft='10px'
var namein=document.createElement( 'input' );
	namein.className='fm f80' 
	namein.maxlength=20;
	namein.size='10';
	namein.name='spieler';
var button=document.createElement( 'input' );
	button.type='submit';
	button.value='ok'; 
	button.border='2';
	button.name='s1';
	button.style.marginLeft='10px';
	formpost.appendChild( document.createTextNode( 'Player Name: ')  );
	formpost.appendChild( namein  );
	formpost.appendChild( button );
	return formpost;
}

function resourceMenu(vis){
	var mymenu = document.createElement( 'table' );
		mymenu.id='ResBlock';
		mymenu.setAttribute('style', 'z-index:5;');
		mymenu.setAttribute('cellspacing', 1);
		mymenu.setAttribute('cellpadding', 1);
		mymenu.className = 'tbg';
		mymenu.style.marginTop='36px';
		mymenu.style.clear = 'both';
		mymenu.style.position='relative'; 
		
	var row =document.createElement('tr');
	var cell = document.createElement('td');
		cell.setAttribute('colspan',2);
		cell.setAttribute('align', 'center');
		cell.className = 'rbg';
		
	var con=document.createElement('div');
		con.style.cssFloat='left';
		con.style.height='15px';
		con.style.width='15px';
		con.appendChild( makeEventlink('X', '#',  function (e){ selfoff(res_m); } ) );
		cell.appendChild( con );	
		con=document.createElement('div');
		con.style.height='15px';
		con.style.cssFloat='left';
		con.appendChild( document.createTextNode( langfile[lang][3] ) );
		con.style.width=(resWidth-32)+'px';
		cell.appendChild( con );
		con=document.createElement('div');
		con.style.height='15px';
		con.style.cssFloat='left';
		con.appendChild( makeEventlink('^', '#',  function (e){ resize(res_m); } ) );
		cell.appendChild( con );
		row.appendChild( cell );
		mymenu.appendChild( row );
		row.style.cursor='move';
		makeDraggable(row);				
		
		for(var i=0; i<4; i++){
			row = document.createElement('tr');
			var c=i;
			cell = document.createElement('td');
			var newText= document.createTextNode( resource[c][0] );
			con=document.createElement('div');
			con.style.cssFloat='left';
			con.style.width='50px';
			con.appendChild(newText);
			cell.appendChild(con);	
			newText = document.createTextNode( fields[lang][c]+' '+overflow[c][1]+': ' );
			con=document.createElement('div');
			con.style.cssFloat='left';
			con.appendChild(newText);
			cell.appendChild(con);
			con=document.createElement('div');
			con.style.cssFloat='right';
			con.id=fields[lang][c]+'timer';
			con.style.color= (overflow[c][0]<300) ? 'red' : 'green';
			newText = document.createTextNode(formatTimeString(overflow[c][0]));
			con.appendChild(newText);
			cell.appendChild(con);
			row.appendChild(cell);
			mymenu.appendChild( row);
		}
				
		var min=resource[0][0];
		for(var i=1; i<4; i++){
			if( resource[i][0] < min){  min = resource[i][0]; }
		}
		
		
		for(var i=0; i<4; i++){
  	  ratio[i]=(resource[i][0]/min).toFixed(2);
  	}	

		for(var i=0; i<4; i++){
			var leftval=parseInt(resource[i][1]/resource[i][2] *100);
			var inRow=rowOpera(i,leftval);
			row = document.createElement('tr');
			cell = document.createElement('td');
			cell.setAttribute('colspan',2);
			cell.appendChild( inRow );
			row.appendChild( cell );
			mymenu.appendChild( row );
		}
		
		var listCoords = getPos(mymenu.id, '530px_157px').split('_');
		mymenu.style.width = resWidth+'px';
		mymenu.style.top = listCoords[0];
		mymenu.style.left = listCoords[1];
		mymenu.style.position = 'absolute';
		mymenu.style.zIndex =100;
		mymenu.style.visibility=vis;
		res_m=mymenu;
		document.body.appendChild(res_m);	
}

function rowOpera(i,leftval){
var tol= (leftval<50) ? 150 : 255;
var sec=155-leftval;
	
var testmain = document.createElement( 'div' );
var value = document.createElement( 'div' );
var con = document.createElement( 'div' );
var bar = document.createElement( 'table' );
var row= document.createElement( 'tr' );
var left= document.createElement( 'td' );
var right= document.createElement( 'td' );
var simg = document.createElement( 'img' );
	
	testmain.style.width=(resWidth-4)+'px';
	testmain.style.height='16px';

	simg.src='img/un/r/'+(i+1)+'.gif';
	simg.className='res';
	simg.style.cssFloat='left';
	simg.title=fields[lang][i];
	simg.alt=fields[lang][i];
	
	con.appendChild( document.createTextNode(  ratio[i] ) );
	con.style.cssFloat='left';
	con.style.width='40px';

	bar.style.cssFloat='left';
	bar.style.height='16px';
	bar.style.width=(resWidth-18-4-80)+'px';//18 img size, 4 borders, 80 val and con size
	bar.style.backgroundColor='white'
	bar.setAttribute('cellpadding','1');
	bar.setAttribute('cellspacing','0');

	left.id=fields[lang][i]+'left';
	right.id=fields[lang][i]+'right';
	value.id=fields[lang][i]+'value';
	
	left.style.width=leftval+'%';
	left.style.backgroundColor=rgb2HEX(sec, sec, parseInt(tol*(leftval/100)) );
	right.style.width=(100-leftval)+'%';
			
	if(leftval>=90){
		value.setAttribute('style','text-decoration:blink;');
		value.style.color='red';
	} else {
		value.setAttribute('style','text-decoration:none;');
	}
	
	value.style.width='40px';
	value.appendChild( document.createTextNode(  leftval+'%' ) );
	value.style.cssFloat='left'
	value.title=leftval;

	row.appendChild(left);
	row.appendChild(right);
	bar.appendChild(row);

	testmain.appendChild( simg );
	testmain.appendChild( value );
	testmain.appendChild( bar );	
	testmain.appendChild( con );
	
	testmain.id='resbar'+i;

return testmain
}

function quickLinks(vis){

	var mymenu = document.createElement('table');
		mymenu.id='NavLinks';
		mymenu.setAttribute('style','z-index:5;');
		mymenu.setAttribute('cellspacing',1);
		mymenu.setAttribute('cellpadding',1);
		mymenu.className='tbg';
		mymenu.style.clear='both';
		mymenu.style.position='relative'; 
		mymenu.style.width=navWidth+'px';
		var w = (navWidth-4)+'px' //border correct
		
	var row = document.createElement('tr');
	var cell = document.createElement('td');
		cell.setAttribute('colspan',1);
		cell.setAttribute('align', 'center');
		cell.className = 'rbg';
	
	var con=document.createElement('div');
		con.style.cssFloat='left';
		con.style.height='15px';
		con.style.width='15px';
		con.appendChild( makeEventlink('X', '#',  function (e){ selfoff(nav_m); } ) );
		cell.appendChild( con );	
		con=document.createElement('div');
		con.style.height='15px';
		con.style.cssFloat='left';
		con.appendChild( document.createTextNode(  'Navigator' ) );
		con.style.width=(navWidth-32)+'px';
		cell.appendChild( con );
		con=document.createElement('div');
		con.style.height='15px';
		con.style.cssFloat='left';
		con.appendChild( makeEventlink('^', '#',  function (e){ resize(nav_m); } ) );
		cell.appendChild( con );
		row.appendChild( cell );
		mymenu.appendChild( row );
		row.style.cursor='move';
		makeDraggable(row);		

		row = document.createElement('tr');
		cell = document.createElement('td');
		cell.setAttribute('align','center');
	var onSelect=document.createElement('select');
		onSelect.style.width=w;
		onSelect.addEventListener('change',function(e){jump(e);},true);
		onSelect.appendChild(makeOption('Armies','#'));
		onSelect.appendChild(makeOption('Troops Report','build.php?id=39'));
		onSelect.appendChild(makeOption('Send Troops','a2b.php?s=4'));
		onSelect.appendChild(makeOption('War Simulator','warsim.php'));
		cell.appendChild(onSelect);
		row.appendChild(cell);
		mymenu.appendChild(row);

		row = document.createElement('tr');
		cell = document.createElement('td');
		cell.setAttribute('align', 'center');
		onSelect = document.createElement('select');
		onSelect.style.width=w;
		onSelect.addEventListener('change',function(e){jump(e);},true);
		onSelect.appendChild(makeOption('Marketplace','#'));
		onSelect.appendChild(makeOption('Send Resources','build.php?gid=17'));
		onSelect.appendChild(makeOption('Buy','build.php?gid=17&t=1'));
		onSelect.appendChild(makeOption('Offer','build.php?gid=17&t=2'));
		onSelect.appendChild(makeOption('NPC Trading','build.php?gid=17&t=3'));
		cell.appendChild(onSelect);
		row.appendChild(cell);
		mymenu.appendChild(row);
	
		row = document.createElement('tr');
		cell = document.createElement('td');
		cell.setAttribute('align', 'center');
		onSelect = document.createElement('select');
		onSelect.style.width=w;
		onSelect.addEventListener('change', function(e) {jump(e);} , true);
		onSelect.appendChild( makeOption('Reports','#' )      );
		onSelect.appendChild( makeOption('All Reports','berichte.php' ) );
		onSelect.appendChild( makeOption('Reinforcement','berichte.php?t=1' ) );
		onSelect.appendChild( makeOption('Trade','berichte.php?t=2' ) );
		onSelect.appendChild( makeOption('Attacks','berichte.php?t=3' ) );
		onSelect.appendChild( makeOption('Miscellaneous','berichte.php?t=4' ) );
		cell.appendChild(  onSelect   );
		row.appendChild( cell );
		mymenu.appendChild(row);
		
	
		row = document.createElement('tr');
		cell = document.createElement('td');
		cell.setAttribute('align', 'center');
		onSelect = document.createElement('select');
		onSelect.style.width=w;
		onSelect.addEventListener('change', function(e) {jump(e);} , true);
		onSelect.appendChild( makeOption('Messages','#' )      );
		onSelect.appendChild( makeOption('Inbox','nachrichten.php' ) );
		onSelect.appendChild( makeOption('Write','nachrichten.php?t=1' ) );
		onSelect.appendChild( makeOption('Sent','nachrichten.php?t=2' ) );
		cell.appendChild(  onSelect   );
		row.appendChild( cell );
		mymenu.appendChild(row);
	
		row = document.createElement('tr');
		cell = document.createElement('td');
		cell.setAttribute('align', 'center');
		onSelect = document.createElement('select');
		onSelect.style.width=w;
		onSelect.addEventListener('change', function(e) {jump(e);} , true);
		onSelect.appendChild( makeOption('Statistics','#' )      );
		onSelect.appendChild( makeOption('Player','statistiken.php' ) );
		onSelect.appendChild( makeOption('Villages','statistiken.php?id=2' ) );
		onSelect.appendChild( makeOption('Alliances','statistiken.php?id=4' ) );
		onSelect.appendChild( makeOption('Offense','statistiken.php?id=31' ) );
		onSelect.appendChild( makeOption('Defense','statistiken.php?id=32' ) );
		onSelect.appendChild( makeOption('General','statistiken.php?id=0' ) );
		cell.appendChild(  onSelect   );
		row.appendChild( cell );
		mymenu.appendChild(row);
		
		row = document.createElement('tr');
		cell = document.createElement('td');
		cell.setAttribute('align', 'center');
		onSelect = document.createElement('select');
		onSelect.style.width=w;
		onSelect.addEventListener('change', function(e) {jump(e);} , true);
		onSelect.appendChild( makeOption('Alliance','#' )      );
		onSelect.appendChild( makeOption('Overview','allianz.php' ) );
		onSelect.appendChild( makeOption('Forum','allianz.php?s=2' ) );
		onSelect.appendChild( makeOption('Chat','allianz.php?s=6' ) );
		onSelect.appendChild( makeOption('Attack','allianz.php?s=3' ) );
		onSelect.appendChild( makeOption('News','allianz.php?s=4' ) );
		onSelect.appendChild( makeOption('Options','allianz.php?s=5' ) );
		cell.appendChild(  onSelect   );
		row.appendChild( cell );
		mymenu.appendChild(row);
		
		row = document.createElement('tr');
		cell = document.createElement('td');
		cell.setAttribute('align', 'center');
		onSelect = document.createElement('select');
		onSelect.style.width=w;
		onSelect.addEventListener('change', function(e) {jump(e);} , true);
		onSelect.appendChild( makeOption('Resources','#' )      );
		onSelect.appendChild( makeOption('Cropland','build.php?gid=4' ) );
		onSelect.appendChild( makeOption('Woodcutter','build.php?gid=1' ) );
		onSelect.appendChild( makeOption('Clay pit','build.php?gid=2' ) );
		onSelect.appendChild( makeOption('Iron mine','build.php?gid=3' ) );
		onSelect.appendChild( makeOption('Warehouse','build.php?gid=10' ) );
		onSelect.appendChild( makeOption('Granary','build.php?gid=11' ) );
		onSelect.appendChild( makeOption('Cranny','build.php?gid=23' ) );
		onSelect.appendChild( makeOption('Marketplace','build.php?gid=17' ) );
		onSelect.appendChild( makeOption('Grain mill','build.php?gid=8' ) );
		onSelect.appendChild( makeOption('Iron foundry','build.php?gid=7' ) );
		onSelect.appendChild( makeOption('Brickyard','build.php?gid=6' ) );
		onSelect.appendChild( makeOption('Sawmill','build.php?gid=5' ) );
		onSelect.appendChild( makeOption('Bakery','build.php?gid=9' ) );
		onSelect.appendChild( makeOption('Brewery','build.php?gid=35' ) );	
		cell.appendChild(  onSelect   );
		row.appendChild( cell );
		mymenu.appendChild(row);	
		
		row = document.createElement('tr');
		cell = document.createElement('td');
		cell.setAttribute('align', 'center');
		onSelect = document.createElement('select');
		onSelect.style.width=w;
		onSelect.addEventListener('change', function(e) {jump(e);} , true);
		onSelect.appendChild( makeOption('Military','#' )      );
		onSelect.appendChild( makeOption('Palisade','build.php?gid=33' ) );
		onSelect.appendChild( makeOption('City wall','build.php?gid=31' ) );
		onSelect.appendChild( makeOption('Earth wall','build.php?gid=32' ) );
		onSelect.appendChild( makeOption('Barracks','build.php?gid=19' ) );
		onSelect.appendChild( makeOption('Trapper','build.php?gid=36' ) );
		onSelect.appendChild( makeOption('Academy','build.php?gid=22' ) );
		onSelect.appendChild( makeOption('Armoury','build.php?gid=13' ) );
		onSelect.appendChild( makeOption('Stable','build.php?gid=20' ) );
		onSelect.appendChild( makeOption('Workshop','build.php?gid=21' ) );
		onSelect.appendChild( makeOption('Blacksmith','build.php?gid=12' ) );
		onSelect.appendChild( makeOption('Big Barracks','build.php?gid=29' ) );
		onSelect.appendChild( makeOption('Big Stable','build.php?gid=30' ) );
		onSelect.appendChild( makeOption('The Mansion','build.php?gid=37' ) );
		cell.appendChild(  onSelect   );
		row.appendChild( cell );
		mymenu.appendChild(row);	

		row = document.createElement('tr');
		cell = document.createElement('td');
		cell.setAttribute('align', 'center');
		onSelect = document.createElement('select');
		onSelect.style.width=w;
		onSelect.addEventListener('change', function(e) {jump(e);} , true);
		onSelect.appendChild( makeOption('Goverment','#' )  );
		onSelect.appendChild( makeOption('Main building','build.php?gid=15' ) );
		onSelect.appendChild( makeOption('Rally point','build.php?gid=16' ) );
		onSelect.appendChild( makeOption('Residence','build.php?gid=25' ) );
		onSelect.appendChild( makeOption('Embassy','build.php?gid=18' ) );
		onSelect.appendChild( makeOption('Palace','build.php?gid=26' ) );
		onSelect.appendChild( makeOption('Townhall','build.php?gid=24' ) );
		onSelect.appendChild( makeOption('Stonemason','build.php?gid=34' ) );
		onSelect.appendChild( makeOption('Trade office','build.php?gid=28' ) );
		onSelect.appendChild( makeOption('Treasury','build.php?gid=27' ) );
		onSelect.appendChild( makeOption('Tour. Square','build.php?gid=14' ) );
		cell.appendChild(  onSelect );
		row.appendChild( cell );
		mymenu.appendChild(row);	
	
	var listCoords = getPos(mymenu.id, '719px_157px').split('_');
		mymenu.style.top = listCoords[0];
		mymenu.style.left = listCoords[1];
		mymenu.style.position = 'absolute';
		mymenu.style.zIndex =100;
		mymenu.style.visibility=vis;
		nav_m=mymenu;
	document.body.appendChild(nav_m);	
}

function linksPlus(){

var source=returnObjById('lmid2');
var links=source.getElementsByTagName('a');
var end=links.length;

for (var j=end-1; j>=0; j--) {
	var currentLink=links[j].getAttribute('href');
	if(!currentLink) break;
	var linkparts = currentLink.split('=');
							
		if (currentLink.match('karte.') == 'karte.' && (linkparts[0].match('z')=='z' || linkparts[0].match('d')=='d') ) {
				
			linkparts[1]=linkparts[1].replace('&c','');
								
			var imgattack = new Image(); 
			imgattack.src = 'http://forum.travian.com/images/smilies/icon_evil.gif';
			imgattack.border=0;
			imgattack.title='Attack';
		
			var imgsend = new Image(); 
			imgsend.src = 'http://forum.travian.com/images/smilies/icon_arrow.gif';
			imgsend.border=0;
			imgsend.title='Send resource';

			var imgcmap = new Image(); 
			imgcmap.src = 'http://forum.travian.com/images/smilies/icon_question.gif';

			imgcmap.border=0;
			imgcmap.title='Center on map';
		
		  var attklink = document.createElement('a');
		  attklink.href='a2b.php'+'?z='+linkparts[1];
		  attklink.appendChild( imgattack );
		    
			var bizlink = document.createElement('a');
		    bizlink.href='build.php'+'?z='+linkparts[1]+'&gid=17';
		    bizlink.appendChild( imgsend );

			var maplink = document.createElement('a');
		    maplink.href='karte.php'+'?z='+linkparts[1];
		    maplink.appendChild( imgcmap );

		    maplink.appendChild(document.createTextNode('  '));
		    links[j].parentNode.insertBefore( maplink ,links[j]);
		    links[j].parentNode.insertBefore( attklink ,links[j]);
		    links[j].parentNode.insertBefore( bizlink ,links[j]);
									
		} else if(currentLink.match('spieler.') == 'spieler.' && linkparts[0].match('uid')=='uid' ){
				var imgprofile = new Image(); 
				imgprofile.src = 'http://forum.travian.com/images/smilies/icon_question.gif';
				imgprofile.border=0;
				imgprofile.title='View profile';
			
				var imgsend = new Image(); 
				imgsend.src = 'http://forum.travian.com/images/smilies/icon_arrow.gif';
				imgsend.border=0;
				imgsend.title='Send message';

			  var profilelink = document.createElement('a');
			    profilelink.href='spieler.php'+'?uid='+linkparts[1];
			    profilelink.appendChild( imgprofile );
			    
				var msglink = document.createElement('a');
			    msglink.href='nachrichten.php?t=1&'+'id='+linkparts[1];
			    msglink.appendChild( imgsend );

			    links[j].parentNode.insertBefore( profilelink ,links[j]);
			    links[j].parentNode.insertBefore( msglink ,links[j]);	
		}
			
	}

}

function resourceBuildBar(vals, cid){//create a resource needed menu given an array of values
	var div1 = document.createElement('div');
	var inTable = document.createElement('table');
	var row = document.createElement('tr');
	var cell = document.createElement('td');

	inTable.className = 'tbg';
	inTable.style.width = '500px';
	inTable.setAttribute('cellspacing', 1);
	inTable.setAttribute('cellpadding', 1);
	cell.setAttribute('colspan',4);

	cell.appendChild(document.createTextNode(langfile[lang][0]));
	cell.className = 'rbg';
	row.appendChild( cell );
	inTable.appendChild( row );
	
	for(var i=0; i<4; i++){
		row = document.createElement('tr');
		row.style.color=vals[i][3];
		cell = document.createElement('td');
		var simg = document.createElement('img');
		simg.src='img/un/r/'+(i+1)+'.gif';
		simg.alt=fields[lang][i];
		simg.title=fields[lang][i];
		cell.appendChild(simg);
		row.appendChild(cell);
		cell = document.createElement('td');
		var con= document.createElement('span');
		con.appendChild(  document.createTextNode( vals[i][0] )  );
		cell.appendChild( con );
		row.appendChild(cell);
		
		con= document.createElement('span');
		cell = document.createElement('td');
		con.appendChild(  document.createTextNode( vals[i][1] )  );
		cell.appendChild( con );
		row.appendChild(cell);
		
		cell = document.createElement('td');
		if(vals[i][4]){
			con= document.createElement('span');
			con.appendChild(document.createTextNode(vals[i][2]));
			cell.appendChild(con);
			cell.appendChild(document.createTextNode(' |'+langfile[lang][10]+vals[i][4]));
		}
		else {
			cell.appendChild( document.createTextNode( vals[i][2] ) );
		}
		
		row.appendChild(cell);
		inTable.appendChild(row);
	}

	return inTable;
}



function resourcePerBuild(){ // search the page for resource needed to build, and calculates the surplus, deficit or other information

	var need = document.evaluate("//table[@class='f10']",document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
	var end = need.snapshotLength;
	if(end==0) return;

	var resourceBlock=new Array();

	for(var i=0; i<end; i++){
		var current=need.snapshotItem(i);
		var tdcells=current.getElementsByTagName('td');
		var cout=0;
		for(var k=0; k<tdcells.length; k++){
			if(tdcells[k].getAttribute('class')=='s7'){cout++;}
		}	
		if(cout==0){
			var c=current.textContent;
			if( c.indexOf(' | ')!=-1 && c.charAt(0)!='\n' ) {
				 resourceBlock.push( current );}
		}
	}

	end=resourceBlock.length;
	if(end==0) return;

	for(var i=0; i<end; i++){
	
		if(document.getElementById('cost'+i)) {
			i++; 
			continue;
		}
	
		var current=resourceBlock[i].textContent.split(' | ');

		var stuff=[];
		var maxtime=0;
		for(var j=0; j<4; j++){
			var cneed = parseInt( current[j] );
			var cproduction = parseInt( resource[j][0] );
			var cstore = parseInt( resource[j][1] );
			var cdiff = cstore-cneed;
			var ctime;
			var font='green'
						
			if(cproduction<0){
			
				if(cdiff>0){
					temp=parseInt(-cdiff/cproduction*3600);
					if(temp>maxtime) maxtime=temp;
					ctime=langfile[lang][17]+formatTimeString(temp);
				}
				else if(cdiff<0){
					ctime=langfile[lang][18]+fields[lang][i]+langfile[lang][19]; 
					font='red'
				}
				else {  
					ctime=langfile[lang][18]+fields[lang][i]+langfile[lang][19];  
					font='red'					
				}
				
			} else if(cproduction>0){
				if(cdiff>0){
					ctime=langfile[lang][11]+(cdiff/cneed*100).toFixed(2)+'%';
				}
				else if(cdiff<0){
					temp=parseInt(-cdiff/cproduction*3600);
					if(temp>maxtime) maxtime=temp;
					ctime=langfile[lang][12]+formatTimeString(temp); 
					font='red'
				}
				else {  
					ctime=langfile[lang][20];
				}
				
			} else {
			
				if(cdiff>0){  
					ctime=langfile[lang][20];
				}
				else if(cdiff<0){ 
					ctime=langfile[lang][18]+fields[lang][i]+langfile[lang][19]; 
					font='red'
				}
				else {  
					ctime=langfile[lang][20];        
				}
				
			}
			
			if(cdiff<0){   
				stuff[j]=[langfile[lang][13],(-cdiff),ctime,font];
			}
			else if(cdiff>0){ 
				stuff[j]=[langfile[lang][14],cdiff,ctime,font];  
			}
			else {      
				stuff[j]=[langfile[lang][16],0,ctime,font];   
			}
			
					 
		}
		
		var holdtable;
		var w=false;
		var g=false;
		var blink=false;
		var over=false;
		
		var wblink=false;
		var gblink=false;
		
		var wover=false;
		var gover=false;
		
			if(maxtime>0){
			
				for(var k=0;k<4; k++){
				
					var left=Math.ceil((maxtime/3600)*resource[k][0])+resource[k][1];  
					var cap=parseInt(  resource[k][2] )	; 
					
					if(left>cap){
						if(k!=3){
							wover=true;
							w=true;
						} else{
							gover=true;
							g=true;
						}
						
						over=true;
						stuff[k].push( left +'*');
					} else {
						stuff[k].push( left );
					}
					
					if(current[k]>cap)	{
						
						if(k!=3){
							w=true;
							wblink=true;
							stuff[k].push( langfile[lang][21] );
						} else{
							g=true;
							gblink=true;
							stuff[k].push( langfile[lang][22] );
						}
						
						blink=true;
					}
						
						
				}
				
				holdtable=resourceBuildBar(stuff, 'cost'+i );
				
				var row = document.createElement('tr');
				var cell = document.createElement('td');
				cell.setAttribute('colspan',4);
				var timer=estTime( formatTime(maxtime+pagetime[0]*3600+pagetime[1]*60+pagetime[2],0,0,0,0) );
				
				cell.appendChild( document.createTextNode(  timer+' |'+langfile[lang][15]+formatTimeString(maxtime) ) ); 
				row.appendChild( cell );
				holdtable.appendChild( row );
				
				if(w || g){
					var msg='';
					row = document.createElement('tr');
					cell = document.createElement('td');
					
					if( w && g){
						msg=langfile[lang][21];
						if(wover) msg+='*';
						msg+=' and '+langfile[lang][22];
						if(gover) msg+='*';
					} else if(w){
						msg=langfile[lang][21];
						if(wover) msg+='*';
					} else {
						msg=langfile[lang][22];
						if(wover) msg+='*';
					}					
					
					if(blink){
						cell.setAttribute('style','text-decoration:blink;');
						cell.style.color='red'; 
					} else {
						cell.style.color='green'; 
					}
					
					cell.setAttribute('colspan',4);
					cell.appendChild( document.createTextNode(  msg ) ); 
					row.appendChild( cell );
					holdtable.appendChild( row );
				}
				

			} else {
				holdtable=resourceBuildBar(stuff);
			}
			
			holdtable.id='cost'+i;	
	
			resourceBlock[i].appendChild(holdtable);
	}

}

function pop(){
	var fulltable=document.createElement( 'table' );
	
	fulltable.id='NavPop';
	fulltable.style.height='auto';
	fulltable.style.backgroundColor='#FFFFFF';
		
	var row=document.createElement( 'tr' );
	var cell=document.createElement( 'td' );

	fulltable.setAttribute('style', 'z-index:100;');
	fulltable.setAttribute('cellspacing', 1);
	fulltable.setAttribute('cellpadding', 1);
	fulltable.className = 'tbg';
	cell.className = 'rbg';
	cell.appendChild(document.createTextNode('++ Settings'));
	cell.setAttribute('colspan',2);
	
	row.appendChild(  cell );
	fulltable.appendChild(  row );
	row.style.cursor='move';
	
	makeDraggable(row);	
		
	fulltable.appendChild(makebutton('Links++', links) );
	fulltable.appendChild(makebutton('Tools++', res) );
	fulltable.appendChild(makebutton('Resource++', res) );
	fulltable.appendChild(makebutton('Navigator++', nav) );

	row=document.createElement('tr');
	cell=document.createElement('td');
	cell.appendChild(makeEventlink('Hide Settings', '#', toggle));
	cell.setAttribute('colspan',2);
	row.appendChild( cell );
	fulltable.appendChild( row );

	var listCoords = getPos(fulltable.id, '300px_157px').split('_');
	fulltable.style.top = listCoords[0];
	fulltable.style.left = listCoords[1];
	fulltable.style.position = 'absolute';
	fulltable.style.zIndex =100;
	fulltable.style.width='502px';
		
	fulltable.style.visibility='hidden';
	document.body.appendChild(fulltable);	
}