var ListRotator = new Class({
    Implements: Options,
    options: {
        'elementSelector': 'li',
        'scrollDelay': 12,
        'scrollSpeed': 1,
        'itemCallbacks': {
            'mouseenter': function(ev) {
                this.pause( );
            },
            'mouseleave': function(ev) {
                this.resume( );
            }
        }

    },

    initialize: function(holder, options) {
        this.holder = $(holder);
        this.setOptions(options);
        this.elements = this.holder.getElements(this.options.elementSelector);
    
        this.width = this.holder.getSize( ).x;
        this.height = 0;
        this.elements.each(function(el) {
            var y = el.getDimensions( ).y;
            if(y > this.height) this.height = y;
        }.bind(this));

        this.initElements( );
    },

    initElements: function( ) {
        this.holder.setStyle("width", this.width);
        this.holder.setStyle("height", this.height);
        this.holder.setStyle("position", "relative");
        this.holder.setStyle("overflow", "hidden");

        var left = this.width + 1;

        this.elements.each(function(el) {
            el.setStyle("position", "absolute");
            el.setStyle("top", (this.height-el.getDimensions( ).y) / 2);
            el.setStyle("left", left);
            left += el.getSize( ).x + el.getStyle("margin-left").toInt() + 
                el.getStyle("margin-right").toInt();

            for(id in this.options.itemCallbacks) {
                el.addEvent(id, this.options.itemCallbacks[id].bindWithEvent(this));
            }
        }.bind(this));
    },

    start: function( ) {
        this.initElements( );
        this.resume( );
    },

    update: function( ) {
        var left;
        var resetEls = [];

        this.elements.each(function(el, i) {
            left = el.getStyle("left").toInt( ) - this.options.scrollSpeed;
            if(left + el.getDimensions( ).x <= 0) resetEls.push(el);
            el.setStyle("left", left);

        }.bind(this));

        if(resetEls) {
            var last = this.elements[0];
            this.elements.each(function(el) {
                if(el.getStyle("left").toInt() > last.getStyle("left").toInt()) {
                    last = el;
                }
            });


            var left = last.getStyle("left").toInt( ) + last.getSize( ).x +
                last.getStyle("margin-left").toInt() + 
                last.getStyle("margin-right").toInt();

            resetEls.each(function(el) {
                el.setStyle("left", left);
                left += el.getSize( ).x + el.getStyle("margin-left").toInt() + 
                    el.getStyle("margin-right").toInt();
            });
        }

        this.rotateTimer = this.update.delay(this.options.scrollDelay, this);
    },

    pause: function( ) {
        $clear(this.rotateTimer);
    },

    resume: function( ) {
        $clear(this.rotateTimer);
        this.rotateTimer = this.update.delay(this.options.scrollDelay, this);
    }
});

