 var cyclicFader = {

        faders: new Array(),
        interval: 1000,
        _cursor: 0,
        _started: false,
        _InOut: "",

        addFader: function (objFader) {
            objFader._watchIndex = this.faders.length;
            objFader.addWatcher(this);
            this.faders.push(objFader);
        },

        startIn: function(startInterval) {

        	var setInterval = startInterval == null ? 0 : startInterval;

            if(this._started) return;

            this._setFaderIn(this._cursor,setInterval);

            this._setFaderOut(this._previousIndex(),setInterval);
            this._started = true;
            this._InOut = "In";
        },

        startOut: function(startInterval) {

        	var setInterval = startInterval == null ? 0 : startInterval;

            if(this._started) return;
            this._setFaderOut(this._cursor,setInterval);
            this._next();
            this._setFaderIn(this._cursor,setInterval);
            this._started = true;
            this._InOut = "Out";
        },

        _setFaderIn: function (index,interval) {

        	var setInterval = interval == null ? this.interval : interval;

            if(cyclicFader.faders[index] && cyclicFader.faders[index].fadeIn)
              setTimeout("cyclicFader.faders[" + index + "].fadeIn()",setInterval);
        },

        _setFaderOut: function (index,interval) {

        	var setInterval = interval == null ? this.interval : interval;

            if(cyclicFader.faders[index] && cyclicFader.faders[index].fadeOut)
                setTimeout("cyclicFader.faders[" + index + "].fadeOut()",setInterval);
        },

        _next: function() {
            this._cursor++;
            if(this._cursor >= this.faders.length) this._cursor = 0;
        },

        _previousIndex: function() {
        	return ( this.cursor - 1 ) < 0 ? this.faders.length : this.cursor - 1 ;
        },

        notify: function (objFader){

            if(objFader._watchIndex == this._cursor){

                var f, s;
                switch(this._InOut){
                    case "In":
                        f = "Out";
                        s = "In";
                    break
                    default:
                        f = "Out";
                        s = "In";
                }

                eval("this._setFader" + f + "(this._cursor);");
                this._next();
                eval("this._setFader" + s + "(this._cursor);");

            }
        }
    };

