// ==UserScript==
// @name Travian: time calc (v1.1)
// @description Resource ready calculator, resource grow timers, culture points ready timer
// @version 1.1, travian 3.5 compatible
// @include http://*.travian.*/*
// ==/UserScript==
// (c) Anton Fedorov aka DataCompBoy, 2006-2009
// Clan S4 <KazakiYuV2>.

(function(){
  getElementsByClass = function (searchClass,node,tag) {
	  var classElements = new Array();
	  if ( node == null )
		  node = document;
	  if ( tag == null )
		  tag = '*';
	  var els = node.getElementsByTagName(tag);
	  var elsLen = els.length;
	  var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	  for (i = 0, j = 0; i < elsLen; i++) {
		  if ( pattern.test(els[i].className) ) {
			  classElements[j] = els[i];
			  j++;
		  }
	  }
	  return classElements;
  }

  var timer=1; for(; document.getElementById("timer"+timer); timer++) ;
  function travtmfmt(hrs) {
	  var h = Math.floor(hrs);
	  var m = Math.floor((hrs-h)*60);
	  var s = Math.ceil(((hrs-h)*60-m)*60);
	  return h+":"+(m<10?"0":"")+m+":"+(s<10?"0":"")+s;
  }
  var travDate = new Date(document.getElementById("tp1").innerHTML);
  function travtmenfmt(hrs) {
	  var date = new Date(travDate);
	  var futdate = new Date(travDate);
	  var expdate = futdate.getTime();
	  expdate += hrs*3600*1000; //expires in 1 hour(milliseconds)
	  futdate.setTime(expdate);
	  var ds = "";
	  if (futdate.getDate()!=date.getDate() && hrs > 24) {
		  ds += futdate.getYear() + "-";
		  var m = futdate.getMonth()+1;
		  ds += (m<10?"0":"")+m + "-";
		  var d = futdate.getDate();
		  ds += (d<10?"0":"")+d + " ";
	  }
	  var h=futdate.getHours();
	  var m=futdate.getMinutes();
	  var s=Math.max(0, futdate.getSeconds());
	  return ds+h+":"+(m<10?"0":"")+m+":"+(s<10?"0":"")+s;
  }
  function travtime(m0, m1, m2, space, noreload) {
	  var st = "", wait=0;
	  if (m0<0) {
		wait = -m1/m0;
		st = " style='color:red;'";
	  } else
	  if (m0==0) {
	  } else  {
		wait = (m2-m1)/m0;
	  }
	  if(!space) space = " ";
	  if (m0) {
		return " (<span"+ (wait>0||!noreload ? " id=timer" + (timer++) : "") + st + ">" + travtmfmt(wait) + "</span>;" + space + travtmenfmt(wait) + ")";
	  } else {
		return "(-never-)";
	  }
  }

  // step1: get your current harvesting
  var harv = new Array();
  var harvsum = 0;
  var harvsuminc = 0;
  var j=0;
  for (var i=4; i>=1; i--)
  {
	  var hx = document.getElementById("l"+i);
	  var h = hx.innerHTML.match(/([0-9]+)\/([0-9]+)/);
	  h[0] = parseInt(hx.getAttribute("title"));
	  h[1] = parseInt(h[1]);
	  h[2] = parseInt(h[2]);
	  harv[j++] = new Array(h[0], h[1], h[2]);
	  harvsum += h[1];
	  harvsuminc += h[0];
	  var td = document.getElementById("l"+i);
	  if (td.previousSibling.style)
		td.previousSibling.style.verticalAlign = 'top';
	  td.outerHTML = "<td><span id='l"+i+"' title="+h[0]+">"+h[1]+"/"+h[2]+"</span>"+
					 "<br/><span style='font-size: 8px'>"+travtime(h[0], h[1], h[2],"<br>",1)+"</span></td>";
  }

  var reslist = getElementsByClass("f10",document.body,"table");
  if (!reslist||!reslist.length) reslist = getElementsByClass("required",document.body,"td");
  if (reslist.length) {
	for(var i=0; i<reslist.length; i++) {
	  var m = reslist[i].innerHTML.match(/(?:img\/un\/r\/[1-4]\.gif|class="r[1-4]")[^>]*>[0-9]+/g);
	  if (m && m.length==4) {
		var sum = 0;
		var need = new Array();
		for(var j=0; j<m.length; j++) {
		  var res = m[j].match(/>([0-9]+)/);
		  need[j] = res[1]*1;
		  sum += res[1]*1;
		}
		var info = "<br/>";
		info += "Всего надо: "+sum+"/"+harvsum;
		if (harvsum < sum)
		{
			info += travtime(harvsuminc, harvsum, sum);
		}

		// now, add every timer
		var resrs = new Array("Дерево", "Глина", "Железо", "Зерно");
		var wm = 0; wi = -1;
		for(var j=0; j<4; j++)
		{
			if (need[j] > harv[j][1] && need[j] <= harv[j][2]) {
				var wc = (need[j]-harv[j][1])/harv[j][0];
				if (wc > wm)
				{
					wm = wc;
					wi = j;
				}
			}
		}
		for(var j=0; j<4; j++)
		{
			if (need[j] > harv[j][1])
			{
				info += "<br/>Надо <img src='img/un/r/"+(j+1)+".gif' alt='"+resrs[j]+"'>: ";
				if (need[j] > harv[j][2])
					info += "<font color=red>";
				info += need[j]+"/"+harv[j][1];
				if (need[j] > harv[j][2])
					info += "</font>";
				if (need[j] > harv[j][2])
				{
					info += "(недостаточно места "+(j<3?"на складе":"в амбаре")+")";
				} else {
					if (j==wi) info += "<b>";
					info += travtime( harv[j][0], harv[j][1], need[j] );
					if (j==wi) info += "</b>";
				}
			}
		}
		info += "<br/>Итоговые запасы: ";
		for(var j=0; j<4; j++)
		{
			info += "<img src='img/un/r/"+(j+1)+".gif' alt='"+resrs[j]+"'>";
			var res = Math.ceil(harv[j][1]+harv[j][0]*wm);
			if (res > harv[j][2])
				info += "<font color=red>";
			info += res //+ "/" + harv[j][2];
			if (res > harv[j][2])
				info += "</font>";
		}

		reslist[i].innerHTML += info;
	  }
	}
  }

  if (document.location.href.match(/s=2/))
  {
	  var lk = document.getElementById('lmid2');
	  if (!lk) lk = document.getElementById('content');
	  if (lk)
	  {
		  var eks = lk.innerHTML.match(/<b>([0-9]+)<\/b> единиц культуры/gi);
		  if (eks && eks.length==4)
		  {
			  var cult = parseInt(eks[1].match(/[0-9]+/)[0])/24;
			  var pres = parseInt(eks[2].match(/[0-9]+/)[0]);
			  var need = parseInt(eks[3].match(/[0-9]+/)[0]);
			  if (pres<need)
			  {
				  lk.innerHTML += "<br/>Ждать культуры: "+travtime( cult, pres, need );
			  }
		  }
	  }
  }
})();
