﻿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();
            });

            jQuery("a", twitter.find('#more')).live('click', function (e) {
                e.preventDefault();
                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/dots.gif"]', twitter).remove();
        };

        displayTweet = function (tweet) {
            var reText = /@[0-9a-z]+/gim;
            var tweetText = tweet.text;
            var matches = reText.exec(tweetText);
            if (matches) {
                var i = 0;
                for (i = 0; i < matches.length; i++) {
                    var u = matches[i].replace('@', '');
                    var r = "@" + '<a target="_blank" href="http://twitter.com/';
                    r = r.concat(u, '" >', u, '</a>');
                    tweetText = tweetText.replace(matches[i], r);
                }
            }
            var s = '\n<div class="twittername">';
            s = s.concat('<a href="http://twitter.com/', tweet.user.screen_name, '" target="_blank"><img height="24px" width="24px" src="', tweet.user.profile_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">', tweetText, '</div>\n');
            s = s.concat('<div class="tweettime">', relative_time(tweet.created_at), '</div>\n');
            //s = s.concat('\n<img src="img/dots.gif" width="199" height="1" />');
            $('#more',twitter).before(s);
            //jQuery('img[src$="img/footer.gif"]', twitter).before(s);
        };

        displayTweets = function () {
            clearTweets();
            var startIndex = (page() - 1) * maxCount;
            var i = startIndex;
            if (tweets && tweets.length > 0) {
                var orderedTweets = jLinq.from(tweets).orderBy("-date").select();
                while (i < startIndex + maxCount && i < tweets.length) {
                    displayTweet(orderedTweets[i++]);
                }
            }
            //    				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 relative_time(time_value) {
        var values = time_value.split(" ");
        time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
        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);
        delta = delta + (relative_to.getTimezoneOffset() * 60);

        if (delta < 60) {
            return 'less than a minute ago';
        } else if (delta < 120) {
            return 'about a minute ago';
        } else if (delta < (60 * 60)) {
            return (parseInt(delta / 60)).toString() + ' minutes ago';
        } else if (delta < (120 * 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';
        }
    }
}
