// ==UserScript== // @name GW LazyTools // @namespace noobs // @version 20110821a // @description Powertools for Global Warfare // @include *.globalwarfaregame.com/*main_src.php* // @include *.apps.facebook.com/globalwarfaregame/* // ==/UserScript== var Version = '20110821a'; // Test switches var DEBUG_TRACE = false; var DEBUG_BUTTON = true; var ENABLE_INFO = true; var ENABLE_CHAT = false; // End Test switches var JSON;if(!JSON){JSON={};}(function(){"use strict";function f(n){return n<10?'0'+n:n;}if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+'-'+f(this.getUTCMonth()+1)+'-'+f(this.getUTCDate())+'T'+f(this.getUTCHours())+':'+f(this.getUTCMinutes())+':'+f(this.getUTCSeconds())+'Z':null;};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf();};}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);})+'"':'"'+string+'"';}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key);}if(typeof rep==='function'){value=rep.call(holder,key,value);}switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null';}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null';}v=partial.length===0?'[]':gap?'[\n'+gap+partial.join(',\n'+gap)+'\n'+mind+']':'['+partial.join(',')+']';gap=mind;return v;}if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==='string'){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v);}}}}v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+mind+'}':'{'+partial.join(',')+'}';gap=mind;return v;}}if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' ';}}else if(typeof space==='string'){indent=space;}rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');}return str('',{'':value});};}if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v;}else{delete value[k];}}}}return reviver.call(holder,key,value);}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4);});}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j;}throw new SyntaxError('JSON.parse');};}}()); var JSON2 = JSON; if (document.URL.search(/apps.facebook.com\/globalwarfaregame/i) >= 0){ facebookInstance (); return; } if (document.URL.search(/globalwarfaregame.com/i) >= 0){ GWwideScreen (); } function GWwideScreen(){ var iFrame = parent.document.getElementsByTagName('IFRAME'); //iFrame[0].style.minWidth = '1220px'; iFrame[0].style.width = '100%'; while ( (iFrame=iFrame.parentNode) != null) iFrame.style.width = '100%'; } /*** Run only in "apps.facebook.com" instance ... ***/ function facebookInstance (){ function setWide (){ var iFrame = document.getElementById('iframe_canvas'); if (!iFrame){ setTimeout (setWide, 1000); return; } iFrame.style.width = '100%'; while ( (iFrame=iFrame.parentNode) != null) if (iFrame.tagName=='DIV') iFrame.style.width = '100%'; var e = document.getElementById('mainContainer'); if(e){ document.getElementById('content').style.minWidth = '1220px'; for(i=0; i<e.childNodes.length; i++){ if(e.childNodes[i].id == 'contentCol'){ e.childNodes[i].style.width = '100%'; e.childNodes[i].style.margin = '0px'; e.childNodes[i].style.paddingTop = '50px'; break; } } } var e = document.getElementById('globalContainer'); if(e){ e.style.width = '100%'; if(e.firstChild){ e.firstChild.style.width = '80%'; e.firstChild.style.margin = '0 10%'; } } var div = searchDOM (document.getElementById('content'), 'node.tagName=="DIV" && node.id.indexOf("rightCol")>=0', 7); if (div){ div.style.display ='none'; } } setWide(); } var Options = { ptWinIsOpen : false, ptWinDrag : false, ptWinPos : {}, ptTrackOpen : true, includeCity : true, includeMarching : false, includeTraining : false, includeTrainingTotal : false, overviewAllowOverflow : false, overviewFontSize : 12, pbgoldenable : true, pbGoldLimit : 99, }; var Seed = unsafeWindow.seed; var Tabs = {}; var mainPop; var Cities = {}; var ptStartupTimer = null; var CPopUpTopClass = 'ptPopTop'; var uW = unsafeWindow; function ptStartup (){ clearTimeout (ptStartupTimer); if (unsafeWindow.ptLoaded) return; var metc = getClientCoords(document.getElementById('main_engagement_tabs')); if (metc.width==null || metc.width==0){ ptStartupTimer = setTimeout (ptStartup, 1000); return; } unsafeWindow.ptLoaded = true; //logit ("KofC client version: "+ anticd.getKOCversion()); Seed = unsafeWindow.seed; var styles = '.ptTabs {color:black; font-size:12px}\ .xtab {padding-right: 5px; border:none; background:none; white-space:nowrap;}\ .xtabBR {padding-right: 5px; border:none; background:none;}\ table.ptTab tr td {border:none; background:none; white-space:nowrap; padding:0px}\ .hostile td { background:red; }.friendly td{background:lightgreen; }.ally td{background:lightblue; }\ table.ptTabPadNW tr td {border:none; background:none; white-space:nowrap; padding: 2px 4px 2px 8px;}\ table.ptTabBR tr td {border:none; background:none;}\ table.ptTabLined tr td {border:1px none none solid none; padding: 2px 5px; white-space:nowrap;}\ table.ptOptions tr td {border:1px none none solid none; padding: 1px 3px; white-space:nowrap;}\ table.ptSrchResults tr td {border:1px none none solid none; padding: 1px 3px; white-space:nowrap;}\ table.ptTabSome tr td {border:none; background:none; padding: 1px 3px; white-space:nowrap;}\ table.ptTabBR tr td {border:none; background:none;}\ table.ptTabLined tr td {border:1px none none solid none;}\ table.ptTabOverview tr td {border-left:1px solid #ccc; white-space:nowrap; padding: 1px;}\ table.ptTabPad tr td.ptentry {background-color:#ffeecc; padding-left: 8px;}\ table.ptNoPad tr td {border:none; background:none; white-space:nowrap; padding:0px}\ .ptDetLeft {padding:0 5px 0 0 !important; font-weight:bold; text-align:right}\ .ptOddrow {background-color:#eee}\ .ptStat {border:1px solid; border-color:#ffffff; font-weight:bold; padding-top:2px; padding-bottom:2px; text-align:center; color:#ffffff; background-color:#357}\ .ptStatLight {color:#ddd}\ .ptentry {padding: 7px; border:1px solid; border-color:#000000; background-color:#ffeecc; white-space:nowrap;}\ .ptErrText {font-weight:bold; color:#600000}\ button::-moz-focus-inner, input[type="submit"]::-moz-focus-inner { border: none; }\ span.whiteOnRed {padding-left:3px; padding-right:3px; background-color:#700; color:white; font-weight:bold}\ span.boldRed {color:#800; font-weight:bold}\ input.ptDefButOn {cursor:pointer; border:1px solid black; background-color:red;}\ input.ptDefButOff {cursor:pointer; border:1px solid black; background-color:#0a0;}\ input.ptButton20 {height:27px; width:80px}\ table.ptMainTab {empty-cells:show; margin-top:5px }\ table.ptMainTab tr td a {color:inherit }\ table.ptMainTab tr td {font-family:georgia,arial,sans-serif; height:60%; empty-cells:show; padding: 0px 5px 0px 5px; margin-top:5px; white-space:nowrap; border: 1px solid; border-style: none none solid none; }\ table.ptMainTab tr td.spacer {padding: 0px 3px;}\ table.ptMainTab tr td.sel {font-weight:bold; font-size:13px; border: 1px solid; border-style: solid solid none solid; background-color:#eed; color:black}\ table.ptMainTab tr td.notSel {font-weight:bold; font-size:13px; border: 1px solid; border-style: solid solid none solid; background-color:#1e66bd; color:white; border-color:black;}\ tr.ptPopTop td { background-color:#ded; border:none; height: 21px; padding:0px; }\ tr.ptretry_ptPopTop td { background-color:#a00; color:#fff; border:none; height: 21px; padding:0px; }\ tr.ptMainPopTop td { background-color:#ded; border:none; height: 42px; padding:0px; }\ tr.ptretry_ptMainPopTop td { background-color:#a00; color:#fff; border:none; height: 42px; padding:0px; }\ .CPopup .CPopMain { background-color:#f8f8f8; padding:6px; overflow:auto;}\ .CPopup {border:3px ridge #666}\ span.ptTextFriendly {color: #080}\ span.ptTextHostile {color: #800}\ .ptButCancel {background-color:#a00; font-weight:bold; color:#fff}\ div.indent25 {padding-left:25px}'; window.name = 'PT'; logit ("* Global Warfare Power Tools v"+ Version +" Loaded", true); readOptions(); setCities(); // TODO: Make sure WinPos is visible on-screen ? if (Options.ptWinPos==null || Options.ptWinPos.x==null|| Options.ptWinPos.x=='' || isNaN(Options.ptWinPos.x)){ var c = getClientCoords (document.getElementById('gor_menu_bar')); Options.ptWinPos.x = c.x+4; Options.ptWinPos.y = c.y; saveOptions (); } mainPop = new CPopup ('pt', Options.ptWinPos.x, Options.ptWinPos.y, 550,800, Options.ptWinDrag, function (){ tabManager.hideTab(); Options.ptWinIsOpen=false; saveOptions() }); mainPop.autoHeight (true); mainPop.getMainDiv().innerHTML = '<STYLE>'+ styles +'</style>'; AddMainTabLink('TOOLS', eventHideShow, mouseMainTab); tabManager.init (mainPop.getMainDiv()); CollectGold.init(); CollectOil.init(); CollectWH.init(); CollectFood.init(); ChatPane.init(); ErrorKiller.init(); if (Options.ptWinIsOpen && Options.ptTrackOpen){ mainPop.show (true); tabManager.showTab(); } window.addEventListener('unload', onUnload, false); } /**************************** Overview Tab ******************************/ function getResourceProduction (cityId){ var ret = [0,0,0,0,0,0,0,0,0]; var now = unixTime (); var wilds = [0, 0, 0, 0, 0, 0, 0, 0, 0]; var w = Seed.wilderness["city" + cityId]; for (var k in w){ var type = parseInt(w[k].tileType); if (type==10 || type==11 || type==12) wilds[1] += parseInt(w[k].tileLevel); else wilds[type/10] += parseInt(w[k].tileLevel); } knight = 0; var s = Seed.knights["city" + cityId]; if (s) { s = s["knt" + Seed.leaders["city" + cityId].resourcefulnessKnightId]; if (s){ var knight = parseInt(s.knightLevel); // if (s.resourcefulnessBoostExpireUnixtime > now) // knight *= 1.25; } } var workerFactor = 1; var c = parseInt(Seed.citystats["city" + cityId]["pop"][0]); // Current population var w = parseInt(Seed.citystats["city" + cityId]["pop"][3]); // Labor force if (w > c) workerFactor = c / w; for (var i=1; i<5; i++){ var usage = Seed.resources["city" + cityId]["rec" + i]; var items = 0; if (parseInt(Seed.bonus["bC1" + i + "00"]["bT1" + i + "01"]) > now) { items = 0.25; } var tech = Seed.tech["tch" + i]; ret[i] = parseInt((usage[2] * (1 + tech/10 + knight/100 + items + wilds[i]/20) * workerFactor + 100)); } return ret; } Tabs.Overview = { tabOrder : 1, cont : null, displayTimer : null, Overview : function (){ }, init : function (div){ this.cont = div; if (Options.overviewAllowOverflow) this.cont.style.overflowX = 'visible'; }, hide : function (){ clearTimeout (Tabs.Overview.displayTimer); }, show : function (){ var rownum = 0; var t = Tabs.Overview; clearTimeout (t.displayTimer); function _row (name, row, noTotal){ if (rownum++ % 2) style = ''; else style = ' style = "background: #e8e8e8"'; var tot = 0; var m = []; m.push ('<TR style="background: #fff" align=right'); m.push (style); m.push ('><TD'); m.push (style); m.push ('><B>'); m.push (name); m.push (' </td>'); if (noTotal){ m.push ('<TD'); m.push (style); m.push ('> </td>'); } else { for (i=0; i<row.length; i++) tot += row[i]; m.push ('<TD style="background: #ffc">'); m.push (addCommas(tot)); m.push ('</td>'); } for (i=0; i<row.length; i++){ m.push ('<TD'); m.push (style); m.push ('>'); m.push (addCommas(row[i])); m.push ('</td>'); } m.push ('</tr>'); return m.join(''); } //DebugTimer.start(); try { dt = new Date (); dt.setTime (Seed.player.datejoinUnixTime * 1000); // <TR align=left><TD><SPAN class=ptStatLight>Joined on:</span> '+ dt.toLocaleDateString() +'</td> str = '<DIV class=ptstat style="margin-top:5px; margin-bottom:5px;"><TABLE cellspacing=0 cellpadding=0 class="ptTab ptStat" width=97% align=center>\ <TD><SPAN class=ptStatLight>Power:</span> ' + addCommas(Seed.player.might) +'</td>\ <TD><SPAN class=ptStatLight>Alliance:</span> ' + getMyAlliance()[1] +'</td>\ <TD align=right><SPAN class=ptStatLight>Domain:</span> ' + unsafeWindow.domainName +'</td></tr></table></div>'; str += "<DIV id=overMainDiv style='font-size:"+ Options.overviewFontSize +"px'><TABLE class=ptTabOverview cellpadding=0 cellspacing=0><TR valign=top style='text-align:right'><TD width=65></td><TD width=88 style='background: #ffc'><B>TOTAL</b></td>"; for(i=0; i<Cities.numCities; i++) { str += "<TD width=81><B>"+ Cities.cities[i].name.substring(0,11) +'</b><BR>'+ Cities.cities[i].x +','+ Cities.cities[i].y +"<BR>"+ unsafeWindow.provincenames['p'+ Cities.cities[i].provId] +"</td>"; } str += "</tr>"; str += '<TR valign=top style=\'text-align:right\'><TD></td><TD style=\'background: #ffc\'></td>'; for(i=0; i<Cities.numCities; i++){ cityID = 'city'+Cities.cities[i].id; Gate = parseInt(Seed.citystats[cityID].gate); if(Gate == 0) str += '<TD>Hiding</td>'; else str += '<TD><SPAN class=boldRed>Defending</span></td>'; } rows = []; rows[0] = []; for(i=0; i<Cities.numCities; i++) { cityID = 'city'+ Cities.cities[i].id; rows[0][i] = parseInt(Seed.citystats[cityID].gold[0]); } for (r=1; r<9; r++){ rows[r] = []; for(i=0; i<Cities.numCities; i++) { cityID = 'city'+ Cities.cities[i].id; rows[r][i] = parseInt(Seed.resources[cityID]['rec'+r][0] / 3600); } } str += _row ('Gold', rows[0]); str += _row ('Food', rows[1]); str += _row ('Oil', rows[2]); str += _row ('Stone', rows[3]); str += _row ('Steel', rows[4]); str += _row ('Titanium', rows[5]); str += _row ('Graphene', rows[6]); str += _row ('Uranium', rows[7]); str += _row ('Diamonds', rows[8]); str += '<TR><TD colspan=12><BR></td></tr>'; for (r=1; r<20; r++){ rows[r] = []; for(i=0; i<Cities.numCities; i++) { rows[r][i] = 0; } } if (Options.includeCity){ for (r=1; r<20; r++){ for(i=0; i<Cities.numCities; i++) { cityID = 'city'+ Cities.cities[i].id; rows[r][i] = parseInt(Seed.units[cityID]['unt'+r]); } } } if (Options.includeMarching){ for (var i=0; i<20; i++) rows[i][Cities.numCities] = march.marchUnits[i]; } if (Options.includeTrainingTotal){ for (var i=0; i<20; i++) rows[i][Cities.numCities+1] = train.trainUnts[i]; } if (Options.includeTraining){ var q = Seed.training_queue; for(i=0; i<Cities.numCities; i++) { q = Seed.training_queue['c'+ Cities.cities[i].id]; if (q && q.length>0){ for (qi=0; qi<q.length; qi++) rows[q[qi][0]][i] += parseInt(q[qi][1]); } } } rownum = 0; // for(i=0; i<20; i++) // str += _row (unsafeWindow.arStrings.unitName['u'+i], rows[i]); str += _row ('SupTruck', rows[1]); str += _row ('Infantry', rows[5]); str += _row ('Sniper', rows[6]); str += _row ('AntiTank', rows[4]); str += _row ('Spc Forces', rows[18]); str += _row ('SAM', rows[7]); str += _row ('Tank', rows[8]); str += _row ('Drone', rows[17]); str += _row ('Helicopter', rows[9]); str += _row ('Gunship', rows[11]); str += _row ('Fighter', rows[10]); str += _row ('Bomber', rows[12]); str += _row ('Cargo', rows[19]); str += _row ('Hellfire', rows[16]); str += _row ('Stealth', rows[13]); str += '<TR><TD colspan=12><BR></td></tr>'; row = []; row2 = []; row3 = []; for(i=0; i<Cities.numCities; i++) { var rp = getResourceProduction (Cities.cities[i].id); var usage = parseInt(Seed.resources["city" + Cities.cities[i].id]['rec1'][3]); row3[i] = usage; row2[i] = rp[1]; row[i] = rp[1] - usage; } str += _row ('Upkeep', row3, true); str += _row ('Production', row2, true); str += _row ('Food +/-', row, true); for(i=0; i<Cities.numCities; i++) { if (row[i] >= 0) row[i] = '----'; else { var timeLeft = parseInt(Seed.resources["city" + Cities.cities[i].id]['rec1'][0]) / 3600 / (0-row[i]) * 3600; if (timeLeft > 86313600) row[i] = '----'; else { if (Options.enableFoodWarn && timeLeft<(Options.foodWarnHours*3600)) row[i] = '<SPAN class=whiteOnRed>'+ timestrShort(timeLeft) +'</span>'; else row[i] = timestrShort(timeLeft); } } } str += _row ('Food left', row, true); str += '<TR><TD><BR></td></tr>'; row = []; for(i=0; i<Cities.numCities; i++) { var totWilds = 0; dat = Seed.wilderness['city'+ Cities.cities[i].id]; if (dat!=null && matTypeof(dat)=='object') for (k in dat) ++totWilds; var castle = parseInt(Seed.buildings['city'+ Cities.cities[i].id].pos0[1]); if(castle == 11) castle = 12; if (totWilds < castle) row[i] = '<SPAN class=boldRed><B>'+ totWilds +'/'+ castle +'</b></span>'; else row[i] = totWilds +'/'+ castle; } str += _row ('#Wilds', row, true); row = []; for(i=0; i<Cities.numCities; i++) { totKnights = 0; dat = Seed.knights['city'+ Cities.cities[i].id]; for (k in dat) ++totKnights; row[i] = totKnights; } str += _row ('#Generals', row, true); var now = unixTime(); var row = []; for(i=0; i<Cities.numCities; i++) { var totTime = 0; var q = Seed.outgoing_marches['c'+Cities.cities[i].id]; if (q!=null && q.length>0) totTime = q[q.length-1][3] - now; if (totTime < 0) totTime = 0; if (totTime < 3600) row[i] = '<SPAN class=boldRed><B>'+ timestr(totTime) +'</b></span>'; else row[i] = timestr(totTime); } str += _row ('TroopQ', row, true); var row = []; for(i=0; i<Cities.numCities; i++) { var wall = {}; getWallInfo (Cities.cities[i].id, wall); var totTime = 0; var q = Seed.fortify_queue['city'+Cities.cities[i].id]; if (q!=null && q.length>0) totTime = q[q.length-1][3] - now; if (totTime < 0) totTime = 0; if (totTime<1 && (wall.wallSpaceUsed < wall.wallSpace-4 || wall.fieldSpaceUsed < wall.fieldSpace-4)) row[i] = '<SPAN class=boldRed><B>'+ timestr(totTime) +'</b></span>'; else row[i] = timestr(totTime); } str += _row ('WallQue', row, true); str += '<TR><TD class=xtab></td><TD class=xtab colspan=4><BR><INPUT type=CHECKBOX id=ptoverOriginal'+ (Options.includeCity?' CHECKED':'') +'>Show Troops in City</td></tr>'; str += '<TR><TD class=xtab></td><TD class=xtab colspan=4><INPUT type=CHECKBOX id=idCheck'+ (Options.includeMarching?' CHECKED':'') +' DISABLED>Show Marching Troops/Resources</td></tr>'; str += '<TR><TD class=xtab></td><TD class=xtab colspan=4><INPUT type=CHECKBOX id=ptoverIncTraining'+ (Options.includeTraining?' CHECKED':'') +' DISABLED>Show troops training in city</td></tr>'; str += '<TR><TD class=xtab></td><TD class=xtab colspan=4><INPUT type=CHECKBOX id=ptoverIncTrainingTotal'+ (Options.includeTrainingTotal?' CHECKED':'') +' DISABLED>Show troops training totals</td></tr>'; str += '<TR><TD class=xtab></td><TD class=xtab colspan=4><INPUT type=CHECKBOX id=ptOverOver'+ (Options.overviewAllowOverflow?' CHECKED':'') +'>Allow width overflow \ FONT SIZE: '+ htmlSelector ({9:9, 10:10, 11:11, 12:12}, Options.overviewFontSize, 'id=ptoverfont') +'</td></tr>'; str += "</table></div>"; str+= 'GW Lazy Tools Version : ' + Version; Tabs.Overview.cont.innerHTML = str; document.getElementById('ptoverOriginal').addEventListener('click', e_clickEnableTroops, false); document.getElementById('idCheck').addEventListener('click', e_clickEnableMarch, false); document.getElementById('ptoverIncTraining').addEventListener('click', e_clickEnableTraining, false); document.getElementById('ptoverIncTrainingTotal').addEventListener('click', e_clickEnableTrainingTotal, false); document.getElementById('ptOverOver').addEventListener('click', e_allowWidthOverflow, false); document.getElementById('ptoverfont').addEventListener('change', e_fontSize, false); //DebugTimer.display ('Draw Overview'); } catch (e){ Tabs.Overview.cont.innerHTML = '<PRE>'+ e.name +' : '+ e.message +'</pre>'; } t.displayTimer = setTimeout (t.show, 5000); function e_clickEnableTroops (){ var t = Tabs.Overview; Options.includeCity = document.getElementById('ptoverOriginal').checked; t.show (); } function e_clickEnableMarch (){ var t = Tabs.Overview; Options.includeMarching = document.getElementById('idCheck').checked; t.show (); } function e_clickEnableTraining (){ var t = Tabs.Overview; Options.includeTraining = document.getElementById('ptoverIncTraining').checked; t.show (); } function e_clickEnableTrainingTotal (){ var t = Tabs.Overview; Options.includeTrainingTotal = document.getElementById('ptoverIncTrainingTotal').checked; t.show (); } function e_fontSize(evt){ document.getElementById('overMainDiv').style.fontSize = evt.target.value +'px'; Options.overviewFontSize = evt.target.value; } function e_allowWidthOverflow (evt){ var tf = document.getElementById('ptOverOver').checked; Options.overviewAllowOverflow = tf; if (tf) t.cont.style.overflowX = 'visible'; else t.cont.style.overflowX = 'auto'; } }, }; function getWallInfo (cityId, objOut){ objOut.wallSpaceUsed = 0; objOut.fieldSpaceUsed = 0; objOut.wallLevel = 0; objOut.wallSpace = 0; objOut.fieldSpace = 0; var b = Seed.buildings["city" + cityId]; if (b.pos1==null) return; objOut.wallLevel = parseInt(b.pos1[1]); var spots = 0; for (var i=1; i<(objOut.wallLevel+1); i++) spots += (i * 500); objOut.wallSpace = spots; objOut.fieldSpace = spots; var fort = Seed.fortifications["city" + cityId]; for (k in fort){ var id = parseInt(k.substr(4)); if (id<60) objOut.wallSpaceUsed += parseInt(unsafeWindow.fortstats["unt"+ id][5]) * parseInt(fort[k]); else objOut.fieldSpaceUsed += parseInt(unsafeWindow.fortstats["unt"+ id][5]) * parseInt(fort[k]); } } /**************************** Build Implementation ****************************** TODO: visu directly in the game of build queue elements <span class="leveltag" style="left:60px;">10</span> more todos within the code */ Tabs.build = { tabOrder: 1, tabLabel: 'Build', myDiv: null, timer: null, buildTab: null, koc_buildslot: null, koc_buildmenu: null, currentBuildMode: null, buildStates: [], loaded_bQ: [], lbQ: [], init: function(div){ var t = Tabs.build; t.myDiv = div; t.koc_buildslot = unsafeWindow.Building.buildSlot; //save original koc function t.koc_buildmenu = unsafeWindow.Building.buildMenu; //save original koc function t.currentBuildMode = "build"; t.buildStates = { running: false, help: false, }; t.readBuildStates(); for (var i = 0; i < Cities.cities.length; i++) { t["bQ_" + Cities.cities[i].id] = JSON2.parse(GM_getValue('bQ_' + getServerId() + '_' + Cities.cities[i].id, '[]')); if (typeof t["bQ_" + Cities.cities[i].id] == 'undefined' || (t["bQ_" + Cities.cities[i].id]) == "") { t["bQ_" + Cities.cities[i].id] = []; } } var m = '<DIV id=pbBuildDivF class=ptStat>BUILD FUNCTIONS</div><TABLE id=pbbuildfunctions width=100% height=0% class=ptTab><TR>'; if (t.buildStates.running == false) { m += '<TD><INPUT id=pbBuildRunning type=submit value="Auto Build = OFF"></td>'; } else { m += '<TD><INPUT id=pbBuildRunning type=submit value="Auto Build = ON"></td>'; } m += '<TD><INPUT id=pbBuildMode type=submit value="Build Mode = OFF"></td>'; m += '<TD>Build Type: <SELECT id="pbBuildType">\ <OPTION value=build>level up</option>\ <OPTION value=max>level max</option>\ <OPTION value=destruct>destruct</option>\ </select></td>'; //m += '<TD><INPUT id=pbHelpRequest type=checkbox DISABLED '+ (t.buildStates.help?' CHECKED':'') +'\></td><TD>Ask for help?</td>'; m += '</tr></table></div>'; m += '<DIV id=pbBuildDivQ class=ptStat>BUILD QUEUES</div><TABLE id=pbbuildqueues width=100% height=0% class=ptentry><TR>'; for (var i = 0; i < Cities.cities.length; i++) { m += '<TD colspan=2><CENTER><B>' + Cities.cities[i].name + '</b></center></td>'; } m += '</tr><TR>'; for (var i = 0; i < Cities.cities.length; i++) { m += '<TD colspan=2><CENTER><INPUT id=pbbuild_' + Cities.cities[i].id + ' type=submit value="Show"></center></td>'; } m += '</tr><TR>'; for (var i = 0; i < Cities.cities.length; i++) { m += '<TD>Qc:</td><TD id=pbbuildcount_' + Cities.cities[i].id + '>' + t["bQ_" + Cities.cities[i].id].length + '</td>'; } m += '</tr><TR>'; for (var i = 0; i < Cities.cities.length; i++) { t['totalTime_' + Cities.cities[i].id] = 0; cbQ = t["bQ_" + Cities.cities[i].id]; if (typeof cbQ != 'undefined') { for (var j = 0; j < cbQ.length; j++) { t['totalTime_' + Cities.cities[i].id] = parseInt(t['totalTime_' + Cities.cities[i].id]) + parseInt(cbQ[j].buildingTime); } timestring = timestr(t['totalTime_' + Cities.cities[i].id]); } m += '<TD>Tt:</td><TD id=pbbuildtotal_' + Cities.cities[i].id + '>' + timestring + '</td>'; } m += '</tr></table><SPAN class=boldRed id=pbbuildError></span>'; t.myDiv.innerHTML = m; for (var i = 0; i < Cities.cities.length; i++) { var cityId = Cities.cities[i].id; var btnName = 'pbbuild_' + cityId; addQueueEventListener(cityId, btnName); t.showBuildQueue(cityId, false); } t.e_autoBuild(); //start checking if we can build someting document.getElementById('pbBuildType').addEventListener('change', function(){t.setBuildMode(this.value);}, false); document.getElementById('pbBuildRunning').addEventListener('click', function(){ t.toggleStateRunning(this); }, false); document.getElementById('pbBuildMode').addEventListener('click', function(){ t.toggleStateMode(this); }, false); // document.getElementById('pbHelpRequest').addEventListener ('change', function (){ // t.buildStates.help = (document.getElementById('pbHelpRequest').checked); // t.saveBuildStates(); // }, false); window.addEventListener('unload', t.onUnload, false); function addQueueEventListener(cityId, name){ document.getElementById(name).addEventListener('click', function(){ t.showBuildQueue(cityId, true); }, false); } }, setBuildMode: function (type) { var t = Tabs.build; t.currentBuildMode = type; }, e_autoBuild: function(){ var t = Tabs.build; document.getElementById('pbbuildError').innerHTML = ''; if (t.buildStates.running == true) { var now = unixTime(); //logit ('Seed.queue_con: (now='+ now +')\n'+ inspect (Seed.queue_con, 3)); for (var i = 0; i < Cities.cities.length; i++) { var cityId = Cities.cities[i].id; var isBusy = false; var qcon = Seed.queue_con["city" + cityId]; if (matTypeof(qcon)=='array' && qcon.length>0) { if (parseInt(qcon[0][4]) > now) isBusy = true; else qcon.shift(); // remove expired build from queue } //logit ('City #'+ (i+1) + ' : busy='+ isBusy); if (isBusy) { //TODO add info of remaining build time and queue infos } else { if (t["bQ_" + cityId].length > 0) { // something to do? var bQi = t["bQ_" + cityId][0]; //take first queue item to build t.doOne(bQi);; //setTimeout(t.e_autoBuild, 10000); //should be at least 10 //return; // we need to make sure that there is enough time for each ajax request to not overwrite the vaule that are needed by the next run } } } } setTimeout(t.e_autoBuild, 10000); //should be at least 10 }, doOne : function (bQi){ var t = Tabs.build; var currentcityid = parseInt(bQi.cityId); var cityName = t.getCityNameById(currentcityid); var time = parseInt(bQi.buildingTime); var mult = parseInt(bQi.buildingMult); var attempt = parseInt(bQi.buildingAttempt); //mat/KOC Power Bot: 49 @ 19:41:45.274: Pos: 6 Type: 13 Level: 8 Id: 1523749 var mode = bQi.buildingMode; // var mode = "build"; //FOR DEBUG var citpos = parseInt(bQi.buildingPos); // var citpos = 6; //FOR DEBUG if (Seed.buildings['city' + currentcityid]["pos" + citpos] != undefined && Seed.buildings['city' + currentcityid]["pos" + citpos][0] != undefined) { var l_bdgid = parseInt(bQi.buildingType); //JUST FOR CHECK var bdgid = parseInt(Seed.buildings['city' + currentcityid]["pos" + citpos][0]); // var bdgid = 13; //FOR DEBUG var l_curlvl = parseInt(bQi.buildingLevel); //JUST FOR CHECK var curlvl = parseInt(Seed.buildings['city' + currentcityid]["pos" + citpos][1]); // var curlvl = 8; //FOR DEBUG var l_bid = parseInt(bQi.buildingId); //JUST FOR CHECK var bid = parseInt(Seed.buildings["city" + currentcityid]["pos" + citpos][3]); // var bid = 1523749; //FOR DEBUG if (curlvl > 8 && mode == 'build') { t.cancelQueueElement(0, currentcityid, time, false); logit("Queue item deleted: Building Level equals 9 or higher!!!"); return; }; if (isNaN(curlvl)) { t.cancelQueueElement(0, currentcityid, time, false); logit("Found no correct value for current building!!!!"); return; } if (l_bdgid != bdgid) { t.cancelQueueElement(0, currentcityid, time, false); logit("Building Type does not match!!!!"); return; } if (l_bid != bid) { t.cancelQueueElement(0, currentcityid, time, false); logit("Building ID does not match!!!!"); return; } if (l_curlvl < curlvl) { t.cancelQueueElement(0, currentcityid, time, false); logit("Queue item deleted: Buildinglevel is equal or higher!!!"); return; } if (l_curlvl > curlvl && mode == 'build') { t.requeueQueueElement(bQi); return; } if (mode == 'destruct') { var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams); params.cid = currentcityid; params.bid = ""; params.pos = citpos; params.lv = curlvl - 1; if (curlvl >= 1) { params.bid = bid; } params.type = bdgid; new MyAjaxRequest(unsafeWindow.g_ajaxpath + "destruct.php" + unsafeWindow.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function(rslt){ if (rslt.ok) { logit("Destructing " + unsafeWindow.buildingcost['bdg' + bdgid][0] + " at " + cityName, true); Seed.queue_con["city" + currentcityid].push([bdgid, 0, parseInt(rslt.buildingId), unsafeWindow.unixtime(), unsafeWindow.unixtime() + time, 0, time, citpos]); if (params.cid == unsafeWindow.currentcityid) unsafeWindow.update_bdg(); // if (document.getElementById('pbHelpRequest').checked == true) // t.bot_gethelp(params.bid, currentcityid); t.cancelQueueElement(0, currentcityid, time, false); } else { var errmsg = unsafeWindow.printLocalError(rslt.error_code || null, rslt.msg || null, rslt.feedback || null); t.requeueQueueElement(bQi); document.getElementById('pbbuildError').innerHTML = errmsg; logit(errmsg, true); } }, onFailure: function(){ document.getElementById('pbbuildError').innerHTML = "Connection Error while destructing! Please try later again"; } }) } if (mode == 'build') { var invalid = false; var chk = unsafeWindow.checkreq("b", bdgid, curlvl); //check if all requirements are met for (var c = 0; c < chk[3].length; c++) { if (chk[3][c] == 0) { invalid = true; } } if (invalid == false) { var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams); params.cid = currentcityid; //params.bid = ""; params.pos = citpos; params.lv = curlvl + 1; if (params.lv > 9){ //make sure that no level 10+ is built t.cancelQueueElement(0, currentcityid, time, false); logit("Queue item deleted: Tryed to build level 10+ building! Please report if this happens!!!"); return; } if (params.lv > 1) { params.bid = bid; } params.type = bdgid; new MyAjaxRequest(unsafeWindow.g_ajaxpath + "construct.php" + unsafeWindow.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function(rslt){ if (rslt.ok) { logit("Building " + unsafeWindow.buildingcost['bdg' + bdgid][0] + " Level " + params.lv + " at " + cityName, true); Seed.resources["city" + currentcityid].rec1[0] -= parseInt(unsafeWindow.buildingcost["bdg" + bdgid][1]) * mult * 3600; Seed.resources["city" + currentcityid].rec2[0] -= parseInt(unsafeWindow.buildingcost["bdg" + bdgid][2]) * mult * 3600; Seed.resources["city" + currentcityid].rec3[0] -= parseInt(unsafeWindow.buildingcost["bdg" + bdgid][3]) * mult * 3600; Seed.resources["city" + currentcityid].rec4[0] -= parseInt(unsafeWindow.buildingcost["bdg" + bdgid][4]) * mult * 3600; Seed.resources["city" + currentcityid].rec5[0] -= parseInt(unsafeWindow.buildingcost["bdg" + bdgid][5]) * mult * 3600; Seed.resources["city" + currentcityid].rec6[0] -= parseInt(unsafeWindow.buildingcost["bdg" + bdgid][6]) * mult * 3600; Seed.resources["city" + currentcityid].rec7[0] -= parseInt(unsafeWindow.buildingcost["bdg" + bdgid][7]) * mult * 3600; Seed.resources["city" + currentcityid].rec8[0] -= parseInt(unsafeWindow.buildingcost["bdg" + bdgid][8]) * mult * 3600; Seed.queue_con["city" + currentcityid].push([bdgid, curlvl + 1, parseInt(rslt.buildingId), unsafeWindow.unixtime(), unsafeWindow.unixtime() + time, 0, time, citpos]); if (params.cid == unsafeWindow.currentcityid) unsafeWindow.update_bdg(); // if (document.getElementById('pbHelpRequest').checked == true) // t.bot_gethelp(params.bid, currentcityid); t.cancelQueueElement(0, currentcityid, time, false); } else { var errmsg = unsafeWindow.printLocalError(rslt.error_code || null, rslt.msg || null, rslt.feedback || null); if (rslt.error_code == 103) { // building has already the target level => just delete t.cancelQueueElement(0, currentcityid, time, false); logit("Queue item deleted: Building at this Level already exists or build process already started!"); } else { t.requeueQueueElement(bQi); document.getElementById('pbbuildError').innerHTML = Cities.byID[currentcityid].name +': '+ errmsg + " Item was requeued. Check for retry count."; } logit(errmsg); } }, onFailure: function(){ document.getElementById('pbbuildError').innerHTML = "Connection Error while building! Please try later again"; } }); } else { t.requeueQueueElement(bQi); // requeue item if check is invalid } } } else { t.cancelQueueElement(0, currentcityid, time, false); logit("Queue item deleted: Building does not exist!!!"); } }, requeueQueueElement: function (bQi) { var t = Tabs.build; var cityId = bQi.cityId; var buildingPos = parseInt(bQi.buildingPos); var buildingId = parseInt(bQi.buildingId); var buildingLevel = parseInt(bQi.buildingLevel); var buildingType = parseInt(bQi.buildingType); var buildingTime = parseInt(bQi.buildingTime); var buildingMult = parseInt(bQi.buildingMult); var buildingAttempts = parseInt(bQi.buildingAttempts); var buildingMode = bQi.buildingMode; t.addQueueItem(cityId, buildingPos, buildingType, buildingId, buildingTime, buildingLevel, buildingAttempts + 1, buildingMult, buildingMode); // requeue item t.cancelQueueElement(0, cityId, buildingTime, false); // delete Queue Item }, show: function(){ var t = Tabs.build; }, bot_buildslot: function(c, a){ var t = Tabs.build; var cityId = t.getCurrentCityId(); var buildingPos = c; var buildingType = parseInt(Seed.buildings['city' + cityId]["pos" + buildingPos][0]); var buildingLevel = parseInt(Seed.buildings['city' + cityId]["pos" + buildingPos][1]); var buildingId = parseInt(Seed.buildings['city' + cityId]["pos" + buildingPos][3]); if (DEBUG_TRACE) logit("Pos: " + buildingPos + " Type: " + buildingType + " Level: " + buildingLevel + " Id: " + buildingId); var buildingAttempts = 0; var loaded_bQ = t["bQ_" + cityId]; if (typeof Seed.queue_con['city' + cityId][0] != 'undefined') { var current_construction_pos = Seed.queue_con['city' + cityId][0][2]; } else { var current_construction_pos = ""; } if (loaded_bQ.length == 0 && current_construction_pos != "" ) { //check anyway if there is currently build in progess for this specific building if (current_construction_pos != 'NaN' && current_construction_pos == buildingId) { buildingLevel += 1; } } else { if (current_construction_pos != "" && current_construction_pos == buildingId) { buildingLevel += 1; } for (var i = 0; i < loaded_bQ.length; i++) { // check if there are already queue items for this building or the building is currently building var loadedCity = loaded_bQ[i].cityId; var loadedSlot = loaded_bQ[i].buildingPos; if (loadedSlot == buildingPos && loadedCity == cityId) { buildingLevel += 1; } if (loaded_bQ[i].buildingMode == 'destruct' && loadedSlot == buildingPos && loadedCity == cityId) { // check if destrcution is already in queue t.modalmessage('Destruction already in Queue!'); return; } } } if (t.currentBuildMode == "build") { if (buildingLevel >= 9) { t.modalmessage('Due to building requirements (DI), buildings above level 9\nshould be manualy built.'); return; } var buildingMode = "build"; var result = t.calculateQueueValues(cityId, buildingLevel, buildingType, buildingMode); var buildingMult = result[0]; var buildingTime = result[1]; var queueId = loaded_bQ.length; t.addQueueItem(cityId, buildingPos, buildingType, buildingId, buildingTime, buildingLevel, buildingAttempts, buildingMult, buildingMode); t._addTab(queueId, cityId, buildingType, buildingTime, buildingLevel, buildingAttempts, buildingMode); } if (t.currentBuildMode == "max") { var buildingMode = "build"; for (var bL = buildingLevel; bL <9; bL++) { var queueId = loaded_bQ.length; var result = t.calculateQueueValues(cityId, bL, buildingType, buildingMode); var buildingMult = result[0]; var buildingTime = result[1]; queueId = queueId ; t.addQueueItem(cityId, buildingPos, buildingType, buildingId, buildingTime, bL, buildingAttempts, buildingMult, buildingMode); t._addTab(queueId, cityId, buildingType, buildingTime, bL, buildingAttempts, buildingMode); } } if (t.currentBuildMode == "destruct") { var buildingMode = "destruct"; var result = t.calculateQueueValues(cityId, buildingLevel, buildingType, buildingMode); var buildingMult = result[0]; var buildingTime = result[1]; var queueId = loaded_bQ.length; t.addQueueItem(cityId, buildingPos, buildingType, buildingId, buildingTime, buildingLevel, buildingAttempts, buildingMult, buildingMode); t._addTab(queueId, cityId, buildingType, buildingTime, buildingLevel, buildingAttempts, buildingMode); } }, calculateQueueValues: function (cityId, buildingLevel, buildingType, buildingMode) { var t = Tabs.build; var now = unixTime(); if (buildingMode == 'build') { var buildingMult = Math.pow(2, buildingLevel); } if (buildingMode == 'destruct') { var buildingMult = Math.pow(2, buildingLevel - 2); } var buildingTime = unsafeWindow.constructionData["b" + buildingType].c[10] * buildingMult; if (parseInt(buildingType) < 6 && parseInt(buildingType) > 0 && buildingMult == 1) { buildingTime = 5; } if (buildingMode == 'build') { buildingTime = parseInt(buildingTime / (1 + unsafeWindow.General.politicsBonus() + unsafeWindow.Research.bonusForType(unsafeWindow.Constant.Research.CRANES))); } if (buildingMode == 'destruct') { buildingTime = buildingTime / (1 + unsafeWindow.General.politicsBonus() + unsafeWindow.Research.bonusForType(unsafeWindow.Constant.Research.CRANES)); if (buildingTime % 1 > 0) { buildingTime = parseInt(buildingTime); } } var result = new Array(buildingMult, buildingTime); return result; }, bot_gethelp: function (f, currentcityid) { var a = qlist = Seed.queue_con["city" + currentcityid]; var e = 0; var d = 0; for (var c = 0; c < a.length; c++) { if (parseInt(a[c][2]) == parseInt(f)) { e = parseInt(a[c][0]); d = parseInt(a[c][1]); break } } var b = new Array(); b.push(["REPLACE_LeVeLbUiLdInG", d]); b.push(["REPLACE_BuIlDiNgNaMe", unsafeWindow.buildingcost["bdg" + e][0]]); b.push(["REPLACE_LeVeLiD", d]); b.push(["REPLACE_AsSeTiD", f]); var g = function(h, i) { unsafeWindow.continuation_95(h, i); if (!h) { var j = d > 1 ? unsafeWindow.cm.SpeedUpType.upgrade : unsafeWindow.cm.SpeedUpType.build; unsafeWindow.cm.ClientSideCookieManager.setCookie(j, false) } }; unsafeWindow.common_postToProfile("95", unsafeWindow.Object.cloneFeed(unsafeWindow.template_data_95), unsafeWindow.Object.cloneFeed(unsafeWindow.actionlink_data_95), g, b) }, addQueueItem: function (cityId, buildingPos, buildingType, buildingId, buildingTime, buildingLevel, buildingAttempts, buildingMult, buildingMode) { var t = Tabs.build; var lbQ = t["bQ_" + cityId]; lbQ.push({ cityId: cityId, buildingPos: buildingPos, buildingType: buildingType, buildingId: buildingId, buildingTime: buildingTime, buildingLevel: buildingLevel, buildingAttempts: buildingAttempts, buildingMult: buildingMult, buildingMode: buildingMode }); t.modifyTotalTime(cityId, 'increase', buildingTime); //adjust total Time }, modalmessage: function(message){ var t = Tabs.build; var timeout = 10000; var content = "autoclose after 10sec...<br><br>" content += message; unsafeWindow.Modal.showAlert(content); window.setTimeout('unsafeWindow.Modal.hideModal();', timeout); }, modifyTotalTime: function (cityId, type, buildingTime) { var t = Tabs.build; var element = document.getElementById('pbbuildcount_' + cityId); var currentCount = parseInt(element.innerHTML); if (type == "increase") { t['totalTime_' + cityId] = t['totalTime_' + cityId] + buildingTime; var currentCount = currentCount + 1; } if (type == "decrease") { t['totalTime_' + cityId] = t['totalTime_' + cityId] - buildingTime; var currentCount = currentCount - 1; } element.innerHTML = currentCount; document.getElementById('pbbuildtotal_' + cityId).innerHTML = timestr(t['totalTime_' + cityId]); }, hide: function(){ var t = Tabs.build; //unsafeWindow.buildslot = t.koc_buildslot; // restore original koc function }, onUnload: function(){ var t = Tabs.build; for (var i = 0; i < Cities.cities.length; i++) { //t["bQ_" + Cities.cities[i].id] = []; //clean up if needed GM_setValue('bQ_' + getServerId() + '_' + Cities.cities[i].id, JSON2.stringify((t["bQ_" + Cities.cities[i].id]))); } t.saveBuildStates(); }, _addTab: function(queueId, cityId, buildingType, buildingTime, buildingLevel, buildingAttempts, buildingMode){ var t = Tabs.build; var row = document.getElementById('pbCityQueueContent').insertRow(0); row.vAlign = 'top'; row.insertCell(0).innerHTML = queueId; if (buildingMode == "destruct") { row.insertCell(1).innerHTML = '<img src="http://cdn1.kingdomsofcamelot.com/fb/e2/src/img/bonus_att.png">'; } else { row.insertCell(1).innerHTML = '<img src="http://cdn1.kingdomsofcamelot.com/fb/e2/src/img/bonus_prod.png">'; } row.insertCell(2).innerHTML = unsafeWindow.buildingcost['bdg' + buildingType][0]; row.insertCell(3).innerHTML = timestr(buildingTime); if (buildingMode == "destruct") { row.insertCell(4).innerHTML = 0; } else { row.insertCell(4).innerHTML = buildingLevel + 1; // => target Level } row.insertCell(5).innerHTML = buildingAttempts; row.insertCell(6).innerHTML = '<input class="button30 ptButton20" type=button id="queuecancel_' + queueId + '" value=Cancel></input>'; document.getElementById('queuecancel_' + queueId).addEventListener('click', function(){ t.cancelQueueElement(queueId, cityId, buildingTime, true); }, false); }, cancelQueueElement: function(queueId, cityId, buildingTime, showQueue){ var t = Tabs.build; var queueId = parseInt(queueId); t["bQ_" + cityId].splice(queueId, 1); t.modifyTotalTime(cityId, 'decrease', buildingTime); //adjust total Time if (showQueue == true) { t.showBuildQueue(cityId, false); } }, showBuildQueue: function(cityId, focus){ var t = Tabs.build; clearTimeout (t.timer); var popBuildQueue = null; var cityName = t.getCityNameById(cityId); if (t.popBuildQueue == null) { t.popBuildQueue = new CPopup('pbbuild_' + cityId, 0, 0, 350, 500, true, function() {clearTimeout (t.timer);}); } var m = '<DIV style="max-height:460px; height:460px; overflow-y:auto"><TABLE align=center cellpadding=0 cellspacing=0 width=100% class="pbTabPad" id="pbCityQueueContent">'; t.popBuildQueue.getMainDiv().innerHTML = '</table></div>' + m; t.popBuildQueue.getTopDiv().innerHTML = '<TD width="200px"><B>Build Queue of ' + cityName + '</b></td><TD><INPUT id=pbOptimizeByTime type=submit value="Optimize by Time"></td>'; t.paintBuildQueue(cityId); if (focus) t.popBuildQueue.show(true); document.getElementById('pbOptimizeByTime').addEventListener('click', function(){t.clearBuildQueue();t.paintBuildQueue(cityId, true);}, false); t.timer = setTimeout (function() {t.showBuildQueue(cityId, false)}, 5000); }, paintBuildQueue: function(cityId, optimize){ var t = Tabs.build; var lbQ = t["bQ_" + cityId]; if (optimize == true) { lbQ.sort(function(a,b){return a.buildingTime - b.buildingTime}); } t["bQ_" + cityId] = lbQ; for (var i = 0; i < lbQ.length; i++) { var queueId = i; t._addTab(queueId, lbQ[i].cityId, lbQ[i].buildingType, lbQ[i].buildingTime, lbQ[i].buildingLevel, lbQ[i].buildingAttempts, lbQ[i].buildingMode); } }, clearBuildQueue: function() { var t = Tabs.build; var table = document.getElementById('pbCityQueueContent'); var rows = table.rows; while(rows.length) table.deleteRow(rows.length-1); }, getCurrentCityId: function(){ // TODO maybe move as global function to the core application if (!unsafeWindow.currentcityid) return null; return unsafeWindow.currentcityid; }, saveBuildStates: function(){ var t = Tabs.build; var serverID = getServerId(); GM_setValue('buildStates_' + serverID, JSON2.stringify(t.buildStates)); }, readBuildStates: function(){ var t = Tabs.build; var serverID = getServerId(); s = GM_getValue('buildStates_' + serverID); if (s != null) { states = JSON2.parse(s); for (k in states) t.buildStates[k] = states[k]; } }, toggleStateRunning: function(obj){ var t = Tabs.build; if (t.buildStates.running == true) { t.buildStates.running = false; t.saveBuildStates(); obj.value = "Auto Build = OFF"; } else { t.buildStates.running = true; t.saveBuildStates(); obj.value = "Auto Build = ON"; } }, toggleStateMode: function(obj){ var t = Tabs.build; if (obj.value == 'Build Mode = OFF') { unsafeWindow.Building.buildSlot = t.bot_buildslot; // overwrite original koc function unsafeWindow.Building.buildMenu = t.bot_buildslot; // overwrite original koc function // var guardian = document.getElementById('citymap').getElementsByClassName('bldg_guardian_0'); // if(guardian.length >0) // guardian[0].addEventListener('click', t.bot_buildguardian, false); obj.value = "Build Mode = ON"; } else { unsafeWindow.Building.buildSlot = t.koc_buildslot; // restore original koc function unsafeWindow.Building.buildMenu = t.koc_buildmenu; // restore original koc function // var guardian = document.getElementById('citymap').getElementsByClassName('bldg_guardian_0'); // if(guardian.length >0) // guardian[0].removeEventListener('click', t.bot_buildguardian, false); obj.value = "Build Mode = OFF"; } }, getCityNameById: function (cityId) { return Cities.byID[cityId].name; }, } /*********************************** Info tab ***********************************/ Tabs.Info = { tabOrder : 20, cont : null, // tabDisabled : !ENABLE_INFO, init : function (div){ var t = Tabs.Info; t.cont = div; fortmight = { u52: "1", u53: "1", u54: "1", u55: "1", }; var t = Tabs.Info; rownum = 0; m = '<STYLE>.xtabR {padding-right: 5px; border:none; background:none; white-space:nowrap; text-align:right;}\ .xtabH {background:#ffffe8; border:none; padding-right: 5px; padding-left: 5px; margin-left:10px; text-align:right;}\ .xtabHL { background:#ffffe8; border-width: 1px; border-style: none none none solid; padding-right:5px; padding-left:5px; margin-left:10px; text-align:right;}\ .xtabL { background:none; border-width: 1px; border-style: none none none solid; padding-right:5px; padding-left: 5px; margin-left:10px; text-align:right;}\ .xtabLine { padding:0px; spacing:0px; height:1px; border-color:black; border-width: 1px; border-style: none none solid none }</style>\ <DIV style="overflow-y:auto; overflow-x:hidden"><DIV class=ptStat>UNIT INFORMATION</div><TABLE align=center cellpadding=1 cellspacing=0>\ <TR style="text-align:center"><TD class=xtab></td><TD class=xtabHL colspan=5><B>COST TO BUILD</b></td><TD class=xtabHL colspan=4><B>STATS</b></td><TD class=xtabHL><B>Upkeep</b></td></tr>\ <TR valign=bottom align=right><TD class=xtab></td><TD class=xtabHL>Food</td><TD class=xtabH>Oil</td><TD class=xtabH>Steel</td>\ <TD class=xtabH>Titan</td><TD class=xtabH>Pop</td><TD class=xtabHL>Life</td><TD class=xtabH>Atk</td><TD class=xtabH>Speed</td>\ <TD class=xtabH>Load</td><TD class=xtabHL>Food</td></tr>\ <TR style="height:1px;"><TD style="padding:0px; spacing:0px; height:1px; border-color:black; border-width: 1px; border-style: none none solid none" colspan=11></td></tr>'; for (ui=1; ui<20; ui++){ if (ui==2) ui++ ;// skip unknown troops type if (ui==3) ui++ ;// skip unknown troops type if (ui==14) ui++; // skip unknown troops type if (++rownum % 2) rsty = ''; else rsty = ' style="text-align:right; background: #e8e8e8" '; cost = unsafeWindow.unitcost['unt'+ui]; // 0=NAME, 1=?, 2=Food, 3=Oil, 4=?, 5=Steel, 6=Titan, 10=IdlePop stats = unsafeWindow.unitstats['unt'+ui]; // 0=Life, 1=Attack, 2=?, 3=Speed, 4=?, 5=Load food = unsafeWindow.unitupkeeps[ui]; troopname = unsafeWindow.arStrings.unitName['u'+ui]; m += '<TR '+ rsty +'style="text-align:right;">'; m += '<TD class=xtab><B>'+ troopname +'</b></td><TD class=xtabL>'+ cost[2] +'</td><TD class=xtabR>'+ cost[3] +'</td>\ <TD class=xtabR>'+ cost[5] +'</td><TD class=xtabR>'+ cost[6] +'</td><TD class=xtabR>'+ cost[10] +'</td>\ <TD class=xtabL>'+ stats[0] +'</td><TD class=xtabR>'+ stats[1] +'</td><TD class=xtabR>'+ stats[3] +'</td><TD class=xtabR>'+ stats[5] +'</td><TD class=xtabL>'+ food +'</td>'; m += '</tr>'; } //"Mines",150,760,50,0,0,0,8, // name, food, oil, stone, ?, ?, ?, ?, traintime? //fortstats=[0,1000,0,0,0,1] Life,Atk,Load?,?,?,? m += '<TR class=xtabLine><TD colspan=11 class=xtabLine></td></tr>'; for (k in unsafeWindow.fortcost){ if (++rownum % 2) rsty = ''; else rsty = ' style="background: #e8e8e8" '; cost = unsafeWindow.fortcost[k]; // NAME, Food, Wood, Stone, Ore, ?, IdlePop, Time fi = k.substring(3); stats = unsafeWindow.fortstats['unt'+fi]; // Life, Attack, Defense, Speed, Range, Load food = 0; might = fortmight['u'+fi]; name = cost[0].replace ('Defensive',''); // name = name.replace ('Wall-Mounted',''); m += '<TR '+ rsty +'align=right><TD align=left class=xtab><B>'+ name +'</b></td><TD class=xtabL>'+ cost[1] +'</td><TD class=xtab>'+ cost[2] +'</td>\ <TD class=xtabR>'+ cost[3] +'</td><TD class=xtabR>'+ cost[4] +'</td><TD class=xtabR>'+ cost[6] +'</td>\ <TD class=xtabL>'+ stats[0] +'</td><TD class=xtabR>'+ stats[1] +'</td><TD class=xtabR>'+ stats[2] +'</td><TD class=xtabR>'+ stats[3] +'</td>\ <TD class=xtabL>'+ food +'</td></tr>'; } m += '<TR class=xtabLine><TD colspan=11 class=xtabLine></td></tr>'; m += '</table></div><BR>'; m +='<DIV>'; if (DEBUG_BUTTON) m += '<BR><INPUT id=ptButDebug type=submit name="SEED" value="DEBUG">'; t.cont.innerHTML = m +'</div>'; if (DEBUG_BUTTON) document.getElementById('ptButDebug').addEventListener('click', function (){debugWin.doit()}, false); }, hide : function (){ }, show : function (){ }, } function enable1() { ChatPane.setEnable ErrorKiller.setEnable } /*********************************** Options tab ***********************************/ Tabs.Options = { tabOrder : 40, cont : null, init : function (div){ var t = Tabs.Options; t.cont = div; try { m = '<TABLE class=ptTab>\ <TR><TD colspan=2><B>Config:</b></td></tr>\ <TR><TD><INPUT id=ptAllowWinMove type=checkbox /></td><TD>Enable window drag (move window by dragging top bar with mouse)</td></tr>\ <TR><TD><BR> </td></tr>\ <TR><TD colspan=2><B>Enhancements:</b></td></tr>\ <TR><TD><INPUT id=ptgoldenable type=checkbox /></td><TD>Auto collect gold when happiness reaches <INPUT id=ptgoldLimit type=text size=2 maxlength=3 \>%</td></tr>\ <TR><TD><INPUT id=ptoilenable type=checkbox /></td><TD>Auto collect oil</td></tr>\ <TR><TD><INPUT id=ptfoodenable type=checkbox /></td><TD>Auto collect Food</td></tr>\ <TR><TD><INPUT id=ptWHenable type=checkbox /></td><TD>Auto collect WarHeads</td></tr>\ <TR><TD><INPUT id=ptahelpenable type=checkbox /></td><TD>Auto Help Alliance Members(Alliance Chat)</td></tr>'; m += '</table><BR><BR><HR>Note that if a checkbox is greyed out there has probably been a change of KofC\'s code, rendering the option inoperable.'; t.cont.innerHTML = m; t.togOpt ('ptAllowWinMove', 'ptWinDrag', mainPop.setEnableDrag); t.togOpt ('ptgoldenable', 'pbgoldenable', CollectGold.setEnable); t.togOpt ('ptoilenable', 'pboilenable', CollectOil.setEnable); t.togOpt ('ptfoodenable', 'pbfoodenable', CollectFood.setEnable); t.togOpt ('ptWHenable', 'pbWHenable', CollectWH.setEnable); t.togOpt ('ptahelpenable', 'pbahelpenable', enable1); t.changeOpt ('ptgoldLimit', 'pbGoldLimit'); } catch (e) { t.cont.innerHTML = '<PRE>'+ e.name +' : '+ e.message +'</pre>'; } }, hide : function (){ }, show : function (){ }, togOpt : function (checkboxId, optionName, callOnChange){ var t = Tabs.Options; var checkbox = document.getElementById(checkboxId); if (Options[optionName]) checkbox.checked = true; checkbox.addEventListener ('change', eventHandler, false); function eventHandler (){ Options[optionName] = this.checked; saveOptions(); if (callOnChange) callOnChange (this.checked); } }, changeOpt : function (valueId, optionName, callOnChange){ var t = Tabs.Options; var e = document.getElementById(valueId); e.value = Options[optionName]; e.addEventListener ('change', eventHandler, false); function eventHandler (){ Options[optionName] = this.value; saveOptions(); if (callOnChange) callOnChange (this.value); } }, } /*********************************** Chat tab ***********************************/ Tabs.Chat = { tabOrder : 50, cont : null, tabDisabled : !ENABLE_CHAT, init : function (div){ var t = Tabs.Chat; t.cont = div; var m ='<DIV>'; m+=''; t.cont.innerHTML = m +'</div>'; }, hide : function (){ }, show : function (){ }, } /********************************* Search Tab *************************************/ function distance (d, f, c, e) { var a = 750; var g = a / 2; var b = Math.abs(c - d); if (b > g) b = a - b; var h = Math.abs(e - f); if (h > g) h = a - h; return Math.round(100 * Math.sqrt(b * b + h * h)) / 100; }; Tabs.Search = { tabOrder : 10, //tabDisabled : !ENABLE_SEARCH_TAB, //MapAjax : new CMapAjax(), cont:null, init : function (div){ var t = Tabs.Search; var Provinces = {1:{'name':"Tintagel",'x':75,'y':75}, 2:{'name':"Cornwall",'x':225,'y':75}, 3:{'name':"Astolat",'x':375,'y':75}, 4:{'name':"Lyonesse",'x':525,'y':75}, 5:{'name':"Corbenic",'x':675,'y':75}, 6:{'name':"Paimpont",'x':75,'y':225}, 7:{'name':"Cameliard",'x':225,'y':225}, 8:{'name':"Sarras",'x':375,'y':225}, 9:{'name':"Canoel",'x':525,'y':225}, 10:{'name':"Avalon",'x':675,'y':225}, 11:{'name':"Carmathen",'x':75,'y':375}, 12:{'name':"Shallot",'x':225,'y':375}, 13:{'name':"-------",'x':375,'y':375}, 14:{'name':"Cadbury",'x':525,'y':375}, 15:{'name':"Glastonbury",'x':675,'y':375}, 16:{'name':"Camlamn",'x':75,'y':525}, 17:{'name':"Orkney",'x':225,'y':525}, 18:{'name':"Dore",'x':375,'y':525}, 19:{'name':"Logres",'x':525,'y':525}, 20:{'name':"Caerleon",'x':675,'y':525}, 21:{'name':"Parmenie",'x':75,'y':675}, 22:{'name':"Bodmin Moor",'x':225,'y':675}, 23:{'name':"Cellwig",'x':375,'y':675}, 24:{'name':"Listeneise",'x':525,'y':675}, 25:{'name':"Albion",'x':675,'y':675}}; unsafeWindow.PTgotoMap2 = t.gotoMap; unsafeWindow.PTpd = t.clickedPlayerDetail; unsafeWindow.PTpd2 = t.clickedPlayerLeaderboard; unsafeWindow.PCpo2 = t.clickedPlayerCheckOnline; unsafeWindow.PCplo2 = t.clickedPlayerGetLastLogin; t.cont = div; t.cont.innerHTML = '\ <DIV class=ptentry><table><tr><td><TABLE><TR valign=bottom><TD class=xtab width=100 align=right>Search for: </td><TD>\ <SELECT id="srcType">\ <OPTION value=0>Barb Camp</option>\ <OPTION value=1>Wilderness</option>\ <OPTION value=2>Cities</option>\ </select></td></tr>\ </table>\ <DIV id="srcOpts" style="height:100px"></div></td><td style="visibility:hidden"><DIV id=divOutOpts style="background:#e0e0f0; padding:10px ;visibility:hidden"></div></td></tr></table></div>\ <DIV id="srcResults" style="height:470px; max-height:470px;"></div>'; var psearch = document.getElementById ("srcType"); m = '<TABLE><TR valign=middle><TD class=xtab width=100 align=right>Center: X: </td><TD class=xtab>\ <INPUT id=srchX type=text\> Y: <INPUT id=srchY type=text\> '; // m += '<span><select id="ptprovinceXY"><option>--provinces--</option>'; // for (var i in Provinces) { // m += '<option value="'+i+'">'+Provinces[i].name+'</option>'; // } // m += '</select></span>'; m += '</td></tr><TR><TD class=xtab align=right>Max. Distance: </td><TD class=xtab><INPUT id=srcDist size=4 value=10 /> <SPAN id=spInXY></span></td></tr>'; m += '<TR><TD class=xtab></td><TD class=xtab><INPUT id=srcStart type=submit value="Start Search"/></td></tr>'; m += '</table>'; document.getElementById ('srcOpts').innerHTML = m; new CdispCityPicker ('srchdcp', document.getElementById('spInXY'), true, null, 0).bindToXYboxes(document.getElementById ('srchX'), document.getElementById ('srchY')); // document.getElementById ('ptprovinceXY').addEventListener('change', function() { // if (this.value >= 1) { // document.getElementById ('srchX').value = Provinces[this.value].x; // document.getElementById ('srchY').value = Provinces[this.value].y; // document.getElementById ('srcDist').value = 75; // } // }, false); document.getElementById ('srcStart').addEventListener ('click', t.clickedSearch, false); }, //Edit add city search clickedPlayerDetail : function (span, uid){ var t = Tabs.AllianceList; span.onclick = ''; span.innerHTML = "fetching details ..."; t.fetchPlayerInfo (uid, function (r) {t.gotPlayerDetail(r, span)}); }, clickedPlayerLeaderboard : function (span, uid){ var t = Tabs.AllianceList; span.onclick = ''; span.innerHTML = "fetching leaderboard info ..."; t.fetchLeaderboard (uid, function (r) {t.gotPlayerLeaderboard(r, span)}); }, clickedPlayerCheckOnline : function (span, uid){ var s = Tabs.Search; span.onclick = ''; span.innerHTML = "fetching online status ..."; s.fetchPlayerStatus (uid, function (r) {s.gotPlayerStatus(r, span, uid)}); }, fetchPlayerStatus : function (uidArray, notify){ var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams); params.checkArr = uidArray; new MyAjaxRequest(unsafeWindow.g_ajaxpath + "ajax/getOnline.php" + unsafeWindow.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { notify (rslt); }, onFailure: function (rslt) { notify ({errorMsg:'AJAX error'}); }, }); }, clickedPlayerGetLastLogin : function (span, uid){ var t = Tabs.AllianceList; var s = Tabs.Search; span.onclick = ''; span.innerHTML = "fetching login date ..."; t.fetchPlayerLastLogin (uid, function (r) {s.gotPlayerLastLogin(r, span)}); }, gotPlayerLeaderboard : function (rslt, span){ var t = Tabs.AllianceList; if (!rslt.ok){ span.innerHTML = rslt.errorMsg; return; } if (rslt.totalResults == 0){ span.innerHTML = '<B>Leaderboard:</b> Not found! (misted?)'; return; } var p = rslt.results[0]; var an = p.allianceName; if (!an || an=='' || p.officerType==4) an = 'none'; else an += ' ('+ officerId2String(p.officerType) +')'; m = '<TABLE cellspacing=0 class=ptTab><TR><TD><B>Leaderboard: </b></td><TD colspan=2> Might: '+ p.might +' Alliance: '+ an +'</td></tr>'; for (var i=0; i<p.cities.length; i++){ var c = p.cities[i]; m += '<TR><TD align=right><B>City #'+ (i+1) +':</b></td><TD> '+ c.cityName +' '+coordLink (c.xCoord, c.yCoord)+'</td><TD width=75%> level: ' + c.tileLevel +' status: '+ cityStatusString (c.cityStatus) +' created: ' + c.dateCreated.substr(0,10) +'</td></tr>'; } span.innerHTML = m + '</table>'; }, gotPlayerDetail : function (rslt, span){ var t = Tabs.AllianceList; if (!rslt.ok){ span.innerHTML = rslt.errorMsg; return; } var u = rslt.userInfo[0]; var a = 'None'; if (u.allianceName) a = u.allianceName +' ('+ getDiplomacy(u.allianceId) + ')'; var m = '<TABLE cellspacing=0 class=ptTab><TR><TD><B>Details:</b> </td><TD>Alliance: '+ a +' Cities: ' + u.cities +' Population: '+ u.population +'</td></tr><TR><TD></td><TD>Provinces: '; var pids = u.provinceIds.split (','); var p = []; for (var i=0; i<pids.length; i++) p.push(unsafeWindow.provincenames['p'+pids[i]]); span.innerHTML = m + p.join (', ') +'</td></tr></table>'; }, gotPlayerStatus : function (rslt, span,uid){ var t = Tabs.AllianceList; if (!rslt.ok){ span.innerHTML = rslt.errorMsg; return; } var p = rslt.data; if (p[uid] == true) { m = '<span style="color:green"><b>online!</b></span>'; } else { m = '<span style="color:red"><b>may not be online</b></span>'; } span.innerHTML = m + ''; }, gotPlayerLastLogin : function (rslt, span){ var t = Tabs.AllianceList; if (!rslt.ok){ span.innerHTML = rslt.errorMsg; return; } var p = rslt.playerInfo; var lastLogin = rslt.playerInfo.lastLogin; if (lastLogin) { m = '<span style="color:black">Last login: '+lastLogin+'</span>'; } else { m = '<span style="color:red">No login date found: '+lastLogin+'</span>'; } span.innerHTML = m + ''; }, //End edit city search hide : function (){ }, show : function (cont){ }, opt : {}, searchRunning : false, tilesSearched : 0, tilesFound : 0, curX : 0, curY : 0, lastX : 0, firstX : 0, firstY : 0, lastY : 0, normalizeCoord : function (x){ if ( x >= 800) x -= 800; else if (x < 0) x += 800; return parseInt (x/5) * 5; }, clickedSearch : function (){ var t = Tabs.Search; if (t.searchRunning){ t.stopSearch ('SEARCH CANCELLED!'); return; } t.opt.searchType = document.getElementById ('srcType').value; t.opt.startX = parseInt(document.getElementById ('srchX').value); t.opt.startY = parseInt(document.getElementById ('srchY').value); t.opt.maxDistance = parseInt(document.getElementById ('srcDist').value); errMsg = ''; if (isNaN (t.opt.startX) ||t.opt.startX<0 || t.opt.startX>749) errMsg = "X must be between 0 and 749<BR>"; if (isNaN (t.opt.startY) ||t.opt.startY<0 || t.opt.startY>749) errMsg += "Y must be between 0 and 749<BR>"; if (isNaN (t.opt.maxDistance) ||t.opt.maxDistance<1 || t.opt.maxDistance>100) errMsg += "Max Distance must be between 1 and 100<BR>"; if (errMsg != ''){ document.getElementById('srcResults').innerHTML = '<FONT COLOR=#660000>ERROR:</font><BR><BR>'+ errMsg; return; } t.searchRunning = true; document.getElementById ('srcStart').value = 'Stop Search'; m = '<DIV class=ptstat><TABLE width=100% cellspacing=0><TR><TD class=xtab width=125><DIV id=statSearched></div></td>\ <TD class=xtab align=center><SPAN id=statStatus></span></td>\ <TD class=xtab align=right width=125><DIV id=statFound></div></td></tr></table></div>\ <TABLE width=100%><TR><TD><DIV id=divOutTab style="width:100%; height:470px; max-height:470px; overflow-y:auto;"></div></td></tr></table>'; document.getElementById('srcResults').innerHTML = m; if (t.opt.searchType == 0) typeName = 'Barbarians'; else if (t.opt.searchType == 1) typeName = 'Wildernesses'; else typeName = 'Cities'; m = '<CENTER><B>Search for '+ typeName +'<BR>\ Center: '+ t.opt.startX +','+ t.opt.startY +' Distance: '+ t.opt.maxDistance +'<BR></center>\ <DIV class=ptentry><TABLE cellspacing=0 width=100%><TR align=center><TD class=xtab colspan=10><B>LIST OPTIONS:</b><BR></td></tr>'; if (t.opt.searchType == 1 || t.opt.searchType == 0) { m += '<TR><TD class=xtab align=right>Min. level to show:</td><TD class=xtab> <INPUT id=filMinLvl size=2 value='+ Options.srcMinLevel +' /></td></tr>\ <TR><TD class=xtab align=right>Max. level to show:</td><TD class=xtab> <INPUT id=filMaxLvl size=2 value='+ Options.srcMaxLevel +' /></td></tr>'; } if (t.opt.searchType == 1){ m += '<TR><TD class=xtab align=right>Wilderness Type:</td><TD class=xtab><SELECT id=filWildType>'; m += htmlOptions ( {1:'Glassland/Lake', 3:'Woodlands', 4:'Hills', 5:'Mountain', 6:'Plain', 0:'ALL', 20:'Special'}, Options.wildType ); m += '</select></td></tr><TR><TD class=xtab align=right>Unowned Only:</td>\ <TD class=xtab><INPUT id=filUnowned type=CHECKBOX '+ (Options.unownedOnly?' CHECKED':'') +'\><td></tr>'; } if (t.opt.searchType == 1 || t.opt.searchType == 0) { m += '<TR><TD class=xtab align=right>Sort By:</td><TD class=xtab><SELECT id=filSortBy>\ <OPTION value="level" '+ (Options.srcSortBy=='level'?'SELECTED':'') +'>Level</option>\ <OPTION value="dist" '+ (Options.srcSortBy=='dist'?'SELECTED':'') +'>Distance</option>'; if(t.opt.searchType == 1){ m+= '<OPTION value="might" '+ (Options.srcSortBy=='might'?'SELECTED':'') +'>Might</option>';} m += '</select></td></tr>\ <TR><TD class=xtab align=right>Show coordinates only:</td><TD class=xtab><INPUT type=checkbox id=coordsOnly \></td></tr>\ </table></div><BR><SPAN id=srchSizeWarn></span>'; } else { m += '<TR><TD class=xtab align=right>City Type:</td><TD class=xtab><SELECT id=filCities>'; m += htmlOptions ( {1:'All', 2:'Allies', 3:'Friendly', 4:'Hostile', 5:'Neutral', 6:'Unallianced', 7:'Misted'}, Options.cityType ); m += '</select></td></tr>'; m += '<TR><TD class=xtab align=right>Sort By:</td><TD class=xtab><SELECT id=filSortBy>\ <OPTION value="might" '+ (Options.srcSortBy=='might'?'SELECTED':'') +'>Might</option>\ <OPTION value="dist" '+ (Options.srcSortBy=='dist'?'SELECTED':'') +'>Distance</option>\ </select></td></tr>\ <TR><TD class=xtab align=right>Min might to show:</td><TD class=xtab><INPUT type=text id=minMight value='+Options.MightSrc+' size=3 \></td></tr>\ <TR><TD class=xtab align=right>Show coordinates only:</td><TD class=xtab><INPUT type=checkbox id=coordsOnly \></td></tr>\ </table></div><BR><SPAN id=srchSizeWarn></span>'; } document.getElementById ('divOutOpts').style.visibility = 'visible'; document.getElementById('divOutOpts').innerHTML = m; if (t.opt.searchType == 1 || t.opt.searchType == 0) { document.getElementById('filMinLvl').addEventListener ('change', function (){ Options.srcMinLevel = document.getElementById('filMinLvl').value; saveOptions(); t.dispMapTable (); }, false); document.getElementById('filMaxLvl').addEventListener ('change', function (){ Options.srcMaxLevel = document.getElementById('filMaxLvl').value; saveOptions(); t.dispMapTable (); }, false); } document.getElementById('filSortBy').addEventListener ('change', function (){ Options.srcSortBy = document.getElementById('filSortBy').value; saveOptions(); t.dispMapTable (); }, false); document.getElementById('coordsOnly').addEventListener ('change', function (){ t.dispMapTable (); }, false); if (t.opt.searchType == 1){ document.getElementById('filWildType').addEventListener ('change', function (){ Options.wildType = document.getElementById('filWildType').value; saveOptions(); t.dispMapTable (); }, false); document.getElementById('filUnowned').addEventListener ('change', function (){ Options.unownedOnly = (document.getElementById('filUnowned').checked); saveOptions(); t.dispMapTable (); }, false); } if (t.opt.searchType == 2){ document.getElementById('filCities').addEventListener ('change', function (){ Options.cityType = document.getElementById('filCities').value saveOptions(); t.dispMapTable (); },false); document.getElementById('minMight').addEventListener ('change', function (){ Options.MightSrc = document.getElementById('minMight').value saveOptions(); t.dispMapTable (); },false); } t.mapDat = []; t.firstX = t.opt.startX - t.opt.maxDistance; t.lastX = t.opt.startX + t.opt.maxDistance; t.firstY = t.opt.startY - t.opt.maxDistance; t.lastY = t.opt.startY + t.opt.maxDistance; t.tilesSearched = 0; t.tilesFound = 0; t.curX = t.firstX; t.curY = t.firstY; var xxx = t.normalizeCoord(t.curX); var yyy = t.normalizeCoord(t.curY); document.getElementById ('statStatus').innerHTML = 'Searching at '+ xxx +','+ yyy; if (DEBUG_TRACE) logit (" 0 clickedSearch()... setTimeout ..:" + xxx +' , '+ yyy +' , '+ t.mapCallback.name); setTimeout (function(){Map.request (xxx, yyy, 15, t.mapCallback)}, MAP_DELAY); }, dispMapTable : function (){ var tileNames = ['Barb Camp', 'Grassland', 'Lake', 'Woodlands', 'Hills', 'Mountain', 'Plain', 'City' ]; var t = Tabs.Search; var coordsOnly = document.getElementById('coordsOnly').checked; if (DEBUG_TRACE) DebugTimer.start(); function mySort(a, b){ if (Options.srcSortBy == 'level'){ if ((x = a[4] - b[4]) != 0) return x; } if (Options.srcSortBy == 'might'){ if(b[10] == null) b[10] = 0; if(a[10] == null) a[10] = 0; if ((x = b[10] - a[10]) != 0) return x; } return a[2] - b[2]; } dat = []; for (i=0; i<t.mapDat.length; i++){ lvl = parseInt (t.mapDat[i][4]); type = t.mapDat[i][3]; if (t.opt.searchType == 2 && type == 7 ) { if (!(Options.cityType == 2) || t.mapDat[i][12] == 'ally') if (!(Options.cityType == 3) || t.mapDat[i][12] == 'friendly') if (!(Options.cityType == 4) || t.mapDat[i][12] == 'hostile') if (!(Options.cityType == 5) || t.mapDat[i][12] == 'neutral') if (!(Options.cityType == 6) || t.mapDat[i][12] == 'unaligned') if (!(Options.cityType == 7) || t.mapDat[i][5]===true) if ((t.mapDat[i][10] > parseInt(Options.MightSrc)) || t.mapDat[i][5]===true) dat.push(t.mapDat[i]); } else { if (lvl>=Options.srcMinLevel && lvl<=Options.srcMaxLevel){ if (t.opt.searchType==0 || Options.wildType==0 || (Options.wildType==1 && (type==1 || type==2)) || (Options.wildType == type)) if (!Options.unownedOnly || t.mapDat[i][5]===false) dat.push (t.mapDat[i]); } } } if (DEBUG_TRACE) DebugTimer.display('SEACHdraw: FILTER'); document.getElementById('statFound').innerHTML = 'Found: '+ dat.length; if (dat.length == 0){ m = '<BR><CENTER>None found</center>'; } else { dat.sort(mySort); if (DEBUG_TRACE) DebugTimer.display('SEACHdraw: SORT'); if (coordsOnly) m = '<TABLE align=center id=srcOutTab cellpadding=2 cellspacing=2><TR style="font-weight: bold"><TD>Location</td></tr>'; else { if (t.opt.searchType == 2) { m = '<TABLE id=srcOutTab cellpadding=2 cellspacing=2><TR style="font-weight: bold"><TD>Location</td><TD >Dist</td><TD>City</td><TD>Owner</td><TD>Might</td><td>Alliance</td><TD width=80% style="font-size:9px;">More info</td><TD style="padding-left: 10px;"></td></tr>'; } else { if(Options.unownedOnly || t.opt.searchType == 0){ m = '<TABLE id=srcOutTab cellpadding=2 cellspacing=2><TR style="font-weight: bold"><TD>Location</td><TD style="padding-left: 10px">Dist</td><TD style="padding-left: 10px;">Lvl</td><TD width=80%> Type</td><TD style=""></td></tr>'; } else { m = '<TABLE id=srcOutTab cellpadding=2 cellspacing=2><TR style="font-weight: bold"><TD>Location</td><TD style="padding-left: 10px">Dist</td><TD style="padding-left: 10px;">Lvl</td><TD>Type</td><TD>Owner</td><TD>Might</td><TD>Alliance</td><TD width=80% style="font-size:9px;">More info</td></tr>'; } } } var numRows = dat.length; if (numRows > 500 && t.searchRunning){ numRows = 500; document.getElementById('srchSizeWarn').innerHTML = '<FONT COLOR=#600000>NOTE: Table only shows 500 of '+ dat.length +' results until search is complete.</font>'; } for (i=0; i<numRows; i++){ m += '<TR valign="top"'; if (dat[i][12]) m += 'class="pt'+dat[i][12]+'"'; m += ' ><TD><DIV onclick="ptGotoMapHide('+ dat[i][0] +','+ dat[i][1] +')"><A>'+ dat[i][0] +','+ dat[i][1] +'</a></div></td>'; if (coordsOnly) m += '</tr>'; else if (t.opt.searchType == 2) { m += '<TD align="left" valign="top">'+ dat[i][2].toFixed(2) +' </td><TD align=left>'+ dat[i][8] +'</td><TD valign="top">'+dat[i][9]+'</td><TD valign="top">'+dat[i][10]+'</td><td>'+dat[i][11]+'</td><td>'; if (dat[i][5]) { m += '<DIV onclick="PTscout('+ dat[i][0] +','+ dat[i][1] +');return false;"><A style="font-size:9px;" >Scout</a></div>'; } else m += '<DIV onclick="PTpd(this, '+ dat[i][7] +')"><A style="font-size:9px;" >Details</a></div>\ <DIV style="" onclick="PTpd2(this, '+ dat[i][7] +')"><A style="font-size:9px;">Leaderboard</a></div>\ <DIV style="" onclick="PCpo2(this, '+ dat[i][7] +')"><A style="font-size:9px;">Onlinestatus</a></div>\ <DIV style="" onclick="PCplo2(this, '+ dat[i][7] +')"><A style="font-size:9px;">Last Login</a></div>'; m+= '</td><TD valign="top">'+ (dat[i][5]?' Misted':'') +'</td></tr>'; } else { if(!dat[i][5] || t.opt.searchType == 0){ m += '<TD align="left" valign="top">'+ dat[i][2].toFixed(2) +' </td><TD align=left valign="top">'+ dat[i][4] +'</td><TD align="left" valign="top">'+ tileNames[dat[i][3]]+'</td><TD colspan=4>'+ (dat[i][5]?' OWNED':'') +'</td></tr>'; } else { m += '<TD align="left" valign="top">'+ dat[i][2].toFixed(2) +' </td><TD align=left valign="top">'+ dat[i][4] +'</td><TD align="left" valign="top">'+ tileNames[dat[i][3]]+'</td><TD valign="top">'+ dat[i][9] +'</td><TD valign="top">'+dat[i][10]+'</td><TD valign="top">'+dat[i][11]+'</td><td>'; if (dat[i][6]) { m += '<DIV onclick="PTscout('+ dat[i][0] +','+ dat[i][1] +');return false;"><A style="font-size:9px;" >Scout</a></div>'; } else { m += '<DIV onclick="PTpd(this, '+ dat[i][8] +')"><A style="font-size:9px;" >Details</a></div>\ <DIV style="" onclick="PTpd2(this, '+ dat[i][8] +')"><A style="font-size:9px;">Leaderboard</a></div>\ <DIV style="" onclick="PCpo2(this, '+ dat[i][8] +')"><A style="font-size:9px;">Onlinestatus</a></div>\ <DIV style="" onclick="PCplo2(this, '+ dat[i][8] +')"><A style="font-size:9px;">Last Login</a></div>'; } m += '</td></tr>'; } } } m += '</table>'; } document.getElementById('divOutTab').innerHTML = m; dat = null; if (DEBUG_TRACE) DebugTimer.display('SEACHdraw: DRAW'); }, mapDat : [], gotoMap : function (e){ coords = e.children[0].innerHTML.split(','); hideMe (); document.getElementById('mapXCoor').value = coords[0]; document.getElementById('mapYCoor').value = coords[1]; unsafeWindow.reCenterMapWithCoor(); unsafeWindow.changeview_map(document.getElementById('mod_views_map')); }, stopSearch : function (msg){ var t = Tabs.Search; document.getElementById ('statStatus').innerHTML = '<FONT color=#ffaaaa>'+ msg +'</font>'; document.getElementById ('srcStart').value = 'Start Search'; document.getElementById('srchSizeWarn').innerHTML = ''; t.searchRunning = false; }, /** mapdata.userInfo: (object) u4127810 = [object Object] (string) n = George2gh02 (name) (string) t = 1 (title code) (string) m = 55 (might) (string) s = M (sex) (string) w = 2 (mode: 1=normal, 2=begprotect, 3=truce, 4=vacation ) (string) a = 0 (alliance) (string) i = 1 (avatar code) *****/ mapCallback : function (left, top, width, rslt){ function insertRow (x, y, msg){ row = document.getElementById('srcOutTab').insertRow(-1); row.insertCell(0).innerHTML = x +','+ y; row.insertCell(1).innerHTML = distance (t.opt.startX, t.opt.startY, x, y); row.insertCell(2).innerHTML = msg; } if (DEBUG_TRACE) logit (" 3 mapCallback()"); var t = Tabs.Search; if (!t.searchRunning) return; if (!rslt.ok){ t.stopSearch ('ERROR: '+ rslt.errorMsg); return; } map = rslt.data; var userInfo = rslt.userInfo; var alliance = rslt.allianceNames; for (k in map){ if (t.opt.searchType==0 && map[k].tileType==51 && !map[k].tileCityId ) { // if barb type = 0; } else if (t.opt.searchType==1 && ((map[k].tileType>=10 && map[k].tileType<=50) || map[k].tileType>200) ) { if (map[k].tileType == 10) type = 1; else if (map[k].tileType == 11 || map[k].tileType == 12) type = 2; else if (map[k].tileType > 200) type = 20; else type = (map[k].tileType/10) + 1; } else if (t.opt.searchType==2 && map[k].tileCityId >= 0 && map[k].tileType > 50 && map[k].cityName) type = 7; else continue; dist = distance (t.opt.startX, t.opt.startY, map[k].xCoord, map[k].yCoord); if (dist <= t.opt.maxDistance){ if (t.opt.searchType==2) { var isMisted = map[k].tileUserId == 0 || false; var uu = 'u'+map[k].tileUserId; var aU = 'unknown'; var aD = 'unknown'; var mightU = 0; var nameU = 'unknown'; if (isMisted) { nameU = 'In mist'; mightU = ''; } else { if (userInfo[uu] ) { // Corrects a problem with hung search. nameU = userInfo[uu].n; mightU = userInfo[uu].m; aD = getDiplomacy(userInfo[uu].a); if ( alliance && alliance['a'+userInfo[uu].a] ) { aU = alliance['a'+userInfo[uu].a]; } else { aU = '----'; aD = 'unaligned'; } } } t.mapDat.push ([map[k].xCoord, map[k].yCoord, dist, type, map[k].tileLevel, isMisted, map[k].tileCityId, map[k].tileUserId, map[k].cityName,nameU,mightU,aU,aD ]); } else { isOwned = map[k].tileUserId>0 || map[k].misted; if(!isOwned){ t.mapDat.push ([map[k].xCoord, map[k].yCoord, dist, type, map[k].tileLevel, isOwned]); } else { var isMisted = map[k].tileUserId == 0 || false; var uu = 'u'+map[k].tileUserId; var aU = 'unknown'; var aD = 'unknown'; var mightU = 0; var nameU = 'unknown'; if (isMisted) { nameU = 'In mist'; mightU = ''; } else { if (userInfo[uu] ) { // Corrects a problem with hung search. nameU = userInfo[uu].n; mightU = userInfo[uu].m; aD = getDiplomacy(userInfo[uu].a); if ( alliance && alliance['a'+userInfo[uu].a] ) { aU = alliance['a'+userInfo[uu].a]; } else { aU = '----'; aD = 'unaligned'; } } } t.mapDat.push ([map[k].xCoord, map[k].yCoord, dist, type, map[k].tileLevel, isOwned, isMisted, map[k].tileCityId, map[k].tileUserId, nameU, mightU, aU, aD]); } } ++t.tilesFound; } } t.tilesSearched += (15*15); document.getElementById('statSearched').innerHTML = 'Searched: '+ t.tilesSearched; t.dispMapTable(); t.curX += 15; if (t.curX > t.lastX){ t.curX = t.firstX; t.curY += 15; if (t.curY > t.lastY){ t.stopSearch ('Done!'); return; } } var x = t.normalizeCoord(t.curX); var y = t.normalizeCoord(t.curY); document.getElementById ('statStatus').innerHTML = 'Searching at '+ x +','+ y; if (DEBUG_TRACE) logit (" 0 mapCallback()... setTimeout ..:" + x +' , '+ y +' , '+ t.mapCallback.toString().substr (0,50)); setTimeout (function(){Map.request (x, y, 15, t.mapCallback)}, MAP_DELAY); }, }; /******************* KOC Map interface ****************/ Map = { /*** 0: bog 10: grassland 11: lake 20: woods 30: hills 40: mountain 50: plain 51: city / barb 53: misted city ***/ generateBlockList : function(left, top, width) { var width5 = parseInt(width / 5); var bl = []; for (x=0; x<width5; x++){ xx = left + (x*5); if (xx > 795) xx -= 800; for (y=0; y<width5; y++){ yy = top + (y*5); if (yy > 795) yy -= 800; bl.push ('bl_'+ xx +'_bt_'+ yy); } } return bl.join(","); }, callback : null, request : function (left, top, width, cb) { if (DEBUG_TRACE) logit (" 1 Map.request(): "+ left +' , '+ top +' , '+ width); left = parseInt(left / 5) * 5; top = parseInt(top / 5) * 5; width = parseInt((width+4) / 5) * 5; var blockString = this.generateBlockList(left, top, width); Map.callback = cb; if (unsafeWindow.SANDBOX) return RequestMAPTEST(left, top, width, callback); var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams); params.blocks = blockString; new MyAjaxRequest(unsafeWindow.g_ajaxpath + "fetchMapTiles.php" + unsafeWindow.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (DEBUG_TRACE) logit (" 2 Map.request Map = "+ inspect (Map, 2, 1, 2)); Map.callback(left, top, width, rslt); }, onFailure: function (rslt) { Map.callback(left, top, width, rslt); } }); }, }; /************************ error Killer ************************/ var ErrorKiller = { saveFunc : null, init : function (tf){ if (firefoxVersion.substring(0,4) == '4.0b') // bug in firefox 4.0b10 causes syntax error with: "var func = eval ('function (){}');" return; ErrorKiller.saveFunc = unsafeWindow.Modal.showModalUEP; ErrorKiller.setEnable (tf); }, setEnable : function (tf){ unsafeWindow.Modal.showModal525 = eval ('function (a,b,c) {actionLog ("Blocked error popup");}'); }, } /*******************Chat Pane*****************/ var ChatPane = { init : function(){ var t = ChatPane; setInterval(t.HandleChatPane, 2500); }, HandleChatPane : function() { var DisplayName = GetDisplayName(); var AllianceChatBox=document.getElementById('mod_comm_list2'); var GlobalChatBox=document.getElementById('mod_comm_list1'); if(AllianceChatBox){ var chatPosts = document.evaluate(".//div[contains(@class,'chatwrap')]", AllianceChatBox, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(chatPosts){ for (var i = 0; i < chatPosts.snapshotLength; i++) { thisPost = chatPosts.snapshotItem(i); var postAuthor = document.evaluate('.//*[@class="nm"]', thisPost, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(postAuthor.snapshotItem(0)){ var postAuthorName = postAuthor.snapshotItem(0).innerHTML; if(postAuthorName != DisplayName){ var helpAllianceLinks1=document.evaluate("//*[contains(@onclick,'Building.helpBuild')]", thisPost, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); var helpAllianceLinks2=document.evaluate("//*[contains(@onclick,'Research.helpResearch')]", thisPost, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(helpAllianceLinks1){ for (var j = 0; j < helpAllianceLinks1.snapshotLength; j++) { thisLink = helpAllianceLinks1.snapshotItem(j); var alreadyClicked = thisLink.getAttribute("clicked"); if(!alreadyClicked){ thisLink.setAttribute('clicked', 'true'); var myregexp = /(Building.helpBuild\(.*\);)/; var match = myregexp.exec(thisLink.getAttribute("onclick")); if (match != null) { onclickCode = match[0]; if(true){ DoUnsafeWindow(onclickCode); } } } } } if(helpAllianceLinks2){ for (var j = 0; j < helpAllianceLinks2.snapshotLength; j++) { thisLink = helpAllianceLinks2.snapshotItem(j); var alreadyClicked = thisLink.getAttribute("clicked"); if(!alreadyClicked){ thisLink.setAttribute('clicked', 'true'); var myregexp = /(Research.helpResearch\(.*\);)/; var match = myregexp.exec(thisLink.getAttribute("onclick")); if (match != null) { onclickCode = match[0]; if(true){ DoUnsafeWindow(onclickCode); } } } } } } } // Hide alliance requests in chat var helpAllianceLinks=document.evaluate(".//a[contains(@onclick,'Building.helpBuild')]", thisPost, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(helpAllianceLinks){ for (var j = 0; j < helpAllianceLinks.snapshotLength; j++) { thisLink = helpAllianceLinks.snapshotItem(j); thisLink.parentNode.parentNode.parentNode.parentNode.parentNode.removeChild(thisLink.parentNode.parentNode.parentNode.parentNode); } } var helpAllianceLinks2=document.evaluate(".//a[contains(@onclick,'Research.helpResearch')]", thisPost, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null ); if(helpAllianceLinks2){ for (var j = 0; j < helpAllianceLinks2.snapshotLength; j++) { thisLink = helpAllianceLinks2.snapshotItem(j); thisLink.parentNode.parentNode.parentNode.parentNode.parentNode.removeChild(thisLink.parentNode.parentNode.parentNode.parentNode); } } } } } }, } /************************ War Head Collector ************************/ var CollectWH = { timer : null, lastCollect : {}, init : function (){ var t = CollectWH; t.lastCollect['c'+ Cities.cities[3].id] = 0; t.setEnable (Options.pbWHenable); }, setEnable : function (tf){ var t = CollectWH; clearTimeout (t.timer); if (tf) t.tick(); }, colCityName : null, colHappy : 0, tick : function (){ var t = CollectWH; if(!Cities.cities[3]) return; var city = Cities.cities[3]; var since = unixTime() - t.lastCollect['c'+city.id]; if (since>6*60*60){ t.lastCollect['c'+city.id] = unixTime(); t.colCityName = city.name; t.ajaxCollectWH (city, t.e_ajaxDone); } t.timer = setTimeout (t.tick, 15000); }, e_ajaxDone : function (rslt){ var t = CollectWH; if (rslt.ok) logit ('Collected '+ rslt.gained.resource2 +' War Heads '+ t.colCityName, true); else logit ('Error collecting War Heads for '+ t.colCityName +': <SPAN class=boldRed>'+ unsafeWindow.ERROR_CODE[rslt.error_code] +'</span>', true); }, ajaxCollectWH : function (city, notify){ var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams); params.cid = city.id; params.eventid = 1; new MyAjaxRequest(unsafeWindow.g_ajaxpath + "warheadFactoryEvent.php" + unsafeWindow.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (notify) notify (rslt); }, onFailure: function (rslt) { if (notify) notify (rslt); } }); }, } /************************ Food Collector ************************/ var CollectFood = { timer : null, lastCollect : {}, init : function (){ var t = CollectFood; t.lastCollect['c'+ Cities.cities[2].id] = 0; t.setEnable (Options.pbfoodenable); }, setEnable : function (tf){ var t = CollectFood; clearTimeout (t.timer); if (tf) t.tick(); }, colCityName : null, colHappy : 0, tick : function (){ var t = CollectFood; if(!Cities.cities[2]) return; var city = Cities.cities[2]; var since = unixTime() - t.lastCollect['c'+city.id]; if (since>15*60){ t.lastCollect['c'+city.id] = unixTime(); t.colCityName = city.name; t.ajaxCollectFood (city, t.e_ajaxDone); } t.timer = setTimeout (t.tick, 15000); }, e_ajaxDone : function (rslt){ var t = CollectFood; if (rslt.ok) logit ('Collected '+ rslt.gained.resource2 +' Food for '+ t.colCityName, true); else logit ('Error collecting Food for '+ t.colCityName +': <SPAN class=boldRed>'+ unsafeWindow.ERROR_CODE[rslt.error_code] +'</span>', true); }, ajaxCollectFood : function (city, notify){ var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams); params.cid = city.id; params.eventid = 1; new MyAjaxRequest(unsafeWindow.g_ajaxpath + "greenhouseEvent.php" + unsafeWindow.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (notify) notify (rslt); }, onFailure: function (rslt) { if (notify) notify (rslt); } }); }, } /************************ Gold Collector ************************/ var CollectGold = { timer : null, lastCollect : {}, init : function (){ var t = CollectGold; for (var c=0; c<Cities.numCities; c++) t.lastCollect['c'+ Cities.cities[c].id] = 0; t.setEnable (Options.pbgoldenable); }, setEnable : function (tf){ var t = CollectGold; clearTimeout (t.timer); if (tf) t.tick(); }, colCityName : null, colHappy : 0, tick : function (){ var t = CollectGold; for (var c=0; c<Cities.numCities; c++){ var city = Cities.cities[c]; var happy = Seed.citystats['city'+ city.id].pop[2]; var since = unixTime() - t.lastCollect['c'+city.id]; if (happy>=Options.pbGoldLimit && since>15*60){ t.lastCollect['c'+city.id] = unixTime(); t.colCityName = city.name; t.colHappy = happy; t.ajaxCollectGold (city, t.e_ajaxDone); break; } } t.timer = setTimeout (t.tick, 15000); }, e_ajaxDone : function (rslt){ var t = CollectGold; if (rslt.ok) logit ('Collected '+ rslt.gained.gold +' gold for '+ t.colCityName +' (happiness was '+ t.colHappy +')', true); else logit ('Error collecting gold for '+ t.colCityName +': <SPAN class=boldRed>'+ unsafeWindow.ERROR_CODE[rslt.error_code] +'</span>', true); }, ajaxCollectGold : function (city, notify){ var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams); params.cid = city.id; params.eventid = 1; new MyAjaxRequest(unsafeWindow.g_ajaxpath + "coliseumEvent.php" + unsafeWindow.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (notify) notify (rslt); }, onFailure: function (rslt) { if (notify) notify (rslt); } }); }, } /************************ Oil Collector ************************/ var CollectOil = { timer : null, lastCollect : {}, init : function (){ var t = CollectOil; t.lastCollect['c'+ Cities.cities[1].id] = 0; t.setEnable (Options.pboilenable); }, setEnable : function (tf){ var t = CollectOil; clearTimeout (t.timer); if (tf) t.tick(); }, colCityName : null, colHappy : 0, tick : function (){ var t = CollectOil; if(!Cities.cities[1]) return; var city = Cities.cities[1]; var since = unixTime() - t.lastCollect['c'+city.id]; if (since>24*60*60){ t.lastCollect['c'+city.id] = unixTime(); t.colCityName = city.name; t.ajaxCollectOil (city, t.e_ajaxDone); } t.timer = setTimeout (t.tick, 1*60*60*1000); }, e_ajaxDone : function (rslt){ var t = CollectOil; if (rslt.ok) logit ('Collected '+ rslt.gained.resource2 +' oil for '+ t.colCityName, true); else logit ('Error collecting oil for '+ t.colCityName +': <SPAN class=boldRed>'+ unsafeWindow.ERROR_CODE[rslt.error_code] +'</span>', true); }, ajaxCollectOil : function (city, notify){ var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams); params.cid = city.id; params.eventid = 1; new MyAjaxRequest(unsafeWindow.g_ajaxpath + "petroleumLabEvent.php" + unsafeWindow.g_ajaxsuffix, { method: "post", parameters: params, onSuccess: function (rslt) { if (notify) notify (rslt); }, onFailure: function (rslt) { if (notify) notify (rslt); } }); }, } /************************ Refresh Every X minutes ************************/ var RefreshEvery = { timer : null, init : function (){ if (Options.pbEveryMins < 1) Options.pbEveryMins = 1; RefreshEvery.setEnable (Options.pbEveryEnable); }, setEnable : function (tf){ var t = RefreshEvery; clearTimeout (t.timer); if (tf) t.timer = setTimeout (t.doit, Options.pbEveryMins*60000); }, doit : function (){ actionLog ('Refreshing ('+ Options.pbEveryMins +' minutes expired)'); reloadKOC(); } } var WideScreen = { chatIsRight : false, useWideMap : false, rail : null, init : function (){ t = WideScreen; if (GlobalOptions.pbWideScreen){ t.rail = searchDOM (document.getElementById('mod_maparea'), 'node.className=="maparea_rrail"', 10); GM_addStyle ('.modalCurtain {width:760px !important} .mod_comm_mmb{z-index:0 !important}'); try { document.getElementById('progressBar').parentNode.removeChild(document.getElementById('progressBar')); document.getElementById('crossPromoBarContainer').parentNode.removeChild(document.getElementById('crossPromoBarContainer')); } catch (e) { } } }, setChatOnRight : function (tf){ t = WideScreen; // if (tf == t.chatIsRight || !GlobalOptions.pbWideScreen) // return; if (tf == t.chatIsRight) return; if (tf){ var chat = document.getElementById('kocmain_bottom').childNodes[2]; GM_log(chat); if (!chat || chat.className!='mod_comm') setTimeout (function (){t.setChatOnRight(tf)}, 1000); // chat.style.top = '-624px'; // chat.style.left = '760px'; // chat.style.height = '720px'; var style = '.mod_comm {top:-624px; left:760px; height:720px; !important}' GM_addStyle(style); document.getElementById('mod_comm_list1').style.height = '580px'; document.getElementById('mod_comm_list2').style.height = '580px'; document.getElementById('koc_chatterbox').style.top = '110px'; document.getElementById('koc_chatterbox').style.left = '775px'; document.getElementById('koc_chatterbox').style.background = 'url("'+ CHAT_BG_IMAGE +'")'; } else { var chat = document.getElementById('kocmain_bottom').childNodes[2]; chat.style.top = '0px'; chat.style.left = '0px'; chat.style.height = ''; chat.style.background = ''; document.getElementById('mod_comm_list1').style.height = '287px'; document.getElementById('mod_comm_list2').style.height = '287px'; } t.chatIsRight = tf; }, useWideMap : function (tf) { t = WideScreen; if (tf == t.useWideMap || !GlobalOptions.pbWideScreen) return; if (tf){ t.rail.style.display = 'none'; document.getElementById('mapwindow').style.height = "436px"; document.getElementById('mapwindow').style.width = "1220px"; document.getElementById('mapwindow').style.zIndex = "50"; } else { t.rail.style.display = 'block'; document.getElementById('mapwindow').style.height = "439px"; document.getElementById('mapwindow').style.width = "760px"; document.getElementById('mapwindow').style.zIndex = ""; } }, } /************ DEBUG WIN *************/ var debugWin = { popDebug : null, dbDefaultNot : 'tech,tutorial,items,quests,wilderness,wildDef,buildings,knights,allianceDiplomacies,appFriends,players', dbSelect : {}, doit : function (){ var t = debugWin; function syncBoxes (){ var div = document.getElementById('dbpoplist'); for (var i=0; i<div.childNodes.length; i++){ if (div.childNodes[i].type && div.childNodes[i].type=='checkbox'){ var name=div.childNodes[i].name.substr(6); div.childNodes[i].checked = t.dbSelect[name]; } } } function clickedAll (){ for (var k in t.dbSelect) t.dbSelect[k] = true; syncBoxes(); } function clickedNone (){ for (var k in t.dbSelect) t.dbSelect[k] = false; syncBoxes(); } function clickedDefaults (){ for (k in t.dbSelect) t.dbSelect[k] = true; var not = t.dbDefaultNot.split(','); for (var i=0; i<not.length; i++) t.dbSelect[not[i]] = false; syncBoxes(); } function clickedShow (){ var now = new Date(); var myseed = unsafeWindow.Object.clone (Seed); var div = document.getElementById('dbpoplist'); for (var i=0; i<div.childNodes.length; i++){ if (div.childNodes[i].type && div.childNodes[i].type=='checkbox'){ var name=div.childNodes[i].name.substr(6); if (!div.childNodes[i].checked) delete myseed[name]; } } WinLog.write ("seed @ "+ unixTime() +" ("+ now +")\n\n"+ inspect (myseed, 8, 1)); myseed=null; } function clickedShowScripts (){ var scripts = document.getElementsByTagName('script'); for (var i=0; i<scripts.length; i++){ if (scripts[i].src!=null && scripts[i].src!='') WinLog.write ('<A style="color:black; text-decoration:underline;" TARGET=_tab HREF="'+ scripts[i].src +'">'+ scripts[i].src +'</a>'); } } if (t.popDebug == null){ t.popDebug = new CPopup ('db', 0, 0, 400,500, true); t.popDebug.getTopDiv().innerHTML = 'DEBUG'; t.popDebug.getMainDiv().innerHTML = '<DIV><INPUT type=submit id=dbsuball value=ALL> <INPUT type=submit id=dbsubnone value=NONE> \ <INPUT type=submit id=dbdefaults value=DEFAULTS> <INPUT type=submit id=dbsubdo value=SHOW> <INPUT type=submit id=dbsubscripts value=SCRIPTS></div>\ <DIV id=dbpoplist style="max-height:400px; height:400px; overflow-y:auto"></div>'; var div = document.getElementById('dbpoplist'); for (var k in Seed) t.dbSelect[k] = true; var not = t.dbDefaultNot.split(','); for (var i=0; i<not.length; i++) t.dbSelect[not[i]] = false; var m = []; for (k in t.dbSelect){ m.push ('<INPUT type=checkbox '); m.push ('name="dbpop_'); m.push (k); m.push ('"> '); m.push (k); m.push ('<BR>'); } div.innerHTML = m.join (''); document.getElementById('dbsuball').addEventListener('click', clickedAll, false); document.getElementById('dbsubnone').addEventListener('click', clickedNone, false); document.getElementById('dbdefaults').addEventListener('click', clickedDefaults, false); document.getElementById('dbsubdo').addEventListener('click', clickedShow, false); document.getElementById('dbsubscripts').addEventListener('click', clickedShowScripts, false); syncBoxes(); } t.popDebug.show (true); }, } function readOptions (){ var serverID = getServerId(); s = GM_getValue ('Options_'+serverID); if (s != null){ opts = JSON2.parse (s); for (k in opts){ if (matTypeof(opts[k]) == 'object') for (kk in opts[k]) Options[k][kk] = opts[k][kk]; else Options[k] = opts[k]; } } } function saveOptions (){ var serverID = getServerId(); setTimeout (function (){GM_setValue ('Options_'+serverID, JSON2.stringify(Options));}, 0); } function onUnload (){ Options.ptWinPos = mainPop.getLocation(); saveOptions(); } /************ LIB classes/functions .... **************/ DebugTimer = { startTime : 0, start : function (){ now = new Date(); DebugTimer.startTime = now.getTime(); }, getMillis : function (){ now = new Date(); return now.getTime() - DebugTimer.startTime; }, display : function (label, noReset){ now = new Date(); elapsed = now.getTime() - DebugTimer.startTime; logit (label +": "+ elapsed/1000); if (noReset===null || !noReset) DebugTimer.startTime = now.getTime(); }, }; function debugPos (e){ return '['+ e.tagName +'] client - offset: '+ e.clientLeft +','+ e.clientTop +','+ e.clientWidth +','+ e.clientHeight +' - '+ e.offsetLeft +','+ e.offsetTop +','+ e.offsetWidth +','+ e.offsetHeight +' '+ e +' --OP--> '+ e.offsetParent; } function CwaitForElement (id, timeout, notify){ this.check = check; this.end = new Date().getTime() + timeout; var t = this; this.check(); function check(){ if (document.getElementById (id)) notify (true); else if (new Date().getTime() > t.end) notify (false); else setTimeout (t.check, 500); } } function clickWin (win,obj,evtName) { var evt = win.document.createEvent("MouseEvents"); evt.initMouseEvent(evtName, true, true, win, 0, 0, 0, 0, 0, false, false, false, false, 0, null); return !obj.dispatchEvent(evt); } function debugElement (e){ var x = unsafeWindow.Object.clone (e.wrappedJSObject); x.innerHTML = ''; x.innerText = ''; x.textContent = ''; return inspect (x, 1, 1); } function getClientCoords(e){ if (e==null) return {x:null, y:null, width:null, height:null}; var x=0, y=0; ret = {x:0, y:0, width:e.clientWidth, height:e.clientHeight}; while (e.offsetParent != null){ ret.x += e.offsetLeft; ret.y += e.offsetTop; e = e.offsetParent; } return ret; } function DOMtree (e, levels){ var m = []; level (e, levels, 0); function level (e, levels, cur){ try { for (var i=0; i<cur; i++) m.push(' '); if (!e.tagName) m.push ('?'); else m.push (e.tagName); if (e.id){ m.push (' id='); m.push (e.id); } if (e.name){ m.push (' name='); m.push (e.name); } if (e.className){ m.push (' class='); m.push (e.className); } if (e.style && e.style.display && e.style.display.indexOf('none')>0) m.push (' hidden'); m.push ('\n'); if (cur < levels){ for (var c=0; c<e.childNodes.length; c++){ level (e.childNodes[c], levels, cur+1); } } } catch (e) { m.push ('UNAVAILBLE!\n'); } } return m.join(''); } function parseIntNan (n){ x = parseInt(n, 10); if (isNaN(x)) return 0; return x; } function parseIntZero (n){ n = n.trim(); if (n == '') return 0; return parseInt(n, 10); } var WinManager = { wins : {}, // prefix : CPopup obj didHide : [], get : function (prefix){ var t = WinManager; return t.wins[prefix]; }, add : function (prefix, pop){ var t = WinManager; t.wins[prefix] = pop; if (unsafeWindow.cpopupWins == null) unsafeWindow.cpopupWins = {}; unsafeWindow.cpopupWins[prefix] = pop; }, hideAll : function (){ var t = WinManager; t.didHide = []; for (k in t.wins){ if (t.wins[k].isShown()){ t.didHide.push (t.wins[k]); t.wins[k].show (false); } } }, restoreAll : function (){ var t = WinManager; for (var i=0; i<t.didHide.length; i++) t.didHide[i].show (true); }, delete : function (prefix){ var t = WinManager; delete t.wins[prefix]; delete unsafeWindow.cpopupWins[prefix]; } } function CPopup (prefix, x, y, width, height, enableDrag, onClose) { var pop = WinManager.get(prefix); if (pop){ pop.show (false); return pop; } this.BASE_ZINDEX = 111111; // protos ... this.show = show; this.toggleHide = toggleHide; this.getTopDiv = getTopDiv; this.getMainDiv = getMainDiv; this.getLayer = getLayer; this.setLayer = setLayer; this.setEnableDrag = setEnableDrag; this.getLocation = getLocation; this.setLocation = setLocation; this.focusMe = focusMe; this.unfocusMe = unfocusMe; this.centerMe = centerMe; this.destroy = destroy; this.autoHeight = autoHeight; // object vars ... this.div = document.createElement('div'); this.prefix = prefix; this.onClose = onClose; var t = this; this.div.className = 'CPopup ptTabs '+ prefix +'_CPopup'; this.div.id = prefix +'_outer'; this.div.style.background = "#fff"; this.div.style.zIndex = this.BASE_ZINDEX // KOC modal is 100210 ? this.div.style.display = 'none'; this.div.style.width = width + 'px'; this.div.style.height = ''; this.div.style.maxHeight = height + 'px'; this.div.style.position = "absolute"; this.div.style.top = y +'px'; this.div.style.left = x + 'px'; if (CPopUpTopClass==null) topClass = 'CPopupTop '+ prefix +'_CPopupTop'; else topClass = CPopUpTopClass +' '+ prefix +'_'+ CPopUpTopClass; var m = '<TABLE cellspacing=0 width=100% height=100%><TR id="'+ prefix +'_bar" class="'+ topClass +'"><TD width=99% valign=bottom><SPAN id="'+ prefix +'_top"></span></td>\ <TD id='+ prefix +'_X align=right valign=middle onmouseover="this.style.cursor=\'pointer\'" style="color:#fff; background:#333; font-weight:bold; font-size:14px; padding:0px 5px">X</td></tr>\ <TR><TD height=100% valign=top class="'+ prefix +'_CPopMain" colspan=2><DIV class="CPopMain '+ prefix +'_CPopMain" id="'+ prefix +'_main"></DIV></td></tr></table>'; document.body.appendChild(this.div); this.div.innerHTML = m; document.getElementById(prefix+'_X').addEventListener ('click', e_XClose, false); this.dragger = new CWinDrag (document.getElementById(prefix+'_bar'), this.div, enableDrag); this.div.addEventListener ('mousedown', e_divClicked, false); WinManager.add(prefix, this); function e_divClicked (){ t.focusMe(); } function e_XClose (){ t.show(false); if (t.onClose != null) t.onClose(); } function autoHeight (onoff){ if (onoff) t.div.style.height = ''; else t.div.style.height = t.div.style.maxHeight; } function focusMe (){ t.setLayer(5); for (k in unsafeWindow.cpopupWins){ if (k != t.prefix) unsafeWindow.cpopupWins[k].unfocusMe(); } } function unfocusMe (){ t.setLayer(-5); } function getLocation (){ return {x: parseInt(this.div.style.left), y: parseInt(this.div.style.top)}; } function setLocation (loc){ t.div.style.left = loc.x +'px'; t.div.style.top = loc.y +'px'; } function destroy (){ document.body.removeChild(t.div); WinManager.delete (t.prefix); } function centerMe (parent){ if (parent == null){ var coords = getClientCoords(document.body); } else var coords = getClientCoords(parent); var x = ((coords.width - parseInt(t.div.style.width)) / 2) + coords.x; var y = ((coords.height - parseInt(t.div.style.height)) / 2) + coords.y; if (x<0) x = 0; if (y<0) y = 0; t.div.style.left = x +'px'; t.div.style.top = y +'px'; } function setEnableDrag (tf){ t.dragger.setEnable(tf); } function setLayer(zi){ t.div.style.zIndex = ''+ (this.BASE_ZINDEX + zi); } function getLayer(){ return parseInt(t.div.style.zIndex) - this.BASE_ZINDEX; } function getTopDiv(){ return document.getElementById(this.prefix+'_top'); } function getMainDiv(){ return document.getElementById(this.prefix+'_main'); } function show(tf){ if (tf){ t.div.style.display = 'block'; t.focusMe (); } else { t.div.style.display = 'none'; } return tf; } function toggleHide(t){ if (t.div.style.display == 'block') { return t.show (false); } else { return t.show (true); } } } function CWinDrag (clickableElement, movingDiv, enabled) { var t=this; this.setEnable = setEnable; this.setBoundRect = setBoundRect; this.debug = debug; this.dispEvent = dispEvent; this.lastX = null; this.lastY = null; this.enabled = true; this.moving = false; this.theDiv = movingDiv; this.body = document.body; this.ce = clickableElement; this.moveHandler = new CeventMove(this).handler; this.outHandler = new CeventOut(this).handler; this.upHandler = new CeventUp(this).handler; this.downHandler = new CeventDown(this).handler; this.clickableRect = null; this.boundRect = null; this.bounds = null; this.enabled = false; if (enabled == null) enabled = true; this.setEnable (enabled); function setBoundRect (b){ // this rect (client coords) will not go outside of current body this.boundRect = boundRect; this.bounds = null; } function setEnable (enable){ if (enable == t.enabled) return; if (enable){ clickableElement.addEventListener('mousedown', t.downHandler, false); t.body.addEventListener('mouseup', t.upHandler, false); } else { clickableElement.removeEventListener('mousedown', t.downHandler, false); t.body.removeEventListener('mouseup', t.upHandler, false); } t.enabled = enable; } function CeventDown (that){ this.handler = handler; var t = that; function handler (me){ if (t.bounds == null){ t.clickableRect = getClientCoords(clickableElement); t.bodyRect = getClientCoords(document.body); if (t.boundRect == null) t.boundRect = t.clickableRect; t.bounds = {top:10-t.clickableRect.height, bot:t.bodyRect.height-25, left:40-t.clickableRect.width, right:t.bodyRect.width-25}; } if (me.button==0 && t.enabled){ t.body.addEventListener('mousemove', t.moveHandler, true); t.body.addEventListener('mouseout', t.outHandler, true); t.lastX = me.clientX; t.lastY = me.clientY; t.moving = true; } } } function CeventUp (that){ this.handler = handler; var t = that; function handler (me){ if (me.button==0 && t.moving) _doneMoving(t); } } function _doneMoving (t){ t.body.removeEventListener('mousemove', t.moveHandler, true); t.body.removeEventListener('mouseout', t.outHandler, true); t.moving = false; } function CeventOut (that){ this.handler = handler; var t = that; function handler (me){ if (me.button==0){ t.moveHandler (me); } } } function CeventMove (that){ this.handler = handler; var t = that; function handler (me){ if (t.enabled && !t.wentOut){ var newTop = parseInt(t.theDiv.style.top) + me.clientY - t.lastY; var newLeft = parseInt(t.theDiv.style.left) + me.clientX - t.lastX; if (newTop < t.bounds.top){ // if out-of-bounds... newTop = t.bounds.top; _doneMoving(t); } else if (newLeft < t.bounds.left){ newLeft = t.bounds.left; _doneMoving(t); } else if (newLeft > t.bounds.right){ newLeft = t.bounds.right; _doneMoving(t); } else if (newTop > t.bounds.bot){ newTop = t.bounds.bot; _doneMoving(t); } t.theDiv.style.top = newTop + 'px'; t.theDiv.style.left = newLeft + 'px'; t.lastX = me.clientX; t.lastY = me.clientY; } } } function debug (msg, e){ logit ("*************** "+ msg +" ****************"); logit ('clientWidth, Height: '+ e.clientWidth +','+ e.clientHeight); logit ('offsetLeft, Top, Width, Height (parent): '+ e.offsetLeft +','+ e.offsetTop +','+ e.offsetWidth +','+ e.offsetHeight +' ('+ e.offsetParent +')'); logit ('scrollLeft, Top, Width, Height: '+ e.scrollLeft +','+ e.scrollTop +','+ e.scrollWidth +','+ e.scrollHeight); } function dispEvent (msg, me){ logit (msg + ' Button:'+ me.button +' Screen:'+ me.screenX +','+ me.screenY +' client:'+ me.clientX +','+ me.clientY +' rTarget: '+ me.relatedTarget); } } function inspect(obj, maxLevels, level, doFunctions){ var str = '', type, msg; if(level == null) level = 0; if(maxLevels == null) maxLevels = 1; if(maxLevels < 1) return 'Inspect Error: Levels number must be > 0'; if(obj == null) return 'ERROR: Object is NULL\n'; var indent = ''; for (var i=0; i<level; i++) indent += ' '; for(property in obj) { try { type = matTypeof(obj[property]); if (doFunctions==true && (type == 'function')){ str += indent + '(' + type + ') ' + property + "[FUNCTION]\n"; } else if (type != 'function') { str += indent + '(' + type + ') ' + property + ( (obj[property]==null)?(': null'):('')) +' = '+ obj[property] +"\n"; } if((type=='object' || type=='array') && (obj[property] != null) && (level+1 < maxLevels)) str += inspect(obj[property], maxLevels, level+1, doFunctions); // recurse } catch(err) { // Is there some properties in obj we can't access? Print it red. if(typeof(err) == 'string') msg = err; else if(err.message) msg = err.message; else if(err.description) msg = err.description; else msg = 'Unknown'; str += '(Error) ' + property + ': ' + msg +"\n"; } } str += "\n"; return str; } Array.prototype.compare = function(testArr) { if (this.length != testArr.length) return false; for (var i = 0; i < testArr.length; i++) { if (this[i].compare) { if (!this[i].compare(testArr[i])) return false; } if (this[i] !== testArr[i]) return false; } return true; } String.prototype.entityTrans = { '&':'&', '<':'<', '>':'>', '\"':'"', '\'':''' }; String.prototype.htmlSpecialChars = function() { var ret = this.toString(); for (k in this.entityTrans) ret = ret.split(k).join(this.entityTrans[k]); return ret; } String.prototype.htmlSpecialCharsDecode = function() { var ret = this.toString(); for (k in this.entityTrans) ret = ret.split(this.entityTrans[k]).join(k); return ret; } String.prototype.trim = function () { return this.replace(/^\s*/, "").replace(/\s*$/, ""); } function mouseMainTab (me){ // right-click on main button resets window location if (me.button == 2){ var c = getClientCoords (document.getElementById('gor_menu_bar')); mainPop.setLocation ({x: c.width +4, y: 0}); } } function eventHideShow (){ if (mainPop.toggleHide(mainPop)){ tabManager.showTab(); Options.ptWinIsOpen = true; } else { tabManager.hideTab(); Options.ptWinIsOpen = false; } saveOptions(); } function createButton (label){ var a=document.createElement('a'); a.className='tab buttontab'; a.innerHTML='<span class=left></span><span class=right></span>'; a.innerHTML+='<span class=mid>'+ label +'</span>'; a.style.width='78px'; return a; } function AddMainTabLink(text, eventListener, mouseListener) { var tabs=document.getElementById('kochead'); if(!tabs) { tabs=document.getElementById('gor_menu_bar'); if (tabs) tabs=tabs.parentNode; } if(!tabs){ setTimeout(function(){ AddMainTabLink(text, eventListener, mouseListener);}, 200); } if (tabs) { var a = createButton (text); var e = tabs.parentNode; var gmTabs = null; for (var i=0; i<e.childNodes.length; i++){ var ee = e.childNodes[i]; if (ee.tagName && ee.tagName=='DIV' && ee.className=='tabs_engagement' && ee.id!='main_engagement_tabs'){ gmTabs = ee; break; } } if (gmTabs == null){ gmTabs = document.createElement('div'); gmTabs.className='tabs_engagement'; gmTabs.style.background='#ca5'; tabs.parentNode.insertBefore (gmTabs, tabs); gmTabs.style.whiteSpace='nowrap'; gmTabs.style.width='735px'; gmTabs.style.height='20px'; gmTabs.style.padding='0 0 0 25px'; gmTabs.lang = 'en_PB'; // document.getElementById('koc_chatterbox').style.top = '840px'; // document.getElementById('cityinfo_box').style.top = '1042px'; } gmTabs.appendChild(a); a.addEventListener('click',eventListener, false); if (mouseListener != null) a.addEventListener('mousedown',mouseListener, true); return a; } return null; } function searchDOM (node, condition, maxLevel, doMult){ var found = []; eval ('var compFunc = function (node) { return ('+ condition +') }'); doOne(node, 1); if(!doMult){ if (found.length==0) return null; return found[0]; } return found; function doOne (node, curLevel){ try { if (compFunc(node)) found.push(node); } catch (e){ } if (!doMult && found.length>0) return; if (++curLevel<maxLevel && node.childNodes!=undefined) for (var c=0; c<node.childNodes.length; c++) doOne (node.childNodes[c], curLevel); } } function CdispCityPicker (id, span, dispName, notify, selbut){ function CcityButHandler (t){ var that = t; this.clickedCityBut = clickedCityBut; function clickedCityBut (e){ if (that.selected != null) that.selected.className = "ptcastleBut ptcastleButNon"; that.city = Cities.cities[e.target.id.substr(that.prefixLen)]; if (that.dispName) document.getElementById(that.id+'cname').innerHTML = that.city.name; e.target.className = "ptcastleBut ptcastleButSel"; that.selected = e.target; if (that.coordBoxX){ that.coordBoxX.value = that.city.x; that.coordBoxY.value = that.city.y; that.coordBoxX.style.backgroundColor = '#ffffff'; that.coordBoxY.style.backgroundColor = '#ffffff'; } if (that.notify != null) that.notify(that.city, that.city.x, that.city.y); } } function selectBut (idx){ document.getElementById(this.id+'_'+idx).click(); } function bindToXYboxes (eX, eY){ function CboxHandler (t){ var that = t; this.eventChange = eventChange; if (that.city){ eX.value = that.city.x; eY.value = that.city.y; } function eventChange (){ var xValue=that.coordBoxX.value.trim(); var xI=/^\s*([0-9]+)[\s,]+([0-9]+)/.exec(xValue); if(xI) { that.coordBoxX.value=xI[1] that.coordBoxY.value=xI[2] } var x = parseInt(that.coordBoxX.value, 10); var y = parseInt(that.coordBoxY.value, 10); if (isNaN(x) || x<0 || x>750){ that.coordBoxX.style.backgroundColor = '#ff8888'; return; } if (isNaN(y) || y<0 || y>750){ that.coordBoxY.style.backgroundColor = '#ff8888'; return; } that.coordBoxX.style.backgroundColor = '#ffffff'; that.coordBoxY.style.backgroundColor = '#ffffff'; if (that.notify != null) that.notify (null, x, y); } } this.coordBoxX = eX; this.coordBoxY = eY; var bh = new CboxHandler(this); eX.size=2; eX.maxLength=10; eY.size=2; eY.maxLength=3; eX.addEventListener('change', bh.eventChange, false); eY.addEventListener('change', bh.eventChange, false); } this.selectBut = selectBut; this.bindToXYboxes = bindToXYboxes; this.coordBoxX = null; this.coordBoxY = null; this.id = id; this.dispName = dispName; this.prefixLen = id.length+1; this.notify = notify; this.selected = null; this.city = null; var m = ''; for (var i=0; i<Cities.cities.length; i++) m += '<INPUT class="ptcastleBut ptcastleButNon" id="'+ id +'_'+ i +'" value="'+ (i+1) +'" type=submit \>'; if (dispName) m += ' <SPAN style="display:inline-block; width:85px; font-weight:bold;" id='+ id +'cname' +'></span>'; span.innerHTML = m; var handler = new CcityButHandler(this); for (var i=0; i<Cities.cities.length; i++) document.getElementById (id+'_'+i).addEventListener('click', handler.clickedCityBut, false); if (selbut != null) this.selectBut(selbut); }; function implodeUrlArgs (obj){ var a = []; for (var k in obj) a.push (k +'='+ encodeURI(obj[k]) ); return a.join ('&'); } function GetDisplayName(){ var DisplayName = document.getElementById('topnavDisplayName'); if(DisplayName){ DisplayName = DisplayName.innerHTML; }else{ DisplayName = null; } return DisplayName } function DoUnsafeWindow(func, execute_by_embed) { if(this.isChrome || execute_by_embed) { var scr=document.createElement('script'); scr.innerHTML=func; document.body.appendChild(scr); } else { eval("unsafeWindow."+func); } } function dialogRetry (errMsg, seconds, onRetry, onCancel, errCode){ seconds = parseInt(seconds); var pop = new CPopup ('pbretry', 0, 0, 400,200, true); pop.centerMe(mainPop.getMainDiv()); pop.getTopDiv().innerHTML = '<CENTER>GW Lazy Tools</center>'; pop.getMainDiv().innerHTML = '<CENTER><BR><FONT COLOR=#550000><B>An error has ocurred:</b></font><BR><BR><DIV id=paretryErrMsg></div>\ <BR><BR><B>Automatically retrying in <SPAN id=paretrySeconds></b></span> seconds ...<BR><BR><INPUT id=paretryCancel type=submit value="CANCEL Retry" \>'; document.getElementById('paretryCancel').addEventListener ('click', doCancel, false); pop.show(true); if(errCode && unsafeWindow.g_js_strings.errorcode['err_'+errCode]) document.getElementById('paretryErrMsg').innerHTML = unsafeWindow.g_js_strings.errorcode['err_'+errCode]; else document.getElementById('paretryErrMsg').innerHTML = errMsg; document.getElementById('paretrySeconds').innerHTML = seconds; var rTimer = setTimeout (doRetry, seconds*1000); countdown (); function countdown (){ document.getElementById('paretrySeconds').innerHTML = seconds--; if (seconds > 0) cdTimer = setTimeout (countdown, 1000); } function doCancel(){ clearTimeout (rTimer); clearTimeout (cdTimer); pop.destroy(); onCancel (); } function doRetry (){ clearTimeout (rTimer); clearTimeout (cdTimer); pop.show(false); onRetry(); } } // NOTE: args can be either a string which will be appended as is to url or an object of name->values function addUrlArgs (url, args){ if (!args) return url; if (url.indexOf('?') < 0) url += '?'; else if (url.substr(url.length-1) != '&') url += '&'; if (matTypeof(args == 'object')) return url + implodeUrlArgs (args); return url + args; } // emulate protoype's Ajax.Request ... function AjaxRequest (url, opts){ var headers = { 'X-Requested-With': 'XMLHttpRequest', 'X-Prototype-Version': '1.6.1', 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' }; var ajax = null; if (window.XMLHttpRequest) ajax=new XMLHttpRequest(); else ajax=new ActiveXObject("Microsoft.XMLHTTP"); if (opts.method==null || opts.method=='') method = 'GET'; else method = opts.method.toUpperCase(); if (method == 'POST'){ headers['Content-type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; } else if (method == 'GET'){ addUrlArgs (url, opts.parameters); } ajax.onreadystatechange = function(){ // ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; states 0-4 if (ajax.readyState==4) { if (ajax.status >= 200 && ajax.status < 305) if (opts.onSuccess) opts.onSuccess(ajax); else if (opts.onFailure) opts.onFailure(ajax); } else { if (opts.onChange) opts.onChange (ajax); } } ajax.open(method, url, true); // always async! for (var k in headers) ajax.setRequestHeader (k, headers[k]); if (matTypeof(opts.requestHeaders)=='object') for (var k in opts.requestHeaders) ajax.setRequestHeader (k, opts.requestHeaders[k]); if (method == 'POST'){ var a = []; for (k in opts.parameters){ if(matTypeof(opts.parameters[k]) == 'object') for(var h in opts.parameters[k]) a.push (k+'['+h+'] ='+ opts.parameters[k][h] ); else a.push (k +'='+ opts.parameters[k] ); } ajax.send (a.join ('&')); } else { ajax.send(); } } function MyAjaxRequest (url, o, noRetryX){ if (DEBUG_TRACE) logit (" 0 myAjaxRequest: "+ url +"\n" + inspect (o, 2, 1)); var opts = unsafeWindow.Object.clone(o); var wasSuccess = o.onSuccess; var wasFailure = o.onFailure; var retry = 0; var delay = 5; var noRetry = noRetry===true?true:false; opts.onSuccess = mySuccess; opts.onFailure = myFailure; new AjaxRequest(url, opts); return; function myRetry(){ ++retry; new AjaxRequest(url, opts); delay = delay * 1.25; } function myFailure(){ var o = {}; o.ok = false; o.errorMsg = "AJAX Communication Failure"; wasFailure (o); } function mySuccess (msg){ var rslt = eval("(" + msg.responseText + ")"); var x; if (window.EmulateAjaxError){ rslt.ok = false; rslt.error_code=8; } if (rslt.ok){ if (rslt.updateSeed) unsafeWindow.update_seed(rslt.updateSeed); wasSuccess (rslt); return; } rslt.errorMsg = unsafeWindow.printLocalError((rslt.error_code || null), (rslt.msg || null), (rslt.feedback || null)); if ( (x = rslt.errorMsg.indexOf ('<br><br>')) > 0) rslt.errorMsg = rslt.errorMsg.substr (0, x-1); if (!noRetry && (rslt.error_code==0 ||rslt.error_code==8 || rslt.error_code==1 || rslt.error_code==3)){ dialogRetry (rslt.errorMsg, delay, function(){myRetry()}, function(){wasSuccess (rslt)}); } else { wasSuccess (rslt); } } } function coordLink (x, y){ var m = []; m.push ('(<a onclick="ptGotoMapHide ('); m.push (x); m.push (','); m.push (y); m.push ('); return false">'); m.push (x); m.push (','); m.push (y); m.push ('</a>)'); return m.join(''); } unsafeWindow.ptGotoMapHide = function (x, y){ try { unsafeWindow.Modal.hideModal(); } catch (e){ } try { Modal.hideModal(); } catch (e){ } unsafeWindow.ptGotoMap (x, y); } unsafeWindow.ptGotoMap = function (x, y){ if (Options.hideOnGoto) hideMe (); setTimeout (function (){ document.getElementById('mapXCoor').value = x; document.getElementById('mapYCoor').value = y; unsafeWindow.reCenterMapWithCoor(); var a = document.getElementById("mod_views").getElementsByTagName("a"); for (var b = 0; b < a.length; b++) { a[b].className = "" } document.getElementById('mod_views_map').className = "sel"; document.getElementById("maparea_city").style.display = 'none'; document.getElementById("maparea_fields").style.display = 'none'; document.getElementById("maparea_map").style.display = 'block'; unsafeWindow.tutorialClear() }, 0); }; unsafeWindow.PTscout = function (x, y){ setTimeout (function (){ if (Options.hideOnGoto) hideMe (); document.getElementById('mapXCoor').value = x; document.getElementById('mapYCoor').value = y; unsafeWindow.reCenterMapWithCoor(); unsafeWindow.changeview_map(document.getElementById('mod_views_map')); unsafeWindow.modal_attack(3,x,y); }, 0); }; // returns: 'neutral', 'friendly', or 'hostile' function getDiplomacy (aid) { if (Seed.allianceDiplomacies == null) return 'neutral'; if (Seed.allianceDiplomacies.friendly && Seed.allianceDiplomacies.friendly['a'+aid] != null) return 'friendly'; if (Seed.allianceDiplomacies.hostile && Seed.allianceDiplomacies.hostile['a'+aid] != null) return 'hostile'; if (aid == Seed.allianceDiplomacies.allianceId) return 'ally'; return 'neutral'; }; function getMyAlliance (){ if (Seed.allianceDiplomacies==null || Seed.allianceDiplomacies.allianceName==null) return [0, 'None']; else return [Seed.allianceDiplomacies.allianceId, Seed.allianceDiplomacies.allianceName]; } function getMarchInfo (){ var ret = {}; ret.marchUnits = []; ret.returnUnits = []; ret.resources = []; for (i=0; i<13; i++){ ret.marchUnits[i] = 0; ret.returnUnits[i] = 0; } for (i=0; i<5; i++){ ret.resources[i] = 0; } var now = unixTime(); for(i=0; i<Cities.numCities; i++) { // each city cityID = 'c'+ Cities.cities[i].id; for (k in Seed.outgoing_marches[cityID]){ // each march march = Seed.outgoing_marches[cityID][k]; if ((typeof (march) == 'object') && (march.returnUnixTime < now)){ for (ii=0; ii<13; ii++){ ret.marchUnits[ii] += parseInt (march['unit'+ ii +'Count']); ret.returnUnits[ii] += parseInt (march['unit'+ ii +'Return']); } for (ii=1; ii<5; ii++){ ret.resources[ii] += parseInt (march['resource'+ ii]); } ret.resources[0] += parseInt (march['gold']); } // TODO: fixup completed marches // TODO: Assume transport is complete ? } } return ret; } function getTrainInfo (){ var ret = {}; ret.trainUnts = []; for (i=0; i<13; i++){ ret.trainUnts[i] = 0; } var q = Seed.training_queue; for(i=0; i<Cities.numCities; i++) { // each city cityID = 'c'+ Cities.cities[i].id; q = Seed.training_queue[cityID]; if (q && q.length>0){ for (qi=0; qi<q.length; qi++) ret.trainUnts[q[qi][1]] += parseInt(q[qi][2]); } } return ret; } var fortNamesShort = { 53: "Archer Tower", 52: "Caltrops", 54: "Logs", 55: "Trebuchet", } // returns {count, maxlevel} function getCityBuilding (cityId, buildingId){ var b = Seed.buildings['city'+cityId]; var ret = {count:0, maxLevel:0}; for (var i=1; i<33; i++){ if (b['pos'+i] && b['pos'+i][0] == buildingId){ ++ret.count; if (parseInt(b['pos'+i][1]) > ret.maxLevel) ret.maxLevel = parseInt(b['pos'+i][1]); } } return ret; } var myServerId = null; function getServerId() { if (myServerId == null){ var m=/^[a-zA-Z]+([0-9]+)\./.exec(document.location.hostname); if (m) myServerId = m[1]; else myServerId = '??'; } return myServerId; } function setCities(){ Cities.numCities = Seed.cities.length; Cities.cities = []; Cities.byID = {}; for (i=0; i<Cities.numCities; i++){ city = {}; city.idx = i; city.id = parseInt(Seed.cities[i][0]); city.name = Seed.cities[i][1]; city.x = parseInt(Seed.cities[i][2]); city.y = parseInt(Seed.cities[i][3]); city.tileId = parseInt(Seed.cities[i][5]); city.provId = parseInt(Seed.cities[i][4]); Cities.cities[i] = city; Cities.byID[Seed.cities[i][0]] = city; } } var tabManager = { tabList : {}, // {name, obj, div} currentTab : null, init : function (mainDiv){ var t = tabManager; var sorter = []; for (k in Tabs){ if (!Tabs[k].tabDisabled){ t.tabList[k] = {}; t.tabList[k].name = k; t.tabList[k].obj = Tabs[k]; if (Tabs[k].tabLabel != null) t.tabList[k].label = Tabs[k].tabLabel; else t.tabList[k].label = k; if (Tabs[k].tabOrder != null) sorter.push([Tabs[k].tabOrder, t.tabList[k]]); else sorter.push([1000, t.tabList[k]]); t.tabList[k].div = document.createElement('div'); } } sorter.sort (function (a,b){return a[0]-b[0]}); var m = '<TABLE cellspacing=3 class=ptMainTab><TR>'; for (var i=0; i<sorter.length; i++) { //m += '<TD class=spacer></td><TD align=center class=notSel id=pttc'+ sorter[i][1].name +' ><A><SPAN>'+ sorter[i][1].label +'</span></a></td>'; m += '<TD class=spacer></td><TD align=center class=notSel id=pttc'+ sorter[i][1].name +' ><A><SPAN>'+ sorter[i][1].label +'</span></a></td>'; //if (i==8) m+='</tr><TR>'; } m+='</tr></table>'; //m += '<TD class=spacer width=90% align=right>'+ Version +' </td></tr></table>'; mainPop.getTopDiv().innerHTML = m; for (k in t.tabList) { if (t.tabList[k].name == Options.currentTab) t.currentTab = t.tabList[k] ; document.getElementById('pttc'+ k).addEventListener('click', this.e_clickedTab, false); var div = t.tabList[k].div; div.style.display = 'none'; div.style.height = '100%'; mainDiv.appendChild(div); try { t.tabList[k].obj.init(div); } catch (e){ div.innerHTML = "INIT ERROR: "+ e; } } if (t.currentTab == null) t.currentTab = sorter[0][1]; t.setTabStyle (document.getElementById ('pttc'+ t.currentTab.name), true); t.currentTab.div.style.display = 'block'; }, hideTab : function (){ var t = tabManager; t.currentTab.obj.hide(); }, showTab : function (){ var t = tabManager; t.currentTab.obj.show(); }, setTabStyle : function (e, selected){ if (selected){ e.className = 'sel'; } else { e.className = 'notSel'; } }, e_clickedTab : function (e){ var t = tabManager; newTab = t.tabList[e.target.parentNode.parentNode.id.substring(4)]; if (t.currentTab.name != newTab.name){ t.setTabStyle (document.getElementById ('pttc'+ t.currentTab.name), false); t.setTabStyle (document.getElementById ('pttc'+ newTab.name), true); t.currentTab.obj.hide (); t.currentTab.div.style.display = 'none'; t.currentTab = newTab; newTab.div.style.display = 'block'; Options.currentTab = newTab.name; } newTab.obj.show(); }, } function hideMe (){ mainPop.show (false); tabManager.hideTab(); Options.ptWinIsOpen = false; saveOptions(); } function showMe (){ mainPop.show (true); tabManager.showTab(); Options.ptWinIsOpen = true; saveOptions(); } function objectName (o){ var s = o.toString(); return s.substr(7,s.length-8); } function matTypeof (v){ if (typeof (v) == 'object'){ if (!v) return 'null'; // else if (unsafeWindow.Object.prototype.toString.apply(v) === '[object Array]') else if (v.constructor.toString().indexOf("Array")>=0 && typeof(v.splice)=='function') return 'array'; else return 'object'; } return typeof (v); } function addCommasInt(n){ nStr = parseInt(n) + ''; var rgx = /(\d+)(\d{3})/; while (rgx.test(nStr)) { nStr = nStr.replace(rgx, '$1' + ',' + '$2'); } return nStr; } function addCommas(nStr){ nStr += ''; x = nStr.split('.'); x1 = x[0]; x2 = x.length > 1 ? '.' + x[1] : ''; var rgx = /(\d+)(\d{3})/; while (rgx.test(x1)) { x1 = x1.replace(rgx, '$1' + ',' + '$2'); } return x1 + x2; } function htmlSelector (valNameObj, curVal, tags){ m = []; m.push ('<SELECT'); if (tags){ m.push (' '); m.push (tags); } for (k in valNameObj){ m.push ('><OPTION '); if (k == curVal) m.push ('SELECTED '); m.push ('value="'); m.push (k); m.push ('">'); m.push (valNameObj[k]); m.push ('</option>'); } m.push ('</select>'); return m.join (''); } function unixTime (){ return parseInt (new Date().getTime() / 1000) + unsafeWindow.g_timeoff; } function htmlOptions (a, curVal){ m = ''; for (k in a) m += '<OPTION value="'+ k +'"'+ (k==curVal?' SELECTED':'') +'>'+ a[k] +'</option>'; return m; } function getFunctionName (func){ var name=/\W*function\s+([\w\$]+)\(/.exec(func); if (!name) return ''; return name[1]; } function findAllBetween (txt, find1, find2){ var m = []; var last = 0; while ( (i1=txt.indexOf(find1, last))>=0 && (i2=txt.indexOf (find2, i1))>=0 ) { m.push (txt.substring(i1+find1.length, i2)); last = i2 + find2.length; } return m; } function strUpTo (s, find){ var i = s.indexOf(find); if (i > 0) return s.substr(0, i); return s; } /******** Xd Xh Xh Xm Xm Xs Xs ********/ function timestrShort(time) { time = parseInt (time); if (time > 86400){ var m = []; time /= 3600; m.push (parseInt(time/24)); m.push ('d '); m.push (parseInt(time%24)); m.push ('h '); return m.join (''); } else return timestr (time); } /********************** part full Xd Xh Xm Xd Xh Xm Xs Xh Xm Xh Xm Xs Xm Xs Xm Xs Xs Xs **********************/ function timestr(time, full) { time = parseInt (time); var m = []; var t = time; if (t < 61) return t + 's'; if (t > 86400){ m.push (parseInt(t/86400)); m.push ('d '); t %= 86400; } if (t>3600 || time>3600){ m.push (parseInt(t/3600)); m.push ('h '); t %= 3600; } m.push (parseInt(t/60)); m.push ('m'); if (full || time<=3600 ){ m.push (' '); m.push (t%60); m.push ('s'); } return m.join (''); } function logit (msg, force){ if(!DEBUG_TRACE && !force) return false; var now = new Date(); var prefix = getServerId() +' @ '+ now.toTimeString().substring (0,8) +'.' + now.getMilliseconds(); msg = prefix+" : "+msg; if (typeof GM_log !== 'undefined') { GM_log(msg); return true; } if (typeof console !== 'undefined' && console.log) { console.log(msg); return true; } return false; } /************ LIB singletons .... **************/ // TODO: fix REopening window var WINLOG_MAX_ENTRIES = 1000; // TODO var WinLog = { state : null, win: null, eOut : null, lastE : null, enabled : true, reverse : true, busy : false, isOpening : false, open : function (){ var t = WinLog; function eventButClear(){ var t = WinLog; t.lastE = null; t.eOut.innerHTML =''; } function eventButReverse(){ var t = WinLog; if (t.busy) return; t.busy = true; if (t.reverse){ t.win.document.getElementById('wlRev').value= 'Top'; t.reverse = false; } else{ t.win.document.getElementById('wlRev').value= 'Bottom'; t.reverse = true; } var n = t.eOut.childNodes.length; if (n < 2) return; for (i=n-2; i>=0; i--){ t.eOut.appendChild (t.eOut.childNodes[i]); } t.busy = false; } if (!t.win || t.win.closed){ t.isOpening = true; // Firefox bug??? It appears as if a new thread is started on open, withOUT reusing same window //t.win = window.open('', 'uwtrace', 'top=30,left=0,width=900,height=700,scrollbars=no,location=no,menubar=no,directories=no,status=no'); t.win = new CPopup('ptwinlog', 0, 0, 500, 800, true, function(){t.win.destroy(); t.win=null; t.win.closed=true;}); t.win.show(true); t.isOpening = false; t.state = null; } if (t.state == null){ t.win.getMainDiv().innerHTML = '<STYLE>pre{margin:0px} hr{margin:3px; height:1px; border:0px; color:#cee; background-color:#cee}</style>\ <BODY style="margin:0px; padding:0px; border:none">\ <DIV id=winlogtop style="background-color:#d0d0d0; margin:0px; padding:0px; border:1px solid">\ <INPUT id=wlClear type=submit value="Clear"> <INPUT id=wlRev type=submit value="Bottom"></div>\ <DIV id=wlOut style="overflow-y:auto; overflow-x:auto; max-height:800px; width:600px"></div></body>'; document.getElementById('wlClear').addEventListener('click', eventButClear, false); document.getElementById('wlRev').addEventListener('click', eventButReverse, false); t.eOut = document.getElementById('wlOut'); t.lastE = null; t.state = 1; } }, writeText : function (msg){ WinLog.write (msg.htmlEntities()); }, write : function (msg){ var t = WinLog; if (!t.enabled || t.isOpening) return; t.open(); var te = document.createElement('pre'); var now = new Date(); var m = []; var millis = now.getMilliseconds(); m.push (now.toTimeString().substring (0,8)); m.push ('.'); if (millis<100) m.push('0'); if (millis<10) m.push('0'); m.push(millis); m.push (': '); m.push (msg); te.innerHTML = m.join(''); if (t.reverse){ if (t.lastE == null){ t.eOut.appendChild(te); t.lastE = te; } else { t.eOut.insertBefore(te, t.lastE); } var hr = document.createElement('hr'); t.eOut.insertBefore(hr, te); t.lastE = hr; } else { t.eOut.appendChild(te); t.eOut.appendChild(document.createElement('hr')); } }, }; ptStartup();
Mozilla add on,User script,Grease Monkey Script, greasemonkey userscripts, updater userscripts mafia wars userscripts mafia wars autoplayer userscripts mafia wars wall userscripts scripts userscripts travian greasemonkey greasemonkey download greasemonkey facebook greasemonkey tutorial greasemonkey youtube greasemonkey travian greasemonkey chrome greasemonkey mafia wars greasemonkey mafia wars autoplayer
Sunday, October 2, 2011
GW LazyTools
Subscribe to:
Post Comments (Atom)
0 comments:
Post a Comment