var refreshTwitterFeed = function(containerId,screenName,numberOfTweets) {
	var url = "http://api.twitter.com/1/statuses/user_timeline.json?screen_name="+screenName+"&callback=?";
	jQuery.getJSON(url, function(data) { refreshTwitterFeedSuccess(containerId,data,numberOfTweets); });
};

var refreshTwitterFeedSuccess = function(containerId,data,numberOfTweets) {
	var container = jQuery("#nw_twitter_content_"+containerId);
	
	cleanTwitterFeed(container);
	var twitterContent = "<table cellpadding='0' cellspacing='0' class='nw_twitter_content' width='100%'>";
	jQuery.each(data,function(i,tweet) {
		if (i == 0) {
			var imageContainer = jQuery("#nw_twitter_feed_image_"+containerId);
			imageContainer.text("");
			imageContainer.append("<img src='"+tweet.user.profile_image_url+"' alt=''/>");
			jQuery("#nw_twitter_feed_name_"+containerId).text(tweet.user.name);
		}
		if (i < numberOfTweets) {
			twitterContent += "<tr><td><table cellpadding='0' cellspacing='0' class='nw_twitter_tweet' width='100%'><tr><td class='nw_twitter_tweet_text'>"+ify.clean(tweet.text)+"</td></tr><tr><td class='nw_twitter_tweet_links' valign='top'><a href='http://twitter.com/twitter/status/"+tweet.id_str+"' target='_blank'>"+timeAgo(tweet.created_at)+"</a> · <a href='http://twitter.com/?status=@${screenName}%20&in_reply_to_status_id="+tweet.id_str+"&in_reply_to=${screenName}' target='_blank'>reply</a></td></tr></table></td></tr>";
		}		
	});
	twitterContent += "</table>";
	container.append(twitterContent);
	jQuery("#nw_twitter_feed_"+containerId).show();
};

var cleanTwitterFeed = function(container) {
	container.text("");
};

var bindTwitterFeeds = function() {
	var twitterFeeds = jQuery('input[id^="nw_twitter_feed_id_"]');
	twitterFeeds.each(function(i,twitterFeed) {
		var match = /nw_twitter_feed_id_([0-9]+)/.exec(twitterFeed.id);
		var twitterFeedId = match[1];
		var twitterFeedScreenName = jQuery('#nw_twitter_feed_screenname_'+twitterFeedId).attr("value");
		var twitterFeedNumber = jQuery('#nw_twitter_feed_number_'+twitterFeedId).attr("value");
		refreshTwitterFeed(twitterFeedId,twitterFeedScreenName,twitterFeedNumber);
	});
};

jQuery(document).ready(function() { bindTwitterFeeds(); });

/**
 * relative time calculator
 * @param {string} twitter date string returned from Twitter API
 * @return {string} relative time like "2 minutes ago"
 */
var timeAgo = function(dateString) {
 var rightNow = new Date();
 var then = new Date(dateString);

 if (browser.ie) {
   // IE can't parse these crazy Ruby dates
   then = Date.parse(dateString.replace(/( \+)/, ' UTC$1'));
 }

 var diff = rightNow - then;

 var second = 1000,
     minute = second * 60,
     hour = minute * 60,
     day = hour * 24,
     week = day * 7;

 if (isNaN(diff) || diff < 0) {
   return ""; // return blank string if unknown
 }

 if (diff < second * 2) {
   // within 2 seconds
   return "right now";
 }

 if (diff < minute) {
   return Math.floor(diff / second) + " seconds ago";
 }

 if (diff < minute * 2) {
   return "about 1 minute ago";
 }

 if (diff < hour) {
   return Math.floor(diff / minute) + " minutes ago";
 }

 if (diff < hour * 2) {
   return "about 1 hour ago";
 }

 if (diff < day) {
   return  Math.floor(diff / hour) + " hours ago";
 }

 if (diff > day && diff < day * 2) {
   return "yesterday";
 }

 if (diff < day * 365) {
   return Math.floor(diff / day) + " days ago";
 }

 else {
   return "over a year ago";
 }

};

var browser = function() {
    var ua = navigator.userAgent;
    return {
      ie: ua.match(/MSIE\s([^;]*)/)
    };
}();

/**
 * The Twitalinkahashifyer!
 * http://www.dustindiaz.com/basement/ify.html
 */
var ify = function() {
  return {
    "link": function(t) {
      return t.replace(/(^|\s*)(https*\:\/\/\S+[^\.\s+])/g, function(m, m1, link) {
        return m1 + '<a target="_blank" href="' + link + '">' + ((link.length > 25) ? link.substr(0, 24) + '...' : link) + '</a>';
      });
    },
    "at": function(t) {
      return t.replace(/(^|\s+)\@([a-zA-Z0-9_]{1,15})/g, function(m, m1, m2) {
        return m1 + '@<a target="_blank" href="http://twitter.com/' + m2 + '">' + m2 + '</a>';
      });
    },
    "hash": function(t) {
      return t.replace(/(^|\s+)\#([a-zA-Z0-9_]+)/g, function(m, m1, m2) {
        return m1 + '#<a target="_blank" href="http://search.twitter.com/search?q=%23' + m2 + '">' + m2 + '</a>';
      });
    },
    "clean": function(tweet) {
      return this.hash(this.at(this.link(tweet)));
    }
  };
}();
