﻿
function TimerManager()
{
    var This = this;
    
    // Data members
    This.Timers = {};
    This.TimerId = 0;
    
    // Methods
    This.NextId = function()
    {
        var id = This.TimerId;
        This.TimerId++;
        return id;
    }
    
    This.Start = function(iTimer)
    {
        This.Timers[iTimer.Id] = iTimer;
        This.Handle = setInterval("Timers.Timeout(" + iTimer.Id + ")", iTimer.Delay);
    }
    
    This.Stop = function(iTimer)
    {
        clearInterval(iTimer.Handler);
        iTimer.Handle = null;
        delete This.Timers[iTimer.Id];
    }

    This.Timeout = function(iTimerId)
    {
        var timer = This.Timers[iTimerId];
        timer.Timeout();        
    }
    
    // Initialize

};

var Timers = new TimerManager();


function Timer(iDelay, iTimeoutHandler)
{
    var This = this;

    // Data members
    This.Id = null;
    This.Handle = null;
    This.StartTime = null;
    This.Delay = null;

    // Events
    This.OnTimeout = new EventHandler();

    // Methods
    This.Start = function()
    {
        if (This.Handle == null)
        {
            This.StartTime = (new Date()).valueOf();
            Timers.Start(This);
        }
    }

    This.Stop = function()
    {
        if (This.Handle != null)
        {
            var now = (new Date()).valueOf();
            var time = now - This.StartTime;
            Timers.Stop(This);
            This.StartTime = null;
            return time;
        }
    }

    This.GetTime = function()
    {
        var now = (new Date()).valueOf();
        return now - This.StartTime;
    }

    This.Timeout = function()
    {
        var now = (new Date()).valueOf();
        This.OnTimeout.Invoke(now - This.StartTime);
    }
    
    // Initialize
    {
        This.Delay = iDelay;
        if (iTimeoutHandler)
            This.OnTimeout.Add(iTimeoutHandler);
    }
}