﻿function Accelimation(from, to, time, zip,src) {
if (typeof zip == "undefined") zip = 0;
if (typeof unit == "undefined") unit = "px";
this.x0 = from;
this.x1 = to;
this.dt = time;
this.zip = -zip;
this.unit = unit;
this.timer = null;
this.sender=src;
this.onend = new Function();
this.onframe = new Function();
}




Accelimation.prototype.start = function() {
this.t0 = new Date().getTime();
this.t1 = this.t0 + this.dt;
var dx = this.x1 - this.x0;
this.c1 = this.x0 + ((1 + this.zip) * dx / 3);
this.c2 = this.x0 + ((2 + this.zip) * dx / 3);
Accelimation._add(this);
}

Accelimation.prototype.stop = function() {
Accelimation._remove(this);
}




Accelimation.prototype._paint = function(time) {
	if (time < this.t1) {
	var elapsed = time - this.t0;
	this.onframe(Accelimation._getBezier(elapsed/this.dt,this.x0,this.x1,this.c1,this.c2));
	}
	else this._end();
}

Accelimation.prototype._end = function() {
	Accelimation._remove(this);
	this.onframe(this.x1);
	this.onend();
}




Accelimation._add = function(o) {
	var index = this.instances.length;
	this.instances[index] = o;	
	if (this.instances.length == 1) {
	this.timerID = window.setInterval("Accelimation._paintAll()", this.targetRes);
	}
}
Accelimation.prototype.dispose = function() {
    //window.clearInterval(this.timerID);
    Accelimation._remove(this);
}
Accelimation._remove = function(o) {
		for (var i = 0; i < this.instances.length; i++) 
		{
			if (o == this.instances[i]) {
				this.instances = this.instances.slice(0,i).concat( this.instances.slice(i+1) );
				break;
			}
		}

		if (this.instances.length == 0) {
			window.clearInterval(this.timerID);
			this.timerID = null;
	    }
}

Accelimation._paintAll = function() {
	var now = new Date().getTime();
	for (var i = 0; i < this.instances.length; i++)
	{
		this.instances[i]._paint(now);
	}
}

Accelimation._B1 = function(t) { return t*t*t }
Accelimation._B2 = function(t) { return 3*t*t*(1-t) }
Accelimation._B3 = function(t) { return 3*t*(1-t)*(1-t) }
Accelimation._B4 = function(t) { return (1-t)*(1-t)*(1-t) }

Accelimation._getBezier = function(percent,startPos,endPos,control1,control2) {
return endPos * this._B1(percent) + control2 * this._B2(percent) + control1 * this._B3(percent) + startPos * this._B4(percent);
}



Accelimation.instances = [];
Accelimation.targetRes = 10;
Accelimation.timerID = null;

var effect=new Object();
effect.utility = {
    GetHeight: function(obj) {
        var height;
        if (obj.clientHeight > 0) {
            height = obj.clientHeight;
        }
        else if (obj.firstChild) {
            
            height = obj.firstChild.clientHeight;
        }
        if(!height)
        {
            height=CLUtility.DOMElement.getElementSize(obj).height;
        }
        return height;
    }
}
effect.slideout={
    target:"",
    onEndArgs:"",
    onEnd:new Function(),
    onEnterFrame:function(x)
    {
    
       this.sender.target.style.height=x+"px";
    },
    
    start:function()
    {
        
        
            var heigth=this.target.clientHeight;
            if(heigth==0)
            {
                heigth=this.target.parentNode.clientHeight;
            }
           
            var e=new Accelimation(heigth,0,600,2,this);
            e.onframe=this.onEnterFrame;
            e.onend=this.onEnd;
            e.start();  
      
    }
}


