﻿GNgui.Animation = Class.create();
GNgui.Animation.prototype =
{
    initialize : function (Obj, sX, sY, sW, sH, sO, eX, eY, eW, eH, eO, Visibility, Step, Period)
    {
        if (typeof Obj == 'string') Obj = $e(Obj);
        if (Obj == null) return false;
        if (Visibility != false) Visibility = true;
        this.Visibility = Visibility ? 'visible' : 'hidden';
        
        o$(Obj, sO);
        Obj.style.position = 'absolute';
        Obj.style.visibility = 'visible';
        ltwh$(Obj, sX, sY, sW, sH);
        
        this.id = Obj.id;
        this.AnimationCanceled = false;

        this.Obj = Obj;   Obj.AnimationClass = this;
        this.Position = 0; this.Step = Step; this.Period = Period;
        this.sX = sX; this.sY = sY; this.sW = sW; this.sH = sH; this.sO = sO;
        this.eX = eX; this.eY = eY; this.eW = eW; this.eH = eH; this.eO = eO;
        this.dX = (eX - sX) / Step; this.dY = (eY - sY) / Step;
        this.dW = (eW - sW) / Step; this.dH = (eH - sH) / Step;
        this.cX = sX; this.cY = sY; this.cW = sW; this.cH = sH;
        this.dO = (eO - sO) / Step; this.cO = sO; 
        
        setTimeout("stepObjectAnimation('" + this.id + "')", Period / Step);
    },
    
    CancelAnimation : function ()
    {
        this.AnimationCanceled = true;
    }
}

function stepObjectAnimation(Obj)
{
    var tmpClass = $e(Obj).AnimationClass;
        tmpClass.Position++;
        tmpClass.cX = tmpClass.sX + tmpClass.Position * tmpClass.dX;
        tmpClass.cY = tmpClass.sY + tmpClass.Position * tmpClass.dY;
        tmpClass.cW = tmpClass.sW + tmpClass.Position * tmpClass.dW;
        tmpClass.cH = tmpClass.sH + tmpClass.Position * tmpClass.dH;
        tmpClass.cO = tmpClass.sO + tmpClass.Position * tmpClass.dO;
    ltwh$(Obj, tmpClass.cX, tmpClass.cY, tmpClass.cW, tmpClass.cH);
    o$(Obj, tmpClass.cO)

    var AnimationFinished = true;
    if (tmpClass.dX < 0) {if (tmpClass.cX <= tmpClass.eX) l$(Obj, tmpClass.eX); else AnimationFinished = false;}
    if (tmpClass.dX > 0) {if (tmpClass.cX >= tmpClass.eX) l$(Obj, tmpClass.eX); else AnimationFinished = false;}
    if (tmpClass.dY < 0) {if (tmpClass.cY <= tmpClass.eY) t$(Obj, tmpClass.eY); else AnimationFinished = false;}
    if (tmpClass.dY > 0) {if (tmpClass.cY >= tmpClass.eY) t$(Obj, tmpClass.eY); else AnimationFinished = false;}

    if (tmpClass.eW < tmpClass.sW) {if (tmpClass.cW <= tmpClass.eW) w$(Obj, tmpClass.eW); else AnimationFinished = false;}
    if (tmpClass.eW > tmpClass.sW) {if (tmpClass.cW >= tmpClass.eW) w$(Obj, tmpClass.eW); else AnimationFinished = false;}
    if (tmpClass.eH < tmpClass.sH) {if (tmpClass.cH <= tmpClass.eH) h$(Obj, tmpClass.eH); else AnimationFinished = false;}
    if (tmpClass.eH > tmpClass.sH) {if (tmpClass.cH >= tmpClass.eH) h$(Obj, tmpClass.eH); else AnimationFinished = false;}
    
    if (tmpClass.eO < tmpClass.sO) {if (tmpClass.cO <= tmpClass.eO) o$(Obj, tmpClass.cO); else AnimationFinished = false;}
    if (tmpClass.eO > tmpClass.sO) {if (tmpClass.cO >= tmpClass.eO) o$(Obj, tmpClass.cO); else AnimationFinished = false;}


    if (! AnimationFinished)
    {
        if (! tmpClass.AnimationCanceled)
        {
            setTimeout("stepObjectAnimation('" + Obj + "')", tmpClass.Period / tmpClass.Step);
        }
    }
    else
    {
        $e(Obj).style.visibility = tmpClass.Visibility;
        delete tmpClass;
    }
}