
(function($){
	var settings = {
		'start' : 0,
		'limit' : 3,		
		'username' : 'jeresig',
		'timeout' : 2000,		
		'html_before' : '',
		'html_tweets' : '<div><h2>{date}</h2><p>{text}</p></div>',
		'html_after' : '',
		'loading_text' : 'loading...',
		'format_date' : function(d) {
			return $.fn.livetweet('format_date', d)		
		},
		'error_text' : 'an error has occurred!'
	};

	var methods = {
		init : function(options) {
			var $this = this;			
			if(options) $.extend(settings, options);
				
			
			$.ajax({
				beforeSend : $this.html('<span class="livetweet-loading">'+settings.loading_text+'</span>'),
				url: 'http://api.twitter.com/1/statuses/user_timeline.json?screen_name='+settings.username,
				type: 'GET',
				dataType: 'jsonp',						
				timeout: settings.timeout,
				error: function() {
					$this.html('<span class="livetweet-error">'+settings.error+'</span>');
				},
				success: function(json){																		
					$this.find(".livetweet-loading").remove();
					$("#tweet_nums").val(json.length);
					$("#tweet_start").val(parseInt(settings.start));
					
					start = parseInt(settings.start)
					sizer = json.length > (settings.limit + start) ? settings.limit + start : json.length;
					
					if (sizer == json.length) {
						$("#arrow_down").css('visibility', 'hidden');
					} else {
						$("#arrow_down").css('visibility', 'visible');
					}					
					
					if (start == 0) {
						$("#arrow_up").css('visibility', 'hidden');
					} else {
						$("#arrow_up").css('visibility', 'visible');
					}
					
					rt = settings.html_before;
					tweets = '';
					for(i=start;i<sizer;i++) {							
						text = settings.html_tweets.replace('{text}', $.fn.livetweet('format_links', json[i].text));
						var strDate = json[i].created_at.replace(/(\+\S+) (.*)/, '$2 $1');
						strDate = strDate.split(' ')[1] + ' ' + strDate.split(' ')[2] + ', ' + strDate.split(' ')[4];
						tweets += text.replace('{date}', strDate);
					}
					rt += tweets+settings.html_after;					
					return $this.each(function() {
						$(this).append(rt);
					});	
				}
			});							
		
		},
		format_links : function(t) {			
			var rxp_url = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
            var rxp_user = /[\@]+([A-Za-z0-9-_]+)/gi;
            var rxp_hash = / [\#]+([A-Za-z0-9-_]+)/gi;

			t = t.replace(rxp_url,'<a target="_blank" href="$1">$1</a>');
			t = t.replace(rxp_user,'<a target="_blank" href="http://twitter.com/$1">@$1</a>');
			t = t.replace(rxp_hash,'<a target="_blank" href=""http://search.twitter.com/search?q=&tag=$1&lang=all">#$1</a>');
			
			return t;
		},
		format_date : function(dt) {			
			//var m = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');
			var m = new Array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');
			var d = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday');
			return m[dt.getMonth()] + " " + dt.getDate() + ", " + dt.getFullYear();		
		}
	};

	$.fn.livetweet = function(method) {
		if(methods[method]) {
			return methods[method].apply(this, Array.prototype.slice.call(arguments,1));
		} else if(typeof method === 'object' || !method) {
			return methods.init.apply(this, arguments);
		} else {
			$.error('Method '+method+' does not exist on jQuery.livetweet');
		}    
	};
})(jQuery);
