(function($){
	
	$.fn.twitter = function(username, options) {	
	
		var defaults = {limit: 10, version: 1};  
		var options = $.extend(defaults, options); 
		
		return this.each(function(i, e) {
			var $e = $(e);
			
			// Validate
			if(username == null) return false;

			// Setup request to twitter
			var url = '';
			var params = {};
			var pos=username.indexOf("/");
			if (pos>=0)
			{
				var my_array=username.split("/");
				url = 'http://api.twitter.com/1/'+my_array[0]+'/lists/'+my_array[1]+'/statuses.json?include_rts=true';
				params.per_page = options.limit;
			} else {
				url = 'http://api.twitter.com/1/statuses/user_timeline.json?include_rts=true&screen_name=' + username;
				params.count = options.limit;
			}			

			// Send request
			jQuery.ajax({
				url: url,
				data: params,
				dataType: 'jsonp',
				success: function (o) {
					twitterCallback(e, o, options);
				}
			});
		});
	};
	
	//Functions below based on http://twitter.com/javascripts/blogger.js
	var twitterCallback = function(e, twitters, options) {
	  var statusHTML = [];
	  for (var i=0; i<twitters.length; i++){
	    var tweetid = twitters[i].id;
	    var username = twitters[i].user.screen_name;
	    var displayname = twitters[i].user.name;
	    var image = twitters[i].user.profile_image_url;
		var user_num_tweets = twitters[i].user.statuses_count;
		var user_following = twitters[i].user.friends_count;
		var user_followers = twitters[i].user.followers_count;
		var user_num_listed = twitters[i].user.listed_count;
	    var status = twitters[i].text.replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) {
			var shortUrl = (url.length > 30) ? url.substr(0, 30) + '...': url;
	        return '<a href="'+url+'">'+shortUrl+'</a>';
	    }).replace(/\B@([_a-z0-9]+)/ig, function(reply) {
	    	return  reply.charAt(0)+'<a href="http://twitter.com/'+reply.substring(1)+'" title="Click to view '+reply.substring(1)+' on Twitter">'+reply.substring(1)+'</a>';
	    });
		if (options.version == '4') {
			statusHTML.push('<li>');
			statusHTML.push('<blockquote>');
			statusHTML.push('<cite class="twitter-user">');
			statusHTML.push('    <a href="http://www.twitter.com/'+username+'">'+username+' <span class="real-name">'+displayname+'</span></a>');
			statusHTML.push('</cite>');
			statusHTML.push('<cite class="twitter-photo">');
			statusHTML.push('    <a href="http://www.twitter.com/'+username+'"><img alt="'+username+'" src="'+image+'" width="48" height="48" /></a>');
			statusHTML.push('</cite>');
			statusHTML.push('<p>'+status+'</p>');
			statusHTML.push('</blockquote>');
            statusHTML.push('<p class="timestamp">'+relative_time(twitters[i].created_at)+'</p>');
			statusHTML.push('</li>');
		} else if (options.version == '3') {
			statusHTML.push('<div class="tweet">');
			statusHTML.push('<a href="http://www.twitter.com/'+username+'" class="handle">'+username+'</a>: '+status+'</div>');
			statusHTML.push('<ul class="stats">');
			statusHTML.push('<li><a href="http://www.twitter.com/'+username+'">'+user_num_tweets+' <span>Tweets</span></a></li>');
			statusHTML.push('<li><a href="http://www.twitter.com/'+username+'">'+user_following+' <span>Following</span></a></li>');
			statusHTML.push('<li><a href="http://www.twitter.com/'+username+'">'+user_followers+' <span>Followers</span></a></li>');
			statusHTML.push('<li class="last"><a href="http://www.twitter.com/'+username+'">'+user_num_listed+' <span>Listed</span></a></li>');
			statusHTML.push('</ul>');
			statusHTML.push('<a href="http://twitter.com/'+username+'/status/'+tweetid+'" class="view-site">Link</a>');
			statusHTML.push('</div>');
		} else if (options.version == '2') {
			statusHTML.push('<li>');
			statusHTML.push('<div class="tweet">');
			statusHTML.push('<div class="user"><a href="http://www.twitter.com/'+username+'">'+username+'</a> '+displayname+'</div>');
			statusHTML.push('<div class="tweet-text">'+status+'</div>');
			statusHTML.push('<div class="timestamp">');
			statusHTML.push('<a href="http://twitter.com/'+username+'/status/'+tweetid+'">');
			statusHTML.push(relative_time(twitters[i].created_at));
			statusHTML.push('</a>');
			statusHTML.push('</div>');
			statusHTML.push('</div>');
			statusHTML.push('<a class="tn" href="http://www.twitter.com/'+username+'"><img alt="'+username+'" src="'+image+'"></a>');
			statusHTML.push('</li>');
		} else {
	    statusHTML.push('<li>'+status+'<div class="timestamp">'+ relative_time(twitters[i].created_at) +'</div></li>');
	  }
	  }
	  $(e).html(statusHTML.join('')).parent().show();
	}

	function relative_time(time_value) {
	  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);
	  delta = delta + (relative_to.getTimezoneOffset() * 60);
	
	  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';
	  }
	}	
})(jQuery);
