KOC Notebook

RangeCalculator

  1. // ==UserScript==
  2. // @name KOC Notebook
  3. // @version 20130929a
  4. // @namespace anote
  5. // @include *.kingdomsofcamelot.com/*main_src.php*
  6. // @include *.kingdomsofcamelot.com/*platforms/kabam*
  7. // @include *apps.facebook.com/kingdomsofcamelot/*
  8. // @include *kabam.com/kingdoms-of-camelot/play*
  9. // @include *facebook.com/connect/uiserver.php*
  10. // @include *facebook.com/*/serverfbml*
  11. // @include *facebook.com/dialog/feed*
  12. // @include *facebook.com/dialog/stream.publish*
  13. // @include *facebook.com/dialog/apprequests*
  14. // @description RangeCalculator
  15. // ==/UserScript==
  16.  
  17.  
  18. var Version = '20130929a';
  19.  
  20. // These switches are for testing, all should be set to false for released version:
  21. var DEBUG_TRACE = false;
  22. var DEBUG_SEARCH = false;
  23. var ENABLE_SAMPLE_TAB = false;
  24. var ENABLE_GM_AJAX_TRACE = false;
  25. var SEND_ALERT_AS_WHISPER = false;
  26. // end test switches
  27.  
  28. 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');};}}());
  29. var JSON2 = JSON;
  30.  
  31. var Options = {
  32. nbWinIsOpen : false,
  33. nbWinDrag : true,
  34. nbWinPos : {},
  35. nbTrackOpen : true,
  36. currentTab : null,
  37. };
  38.  
  39. var GlobalOptions = {
  40. nbWideScreen : true,
  41. nbWideScreenStyle : 'normal',
  42. autoPublishPrivacySetting : 80,
  43. nbupdate : false,
  44. nbupdatebeta : 0,
  45. };
  46.  
  47. var RCOptions = {
  48. rb : 0,
  49. rdb : 0,
  50. sb : 0,
  51. sdb : 0,
  52. rrb : 0,
  53. rrdb : 0,
  54. orb : 0,
  55. ordb : 0,
  56. osb : 0,
  57. osdb : 0,
  58. orrb : 0,
  59. orrdb : 0,
  60. };
  61.  
  62. var ResetAll=false;
  63. var deleting=false;
  64.  
  65. readGlobalOptions ();
  66. readOptions();
  67.  
  68. var Tabs = {};
  69. var mainPop;
  70. var nbPopUpTopClass = 'nbPopTop';
  71. var CM = unsafeWindow.cm;
  72.  
  73. function nbStartup (){
  74. if (unsafeWindow.nbLoaded)
  75. return;
  76. unsafeWindow.nbLoaded = true;
  77.  
  78. readOptions();
  79. readRCOptions();
  80.  
  81. var styles = 'table.nbTabLined tr td {border:1px none none solid none; padding: 2px 5px; white-space:nowrap;}\
  82. table.nbOptions tr td {border:1px none none solid none; padding: 1px 3px; white-space:nowrap;}\
  83. .nbStat {border:1px solid; border-color:#000000; font-weight:bold; padding-top:2px; padding-bottom:2px; text-align:center; color:#ffffff ; background-color:#357; -moz-border-radius:5px;}\
  84. button::-moz-focus-inner, input[type="submit"]::-moz-focus-inner { border: none; }\
  85. table.nbMainTab { empty-cells: show; margin-left: 5px; margin-top: 4px; padding: 1px; padding-left:5px;}\
  86. table.nbMainTab tr td a {color:inherit }\
  87. table.nbMainTab tr td {height:60%; empty-cells:show; padding: 0px 4px 0px 4px; margin-top:5px; white-space:nowrap; border: 1px solid; border-style: none none solid none; -moz-border-radius:5px; }\
  88. table.nbMainTab tr td.spacer {padding: 0px 0px;}\
  89. table.nbMainTab tr td.notSel { color: #ffffff; font-size: 12px; font-weight:bold; -moz-border-radius: 10px; -moz-box-shadow: 0px 1px 3px #357544; text-shadow: -1px 1px 3px #666666; border: solid #615461 1px; background: -moz-linear-gradient(top, #6ff28e, #196b2c);}\
  90. table.nbMainTab tr td.sel { color: #000000; font-size: 12px; font-weight:bold; -moz-border-radius: 10px; -moz-box-shadow: 0px 1px 3px #357544; text-shadow: -1px 1px 3px #CECECE; border: solid #615461 1px; background: -moz-linear-gradient(top, #6ff28e, #196b2c);}\
  91. table.nbMainTab tr td:hover { color: #191919; font-size: 12px; font-weight:bold; text-shadow: -1px 1px 3px #CECECE; background: -moz-linear-gradient(top, #43cc7e, #20a129)}\
  92. tr.nbPopTop td { background-color:transparent; border:none; height: 21px; padding:0px;}\
  93. tr.nbretry_nbPopTop td { background-color:#a00; color:#fff; border:none; height: 21px; padding:0px; }\
  94. tr.nbMainPopTop td { background-color:#ded; border:none; height: 42px; width:80%; padding:0px; }\
  95. tr.nbretry_nbMainPopTop td { background-color:#a00; color:#fff; border:none; height: 42px; padding:0px; }\
  96. .nbPopMain { border:1px solid #000000; -moz-box-shadow:inset 0px 0px 10px #6a6a6a; -moz-border-radius-bottomright: 20px; -moz-border-radius-bottomleft: 20px;}\
  97. .nbPopup {border:5px ridge #666; opacity:2; -moz-border-radius:25px; -moz-box-shadow: 1px 1px 5px #000000; }'
  98.  
  99. window.name = 'NB';
  100.  
  101. // TODO: Make sure WinPos is visible on-screen ?
  102. if (Options.nbWinPos==null || Options.nbWinPos.x==null|| Options.nbWinPos.x=='' || isNaN(Options.nbWinPos.x)){
  103. var c = getClientCoords (document.getElementById('main_engagement_tabs'));
  104. Options.nbWinPos.x = c.x+4;
  105. Options.nbWinPos.y = c.y+c.height;
  106. saveOptions ();
  107. }
  108.  
  109. // Reset window xPos if the widescreen option is disabled
  110. if(!GlobalOptions.nbWideScreen && Options.nbWinPos.x > 700){
  111. var c = getClientCoords (document.getElementById('main_engagement_tabs'));
  112. Options.nbWinPos.x = c.x+4;
  113. saveOptions ();
  114. }
  115.  
  116. mainPop = new nbPopup ('nb', Options.nbWinPos.x, Options.nbWinPos.y, 850,850, Options.nbWinDrag,
  117. function (){
  118. tabManager.hideTab();
  119. Options.nbWinIsOpen=false;
  120. saveOptions();
  121. });
  122. mainPop.autoHeight (true);
  123.  
  124. mainPop.getMainDiv().innerHTML = '<STYLE>'+ styles +'</style>';
  125. AddMainTabLink('Notebook', eventHideShow, mouseMainTab);
  126. tabManager.init (mainPop.getMainDiv());
  127. actionLog ("KOC Notebook v"+ Version +" Loaded");
  128.  
  129. if (Options.nbWinIsOpen && Options.nbTrackOpen){
  130. mainPop.show (true);
  131. tabManager.showTab();
  132. }
  133. window.addEventListener('unload', onUnload, false);
  134. }
  135.  
  136. /**************************** Throne Item Caps Tab ******************************/
  137. Tabs.ThroneCaps = {
  138. tabOrder : 100, // order to place tab in top bar
  139. tabLabel : 'ThroneCaps', // label to show in main window tabs
  140. myDiv : null,
  141. timer : null,
  142.  
  143. init : function (div){ // called once, upon script startup
  144. var t = Tabs.ThroneCaps;
  145. t.myDiv = div;
  146. div.innerHTML = 'Removed. Look in Bot -> Throne -> Caps';
  147. },
  148.  
  149. hide : function (){ // called whenever the main window is hidden, or another tab is selected
  150. var t = Tabs.ThroneCaps;
  151. },
  152.  
  153. show : function (){ // called whenever this tab is shown
  154. var t = Tabs.ThroneCaps;
  155. },
  156. }
  157.  
  158. /**************************** Range Calculator Tab ******************************/
  159. Tabs.RangeCalc = {
  160. tabOrder : 200, // order to place tab in top bar
  161. tabLabel : 'RangeCalc', // label to show in main window tabs
  162. myDiv : null,
  163. timer : null,
  164.  
  165. init : function (div){ // called once, upon script startup
  166. var t = Tabs.RangeCalc;
  167. t.myDiv = div;
  168. div.innerHTML = 'Enter all numbers as positive number<br><br>\
  169. <table><tr><td></td><td>My Range</td><td>Opponent</td></tr>\
  170. <tr><td>Range Buff: </td><td><input id=myrangebuff type=text value=0></td> <td><input id=opprangebuff type=text value=0></td></tr>\
  171. <tr><td>Range Debuff: </td><td><input id=myrangedebuff type=text value=0></td> <td><input id=opprangedebuff type=text value=0></td></tr>\
  172. <tr><td>Siege Buff: </td><td><input id=mysiegebuff type=text value=0></td> <td><input id=oppsiegebuff type=text value=0></td></tr>\
  173. <tr><td>Siege Debuff: </td><td><input id=mysiegedebuff type=text value=0></td> <td><input id=oppsiegedebuff type=text value=0></td></tr>\
  174. <tr><td>Ranged Buff: </td><td><input id=myrangedbuff type=text value=0></td> <td><input id=opprangedbuff type=text value=0></td></tr>\
  175. <tr><td>Ranged Debuff:</td><td><input id=myrangeddebuff type=text value=0></td><td><input id=opprangeddebuff type=text value=0></td></tr></table>\
  176. <br><br>\
  177. A negative number here means you are outranged.<br>\
  178. Siege Range Difference<input id=siegewinner type=text value=0><br>\
  179. Ranged Range Difference<input id=rangedwinner type=text value=0><br><br>';
  180.  
  181. t.loadRCOptions();
  182.  
  183. document.getElementById('myrangebuff').addEventListener('change', function(e){
  184. if (isNaN(e.target.value)) e.target.value=0 ;
  185. if (e.target.value < 0) alert('Enter positive numbers!');
  186. RCOptions.rb = e.target.value;
  187. saveRCOptions();
  188. t.calculate();
  189. }, false);
  190. document.getElementById('myrangedebuff').addEventListener('change', function(e){
  191. if (isNaN(e.target.value)) e.target.value=0 ;
  192. if (e.target.value < 0) alert('Enter positive numbers!');
  193. RCOptions.rdb = e.target.value;
  194. saveRCOptions();
  195. t.calculate();
  196. }, false);
  197. document.getElementById('mysiegebuff').addEventListener('change', function(e){
  198. if (isNaN(e.target.value)) e.target.value=0 ;
  199. if (e.target.value < 0) alert('Enter positive numbers!');
  200. RCOptions.sb = e.target.value;
  201. saveRCOptions();
  202. t.calculate();
  203. }, false);
  204. document.getElementById('mysiegedebuff').addEventListener('change', function(e){
  205. if (isNaN(e.target.value)) e.target.value=0 ;
  206. if (e.target.value < 0) alert('Enter positive numbers!');
  207. RCOptions.sdb = e.target.value;
  208. saveRCOptions();
  209. t.calculate();
  210. }, false);
  211. document.getElementById('myrangedbuff').addEventListener('change', function(e){
  212. if (isNaN(e.target.value)) e.target.value=0 ;
  213. if (e.target.value < 0) alert('Enter positive numbers!');
  214. RCOptions.rrb = e.target.value;
  215. saveRCOptions();
  216. t.calculate();
  217. }, false);
  218. document.getElementById('myrangeddebuff').addEventListener('change', function(e){
  219. if (isNaN(e.target.value)) e.target.value=0 ;
  220. if (e.target.value < 0) alert('Enter positive numbers!');
  221. RCOptions.rrdb = e.target.value;
  222. saveRCOptions();
  223. t.calculate();
  224. }, false);
  225. document.getElementById('opprangebuff').addEventListener('change', function(e){
  226. if (isNaN(e.target.value)) e.target.value=0 ;
  227. if (e.target.value < 0) alert('Enter positive numbers!');
  228. RCOptions.orb = e.target.value;
  229. saveRCOptions();
  230. t.calculate();
  231. }, false);
  232. document.getElementById('opprangedebuff').addEventListener('change', function(e){
  233. if (isNaN(e.target.value)) e.target.value=0 ;
  234. if (e.target.value < 0) alert('Enter positive numbers!');
  235. RCOptions.ordb = e.target.value;
  236. saveRCOptions();
  237. t.calculate();
  238. }, false);
  239. document.getElementById('oppsiegebuff').addEventListener('change', function(e){
  240. if (isNaN(e.target.value)) e.target.value=0 ;
  241. if (e.target.value < 0) alert('Enter positive numbers!');
  242. RCOptions.osb = e.target.value;
  243. saveRCOptions();
  244. t.calculate();
  245. }, false);
  246. document.getElementById('oppsiegedebuff').addEventListener('change', function(e){
  247. if (isNaN(e.target.value)) e.target.value=0 ;
  248. if (e.target.value < 0) alert('Enter positive numbers!');
  249. RCOptions.osdb = e.target.value;
  250. saveRCOptions();
  251. t.calculate();
  252. }, false);
  253. document.getElementById('opprangedbuff').addEventListener('change', function(e){
  254. if (isNaN(e.target.value)) e.target.value=0 ;
  255. if (e.target.value < 0) alert('Enter positive numbers!');
  256. RCOptions.orrb = e.target.value;
  257. saveRCOptions();
  258. t.calculate();
  259. }, false);
  260. document.getElementById('opprangeddebuff').addEventListener('change', function(e){
  261. if (isNaN(e.target.value)) e.target.value=0 ;
  262. if (e.target.value < 0) alert('Enter positive numbers!');
  263. RCOptions.orrdb = e.target.value;
  264. saveRCOptions();
  265. t.calculate();
  266. }, false);
  267. },
  268.  
  269. hide : function (){ // called whenever the main window is hidden, or another tab is selected
  270. var t = Tabs.RangeCalc;
  271. },
  272.  
  273. show : function (){ // called whenever this tab is shown
  274. var t = Tabs.RangeCalc;
  275. },
  276.  
  277. calculate : function () {
  278. var rb = parseInt(document.getElementById('myrangebuff').value);
  279. var rdb = parseInt(document.getElementById('myrangedebuff').value);
  280. var sb = parseInt(document.getElementById('mysiegebuff').value);
  281. var sdb = parseInt(document.getElementById('mysiegedebuff').value);
  282. var rrb = parseInt(document.getElementById('myrangedbuff').value);
  283. var rrdb = parseInt(document.getElementById('myrangeddebuff').value);
  284. var orb = parseInt(document.getElementById('opprangebuff').value);
  285. var ordb = parseInt(document.getElementById('opprangedebuff').value);
  286. var osb = parseInt(document.getElementById('oppsiegebuff').value);
  287. var osdb = parseInt(document.getElementById('oppsiegedebuff').value);
  288. var orrb = parseInt(document.getElementById('opprangedbuff').value);
  289. var orrdb = parseInt(document.getElementById('opprangeddebuff').value);
  290.  
  291. var sdiff = (rb + sb - ordb - osdb) - (orb + osb - rdb - sdb);
  292.  
  293. if (sdiff < -25)
  294. sdiff = -25;
  295. if (sdiff > 185)
  296. sdiff = 185;
  297.  
  298. var rdiff = (rb + rrb - ordb - orrdb) - (orb + orrb - rdb - rrdb);
  299. if (rdiff < -25)
  300. rdiff = -25;
  301. if (rdiff > 185)
  302. rdiff = 185;
  303.  
  304. document.getElementById('siegewinner').value = sdiff;
  305. document.getElementById('rangedwinner').value = rdiff;
  306. },
  307. loadRCOptions : function () {
  308. var t = Tabs.RangeCalc;
  309. readRCOptions();
  310. document.getElementById('myrangebuff').value = RCOptions.rb;
  311. document.getElementById('myrangedebuff').value = RCOptions.rdb;
  312. document.getElementById('mysiegebuff').value = RCOptions.sb;
  313. document.getElementById('mysiegedebuff').value = RCOptions.sdb;
  314. document.getElementById('myrangedbuff').value = RCOptions.rrb;
  315. document.getElementById('myrangeddebuff').value = RCOptions.rrdb;
  316. document.getElementById('opprangebuff').value = RCOptions.orb;
  317. document.getElementById('opprangedebuff').value = RCOptions.ordb;
  318. document.getElementById('oppsiegebuff').value = RCOptions.osb;
  319. document.getElementById('oppsiegedebuff').value = RCOptions.osdb;
  320. document.getElementById('opprangedbuff').value = RCOptions.orrb;
  321. document.getElementById('opprangeddebuff').value = RCOptions.orrdb;
  322. t.calculate();
  323. },
  324. }
  325.  
  326. /**************************** Unit Stats Calculator Tab ******************************/
  327. Tabs.UnitCalc = {
  328. tabOrder : 300, // order to place tab in top bar
  329. tabLabel : 'UnitCalc', // label to show in main window tabs
  330. myDiv : null,
  331. timer : null,
  332.  
  333. Trp0 : { //mm
  334. Life : 400,
  335. Atk : 100,
  336. Def : 13,
  337. Spd : 200,
  338. Rng : 20,
  339. },
  340. Trp1 : { //scout
  341. Life : 20,
  342. Atk : 6,
  343. Def : 1,
  344. Spd : 3000,
  345. Rng : 20,
  346. },
  347. Trp2 : { //pike
  348. Life : 600,
  349. Atk : 300,
  350. Def : 33,
  351. Spd : 300,
  352. Rng : 50,
  353. },
  354. Trp3 : { //sw
  355. Life : 700,
  356. Atk : 200,
  357. Def : 63,
  358. Spd : 275,
  359. Rng : 30,
  360. },
  361. Trp4 : { //arch
  362. Life : 500,
  363. Atk : 240,
  364. Def : 25,
  365. Spd : 250,
  366. Rng : 1200,
  367. },
  368. Trp5 : { //cav
  369. Life : 1000,
  370. Atk : 500,
  371. Def : 45,
  372. Spd : 1000,
  373. Rng : 100,
  374. },
  375. Trp6 : { //hc
  376. Life : 2000,
  377. Atk : 700,
  378. Def : 87,
  379. Spd : 750,
  380. Rng : 80,
  381. },
  382. Trp7 : { //ball
  383. Life : 640,
  384. Atk : 900,
  385. Def : 40,
  386. Spd : 100,
  387. Rng : 1400,
  388. },
  389. Trp8 : { //ram
  390. Life : 10000,
  391. Atk : 500,
  392. Def : 40,
  393. Spd : 120,
  394. Rng : 600,
  395. },
  396. Trp9 : { //cat
  397. Life : 960,
  398. Atk : 1200,
  399. Def : 50,
  400. Spd : 80,
  401. Rng : 1500,
  402. },
  403.  
  404. Trp10 : { //blood
  405. Life : 2100,
  406. Atk : 1300,
  407. Def : 45,
  408. Spd : 900,
  409. Rng : 150,
  410. },
  411.  
  412. Trp11 : { //exec
  413. Life : 4200,
  414. Atk : 1700,
  415. Def : 70,
  416. Spd : 500,
  417. Rng : 120,
  418. },
  419.  
  420. Trp12 : { //siegewall
  421. Life : 8400,
  422. Atk : 200,
  423. Def : 140,
  424. Spd : 775,
  425. Rng : 120,
  426. },
  427.  
  428. Trp13 : { //flamearcher
  429. Life : 800,
  430. Atk : 1700,
  431. Def : 40,
  432. Spd : 140,
  433. Rng : 1600,
  434. },
  435.  
  436. Trp14 : { //hussar
  437. Life : 2800,
  438. Atk : 1050,
  439. Def : 130,
  440. Spd : 1150,
  441. Rng : 120,
  442. },
  443. init : function (div){ // called once, upon script startup
  444. var t = Tabs.UnitCalc;
  445. t.myDiv = div;
  446. div.innerHTML = '<center><b>Unit Stats</b></center><br>\
  447. <table border=1><tr><td><b>Unit</b></td><td><b>Life</b></td><td><b>Atk</b></td><td><b>Def</b></td><td><b>Speed</b></td><td><b>Range</b></td><td style="background-color:black"></td><td><b>Unit</b></td><td><b>Life</b></td><td><b>Atk</b></td><td><b>Def</b></td><td><b>Speed</b></td><td><b>Range</b></td></tr>\
  448. <tr><td>Mm </td><td id=ucTrp0Life> </td><td id=ucTrp0Atk> </td><td id=ucTrp0Def> </td><td id=ucTrp0Spd> </td><td id=ucTrp0Rng> </td><td style="background-color:black"></td><td>Archer </td><td id=ucTrp4Life> </td><td id=ucTrp4Atk> </td><td id=ucTrp4Def> </td><td id=ucTrp4Spd> </td><td id=ucTrp4Rng> </td></tr>\
  449. <tr><td>Scout </td><td id=ucTrp1Life> </td><td id=ucTrp1Atk> </td><td id=ucTrp1Def> </td><td id=ucTrp1Spd> </td><td id=ucTrp1Rng> </td><td style="background-color:black"></td><td>Ball </td><td id=ucTrp7Life> </td><td id=ucTrp7Atk> </td><td id=ucTrp7Def> </td><td id=ucTrp7Spd> </td><td id=ucTrp7Rng> </td></tr>\
  450. <tr><td>Pike </td><td id=ucTrp2Life> </td><td id=ucTrp2Atk> </td><td id=ucTrp2Def> </td><td id=ucTrp2Spd> </td><td id=ucTrp2Rng> </td><td style="background-color:black"></td><td>Cat </td><td id=ucTrp9Life> </td><td id=ucTrp9Atk> </td><td id=ucTrp9Def> </td><td id=ucTrp9Spd> </td><td id=ucTrp9Rng> </td></tr>\
  451. <tr><td>Sword </td><td id=ucTrp3Life> </td><td id=ucTrp3Atk> </td><td id=ucTrp3Def> </td><td id=ucTrp3Spd> </td><td id=ucTrp3Rng> </td><td style="background-color:black"></td><td>Blood </td><td id=ucTrp10Life></td><td id=ucTrp10Atk></td><td id=ucTrp10Def></td><td id=ucTrp10Spd></td><td id=ucTrp10Rng></td></tr>\
  452. <tr><td>Cav </td><td id=ucTrp5Life> </td><td id=ucTrp5Atk> </td><td id=ucTrp5Def> </td><td id=ucTrp5Spd> </td><td id=ucTrp5Rng> </td><td style="background-color:black"></td><td>Exec </td><td id=ucTrp11Life></td><td id=ucTrp11Atk></td><td id=ucTrp11Def></td><td id=ucTrp11Spd></td><td id=ucTrp11Rng></td></tr>\
  453. <tr><td>HC </td><td id=ucTrp6Life> </td><td id=ucTrp6Atk> </td><td id=ucTrp6Def> </td><td id=ucTrp6Spd> </td><td id=ucTrp6Rng> </td><td style="background-color:black"></td><td>Siege Wall</td><td id=ucTrp12Life></td><td id=ucTrp12Atk></td><td id=ucTrp12Def></td><td id=ucTrp12Spd></td><td id=ucTrp12Rng></td></tr>\
  454. <tr><td>Ram </td><td id=ucTrp8Life> </td><td id=ucTrp8Atk> </td><td id=ucTrp8Def> </td><td id=ucTrp8Spd> </td><td id=ucTrp8Rng> </td><td style="background-color:black"></td><td>Flame Arch</td><td id=ucTrp13Life></td><td id=ucTrp13Atk></td><td id=ucTrp13Def></td><td id=ucTrp13Spd></td><td id=ucTrp13Rng></td></tr>\
  455. <tr><td> </td><td > </td><td > </td><td > </td><td > </td><td > </td><td style="background-color:black"></td><td>Hussar </td><td id=ucTrp14Life></td><td id=ucTrp14Atk></td><td id=ucTrp14Def></td><td id=ucTrp14Spd></td><td id=ucTrp14Rng></td></tr>\
  456. </table><hr>\
  457. <center><b>Config</b></center><br>\
  458. <b>Knight Combat Points</b><input id=ucKnightLevel type=text value=300 size=4><br><br>\
  459. <b>Fey Altar (Sacrifice)</b> | Active: <input id=ucFeyAltarActive type=checkbox unchecked> | Bonus Amount <input id=ucFeyAltarBonus type=text value=40 size=4> (two alters with one at Level 10 is 40% boost. one alter at level 9 is 18%) <br><br>\
  460. <table border=1><tr><td><b>Research</b></td><td><b>Level</b></td><td style="background-color:black"></td><td><b>TR Stats</b></td><td><b>Life</b></td><td><b>Atk</b></td><td><b>Def</b></td><td><b>Spd</b></td><td><b>Rng</b></td></tr>\
  461. <tr><td>Healing Potions (life) </td><td><input id=ucResHP type=text value=12 size=4></td><td style="background-color:black"></td><td>TR All Buff</td> <td><input id=ucLifeMod type=text value=0 size=4></td><td><input id=ucAtkMod type=text value=0 size=4></td><td><input id=ucDefMod type=text value=0 size=4></td><td><input id=ucSpdMod type=text value=0 size=4></td><td><input id=ucRngMod type=text value=0 size=4></td></tr>\
  462. <tr><td>Poisoned Edge (atk) </td><td><input id=ucResPE type=text value=12 size=4></td><td style="background-color:black"></td><td>TR Infantry Buff</td> <td><input id=ucLifeModInf type=text value=0 size=4></td><td><input id=ucAtkModInf type=text value=0 size=4></td><td><input id=ucDefModInf type=text value=0 size=4></td><td><input id=ucSpdModInf type=text value=0 size=4></td><td><input id=ucRngModInf type=text value=0 size=4></td></tr>\
  463. <tr><td>Metal Alloys (def) </td><td><input id=ucResMA type=text value=12 size=4></td><td style="background-color:black"></td><td>TR Ranged Buff</td> <td><input id=ucLifeModRng type=text value=0 size=4></td><td><input id=ucAtkModRng type=text value=0 size=4></td><td><input id=ucDefModRng type=text value=0 size=4></td><td><input id=ucSpdModRng type=text value=0 size=4></td><td><input id=ucRngModRng type=text value=0 size=4></td></tr>\
  464. <tr><td>Alloy Horseshoes (spd) </td><td><input id=ucResAH type=text value=12 size=4></td><td style="background-color:black"></td><td>TR Siege Buff</td> <td><input id=ucLifeModSig type=text value=0 size=4></td><td><input id=ucAtkModSig type=text value=0 size=4></td><td><input id=ucDefModSig type=text value=0 size=4></td><td><input id=ucSpdModSig type=text value=0 size=4></td><td><input id=ucRngModSig type=text value=0 size=4></td></tr>\
  465. <tr><td>Fletching (rng) </td><td><input id=ucResFL type=text value=12 size=4></td><td style="background-color:black"></td><td>TR Horsed Buff</td> <td><input id=ucLifeModHor type=text value=0 size=4></td><td><input id=ucAtkModHor type=text value=0 size=4></td><td><input id=ucDefModHor type=text value=0 size=4></td><td><input id=ucSpdModHor type=text value=0 size=4></td><td><input id=ucRngModHor type=text value=0 size=4></td></tr></table><br>\
  466. <table border=1><tr><td><b>Guardians</b></td><td><b>Wood</b></td><td><b>Ore</b></td><td><b>Food</b></td><td><b>Stone</b></td></tr>\
  467. <tr><td>Level</td> <td><input id=ucWood type=text value=9 size=4></td> <td><input id=ucOre type=text value=9 size=4> </td><td><input id=ucFood type=text value=9 size=4></td><td><input id=ucStone type=text value=9 size=4></td></tr>\
  468. <tr><td>Active</td> <td><input id=ucWoodAct type=radio name=ucGuard checked></td><td><input id=ucOreAct type=radio name=ucGuard> </td><td><input id=ucFoodAct type=radio name=ucGuard></td><td><input id=ucStoneAct type=radio name=ucGuard></td></tr>\
  469. <tr><td>Set Bonus</td><td><input id=ucGuardSet type=checkbox unchecked></td><td></td><td></td><td></td></tr>\
  470. <tr><td>Troops on Defense (Wood Guardian)</td><td><input id=ucDefending type=checkbox unchecked></td><td></td><td></td><td></td></tr>\
  471. <tr><td>Item Boost</td><td>+20atk<input id=ucItemAtk20 type=checkbox unchecked></td><td>+50atk<input id=ucItemAtk50 type=checkbox unchecked></td><td>+20def<input id=ucItemDef20 type=checkbox unchecked></td><td>+50def<input id=ucItemDef50 type=checkbox unchecked></td></tr>\
  472. <tr><td>Empowered Iron Blessing (Fey)</td><td></td><td><input id=ucOreBless type=checkbox unchecked></td><td> </td><td></td></tr>\
  473. </table>';
  474. // Event listener Knight Level
  475. document.getElementById('ucKnightLevel').addEventListener('change', function(e){
  476. if (isNaN(e.target.value)) e.target.value=1 ;
  477. if (e.target.value < 1) alert('Enter positive numbers!');
  478. t.modifyUnitResearch();
  479. }, false);
  480.  
  481. // Event listener Fey Altar
  482. document.getElementById('ucFeyAltarActive').addEventListener('change', function(e){
  483. t.modifyUnitResearch();
  484. }, false);
  485. document.getElementById('ucFeyAltarBonus').addEventListener('change', function(e){
  486. if (isNaN(e.target.value)) e.target.value=1 ;
  487. if (e.target.value < 1 || e.target.value > 40) alert('Enter a numbers between 1-40!');
  488. t.modifyUnitResearch();
  489. }, false);
  490. // Event listener Guardian
  491. document.getElementById('ucWood').addEventListener('change', function(e){
  492. if (isNaN(e.target.value)) e.target.value=0 ;
  493. if (e.target.vale > 12 ) alert('Enter a number between 0-12!');
  494. t.modifyUnitResearch();
  495. }, false);
  496. document.getElementById('ucOre').addEventListener('change', function(e){
  497. if (isNaN(e.target.value)) e.target.value=0 ;
  498. if (e.target.vale > 12 ) alert('Enter a number between 0-12!');
  499. t.modifyUnitResearch();
  500. }, false);
  501. document.getElementById('ucFood').addEventListener('change', function(e){
  502. if (isNaN(e.target.value)) e.target.value=0 ;
  503. if (e.target.vale > 12 ) alert('Enter a number between 0-12!');
  504. t.modifyUnitResearch();
  505. }, false);
  506. document.getElementById('ucStone').addEventListener('change', function(e){
  507. if (isNaN(e.target.value)) e.target.value=0 ;
  508. if (e.target.vale > 12 ) alert('Enter a number between 0-12!');
  509. t.modifyUnitResearch();
  510. }, false);
  511. document.getElementById('ucWoodAct').addEventListener('change', function(e){
  512. t.modifyUnitResearch();
  513. }, false);
  514. document.getElementById('ucOreAct').addEventListener('change', function(e){
  515. t.modifyUnitResearch();
  516. }, false);
  517. document.getElementById('ucFoodAct').addEventListener('change', function(e){
  518. t.modifyUnitResearch();
  519. }, false);
  520. document.getElementById('ucStoneAct').addEventListener('change', function(e){
  521. t.modifyUnitResearch();
  522. }, false);
  523. document.getElementById('ucGuardSet').addEventListener('change', function(e){
  524. t.modifyUnitResearch();
  525. }, false);
  526. document.getElementById('ucDefending').addEventListener('change', function(e){
  527. t.modifyUnitResearch();
  528. }, false);
  529. document.getElementById('ucOreBless').addEventListener('change', function(e){
  530. t.modifyUnitResearch();
  531. }, false);
  532. //Event listener Item Boosts
  533. document.getElementById('ucItemAtk20').addEventListener('change', function(e){
  534. t.modifyUnitResearch();
  535. }, false);
  536. document.getElementById('ucItemAtk50').addEventListener('change', function(e){
  537. t.modifyUnitResearch();
  538. }, false);
  539. document.getElementById('ucItemDef20').addEventListener('change', function(e){
  540. t.modifyUnitResearch();
  541. }, false);
  542. document.getElementById('ucItemDef50').addEventListener('change', function(e){
  543. t.modifyUnitResearch();
  544. }, false);
  545. // Event listener Research Level
  546. document.getElementById('ucResHP').addEventListener('change', function(e){
  547. if (isNaN(e.target.value)) e.target.value=1 ;
  548. if (e.target.value < 1 || e.target.vale > 12 ) alert('Enter a number between 1-12!');
  549. t.modifyUnitResearch();
  550. }, false);
  551. document.getElementById('ucResPE').addEventListener('change', function(e){
  552. if (isNaN(e.target.value)) e.target.value=1 ;
  553. if (e.target.value < 1 || e.target.vale > 12 ) alert('Enter a number between 1-12!');
  554. t.modifyUnitResearch();
  555. }, false);
  556. document.getElementById('ucResMA').addEventListener('change', function(e){
  557. if (isNaN(e.target.value)) e.target.value=1 ;
  558. if (e.target.value < 1 || e.target.vale > 12 ) alert('Enter a number between 1-12!');
  559. t.modifyUnitResearch();
  560. }, false);
  561. document.getElementById('ucResAH').addEventListener('change', function(e){
  562. if (isNaN(e.target.value)) e.target.value=1 ;
  563. if (e.target.value < 1 || e.target.vale > 12 ) alert('Enter a number between 1-12!');
  564. t.modifyUnitResearch();
  565. }, false);
  566. document.getElementById('ucResFL').addEventListener('change', function(e){
  567. if (isNaN(e.target.value)) e.target.value=1 ;
  568. if (e.target.value < 1 || e.target.vale > 12 ) alert('Enter a number between 1-12!');
  569. t.modifyUnitResearch();
  570. }, false);
  571.  
  572. // Event listener Throne
  573. document.getElementById('ucLifeMod').addEventListener('change', function(e){
  574. if (isNaN(e.target.value)) e.target.value=0 ;
  575. t.modifyUnitResearch();
  576. }, false);
  577. document.getElementById('ucLifeModInf').addEventListener('change', function(e){
  578. if (isNaN(e.target.value)) e.target.value=0 ;
  579. t.modifyUnitResearch();
  580. }, false);
  581. document.getElementById('ucLifeModRng').addEventListener('change', function(e){
  582. if (isNaN(e.target.value)) e.target.value=0 ;
  583. t.modifyUnitResearch();
  584. }, false);
  585. document.getElementById('ucLifeModSig').addEventListener('change', function(e){
  586. if (isNaN(e.target.value)) e.target.value=0 ;
  587. t.modifyUnitResearch();
  588. }, false);
  589. document.getElementById('ucLifeModHor').addEventListener('change', function(e){
  590. if (isNaN(e.target.value)) e.target.value=0 ;
  591. t.modifyUnitResearch();
  592. }, false);
  593.  
  594. document.getElementById('ucAtkMod').addEventListener('change', function(e){
  595. if (isNaN(e.target.value)) e.target.value=0 ;
  596. t.modifyUnitResearch();
  597. }, false);
  598. document.getElementById('ucAtkModInf').addEventListener('change', function(e){
  599. if (isNaN(e.target.value)) e.target.value=0 ;
  600. t.modifyUnitResearch();
  601. }, false);
  602. document.getElementById('ucAtkModRng').addEventListener('change', function(e){
  603. if (isNaN(e.target.value)) e.target.value=0 ;
  604. t.modifyUnitResearch();
  605. }, false);
  606. document.getElementById('ucAtkModSig').addEventListener('change', function(e){
  607. if (isNaN(e.target.value)) e.target.value=0 ;
  608. t.modifyUnitResearch();
  609. }, false);
  610. document.getElementById('ucAtkModHor').addEventListener('change', function(e){
  611. if (isNaN(e.target.value)) e.target.value=0 ;
  612. t.modifyUnitResearch();
  613. }, false);
  614.  
  615. document.getElementById('ucDefMod').addEventListener('change', function(e){
  616. if (isNaN(e.target.value)) e.target.value=0 ;
  617. t.modifyUnitResearch();
  618. }, false);
  619. document.getElementById('ucDefModInf').addEventListener('change', function(e){
  620. if (isNaN(e.target.value)) e.target.value=0 ;
  621. t.modifyUnitResearch();
  622. }, false);
  623. document.getElementById('ucDefModRng').addEventListener('change', function(e){
  624. if (isNaN(e.target.value)) e.target.value=0 ;
  625. t.modifyUnitResearch();
  626. }, false);
  627. document.getElementById('ucDefModSig').addEventListener('change', function(e){
  628. if (isNaN(e.target.value)) e.target.value=0 ;
  629. t.modifyUnitResearch();
  630. }, false);
  631. document.getElementById('ucDefModHor').addEventListener('change', function(e){
  632. if (isNaN(e.target.value)) e.target.value=0 ;
  633. t.modifyUnitResearch();
  634. }, false);
  635.  
  636. document.getElementById('ucSpdMod').addEventListener('change', function(e){
  637. if (isNaN(e.target.value)) e.target.value=0 ;
  638. t.modifyUnitResearch();
  639. }, false);
  640. document.getElementById('ucSpdModInf').addEventListener('change', function(e){
  641. if (isNaN(e.target.value)) e.target.value=0 ;
  642. t.modifyUnitResearch();
  643. }, false);
  644. document.getElementById('ucSpdModRng').addEventListener('change', function(e){
  645. if (isNaN(e.target.value)) e.target.value=0 ;
  646. t.modifyUnitResearch();
  647. }, false);
  648. document.getElementById('ucSpdModSig').addEventListener('change', function(e){
  649. if (isNaN(e.target.value)) e.target.value=0 ;
  650. t.modifyUnitResearch();
  651. }, false);
  652. document.getElementById('ucSpdModHor').addEventListener('change', function(e){
  653. if (isNaN(e.target.value)) e.target.value=0 ;
  654. t.modifyUnitResearch();
  655. }, false);
  656.  
  657. document.getElementById('ucRngMod').addEventListener('change', function(e){
  658. if (isNaN(e.target.value)) e.target.value=0 ;
  659. t.modifyUnitResearch();
  660. }, false);
  661. document.getElementById('ucRngModInf').addEventListener('change', function(e){
  662. if (isNaN(e.target.value)) e.target.value=0 ;
  663. t.modifyUnitResearch();
  664. }, false);
  665. document.getElementById('ucRngModRng').addEventListener('change', function(e){
  666. if (isNaN(e.target.value)) e.target.value=0 ;
  667. t.modifyUnitResearch();
  668. }, false);
  669. document.getElementById('ucRngModSig').addEventListener('change', function(e){
  670. if (isNaN(e.target.value)) e.target.value=0 ;
  671. t.modifyUnitResearch();
  672. }, false);
  673. document.getElementById('ucRngModHor').addEventListener('change', function(e){
  674. if (isNaN(e.target.value)) e.target.value=0 ;
  675. t.modifyUnitResearch();
  676. }, false);
  677.  
  678. t.modifyUnitResearch();
  679. },
  680.  
  681. hide : function (){ // called whenever the main window is hidden, or another tab is selected
  682. var t = Tabs.UnitCalc;
  683. },
  684.  
  685. show : function (){ // called whenever this tab is shown
  686. var t = Tabs.UnitCalc;
  687. },
  688.  
  689. modifyUnitResearch : function (){
  690. var t = Tabs.UnitCalc;
  691. var resLife = (5 * parseInt(document.getElementById('ucResHP').value)/100);
  692. var resAtk = (5 * parseInt(document.getElementById('ucResPE').value)/100);
  693. var resDef = (5 * parseInt(document.getElementById('ucResMA').value)/100);
  694. var resSpd = (5 * parseInt(document.getElementById('ucResAH').value)/100);
  695. var resRng = (5 * parseInt(document.getElementById('ucResFL').value)/100);
  696. var knight = parseFloat(document.getElementById('ucKnightLevel').value)/200;
  697. var guardLife = t.woodGuardTable(parseInt(document.getElementById('ucWood').value));
  698. var guardAtk = t.oreGuardTable(parseInt(document.getElementById('ucOre').value));
  699. var guardLifeAct = document.getElementById('ucWoodAct').checked ? 1 : 0;
  700. var guardAtkAct = document.getElementById('ucOreAct').checked ? 1 : 0;
  701. var guardSetAct = document.getElementById('ucGuardSet').checked ? 1 : 0;
  702. var guardOreBless = document.getElementById('ucOreBless').checked ? 1 : 0;
  703. var defending = document.getElementById('ucDefending').checked ? 1 : 0;
  704. var itemAtk = 0;
  705. var itemDef = 0;
  706. var feyAltarAct = document.getElementById('ucFeyAltarActive').checked ? 1 : 0;
  707. var feyAltar = parseFloat(document.getElementById('ucFeyAltarBonus').value)/100;
  708.  
  709. if (document.getElementById('ucItemAtk20').checked)
  710. itemAtk = 0.2 + itemAtk;
  711. if (document.getElementById('ucItemAtk50').checked)
  712. itemAtk = 0.5 + itemAtk;
  713. if (document.getElementById('ucItemDef20').checked)
  714. itemDef = 0.2 + itemDef;
  715. if (document.getElementById('ucItemDef50').checked)
  716. itemDef = 0.5 + itemDef;
  717. // calculate guardian
  718. if (guardSetAct) { //if you have set bonus
  719. if (guardLifeAct && defending) { //if your want defending troop stats
  720. guardLife = (guardLife/2 + guardLife) / 100;
  721. guardAtk = (guardAtk/200) + guardOreBless*0.15 + guardOreBless*0.15*(guardAtk/200);
  722. }
  723. else if (guardAtkAct) {
  724. guardAtk = (1.5*guardAtk/100) + guardOreBless*0.15 + guardOreBless*(1.5*guardAtk/100);
  725. if(defending)
  726. guardLife = guardLife/200;
  727. else
  728. guardLife = 0;
  729. }
  730. else {
  731. guardAtk = (guardAtk/200) + guardOreBless*0.15 + guardOreBless*0.15*(guardAtk/200);
  732. if(defending)
  733. guardLife = guardLife/200;
  734. else
  735. guardLife = 0;
  736. }
  737. } else { // don't have set bonus
  738. if (guardLifeAct && defending) {
  739. guardLife = guardLife / 100;
  740. guardAtk = 0;
  741. }
  742. else if (guardAtkAct) {
  743. guardAtk = (guardAtk/100) + guardOreBless*0.15 + guardOreBless*0.15*(guardAtk/100);
  744. guardLife = 0;
  745. }
  746. else {
  747. guardAtk = 0;
  748. guardLife = 0;
  749. }
  750. }
  751. //Trp0 - mm
  752. document.getElementById('ucTrp0Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp0.Life + (1 + feyAltar*feyAltarAct) * t.Trp0.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModInf').value))/100)));
  753. document.getElementById('ucTrp0Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp0.Atk + (1 + feyAltar*feyAltarAct) * t.Trp0.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModInf' ).value))/100)));
  754. document.getElementById('ucTrp0Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp0.Def + (1 + feyAltar*feyAltarAct) * t.Trp0.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModInf' ).value))/100)));
  755. document.getElementById('ucTrp0Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp0.Spd + (1 + feyAltar*feyAltarAct) * t.Trp0.Spd * ( t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModInf' ).value))/100)));
  756. document.getElementById('ucTrp0Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp0.Rng + (1 + feyAltar*feyAltarAct) * t.Trp0.Rng * ( t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModInf' ).value))/100)));
  757.  
  758. //Trp1 - scout
  759. document.getElementById('ucTrp1Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp1.Life + (1 + feyAltar*feyAltarAct) * t.Trp1.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModInf').value))/100)));
  760. document.getElementById('ucTrp1Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp1.Atk + (1 + feyAltar*feyAltarAct) * t.Trp1.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModInf' ).value))/100)));
  761. document.getElementById('ucTrp1Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp1.Def + (1 + feyAltar*feyAltarAct) * t.Trp1.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModInf' ).value))/100)));
  762. document.getElementById('ucTrp1Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp1.Spd + (1 + feyAltar*feyAltarAct) * t.Trp1.Spd * ( t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModInf' ).value))/100)));
  763. document.getElementById('ucTrp1Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp1.Rng + (1 + feyAltar*feyAltarAct) * t.Trp1.Rng * ( t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModInf' ).value))/100)));
  764.  
  765. //Trp2 - pike
  766. document.getElementById('ucTrp2Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp2.Life + (1 + feyAltar*feyAltarAct) * t.Trp2.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModInf').value))/100)));
  767. document.getElementById('ucTrp2Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp2.Atk + (1 + feyAltar*feyAltarAct) * t.Trp2.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModInf' ).value))/100)));
  768. document.getElementById('ucTrp2Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp2.Def + (1 + feyAltar*feyAltarAct) * t.Trp2.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModInf' ).value))/100)));
  769. document.getElementById('ucTrp2Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp2.Spd + (1 + feyAltar*feyAltarAct) * t.Trp2.Spd * ( t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModInf' ).value))/100)));
  770. document.getElementById('ucTrp2Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp2.Rng + (1 + feyAltar*feyAltarAct) * t.Trp2.Rng * ( t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModInf' ).value))/100)));
  771.  
  772. //Trp3 - sw
  773. document.getElementById('ucTrp3Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp3.Life + (1 + feyAltar*feyAltarAct) * t.Trp3.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModInf').value))/100)));
  774. document.getElementById('ucTrp3Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp3.Atk + (1 + feyAltar*feyAltarAct) * t.Trp3.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModInf' ).value))/100)));
  775. document.getElementById('ucTrp3Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp3.Def + (1 + feyAltar*feyAltarAct) * t.Trp3.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModInf' ).value))/100)));
  776. document.getElementById('ucTrp3Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp3.Spd + (1 + feyAltar*feyAltarAct) * t.Trp3.Spd * ( t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModInf' ).value))/100)));
  777. document.getElementById('ucTrp3Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp3.Rng + (1 + feyAltar*feyAltarAct) * t.Trp3.Rng * ( t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModInf' ).value))/100)));
  778.  
  779. //Trp4 - arch
  780. document.getElementById('ucTrp4Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp4.Life + (1 + feyAltar*feyAltarAct) * t.Trp4.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModRng').value))/100)));
  781. document.getElementById('ucTrp4Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp4.Atk + (1 + feyAltar*feyAltarAct) * t.Trp4.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModRng' ).value))/100)));
  782. document.getElementById('ucTrp4Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp4.Def + (1 + feyAltar*feyAltarAct) * t.Trp4.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModRng' ).value))/100)));
  783. document.getElementById('ucTrp4Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp4.Spd + (1 + feyAltar*feyAltarAct) * t.Trp4.Spd * ( t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModRng' ).value))/100)));
  784. document.getElementById('ucTrp4Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp4.Rng + (1 + feyAltar*feyAltarAct) * t.Trp4.Rng * (resRng + t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModRng' ).value))/100)));
  785.  
  786. //Trp5 - cav
  787. document.getElementById('ucTrp5Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp5.Life + (1 + feyAltar*feyAltarAct) * t.Trp5.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModHor').value))/100)));
  788. document.getElementById('ucTrp5Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp5.Atk + (1 + feyAltar*feyAltarAct) * t.Trp5.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModHor' ).value))/100)));
  789. document.getElementById('ucTrp5Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp5.Def + (1 + feyAltar*feyAltarAct) * t.Trp5.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModHor' ).value))/100)));
  790. document.getElementById('ucTrp5Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp5.Spd + (1 + feyAltar*feyAltarAct) * t.Trp5.Spd * (resSpd + t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModHor' ).value))/100)));
  791. document.getElementById('ucTrp5Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp5.Rng + (1 + feyAltar*feyAltarAct) * t.Trp5.Rng * ( t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModHor' ).value))/100)));
  792.  
  793. //Trp6 - hc
  794. document.getElementById('ucTrp6Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp6.Life + (1 + feyAltar*feyAltarAct) * t.Trp6.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModHor').value))/100)));
  795. document.getElementById('ucTrp6Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp6.Atk + (1 + feyAltar*feyAltarAct) * t.Trp6.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModHor' ).value))/100)));
  796. document.getElementById('ucTrp6Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp6.Def + (1 + feyAltar*feyAltarAct) * t.Trp6.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModHor' ).value))/100)));
  797. document.getElementById('ucTrp6Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp6.Spd + (1 + feyAltar*feyAltarAct) * t.Trp6.Spd * (resSpd + t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModHor' ).value))/100)));
  798. document.getElementById('ucTrp6Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp6.Rng + (1 + feyAltar*feyAltarAct) * t.Trp6.Rng * ( t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModHor' ).value))/100)));
  799.  
  800. //Trp7 - ball
  801. document.getElementById('ucTrp7Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp7.Life + (1 + feyAltar*feyAltarAct) * t.Trp7.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModSig').value))/100)));
  802. document.getElementById('ucTrp7Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp7.Atk + (1 + feyAltar*feyAltarAct) * t.Trp7.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModSig' ).value))/100)));
  803. document.getElementById('ucTrp7Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp7.Def + (1 + feyAltar*feyAltarAct) * t.Trp7.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModSig' ).value))/100)));
  804. document.getElementById('ucTrp7Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp7.Spd + (1 + feyAltar*feyAltarAct) * t.Trp7.Spd * (resSpd + t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModSig' ).value))/100)));
  805. document.getElementById('ucTrp7Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp7.Rng + (1 + feyAltar*feyAltarAct) * t.Trp7.Rng * (resRng + t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModSig' ).value))/100)));
  806.  
  807. //Trp8 - ram
  808. document.getElementById('ucTrp8Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp8.Life + (1 + feyAltar*feyAltarAct) * t.Trp8.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModSig').value))/100)));
  809. document.getElementById('ucTrp8Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp8.Atk + (1 + feyAltar*feyAltarAct) * t.Trp8.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModSig' ).value))/100)));
  810. document.getElementById('ucTrp8Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp8.Def + (1 + feyAltar*feyAltarAct) * t.Trp8.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModSig' ).value))/100)));
  811. document.getElementById('ucTrp8Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp8.Spd + (1 + feyAltar*feyAltarAct) * t.Trp8.Spd * (resSpd + t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModSig' ).value))/100)));
  812. document.getElementById('ucTrp8Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp8.Rng + (1 + feyAltar*feyAltarAct) * t.Trp8.Rng * ( t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModSig' ).value))/100)));
  813.  
  814. //Trp9 - cat
  815. document.getElementById('ucTrp9Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp9.Life + (1 + feyAltar*feyAltarAct) * t.Trp9.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModSig').value))/100)));
  816. document.getElementById('ucTrp9Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp9.Atk + (1 + feyAltar*feyAltarAct) * t.Trp9.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModSig' ).value))/100)));
  817. document.getElementById('ucTrp9Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp9.Def + (1 + feyAltar*feyAltarAct) * t.Trp9.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModSig' ).value))/100)));
  818. document.getElementById('ucTrp9Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp9.Spd + (1 + feyAltar*feyAltarAct) * t.Trp9.Spd * (resSpd + t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModSig' ).value))/100)));
  819. document.getElementById('ucTrp9Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp9.Rng + (1 + feyAltar*feyAltarAct) * t.Trp9.Rng * (resRng + t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModSig' ).value))/100)));
  820.  
  821. //Trp10 - blood
  822. //verified on 11/30 that bloods don't use infantry buff for atk/def. other stats unknown
  823. document.getElementById('ucTrp10Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp10.Life + (1 + feyAltar*feyAltarAct) * t.Trp10.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),0)/100)));
  824. document.getElementById('ucTrp10Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp10.Atk + (1 + feyAltar*feyAltarAct) * t.Trp10.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),0)/100)));
  825. document.getElementById('ucTrp10Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp10.Def + (1 + feyAltar*feyAltarAct) * t.Trp10.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),0)/100)));
  826. document.getElementById('ucTrp10Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp10.Spd + (1 + feyAltar*feyAltarAct) * t.Trp10.Spd * ( t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),0)/100)));
  827. document.getElementById('ucTrp10Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp10.Rng + (1 + feyAltar*feyAltarAct) * t.Trp10.Rng * ( t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),0)/100)));
  828.  
  829. //Trp11 - exec
  830. //verified on 11/30 that exec don't use infantry buff for atk/def. other stats unknown
  831. document.getElementById('ucTrp11Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp11.Life + (1 + feyAltar*feyAltarAct) * t.Trp11.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),0)/100)));
  832. document.getElementById('ucTrp11Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp11.Atk + (1 + feyAltar*feyAltarAct) * t.Trp11.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),0)/100)));
  833. document.getElementById('ucTrp11Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp11.Def + (1 + feyAltar*feyAltarAct) * t.Trp11.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),0)/100)));
  834. document.getElementById('ucTrp11Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp11.Spd + (1 + feyAltar*feyAltarAct) * t.Trp11.Spd * ( t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),0)/100)));
  835. document.getElementById('ucTrp11Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp11.Rng + (1 + feyAltar*feyAltarAct) * t.Trp11.Rng * ( t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),0)/100)));
  836.  
  837. //Trp12 - siege wall
  838. document.getElementById('ucTrp12Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp12.Life + (1 + feyAltar*feyAltarAct) * t.Trp12.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModSig').value))/100)));
  839. document.getElementById('ucTrp12Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp12.Atk + (1 + feyAltar*feyAltarAct) * t.Trp12.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModSig' ).value))/100)));
  840. document.getElementById('ucTrp12Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp12.Def + (1 + feyAltar*feyAltarAct) * t.Trp12.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModSig' ).value))/100)));
  841. document.getElementById('ucTrp12Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp12.Spd + (1 + feyAltar*feyAltarAct) * t.Trp12.Spd * ( + t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModSig' ).value))/100)));
  842. document.getElementById('ucTrp12Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp12.Rng + (1 + feyAltar*feyAltarAct) * t.Trp12.Rng * ( + t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModSig' ).value))/100)));
  843. //Trp13 - flame arch
  844. document.getElementById('ucTrp13Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp13.Life + (1 + feyAltar*feyAltarAct) * t.Trp13.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModRng').value))/100)));
  845. document.getElementById('ucTrp13Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp13.Atk + (1 + feyAltar*feyAltarAct) * t.Trp13.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModRng' ).value))/100)));
  846. document.getElementById('ucTrp13Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp13.Def + (1 + feyAltar*feyAltarAct) * t.Trp13.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModRng' ).value))/100)));
  847. document.getElementById('ucTrp13Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp13.Spd + (1 + feyAltar*feyAltarAct) * t.Trp13.Spd * ( t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModRng' ).value))/100)));
  848. document.getElementById('ucTrp13Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp13.Rng + (1 + feyAltar*feyAltarAct) * t.Trp13.Rng * (resRng + t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModRng' ).value))/100)));
  849.  
  850. //Trp14 - hussar
  851. document.getElementById('ucTrp14Life').innerHTML = t.round1decimals( (1 + guardLife) * ( (1 + feyAltar*feyAltarAct) * t.Trp14.Life + (1 + feyAltar*feyAltarAct) * t.Trp14.Life * (resLife + t.maxBuff('life',parseFloat(document.getElementById('ucLifeMod').value),parseFloat(document.getElementById('ucLifeModHor').value))/100)));
  852. document.getElementById('ucTrp14Atk').innerHTML = t.round1decimals( (1 + guardAtk) * ( (1 + feyAltar*feyAltarAct) * t.Trp14.Atk + (1 + feyAltar*feyAltarAct) * t.Trp14.Atk * (resAtk + knight + itemAtk + t.maxBuff('atk', parseFloat(document.getElementById('ucAtkMod' ).value),parseFloat(document.getElementById('ucAtkModHor' ).value))/100)));
  853. document.getElementById('ucTrp14Def').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp14.Def + (1 + feyAltar*feyAltarAct) * t.Trp14.Def * (resDef + knight + itemDef + t.maxBuff('def', parseFloat(document.getElementById('ucDefMod' ).value),parseFloat(document.getElementById('ucDefModHor' ).value))/100)));
  854. document.getElementById('ucTrp14Spd').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp14.Spd + (1 + feyAltar*feyAltarAct) * t.Trp14.Spd * (resSpd + t.maxBuff('spd', parseFloat(document.getElementById('ucSpdMod' ).value),parseFloat(document.getElementById('ucSpdModHor' ).value))/100)));
  855. document.getElementById('ucTrp14Rng').innerHTML = t.round1decimals( ( (1 + feyAltar*feyAltarAct) * t.Trp14.Rng + (1 + feyAltar*feyAltarAct) * t.Trp14.Rng * ( t.maxBuff('rng', parseFloat(document.getElementById('ucRngMod' ).value),parseFloat(document.getElementById('ucRngModHor' ).value))/100)));
  856. },
  857.  
  858. maxBuff : function (stat,a,b) {
  859. if (stat == 'life')
  860. if (a+b > 250)
  861. return 250;
  862. else if (a+b < -50)
  863. return -50;
  864. else
  865. return a+b;
  866. if (stat == 'atk')
  867. if (a+b > 1000)
  868. return 1000;
  869. else if (a+b < -25)
  870. return -25;
  871. else
  872. return a+b;
  873. if (stat == 'def')
  874. if (a+b > 5000)
  875. return 5000;
  876. else if (a+b < -25)
  877. return -25;
  878. else
  879. return a+b;
  880. if (stat == 'spd')
  881. if (a+b > 375)
  882. return 375;
  883. else if (a+b < -50)
  884. return -50;
  885. else
  886. return a+b;
  887. if (stat == 'rng')
  888. if (a+b > 185)
  889. return 185;
  890. else if (a+b < -25)
  891. return -25;
  892. else
  893. return a+b;
  894. },
  895.  
  896. round1decimals : function (number) {
  897. return Math.round(number * 10) / 10;
  898. },
  899. woodGuardTable : function (number) {
  900. if (number == '1')
  901. return 1;
  902. else if (number == '2')
  903. return 2;
  904. else if (number == '3')
  905. return 3;
  906. else if (number == '4')
  907. return 4;
  908. else if (number == '5')
  909. return 6;
  910. else if (number == '6')
  911. return 8;
  912. else if (number == '7')
  913. return 10;
  914. else if (number == '8')
  915. return 13;
  916. else if (number == '9')
  917. return 16;
  918. else if (number == '10')
  919. return 20;
  920. else if (number == '11')
  921. return 25;
  922. else if (number == '12')
  923. return 35;
  924. else
  925. return 0;
  926. },
  927.  
  928. oreGuardTable : function (number) {
  929. if (number == '1')
  930. return 2;
  931. else if (number == '2')
  932. return 4;
  933. else if (number == '3')
  934. return 6;
  935. else if (number == '4')
  936. return 8;
  937. else if (number == '5')
  938. return 12;
  939. else if (number == '6')
  940. return 16;
  941. else if (number == '7')
  942. return 20;
  943. else if (number == '8')
  944. return 26;
  945. else if (number == '9')
  946. return 32;
  947. else if (number == '10')
  948. return 40;
  949. else if (number == '11')
  950. return 50;
  951. else if (number == '12')
  952. return 65;
  953. else
  954. return 0;
  955. },
  956.  
  957. }
  958.  
  959. /**************************** Advisor Tab ******************************/
  960. Tabs.Advisor = {
  961. tabOrder : 400, // order to place tab in top bar
  962. tabLabel : 'Advisor', // label to show in main window tabs
  963. myDiv : null,
  964. timer : null,
  965.  
  966. init : function (div){ // called once, upon script startup
  967. var t = Tabs.Advisor;
  968. t.myDiv = div;
  969. div.innerHTML = 'Unique Advisors<br>\
  970. Show: <input id=advisorKay type=checkbox checked> Kay | <input id=advisorWynn type=checkbox checked> Wynn |\
  971. <input id=advisorMordred type=checkbox checked> Mordred | <input id=advisorHarbinger type=checkbox checked> Harbinger |\
  972. <input id=advisorWarhorse type=checkbox checked> Warhorse | <input id=advisorWinter type=checkbox checked> Father Winter\
  973. <TABLE border=1 id=tableAdvisor>\
  974. <tbody id=tableKay>\
  975. <tr><th>Advisor </th><th>Row</th><th>Attribute </th><th>+1 </th><th>+2 </th><th>+3 </th><th>+4 </th><th>+5 </th><th>+6 </th><th>+7 </th><th>+8 </th><th>+9 </th><th>+10 </th><th>+11 </th><th>+12 </th><th>Attribute</th></tr>\
  976. <tr><td>Kay </td><td>1 </td><td>Siege Attak Debuff </td><td>-6.5 </td><td>-9.5 </td><td>-14 </td><td>-20 </td><td>-27.5</td><td>-36.5</td><td>-47 </td><td>-59 </td><td>-72.5</td><td>-87.5</td><td>-104 </td><td>-122 </td><td>Siege Attak Debuff</td></tr>\
  977. <tr><td>Kay </td><td>2 </td><td>Accuracy Debuff </td><td>-0.06</td><td>-0.08</td><td>-0.11</td><td>-0.15</td><td>-0.2 </td><td>-0.26</td><td>-0.33</td><td>-0.41</td><td>-0.5 </td><td>-0.6 </td><td>-0.71</td><td>-0.83</td><td>Accuracy Debuff</td></tr>\
  978. <tr><td>Kay </td><td>3 </td><td>Life </td><td>+13 </td><td>+19 </td><td>+28 </td><td>+40 </td><td>+55 </td><td>+73 </td><td>+94 </td><td>+118 </td><td>+145 </td><td>+175 </td><td>+208 </td><td>+244 </td><td>Life</td></tr>\
  979. <tr><td>Kay </td><td>4 </td><td>Defense </td><td>+106 </td><td>+118 </td><td>+136 </td><td>+160 </td><td>+190 </td><td>+226 </td><td>+268 </td><td>+316 </td><td>+370 </td><td>+430 </td><td>+496 </td><td>+568 </td><td>Defense</td></tr>\
  980. <tr><td>Kay </td><td>5 </td><td>Range Debuff </td><td>-6.5 </td><td>-9.5 </td><td>-14 </td><td>-20 </td><td>-27.5</td><td>-36.5</td><td>-47 </td><td>-59 </td><td>-72.5</td><td>-87.5</td><td>-104 </td><td>-122 </td><td>Range Debuff</td></tr>\
  981. </tbody>\
  982. <tbody id=tableWynn>\
  983. <tr><th>Advisor </th><th>Row</th><th>Attribute </th><th>+1 </th><th>+2 </th><th>+3 </th><th>+4 </th><th>+5 </th><th>+6 </th><th>+7 </th><th>+8 </th><th>+9 </th><th>+10 </th><th>+11 </th><th>+12 </th><th>Attribute</th></tr>\
  984. <tr><td>Wynn </td><td>1 </td><td>Research Speed </td><td>+14 </td><td>+18 </td><td>+24 </td><td>+32 </td><td>+42 </td><td>+54 </td><td>+68 </td><td>+84 </td><td>+102 </td><td>+122 </td><td>+144 </td><td>+168 </td><td>Research Speed</td></tr>\
  985. <tr><td>Wynn </td><td>2 </td><td>Aetherstone Cap </td><td>+7 </td><td>+11 </td><td>+17 </td><td>+25 </td><td>+35 </td><td>+47 </td><td>+61 </td><td>+77 </td><td>+95 </td><td>+115 </td><td>+137 </td><td>+161 </td><td>Aetherstone Cap</td></tr>\
  986. <tr><td>Wynn </td><td>3 </td><td>Storehouse Protection </td><td>+13 </td><td>+19 </td><td>+28 </td><td>+40 </td><td>+55 </td><td>+73 </td><td>+94 </td><td>+118 </td><td>+145 </td><td>+175 </td><td>+208 </td><td>+244 </td><td>Storehouse Protection</td></tr>\
  987. <tr><td>Wynn </td><td>4 </td><td>Troop Training Speed </td><td>+44 </td><td>+52 </td><td>+64 </td><td>+80 </td><td>+100 </td><td>+124 </td><td>+152 </td><td>+184 </td><td>+220 </td><td>+260 </td><td>+304 </td><td>+353 </td><td>Troop Training Speed</td></tr>\
  988. <tr><td>Wynn </td><td>5 </td><td>Upkeep Reduction </td><td>+6 </td><td>+8 </td><td>+11 </td><td>+15 </td><td>+20 </td><td>+26 </td><td>+33 </td><td>+41 </td><td>+50 </td><td>+60 </td><td>+71 </td><td>+83 </td><td>Upkeep Reduction</td></tr>\
  989. </tbody>\
  990. <tbody id=tableMordred>\
  991. <tr><th>Advisor </th><th>Row</th><th>Attribute </th><th>+1 </th><th>+2 </th><th>+3 </th><th>+4 </th><th>+5 </th><th>+6 </th><th>+7 </th><th>+8 </th><th>+9 </th><th>+10 </th><th>+11 </th><th>+12 </th><th>Attribute</th></tr>\
  992. <tr><td>Mordred </td><td>1 </td><td>Troop Training Speed </td><td>+14 </td><td>+18 </td><td>+24 </td><td>+32 </td><td>+42 </td><td>+54 </td><td>+68 </td><td>+84 </td><td>+102 </td><td>+122 </td><td>+144 </td><td>+168 </td><td>Troop Training Speed</td></tr>\
  993. <tr><td>Mordred </td><td>2 </td><td>Reinforcement March Speed</td><td>+24 </td><td>+32 </td><td>+44 </td><td>+60 </td><td>+80 </td><td>+104 </td><td>+132 </td><td>+164 </td><td>+200 </td><td>+240 </td><td>+284 </td><td>+332 </td><td>Reinforcement March Speed</td></tr>\
  994. <tr><td>Mordred </td><td>3 </td><td>Range Debuff </td><td>-3 </td><td>-5 </td><td>-8 </td><td>-12 </td><td>-17 </td><td>-23 </td><td>-30 </td><td>-38 </td><td>-47 </td><td>-57 </td><td>-68 </td><td>-80 </td><td>Range Debuff</td></tr>\
  995. <tr><td>Mordred </td><td>4 </td><td>Defense </td><td>+106 </td><td>+118 </td><td>+136 </td><td>+160 </td><td>+190 </td><td>+226 </td><td>+268 </td><td>+316 </td><td>+370 </td><td>+430 </td><td>+496 </td><td>+568 </td><td>Defense</td></tr>\
  996. <tr><td>Mordred </td><td>5 </td><td>Construction Speed </td><td>+27 </td><td>+33 </td><td>+42 </td><td>+54 </td><td>+69 </td><td>+87 </td><td>+108 </td><td>+132 </td><td>+159 </td><td>+189 </td><td>+222 </td><td>+258 </td><td>Construction Speed</td></tr>\
  997. </tbody>\
  998. <tbody id=tableHarbinger>\
  999. <tr><th>Advisor </th><th>Row</th><th>Attribute </th><th>+1 </th><th>+2 </th><th>+3 </th><th>+4 </th><th>+5 </th><th>+6 </th><th>+7 </th><th>+8 </th><th>+9 </th><th>+10 </th><th>+11 </th><th>+12 </th><th>Attribute</th></tr>\
  1000. <tr><td>Harbinger </td><td>1 </td><td>Horsed Combat Speed </td><td>+7 </td><td>+11 </td><td>+17 </td><td>+25 </td><td>+35 </td><td>+47 </td><td>+61 </td><td>+77 </td><td>+95 </td><td>+115 </td><td>+137 </td><td>+161 </td><td>Horsed Combat Speed</td></tr>\
  1001. <tr><td>Harbinger </td><td>2 </td><td>Ranged Range Debuff </td><td>-3 </td><td>-5 </td><td>-8 </td><td>-12 </td><td>-17 </td><td>-23 </td><td>-30 </td><td>-38 </td><td>-47 </td><td>-57 </td><td>-68 </td><td>-80 </td><td>Ranged Range Debuff</td></tr>\
  1002. <tr><td>Harbinger </td><td>3 </td><td>Defense Debuff </td><td>-44 </td><td>-52 </td><td>-64 </td><td>-80 </td><td>-100 </td><td>-124 </td><td>-152 </td><td>-184 </td><td>-220 </td><td>-260 </td><td>-304 </td><td>-353 </td><td>Defense Debuff</td></tr>\
  1003. <tr><td>Harbinger </td><td>4 </td><td>Attack Debuff </td><td>-13 </td><td>-19 </td><td>-28 </td><td>-40 </td><td>-55 </td><td>-73 </td><td>-94 </td><td>-118 </td><td>-145 </td><td>-175 </td><td>-208 </td><td>-244 </td><td>Attack Debuff</td></tr>\
  1004. <tr><td>Harbinger </td><td>5 </td><td>Life Debuff </td><td>-7 </td><td>-11 </td><td>-17 </td><td>-25 </td><td>-35 </td><td>-47 </td><td>-61 </td><td>-77 </td><td>-95 </td><td>-115 </td><td>-137 </td><td>-161 </td><td>Life Debuff</td></tr>\
  1005. </tbody>\
  1006. <tbody id=tableWarhorse>\
  1007. <tr><th>Advisor </th><th>Row</th><th>Attribute </th><th>+1 </th><th>+2 </th><th>+3 </th><th>+4 </th><th>+5 </th><th>+6 </th><th>+7 </th><th>+8 </th><th>+9 </th><th>+10 </th><th>+11 </th><th>+12 </th><th>Attribute</th></tr>\
  1008. <tr><td>Warhorse </td><td>1 </td><td>Attack Debuff </td><td>-13 </td><td>-19 </td><td>-28 </td><td>-40 </td><td>-55 </td><td>-73 </td><td>-94 </td><td>-118 </td><td>-145 </td><td>-175 </td><td>-208 </td><td>-244 </td><td>Attack Debuff</td></tr>\
  1009. <tr><td>Warhorse </td><td>2 </td><td>Horsed Life </td><td>+7 </td><td>+11 </td><td>+17 </td><td>+25 </td><td>+35 </td><td>+47 </td><td>+61 </td><td>+77 </td><td>+95 </td><td>+115 </td><td>+137 </td><td>+161 </td><td>Horsed Life</td></tr>\
  1010. <tr><td>Warhorse </td><td>3 </td><td>Horsed Defense </td><td>+23 </td><td>+29 </td><td>+38 </td><td>+50 </td><td>+65 </td><td>+83 </td><td>+104 </td><td>+128 </td><td>+155 </td><td>+185 </td><td>+218 </td><td>+254 </td><td>Horsed Defense</td></tr>\
  1011. <tr><td>Warhorse </td><td>4 </td><td>Life </td><td>+7 </td><td>+11 </td><td>+17 </td><td>+25 </td><td>+35 </td><td>+47 </td><td>+61 </td><td>+77 </td><td>+95 </td><td>+115 </td><td>+137 </td><td>+161 </td><td>Life</td></tr>\
  1012. <tr><td>Warhorse </td><td>5 </td><td>Defense </td><td>+44 </td><td>+52 </td><td>+64 </td><td>+80 </td><td>+100 </td><td>+124 </td><td>+152 </td><td>+184 </td><td>+220 </td><td>+260 </td><td>+304 </td><td>+353 </td><td>Defense</td></tr>\
  1013. </tbody>\
  1014. <tbody id=tableWinter>\
  1015. <tr><th>Advisor </th><th>Row</th><th>Attribute </th><th>+1 </th><th>+2 </th><th>+3 </th><th>+4 </th><th>+5 </th><th>+6 </th><th>+7 </th><th>+8 </th><th>+9 </th><th>+10 </th><th>+11 </th><th>+12 </th><th>Attribute</th></tr>\
  1016. <tr><td>Father Winter</td><td>1 </td><td>Life </td><td>+7 </td><td>+11 </td><td>+17 </td><td>+25 </td><td>+35 </td><td>+47 </td><td>+61 </td><td>+77 </td><td>+95 </td><td>+115 </td><td>+137 </td><td>+161 </td><td>Life</td></tr>\
  1017. <tr><td>Father Winter</td><td>2 </td><td>Range </td><td>+1.5 </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>Range</td></tr>\
  1018. <tr><td>Father Winter</td><td>3 </td><td>Defense </td><td>+44 </td><td>+52 </td><td>+64 </td><td>+80 </td><td>+100 </td><td>+124 </td><td>+152 </td><td>+184 </td><td>+220 </td><td>+260 </td><td>+304 </td><td>+353 </td><td>Defense</td></tr>\
  1019. <tr><td>Father Winter</td><td>4 </td><td>Combat Speed </td><td>+13 </td><td>+19 </td><td>+28 </td><td>+40 </td><td>+55 </td><td>+73 </td><td>+94 </td><td>+118 </td><td>+145 </td><td>+175 </td><td>+208 </td><td>+244 </td><td>Combat Speed</td></tr>\
  1020. <tr><td>Father Winter</td><td>5 </td><td>March Speed </td><td>+16.5</td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>+- </td><td>March Speed</td></tr>\
  1021. </tbody>\
  1022. </table>';
  1023. document.getElementById('advisorKay').addEventListener('change', function(e){
  1024. t.modifyAdvisor();
  1025. }, false);
  1026. document.getElementById('advisorWynn').addEventListener('change', function(e){
  1027. t.modifyAdvisor();
  1028. }, false);
  1029. document.getElementById('advisorMordred').addEventListener('change', function(e){
  1030. t.modifyAdvisor();
  1031. }, false);
  1032. document.getElementById('advisorHarbinger').addEventListener('change', function(e){
  1033. t.modifyAdvisor();
  1034. }, false);
  1035. document.getElementById('advisorWarhorse').addEventListener('change', function(e){
  1036. t.modifyAdvisor();
  1037. }, false);
  1038. document.getElementById('advisorWinter').addEventListener('change', function(e){
  1039. t.modifyAdvisor();
  1040. }, false);
  1041. },
  1042.  
  1043. hide : function (){ // called whenever the main window is hidden, or another tab is selected
  1044. var t = Tabs.Advisor;
  1045. },
  1046.  
  1047. show : function (){ // called whenever this tab is shown
  1048. var t = Tabs.Advisor;
  1049. },
  1050. modifyAdvisor : function (){
  1051. var t = Tabs.Advisor;
  1052. var kay = document.getElementById('advisorKay').checked ? 1 : 0;
  1053. var wynn = document.getElementById('advisorWynn').checked ? 1 : 0;
  1054. var mordred = document.getElementById('advisorMordred').checked ? 1 : 0;
  1055. var harbinger = document.getElementById('advisorHarbinger').checked ? 1 : 0;
  1056. var warhorse = document.getElementById('advisorWarhorse').checked ? 1 : 0;
  1057. var winter = document.getElementById('advisorWinter').checked ? 1 : 0;
  1058. if (kay)
  1059. document.getElementById('tableKay').style.display = '';
  1060. else
  1061. document.getElementById('tableKay').style.display = 'none';
  1062.  
  1063. if (wynn)
  1064. document.getElementById('tableWynn').style.display = '';
  1065. else
  1066. document.getElementById('tableWynn').style.display = 'none';
  1067.  
  1068. if (mordred)
  1069. document.getElementById('tableMordred').style.display = '';
  1070. else
  1071. document.getElementById('tableMordred').style.display = 'none';
  1072.  
  1073. if (harbinger)
  1074. document.getElementById('tableHarbinger').style.display = '';
  1075. else
  1076. document.getElementById('tableHarbinger').style.display = 'none';
  1077. if (warhorse)
  1078. document.getElementById('tableWarhorse').style.display = '';
  1079. else
  1080. document.getElementById('tableWarhorse').style.display = 'none';
  1081. if (winter)
  1082. document.getElementById('tableWinter').style.display = '';
  1083. else
  1084. document.getElementById('tableWinter').style.display = 'none';
  1085. },
  1086. }
  1087.  
  1088. /*********************************** Options Tab ***********************************/
  1089. Tabs.Options = {
  1090. tabOrder: 800,
  1091. myDiv : null,
  1092. fixAvailable : {},
  1093.  
  1094. init : function (div){
  1095. var t = Tabs.Options;
  1096. t.myDiv = div;
  1097. try {
  1098. m = '<DIV style="height:500px; max-height:500px; overflow-y:auto"><TABLE width=100% class=nbOptions cellspacing=0 cellpadding=0>\
  1099. <TR><TD colspan=2><B>Notebook Config:</b></td></tr>\
  1100. <TR><TD></td><TD><INPUT id=nbupdatenow type=submit value="Update Now"></td></tr>\
  1101. </table><BR><BR></div>';
  1102. div.innerHTML = m;
  1103.  
  1104. document.getElementById('nbupdatenow').addEventListener ('click', function(){
  1105. AutoUpdater_152625.call(true,true);
  1106. },false);
  1107. } catch (e) {
  1108. div.innerHTML = '<PRE>'+ e.name +' : '+ e.message +'</pre>';
  1109. }
  1110. },
  1111.  
  1112. hide : function (){
  1113. },
  1114.  
  1115. show : function (){
  1116. },
  1117.  
  1118. }
  1119.  
  1120. /*********************************** Issues Tab ***********************************/
  1121. Tabs.Issues = {
  1122. tabOrder: 850,
  1123. tabLabel : 'Issues', // label to show in main window tabs
  1124. myDiv : null,
  1125. timer : null,
  1126.  
  1127. init : function (div){ // called once, upon script startup
  1128. var t = Tabs.Issues;
  1129. t.myDiv = div;
  1130. div.innerHTML = 'Known Issues<br><br>';
  1131. div.innerHTML += '1. Bloods, Execs do not benefit from infantry tr items<br>';
  1132. div.innerHTML += '2. Siege Walls do not benefit from alloy horseshoes research<br>';
  1133. div.innerHTML += '3. Ore guardian bonus in ascended cities have greater attack stats<br>';
  1134. div.innerHTML += '4. Ore guardian bonus is applied to defending troops (from kabam forums)<br>';
  1135. div.innerHTML += '<br>';
  1136. },
  1137.  
  1138. hide : function (){ // called whenever the main window is hidden, or another tab is selected
  1139. var t = Tabs.Issues;
  1140. },
  1141.  
  1142. show : function (){ // called whenever this tab is shown
  1143. var t = Tabs.Issues;
  1144. },
  1145.  
  1146. }
  1147.  
  1148. /*********************************** Log Tab ***********************************/
  1149. Tabs.ActionLog = {
  1150. tabOrder: 900,
  1151. tabLabel : 'Log',
  1152. myDiv : null,
  1153. logTab : null,
  1154. maxEntries: 300,
  1155. last50 : [],
  1156. state : null,
  1157.  
  1158. init : function (div){
  1159. var t = Tabs.ActionLog;
  1160. t.myDiv = div;
  1161. t.myDiv.innerHTML = '<DIV class=nbStat>ACTION LOG - VERSION: '+ Version+'</div><DIV style="height:535px; max-height:535px; overflow-y:auto">\
  1162. <TABLE cellpadding=0 cellspacing=0 id=nbactionlog class=nbTabLined><TR><TD></td><TD width=95%></td></table></div>';
  1163. t.logTab = document.getElementById('nbactionlog');
  1164. t.state = 1;
  1165. var a = JSON2.parse(GM_getValue ('log_'+getServerId(), '[]'));
  1166. if (matTypeof(a) == 'array'){
  1167. t.last50 = a;
  1168. for (var i=0; i<t.last50.length; i++)
  1169. t._addTab (t.last50[i].msg, t.last50[i].ts);
  1170. }
  1171. window.addEventListener('unload', t.onUnload, false);
  1172. },
  1173.  
  1174. hide : function (){
  1175. },
  1176.  
  1177. show : function (){
  1178. },
  1179.  
  1180. onUnload : function (){
  1181. var t = Tabs.ActionLog;
  1182. if (!ResetAll) GM_setValue ('log_'+getServerId(), JSON2.stringify(t.last50));
  1183. },
  1184.  
  1185. _addTab : function (msg, ts){
  1186. var t = Tabs.ActionLog;
  1187. if (t.state != 1)
  1188. return;
  1189. if (t.logTab.rows.length >= t.maxEntries)
  1190. t.logTab.deleteRow(t.maxEntries-1);
  1191. var row = t.logTab.insertRow(0);
  1192. row.vAlign = 'top';
  1193. row.insertCell(0).innerHTML = ts;
  1194. row.insertCell(1).innerHTML = msg;
  1195. },
  1196.  
  1197. log : function (msg){
  1198. var t = Tabs.ActionLog;
  1199. var ts = new Date().toTimeString().substring (0,8);
  1200. t._addTab (msg, ts);
  1201. while (t.last50.length >= 50)
  1202. t.last50.shift();
  1203. t.last50.push ({msg:msg, ts:ts});
  1204. },
  1205. }
  1206.  
  1207. function actionLog (msg){
  1208. if (!Tabs.ActionLog.tabDisabled)
  1209. Tabs.ActionLog.log (msg);
  1210. }
  1211.  
  1212. var tabManager = {
  1213. tabList : {}, // {name, obj, div}
  1214. currentTab : null,
  1215.  
  1216. init : function (mainDiv){
  1217. var t = tabManager;
  1218. var sorter = [];
  1219. for (k in Tabs){
  1220. if (!Tabs[k].tabDisabled){
  1221. t.tabList[k] = {};
  1222. t.tabList[k].name = k;
  1223. t.tabList[k].obj = Tabs[k];
  1224. if (Tabs[k].tabLabel != null)
  1225. t.tabList[k].label = Tabs[k].tabLabel;
  1226. else
  1227. t.tabList[k].label = k;
  1228. if (Tabs[k].tabOrder != null)
  1229. sorter.push([Tabs[k].tabOrder, t.tabList[k]]);
  1230. else
  1231. sorter.push([1000, t.tabList[k]]);
  1232. t.tabList[k].div = document.createElement('div');
  1233. }
  1234. }
  1235.  
  1236. sorter.sort (function (a,b){return a[0]-b[0]});
  1237. var m = '<TABLE cellspacing=3 class=nbMainTab><TR>';
  1238. for (var i=0; i<sorter.length; i++) {
  1239. m += '<TD class=spacer></td><TD align=center class=notSel id=nbtc'+ sorter[i][1].name +' ><A><SPAN>'+ sorter[i][1].label +'</span></a></td>';
  1240. //m += '<TD align=center class=notSel id=nbtc'+ sorter[i][1].name +' ><A><SPAN>'+ sorter[i][1].label +'</span></a></td>';
  1241. if ((i+1)%9 == 0) m+='</tr><TR>';
  1242. }
  1243. m+='</tr></table>';
  1244. //m += '<TD class=spacer width=90% align=right>'+ Version +'&nbsp;</td></tr></table>';
  1245. mainPop.getMainTopDiv().innerHTML = m;
  1246.  
  1247. for (k in t.tabList) {
  1248. if (t.tabList[k].name == Options.currentTab)
  1249. t.currentTab =t.tabList[k] ;
  1250. document.getElementById('nbtc'+ k).addEventListener('click', this.e_clickedTab, false);
  1251. var div = t.tabList[k].div;
  1252. div.style.display = 'none';
  1253. div.style.height = '100%';
  1254. mainDiv.appendChild(div);
  1255. try {
  1256. t.tabList[k].obj.init(div);
  1257. } catch (e){
  1258. div.innerHTML = "INIT ERROR: "+ e;
  1259. }
  1260. }
  1261.  
  1262. if (t.currentTab == null)
  1263. t.currentTab = sorter[0][1];
  1264. t.setTabStyle (document.getElementById ('nbtc'+ t.currentTab.name), true);
  1265. t.currentTab.div.style.display = 'block';
  1266. },
  1267.  
  1268. hideTab : function (){
  1269. var t = tabManager;
  1270. t.currentTab.obj.hide();
  1271. },
  1272.  
  1273. showTab : function (){
  1274. var t = tabManager;
  1275. t.currentTab.obj.show();
  1276. },
  1277.  
  1278. setTabStyle : function (e, selected){
  1279. if (selected){
  1280. e.className = 'sel';
  1281. } else {
  1282. e.className = 'notSel';
  1283. }
  1284. },
  1285.  
  1286. e_clickedTab : function (e){
  1287. var t = tabManager;
  1288. var newTab = t.tabList[e.target.parentNode.parentNode.id.substring(4)];
  1289. if (t.currentTab.name != newTab.name){
  1290. t.setTabStyle (document.getElementById ('nbtc'+ t.currentTab.name), false);
  1291. t.setTabStyle (document.getElementById ('nbtc'+ newTab.name), true);
  1292. t.currentTab.obj.hide ();
  1293. t.currentTab.div.style.display = 'none';
  1294. t.currentTab = newTab;
  1295. newTab.div.style.display = 'block';
  1296. Options.currentTab = newTab.name;
  1297. }
  1298. newTab.obj.show();
  1299. },
  1300. }
  1301.  
  1302. function onUnload (){
  1303. Options.nbWinPos = mainPop.getLocation();
  1304. if (!ResetAll) saveOptions();
  1305. }
  1306.  
  1307. function mouseMainTab (me){ // right-click on main button resets window location
  1308. if (me.button == 2){
  1309. var c = getClientCoords (document.getElementById('main_engagement_tabs'));
  1310. mainPop.setLocation ({x: c.x+4, y: c.y+c.height});
  1311. }
  1312. }
  1313.  
  1314. function eventHideShow (){
  1315. if (mainPop.toggleHide(mainPop)){
  1316. tabManager.showTab();
  1317. Options.nbWinIsOpen = true;
  1318. } else {
  1319. tabManager.hideTab();
  1320. Options.nbWinIsOpen = false;
  1321. }
  1322. saveOptions();
  1323. }
  1324.  
  1325. function hideMe (){
  1326. mainPop.show (false);
  1327. tabManager.hideTab();
  1328. Options.nbWinIsOpen = false;
  1329. saveOptions();
  1330. }
  1331.  
  1332. function showMe (){
  1333. mainPop.show (true);
  1334. tabManager.showTab();
  1335. Options.nbWinIsOpen = true;
  1336. saveOptions();
  1337. }
  1338.  
  1339. // example: http://www150.kingdomsofcamelot.com
  1340. var myServerId = null;
  1341. function getServerId() {
  1342. if (myServerId == null){
  1343. var m=/^[a-zA-Z]+([0-9]+)\./.exec(document.location.hostname);
  1344. if (m)
  1345. myServerId = m[1];
  1346. else
  1347. myServerId = '??';
  1348. }
  1349. return myServerId;
  1350. }
  1351.  
  1352. function logit (msg){
  1353. var now = new Date();
  1354. GM_log (getServerId() +' @ '+ now.toTimeString().substring (0,8) +'.' + now.getMilliseconds() +': '+ msg);
  1355. }
  1356.  
  1357. function saveOptions (){
  1358. var serverID = getServerId();
  1359. setTimeout (function (){GM_setValue ('Options_'+serverID, JSON2.stringify(Options));}, 0);
  1360. }
  1361.  
  1362. function saveRCOptions (){
  1363. var serverID = getServerId();
  1364. setTimeout (function (){GM_setValue ('RCOptions_'+serverID, JSON2.stringify(RCOptions));}, 0);
  1365. }
  1366.  
  1367. function readLayoutOptions (){
  1368. var serverID = getServerId();
  1369. s = GM_getValue ('LayoutOptions_'+serverID, '[]');
  1370. if (s != null){
  1371. opts = JSON2.parse (s);
  1372. for (k in opts){
  1373. if (matTypeof(opts[k]) == 'object')
  1374. for (kk in opts[k])
  1375. layoutOptions[k][kk] = opts[k][kk];
  1376. else
  1377. layoutOptions[k] = opts[k];
  1378. }
  1379. }
  1380. }
  1381.  
  1382. function readOptions (){
  1383. var serverID = getServerId();
  1384. s = GM_getValue ('Options_'+serverID);
  1385. if (s != null){
  1386. opts = JSON2.parse (s);
  1387. for (k in opts){
  1388. if (matTypeof(opts[k]) == 'object')
  1389. for (kk in opts[k])
  1390. Options[k][kk] = opts[k][kk];
  1391. else
  1392. Options[k] = opts[k];
  1393. }
  1394. }
  1395. }
  1396.  
  1397. function readGlobalOptions (){
  1398. GlobalOptions = JSON2.parse (GM_getValue ('Options_??', '{}'));
  1399. }
  1400.  
  1401. function readRCOptions (){
  1402. var serverID = getServerId();
  1403. s = GM_getValue ('RCOptions_'+serverID);
  1404. if (s != null){
  1405. opts = JSON2.parse (s);
  1406. for (k in opts){
  1407. if (matTypeof(opts[k]) == 'object')
  1408. for (kk in opts[k])
  1409. RCOptions[k][kk] = opts[k][kk];
  1410. else
  1411. RCOptions[k] = opts[k];
  1412. }
  1413. }
  1414. }
  1415.  
  1416.  
  1417. function createButton (label,id){
  1418. var a=document.createElement('a');
  1419. a.className='button20';
  1420. a.id = id;
  1421. a.innerHTML='<span style="color: #ff6">'+ label +'</span>';
  1422. return a;
  1423. }
  1424.  
  1425. function AddMainTabLink(text, eventListener, mouseListener) {
  1426. var a = createButton (text,'botbutton');
  1427. a.className='tab';
  1428. var tabs=document.getElementById('main_engagement_tabs');
  1429. if(!tabs) {
  1430. tabs=document.getElementById('topnav_msg');
  1431. if (tabs)
  1432. tabs=tabs.parentNode;
  1433. }
  1434. if (tabs) {
  1435. var e = tabs.parentNode;
  1436. var gmTabs = null;
  1437. for (var i=0; i<e.childNodes.length; i++){
  1438. var ee = e.childNodes[i];
  1439. if (ee.tagName && ee.tagName=='DIV' && ee.className=='tabs_engagement' && ee.id!='main_engagement_tabs'){
  1440. gmTabs = ee;
  1441. break;
  1442. }
  1443. }
  1444. if (gmTabs == null){
  1445. gmTabs = document.createElement('div');
  1446. gmTabs.className='tabs_engagement';
  1447. gmTabs.style.background='#ca5';
  1448. tabs.parentNode.insertBefore (gmTabs, tabs);
  1449. gmTabs.style.whiteSpace='nowrap';
  1450. gmTabs.style.width='735px';
  1451. gmTabs.lang = 'en_NB';
  1452. }
  1453. gmTabs.appendChild(a);
  1454. a.addEventListener('click',eventListener, false);
  1455. if (mouseListener != null)
  1456. a.addEventListener('mousedown',mouseListener, true);
  1457. return a;
  1458. }
  1459. return null;
  1460. }
  1461.  
  1462. function AddSubTabLink(text, eventListener, id) {
  1463. var a = createButton (text,'botbutton');
  1464. a.className='tab';
  1465. var tabs=document.getElementById('main_engagement_tabs');
  1466. if(!tabs) {
  1467. tabs=document.getElementById('topnav_msg');
  1468. if (tabs)
  1469. tabs=tabs.parentNode;
  1470. }
  1471. if (tabs) {
  1472. var e = tabs.parentNode;
  1473. var gmTabs = null;
  1474. for (var i=0; i<e.childNodes.length; i++){
  1475. var ee = e.childNodes[i];
  1476. if (ee.tagName && ee.tagName=='DIV' && ee.className=='tabs_engagement' && ee.id!='main_engagement_tabs'){
  1477. gmTabs = ee;
  1478. break;
  1479. }
  1480. }
  1481. if (gmTabs == null){
  1482. gmTabs = document.createElement('div');
  1483. gmTabs.className='tabs_engagement';
  1484. gmTabs.style.background='#ca5';
  1485. tabs.parentNode.insertBefore (gmTabs, tabs);
  1486. gmTabs.style.whiteSpace='nowrap';
  1487. gmTabs.style.width='735px';
  1488. gmTabs.lang = 'en_NB';
  1489. }
  1490. gmTabs.appendChild(a);
  1491. a.addEventListener('click',eventListener, false);
  1492. if (id != null)
  1493. a.id = id;
  1494. return a;
  1495. }
  1496. return null;
  1497. }
  1498.  
  1499.  
  1500. /************* Updater code *************/
  1501. // Function for displaying a confirmation message modal popup similar to the default javascript confirm() function
  1502. // but with the advantage being that it won't halt all other javascript being executed on the page.
  1503. // Original Author: Thomas Chapin (April 6, 2011)
  1504. function display_confirm(confirm_msg,ok_function,cancel_function){
  1505. if(!confirm_msg){confirm_msg="";}
  1506.  
  1507. var container_div = document.getElementById('modal_js_confirm');
  1508. var div;
  1509. if(!container_div) {
  1510. container_div=document.createElement('div');
  1511. container_div.id='modal_js_confirm';
  1512. container_div.style.position='absolute';
  1513. container_div.style.top='0px';
  1514. container_div.style.left='0px';
  1515. container_div.style.width='100%';
  1516. container_div.style.height='1px';
  1517. container_div.style.overflow='visible';
  1518. container_div.style.zIndex=10000000;
  1519.  
  1520. div=document.createElement('div');
  1521. div.id='modal_js_confirm_contents';
  1522. div.style.zIndex=10000000;
  1523. div.style.backgroundColor='#eee';
  1524. div.style.fontFamily='"lucida grande",tahoma,verdana,arial,sans-serif';
  1525. div.style.fontSize='11px';
  1526. div.style.textAlign='center';
  1527. div.style.color='#333333';
  1528. div.style.border='2px outset #666';
  1529. div.style.padding='10px';
  1530. div.style.position='relative';
  1531. div.style.width='300px';
  1532. div.style.height='100px';
  1533. div.style.margin='300px auto 0px auto';
  1534. div.style.display='block';
  1535.  
  1536. container_div.appendChild(div);
  1537. document.body.appendChild(container_div);
  1538.  
  1539. div.innerHTML = '<div style="text-align:center"><div>'+confirm_msg+'</div><br/><div>Press OK to continue.</div><br><button id="modal_js_confirm_ok_button">OK</button> <button id="modal_js_confirm_cancel_button">Cancel</button></div>';
  1540. var ok_button = document.getElementById('modal_js_confirm_ok_button');
  1541. ok_button.addEventListener('click',function() {
  1542. if(ok_function && typeof(ok_function) == "function"){
  1543. ok_function();
  1544. }
  1545. container_div.parentNode.removeChild(container_div);
  1546. },false);
  1547. var cancel_button = document.getElementById('modal_js_confirm_cancel_button');
  1548. cancel_button.addEventListener('click',function() {
  1549. if(cancel_function && typeof(cancel_function) == "function"){
  1550. cancel_function();
  1551. }
  1552. container_div.parentNode.removeChild(container_div);
  1553. },false);
  1554. }
  1555. }
  1556.  
  1557. // The following code is released under public domain.
  1558.  
  1559. var AutoUpdater_152625 = {
  1560. id: 152625,
  1561. days: 1,
  1562. name: "KOC Notebook",
  1563. version: Version,
  1564. beta: GlobalOptions.nbupdatebeta,
  1565. betaUrl : 'http://koc-power-bot.googlecode.com/svn/trunk/KOCpowerBot.user.js',
  1566. time: new Date().getTime(),
  1567. call: function(response, secure) {
  1568. GM_xmlhttpRequest({
  1569. method: 'GET',
  1570. url: this.beta ? this.betaUrl : 'http'+(secure ? 's' : '')+'://userscripts.org/scripts/source/'+this.id+'.meta.js',
  1571. onload: function(xpr) {AutoUpdater_152625.compare(xpr, response);},
  1572. onerror: function(xpr) {if (secure) AutoUpdater_152625.call(response, false);}
  1573. });
  1574. },
  1575. enable: function() {
  1576. GM_registerMenuCommand("Enable "+this.name+" updates", function() {
  1577. GM_setValue('updated_152625', new Date().getTime()+'');
  1578. AutoUpdater_152625.call(true, true)
  1579. });
  1580. },
  1581. compareVersion: function(r_version, l_version) {
  1582. var r_parts = r_version.split(''),
  1583. l_parts = l_version.split(''),
  1584. r_len = r_parts.length,
  1585. l_len = l_parts.length,
  1586. r = l = 0;
  1587. for(var i = 0, len = (r_len > l_len ? r_len : l_len); i < len && r == l; ++i) {
  1588. r = +(r_parts[i] || '0');
  1589. l = +(l_parts[i] || '0');
  1590. }
  1591. return (r !== l) ? r > l : false;
  1592. },
  1593. compare: function(xpr,response) {
  1594. this.xversion=/\/\/\s*@version\s+(.+)\s*\n/i.exec(xpr.responseText);
  1595. this.xname=/\/\/\s*@name\s+(.+)\s*\n/i.exec(xpr.responseText);
  1596. if ( (this.xversion) && (this.xname[1] == this.name) ) {
  1597. this.xversion = this.xversion[1];
  1598. this.xname = this.xname[1];
  1599. } else {
  1600. if ( (xpr.responseText.match("the page you requested doesn't exist")) || (this.xname[1] != this.name) ) {
  1601. //GM_setValue('updated_152625', 'off');
  1602. }
  1603. return false;
  1604. }
  1605. var updated = this.compareVersion(this.xversion, this.version);
  1606.  
  1607. if ( updated ) {
  1608.  
  1609. display_confirm('A new version of '+this.xname+' is available.\nDo you wish to install the latest version?',
  1610. // Ok
  1611. function(){
  1612. try {
  1613. location.href = AutoUpdater_152625.beta ? AutoUpdater_152625.betaUrl : 'http://userscripts.org/scripts/source/152625.user.js';
  1614. } catch(e) {}
  1615. },
  1616. // Cancel
  1617. function(){
  1618. if ( AutoUpdater_152625.xversion ) {
  1619. if(confirm('Do you want to turn off auto updating for this script?')) {
  1620. //GM_setValue('updated_152625', 'off');
  1621. GlobalOptions.nbupdate = false;
  1622. GM_setValue ('Options_??', JSON2.stringify(GlobalOptions));
  1623. AutoUpdater_152625.enable();
  1624. alert('Automatic updates can be re-enabled for this script in the Options tab.');
  1625. }
  1626. }
  1627. }
  1628. );
  1629.  
  1630. } else if (response){
  1631. alert('No updates available for '+this.name);
  1632. }
  1633. },
  1634. check: function(tf) {
  1635. if (!tf){
  1636. this.enable();
  1637. } else {
  1638. GM_registerMenuCommand("Check "+this.name+" for updates", function() {
  1639. GM_setValue('updated_152625', new Date().getTime()+'');
  1640. AutoUpdater_152625.call(true, true)
  1641. });
  1642. if (+this.time > (+GM_getValue('updated_152625', 0) + 1000*60*60*24*this.days)) {
  1643. GM_setValue('updated_152625', this.time+'');
  1644. this.call(false, true);
  1645. }
  1646. }
  1647. }
  1648. };
  1649. if (typeof(GM_xmlhttpRequest) !== 'undefined' && typeof(GM_updatingEnabled) === 'undefined') { // has an updater?
  1650. try {
  1651. AutoUpdater_152625.check(GlobalOptions.nbupdate);
  1652. } catch(e) {
  1653. AutoUpdater_152625.check(GlobalOptions.nbupdate);
  1654. }
  1655. }
  1656. /********* End updater code *************/
  1657.  
  1658. /************ LIB classes/functions .... **************/
  1659. function getClientCoords(e){
  1660. if (e==null)
  1661. return {x:null, y:null, width:null, height:null};
  1662. var x=0, y=0;
  1663. ret = {x:0, y:0, width:e.clientWidth, height:e.clientHeight};
  1664. while (e.offsetParent != null){
  1665. ret.x += e.offsetLeft;
  1666. ret.y += e.offsetTop;
  1667. e = e.offsetParent;
  1668. }
  1669. return ret;
  1670. }
  1671.  
  1672. var WinManager = {
  1673. wins : {}, // prefix : nbPopup obj
  1674. didHide : [],
  1675.  
  1676.  
  1677. get : function (prefix){
  1678. var t = WinManager;
  1679. return t.wins[prefix];
  1680. },
  1681.  
  1682. add : function (prefix, pop){
  1683. var t = WinManager;
  1684. t.wins[prefix] = pop;
  1685. if (unsafeWindow.cpopupWins == null)
  1686. unsafeWindow.cpopupWins = {};
  1687. unsafeWindow.cpopupWins[prefix] = pop;
  1688. },
  1689.  
  1690. hideAll : function (){
  1691. var t = WinManager;
  1692. t.didHide = [];
  1693. for (k in t.wins){
  1694. if (t.wins[k].isShown()){
  1695. t.didHide.push (t.wins[k]);
  1696. t.wins[k].show (false);
  1697. }
  1698. }
  1699. },
  1700. restoreAll : function (){
  1701. var t = WinManager;
  1702. for (var i=0; i<t.didHide.length; i++)
  1703. t.didHide[i].show (true);
  1704. },
  1705.  
  1706. delete : function (prefix){
  1707. var t = WinManager;
  1708. delete t.wins[prefix];
  1709. delete unsafeWindow.cpopupWins[prefix];
  1710. }
  1711. }
  1712.  
  1713.  
  1714. // creates a 'popup' div
  1715. // prefix must be a unique (short) name for the popup window
  1716. function nbPopup (prefix, x, y, width, height, enableDrag, onClose) {
  1717. var pop = WinManager.get(prefix);
  1718. if (pop){
  1719. pop.show (false);
  1720. return pop;
  1721. }
  1722. this.BASE_ZINDEX = 111111;
  1723.  
  1724. // protos ...
  1725. this.show = show;
  1726. this.toggleHide = toggleHide;
  1727. this.getTopDiv = getTopDiv;
  1728. this.getMainTopDiv = getMainTopDiv;
  1729. this.getMainDiv = getMainDiv;
  1730. this.getLayer = getLayer;
  1731. this.setLayer = setLayer;
  1732. this.setEnableDrag = setEnableDrag;
  1733. this.getLocation = getLocation;
  1734. this.setLocation = setLocation;
  1735. this.focusMe = focusMe;
  1736. this.isShown = isShown;
  1737. this.unfocusMe = unfocusMe;
  1738. this.centerMe = centerMe;
  1739. this.destroy = destroy;
  1740. this.autoHeight = autoHeight;
  1741.  
  1742. // object vars ...
  1743. this.div = document.createElement('div');
  1744. this.prefix = prefix;
  1745. this.onClose = onClose;
  1746.  
  1747. var t = this;
  1748. this.div.className = 'nbPopup '+ prefix +'_nbPopup';
  1749. this.div.id = prefix +'_outer';
  1750. this.div.style.background = "#fff";
  1751. this.div.style.zIndex = this.BASE_ZINDEX // KOC modal is 100210 ?
  1752. this.div.style.display = 'none';
  1753. this.div.style.width = width + 'px';
  1754. this.div.style.height = height + 'px';
  1755. this.div.style.maxHeight = height + 'px';
  1756. this.div.style.overflowY = 'show';
  1757. this.div.style.position = "absolute";
  1758. this.div.style.top = y +'px';
  1759. this.div.style.left = x + 'px';
  1760.  
  1761. if (nbPopUpTopClass==null)
  1762. topClass = 'nbPopupTop '+ prefix +'_nbPopupTop';
  1763. else
  1764. topClass = nbPopUpTopClass +' '+ prefix +'_'+ nbPopUpTopClass;
  1765.  
  1766. var m = '<TABLE cellspacing=0 width=100% ><TR id="'+ prefix +'_bar" class="'+ topClass +'"><TD width=99% valign=bottom><SPAN id="'+ prefix +'_top"></span></td>\
  1767. <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; -moz-border-radius-topright: 20px;">x</td></tr>\
  1768. </table><TABLE cellspacing=0 width=100% ><TR><TD height=100% valign=top class="nbPopMain '+ prefix +'_nbPopMain" colspan=2 id="'+ prefix +'_main"></td></tr></table>';
  1769. document.body.appendChild(this.div);
  1770. this.div.innerHTML = m;
  1771. document.getElementById(prefix+'_X').addEventListener ('click', e_XClose, false);
  1772. this.dragger = new CWinDrag (document.getElementById(prefix+'_bar'), this.div, enableDrag);
  1773.  
  1774. this.div.addEventListener ('mousedown', e_divClicked, false);
  1775. WinManager.add(prefix, this);
  1776.  
  1777. function e_divClicked (){
  1778. t.focusMe();
  1779. }
  1780. function e_XClose (){
  1781. t.show(false);
  1782. if (t.onClose != null)
  1783. t.onClose();
  1784. }
  1785. function autoHeight (onoff){
  1786. if (onoff)
  1787. t.div.style.height = '';
  1788. else
  1789. t.div.style.height = t.div.style.maxHeight;
  1790. }
  1791. function focusMe (){
  1792. t.setLayer(5);
  1793. for (k in unsafeWindow.cpopupWins){
  1794. if (k != t.prefix)
  1795. unsafeWindow.cpopupWins[k].unfocusMe();
  1796. }
  1797. }
  1798. function unfocusMe (){
  1799. t.setLayer(-5);
  1800. }
  1801. function getLocation (){
  1802. return {x: parseInt(this.div.style.left), y: parseInt(this.div.style.top)};
  1803. }
  1804. function setLocation (loc){
  1805. t.div.style.left = loc.x +'px';
  1806. t.div.style.top = loc.y +'px';
  1807. }
  1808. function destroy (){
  1809. document.body.removeChild(t.div);
  1810. WinManager.delete (t.prefix);
  1811. }
  1812. function centerMe (parent){
  1813. if (parent == null){
  1814. var coords = getClientCoords(document.body);
  1815. } else
  1816. var coords = getClientCoords(parent);
  1817. var x = ((coords.width - parseInt(t.div.style.width)) / 2) + coords.x;
  1818. var y = ((coords.height - parseInt(t.div.style.height)) / 2) + coords.y;
  1819. if (x<0)
  1820. x = 0;
  1821. if (y<0)
  1822. y = 0;
  1823. t.div.style.left = x +'px';
  1824. t.div.style.top = y +'px';
  1825. }
  1826. function setEnableDrag (tf){
  1827. t.dragger.setEnable(tf);
  1828. }
  1829. function setLayer(zi){
  1830. t.div.style.zIndex = ''+ (this.BASE_ZINDEX + zi);
  1831. }
  1832. function getLayer(){
  1833. return parseInt(t.div.style.zIndex) - this.BASE_ZINDEX;
  1834. }
  1835. function getTopDiv(){
  1836. return document.getElementById(this.prefix+'_top');
  1837. }
  1838. function getMainDiv(){
  1839. return document.getElementById(this.prefix+'_main');
  1840. }
  1841. function getMainTopDiv(){
  1842. return document.getElementById(this.prefix+'_top');
  1843. }
  1844. function isShown (){
  1845. return t.div.style.display == 'block';
  1846. }
  1847. function show(tf){
  1848. if (tf){
  1849. t.div.style.display = 'block';
  1850. t.focusMe ();
  1851. } else {
  1852. t.div.style.display = 'none';
  1853. }
  1854. return tf;
  1855. }
  1856. function toggleHide(t){
  1857. if (t.div.style.display == 'block') {
  1858. return t.show (false);
  1859. } else {
  1860. return t.show (true);
  1861. }
  1862. }
  1863. }
  1864.  
  1865. function CWinDrag (clickableElement, movingDiv, enabled) {
  1866. var t=this;
  1867. this.setEnable = setEnable;
  1868. this.setBoundRect = setBoundRect;
  1869. this.debug = debug;
  1870. this.dispEvent = dispEvent;
  1871. this.lastX = null;
  1872. this.lastY = null;
  1873. this.enabled = true;
  1874. this.moving = false;
  1875. this.theDiv = movingDiv;
  1876. this.body = document.body;
  1877. this.ce = clickableElement;
  1878. this.moveHandler = new CeventMove(this).handler;
  1879. this.outHandler = new CeventOut(this).handler;
  1880. this.upHandler = new CeventUp(this).handler;
  1881. this.downHandler = new CeventDown(this).handler;
  1882. this.clickableRect = null;
  1883. this.boundRect = null;
  1884. this.bounds = null;
  1885. this.enabled = false;
  1886. if (enabled == null)
  1887. enabled = true;
  1888. this.setEnable (enabled);
  1889.  
  1890. function setBoundRect (b){ // this rect (client coords) will not go outside of current body
  1891. this.boundRect = boundRect;
  1892. this.bounds = null;
  1893. }
  1894.  
  1895. function setEnable (enable){
  1896. if (enable == t.enabled)
  1897. return;
  1898. if (enable){
  1899. clickableElement.addEventListener('mousedown', t.downHandler, false);
  1900. t.body.addEventListener('mouseup', t.upHandler, false);
  1901. } else {
  1902. clickableElement.removeEventListener('mousedown', t.downHandler, false);
  1903. t.body.removeEventListener('mouseup', t.upHandler, false);
  1904. }
  1905. t.enabled = enable;
  1906. }
  1907.  
  1908. function CeventDown (that){
  1909. this.handler = handler;
  1910. var t = that;
  1911. function handler (me){
  1912. if (t.bounds == null){
  1913. t.clickableRect = getClientCoords(clickableElement);
  1914. t.bodyRect = getClientCoords(document.body);
  1915. if (t.boundRect == null)
  1916. t.boundRect = t.clickableRect;
  1917. t.bounds = {top:10-t.clickableRect.height, bot:t.bodyRect.height-25, left:40-t.clickableRect.width, right:t.bodyRect.width-25};
  1918. }
  1919. if (me.button==0 && t.enabled){
  1920. t.body.addEventListener('mousemove', t.moveHandler, true);
  1921. t.body.addEventListener('mouseout', t.outHandler, true);
  1922. t.lastX = me.clientX;
  1923. t.lastY = me.clientY;
  1924. t.moving = true;
  1925. }
  1926. }
  1927. }
  1928.  
  1929. function CeventUp (that){
  1930. this.handler = handler;
  1931. var t = that;
  1932. function handler (me){
  1933. if (me.button==0 && t.moving)
  1934. _doneMoving(t);
  1935. }
  1936. }
  1937.  
  1938. function _doneMoving (t){
  1939. t.body.removeEventListener('mousemove', t.moveHandler, true);
  1940. t.body.removeEventListener('mouseout', t.outHandler, true);
  1941. t.moving = false;
  1942. }
  1943.  
  1944. function CeventOut (that){
  1945. this.handler = handler;
  1946. var t = that;
  1947. function handler (me){
  1948. if (me.button==0){
  1949. t.moveHandler (me);
  1950. }
  1951. }
  1952. }
  1953.  
  1954. function CeventMove (that){
  1955. this.handler = handler;
  1956. var t = that;
  1957. function handler (me){
  1958. if (t.enabled && !t.wentOut){
  1959. var newTop = parseInt(t.theDiv.style.top) + me.clientY - t.lastY;
  1960. var newLeft = parseInt(t.theDiv.style.left) + me.clientX - t.lastX;
  1961. if (newTop < t.bounds.top){ // if out-of-bounds...
  1962. newTop = t.bounds.top;
  1963. _doneMoving(t);
  1964. } else if (newLeft < t.bounds.left){
  1965. newLeft = t.bounds.left;
  1966. _doneMoving(t);
  1967. } else if (newLeft > t.bounds.right){
  1968. newLeft = t.bounds.right;
  1969. _doneMoving(t);
  1970. } else if (newTop > t.bounds.bot){
  1971. newTop = t.bounds.bot;
  1972. _doneMoving(t);
  1973. }
  1974. t.theDiv.style.top = newTop + 'px';
  1975. t.theDiv.style.left = newLeft + 'px';
  1976. t.lastX = me.clientX;
  1977. t.lastY = me.clientY;
  1978. }
  1979. }
  1980. }
  1981.  
  1982. function debug (msg, e){
  1983. logit ("*************** "+ msg +" ****************");
  1984. logit ('clientWidth, Height: '+ e.clientWidth +','+ e.clientHeight);
  1985. logit ('offsetLeft, Top, Width, Height (parent): '+ e.offsetLeft +','+ e.offsetTop +','+ e.offsetWidth +','+ e.offsetHeight +' ('+ e.offsetParent +')');
  1986. logit ('scrollLeft, Top, Width, Height: '+ e.scrollLeft +','+ e.scrollTop +','+ e.scrollWidth +','+ e.scrollHeight);
  1987. }
  1988.  
  1989. function dispEvent (msg, me){
  1990. logit (msg + ' Button:'+ me.button +' Screen:'+ me.screenX +','+ me.screenY +' client:'+ me.clientX +','+ me.clientY +' rTarget: '+ me.relatedTarget);
  1991. }
  1992. }
  1993.  
  1994. Array.prototype.compare = function(testArr) {
  1995. if (this.length != testArr.length) return false;
  1996. for (var i = 0; i < testArr.length; i++) {
  1997. if (this[i].compare) {
  1998. if (!this[i].compare(testArr[i])) return false;
  1999. }
  2000. if (this[i] !== testArr[i]) return false;
  2001. }
  2002. return true;
  2003. }
  2004. String.prototype.StripQuotes = function() {
  2005. return this.replace(/"/g,'');
  2006. }
  2007.  
  2008. String.prototype.entityTrans = { '&':'&amp;', '<':'&lt;', '>':'&gt;', '\"':'&quot;', '\'':'&#039', '<':'\\u003c', '/':'\\/', '\\':'\\\\', '\"':'\\\"','{':'&#123;','}':'&#125;'};
  2009. String.prototype.htmlSpecialChars = function() {
  2010. var ret = this.toString();
  2011. for (k in this.entityTrans)
  2012. ret = ret.split(k).join(this.entityTrans[k]);
  2013. return ret;
  2014. }
  2015. String.prototype.htmlSpecialCharsDecode = function() {
  2016. var ret = this.toString();
  2017. for (k in this.entityTrans)
  2018. ret = ret.split(this.entityTrans[k]).join(k);
  2019. return ret;
  2020. }
  2021. String.prototype.trim = function () {
  2022. return this.replace(/^\s*/, "").replace(/\s*$/, "");
  2023. }
  2024. String.prototype.escape_space = function(){
  2025. var s = this.split(" ");
  2026. for(var i=0; i<s.length; i++)
  2027. s[i] = escape(s[i]);
  2028. //return s.join(" ");
  2029. return this.replace(/</ig,"&#60;");
  2030. }
  2031. String.prototype.unescape_space = function(){
  2032. var s = this.split(" ");
  2033. for(var i=0; i<s.length; i++)
  2034. s[i] = unescape(s[i]);
  2035. //return s.join(" ");
  2036. return this;
  2037. }
  2038.  
  2039. function matTypeof (v){
  2040. if (typeof (v) == 'object'){
  2041. if (!v)
  2042. return 'null';
  2043. // else if (unsafeWindow.Object.prototype.toString.apply(v) === '[object Array]')
  2044. else if (v.constructor.toString().indexOf("Array")>=0 && typeof(v.splice)=='function')
  2045. return 'array';
  2046. else return 'object';
  2047. }
  2048. return typeof (v);
  2049. }
  2050.  
  2051. function unixTime (){
  2052. return parseInt (new Date().getTime() / 1000) + unsafeWindow.g_timeoff;
  2053. }
  2054.  
  2055. /**********************
  2056. part full
  2057. Xd Xh Xm Xd Xh Xm Xs
  2058. Xh Xm Xh Xm Xs
  2059. Xm Xs Xm Xs
  2060. Xs Xs
  2061. **********************/
  2062. function timestr(time, full) {
  2063. time = parseInt (time);
  2064. var m = [];
  2065. var t = time;
  2066. if (t < 61)
  2067. return t + 's';
  2068. if (t > 86400){
  2069. m.push (parseInt(t/86400));
  2070. m.push ('d ');
  2071. t %= 86400;
  2072. }
  2073. if (t>3600 || time>3600){
  2074. m.push (parseInt(t/3600));
  2075. m.push ('h ');
  2076. t %= 3600;
  2077. }
  2078. m.push (parseInt(t/60));
  2079. m.push ('m');
  2080. if (full || time<=3600 ){
  2081. m.push (' ');
  2082. m.push (t%60);
  2083. m.push ('s');
  2084. }
  2085. return m.join ('');
  2086. }
  2087.  
  2088. nbStartup ();