(function($){
	 
	$.tweetData = function( options ) {
		
		// Returns array of tweet data
		//==================================
		// =Options
		// -------------
		//	* username - Twitter user to query
		//	* onStart - Function to call on start
		//	* onResult - Function to call on Result; passed array of tweets
		//==================================
		// =TweetData properties
		// -------------
		//	* postTime
		//	* profilePictureURL
		//	* tweet
		//	* tweetID
		//	* tweeter
		//	* tweeterID
		//==================================
		// =Sample Usage
		// -------------
		// $.tweetData({
		//		username: 'firehost',
		//		onStart: function(){}
		//		onResult: function(tweets){}	
		//	});
		//==================================
		
		var defaultOptions = {
			username: 'firehost',		// Username of tweeter
			onStart: function() {},		// Start Function
			onResult: function() {}		// Result Function
		};
		
		settings = $.extend( {}, defaultOptions, options );
		
		$.fn.extend({
			linkifyUrls: function() {
				var returning = [];
				var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
				this.each(function() {
					returning.push( this.replace( regexp,"<a rel=\"nofollow\" href=\"$1\" target=\"_blank\">$1</a>" ) );
	        	});
	        	return $(returning);
	      	},
			linkifyUsers: function() {
	        	var returning = [];
	        	var regexp = /[\@]+([A-Za-z0-9-_]+)/gi;
	        	this.each(function() {
	          		returning.push(this.replace(regexp,"<a rel=\"nofollow\" href=\"http://twitter.com/$1\">@$1</a>"));
	        	});
	        	return $(returning);
	      	},
	      	linkifyHashes: function() {
	        	var returning = [];
				var regexp = / [\#]+([A-Za-z0-9-_]+) /gi;
	        	this.each(function() {
	          		returning.push(this.replace(regexp, ' <a rel=\"nofollow\" href="http://search.twitter.com/search?q=&tag=$1&lang=all&from='+settings.username+'">#$1</a> '));
	        	});
	        	return $(returning);
	      	}
		});
		
		function relative_time( time_value ) {
			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);
			if(delta < 60) {
				return 'less than a minute ago';
			} else if(delta < 120) {
				return 'about a minute ago';
			} else if(delta < (45*60)) {
				return (parseInt(delta / 60)).toString() + ' minutes ago';
			} else if(delta < (90*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';
			}
		}
		
		settings.onStart.call( this );
		
		var tweets = [];
		$.getJSON(
			'http://twitter.com/statuses/user_timeline/' + settings.username + '.json?callback=?',
			function( data ) {
				$.each( data, function( i, item ) {					
					tweets.push({
						postTime: relative_time(item.created_at),
						profilePictureURL: item.user.profile_image_url,
						tweet: $([item.text]).linkifyUrls().linkifyUsers().linkifyHashes()[0],
						tweetID: item.id,
						tweeter: item.user.name,
						tweeterID: item.user.id
					});
				});
				
				settings.onResult.call( this, tweets );
			}
		);		
		
	}
	
})(jQuery);