﻿jQuery.fn.twitterFeed = function (userNames) {
    return jQuery(this).each(function (i, obj) {
        var tweets = new Array();
        var twitter = undefined;
        var maxCount = 4;

        init = function () {
            twitter = jQuery(obj);
            twitter.data('tweets', tweets);
            bindEvents();
            for (var i = 0; i < userNames.length; i++) {
                if (userNames[i] != '') {
                    getTweets(userNames[i], { count: 20 }, function (data) {
                        page(1);
                        displayTweets();
                    });
                }
            }
        };

        bindEvents = function () {
            jQuery(".tweetold", twitter).live('click', function (e) {
                e.preventDefault();
                var newPage = page() + 1
                page(newPage);
                displayTweets();
            });

            jQuery(".tweetnew", twitter).live('click', function () {
                var newPage = page() + 1
                page(newPage);
                displayTweets();
            });
        };

        clearTweets = function () {
            jQuery('.twittername', twitter).remove();
            jQuery('.tweet', twitter).remove();
            jQuery('.tweettime', twitter).remove();
            jQuery('img[src$="img/line.png"]', twitter).remove();
        };

        displayTweet = function (tweet, last) {
            var s = '\n<div class="twittername">';
            s = s.concat('<a href="http://twitter.com/#!/', tweet.user.screen_name, '" target="_blank"><img src="', tweet.user.profile_background_image_url, '" /></a>\n');
            s = s.concat('<a href="http://twitter.com/#!/', tweet.user.screen_name, '" target="_blank">', tweet.user.screen_name, '</a></div>\n');

            s = s.concat('<div class="tweet">', linkify(tweet.text), '</div>\n');
            s = s.concat('<div class="tweettime">', relative_time(tweet.created_at), '</div>\n');

            if (last != true) {
                s = s.concat('\n<img src="img/line.png" width="200" height="1" />');
            }

            jQuery('div#more', twitter).before(s);
        };

        displayTweets = function () {
            clearTweets();
            var startIndex = (page() - 1) * maxCount;
            var i = startIndex;
            var orderedTweets = jLinq.from(tweets).orderBy("-date").select();
            while (i < startIndex + maxCount && i < tweets.length) {
                var last = false;

                if (i == startIndex + maxCount + 1 || i + 1 == tweets.length) {
                    last = true;
                }

                displayTweet(orderedTweets[i++], last);
            }
            //    				updateArrows();
        };

        getTweets = function (userName, settings, callBack) {
            var url = 'http://twitter.com/statuses/user_timeline/{{userName}}.json';

            jQuery.ajax({
                data: settings
    					, dataType: 'jsonp'
					, error: function (req, status, error) { alert(status); }
					, success: function (data) {
					    while (data.length > 0) {
					        var tweet = data.pop();
					        tweet["date"] = new Date(Date.parse(tweet.created_at.replace(/\+\d{1,4}\s/gim, '')));
					        tweets.push(tweet);
					    }
					    callBack(data);
					}
					, url: url.replace(/{{.*}}/gim, userName)
            });
        }

        isFirstPage = function () {
            return page() == 1;
        };

        isLastPage = function () {
            return page() >= lastPage();
        };

        lastPage = function () {
            return Math.ceil(tweets.length / maxCount);
        }

        page = function (p) {
            if (jQuery(twitter).data('page') === undefined) {
                jQuery(twitter).data('page', 1);
            }

            if (!isNaN(p)) {
                jQuery(twitter).data('page', Math.abs(1 + ((p - 1) % lastPage())));
            }
            return jQuery(twitter).data('page');
        };

        updateArrows = function () {
            if (isFirstPage()) {
                jQuery("#leftArrow").show();
                jQuery(".tweetnew").hide();
            }
            else {
                jQuery("#leftArrow").hide();
                jQuery(".tweetnew").show();
            }
            if (isLastPage()) {
                jQuery("#rightArrow").show();
                jQuery(".tweetold").hide();
            }
            else {
                jQuery("#rightArrow").hide();
                jQuery(".tweetold").show();
            }
        };

        init();
        return jQuery(this);
    });
}

function linkify(inputText) {
    var replaceText, replacePattern1, replacePattern2, replacePattern3;

    //URLs starting with http://, https://, or ftp://
    replacePattern1 = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim;
    replacedText = inputText.replace(replacePattern1, '<a href="$1" target="_blank">$1</a>');

    //URLs starting with "www." (without // before it, or it'd re-link the ones done above).
    replacePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
    replacedText = replacedText.replace(replacePattern2, '$1<a href="http://$2" target="_blank">$2</a>');

    //Change email addresses to mailto:: links.
    replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
    replacedText = replacedText.replace(replacePattern3, '<a href="mailto:$1">$1</a>');

    return replacedText
}
