var KENTBREW = window.KENTBREW || {};

KENTBREW.util = function() {
   var $ = {};
   $.head = document.getElementsByTagName('head')[0];
   return {
      init : function() {
         KENTBREW.util.debug = document.getElementById('debug');
         KENTBREW.util.pad = 5;
      },
      getDomainInfo : function(link) {
         var domainInfo = [];
         var nameSpace = link.split('?')[0].split('//')[1].split('/')[0].split('.');
         var domain = nameSpace[nameSpace.length-2] + '.' + nameSpace[nameSpace.length-1];
         if ((nameSpace[nameSpace.length-1].length) == 2 || (nameSpace[nameSpace.length-1].length) == 4) {
            domain = nameSpace[nameSpace.length-3] + '.' + domain;
         }         
         var site = link.split('?')[0].split('//')[1].split('/')[0];
         domainInfo[0] = domain;
         domainInfo[1] = site;
         return domainInfo;
      },
      runScript : function(url, id) {
         var s = document.createElement('script');
         s.id = id;
         s.type ='text/javascript';
         s.src = url;
         $.head.appendChild(s);
      },
      removeScript : function(id) {
         if (document.getElementById(id)) {
            $.head.removeChild(document.getElementById(id));
         }
      }
   };
}();

KENTBREW.searchBox = function() {
   var $ = {};
   $.util = KENTBREW.util;
   return {
      init : function(el) {
         $.searchBox = document.getElementById(el);
         $.searchBox.style.display = 'block';
         KENTBREW.searchBox.q = $.searchBox.getElementsByTagName('INPUT')[0];
         $.q = KENTBREW.searchBox.q;
         $.q.value = '';
         $.q.style.width = $.searchBox.offsetWidth - $.util.pad * 2;
         $.lastQuery = '';
         setInterval('KENTBREW.searchBox.doStuff()', 1000);         
      },
      doStuff : function(el) {
         if ($.q.value) {
            if ($.q.value != $.lastQuery) {
               $.lastQuery = $.q.value;
               KENTBREW.bbcBadge.runSearch($.q.value);
               KENTBREW.blogSearch.runSearch($.q.value);
            }
         }
      }
   };
}();      

KENTBREW.bbcBadge = function() {
   var $ = {};
   $.util = KENTBREW.util;
   return {
      init : function(el) {
         $.bbc = document.getElementById(el);
         $.r = $.bbc.getElementsByTagName('DL')[0];
         KENTBREW.bbcBadge.ping = [];
      },
      runSearch : function(q) {
         if (q) {
               var n = KENTBREW.bbcBadge.ping.length;
               $.bbc.className = 'badge inProgress';
               KENTBREW.bbcBadge.ping[n] = function(result) {
                  delete KENTBREW.bbcBadge.ping[n];
                  $.util.removeScript('KENTBREW.bbcBadge.ping[' + n + ']');
                  $.bbc.style.display = 'block';
                  $.r.innerHTML = '';
                  if (result.value.items.length) {
                     for (var i = 0; i < result.value.items.length; i++) {
                        var dt = document.createElement('DT');
                        
                        var a = document.createElement('A');
                        a.rel = result.value.items[i].title;
                        a.innerHTML = '&#167;';
                        a.title = 'Search for this.';
                        a.onmouseup = function() {
                           KENTBREW.searchBox.q.value = this.rel;                         
                        }
                        
                        dt.appendChild(a);
                        
                        dt.appendChild(document.createTextNode(' '));                        
                        
                        var a = document.createElement('A');
                        a.innerHTML = result.value.items[i].title;
                        a.href = result.value.items[i].guid.content;
                        a.target = '_blank';
                        a.onmouseover = function() { 
                           this.parentNode.nextSibling.style.display = 'block'; 
                           KENTBREW.getContext.runSearch(q, this.innerHTML  + ' ' + this.parentNode.nextSibling.innerHTML);
                        }
                        a.onmouseout = function() { 
                           this.parentNode.nextSibling.style.display = 'none'; 
                        };
                        dt.appendChild(a);
                        $.r.appendChild(dt);
                        var dd = document.createElement('DD');
                        dd.innerHTML = result.value.items[i].description;
                        dd.style.zIndex = i + 100;
                        dd.style.width = $.bbc.offsetWidth - $.util.pad * 6;
                        dd.style.display = 'none';
                        $.r.appendChild(dd);
                     }
                  } else {
                     var dt = document.createElement('DT');
                     dt.innerHTML = 'Nothing found, sorry!';
                     $.r.appendChild(dt);
                  }
                  $.bbc.className = 'badge';
               };
               var callback = 'KENTBREW.bbcBadge.ping[' + n + ']';
               var url = 'http://pipes.yahoo.com/pipes/zIQi0Iy72xGJ3NMhJhOy0Q/run';
               url += '?s=http://newsapi.bbc.co.uk/feeds/search/news/' + q;            
               url += '&_render=json';
               url += '&_callback=' + callback;
               $.util.runScript(url, callback);
               return n;
         }
      }
   };
}();

