BvS Infinite Quickteams

Allows you to have more Quickteams

目前为 2014-09-10 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name BvS Infinite Quickteams
  3. // @namespace rvQuick
  4. // @description Allows you to have more Quickteams
  5. // @include http://*animecubed.com/billy/bvs/team.html
  6. // @version 1.4.1
  7. // @history 1.4.1 (9/9/2014) Added grant permissions.
  8. // @history 1.4 Added underline coloring for allies that couldn't be found, making a team unusable.
  9. // @history 1.3g Fixed a rare bug.
  10. // @history 1.3f Fixed a bug that I created from 1.3e.
  11. // @history 1.3e Fixed some of turn the page jutsu.
  12. // @history 1.3d Fixed bug where you couldn't drag n' drop newly created teams until you refreshed the page.
  13. // @history 1.3c Bug Fix
  14. // @history 1.3b Added Drag n' Drop support to the table
  15. // @history 1.3a Fixed up Export display.
  16. // @history 1.3 Added Export/Import functionality
  17. // @history 1.2e Fixed "None" quickteam to bypass confirm screen
  18. // @history 1.2d Temporary fix for FF4 bug.
  19. // @history 1.2c Improved cross browser support.
  20. // @history 1.2b Bug fixes. Hide Team MisAlignment dialog on team rename.
  21. // @history 1.2a Confirmed support for Chrome, but Escape doesn't work.
  22. // @history 1.2 Fixed more scrolling issues and added script support for other browsers besides FF.
  23. // @history 1.1c Fixed scrolling issues when renaming a QT.
  24. // @history 1.1b Fixed move QT down exception when there was only 1 QT.
  25. // @history 1.1a Fixed up final bug.
  26. // @history 1.1 Fixed a bug where you couldn't work with a QT that you didn't have one of the allies for.
  27. // @history 1.0 Start
  28. // @grant GM_getValue
  29. // @grant GM_setValue
  30. // @grant GM_addStyle
  31. // ==/UserScript==
  32.  
  33. const VERSION = "1.4.1";
  34. const GMSTORAGE_PATH = "BvS_Quickteams_";
  35.  
  36. var playerData;
  37. var playerName;
  38.  
  39. var allies;
  40. var startPoint;
  41. var currentTeam;
  42. var quickteam;
  43. var testDiv;
  44. var turnThePage;
  45.  
  46. function load(ev) {
  47. try {
  48. var temp = document.getElementByName("player");
  49. if ((temp == null) || (temp.localName.toLowerCase() == "text") || (temp.value.length == 0))
  50. return;
  51. playerName = temp.value;
  52.  
  53. getGM();
  54. parsePage();
  55. applyGM();
  56. } catch(e) {
  57. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  58. }
  59. }
  60.  
  61. function getGM() {
  62. var value = GM_getValue(playerName, "{}");
  63.  
  64. if ((value == undefined) || (value == null) || (value == ""))
  65. value = "{}";
  66. playerData = JSON.parse(value);
  67. }
  68.  
  69. function saveGM() {
  70. GM_setValue(playerName, JSON.stringify(playerData));
  71. }
  72.  
  73. function parsePage() {
  74. turnThePage = document.getElementsByName("turnthepage");
  75. if ((turnThePage) && (turnThePage.length == 0))
  76. turnThePage = null;
  77.  
  78. if (document.getElementByName("conteam") == null) {
  79. allies = new Array();
  80.  
  81. snap = document.evaluate("//div/table/tbody/tr/td/label/img", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  82. if ((snap != null) && (snap.snapshotLength > 0)) {
  83. var i;
  84. for (i = 0; temp = snap.snapshotItem(i); i++) {
  85. allies.push(new Array(document.getElementByName("teammate" + i).value, Allies.getAllyName(temp.src)));
  86. }
  87. }
  88. startPoint = document.getElementsByName("quickteam");
  89. if ((startPoint != null) && (startPoint.length == 0))
  90. startPoint = null;
  91. currentTeam = new Array();
  92.  
  93. snap = document.evaluate("//center/center/table/tbody/tr/td/img", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
  94. if ((snap != null) && (snap.snapshotLength > 0)) {
  95. var i;
  96. for (i = 0; temp = snap.snapshotItem(i); i++) {
  97. currentTeam.push(Allies.getAllyName(temp.src));
  98. }
  99. }
  100. }
  101. }
  102.  
  103. function applyGM() {
  104. if ((allies != null) && (startPoint == null)) {
  105. startPoint = document.getElementByName("qteam");
  106. if (startPoint == null)
  107. return;
  108. startPoint = startPoint.children[0];
  109.  
  110. var element = document.createElement('DIV');
  111. var text = "<table><tbody><tr><td style=\"font-family: arial; border: 1px dotted black; padding: 3px;\">";
  112. text += "<b>QuickTeams</b>: <font style=\"font-size: 12px;\">(Select team, and hit \"Use Quickteam\" - bypasses confirmation screen)</font><br>";
  113. text += "<input type=\"radio\" id=\"noneqt\" checked=\"\" value=\"\" name=\"quickteam\"> <label for=\"noneqt\">None</label><br>";
  114. text += "<a style=\"color: rgb(161, 0, 0);\" onfocus=\"this.blur();\" href=\"javascript:document.qteam.submit();\"><b>Use Quickteam &gt;</b></a>";
  115. text += "<noscript><input type=\"submit\" VALUE=\"Use Quickteam\"></noscript>";
  116. text += "<font style=\"font-size: 10px;\"><br>(Teams in <font color=\"#cc0000\">red</font> have allies that are different Levels than listed, so may have different effects)</font>";
  117. text += "</td></tr></tbody></table>";
  118. text += "<br>";
  119.  
  120. element.innerHTML = text;
  121. startPoint.parentNode.insertBefore(element, startPoint.children[startPoint.children - 1]);
  122.  
  123. startPoint = document.getElementsByName("quickteam");
  124. if ((startPoint != null) && (startPoint.length == 0))
  125. startPoint = null;
  126. }
  127. if (startPoint == null)
  128. return;
  129. if (turnThePage) {
  130. var temp = turnThePage[0];
  131.  
  132. // remove <br>
  133. temp.parentNode.removeChild(temp.nextSibling.nextSibling.nextSibling);
  134.  
  135. // move 'use quickteam over some'
  136. var extra = document.createElement('SPAN');
  137. extra.innerHTML = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
  138. temp.parentNode.insertBefore(extra, temp.nextSibling.nextSibling.nextSibling);
  139. }
  140.  
  141. GM_addStyle("div#rvDialog {word-wrap: break-word; overflow: auto; background-image: url('http://www.animecubed.com/billy/layout/scrollbg.jpg'); min-width: 240px; min-height: 100px; z-index: 9002; padding: 0; border: 1px solid black;} #rvDialog h1 {color: white; font-size: 16px; font-weight: bold; padding: 4px; margin: 0; background-image: url('http://www.animecubed.com/billy/layout/scrolldark.jpg');} img#closebutton {float: right; cursor: pointer; margin: 6px;} #rvDialog div {font-size: 12px; font-family: arial; padding: 8px;} #rvDialog a {font-weight: bold; color: #a10000;} #rvDialog ul {margin: 0;} .high { font-weight: bold; color: #FFFF00; text-decoration: blink; } .mhigh { font-weight: bold; color: #00FF00; } .normal { font-weight: bold; } .mlow { font-weight: bold; color: #FF0000; } .low { font-weight: bold; color: #7F0000; text-decoration: line-through; } .special { font-weight: bold; border: 1px dotted white; background-color: #333; }");
  142.  
  143. document.getElementById("noneqt").value = "^";
  144. /////////////////
  145. var length = startPoint.length;
  146. startPoint = startPoint[startPoint.length - 1];
  147.  
  148. if (length == 1) {
  149. startPoint = startPoint.nextSibling.nextSibling.nextSibling.nextSibling;
  150. } else {
  151. if (startPoint.parentNode.localName == "div") {
  152. // BvS Loop Helper no personal teams, 1 GM team
  153. startPoint = startPoint.parentNode.nextSibling;
  154. } else {
  155. startPoint = startPoint.nextSibling.nextSibling;
  156. }
  157. }
  158. quickteam = document.createElement('DIV');
  159. var text = "<table id='rvQT' cellpadding='0' cellspacing='0' width='100%'>";
  160. text += "</table><br><b>New QuickTeam</b>:<br>";
  161.  
  162. var i;
  163. for (i = 0; i < 3; i++) {
  164. text += "<select id='rvAlly" + i + "'>";
  165. if (i)
  166. text += "<option value='' />";
  167.  
  168. var j;
  169. for (j = 0; j < allies.length; j++) {
  170. var level = Allies.getAllyLevel(allies[j][1]);
  171. if (level > 1) {
  172. var name = Allies.getAllyWithoutLevel(allies[j][1]);
  173. var sname = escape(name);
  174. text += "<option value='" + sname + "'>" + name + "</option>";
  175.  
  176. var k;
  177. for (k = 2; k < level; k++) {
  178. text += "<option value='" + sname + " " + k + "'>" + name + " " + k + "</option>";
  179. }
  180. }
  181. text += "<option value='" + escape(allies[j][1]) + "'>" + allies[j][1] + "</option>";
  182. }
  183. text += "</select>";
  184. }
  185. text += "&nbsp;&nbsp;<input id='rvAdd' type='image' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAAAeCAMAAABDs11AAAAAB3RJTUUH2wMVEyQj2aUWzAAAAAlwSFlzAAAK8AAACvABQqw0mAAAAwBQTFRFAAAAAgICAwMDBQUFBgYGBwcHCAgICwsLCQkJDQ0NEBAQDAwMDw8PEhISiIiITU1NampqLy8vubm5xMTEfn5+JiYmpqamkpKSQ0NDFRUV////ioqKT09PsbGx4uLiPDw86+vrGBgYi4uLlZWVUVFRbm5uqKioNDQ0SEhIxcXFu7u7zs7O2NjYGhoaNjY2SkpKQEBAlpaWvLy8U1NTn5+fxsbGHR0d2dnZvb29VVVVODg4qqqqhISEjo6OHx8fcnJy0NDQj4+PVlZWx8fHIiIidHR0kJCQWVlZyMjIJCQkv7+/ra2t0dHR7Ozs2traWlpaZGRkm5ubJycnd3d3OTk5QUFBnJyct7e3XFxc5OTkZmZmycnJKCgoKSkpOzs77e3teXl5nZ2dTExMuLi4Xl5eLCwssLCwwcHB29vb5eXlYGBgysrKa2trfHx8YmJil5eXy8vLLi4uFhYWMTExQkJCICAgs7OzmZmZzMzMFBQUzc3NV1dXgYGB3d3daGho7u7uHh4eg4ODMDAwKioqOjo6Pj4+GRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQzFv6AAAAAF0Uk5TAEDm2GYAAAIUSURBVHjazZX7TxNBEMfBGEVJa8spemOhPVqsr5b64AQfp+CJLIpWQEQMVPFRwSdR0JwvuKT83c7O3u5cTDTpxUQ/P3T2szvf9naT23Z0/Bc4YdiqIS2m9hvC0PklvJNvtUV+J55eX26bdU6Hc38gM19iKW1v62Go01tVw1oQBF9Yq1+/AcB3bcEPgMCsbUXxMrOJ3Zsx/4QOi9qkfOZFld74wDSwofGRfaiOE3Vt9T6A97y4oc4ta3gtvx/eZGOgvzXyDuO8pE7vOfMCmvj7LyMrrsJqEeNrUnJNgGYPwKtYO8WXDMsNePwE+1fInkLEM5SVRiSPuH2J4jOGWYC5+9gyHwk8WJjCzwW0hwDTi7PTGOf2GYoLwxTcEuI2NiqBO0JUMX5XiOPyBIW4BzDJ7YLivqasnxZuoGGZUOWm709g8alM+gzFPc1VE7+GhmVMlXHPG8PiUbnuMRR3NRdgZBQZwdaLrlsAuISTKKOue1nNXQEYdhmKVyJwm0Oy1rD1TKVyFqBQJTmn5s7T3HCFUW+6YqAfoFhynMFj8vGLZXlahRNyfHLQcU5hPd0vpwbKjobitoI2fdS2LbX9nN0ni0yAZdv5grGcraF4SpGWHEilMjRIZ3HUYx08ZFm96QwuZw9bvUcylkUrERTv3p+QbvXK7UtI9L537U1El75u9iSCL7vdCYhftZ272qTzX/8v/QV+Ash6BHwU1lOdAAAAAElFTkSuQmCC' alt='Add' width='31' height='15'>";
  186. text += "&nbsp;&nbsp;<input id='rvForm' type='image' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAeCAMAAACMnWmDAAAAB3RJTUUH2wMVEygs5a9EUQAAAAlwSFlzAAAK8AAACvABQqw0mAAAAwBQTFRFAAAAAgICAwMDBQUFBgYGBwcHCAgICwsLCQkJDQ0NEBAQDAwMDw8PEhISLy8viIiIampqJiYmubm5xMTEkpKSOTk5TU1NFRUVT09P////PDw86+vrsbGxioqKGBgYNDQ0i4uL2NjYlZWVbm5u4uLiqKionp6eu7u7UVFRGhoajIyMqampLS0tNjY2xsbGU1NTHR0djo6OqqqqODg4hISEVVVVHx8fj4+Px8fHVlZWIiIikJCQvr6+mpqayMjIWVlZJCQkkZGRv7+/5OTkdnZ2SEhIZGRkf39/Jycnk5OTycnJVFRUXFxcd3d37Ozs0dHRrq6unJycKCgoKSkplJSUOzs7TExMcHBw29vb0tLS9vb27e3teXl5LCwsysrKRkZGsLCwaWlpcnJyYGBgwcHBWFhYPT095eXll5eXQEBA3NzcLi4uFhYWMTExQkJCwsLCmJiYICAgZmZmRUVFFBQUV1dXzc3Nq6urHh4eMDAwKioqOjo6Pj4+GRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArzFaZgAAAAF0Uk5TAEDm2GYAAAITSURBVHja1Zb9T9NgEMfBGEGJ22QCvQ3aURQVHC8KGwhOYQIDedHUKVoKqAMcBB0QhCbjf/eeu/Z5nvCTGU0In6S9u+/d802zZ3napqYbg+n79SpSV1T/G983L9ldpOpXJHWh+x2UI+BA+fkdkeCHfudZ5vSv4izbAOeBoRVwDBonVgOw39FhwO/5P+hUq9W6XYD8YQMc8Y7EJL/QUMTqPuzHGoD3xVPYaOh5m5veFriW5xnb+KjrA6Kz9X3btX+4ruH9tCuuvVMBqBi7/XuwZ2vrPTJ0FJ/Q0Cnj5XzG6kvwc66XHUfEr3gtUfaN9KJLYUMzIMOSYlEsKQJQ8R6L2eWVVYC1Uincqw8l0YfVj7OiWlvE7pJmQIZvFTPBMipwSRHDO6znqFWcj8eznGFAeYGKgmZAhq8UUzg1NQ1ABeavMVhCo1ZBDhW4/UaXCTLMKfI4lcuJKycC5FXE1oQcmmB5UpcJMhxRjOIU3kepSAO8wPAStTFqDckhkaE8rssEGT5TDOCULAYB0s9Zy1IYkkMiQ3lYlwk+CUOsTC9O2X1hiY/4KPMYpX7TFK10xjJlJv6yT572SZkhw64Qg7c4GdapNAvdmHNmqIzuPUkpM2R4PyQWJxJSeJBoTyYfdoiUWzGV0b0zIWWGDNvuRUYbHzd3IyM4D1tbIqI1PLLvRIR6qdyOBP2113zryjRf95fFtfEPuOg0CHV1dAYAAAAASUVORK5CYII%3D' alt='Form' width='40' height='15'>";
  187.  
  188. quickteam.style.borderTop = quickteam.style.borderBottom = "1px dotted black";
  189. quickteam.innerHTML = text;
  190. startPoint.parentNode.insertBefore(quickteam, startPoint);
  191.  
  192. tableDnD = new DnDTable();
  193. tableDnD.init(document.getElementById('rvQT'));
  194.  
  195. tableDnD.onStartDragging = function() {
  196. this.startRowIndex = this.dragObject.rowIndex;
  197. }
  198. tableDnD.onDragging = function() {
  199. this.dragObject.style.background = "yellow";
  200. }
  201. tableDnD.onDrop = function() {
  202. this.dragObject.style.background = "";
  203.  
  204. var endRowIndex = this.dragObject.rowIndex;
  205. var pos = this.startRowIndex;
  206.  
  207. if (pos != endRowIndex) {
  208. if (endRowIndex < pos) {
  209. // move up
  210. var diff = pos - endRowIndex;
  211.  
  212. for (; diff > 0; diff--) {
  213. playerData["Quickteams"].shiftUp(pos);
  214. playerData["QuickteamNames"].shiftUp(pos);
  215. pos--;
  216. }
  217. } else {
  218. // move down
  219. var diff = endRowIndex - pos;
  220.  
  221. for (; diff > 0; diff--) {
  222. playerData["Quickteams"].shiftDown(pos);
  223. playerData["QuickteamNames"].shiftDown(pos);
  224. pos++;
  225. }
  226. }
  227.  
  228. saveGM();
  229.  
  230. updateNumbers();
  231. }
  232. }
  233.  
  234. var extra = document.createElement('SPAN');
  235.  
  236. text = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
  237. text += "<a id='rvExport' href='javascript:;' style='color:A10000'><b>Export &gt;</b></a>";
  238. text += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
  239. text += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
  240. text += "<a id='rvImport' href='javascript:;' style='color:A10000'><b>Import &gt;</b></a>";
  241.  
  242. if (turnThePage) {
  243. text += "<br />";
  244. }
  245.  
  246. extra.innerHTML = text;
  247.  
  248. if (turnThePage) {
  249. startPoint.parentNode.insertBefore(extra, startPoint.nextSibling);
  250. } else {
  251. startPoint.parentNode.insertBefore(extra, startPoint.nextSibling.nextSibling);
  252. }
  253. redoQuickteamList();
  254.  
  255. document.getElementById("rvAdd").addEventListener("click", addNewQuickteam, true);
  256. document.getElementById("rvForm").addEventListener("click", formTeam, true);
  257. document.getElementById("rvExport").addEventListener("click", exportQuickteams, true);
  258. document.getElementById("rvImport").addEventListener("click", importQuickteams, true);
  259. /////////////////
  260.  
  261. testDiv = document.createElement('DIV');
  262. testDiv.style.opacity = 0;
  263. testDiv.style.fontFamily = "arial";
  264. testDiv.style.fontWeight = "bold";
  265. testDiv.style.display = "inline";
  266.  
  267. document.body.insertBefore(testDiv, null);
  268.  
  269. /////////////////
  270. startPoint = document.getElementByName("quickteamnumber");
  271. if (startPoint != null) {
  272. var table = startPoint.parentNode.parentNode.parentNode.parentNode.parentNode;
  273. table.cellSpacing = "0";
  274. table.cellPadding = "0";
  275. var empty = table.insertRow(table.rows.length).insertCell(0);
  276. empty.style.height = "10";
  277. empty.style.backgroundColor = "#ead8c3";
  278. var row = table.insertRow(table.rows.length);
  279. var element = row.insertCell(0);
  280. element.align = "center";
  281. element.style.backgroundColor = "#ead8c3";
  282. element.style.fontFamily = "arial";
  283. element.innerHTML = "<form style='margin: 0pt;'>Save current team as a GM Quickteam: <input id='rvAddCurrent' type='image' src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAAAeCAMAAABDs11AAAAAB3RJTUUH2wMVEyQj2aUWzAAAAAlwSFlzAAAK8AAACvABQqw0mAAAAwBQTFRFAAAAAgICAwMDBQUFBgYGBwcHCAgICwsLCQkJDQ0NEBAQDAwMDw8PEhISiIiITU1NampqLy8vubm5xMTEfn5+JiYmpqamkpKSQ0NDFRUV////ioqKT09PsbGx4uLiPDw86+vrGBgYi4uLlZWVUVFRbm5uqKioNDQ0SEhIxcXFu7u7zs7O2NjYGhoaNjY2SkpKQEBAlpaWvLy8U1NTn5+fxsbGHR0d2dnZvb29VVVVODg4qqqqhISEjo6OHx8fcnJy0NDQj4+PVlZWx8fHIiIidHR0kJCQWVlZyMjIJCQkv7+/ra2t0dHR7Ozs2traWlpaZGRkm5ubJycnd3d3OTk5QUFBnJyct7e3XFxc5OTkZmZmycnJKCgoKSkpOzs77e3teXl5nZ2dTExMuLi4Xl5eLCwssLCwwcHB29vb5eXlYGBgysrKa2trfHx8YmJil5eXy8vLLi4uFhYWMTExQkJCICAgs7OzmZmZzMzMFBQUzc3NV1dXgYGB3d3daGho7u7uHh4eg4ODMDAwKioqOjo6Pj4+GRkZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQzFv6AAAAAF0Uk5TAEDm2GYAAAIUSURBVHjazZX7TxNBEMfBGEVJa8spemOhPVqsr5b64AQfp+CJLIpWQEQMVPFRwSdR0JwvuKT83c7O3u5cTDTpxUQ/P3T2szvf9naT23Z0/Bc4YdiqIS2m9hvC0PklvJNvtUV+J55eX26bdU6Hc38gM19iKW1v62Go01tVw1oQBF9Yq1+/AcB3bcEPgMCsbUXxMrOJ3Zsx/4QOi9qkfOZFld74wDSwofGRfaiOE3Vt9T6A97y4oc4ta3gtvx/eZGOgvzXyDuO8pE7vOfMCmvj7LyMrrsJqEeNrUnJNgGYPwKtYO8WXDMsNePwE+1fInkLEM5SVRiSPuH2J4jOGWYC5+9gyHwk8WJjCzwW0hwDTi7PTGOf2GYoLwxTcEuI2NiqBO0JUMX5XiOPyBIW4BzDJ7YLivqasnxZuoGGZUOWm709g8alM+gzFPc1VE7+GhmVMlXHPG8PiUbnuMRR3NRdgZBQZwdaLrlsAuISTKKOue1nNXQEYdhmKVyJwm0Oy1rD1TKVyFqBQJTmn5s7T3HCFUW+6YqAfoFhynMFj8vGLZXlahRNyfHLQcU5hPd0vpwbKjobitoI2fdS2LbX9nN0ni0yAZdv5grGcraF4SpGWHEilMjRIZ3HUYx08ZFm96QwuZw9bvUcylkUrERTv3p+QbvXK7UtI9L537U1El75u9iSCL7vdCYhftZ272qTzX/8v/QV+Ash6BHwU1lOdAAAAAElFTkSuQmCC' alt='Add' width='31' height='15'></form>";
  284. document.getElementById("rvAddCurrent").addEventListener("click", addCurrentQuickteam, true);
  285. }
  286. }
  287.  
  288. var tableDnD = null;
  289.  
  290. function redoQuickteamList() {
  291. try {
  292. var table = document.getElementById("rvQT");
  293.  
  294. while (table.rows.length > 0) {
  295. table.deleteRow(0);
  296. }
  297.  
  298. if (playerData["Quickteams"] != null) {
  299. var i;
  300. for (i = 0; i < playerData["Quickteams"].length; i++) {
  301. createQuickTeam(playerData["Quickteams"][i], playerData["QuickteamNames"][i], i+1);
  302.  
  303. tableDnD.makeDraggable(table.rows[i]);
  304. }
  305. }
  306. } catch(e) {
  307. alert("Exception when Loading QuickTeams!\n\nError name: " + e.name + "\nError message: " + e.message);
  308. }
  309. }
  310.  
  311. var dialog = null;
  312. var dialogHeader = null;
  313. var dialogText = null;
  314.  
  315. function exportQuickteams(ev) {
  316. try {
  317. if (dialog == null) {
  318. dialog = document.createElement("div");
  319. dialog.style.visibility = "hidden";
  320. dialog.id = "rvDialog";
  321. dialog.innerHTML = "<img id='closebutton' onclick=\"document.getElementById('rvDialog').style.visibility='hidden';\" title='Close' src='data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%03%00%00%00(-%0FS%00%00%00%01sRGB%00%AE%CE%1C%E9%00%00%00TPLTE%BA%0C%0C%BF%1D%1D%C1%26%26%C1((%C1))%C8%3D%3D%C8%3F%3F%CBHH%CDPP%D6nn%DC%83%83%DD%89%89%DE%89%89%E2%98%98%E4%A0%A0%EC%BA%BA%F1%CB%CB%F3%D7%D7%F4%D7%D7%F6%E1%E1%F7%E3%E3%FB%F0%F0%FB%F2%F2%FB%F3%F3%FC%F6%F6%FE%FB%FB%FE%FE%FE%FF%FF%FFD%88%E1%E1%00%00%00rIDAT%18%D3%5D%CFY%0E%80%20%10%03%D0%BA%E0%8E%8A%0A(%BD%FF%3D%8Da%08%EA%FC%F5%25M%3A%08%FC%5C%00%F19%3EP%A5T%09lK%CC%CB%26%80%F9%EC%80%EE%9CS%05%188%8E%1C%90%01%139%E1%05%E5N%EEe%86%C6q%5D%E9%9A%04%B5%E7%01%1C%F4%B5%80%E5%A5%00u%D1Fh%03%F5S%D7%0C%AD%80%89%C3%8C%00%FA%22B%D1%E7%1D%AF%E7%FE%EF%DF%8Eb%0A%CB%F1%17%10%11%00%00%00%00IEND%AEB%60%82' />";
  322.  
  323. dialogHeader = document.createElement("h1");
  324. dialogText = document.createElement("div");
  325. dialog.appendChild(dialogHeader);
  326. dialog.appendChild(dialogText);
  327.  
  328. document.body.appendChild(dialog);
  329. }
  330.  
  331. centerdiv(dialog, "300", "200");
  332.  
  333. dialogText.innerHTML = "<textarea rows='3' id='rvExportText' readOnly='true' style='background: #ccc; width: 100%; height: 150px;'>" + JSON.stringify(playerData).sanitizeHTML() + "</textarea>";
  334. dialogHeader.innerHTML = "Infinite QuickTeams Export";
  335.  
  336. dialog.style.visibility = "visible";
  337.  
  338. selectAll("rvExportText");
  339. } catch(e) {
  340. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  341. }
  342.  
  343. if (ev && ev.preventDefault)
  344. ev.preventDefault();
  345. return false;
  346. }
  347.  
  348. function importQuickteams(ev) {
  349. try {
  350. var input = prompt("Enter your saved 'Infinite QuickTeams' Export:", "");
  351.  
  352. if ((input != null) && (input != "")) {
  353. var failed = false;
  354. var newData = null;
  355.  
  356. try {
  357. newData = JSON.parse(input);
  358. failed = ((newData == undefined) || (newData == null));
  359. } catch (e) {
  360. failed = true;
  361. }
  362.  
  363. if (failed) {
  364. alert("Failed to understand the Import text!");
  365. } else {
  366. playerData = newData;
  367. saveGM();
  368.  
  369. redoQuickteamList();
  370. }
  371. }
  372. } catch(e) {
  373. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  374. }
  375.  
  376. if (ev && ev.preventDefault)
  377. ev.preventDefault();
  378. return false;
  379. }
  380.  
  381. function formTeam(ev) {
  382. try {
  383. var ally1 = unescape(document.getElementById("rvAlly0").value);
  384. var ally2 = unescape(document.getElementById("rvAlly1").value);
  385. var ally3 = unescape(document.getElementById("rvAlly2").value);
  386.  
  387. if ((ally2 == "") && (ally3 != "")) {
  388. ally2 = ally3;
  389. ally3 = "";
  390. }
  391.  
  392. var spot = document.getElementByName("quickteam");
  393.  
  394. spot = spot.nextSibling.nextSibling.nextSibling.nextSibling;
  395.  
  396. var element = document.createElement('DIV');
  397. var text = "<input type='radio' id='rvTempQT' value='";
  398.  
  399. ally1 = Allies.get(Allies.getAllyWithoutLevel(ally1));
  400.  
  401. text += ally1[0];
  402. if (ally2 != "") {
  403. ally2 = Allies.get(Allies.getAllyWithoutLevel(ally2));
  404. text += "^" + ally2[0];
  405. }
  406. if (ally3 != "") {
  407. ally3 = Allies.get(Allies.getAllyWithoutLevel(ally3));
  408. text += "^" + ally3[0];
  409. }
  410.  
  411. text += "' name='quickteam'><b>Temporary Quickteam</b><br>";
  412.  
  413. element.innerHTML = text;
  414. spot.parentNode.insertBefore(element, spot);
  415.  
  416. document.getElementById("rvTempQT").checked = true;
  417. } catch(e) {
  418. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  419. }
  420.  
  421. return true;
  422. }
  423.  
  424. function addCurrentQuickteam(ev) {
  425. try {
  426. var newQT = currentTeam;
  427. if (newQT.length != 0) {
  428. while (newQT.length < 3)
  429. newQT.push("");
  430. genericAddNewQuickteam(newQT);
  431.  
  432. redoQuickteamList();
  433. }
  434. } catch(e) {
  435. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  436. }
  437. if (ev && ev.preventDefault)
  438. ev.preventDefault();
  439. return false;
  440. }
  441.  
  442. function addNewQuickteam(ev) {
  443. try {
  444. var ally1 = unescape(document.getElementById("rvAlly0").value);
  445. var ally2 = unescape(document.getElementById("rvAlly1").value);
  446. var ally3 = unescape(document.getElementById("rvAlly2").value);
  447. var cancel = false;
  448. if ((ally2 == "") && (ally3 != "")) {
  449. ally2 = ally3;
  450. ally3 = "";
  451. }
  452.  
  453. if ((Allies.equals(ally1, ally2))
  454. || (Allies.equals(ally1, ally3))
  455. || ((Allies.equals(ally2, ally3)) && (ally2 != ""))) {
  456. alert("Invalid QuickTeam.");
  457. cancel = true;
  458. }
  459. if (!cancel) {
  460. var newQT = new Array(ally1, ally2, ally3);
  461.  
  462. genericAddNewQuickteam(newQT);
  463.  
  464. redoQuickteamList();
  465. }
  466. } catch(e) {
  467. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  468. }
  469. if (ev && ev.preventDefault)
  470. ev.preventDefault();
  471. return false;
  472. }
  473.  
  474. function genericAddNewQuickteam(newQT) {
  475. if (playerData["Quickteams"] == null) {
  476. playerData["Quickteams"] = new Array();
  477. playerData["QuickteamNames"] = new Array();
  478. }
  479.  
  480. var existing = playerData["Quickteams"].getPos(newQT);
  481. if (existing != -1) {
  482. alert("Quickteam is already in use in position #" + existing + ", named '"
  483. + (playerData["QuickteamNames"][existing] == "" ? "GM Quickteam " + (existing+1) : playerData["QuickteamNames"][existing]) + "'.");
  484. return;
  485. }
  486.  
  487. var newName = "";
  488. createQuickTeam(newQT, newName, playerData["Quickteams"].length+1);
  489. playerData["QuickteamNames"].push(newName);
  490. playerData["Quickteams"].push(newQT);
  491. saveGM();
  492. }
  493.  
  494. function createQuickTeam(qt, name, number) {
  495. var table = document.getElementById("rvQT");
  496. var row = table.insertRow(table.rows.length);
  497. var element = row.insertCell(0);
  498. var valid = true;
  499. var svalid = new Array(true, true, true)
  500. var same = new Array();
  501. var id = "";
  502. var allyNames = "";
  503. var allyNamesNow = "";
  504. var realAllyNames = new Array();
  505.  
  506. var i;
  507. for (i = 0; i < 3; i++) {
  508. if (qt[i] == "") {
  509. same.push(true);
  510. continue;
  511. }
  512.  
  513. var ally = Allies.get(Allies.getAllyWithoutLevel(qt[i]));
  514.  
  515. if (i > 0)
  516. allyNames += ", ";
  517. allyNames += qt[i];
  518.  
  519. if (ally == null) {
  520. valid = false;
  521. svalid[i] = false;
  522. } else {
  523. if (i > 0) {
  524. id += "^";
  525. allyNamesNow += ", ";
  526. }
  527.  
  528. id += ally[0];
  529. allyNamesNow += ally[1];
  530.  
  531. realAllyNames.push(ally[1]);
  532.  
  533. if (qt[i] == ally[1]) {
  534. same.push(true);
  535. } else {
  536. same.push(false);
  537. }
  538. }
  539. }
  540.  
  541. var allyNamesColor = "";
  542.  
  543. for (i = 0; i < 3; i++) {
  544. if (qt[i] == "")
  545. continue;
  546.  
  547. if (i > 0) {
  548. allyNamesColor += ", ";
  549. }
  550.  
  551. if (valid) {
  552. if (same[i])
  553. allyNamesColor += realAllyNames[i];
  554. else
  555. allyNamesColor += "<font color='#cc0000'><i>" + realAllyNames[i] + "</i></font>";
  556. } else {
  557. if (!svalid[i])
  558. allyNamesColor += "<span style='border-bottom: 1px solid red;'>";
  559. allyNamesColor += qt[i];
  560. if (!svalid[i])
  561. allyNamesColor += "</span>";
  562. }
  563. }
  564. var enames = escape(allyNames);
  565. var teamName = (name == "" ? "GM Quickteam" : name);
  566. var allsame = (same[0]) && (same[1]) && (same[2]);
  567. var coloring = ((allsame) || (!valid) ? "#000000" : "#cc0000");
  568.  
  569. var text = "";
  570.  
  571. text += "<input type='radio' id='" + id + "' value='" + id + "' name='quickteam'" + (valid ? "" : " disabled") + ">";
  572. text += "<input type='text' id='nname" + enames + "' value='" + teamName + "' style='color: " + coloring + "; outline: none; font-weight: bold; font-family: arial; font-size: 100%; display: none; border: 0px; background: none;' onfocus='var evt = new Object(); evt.target = document; moveMouse(evt); return true;'>";
  573.  
  574. if (valid) {
  575. text += "<label for='" + id + "'>";
  576. if (!allsame)
  577. text += "<span title='header=[Team Misalignment&nbsp;] body=[Original Team: " + allyNames.replaceAll("'", "&#39;") + "&nbsp;<br>Changed to:&nbsp;&nbsp;&nbsp;&nbsp;" + allyNamesNow.replaceAll("'", "&#39;") + "&nbsp;] offsetx=[0] offsety=[18] redswitch=[1] offsety=[-10]'>";
  578. }
  579.  
  580. text += "<b style='color: " + coloring + ";'><div id='name" + enames + "' style='display: inline'>";
  581. text += teamName.sanitizeHTML();
  582. text += "</div>";
  583. text += " <div name='rvQTNumber' style='display: inline'>";
  584. if (name != "")
  585. text += "(";
  586. text += number;
  587. if (name != "")
  588. text += ")";
  589. text += "</div></b>";
  590.  
  591. if ((!allsame) && (valid))
  592. text += "</span>";
  593.  
  594. text += ": <font style='font-size: 12px;'>";
  595. text += allyNamesColor;
  596. text += "<br></font>";
  597. if (valid)
  598. text += "</label>";
  599. element.innerHTML = text;
  600. element = row.insertCell(1);
  601. element.style.borderLeftStyle = "dotted";
  602. element.style.textAlign = "right";
  603. element.setAttribute("NoDrag", "true", 0);
  604. element.innerHTML = "<img id='down" + enames + "' alt='Move Down' src='data:image/gif;base64,R0lGODlhKgAwAPcAAJSUlJScnJycnKWlpa2tra2ttbW1tbW1vb29vb29xsbGxs7Ozs7W1tbW1tbe3t7e3t7n5+etpee1pefW1ufn5++tnO+1pe+1re+9re/v7/e9rfe9tffWlPfWzvfepff37/f39/8AAP8IAP8QAP8YAP8hAP8pAP8pKf8xAP8xKf8xMf85AP85Kf9CAP9CKf9CMf9KAP9KCP9KEP9KKf9SAP9SCP9SEP9SIf9SKf9aAP9aEP9aKf9aMf9jAP9jEP9jKf9rAP9rEP9rMf9zAP9zEP9zKf9zMf97AP97Mf+EAP+EMf+EOf+MAP+UAP+UUv+cAP+lAP+lKf+tKf+1Kf/Ovf/Oxv/WlP/Wxv/exv/ezv/nzv/n1v/v5//v7//37//39///7///9////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAAGIALAAAAAAqADAAAAj+AMUIHEhQIIgMCBMqXIiQwoKCECMK/MKhosWLGC16EEBAoseBXqCIHEmy5MgpADp+9BjSpEuSUwIYWMnypU0oUwTMpBmx5U2TUwYg4Nnzp8ugQ4kW9Gn0JIGkSkE2LTmFgIKoBL082cq1q9etUKQYuIpVoNavaLuKJVv2bNq0UhA8LCvGS5O7ePPqxRtFLt26ewPrjZJgblsmiBMrXpw4ioIGf70kmUy5suUjQHIYeRz5iOXPQ2CUEBEihIoFkOlyOcK6teseKEiXLn36wV8uQIbo3j0EtojfwH+rYGBbdY/jyGmYGMG8ufMXDYqX5ZIjBw0YK0qQ2M69+3bo0rH+cilBvrz58+VfOKBwG7378zMesFdtor79+/jt45B/2wSK/ADWh8J+802HwoEIJqgggjxAUKBEBylEwYQTrGDhhRhmeGGD8lHAUAYgVIHBiCReYIEEFWioYoY3SBCBBBeQSGIHYlAhQws45qjjjjz26GMLPHAhkI0/Fmnkjj8IORAVNsDg5JNQRinllFEKoSRBVzRJ5ZZcPmmlRFfoQMOYZJZp5plo0vClR2Gm6eabRlzJpphv1klmnERd4UN1fPbp55984qmUnoAW+icSchKFxZ6GGoroX4s2Cuijf4mBRRDIZaopckh0UelAWWC66aZLePEpQaGOmmmppxaUqqokrLbqqqiaxirrrLWaemtEr/Zg664QaUGEr7oCK5EWThSLVUAAADs%3D' width='12' height='14' style='cursor: pointer;'>"
  605. + "&nbsp;&nbsp;&nbsp;<img id='up" + enames + "' alt='Move Up' src='data:image/gif;base64,R0lGODlhKQAwAPcAAACMAACUAACcAAClAACtAAC1AAC9AADGAADOAADWAADeAADnACHOISHeISHnISnWKSneKTHWMTnWOUKtQkq1Skq9SkrGSkrOQkrOSkrWSlLeUlreWmPeY2vea2vna3Pec3Pnc3Pne3vne4yMjJSUlJycnKWlpaWtpaXvpa2trbW1tb29vcbGxs7Gzs7Ozs7WztbO1tbW1t7e3t733t7/3ufn5+f35+f/5+/v7+//5+//7/f39////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH5BAEAADwALAAAAAApADAAAAj+AHkIHEiw4MAaK3YYXMiw4cIaJkx0mOGwokWBNVKY0KDAAcWLIAtmTLFBgUmPIVPWUEHSpEuUKS3iUKGipMuXH2MyxLFihc2bOHUuxMHCJ9CjMIUKJMqCw9GnDXLqxOGi6dOrEKSGpOrC6dWrUWPuiNE1gdmzaNOizRpybIwOauPKZWtxh4y3cvOqpdvQrgy4egOf5WtwRw0ZHwQrNgvBxkLDNRIvXvzAcUEckRFo3sy5s+fPmysT3IHjA+jTqD2L5rFjh4jUsGGLdo3gQOcDtmN7zr0Zd+UZIoILD/5hAgPcyJMrT95huHMUDWuMwLC8unLLMWuQoG69O/aUOErdYDBAvrz58+W/bzVhAb378+pB4mD/vr6B+BdxpLBQoL///wD6h59MKvAXYIAEDCBAAAAMWNFMBh5YQIIMAmBhg0LxVAEBHHbY4YIXhuigQxp6+GEAKKao4ogNEVXBADDCuKCKNKLI4k4svKigADz26OOPNz7GAgU/FmlkkIXlGOOSTDaJZEE7uKBjk1TG+ORoUpqo5ZZXDhSlBVuG2WGXAn0p4ZkFkMmaCxGiCaCaO8DQppsCCjXWePa5B2cMeOYJn518+onentx1Vx2hhlqn1VYfSODoo5BG+uiIAQEAOw%3D%3D' width='12' height='14' style='cursor: pointer;'>"
  606. + "&nbsp;&nbsp;&nbsp;<img id='delete" + enames + "' alt='Remove' src='/billy/layout/xremove.gif' style='cursor: pointer;'>";
  607.  
  608. document.getElementById("name" + enames).addEventListener("dblclick", renameQuickteam, true);
  609. document.getElementById("nname" + enames).addEventListener("blur", endQuickteamEdit, true);
  610. document.getElementById("nname" + enames).addEventListener("keydown", keydownQuickteamEdit, true);
  611. document.getElementById("nname" + enames).addEventListener("keypress", keypressQuickteamEdit, true);
  612. document.getElementById("nname" + enames).addEventListener("keyup", keyupQuickteamEdit, true);
  613. document.getElementById("nname" + enames).addEventListener("cut", cutQuickteamEdit, true);
  614. //document.getElementById("nname" + enames).addEventListener("paste", changeQuickteamEdit, true);
  615.  
  616. document.getElementById("down" + enames).addEventListener("click", moveQuickteamDown, true);
  617. document.getElementById("up" + enames).addEventListener("click", moveQuickteamUp, true);
  618. document.getElementById("delete" + enames).addEventListener("click", removeQuickteam, true);
  619. }
  620.  
  621. var currentlyEditing;
  622.  
  623. function renameQuickteam(ev) {
  624. try {
  625. if (currentlyEditing != null) {
  626. endQuickteamEdit();
  627. }
  628.  
  629. currentlyEditing = this.id;
  630. var width = this.offsetWidth;
  631. var height = this.offsetHeight;
  632. this.style.display = "none";
  633.  
  634. var edit = document.getElementById("n" + currentlyEditing);
  635. edit.value = this.textContent;
  636. edit.style.height = height + "px";
  637. edit.style.width = (width+3) + "px";
  638. edit.style.display = "";
  639. edit.focus();
  640. } catch(e) {
  641. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  642. }
  643.  
  644. if (ev && ev.preventDefault)
  645. ev.preventDefault();
  646. return false;
  647. }
  648.  
  649. function endQuickteamEdit(save) {
  650. try {
  651. if (currentlyEditing == null)
  652. return;
  653.  
  654. var id = currentlyEditing;
  655. currentlyEditing = null;
  656.  
  657. var edit = document.getElementById("n" + id);
  658. var text = document.getElementById(id);
  659.  
  660. var newName = edit.value;
  661. edit.style.display = 'none';
  662.  
  663. if (newName == "GM Quickteam")
  664. newName = "";
  665.  
  666. if (save == false) {
  667. //edit.value = text.textContent; // this isn't possible with onkeypress
  668. } else if (newName != text.textContent) {
  669. var qt = getQTFromId(text, 4);
  670. var existing = playerData["Quickteams"].getPos(qt);
  671.  
  672. if (existing != -1) {
  673. playerData["QuickteamNames"][existing] = newName;
  674.  
  675. saveGM();
  676. }
  677.  
  678. edit.value = (newName == "" ? "GM Quickteam" : newName);
  679. text.innerHTML = edit.value.sanitizeHTML();
  680.  
  681. var num = text.parentNode;
  682. num = num.childNodes[num.childNodes.length - 1];
  683.  
  684. if (num.textContent.charAt(0) != '(') {
  685. if (newName != "")
  686. num.innerHTML = "(" + num.textContent + ")";
  687. } else if (newName == "") {
  688. num.innerHTML = num.textContent.replace("(","").replace(")","");
  689. }
  690. }
  691.  
  692. text.style.display = 'inline';
  693. text.focus();
  694. } catch(e) {
  695. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  696. }
  697. }
  698.  
  699. function keydownQuickteamEdit(ev) {
  700. return keypressQuickteamEdit(ev, true);
  701. }
  702.  
  703. function keypressQuickteamEdit(ev, keydown) {
  704. var rtrn = true;
  705. keydown = (keydown == true ? true : false);
  706. var obj = ev.currentTarget;
  707.  
  708. try {
  709. if (ev != null) {
  710. switch (ev.keyCode) {
  711. case 27: // escape
  712. if (ev && ev.preventDefault)
  713. ev.preventDefault();
  714. rtrn = false;
  715.  
  716. endQuickteamEdit(false);
  717. break;
  718. case 13: // enter
  719. if (ev && ev.preventDefault)
  720. ev.preventDefault();
  721.  
  722. endQuickteamEdit();
  723. break;
  724. case 46: // delete
  725. case 8: // backspace
  726. var start = obj.selectionStart;
  727. var end = obj.selectionEnd;
  728.  
  729. if (start == end) {
  730. if (ev.keyCode == 46)
  731. end++;
  732. else
  733. start--;
  734. }
  735.  
  736. testDiv.innerHTML = (obj.value.substring(0, start) + obj.value.substring(end)).sanitizeHTML();
  737. obj.style.width = (testDiv.offsetWidth+3) + "px";
  738. break;
  739. default:
  740. if (keydown)
  741. break;
  742.  
  743. var char = String.fromCharCode((ev.charCode ? ev.charCode : ev.which));
  744.  
  745. //document.getElementByName("rvQTNumber").innerHTML
  746. // = ev.keyCode + "," + ev.charCode + "," + ev.which + "," + ev.shiftKey + "," + ev.ctrlKey + "," + String.fromCharCode(ev.keyCode) + "," + char;
  747.  
  748. if ((!ev.ctrlKey) && (char.isPrintable())) {
  749. testDiv.innerHTML = (obj.value + char).sanitizeHTML();
  750. obj.style.width = (testDiv.offsetWidth+3) + "px";
  751. }
  752. }
  753. }
  754. } catch(e) {
  755. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  756. }
  757.  
  758. return rtrn;
  759. }
  760.  
  761. function keyupQuickteamEdit(ev) {
  762. try {
  763. testDiv.innerHTML = this.value.sanitizeHTML();
  764. this.style.width = (testDiv.offsetWidth+3) + "px";
  765. } catch(e) {
  766. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  767. }
  768. }
  769.  
  770. function cutQuickteamEdit(ev) {
  771. try {
  772. var start = this.selectionStart;
  773. var end = this.selectionEnd;
  774.  
  775. if (start != end) {
  776. testDiv.innerHTML = (this.value.substring(0, start) + this.value.substring(end)).sanitizeHTML();
  777. this.style.width = (testDiv.offsetWidth+3) + "px";
  778. }
  779. } catch(e) {
  780. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  781. }
  782. }
  783.  
  784. function moveQuickteamDown(ev) {
  785. try {
  786. var qt = getQTFromId(this, 4);
  787. var existing = playerData["Quickteams"].getPos(qt);
  788. moveTableRowDown(this.parentNode.parentNode);
  789.  
  790. playerData["Quickteams"].shiftDown(existing);
  791. playerData["QuickteamNames"].shiftDown(existing);
  792.  
  793. saveGM();
  794. updateNumbers();
  795. } catch(e) {
  796. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  797. }
  798. if (ev && ev.preventDefault)
  799. ev.preventDefault();
  800. return false;
  801. }
  802.  
  803. function moveQuickteamUp(ev) {
  804. try {
  805. var qt = getQTFromId(this, 2);
  806. var existing = playerData["Quickteams"].getPos(qt);
  807. moveTableRowUp(this.parentNode.parentNode);
  808.  
  809. playerData["Quickteams"].shiftUp(existing);
  810. playerData["QuickteamNames"].shiftUp(existing);
  811.  
  812. saveGM();
  813. updateNumbers();
  814. } catch(e) {
  815. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  816. }
  817. if (ev && ev.preventDefault)
  818. ev.preventDefault();
  819. return false;
  820. }
  821.  
  822. function removeQuickteam(ev) {
  823. try {
  824. var qt = getQTFromId(this, 6);
  825. var existing = playerData["Quickteams"].getPos(qt);
  826.  
  827. if (existing != -1) {
  828. this.parentNode.parentNode.parentNode.deleteRow(existing);
  829.  
  830. playerData["Quickteams"].splice(existing, 1);
  831. playerData["QuickteamNames"].splice(existing, 1);
  832.  
  833. saveGM();
  834. updateNumbers();
  835. }
  836. } catch(e) {
  837. alert("Exception!\n\nError name: " + e.name + "\nError message: " + e.message);
  838. }
  839. if (ev && ev.preventDefault)
  840. ev.preventDefault();
  841. return false;
  842. }
  843.  
  844. function getQTFromId(elem, cut) {
  845. var qt = unescape(elem.id.substring(cut)).split(", ");
  846. while (qt.length < 3)
  847. qt.push("");
  848. return qt;
  849. }
  850.  
  851. function updateNumbers() {
  852. var elems = document.getElementsByName("rvQTNumber");
  853. if (elems == null)
  854. return;
  855.  
  856. var i;
  857. for (i = 0; i < elems.length; i++) {
  858. if (elems[i].textContent.charAt(0) == '(')
  859. elems[i].textContent = "(" + (i+1) + ")";
  860. else
  861. elems[i].textContent = (i+1);
  862. }
  863. }
  864.  
  865. function moveTableRowUp(node) {
  866. var prevRow = node.previousSibling;
  867. var tableNode = node.parentNode;
  868. var remove = tableNode.removeChild(node);
  869. tableNode.insertBefore(remove, prevRow);
  870. return (prevRow == null);
  871. }
  872.  
  873. function moveTableRowDown(node) {
  874. var nextRow = node.nextSibling;
  875. var tableNode = node.parentNode;
  876. var rtrn = nextRow == null;
  877. if (rtrn)
  878. nextRow = tableNode.firstChild;
  879. else
  880. nextRow = nextRow.nextSibling;
  881.  
  882. if (nextRow == node)
  883. return true;
  884. var remove = tableNode.removeChild(node);
  885. tableNode.insertBefore(remove, nextRow);
  886. return rtrn;
  887. }
  888.  
  889. var Allies = new Object();
  890.  
  891. Allies.getAllyName = function(src) {
  892. var pos = src.lastIndexOf("/")+1;
  893. var text = src.substring(pos).replaceAll("_", " ").replaceAll(" Lvl. ", " ").replaceAll("%27", "'").replace("ss\\.gif", "").replace(/\.gif/, "");
  894. return text;
  895. };
  896.  
  897. Allies.getAllyWithoutLevel = function(name) {
  898. if (name.match(" \\d+$")) {
  899. var pos = name.lastIndexOf(" ");
  900. return name.substring(0, pos);
  901. }
  902.  
  903. return name;
  904. };
  905.  
  906. Allies.getPos = function(name) {
  907. if (allies != null) {
  908. var i;
  909. for (i = 0; i < allies.length; i++) {
  910. if (Allies.equals(name, allies[i][1]))
  911. return i;
  912. }
  913. }
  914.  
  915. return -1;
  916. };
  917.  
  918. Allies.get = function(name) {
  919. var pos = Allies.getPos(name);
  920. if (pos == -1)
  921. return null;
  922.  
  923. return allies[pos];
  924. };
  925.  
  926. Allies.getAllyLevel = function(name) {
  927. var match;
  928.  
  929. if (match = name.match(" (\\d+)")) {
  930. return parseInt(match[1]);
  931. }
  932.  
  933. return 1;
  934. };
  935.  
  936. Allies.equals = function(input, arraytest) {
  937. if (arraytest == null)
  938. return (input == null);
  939.  
  940. return (arraytest.match("^" + input + "( \\d+)?$") != null);
  941. };
  942.  
  943. function selectAll(id) {
  944. document.getElementById(id).focus();
  945. document.getElementById(id).select();
  946. }
  947.  
  948. function centerdiv(div, Xwidth, Yheight) {
  949. // First, determine how much the visitor has scrolled
  950.  
  951. /*var scrolledX, scrolledY;
  952.  
  953. if( self.pageYoffset ) {
  954. scrolledX = self.pageXoffset;
  955. scrolledY = self.pageYoffset;
  956. } else if( document.documentElement && document.documentElement.scrollTop ) {
  957. scrolledX = document.documentElement.scrollLeft;
  958. scrolledY = document.documentElement.scrollTop;
  959. } else if( document.body ) {
  960. scrolledX = document.body.scrollLeft;
  961. scrolledY = document.body.scrollTop;
  962. }*/
  963.  
  964. // Next, determine the coordinates of the center of browser's window
  965.  
  966. var centerX, centerY;
  967. if( self.innerHeight ) {
  968. centerX = self.innerWidth;
  969. centerY = self.innerHeight;
  970. } else if( document.documentElement && document.documentElement.clientHeight ) {
  971. centerX = document.documentElement.clientWidth;
  972. centerY = document.documentElement.clientHeight;
  973. } else if( document.body ) {
  974. centerX = document.body.clientWidth;
  975. centerY = document.body.clientHeight;
  976. }
  977.  
  978. if (Yheight.substring(Yheight.length-1) == "%")
  979. Yheight = parseInt(Yheight) / 100 * centerY;
  980. if (Xwidth.substring(Xwidth.length-1) == "%")
  981. Xwidth = parseInt(Xwidth) / 100 * centerX;
  982.  
  983. // Xwidth is the width of the div, Yheight is the height of the
  984. // div passed as arguments to the function:
  985. var leftoffset = /*scrolledX + */(centerX - Xwidth) / 2;
  986. var topoffset = /*scrolledY + */(centerY - Yheight) / 2;
  987. // The initial width and height of the div can be set in the
  988. // style sheet with display:none; divid is passed as an argument to // the function
  989. var r = div.style;
  990. r.position = 'fixed';
  991. r.top = topoffset + 'px';
  992. r.left = leftoffset + 'px';
  993. r.width = Xwidth + 'px';
  994. r.height = Yheight + 'px';
  995. }
  996.  
  997. document.getElementByName = function(str) {
  998. var rtrn = document.getElementsByName(str);
  999. if ((rtrn == null) || (rtrn.length == 0)) return null;
  1000. return rtrn[0];
  1001. };
  1002.  
  1003. String.prototype.replaceAll = function(str, str2) { return (this.replace(new RegExp(str, "g"), str2)); };
  1004. String.prototype.isPrintable = function() { return (this.match(/[\x00-\x1F\x80-\xFF]/) == null); };
  1005. String.prototype.sanitizeHTML = function() { return (this.replaceAll("&", "&amp;").replaceAll(" ", "&nbsp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;")); };
  1006.  
  1007. Array.prototype.swap = function (x,y) {
  1008. var b = this[x];
  1009. this[x] = this[y];
  1010. this[y] = b;
  1011.  
  1012. return this;
  1013. }
  1014.  
  1015. Array.prototype.shiftUp = function (pos) {
  1016. if (pos == 0) {
  1017. this.push(this.shift());
  1018. } else {
  1019. this.swap(pos, pos - 1);
  1020. }
  1021. }
  1022.  
  1023. Array.prototype.shiftDown = function (pos) {
  1024. if (pos == this.length - 1) {
  1025. this.unshift(this.pop());
  1026. } else {
  1027. this.swap(pos, pos + 1);
  1028. }
  1029. }
  1030.  
  1031.  
  1032. Array.prototype.getPos = function(obj) {
  1033. var i = this.length;
  1034.  
  1035. while (i--) {
  1036. if (isArray(this[i])) {
  1037. if ((isArray(obj)) && (this[i].length == obj.length)) {
  1038. var j;
  1039. for (j = 0; j < obj.length; j++) {
  1040. if (this[i][j] != obj[j])
  1041. break;
  1042. }
  1043. if (j == obj.length)
  1044. return i;
  1045. }
  1046. }
  1047. if (this[i] === obj) {
  1048. return i;
  1049. }
  1050. }
  1051. return -1;
  1052. };
  1053.  
  1054. function isArray(obj) {
  1055. return obj.constructor == Array;
  1056. }
  1057.  
  1058. function DnDTable() {
  1059. this.init = false;
  1060. this.table = null;
  1061. this.dragObject = null;
  1062. this.dragPosition = null;
  1063. this.oldY = 0;
  1064.  
  1065. // attach to table
  1066. this.init = function (table) {
  1067. // can't run this script without the event listeners
  1068. if (!window.addEventListener) {
  1069. return;
  1070. }
  1071.  
  1072. this.table = table;
  1073. this.init = true;
  1074. var self = this;
  1075.  
  1076. // make rows draggable
  1077.  
  1078. var rows = table.rows;
  1079. var i;
  1080. for (i = 0; i < rows.length; i++) {
  1081. this.makeDraggable(rows[i]);
  1082. }
  1083.  
  1084. window.addEventListener('mousemove',
  1085. function (ev) {
  1086. return self.onMouseMove(ev || window.event);
  1087. }
  1088. ,false);
  1089.  
  1090. window.addEventListener('mouseup',
  1091. function (ev) {
  1092. return self.onMouseUp(ev || window.event);
  1093. }
  1094. ,false);
  1095. }
  1096.  
  1097. // make a element in the table draggable
  1098. this.makeDraggable = function (item) {
  1099. if ((!item) || (!this.init))
  1100. return;
  1101.  
  1102. var nodrag = item.getAttribute("NoDrag");
  1103. if ((nodrag != null) && (nodrag != "undefined"))
  1104. return;
  1105.  
  1106. var self = this;
  1107.  
  1108. var cells = item.cells;
  1109. var i;
  1110. for (i = 0; i < cells.length; i++) {
  1111. var cell = cells[i];
  1112. var nodrag = cell.getAttribute("NoDrag");
  1113.  
  1114. if ((nodrag == null) || (nodrag == "undefined")) {
  1115. cell.addEventListener('mousedown',
  1116. function (ev) {
  1117. // // allow normal processing on form controls
  1118. // var targetName = this.getEventSource(ev).tagName.toUpperCase();
  1119. //
  1120. // if ((targetName == 'INPUT') || (targetName == 'SELECT') || (targetName == 'TEXTAREA'))
  1121. // return true;
  1122.  
  1123. if (self.dragObject != null) {
  1124. return self.onMouseUp(ev);
  1125. } else {
  1126. self.dragObject = item;
  1127. self.mouseOffset = self.getMouseOffset(this, ev);
  1128.  
  1129. if (self.onStartDragging) {
  1130. self.onStartDragging();
  1131. }
  1132. }
  1133.  
  1134. if (ev && ev.preventDefault)
  1135. ev.preventDefault();
  1136.  
  1137. return false;
  1138. }
  1139. ,false);
  1140.  
  1141. cell.style.cursor = "move";
  1142. }
  1143. }
  1144. }
  1145.  
  1146. this.getEventSource = function getEventSource(evt) {
  1147. if (window.event) {
  1148. return window.event.srcElement; // For IE
  1149. } else {
  1150. return evt.target; // For Firefox
  1151. }
  1152. }
  1153.  
  1154. this.onMouseMove = function (ev) {
  1155. if (this.dragObject) {
  1156. var mousePos = this.mouseCoords(ev);
  1157. var y = mousePos.y - this.mouseOffset.y;
  1158.  
  1159. if (y != this.oldY) {
  1160. var movingDown = y > this.oldY;
  1161. this.oldY = y;
  1162.  
  1163. // If we're over a row then move the dragged row to there so that the user sees the effect dynamically
  1164. var currentRow = this.findDropTargetRow(y);
  1165.  
  1166. if (this.onDragging)
  1167. this.onDragging(currentRow);
  1168.  
  1169. if ((currentRow) && (this.dragObject != currentRow)) {
  1170. if (movingDown) {
  1171. this.dragObject.parentNode.insertBefore(this.dragObject, currentRow.nextSibling);
  1172. } else {
  1173. this.dragObject.parentNode.insertBefore(this.dragObject, currentRow);
  1174. }
  1175. }
  1176. }
  1177. }
  1178.  
  1179. return false;
  1180. }
  1181.  
  1182. this.onMouseUp = function (ev) {
  1183. if (this.dragObject) {
  1184. if (this.onDrop)
  1185. this.onDrop();
  1186.  
  1187. this.dragObject = null;
  1188. }
  1189.  
  1190. if (ev && ev.preventDefault)
  1191. ev.preventDefault();
  1192.  
  1193. return false;
  1194. }
  1195.  
  1196. // get the mouse offset from the element's position
  1197. this.getMouseOffset = function (target, ev) {
  1198. ev = ev || window.event;
  1199.  
  1200. var docPos = this.getPosition(target);
  1201. var mousePos = this.mouseCoords(ev);
  1202.  
  1203. return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
  1204. }
  1205.  
  1206. // get the position of an element by going up the DOM tree and adding up all the offsets
  1207. this.getPosition = function (e) {
  1208. var left = 0;
  1209. var top = 0;
  1210.  
  1211. // Safari fix
  1212. if (e.offsetHeight == 0) {
  1213. /**
  1214. Safari 2 doesn't correctly grab the offsetTop of a table row
  1215. this is detailed here:
  1216. http://jacob.peargrove.com/blog/2006/technical/table-row-offsettop-bug-in-safari/
  1217. the solution is likewise noted there, grab the offset of a table cell in the row - the firstChild.
  1218. note that firefox will return a text node as a first child, so designing a more thorough
  1219. solution may need to take that into account, for now this seems to work in firefox, safari, ie
  1220. */
  1221.  
  1222. e = e.firstChild; // a table cell
  1223. }
  1224.  
  1225. while (e.offsetParent) {
  1226. left += e.offsetLeft;
  1227. top += e.offsetTop;
  1228. e = e.offsetParent;
  1229. }
  1230.  
  1231. left += e.offsetLeft;
  1232. top += e.offsetTop;
  1233.  
  1234. return {x:left, y:top};
  1235. }
  1236.  
  1237. // get the mouse coordinates from the event
  1238. this.mouseCoords = function (ev) {
  1239. if ((ev.pageX) || (ev.pageY)) {
  1240. return {x:ev.pageX, y:ev.pageY};
  1241. }
  1242.  
  1243. return {x:ev.clientX + document.body.scrollLeft - document.body.clientLeft, y:ev.clientY + document.body.scrollTop - document.body.clientTop};
  1244. }
  1245.  
  1246. //
  1247. this.findDropTargetRow = function (y) {
  1248. var rows = this.table.rows;
  1249.  
  1250. var i;
  1251. for (i = 0; i < rows.length; i++) {
  1252. var row = rows[i];
  1253.  
  1254. var nodrop = row.getAttribute("NoDrop");
  1255. if ((nodrop == null) || (nodrop == "undefined")) {
  1256. var rowY = this.getPosition(row).y;
  1257. var rowHeight;
  1258.  
  1259. if (row.offsetHeight == 0) {
  1260. rowY = this.getPosition(row.firstChild).y;
  1261. rowHeight = parseInt(row.firstChild.offsetHeight);
  1262. } else {
  1263. rowHeight = parseInt(row.offsetHeight);
  1264. }
  1265.  
  1266. rowHeight /= 2;
  1267.  
  1268.  
  1269. // we need to offset the height a bit because we are inserting before
  1270. if ((y > rowY - rowHeight) && (y < rowY + rowHeight)) {
  1271. return row;
  1272. }
  1273. }
  1274. }
  1275.  
  1276. return null;
  1277. }
  1278.  
  1279. this.endDragging = function () {
  1280. if (this.dragObject != null)
  1281. self.onMouseUp(ev);
  1282. }
  1283.  
  1284. // this function is called when you start dragging a row, so redefine it in your code to do whatever you want
  1285. // takes 0 parameters
  1286. this.onStartDragging = null;
  1287.  
  1288. // this function is called when a row is being dragged, so redefine it in your code to do whatever you want
  1289. // takes 1 parameters: row hovering over in table
  1290. this.onDragging = null;
  1291.  
  1292. // this function is called when you drop a row, so redefine it in your code to do whatever you want
  1293. // takes 0 parameters
  1294. this.onDrop = null;
  1295. }
  1296.  
  1297. var gvar = new Object();
  1298.  
  1299. function GM_ApiBrowserCheck() {
  1300. if (typeof(unsafeWindow) == 'undefined') { unsafeWindow=window; }
  1301. if (typeof(GM_log) == 'undefined') { GM_log = function(msg) { try { unsafeWindow.console.log('GM_log: ' + msg); } catch(e) {} }; }
  1302. GM_clog = function(msg) { if (arguments.callee.counter) { arguments.callee.counter++; } else { arguments.callee.counter=1; } GM_log('('+arguments.callee.counter+') '+msg); }
  1303. GM_addGlobalStyle = function(css) {
  1304. var sel = document.createElement('style');
  1305. sel.setAttribute('type','text/css');
  1306. sel.appendChild(document.createTextNode(css));
  1307. var hel = document.documentElement.firstChild;
  1308. while (hel && hel.nodeName != 'HEAD') { hel=hel.nextSibling; }
  1309. if (hel && hel.nodeName == 'HEAD') { hel.appendChild(sel); } else { document.body.insertBefore(sel,document.body.firstChild); }
  1310. return sel;
  1311. }
  1312. var needApiUpgrade=false;
  1313.  
  1314. if(window.navigator.appName.match(/^opera/i) && typeof(window.opera) != 'undefined') {
  1315. needApiUpgrade=true; gvar.isOpera=true; GM_log=window.opera.postError; GM_log('Opera detected...');
  1316. }
  1317.  
  1318. if(typeof(GM_setValue) != 'undefined') {
  1319. try {
  1320. var gsv=GM_setValue.toString();
  1321. if (gsv.indexOf('staticArgs') > 0) { gvar.isGreaseMonkey = true; GM_log('GreaseMonkey Api detected...'); }
  1322. else if (gsv.match(/not\s+supported/)) { needApiUpgrade = true; gvar.isBuggedChrome = true; GM_log('Bugged Chrome GM Api detected...'); }
  1323. } catch(e) {
  1324. gvar.isGreaseMonkey = (typeof(GM_setValue) == 'function');
  1325. if (gvar.isGreaseMonkey)
  1326. GM_log('GreaseMonkey Api is assumed because of exception...');
  1327. else
  1328. needApiUpgrade = true;
  1329. }
  1330. } else {
  1331. needApiUpgrade=true; GM_log('No GM Api detected...');
  1332. }
  1333.  
  1334. if(needApiUpgrade) {
  1335. GM_log('Try to recreate needed GM Api...');
  1336. var ws = null;
  1337. try { ws=typeof(unsafeWindow.localStorage); unsafeWindow.localStorage.length; } catch(e) { ws=null; } // Catch Security error
  1338.  
  1339. if (ws=='object') {
  1340. GM_log('Using localStorage for GM Api.');
  1341. GM_getValue=function(name,defValue) { var value=unsafeWindow.localStorage.getItem(GMSTORAGE_PATH+name); if(value==null) { return defValue; } else { switch(value.substr(0,2)) { case 'S]': return value.substr(2); case 'N]': return parseInt(value.substr(2)); case 'B]': return value.substr(2)=='true'; } } return value; }
  1342. GM_setValue=function(name,value) { switch (typeof(value)) { case 'string': unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'S]'+value); break; case 'number': if(value.toString().indexOf('.')<0) { unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'N]'+value); } break; case 'boolean': unsafeWindow.localStorage.setItem(GMSTORAGE_PATH+name,'B]'+value); break; } }
  1343. GM_deleteValue=function(name) { unsafeWindow.localStorage.removeItem(GMSTORAGE_PATH+name); }
  1344. } else if(!gvar.isOpera || typeof(GM_setValue)=='undefined') {
  1345. GM_log('Using temporarilyStorage for GM Api.'); gvar.temporarilyStorage=new Array();
  1346. GM_getValue=function(name,defValue) { if(typeof(gvar.temporarilyStorage[GMSTORAGE_PATH+name])=='undefined') { return defValue; } else { return gvar.temporarilyStorage[GMSTORAGE_PATH+name]; } }
  1347. GM_setValue=function(name,value) { switch (typeof(value)) { case "string": case "boolean": case "number": gvar.temporarilyStorage[GMSTORAGE_PATH+name]=value; } }
  1348. GM_deleteValue=function(name) { delete gvar.temporarilyStorage[GMSTORAGE_PATH+name]; };
  1349. }
  1350. if(typeof(GM_addStyle)=='undefined') { GM_addStyle=function(css) { var heads = document.getElementsByTagName("head"); if (heads.length > 0) { var node = document.createElement("style"); node.type = "text/css"; node.appendChild(document.createTextNode(css)); heads[0].appendChild(node); } } }
  1351. if(typeof(GM_openInTab)=='undefined') { GM_openInTab=function(url) { unsafeWindow.open(url,""); } }
  1352. if(typeof(GM_registerMenuCommand)=='undefined') { GM_registerMenuCommand=function(name,cmd) { GM_log("Notice: GM_registerMenuCommand is not supported."); } } // Dummy
  1353. if(!gvar.isOpera || typeof(GM_xmlhttpRequest)=='undefined') {
  1354. GM_log('Using XMLHttpRequest for GM Api.');
  1355. GM_xmlhttpRequest=function(obj) {
  1356. var request=new XMLHttpRequest();
  1357. request.onreadystatechange=function() { if(obj.onreadystatechange) { obj.onreadystatechange(request); }; if(request.readyState==4 && obj.onload) { obj.onload(request); } }
  1358. request.onerror=function() { if(obj.onerror) { obj.onerror(request); } }
  1359. try { request.open(obj.method,obj.url,true); } catch(e) { if(obj.onerror) { obj.onerror( {readyState:4,responseHeaders:'',responseText:'',responseXML:'',status:403,statusText:'Forbidden'} ); }; return; }
  1360. if(obj.headers) { for(name in obj.headers) { request.setRequestHeader(name,obj.headers[name]); } }
  1361. request.send(obj.data); return request;
  1362. }
  1363. }
  1364. }
  1365. }
  1366.  
  1367. function waitForReady(callback) {
  1368. var docState;
  1369. try { docState = unsafeWindow.document.readyState; } catch(e) { docState = null; }
  1370. if(docState) {
  1371. if ((docState != 'complete') && (docState != 'interactive')) {
  1372. window.setTimeout(waitForReady, 150, callback);
  1373. return;
  1374. }
  1375. }
  1376. callback();
  1377. }
  1378.  
  1379. GM_ApiBrowserCheck();
  1380. waitForReady(load);