//
// tweets.js
//
// Originally derived from http://twitter.com/javascripts/blogger.js
//

function relativeTime(when)
{
	var values = when.split(" ");
	when = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
	var parsed_date = Date.parse(when);
	var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
	var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
	delta = delta + (relative_to.getTimezoneOffset() * 60);

	if (delta < 60)
		return '&lt; 60s';
	else if (delta < 120)
		return '&lt; 120s';
	else if (delta < 3600)
		return '~' + (parseInt(delta / 60)).toString() + 'm';
	else if (delta < 86400)
		return '~' + (parseInt(delta / 3600)).toString() + 'h';
	else if (delta < 86400 * 4)
		return '~' + (parseInt(delta / 86400)).toString() + 'd';

	return values[0]+", "+values[2]+" "+ values[1]+" "+values[5]+" " + values[3];
}

function tweetTable(obj)
{
	var service;

	if (obj == null)
		return "";

	// Select service
	if (obj.user.screen_name == 'snert')
		service = 'identi.ca';
	else if (obj.user.screen_name == 'SirWumpus')
		service = 'twitter.com';
	else if (obj.user.profile_image_url.match(/identi\.ca/))
		service = 'identi.ca';
	else
		service = 'twitter.com';

	// Convert links to be clickable.
	var text = obj.text;

	// Remove end haiku marker and following texted used by some people.
	text = text.replace(/\/\/\/.*/, "");

	// Convert URLs into HTML links.
	text = text.replace(/(http:[^ \t]+)/ig, "<a href='$1' target='_blank'>$1</a>");

	// Convert haiku cuts into line breaks. Note there might be
	// trailing http:// links for which the slashes should not
	// be confused as sentence cuts.
	if (text.match(/ \/ | \/\/ | :: |[^:]\/ /)) {
		text = text.replace(/^((@[a-zA-Z0-9_]+ )*)([^\/]*[^:\/])\/{1,2}([^\/]*[^:\/])\/{1,2}([^\/<!#])/, '$1<nobr>$3</nobr><br/><nobr>$4</nobr><br/><nobr>$5</nobr>');
		text = text.replace(/^((@[a-zA-Z0-9_]+ )+)/, '$1<br/>');
		text = text.replace(/ :: /g, '<br/>');
		text = text.replace(/ \/\/ /g, '<br/><br/>');

//		// Remove #haiku tag (leave others).
//		text = text.replace(/([!#][a-z0-9_]*haiku[a-z0-9_]*)/gi, '');
		text = text.replace(/([!#][a-z0-9_]*)/gi, '');
	}

	// Replace @replies by service link.
	text = text.replace(/(@([a-zA-Z0-9_]+))/gi, '<a href="http://'+service+'/$2/" target="_blank">$1</a>');

	text = text.replace(/\r/, "<br/>");

	when = relativeTime(obj.created_at);

	return '<table class="tweet_quote" border="0" cellpadding="1" cellspacing="2"><tr valign="top">'
		   	+ '<td width="20%"><a class="tweet_link" target="_blank" href="http://'+service+'/'+obj.user.screen_name+'/status/'+obj.id+'">'
			+ '<img class="tweet_icon" alt="'+obj.user.screen_name+'" src="'+obj.user.profile_image_url+'" border="0"/></td>'
			+ '<td class="tweet_text">'+text+'<br/>'
			+ '<span class="tweet_name"><a class="tweet_link" target="_blank" href="http://'+service+'/'+obj.user.screen_name+'/">'+obj.user.name+'</a>'
			+ (4 < when.length ? '<br/>' : ' ')
			+ '<a class="tweet_link" target="_blank" href="http://twitter.com/'+obj.user.screen_name+'/status/'+ obj.id+'">'
			+ when +'</a></td></tr></table>'
	;
}

function tweetBlockquote(obj)
{
	return "<blockquote id='tweet_"+obj.id+"'>" + tweetTable(obj) + "</blockquote>";
}

function tweetBlockquotes(forward_order, obj)
{
	if (obj == null)
		return "";

	var list = "";

	if (forward_order) {
		for (var i = obj.length; 0 <= --i; ) {
			list += tweetBlockquote(obj[i]);
		}
	} else {
		for (var i = 0; i < obj.length; i++) {
			list += tweetBlockquote(obj[i]);
		}
	}

	return list;
}

function tweetListItem(tweet)
{
	var service;

	// Select service
	if (tweet.user.screen_name == 'snert')
		service = 'identi.ca';
	else if (tweet.user.screen_name == 'SirWumpus')
		service = 'twitter.com';
	else if (tweet.user.profile_image_url.match(/identi\.ca/))
		service = 'identi.ca';
	else
		service = 'twitter.com';

	var text = tweet.text;
	text = text.replace(/(http:[^ \t]+)/ig, "<a class='tweet_link' href='$1' target='_blank'>$1</a>");
	text = text.replace(/(@([a-z0-9]+))/gi, '<a class="tweet_reply" target="_blank" href="http://twitter.com/$2/">$1</a>');

	return '<li><a class="tweet_user" target="_blank" href="http://twitter.com/'
			+ tweet.user.screen_name
			+ '/status/'+tweet.id+'">'
			+ tweet.user.name
			+ '&nbsp;&nbsp;&nbsp;<span class="tweet_time">'+relativeTime(tweet.created_at)+'</span>'
			+ '</a> '
			+ '<span class="tweet_text">'+text+'</span> '
			+ '</li>'
	;
}

function tweetList(forward_order, obj)
{
	if (obj == null)
		return "";

	var list = "";

	if (forward_order) {
		for (var i = obj.length; 0 <= --i; ) {
			list += tweetListItem(obj[i]);
		}
	} else {
		for (var i = 0; i < obj.length; i++) {
			list += tweetListItem(obj[i]);
		}
	}

	return list;
}

//
// Example of use:
//
// <div id="tweets" class="tweet_view"></div>
// <script type="text/javascript" src="http://twitter.com/statuses/user_timeline/SirWumpus.json?callback=formatTweets&count=5"></script>
//
function formatTweets(obj)
{
	var tweets = '<ul class="tweet_list">'+tweetList(false, obj)+'</ul>';
	document.getElementById('tweets').innerHTML = tweets;
}

function quoteTweet(obj)
{
	document.getElementById(obj.id).innerHTML = tweetTable(obj);
}

//
// http://ajaxpatterns.org/XMLHttpRequest_Call
//
function createXMLHttpRequest()
{
	try { return new XMLHttpRequest(); } catch(e) {}
	try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
	try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
	alert("XMLHttpRequest not supported");
	return null;
}

function getAjaxObject(uri, func)
{
	var ajax = createXMLHttpRequest();
	if (ajax != null) {
		ajax.open("GET", uri, true);
		ajax.onreadystatechange = function() {
			if (ajax.readyState != 4)
				return;
			else if (ajax.status == 200) {
				eval("var obj = "+ajax.responseText);
				func(obj);
			}
		};
		ajax.send(null);
	}
}

function getTweet(uri)
{
	getAjaxObject(uri, quoteTweet);
}

function listTweets(list_id, forward_order, uri)
{
	getAjaxObject(
		uri, function (obj) {
			document.getElementById(list_id).innerHTML += tweetList(forward_order, obj);
		}
	);
}

function quoteTweets(list_id, forward_order, uri)
{
	getAjaxObject(
		uri, function (obj) {
			document.getElementById(list_id).innerHTML += tweetBlockquotes(forward_order, obj);
		}
	);
}