effect.shake={
    target:"",
    e:"",
    counter:5,
    ox:"",
    oy:"",
    onEnterFrame:function(x)
    {
        x=Math.abs(x);
        this.sender.target.style.left=x+"px";
    },
    onEnd:function()
    {
         this.sender.counter--;
         //alert(this.sender.counter);
         if(this.sender.counter>0)
         {
            this.sender.e.start();
         }
         else
         {
           this.sender.target.style.left=this.sender.ox+"px";
           this.sender.counter=5; 
         }
    },
    start:function()
    {
        
        var startx=parseInt(this.target.style.left);
        this.ox=startx;
        this.e=new Accelimation(startx,startx+20,50,2,this);
        this.e.onframe=this.onEnterFrame;
        this.e.onend=this.onEnd;
        this.e.start();
       
    }
}
effect.slidein={
    target:"",
    onEnd:new Function(),
    onEnterFrame:function(x)
    {
        x=Math.abs(x);
        //alert(x);
        this.sender.target.style.height=x+"px";
    },
    start:function()
    {
           
         var endHeight=parseInt(this.target.style.height);
        
         if(!endHeight)
         {
            if(this.target.clientHeight)
            {
                endHeight=this.target.clientHeight;
            }
            else
            {
                endHeight=effect.utility.GetHeight(this.target);
            }
         }
        //alert(endHeight);
        var e=new Accelimation(0,endHeight,600,2,this);
        e.onframe=this.onEnterFrame;
        e.onend=this.onEnd;
        e.start();
    }
}

