﻿(function($) {
    $.fn.ticker = function(delay, effect, speed) {

        initTicker = function(el) {

            stopTicker(el);

            el.maxHeight = 0;

            el.items = $("li", el);

            if (effect == 'fade') {
                // Hide all items (except first one)
                el.items.not(":eq(0)").hide().end();
            }

            if (effect == 'fade' || effect == 'spy') {

                // Current item
                el.currentitem = 0;
            }

            el.pause = false;

            // The element needs a specified height to prevent "page jumping"...
            var h = $(el).height();
            $(el).css({ height: h });

            startTicker(el);
        };
        var startTicker = function(el) {
            el.tickfn = setInterval(function() { doTick(el) }, delay)
        };
        var stopTicker = function(el) {
            clearInterval(el.tickfn);
        };
        var pauseTicker = function(el) {
            el.pause = true;
        };
        resumeTicker = function(el) {
            el.pause = false;
        };
        doTick = function(el) {
            // don't run if paused
            if (el.pause) return;
            // pause until animation has finished
            el.pause = true;

            if (el.effect == 'fade') {
                // hide current item
                $(el.items[el.currentitem]).fadeOut(el.speed, function() {
                    $(this).hide();
                    // move to next item and show
                    el.currentitem = ++el.currentitem % (el.items.size());

                    $(el.items[el.currentitem]).fadeIn(el.speed, function() {
                        el.pause = false;
                    });
                });
            }
            else if (el.effect == 'slide') {
                var last = $('li:last', el).hide().remove();
                $(el).prepend(last);
                $('li:first', el).slideDown("slow", function() {
                    el.pause = false;
                });
            }
            else if (el.effect == 'spy') {

                var h = $('li:first', el).height() + 15;

                $('li:first', el).animate({ opacity: 0, marginTop: -h }, el.speed, function() {
                    $(this).css({ marginTop: 0 }).appendTo(el);
                    $(this).show().animate({ opacity: 1 }, el.speed);
                    el.pause = false;
                });

            }
        };
        this.each(function() {

            var el = this;

            el.effect = effect || 'fade';
            el.delay = delay || 4000;
            el.speed = speed || 700;

            if (el.nodeName.toLowerCase() != "ul") return;
            initTicker(el);
        }
	)
	.addClass("ticker")
	.hover(
		function() {
		    // pause if hovered over
		    pauseTicker(this);
		},
		function() {
		    // resume when not hovered over
		    resumeTicker(this);
		});
        return this;
    };

})(jQuery);
