// case-hardened Twitter search badge; Kent Brewster 2009
// http://kentbrewster.com/twitter-search-badge for info
( function() { 
   var trueName = '';
   for (var i = 0; i < 16; i++) { 
      trueName += String.fromCharCode(Math.floor(Math.random() * 26) + 97); 
   }
   window[trueName] = {};
   var $ = window[trueName];
   $.d = document;
   $.f = function() {
      return {      
         init : function(target) {
            var k = $.d.getElementsByTagName('SCRIPT');
            var n = k.length;
            for (var i = 0; i < n; i++) {
               if (k[i].src.match(target)) {
                  $.a = {};
                  if (k[i].innerHTML) {
                     $.a = $.f.parseJson(k[i].innerHTML);
                  }
                  $.f.houseKeep();
                  $.s = $.d.createElement('DIV');
                  $.f.buildStructure();
                  $.f.buildPresentation();
                  $.f.buildBehavior();
                  k[i].parentNode.insertBefore($.s, k[i]);
                  k[i].parentNode.removeChild(k[i]);
                  break;
               }
            }         
         },
         parseJson : function(json) {
            this.parseJson.data = json;
            if ( typeof json !== 'string') {
               return {"err":"trying to parse a non-string JSON object"};
            }
            try {
               var f = Function(['var document,top,self,window,parent,Number,Date,Object,Function,',
                  'Array,String,Math,RegExp,Image,ActiveXObject;',
                  'return (' , json.replace(/<\!--.+-->/gim,'').replace(/\bfunction\b/g,'function­') , ');'].join(''));
               return f();
            } catch (e) {
               return {"err":"trouble parsing JSON object; running with defaults"};
            }
         },
         houseKeep : function() {
            var defaults = { 
               "count" : 10,
               "height" : 350,
               "width" : 300,
               "background" : "#fff",
               "color":"#000",
               "border" : "1px solid black",
               "headerBackground" : "#ffa", 
               "headerColor" : "#000",
               "evenBackground" : "#fff",
               "oddBackground" : "#eee",
               "linkColor" : "#00e",
               "linkColorVisited" : "#551A8B",
               "linkHoverColor" : "$f7f7f7",
               "padding" : 5
            };
            for (var d in defaults) { 
               if ($.a[d] === undefined) { 
                  $.a[d] = defaults[d]; 
               } 
            }
            $.p = [];
         },
         buildBehavior : function() {
            if ($.a.err) {
               alert($.a.err);
            } else {
               if ($.a.query) {
                  $.s.q.value = $.a.query;
                  $.f.runSearch();
               }
               setInterval($.f.runSearch, 1000);
            }
         },
         buildPresentation : function () {
            var ns = $.d.createElement('style');
            $.d.getElementsByTagName('head')[0].appendChild(ns);
            if (!window.createPopup) {
               ns.appendChild($.d.createTextNode(''));
               ns.setAttribute("type", "text/css");
            }
            var s = $.d.styleSheets[$.d.styleSheets.length - 1];
            var rules = {
               "*" : "{margin:0;padding:0;text-align:left;color:" + $.a.color + ";font:13px/1.2em tahoma,verdana,arial,helvetica,clean,sans-serif;}",
               "" : "{zoom:1;width:" + ($.a.width) + "px;background:" + $.a.background + ";border:" + $.a.border + ";padding:5px;}",
               "a" : "{text-decoration:none; color:" + $.a.linkColor + ";cursor:pointer;}",
               "a:visited" : "{color:" + $.a.linkColorVisited + ";}",
               "a:hover":"{text-decoration:underline;}",
               "cite" : "{font-weight:bold;font-style:normal;}",
               "ul" : "{list-style:none; margin:5px;height:" + $.a.height + "px;overflow-x:hidden;overflow-y:auto;border:1px solid #ccc;}",
               "p" : "{font-size:92%;text-align:right;padding:" + $.a.padding + "px; margin:0;}",
               "li" : "{list-style:none; margin:0;border-bottom:1px dashed #ccc;padding:" + $.a.padding + "px;}",
               "li:hover" : "{background-color:" + $.a.linkHoverColor + "}",
               "input":"{background: transparent url('http://twitter.com/favicon.ico') 0 50% no-repeat; text-indent:18px; width:100%;border:1px solid #ccc;}",
               "date" : "{display:block;margin-top:" + $.a.padding + "px; text-align:right; font-family:georgia; font-style:italic; font-size:87%;}",
               "date:after" : "{clear:both; content:\".\"; display:block; height:0; visibility:hidden; }",
               "img" : "{margin:" + $.a.padding + "px " + $.a.padding + "px 0 0; height:36px; width:36px;border:1px solid #000;}",
               ".hidden" : "{display:none;}"
            };
            var ieRules = "";
            for (r in rules) {
               var selector = '.' + trueName + ' ' + r;
               var t = rules[r].replace(/;/g, '!important;');
               if (!window.createPopup) {
                  var theRule = $.d.createTextNode(selector + t);
                  ns.appendChild(theRule);
               } else {
                  ieRules += selector + t;
               }
            } 
            if (window.createPopup) { 
               s.cssText = ieRules; 
            }
         },
         buildStructure : function() {
            $.s.className = trueName;         
            $.s.q = $.d.createElement('INPUT');
            $.s.appendChild($.s.q);
            if ($.a.hideQuery) {
               $.s.q.className = 'hidden';
            }
            $.s.r = $.d.createElement('UL');
            $.s.r.className = 'hidden';
            $.s.appendChild($.s.r);
            $.s.f = $.d.createElement('P');
            $.s.f.className = 'hidden';
            var a = $.d.createElement('A');
            a.innerHTML = 'get this';
            a.target = '_blank';
            a.href = 'http://kentbrewster.com/twitter-search-badge';
            $.s.f.appendChild(a);
            $.s.appendChild($.s.f);
         },         
         runSearch : function() {
            if ($.s.q.value) {
               if ($.s.q.value !== $.lastQuery) {
                  $.lastQuery = $.s.q.value;
                  var n = $.p.length;
                  var id = trueName + '.p[' + n + ']';
                  $.p[n] = function(r) {
                     delete($.p[n]);
                     $.f.removeScript(id);
                     $.f.renderSearch(r); 
                  };
                  var url = 'http://search.twitter.com/search.json?rpp=' + $.a.count + '&q=' + encodeURIComponent($.s.q.value) +'&callback=' + id;
                  $.f.runScript(url, id);
               }
            } else {
               if ($.lastQuery) {
                  $.lastQuery = '';
                  $.s.r.innerHTML = '';
                  $.s.r.className = $.s.f.className = 'hidden';
               }
            }
         },
         stuffQuery : function(v, p) {
            if (p) {
               $.s.q.value = p + v;
            } else {
               $.s.q.value = v;
            }
         },
         renderSearch : function(z) {
            $.s.r.innerHTML = $.s.r.className = '';
            var r = z.results;
            if (r.length) {
               var n = r.length;
               for (var i = 0; i < n; i++) {
                  var li = $.d.createElement('LI');
                  var a = $.d.createElement('A');
                  a.href = 'http://twitter.com/' + r[i].from_user;
                  a.title = r[i].from_user + ' on Twitter';
                  a.target = '_twitter';
                  var img = $.d.createElement('IMG');
                  img.align = 'left';
                  img.src = r[i].profile_image_url;  
                  a.appendChild(img);
                  li.appendChild(a);                  
                  var cite = $.d.createElement('CITE');
                  var a = $.d.createElement('A');
                  a.innerHTML = r[i].from_user;
                  a.onclick = function() {
                     $.s.q.value = 'from:' + this.innerHTML;
                  }
                  cite.appendChild(a);
                  li.appendChild(cite);
                  li.appendChild($.d.createTextNode(': '));
                  var span = $.d.createElement('SPAN');
                  var raw = r[i].text;
                  var cooked = raw.replace(/\/u([^ ]+)/gi, "&#$1;");
                  cooked = cooked.replace(/http:\/\/([^ ]+)/g, "<a href=\"http://$1\" target=\"_blank\">http://$1</a>");
                  var woo = '@<a onclick="' + trueName + '.f.stuffQuery(this.innerHTML, \'from:\');">$1</a>';
                  cooked = cooked.replace(/@([\w*]+)/g, woo);
                  var yay = '#<a onclick="' + trueName + '.f.stuffQuery(this.innerHTML);">$1</a>';
                  cooked = cooked.replace(/#([\w*]+)/g, yay)
                  span.innerHTML = cooked;
                  li.appendChild(span);
                  li.appendChild($.d.createTextNode(' '));
                  var date = $.d.createElement('DATE');
                  var a = $.d.createElement('A');
                  a.innerHTML = r[i].created_at.split(' +')[0];
                  a.href = 'http://twitter.com/' + r[i].from_user + '/status/' + r[i].id;
                  a.target = '_twitter';
                  date.appendChild(a);
                  li.appendChild(date);
                  $.s.r.appendChild(li);
               }
            } else {
               var li = $.d.createElement('LI');
               li.innerHTML = 'Got nothing, sorry!';
               $.s.r.appendChild(li);
            }
            $.s.f.className = '';
         },
         runScript : function(url, id) {
            var s = $.d.createElement('script');
            s.id = id;
            s.type ='text/javascript';
            s.src = url;
            $.d.getElementsByTagName('body')[0].appendChild(s);
         },
         removeScript : function(id) {
            if ($.d.getElementById(id)) {
               var s = $.d.getElementById(id);
               s.parentNode.removeChild(s);
            }
         }         
      };
   }();
// in production, be sure to use full path:
// var thisScript = /^https?:\/\/[^\/]*yourdomain.com\/yourscript.js$/;
   var thisScript = /tsb.js$/;
   if(typeof window.addEventListener !== 'undefined') {
      window.addEventListener('load', function() { 
         $.f.init(thisScript); 
      }, false);
   } else if(typeof window.attachEvent !== 'undefined') {
      window.attachEvent('onload', function() { 
         $.f.init(thisScript); 
      });
   }
})();
