(function($) {
	$.fn.getTwitter = function(options) {

		$.fn.getTwitter.defaults = {
			userName: null,
			numTweets: 5,
			displayTweets: this.numTweets,
			loaderText: "Loading MCTA Alerts...",
			slideIn: true,
			slideDuration: 750,
			showHeading: true,
			headingText: "Latest Tweets",
			showProfileLink: true,
			showTimestamp: true,
			tweets: undefined
		};

		var o = $.extend({}, $.fn.getTwitter.defaults, options);
		var currentTweet = 0;
		var dir = 1;
		
		function getNextTweetId() {
			if (currentTweet >= o.numTweets-1) dir = 0;
			if (currentTweet === 0) dir = 1;
			return (dir) ? currentTweet++ : currentTweet--;
		}

		function parse_date(date_str) {
		  // The non-search twitter APIs return inconsistently-formatted dates, which Date.parse
		  // cannot handle in IE. We therefore perform the following transformation:
		  // "Wed Apr 29 08:53:31 +0000 2009" => "Wed, Apr 29 2009 08:53:31 +0000"
		  return Date.parse(date_str.replace(/^([a-z]{3})( [a-z]{3} \d\d?)(.*)( \d{4})$/i, '$1,$2$4$3'));
		}
		
		function fixLinks(str) {
			// See http://daringfireball.net/2010/07/improved_regex_for_matching_urls
			var regexp = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi;
			var result = str.replace(regexp, function(match) {
                                        var url = (/^[a-z]+:/i).test(match) ? match : "http://"+match;
                                        return "<a href=\""+url+"\">"+match+"</a>";
										});       
			return result;
		}
		
		function relative_time(date) {
			
			var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
			var delta = parseInt((relative_to.getTime() - date) / 1000, 10);
			var r = '';
			if (delta < 60) {
				r = delta + ' seconds ago';
			} else if(delta < 120) {
				r = 'a minute ago';
			} else if(delta < (45*60)) {
				r = (parseInt(delta / 60, 10)).toString() + ' minutes ago';
			} else if(delta < (2*60*60)) {
				r = 'an hour ago';
			} else if(delta < (24*60*60)) {
				r = '' + (parseInt(delta / 3600, 10)).toString() + ' hours ago';
			} else if(delta < (48*60*60)) {
				r = 'a day ago';
			} else {
				r = (parseInt(delta / 86400, 10)).toString() + ' days ago';
			}
			return 'about ' + r;
		}
		
		function slideTwitter() {
			var tl = $("#twitter_update_list");
			var newPos = -(getNextTweetId())*257;
			tl.animate({left: newPos}, o.slideDuration, null);			
		}
		
		return this.each(function() {
			var c = $(this);
			
			// hide container element, remove alternative content, and add class
			c.hide().empty().addClass("twitted");

			// add heading to container element
			if (o.showHeading) {
				c.append("<h2>"+o.headingText+"</h2>");
			}

			// add twitter list to container element
			var twitterListHTML = "<ul id=\"twitter_update_list\"></ul>";
			c.append(twitterListHTML);

			var tl = $("#twitter_update_list");

			// hide twitter list
			tl.hide();

			// add preLoader to container element
			var preLoaderHTML = $("<p class=\"preLoader\">"+o.loaderText+"</p>");
			c.append(preLoaderHTML);

			// add Twitter profile link to container element
			if (o.showProfileLink) {
				var profileLinkHTML = "<p class=\"profileLink\"><a href=\"http://twitter.com/"+o.userName+"\">http://twitter.com/"+o.userName+"</a></p>";
				c.append(profileLinkHTML);
			}

			// show container element
			c.show();
			
			c.bind('load', function() {
				//$.getJSON('http://twitter.com/statuses/user_timeline/poconopony.json?count=3&callback=?', function(data) {
									$.getJSON('http://twitter.com/statuses/user_timeline/ponyalerts.json?count=3&callback=?', function(data) {

					// save the tweets to a page variable so we dont have to reload them
					if (!o.tweets) {
						o.tweets = $.map(data.results || data, function(item) {
							 // Basic building blocks for constructing tweet <li> using a template
							var screen_name = item.from_user || item.user.screen_name;
							var source = item.source;
							var user_url = '';
							var avatar_size = ''
							var avatar_url = item.profile_image_url || item.user.profile_image_url;
							var tweet_url = ''
							var retweet = (typeof(item.retweeted_status) != 'undefined');
							var retweeted_screen_name = retweet ? item.retweeted_status.user.screen_name : null;
							var tweet_time = parse_date(item.created_at);
							var tweet_relative_time = relative_time(tweet_time);
							var tweet_raw_text = retweet ? ('RT @'+retweeted_screen_name+' '+item.retweeted_status.text) : item.text; // avoid '...' in long retweets
							
							return { 
								item: item, // For advanced users who want to dig out other info
								screen_name: screen_name,
								user_url: user_url,
								avatar_size: avatar_size,
								avatar_url: avatar_url,
								source: source,
								tweet_url: tweet_url,
								tweet_time: tweet_time,
								tweet_relative_time: tweet_relative_time,
								text: fixLinks(tweet_raw_text),
								retweet: retweet,
								retweeted_screen_name: retweeted_screen_name
						   };
						});
					}
					
					$(preLoaderHTML).remove();
					// now we have tweets we need to determine which one to show
					var tweet = o.tweets[getNextTweetId()];
					tl.append($.map(o.tweets, function(t) {
						return '<li>' + t.text + '</li>'
					}).join(''));
					
					tl.show();
					
					// now set a timeout on the windows 
					window.setInterval(slideTwitter, 1000*10);
				});
			
			}).trigger('load');
			
			
		});
	};
})(jQuery);
