
function EffectManager() {
    this.effects = new Array();
    this.isRunning = false;
    
    this.addEffect = function(effect) {
        this.effects[this.effects.length] = effect;
    }
    
    this.execute = function() {
        if(!this.isRunning) { this.executeR(); }
    }
    
    this.executeR = function() {
        var done = true;
        var i;
        for(i = 0; i < this.effects.length; i++) {
            var eff = this.effects[i];
            if(!eff.tick()) {
                done = false;
            }
        }
        this.isRunning = !(done);
        if(!done) {
            setTimeout('eMgr.executeR();', 100);
        }
        else {
            this.effects = new Array();
        }
    }
}

var eMgr = new EffectManager();

function FadeInEffect(elem, inc) {
    this.elem = elem;
    this.inc = inc;
    this.start = 0;
    this.done = false;
    
    if(elem instanceof String) {
        this.elem = document.getElementById(this.elem);
    }
    
    this.prevFilterValue = this.elem.style.filter;
    
    this.tick = function() {
        this.done = ((this.elem.style.visibility == "visible" || this.elem.style.visibility == "") && this.elem.style.opacity == 1);
        if(this.done)
            return this.done;
        this.elem.style.opacity = (this.start / 100);
        this.elem.style.filter = "alpha(opacity=" + this.start + ")";
        this.elem.style.visibility = "visible";
        
        if(this.start < 100) {
            this.start += inc;
            if(this.start > 100) this.start = 100;
            return false;
        }
        else {
            this.elem.style.filter = this.prevFilterValue;
            this.done = true;
            return true;
        }
    }
}

function FadeOutEffect(elem, inc) {
    this.elem = elem;
    this.inc = inc;
    this.start = 100;
    this.done = false;
    
    if(elem instanceof String) {
        this.elem = document.getElementById(this.elem);
    }
    
    this.prevFilterValue = this.elem.style.filter;
    
    this.tick = function() {
        if(this.elem.style.visibility != "visible") {
            this.done = true;
        }
        if(this.done)
            return this.done;
        this.elem.style.opacity = (this.start / 100);
        this.elem.style.filter = "alpha(opacity=" + this.start + ")";
        this.elem.style.visibility = "visible";
        
        if(this.start > 0) {
            this.start -= inc;
            if(this.start < 0) this.start = 0;
            return false;
        }
        else {
            this.elem.style.filter = this.prevFilterValue;
            this.elem.style.visibility = "hidden";
            this.done = true;
            return true;
        }
    }
}

function fadeIn(elem, inc) {
    eMgr.addEffect(new FadeInEffect(elem, inc));
    eMgr.execute();
}

function fadeOut(elem, inc) {
    eMgr.addEffect(new FadeOutEffect(elem, inc));
    eMgr.execute();
}