package com.guru.facebookApplicationBase.friendPanel 
{
	import com.guru.call.*;
	import com.guru.event.EventCall;
	import com.guru.framePulse.*;
	import flash.events.*;
	import flash.utils.Timer;
	
	public class FriendPanelTimerUtil
	{
		private static var sTimer_array:Array = new Array();
		private static var sNextTimerId_num:Number = 1;
		
		private var mDelay_num:Number;
		private var mCall:ICall;
		private var mUseSecond_bol:Boolean;
		private var mTimer:Timer;
		private var mTimerId_num:Number;
		private var mEventCall:EventCall;
		
		/**
		 * set the delay with the frame number
		 * @param pDelay_num delay frame number
		 * @param pCall done call
		 * @return Number
		 * */
		public static function setFrameDelay(pDelay_num:Number,pCall:ICall):Number
		{
			return createTimer(pDelay_num,pCall,false);
		}
		
		/**
		 * set the delay with the time number
		 * @param pDelay_num delay time number
		 * @param pCall done call
		 * @return Number
		 * */
		public static function setDelay(pDelay_num:Number,pCall:ICall):Number
		{
			return createTimer(pDelay_num,pCall,true);
		}
		
		/**
		 * cancel all timer
		 * */
		public static function cancelAll():void
		{
			for (var i in sTimer_array)
			{
				sTimer_array[i].dispose();
				sTimer_array[i] = null;
				delete sTimer_array[i];
			}
		}
		
		/**
		 * cancel the timer
		 * @param pTimerId_num timer Id
		 * */
		public static function cancel(pTimerId_num:Number):void
		{
			sTimer_array[pTimerId_num].dispose();
			sTimer_array[pTimerId_num] = null;
			delete sTimer_array[pTimerId_num];
		}
		
		private static function createTimer(pDelay_num:Number,pCall:ICall,pUseSecond_bol:Boolean):Number
		{
			var timerId_num:Number = sNextTimerId_num;
			var timer:FriendPanelTimerUtil = new FriendPanelTimerUtil(pDelay_num,pCall,sNextTimerId_num,pUseSecond_bol);
			sTimer_array[timerId_num] = timer;
			timer.start();
			sNextTimerId_num++;
			return timerId_num;
		}
		
		public function FriendPanelTimerUtil(pDelay_num:Number,pCall:ICall,pTimerId_num:Number,pUseSecond_bol:Boolean = false)
		{
			mDelay_num = pDelay_num;
			mCall = pCall;
			mUseSecond_bol = pUseSecond_bol;
			mTimerId_num = pTimerId_num;
			mEventCall = new EventCall(this,onEnterFrame);
			this.start();
		}
		
		private function start():void
		{
			if ( mDelay_num == 0 )
			{
				executeCall();
			}
			
			if ( mUseSecond_bol )
			{
				mTimer = new Timer((mDelay_num * 1000));
				mTimer.repeatCount = 1;
				mTimer.addEventListener("timer", executeCall);
				mTimer.start();
			}
			else
			{
				FramePulse.addEventListener(FramePulseEvent.ENTER_FRAME,mEventCall);
			}
		}
		
		private function onEnterFrame(pEvent):void
		{
			mDelay_num--;
			if ( mDelay_num == 0 )
			{
				executeCall();
			}
		}
		
		private function executeCall(pEvent:TimerEvent = null):void
		{
			try {
				mCall.execute();
			}
			catch(pError) {}
			dispose();
		}
		
		public function dispose():void
		{
			if ( mUseSecond_bol )
			{
				mTimer.stop();
			}
			else
			{
				FramePulse.removeEventListener(FramePulseEvent.ENTER_FRAME,mEventCall);
			}
			
			sTimer_array[mTimerId_num] = null;
			delete sTimer_array[mTimerId_num];
			
			mCall = null;
		}
	}
}
