

////////////////////////////////////////////////////////////////////////////////////////////////////
// Timers
////////////////////////////////////////////////////////////////////////////////////////////////////
var Timers =
{
    _timers : {},
    _timerid : 0,
    
    generateId : function()
        {
            var id = Timers._timerid;
            Timers._timerid = Timers._timerid + 1;
            return id;
        },
        
    now : function()
        {
            var now = new Date();
            return now.valueOf();
        },        

    _init : function(iTimer)
        {
            Timers._timers[iTimer.id] = iTimer;
            iTimer.timeoutId = setTimeout('Timers._tick(' + iTimer.id +')', iTimer.delay);
        },
        
    _clear : function(iTimer)
        {
            clearTimeout(iTimer.timeoutId);
            iTimer.timeoutId = null;
            delete Timers._timers[iTimer.id];
        },        

    _tick : function(iId)
        {
            var timer = Timers._timers[iId];
            if (timer)
            {
                var now = null;
                var delay = null;
                timer._onTimeout();
                now = new Date();
                delay = timer.delay - (now.valueOf() - timer.lastTimeout);
                if (timer.repeat)
                    timer.timeoutId = setTimeout('Timers._tick(' + iId +')', delay);
                else
                    Timers._clear(timer);
            }
        }
}


////////////////////////////////////////////////////////////////////////////////////////////////////
// Timer
////////////////////////////////////////////////////////////////////////////////////////////////////
function Timer(iOnTimeout, iRepeat)
{
    var self = this;
    
    self.id = null;
    self.timeoutId = null;
    self.delay = null;
    self.startTime = null;
    self.lastTimeout = null;
    self.onTimeout = new EventHandler();
    
        
    self.init = function(iOnTimeout, iRepeat)
        {
            self.id = Timers.generateId();
            self.repeat = iRepeat;
            if (iOnTimeout)
                self.onTimeout.add(iOnTimeout);
        }

    self.start = function(iDelay)
        {
            if (self.startTime == null)
            {      
                var now = new Date();

                self.delay = iDelay;
                self.startTime = now.valueOf();
                self.nextTimeout = self.startTime + self.delay;

                Timers._init(self);
            }
        }
        
    self.stop = function()
        {
            if (self.startTime != null)
            {
                self.startTime = null;
                self.delay = null;
            
                Timers._clear(self);
            }
        }
        
    self.getTime = function()
        {
            if (self.startTime != null)        
            {
                var now = new Date();
                return now.valueOf() - self.startTime;
            }
            return false;
        }        
        
    self._onTimeout = function()
        {
            var now = new Date();
            self.lastTimeout = now.valueOf();
            self.onTimeout.invoke(self.lastTimeout - self.startTime);
        }


    self.init(iOnTimeout, iRepeat);
    
}

////////////////////////////////////////////////////////////////////////////////////////////////////