package com.guru.display.graphicDigit 
{
	import com.guru.call.FunctionCall;
	import com.guru.call.ICall;
	import com.guru.display.LabelMovieClip;
	import com.guru.utils.TimerUtil;
	import flash.display.MovieClip;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class GraphicDigit
	{
		private var mTimeline_mc:MovieClip;
		private var mId_num:Number;
		private var mNumber_num:Number;
		//before <-> center <-> after
		private var mControl:LabelMovieClip;
		private var mDigit_mc:MovieClip;
		private var mTimerID_num:Number;
		
		public function GraphicDigit(pTimeline_mc:MovieClip, pId_num:Number)
		{
			mTimeline_mc = pTimeline_mc;
			mId_num = pId_num;
			mControl = new LabelMovieClip(mTimeline_mc, "center");
			mDigit_mc = mTimeline_mc.digit_mc;
			mNumber_num = 0;
			mTimerID_num = -1;
		}
		
		public function setNumber(pValue_num:Number):void
		{
			mNumber_num = pValue_num;
		}
		
		public function getNumber():Number
		{
			return mNumber_num;
		}
		
		public function stop():void
		{
			if (mTimerID_num != -1)
			{
				TimerUtil.cancel(mTimerID_num);
				mTimerID_num = -1;
			}
			
			mControl.stop();
		}
		
		public function dispose():void
		{
			this.stop();
			mControl.dispose();
		}
		
		public function refresh(pAnimated_bol:Boolean = true, pDoneCall:ICall = null, pForwardAnimation_bol:Boolean = true):void
		{
			var nextIndex_str:String;
			if (pForwardAnimation_bol)
				nextIndex_str = "after";
			else
				nextIndex_str = "before";
			
			if(pAnimated_bol)
				mControl.playTo(nextIndex_str, new FunctionCall(this, onAfter, pAnimated_bol, pDoneCall, pForwardAnimation_bol));
			else
				mControl.jumpTo(nextIndex_str, new FunctionCall(this, onAfter, pAnimated_bol, pDoneCall, pForwardAnimation_bol));
		}
		
		private function onAfter(pAnimated_bol:Boolean = true, pDoneCall:ICall = null, pForwardAnimation_bol:Boolean = true):void
		{
			mDigit_mc.gotoAndStop(mNumber_num + 1);
			
			var nextIndex_str:String;
			if (pForwardAnimation_bol)
				nextIndex_str = "before";
			else
				nextIndex_str = "after";
				
			mControl.jumpTo(nextIndex_str, new FunctionCall(this, onBefore, pAnimated_bol, pDoneCall, pForwardAnimation_bol));
		}
		
		private function onBefore(pAnimated_bol:Boolean = true, pDoneCall:ICall = null, pForwardAnimation_bol:Boolean = true):void
		{
			if(pAnimated_bol)
				mControl.playTo("center", new FunctionCall(this, onCenter, pAnimated_bol, pDoneCall));
			else
				mControl.jumpTo("center", new FunctionCall(this, onCenter, pAnimated_bol, pDoneCall));
		}
		
		private function onCenter(pAnimated_bol:Boolean = true, pDoneCall:ICall = null):void
		{
			if (pAnimated_bol)
			{
				if (pDoneCall != null)
					pDoneCall.execute();
			}
			else
			{
				mTimerID_num = TimerUtil.setFrameDelay(1, new FunctionCall(this, onRefreshDone, pDoneCall));
			}
		}
		
		private function onRefreshDone(pDoneCall:ICall = null):void
		{
			mTimerID_num = -1;
			if (pDoneCall != null)
			{
				pDoneCall.execute();
			}
		}
	}

}