var tickerList = new Array();

function FadeTicker(Id, pauseAtDisplay, pauseAtBlank, fadeSpeed) {
    this.fadeOpacity = 0;
    this.animationTimeout = 0;
    this.delayTimeout = 0;
    this.tickerId = Id;
    this.opacityModifier = 1;
    this.isPaused = false;
    this.fadeSpeed = fadeSpeed == null ? 5 : fadeSpeed;
    this.pauseAtDisplay = pauseAtDisplay == null ? 0 : pauseAtDisplay;
    this.pauseAtBlank = pauseAtBlank == null ? 0 : pauseAtBlank
    this.ticker = document.getElementById(this.tickerId);
    this.onblanked = null;
    this.oncycled = null;
    
    if (this.tickerId == null)
        throw("ID is required.");
    else if (document.getElementById(this.tickerId) == null)
        throw("The ID must match at least one element.");
    else if (document.getElementById(this.tickerId).nodeName != "DIV")
        throw("The corsponding element must be DIV.");
    else if (tickerList[this.tickerId] != null)
        throw("Ticker with the ID already exists: " + this.tickerId);
    else
        tickerList[this.tickerId] = this;

    this.pause = function() {
        this.isPaused = true;
        clearTimeout(this.delayTimeout);
        clearTimeout(this.animationTimeout);
    }
    
    this.restart = function() {
        clearTimeout(this.delayTimeout);
        this.isPaused = false;
        this.animationTimeout = setTimeout("tickerList['" + this.tickerId + "'].animate(" + (this.opacityModifier * this.fadeSpeed) + ")", 50);
    }

    this.animate = function() {
        var fadePanel = document.getElementById(this.tickerId);
        
        this.fadeOpacity += this.opacityModifier * this.fadeSpeed;
        
        if (this.fadeOpacity <= 0) {
            this.opacityModifier = 1;
            this.showNext(false);
            
            // pause at 0% opacity.
            clearTimeout(this.animationTimeout);
            if (this.onblanked != null) {
                this.onblanked();
            }
            this.delayTimeout = setTimeout("tickerList['" + this.tickerId + "'].restart()", this.pauseAtBlank);
        }
        else if (this.fadeOpacity >= 100) {
            this.opacityModifier = -1;
            
            // pause at 100% opacity.
            clearTimeout(this.animationTimeout);
            this.delayTimeout = setTimeout("tickerList['" + this.tickerId + "'].restart()", this.pauseAtDisplay + 1);
        }
        else {
            this.setOpacity(fadePanel, this.fadeOpacity);
            this.animationTimeout = setTimeout("tickerList['" + this.tickerId + "'].animate()", 50);
        }
    }

    this.setOpacity = function(obj, opacity) {
        if (obj.style.opacity != null)
            obj.style.opacity = opacity/100;
        else if (obj.style.MozOpacity != null)
            obj.style.MozOpacity = opacity/100;
        else if (obj.style.filter != null)
            obj.style.filter = "alpha(opacity=" + opacity + ")";
    }

    this.showNext = function(isDirectCall) {
        var ix = 0;
        var panelArray = document.getElementById(this.tickerId).getElementsByTagName("div");
        
        for (var i = 0; i < panelArray.length; i++) {
            if (panelArray[i].style.display == "block") {
                if (i == panelArray.length - 1) {
                    ix = 0;
                    if (this.oncycled != null) {
                        this.oncycled();
                    }
                }
                else {
                    ix = i + 1;
                }
                ix = i >= panelArray.length - 1 ? 0 : i+1;
                panelArray[i].style.display = "none";
            }
            else {
                panelArray[i].style.display = "none";
            }
        }
        panelArray[ix].style.display = "block";
        if (isDirectCall == null || isDirectCall == true) {
            this.setOpacity(document.getElementById(this.tickerId), 100);
            this.opacityModifier = -1;
            this.pause();
            this.delayTimeout = setTimeout("tickerList['" + this.tickerId + "'].restart()", 5000);
        }
    }

    this.start = function() {
        this.showNext(false);
        this.animationTimeout = setTimeout("tickerList['" + this.tickerId + "'].animate()", 50);
    }
    
    this.reset = function() {
        this.fadeOpacity = 0;
        this.opacityModifier = 1;
        this.setOpacity(document.getElementById(this.tickerId), this.fadeOpacity);
        this.animationTimeout = setTimeout("tickerList['" + this.tickerId + "'].animate()", 50);
    }
}


