User Interface Script (Big Release World)

User Interface Script

目前為 2014-07-31 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name User Interface Script (Big Release World)
  3. // @namespace http://wofh.ru/
  4. // @author akasoft,andryxa,Regis,simplexe
  5. // @version 1.3.11.1
  6. // @include http://w*.wofh.ru/*
  7. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js
  8. // @grant GM_addStyle
  9. // @description User Interface Script
  10. // ==/UserScript==
  11.  
  12. String.prototype.trim = function() {
  13. return this.replace(/^\s+|\s+$/g, '');
  14. };
  15.  
  16. String.prototype.toHHMMSS = function () {
  17. var sec_num = parseInt(this, 10); // don't forget the second param
  18. var hours = Math.floor(sec_num / 3600);
  19. var minutes = Math.floor((sec_num - (hours * 3600)) / 60);
  20. var seconds = sec_num - (hours * 3600) - (minutes * 60);
  21.  
  22. if (hours < 10) {hours = "0"+hours;}
  23. if (minutes < 10) {minutes = "0"+minutes;}
  24. if (seconds < 10) {seconds = "0"+seconds;}
  25. var time = hours+':'+minutes+':'+seconds;
  26. return time;
  27. };
  28.  
  29. Date.prototype.format = function(str) {
  30. // yyyy.mm.dd hh:nn:ss
  31. return str.split('yyyy').join(this.getFullYear()).split('mm').join(LZ(this.getMonth() + 1)).split('dd').join(LZ(this.getDate())).split('hh').join(LZ(this.getHours())).split('nn').join(LZ(this.getMinutes())).split('ss').join(LZ(this.getSeconds()));
  32. };
  33.  
  34. Date.prototype.formatTime = function() {
  35. // HH:MM:SS
  36. return LZ(this.getUTCHours() + (this.getUTCDate() - 1) * 24) + ":" + LZ(this.getUTCMinutes()) + ":" + LZ(this.getUTCSeconds());
  37. };
  38.  
  39. Math.randomInt = function (min, max) {
  40. return Math.floor(Math.random() * (max - min + 1)) + min;
  41. };
  42.  
  43. function _setValue(key, value) {
  44. window.localStorage.setItem(key + '_' + playerName + '_' + currentHost, value);
  45. }
  46.  
  47. function _getValue(key, defaultValue) {
  48. var itm = window.localStorage.getItem(key + '_' + playerName + '_' + currentHost);
  49. return itm != null ? itm == 'false' ? false : itm : defaultValue;
  50. }
  51.  
  52. function _serialize(obj) {
  53. return (obj.toSource) ? obj.toSource() : JSON.stringify(obj);
  54. }
  55.  
  56. function _deserialize(str) {
  57. return eval('(' + str + ')');
  58. }
  59.  
  60. // Отладка
  61. var debug = true;
  62.  
  63. function _log(text) {
  64. if (!debug) return;
  65. console.log(text);
  66. }
  67.  
  68. function $q(element) {
  69. if (arguments.length > 1) {
  70. for (var i = 0, elements = [], length = arguments.length; i < length; i++)
  71. elements.push($q(arguments[i]));
  72. return elements;
  73. }
  74. if (typeof element == 'string')
  75. element = document.getElementById(element);
  76. return element;
  77. }
  78.  
  79. // одно expression --> в 1 или более элементов
  80. function $x(expression, parent) {
  81. var results = [];
  82. var query = document.evaluate(expression, $q(parent) || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  83. for (var i = 0, length = query.snapshotLength; i < length; i++)
  84. results.push(query.snapshotItem(i));
  85. return results;
  86. }
  87.  
  88.  
  89. function $c(className, parent) {
  90. "use strict";
  91. return (parent || document).getElementsByClassName(className)
  92. }
  93.  
  94. // создание элемента
  95. function $e(tag, content, attributes, style, parent) {
  96.  
  97. var result = document.createElement(tag);
  98. if (content)
  99. result.innerHTML = content;
  100.  
  101. if (attributes)
  102. for (var a in attributes)
  103. result.setAttribute(a, attributes[a]);
  104.  
  105. if (style)
  106. for (var a in style)
  107. result.style[a] = style[a];
  108.  
  109. if (parent) {
  110. parent = $q(parent) || document;
  111. parent.appendChild(result);
  112. }
  113. return result;
  114. }
  115.  
  116. function $t(text) {
  117. return document.createTextNode(text);
  118. }
  119.  
  120. function $n(element) {
  121. if (arguments.length > 1) {
  122. for (var i = 0, elements = [], length = arguments.length; i < length; i++)
  123. elements.push($n(arguments[i]));
  124. return elements;
  125. }
  126. if (typeof element == 'string')
  127. element = document.getElementsByName(element)[0];
  128. return element;
  129. }
  130.  
  131. function LZ(n) {
  132. return (n > 9 ? n : '0' + n);
  133. }
  134.  
  135. function isInt(x) {
  136. var y = parseInt(x);
  137. if (isNaN(y)) return false;
  138. return x == y && x.toString() == y.toString();
  139. }
  140.  
  141. function _addStyle(css) {
  142. var NSURI = 'http://www.w3.org/1999/xhtml';
  143. var hashead = document.getElementsByTagName('head')[0];
  144. var parentel = hashead || document.documentElement;
  145. var newElement = document.createElementNS(NSURI, 'link');
  146. newElement.setAttributeNS(NSURI, 'rel', 'stylesheet');
  147. newElement.setAttributeNS(NSURI, 'type', 'text/css');
  148. newElement.setAttributeNS(NSURI, 'href', 'data:text/css,' + encodeURIComponent(css));
  149. if (hashead) {
  150. parentel.appendChild(newElement);
  151. } else {
  152. parentel.insertBefore(newElement, parentel.firstChild);
  153. }
  154. }
  155.  
  156. function __addStyle(cssStyle) {
  157. try {
  158. GM_addStyle(cssStyle);
  159. } catch (e) {
  160. _addStyle(cssStyle);
  161. }
  162. }
  163.  
  164. var isMinMenu = false;
  165. var playerName = '';
  166. var currentHost = '';
  167.  
  168. var wofh = unsafeWindow.wofh;
  169. var utils = unsafeWindow.utils;
  170. var Build = unsafeWindow.Build;
  171. var JSN = unsafeWindow.JSN;
  172. var lib = unsafeWindow.lib;
  173. /* Идея.
  174. Есть несколько панелек с однотипным видом и поведением.
  175. Div-контейнер с заголовком и кнопкой, по щелчку по которой сворачивается/разворачивается контент
  176. Меняется текст заголовка и цвет фона заголовка
  177. Меняется контент
  178. Сохраняются положение (left, top) контейнера и видимость контента
  179.  
  180. Описатель панели (Pane)
  181. {
  182. pane: { id: 'pane', left: '10px', top: '10px' },
  183. title: { id: 'panetitle', },
  184. button: { id: 'panebutton', image: '' },
  185. caption: { id: 'panecaption', text: '', bkcolor: '' },
  186. content: { id: 'panecontent', visible: false, text: '' }
  187. }/**/
  188.  
  189. /* массив используемых картинок
  190. 0 - кнопка панелек
  191. 1 - pause, png
  192. 2 - play, png
  193. 3 - del, png
  194. 4 - city1, gif, желтый
  195. 5 - красный
  196. 6 - синий
  197. 7 - зелёный
  198. 8 - салатовый
  199. 9 - белый
  200. 10 - фиолетовый /**/
  201.  
  202. var imageList = [
  203. "data:image/gif;base64,R0lGODlhFAAUAHcAACH5BAEAAAAALAAAAAAUABQApwEAANDt/+X1//T7/+j2/8fq//X7/9zy/////+34/9Pu/8jq//r9/wI0jNvx/9Lu/0u48snq/8To/7/m/9vy/9zx/+35/6Hb/8Pp/+T1//v9/x9otMPo/z2e3k6w67Tj/8Ho//f8/0u58nC+8MXR5b7n/7zm/7Xk/8za62fB9yV1voPO+iFst/T6/8nr/zOO0UOq5zFiqZXN8wg/lPDz+LXg/H/L+brl/6rf/6nQ7iVcpwk8kqXd/3Wl1b/j+5au0mOIv4GgzT6i4Wqy5muz5keg3Uep5q/X9B9QnihWn3iVw5at0gtFmSlWoBZXpQtGmRZWpR9RnjNmrEep5bnZ89jr+a/O6iZ1vnWm1TmX2TKM0Lja8y6Fykaf3cvk96re/27G+7Xj/6vf/7Xi/5fX/y+Fyyp9xSyBx6Da/yp9xEyy7Uuz7Uq07+X2/8Tp/0Or6N3y/1/A9vH5/kaw7Eaw63XL/r/k+8Lo/8Ln/3bL/pbY/7jk/7nk/8Hn/77m//r+/1+/9h5ptB9ptZGz2MjZ7RxjsR9ptBxksHmVw8jZ7B5otZi43NPv/7/n/0+38Uq1727H+1C38TVxtjNssZGy2DZxtjt4uwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj/AAEIHAhABASDECAQXDjwkaM4kPLUAQMoEhuGAumsScFjQYYQITIs4JFCzZyFMDys4DDAgMuXAzis8ACDoBEbNwjoJPBmp84bNqYM7DCCTAAKDpAKSeogaQA9IzoI7HLhwoIAWANkyYq1AJoLRQC8GIJDDJ8CaAtoQbtgQYE9OL4QeVFGxpgPJ0xgwCDhDAY3EiSYOPEhjAwuZmpMmNDIDwg8d1RI4ACiT4nFJWqkuWLHRVsXESIcMbShtCJBgUL7UMEix4MHChgpoGJpiwLYt3PnYFEIy4EKB+B4mWTlwG/gwI33OARAkoDnVaQsev48QxvqAioJdELJQgIgQSyITE9AvnyCQVAG6khkQM6A9y3ewzdASAdBJjFQaGCw/89+BgCiEMMTC80QxQ8IJKhggksgMQNGAOyQBCIk0EADCUo0sQOEBDXg4YcYBQQAOw==",
  204. "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJjSURBVDjLpZNLbxJhFIb7A/wF/A5YunTDzuqmO+PdsDFx0dSVpJq4aIyQmUIU06a1gUqCJlXb1Ehb6QhiGgsdKFNAwAIOhWEcBobLUI5zPpgRLzsneRfz5bzPec93mQCAiXGdc4FJk0WTVdPUSNbRmunP+nHjGU3muy8lW+DjMR3ZTzMHiUMhziaF3b0U82InR0/76zaswdrfACPzWV+obI8fZjm+JoGs9EA9HRA1Wl0oVeoQ3mO5hc2sHWt1iA4wo5lNfZXbHRXwU7p9qMs9EDQ1O32yJitd2I3GZM/6EULMBIBzYWzsrJurUhcqP7rAi0OVxQ6U6h0DsrkV5m6v8DiOCQGWAPONxti6+eKDENxyJw3z5OwOXHclSBr8UrnvQPkjNHoRYA1/OWJwZoyKpgv3EZAgXYtCWwNsE0Ct0QOppcKJqMDi6msGvQiYih0kBNwsLEAAdryhAY5rbaJJ+zZcm2dJOvzvqqew4l0V0EsA+3GWALAAu+qRsbhQbcP5e0G4Sg8B+C+1erC49NwAWD98TjKi3IGGog47ksgs5E8UyFUUDfCeAHBj8WTSRREoj9cYweINZuhCqQaDAZAOGBeV5RUiNF+mWDJerz+ArU9JsLvfGptouuOr2oKhKCdIbeMkdKXLLeM40ZzRujufLHNX3OnhMeoXiXoVt6+9C8l8vUmSiE2VpMEx8PjQnC7WweHxyTPU+q+LNH6V57xR+7J/jYvEMlDgJbInOHMyL8BGKA5z1AI37Xzz91Uef0w3n+Vts0836EeuJYaadwuPnbTw0OFhZhwB+hKd+vdj+p/n/BMZPwxzcSL1lgAAAABJRU5ErkJggg==",
  205. "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJfSURBVDjLpZNNbxJRFIb7A/wF/A5YunTDrpouujNxY8LGxEVTVyU11UVjCmEsUUyb1gYqEWuqtqmRWukUimksH6UMHwIW6FCYwWFgYBjKcc6FGam68ybvZuY87/m4544BwNiobiyCQZVJlVnV5FDm4TfDn/Gj4DVVxgdvBIvv4IwKHafp2MkpF40nuP2jJP1qL0dNeXkLxmDsFYMhfN0TKFujp1mGrQkgSl1QLvtEjZYMpQoPwaM4s7STtWKsZqIZGBGOJ7+L7Y4CeCS5B7zYBU5Vs9Mj30RJhv1wRHRtpdDESAywLywbM2twVZCh8lOGt+EKsHUZyvUOlPiObrKzG2TurbHYjgENTD76B4Vlj8II3noYgI3DCoHPam0iPMncOTi8IQpZNDAHv6Vo7BlLRVDLenN2j+h1iCVwodoGoaXARV2C5fV3NLJoMBmJnXA4rFqjS2DMWOTaKvyZaOJRCPwxDnIViRjJyiWsudc5ZInBcTRODLB8DcZAAs8dwPiMn/zLstKwii4sr7zUDcxfviboutiBhqTovWLgxBx9Bc6ct8jNpIt1cLjcegsmtz9DFUo16PeBgPkLiZQ7PvOJwAimyy1IlVrQ7fVh9zABVucHfYiG+56qxR8IM5wwmDJmQyGsgclSkyTIqNntz1aZO8704Bq1RXJsRK2bHwMiyw8C601FrwaXCTOnizzYXB5x2rH1e5FGV3neHbauejeZUCQDBVYgM8GeE3kOtgNRmHcsMVP293+v8uhjuvsib5l9vk09WVyhHU+d3IKd4h7bXPS0zUfdppL/fkz/85x/AR14FVfMwp4lAAAAAElFTkSuQmCC",
  206. "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIhSURBVDjLlZPrThNRFIWJicmJz6BWiYbIkYDEG0JbBiitDQgm0PuFXqSAtKXtpE2hNuoPTXwSnwtExd6w0pl2OtPlrphKLSXhx07OZM769qy19wwAGLhM1ddC184+d18QMzoq3lfsD3LZ7Y3XbE5DL6Atzuyilc5Ciyd7IHVfgNcDYTQ2tvDr5crn6uLSvX+Av2Lk36FFpSVENDe3OxDZu8apO5rROJDLo30+Nlvj5RnTlVNAKs1aCVFr7b4BPn6Cls21AWgEQlz2+Dl1h7IdA+i97A/geP65WhbmrnZZ0GIJpr6OqZqYAd5/gJpKox4Mg7pD2YoC2b0/54rJQuJZdm6Izcgma4TW1WZ0h+y8BfbyJMwBmSxkjw+VObNanp5h/adwGhaTXF4NWbLj9gEONyCmUZmd10pGgf1/vwcgOT3tUQE0DdicwIod2EmSbwsKE1P8QoDkcHPJ5YESjgBJkYQpIEZ2KEB51Y6y3ojvY+P8XEDN7uKS0w0ltA7QGCWHCxSWWpwyaCeLy0BkA7UXyyg8fIzDoWHeBaDN4tQdSvAVdU1Aok+nsNTipIEVnkywo/FHatVkBoIhnFisOBoZxcGtQd4B0GYJNZsDSiAEadUBCkstPtN3Avs2Msa+Dt9XfxoFSNYF/Bh9gP0bOqHLAm2WUF1YQskwrVFYPWkf3h1iXwbvqGfFPSGW9Eah8HSS9fuZDnS32f71m8KFY7xs/QZyu6TH2+2+FAAAAABJRU5ErkJggg==",
  207.  
  208. "data:image/gif;base64,R0lGODlhAgACAPcAAP/YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAgACAAAIBgABCAQQEAA7",
  209. "data:image/gif;base64,R0lGODlhAgACAPcAAP8A3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAgACAAAIBgABCAQQEAA7",
  210. "data:image/gif;base64,R0lGODlhAgACAPcAAAAm/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAgACAAAIBgABCAQQEAA7",
  211. "data:image/gif;base64,R0lGODlhAgACAPcAAAD/IQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAgACAAAIBgABCAQQEAA7",
  212. "data:image/gif;base64,R0lGODlhAgACAPcAAP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAgACAAAIBgABCAQQEAA7",
  213. "data:image/gif;base64,R0lGODlhAgACAPcAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAgACAAAIBgABCAQQEAA7",
  214. "data:image/gif;base64,R0lGODlhAgACAPcAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAAgACAAAIBgABCAQQEAA7"
  215. ];
  216. //FIXME: пофиксить
  217. var unitSpeedHolder = eval('({0: 4, 1: 4, 2: 5, 3: 5, 4: 6, 5: 3, 6: 7, 7: 9, 8: 4, 9: 8, 10: 10, 11: 6, 12: 4, 13: 7, 14: 12, 15: 8, 16: 7, 17: 6, 18: 3, 19: 11, 20: 5, 21: 4, 22: 6, 23: 5, 24: 9, 25: 5, 26: 6, 27: 10, 28: 6, 29: 5, 30: 4, 31: 12, 32: 7, 33: 7, 34: 7, 35: 7, 36: 5, 37: 5, 38: 4, 39: 3, 40: 5, 41: 2, 42: 2, 43: 1, 44: 2, 45: 2, 46: 2, 47: 7, 48: 6, 49: 7, 50: 7, 51: 8, 52: 7, 53: 9, 54: 8, 55: 8, 56: 1, 57: 4, 58: 7, 59: 13, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 9, 67: 9, 68: 11, 69: 10, 70: 7, 71: 10, 72: 9, 73: 11, 74: 5, 75: 6, 76: 7, 77: 8, 78: 5, 79: 6, 80: 5, 81: 3, 82: 11, 83: 9, 84: 10, 85: 2, 86: 10, 87: 7, 88: 12, 89: 15, 90: 12, 91: 13, 92: 1, 93: 7, 94: 20, 95: 16, 96: 6, 97: 6, 98: 6, 99: 6})');
  218. var buildLevelMap = {13:5, 14: 1, 19:0, 34: 1, 40: 0, 51:0, 67: 0};
  219. var Holder = (function() {
  220.  
  221. var actualConstructor = function() {
  222. this.currentHost = '';
  223. this.playerName = '';
  224. this.isMinMenu = false;
  225. this.buildingInProgress = false;
  226. this.cities = null;
  227. arguments.callee.instances.push(this);
  228. }
  229. actualConstructor.instances = [];
  230. return actualConstructor;
  231. }
  232. )();
  233.  
  234. Holder.prototype.setTownPanel = function(panel) {
  235. this.townPanel = panel;
  236. }
  237.  
  238. Holder.prototype.updateTownPanel = function() {
  239. this.townPanel.caption.text = ' Города (' + getArrayCount(this.townInfo) + ')';
  240. this.townPanel.updateCaption();
  241. this.townPanel.renderContent(this);
  242. }
  243.  
  244. Holder.prototype.collectPageInfo = function() {
  245.  
  246. // имя игрока из заголовка страницы
  247. playerName = document.title.split('—')[1].trim();
  248. currentHost = location.host;
  249. isMinMenu = _getValue('isMinMenu', false);
  250.  
  251. this.cities = _deserialize(_getValue('cities', '{ current: null, list: [] }'));
  252. // собираем инфу о городах игрока: название, координаты, id
  253. // cities = { current: null, list: [] };
  254. // ищем select со списком городов (по аттрибуту name)
  255. var items = $x("//div[@id='town_select']/div[contains(@class, 'iteml1')]");
  256. for (var i in items) {
  257. var s = items[i].innerHTML;
  258. var id = items[i].getAttribute('value');
  259. if (!this.cities.list[i])
  260. this.cities.list[i] = {};
  261.  
  262. this.cities.list[i].id = id;
  263. this.cities.list[i].name = s.trim();
  264. if (items[i].getAttribute('class').indexOf('iteml1_hover') != -1)
  265. this.cities.current = i;
  266. }
  267. // ищем строительство
  268.  
  269. if (!this.cities.list[this.cities.current].building)
  270. this.cities.list[this.cities.current].building = {};
  271. this.cities.list[this.cities.current].building.at = new Date().getTime();
  272.  
  273. if (document.location.href.indexOf('town') != -1) {
  274. this.buildingInProgress = $q('buildp') != null;
  275. if (this.buildingInProgress) {
  276. if (!this.cities.list[this.cities.current].building.item)
  277. this.cities.list[this.cities.current].building.item = {};
  278. var b = $x("//div[@class='task_b' or @class='task_d']/a[contains(@href,'build?pos=')]");
  279. if (b.length > 0) {
  280. var sid = parseInt(b[0].href.match(/pos=(\d+)/)[1]);
  281. var s = $x("//div[@class='task_b']/div[@class='task_desc']/b");
  282. var d = $x("//div[@class='task_d']/div[@class='task_desc']/b");
  283. if (s.length > 0) { //здание строится
  284. var shtml = s[0].innerHTML;
  285. // обновить информацию
  286. this.cities.list[this.cities.current].building.item.caption = shtml.substring(0, shtml.indexOf('<br>'));
  287. this.cities.list[this.cities.current].building.item.level = parseInt(shtml.substring(shtml.indexOf('—') + 2, shtml.length));
  288. this.cities.list[this.cities.current].building.item.sid = sid;
  289. } else if (d.length > 0) { //здание разрушается
  290. var shtml = d[0].innerHTML;
  291. // обновить информацию
  292. this.cities.list[this.cities.current].building.item.caption = shtml.substring(0, shtml.indexOf('<br>'));
  293. this.cities.list[this.cities.current].building.item.level = parseInt(shtml.substring(shtml.indexOf('—') + 2, shtml.length));
  294. this.cities.list[this.cities.current].building.item.sid = sid;
  295. }
  296. }
  297. var btime = $q('buildt').innerHTML;
  298. if (btime) {
  299. var s2 = btime.match(/\>(\d+)\</);
  300. if (s2 && s2[1])
  301. btime = s2[1];
  302. this.cities.list[this.cities.current].building.item.time = 1000 * parseInt(btime);
  303. }
  304. var bprogress = $q('buildp').innerHTML;
  305. if (bprogress) {
  306. var s2 = bprogress.match(/\>(\d+)\</);
  307. if (s2 && s2[1])
  308. bprogress = s2[1];
  309. this.cities.list[this.cities.current].building.item.progress = 1000 * parseInt(bprogress);
  310. }
  311. } else
  312. this.cities.list[this.cities.current].building.item = null;
  313. }
  314.  
  315. _setValue('cities', _serialize(this.cities));
  316. }
  317.  
  318. Holder.prototype.injectTownInfo = function() {
  319. this.townInfo = _deserialize(_getValue('townlist', '{}'));
  320. if (document.location.href.indexOf('mapinfo?o=') == -1 && document.location.href.indexOf('mapinfo?x=') == -1)
  321. return;
  322. // вставляем div с инфой и командами под ссылками
  323.  
  324. var form = $x("//form[@action='postmessage' and @method='post']");
  325.  
  326. if (form.length == 0) {
  327. return;
  328. }
  329.  
  330. var tid = -1;
  331. var data = $x("//div[@class='pagetitle']/div");
  332. //тут, видимо был блок, который удалялся.
  333. //data = data[0].innerHTML.match(/^(.*)\((.*)\)$/);
  334. //старый трим не робит, дергаем контекстом
  335. var tname = data[0].textContent.trim();
  336. //_log(tname);
  337. //тут я так понял надо дергать ссылку на город
  338. //нет, все-таки на местность
  339. tid = data[1].textContent.split(' ')[0];
  340. // _log(tid);
  341. data = $x("//div[@class='inf_t_l_b2']/dl/dd/a[contains(@href, 'account?id=')]");
  342. var pid = data[0].href.match(/id=(\d+)/)[1];
  343. var pname = data[0].innerHTML.trim();
  344. var country = null;
  345. data = $x("//div[@class='inf_t_l_b2']/dl/dd/a[contains(@href, 'countryinfo?id=')]");
  346. if (data.length == 1) {
  347. country = { id: data[0].href.match(/id=(\d+)/)[1], name: data[0].innerHTML.trim() };
  348. } else {
  349. country = { id: -1, name: 'В стране не состоит' };
  350. }
  351.  
  352. var popdate = new Date().getTime();
  353.  
  354. var popvalue = 0;
  355. var tclimate = '';
  356. var trelief = '';
  357. var trace = '';
  358.  
  359. data = $x("//div[@class='inf_t_l_b2']/dl/dd/img[contains(@class, 'res')]");
  360. if (data.length > 0) {
  361. popvalue = parseInt(data[0].parentNode.lastChild.nodeValue);
  362. }
  363. /*
  364. var i=0;
  365. while (i <data.length) {
  366. var o = data[i].innerHTML;
  367. i++;
  368. if(!data[i-1].nextSibling)
  369. continue;
  370. var o1 = data[i-1].nextSibling.innerHTML;
  371.  
  372. if (o && o1) {
  373. if (o.indexOf('Население') != -1) {
  374. _log("data: " + o1);
  375. popvalue = parseInt(o1.substring(0, o1.indexOf('<img')));
  376. } else if (o.indexOf('Климат') != -1)
  377. tclimate = o1;
  378. else if (o.indexOf('Рельеф') != -1)
  379. trelief = o1;
  380. else if (o.indexOf('Раса') != -1)
  381. trace = o1;
  382. }
  383. }
  384. */
  385. var town = {id: tid, name: tname, climate: tclimate, relief: trelief, race: trace,
  386. player: { id: pid, name: pname },
  387. country: country,
  388. pop: [
  389. {date: popdate, value: popvalue}
  390. ]};
  391.  
  392. // втавка панельки
  393. form = form[0];
  394.  
  395. var inner = '<a id="townadd" href="javascript: void(0)">Добавить/обновить город</a>';
  396. /*
  397. inner += '<br/><a id="playeradd" href="javascript: void(0)">Добавить игрока во враги</a>';
  398. if (town.country.id > -1) {
  399. inner += '<br/><a id="countryadd" href="javascript: void(0)">Добавить страну во враги</a>';
  400. }
  401. */
  402.  
  403. if (this.townInfo[town.id]) {
  404. var t = this.townInfo[town.id];
  405. var s2 = '';
  406. if (t.pop.length > 0) {
  407. var j = t.pop.length - 1;
  408. while (j >= 0) {
  409. if (!t.pop[j]) {
  410. j--;
  411. continue;
  412. }
  413. var d = new Date(t.pop[j].date);
  414. if (s2.length > 0)
  415. s2 += ', ';
  416. s2 += t.pop[j].value + '<sub>' + d.format('dd.mm hh:nn') + '</sub>';
  417. j--;
  418. }
  419. }
  420. else
  421. s2 = '-';
  422.  
  423. var d = new Date(popdate);
  424. s2 = '<b>' + popvalue + '<sub>' + d.format('dd.mm hh:nn') + '</sub></b>, ' + s2;
  425. inner += '<br /><br />' + s2;
  426. }
  427.  
  428. var elem = $e('div', inner, { id: 'towndiv' });
  429. var infDiv = $c("inf_line")[0];
  430. infDiv.parentNode.insertBefore(elem, infDiv.nextSibling);
  431.  
  432. $q('townadd').addEventListener('click', clickAddTown(town, this), false);
  433. /*
  434. $q('playeradd').addEventListener('click', this.clickAddPlayer(town.player), false);
  435. if (town.country.id > -1) {
  436. $q('countryadd').addEventListener('click', this.clickAddCountry(town.country), false);
  437. }
  438. */
  439.  
  440. }
  441.  
  442. function clickAddTown(town, holder) {
  443. return function () {
  444. if (holder.townInfo[town.id]) {
  445. var found = false;
  446. for (var i in holder.townInfo[town.id].pop) {
  447. var p = holder.townInfo[town.id].pop[i];
  448. if (Math.abs(town.pop[0].date - p.date) <= 60 * 1000) {
  449. found = true;
  450. p.date = town.pop[0].date;
  451. p.value = town.pop[0].value;
  452. break;
  453. }
  454. }
  455. if (!found)
  456. holder.townInfo[town.id].pop.push(town.pop[0]);
  457. holder.townInfo[town.id].country = town.country;
  458. holder.townInfo[town.id].name = town.name;
  459. } else {
  460. holder.townInfo[town.id] = town;
  461. }
  462. holder.saveTownInfo();
  463. holder.updateTownPanel();
  464. }
  465. }
  466.  
  467. /*
  468. Holder.prototype.clickAddPlayer = function(player) {
  469. return function () {
  470. if (holder.enemyInfo.players[player.id] != player.name) {
  471. holder.enemyInfo.players[player.id] = player.name;
  472. }
  473. }
  474. }
  475.  
  476. Holder.prototype.clickAddCountry = function(country) {
  477. return function () {
  478. if (holder.enemyInfo.countries[country.id] != country.name) {
  479. holder.enemyInfo.countries[country.id] = country.name;
  480. }
  481. }
  482. }
  483. */
  484.  
  485. Holder.prototype.saveTownInfo = function() {
  486. _setValue('townlist', _serialize(this.townInfo));
  487. }
  488.  
  489.  
  490. var Panel = (function() {
  491.  
  492. var Pane = function(id, left, top) {
  493. this.id = id + 'pane';
  494. this.leftKey = id + 'pane_left';
  495. this.topKey = id + 'pane_top';
  496. this.left = left || '10px';
  497. this.top = top || (160 + 50 * panelCount) + 'px';
  498. }
  499. Pane.prototype.className = 'pane';
  500.  
  501. var Title = function(id, normalBackground, alertBackground) {
  502. this.id = id + 'panetitle';
  503. this.normalBackground = normalBackground || '#90DD43';
  504. this.alertBackground = alertBackground || 'red';
  505. __addStyle('#' + id + 'pane { z-index: ' + (3030 - panelCount * 5) + '; background-color: ' + this.normalBackground + ';}');
  506. }
  507. Title.prototype.className = 'panetitle';
  508.  
  509. var Button = function(id, imageIndex) {
  510. this.id = id + 'panebutton';
  511. this.image = imageList[0];
  512. }
  513. Button.prototype.className = 'panebutton';
  514.  
  515. var Caption = function(id, text) {
  516. this.id = id + 'panecaption';
  517. this.text = text ? text : 'Тоже панель';
  518. }
  519. Caption.prototype.className = 'panecaption';
  520.  
  521. var Content = function(id) {
  522. this.id = id + 'panecontent';
  523. this.visibleKey = id + 'pane_visible';
  524. this.visible = _getValue(this.visibleKey, false);
  525. this.text = 'Пусто';
  526. }
  527. Content.prototype.className = 'panecontent';
  528.  
  529. var panelCss = '.pane { border: 2px groove black; \
  530. position: absolute; padding: 5px 5px; -moz-border-radius: 5px; } \
  531. .panebutton img { vertical-align: middle; } \
  532. .panetitle { cursor: move; text-align: left; vertical-align: middle; \
  533. padding: 1px 1px; } \
  534. .panecaption { vertical-align: middle; \
  535. white-space: nowrap; color:#000000; } \
  536. .panecontent { padding: 2px 0px; text-align: left; } \
  537. .panecontent div { padding: 0px 0px; text-align: left; font-size: 80%; } \
  538. #towndiv { padding: 5px 5px; background-color: #ffff66; } \
  539. .towns { border: 1px solid #999966; padding: 0px 0px; font-size: 80%; \
  540. max-width: 500px;} \
  541. .towns tr, .towns td { border: 1px solid #999966; padding: 0px 0px; color: #000000; } \
  542. .towns td img { height: 16px; width: 16px; vertical-align: middle; } \
  543. .tactics { font-size: 80%; } \
  544. .tactics, .tactics tr, .tactics td { border-style: none; color:#000} \
  545. .trainTable { border:1px solid #000000;} \
  546. .trainTable td {text-align:center; border-left:1px solid #000000; color: #000000} \
  547. .tradeTable { border:1px solid #000000;} \
  548. .tradeTable td { text-align:center; border-left:1px solid #000000; border-top:1px solid #000000; color: #000000} \
  549. '
  550. __addStyle(panelCss);
  551.  
  552. var panelCount = 0;
  553. var actualConstructor = function (id, caption, normalBackground, alertBackground) {
  554. this.pane = new Pane(id);
  555. this.title = new Title(id, normalBackground, alertBackground);
  556. this.button = new Button(id, 0);
  557. this.caption = new Caption(id, caption);
  558. this.content = new Content(id);
  559. arguments.callee.instances.push(this);
  560. panelCount++;
  561. }
  562. actualConstructor.instances = [];
  563. return actualConstructor;
  564. })();
  565.  
  566. Panel.prototype.updateCaption = function() {
  567. $q(this.caption.id).innerHTML = (this.content.visible || !isMinMenu) ? this.caption.text : '';
  568. }
  569.  
  570. Panel.prototype.action = function(render) {
  571. //_log('reder=' + render + ' ' + this.content.visibleKey + ':' + this.content.visible);
  572. !render && (this.content.visible = !this.content.visible);
  573. this.updateCaption();
  574. var content = $q(this.content.id);
  575. var button = $q(this.button.id);
  576. if (this.content.visible) {
  577. content.style.display = '';
  578. button.setAttribute('title', 'Спрятать');
  579. //_log(this.content.visibleKey + ':' + this.content.visible);
  580. }
  581. else {
  582. content.style.display = 'none';
  583. button.setAttribute('title', 'Показать');
  584. }
  585. _setValue(this.content.visibleKey, this.content.visible);
  586. }
  587.  
  588. Panel.prototype.render = function() {
  589. var inner = [];
  590. inner.push('<div id="');
  591. inner.push(this.title.id);
  592. inner.push('" class="');
  593. inner.push(this.title.className);
  594. inner.push('">');
  595. inner.push('<a id="');
  596. inner.push(this.button.id);
  597. inner.push('" class="');
  598. inner.push(this.button.className);
  599. inner.push('" href="javascript: void(0)"><img src="');
  600. inner.push(this.button.image);
  601. inner.push('" /></a>');
  602. inner.push('<span id="');
  603. inner.push(this.caption.id);
  604. inner.push('" class="');
  605. inner.push(this.caption.className);
  606. inner.push('">');
  607. inner.push('</span></div><div id="');
  608. inner.push(this.content.id);
  609. inner.push('" class="');
  610. inner.push(this.content.className);
  611. inner.push(' " style="display:none" >');
  612. inner.push(this.content.text);
  613. inner.push('</div>');
  614. var element = $e('div', inner.join(''), {id: this.pane.id},
  615. {left: this.pane.left,top: this.pane.top}, document.body);
  616. element.className = this.pane.className;
  617. this.updateCaption();
  618. $q(this.button.id).addEventListener('click', bindMethod(this, this.action), false);
  619.  
  620.  
  621. _setValue(this.content.visibleKey, this.content.visible);
  622.  
  623. function bindMethod(o, f) {
  624. return function() {
  625. return f.apply(o);
  626. }
  627. }
  628. }
  629.  
  630. Panel.prototype.renderContent = function(holder) {
  631.  
  632. }
  633.  
  634.  
  635. function onUSLoad() {
  636. function correctUI() {
  637. var unitbtn = $x("//div[@class='tunit_btns']");
  638. for (var i in unitbtn) {
  639. unitbtn[i].style.padding = '3px 92px 25px';
  640. }
  641. }
  642.  
  643. if (document.body.innerHTML.length == 0) {
  644. // С 10.10.2009
  645. // Ошибка на сервере или ещё почему страничка не загружена
  646. // пробуем рефрешить её через 30-60 сек
  647. document.body.innerHTML = 'О-о! Ошибка при загрузке страницы. \
  648. Возможно, на сервере технические работы или проблемы с каналом Интернет. \
  649. Попытка обновления начнётся автоматически через 30..60 секунд...';
  650.  
  651. var tid = window.setInterval(function() {
  652. location.href = document.URL;
  653. }, (20 + getRandomInt(10, 40)) * 1000);
  654.  
  655. return;
  656. }
  657. _log('loading...');
  658. var holder = new Holder();
  659. try {
  660. holder.collectPageInfo();
  661. } catch (e) {
  662. _log(e);
  663. }
  664.  
  665. /* стили панелек
  666. #tradepane { z-index: 3040; background-color: #99ccff; } \
  667. #buildpane { z-index: 3030; background-color: #ffcc33; } \
  668. #trainpane { z-index: 3025; background-color: #1C9205; } \
  669. #citypane { z-index: 3020; background-color: #ffff66; } \
  670. #mappane { z-index: 3010; background-color: #efefef; } \
  671. #enemypane {z-index: 3005; background-color: #ffffff; }\
  672. #pane { z-index: 3000; background-color: #90DD43; } \
  673. */
  674. var trade = new Panel('trade', ' Торговля', '#99ccff');
  675.  
  676. trade.renderContent = function(holder) {
  677. var text = '<table class="tradeTable"><tr><td>N</td><td>Операция</td><td>Товар</td><td>Время</td></tr>';
  678. for (var i in holder.cities.list) {
  679. var c = holder.cities.list[i];
  680. var s = c.name;
  681. if ((document.location.href.indexOf("market") != -1 || document.location.href.indexOf("town") != -1) && wofh.town.id == c.id) {
  682. //_log(c);
  683. c.traders = {};
  684. c.traders.total = wofh.town.trade.traders.count;
  685. c.traders.market = wofh.town.trade.traders.reserve;
  686. if (wofh.events != null) {
  687. var result = 0;
  688. wofh.events.forEach(function(entry) {
  689. switch(entry.event) {
  690. case 108:
  691. case 109:
  692. case 111:
  693. if (c.id == entry.town1)
  694. result += parseInt(entry.data.split(',')[1].split(':')[1]);
  695. break;
  696. }
  697. });
  698. c.traders.free = c.traders.total - result;
  699. } else {
  700. c.traders.free = c.traders.total-wofh.town.trade.traders.busy;
  701. }
  702. holder.cities.list[i].traders = c.traders;
  703. _setValue('cities', _serialize(holder.cities));
  704. }
  705. if (c.traders) {
  706. s += ' (' + c.traders.free + '/' + c.traders.market + '/' + c.traders.total + ')';
  707. }
  708. if (i == holder.cities.current)
  709. s = '<b>' + s + '</b>';
  710. s = '<a href="http://' + currentHost + '/town?tid=' + c.id + '">' + s + '</a>';
  711. s += ' <a href="http://' + currentHost + '/market?target=' + holder.cities.list[i].id + '#send'
  712. + '"><img title="Транспортировать ресурсы" class="ibut ib2" src="/p/spacer.gif"></a>';
  713. s += ' <a href="http://' + currentHost + '/market?target=' + holder.cities.list[i].id + '#stream&info'
  714. + '"><img title="Начать снабжение ресурсами" class="ibut ib3" src="/p/spacer.gif"></a>'
  715. s = '<tr><td colspan="4">' + s + '</td></tr>';
  716. /*
  717. var num = 1;
  718. if (wofh.events != null) {
  719. wofh.events.forEach(function(entry) {
  720. switch(entry.event) {
  721. case 108:
  722. case 109:
  723. _log("o");
  724. s += '<tr><td>';
  725. s += num;
  726. s += '</td><td>';
  727. s += entry.data.split(',')[1].split(':')[0];
  728. s += '</td><td>';
  729. s += utils.parseResString(entry.data.split(',')[0].split(':')[1]);
  730. s += '</td><td>';
  731. s += '<span id="op_' + i + '_' + num + '" >' + new Date(entry.time - new Date().getTime()).formatTime() + '</span>';
  732. s += '</td></tr>';
  733. num++;
  734.  
  735. break;
  736. }
  737. });
  738. }
  739. */
  740. text += s;
  741. }
  742. $q(this.content.id).innerHTML = text;
  743. }
  744. var build = new Panel('build', ' Строения', '#FFCC33');
  745.  
  746. build.renderContent = function(holder) {
  747. var text = '';
  748. for (var i in holder.cities.list) {
  749. var c = holder.cities.list[i];
  750. var s = c.name;
  751. if (i == holder.cities.current)
  752. s = '<b>' + s + '</b>';
  753. s = '<a href="' + applyTidToUri(c.id, 'town?', true) + '">' + s + '</a>';
  754. s = '<td>' + s + '</td><td>';
  755.  
  756. if (c.building) {
  757. s += '(' + (new Date(c.building.at)).format('hh:nn:ss') + ') ';
  758. var item = c.building.item;
  759. if (item == null)
  760. s += 'Ничего не строится'
  761. else {
  762. // _log('showBuilding: '+c.building.toSource());
  763. var complete = c.building.at + item.time - item.progress;
  764. s += ' <a href="' + applyTidToUri(c.id, 'build?pos=' + item.sid) + '">' + item.caption + ' x' + item.level + '</a> в ' + (new Date(complete)).format('hh:nn:ss');
  765. }
  766. }
  767. else
  768. s += ' Нет информации';
  769. s += '</td>';
  770. text += '<tr>' + s + '</tr>';
  771. }
  772. text += '<tr><td><a id="show_build" href="javascript:void(0)">Рассчитать прочность города</a></td><td></td></tr>';
  773.  
  774. $q(this.content.id).innerHTML = '<table class="tactics" cellpadding="0" cellspacing="0">' + text + '</table>';
  775. $q('show_build').addEventListener('click', buildingInfo(), false);
  776.  
  777. }
  778.  
  779. var train = new Panel('train', ' Тренировка', '#90DD43');
  780.  
  781. train.renderContent = function(holder) {
  782. var text = '';
  783. for (var ci in holder.cities.list) {
  784. var c = holder.cities.list[ci];
  785. var s = c.name;
  786. if (ci == holder.cities.current)
  787. s = '<b>' + s + '</b>';
  788. s = '<a href="' + applyTidToUri(c.id, 'town?', true) + '">' + s + '</a>';
  789. s = '<td>' + s + '&nbsp;</td><td>';
  790. //
  791. s += '<table class="trainTable" >';
  792. s += '<tr>';
  793.  
  794. //Динамическая секция по всем строениям
  795. var trInfoArr = holder.cities.list[ci].train;
  796. for (var i in trInfoArr) {
  797. if (trInfoArr[i]) {
  798. s += '<td>&nbsp;<a href="' + applyTidToUri(c.id, 'http://' + currentHost + '/build?pos=' + i) + '">' + trInfoArr[i].building + ' x' + trInfoArr[i].level + '</a>&nbsp;</td>';
  799. }
  800. }
  801. s += '</tr><tr>';
  802. for (var i in trInfoArr) {
  803. if (trInfoArr[i]) {
  804. if (trInfoArr[i].unitId > -1) {
  805. s += '<td><img src="p/spacer.gif" class="unit u' + trInfoArr[i].unitId + '"> (' + trInfoArr[i].unitCount + ')</td>';
  806. } else {
  807. s += '<td>&nbsp;</td>';
  808. }
  809. }
  810. }
  811. s += '</tr><tr>';
  812. for (var i in trInfoArr) {
  813. if (trInfoArr[i]) {
  814. if (trInfoArr[i].timeEnd) {
  815. s += '<td>&nbsp;<span id="tr_' + ci + '_' + i + '" >' + new Date(trInfoArr[i].timeEnd - new Date().getTime() + new Date().getTimezoneOffset() * 60 * 1000).formatTime() + '</span>&nbsp;';
  816. } else
  817. s += '<td>&nbsp;';
  818. s += '<div style="display:inline; font-size:100%; padding-left:20px"><a style="color:red" id="rm_' + ci + '_' + i + '" href="javascript:void(0);">X</a></div></td>';
  819. }
  820. }
  821. // -- конец
  822. s += '</tr></table>';
  823. s += '</td>';
  824. text += '<tr>' + s + '</tr>';
  825. }
  826. text += '<tr><td><a id="clean_end_train" href="javascript:void(0)">Очистить построенные</a></td><td></td></tr>'
  827. text = '<table class="tactics" >' + text + '</table>';
  828. $q(this.content.id).innerHTML = text;
  829. for (var ci in holder.cities.list) {
  830. var trInfoArr = holder.cities.list[ci].train;
  831. for (var i in trInfoArr) {
  832. if (trInfoArr[i]) {
  833. $q('rm_' + ci + '_' + i).addEventListener('click', onRemoveTrainBox(ci, i, holder, this), false);
  834. }
  835. }
  836. }
  837. $q('clean_end_train').addEventListener('click', onCleanEndTrain(holder, this), false);
  838. }
  839.  
  840. var city = new Panel('city', ' Города', '#ffff66');
  841.  
  842. city.renderContent = function(holder) {
  843. this.caption.text = ' Города (' + getArrayCount(holder.townInfo) + ')';
  844. //$q(desc.caption.id).innerHTML = s;
  845. var s = '<tr><td>ID/X/Y</td><td>Город</td><td>Игрок</td><td>Население</td><td>-</td></tr>';
  846. for (var i in holder.townInfo) {
  847. var t = holder.townInfo[i];
  848. var ti = getTownView(i, holder);
  849. var cn = '';
  850. if (t.country)
  851. cn = ', ' + t.country.name;
  852. s += '<tr>';
  853. s += '<td><a id="tgom' + i + '" href="javascript: void(0)" title="Свернуть и перейти на карту">' + t.id + '</a></td>';
  854. s += '<td><a id="tgot' + i + '" href="javascript: void(0)" title="Свернуть и перейти на город">' + t.name + '</a> <a id="tdelc' + i + '" href="javascript: void(0)" title="Удалить город из списка"><img src="' + imageList[3] + '"></a> <a id="tmapc' + i + '" class="lbl" href="javascript: void(0)" title="' + ti.hint + ', переключить видимость">' + ti.caption + '</a></td>';
  855. s += '<td><a id="tgop' + i + '" href="javascript: void(0)" title="Свернуть и перейти на игрока">' + t.player.name + cn + '</a></td>';
  856. s += '<td>';
  857.  
  858. var s2 = '';
  859. if (t.pop.length > 0) {
  860. var j = t.pop.length - 1;
  861. while (j >= 0) {
  862. if (!t.pop[j]) {
  863. j--;
  864. continue;
  865. }
  866. var d = new Date(t.pop[j].date);
  867. if (s2.length > 0)
  868. s2 += '<br />';
  869. var aPop = t.pop[j].value;
  870. if (s2.length == 0)
  871. aPop = '<b>' + aPop + '</b>';
  872. s2 += aPop;
  873. s2 += '<sub>' + d.format('dd.mm hh:nn') + '</sub>';
  874. s2 += ' <a id="tdelp' + i + j + '" href="javascript: void(0)" title="Удалить население из списка"><img src="' + imageList[3] + '"></a>';
  875. j--;
  876. }
  877. }
  878. else
  879. s2 = '-';
  880. s += s2;
  881. s += '</td>';
  882. s += '<td>-</td>';
  883. s += '</tr>';
  884. }
  885. $q(this.content.id).innerHTML = '<table class="towns" cellpadding="0" cellspacing="0"><tbody>' + s + '</tbody></table>';
  886. for (var i in holder.townInfo) {
  887. var t = holder.townInfo[i];
  888. $q('tgom' + i).addEventListener('click', onShowMap(t.id, this), false);
  889. $q('tgot' + i).addEventListener('click', onShowTown(t.id, this), false);
  890. $q('tgop' + i).addEventListener('click', onShowPlayer(t.player.id, this), false);
  891. $q('tdelc' + i).addEventListener('click', onDelTown(t.id, holder), false);
  892. $q('tmapc' + i).addEventListener('click', onChangeViewTown(t.id, holder), false); // на карте
  893. if (t.pop.length > 0) {
  894. var j = t.pop.length - 1;
  895. while (j >= 0) {
  896. $q('tdelp' + i + j).addEventListener('click', onDelPop(t.id, j, holder), false);
  897. j--;
  898. }
  899. }
  900. }
  901. }
  902. /*
  903. var enemy = new Panel('enemy', ' Враги', '#ffffff');
  904. */
  905. if (!$q('settingspane')) {
  906. __addStyle('#settingspane a { color:#ffffff;}');
  907. var sett = new Panel('settings', 'Min', '#000000');
  908. // поднял выше
  909. sett.pane.top = '360px';
  910.  
  911. sett.action = function(render) {
  912. if (render)
  913. return;
  914. isMinMenu = !isMinMenu;
  915. _setValue('isMinMenu', isMinMenu)
  916. for (var i in Panel.instances)
  917. Panel.instances[i].updateCaption();
  918. };
  919.  
  920. sett.updateCaption = function() {
  921. $q(this.button.id).innerHTML = (isMinMenu ? 'Max' : 'Min');
  922. }
  923. } else {
  924. var action = function() {
  925. isMinMenu = !isMinMenu;
  926. for (var i in Panel.instances)
  927. Panel.instances[i].updateCaption();
  928.  
  929. };
  930. $q('settingspanebutton').addEventListener('click', action, false);
  931. }
  932.  
  933. holder.setTownPanel(city);
  934. holder.injectTownInfo();
  935.  
  936. for (var i in Panel.instances) {
  937. Panel.instances[i].render();
  938. try {
  939. Panel.instances[i].renderContent(holder);
  940. } catch (e) {
  941. _log(e);
  942. }
  943. Panel.instances[i].action(true);
  944. }
  945.  
  946. //применить цветовую раскраску
  947. try {
  948. resourceColorer();
  949. } catch(e) {
  950. _log(e);
  951. }
  952. //распознаем транспортировку ресов
  953. if (document.location.href.indexOf('market') != -1){
  954. injectCityListInTrade(holder);
  955. injectTradeOps(holder);
  956. }
  957. //распознаем отправку войск
  958. if (document.location.href.indexOf('getarmy') != -1) {
  959. injectCities($x("//form[@action='getarmy']/p"), 'DIV', holder);
  960. injectArmySpeed();
  961. }
  962. //распознаем отзыв подкрепления
  963. if (document.location.href.indexOf('turnout?home') !=-1) {
  964. injectArmySpeed();
  965. }
  966. // Распознаем форму тренировки войск
  967. /*
  968. if (document.location.href.indexOf('trainpage') != -1 || document.location.href.indexOf('build?pos=') != -1) {
  969. trameTimeCalculate();
  970. collectTrainInfo(holder, train);
  971. }
  972. */
  973. if (document.location.href.indexOf('town') != -1 || document.location.href.indexOf('build?pos=') != -1) {
  974. trameTimeCalculate();
  975. collectTrainInfo(holder, train);
  976. }
  977.  
  978. if (document.location.href.indexOf('account?id=') != -1) {
  979. parseCityListPage();
  980. }
  981.  
  982. if (document.location.href.indexOf('map') != -1) {
  983. parseMapPage();
  984. var allPlayerCitiesHolder = _deserialize(_getValue("all_player_cities_holder", '{}'));
  985. var cities = _deserialize(_getValue('cities', '{ current: null, list: [] }'));
  986. var baseCoords = allPlayerCitiesHolder[cities.list[cities.current].id];
  987. if (baseCoords) {
  988. var linkDiv = $x("//div[@id='map_all']/div[contains(@style, 'position:absolute')]")[0];
  989. $e('DIV', '<a id="inf_tt_ico" class="a_osn_yes"></a>', {id:'inf_tt_ico_a'}, null, linkDiv);
  990. document.getElementById('inf_tt_ico_a').addEventListener('click', switchMapHelp);
  991. }
  992. $x("//div[@id='landlnks']")[0].addEventListener("DOMNodeInserted", onMapDivNodeInserted, false);
  993. }
  994. //распознаем форму Экономики города
  995. if (document.location.href.indexOf('economics') != -1) {
  996. injectEconomicCalc(holder);
  997. }
  998.  
  999. if (document.location.href.indexOf('market?stream') != -1) {
  1000. injectTPCities();
  1001. streamSort();
  1002. }
  1003. /*
  1004. if (document.location.href.indexOf('buildinfo?id=') != -1) {
  1005. parseBuildingInfo();
  1006. }
  1007. */
  1008. if (document.location.href.indexOf('countryinfo') !=-1) {
  1009. var players = $x("//table[@class='def_table players']/tbody/tr/td/a[@class='ulink0']");
  1010. var line = "";
  1011. for (var i in players) {
  1012. line += players[i].innerHTML + '|';
  1013. }
  1014. _log(line);
  1015. }
  1016. /*
  1017. if (document.location.href.indexOf('town') != -1) {
  1018. var blocks = $x("//div[contains(@style,'/p/if/stone/sh_sl.png')]");
  1019. if (blocks.length == 0) {
  1020. $e('DIV', null, {id: 'en_build_info_panel'}, {cursor:'pointer', background: 'url(/p/if/stone/sh_sl.png)', position: 'absolute', left: '-7px', top:'444px', zIndex:10000, width:'29px', height:'26px'}, $x("//div[@class='balka2_ balka2_p1']/div[@id='cont04']")[0]);
  1021. $q('en_build_info_panel').addEventListener('click', changeBuildPanelView(), false);
  1022. }
  1023. }
  1024.  
  1025. if (_getValue('build_info_panel', false) && document.location.href.indexOf('town') != -1) {
  1026. addBuildInfoPanel();
  1027. }
  1028. */
  1029.  
  1030. if ((document.location.href.indexOf('market') != -1 || document.location.href.indexOf('trade') != -1) && document.location.href.indexOf('adv') != -1 && document.location.href.indexOf('buy') != -1) {
  1031. injectAdvTrade();
  1032. $x("//table[contains(@class, 'trade_table')]")[0].addEventListener("DOMNodeInserted", onTradeTableNodeInserted, false);
  1033. }
  1034.  
  1035. applyHelpToBuildings();
  1036.  
  1037. trainTimer(holder, train);
  1038. var help_div = document.createElement('DIV');
  1039. help_div.id = 'help_div';
  1040. help_div.style.position = 'absolute';
  1041. help_div.style.zIndex = 10000;
  1042. help_div.style.border = '1px solid #333';
  1043. help_div.style.backgroundColor = '#EEE';
  1044. help_div.style.width = '190px';
  1045. help_div.style.height = '180px';
  1046. help_div.style.color = '#000';
  1047. help_div.style.fontSize = '.8em';
  1048. help_div.style.visibility = 'hidden';
  1049. help_div.style.display = 'none';
  1050. document.body.appendChild(help_div);
  1051. }
  1052.  
  1053.  
  1054. // common functions
  1055.  
  1056. //Применить цветовую раскраску к складу:
  1057. //фиолетовый - склад заполниться менее чем за 6 часов
  1058. //зеленый - склад опустеет более чем за 24 часа/склад заполняется
  1059. //оранжевый - склад опустеет менее чем через 24 часа но более чем за 12 часов
  1060. //бардовый - склад опустеет менее чем за 12 часов но более чем за 6 часов
  1061. //красный жирный - склад опустеет менее чем за 6 часов
  1062. //В диалоге постройки здания применить цвета к ресурсам, необходимым для постройки
  1063. //зеленый - ресурсов достаточно для постройки
  1064. //красный - ресурсов недостаточно для постройки
  1065. var arr = new Array();
  1066. function resourceColorer() {
  1067. var lis = $x("//ul[@id='myres']/li");
  1068. //Добавить информацию о максимальном количестве
  1069. var capacity = null;
  1070. for (var i in lis) {
  1071. var cap = $x("./center/b/a/span[@id='storemax']", lis[i])[0];
  1072. if (cap) {
  1073. capacity = parseInt(cap.innerHTML);
  1074. continue;
  1075. }
  1076. if (!capacity) continue;
  1077. var i_nodes = $x("./i", lis[i]);
  1078. if (i_nodes.length > 0 && i_nodes.length < 4) {
  1079. i_nodes[1].parentNode.insertBefore($t("/"), i_nodes[1]);
  1080. i_nodes[1].parentNode.insertBefore($e("i", capacity), i_nodes[1]);
  1081. } else {
  1082. i_nodes = $x("./img", lis[i]);
  1083. if (i_nodes.length > 0) {
  1084. i_nodes[0].parentNode.appendChild($t("/" + capacity));
  1085. }
  1086. }
  1087. }
  1088. for (var i in lis) {
  1089. var imgs = $x("img", lis[i]);
  1090. if (imgs.length == 0)
  1091. continue;
  1092. var resId = parseInt(imgs[0].className.substring(5, imgs[0].className.length));
  1093. if (resId < 2)
  1094. continue;
  1095. var iss = $x("i", lis[i]);
  1096. if (iss.length < 2) {
  1097. var nodes = lis[i].childNodes;
  1098. var txt = '';
  1099. for (k in nodes) {
  1100. if (nodes[k].nodeName == '#text') {
  1101. txt = txt + nodes[k].nodeValue;
  1102. }
  1103. }
  1104. var art = txt.match(/(\d+)\/(\d+)/);
  1105. if (art && art.length > 1)
  1106. arr[resId] = parseInt(art[1]);
  1107. else
  1108. continue;
  1109. imgs[0].title = imgs[0].title + ' - осталось места: ' + formatNumber(parseInt(art[2]) - parseInt(art[1]), 3);
  1110. continue;
  1111. }
  1112. var nres = parseInt(iss[0].innerHTML);
  1113. var nmax = parseInt(iss[1].innerHTML);
  1114. imgs[0].title = imgs[0].title + ' - осталось места: ' + formatNumber(nmax - nres, 3);
  1115. if (iss.length > 3) {
  1116. var min = parseFloat(iss[2].innerHTML.substring(1));
  1117. if (iss[2].innerHTML.indexOf('-') > -1) {
  1118. if (min * 24 < nres) {
  1119. setColor(iss[0], iss[1], iss[2], 'green', nres / min);
  1120. } else if (min * 12 < nres) {
  1121. setColor(iss[0], iss[1], iss[2], '#C27811', nres / min);
  1122. } else if (min * 6 < nres) {
  1123. setColor(iss[0], iss[1], iss[2], '#A52A2A', nres/min);
  1124. } else {
  1125. setColor(iss[0], iss[1], iss[2], 'red', nres/min);
  1126. applyBold(iss[0]);
  1127. applyBold(iss[1]);
  1128. applyBold(iss[2]);
  1129. }
  1130. } else if (iss[2].innerHTML.indexOf('+') > -1 ) {
  1131. if (min * 6 + nres > nmax) {
  1132. setColor(iss[0], iss[1], iss[2], '#5D0EDC', (nmax-nres)/min);
  1133. } else
  1134. setColor(iss[0], iss[1], iss[2], 'green', (nmax-nres)/min);
  1135. }
  1136. if (nres >= 100000) {
  1137. applyBold(iss[0]);
  1138. }
  1139. }
  1140. arr[resId] = nres;
  1141. }
  1142.  
  1143.  
  1144. if (location.href.indexOf('build?pos=') > -1) {
  1145. //раскрасить улучшение
  1146. var fonts = $x("//div[@class='build_title']")
  1147. for (var i in fonts)
  1148. processNode(fonts[i], arr);
  1149. //раскрасить перестройку
  1150. fonts = $x("//div[@class='build_rebuild']/table/tbody/tr/td")
  1151. for (var i in fonts)
  1152. processNode(fonts[i], arr);
  1153. //раскрасить список строительства
  1154. var itms = $x("//div[@id='build_prc_cont']");
  1155. for (var j in itms) {
  1156. processNode(itms[j], arr);
  1157. }
  1158.  
  1159. }
  1160.  
  1161. var nasI = $x("//div[@class='chcol2 chcol_p1']/div[@class='aC']/nobr/span");
  1162. if (nasI && nasI.length > 0) {
  1163. //расчитать время до макс. населения
  1164. var nasCurr = parseFloat($x("./span", nasI[0])[0].innerHTML);
  1165. var nasMax = parseFloat($x("./span", nasI[0])[1].innerHTML);
  1166. var dt = $x("//div[@class='aC']/nobr")[1];
  1167. var temp = parseFloat(dt.innerHTML.match(/(\d+.\d|\d+)/)[1]);
  1168. var ttime = 0;
  1169. if (temp > 0) {
  1170. ttime = 24*(nasMax - nasCurr)/temp;
  1171. }
  1172. var clr = 'green';
  1173. if (ttime < 0) {
  1174. clr = 'red';
  1175. ttime = -1*ttime;
  1176. }
  1177. var nobr = $e('nobr', null, null, null, $x("//div[@class='chcol2 chcol_p1']/div[@class='aC']")[0]);
  1178. $e('span', '[' + Math.round(ttime*10)/10 + ']', null, {float: 'right', fontWeight: 'bold', color: clr}, nobr);
  1179.  
  1180. }
  1181.  
  1182. }
  1183.  
  1184. function applyBold(iss) {
  1185. iss.style.fontWeight='bold';
  1186. }
  1187.  
  1188. function processNode(node, arr) {
  1189. var spans = $x("./span", node);
  1190. for (var spi in spans) {
  1191. var nd = spans[spi];
  1192. var childs = nd.childNodes;
  1193. var i = 0;
  1194. while (i < childs.length) {
  1195. var nod = childs[i];
  1196. if (nod.nodeName == 'IMG') {
  1197. var txt = nod.className.substring(5, nod.className.length)
  1198. var colorSpan = document.createElement('SPAN');
  1199. var val = parseInt(childs[i + 1].nodeValue);
  1200. if (arr[parseInt(txt)] >= val)
  1201. colorSpan.style.color = 'green';
  1202. else {
  1203. colorSpan.style.color = '#A52A2A';
  1204. nod.title = nod.title + ': Нехватает ' + formatNumber(val - arr[parseInt(txt)], 3);
  1205. }
  1206. colorSpan.style.fontWeight = 'bold';
  1207. colorSpan.innerHTML = childs[i + 1].nodeValue;
  1208. nd.removeChild(childs[i + 1]);
  1209. nd.insertBefore(colorSpan, nod.nextSibling);
  1210. }
  1211. i++;
  1212. }
  1213. }
  1214. }
  1215.  
  1216. function setColor(el, el1, el2, clr, ttime){
  1217. el.style.color = clr;
  1218. el1.style.color = clr;
  1219. el2.style.color = clr;
  1220. var nfo = document.createElement('span');
  1221. nfo.setAttribute('style', 'float:right;font-weight:bold; color:' + clr);
  1222. nfo.innerHTML = '[' + Math.round(ttime * 10) / 10 + ']';
  1223. el1.parentNode.appendChild(nfo);
  1224. }
  1225.  
  1226. function applyTidToUri(tid, url, notUsePrefix) {
  1227. var s = document.location.href;
  1228. if (url)
  1229. s = url;
  1230. var pref = '&';
  1231. if (notUsePrefix)
  1232. pref = '';
  1233. if (s.indexOf('tid=') == -1)
  1234. return s+pref+'tid='+tid;
  1235. else
  1236. return s.replace(/tid\=\d+/, 'tid='+tid);
  1237. }
  1238.  
  1239. function formatNumber(num, digits) {
  1240. var snum = new String(num);
  1241. var ln = snum.length;
  1242. var fmtNum = '';
  1243. for (var i=ln-1; i>=0; i--) {
  1244. fmtNum = snum.charAt(i) + fmtNum;
  1245. if (i > 0 && (ln - i) % digits == 0) {
  1246. fmtNum = '.' + fmtNum;
  1247. }
  1248. }
  1249. return fmtNum;
  1250. }
  1251.  
  1252. function injectCityListInTrade(holder) {
  1253. //reformat cities in trade list to new format
  1254. var pTrade = $x("//select[@name='id']/option", null);
  1255. for (var i in pTrade) {
  1256. if (pTrade[i].value)
  1257. pTrade[i].value = pTrade[i].value;
  1258. else
  1259. pTrade[i].value = '0';
  1260. }
  1261. var sTrade = $x("//select[@name='id']", null)[0];
  1262. sTrade.options[sTrade.options.length] = new Option('-----------------', '0');
  1263. for (var i in holder.townInfo) {
  1264. var town = holder.townInfo[i];
  1265. if (town.view == 2 || town.view == 4) {
  1266. var coords = parseCityCoordinats(town.id);
  1267. sTrade.options[sTrade.options.length] = new Option(town.name, coords[0]);
  1268. }
  1269. }
  1270. sTrade.removeAttribute('onchange');
  1271. sTrade.addEventListener('change', changeTradeCoord, false);
  1272. }
  1273.  
  1274. function parseCityCoordinats(id) {
  1275. var inf = id.match(/(\d+)\/(\d+)\/(\d+)/);
  1276. if (inf && inf.length > 3) {
  1277. return [inf[1], inf[2], inf[3]];
  1278. }
  1279. inf = id.match(/(\d+)\/(\d+)/);
  1280. if (inf && inf.length > 2) {
  1281. return [0, inf[1], inf[2]];
  1282. }
  1283. }
  1284.  
  1285. function injectTPCities() {
  1286. var tplinks = $x("//div[@class='tradeway_3_sh']/div/table[@class='def_table_cw']/tbody/tr/td/a[contains(@href, 'towninfo?id=')]");
  1287. if (tplinks.length > 0) {
  1288. var sel = $x("//select[@name='id']")[0];
  1289. $e('OPTION', '------ТП------', {disabled:true, name: 'id', value: '0'}, null, sel);
  1290. for (var i in tplinks) {
  1291. var id = parseInt(tplinks[i].href.match(/id=(\d+)/)[1]);
  1292. $e('OPTION', tplinks[i].innerHTML, {name: 'id', value:id},null, sel);
  1293. }
  1294. }
  1295. }
  1296.  
  1297. function injectArmySpeed() {
  1298. var armyTd = $x("//table[@id='armyetable']/tbody/tr/td");
  1299. for (var i in armyTd) {
  1300. var id = parseInt($x("./a", armyTd[i])[0].href.match(/id=(\d+)/)[1]);
  1301. $e('TD', '<img class="icnu ic8" src="/p/_.gif" title="Скорость">' + unitSpeedHolder[id], null, null, armyTd[i].parentNode);
  1302. }
  1303. }
  1304.  
  1305. function injectCities(pTrade, container, holder) {
  1306. var txt = '<select id="injCities" name="id" ><option value=""></option>';
  1307. for (var ci in holder.cities.list) {
  1308. var c = holder.cities.list[ci];
  1309. txt +='<option value="' + c.id + '>'+ c.name + '</option>';
  1310. }
  1311. txt +='</select>';
  1312. $e(container, txt, null, null, pTrade[0]);
  1313. document.getElementById('injCities').addEventListener('change', changeTradeCoord, false);
  1314.  
  1315. }
  1316.  
  1317. function changeTradeCoord() {
  1318. var tradeList = $x("//select[@name='id']", null)[0];
  1319. if (tradeList.selectedIndex != -1) {
  1320. var id = tradeList.options[tradeList.selectedIndex].value;
  1321. tradeList.value = id;
  1322. //alert(tradeList.value);
  1323. var fCity = false;
  1324. if (document.location.href.indexOf("market") != -1) {
  1325. for (var i=0; i < wofh.account.townsArr.length; i++) {
  1326. //alert(wofh.account.townsArr[i].id);
  1327. if (wofh.account.townsArr[i].id == id)
  1328. fCity = true;
  1329. }
  1330. if (fCity != true) {
  1331. document.location = 'http://' + currentHost + '/market?target=' +id+ '#send';
  1332. } else {
  1333. fCity = false;
  1334. }
  1335. }
  1336. }
  1337. }
  1338.  
  1339. function getTownView(id, holder) {
  1340. var view = 0;
  1341. if ('view' in holder.townInfo[id])
  1342. view = holder.townInfo[id].view;
  1343. var result = { caption: '?', hint: '' };
  1344. switch (view) {
  1345. case 0:
  1346. default:
  1347. result.caption = '-';
  1348. result.hint = 'не показано';
  1349. break;
  1350. case 1:
  1351. result.caption = 'М<img src="'+imageList[3+view]+'" />';
  1352. result.hint = 'мой город';
  1353. break;
  1354. case 2:
  1355. result.caption = 'С<img src="'+imageList[3+view]+'" />';
  1356. result.hint = 'участник страны';
  1357. break;
  1358. case 3:
  1359. result.caption = 'К<img src="'+imageList[3+view]+'" />';
  1360. result.hint = 'кормушка';
  1361. break;
  1362. case 4:
  1363. result.caption = 'Д<img src="'+imageList[3+view]+'" />';
  1364. result.hint = 'друг';
  1365. break;
  1366. case 5:
  1367. result.caption = 'В<img src="'+imageList[3+view]+'" />';
  1368. result.hint = 'враг';
  1369. break;
  1370. }
  1371. return result;
  1372. }
  1373.  
  1374. function onShowMap(id, cityPanel){
  1375. return function(){
  1376. try {
  1377. cityPanel.action();
  1378. var inf = parseCityCoordinats(id);
  1379. location.href = 'http://' + currentHost + '/map?o=' + inf[0] + '&x=' + inf[1] + '&y=' + inf[2];
  1380. } catch (e) {
  1381. _log(e);
  1382. }
  1383. }
  1384. }
  1385.  
  1386. function onShowTown(id, cityPanel){
  1387. return function(){
  1388. cityPanel.action();
  1389. var inf = parseCityCoordinats(id);
  1390. location.href = 'http://' + currentHost + '/mapinfo?o=' + inf[0] + '&x=' + inf[1] + '&y=' + inf[2];
  1391. }
  1392. }
  1393.  
  1394. function onShowPlayer(id, cityPanel){
  1395. return function(){
  1396. cityPanel.action();
  1397. location.href = 'http://' + currentHost + '/account?id=' + id;
  1398. }
  1399. }
  1400.  
  1401. function onDelTown(id, holder){
  1402. return function(){
  1403. // удаляем элемент
  1404. delete holder.townInfo[id];
  1405. holder.saveTownInfo();
  1406. holder.updateTownPanel();
  1407. }
  1408. }
  1409.  
  1410.  
  1411. function onChangeViewTown(id, holder) {
  1412. return function(){
  1413. // меняем видимость
  1414. var view = 0;
  1415. if ('view' in holder.townInfo[id])
  1416. view = holder.townInfo[id].view;
  1417. view++;
  1418. if (view > 5)
  1419. view = 0;
  1420. holder.townInfo[id].view = view;
  1421.  
  1422. holder.saveTownInfo();
  1423. holder.updateTownPanel();
  1424. }
  1425. }
  1426.  
  1427. function onDelPop(id, item, holder){
  1428. return function(){
  1429. // удаляем элемент
  1430. holder.townInfo[id].pop.splice(item, 1);
  1431. holder.saveTownInfo();
  1432. holder.updateTownPanel();
  1433. }
  1434. }
  1435.  
  1436. function getArrayCount(arr) {
  1437. var result = 0;
  1438. for (var i in arr)
  1439. result++;
  1440. return result;
  1441. }
  1442.  
  1443. function injectTradeOps(holder) {
  1444. if (wofh.town.trade.traders.busy > 0) {
  1445. holder.cities.list[holder.cities.current].traders.total = wofh.town.trade.traders.count;
  1446. holder.cities.list[holder.cities.current].traders.free = wofh.town.trade.traders.count - wofh.town.trade.traders.busy;
  1447. holder.cities.list[holder.cities.current].traders.market = wofh.town.trade.traders.reserve;
  1448. _setValue('cities', _serialize(holder.cities));
  1449. }
  1450. var tradeContainer = new TradeContainer(holder.cities.list[holder.cities.current].traders.free * 250);
  1451. tradeContainer.init();
  1452. }
  1453.  
  1454.  
  1455. //К форме тренировки войск добавляется количество юнитов, которое можно создать в течении суток
  1456. // напр. Требушет [Пища] 100 [Древесина] 600 [Металл] 100 [Житель] 5 5:47:13(4.1)
  1457. function trameTimeCalculate() {
  1458. var armyTd = $x("//form[@action='train']/div/div/table/tbody/tr/td[@class='utm']/span");
  1459. for (var i in armyTd) {
  1460. var txt = armyTd[i].innerHTML;
  1461. var radio_id = $x("./td[@class='urd']/input", armyTd[i].parentNode.parentNode)[0].getAttribute('id');
  1462. var input_id = $x("./div[@class='tunit_btns']/div[@class='cnt']/input", armyTd[i].parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode)[0].getAttribute('id');
  1463. armyTd[i].innerHTML = txt + "<a href=\"javascript:void(0)\" id=\"setup_" + i + "\">[" + calcTime(txt) + "]</a>";
  1464. document.getElementById('setup_' + i).addEventListener('click', setTraneCount(radio_id, input_id, Math.round(calcTime(txt)), false));
  1465. }
  1466. }
  1467.  
  1468. function setTraneCount(radio_id, input_id, count) {
  1469. return function() {
  1470. $q(radio_id).checked = true;
  1471. $q(input_id).value = count;
  1472.  
  1473.  
  1474. var evObj = document.createEvent('UIEvents');
  1475. evObj.initUIEvent( 'keyup', true, true, window, 1 );
  1476. evObj.keyCode = 13;
  1477. $q(input_id).dispatchEvent(evObj);
  1478. }
  1479. }
  1480.  
  1481. function calcTime(str) {
  1482. var tm = str.split(':');
  1483. var tm1 = tm[1];
  1484. if (tm1.indexOf('0') == 0) {
  1485. tm1 = tm1.substring(1,tm1.length);
  1486. }
  1487. var tt = parseInt(tm[0])*60*60 + parseInt(tm1)*60 + parseInt(tm[2]);
  1488. return Math.round(24*60*60/tt*10)/10;
  1489. }
  1490.  
  1491. function collectTrainInfo(holder, panel) {
  1492. var timeToFinish;
  1493.  
  1494.  
  1495. holder.cities.list[holder.cities.current].train = {};
  1496. if (document.location.href.indexOf('town') != -1 || document.location.href.indexOf('build?pos=') != -1) {
  1497. for (var i=0; i < wofh.town.events.items.length; i++) {
  1498. var event = wofh.town.events.items[i];
  1499. if (event.cls.name == 'masstrn') {
  1500. //_log(lib.units.list[event.data.unit].name);
  1501. var trInfo = {};
  1502. trInfo.building = lib.builds[wofh.town.build.slots[event.slot].id].name;
  1503. trInfo.level = wofh.town.build.slots[event.slot].level;
  1504. trInfo.unitId = event.data.unit;
  1505. trInfo.unitCount = event.data.count;
  1506. trInfo.timeEnd = wofh.core.calcTrainEventData(wofh.town, wofh.town.build.slots[event.slot], wofh.town.events.items[i]).time;
  1507. holder.cities.list[holder.cities.current].train[i] = trInfo;
  1508. _setValue('cities', _serialize(holder.cities));
  1509. panel.renderContent(holder);
  1510. }
  1511. }
  1512. }
  1513. /*
  1514. if (document.location.href.indexOf('build?pos=') != -1) {
  1515. var tr = $x("//div[@class='tunit_cont']/form[contains(@action, 'train')]");
  1516. var buildDiv = $x("//div[@class='build_train']/div[@class='desc']");
  1517. if (tr.length == 0 && buildDiv.length == 0)
  1518. return;
  1519.  
  1520. var trInfo = {};
  1521. var bpos = parseInt(document.location.href.match(/pos=(\d+)/)[1]);
  1522. var info = $x("//div[@id='cont04']/div[@class='pagetitle']/div");
  1523. var txt = info[0].innerHTML;
  1524. var nfo = txt.match(/<a .*>(.*)<\/a> - (\d+)/);
  1525. trInfo.building = nfo[1];
  1526. trInfo.level = parseInt(nfo[2]);
  1527. if (tr.length > 0) {
  1528. // Присутвует форма тренировки - здание свободно
  1529. trInfo.unitId = -1;
  1530. trInfo.unitCount = 0;
  1531. trInfo.timeEnd = 0;
  1532. } else {
  1533. if (buildDiv.length > 0) {
  1534. // идет производство войск
  1535. var hr = $x("a[contains(@href,'unitinfo?id=')]", buildDiv[0])[0].href;
  1536. trInfo.unitId = parseInt(hr.match(/id=(\d+)/)[1]);
  1537. // быстрохак
  1538. if (currentHost.indexOf("waysofhistory") != -1) {
  1539. trInfo.unitCount = parseInt(buildDiv[0].innerHTML.match(/Ready:\s*(\d+)\s*of\s*(\d+)/)[2]);
  1540. var s = $x("span/span[contains(@id, 'timer')]", buildDiv[0]);
  1541. var found = null;
  1542. if (s.length > 0) {
  1543. s = s[0].innerHTML;
  1544. found = s.match(/(\d+)\:(\d+)\:(\d+)/);
  1545. } else {
  1546. s = $x("./span[@class='td']", buildDiv[0])[0].innerHTML;
  1547. var days = s.match(/(\d+).(\d+) days/);
  1548. var minutes = (parseInt(days[1]) + parseInt(days[2])/10) * 24 * 60 * 60;
  1549. found = ['0', '0', '00', '' + Math.round(minutes)] ;
  1550. }
  1551. var found2 = found[2];
  1552. if (found2.indexOf('0') == 0) {
  1553. found2 = found2.substring(1,found2.length);
  1554. }
  1555. trInfo.timeEnd = new Date().getTime() + (parseInt(found[1])*60*60 + parseInt(found2)*60 + parseInt(found[3]))*1000;
  1556. } else {
  1557. trInfo.unitCount = parseInt(buildDiv[0].innerHTML.match(/Готово:\s*(\d+)\s*из\s*(\d+)/)[2]);
  1558. var s = $x("./span[@class='td build_train_timer']", buildDiv[0])[0].getAttribute("data-time");
  1559. timeToFinish = parseInt(s, 10) * 1000;
  1560. trInfo.timeEnd = new Date().getTime() + timeToFinish;
  1561. }
  1562. }
  1563. }
  1564. holder.cities.list[holder.cities.current].train[bpos] = trInfo;
  1565. _setValue('cities', _serialize(holder.cities));
  1566. panel.renderContent(holder);
  1567. } else {
  1568.  
  1569. var trExists = $x("//div[@id='cont04']/div[@class='pagecont3']/span/div[@class='build_train']");
  1570. if (trExists.length ==0)
  1571. return;
  1572. var trainDiv = $x("//div[@id='cont04']/div[@class='pagecont3']");
  1573. var trNodes = trainDiv[0].childNodes;
  1574. var trCnt = -1;
  1575. for (var i in trNodes) {
  1576. var trInfo = null;
  1577. try {
  1578. if (trNodes[i].nodeName == 'P') {
  1579. //Получаем информацию о военном строении и его уровне
  1580. var descr = $x(".//a[contains(@href,'build?pos=')]/span", trNodes[i]);
  1581. if (descr.length == 0)
  1582. continue;
  1583. trInfo = {};
  1584. trInfo.building = descr[0].innerHTML;
  1585.  
  1586. var hr = $x(".//a[contains(@href,'build?pos=')]", trNodes[i])[0].href;
  1587. trCnt = parseInt(hr.match(/pos=(\d+)/)[1]);
  1588.  
  1589. var s = trNodes[i].lastChild.lastChild.nodeValue;
  1590. trInfo.level = parseInt(s.match(/\d+/)[0]);
  1591. trInfo.unitId = -1;
  1592. holder.cities.list[holder.cities.current].train[trCnt] = trInfo;
  1593. }
  1594. if (trNodes[i].nodeName == 'SPAN') {
  1595. //Получаем информацию о строящихся войсках
  1596. var trInfo = holder.cities.list[holder.cities.current].train[trCnt];
  1597. var buildDiv = $x(".//div/div[@class='desc']", trNodes[i]);
  1598. if (buildDiv.length > 0) {
  1599. // идет производство войск
  1600. var hr = $x(".//a[contains(@href,'unitinfo?id=')]", buildDiv[0])[0].href;
  1601. trInfo.unitId = parseInt(hr.match(/id=(\d+)/)[1]);
  1602. // быстрохак
  1603. if (currentHost.indexOf("waysofhistory") != -1) {
  1604. trInfo.unitCount = parseInt(buildDiv[0].innerHTML.match(/Ready:\s*(\d+)\s*of\s*(\d+)/)[2]);
  1605. var s = $x("span/span[contains(@id, 'timer')]", buildDiv[0]);
  1606. var found = null;
  1607. if (s.length > 0) {
  1608. s = s[0].innerHTML;
  1609. found = s.match(/(\d+)\:(\d+)\:(\d+)/);
  1610. } else {
  1611. s = $x("./span[@class='td']", buildDiv[0])[0].innerHTML;
  1612. var days = s.match(/(\d+).(\d+) days/);
  1613. var minutes = (parseInt(days[1]) + parseInt(days[2])/10) * 24 * 60 * 60;
  1614. found = ['0', '0', '00', '' + Math.round(minutes)] ;
  1615. }
  1616. var found2 = found[2];
  1617. if (found2.indexOf('0') == 0) {
  1618. found2 = found2.substring(1,found2.length);
  1619. }
  1620. alert (found);
  1621. trInfo.timeEnd = new Date().getTime() + (parseInt(found[1])*60*60 + parseInt(found2)*60 + parseInt(found[3]))*1000;
  1622. } else {
  1623. trInfo.unitCount = parseInt(buildDiv[0].innerHTML.match(/Готово:\s+(\d+)\s*из\s*(\d+)/)[2]);
  1624. var s = $x("./span[@class='td build_train_timer']", buildDiv[0])[0].getAttribute("data-time");
  1625. timeToFinish = parseInt(s, 10) * 1000;
  1626. trInfo.timeEnd = new Date().getTime() + timeToFinish;
  1627. }
  1628. holder.cities.list[holder.cities.current].train[trCnt] = trInfo;
  1629. }
  1630. }
  1631. } catch (except) {
  1632. _log(except);
  1633. }
  1634.  
  1635. if (trInfo && trCnt >-1)
  1636. holder.cities.list[holder.cities.current].train[trCnt] = trInfo;
  1637. }
  1638. _setValue('cities', _serialize(holder.cities));
  1639. }
  1640. */
  1641. }
  1642.  
  1643. function onRemoveTrainBox(ci, i, holder, panel){
  1644. return function(){
  1645. if (confirm("Вы точно хотите удалить строение из списка?")) {
  1646. delete holder.cities.list[ci].train[i];
  1647. _setValue('cities', _serialize(holder.cities));
  1648. panel.renderContent(holder);
  1649. }
  1650. }
  1651. }
  1652.  
  1653. function onCleanEndTrain(holder, panel){
  1654. for (var ci in holder.cities.list) {
  1655. var trInfoArr = holder.cities.list[ci].train;
  1656. for (var i in trInfoArr) {
  1657. if (trInfoArr[i] && trInfoArr[i].timeEnd) {
  1658. if (trInfoArr[i].timeEnd - new Date().getTime() <=0) {
  1659. if (document.getElementById("tr_" + ci + "_" + i).innerHTML == 'постройка окончена') {
  1660. delete holder.cities.list[ci].train[i];
  1661. _setValue('cities', _serialize(holder.cities));
  1662. }
  1663. }
  1664. }
  1665. }
  1666. }
  1667. panel.renderContent(holder);
  1668. }
  1669.  
  1670. function trainTimer(holder, panel) {
  1671. for (var ci in holder.cities.list) {
  1672. var trInfoArr = holder.cities.list[ci].train;
  1673. for (var i in trInfoArr) {
  1674. if (trInfoArr[i] && trInfoArr[i].timeEnd) {
  1675. if (trInfoArr[i].timeEnd - new Date().getTime() <=0) {
  1676. document.getElementById("tr_" + ci + "_" + i).innerHTML = 'постройка окончена';
  1677. //Ахтунг, здание простаивает!!! А игрок не в курсе!
  1678. $q(panel.title.id).style.backgroundColor = panel.title.alertBackground;
  1679. } else {
  1680. document.getElementById("tr_" + ci + "_" + i).innerHTML = new Date(trInfoArr[i].timeEnd - new Date().getTime()).formatTime();
  1681. }
  1682. }
  1683. }
  1684. }
  1685. var visible = _getValue(panel.content.visibleKey, panel.content.visible);
  1686. if (visible)
  1687. for (var ci in holder.cities.list) {
  1688. var trInfoArr = holder.cities.list[ci].tradeOperation;
  1689. for (var i in trInfoArr) {
  1690. if (trInfoArr[i] && trInfoArr[i].time) {
  1691. if (trInfoArr[i].time - new Date().getTime() <=0) {
  1692. document.getElementById("op_" + ci + "_" + i).innerHTML = 'просрочено';
  1693. } else {
  1694. document.getElementById("op_" + ci + "_" + i).innerHTML = new Date(trInfoArr[i].time - new Date().getTime()).formatTime();
  1695. }
  1696. }
  1697. }
  1698. }
  1699. setTimeout(function(){
  1700. trainTimer(holder, panel)
  1701. }, 1000);
  1702. }
  1703.  
  1704. var nas = 0;
  1705. var cr = 0;
  1706. var pp = 0;
  1707. function injectEconomicCalc(holder) {
  1708.  
  1709. var infoDivs = $x("//div[@id='econstats']/table/tbody/tr/td");
  1710. var pNode = infoDivs[0].lastChild;
  1711. var eNode = infoDivs[2];
  1712. var cNode = infoDivs[4];
  1713.  
  1714. nas = parseInt(pNode.nodeValue);
  1715. infoDivs[0].replaceChild($e('SPAN', nas, {id: 'info_div_0_value'}), pNode);
  1716.  
  1717. pp = eNode.innerHTML.match(/(\d+)/)[1];
  1718. cr = cNode.innerHTML.match(/(\d+)/)[1];
  1719.  
  1720. eNode.replaceChild($t('Потенциал: '), eNode.firstChild);
  1721. eNode.insertBefore($e('SPAN', pp, {id: 'info_div_1_value'}), eNode.lastChild);
  1722. eNode.insertBefore($t(' '), eNode.lastChild);
  1723.  
  1724. cNode.replaceChild($t('Коррупция: '), cNode.firstChild);
  1725. cNode.insertBefore($e('SPAN', cr, {id: 'info_div_2_value'}), cNode.lastChild);
  1726. cNode.insertBefore($t('% '), cNode.lastChild);
  1727.  
  1728. var trElement = $x("//div[@id='econstats']/table/tbody");
  1729. var changeNode = $e('TD', null, {colspan : 7}, {color: '#000000'}, $e('TR', null, null, null, trElement[0]));
  1730.  
  1731. var content = [];
  1732. content.push('Население: ');
  1733. content.push('<a href="javascript: void(0)" id="info_div_0_add_10" >+10</a>');
  1734. content.push('/<a href="javascript: void(0)" id="info_div_0_rm_10" >-10</a> ');
  1735. content.push('<a href="javascript: void(0)" id="info_div_0_add_100" >+100</a>');
  1736. content.push('/<a href="javascript: void(0)" id="info_div_0_rm_100" >-100</a> ');
  1737. content.push('<a href="javascript: void(0)" id="info_div_0_add_1000" >+1K</a>');
  1738. content.push('/<a href="javascript: void(0)" id="info_div_0_rm_1000" >-1K</a>');
  1739. content.push(' Уровень суда: ');
  1740. var lvls = [1,1.3,1.7,2.1,2.6,3.1,3.6,4.1,4.6,5.2,5.8,6.3,6.9,7.5,8.1,8.7,9.4,10,10.6,11.3,11.9];
  1741. content.push('<select id="info_sel_change">');
  1742. for (var i in lvls) {
  1743. content.push('<option value="');
  1744. content.push(lvls[i]);
  1745. content.push('">Суд ');
  1746. content.push(i);
  1747. content.push('</option>');
  1748. }
  1749. content.push('</select>');
  1750.  
  1751. changeNode.innerHTML = content.join('');
  1752.  
  1753. $q('info_sel_change').addEventListener('change', onRecalcCorrupt(holder), false);
  1754.  
  1755. $q('info_div_0_add_10').addEventListener('click', onRecalcNas(10), false);
  1756. $q('info_div_0_rm_10').addEventListener('click', onRecalcNas(-10), false);
  1757. $q('info_div_0_add_100').addEventListener('click', onRecalcNas(100), false);
  1758. $q('info_div_0_rm_100').addEventListener('click', onRecalcNas(-100), false);
  1759. $q('info_div_0_add_1000').addEventListener('click', onRecalcNas(1000), false);
  1760. $q('info_div_0_rm_1000').addEventListener('click', onRecalcNas(-1000), false);
  1761.  
  1762. }
  1763.  
  1764.  
  1765. function onRecalcCorrupt(holder){
  1766. return function(){
  1767. var effect = $q('info_sel_change').value;
  1768.  
  1769. var corr = -20;
  1770. for (var c in holder.cities.list) {
  1771. corr+=20;
  1772. }
  1773. cr = corr/effect;
  1774. if (cr > 90)
  1775. cr = 90;
  1776. $q("info_div_2_value").innerHTML = Math.round(cr);
  1777. recalcEconomic();
  1778. }
  1779. }
  1780.  
  1781. function onRecalcNas(val){
  1782. return function(){
  1783. if (nas + val < 0)
  1784. return;
  1785. nas = nas + val;
  1786. pp = Math.pow(nas, 0.85) + 10;
  1787. $q("info_div_0_value").innerHTML = nas;
  1788. $q("info_div_1_value").innerHTML = Math.round(pp);
  1789.  
  1790. recalcEconomic();
  1791. }
  1792. }
  1793.  
  1794.  
  1795. function recalcEconomic() {
  1796. var datas = $x("//div[@id='epro']/table[@id='tbprod']/tbody/tr");
  1797. for (var i in datas) {
  1798. var cur_value = 0;
  1799. var next = false;
  1800. var tds = $x("td", datas[i]);
  1801. for (var j in tds) {
  1802. if (tds[j].getAttribute('class') != 'tc') {
  1803. if (next) {
  1804. var foundBonus = tds[j].innerHTML.match(/(\d+)\+(\d+)/);
  1805. tds[j].innerHTML = Math.round(cur_value);
  1806. if (foundBonus) {
  1807. tds[j].innerHTML = tds[j].innerHTML + '+' + foundBonus[2];
  1808. }
  1809. continue;
  1810. }
  1811. if (tds[j].innerHTML.indexOf('=') > -1) {
  1812. next = true;
  1813. continue;
  1814. }
  1815. var ext_found = tds[j].innerHTML.match(/(\d+) \* (\d+)\%( \* (\d+)%)?/);
  1816. if (ext_found) {
  1817. cur_value += pp * (100 - cr) / 100;
  1818. cur_value = cur_value * parseInt(ext_found[2]) / 100;
  1819. if (ext_found[3] && ext_found[4]) {
  1820. cur_value = cur_value * parseInt(ext_found[4]) / 100;
  1821. }
  1822. continue;
  1823. }
  1824. var found = tds[j].innerHTML.match(/(\d+)/);
  1825. if (found) {
  1826. var value = found[1];
  1827. if (tds[j].innerHTML.indexOf('%') > -1) {
  1828. cur_value = cur_value * parseInt(value) / 100;
  1829. } else {
  1830. cur_value += pp *(100 - cr) / 100;
  1831. }
  1832. }
  1833. }
  1834. }
  1835. next = false;
  1836. }
  1837. }
  1838. function changeBuildPanelView() {
  1839. return function() {
  1840. _setValue('build_info_panel', !_getValue('build_info_panel'));
  1841. window.location.reload();
  1842. }
  1843. }
  1844.  
  1845. function buildingInfo() {
  1846. return function () {
  1847. var total = 0;
  1848. var line = "";
  1849. for (var i = 0; i < wofh.town.build.slots.length; i++) {
  1850. try {
  1851. var id = wofh.town.build.slots[i].id;
  1852. if (id >= 0) {
  1853. var bTitle = lib.builds[id].name;
  1854. line += bTitle + ' - ';
  1855. var cc = 0;
  1856. var bhelper = new Build(id);
  1857. var level = wofh.town.build.slots[i].level;
  1858. for (var j = 1; j <= level; j++) {
  1859. var cost = bhelper.getCostLevel(j);
  1860. for (var k in cost) {
  1861. if (cost[k] > 0) {
  1862. total += cost[k];
  1863. cc += cost[k];
  1864. }
  1865. }
  1866. }
  1867. line += cc;
  1868. line += '\n';
  1869. }
  1870. } catch (e) {
  1871. _log(e.toString());
  1872. }
  1873. }
  1874. alert('Прочность города: ' + total + '\n' + line);
  1875. }
  1876. }
  1877.  
  1878. function applyHelpToBuildings() {
  1879.  
  1880. //looking for script injected panel
  1881. var buildings = $x("//div[@class='pmaincont']/a[contains(@href, 'build?pos=') and contains(@class, 'build_icon_s')]", null);
  1882. //not found? looking for native panel
  1883. if (buildings.length == 0) {
  1884. if ($x("//div[@class='pmaincont']/a[contains(@href, 'build?pos=')]/div[@class='pmaintg']").length > 0) {
  1885. buildings = $x("//div[@class='pmaincont']/a[contains(@href, 'build?pos=')]");
  1886. }
  1887. }
  1888.  
  1889. for (var i in buildings) {
  1890. //_log(buildings[i]);
  1891. buildings[i].addEventListener("mouseover", showTooltip(buildings[i]), false);
  1892. buildings[i].removeAttribute("title") ;
  1893. buildings[i].addEventListener("mouseout", hideTooltip, false);
  1894.  
  1895. //buildings[i].addEventListener('mousedown', showHelp(buildings[i].href), false);
  1896. }
  1897. }
  1898.  
  1899. function showHelpMess(bld) {
  1900. return function() {
  1901. _log(bld);
  1902. }
  1903. }
  1904.  
  1905. function showTooltip(link) {
  1906. return function() {
  1907. var tt = $q('help_div');
  1908. var href = $x('./img',link);
  1909. if (href.length > 0) {
  1910. href = href[0].src;
  1911. } else {
  1912. href = link.style.backgroundImage;
  1913. }
  1914. var id = parseInt(href.match(/\/p(\/g)?\/b\/(\d+)_/)[2]);
  1915. var mapbuildings = $x("//area[contains(@href, 'build?pos=')]");
  1916. var title = "";
  1917. for (var i in mapbuildings) {
  1918. if (link.href == mapbuildings[i].href)
  1919. title = mapbuildings[i].title.match(/уровень\s*(\d+)/);
  1920. }
  1921. var level = parseInt(title[1]);
  1922. var bhelper = new Build(id);
  1923. var text = link.title + '<hr><b>Сл. уровень.</b><BR>';
  1924. if (level >=20) {
  1925. text += '<b>Максимальный уровень</b>';
  1926. } else {
  1927. var cost = bhelper.getCostLevel(level + 1);
  1928. for (var k in cost) {
  1929. var st = '';
  1930. if (arr[k] >= cost[k])
  1931. st = 'green';
  1932. else
  1933. st = '#A52A2A';
  1934. if (cost[k] > 0) {
  1935. text += '<nobr><span style="color: ' + st + '"><img class="res r' + k + '" src="/p/_.gif">'+ cost[k] + '</span></nobr> ';
  1936. }
  1937. }
  1938. text += '<nobr><span><img src="/p/_.gif" class="stimer"> ' + bhelper.getTime(level + 1).toString().toHHMMSS() + '</span></nobr>';
  1939.  
  1940. }
  1941. text += '<hr><b>Тек. эффект/стоимость/спад</b><br>';
  1942. var cpay = 0;
  1943. if (wofh.account.race == 3) {
  1944. cpay = bhelper.getPay(level, true);
  1945. } else {
  1946. cpay = bhelper.getPay(level, false);
  1947. }
  1948. if (cpay < 0)
  1949. cpay = 0;
  1950. var cungrown = (utils.oddFunc(bhelper.getAttributes(id).ungrown, level) * wofh.town.pop.incReal / wofh.town.pop.inc);
  1951. text += bhelper.getEffectLevel(level) + '&nbsp;/&nbsp;<img class="res r1" src="/p/_.gif" >' + cpay + '&nbsp;/&nbsp;' + cungrown.toFixed(2);
  1952. if (level < 20) {
  1953. var npay = 0;
  1954. if (wofh.account.race == 3) {
  1955. npay = bhelper.getPay(level + 1, true);
  1956.  
  1957. } else {
  1958. npay = bhelper.getPay(level + 1, false);
  1959. }
  1960. if (npay < 0)
  1961. npay = 0;
  1962. var nungrown = (utils.oddFunc(bhelper.getAttributes(id).ungrown, level + 1) * wofh.town.pop.incReal / wofh.town.pop.inc);
  1963. text += '<hr><b>+1 ур. эффект/стоимость/спад</b><br>';
  1964. text += bhelper.getEffectLevel(level + 1) + '&nbsp;/&nbsp;<img class="res r1" src="/p/_.gif" >' + npay + '&nbsp;/&nbsp;' + nungrown.toFixed(2);
  1965. }
  1966. tt.innerHTML = '<div>' + text + '</div>';
  1967.  
  1968. tt.style.left = _getX(link) + 'px';
  1969. tt.style.top = _getY(link) - 180 + 'px';
  1970. tt.style.visibility = 'visible';
  1971. tt.style.display = '';
  1972. }
  1973. }
  1974.  
  1975. function hideTooltip() {
  1976. $q('help_div').style.visibility = 'hidden';
  1977. }
  1978.  
  1979. function _getX(e){
  1980. var x = 0;
  1981. while (e) {
  1982. x += e.offsetLeft;
  1983. e = e.offsetParent;
  1984. }
  1985. return x;
  1986. }
  1987.  
  1988. function _getY(e){
  1989. var y = 0;
  1990. while (e) {
  1991. y += e.offsetTop;
  1992. e = e.offsetParent;
  1993. }
  1994. return y;
  1995. }
  1996.  
  1997. // end common functions
  1998.  
  1999. function parseBuildingInfo() {
  2000. var datas = $x("//table[@class='def_table']/tbody/tr");
  2001. var id = document.location.href.match(/id=(\d+)/)[1];
  2002. var infoLine = id + ':{';
  2003. for (var i in datas) {
  2004. var children = datas[i].childNodes;
  2005. var time = children[0].childNodes[0].getAttribute("title");
  2006. var lvl = parseInt(children[0].childNodes[1].nodeValue);
  2007. var cost = $x("./nobr", children[1]);
  2008. var costClass = '';
  2009. for (var j in cost) {
  2010. var className = cost[j].childNodes[0].getAttribute("class");
  2011. var resType = className.match(/res r(\d+)/)[1];
  2012. var resCount = cost[j].childNodes[1].nodeValue;
  2013. costClass += resType + ':' + resCount;
  2014. if (j < cost.length - 1)
  2015. costClass +=', ';
  2016. }
  2017. var price = 0;
  2018. if (children[2].childNodes.length > 0) {
  2019. price = parseInt(children[2].childNodes[1].nodeValue);
  2020. }
  2021. var effect = children[3].innerHTML;
  2022. var spad = 0;
  2023. if (children[4].innerHTML.length > 0) {
  2024. spad = parseFloat(children[4].innerHTML);
  2025. }
  2026. infoLine += lvl + ': {time:\\\'' + time + '\\\', cost:{' + costClass +'}, price:' + price + ', effect:\\\'' + effect + '\\\', spad:' + spad + '}';
  2027. if (i < datas.length - 1)
  2028. infoLine +=', ';
  2029. }
  2030. infoLine +='}';
  2031. _log(infoLine);
  2032. }
  2033.  
  2034. function addBuildInfoPanel() {
  2035.  
  2036.  
  2037. var text = '<div class="pmaincont">';
  2038. var blds = $x("//div[@id='cont04']/div[@class='tmain']/div[contains(@style, 'width:auto')]");
  2039. var c_url = null;
  2040. var c_title = null;
  2041. var c_lvl = null;
  2042. var textAreas = [];
  2043. var merr_img = null;
  2044. for (var i in blds) {
  2045. if (i == 0) {
  2046. try {
  2047. var img = $x("./a/img", blds[i])[0];
  2048. c_url = img.src;
  2049. c_title = img.title;
  2050. try {c_lvl = $x("./a/div/div",blds[i])[0].className; } catch (e) {};
  2051. var group = img.src.match(/.*p\/(?:g\/)?b\/(\d+)_(.*)_.*/);
  2052. if (group) {
  2053. var lvlId = buildLevelMap[parseInt(group[1])];
  2054. if (!lvlId && lvlId !=0) {
  2055. merr_img = '<img width="45" height="46" src="' + img.src + '" />';
  2056. if (group[2].indexOf("b") !=-1) lvlId = group[2].substring(0, group[2].length -1); else lvlId= group[2];
  2057. }
  2058. c_url = '&quot;/p/b/bg/ss0.png&quot;';
  2059. } else {
  2060. c_url = '&quot;/p/b/sw.gif&quot;';
  2061. }
  2062. } catch (e) {_log(e)}
  2063. continue;
  2064. }
  2065. var href = $x("./a",blds[i])[0].href;
  2066. var img = $x("./a/img", blds[i])[0];
  2067. var lvlClass = null;
  2068. var group = img.src.match(/.*p\/(?:g\/)?b\/(\d+)_(.*)_.*/);
  2069. var style = '/p/b/s0/sm.png';
  2070. if (group) {
  2071. style = img.src;
  2072. } else {
  2073. group = img.src.match(/.*p\/(?:g\/)?b\/s(\d+)\/(.*).png/);
  2074. if (group && group[2].indexOf('a') == -1) style = '/p/b/s' + group[1] + '/s.png';
  2075. }
  2076. try {lvlClass = $x("./a/div/div",blds[i])[0].className; } catch (e) {};
  2077.  
  2078. var area_index = parseInt(href.match(/pos=(\d+)/)[1]);
  2079. var area_text = '<a href="' + href + '" style="background: url(/p/b/bg/ss0.png)" title="' + img.title + '">'
  2080. + '<img width="45" height="46" src="' + style + '" />';
  2081. if (lvlClass && group[2].indexOf("b") != -1 && group[2].length > 1) {
  2082. area_text +='<div class="pmaintb"><div class="' + lvlClass + '"></div></div>'
  2083. } else if (lvlClass && lvlClass.indexOf('mnnd') != -1) {
  2084. area_text +='<div class="pmaintd"><div class="' + lvlClass + '"></div></div>';
  2085. } else if (lvlClass) {
  2086. area_text +='<div class="pmaint"><div class="' + lvlClass + '"></div></div>';
  2087. }
  2088. area_text += '</a>';
  2089. textAreas[area_index] = area_text;
  2090. }
  2091. for (var i = 1; i<19; i++) {
  2092. if (textAreas[i]) {
  2093. text += textAreas[i];
  2094. } else {
  2095. text += '<a href="/build/pos=' + i + '" style="background: url(/p/b/bg/ss0.png)" >'
  2096. + '<img width="45" height="46" src="/p/b/s0/sm.png" />'
  2097. }
  2098. }
  2099.  
  2100.  
  2101. try {
  2102. text += '<a href="build?pos=0" style="left:-95px; top:-70px; poisition:absolute; z-index:1000; background: url('
  2103. + c_url + ')" title="' + c_title + '">';
  2104. if (merr_img) text += merr_img;
  2105. if (c_lvl) {
  2106. text += '<div class="lalala-pmaint"><div class="' + c_lvl + '"></div></div>';
  2107. } } catch (e) {_log(e)};
  2108. text += '</a>'
  2109. text += '</div>';
  2110. var div = $e('DIV', text, {class : 'pmain'}, {display: 'block'});
  2111. var table = $x("//div[@id='cont04']/div[@class='tmain']")[0];
  2112. table.parentNode.appendChild(div);
  2113. }
  2114.  
  2115. function calcDistance(x1, y1, x2, y2) {
  2116. return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
  2117. }
  2118.  
  2119. function roundNumber(num, dec) {
  2120. var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
  2121. return result;
  2122. }
  2123.  
  2124. function onMapDivNodeInserted() {
  2125. if (injectMapDivProcessing)
  2126. return;
  2127. parseMapPage();
  2128. }
  2129.  
  2130. function switchMapHelp() {
  2131. mapHelpEnabled = !mapHelpEnabled;
  2132. document.getElementById('inf_tt_ico').setAttribute('class', !mapHelpEnabled ? 'a_osn_yes' : 'a_pos_no');
  2133. var allPlayerCitiesHolder = _deserialize(_getValue("all_player_cities_holder", '{}'));
  2134. var cities = _deserialize(_getValue('cities', '{ current: null, list: [] }'));
  2135. var baseCoords = allPlayerCitiesHolder[cities.list[cities.current].id];
  2136. if (baseCoords) {
  2137. var landLinks = $x("//div[@id='landlnks']/a");
  2138. for (var i in landLinks) {
  2139. var coords = landLinks[i].href.match(/x=(\d+)&y=(\d+)/);
  2140. var range = calcDistance(baseCoords.x, baseCoords.y, parseInt(coords[1]), parseInt(coords[2]));
  2141. applyMapOpacity(landLinks[i], range, mapHelpEnabled);
  2142. }
  2143. }
  2144. }
  2145.  
  2146. function applyMapOpacity(link, range, enabled) {
  2147. if (enabled) {
  2148. link.style.opacity = 0.4;
  2149. link.style.backgroundColor = range > 25 ? '#e83838' : '#0ce70c';
  2150. } else {
  2151. link.style.opacity = null;
  2152. link.style.backgroundColor = null;
  2153. }
  2154. }
  2155.  
  2156. var mapHelpEnabled = false;
  2157. var injectMapDivProcessing = false;
  2158. function parseMapPage() {
  2159. injectMapDivProcessing = true;
  2160. var allPlayerCitiesHolder = _deserialize(_getValue("all_player_cities_holder", '{}'));
  2161. var cities = _deserialize(_getValue('cities', '{ current: null, list: [] }'));
  2162. var baseCoords = allPlayerCitiesHolder[cities.list[cities.current].id];
  2163. if (baseCoords) {
  2164. var landLinks = $x("//div[@id='landlnks']/a");
  2165. for (var i in landLinks) {
  2166. if (landLinks[i].getAttribute('ws_processed') == 'true')
  2167. continue;
  2168. var coords = landLinks[i].href.match(/x=(\d+)&y=(\d+)/);
  2169. var range = calcDistance(baseCoords.x, baseCoords.y, parseInt(coords[1]), parseInt(coords[2]));
  2170. landLinks[i].setAttribute('tooltip', 'Расстояние: ' + roundNumber(range, 3) + '. ' + landLinks[i].getAttribute('tooltip'));
  2171. if (mapHelpEnabled) {
  2172. applyMapOpacity(landLinks[i], range, true);
  2173. }
  2174. landLinks[i].setAttribute('ws_processed', 'true');
  2175.  
  2176. }
  2177. }
  2178. injectMapDivProcessing = false;
  2179. }
  2180.  
  2181. function parseCityListPage() {
  2182.  
  2183. //определяем персональную страницу игрока
  2184. var pname = $x("//div[@class='ptitle2_ ptitle2_p1']/h2")[0].innerHTML.match(/[^\s]*? (.*)/)[1];
  2185. var infoTr = $x("//div[@id='tb_town']/div[@class='town_row tB']");
  2186. if (pname == playerName) {
  2187. var allPlayerCitiesHolder = {};
  2188. for (var i in infoTr) {
  2189. var centroid = $x("./div[@class='conbut2']/div[@class='M_bt M_bt_cent fR']/a", infoTr[i])[0];
  2190. var coords = centroid.href.match(/x=(\d+)&y=(\d+)/);
  2191. var townLink = $x("./*/div[@class='t_name fwB']/a", infoTr[i])[0];
  2192. var id = townLink.getAttribute("href").match(/id=(\d+)/)[1];
  2193. allPlayerCitiesHolder[id] = {x: parseInt(coords[1]), y: parseInt(coords[2])};
  2194. }
  2195. _setValue("all_player_cities_holder", _serialize(allPlayerCitiesHolder));
  2196. _log(allPlayerCitiesHolder);
  2197. }
  2198. var allPlayerCitiesHolder = _deserialize(_getValue("all_player_cities_holder", '{}'));
  2199. var cities = _deserialize(_getValue('cities', '{ current: null, list: [] }'));
  2200. var baseCoords = allPlayerCitiesHolder[cities.list[cities.current].id];
  2201. for (var i in infoTr) {
  2202. var centroid = $x("./div[@class='conbut2']/div[@class='M_bt M_bt_cent fR']/a", infoTr[i])[0];
  2203. var coords = centroid.href.match(/x=(\d+)&y=(\d+)/);
  2204. if (coords.length > 2) {
  2205. var divInfoHolder = $x("./div[@class='t_n_cont']/div[@class='t_dist fR']", infoTr[i])[0];
  2206. var range = calcDistance(baseCoords.x, baseCoords.y, parseInt(coords[1]), parseInt(coords[2]));
  2207. if (divInfoHolder.innerHTML == '')
  2208. divInfoHolder.appendChild($t('Расстояние: ' + roundNumber(range, 3)));
  2209. }
  2210. }
  2211.  
  2212.  
  2213. var infoTr = $x("//div[@id='tb_town']/div[@class='town_row tB']");
  2214. var pname = $x("//div[@class='ptitle2_ ptitle2_p1']/h2")[0].innerHTML.match(/[^\s]*? (.*)/)[1];
  2215. var plId = document.location.href.match(/id=(\d+)/)[1];
  2216. var allPlayersHolder = _deserialize(_getValue("all_players_holder", '{data: []}'));
  2217. var cityInfoList = [];
  2218. for (var i in infoTr) {
  2219. var cityInfo = {};
  2220. cityInfoList[i] = cityInfo;
  2221.  
  2222. var cview = $x("./div", $x("./div", infoTr[i])[1]);
  2223. if (cview.length > 1) {
  2224. cityInfo.mestorod = cview[1].title;
  2225. }
  2226.  
  2227. if (!cityInfo.mestorod) {
  2228. cityInfo.mestorod = 'нет';
  2229. }
  2230. var ct = $x("./div", infoTr[i])[3];
  2231. cityInfo.link = $x("./div/a", ct)[0].href;
  2232. cityInfo.name = $x("./div/a", ct)[0].innerHTML;
  2233. cityInfo.nas = $x("./div", ct)[1].lastChild.nodeValue;
  2234.  
  2235. var rast = $x('./nobr', $x("./div", ct)[2])[0];
  2236. if (rast) {
  2237. cityInfo.rast = rast.childNodes[0].nodeValue.match(/(\d+.\d)/)[1];
  2238. cityInfo.put = rast.childNodes[1].innerHTML;
  2239. } else {
  2240. cityInfo.rast = '';
  2241. cityInfo.put = '';
  2242. }
  2243. }
  2244. var divNfo = $e('DIV');
  2245. $x("//div[@id='tb_town']")[0].appendChild(divNfo);
  2246. var lastData = allPlayersHolder.data[plId];
  2247. divNfo.appendChild($e('DIV', 'Последнее обновление: ' + (lastData ? lastData.date : 'никогда'), {id: 'last_data_info_div'}));
  2248. divNfo.appendChild($e('A', 'Добавить/Обновить', {id: 'last_data_info_href', href: 'javascript:void(0)'}));
  2249. $x("//div[@id='tb_town']")[0].appendChild($e('A', 'Показать таблицу', {id: 'show_table_link', href: 'javascript:void(0)'}));
  2250. $q('show_table_link').addEventListener('click', showCityInfoList(allPlayersHolder), false);
  2251. $q('last_data_info_href').addEventListener('click', addToCityInfoList(cityInfoList, plId, pname, allPlayersHolder), false);
  2252. _log(cityInfoList);
  2253. }
  2254. function addToCityInfoList(cityInfoList, plId, pname, allPlayersHolder) {
  2255. return function() {
  2256. allPlayersHolder.data[plId] = {};
  2257. allPlayersHolder.data[plId].date = new Date();
  2258. allPlayersHolder.data[plId].player = pname;
  2259. allPlayersHolder.data[plId].data = cityInfoList;
  2260. $q('last_data_info_div').innerHTML = 'Последнее обновление: ' + allPlayersHolder.data[plId].date;
  2261. _setValue("all_players_holder", _serialize(allPlayersHolder));
  2262. }
  2263. }
  2264. function showCityInfoList(allPlayersHolder) {
  2265. return function() {
  2266. var text = '<div align="right"><a id="city_list_div_close" href="javascript:void(0);">Закрыть</a></div><table border="5px" style="color:black;"><tr><td>Игрок</td><td>id</td><td>Обновление</td></tr>';
  2267. var textarea = 'Игрок\tID\tГород\tСсылка\tМесторождение\tНаселение\tРасстояние\tПуть\n';
  2268. for (var i in allPlayersHolder.data) {
  2269. if (!allPlayersHolder.data[i])
  2270. continue;
  2271. text += '<tr><td>' + allPlayersHolder.data[i].player +
  2272. '</td><td>' + i +
  2273. '</td><td>' + allPlayersHolder.data[i].date +
  2274. '</td></tr>';
  2275.  
  2276. for (var j in allPlayersHolder.data[i].data) {
  2277. var cityInfo = allPlayersHolder.data[i].data[j];
  2278. textarea += allPlayersHolder.data[i].player + '\t'
  2279. + i + '\t' + cityInfo.name + '\t' + cityInfo.link + '\t'
  2280. + cityInfo.mestorod + '\t' + cityInfo.nas + '\t'
  2281. + cityInfo.rast + '\t' + cityInfo.put + '\n';
  2282. }
  2283.  
  2284. }
  2285. text += '</table><textarea rows="10" cols="25">';
  2286. text += textarea;
  2287. text += '</textarea>';
  2288. var tt = $e('DIV', text, {id: 'city_list_div', class: 'pane'}, {zIndex: 4000, left: '0px', top:'0px', backgroundColor: '#FF6'}, document.body);
  2289. var table = $x("//div[@id='tb_town']")[0];
  2290. tt.style.left = _getX(table) + 'px';
  2291. tt.style.top = _getY(table) + 'px';
  2292. document.getElementById('city_list_div_close').addEventListener('click', closeCityInfoList, false);
  2293. }
  2294. }
  2295.  
  2296. function closeCityInfoList() {
  2297. document.body.removeChild($q('city_list_div'));
  2298. }
  2299. function onTradeTableNodeInserted() {
  2300. if (injectAdvTradeProcessing)
  2301. return;
  2302. injectAdvTrade()
  2303. }
  2304.  
  2305. var injectAdvTradeProcessing = false;
  2306. function injectAdvTrade(){
  2307.  
  2308. injectAdvTradeProcessing = true;
  2309. var tradeTr = $x("//table[contains(@class, 'trade_table')]/tbody/tr[contains(@class, 'tbl_row')]");
  2310.  
  2311. for (var i in tradeTr) {
  2312. var tradeTd = $x("td", tradeTr[i]);
  2313. if (tradeTr[i].getAttribute('ws_processed') == 'true')
  2314. continue;
  2315. if (tradeTd.length == 7) {
  2316. var maxval = parseInt(tradeTd[2].lastChild.nodeValue!=null?tradeTd[2].lastChild.nodeValue:tradeTd[2].lastChild.lastChild.nodeValue); //максимум, который выставил продавец/покупатель
  2317. //покупаем или продаем?
  2318. var isSell = document.getElementById('r1').checked;
  2319. var maxMessage = 'max - 1';
  2320. var maxValue = maxval - 250;
  2321. if (isSell) { //продаем. Пересчитать возможный максимум.
  2322. var maxByTraders = parseInt($x("//span[@id='inpb']")[0].innerHTML); //максимум, который могут перевезти торговцы.
  2323. var maxByResources = parseInt($x("./nobr/img", tradeTd[2])[0].getAttribute('class').match(/res r(\d+)/)[1]);
  2324. maxByResources = isInt(arr[maxByResources]) ? arr[maxByResources] : 0; //максимум данного ресурса на складе
  2325. maxval = Math.min(maxval, maxByTraders, maxByResources);
  2326. maxMessage = 'max';
  2327. maxValue = maxval;
  2328. }
  2329. var l = $e('a', '+1', { href: 'javascript: void(0)', id: 'incb' + i });
  2330. var l2 = $e('a', '+4', { href: 'javascript: void(0)', id: 'incbt' + i });
  2331. var l3 = $e('a', '-1', { href: 'javascript: void(0)', id: 'decb' + i });
  2332. var l4 = $e('a', '-4', { href: 'javascript: void(0)', id: 'decbt' + i });
  2333. var lmax = $e('a', maxMessage, { href: 'javascript: void(0)', id: 'maxb' +i});
  2334.  
  2335. tradeTd[5].appendChild($e('br'));
  2336. tradeTd[5].appendChild(l);
  2337. tradeTd[5].appendChild($t(' '));
  2338. tradeTd[5].appendChild(l2);
  2339.  
  2340. tradeTd[4].appendChild($e('br'));
  2341. tradeTd[4].appendChild(l3);
  2342. tradeTd[4].appendChild($t(' '));
  2343. tradeTd[4].appendChild(l4);
  2344.  
  2345. tradeTd[3].appendChild($e('br'));
  2346. tradeTd[3].appendChild(lmax);
  2347.  
  2348. var inpu = $x(".//input[@name='count']", tradeTd[6])[0];
  2349. $q('incb' + i).addEventListener('click', onIncValue(inpu, 1, maxval), false);
  2350. $q('incbt' + i).addEventListener('click', onIncValue(inpu, 4, maxval), false);
  2351. $q('decb' + i).addEventListener('click', onIncValue(inpu, -1, maxval), false);
  2352. $q('decbt' + i).addEventListener('click', onIncValue(inpu, -4, maxval), false);
  2353. $q('maxb' + i).addEventListener('click', onMaxValue(inpu, maxValue), false);
  2354. tradeTr[i].setAttribute('ws_processed', 'true');
  2355.  
  2356. }
  2357. }
  2358. injectAdvTradeProcessing = false;
  2359.  
  2360. }
  2361.  
  2362. function onIncValue(elem, cnt, maxval) {
  2363. return function() {
  2364. var incval = 250*cnt;
  2365. var s = elem.value;
  2366. if (s.length == 0)
  2367. s = 0;
  2368. else
  2369. s = parseInt(s);
  2370. if (s + incval > maxval)
  2371. s = maxval;
  2372. else
  2373. s += incval;
  2374. if (s < 0) {
  2375. s = 0;
  2376. }
  2377. elem.value = s;
  2378. }
  2379. }
  2380.  
  2381. function onMaxValue(elem, maxval) {
  2382. return function()
  2383. {
  2384. elem.value = maxval;
  2385. }
  2386. }
  2387.  
  2388. var Resource = (function() {
  2389. var actualConstructor = function(id, max, container, parent) {
  2390. this.id = id;
  2391. this.max = max;
  2392. this.container = container;
  2393. this.parent = parent;
  2394. arguments.callee.instances.push(this);
  2395. }
  2396. actualConstructor.instances = [];
  2397. return actualConstructor;
  2398. })();
  2399.  
  2400. Resource.prototype.capacity = function() {
  2401. return this.container.value.length == 0 || isNaN(this.container.value) ? 0 : parseInt(this.container.value);
  2402. }
  2403.  
  2404. Resource.prototype.onAdd = function(count) {
  2405. var mmax = this.parent.capacity(this.id);
  2406. if (this.max < mmax) mmax = this.max;
  2407.  
  2408. var incval = 250*count;
  2409.  
  2410. var s = this.capacity();
  2411. if (s + incval > mmax)
  2412. s = mmax;
  2413. else
  2414. s += incval;
  2415. if (s < 0) {
  2416. s = 0;
  2417. }
  2418. this.container.value = s;
  2419. JSN.market.pages.send.calcCurCapacity();
  2420. }
  2421.  
  2422. Resource.prototype.onMax = function() {
  2423. var mmax = this.parent.capacity(this.id);
  2424. if (this.max < mmax) mmax = this.max;
  2425. this.container.value = mmax;
  2426. JSN.market.pages.send.calcCurCapacity();
  2427. }
  2428.  
  2429. var TradeContainer = (function() {
  2430.  
  2431. var actualConstructor = function(size) {
  2432. this.size = size;
  2433. this.resources = {};
  2434. arguments.callee.instances.push(this);
  2435. }
  2436. actualConstructor.instances = [];
  2437. return actualConstructor;
  2438. }
  2439. )();
  2440.  
  2441. TradeContainer.prototype.registerResource = function(id, max, container) {
  2442. this.resources[id] = new Resource(id, max, container, this);
  2443. addToContainer(container, $e('label', 'max', {href: 'javascript: void(0)', id: 'maxb' + id }, {color:'red'}));
  2444. $q('maxb' + id).addEventListener('click', onMax(id, this), false);
  2445. addToContainer(container, $e('label', '-4', { href: 'javascript: void(0)', id: 'decbt' + id }, {color: '#008000'}));
  2446. $q('decbt' + id).addEventListener('click', onAdd(id, -4, this), false);
  2447. addToContainer(container, $e('label', '-1', { href: 'javascript: void(0)', id: 'decb' + id }, {color: '#008000'}));
  2448. $q('decb' + id).addEventListener('click', onAdd(id, -1, this), false);
  2449. addToContainer(container, $e('label', '+4', { href: 'javascript: void(0)', id: 'incbt' + id }, {color: '#008000'}));
  2450. $q('incbt' + id).addEventListener('click', onAdd(id, 4, this), false);
  2451. addToContainer(container, $e('label', '+1', { href: 'javascript: void(0)', id: 'incb' + id }, {color: '#008000'}));
  2452. $q('incb' + id).addEventListener('click', onAdd(id, 1, this), false);
  2453. }
  2454.  
  2455. function addToContainer(container, element) {
  2456. container.parentNode.insertBefore(element, container.nextSibling);
  2457. container.parentNode.insertBefore($t(' '), element);
  2458. }
  2459.  
  2460. TradeContainer.prototype.capacity = function(id) {
  2461. var total = 0;
  2462. for (var i in this.resources) {
  2463. if (id != i)
  2464. total += this.resources[i].capacity();
  2465. }
  2466. return this.size - total;
  2467. }
  2468.  
  2469. function onAdd(id, count, tradeContainer) {
  2470. return function() {
  2471. tradeContainer.resources[id].onAdd(count);
  2472. }
  2473. }
  2474.  
  2475. function onMax(id, tradeContainer) {
  2476. return function() {
  2477. tradeContainer.resources[id].onMax();
  2478. }
  2479. }
  2480.  
  2481. TradeContainer.prototype.init = function() {
  2482. var elements = $x("//table[@id='inp']/tbody/tr/td/input[@type='text' and contains(@name, 'res')]");
  2483. for (var i in elements) {
  2484. var resId = elements[i].name.match(/res(\d+)/)[1];
  2485. this.registerResource(resId, Math.floor(arr[resId]/250)*250, elements[i]);
  2486. }
  2487. }
  2488.  
  2489. var sortType = 0;
  2490. var sortOrder = 1;
  2491.  
  2492. function streamSort() {
  2493.  
  2494. var sortArray = [];
  2495. var tabs = $x("//table[@class='def_table trway']", null);
  2496. var tabIndex = tabs.length > 1 ? 1 : 0;
  2497. var lines = $x("./tbody/tr", tabs[tabIndex]);
  2498. for (var i in lines) {
  2499. var columns = $x("./td", lines[i]);
  2500. var cHolder = {city: {}, res: {}, pay: {}, traders: {}, optype: {}, time: {}, panel: ''};
  2501. cHolder.city.text = columns[0].innerHTML;
  2502. cHolder.city.value = $x("./a", columns[0])[0].innerHTML;
  2503. cHolder.res.text = columns[1].innerHTML;
  2504. cHolder.res.value = parseInt(columns[1].lastChild.nodeValue);
  2505. cHolder.res.type = parseInt($x("./img", columns[1])[0].getAttribute('class').match(/res r(\d+)/)[1]);
  2506. cHolder.pay.text = columns[2].innerHTML;
  2507. cHolder.pay.value = parseFloat(columns[2].lastChild.nodeValue);
  2508. cHolder.traders.text = columns[3].innerHTML;
  2509. cHolder.traders.value = 0;
  2510. if (columns[3].childNodes.length > 0) {
  2511. cHolder.traders.value = parseInt(columns[3].firstChild.nodeValue);
  2512. }
  2513. cHolder.optype.text = columns[4].innerHTML;
  2514. cHolder.optype.value = columns[4].innerHTML == 'Покупка' ? true : false;
  2515. cHolder.time.text = columns[5].innerHTML;
  2516. try {
  2517. cHolder.time.value = parseFloat(columns[5].innerHTML.match(/(\d+\.\d+) /)[1]);
  2518. } catch (e) {
  2519. cHolder.time.value = 0;
  2520. }
  2521. cHolder.panel = columns[6].innerHTML;
  2522. sortArray[i] = cHolder;
  2523. }
  2524.  
  2525. var columns = $x("./thead/tr/td", tabs[tabIndex]);
  2526. for (var i in columns) {
  2527. columns[i].innerHTML='<a id="sort_col_' + i + '" href="javascript:void(0)" >' + columns[i].innerHTML + '</a>';
  2528. document.getElementById('sort_col_' + i).addEventListener('click', startSort(i, sortArray), false);
  2529. }
  2530. }
  2531.  
  2532. function startSort(type, sortArray) {
  2533. return function() {
  2534. if (sortType == type) {
  2535. sortOrder = -1 * sortOrder;
  2536. } else {
  2537. sortType = type;
  2538. sortOrder = 1;
  2539. }
  2540. sortArray.sort(streamComparator);
  2541. var tabs = $x("//table[@class='def_table trway']", null);
  2542. var lines = $x("./tbody/tr", tabs[tabs.length - 1]);
  2543. for (var i in lines) {
  2544. var columns = $x("./td", lines[i]);
  2545. columns[0].innerHTML = sortArray[i].city.text;
  2546. columns[1].innerHTML = sortArray[i].res.text;
  2547. columns[2].innerHTML = sortArray[i].pay.text;
  2548. columns[3].innerHTML = sortArray[i].traders.text;
  2549. columns[4].innerHTML = sortArray[i].optype.text;
  2550. columns[5].innerHTML = sortArray[i].time.text;
  2551. columns[6].innerHTML = sortArray[i].panel;
  2552. }
  2553. }
  2554. }
  2555.  
  2556. function streamComparator(a, b) {
  2557. if (sortType == 0) {
  2558. //sort by city
  2559. var x = a.city.value.toLowerCase();
  2560. var y = b.city.value.toLowerCase();
  2561. return sortOrder*((x < y) ? -1 : ((x > y) ? 1 : 0));
  2562. }
  2563. if (sortType ==1) { //sort by resource type/count
  2564. if (a.res.type == b.res.type) {
  2565. return sortOrder*(a.res.value - b.res.value);
  2566. } else {
  2567. return sortOrder*(a.res.type - b.res.type);
  2568. }
  2569. }
  2570. if (sortType ==2) { //sort by payment value
  2571. return sortOrder*(a.pay.value - b.pay.value);
  2572. }
  2573. if (sortType ==3) { //sort by traders count
  2574. return sortOrder*(a.traders.value - b.traders.value);
  2575. }
  2576. if (sortType ==4) { //sort by operation type
  2577. return sortOrder*(a.optype.value == b.optype.value ? 0 : a.optype.value ? -1 : 1);
  2578. }
  2579. if (sortType ==5) { //sort by time
  2580. return sortOrder*(a.time.value - b.time.value);
  2581. }
  2582. return 0;
  2583.  
  2584. }
  2585.  
  2586.  
  2587. function onUSUnload() {}
  2588.  
  2589. var is_chrome = /chrome/.test( navigator.userAgent.toLowerCase() );
  2590. if (!is_chrome){
  2591. window.addEventListener('load', onUSLoad, false);
  2592. window.addEventListener('unload', onUSUnload, false);
  2593. }else {
  2594. onUSLoad();
  2595.  
  2596. }