var BEBOP = YAHOO.namespace("bebop");

BEBOP.Infobox = function(listElem, cycle, delay) {
    delay = delay || 3000;
    this.init(listElem, cycle, delay);
}

BEBOP.Infobox.prototype = {

    init: function(listElem, cycle, delay) {
        this.cycle = cycle;
        this.delay = delay;
        this.current = 0;
        var listElem = document.getElementById(listElem);
        var items = listElem.getElementsByTagName('li');
        var anims = new Array(2*items.length);
        var Anim = YAHOO.util.Anim;
        var setStyle = YAHOO.util.Dom.setStyle;
        var easing = YAHOO.util.Easing.easeOutStrong;
        var callbacks = this.getCallbacks();
        var item;
        for (i=0; i<items.length; i++) {
            item = items[i];
            animin = new Anim(item, { opacity: { to: 1 } }, 4.0, easing);
            animout = new Anim(item, { opacity: { from: 1, to: 0 } }, 2.5, easing);
            animin.onStart.subscribe(callbacks.start);
            animin.onComplete.subscribe(callbacks.next);
            animout.onStart.subscribe(callbacks.start);
            animout.onComplete.subscribe(callbacks.next);
            anims[2*i] = animin;
            anims[2*i+1] = animout;
            setStyle( item , 'list-item-type', 'none');
            if (i>0) {
                setStyle( item , 'opacity', 0);
                setStyle( item, 'display', 'none');
            }
        }
        this.anims = anims;
    },

    getCallbacks : function() {
        var instance = this;
        return {
            start: function() {
                YAHOO.util.Dom.setStyle(this.getEl(), 'display', 'block');
            },
            next: function() {
                var nextindex = instance.current + 1;
                var anims = instance.anims;
                if (instance.cycle) {
                    if (nextindex == anims.length) {
                        nextindex = 0;
                    }
                }
                else {
                    if (nextindex == anims.length-1) {
                        //don't fade the last message
                        return;
                    }
                }
                var elem = this.getEl();
                var anim = anims[nextindex];
                if ( nextindex % 2 == 0 ) {
                    instance.show(elem, anim);
                }
                else {
                    setTimeout(function() {instance.show(elem, anim);}, instance.delay);
                }
                instance.current = nextindex;
            }
        }
    },

    run: function() {
        if (this.anims.length > 0) {
            this.anims[0].animate();
        }
    },

    show: function(prev, anim) {
        YAHOO.util.Dom.setStyle(prev, 'display', 'none');
        anim.animate();
    }
}
