//Stripe together tweets from multiple users.
//Free to use and modify at will, but please credit Afterglide Media Thingy, LLC (afterglide.googlepages.com)
//and Twitter (getTimeDelta and getRelativeTime (aka relative_time) were supplied by Twitter
//for the original. Contact jeremy@afterglide.com for support, suggestions, bug fix requests, etc.
//
//February 21, 2008 - Initial version

//global variables
MultiTweet = new Array(); // array for the tweet info.
MultiTweetMask = "";

// tweet object custructor
function LoneTweet() {
	this.delta = null; // milliseconds since this tweet;
	this.html = null; // html of tweet to dump to screen;
	this.username = null; // user who made this tweet;

	//define object methods
	this.setDelta = function (deltaval) { this.delta = deltaval; }
	this.setHtml = function (htmlval) { this.html = htmlval; }
	this.setUsername = function (usernameval) { this.username = usernameval; }
} 

function tweetFormatToMask(tweet, mask) {
	var tweettext = mask;

	tweettext = tweettext.replace(/%user_url%/ig, tweet.user.url);
	tweettext = tweettext.replace(/%user_name%/ig, tweet.user.name);
	tweettext = tweettext.replace(/%user_description%/ig, tweet.user.description);
	tweettext = tweettext.replace(/%user_location%/ig, tweet.user.location);
	tweettext = tweettext.replace(/%user_screen_name%/ig, tweet.user.screen_name);
	tweettext = tweettext.replace(/%user_profile_image_url%/ig, tweet.user.profile_image_url);
	tweettext = tweettext.replace(/%user_id%/ig, tweet.user.id);
	tweettext = tweettext.replace(/%user_protected%/ig, tweet.user.protected);
	tweettext = tweettext.replace(/%truncated%/ig, tweet.truncated);
	tweettext = tweettext.replace(/%created_at%/ig, tweet.created_at);
	tweettext = tweettext.replace(/%source%/ig, tweet.source);
	tweettext = tweettext.replace(/%id%/ig, tweet.id);
	tweettext = tweettext.replace(/%text%/ig, tweet.text);
	tweettext = tweettext.replace(/%relative_time%/ig, getRelativeTime(tweet.created_at));

	// oh, heck, while we're at it, why don't we link to screen names in replies.
	tweettext = tweettext.replace(/@([a-zA-Z0-9_]*)/ig, '@<a href="http://twitter.com/$1">$1</a>');

	return tweettext;
}

function getUserTweet(userlist, numbertweets) {
	var aUser = userlist.split(",");
	
	for (var i=0; i < aUser.length; i++) {
		document.write('<script text="text/javascript" src="http://twitter.com/statuses/user_timeline/' + aUser[i] + '.json?callback=tweetMulti&count=' + numbertweets + '"></' + 'script>');
	}
}

function tweetMulti(twitters) {
    var updateList = document.getElementById('twitter_multi_update_list');
	var newText = '';
	var username = '';
	// set default mask (can be overridden by setting global variable MultiTweetMask)
	var mask = '<table border="0" cellpadding="2" cellspacing="2" class="twitter-table"><tr>';
	mask += '<td valign="top"><a href="http://twitter.com/%user_screen_name%"><img src="%user_profile_image_url%" width="48" height="48" vspace="2" border="0"></a></td>';
	mask += '<td valign="top" class="twitter-td">';
	mask += '<a href="http://twitter.com/%user_screen_name%" class="twitter-username">%user_screen_name%</a> %text% <a href="http://twitter.com/%user_screen_name%/statuses/%id%" class="twitter-usertime">%relative_time%</a></td>';
	mask += '</tr></table>';
	//  via %source%
	
	try { // use try/catch in case MultiTweetMask isn't defined
		if (MultiTweetMask != '') {
			mask = MultiTweetMask;
		}
	}
	catch (e) {
	}
	
	for (var i=0; i<twitters.length; i++){
		username = twitters[i].user.screen_name
		MultiTweet[MultiTweet.length] = new LoneTweet();
		MultiTweet[MultiTweet.length - 1].setDelta(parseInt(getTimeDelta(twitters[i].created_at)));
		MultiTweet[MultiTweet.length - 1].setHtml(tweetFormatToMask(twitters[i], mask));
		MultiTweet[MultiTweet.length - 1].setUsername(username);
	}
	
	MultiTweet.sort(tweetMultiSort);

	for (var i=0; i<MultiTweet.length; i++){
		newText += MultiTweet[i].html;
	}
	
	updateList.innerHTML = newText;
}

function tweetMultiSort(a, b) {
	// sort array by value of delta (amount of time since twitter was posted)
	
   if(a.delta > b.delta) 
      { return 1; }
   if(a.delta < b.delta)
      { return -1; }

   return 0;
} 

function getTimeDelta(time_value) {
  // this code is pretty much untouched from the original twitter version, other than being broken out into a separate function.
  var values = time_value.split(" ");
  time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
  var parsed_date = Date.parse(time_value);
  var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
  var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
  return delta + (relative_to.getTimezoneOffset() * 60);
}

function getRelativeTime(time_value) {
  // this code is pretty much untouched from the original Twitter version.
  delta = getTimeDelta(time_value);

  if (delta < 60) {
    return 'less than a minute ago';
  } else if(delta < 120) {
    return 'about a minute ago';
  } else if(delta < (60*60)) {
    return (parseInt(delta / 60)).toString() + ' minutes ago';
  } else if(delta < (120*60)) {
    return 'about an hour ago';
  } else if(delta < (24*60*60)) {
    return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
  } else if(delta < (48*60*60)) {
    return '1 day ago';
  } else {
    return (parseInt(delta / 86400)).toString() + ' days ago';
  }
}