var LastEffectInstance = null;
var EffectsCount = 0;
var EffectInstances = new Array();
var EFFECT_FADE = 1;
var EFFECT_SCROLL = 2;

var EFFECT_IN = 1;
var EFFECT_OUT = 2;

function SetAlpha(element,alpha){
    if(!element) return;
    if(alpha<0) alpha = 0;
    if(alpha>1.0) alpha = 1.0;
    if(element.style.opacity==undefined){
        if(alpha==1.0){
            element.style.filter = "";
        }else{
        	element.style.filter = "Alpha(opacity="+parseInt(alpha*100)+")";
        }
    }else{
        element.style.opacity = alpha;
    }
    element.CurrentAlpha = alpha;
}

function GetAlpha(element){
    if(!element) return;
    return element.CurrentAlpha;
}

function FEffect(element){
	EffectsCount++;
	this.Id = EffectsCount+"ef";
	this.ParentEffect = null;
    this.Element = element;
    this.ContentElement = 0;
    this.EffectIn = EFFECT_SCROLL|EFFECT_FADE;
    this.EffectOut = EFFECT_SCROLL|EFFECT_FADE;
    this.DefaultWidth = 0;
    this.DefaultHeight = 0;
    this.Action = 0;
    
    this.onload = null;
    
    this._prev = LastEffectInstance;
    
    this.Execute = function(){
        if(!this.Element) return;
        if(this.Element.style.display){
			this.Open();
        }else{
            this.Close();
        }
    }
    
    this.Close = function(){
        if(this.Element.style.display) return;
        this.Action = EFFECT_OUT;
        EffectInstances[this.Id] = this;
    }
    
    this.Open = function(){
        if(!this.Element.style.display) return;
        this.Action = EFFECT_IN;
        this.Element.style.display = "";
        if((this.EffectIn&EFFECT_FADE)==0){
            SetAlpha(this.Element,1.0);
        }
        EffectInstances[this.Id] = this;
    }
    
    this.Update = function(){
		var h = ElementContentHeight(this.ContentElement);
		if(this.DefaultHeight!=h){
        	this.DefaultHeight = h;
        	if(!this.Element.style.display && !this.Action){
        	    this.Element.style.height = this.DefaultHeight+"px";
        	}
        }
        switch(this.Action){
            case EFFECT_IN:
                var count = 0;
                var total = 0;
                if(this.EffectIn&EFFECT_FADE){
                    total++;
                    if(GetAlpha(this.Element)<1.0){
                        SetAlpha(this.Element,GetAlpha(this.Element)+0.05);
                    }else{
                        SetAlpha(this.Element,1.0);
                        count++;
                    }
                }
                if(this.EffectIn&EFFECT_SCROLL){
                    total++;
                    if(ElementHeight(this.Element)<this.DefaultHeight){
                        var step = 16*(1.0-1.0/this.DefaultHeight*ElementHeight(this.Element));
                        if(step<1) step = 1;
                        this.Element.style.height = (parseInt(this.Element.style.height)+step)+"px";
	                    if(ElementHeight(this.Element)>this.DefaultHeight){
	                        count++;
	                        this.Element.style.height = this.DefaultHeight+"px";
	                    }
                    }else{
                        this.Element.style.height = this.DefaultHeight+"px";
                        count++;
                    }
                }
                this.UpdateParentSize();
                if(count==total) this.OnFinish();
                break;
            case EFFECT_OUT:
                var count = 0;
                var total = 0;
                if(this.EffectOut&EFFECT_FADE){
                    total++;
                    if(GetAlpha(this.Element)>0.0){
                        SetAlpha(this.Element,GetAlpha(this.Element)-0.05);
                    }else{
                        SetAlpha(this.Element,0.0);
                        count++;
                    }
                }
                if(this.EffectOut&EFFECT_SCROLL){
                    total++;
                    var elmh = ElementHeight(this.Element);
                    if(elmh>0){
	                    var step = 16*(1.0*elmh/this.DefaultHeight);
	                    if(step<1) step = 1;
                        var h = parseInt(parseInt(this.Element.style.height)-step);
                        if(h<0){
                            h = 0;
                            count++;
                        }
                        this.Element.style.height = h+"px";
                    }else{
                        this.Element.style.height = "0px";
                        count++;
                    }
                }
                this.UpdateParentSize();
                if(count==total) this.OnFinish();
                break;
            default:
                this.UpdateParentSize();
        }
    }
    
    this.UpdateParentSize = function(){
		var effect = this.ParentEffect;
		while(effect){
		    effect.CorrectSize();
		    effect = effect.ParentEffect;
		}
    }
    
    this.CorrectSize = function(){
        var elmh = ElementHeight(this.Element);
        this.DefaultHeight = ElementContentHeight(this.ContentElement);
		if(elmh<this.DefaultHeight){
            var step = 16*(1.0-1.0/this.DefaultHeight*elmh);
            if(step<1) step = 1;
            elmh += step;
            if(elmh>this.DefaultHeight){
                this.Element.style.height = this.DefaultHeight+"px";
            }else{
                this.Element.style.height = (elmh)+"px";
            }
        }else if(elmh>this.DefaultHeight){
            var step = 16*(1.0/this.DefaultHeight*elmh);
            if(step<1) step = 1;
            elmh -= step;
            if(elmh<this.DefaultHeight){
                this.Element.style.height = this.DefaultHeight+"px";
            }else{
                this.Element.style.height = (elmh)+"px";
            }
        }
        this.UpdateParentSize();
    }
    
    this.OnFinish = function(){
        if(this.Action==EFFECT_OUT) Toggle(this.Element);
        this.Action = 0;
        delete(EffectInstances[this.Id]);
        if(this.onload) this.onload(this);
    }
    
    LastEffectInstance = this;
    this.Element.innerHTML = "<div>"+this.Element.innerHTML+"<\/div>";
    this.ContentElement = this.Element.firstChild;
    if(this.Element.style.display){
        SetAlpha(this.Element,0.0);
        this.DefaultHeight = ElementContentHeight(this.ContentElement);
        this.DefaultWidth = ElementWidth(this.ContentElement);
        this.Element.style.height = "0px";
        this.Element.style.display = "none";
    }else{
        this.DefaultHeight = ElementContentHeight(this.ContentElement);
        this.DefaultWidth = ElementWidth(this.ContentElement);
        SetAlpha(this.Element,1.0);
    }
    this.Element.style.overflow = "hidden";
}

function AddEffectElement(element){
    if(!element) return;
    element.EffectInstance = new FEffect(element);
}

function UpdateEffectElements(){
    for(var attr in EffectInstances){
        EffectInstances[attr].Update();
    }
    window.setTimeout("UpdateEffectElements()",1);
}

AddElementEventFunction(window,"onload",UpdateEffectElements);