/*
* Twitter Widget with multiple accounts.
* @website http://ronakpatel.net
* @author Ronak Patel
* @email rspatel@gmail.com
* @version 1.2
*
* Feel free to modify or use this code
* as you like. I just ask that you give
* a link back to me at http://ronakpatel.net
* Thanks!
*
* The regular expressions and getRelativeTime
* function used below have been taken from 
* Twitter's (twitter.com) javascript widget.
*
* Instructions for setting up the widget can be found at:
* http://www.ronakpatel.net/2009/04/05/twitter-widget-that-streams-multiple-accounts/
*/

if (!rpnet) 
	var rpnet = {};
if (!rpnet.TwitterWidget)
	rpnet.TwitterWidget = {};
  
rpnet.TwitterWidget = {
	_tweets: [],
	_count: 0,
	_showImages: false,
	_imageHeight: 48,
	_imageWidth: 48,
  _url: '',
	_xhr: null,

	init: function(title, showImages, imageHeight, imageWidth, url) {        	
		
		if (this.errorCheck(title, showImages, imageHeight, imageWidth, url)) {						
			this._showImages = showImages;
			this._imageHeight = imageHeight;
			this._imageWidth = imageWidth;
      		this._url = url;
			var body = document.body;    

			if (title == '')
				this.$('rpnet_twitterWidget').removeChild(this.$('rpnet_twTitle'));
			else 
				this.$('rpnet_twTitle').innerHTML = title;	
				
			this.getTweets();      
		}
	},

	$: function(id) {
		return document.getElementById(id);
	},

	createList: function() {    		
		var list = this.$('rpnet_twList');    
		this._tweets.sort(this.sortTweetsByDate); 
		this._tweets = this._tweets.slice(0, (this._count*1)+1);
		var i = 0;

		for (i = 0, n = this._tweets.length; i < n; i++) {
			var text = this._tweets[i].text;
			text = text.replace(
				/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g,
				function(s) { return '<a href="'+s+'">'+s+'</a>'; });
			text = text.replace(/\B@([_a-z0-9]+)/ig,
				function(s) {
					return s.charAt(0)
					+'<a href="http://www.twitter.com/'
					+s.substring(1)+'">'+s.substring(1)+'</a>';
				});
			var username = this._tweets[i].screen_name;
			var relTime = ' <span style="font-size:85%">(<a href="http://twitter.com/'
				+ username + '/statuses/' + this._tweets[i].id + '">' 
				+ this.getRelativeTime(this._tweets[i].created_at) + '</a>'
				+ ' by @<a href="http://twitter.com/'
				+ username + '">' + username + '</a>)</span>';
			var profileImg = this._tweets[i].profile_image_url;
			list.appendChild(this.createListItem(text, relTime, 
				username, profileImg));
		}
	},
	
	sortTweetsByDate: function(a, b) {        
		var c = a.created_at.split(' ');
		var d = b.created_at.split(' ');
		var x = Date.parse(c[1]+' '+c[2]+', '+c[5]+' '+c[3]);
		var y = Date.parse(d[1]+' '+d[2]+', '+d[5]+' '+d[3]);
    
		return ((x < y) ? 1 : ((x > y) ? -1 : 0));
	},

	getRelativeTime: function(createdAt) {
		var t = createdAt.split(' ');
		var createdAt = Date.parse(t[1]+' '+t[2]+', '+t[5]+' '+t[3]);		
		var current = new Date();
		var delta = parseInt((current.getTime() - createdAt)/1000);		
		delta = delta + (current.getTimezoneOffset() * 60);

		if (delta < 60) 
			return 'less than a minute ago';
		else if (delta < 120) 
			return 'about a minute ago';
		else if (delta < 3600)
			return (parseInt(delta/60)).toString()+' minutes ago';
		else if (delta < 7200)
			return 'about an hour ago';
		else if (delta < 86400)
			return 'about '+(parseInt(delta/3600)).toString()+' hours ago';
		else if (delta < 172800)
			return '1 day ago';
		else 
			return (parseInt(delta/86400)).toString()+' days ago';		
	},

	createListItem: function(text, relativeTime, username, profileImg) {
		
		var li = document.createElement('li');
		li.style.margin = '3px';

		if (this._showImages) {
			li.style.minHeight = this._imageHeight;
			li.innerHTML = '<div style="overflow:auto; width:100%">'
        + '<a style="float:left;margin-right:2px"' 
				+'href="http://twitter.com/' + username 
				+ '"><img width="'+this._imageWidth
				+ '" height="'+this._imageHeight
				+ '" style="border:none" src="' + profileImg + '"></a>'
				+ '<span>' + text + '</span>' 
				+ relativeTime + '</div>';
		} else {
			li.innerHTML = '<span>' + text + '</span>' + relativeTime;
		}

		return li;
	},

	getTweets: function() {    
		if (window.XMLHttpRequest)
			this._xhr = new XMLHttpRequest();
		else
			this._xhr = new ActiveXObject('Microsoft.XMLHTTP');

		if (this._xhr == null)
			return null;

		var t = this;
		var msg = this.$('rpnet_twMsg');		
		this._xhr.onreadystatechange = function() {
			if (t._xhr.readyState == 4) {            
				var data = t._xhr.responseText;          
        t.processData(data);
			} else if (t._xhr.readyState == 3) {			
			}
		};

		this._xhr.open('GET', this._url, true);
		this._xhr.send(null);            
	},
  
  processData: function(data) {
  	var list = data.split('chEbu8hA');
    var i = 0;

    for (i = 0; i < list.length-1; i++) {
      var g = list[i];
      eval(g);
      this._tweets.push(tweet);
    } 
    
    this._count = list[list.length-1];		
    this.createList();
  },

	errorCheck: function(title, showImages, imageHeight, imageWidth, url) {
		
		if (title == undefined ||			
			showImages == undefined ||
			imageHeight == undefined ||
			imageWidth == undefined ||
      		url == undefined ||
			this.$('rpnet_twitterWidget') == undefined ||
			this.$('rpnet_twTitle') == undefined ||
			this.$('rpnet_twList') == undefined)
			return false;
		else
			return true;
	}
};

var rpnet_tw = rpnet.TwitterWidget;
rpnet_tw.init(
	rpnetTwitAttrs.title,	
	rpnetTwitAttrs.showImages,
	rpnetTwitAttrs.imageHeight,
	rpnetTwitAttrs.imageWidth,
  rpnetTwitAttrs.url);