//////////////////////////////////////////////////////////////////////////////
//	Timer
//
//	Description:
//		Timer class.
//////////////////////////////////////////////////////////////////////////////
Jax.Timer = function(callback, interval) {

    // Initialize member variables.
    var m_callback = null;
    var m_timer = null;
    var m_interval;
    var m_isRunning = false;
    var m_args = [];

    // Establish class and set instance.
    Jax.oop.declare(Jax.Timer);
    this.setInstance();
    
    // Set methods.
    this.isRunning = function() { return m_isRunning; } 
    
    this.start = function() { 
        if (!m_isRunning) {
            m_timer = setInterval(_invoke, m_interval);
            m_isRunning = true;
        }
    }
    
    this.stop = function() {
        clearInterval(m_timer);
        m_isRunning = false;
    }
    
    // Initialize instance.
    if (arguments.length > 0) {
    
        // Store callback and setup arguments.
        if (Jax.js.isDelegate(callback))
            m_callback = callback.invoke;
        else if (Jax.js.isFunction(callback))
            m_callback = callback;
        else
            throw new Error("Argument error: callback is not a function or delegate");

        // Copy arguments.			
        for (var ii = 2; ii < arguments.length; ++ii)
            m_args.push(arguments[ii]);

        // Set up interval.
        m_interval = interval;
    }
    
    // Invoke callback.
    function _invoke() {
        return (m_args.length)
        ? m_callback.apply(window, m_args) 
        : m_callback.apply(window);
    }
}