﻿/*
* jQuery LiveTwitter 1.3.1
* - Live updating Twitter plugin for jQuery
*
* Copyright (c) 2009 Inge Jørgensen (elektronaut.no)
* Licensed under the MIT license (MIT-LICENSE.txt)
*
* $Date: 2009/06/10 $
*/
/*
* Usage example:
* $("#twitterSearch").liveTwitter('bacon', {limit: 10, rate: 15000});
*/

(function ($) {
    if (!$.fn.reverse) {
        $.fn.reverse = function () {
            return this.pushStack(this.get().reverse(), arguments);
        };
    }
    $.fn.liveTwitter = function (query, options) {
        $(this).each(function () {
            var settings = {};
            if (this.twitter) {
                settings = jQuery.extend(this.twitter.settings, options);
                this.twitter.settings = settings;
                if (query) {
                    this.twitter.query = query;
                }
                this.twitter.limit = settings.limit;
                this.twitter.mode = settings.mode;
                if (this.twitter.interval) {
                    this.twitter.refresh();
                }
            } else {
                settings = jQuery.extend({
                    mode: 'search', // Mode, valid options are: 'search', 'user_timeline'
                    rate: 15000,    // Refresh rate in ms
                    limit: 10,      // Limit number of results
                    refresh: true
                }, options);
                window.twitter_callback = function () { return true; };
                this.twitter = {
                    settings: settings,
                    query: query,
                    limit: settings.limit,
                    mode: settings.mode,
                    interval: false,
                    container: this,
                    lastTimeStamp: 0,
                    relativeTime: function (a) {
                        var b = new Date();
                        var c = new Date(a);
                        if (navigator.userAgent.match(/MSIE\s([^;]*)/)) {
                            c = Date.parse(a.replace(/( \+)/, ' UTC$1'))
                        }
                        var d = b - c;
                        var e = 1000,
                        minute = e * 60,
                        hour = minute * 60,
                        day = hour * 24,
                        week = day * 7;
                        if (isNaN(d) || d < 0) {
                            return ""
                        }
                        if (d < e * 7) {
                            return "right now"
                        }
                        if (d < minute) {
                            return Math.floor(d / e) + " seconds ago"
                        }
                        if (d < minute * 2) {
                            return "about 1 minute ago"
                        }
                        if (d < hour) {
                            return Math.floor(d / minute) + " minutes ago"
                        }
                        if (d < hour * 2) {
                            return "about 1 hour ago"
                        }
                        if (d < day) {
                            return Math.floor(d / hour) + " hours ago"
                        }
                        if (d > day && d < day * 2) {
                            return "yesterday"
                        }
                        if (d < day * 365) {
                            return Math.floor(d / day) + " days ago"
                        } else {
                            return "over a year ago"
                        }
                    },
                    refreshTime: function () {
                        var twitter = this;
                        $(twitter.container).find('span.time').each(function () {
                            $(this).html(twitter.relativeTime(this.timeStamp));
                        });
                    },
                    refresh: function (initialize) {
                        var twitter = this;
                        if (this.settings.refresh || initialize) {
                            var encodedQuery = encodeURIComponent(this.query);
                            var url = '';
                            if (twitter.mode == 'search') {
                                url = "http://search.twitter.com/search.json?q=" + encodedQuery + "&callback=?";
                            } else if (twitter.mode == 'user_timeline') {
                                url = "http://twitter.com/statuses/user_timeline/" + encodedQuery + ".json?count=5&callback=?";
                            }

                            if (!initialize) {
                                $(twitter.container).find('.tweet-' + this.id).hide().fadeIn();
                            }
                            $.ajax({
                                url: url,
                                cache: true,
                                dataType: 'jsonp',
                                success: this.processJson
                            });
                        }
                    },
                    start: function () {
                        var twitter = this;
                        if (!this.interval) {
                            this.interval = setInterval(function () { twitter.refresh(); }, twitter.settings.rate);
                            this.refresh(true);
                        }
                    },
                    stop: function () {
                        if (this.interval) {
                            clearInterval(this.interval);
                            this.interval = false;
                        }
                    },
                    processJson: function (json) {
                        var results = null;
                        if (twitter.mode == 'search') {
                            results = json.results;
                        } else {
                            results = json;
                        }
                        $(results).reverse().each(function () {
                            var linkified_text = this.text.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function (m) { return m.link(m); });
                            linkified_text = linkified_text.replace(/@[A-Za-z0-9_]+/, function (u) { return u.link('http://twitter.com/' + u.replace(/^@/, '')); });
                            //if (Date.parse(this.created_at) > twitter.lastTimeStamp) {
                            var tweetHTML = '<dl id="tweet-' + this.id + '">';
                            if (twitter.mode == 'search') {
                                tweetHTML +=
                                                '<dt><img height="30" alt="' + this.from_user + '" src="' + this.profile_image_url + '">' + this.from_user + '</dt><dd>';
                            } else {
                                tweetHTML +=
												'<dt><img height="30" alt="' + this.user.screen_name + '" src="' + this.user.profile_image_url + '">' + this.user.screen_name + '</dt><dd>';
                            }
                            tweetHTML +=
											' ' + linkified_text +
											' <span>' + twitter.relativeTime(this.created_at) + '</span>' +
											'</dd>' +
											'</dl>';
                            $(twitter.container).prepend(tweetHTML);
                            /*var timeStamp = this.created_at;
                            $(twitter.container).find('span.time:first').each(function () {
                            this.timeStamp = timeStamp;
                            });
                            twitter.lastTimeStamp = Date.parse(this.created_at);*/
                            //}
                        });
                        // Limit number of entries
                        $(twitter.container).find('div.tweet:gt(' + (twitter.limit - 1) + ')').remove();
                    },
                    errorjsonp: function () {
                        alert('jsonp');
                    },
                    errorjsonpcallback: function () {
                        alert('jsonpcallback');
                    }
                };
                var twitter = this.twitter;
                //this.timeInterval = setInterval(function() { twitter.refreshTime(); }, 0);
                this.twitter.start();
            }
        });
        return this;
    };
})(jQuery);

TD.Toplets.Twitter = {
    Edit: {
        Init: function (initVal) {
            document.getElementById('Twitter_Source_UserName').value = initVal.UserName;
        },
        Save: function () {
            jQuery('#Twitter_SaveSuccess').hide();
            var params = {
                username: document.getElementById('Twitter_Source_UserName').value
            }
            jQuery.get("/toplets/twitterwidget/savetwitterprofile.aspx", params, function (data) {
                jQuery('#Twitter_SaveSuccess').fadeIn('fast');
            });
        }
    }
};

$().ajaxError(function (event, XMLHttpRequest) {
        $alert(XMLHttpRequest.responseText + '\n' +XMLHttpRequest.statusText);
    });
