var Twitter = {
    o: {},
    timerId: 0,
    scrollTimerId: 0,
    list: null,
    listFirst: null,
    listFirstWidth: 0,

    shiftLeft: function() {
        var final_left = parseInt(Twitter.list.style.left) - 1;
        Twitter.list.style.left = final_left + 'px';

		if (final_left <= -Twitter.listFirstWidth) {
			Twitter.list.removeChild(Twitter.listFirst);
            Twitter.list.style.left = '13px';
            Twitter.list.appendChild(Twitter.listFirst);
            Twitter.prepareScroll();
		}
    },

    prepareScroll: function () {
        var oList = $("#latest-tweets");
        var oFirst = oList.find('li:first');
        Twitter.list = oList.get(0);
        Twitter.listFirst = oFirst.get(0);
        Twitter.listFirstWidth = oFirst.width();
    },

    tweetsLoaded: function (data) {
        if (data.last && data.list) {
            Twitter.last = data.last || null;
            var ul = $("ul#latest-tweets");
            ul.empty();
            for (var k in data.list) {
                ul.append('<li>'+data.list[k].text+'<span class="t_time">about '+data.list[k].timeAgo+' ago</span></li>');
            }
            Twitter.initScroller();
        }
    },

    lastTweetsLoaded: function (data) {
        if (data.list && data.list.length > 0) {
            Twitter.stopAnimation();
            var ul = $("ul#latest-tweets");
            if (!Twitter.last) {
                ul.empty();
            }
            Twitter.last = data.last || null;
            for (var k in data.list) {
                ul.append('<li>'+data.list[k].text+'<span class="t_time">about '+data.list[k].timeAgo+' ago</span></li>');
            }
            Twitter.startAnimation();
        }
    },

    checkTweets: function () {
        $.getJSON(
            BASE_URL + '/__twitter?action=getLast',
            {last: Twitter.last},
            Twitter.lastTweetsLoaded
        );
    },

    initScroller: function () {
        $("#latest-tweets").css({"left": "0px"});
        Twitter.startAnimation();
    },

    startAnimation: function () {
        Twitter.stopAnimation();
        $("ul#latest-tweets").bind("mouseenter",function(){
            clearInterval(Twitter.scrollTimerId);
        }).bind("mouseleave",function(){
            clearInterval(Twitter.scrollTimerId);
            Twitter.scrollTimerId = setInterval(Twitter.shiftLeft, 50);
        });
        Twitter.prepareScroll();
        Twitter.scrollTimerId = setInterval(Twitter.shiftLeft, 50);
        Twitter.timerId = setInterval(Twitter.checkTweets, 300000); // 5 minutes
    },

    stopAnimation: function () {
        $("ul#latest-tweets").unbind("mouseenter").unbind("mouseleave");
        clearInterval(Twitter.timerId);
        clearInterval(Twitter.scrollTimerId);
    },

    turnOn: function() {
        Twitter.stopAnimation();
        Twitter.setCookie('notweets', '');
        $.getJSON(
            BASE_URL + '/__twitter?action=getLast',
            {},
            Twitter.tweetsLoaded
        );
    },

    turnOff: function () {
        Twitter.setCookie('notweets', 1);
        Twitter.stopAnimation();
        $("ul#latest-tweets").empty();
    },

    turnToggle: function () {
        var notweets = Twitter.getCookie('notweets');
        if (notweets) {
            Twitter.turnOn();
        } else {
            Twitter.turnOff();
        }
    },

    switchOnClick: function () {
        Twitter.turnToggle();
        return false;
    },

    init: function(options) {
        Twitter.last = options.last || null;
        Twitter.o = options;
        $("#ticker-switch").hover(function() {
			$(this).stop(true, true).next("em").animate({opacity: "show", top: "-20"}, "fast");
			}, function() {
				$(this).stop(true, true).next("em").animate({opacity: "hide", top: "-25"}, "fast");
			});
		$("#ticker-switch").click(Twitter.switchOnClick);
        var notweets = Twitter.getCookie('notweets');
        if (!notweets) {
            Twitter.initScroller();
        }

    },

    getCookie: function (key, options) {
        options = options || {};
        var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
        return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
    },
    
    setCookie: function  (key, value, options) {
        options = jQuery.extend({}, options);
        if (value === null || value === undefined) {
            options.expires = -1;
        }
        if (typeof options.expires === 'number') {
            var days = options.expires, t = options.expires = new Date();
            t.setDate(t.getDate() + days);
        }
        value = String(value);
        return (document.cookie = [
            encodeURIComponent(key), '=',
            options.raw ? value : encodeURIComponent(value),
            options.expires ? '; expires=' + options.expires.toUTCString() : '',
            options.path ? '; path=' + options.path : '',
            options.domain ? '; domain=' + options.domain : '',
            options.secure ? '; secure' : ''
        ].join(''));
    }
};