KENTBREW.getContext = function() {
   var $ = {};
   $.util = KENTBREW.util;
   return {
      init : function(el) {
         $.context = document.getElementById(el);
         $.tags = [];      
         $.tagList = $.context.getElementsByTagName('UL')[0];
         $.lastQuery = '';
         $.lastContext = '';
         KENTBREW.getContext.ping = [];
         $.hashStash = [];
      },
      runSearch : function(query, context) {
         if (query && context) {
            hash = 0;
            for (var i = 0; i < context.length; i++) {
               hash += context.charCodeAt(i);
            } 
            hash = hash * context.length;
            for (var i=0; i<$.hashStash.length; i++) {
              if ($.hashStash[i] == hash) {
                 return false;
              }
            }
            
            $.context.style.display = 'block';
            $.context.className = 'badge inProgress';
            
            $.hashStash[$.hashStash.length] = hash;
            var n = KENTBREW.getContext.ping.length;
            KENTBREW.getContext.ping[n] = function (result) {
               var dupe = 0;
               delete KENTBREW.getContext.ping[n];
               var sid = 'KENTBREW.getContext.ping[' + n + ']';
               $.util.removeScript(sid);
               if (result.ResultSet) {
                  for (var i = 0; i < result.ResultSet.Result.length; i++) {
                     dupe = 0;
                     for (j = 0; j < $.tags.length; j++) {
                        if ($.tags[j].name == result.ResultSet.Result[i]) {
                           $.tags[j].count++;
                           dupe = 1;
                        }
                     }
                     if (!dupe) {
                        var t = $.tags.length;
                        if (!t) { t = 0;}
                        $.tags[t] = {};
                        $.tags[t].name = result.ResultSet.Result[i];
                        $.tags[t].count = 1;
                     }
                  }
                  if ($.tags.length) {
                     $.tags.sort( function(a, b) { return a.count - b.count; } );
                     $.tags.reverse( function(a, b) { return a.count - b.count; } );
                  }
               }
               $.tagList.innerHTML = '';
               for (var i = 0; i < $.tags.length; i++) {
                  var li = document.createElement('LI');
                  var a = document.createElement('A');
                  a.onclick = function() {
                     KENTBREW.searchBox.q.value = this.innerHTML;
                  }      
                  a.innerHTML = $.tags[i].name;
                  li.appendChild(a);
                  if ($.tags[i].count > 1) {
                     li.appendChild(document.createTextNode(' (' + $.tags[i].count + ')'));
                  }
                  $.tagList.appendChild(li);
               }
               $.context.className = 'badge';
            };

            var callback = 'KENTBREW.getContext.ping['  + n + ']';
            var url = 'http://search.yahooapis.com/ContentAnalysisService/V1/termExtraction';
            url += '?appid=KENTBREWgetContext';
            url += '&output=json';
            url += '&context=' + escape(context);
            url += '&query=' + escape(query);
            url += '&callback=' + callback;
               
            $.util.runScript(url, callback);
            return n;
         }         
      }
   };
}();

KENTBREW.blogSearch = function() {
   var $ = {};
   $.util = KENTBREW.util;
   return {
      init : function(el) {
         $.blogSearch = document.getElementById(el);
         $.r = $.blogSearch.getElementsByTagName('DL')[0];
         KENTBREW.blogSearch.ping = [];
      },
      runSearch : function(query) {
         if (query) {
            var n = KENTBREW.blogSearch.ping.length;
            $.blogSearch.className = 'badge inProgress';
            
            KENTBREW.blogSearch.ping[n] = function(result) {
               delete KENTBREW.blogSearch.ping[n];
               $.blogSearch.style.display = 'block';
               var sid = 'KENTBREW.blogSearch.ping[' + n + ']';
               $.util.removeScript(sid);
               $.r.innerHTML = '';
		  if (result.value.items.length) {
                     for (var i = 0; i < result.value.items.length; i++) {
                        var dt = document.createElement('DT');

                        var a = document.createElement('A');
                        a.rel = result.value.items[i].title;
                        a.innerHTML = '@';
                        a.title = 'Search for feeds containing this title.';
                        a.onmouseup = function() {
                           KENTBREW.feedSearch.runSearch(this);
                        }
                        
                        dt.appendChild(a);
                        
                        dt.appendChild(document.createTextNode(' '));

                        var a = document.createElement('A');
                        a.innerHTML = result.value.items[i].title;
                        a.href = result.value.items[i].link;
                        a.target = '_blank';
                        a.onmouseover = function() { 
                	   this.parentNode.nextSibling.style.display = 'block'; 
                	   KENTBREW.getContext.runSearch(query, this.innerHTML  + ' ' + this.parentNode.nextSibling.innerHTML);
                        }
                        a.onmouseout = function() { 
                           this.parentNode.nextSibling.style.display = 'none'; 
                        };
                        dt.appendChild(a);
                        $.r.appendChild(dt);
                        var dd = document.createElement('DD');
                        dd.innerHTML = result.value.items[i].description;
                        dd.style.zIndex = i + 100;
                        dd.style.width = $.blogSearch.offsetWidth - $.util.pad * 6;
                        
                        dd.style.display = 'none';
                        $.r.appendChild(dd);
                     }
                  } else {
                     var dt = document.createElement('DT');
                     dt.innerHTML = 'Nothing found, sorry!';
                     $.r.appendChild(dt);
                  }
               $.blogSearch.className = 'badge';
            };
            var callback = 'KENTBREW.blogSearch.ping[' + n + ']';
            var url = 'http://pipes.yahoo.com/pipes/xAEXocTG2xGqFrhpJphxuA/run';
            url += '?_render=json';
            url += '&_callback=' + callback;
            url += '&q='+ escape(query);
            url += '&n=20';
            
            KENTBREW.util.runScript(url, callback);
            return n;
         }
      }
   };
}();

