﻿

////////////////////////////////////////////////////////////////////////////////////////////////////
// Effect
////////////////////////////////////////////////////////////////////////////////////////////////////
function Effect(iElement, iLength, iRate, iTrend)
{
    var This = this;

    // Data members
    This.Timer = null;
    This.Element = iElement;
    This.Length = (iLength) ? iLength : 1;
    This.Rate = (iRate) ? iRate : 40;
    This.Trend = (iTrend) ? iTrend : Trends.Linear;

    // Events
    This.OnComplete = new EventHandler();

    // Methods
    This.Start = function()
    {
        This.Timer = new Timer(1000.0 / This.Rate, This.Tick, true);
        This.Timer.Start();
    }

    This.Stop = function()
    {
        if (This.Timer)
        {
            This.Timer.Stop();
            This.Timer = null;
        }
    }

    This.Tick = function(iTime)
    {
        var progress = (This.Length > 0) ? iTime / This.Length : 0;

        if (progress >= 1.0)
        {
            This.Stop();
            This.Update(1.0);
            This.OnComplete.Invoke();
        }
        else
            This.Update(This.Trend(progress));
    }

    This.Update = function(iProgress)
    {
    }

    // Initialize
    {
    }
}

////////////////////////////////////////////////////////////////////////////////////////////////////
// Trends
////////////////////////////////////////////////////////////////////////////////////////////////////
var Trends = 
{
    'Linear' : function(iProgress) { return iProgress; },
    'Smooth' : function(iProgress) { var iProgress2 = iProgress * iProgress; return -2 * iProgress * iProgress2 + 3 * iProgress2; },
    'Dampered' : function(iProgress) { return (-iProgress*iProgress*iProgress + 3.0*iProgress)/2.0; }

};

////////////////////////////////////////////////////////////////////////////////////////////////////
