function setOpacity(node, op) {
    if (node && node.style) {
        if(node.style.opacity) {
            node.style.opacity=op;
        } 
        node.style.filter ="Alpha(Opacity="+op*100+")";
        if (node.style.MozOpacity) {
            node.style.MozOpacity=op;
        } else if (node.style.KhtmlOpacity){
            node.style.KhtmlOpacity=op;
        } else{
            node.style.opacity=op;
        }
    }
}

CrossFade = function(fadeSpeed, fadeIncrement, pauseAfter) {
    // animation speed in ms (smaller is faster)
    if (fadeSpeed == null) {
        fadeSpeed = CrossFade.DEFAULT_SPEED;
    }
    this.continueFade = true;
    this.afterFade = "";
    this.pauseAfter = pauseAfter;
    this.deleteFromImage = true;
    
    if (fadeIncrement == null) {
       fadeIncrement = CrossFade.DEFAULT_INCREMENT;
    }
    
    this.fadeSpeed = fadeSpeed; 
    // fade speed (steps between 0.0 --> 1.0)
    this.fadeInc = fadeIncrement; 
    this.fadeStep = 0.0;
}

CrossFade.DEFAULT_SPEED = 8;
CrossFade.DEFAULT_INCREMENT = 0.05;


CrossFade.prototype.fade = function(fromImage, toImage, afterFade) {
    
    if (afterFade == undefined) afterFade = "";
    this.afterFade = afterFade;

    this.fadeStep = 0.0;
    
    this.fromImage = fromImage;
    this.toImage = toImage;

    this.toImage.style.top = "0px";
    this.toImage.style.left = "0px";
    setOpacity(this.toImage, 0.0);
    this.toImage.style.display= "block";    
    
    this.fromImage.style.top = "0px";
    this.fromImage.style.left = "0px";
    setOpacity(this.fromImage, 1.0);
    this.fromImage.style.display = "block";    
    
    this._fade();
}

CrossFade.prototype._fade = function() {
    if (this.timer) { 
        clearTimeout(this.timer); 
    }
    this.fadeStep = this._round(this.fadeStep + this.fadeInc);
    if (this.fadeStep < 1.0) { 
        // still working on cross-fade
        var fadeInOpac = this.fadeStep;
        setOpacity(this.toImage, fadeInOpac);
        
        var fadeOutOpac = this._round(1.0 - this.fadeStep);        
        setOpacity(this.fromImage, fadeOutOpac);
        
        var self = this;
        this.timer = setTimeout(function() { self._fade(self.fromImage, self.toImage) }, this.fadeSpeed);
    } else { 
        // finished the cross-fade
        this._finishFade(this.fromImage, this.toImage);
    }
}

CrossFade.prototype._finishFade = function() {
    if (this.timer) { 
        clearTimeout(this.timer); 
    }
//    this.fromImage.style.visibility = "hidden";   
    setOpacity(this.toImage, 1.0);  
    if (this.fromImage) {
        if (this.deleteFromImage) {
            var p = this.fromImage.parentNode;
            if (p) {
                p.removeChild(this.fromImage);
            }
        } else {
            this.fromImage.style.display = 'none';
            setOpacity(this.fromImage, 1.0);  
        }
    }
    //alert(this.continueFade +'\n'+ this.afterFade+'\n'+ this.pauseAfter);
    if (this.continueFade && this.afterFade != "") {
        var self = this;
        setTimeout(self.afterFade, this.pauseAfter);
        this.afterFade = "";
    }
}

CrossFade.prototype._round = function(val) {
    //round to 3 decimal places
    return Math.round(val*1000)/1000
}

CrossFade.prototype.stopAnimation = function() {
    this.continueFade = false;
    this._finishFade();
/*    if (this.timer) {
        clearTimeout(this.timer); 
    }
*/
}
