if(typeof IdeorisLib == 'undefined')
	IdeorisLib = {};

if(typeof IdeorisLib.Classes == 'undefined')
	IdeorisLib.Classes = {};

if(!IdeorisLib.Classes.IdeorisTimer)
{
	//Creating new class
	IdeorisLib.Classes.IdeorisTimer = function(timeoutLength)
	{
		this.m_timerID = 0;

		if(timeoutLength && timeoutLength > 0)
			this.m_timeoutLength = timeoutLength;
		else
			this.m_timeoutLength = 1000; //Default is 1 second
		

		this.Start = Start;
		this.Stop = Stop;
		this.IsStopped = IsStopped;
		this.GetTimeout = GetTimeout;
		this.GetIterations = GetIterations;
		this.SetIterations = SetIterations;
		this.SetCallback = SetCallback

		var m_this = this;
		var m_bIsTimerRunning = false;
		var m_callbackFunc = null;
		var m_nIterations = 0; //Continuous (non stop)
		var m_nIterationCounter = 0;

		function GetTimeout()
		{
			return m_this.m_timeoutLength;
		}

		function SetCallback(__callbackFunc)
		{
			m_callbackFunc = __callbackFunc;
		}

		function GetIterations()
		{
			return m_this.m_nIterations;
		}

		function SetIterations(nIterations)
		{
			m_nIterations = nIterations;
		}

		function IsStopped()
		{
			return m_bIsTimerRunning;
		}

		function Start(timeoutLength)
		{
			if(m_bIsTimerRunning)
				return; //Don't do anything is start is already executing

			if(timeoutLength && timeoutLength > 0)
				m_this.m_timeoutLength = timeoutLength;

			m_bIsTimerRunning = true;

			RunTimer();
		}

		function RunTimer()
		{
			var myObj = m_this;

			function __callbackFunc()
			{
				OnTimerExecute();
			}

			if(m_nIterations > 0)
			{
				if(m_nIterationCounter == m_nIterations)
				{
					//Stop timer if number of iterations has been achieved
					m_this.Stop();
					return;
				}
			}

			//alert(m_this.m_timeoutLength);
			m_this.m_timerID = setTimeout(__callbackFunc, m_this.m_timeoutLength);

			m_nIterationCounter++;
		}

		function Stop()
		{
			//Don't do anything is timer is alreay stopped
			if(!m_bIsTimerRunning)
				return;

			m_bIsTimerRunning = false;
			m_nIterationCounter = 0;

			if(m_this.m_timerID > 0)
			{
				clearTimeout(m_this.m_timerID);
				m_this.m_timerID = 0;
			}
		}

		function OnTimerExecute()
		{
			clearTimeout(m_this.m_timerID);

			m_this.m_timerID = 0;

			if(m_callbackFunc)
				m_callbackFunc(); //Execute call back function

			if(m_bIsTimerRunning)
				RunTimer(); //Recursive call
		}

	}  //End class

}