jQuery.extend(jQuery.fn, {
    ticker: function(options) {
        if (!this.length) {
            return jQuery(this);
        }

        var ticker = jQuery(this).data('ticker');
        if (!ticker) {
            ticker = new jQuery.ticker(jQuery(this), options);
            jQuery(this).data('ticker', ticker);
        }

        return ticker;
    }
});

jQuery.ticker = function(ticker, options) {
    this.ticker = ticker;
    this.settings = jQuery.extend({}, jQuery.ticker.defaults, options);
    this.init();
};

jQuery.extend(jQuery.ticker, {

    defaults: {
        speed: 5000,
        prependHTML: false,
        appendHTML: false
    },

    prototype: {
        init: function() {
            var $this = this;
            $this.idx = 0;
            $this.pause = false;
            $this.messages = $this.ticker.find('li');

            $this.messages.each(function(){
                if ($this.settings.prependHTML) {
                    jQuery(this).html([$this.settings.prependHTML,
                        jQuery(this).html()].join(''));
                }
                if ($this.settings.appendHTML) {
                    jQuery(this).html([jQuery(this).html(),
                        $this.settings.appendHTML].join(''));
                }
            });

            $this.messages.eq(0).show();

            if ($this.messages.length > 1) {
                $this.messages.not(':first').hide();

                $this.ticker.hover(function(){
                    $this.pauseTicker();
                }, function(){
                    $this.resumeTicker();
                });

                setInterval(function(){
                    $this.doTick()
                }, $this.settings.speed);
            }
        },

        pauseTicker: function() {
            this.pause = true;
        },

        resumeTicker: function() {
            this.pause = false;
        },

        doTick: function() {
            var $this = this;

            if ($this.pause) return;

            $this.pause = true;

            $this.messages.eq($this.idx).fadeOut('slow', function(){
                $this.idx = ++$this.idx % $this.messages.length;
                $this.messages.eq($this.idx).fadeIn('slow', function(){
                    $this.pause = false;
                });
            });
        }
    }
});
