jQuery.fn.tweetStream = function(url,opts)
{
    //var url = opts.serviceUrl;
    var templateId = opts.templateId;
    var pollInterval = opts.pollInterval || 120000;
    var displayInterval = opts.displayInterval || 4000;
    var animateSpeed = opts.animateSpeed || 2000;

	jQuery.htmlizeTweet = function (text)
	{
        text = text.replace(/(http:\/\/[a-z0-9.-?&+%_-]*)/ig,'<a href="$&" target="_blank">$&</a>');
        text = text.replace(/@([a-z0-9.?&%_-]*)/ig,'<a href="http://twitter.com/$1" target="_blank">$&</a>')
        text = text.replace(/#([a-z0-9.?&%-]*)/ig,'<a href="http://search.twitter.com/search?q=%23$1" target="_blank">$&</a>')
        return text;		
	}
    
    this.each(function () {
        
		var obj = jQuery(this);
		
		obj[0].displayNextTweet = function () {
	            var tweet = obj[0].tweets.shift();

	            if (!tweet)
	            {
	                clearInterval(obj[0].timer);
	                return;
	            }

                    tweet.htmlText = jQuery.htmlizeTweet(tweet.text);

	            var tweetObj = $(tmpl(templateId, tweet));
		    
		    jQuery('.retweet', tweetObj).click(function () {

            /* Calls Google Analytics to track the Group, Action, Label and Value of an event. */
            pageTracker._trackEvent('Outbound Links', 'Twitter Actions', 'Retweet', 'RT @'+tweet.user.screen_name);
            						
			var text = ("RT @" + tweet.user.screen_name + " #cmsummit " + tweet.text);
			text = escape(text);
			text = text.replace(/%u[0-9]*/,'');
			window.open("http://twitter.com/home/?status=" + text, "_blank");
			return false;
		    });
		    
		    jQuery('.follow', tweetObj).click(function () {
            /* Calls Google Analytics to track the Group, Action, Label and Value of an event. */
            pageTracker._trackEvent('Outbound Links', 'Twitter Actions', 'Follow', tweet.user.screen_name);

			window.open("http://twitter.com/" + escape(tweet.user.screen_name), "_blank");
			return false;
		    });

	            obj.prepend(tweetObj);

	            obj.css('margin-top', '-' + tweetObj.height() + 'px' );
	            obj.animate({'margin-top': '0'}, animateSpeed);
			
		};
		
		obj[0].tweets = [];
		
		obj[0].timer = 0;
		
			
            $.getJSON(url, null, function (response) {
                
                for( i in response )
                {
                    obj[0].tweets.unshift(response[i]);
                }

				buildOutInitialTweets(5);

                obj[0].timer = setInterval(obj[0].displayNextTweet, displayInterval);
                
            });		
			
		//just the quick function to get x amount of initial tweets onto the page
		function buildOutInitialTweets(count)
		{
			$('#tweets').hide();
			for (i=0; i<count;i++)
			{
				obj[0].placeOneTweet();
			}

			$('.loading').hide();
			$('#tweets').show();
		}

		//this is the same as displayNextTweet except it doesnt' have animation.
		obj[0].placeOneTweet = function () {
			var tweet = obj[0].tweets.shift();

			tweet.htmlText = jQuery.htmlizeTweet(tweet.text);

			var tweetObj = $(tmpl(templateId, tweet));

			jQuery('.retweet', tweetObj).click(function () {

			var text = ("RT @" + tweet.user.screen_name + " #cmsummit " + tweet.text);
			text = escape(text);
			text = text.replace(/%u[0-9]*/,'');
			window.open("http://twitter.com/home/?status=" + text, "_blank");
			return false;
			});

			jQuery('.follow', tweetObj).click(function () {
			window.open("http://twitter.com/" + escape(tweet.user.screen_name), "_blank");
			return false;
			});

			obj.prepend(tweetObj);
		}

        
    });
    
};

