1. //   Opera UserJS - Countdown script for forumwarz.com
  2. //   This will place the countdown timer into the title
  3. //   Author: TT
  4. //   v1.4.0
  5.  
  6. //set these variables for the 'options'
  7. var useShort=true; //set to false if you prefer long string as title
  8. var useExShort=false; //only uses biggest value (e.g. days only when at least one remains). trumps useShort.
  9. var spacer=''; //default is a 'nothing' for the spacer. use ' ' for a space
  10. var useZeros=false; //show 0 days/hours/minutes as '0' instead of excluding them
  11. var trackIncit=true;
  12. var trackDomination=true;
  13. var trackAuctions=true;
  14. var trackVisits=true; // track time until visits reload (also deliveries) on /character/me
  15. var trackItemBuildr=true;
  16. var trackForumBuildr=true;
  17. var debug=false; // if there is a problem, you can look at the debug log with javascript:dbg() in address bar
  18. var debugVerbose=false; // use with caution as this stores strings that are used in loops and can eat memory
  19.  
  20. // !!! DO NOT EDIT BELOW THIS UNLESS YOU KNOW WHAT YOU ARE DOING !!!
  21.  
  22. var orgTitle = document.title;
  23. var URL = document.location.href;
  24. var isDom = URL.indexOf('forumwarz.com/domination') != -1;
  25. var isIncit = URL.indexOf('forumwarz.com/incit') != -1;
  26. var isAuc = URL.indexOf('forumwarz.com/auctions') != -1;
  27. var isCharMe = URL.indexOf('forumwarz.com/characters/me') != -1;
  28. var isIB = URL.indexOf('forumwarz.com/item_buildr') != -1;
  29. var isFB = URL.indexOf('forumwarz.com/forum_buildr') != -1;
  30. var tArray = new Array(4);
  31. var fCD;
  32. var type = ['day','hour','minute','second'];
  33. var source;
  34.  
  35. if (debug) document.title = 'Script loaded...';
  36. if (debug) var debugStr = 'Debug started.';
  37. else var debugStr = 'Enable debugging jackass';
  38. //var counts = 1;
  39.  
  40. window.opera.addEventListener(
  41.     'afterscript', //we definitely want scripts loaded first
  42.     function (e) { //only enter main if we are on a proper page and the countdown script loaded
  43.         source = e.element.getAttribute('src');
  44.         if (source != null){
  45.             if( source.indexOf('countdown.js') != -1 && (
  46.                 (isDom && trackDomination) ||
  47.                 (isIncit && trackIncit) ||
  48.                 (isAuc && trackAuctions) ||
  49.                 (isCharMe && trackVisits) ||
  50.                 (isIB && trackItemBuildr) ||
  51.                 (isFB && trackForumBuildr)
  52.             )){
  53.                 debugAdd('CD script loaded. Loading CD check.',false);
  54.                 setTimeout('checkForCountdown()', 1000); //give it 1 second for safety
  55.             }
  56.         }
  57.     },
  58.     false
  59. );
  60.  
  61.  
  62. function checkForCountdown(){ //TODO add end of timer check here or maybe main()
  63.     if(document.getElementById('countdown') != null){
  64.         debugAdd('Found CD element. Entering main',false);
  65.         main(); //countdown element is not empty. enter main
  66.     }else{
  67.         debugAdd('Element not ready. Looping...',true);
  68.         setTimeout('checkForCountdown()', 1000); //else loop
  69.     }
  70. }
  71.  
  72.  
  73. //our main function that calls itself (loop)
  74. function main() {
  75.     if(document.getElementById('countdown') == null){
  76.         debugAdd('Element disappeared... Loop til found.',true);
  77.         document.title=orgTitle;
  78.         setTimeout('main()',1000); //keep retrying in a new thread
  79.         return; //exit this thread
  80.     } else if (document.getElementById('countdown').childNodes.length == 0) {
  81.         debugAdd('No children. Having secks again...',true);
  82. //      alert('caught ya bitch!');
  83.         setTimeout('main()',1000); //keep retrying in a new thread
  84.         return; //exit this thread
  85.     }
  86.     debugAdd('Entered main successfully.',true);
  87.    
  88.     fCD = document.getElementById('countdown').firstChild.nodeValue; //full countdown
  89.     debugAdd('Set fCD.',true);
  90.     var newTitle = ''; //start out new title variable as empty
  91.    
  92.     if(isIncit && trackIncit){ //INCIT specific code for voting page notify!
  93.         if(fCD.indexOf('ends') != -1) newTitle = 'VOTING!' + spacer;
  94.     }
  95.    
  96.     if(useShort || useExShort || useZeros){
  97.         debugAdd('Running getTimes.',true);
  98.         getTimes();
  99.         for (i=0;i<tArray.size();i++){
  100.             if ( (tArray[i] > 0 || useZeros) && (tArray[i] > 0 || !useExShort) ) newTitle += tArray[i] + type[i].substr(0,1) + spacer;
  101.             if (tArray[i] > 0 && useExShort) break; //break loop after first non-zero
  102.         }
  103.     } else {
  104.         debugAdd('Fallback. Failed to get times.',true);
  105.         newTitle=fCD; //no match. use full countdown string
  106.     }
  107.  
  108.    
  109.     if(isIncit && trackIncit){ //INCIT specific code
  110.         debugAdd('INCIT Shit...',true);
  111.         var submissions = document.getElementById('submissions_received');
  112.         if(submissions!=undefined){ //for when it's not loaded yet
  113.             submissions = submissions.innerHTML.split(' ',1); //first chars (number)
  114.             if(submissions[0] > 0){
  115.                 newTitle += submissions[0] + 'sub' + spacer; //append number + 'sub' to new title
  116.             }
  117.             debugAdd('Finished sub add code.',true);
  118.         }
  119.  
  120.         var links = document.getElementsByTagName('a'); //grab all links
  121.         var ass = '0'; //initialize 'ass'
  122.         for(i=0;i<60;i++){ //should be the 47th link, but we will search this range if links change
  123.             if (links[i].text.indexOf('Assholes Online') != -1){ //find 'Assholes Online' link text
  124.                 ass = links[i].text.split(' ',1); //grab first chars (number)
  125.                 newTitle += spacer + ass[0] + 'ass' + spacer; //append number + 'ass' to new title
  126.                 break; //exit loop. we only need one match. I got two for some reason...
  127.             }
  128.         }
  129.         debugAdd('Finished ass add code.',true);
  130.     }
  131.  
  132.     if (!newTitle) newTitle = '...'; //Opera defaults to URL if the title is empty... big nono there.
  133.     document.title=newTitle; //finally, set the new title
  134.     debugAdd('Title set. Looping...',true);
  135.     setTimeout('main()', 1000); //loop main with delay
  136. }
  137.  
  138.  
  139. function getTimes(){
  140.     var offset;
  141.     for (i=0;i<type.size();i++){
  142.         offset = fCD.indexOf(type[i]);
  143.         tArray[i] = offset != -1 ? fCD.substr(fCD.indexOf('',offset-3), 2).strip(' ') : 0;
  144.     }
  145. }
  146.  
  147. function debugAdd(str,verbose){
  148.     if (debug && (!verbose || debugVerbose)) debugStr += '\n' + str;
  149. }
  150.  
  151. function dbg(){
  152.     alert(debugStr);
  153. }