/**
 *	De Timer class is een geavanceerde versie van de setTimeout en setInterval functies.
 *
 *	@version 1.0.1 - 2008.04.18
 *	@package jsx.Timer
 */

jsx.Timer = JSX.Class.create('jsx.Timer');
jsx.Timer.prototype =
{
	/**
	 *	De id van de interval, gegenereerd door de setInterval() function.
	 *
	 *	@access private
	 *	@var int
	 */
	__timer: null,
	
	/**
	 *	Het aantal keren dat de interval is verstreken.
	 *
	 *	@access private
	 *	@var int
	 */
	__called: 0,
	
	/**
	 *	Het aantal miliseconden tussen de intervals.
	 *
	 *	@access private
	 *	@var int
	 */
	__delay: 1000,
	
	/**
	 *	Het aantal miliseconden tussen de intervals.
	 *
	 *	@access private
	 *	@var int
	 */
	__interval: 0,
	
	/**
	 *	Het maximaal aantal keren dat de interval mag worden uitgevoerd.
	 *
	 *	@access private
	 *	@var int
	 */
	__repeat: 0,
	
	/**
	 *	Geeft aan of de Timer loopt of niet.
	 *
	 *	@access private
	 *	@var bool
	 */
	__running: false,
	
	/**
	 *	Het onStart event wordt uitgevoerd zodra het Timer object wordt gestart door
	 *	middel van de start() function.
	 *
	 *	@event
	 */
	onStart: null,
	
	/**
	 *	Het onStop event wordt uitgevoerd zodra het Timer object wordt gestart door
	 *	middel van de stop() function.
	 *
	 *	@event
	 */
	onStop: null,
	
	/**
	 *	Het onTime event wordt iedere keer uitgevoerd wanneer het $delay aantal seconden
	 *	zijn verstreken.
	 *
	 *	@event
	 *	@param int	Het aantal keren dat de onTime event is aangeroepen.
	 */
	onTime: null,
	
	/*************************************************************************************
	 *	Constructor
	 *
	 *	@access public
	 *	@param number	$delay	Het aantal miliseconden tussen de oproepen.
	 *	@param number	$repeat	Het aantal oproepen dat maximaal mag worden uitgevoerd.
	 */
	__construct: function(delay, repeat)
	{
		JSX.Event.makeBroadcaster(this);
		
		this.setDelay(delay);
		this.setRepeat(repeat);
	},
	
	/*************************************************************************************
	 *	Geeft de vertraging tussen de oproepen op.
	 *
	 *	@access public
	 *	@param number	$delay	Het aantal miliseconden tussen de oproepen.
	 *	@return void
	 */
	setDelay: function(delay)
	{
		if(JSX.isNumeric(delay)) this.__delay = delay;
	},
	
	/*************************************************************************************
	 *	Geeft het maximaal aantaal oproepingen op. Als het aantal is overschreden, wordt
	 *	automatisch de stop() function uitgevoerd.
	 *
	 *	@access public
	 *	@param number	$repeat	Het aantal oproepen dat maximaal mag worden uitgevoerd.
	 *	@return void
	 */
	setRepeat: function(repeat)
	{
		if(JSX.isNumeric(repeat)) this.__repeat = repeat;
	},
	
	/*************************************************************************************
	 *	Geeft het aantal oproepingen terug.
	 *
	 *	@access public
	 *	@return number
	 */
	getCallCount: function()
	{
		return this.__called;
	},
	
	/*************************************************************************************
	 *	Geeft de vertraging tussen de oproepingen terug.
	 *
	 *	@access public
	 *	@return number
	 */
	getDelay: function()
	{
		return this.__delay
	},
	
	/*************************************************************************************
	 *	Geeft het maximaal aantal oproepingen terug.
	 *
	 *	@access public
	 *	@return number
	 */
	getRepeatCount: function()
	{
		return this.__repeat;
	},
	
	/*************************************************************************************
	 *	Geeft aan of de Timer momentaal aan staat of niet.
	 *
	 *	@access public
	 *	@return bool
	 */
	isRunning: function()
	{
		return this.__running
	},
	
	/*************************************************************************************
	 *	Start de timer en zorgt ervoor dat om de zoveel miliseconden een call functie
	 *	wordt uitgevoerd.
	 *
	 *	@access public
	 *	@return void
	 */
	start: function()
	{
		if(!this.__running)
		{
			var $timer = this;
			var call = function()
			{
				$timer.__called++;
				$timer.dispatchEvent('onTime', [$timer.__called]);
				
				if($timer.__called >= $timer.__repeat && $timer.__repeat > 0) $timer.stop();
				else if($timer.__delay != $timer.__interval)
				{
					$timer.stop();
					$timer.start();
				}
			}
			
			this.__running = true;
			this.__interval = this.__delay;
			this.__timer = setInterval(call, this.__interval);
			this.dispatchEvent('onStart');
		}
	},
	
	/*************************************************************************************
	 *	Stopt de timer.
	 *
	 *	@access public
	 *	@return void
	 */
	stop: function()
	{
		if(this.__running)
		{
			clearInterval(this.__timer);
			this.__running = false;
			this.dispatchEvent('onStop');
		}
	},
	
	/*************************************************************************************
	 *	Hersteld de interne optel variabelen.
	 *
	 *	@access public
	 *	@return void
	 */
	reset: function()
	{
		this.__called = 0;
	}
};
