
/**
 * Load Twitter feed and display Twitter items after page loaded
 */
var twitter;
document.observe('dom:loaded', function() {
	var twitterdiv = $('twitter');
	if (twitterdiv) {
		twitter = new Twitter();
		$('feed-twitter').style.display = 'block';
		twitterdiv.style.display = 'block';

		scriptnode = document.createElement('script');
		scriptnode.setAttribute('type', 'text/javascript');
		scriptnode.setAttribute('src', 'http://twitter.com/statuses/user_timeline/u1traq.json?callback=twitter.callback&count=5');
		twitterdiv.appendChild(scriptnode);

		// Disabled because Builder doesn't seem to work in WebKit-based browsers
		// Am using the run-of-the-mill DOM code above instead
//		twitterdiv.appendChild(Builder.node('script', {
//			src: 'http://twitter.com/statuses/user_timeline/u1traq.json?callback=twitter.callback&count=5',
//			type: 'text/javascript'
//		}));
	}
});

/**
 * Modification of the blogger.js JavaScript file from Twitter so that Tweets
 * can show up on your own site.
 */
var Twitter = Class.create({

	/**
	 * Callback function used by the JSON response from the Twitter servers.
	 * 
	 * @param response JSON representation of the user timeline.
	 */
	callback: function(response) {

		// Parse JSON text
		var tweets = this.parseResponse(response);

		// Remove loading text, display tweets
		$('twitter-loading').style.display = 'none';

		var tweetbox = $('tweets');
		tweetbox.innerHTML = tweets;

		Effect.Appear('tweets-container', {duration: 0.5});
		Effect.SlideDown('tweets-container', {duration: 0.5});
	},

	/**
	 * Callback function that parses the JSON response of a user's timeline from
	 * Twitter servers.
	 * 
	 * @param C JSON text of a user timeline.
	 */
	parseResponse: function(C) {

		var A = [];
		for (var D = 0; D < C.length; D++) {
			var E = C[D].user.screen_name;
			var B = C[D].text.replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function(F) {
				return '<a href="' + F + '">' + F + '</a>';
			}).replace(/\B@([_a-z0-9]+)/ig, function(F) {
				return F.charAt(0) + '<a href="http://www.twitter.com/' + F.substring(1) + '">' + F.substring(1) + '</a>';
			});
			A.push('<li class="tweet">' + B + '<br/><a href="http://twitter.com/' + E + '/statuses/' + C[D].id + '" class="tweet-time">' + this.relativeTime(C[D].created_at) + '</a></li>');
		}
		return A.join('');
	},

	/**
	 * Figures out whether to seconds, minutes, hours, or days for the age of
	 * the date in question.
	 * 
	 * @param C Item date.
	 */
	relativeTime: function(C) {

		var B = C.split(' ');
		C = B[1] + ' ' + B[2] + ', ' + B[5] + ' ' + B[3];
		var A = Date.parse(C);
		var D = (arguments.length > 1) ? arguments[1] : new Date();
		var E = parseInt((D.getTime() - A) / 1000);
		E = E + (D.getTimezoneOffset() * 60);
		if (E < 60) {
			return 'less than a minute ago';
		}
		else if (E < 120) {
			return 'about a minute ago';
		}
		else if (E < (60 * 60)) {
			return (parseInt(E/60)).toString() + ' minutes ago';
		}
		else if (E < (120 * 60)) {
			return 'about an hour ago';
		}
		else if (E < (24 * 60 * 60)) {
			return 'about ' + (parseInt(E/3600)).toString() + ' hours ago';
		}
		else if (E < (48 * 60 * 60)) {
			return '1 day ago';
		}
		else {
			return (parseInt(E/86400)).toString() + ' days ago';
		}
	}
});

