Saturday, January 22, 2011

Frontier Ville and Treasure Island Wall Manager


// ==UserScript==
// @name           FrontierVille and TreasureIsle Wall Manager
// @description    Manages FrontierVille and TreasureIsle wall posts
// @include        http*://*.facebook.com/*?sk=fl_*
// @include        http*://*.facebook.com/*?ref=home
// @include        http*://*.facebook.com/*?filter=*
// @include        http*://*.facebook.com/*games*ap=1
// @include        http*://*.facebook.com/
// @include        http*://*.facebook.com/*?*sk=lf*
// @include        http*://*.facebook.com/*?*sk=nf*
// @include        http*://*.facebook.com/*?*sk=cg*
// @exclude        http*://*.facebook.com/*?sk=messages*
// @exclude        http*://*.facebook.com/*?sk=events*
// @exclude        http*://*.facebook.com/*?sk=media*
// @exclude        http*://*.facebook.com/*?sk=ru*
// @exclude        http*://*.facebook.com/reqs.php*
// @license        http://creativecommons.org/licenses/by-nc-nd/3.0/us/
// @version        1.3.109
// @copyright      Joe Simmons and Charlie Ewing
// @require        http://userscripts.org/scripts/source/29910.user.js 
// @require        http://sizzlemctwizzle.com/updater.php?id=86674&days=1
// ==/UserScript== 

// Based on script built by Joe Simmons in Farmville Wall Manager
// New TI and FrV related script by Charlie Ewing

// Having problems with script leaving tabs or windows open after its done?
//   1. Go to address bar and type about:config
//   2. Go to parameter dom.allow_scripts_to_close_windows
//   3. Set its value as true

// @include        http://fb-0.cityville.zynga.com/Reward.php?*

