var TwitterUpdater = Class.create();

Object.extend(TwitterUpdater, 
{
 create:function(target, tpl){
  var tweeter = new TwitterUpdater();
  if(target){
   tweeter.setTargetNode(target);
  }
  if(tpl){
   tweeter.setTweetTemplate(tpl);
  }
  tweeter.fetchTweets();
  return tweeter;
 }
});

Object.extend(TwitterUpdater.prototype, {
 _now:null,
 _tweets:[],
 _lastTweetTime:null,
 _targetNode:'',
 _tweetTemplate:'',
 _feedURL:'',

 initialize:function(){
  this._now=new Date();
  this._tweets = $A();
  this.setLastTweetTime(new Date('Jan 1 1970 00:00:00'));
  this.setTargetNode('tweets');
  this.setTweetTemplate('<li>#{created_at} - #{text}</li>');
  this.setFeedURL('twitterFeed.php');
  //alert(this._now.getTime());
 },
 debug:function(){
  if(!(div = $('debug')))return;
  div.update(div.innerHTML + '<pre>' + $A(arguments).join('</pre><pre>') + '</pre>');
 },
 setTweetTemplate:function(template){
  this._tweetTemplate=template;
 },
 
 setTargetNode:function(target){
  this._targetNode=$(target);
 },
 
 setFeedURL:function(url){
  this._feedURL=url;
 },
 
 setLastTweetTime:function(dt){
  if(!(dt instanceof Date)){
   dt = new Date(dt);
  }
  this._lastTweetTime = dt;
 },

 getLastTweetTime:function(){
  return this._lastTweetTime;
 },
 
 sortTweets:function(){},
 
 dateToSinceNow:function(objDate){
  var since = $A();
  var seconds = (this._now.getTime() - objDate.getTime())/1000;
  var elapsed=$H();
  var periods = ['year','month','day','hour','minute'];
  var intervals = $H({
   year:31536000, month:2592000, day:86400, 
   hour:3600, minute:60, second: 1});
  for(c=0,i=0;i<periods.size();i++,c=0){
   if(seconds >= intervals.get(periods[i])){
    while(seconds>=intervals.get(periods[i])){
     seconds -= intervals.get(periods[i]);
     c++;
    }
    elapsed.set(periods[i], c);
    since.push(c + ' ' + periods[i] + (c!=1?'s':''));
   }
  }
  return since.join(', ');
 },
 
 addTweetProps:function(tweet){
  // IE Date object can't parse created_at w/ +0000 in the string
  tweet.set('created_at', tweet.get('created_at').sub(/\+0000[ ]+/,''));
  var created_at = new Date(tweet.get('created_at'));
  var days = ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'];
  var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
  var opts = $H({
    timeSince: this.dateToSinceNow(created_at),
  	created_at_day: days[created_at.getDay()],
  	created_at_date: created_at.getDate(),
  	created_at_month: months[created_at.getMonth()],
  	created_at_year: created_at.getFullYear(),
  	created_at_hours: created_at.getHours(),
  	created_at_minutes: created_at.getMinutes(),
  	created_at_seconds: created_at.getSeconds(),
  	created_at_time: created_at.getTime()
  });
  opts.set('created_at_ampm', opts.get('created_at_hours')<12?'AM':'PM');
  if(opts.get('created_at_hours') == 0){
  	opts.set('created_at_hours', 12); 
  } else if(opts.get('created_at_hours')>12){
  	opts.set('created_at_hours', opts.get('created_at_hours')-12);
  }
  if(opts.get('created_at_date')<10){
  	opts.set('created_at_date', '0'+opts.get('created_at_date'));
  }
  opts.set('text', this.addLinks(tweet.get('text')));
  opts.each(function(tweet, h){this.set(h.key, h.value);}.bind(tweet, tweet));
  //... add other custom props ?
 },
 
 addLinks:function(url){
 	return String(url).gsub(/https?:\/\/[^\ ]+/i, function(m){return '<a href="'+m+'">'+m+'</a>';});
 },

 addTweet:function(tweet){
  var tweet = $H(tweet);
  this.addTweetProps(tweet);
  var tweetTime = new Date(tweet.get('created_at'));
  if(tweetTime.getTime() > this.getLastTweetTime().getTime()){
   this.setLastTweetTime(tweetTime);
  }
  //$(this._targetNode).insert(this._tweetTemplate.interpolate(tweet));
  $(this._targetNode).update(this._tweetTemplate.interpolate(tweet) + $(this._targetNode).innerHTML);
  //this.debug(escape(tweet.inspect()));
 },

 fetchTweets:function(){
  var url = this._feedURL + '?since=' + escape(this.getLastTweetTime().toUTCString());
  //alert(url);
  new Ajax.Request(url,
   {
    method: 'GET',
    onSuccess: this.updateTweets.bind(this)
   }
  );
 },

 updateTweets:function(transport){
  var res = $A(eval(transport.responseText));
  res.reverse().each(this.addTweet.bind(this));
  //alert($(this._targetNode));
 }
 
});