KENTBREW.feedSearch = function() {
   var $ = {};
   $.util = KENTBREW.util;
   return {
      init : function(el) {
         $.feedSearch = document.getElementById(el);
         $.r = $.feedSearch.getElementsByTagName('DL')[0];
         KENTBREW.feedSearch.ping = [];
      },
      runSearch : function(query) {
         if (query) {
            var n = KENTBREW.feedSearch.ping.length;
            $.feedSearch.className = 'badge inProgress';
            KENTBREW.feedSearch.ping[n] = function(result) {
               delete KENTBREW.feedSearch.ping[n];
               $.feedSearch.style.display = 'block';
               var sid = 'KENTBREW.feedSearch.ping[' + n + ']';
               $.util.removeScript(sid);
               $.r.innerHTML = '';
                  var found = 0;
		  if (result.ResultSet.totalResultsAvailable) {
                     for (var i = 0; i < result.ResultSet.totalResultsReturned; i++) {
                        var dt = document.createElement('DT');
                        
                        var theUrl = result.ResultSet.Result[i].feedUrl.split(' ')[0].split('?')[0];
                        
                        var a = document.createElement('A');
                        a.rel = theUrl;
                        a.innerHTML = '+';
                        a.title = 'Add to My Yahoo!';
                        a.href = 'http://add.my.yahoo.com/rss?url=' + theUrl;
                        a.target = '_blank';
                        dt.appendChild(a);

                        dt.appendChild(document.createTextNode(' '));
                        
                        var a = document.createElement('A');
                        a.innerHTML = result.ResultSet.Result[i].Title;
                        a.onmouseover = function() { 
                	   this.parentNode.nextSibling.style.display = 'block'; 
                	   KENTBREW.getContext.runSearch(query, this.innerHTML  + ' ' + this.parentNode.nextSibling.innerHTML);
                        }
                        a.onmouseout = function() { 
                           this.parentNode.nextSibling.style.display = 'none'; 
                        };
                        a.href = theUrl; 
                        a.target = '_blank';
                        
                        dt.appendChild(a);
                        $.r.appendChild(dt);
                        var dd = document.createElement('DD');
                        dd.innerHTML = result.ResultSet.Result[i].Summary;
                        dd.style.zIndex = i + 100;
                        dd.style.width = $.feedSearch.offsetWidth - $.util.pad * 6;
                        dd.style.display = 'none';
                        $.r.appendChild(dd);
                        found++;
                     }
                  }
                  
                  if (!found) {
                     var dt = document.createElement('DT');
                     dt.innerHTML = 'Can\'t find a feed, sorry!';
                     $.r.appendChild(dt);
                  }
               $.feedSearch.className = 'badge';
            };
            var callback = 'KENTBREW.feedSearch.ping[' + n + ']';
            var url = 'http://search.yahooapis.com/WebSearchService/V1/webSearch';
            url += '?appid=YahooDemo';
            url += '&query=' + escape(query.rel);
            url += '&language=en';
            url += '&results=20';
            url += '&format=rss';
            url += '&output=json';
            url += '&callback=' + callback;
            $.util.runScript(url, callback);
            return n;
         }
      }
   };
}();

window.onload=function() {
  KENTBREW.util.init();
  KENTBREW.searchBox.init('searchBox');
  KENTBREW.bbcBadge.init('bbcBadge');
  KENTBREW.getContext.init('context');
  KENTBREW.blogSearch.init('blogSearch');
  KENTBREW.feedSearch.init('feedSearch');
};