(function() { 

 var version = "1.3.109";

 Array.prototype.inArray = function(value) {
  for(var i=this.length-1; i>=0; i--) {
   if(this[i]==value) return true;
  }
  return false;
 };

 Array.prototype.inArrayWhere = function(value) {
  for(var i=0,l=this.length; i<l; i++) {
   if(this[i]==value) return i;
  }
  return false;
 };

 String.prototype.find = function(s) {
  return (this.indexOf(s) != -1);
 };

 String.prototype.startsWith = function(s) {
  return (this.substring(0, s.length) == s);
 };
 
 // special circumstance checking for later versions
 //var exceptionCV = "http://fb-0.cityville.zynga.com/Reward.php?";


 // dont run in frames, prevents detection and misuse of unsafewindow
 try {
  var unsafeWindow = unsafeWindow || window.wrappedJSObject || window;
  if(unsafeWindow.frameElement != null) return;
 } catch(e) {}

 var imgs = {
  bgold : "http://i45.tinypic.com/raq4x3.png",
  bg : "http://oi40.tinypic.com/34s0aba.jpg",
  logo : "http://i54.tinypic.com/3130mmg.png",
  icon : "http://i56.tinypic.com/s46edh.jpg"
 };

 // Get is Greasemonkey running
 var isGM = (typeof GM_getValue != 'undefined' && typeof GM_getValue('a', 'b') != 'undefined');

 // Get ID
 function $(ID,root) {return (root||document).getElementById(ID);}

 // Add GM_addStyle if we're not in FireFox
 var GM_addStyle = function(css) {
         var head = document.getElementsByTagName('head')[0], style = document.createElement('style');
         if(head) {
          style.type = 'text/css';
          try {style.innerHTML = css} catch(x) {style.innerText = css}
          head.appendChild(style);
  }
     };

 // alignCenter by JoeSimmons
 // Instructions: Supply an id string or node element as a first argument
 function alignCenter(e) {
  var node = (typeof e=='string') ? document.getElementById(e) : ((typeof e=='object') ? e : false);
  if(!window || !node || !node.style) {return;}
  var style = node.style, beforeDisplay = style.display, beforeOpacity = style.opacity;
  if(style.display=='none') style.opacity='0';
  if(style.display!='') style.display = '';
  style.top = Math.floor((window.innerHeight/2)-(node.offsetHeight/2)) + 'px';
  style.left = Math.floor((window.innerWidth/2)-(node.offsetWidth/2)) + 'px';
  style.display = beforeDisplay;
  style.opacity = beforeOpacity;
 }

 // Fade by JoeSimmons. Fade in/out by id and choose speed: slow, medium, or fast
 // Syntax: fade('idhere', 'out', 'medium');
 function fade(e, dir, s) {
  if(!e || !dir || typeof dir!='string' || (dir!='out'&&dir!='in')) {return;} // Quit if node/direction is omitted, direction isn't in/out, or if direction isn't a string
  dir=dir.toLowerCase(); s=s.toLowerCase(); // Fix case sensitive bug
  var node = (typeof e=='string') ? $(e) : e, speed = {slow : 400, medium : 200, fast : 50};
  if(!s) var s='medium'; // Make speed medium if not specified
  if(s!='slow' && s!='medium' && s!='fast') s='medium'; // Set speed to medium if specified speed not supported
  if(dir=='in') node.style.opacity = '0';
  else if(dir=='out') node.style.opacity = '1';
  node.style.display='';
  var intv = setInterval(function(){
   if(dir=='out') {
    if(parseFloat(node.style.opacity)>0) node.style.opacity = (parseFloat(node.style.opacity)-.1).toString();
    else {
     clearInterval(intv);
     node.style.display='none';
    }
   }
   else if(dir=='in') {
    if(parseFloat(node.style.opacity)<1) node.style.opacity = (parseFloat(node.style.opacity)+.1).toString();
    else {
     clearInterval(intv);
    }
   }
  }, speed[s]);
 }

 // $g by JoeSimmons. Supports ID, Class, and XPath (full with types) in one query
 // Supports multiple id/class grabs in one query (split by spaces), and the ability to remove all nodes regardless of type
 // See script page for syntax examples: http://userscripts.org/scripts/show/51532
 function $g(que, O) {
  if(!que||typeof(que)!='string'||que==''||!(que=que.replace(/^\s+/,''))) return false;
  var obj=O||({del:false,type:6,node:document}), r, t,
   idclass_re=/^[#\.](?!\/)[^\/]/, xp_re=/^\.?(\/{1,2}|count|id)/;
  if(idclass_re.test(que)) {
   var s=que.split(' '), r=new Array(), c;
   for(var n=0; n<s.length; n++) {
    switch(s[n].substring(0,1)) {
     case '#': r.push(document.getElementById(s[n].substring(1))); break;
     case '.': c=document.getElementsByClassName(s[n].substring(1));
        if(c.length>0) for(var i=0; i<c.length; i++) r.push(c[i]); break;
    }
   }
   if(r.length==1) r=r[0];
  } else if(xp_re.test(que)) {
   r = (obj['doc']||document).evaluate(que,(obj['node']||document),null,((t=obj['type'])||6),null);
   if(typeof t=="number" && /[12389]/.test(t)) r=r[(t==1?"number":(t==2?"string":(t==3?"boolean":"singleNode")))+"Value"];
  }
  if(r && obj['del']===true) {
   if(r.nodeType==1) r.parentNode.removeChild(r);
   else if(r.snapshotItem) for(var i=r.snapshotLength-1; (item=r.snapshotItem(i)); i--) item.parentNode.removeChild(item);
   else if(!r.snapshotItem) for(var i=r.length-1; i>=0; i--) if(r[i]) r[i].parentNode.removeChild(r[i]);
  } return r;
 }

 //Returns the value of property p from element e
 //e must be an element object
 function getPropertyFromElement(e, p) {
  if(e==null) return "error: element is null";
  //main.debug(e.innerHTML + ", " + p);
  return e.innerHTML.split(p+"=\"")[1].split("\"")[0];
 }

 // GM_config by JoeSimmons/sizzlemctwizzle/izzysoft
 var GM_config = {
   storage: 'GM_config', // This needs to be changed to something unique for localStorage

   init: function() {
          // loop through GM_config.init() arguements
   for(var i=0,l=arguments.length,arg; i<l; ++i) {
    arg=arguments[i];
    switch(typeof arg) {
                case 'object': for(var j in arg) { // could be a callback functions or settings object
      switch(j) {
       case "open": GM_config.onOpen=arg[j]; delete arg[j]; break; // called when frame is gone
       case "close": GM_config.onClose=arg[j]; delete arg[j]; break; // called when settings have been saved
       case "save": GM_config.onSave=arg[j]; delete arg[j]; break; // store the settings objects
       default: var settings = arg;
      }
      } break;
                case 'function': GM_config.onOpen = arg; break; // passing a bare function is set to open
                          // could be custom CSS or the title string
     case 'string': if(arg.indexOf('{')!=-1&&arg.indexOf('}')!=-1) var css = arg;
      else GM_config.title = arg;
      break;
     }
    }
    if(!GM_config.title) GM_config.title = 'Settings - Anonymous Script'; // if title wasn't passed through init()
    var stored = GM_config.read(); // read the stored settings
    GM_config.passed_values = {};
    for (var i in settings) {
     GM_config.doSettingValue(settings, stored, i, null, false);
     if(settings[i].kids) for(var kid in settings[i].kids) GM_config.doSettingValue(settings, stored, kid, i, true);
    }
    GM_config.values = GM_config.passed_values;
    GM_config.settings = settings;
    if (css) GM_config.css.stylish = css;
   },

   open: function() {
    if(document.evaluate("//iframe[@id='GM_config']",document,null,9,null).singleNodeValue) return;
   // Create frame
   document.body.appendChild((GM_config.frame=GM_config.create('iframe',{id:'GM_config', style:'position:fixed; top:0; left:0; opacity:0; display:none; z-index:999; width:75%; height:75%; max-height:95%; max-width:95%; border:1px solid #000000; overflow:auto;'})));
          GM_config.frame.src = 'about:blank'; // In WebKit src cant be set until it is added to the page
   GM_config.frame.addEventListener('load', function(){
    var obj = GM_config, frameBody = this.contentDocument.getElementsByTagName('body')[0], create=obj.create, settings=obj.settings;
    obj.frame.contentDocument.getElementsByTagName('head')[0].appendChild(create('style',{type:'text/css',textContent:obj.css.basic+obj.css.stylish}));

    // Add header and title
    frameBody.appendChild(create('div', {id:'header',className:'config_header block center', innerHTML:obj.title}));

    // Append elements
    var anch = frameBody, secNo = 0; // anchor to append elements
    for (var i in settings) {
     var type, field = settings[i], value = obj.values[i];
     if (field.section) {
      anch = frameBody.appendChild(create('div', {className:'section_header_holder', id:'section_'+secNo, kids:new Array(
         create('a', {className:'section_header center', href:"javascript:void(0);", id:'c_section_kids_'+secNo, textContent:field.section[0], onclick:function(){GM_config.toggle(this.id.substring(2));}}),
         create('div', {id:'section_kids_'+secNo, className:'section_kids', style:obj.getValue('section_kids_'+secNo, "none")=="none"?"display: none;":""})
        )}));
      if(field.section[1]) anch.appendChild(create('p', {className:'section_desc center',innerHTML:field.section[1]}));
      secNo++;
     }
     anch.childNodes[1].appendChild(GM_config.addToFrame(field, i, false));
    }

    // Add save and close buttons
    frameBody.appendChild(obj.create('div', {id:'buttons_holder', kids:new Array(
     obj.create('button',{id:'saveBtn',textContent:'Save',title:'Save options and close window',className:'saveclose_buttons',onclick:function(){GM_config.close(true)}}),
     obj.create('button',{id:'cancelBtn', textContent:'Cancel',title:'Close window',className:'saveclose_buttons',onclick:function(){GM_config.close(false)}}),
     obj.create('div', {className:'reset_holder block', kids:new Array(
      obj.create('a',{id:'resetLink',textContent:'Restore to default',href:'#',title:'Restore settings to default configuration',className:'reset',onclick:obj.reset})
    )}))}));

    obj.center(); // Show and center it
    window.addEventListener('resize', obj.center, false); // Center it on resize
    if (obj.onOpen) obj.onOpen(); // Call the open() callback function
  
    // Close frame on window close
    window.addEventListener('beforeunload', function(){GM_config.remove(this);}, false);
   }, false);
   },

   close: function(save) {
   if(save) {
    var type, fields = GM_config.settings, typewhite=/radio|text|hidden|checkbox/;
    for(f in fields) {
     var field = GM_config.frame.contentDocument.getElementById('field_'+f), kids=fields[f].kids;
     if(!field.className.find("separator")) {
      if(typewhite.test(field.type)) type=field.type;
      else type=field.tagName.toLowerCase();
      GM_config.doSave(f, field, type);
      if(kids) for(var kid in kids) {
       var field = GM_config.frame.contentDocument.getElementById('field_'+kid);
       if(typewhite.test(field.type)) type=field.type;
       else type=field.tagName.toLowerCase();
       GM_config.doSave(kid, field, type, f);
      }
     }
    }
                  if(GM_config.onSave) GM_config.onSave(); // Call the save() callback function
                  GM_config.save();
   }
   if(GM_config.frame) GM_config.remove(GM_config.frame);
   delete GM_config.frame;
          if(GM_config.onClose) GM_config.onClose(); //  Call the close() callback function
   },

   set: function(name,val) {GM_config.values[name] = val;},

  get: function(name) {return GM_config.values[name];},

   isGM: typeof GM_getValue != 'undefined' && typeof GM_getValue('a', 'b') != 'undefined',

   log: (this.isGM) ? GM_log : ((window.opera) ? opera.postError : console.log),

   getValue : function(name, def) { return (this.isGM?GM_getValue:(function(name,def){return localStorage.getItem(name)||def}))(name, def||""); },

   setValue : function(name, value) { return (this.isGM?GM_setValue:(function(name,value){return localStorage.setItem(name,value)}))(name, value||""); },

   save: function(store, obj) {
       try {
          var val = JSON.stringify(obj||GM_config.values);
          GM_config.setValue((store||GM_config.storage),val);
       } catch(e) {
          GM_config.log("GM_config failed to save settings!");
       }
   },

   read: function(store) {
       try {
          var val = GM_config.getValue((store||GM_config.storage), '{}'), rval = JSON.parse(val);
       } catch(e) {
          GM_config.log("GM_config failed to read saved settings!");
          rval = {};
       }
       return rval;
   },

   reset: function(e) {
   e.preventDefault();
   var type, obj = GM_config, fields = obj.settings;
   for(f in fields) {
    var field = obj.frame.contentDocument.getElementById('field_'+f), kids=fields[f].kids;
    if(field.type=='radio'||field.type=='text'||field.type=='checkbox') type=field.type;
    else type=field.tagName.toLowerCase();
    GM_config.doReset(field, type, null, f, null, false);
    if(kids) for(var kid in kids) {
     var field = GM_config.frame.contentDocument.getElementById('field_'+kid);
     if(field.type=='radio'||field.type=='text'||field.type=='checkbox') type=field.type;
     else type=field.tagName.toLowerCase();
     GM_config.doReset(field, type, f, kid, true);
    }
   }
   },

   addToFrame : function(field, i, k) {
   var elem, obj = GM_config, anch = GM_config.frame, value = obj.values[i], Options = field.options, label = field.label, create=GM_config.create, isKid = k!=null && k===true;
   switch(field.type) {
    case 'separator': elem = create("span", {textContent:label, id:'field_'+i, className:'field_label separator'});
     break;
    case 'textarea':
     elem = create(isKid ? "span" : "div", {title:field.title||'', kids:new Array(
      create('span', {textContent:label, className:'field_label'}),
      create('textarea', {id:'field_'+i,innerHTML:value, cols:(field.cols?field.cols:20), rows:(field.rows?field.rows:2)})
     ), className: 'config_var'});
     break;
    case 'radio':
     var boxes = new Array();
     for (var j = 0,len = Options.length; j<len; j++) {
      boxes.push(create('span', {textContent:Options[j]}));
      boxes.push(create('input', {value:Options[j], type:'radio', name:i, checked:Options[j]==value?true:false}));
     }
     elem = create(isKid ? "span" : "div", {title:field.title||'', kids:new Array(
      create('span', {textContent:label, className:'field_label'}),
      create('span', {id:'field_'+i, kids:boxes})
     ), className: 'config_var'});
     break;
    case 'select':
     var options = new Array();
     if(!Options.inArray) for(var j in Options) options.push(create('option',{textContent:Options[j],value:j,selected:(j==value)}));
      else options.push(create("option", {textContent:"Error - options needs to be an object type, not an array.",value:"error",selected:"selected"}));
     elem = create(isKid ? "span" : "div", {title:field.title||'', kids:new Array(
      create('span', {textContent:label, className:'field_label'}),
      create('select',{id:'field_'+i, kids:options})
     ), className: 'config_var'});
     break;
    case 'checkbox':
     elem = create(isKid ? "span" : "div", {title:field.title||'', kids:new Array(
      create('label', {textContent:label, className:'field_label', "for":'field_'+i}),
      create('input', {id:'field_'+i, type:'checkbox', value:value, checked:value})
     ), className: 'config_var'});
     break;
    case 'button':
     var tmp;
     elem = create(isKid ? "span" : "div", {kids:new Array(
      (tmp=create('input', {id:'field_'+i, type:'button', value:label, size:(field.size?field.size:25), title:field.title||''}))
     ), className: 'config_var'});
     if(field.script) obj.addEvent(tmp, 'click', field.script);
     break;
    case 'hidden':
     elem = create(isKid ? "span" : "div", {title:field.title||'', kids:new Array(
      create('input', {id:'field_'+i, type:'hidden', value:value})
     ), className: 'config_var'});
     break;
    default:
     elem = create(isKid ? "span" : "div", {title:field.title||'', kids:new Array(
      create('span', {textContent:label, className:'field_label'}),
      create('input', {id:'field_'+i, type:'text', value:value, size:(field.size?field.size:25)})
     ), className: 'config_var'});
   }
   if(field.kids) {
    var kids=field.kids;
    for(var kid in kids) elem.appendChild(GM_config.addToFrame(kids[kid], kid, true));
   }
   return elem;
  },

   doSave : function(f, field, type, oldf) {
    var isNum=/^[\d\.]+$/, set = oldf ? GM_config.settings[oldf]["kids"] : GM_config.settings;
    switch(type) {
    case 'text':
     GM_config.values[f] = ((set[f].type=='text') ? field.value : ((isNum.test(field.value) && ",int,float".indexOf(","+set[f].type)!=-1) ? parseFloat(field.value) : false));
     if(set[f]===false) {
      alert('Invalid type for field: '+f+'\nPlease use type: '+set[f].type);
      return;
     }
     break;
    case 'hidden':
     GM_config.values[f] = field.value.toString();
     break;
    case 'textarea':
     GM_config.values[f] = field.value;
     break;
    case 'checkbox':
     GM_config.values[f] = field.checked;
     break;
    case 'select':
     GM_config.values[f] = field[field.selectedIndex].value;
     break;
    case 'span':
     var radios = field.getElementsByTagName('input');
     if(radios.length>0) for(var i=radios.length-1; i>=0; i--) {
      if(radios[i].checked) GM_config.values[f] = radios[i].value;
     }
     break;
   }
   },

   doSettingValue : function(settings, stored, i, oldi, k) {
   var set = k!=null && k==true && oldi!=null ? settings[oldi]["kids"][i] : settings[i];
   if(",save,open,close".indexOf(","+i) == -1) {
               // The code below translates to:
               // if a setting was passed to init but wasn't stored then 
               //      if a default value wasn't passed through init() then use null
               //      else use the default value passed through init()
               //   else use the stored value
               try {
                var value = (stored[i]==null || typeof stored[i]=="undefined") ? ((set["default"]==null || typeof set["default"]=="undefined") ? null : (set["default"])) : stored[i];
    } catch(e) {
     var value = stored[i]=="undefined" ? (set["default"]=="undefined" ? null : set["default"]) : stored[i];
    }
            
               // If the value isn't stored and no default was passed through init()
               // try to predict a default value based on the type
               if (value === null) {
                   switch(set["type"]) {
                        case 'radio': case 'select':
                            value = set.options[0]; break;
                        case 'checkbox':
                            value = false; break;
                        case 'int': case 'float':
                            value = 0; break;
                        default:
       value = (typeof stored[i]=="function") ? stored[i] : "";
                   }
    }
   
   }
   GM_config.passed_values[i] = value;
   },

   doReset : function(field, type, oldf, f, k) {
    var isKid = k!=null && k==true, obj=GM_config,
     set = isKid ? obj.settings[oldf]["kids"][f] : obj.settings[f];
    switch(type) {
    case 'text':
     field.value = set['default'] || '';
     break;
    case 'hidden':
     field.value = set['default'] || '';
     break;
    case 'textarea':
     field.value = set['default'] || '';
     break;
    case 'checkbox':
     field.checked = set['default'] || false;
     break;
    case 'select':
     if(set['default']) {
      for(var i=field.options.length-1; i>=0; i--)
       if(field.options[i].value==set['default']) field.selectedIndex=i;
     }
     else field.selectedIndex=0;
     break;
    case 'span':
     var radios = field.getElementsByTagName('input');
     if(radios.length>0) for(var i=radios.length-1; i>=0; i--) {
      if(radios[i].value==set['default']) radios[i].checked=true;
     }
     break;
   }
   },

  values: {},

  settings: {},

   css: {
    basic: 'body {background:#FFFFFF;}\n' +
    '.indent40 {margin-left:40%;}\n' +
    '* {font-family: arial, tahoma, sans-serif, myriad pro;}\n' +
    '.field_label {font-weight:bold; font-size:12px; margin-right:6px;}\n' +
    '.block {display:block;}\n' +
    '.saveclose_buttons {\n' +
    'margin:16px 10px 10px 10px;\n' +
    'padding:2px 12px 2px 12px;\n' +
    '}\n' +
    '.reset, #buttons_holder, .reset a {text-align:right; color:#000000;}\n' +
    '.config_header {font-size:20pt; margin:0;}\n' +
    '.config_desc, .section_desc, .reset {font-size:9pt;}\n' +
    '.center {text-align:center;}\n' +
    '.section_header_holder {margin-top:8px;}\n' +
    '.config_var {margin:0 0 4px 0; display:block;}\n' +
    '.section_header {font-size:13pt; background:#414141; color:#FFFFFF; border:1px solid #000000; margin:0;}\n' +
    '.section_desc {font-size:9pt; background:#EFEFEF; color:#575757; border:1px solid #CCCCCC; margin:0 0 6px 0;}\n' +
    'input[type="radio"] {margin-right:8px;}',
    stylish: ''
  },

   create: function(a,b) {
   var ret=window.document.createElement(a);
   if(b) for(var prop in b) {
    if(prop.indexOf('on')==0) ret.addEventListener(prop.substring(2),b[prop],false);
    else if(prop=="kids" && (prop=b[prop])) for(var i=0; i<prop.length; i++) ret.appendChild(prop[i]);
    else if(",style,accesskey,id,name,src,href,for".indexOf(","+prop.toLowerCase())!=-1) ret.setAttribute(prop, b[prop]);
    else ret[prop]=b[prop];
   }
   return ret;
   },
 
  center: function() {
   var node = GM_config.frame, style = node.style, beforeOpacity = style.opacity;
   if(style.display=='none') style.opacity='0';
   style.display = '';
   style.top = Math.floor((window.innerHeight/2)-(node.offsetHeight/2)) + 'px';
   style.left = Math.floor((window.innerWidth/2)-(node.offsetWidth/2)) + 'px';
   style.opacity = '1';
   },

   run: function() {
       var script=GM_config.getAttribute('script');
       if(script && typeof script=='string' && script!='') {
          func = new Function(script);
          window.setTimeout(func, 0);
       }
   },

   addEvent: function(el,ev,scr) { el.addEventListener(ev, function() { typeof scr == 'function' ? window.setTimeout(scr, 0) : eval(scr) }, false); },
 
  remove: function(el) { if(el && el.parentNode) el.parentNode.removeChild(el); },
 
  toggle : function(e) {
   var node=GM_config.frame.contentDocument.getElementById(e);
   node.style.display=(node.style.display!='none')?'none':'';
   GM_config.setValue(e, node.style.display);
   }

 }; 

 var main = {
  paused : false,
  pauseClick : false,
  boxFull : false,
  pauseCount : 0,
  openCount : 0,
  requestsOpen : 0,
  reqTO : 30000,
  profile : "",

  acceptStage : 1,

  // Changeable vars for adaptation to other games (ease of use)
  streamID : "contentArea",
  stream : ($("home_stream") || $("pagelet_intentional_stream") || $("contentArea") || $("pagelet_tab_content") || $("profile_minifeed")),

  navID : "navItem",
  navIDnf : "navItem_nf",

  gameIDFrV : "201278444497", // frontierville
  gameIDTI: "234860566661", // treasureisle
  gameIDWS: "29507308663", // warstorm
  gameIDRwF: "120563477996213", //ravenwood fair
  gameIDCV : "291549705119", // cityville
  gameIDFV : "102452128776", // farmville

  gameURLpartFrV : "/frontierville",
  gameURLpartTI: "/treasureisle",
  gameURLpartFV: "/onthefarm",
  gameURLpartWS: "/warstorm",
  gameURLpartRwF: "/ravenwoodfair",
  gameURLpartCV: "/cityville",

  whitelistWhenPaused : ",null", // categories separated by commas to be accepted even if gift box is full

  gameNameFrV : "FrontierVille",
  gameNameTI : "TreasureIsle",
  gameNameRwF : "RavenwoodFair",
  gameNameCV : "CityVille",
  gameNameWS : "WarStorm",
  gameNameFV : "FarmVille",

  gameAcronym : "WallManager",
  scriptHomeURL : "http://userscripts.org/scripts/show/86674",

  gameKeyUrlKeywordFrV : "sendkey=", // used in the regex and xpath to look for "key=" or "sk=" or whatever it may be
  gameKeyUrlKeywordTI : "key=",
  gameKeyUrlKeywordRwF : "tv2=",
  gameKeyUrlKeywordCV : "sendkey=",
  gameKeyUrlKeywordWS : "sendkey=",
  gameKeyUrlKeywordFV : "key=",

  oTab : null, //this is where the window handle for the work window goes
  oTabID : "", //this is the unique key found in the last tab so we know its not loading the same page still
  oTabLifeSpan : 0,

  specialAlternator : 0,
  special24HourBit : 0,

  FrVfriendListHolder : null,
  TIfriendListHolder : null,
  RwFfriendListHolder : null,
  CVfriendListHolder : null,
  WSfriendListHolder : null,


  // empty options object for later modification
  opts : {},

  ampRegex : /&amp;/g,
  spaceRegex : /\s+/g,
  keyRegexFrV : null, // will be changed after main is defined - bug
  keyRegexTI : null,
  nRegex : /\n+/g,
  phpRegex : /#\/.*\.php/,
  numberRegex : /\d+/,
  profileRegex : /facebook\.com\/([^?]+)/i,
  postStatusRegex : / (itemdone|itemneutral|itemprocessing|itemfailed|itemoverlimit)/,
  accTextRegex : /(here's a reward|here is a reward|you've received a gift|would you like to accept|your friend needs help|thanks for coming to ravenwood fair|you just sent|you just got|reward limit for|present sent to)/,
  failTextRegex : /(oh no|sorry pardner|only your friends can send you|no longer working|you've already claimed|can't claim your own)/,
  boxFullRegex : /(you have exceeded your limit|gift box is full|exceeded)/,
  emptyRegex : /\s*/g,
  gameUrlPHPPage : /index\.php/,

  accDefaultText : "Got this!",
  failText : "Oh no! Sorry pardner!",
  overLimitText : "Limit reached!",

  accText : {
   FrVxp : "Unknown XP", FrVxp15 : "15 XP", FrVxp20 : "20 XP", FrVxp25 : "25 XP", FrVxp40 : "40 XP", FrVxp50 : "50 XP",
   FrVxp60 : "60 XP", FrVxp75 : "75 XP", FrVxp100 : "100 XP", FrVxp120 : "120 XP", FrVxp150 : "150 XP", FrVxp200 : "200 XP",
   FrVcoin100 : "100 Coin", FrVcoin200 : "200 Coin", FrVcoin250 : "250 Coin", FrVcoin500 : "500 Coin", FrVcoin1000 : "1000 Coin",
   FrVcoin: "Unknown Coin", FrVcoin300 : "300 Coin",
   FrVnone : "Unrecognized", FrVwishlist : "Wish List", FrVenergy : "Energy",
   FrVrep : "Reputation", FrVfood : "Food", FrVwood : "Wood", FrVtool : "Tool",
   FrVmystery : "Mystery Gift", FrVcarepkg : "Care Package",
   FrVsnack : "Light Snack (3)", FrVpicnicbasket : "Picknic Basket (3)", FrVhotdog : "Hotdog (5)",
   FrVbreakfast : "Breakfast (7)", FrVsteakdinner : "Steak Dinner (10)", FrVlunch : "Lunch (15)",
   FrVfries : "Fries (20)", FrVhamburger : "Hamburger (28)", FrVdinner : "Dinner (30)",
   FrVicecreamsandwich : "Icecream Sandwich (35)", FrVfeast : "Feast (62)",
   FrVboostcherry : "Cherry Ready Boost", FrVboostrand : "Unknown Boost",
   FrVsendenergy : "Light Snack", 
   FrVsendbrick : "Brick", FrVsendnail : "Nail", FrVsendhammer : "Hammer", FrVsendpaint : "Paint", FrVsenddrill : "Drill",
   FrVsendcement : "Cement", FrVsendmallet : "Mallet", FrVsendpeg : "Peg", FrVsendwindow : "Window", FrVsendgrease : "Elbow Grease",
   FrVsendtape : "Measuring Tape", FrVsendshingle : "Shingle", FrVsendlevel : "Level", FrVsendscrap : "Scrap Metal",
   FrVsendsurvey : "Land Survey", FrVsendwaiver : "Waiver", FrVsendrsvp : "Jackalope RSVP", FrVsendcharter : "Charter",
   FrVsendspitball : "Spitball", FrVsendchalk : "Chalk", FrVsendslate : "Slate", FrVsendinkpen : "Pen", FrVsendinkwell : "Ink",
   FrVsendmeasurement : "Measurement", FrVsendpattern : "Pattern", FrVsendhanger : "Hanger", 
   FrVsendcanningjar : "Canning Jar", FrVsendboots : "Hip Boots", FrVsendshippinglabel : "Shipping Label", FrVsendmetalbar : "Metal Bar",
   FrVsendseedscabbage : "Cabbage Seeds", FrVsendbins : "Bins", FrVsendplans : "Plans", FrVsendshelves : "Shelves", 
   FrVsendbabynames : "Baby Names", FrVsendbabyclothes : "Baby Clothes", 
   FrVsendchaps : "Rodeo Chaps!", FrVsendrodeohat : "Rodeo Hat", FrVsendscrewdriver : "Screwdriver",
   FrVsend : "Unknown",
   FrVchick : "Chicken", FrVgoose : "Goose", FrVpig : "Pig", FrVcow : "Cow", FrVox : "Ox", FrVsheep : "Sheep", FrVgoat : "Goat", FrVmule : "Mule", FrVhorse : "Horse",
   FrVgroundhog : "Collectible (groundhog)", FrVpoop : "Collectible (manure)", FrVgoatmilk : "Collectible (goat milk)",
   FrVoxencol : "Collectible (oxen)", FrVribeye : "Collectible (ribeye)", FrVapplepie : "Collectible (apple pie)",
   FrVdiary : "Collectible (diary)", FrVcandy : "Collectible (candy)", FrVfoxcol : "Collectible (fox)",
   FrVtollcol : "Collectible (toll booth)", FrVtailorcol : "Collectible (tailor)", FrVbabycol : "Collectible (family)",
   FrVrandomcol : "Collectible (unknown)",
   FrVribbon : "Ribbon", FrVfeather : "Downy Feathers", FrVbatter : "Batter", FrVpeter : "Salt Peter",
   FrVpresent : "Present", FrVcloth : "Unknown Cloth", FrVclothes : "Clothes", FrVclothfancy : "Fancy Clothes",
   FrVbrick : "Brick", FrVnail : "Nail", FrVhammer : "Hammer", FrVpaint : "Paint", FrVdrill : "Drill",
   FrVcement : "Cement", FrVmallet : "Mallet", FrVpeg : "Peg", FrVwindow : "Window", FrVshingle : "Shingle",
   FrVtape : "Measuring Tape", FrVlevel : "Level", FrVmetalbar : "Metal Bar",
   FrVchalk : "Chalk", FrVspitball : "Spitball", FrVslate : "Slate", FrVinkpen : "Pen", FrVinkwell : "Ink",
   FrVcharter : "Charter",
   FrVoaktree : "Oak Tree", FrVpinetree : "Pine Tree", FrVappletree : "Apple Tree", FrVcherrytree : "Cherry Tree",
   FrVloom : "Loom", FrVbarbwire : "Barbed Fence", FrVtrough : "Feed Trough", FrVshovel : "Shovel", FrVsledge : "Sledge Hammer",
   FrVpath : "Path Segment", FrVbucket : "Bucket",
   FrVsendcarvingknife : "Carving Knife", FrVbutter : "Butter!", FrVsendloggingpermit : "Logging Permit", FrVsendtinder : "Tinder",
   FrVfireworks : "Fireworks",
   FrVsendholly : "Wreath", FrVsendjug : "Jug", FrVsendstrawbale : "Straw Bale", FrVsendseasoning : "Seasonings",
   FrVsendcarrot : "Carrot", FrVsendcoal : "Coal", FrVstraw : "Straw Bale", FrVsendrodeovest : "Rodeo Vest",
   FrVsendsnowhat : "Top Hat", FrVsendcardboardbox : "Cardboard Box", FrVsendsewingneedle : "Sewing Needle",
   FrVsendcrowbar : "Crowbar", FrVstuffedgroundhog : "Stuffed Groundhog", FrVsendtile : "Tile", FrVsendbeam : "Beam", FrVsendawl : "Awl",
   FrVsendchocolatebar : "Chocolate Bar", FrVsendfeedbag : "Feed Bag", FrVsendsouprecipe : "Soup Recipe",
   FrVsendhardwood : "Hardwood", FrVsendwelcomebasket : "Welcome Basket", FrVsendfirstrsvp : "Party RSVP",
   FrVsendgame : "Game", FrVflaxoil : "Collectible (flax oil)", FrVprairiepile : "Collectible (prairie pile)",
   FrVpitchfork : "Pitchfork", FrVfire : "Fire", FrVsendhelp : "Babysitter", FrVsendmilkingstool : "Milking Stool",
   FrVsendcoffin : "Coffin", FrVsendcandycane : "Candycane", FrVsendgumdrops : "Gum Drops", FrVcowmilk : "Collectible (cow milk)",
   FrVsendtradepermit : "Trade Permit", FrVbeaverpelt : "Beaver Pelt",
   FrVfirstrsvp : "Party RSVP", FrVexplosives : "Explosives", FrVsendtoys : "Toy",
   FrVtoy : "Toy", FrVtoy2 : "2 Toys", FrVtoy5 : "5 Toys", FrVtoy10 : "10 Toys",
   FrVfruitcake : "Fruitcake (15)", FrVsendxmascard : "Christmas Card", FrVsendgingerslab : "Gingerbread Slab",
   FrVsendtubefrosting : "Frosting", FrVsenddriedfruit : "Dried Fruit", FrVgingerhut : "Gingerbread Hut",
   FrVsendsink : "Sink", FrVsendplaster : "Plaster", FrVsendspackle : "Spackle", FrVoldbook : "Collectible (old book)",
   FrVsendbook : "Book", FrVgrainsack : "Collectible (grain sack)", FrVsendshavinglather : "Shaving Lather",
   FrVcloth1 : "1 Cloth", FrVcloth2 : "2 Cloth", FrVcloth25 : "25 Cloth", FrVcloth5 : "5 Cloth",
   FrVsendbirchbark : "Birch Bark", FrVsendjigmusic : "Jig Music",

   TIxp : "XP", TIsave : "Unknown Animal", TIcoin : "Coins", TIbonus : "Bonus",
   TIsend : "This", TIwishlist : "Wish List", TInone : "Unrecognized",
   TIenergycapsule : "Energy Capsule", TIfiredig : "Fire Dig",
   TIfruitkiwi : "Kiwi", TIfruitbanana : "Banana", TIfruitmango : "Mango", TIfruitcoconut : "Coconut", TIfruitpineapple : "Pineapple",
   TIfruitdragonfruit : "Dragonfruit", TIfruitsushi : "Sushi", TIfruitmonsterkebab : "Monster Kebab", TIfruithappycake : "Happy Cake",
   TIfruit : "Unknown Fruit", 
   TIbasicbait : "Basic Bait", TIgoodbait : "Good Bait", TIspecialbait : "Special Bait", TImagicbait : "Magic Bait",
   TIphoenixfeather : "Phoenix Feather", TImapfragment : "Map Fragment", TIgoldenticket : "Golden Ticket", TImonkeywrench : "Monkey Wrench",
   TIgemred : "Red Gem", TIgemblue : "Blue Gem", TIgemorange : "Orange Gem", TIgempurple : "Purple Gem", TIgemgreen : "Green Gem",
   TIgembag : "Bag of Gems", TIgem : "Unknown Gem", TIgemyours : "Gem from your own tree",
   TIpeacock : "Peacock", TItarantula : "Tarantula", TIpanda : "Panda", TIsloth : "Sloth", TIiguana : "Iguana",
   TImonkey : "Monkey", TItoucan : "Toucan", TIparrot : "Parrot", TIcockatoo : "Cockatoo", TIdolphin : "Dolphin",
   TIseal : "Seal", TIredpanda : "Red Panda", TImargay : "Margay", TIpanther : "Panther", TIporcupine : "Porcupine",
   TIgirraffe : "Girraffe", TIdeer : "Deer", TIunicorn : "Unicorn", TIelephant : "Elephant", TIchinchilla : "Chinchilla",
   TIoctopus : "Octopus", TIblackcat : "Black Cat", TIturtle : "Turtle", TIpetturkey : "Turkey", 
   TIrsvp : "RSVP!", TIfruittaffy : "Taffy", TIoxygen : "Oxygen Bottle",
   TIflamingo : "Flamingo", TIlemur : "Lemur", TIjellyfish : "Jellyfish", TIgull : "Gull", TIdusky : "Dusky Dolphin",
   TIfruithors : "Finger Food", TIbubbly : "Bubbly", TIpresent : "Present",
   TIjdturkey : "JD Turkleton", TIpetmclovin : "McLovin'", TIstreetlamp : "Street Lamp", TIfruitfruitcake : "Fruitcake",
   TIbuildingmaterials : "Building Material Kit", TIfruitcandycane : "Candy Cane",
   TIsendscarf : "Scarf", TIsendslush : "Slush", TIsendpaint : "Paint", TIsendresin : "Resin", TIsendplanks : "Planks",
   TIsendpillar : "Pillar", TIsendshells : "Shells", TIsenddye : "Dye", TIsendmarble : "Marble", TIsendaquavitae : "Aqua Vitae",
   TIsendnails : "Nails", TIsendfrosting : "Frosting", TIsendrock : "Rock", TIsendectoplasm : "Ectoplasm",
   TInewyearsboat : "New Year's Boat", TIfireworks : "Fireworks", TIpartytable : "Party Table",
   TIsendrope : "Rope", TIsendfire : "Fire", TIsendgold : "Gold", TIsendseeds : "Seeds", TIsendcloth : "Cloth", TIsendoil : "Oil",
   TIsendice : "Ice", TIsendgumdrops : "Gum Drops", TIsendglue : "Glue", TIsendpackedsnow : "Packed Snow",
   TIsendglass : "Glass", TIsendgears : "Gears", TIsendgingerbread : "Gingerbread", TIsendmetal : "Metal", TIsendbolts : "Bolts",
   TIsendenergypack : "Energy Pack", TIsendbubbly : "Bubbly", TIsendpartyfavor : "Party Favor", 
   TIsnowflake : "Snowflake", TIsendmagictophat : "Magic Top Hat", TIfruitcarrot : "Carrot", TIsnowdog : "Snow Dog", TIsnowwoman : "Snow Woman",
   TIsnowcloud : "Snow Cloud", TIredkey : "Red Chest Key", TIbluekey : "Blue Chest Key", TIsendmapfrag : "Map Fragment",

   RwFwood : "Wood", RwFenergy : "Energy", RwFcoin : "Coins", RwFfood : "Food", 
   RwFsend : "Opened in a new window",  RwFnone : "Unrecognized",

   CVsend : "Unknown Item", CVxp : "XP", CVcoin : "Coins", CVgoods : "Goods",  CVnone : "Unrecognized", 
   CVwishlist : "Wish List", CVplay : "Play CityVille",
   CVsendpermit : "Permit", CVsendendorsement : "Endorsement", CVsendenergy : "Energy",
   CVsendchocolate : "Chocolate",
   CVsendpresent : "Present", CVsendpinecone : "Pinecone", CVsendholidaylights : "Holiday Lights",
   CVsendiceskates : "Ice Skates", CVsendwinterjacket : "Winter Jacket", CVsendwintermittens : "winter Mittens", 
   CVsendwinterhat : "winter Hat",
   CVsendsnowflake : "Snowflake", CVsendsnowball : "Snowball",
  },


  // Created by avg, modified by JoeSimmons. shortcut to create an element
  create : function(a,b,c) {
   if(a=="text") {return document.createTextNode(b);}
   var ret=document.createElement(a.toLowerCase());
   if(b) for(var prop in b) if(prop.indexOf("on")==0) ret.addEventListener(prop.substring(2),b[prop],false);
   else if(",style,accesskey,id,name,src,href,which,rel,action,method,value".indexOf(","+prop.toLowerCase())!=-1) ret.setAttribute(prop.toLowerCase(), b[prop]);
   else ret[prop]=b[prop];
   if(c) c.forEach(function(e) { ret.appendChild(e); });
   return ret;
  },

  // cross-browser log function
  log: ((isGM) ? GM_log : ((window.opera) ? opera.postError : console.log)),

  // click something
  click : function(e, type) {
   if(!e && typeof e=='string') e=document.getElementById(e);
   if(!e) return;
   var evObj = e.ownerDocument.createEvent('MouseEvents');
   evObj.initMouseEvent("click",true,true,e.ownerDocument.defaultView,0,0,0,0,0,false,false,false,false,0,null);
   e.dispatchEvent(evObj);
  },

  // remove something from the page
  remove : function(e) {
   var node = (typeof e=='string') ? $(e) : e;
   if(node) node.parentNode.removeChild(node);
  },

  keyDownFunc : function(e) {
   if(",9,18,33,34,35,36,37,38,39,40,116".find(","+e.keyCode) || (main.paused && main.pauseClick)) return;
   main.paused=true;
   main.pauseClick=false;
   main.pauseCount = main.opts["inputtimeout"] || 15;
   main.status();
  },

  getBodyTextFromLink : function(item) {
   if(item==null)return;
   var text;
   try {
    if (main.realURL.find("games")) return item.parentNode.parentNode.parentNode.parentNode.parentNode.childNodes[1].textContent.replace(main.nRegex,"");
    else return item.parentNode.parentNode.parentNode.parentNode.parentNode.childNodes[2].textContent.replace(main.nRegex,"");
   } catch (e){
    return "";//main.debug("no reference to body from link: "+item);
   }
  },

  getAppIdFromLink : function(item){
   d=item.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.getAttribute("data-ft");
   d=d.split("app_id\":")[1].split(",")[0];
   return d;
  },

  getActorIdFromLink : function(item){
   d=item.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.getAttribute("data-ft");
   d=d.split("actrs\":\"")[1].split("\"")[0];
   return d;
  },

  getStoryIdFromLink : function(item){
   d=item.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.getAttribute("data-ft");
   d=d.split("fbid\":\"")[1].split("\"")[0];
   return d;
   //f={"src":10,"sty":237,"actrs":"1585105758","targets":"1585105758","pub_time":1293201740,"fbid":"138275076229649","s_obj":9,"s_edge":1,"s_prnt":9,"app_id":201278444497,"pos":14,"filter":"fl_103014009750339"}
  },

  addOneClickRemoveButtonToPost : function(item) {
   appid = main.getAppIdFromLink(item);
   actorid = main.getActorIdFromLink(item);
   storyid = main.getStoryIdFromLink(item);
   l = "/ajax/feed/filter_action.php?action=uninteresting&object_ids%5B0%5D="+actorid+"&object_ids%5B1%5D="+appid+"&story_fbids%5B0%5D="+storyid+"&source=home";
   l="<a data-ft=\"{\"type\":\"hide\"}\" href=\""+l+"\" rel=\"async-post\" tabindex=\"0\" role=\"menuitem\" class=\"itemAnchor\">Hide this post</a>"

   //add the button to the post
  },

  getLinkTextFromLink: function(item) {return (item.textContent);},

  matchLinkText : function(item, text) {return (main.getLinkTextFromLink(item).toLowerCase().find(text.toLowerCase()));},

  matchBodyText : function(item, text) {return (main.getBodyTextFromLink(item).toLowerCase().find(text.toLowerCase()));},

  matchLinkHref : function(item, text) {return (item.href.toLowerCase().find(text.toLowerCase()));},

  getGameModeFromActionLink : function(item){
   if(item.href.find("/frontierville/")) return "FrV";
   else if(item.href.find("/treasureisle/")) return "TI";
   else if(item.href.find("/ravenwoodfair/")) return "RwF";
   else if(item.href.find("/cityville/")) return "CV";
   else if(item.href.find("/onthefarm/")) return "FV";
   else if(item.href.find("/warstorm/")) return "WS";
   else return "";
  },

  // all regexps are stored here
  excludesRegex : /(claim land title|tame the flames|go to frontierVille|dispatch the pelican|collect the monkeys|lace up the cleats|wield the sword|clean it up|play treasure|go see my gift|go play|send thank you gift|play ravenwood fair|visit cityville|visita cityville|start your business|démarre ton activité|play warstorm)/,
  whichRegexFrV : /(help|send items|send|expansion|explosives|toy|fries|straw|candy|breakfast|sledge|prairie pile|downy feathers|pine sapling|coin|apple tree|money|wood|food|brick|chick|goose|peter|lunch|loom|ribeye|experience|xp|energy|hammer|poop|rsvp|shingle|waiver|grease|mallet|slate|window|cement|screwdriver|peg|tool|energy|batter|ribbon|cloth|roadkill|diary|slate|ink well|ink pen|spitball|nail|chalk|trough|paint|drill|present|horse|mule|cow|calf|cattle|sheep|goat milk|goat|pig|path|level|tape|scrap|survey|turkey|crow|measurement|pattern|hanger|oxen|metal bar)/,
  whichRegexTI : /(help|send|fruit cake|candy cane|rsvp|snowflake|snow flake|carrot|bubbly|present|fire dig|golden ticket|phoenix feather|energy capsule|oxygen|basic bait|special bait|good bait|magic bait|fruit|gem|coin|xp|coconut|banana|sushi|pineapple|watermellon|happy cake|monster kebab|dragonfruit|dragon fruit|mango|kiwi|taffy|map fragment|bonus|monkey wrench|dusky|peacock|margay|flamingo|lemur|jellyfish|gull|red panda|panda|black cat|panther|toucan|sloth|tarantula|seal|dolphin|elephant|unicorn|deer|chinchilla|porcupine|octopus|sea turtle|turtle|cockatoo|parrot|girraffe|save)/,
  whichRegexRwF : /(coin|food|energy|wood)/,
  whichRegexCV : /(send|contre pièces|invia|envoie|envoyer|envía|xp|coin|pièces|goods|bonus|marchandises|productos)/,
  whichRegexWS : /(open|silver|rare|watch|play|earn|enter)/,

  // get what type of item it is
  which : function(item) {
   var w, linkText=item.textContent.toLowerCase();
   
   //shorten the function texts
   function bText(t){if(t!=null) return main.matchBodyText(item,t); else return false;}
   function lText(t){if(t!=null) return main.matchLinkText(item,t); else return false;}
   function lHref(t){if(t!=null) return main.matchLinkHref(item,t); else return false;}

   //check for excluded link text
   if (linkText.match(main.excludesRegex)){return "exclude";}

   //determine game and most likely WHICH
   var gameModeNow=main.getGameModeFromActionLink(item);
   switch(gameModeNow){
    case "TI": w=(w==null)?linkText.match(main.whichRegexTI):w; break;
    case "FrV": w=(w==null)?linkText.match(main.whichRegexFrV):w; break;
    case "RwF": w=(w==null)?linkText.match(main.whichRegexRwF):w; break;
    case "CV": w=(w==null)?linkText.match(main.whichRegexCV):w; break;
    case "WS": w=(w==null)?linkText.match(main.whichRegexWS):w; break;
   }

   //if no WHICH returned, mark as NONE, otherwise remove space in matched text
   w=(w!=null)?w[1].replace(main.spaceRegex,""):"none";
   
   //search game specific link and body text for WHICH
   switch(gameModeNow){

   case "FrV":
    //switch common text found to common WHICH type
    w=(w==="experience")?"xp":(w==="money")?"coin":(w==="cattle")?"cow":
     (w==="calf")?"cow":(w==="expansion")?"send":(w==="lamb")?"sheep":
     (w==="downyfeathers")?"feather":(w==="pinesapling")?"pinetree":
     (w==="senditems")?"wishlist":
     w;
    //search for common link text not listed above
    w=(w==="send")?w:lText("free decoration")?"bucket":
     lText("that love")?"rep":
     lText("claim feast")?"food":
     lText("some grub")?"food":
     lText("a fruit tree")?"cherrytree":
     lText("i'd like some pie")?"applepie":
     lText("barbed wire")?"barbwire":
     lText("groundhog bits")?"groundhog":
     lText("collectibles")?"groundhog":
     lText("collectible")?"randomcol":
     lText("random item")?"randomcol":
     lText("get ink")?"inkwell":
     lText("get pen")?"inkpen":
     lText("oxen collectible")?"oxencol":
     lText("charter agreement")?"charter":
     lText("mystery gift")?"mystery":
     lText("grab a box")?"mystery":
     lText("i want a boost")?"boostrand":
     lText("fancy clothes")?"clothfancy":
     lText("clothes")?"clothes":
     lText("care package")?"carepkg":
     bText("collecting chicken soup recipes")?"sendsouprecipe":    
     lText("fireworks")?"fireworks":
     lText("receive gift")?"present":
     lText("i want in")?"xp100":
     bText("fruitcake")?"fruitcake":
     bText("stuffed groundhog")?"stuffedgroundhog":
     lText("gingerbread hut")?"gingerhut":
     lText("rsvp for the party")?"firstrsvp":
     lText("gimme some cow")?"cow":
     lText("gimme some")?"fruitcake":
     lText("i'll do it")?"sendhelp":
     bText("flaxseed oil aplenty")?"flaxoil":
     bText("extra cows for the taking")?"cow":
     bText("floats like a butterfly and stings like a bee")?"xp50":
     bText("a vacation veteran")?"ribbon":
     bText("quicker picker upper")?"pitchfork":
     bText("burn it down and start over")?"fire":
     bText("new hobbies to enjoy")?"coin300":
     bText("enjoy some free cloth")?"cloth":
     bText("the animals just plain love her")?"cowmilk":
     lText("gimme grub")?"food":
     lText("beaver pelt")?"beaverpelt":
     lText("gimme a book")?"oldbook":
     lText("gimme a sack")?"grainsack":
     lText("fire good")?"fire":
     lText("yes, please")?"food":
     
     w;

    //determine reward for specific badges
    if (bText("badge")){
     w=bText("casual clicker")?"xp50":
      bText("capricious clicker")?"xp100":
      bText("crazy clicker")?"xp150":
      bText("courageous clicker")?"xp200":
      bText("sufficient spender")?"xp50":
      bText("super spender")?"xp100":
      bText("sophisticated spender")?"xp150":
      bText("stunning spender")?"xp200":
      bText("varmint vandal")?"xp50":
      bText("varmint vaporizer")?"xp150":
      bText("varmint vanquisher")?"xp100":
      bText("talented teamwork")?"xp50":
      bText("thoughtful teamwork")?"xp100":
      bText("thankful teamwork")?"xp150":
      bText("terrific teamwork")?"xp200":
      bText("rowdy rancher")?"xp50":
      bText("responsible rancher")?"xp100":
      bText("respectable rancher")?"xp150":
      bText("radical rancher")?"xp200":
      bText("easy energy")?"xp50":
      bText("edible energy")?"xp100":
      bText("enormous energy")?"xp150":
      bText("expensive energy")?"xp200":
      bText("controlled consumption")?"xp50":
      bText("crazy consumption")?"xp100":
      bText("costly consumption")?"xp150":
      bText("concentrated consumption")?"xp200":
      bText("dandy decorator")?"xp50":
      bText("delightful decorator")?"xp100":
      bText("detailed decorator")?"xp150":
      bText("devoted decorator")?"xp200":
      bText("cool cultivator")?"xp50":
      bText("competent cultivator")?"xp100":
      bText("clever cultivator")?"xp150":
      bText("coordinated cultivator")?"xp200":
      bText("excellent employer")?"xp50":
      bText("engaging employer")?"xp100":
      bText("exceptional employer")?"xp150":
      bText("experienced employer")?"xp200":
      bText("horseshoe handler")?"xp50":
      bText("horseshoe honcho")?"xp100":
      bText("horseshoe hustler")?"xp150":
      bText("horseshoe hero")?"xp200":
      bText("accute accumulation")?"coin150":
      bText("adequate accumulation")?"coin250":
      bText("ample accumulation")?"coin500":
      bText("advanced accumulation")?"coin1000":
      bText("naive neighbor")?"xp50":
      bText("noble neighbor")?"xp100":
      bText("needy neighbor")?"xp150":
      bText("noteworthy neighbor")?"xp200":
      bText("able repeater")?"xp50":
      bText("stubborn repeater")?"xp100":
      bText("amazing repeater")?"xp150":
      bText("illustrious repeater")?"xp200":
      bText("resolute pioneer")?"xp200":
      bText("patient player")?"xp50":
      bText("proud player")?"xp100":
      bText("passionate player")?"xp150":
      bText("perfect player")?"xp200":
      bText("clever trader")?"xp50":
      bText("cunning trader")?"xp100":
      bText("wily trader")?"xp150":
      bText("?? trader")?"xp200":
      w; //unknown badge xp
    }
    // determine quantity of cloth from reward
    else if (w==="cloth"){
     w=bText("key to prosperity")?"cloth2":
      bText("readying some fancy duds")?"cloth2":
      bText("ready fer the quiltin' bee")?"cloth1":
      bText("becomin' a world-class trader")?"cloth1":
      bText("making presents for a relative's wedding")?"cloth1":
      bText("likes big suds and cannot lie")?"cloth25":
      bText("has brought a barber to the")?"cloth25":
      bText("has properly furnished the Barber Shop")?"cloth25":
      bText("new baby has arrived")?"cloth2": //for both child 2 and 3
      bText("has properly finished the Barber Shop")?"cloth25":
      bText("is playing more frontierville in the new year")?"cloth5":
      w; //unknown cloth count
    }    
    // determine specific xp value from reward
    else if (w==="xp"){
     w=bText("new general store manager")?"xp100":
      bText("bear")?"xp50":
      bText("primed")?"xp150":
      bText("snake")?"xp50":
      bText("niblets")?"xp150":
      bText("fowl watch")?"xp15":
      bText("pumpkin")?"xp100":
      bText("flax")?"xp200":
      bText("cakes")?"xp100":
      bText("decorating")?"xp50":
      bText("oxen")?"xp50":
      bText("schooled")?"xp25":
      bText("spud stud")?"xp40":
      bText("cousin")?"xp50":
      bText("thorny")?"xp75":
      bText("groundhog")?"xp100":
      bText("birthday")?"xp75":
      bText("is now level")?"xp15":
      bText("whole new crop: cabbages")?"xp50":
      bText("where babies come from")?"xp100":
      bText("looking to have a second child")?"xp40":
      bText("looking to have a third child")?"xp40":
      bText("looking to have a fourth child")?"xp40":
      bText("looking to have a fifth child")?"xp60":
      bText("looking to have a sixth child")?"xp100":
      bText("babies is tiring work")?"xp120":
      bText("took care of some neighbor crops")?"xp25":
      bText("completed the first")?"xp15":
      bText("sheep will be safe now")?"xp20":
      bText("new water tower")?"xp100":
      bText("easy to notice on the frontier")?"xp25":
      bText("homemade medicine")?"xp25":
      bText("everything about sunflowers")?"xp25":
      bText("made things nice and hot")?"xp50":
      bText("wood for generations")?"xp25":
      bText("icing")?"xp100":
      bText("wants to be a jackalope")?"xp50":
      bText("beared it all")?"xp50":
      bText("little fellas fed")?"xp50":
      bText("big animals satisfied")?"xp50":
      bText("getting bigger")?"xp100":
      bText("made a big table")?"xp100":
      bText("storage shed! listen")?"xp100":
      bText("storage shed! learn")?"xp150":
      bText("built him a gingerbread")?"xp100":
      w;
    }
    // determine specific value of coin reward
    else if (w==="coin"){
     w=bText("sheep had wandered off")?"coin100":
      bText("everyday cabin")?"coin100":
      bText("time to think about a spouse")?"coin100":
      bText("honeymoon is over")?"coin100":
      bText("whole family of teeny avatars")?"coin100":
      bText("spelling bee")?"coin200":
      bText("tough an' they're fast")?"coin200":
      bText("know 'bout chickens")?"coin500":
      bText("master farmer")?"coin500":
      bText("mighty famous")?"coin500":
      bText("most famous people")?"coin1000":
      bText("sent off a gift bed")?"coin100":
      bText("keeping the wilderness at bay")?"coin100":
      bText("whole passel of emergency")?"coin100":
      bText("bigger is better")?"coin250":
      bText("wants an extension")?"coin100":
      bText("extended the family homestead")?"coin200":
      bText("traded in the")?"coin100":
      w;
    }
    //determine specific collectible given
    else if (w==="randomcol"){
     w=bText("spying")?"foxcol":
      bText("groundhog")?"groundhog":
      bText("troll")?"tollcol":
      bText("bustle")?"tailorcol":
      bText("four members")?"babycol":
      w;
    }
    //determine how many toys offered
    else if (w==="toy"){
     w=lText("two toys")?"toy2":
      lText("five toys")?"toy5":
      lText("ten toys")?"toy10":
      w;
    }
    //check for baby clothes
    else if (w==="clothes"){
     w=bText("baby clothes")?"babyclothes":w;
    }
    //determine specific boost given
    else if (w==="boostrand"){
     w=bText("cherries")?"boostcherry":w;
    }
    //determine specific item being sent as gift
    else if (w==="send" || w==="help"){
     w=bText("hammer")?"sendhammer":
      bText("kick the party up")?"sendfirstrsvp":
      bText("food to prepare for the feast")?"sendturkeyrsvp":
      bText("nail")?"sendnail":
      bText("paint")?"sendpaint":
      bText("peg")?"sendpeg":
      bText("cement")?"sendcement":
      bText("shingle")?"sendshingle":
      bText("window")?"sendwindow":
      bText("mallet")?"sendmallet":
      bText("screwdriver")?"sendscrewdriver":
      bText("survey")?"sendsurvey":
      bText("waiver")?"sendwaiver":
      bText("pattern")?"sendpattern":
      bText("elbow")?"sendgrease":
      bText("brick")?"sendbrick":
      bText("drill")?"senddrill":
      bText("tape")?"sendtape":
      bText("level")?"sendlevel":
      bText("rsvp")?"sendrsvp":
      bText("scrap")?"sendscrap": 
      bText("handshake")?"sendhandshake":
      bText("charter")?"sendcharter":
      bText("pen")?"sendinkpen":
      bText("wells")?"sendinkwell":
      bText("chalk")?"sendchalk":
      bText("spitball")?"sendspitball":
      bText("slate")?"sendslate":
      bText("baby clothes")?"sendbabyclothes":
      bText("hanger")?"sendhanger":
      bText("inseam")?"sendmeasurement":
      bText("pattern")?"sendpattern":
      bText("snack")?"sendenergy":
      bText("bins")?"sendbins":
      bText("plans")?"sendplans":
      bText("shelves")?"sendshelves":
      bText("cabbage seeds")?"sendseedscabbage":
      bText("baby names")?"sendbabynames":
      bText("logging permit")?"sendloggingpermit": 
      bText("shipping label")?"sendshippinglabel":
      bText("sewing needle")?"sendsewingneedle":
      lText("tile")?"sendtile":
      lText("awl")?"sendawl":
      lText("beam")?"sendbeam":
      lText("trade permit")?"sendtradepermit":
      lText("coffin")?"sendcoffin":
      lText("milking stool")?"sendmilkingstool":
      lText("plaster")?"sendplaster":
      lText("spackle")?"sendspackle":
      lText("sink")?"sendsink":
      lText("book")?"sendbook":
      lText("shaving lather")?"sendshavinglather":
      lText("birch bark")?"sendbirchbark":
      lText("jigs")?"sendjigmusic":

      bText("canning jar")?"sendcanningjar":
      bText("boots")?"sendboots":
      bText("free bars")?"sendmetalbar":
      bText("metal bar")?"sendmetalbar":
      bText("rodeo hat")?"sendrodeohat":
      bText("chaps")?"sendchaps":
      bText("rodeo vest")?"sendrodeovest":
      bText("special seasoning")?"sendseasoning": 
      bText("cardboard box")?"sendcardboardbox": 
      bText("jug")?"sendjug": 
      bText("crowbar")?"sendcrowbar":
      lText("feed bag")?"sendfeedbag": 
      lText("candy cane")?"sendcandycane":
      lText("gum drops")?"sendgumdrops":

      bText("tinder")?"sendtinder": 
      bText("holly wreath")?"sendholly": 
      bText("bale of straw")?"sendstrawbale": 
      bText("carrot")?"sendcarrot": 
      bText("coal")?"sendcoal": 
      bText("hat")?"sendsnowhat": 
      bText("spoon")?"sendservingspoon":

      bText("toys")?"sendtoys":
      bText("christmas card")?"sendxmascard":
      bText("gingerbread slab")?"sendgingerslab":
      bText("frosting tube")?"sendtubefrosting":
      bText("dried fruit")?"senddriedfruit":
      lText("chocolate bar")?"sendchocolatebar":
      lText("hardwood")?"sendhardwood":
      lText("welcome basket")?"sendwelcomebasket":

      lText("game")?"sendgame":
      w;
    }

    //switch to undefined collection if enabled
    w=(w==="none" && main.opts["FrVdoUnknown"])?"doUnknown":w;

    break;

   case "TI":
    //switch common words found to common WHICH type
    w=(w==="carrot"||w==="taffy"||w==="candycane"||w==="mango"||w==="banana"||w==="coconut"||w==="sushi"||w==="pineapple"||w==="kiwi"||w==="watermellon"||w==="happycake"||w==="monsterkebab"||w==="dragonfruit"||w==="fruitcake")?"fruit"+w:w;
    //search for common link text not listed above
    w=lText("gimme, gimme more")?"xp":
     lText("grab some of that power")?"xp":
     lText("help out")?"send":
     lText("some love")?"xp":
     lText("your gems")?"gemyours":
     lText("claim reward")?"bonus":
     lText("claim your treasure")?"bonus":
     lText("send gift")?"wishlist":
     lText("save the turkey")?"petturkey":
     lText("take the treasure")?"wishgift":
     lText("get some hors")?"fruithors":

     lText("cheese platter")?"fruitcheeseplatter":
     lText("turkey feast")?"fruitturkeyfeast":
     lText("black balloons")?"blackballoons":
     lText("black coffee")?"fruitblackcoffee":
     lText("coffee tray")?"fruitblackcoffee":

     lText("mclovin")?"petmclovin":
     lText("jd turkleton")?"jdturkey":
     lText("building materials")?"buildingmaterials":
     lText("street lamp")?"streetlamp":
     lText("christmas boat")?"christmasboat":

     lText("snow dog")?"snowdog":
     lText("snow woman")?"snowwoman":
     lText("snow cloud")?"snowcloud":
     lText("red chest key")?"redkey":
     lText("blue chest key")?"bluekey":
     w;    
    //deterine color or type of gem rewarded
    if (w==="gem"){
     w=bText("red")?"gemred":
      bText("blue")?"gemblue": 
      bText("purple")?"gempurple": 
      bText("orange")?"gemorange": 
      bText("green")?"gemgreen": 
      bText("of each")?"gembag":
      w; 
    } 
    //determine specific items given by reward or bonus text links
    else if (w==="bonus"){
     w=bText("bag of pineapples")?"fruitpineapple":
      bText("of each gem")?"gembag":
      bText("turkey feast")?"fruitturkeyfeast":
      bText("racoontable")?"racoontable":
      bText("sunflowers")?"sunflowers":
      bText("fail whale")?"failwhale":
      bText("swan boat")?"swanboat":   
      bText("big barn")?"bigbarn":   
      bText("garden plot")?"gardenplot":   
      bText("pig float")?"pigfloat":   
      bText("pumpkin pie")?"fruitpumpkinpie":
      bText("cheese platter")?"fruitcheeseplatter":   
      bText("black coffee")?"fruitblackcoffee":   
      bText("fruit cake")?"fruitfruitcake":   
      bText("building material")?"buildingmaterials":   
      bText("jd turkelton")?"jdturkey":   
      bText("christmas boat")?"christmasboat":   
      bText("mclovin")?"petmclovin":   
      bText("street lamp")?"streetlamp":
      bText("hors d'oeuvre")?"fruithors":
      bText("snow dog")?"snowdog":   
      bText("snow woman")?"snowwoman":   
      bText("snow cloud")?"snowcloud":   
      bText("red chest key")?"redkey":   
      bText("blue chest key")?"bluekey":   
      bText("fruit")?"fruit":   
      w;
    } 
    else if (w==="send"){
     w=bText("scarf")?"sendscarf":
     bText("slush")?"sendslush":
     bText("resin")?"sendresin":
     bText("dye")?"senddye":
     bText("marble")?"sendmarble":
     bText("pillar")?"sendpillar":
     bText("paint")?"sendpaint":
     bText("shells")?"sendshells":
     bText("planks")?"sendplanks":
     bText("aqua vitae")?"sendaquavitae":
     bText("nails")?"sendnails":
     bText("rock")?"sendrock":
     bText("ectoplasm")?"sendectoplasm":
     bText("frosting")?"sendfrosting":
     bText("cloth")?"sendcloth":
     bText("gold")?"sendgold":
     bText("seeds")?"sendseeds":
     bText("fire")?"sendfire":
     bText("rope")?"sendrope":
     bText("oil")?"sendoil":
     bText("ice")?"sendice":
     bText("gum drops")?"sendgumdrops":
     bText("glue")?"sendglue":
     bText("packed snow")?"sendpackedsnow":
     bText("glass")?"sendglass":
     bText("metal")?"sendmetal":
     bText("gears")?"sendgears":
     bText("bolts")?"sendbolts":
     bText("gingerbread")?"sendgingerbread":

     lText("energy pack")?"sendenergypack":
     lText("bubbly")?"sendbubbly":
     lText("party favor")?"sendpartyfavor":
     lText("map frag")?"sendmapfrag":
     lText("magic top hat")?"sendmagictophat":


     w;
    }

    //switch to undefined collection if enabled
    w=(w==="none" && main.opts["TIdoUnknown"])?"doUnknown":w;
  
    break;

   case "RwF":    
    w=lText("help me")?"send":w;
    break;

   case "CV":
    w=lHref("holiday2010_tree_gift_request")?"sendpresent":
    lHref("permits_request")?"sendpermit": 
    lHref("mayor_endorsement")?"sendendorsement": 
    lHref("holiday_snow_pinecone")?"sendpinecone": 
    lHref("holiday_snow_skate")?"sendiceskates": 
    lHref("holiday_mittens")?"sendwintermitten": 
    lHref("holiday_puffy_jacket")?"sendwinterjacket":
    lHref("holiday_winter_hat")?"sendwinterhat":
    lHref("holiday_snow_snowball")?"sendsnowball": 
    lHref("holiday_snow_snowflake")?"sendsnowflake":
    lHref("holiday_snow_lights")?"sendholidaylights": 
    lHref("place_statue")?"xp":
    lHref("daily_bonus")?"coin":
    lHref("neighbor_visit_crops")?"goods":
    lHref("neighbor_visit_default")?"coin":
    lHref("reputation_level_up")?"goods":
    lHref("visit_neighbor")?"xp":
    lHref("energy_feed")?"sendenergy":
    lHref("star_rating_increased")?"coin":
    lHref("news_viral")?"coin":
    lHref("state_fair4")?"coin":
    lHref("state_fair3")?"xp":
    lHref("state_fair2")?"goods":
    lHref("state_fair1")?"coin":
    lHref("collection_trade_in")?"coin":
    lHref("neighbors.php")?"wishlist":
    lHref("level_up_")?"xp":
    lHref("neighbor_visit_bus")?"coin":
    lHref("little_italy1")?"goods":
    lHref("little_italy2")?"coin":
    lHref("earn_star")?"coin":
    lHref("ugc_viral")?"coin":
    lHref("bonus_remind_accept")?"coin":
    lHref("startuptype=emptylot")?"play":
    lHref("world_tour3")?"goods":
    lHref("world_tour1")?"goods":
    lHref("prepare_shipping2")?"xp":
    lHref("time_capsule2")?"xp":
    lHref("grow_hq")?"goods":
    lHref("place_hq")?"xp":
    lHref("train1")?"goods":
    lHref("train4")?"goods":
    lHref("train3")?"goods":
    lHref("rita_garden")?"goods":
    lHref("rita_cont2")?"coin":
    lHref("edgar_burger")?"coin":
    lHref("elected_mayor")?"coin":
    lHref("mayor_prep")?"coin":
    lHref("central_park3")?"xp":
    lHref("central_park1")?"xp":
    lHref("safety_first")?"goods":
    lHref("place_to_play")?"xp":
    lHref("capitol_sports2")?"xp":
    lHref("capitol_sports1")?"goods":
    lHref("pigeon3")?"goods":
    lHref("pigeon4")?"coin":
    lHref("more_andre2")?"goods":
    lHref("more_andre3")?"xp":
    lHref("build_school")?"xp":
    lHref("holiday_winterclothes")?"coin":
    lHref("more_billy1")?"coin":
    lHref("more_billy2")?"coin":
    lHref("more_billy3")?"xp":
    lHref("more_billy4")?"goods":
    lHref("increase_pop")?"xp":
    lHref("prepare_capital_city")?"xp":
    lHref("plant_and_harvest")?"xp":
    lHref("build_neighborhood")?"coin":
    lHref("pretty_up_bakery")?"sendchocolate":
    lHref("grow_pop")?"xp":

    //fallbacks    
    lText("send")?"send":
    lText("coins")?"coin":
    lText("goods")?"goods":
    lText("xp")?"xp":
  
    w;


    break;
   case "WS": 

    break;

   } //end gamemode switch
   return gameModeNow + w;
  },

  failedItem : function(d, t) {
   return main.failTextRegex.test(t.toLowerCase());
  },

  gotItem : function(d, t) {
   return main.accTextRegex.test(t.toLowerCase());
  },

  // function to debug stuff. displays in a big white textarea box
  debug : function(s) {
   var d=$("debugT");
   if(!d) document.body.insertBefore(d=main.create("textarea", {id:"debugT",style:"position:fixed; top:20px; left:20px; width:95%; height:90%; color:#000000; background:#ffffff; border:3px ridge #000000; z-index:99999;",ondblclick:function(e){e.target.style.display="none";}}, new Array(main.create("text",s))), document.body.firstChild);
   else d.innerHTML+="\n\n\n\n"+s;
   if(d.style.display=="none") d.style.display="";
  },

  // get the key for the url
  getKey : function(href) {
   if(href.find("/frontierville/")){
    return href.match(main.keyRegexFrV)[1];
   }
   else if(href.find("/treasureisle/")){
    return href.match(main.keyRegexTI)[1];
   }
   else if(href.find("/ravenwoodfair/")){
    return href.match(main.keyRegexRwF)[1];    
   }
   else if(href.find("/cityville/")){
    return href.match(main.keyRegexCV)[1];    
   }
   else if(href.find("/warstorm/")){
    return href.match(main.keyRegexWS)[1];    
   }
   return "nokey";
  },

  storeTypes : /^(true|false|\d+)$/,

  getValue : (isGM ? GM_getValue : (function(name, def) {
   var s=localStorage.getItem(name), val = ((s=="undefined" || s=="null") ? def : s);
   if(typeof val == "string" && main.storeTypes.test(val)) val = ((new Function("return "+val+";"))());
   return val;
  })),

  setValue : (isGM ? GM_setValue : (function(name, value) {return localStorage.setItem(name, value)})),

  deleteValue : (isGM ? GM_deleteValue : (function(name, def) {return localStorage.setItem(name, def)})),

  // get the accepted items' times they were accepted
  getAcceptedTime : function() {
   return (new Function("return "+(main.getValue(main.gameAcronym.toLowerCase()+"_accepted_time_"+main.profile, "({})"))+";"))();
  },

  // save the accepted items' times they were accepted
  setAcceptedTime : function(e) {
   var val = JSON.stringify(e), store=main.gameAcronym.toLowerCase()+"_accepted_time_"+main.profile;
   main.setValue(store, val);
  },

  // get the accepted items' times they were accepted
  getFailedTime : function() {
   return (new Function("return "+(main.getValue(main.gameAcronym.toLowerCase()+"_failed_time_"+main.profile, "({})"))+";"))();
  },

  // save the accepted items' times they were accepted
  setFailedTime : function(e) {
   var val = JSON.stringify(e), store=main.gameAcronym.toLowerCase()+"_failed_time_"+main.profile;
   main.setValue(store,val);
  },

  // reset the accepted items
  resetAccepted : function() {
   if(confirm("Really reset accepted items?")) window.setTimeout(function(){
    var reset=main.deleteValue;
    reset(main.gameAcronym.toLowerCase()+"_accepted_"+main.profile, "({})");
    reset(main.gameAcronym.toLowerCase()+"_accepted_time_"+main.profile, "({})");
    reset(main.gameAcronym.toLowerCase()+"_failed_"+main.profile, "({})");
    reset(main.gameAcronym.toLowerCase()+"_failed_time_"+main.profile, "({})");
    reset(main.gameAcronym.toLowerCase()+"_DetlColl_"+main.profile, "({})");
   }, 0);
  },

  // get the accepted items
  getAccepted : function() {
   return (new Function("return "+(main.getValue(main.gameAcronym.toLowerCase()+"_accepted_"+main.profile, "({})"))+";"))();
  },

  // save the accepted items
  setAccepted : function(e) {
   var val = JSON.stringify(e), store=main.gameAcronym.toLowerCase()+"_accepted_"+main.profile;
   main.setValue(store,val);
  },

  // get the accepted items
  getFailed : function() {
   return (new Function("return "+main.getValue(main.gameAcronym.toLowerCase()+"_failed_"+main.profile, "({})")+";"))();
  },

  // save the accepted items
  setFailed : function(e) {
   var val = JSON.stringify(e), store=main.gameAcronym.toLowerCase()+"_failed_"+main.profile;
   main.setValue(store,val);
  },

  // get number of current requests
  get currReqs() {
   //return $g("count(.//iframe)",{node:$("silent_req_holder"),type:1});
   return main.requestsOpen;
  },

  toHomepage : function() { 
   window.location.replace(main.realURL); 
  },

  toFilterpage : function(appID) { 
   window.location.replace("http://www.facebook.com/home.php?filter=app_"+appID+"&show_hidden=true&ignore_self=true&sk=lf"); 
  },

  colorCode : function(item, type) {
   try {
    switch(main.opts["colorcode"]) {
     case true:
      var div = $g(".//ancestor::*[starts-with(@id,'stream_story_') and not(contains(@id,'_collapsed'))]", {type:9, node:item});
      if(div) div.className = div.getAttribute("class").replace(main.postStatusRegex, "") + " item"+(type || "neutral");
      break;
    }
   } catch(e) {alert(e);}
  },

  // generate a refresh time
  get refTime() {
   var t=2;
   switch(GM_config.get("arinterval")) {
    case "sixth": t = 0.1666667; break; // 10 seconds
    case "third": t = 0.3333333; break; // 20 seconds
    case "half": t = 0.5; break; // 30 seconds
    case "one": t = 1; break; // 1 minute
    case "two": t = 2; break; // 2 minutes
    case "three": t = 3; break; // 3 minutes
    case "four": t = 4; break; // 4 minutes
    case "five": t = 5; break; // 5 minutes
    case "ten": t = 10; break; // 10 minutes
    case "30s2m": t = (Math.random() * 1.5) + 0.5; break; // random between 30s and 2m
    case "2m5m": t = (Math.random() * 3) + 2; break; // random between 2m and 5m
    case "5m10m": t = (Math.random() * 5) + 5; break; // random between 5m and 10m
   }
   return Math.round((t*60000)+(Math.random()*(t*250)));
  },

  // get the real url of the page
  get realURL() {
   //joe's hash checker
   var u=window.location.href, host=window.location.host, protocol=window.location.protocol+"//", hash=window.location.hash;
   if(hash!="" && main.phpRegex.test(hash)) u=protocol+host+hash.split("#")[1];
   else if(hash!="" && hash.find("#")) u=u.split("#")[0];
   //prevent unnamed hash at the end when we click older posts at the same time page refreshes
   if (u.substr(-1) === "#") u=u.split("#")[0];
   return u;
  },

  getOlderPostsButton : function(){
   var more=$g("//a[(contains(.,'Older Posts') or contains(.,'Show Older')) and contains(@class,'uiMorePagerPrimary')]", {type:9});
   return more;
  },

  // show config screen
  config : function() {
   if(main.currReqs == 0) { // if the # of requests are at 0
    GM_config.open(); // open the options menu
    try{ $(main.gameAcronym.toLowerCase()+"_msgbox").style.display = "none"; }catch(e){} // hide msg box
   }
   else {
    window.setTimeout(main.config, 1000); // check in 1 second
    main.message("Please wait... finishing requests..."); // show pls wait msg
   }
  },

  removeSkipped : function(){
   var done = $g(".//a[starts-with(@id,'item_skip_') or contains(.,'Play Ravenwood Fair') or contains(.,'Play CityVille') or contains(.,'Play FrontierVille') or contains(.,'Play Treasure Isle') or contains(.,'Play Treasure Isle')]/ancestor::*[starts-with(@id,'stream_story_') and not(contains(@id, '_collapsed'))]", {node:main.stream});
   for(var i=0,len=done.snapshotLength; i<len; i++) if(!$g(".//span[starts-with(@class,'UIActionLinks')]//a[starts-with(@id,'item_processing_')] | .//*[starts-with(@id,'stream_story_') and contains(@id,'_collapsed')]", {type:9, node:done.snapshotItem(i)})) main.remove(done.snapshotItem(i).id);
   if (main.opts["filterWishlists"]===false){
    var wishlist = $g(".//a[starts-with(@id,'item_wishlist_')]/ancestor::*[starts-with(@id,'stream_story_') and not(contains(@id, '_collapsed'))]", {node:main.stream});
    for(var i=0,len=wishlist.snapshotLength; i<len; i++) main.remove(wishlist.snapshotItem(i).id);
    wishlist=null;
   }
   done=null;
   return;
  },

  getIsStale : function(tStamp) {
   //returns true if date in tStamp differs from NOW by 24 hours or more
   var d=new Date(tStamp),d2=new Date();
   return (d2.valueOf() - d.valueOf()) > 86400000;      
   
  },

  removeDone : function() {
   //get finished posts and delete nodes
   var done = $g(".//a[starts-with(@id,'item_done_') or starts-with(@id,'item_overlimit_') or starts-with(@id,'item_failed_') or starts-with(@id,'item_skip_')]/ancestor::*[starts-with(@id,'stream_story_') and not(contains(@id, '_collapsed'))]", {node:main.stream});
   for(var i=0,len=done.snapshotLength; i<len; i++) if(!$g(".//span[starts-with(@class,'UIActionLinks')]//a[starts-with(@id,'item_processing_')] | .//*[starts-with(@id,'stream_story_') and contains(@id,'_collapsed')]", {type:9, node:done.snapshotItem(i)})) main.remove(done.snapshotItem(i).id);

   //also delete protected wishlist items if option is not checked
   if (main.opts["filterWishlists"]===false){
    var wishlist = $g(".//a[starts-with(@id,'item_wishlist_')]/ancestor::*[starts-with(@id,'stream_story_') and not(contains(@id, '_collapsed'))]", {node:main.stream});
    for(var i=0,len=wishlist.snapshotLength; i<len; i++) main.remove(wishlist.snapshotItem(i).id);     
    wishlist=null;
   }
   done=null;
   return;
  },

  removeFiltered : function() {
   var done = $g(".//a[not(starts-with(@id,'item_'))]/ancestor::*[starts-with(@id,'stream_story_') and not(contains(@id, '_collapsed'))]", {node:main.stream});
   for(var i=0,len=done.snapshotLength; i<len; i++) {
    var del = true, ssi =done.snapshotItem(i).innerHTML;
    if(ssi.find(main.gameURLpartFrV) && main.opts["filterHideFrV"]===false) del=false;  
    if(ssi.find(main.gameURLpartTI) && main.opts["filterHideTI"]===false) del=false;  
    if(ssi.find(main.gameURLpartFV) && main.opts["filterDontHideFV"]===true) del=false;  
    if(ssi.find(main.gameURLpartWS) && main.opts["filterDontHideWS"]===true) del=false;  
    if(ssi.find(main.gameURLpartRwF) && main.opts["filterHideRwF"]===false) del=false;  
    if(ssi.find(main.gameURLpartCV) && main.opts["filterHideCV"]===false) del=false;  
    
    if (del===true) main.remove(done.snapshotItem(i).id);
   }
   done=null;
   return;
  },

  // auto click "like" buttons if enabled
  like : function(id) {
   var like=$g("//a[contains(@id,'_"+id+"')]/ancestor::span/button[@name='like' and @type='submit']", {type:9});
   if(like) like.click();
  },

  expand : function() {
   var posts=$g("count(.//*[starts-with(@id,'stream_story_') and contains(@class,'"+main.gameID+"')])", {node:main.stream, type:1}),
    more=main.getOlderPostsButton();
    min = main.opts["minposts"];
   switch(min != "off" && more != null) {
    case true: if(posts < parseInt(min)) main.click(more);
       else main.opts["minposts"] = "off"; break;
   }
  },

  similarPosts : function() {
   // Auto click "show x similar posts" links
   var sp = $g(".//a[@rel='async' and contains(@ajaxify,'oldest=') and contains(@ajaxify,'newest=') and not(starts-with(@id, 'similar_post_'))] | .//a[@rel='async' and contains(.,'SHOW') and contains(.,'SIMILAR POSTS') and not(starts-with(@id, 'similar_post_'))]", {node:main.stream, type:9}),
    posts = $g("count(.//*[starts-with(@id,'stream_story_') and contains(@class,'"+main.gameID+"') and not(contains(@id,'_collapsed'))])", {node:main.stream, type:1}),
    max = main.opts["maxposts"], maxC = parseInt(max) || 9999;
   if(sp && (max == "off" || (max != "off" && posts < maxC))) {
    if(max=="off" || ((parseInt(sp.textContent.match(main.numberRegex)[0]) + posts) < maxC)) {
     sp.setAttribute("id", "similar_post_"+sp.getAttribute("ajaxify").split("stream_story_")[1].split("&")[0]);
     main.click(sp);
     return;
    } else return;
   }
  },

  olderPosts : function() {

   // Auto click "older posts" or "show older"
   var posts=$g("count(.//*[starts-with(@id,'stream_story_') and (contains(@id,'item_') or contains(@class,'"+main.gameIDFrV+"') or contains(@class,'"+main.gameIDRwF+"') )])", {node:main.stream, type:1}),
    more=main.getOlderPostsButton();
    max = main.opts["olderlimit"];
   if ((max=="off" || (posts < parseInt(max))) && more!=null) main.click(more);
   return;

  },

  printShareableFriendList : function(){
   var c, l,p = "http://www.facebook.com/profile.php?id=", chop= main.opts["chopprinting"];
   
   if(main.opts["FrVfriendlist"]){
    main.debug("Frontierville Friends Who Played Recently")
    l="";
    for (c=0,len=main.FrVfriendListHolder.length; c<len; c++){
     l = l + p + main.FrVfriendListHolder[c] + "\r";
     if(l.length > 900 && chop) {main.debug(l); l="";}
    }
    main.debug(l);
   }
   if(main.opts["TIfriendlist"]){
    main.debug("Treasureisle Friends Who Played Recently")
    l="";
    for (c=0,len=main.TIfriendListHolder.length; c<len; c++){
     l = l + p + main.TIfriendListHolder[c] + "\r";
     if(l.length > 900 && chop) {main.debug(l); l="";}
    }
    main.debug(l);    
   }
   if(main.opts["RwFfriendlist"]){
    main.debug("Ravenwood Friends Who Played Recently")
    l="";
    for (c=0,len=main.RwFfriendListHolder.length; c<len; c++){
     l = l + p + main.RwFfriendListHolder[c] + "\r";
     if(l.length > 900 && chop) {main.debug(l); l="";}
    }
    main.debug(l);    
   }
   if(main.opts["CVfriendlist"]){
    main.debug("CityVille Friends Who Played Recently")
    l="";
    for (c=0,len=main.CVfriendListHolder.length; c<len; c++){
     l = l + p + main.CVfriendListHolder[c] + "\r";
     if(l.length > 900 && chop) {main.debug(l); l="";}
    }
    main.debug(l);    
   }
   if(main.opts["WSfriendlist"]){
    main.debug("WarStorm Friends Who Played Recently")
    l="";
    for (c=0,len=main.WSfriendListHolder.length; c<len; c++){
     l = l + p + main.WSfriendListHolder[c] + "\r";
     if(l.length > 900 && chop) {main.debug(l); l="";}
    }
    main.debug(l);    
   }


   main.debug("Hit refresh on your browser to continue");
  },

  // refresh function. be sure to only do it if the config isn't up, it isn't paused, and requests are finished
  // also prevent refresh if window open
  refresh : function() {
   if(main.currReqs==0 && !$("GM_config") && !main.paused && !main.openPopup && main.opts["olderdepth"]===false) {
    //check if need to print a friends list for sharing
    if (main.special24HourBit==1) {
     if (main.opts["FrVfriendlist"] || main.opts["TIfriendlist"] || main.opts["RwFfriendlist"] || main.opts["CVfriendlist"] || main.opts["WSfriendlist"]){
      //pause and print the lists
      main.paused = true;
      main.printShareableFriendList();
      return; //prevents refresh timer from starting up again      
     }
    }

    //do refresh
    var i=0, refint=window.setInterval(function() {
     if(i >= 12 && main.currReqs==0) {
      window.clearInterval(runint);
      window.clearInterval(refint);
      if (main.oTab) main.oTab.close();
      if (main.opts["filteronly"]==1) main.toFilterpage(main.gameIDFrV); // if filter only option is enabled
      else if (main.opts["filteronly"]==2) main.toFilterpage(main.gameIDTI); // if filter only option is enabled
      else main.toHomepage(); // if filter only option is disabled or un-defined
     }
     else if(i < 12 && main.currReqs==0) i++;
     else i=0;
    }, 250);
   } else window.setTimeout(main.refresh, (main.currReqs == 0 ? 1 : main.currReqs)*1000);
  },

  dropItem : function(key, w, intv) {   
   // otherwise, clean it up and forget it
   var item = $g(".//a[contains(@id,'"+key+"')]", {type:9, node:main.stream});
   if(item) {
    //if the item was in the processing state, remove that state and color
    if (item.getAttribute("id").find("item_proc")) {
     item.setAttribute("id", "item_skip_"+key);
     main.colorCode(item, "neutral");
     if (main.requestsOpen>0) main.requestsOpen--;
    }
    main.remove(key);
   }
   if (intv) window.clearInterval(intv);
  },

  // update debug status box
  status : function() {
   switch(main.pauseCount) {case 0: if(!main.pauseClick) main.paused=false; break;}
   var statusText = !main.boxFull ? (!main.paused?"["+main.gameAcronym+"] "+main.currReqs+" requests currently ("+main.openCount+" done)":(!main.pauseClick?("["+main.pauseCount+"] "):"")+"[PAUSED] Click this box to unpause") : "[STOPPED] Gift box is full - Refresh to restart";
   switch(document.title != statusText) {case true: document.title=statusText; break;}
   switch($("status_WM").textContent != statusText) {case true: $("status_WM").textContent = statusText; break;}
   if(!main.pauseClick && main.paused && main.pauseCount>0) main.pauseCount--;
  },

  // display a message in the middle of the screen
  message : function(t) {
   if(GM_config.get("newuserhints") === false) return;
   var box = $(main.gameAcronym.toLowerCase()+"_msgbox");
   if(box=="null" || box==null || box.nodeType !== 1) $("contentArea").insertBefore(box=main.create("div", {id:main.gameAcronym.toLowerCase()+"_msgbox",style:"background:#CAEEFF; border:2px solid #4AC5FF; z-index:998; padding:20px; -moz-border-radius:6px; -moz-appearance:none; display:none;"}, new Array(
    main.create("div", {style:"width:100%; text-align:right;"}, new Array(
     main.create("a", {textContent:"Close", style:"font-size:9pt; font-family:myriad pro,tahoma,arial,verdana; color:#000000;", href:"javascript:void(0);", onclick:function(e){ e.target.parentNode.parentNode.style.display = "none"; }})
    )),
    main.create("br"),
    main.create("span", {innerHTML:t, style:"color:#002537; font-size:16pt; font-family:myriad pro,tahoma,arial,verdana;"})
    )), $("contentArea").firstChild);
   else box.getElementsByTagName("span")[0].innerHTML = t;
   if(box.style.display=="none") fade(box.id, "in", "fast");
  },

  setAsAccepted : function(key, w) {
   //autolike if turned on
   if(main.opts["autolike"]===true) main.like(key);

   var accTime=main.getAcceptedTime(), acc=main.getAccepted(),item=$g("//a[contains(@id,'"+key+"')]", {type:9});

   item.setAttribute("id", "item_done_"+key);
   item.textContent=
    w.startsWith("CV")?"Tried": (((w.find("send")?"Sent ":w.find("wishlist")?"":"Got ") + main.accText[w]) || main.accDefaultText);
   main.colorCode(item, w.startsWith("CV")?"city":"done");
   main.openCount++;
   accTime[w][key] = new Date().getTime();
   main.setAcceptedTime(accTime);
   acc[w].push(key);
   main.setAccepted(acc);
   main.remove(key);
  },

  setAsFailed : function(key, w, comment){
   var item=$g("//a[contains(@id,'"+key+"')]", {type:9}), failed=main.getFailed(), failedTime=main.getFailedTime();

   item.setAttribute("id", "item_failed_"+key);  
   item.textContent = comment;
   main.colorCode(item, "failed");
   if (main.opts["countfailed"]) main.openCount++; 
   failedTime[w][key] = new Date().getTime();
   main.setFailedTime(failedTime);
   failed[w].push(key);
   main.setFailed(failed);
   main.remove(key);
  },

  onFrameLoad_RwF : function(key, w){
   //main.debug("frameload_rwf");
   //RavenWood Fair has a different kind of popup window and we need to find the send button
   tabStream=main.oTab.document;

   

0 comments:

Post a Comment