// jAdvancedFeedControl.js

(function(){
 function load(){
  var lstrings={
   "searchHint":'startups',
   "searchButtonText":'Find Feeds!',
   "months":['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
   "minutesAgo":' minutes ago',
   "oneHourAgo":'1 hour ago',
   "hoursAgo":' hours ago',
   "noFeedsApi":'The Google AJAX Feeds API has not been loaded.',
   "autoTranslate":'Auto (No translation)'
  },
  gf,gl;
  if(google&&google.feeds){
   gf=google.feeds
   if(google.language){gl=google.language}
  }
  else{alert(lstrings.noFeedsApi)}

  function AdvancedFeedControl(opt_options){
   this.options={
    "dateFormat":'mdy',
    "refreshInterval":75,
    "linkTarget":"_top"
   };
   if(typeof(opt_options)=='object'){
    for(var i in opt_options){
     this.options[i]=opt_options[i]
    }
   }
   opt_options=this.options;
   this.feeds=[];
   var z=this;
   this.container=createDiv('gfc-control',[
    this.searchBox=createElement('form',null,[
     createElement('table','gfc-search-box',[
      createElement('tbody',null,[
       createElement('tr',null,[
        createElement('td','gfc-input',[
         this.input=createElement('input','gfc-input',null,{"type":"text","value":(opt_options.searchHint?opt_options:lstrings).searchHint,onfocus:toggleHintString,onblur:toggleHintString})
        ]),
        createElement('td','gfc-search-button',[
         createElement('input','gfc-searchButton',null,{"type":"submit","value":(opt_options.searchButtonText?opt_options:lstrings).searchButtonText})
        ])
       ]),
       gl?createElement('tr',null,[
        createElement('td',null,[
         this.languageSelect=createElement('select','gfc-translateMenu',null,{onchange:createClosure(this,AdvancedFeedControl.prototype.translateAll,[])})
        ])
       ]):null
      ])
     ])
    ],{'onsubmit':function(e){
     if(!e){e=window.event}
     z.findFeeds();
     if(e.preventDefault){e.preventDefault()}
     return false
    }}),
    this.resultsBox=createDiv('gfc-resultsbox-visible')
   ]);
   if(this.languageSelect){
    this.languageSelect.options[0]=new Option(lstrings.autoTranslate,'');
    var re=/^UNKNOWN$/;
    for(var i in gl.Languages){
     if(!i.match(re)&&google.language.isTranslatable(gl.Languages[i])){
      this.languageSelect.options[this.languageSelect.length]=new Option(i,gl.Languages[i])
     }
    }
   }
  }
  AdvancedFeedControl.prototype.addFeed=function(a){
   var feedWrapper={
    feed:new gf.Feed(a),
    url:a
   };
   if(typeof(this.options.numEntries)=='number'){
    feedWrapper.feed.setNumEntries(this.options.numEntries)
   }
   feedWrapper.html=addChild(this.resultsBox,createDiv('gfc-resultsRoot',[
    createDiv('gfc-resultsHeader',[
     createDiv('gfc-removeFeedButton',' ',{"onclick":createClosure(this,AdvancedFeedControl.prototype.removeFeed,[feedWrapper]),"title":"remove this feed"}),
     feedWrapper.titleDiv=createDiv('gfc-title')
    ]),
    feedWrapper.resultsDiv=createDiv('gfc-results')
   ]));
   this.feeds.push(feedWrapper);
   this.loadFeed(feedWrapper);
   return feedWrapper
  };
  AdvancedFeedControl.prototype.loadFeed=function(a){
   a.feed.load(createClosure(this, AdvancedFeedControl.prototype.feedLoadCallback, [a]));
   if(this.options.refreshInterval){
    clearTimeout(a.refreshTimer);
    a.refreshTimer=setTimeout(createClosure(this,AdvancedFeedControl.prototype.loadFeed,[a]),this.options.refreshInterval*60000);
   }
  };
  AdvancedFeedControl.prototype.refreshFeeds=function(a){
   a=a?a:this.feeds;
   for(var i=0;i<a.length;i++){
    this.loadFeed(a)
   }
  }
  AdvancedFeedControl.prototype.removeFeed=function(a){
   for(var i=0;i<this.feeds.length;i++){
    var feed=this.feeds[i];
    if((typeof(a)=='string'&&feed.url==a)||(typeof(a)=='object'&&a===feed)){
     this.resultsBox.removeChild(feed.html);
     this.feeds.splice(i,1);
     break
    }
   }
   delete(a)
  };
  AdvancedFeedControl.prototype.removeAllFeeds=function(){
   while(this.feeds.length>0){
    this.removeFeed(this.feeds[0])
   }
  }
  AdvancedFeedControl.prototype.findFeeds=function(a,e){
   this.removeAllFeeds();
   gf.findFeeds(
    typeof(a)=='string'?a:this.input.value,
    createClosure(this,AdvancedFeedControl.prototype.findFeedsCallback,[])
   );
   return false;
  };
  AdvancedFeedControl.prototype.feedLoadCallback=function(a, b){
   var els=[a.titleDiv,a.resultsDiv];
   for(var i=0;i<els.length;i++){
    clearChildren(els[i]);
   }
   addChild(a.titleDiv, b.feed.title);
   a.titleDiv.setAttribute('title',b.feed.description);
   var resultsDiv=a.resultsDiv;
   for(var i=0;i<b.feed.entries.length;i++){
    var entry=b.feed.entries[i];
    resultsDiv.appendChild(this.createHtml(entry));
    this.translateEntry(entry)
   }
   a.response=b
  };
  AdvancedFeedControl.prototype.translateEntry=function(entry){
    if(google.language&&this.languageSelect&&this.languageSelect.selectedIndex!=0){
     google.language.translate(
      '<title>'+(entry.title?entry.title:'')+'</title><snippet>'+(entry.contentSnippet?entry.contentSnippet:'')+'</snippet>',
      '',
      this.languageSelect.options[this.languageSelect.selectedIndex].value,
      createClosure(this,AdvancedFeedControl.prototype.translateCallback,[entry])
     )
    }
  }
  AdvancedFeedControl.prototype.translateAll=function(){
   for(var i=0;i<this.feeds.length;i++){
    if(!this.feeds[i].response){continue}
    var entries=this.feeds[i].response.feed.entries;
    for(var j=0;j<entries.length;j++){
     this.translateEntry(entries[j])
    }
   }
  }
  AdvancedFeedControl.prototype.translateCallback=function(entry,response){
   if(response.error){return}
   var html=entry.html.firstChild,
   matches=response.translation.match(/^<title>(.*?)<\/title><snippet>(.*?)<\/snippet>$/);
   entry.tTitle=matches&&matches[1]?matches[1]:null;
   entry.tContentSnippet=matches&&matches[2]?matches[2]:null;
   html.replaceChild(createDiv('gf-title',[
    createElement('a','gf-title',[entry.tTitle?entry.tTitle:entry.title],{"href":entry.link,target:this.options.linkTarget})
   ]),html.firstChild);
   html.replaceChild(createDiv('gf-snippet',[entry.tContentSnippet?entry.tContentSnippet:entry.contentSnippet]),html.lastChild);
  };
  AdvancedFeedControl.prototype.findFeedsCallback=function(a){
   if(a.error){return}
   for(var i=0;i<a.entries.length;i++){
    this.addFeed(a.entries[i].url);
   }
  };
  AdvancedFeedControl.prototype.draw=function(a,b){
   a=typeof(a)=='string'?document.getElementById(a):a;
   a.appendChild(this.container);
  };
  AdvancedFeedControl.prototype.createHtml=function(a){
   return a.html=createDiv('gfc-result',[
    createDiv('gf-result',[
     createDiv('gf-title',[
      createElement('a','gf-title',[a.title],{"href":a.link,target:this.options.linkTarget})
     ]),
     createDiv('gf-relativePublishedDate',[this.generateRelativePublishedDate(a.publishedDate)]),
     createDiv('gf-publishedDate',[this.generateAbsolutePublishedDate(a.publishedDate)]),
     createDiv('gf-snippet',[a.contentSnippet])
    ])
   ]);
  };
  AdvancedFeedControl.prototype.generateRelativePublishedDate=function(a,format){
   var then=a=typeof(a)=='string'?new Date(a):a,
   now=(new Date).getTime(),
   diff=(now-then.getTime())/1000;
   if(!format){format=lstrings.dateFormat}
   if(isNaN(diff)||diff<=120){
    return 2+(this.options.minutesAgo?this.options:lstrings).minutesAgo
   }
   if(diff<3600){
    return Math.round(diff/60).toString()+(this.options.minutesAgo?this.options:lstrings).minutesAgo
   }
   if(diff<86400){
    var hours=Math.round(diff/3600);
    if(hours==1){
     return (this.options.oneHourAgo?this.options:lstrings).oneHourAgo
    }
    return hours.toString()+(this.options.hoursAgo?this.options:lstrings).hoursAgo
   }
   return (format=='ymd'?then.getFullYear().toString()+' ':'')+' '+(format=='dmy'?then.getDate().toString()+(this.options.months?this.options:lstrings).months[then.getMonth()]:(this.options.months?this.options:lstrings).months[then.getMonth()]+' '+then.getDate().toString())+(format=='ymd'?'':' '+then.getFullYear())
  };
  AdvancedFeedControl.prototype.generateAbsolutePublishedDate=function(a,format){
   if(!format){format=lstrings.dateFormat}
   var then=typeof(a)=='string'?new Date(a):a;
   if(then=='Invalid Date'){then=new Date}
   return (format=='ymd'?then.getFullYear().toString()+' ':'')+' '+(format=='dmy'?then.getDate().toString()+(this.options.months?this.options:lstrings).months[then.getMonth()]:(this.options.months?this.options:lstrings).months[then.getMonth()]+' '+then.getDate().toString())+(format=='ymd'?'':' '+then.getFullYear())
  };
  AdvancedFeedControl.prototype.setNumEntries=function(a){
   for(var i=0;i<this.feeds.length;i++){
    var feed=this.feeds[i];
    feed.feed.setNumEntries(a);
    this.loadFeed(feed);
   }
   this.options.numEntries=a;
  };
  AdvancedFeedControl.prototype.setLinkTarget=function(a){
   this.options.linkTarget=a;
   this.refreshFeeds();
  }
  
  
  // utility functions
  function createElement(tag, className, children, attributes, styles){ // general element creation
   var el=document.createElement(tag);
   if(typeof(className)=='string'){el.className=className}
   if(children&&children.constructor!==Array){
    children=[children]
   }
   if(children){
    for(var i=0;i<children.length;i++){
     addChild(el, children[i]);
    }
   }
   if(typeof(attributes)=='object'){
    var re=/^on/;
    for(var i in attributes){
     if(i.match(re)){
      addEvent(i.replace(re,''),attributes[i],el)
     }else{
      el.setAttribute(i, attributes[i])
     }
    }
   }
   if(typeof(styles)=='object'){
    var re=/-(\S)/,
    ref=function(a,b){return b.toUpperCase()}
    for(var i in styles){
     el.style[i.replace(re,ref)]=styles[i]
    }
   }
   return el
  }
  
  function createDiv(className, children, attributes, styles){ // create a Div
   return createElement('div', className, children, attributes, styles)
  }
  
  function createClosure(context, method, args){
   if(!args){args=[]}
   return function(){
    var i=0;
    while(arguments[i]){
     args.push(arguments[i]);
     i++
    }
    return method.apply(context,args)
   }
  }
  
  function addChild(container, child){
   if(typeof(child)=='string'||typeof(child)=='number'){
    container.innerHTML+=child
   }else{
    try{
     container.appendChild(child);
    }catch(e){
    }
   }
   return child
  }
  
  function clearChildren(container){
   while(container.firstChild){
    container.removeChild(container.firstChild)
   }
  }
  
  function toggleHintString(e){
   if(!e){e=window.event}
   if(e.type=='focus'&&this.value==this.defaultValue){
    this.value=''
   }else if(e.type=='blur'&&this.value==''){
    this.value=this.defaultValue
   }
  }
  

 window.jeremy.AdvancedFeedControl=AdvancedFeedControl;
// addChild(document.getElementsByTagName('head')[0],createElement('link',null,null,{"href":"http://jgeerdes.home.mchsi.com/playground/jAdvancedFeedControl.css","type":"text/css","rel":"stylesheet"}));
 }
 
  function addEvent(event,handler,object){
   if(!object){object=window}
   if(object.addEventListener){object.addEventListener(event,handler,false)}
  else if(object.attachEvent){object.attachEvent(event,handler)}
   else{
    var ev='on'+event;
    if(typeof(object[ev])=='function'){
     var originalHandler=object[ev];
     object[ev]=function(){originalHandler();handler();}
    } else {
     object[ev]=handler
    }
   }
  return {"event":event,"handler":handler,"object":object};
  }
  
  function removeEvent(handle){
   var event=handle.event,
   handler=handle.handler,
   object=handle.object;
   if(!object){object=window} 
   if(object.removeEventListener){object.removeEventListener(event,handler,false)}
   else if(object.detachEvent){object.detachEvent(event,handler)}
   else{
    object['on'+event]=null;
   }
  }

 if(!window.jeremy){window.jeremy={}}
 if(!window.jeremy.addEvent){window.jeremy.addEvent=addEvent;}
 if(!window.jeremy.removeEvent){window.jeremy.removeEvent=removeEvent;}

 if(typeof(google)=='undefined'){
  window.jAdvancedFeedControlLoader=load;
  var script=document.createElement('script');
  window.loadFeedsApi=function(){google.load('feeds','1',{"callback":window.jAdvancedFeedControlLoader})};
  script.src="http://www.google.com/jsapi?callback="+encodeURIComponent("loadFeedsApi");
  script.type="text/javascript";
  document.getElementsByTagName('head')[0].appendChild(script)
 }else if(!google.feeds){
  google.load('feeds','1',{callback:load})
 }else{
  load()
 }
})()