var CLEffect = {
    slide: { top_bottom: 1, left_right: 2 },
    slideout: function(target, onEndArgs) {
        this.target = target;
        this.onEndArgs = onEndArgs;
        this.onEnd = new Function();
        this.onEnterFrame = function(x) {

            this.sender.target.style.height = x + "px";
        }
        this.start = function() {
            var heigth = this.target.clientHeight;
            if (heigth == 0) {
                heigth = this.target.parentNode.clientHeight;
            }

            var e = new Accelimation(heigth, 0, 600, 2, this);
            e.onframe = this.onEnterFrame;
            e.onend = this.onEnd;
            e.start();
        }

    },

    slideoutleft: function(target, onEndArgs) {
        this.target = target;
        this.onEndArgs = onEndArgs;
        this.onEnd = new Function();
        this.onEnterFrame = function(x) {

            this.sender.target.style.width = x + "px";
        }
        this.start = function() {
            var width = this.target.clientWidth;
            if (width == 0) {
                width = this.target.parentNode.clientWidth;
            }

            var e = new Accelimation(width, 0, 600, 2, this);
            e.onframe = this.onEnterFrame;
            e.onend = this.onEnd;
            e.start();
        }

    },
    slideoutleft: function(target, onEndArgs) {
        this.target = target;
        this.onEndArgs = onEndArgs;
        this.onEnd = new Function();
        this.onEnterFrame = function(x) {

            this.sender.target.style.width = x + "px";
        }
        this.start = function() {
            var width = this.target.clientWidth;
            if (width == 0) {
                width = this.target.parentNode.clientWidth;
            }

            var e = new Accelimation(width, 0, 600, 2, this);
            e.onframe = this.onEnterFrame;
            e.onend = this.onEnd;
            e.start();
        }

    },

    slideoutleft_new: function(target, onEndArgs) {
        this.target = target;
        this.onEndArgs = onEndArgs;
        this.onEnd = new Function();
        this.from;
        this.to = 0;
        this.time = 600;
        this.zip = 1;
        this.onEnterFrame = function(x) {

            this.sender.target.style.width = x + "px";
        }
        this.start = function() {
            var width;
            if (this.from != undefined && this.from != null) {
                width = this.from;
            }
            else {
                var width = this.target.clientWidth;
                if (width == 0) {
                    width = this.target.parentNode.clientWidth;
                }
            }

            var e = new Accelimation(width, this.to, this.time, this.zip, this);
            e.onframe = this.onEnterFrame;
            e.onend = this.onEnd;
            e.start();
        }

    },
    slidein: function(target) {
        this.target = target;
        this.onEnd = new Function();
        this.onEnterFrame = function(x) {
            x = Math.abs(x);
            this.sender.target.style.height = x + "px";
        }
        this.start = function() {

            var endHeight = parseInt(this.target.style.height);
         
            if (!endHeight) {
                if (this.target.clientHeight) {
                    endHeight = this.target.clientHeight;

                }
                else if(this.target.firstChild)
                {
                      endHeight = this.target.firstChild.clientHeight;

                }
                else
                {
                    endHeight = effect.utility.GetHeight(this.target);
                }
            }
            
           
           
            if (endHeight > 0) {
                var e = new Accelimation(0, endHeight, 600, 2, this);
                e.onframe = this.onEnterFrame;
                e.onend = this.onEnd;
                e.start();
            }
        }
    },
    slide_in: function(target) {
        this.target = target;
        this.onEnd = new Function();
        this.from;
        this.to;
        this.direction;
        this.onEndArgs;

        this.onEnterFrame = function(x) {
            //x=Math.abs(x);
            if (this.sender.direction == CLEffect.slide.top_bottom) {
                this.sender.target.style.top = x + "px";
            }
            else if (this.sender.direction == CLEffect.slide.left_right) {
                this.sender.target.style.left = x + "px";
            }
            else {
                this.sender.target.style.top = x + "px";
            }

        }
        this.start = function() {
            var e = new Accelimation(this.from, this.to, 150, 1, this);
            e.onframe = this.onEnterFrame;
            e.onend = this.onEnd;
            e.start();
        }
    },
    slideinleft: function(target) {
        this.target = target;
        this.onEnd = new Function();
        this.onEndArgs = null;
        this.time = 600;
        this.zip = 2
        this.e;
        this.dispose = function() {

            this.onEnd = new Function();
            this.onEndArgs = null;
            this.onEnterFrame = new Function();
            this.e.dispose();
            this.e = null;

        }
        this.onEnterFrame = function(x) {
            x = Math.abs(x);
            this.sender.target.style.width = x + "px";
        }
        this.start = function() {

            var endWidth = parseInt(this.target.style.width);
            if (!endWidth) {
                if (this.target.clientWidth) {
                    endWidth = this.target.clientWidth;
                }
                else {
                    endWidth = this.target.firstChild.clientWidth;
                }
            }
            //alert(endHeight);
            this.e = new Accelimation(0, endWidth, this.time, this.zip, this);
            this.e.onframe = this.onEnterFrame;
            this.e.onend = this.onEnd;
            this.e.start();
        }
    },

    slideinleft_new: function(target) {
        this.target = target;
        this.onEnd = new Function();
        this.from = 0;
        this.to;
        this.time = 600;
        this.zip = 2;
        this.onEndArgs = null;
        this.e;
        this.dispose = function() {

            this.onEnd = new Function();
            this.onEndArgs = null;
            this.onEnterFrame = new Function();
            this.e.dispose();
            this.e = null;

        }
        this.onEnterFrame = function(x) {
            x = Math.abs(x);
            this.sender.target.style.width = x + "px";
        }
        this.start = function() {

            var endWidth;
            if (this.to == undefined || this.to == null) {
                endWidth = parseInt(this.target.style.width);
                if (!endWidth) {
                    if (this.target.clientWidth) {
                        endWidth = this.target.clientWidth;
                    }
                    else {
                        endWidth = this.target.firstChild.clientWidth;
                    }
                }
            }
            else {
                endWidth = this.to;
            }
            //alert(endHeight);
            this.e = new Accelimation(this.from, endWidth, this.time, this.zip, this);
            this.onframe = this.onEnterFrame;
            this.onend = this.onEnd;
            this.start();
        }
    },
    expand: function(target) {
        this.expandMode = { up: 1, out: 2 };
        this.accordObject;
        this.mode;
        this.accordObjectPos;
        this.accordObjectSize;
        this.shouldCenter = false;
        this.target = target;
        this.widthFrom;
        this.widthTo;
        this.heightFrom;
        this.heightTo;
        this.widthE;
        this.heightE;
        this.endTo = 0;
        this.time = 300;
        this.zip = 1;
        this.wEended = false;
        this.hEnded = false;
        this.onEndArgs;
        this.onEnd = new Function();
        this.widthOnEnd = function() { this.sender.onEnd(); };
        this.heightOnEnd = function() { this.sender.onEnd(); };
        this.heightOnEnterFrame = function(x) {

            this.sender.target.style.height = x + "px";
            if (this.sender.shouldCenter) {
                this.sender.constraintCenter(true);
            }
        };
        this.constraintCenter = function(ish) {
            if (!ish) {
                this.target.style.left = (this.accordObjectPos.x + this.accordObjectSize.width / 2 - parseInt(this.target.style.width) / 2) + "px";
            }
            else {
                this.target.style.top = (this.accordObjectPos.y + this.accordObjectSize.height / 2 - parseInt(this.target.style.height) / 2) + "px";
            }
        };
        this.widthOnEnterFrame = function(x) {
            //document.title = x;
            this.sender.target.style.width = x + "px";
            if (this.sender.shouldCenter) {
                this.sender.constraintCenter(false);
            }
        };
        this.start = function() {
            this.accordObjectSize = CLUtility.DOMElement.getElementSize(this.accordObject);
            this.accordObjectPos = CLUtility.DOMElement.getElementPosition(this.accordObject);
            this.widthTo = CLUtility.DOMElement.getElementSize(this.target).width;
            this.heightTo = CLUtility.DOMElement.getElementSize(this.target).height;
            if (this.mode == this.expandMode.up) {
                this.widthE = new Accelimation(0, this.widthTo, this.time, this.zip, this);
                this.heightE = new Accelimation(0, this.heightTo, this.time, this.zip, this)
            }
            else if (this.mode == this.expandMode.out) {
                this.widthE = new Accelimation(this.widthTo, this.endTo, this.time, this.zip, this);
                this.heightE = new Accelimation(this.heightTo, this.endTo, this.time, this.zip, this);
            }
            this.widthE.onframe = this.widthOnEnterFrame;
            this.widthE.onend = this.widthOnEnd;

            this.heightE.onframe = this.heightOnEnterFrame;
            this.heightE.onend = this.heightOnEnd;
            this.heightE.start();
            this.widthE.start();
        };
        this.dispose = function() {
            this.widthE.dispose();
            this.heightE.dispose();
            this.widthE = null;
            this.heightE = null;
        }


    },
    shake: function(target, counter) {
        this.target = target;
        this.counter = counter;
        this.e;
        this.ox;
        this.oy;
        this.onEnterFrame = function(x) {
            x = Math.abs(x);
            this.sender.target.style.left = x + "px";
        }
        this.onEnd = function() {
            this.sender.counter--;
            if (this.sender.counter > 0) {
                this.sender.e.start();
            }
            else {
                this.sender.target.style.left = this.sender.ox + "px";
                this.sender.counter = 5;
            }
        }
        this.start = function() {
            var startx = parseInt(this.target.style.left);
            this.ox = startx;
            this.e = new Accelimation(startx, startx + 20, 50, 2, this);
            this.e.onframe = this.onEnterFrame;
            this.e.onend = this.onEnd;
            this.e.start();
        }
    },
    scrollLeft: function(target, from, to) {
        this.target = target;
        this.from = from;
        this.to = to;
        this.e;
        this.endEventAgrs;
        this.direction;
        this.AccelimationMode;
        this.onEnd = new Function();
        this.onEnterFrame = function(x) {

            if (this.sender.direction == "+") {
                //document.getElementById("report").innerHTML+=x+"<br>";
                //alert("+"+x);
                if (this.sender.AccelimationMode != undefined && this.sender.AccelimationMode != null) {
                    this.sender.target.scrollLeft += x;
                }
                else {
                    this.sender.target.scrollLeft = x;
                }
            }
            else {
                if (this.sender.AccelimationMode != undefined && this.sender.AccelimationMode != null) {
                    this.sender.target.scrollLeft -= x;
                }
                else {
                    this.sender.target.scrollLeft = x;
                }
            }
        }
        this.start = function() {
            this.e = new Accelimation(this.from, to, 500, 2, this);
            this.e.onframe = this.onEnterFrame;
            this.e.onend = this.onEnd;
            this.e.start();
        }

    }
}
