Greasy Fork is available in English.

Chess.com Favicon Alerts

Add number of games waiting to favicon

  1. // ==UserScript==
  2. // @name Chess.com Favicon Alerts
  3. // @description Add number of games waiting to favicon
  4. // @version 0.8
  5. // @author Jim Farrand
  6. // @author Peter Wooley (Original GMail Favicon script)
  7. // @license MIT
  8. // @namespace http://xyxyx.org/
  9. // @include https://www.chess.com/*
  10. // @include http://www.chess.com/*
  11. // @grant GM_getValue
  12. // @grant GM_setValue
  13. // @grant GM_registerMenuCommand
  14. // ==/UserScript==
  15.  
  16. if(typeof GM_getValue === "undefined") {
  17. function GM_getValue(name, fallback) {
  18. return fallback;
  19. }
  20. }
  21.  
  22. var titleNotificationConfigKey = 'titleNotificationEnabled';
  23. var debuggingConfigKey = 'debuggingEnabled';
  24. var autoReloadConfigKey = 'autoReloadEnabled';
  25. var lastCountKey = 'lastCount';
  26. var lastCountUpdateTimeKey = 'lastCountUpdateTime';
  27. var lastCountChangeTimeKey = 'lastCountChangeTime';
  28. var flashIconForNewKey = 'flashIconEnabled';
  29.  
  30. // Register GM Commands and Methods
  31. if(typeof GM_registerMenuCommand !== "undefined") {
  32. var setTitleNotification = function(state) {
  33. console.log("Setting title notifications: " + state);
  34. GM_setValue(titleNotificationConfigKey, state);
  35. };
  36.  
  37. var setDebugging = function(state) {
  38. console.log("Setting debugging: " + state);
  39. GM_setValue(debuggingConfigKey, state);
  40. };
  41.  
  42.  
  43. var setAutoReload = function(state) {
  44. console.log("Setting auto-reload: " + state);
  45. GM_setValue(autoReloadConfigKey, state);
  46. }
  47. var setFlashIcon = function(state) {
  48. console.log("Setting flash icon: " + state);
  49. GM_setValue(flashIconForNewKey, state);
  50. }
  51.  
  52. GM_registerMenuCommand( "Chess.com Favicon Alerts > Set Title Notifications On",
  53. function() { setTitleNotification(true) });
  54. GM_registerMenuCommand( "Chess.com Favicon Alerts > Set Title Notifications Off",
  55. function() { setTitleNotification(false) });
  56. GM_registerMenuCommand( "Chess.com Favicon Alerts > Set Debugging On",
  57. function() { setDebugging(true) });
  58. GM_registerMenuCommand( "Chess.com Favicon Alerts > Set Debugging Off",
  59. function() { setDebugging(false) });
  60. GM_registerMenuCommand( "Chess.com Favicon Alerts > Set Auto Reload On",
  61. function() { setAutoReload(true) });
  62. GM_registerMenuCommand( "Chess.com Favicon Alerts > Set Auto Reload Off",
  63. function() { setAutoReload(false) });
  64. GM_registerMenuCommand( "Chess.com Favicon Alerts > Set Flash Icon After Change On",
  65. function() { setFlashIcon(true) });
  66. GM_registerMenuCommand( "Chess.com Favicon Alerts > Set Flash Icon After Change Off",
  67. function() { setFlashIcon(false) });
  68. }
  69.  
  70. if(!window.frameElement) {
  71. new ChessDotComFavIconAlerts();
  72. }
  73.  
  74. function ChessDotComFavIconAlerts() {
  75. var self = this;
  76.  
  77. // PRIVATE VARIABLES AND METHODS
  78.  
  79. // The URL attached to the little hand icon, with the link containing the number of games
  80. var gotoReadyGameURL = "http://www.chess.com/echess/goto_ready_game";
  81.  
  82. // Min time to wait after suspected suspend before refreshing
  83. var reloadRandomizationMin = 20 * 1000;
  84. // Random time to wait after suspected suspend before refreshing, in addition to reloadAfterSuspendMinimum
  85. var reloadRandomizationMax = 40 * 1000;
  86.  
  87. var searchElement;
  88. var iconCanvas;
  89.  
  90. var isDebugging = function() {
  91. return false || GM_getValue(debuggingConfigKey, false);
  92. }
  93.  
  94. var getLastCount = function() {
  95. return GM_getValue(lastCountKey);
  96. }
  97.  
  98. var getLastCountUpdateTime = function() {
  99. return GM_getValue(lastCountUpdateTimeKey);
  100. }
  101.  
  102. var getLastCountChangeTime = function() {
  103. return GM_getValue(lastCountChangeTimeKey);
  104. }
  105. var setLastCount = function(value) {
  106. GM_setValue(lastCountKey, value);
  107. }
  108.  
  109. var setLastCountUpdateTime = function(value) {
  110. GM_setValue(lastCountUpdateTimeKey, value);
  111. }
  112.  
  113. var setLastCountChangeTime = function(value) {
  114. GM_setValue(lastCountChangeTimeKey, value);
  115. }
  116.  
  117. var isAutoReloadEnabled = function() {
  118. return false || GM_getValue(autoReloadConfigKey, false);
  119. }
  120.  
  121. var isFlashIconEnabled = function() {
  122. return false || GM_getValue(flashIconForNewKey, false);
  123. }
  124.  
  125. var isTitleUpdatedEnabled = function() {
  126. return false || GM_getValue(titleNotificationConfigKey, false);
  127. }
  128. var head = window.document.getElementsByTagName('head')[0];
  129. // Element that contains the count
  130. var findSearchElement = function() {
  131. var searchElement = document.getElementById("topright");;
  132. if (isDebugging()) { console.log("findSearchElement: " + searchElement); }
  133. return searchElement;
  134. }
  135.  
  136.  
  137. var setIcon = function(icon) {
  138. var links = head.getElementsByTagName("link");
  139. for (var i = 0; i < links.length; i++) {
  140. if ((links[i].rel == "shortcut icon" || links[i].rel=="icon") && links[i].href != icon) {
  141. head.removeChild(links[i]);
  142. } else if(links[i].href == icon) {
  143. return;
  144. }
  145. }
  146.  
  147. var newIcon = document.createElement("link");
  148. newIcon.type = "image/png";
  149. newIcon.rel = "shortcut icon";
  150. newIcon.href = icon;
  151.  
  152. head.appendChild(newIcon);
  153.  
  154. setTimeout(function() {
  155. if (isDebugging()) { console.log("Timeout function"); }
  156.  
  157. var shim = document.createElement('iframe');
  158. shim.width = shim.height = 0;
  159. document.body.appendChild(shim);
  160. shim.src = "icon";
  161. document.body.removeChild(shim);
  162.  
  163. if (isDebugging()) { console.log("Timeout function done"); }
  164. }, 1000);
  165. }
  166.  
  167. var getIconCanvas = function() {
  168. if(!iconCanvas) {
  169. iconCanvas = document.createElement('canvas');
  170. iconCanvas.height = iconCanvas.width = 16;
  171.  
  172. var ctx = iconCanvas.getContext('2d');
  173.  
  174. for (var y = 0; y < iconCanvas.width; y++) {
  175. for (var x = 0; x < iconCanvas.height; x++) {
  176. if (self.pixelMaps.icons.unread[y][x]) {
  177. ctx.fillStyle = self.pixelMaps.icons.unread[y][x];
  178. ctx.fillRect(x, y, 1, 1);
  179. }
  180. }
  181. }
  182. }
  183.  
  184. return iconCanvas;
  185. }
  186.  
  187. var showCount = function() {
  188. // We could decide here whether to show the count or the other icon
  189. return true;
  190. }
  191.  
  192. // TODO: This could be made abstract so that that this class can be more easily reused
  193. var getCount = function() {
  194. // Return the number of things
  195. if(searchElement) {
  196. var center;
  197. var topRightChildren = searchElement.childNodes;
  198. for (var i = 0; i < topRightChildren.length; i++) {
  199. var topRightChild = topRightChildren.item(i);
  200. if (topRightChild.tagName == "LI" && topRightChild.hasAttribute("class") && topRightChild.getAttribute("class") == "center") {
  201. var centerChildren = topRightChild.childNodes;
  202. for (var i = 0; i < centerChildren.length; i++) {
  203. var centerChild = centerChildren.item(i);
  204. if (centerChild.tagName == "A" && centerChild.hasAttribute("href") && centerChild.getAttribute("href") == gotoReadyGameURL) {
  205. var result = centerChild.textContent;
  206. if (isDebugging()) { console.log("getCount: " + result); }
  207. return result;
  208. }
  209. }
  210. }
  211. }
  212. if (isDebugging()) { console.log("getCount: 0"); }
  213. return 0;
  214. }
  215. }
  216. this.construct = function() {
  217. if (isDebugging()) { console.log("Creating ChessDotComFavIconAlerts"); }
  218.  
  219. // PUBLIC VARIABLES AND METHODS
  220.  
  221. this.backgroundFillColour = "#ff0000";
  222. this.backgroundBorderColour = "#990000";
  223. this.digitColour = "#ffffff";
  224. // How long must have passed without user input in this window before we reload the page?
  225. this.inactivityTimeout = 15 * 60 * 1000; // 15 minutes
  226. // How old must the data be before we reload the page?
  227. this.dataTimeout = 3 * 60 * 1000; // 3 minutes
  228. // Note that we might have received data from another tab/window, which is why there are seperate data/inactivity timeouts
  229. // How long to flash the icon for after it changes
  230. this.flashPeriod = 15 * 1000;
  231. // TODO: More things could be private
  232. this.icons = {
  233. // TODO: These are the same, and incorrectly named.
  234. read: 'data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAARCwAAEQsAAAAAAAAAAAAA////AP///wD///8AO4ZcPDuKYMw7i2HsN3xR8jZ2S/83d0z/N3dM9zd3TN83d0ytN3dMIP///wD///8A////AP///wD///8A////AD+SaP4+k2r/PpNq/zqEWv84d03/OHhN/zZ3S/83d0z/N3dM/zd3TO////8A////AP///wD///8A////AP///wA7iV7hPpNq/z6Tav8+jWT/N3hM/zh4Tf83d0z/N3dM/zh3Tf42dkvL////AP///wD///8A////AP///wD///8AO4heuj6Tav8+k2r/PpJq/zmAVv83d0z/N3dM/zh3Tf83d0z/NnZLm////wD///8A////AP///wD///8A////ADuGXCo7jGLhPpNq/z6Tav87hVv/OHdN/zd3TP84d037N3dMqjd3TBX///8A////AP///wD///8A////AP///wAAAAAAAAAAADuGXFw9kGf7PIlg/zh4Tf82dkvfNnZLGwAAAAAAAAAA////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAPYphzjyOZP83d0z/N3dMjwAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAADuIX6I/kmj/N3dL/zZ3S2UAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAA8h1+AP5Rq/zh5T/82d0tLAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAO4ddZT6Tav83fFH/NnZLOQAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AAAAAAAAAAAAPYphzjyPZvg+k2r/PI5k/zd5Ttk4d02PAAAAAAAAAAD///8A////AP///wD///8A////AP///wAAAAAAAAAAADuIX9o9kGf8PpNq/z2NZP84eE7kN3dMnQAAAAAAAAAA////AP///wD///8A////AP///wD///8AAAAAAAAAAAA7hlxFPpNq/z+Uav8+k2r/On9U/jZ3SyUAAAAAAAAAAP///wD///8A////AP///wD///8A////AAAAAAAAAAAAO4leij6Sav8+k2r/PpNq/zuHXv82d0tSAAAAAAAAAAD///8A////AP///wD///8A////AP///wAAAAAAAAAAADuGXEFyr5L/wNzO/0mZc/87h13/N3dMIwAAAAAAAAAA////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAP4tifF2ee/9Vn3v+OYJYZQAAAAAAAAAAAAAAAP///wD///8A////AOAHAADgBwAA4AcAAOAHAADgBwAA+B8AAPw/AAD8PwAA/D8AAPw/AAD4HwAA+B8AAPgfAAD4HwAA+B8AAPw/AAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAARCwAAEQsAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8AAAAAAAAAAAA7hVsCO4ddaDuGXKk5f1W+N3dN0jd3Teo3d03+N3dN/zd3Tf83d03+N3dN6jd3TdI3d02sN3dNejd3TTs3d00BAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wA7hVsKPIlftj2QZvw+k2n/PpNp/z6Taf88iF7/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3TeE3d013N3dNBf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD2MYuY+k2n/PpNp/z6Taf8+k2n/PpNp/z6SaP83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d02v////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8APpJo/z6Taf8+k2n/PpNp/z6Taf8+k2n/PY9l/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3TfT///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wA7iF6WPpJo/z6Taf8+k2n/PpNp/z6Taf89kWf/OH5U/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d032N3dNW////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAA7hlxVPpJo/z6Taf8+k2n/PpNp/z6Taf8+kmj/OHpQ/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN9jd3TS0AAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAD2MYuY+k2n/PpNp/z6Taf8+k2n/PpNp/z6Taf87hVv/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dNpwAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAPI5k9D6Taf8+k2n/PpNp/z6Taf8+k2n/PpNp/z2MYv83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03LAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAA7h12BPpJo/z6Taf8+k2n/PpNp/z6Taf8+k2n/PZBm/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN9Dd3TU4AAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAA7hlwwPIpgwj2QZvw+k2n/PpNp/z6Taf8+k2n/N3hO/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN4zd3TYI3d00ZAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAO4VbCDuIXpM+kmj+PpNp/z6Taf84fVP/N3dN/zd3Tf83d03/N3dN8Dd3TVo3d00DAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADyJX7U+k2n/PpNp/zmBV/83d03/N3dN/zd3Tf83d012AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO4ZcSz6Taf8+k2n/OoVb/zd3Tf83d03/N3dN/zd3TSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7hVsCPpJo/z6Taf88iV//N3dN/zd3Tf83d031N3dNAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9j2X3PpNp/zyNY/83d03/N3dN/zd3TdIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2MYuY+k2n/PZFn/zd3Tf83d03/N3dNrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPIth1D6Taf8+k2n/N3lP/zd3Tf83d02WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8imDFPpNp/z6Taf84fFL/N3dN/zd3TYUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADyJX7I+k2n/PpNp/zl/Vf83d03/N3dNcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPIhenT6Taf8+k2n/OoJY/zd3Tf83d01gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAA7hVslPIhenDyKYM08jmTxPpNp/z6Taf88jWP/OYFX/zd3TcQ3d02ON3dNYDd3TRMAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAADyOZPM+k2n/PpNp/z6Taf8+k2n/PpNp/z6Taf8+k2n/OX9V/zd3Tf83d03/N3dNxgAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAPIlfuj6SaP4+k2n/PpNp/z6Taf8+k2n/PpNp/zyNY/84elD/N3dN/zd3TfI3d016AAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAO4VbBjyJX7o+k2n/PpNp/z6Taf8+kmj/OYBW/zd3Tf83d015N3dNAwAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAA7hVslPZFn/j6Taf8+k2n/PpNp/z6Taf8+k2n/OH5U/zd3Te83d00TAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAADyJX6s+k2n/PpNp/z6Taf8+k2n/PpNp/z6Taf88jmT/N3dN/zd3TW0AAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAPIth2T6Taf8+k2n/PpNp/z6Taf8+k2n/PpNp/z6Taf83e1H/N3dNmwAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAA9i2HcPpNp/z6Taf8+k2n/PpNp/z6Taf8+k2n/PpNp/zh+VP83d02fAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAADyJX7E+k2n/rdG//7TVxP9OnHX/PpNp/z6Taf8+k2n/OH1T/zd3TXIAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAO4ZcLj6SaP6Twqv///////D28/9nqoj/PpNp/z6SaP84eU/0N3dNFwAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO4hekEaXbv/I4NT/+/38/5TDqv8+k2n/PIpg/jd3TVcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO4ddbTyNY+8+kmj/PpJo/zyNY+45gFZSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP8AAP/8AAA//AAAP/wAAD/8AAA//gAAf/4AAH/+AAB//gAAf/8AAP//wAP///AP///wD///8A////gf///4H///+B////gf///4H///+B///8AD///AA///wAP//+AH///gB///4Af//+AH///gB///4Af//+AH///wD///+B//',
  235. unread: 'data:image/x-icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAAARCwAAEQsAAAAAAAAAAAAA////AP///wD///8AO4ZcPDuKYMw7i2HsN3xR8jZ2S/83d0z/N3dM9zd3TN83d0ytN3dMIP///wD///8A////AP///wD///8A////AD+SaP4+k2r/PpNq/zqEWv84d03/OHhN/zZ3S/83d0z/N3dM/zd3TO////8A////AP///wD///8A////AP///wA7iV7hPpNq/z6Tav8+jWT/N3hM/zh4Tf83d0z/N3dM/zh3Tf42dkvL////AP///wD///8A////AP///wD///8AO4heuj6Tav8+k2r/PpJq/zmAVv83d0z/N3dM/zh3Tf83d0z/NnZLm////wD///8A////AP///wD///8A////ADuGXCo7jGLhPpNq/z6Tav87hVv/OHdN/zd3TP84d037N3dMqjd3TBX///8A////AP///wD///8A////AP///wAAAAAAAAAAADuGXFw9kGf7PIlg/zh4Tf82dkvfNnZLGwAAAAAAAAAA////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAPYphzjyOZP83d0z/N3dMjwAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAADuIX6I/kmj/N3dL/zZ3S2UAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAA8h1+AP5Rq/zh5T/82d0tLAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAO4ddZT6Tav83fFH/NnZLOQAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AAAAAAAAAAAAPYphzjyPZvg+k2r/PI5k/zd5Ttk4d02PAAAAAAAAAAD///8A////AP///wD///8A////AP///wAAAAAAAAAAADuIX9o9kGf8PpNq/z2NZP84eE7kN3dMnQAAAAAAAAAA////AP///wD///8A////AP///wD///8AAAAAAAAAAAA7hlxFPpNq/z+Uav8+k2r/On9U/jZ3SyUAAAAAAAAAAP///wD///8A////AP///wD///8A////AAAAAAAAAAAAO4leij6Sav8+k2r/PpNq/zuHXv82d0tSAAAAAAAAAAD///8A////AP///wD///8A////AP///wAAAAAAAAAAADuGXEFyr5L/wNzO/0mZc/87h13/N3dMIwAAAAAAAAAA////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAP4tifF2ee/9Vn3v+OYJYZQAAAAAAAAAAAAAAAP///wD///8A////AOAHAADgBwAA4AcAAOAHAADgBwAA+B8AAPw/AAD8PwAA/D8AAPw/AAD4HwAA+B8AAPgfAAD4HwAA+B8AAPw/AAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAARCwAAEQsAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8AAAAAAAAAAAA7hVsCO4ddaDuGXKk5f1W+N3dN0jd3Teo3d03+N3dN/zd3Tf83d03+N3dN6jd3TdI3d02sN3dNejd3TTs3d00BAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wA7hVsKPIlftj2QZvw+k2n/PpNp/z6Taf88iF7/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3TeE3d013N3dNBf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD2MYuY+k2n/PpNp/z6Taf8+k2n/PpNp/z6SaP83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d02v////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8APpJo/z6Taf8+k2n/PpNp/z6Taf8+k2n/PY9l/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3TfT///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wA7iF6WPpJo/z6Taf8+k2n/PpNp/z6Taf89kWf/OH5U/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d032N3dNW////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAA7hlxVPpJo/z6Taf8+k2n/PpNp/z6Taf8+kmj/OHpQ/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN9jd3TS0AAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAD2MYuY+k2n/PpNp/z6Taf8+k2n/PpNp/z6Taf87hVv/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dNpwAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAPI5k9D6Taf8+k2n/PpNp/z6Taf8+k2n/PpNp/z2MYv83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03LAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAA7h12BPpJo/z6Taf8+k2n/PpNp/z6Taf8+k2n/PZBm/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN9Dd3TU4AAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAA7hlwwPIpgwj2QZvw+k2n/PpNp/z6Taf8+k2n/N3hO/zd3Tf83d03/N3dN/zd3Tf83d03/N3dN4zd3TYI3d00ZAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAO4VbCDuIXpM+kmj+PpNp/z6Taf84fVP/N3dN/zd3Tf83d03/N3dN8Dd3TVo3d00DAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADyJX7U+k2n/PpNp/zmBV/83d03/N3dN/zd3Tf83d012AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO4ZcSz6Taf8+k2n/OoVb/zd3Tf83d03/N3dN/zd3TSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7hVsCPpJo/z6Taf88iV//N3dN/zd3Tf83d031N3dNAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9j2X3PpNp/zyNY/83d03/N3dN/zd3TdIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2MYuY+k2n/PZFn/zd3Tf83d03/N3dNrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPIth1D6Taf8+k2n/N3lP/zd3Tf83d02WAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8imDFPpNp/z6Taf84fFL/N3dN/zd3TYUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADyJX7I+k2n/PpNp/zl/Vf83d03/N3dNcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPIhenT6Taf8+k2n/OoJY/zd3Tf83d01gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAA7hVslPIhenDyKYM08jmTxPpNp/z6Taf88jWP/OYFX/zd3TcQ3d02ON3dNYDd3TRMAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAADyOZPM+k2n/PpNp/z6Taf8+k2n/PpNp/z6Taf8+k2n/OX9V/zd3Tf83d03/N3dNxgAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAPIlfuj6SaP4+k2n/PpNp/z6Taf8+k2n/PpNp/zyNY/84elD/N3dN/zd3TfI3d016AAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAO4VbBjyJX7o+k2n/PpNp/z6Taf8+kmj/OYBW/zd3Tf83d015N3dNAwAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAA7hVslPZFn/j6Taf8+k2n/PpNp/z6Taf8+k2n/OH5U/zd3Te83d00TAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAADyJX6s+k2n/PpNp/z6Taf8+k2n/PpNp/z6Taf88jmT/N3dN/zd3TW0AAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAPIth2T6Taf8+k2n/PpNp/z6Taf8+k2n/PpNp/z6Taf83e1H/N3dNmwAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAA9i2HcPpNp/z6Taf8+k2n/PpNp/z6Taf8+k2n/PpNp/zh+VP83d02fAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAADyJX7E+k2n/rdG//7TVxP9OnHX/PpNp/z6Taf8+k2n/OH1T/zd3TXIAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAO4ZcLj6SaP6Twqv///////D28/9nqoj/PpNp/z6SaP84eU/0N3dNFwAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO4hekEaXbv/I4NT/+/38/5TDqv8+k2n/PIpg/jd3TVcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO4ddbTyNY+8+kmj/PpJo/zyNY+45gFZSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP8AAP/8AAA//AAAP/wAAD/8AAA//gAAf/4AAH/+AAB//gAAf/8AAP//wAP///AP///wD///8A////gf///4H///+B////gf///4H///+B///8AD///AA///wAP//+AH///gB///4Af//+AH///gB///4Af//+AH///wD///+B//',
  236. };
  237.  
  238. this.pixelMaps = {
  239. icons: {
  240. // TODO: Transparency
  241. 'unread':
  242. [["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#afc59b","#aac193","#6d9645","#c6d4bc","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#e1e8dc","#7ea159","#eef3e9","#67923a","#407119","#f5f8f7","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#b4c8a4","#59882a","#5c8a2e","#69933d","#507d29","#c7d4c1","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#f1f4f0","#598729","#69933e","#6c963e","#406f23","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#bcceac","#6a9342","#68933c","#608b39","#5b8149","#c1cfb9","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#7b9f5b","#5f8b35","#68933c","#638e39","#5b8247","#84a176","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#dce5d7","#5f8d2e","#3c6a23","#f6f8f5","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#c2d2b5","#618e30","#3b6924","#d8e1d3","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#b8cba7","#608d31","#3b6826","#c2d1bb","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#a9c192","#5d8932","#3f6c2a","#a2b897","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#fefeff","#608c35","#5e8939","#477232","#567e41","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#f7f9f7","#7da05c","#548324","#69943c","#5b853a","#4b7536","#497332","#38671f","#819f72","#ffffff","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#b0c59e","#5a882a","#69933d","#6c963e","#557f39","#4b7536","#4d7737","#4c7636","#36651d","#beceb7","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#bcceae","#5f8c31","#69933e","#66903d","#4a7436","#4c7636","#4d7737","#4c7636","#416e2a","#cdd8c7","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#40750c","#618d33","#68933b","#588238","#4b7536","#4c7636","#4b7535","#487331","#406d28","#2d5f14","#ffffff","#ffffff","#ffffff"],["#ffffff","#ffffff","#ffffff","#f3f6f2","#a8bf90","#799e58","#5b8346","#4b7535","#4c7636","#587f43","#759564","#a8bc9d","#ffffff","#ffffff","#ffffff","#ffffff"]]
  243. },
  244. numbers: [
  245. [
  246. [0,1,1,0],
  247. [1,0,0,1],
  248. [1,0,0,1],
  249. [1,0,0,1],
  250. [0,1,1,0]
  251. ],
  252. [
  253. [0,1,0],
  254. [1,1,0],
  255. [0,1,0],
  256. [0,1,0],
  257. [1,1,1]
  258. ],
  259. [
  260. [1,1,1,0],
  261. [0,0,0,1],
  262. [0,1,1,0],
  263. [1,0,0,0],
  264. [1,1,1,1]
  265. ],
  266. [
  267. [1,1,1,0],
  268. [0,0,0,1],
  269. [0,1,1,0],
  270. [0,0,0,1],
  271. [1,1,1,0]
  272. ],
  273. [
  274. [0,0,1,0],
  275. [0,1,1,0],
  276. [1,0,1,0],
  277. [1,1,1,1],
  278. [0,0,1,0]
  279. ],
  280. [
  281. [1,1,1,1],
  282. [1,0,0,0],
  283. [1,1,1,0],
  284. [0,0,0,1],
  285. [1,1,1,0]
  286. ],
  287. [
  288. [0,1,1,0],
  289. [1,0,0,0],
  290. [1,1,1,0],
  291. [1,0,0,1],
  292. [0,1,1,0]
  293. ],
  294. [
  295. [1,1,1,1],
  296. [0,0,0,1],
  297. [0,0,1,0],
  298. [0,1,0,0],
  299. [0,1,0,0]
  300. ],
  301. [
  302. [0,1,1,0],
  303. [1,0,0,1],
  304. [0,1,1,0],
  305. [1,0,0,1],
  306. [0,1,1,0]
  307. ],
  308. [
  309. [0,1,1,0],
  310. [1,0,0,1],
  311. [0,1,1,1],
  312. [0,0,0,1],
  313. [0,1,1,0]
  314. ],
  315. ]
  316. };
  317.  
  318. this.timer = setInterval(this.poll, 100);
  319. this.poll();
  320.  
  321. return true;
  322. }
  323.  
  324. // This breaks unless the parameter is a string
  325. this.drawNumberedIcon = function(number) {
  326. if (! (number instanceof String) ) {
  327. number = number.toString();
  328. }
  329. if(!self.textedCanvas) {
  330. self.textedCanvas = [];
  331. }
  332.  
  333. if(!self.textedCanvas[number]) {
  334. if (isDebugging()) { console.log("drawNumberedIcon(" + number + ")"); }
  335. var iconCanvas = getIconCanvas();
  336. var textedCanvas = document.createElement('canvas');
  337. textedCanvas.height = textedCanvas.width = iconCanvas.width;
  338. var ctx = textedCanvas.getContext('2d');
  339. ctx.drawImage(iconCanvas, 0, 0);
  340.  
  341. ctx.fillStyle = this.backgroundFillColour;
  342. ctx.strokeStyle = this.backgroundBorderColour;
  343. ctx.strokeWidth = 1;
  344.  
  345. var count = number.length;
  346. var bgHeight = self.pixelMaps.numbers[0].length;
  347. var bgWidth = 0;
  348. var padding = count > 2 ? 0 : 1;
  349.  
  350. for(var index = 0; index < count; index++) {
  351. bgWidth += self.pixelMaps.numbers[number[index]][0].length;
  352. if(index < count-1) {
  353. bgWidth += padding;
  354. }
  355. }
  356. bgWidth = bgWidth > textedCanvas.width-4 ? textedCanvas.width-4 : bgWidth;
  357.  
  358. ctx.fillRect(textedCanvas.width-bgWidth-4,2,bgWidth+4,bgHeight+4);
  359.  
  360. var digit;
  361. var digitsWidth = bgWidth;
  362. for(var index = 0; index < count; index++) {
  363. digit = number[index];
  364. if (self.pixelMaps.numbers[digit]) {
  365. var map = self.pixelMaps.numbers[digit];
  366. var height = map.length;
  367. var width = map[0].length;
  368.  
  369. ctx.fillStyle = this.digitColour;
  370.  
  371. for (var y = 0; y < height; y++) {
  372. for (var x = 0; x < width; x++) {
  373. if(map[y][x]) {
  374. ctx.fillRect(14- digitsWidth + x, y+4, 1, 1);
  375. }
  376. }
  377. }
  378.  
  379. digitsWidth -= width + padding;
  380. }
  381. }
  382.  
  383. ctx.strokeRect(textedCanvas.width-bgWidth-3.5,2.5,bgWidth+3,bgHeight+3);
  384.  
  385. self.textedCanvas[number] = textedCanvas;
  386.  
  387. if (isDebugging()) { console.log("drawNumberedIcon: Done making icon"); }
  388. }
  389.  
  390. return self.textedCanvas[number];
  391. }
  392.  
  393. var resetTimer = function(init) {
  394. var time = new Date().getTime();
  395. self.lastActivity = time;
  396. }
  397.  
  398. this.poll = function() {
  399.  
  400. var lastCount = getLastCount();
  401. var time = new Date().getTime();
  402. var count;
  403. if (self.foundCountAlready) {
  404. count = lastCount;
  405. if (isAutoReloadEnabled()) {
  406. // TODO: Maybe we shouldn't do this on explorer, analysis board, and a few other places
  407. var lastCountUpdateTime = getLastCountUpdateTime();
  408.  
  409. var refreshTime = lastCountUpdateTime + self.dataTimeout;
  410. if (self.lastActivity) {
  411. var inactivityRefreshTime = self.lastActivity + self.inactivityTimeout;
  412. if (inactivityRefreshTime > refreshTime) {
  413. refreshTime = inactivityRefreshTime;
  414. }
  415. }
  416. if (self.noReloadBefore) {
  417. if (self.noReloadBefore > refreshTime) {
  418. refreshTime = self.noReloadBefore;
  419. } else {
  420. // Some activity happened since this was set, so clear it and pick a new one next time
  421. self.noReloadBefore = undefined;
  422. }
  423. }
  424. var time = new Date().getTime();
  425. if (isDebugging()) {
  426. var d = new Date(refreshTime);
  427. var formattedTime = d.getUTCHours() + ":" + (d.getUTCMinutes() < 10 ? "0" : "") + d.getUTCMinutes();
  428. if (self.noReloadBefore) {
  429. formattedTime += ":" + (d.getUTCSeconds() < 10 ? "0" : "") + d.getUTCSeconds()
  430. } else {
  431. formattedTime += " (ish)";
  432. }
  433. if (!self.lastDebugTime || self.lastDebugTime != formattedTime) {
  434. self.lastDebugTime = formattedTime;
  435. console.log("poll: Will reload page at " + formattedTime);
  436. }
  437. }
  438. if (time > refreshTime) {
  439. if (isDebugging()) { console.log("poll: Page reload timeout passed after " + ((self.pageLoadTime - time)/1000) + "sec"); }
  440. if ( self.noReloadBefore ) {
  441. // We already did a random period, and passed it, so we can reload now
  442. self.noReloadBefore = undefined; // Probably unneeded, we'll lose this after the reload
  443. location.reload();
  444. } else {
  445. // If we massively overshot the refresh time, it's possible that this machine was suspended
  446. // (which is why we didn't get woken up)
  447. // That can be a problem - often the CPU becomes active several seconds before the network, and so if we
  448. // immediately reload, we will get an error
  449.  
  450. // Also, we don't want tabs all piling up and reloading at the same moment
  451. // We therefore wait some extra random time before refreshing
  452. self.noReloadBefore = time + reloadRandomizationMin + Math.ceil((reloadRandomizationMax-reloadRandomizationMin)*Math.random());
  453. }
  454.  
  455. }
  456. }
  457. } else {
  458. searchElement = findSearchElement();
  459. if(!searchElement) {
  460. if (isDebugging()) { console.log("poll: Search element not found, using last value"); }
  461. count = lastCount;
  462. } else {
  463. if (isDebugging()) { console.log("poll: Found search element"); }
  464. var lastCountUpdateTime = getLastCountUpdateTime();
  465. if (lastCountUpdateTime && lastCountUpdateTime > time) {
  466. if (isDebugging()) { console.log("poll: Stored count more recent"); }
  467. // Some other page got a more up to date value
  468. count = lastCount;
  469. } else {
  470. count = getCount();
  471. if (count !== lastCount) {
  472. if (isDebugging()) { console.log("Count updated to: " + count); }
  473. setLastCount(count);
  474. setLastCountChangeTime(time);
  475. }
  476. setLastCountUpdateTime(time);
  477. }
  478. self.foundCountAlready = true;
  479. }
  480. }
  481. var displayCountIcon;
  482. if (count == 0 || !showCount()) {
  483. displayCountIcon = false;
  484. } else {
  485. var lastCountChangeTime = getLastCountChangeTime();
  486. if (isFlashIconEnabled() && (time - lastCountChangeTime) < self.flashPeriod && (!self.lastActivity || self.lastActivity < lastCountTime)) {
  487. displayCountIcon = (0 == (Math.floor(time / 1000) % 2));
  488. } else {
  489. displayCountIcon = true;
  490. }
  491. }
  492. if(displayCountIcon) {
  493. setIcon(self.drawNumberedIcon(count).toDataURL('image/png'));
  494. } else {
  495. setIcon(self.icons.read);
  496. }
  497. if (isTitleUpdatedEnabled()) {
  498. if (count === 0) {
  499. document.title = self.pageTitle;
  500. } else {
  501. document.title = "(" + count + ") " + self.pageTitle;
  502. }
  503. }
  504. }
  505.  
  506.  
  507. this.toString = function() { return '[object ChessDotComFavIconAlerts]'; }
  508. this.pageLoadTime = new Date().getTime();
  509. this.pageTitle = document.title;
  510. window.addEventListener('mousemove', resetTimer);
  511. window.addEventListener('click', resetTimer);
  512. window.addEventListener('onkeypress', resetTimer);
  513. if (isDebugging()) { console.log("Done creating ChessDotComFavIconAlerts"); } ;
  514. return this.construct();
  515. }