package com.guru.display.pagination 
{
	import com.guru.call.FunctionCall;
	import com.guru.call.ICall;
	import com.guru.display.button.LabelButton;
	import com.guru.display.button.LabelButtonWithText;
	import com.guru.utils.TimerUtil;
	import flash.display.MovieClip;
	import flash.events.MouseEvent;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class Pagination
	{
		public static var ALIGN_LEFT:Number = 3;
		public static var ALIGN_RIGHT:Number = 1;
		public static var ALIGN_TOP:Number = 4;
		public static var ALIGN_BOTTOM:Number = 2;
		
		private var mBtnWithText_mc:MovieClip;
		private var mContainer_mc:MovieClip;
		private var mNumberOfPage_num:Number;
		private var mAlign_num:Number;
		private var mPageBtn_array:Array;
		private var mChangePageCall:ICall;
		private var mDisablePageBtnWhenChangingContent_bol:Boolean;
		private var mPrevBtn_mc:MovieClip;
		private var mNextBtn_mc:MovieClip;
		private var mPauseBtn_mc:MovieClip;
		private var mPrevBtn:LabelButton;
		private var mNextBtn:LabelButton;
		private var mPauseBtn:LabelButton;
		private var mCurrentPage_num:Number;
		private var mAutoPagingTimeInterval_num:Number;
		private var mAutoPagingTimerID_num:Number;
		private var mPaused_bol:Boolean;
		private var mRollOverDetector_mc:MovieClip;
		
		public function Pagination(pBtnWithText_mc:MovieClip, pContainer_mc:MovieClip, pNumberOfPage_num:Number, pAlign_num:Number, pPrevBtn_mc:MovieClip = null, pNextBtn_mc:MovieClip = null, pPauseBtn_mc:MovieClip = null, pRollOverDetector_mc:MovieClip = null, pDisablePageBtnWhenChangingContent_bol:Boolean = false, pAutoPagingTimeInterval_num:Number = NaN)
		{
			mBtnWithText_mc = pBtnWithText_mc;
			mContainer_mc = pContainer_mc;
			mNumberOfPage_num = pNumberOfPage_num;
			mAlign_num = pAlign_num;
			mNextBtn_mc = pNextBtn_mc;
			mPrevBtn_mc = pPrevBtn_mc;
			mPauseBtn_mc = pPauseBtn_mc;
			mDisablePageBtnWhenChangingContent_bol = pDisablePageBtnWhenChangingContent_bol;
			mAutoPagingTimeInterval_num = (!isNaN(mAutoPagingTimeInterval_num))?Math.max(1, pAutoPagingTimeInterval_num):pAutoPagingTimeInterval_num;
			mAutoPagingTimerID_num = NaN;
			mPaused_bol = false;
			mRollOverDetector_mc = pRollOverDetector_mc;
			
			this.buildPagination();
		}
		
		public function setChangePageCall(pCall:ICall):void
		{
			mChangePageCall = pCall;
		}
		
		public function dispose():void
		{
			this.enablePause(false);
			
			if (!isNaN(mAutoPagingTimerID_num))
			{
				TimerUtil.cancel(mAutoPagingTimerID_num);
				mAutoPagingTimerID_num = NaN;
			}
			
			while (mPageBtn_array.length > 0)
			{
				var btnWithText:LabelButtonWithText = mPageBtn_array.shift();
				mContainer_mc.removeChild(btnWithText.getTimeline())
				btnWithText.dispose();
			}
			if (mPrevBtn_mc)
				mPrevBtn.dispose();
			if (mNextBtn_mc)
				mNextBtn.dispose();
			if (mPauseBtn_mc)
				mPauseBtn.dispose();
		}
		
		public function nextPage():void
		{
			mAutoPagingTimerID_num = NaN;
			this.onNextBtnPress();
		}
		
		public function prevPage():void
		{
			this.onPrevBtnPress();
		}
		
		public function changeToPage(pIndex_num:Number):void
		{
			if (!isNaN(mAutoPagingTimerID_num))
			{
				TimerUtil.cancel(mAutoPagingTimerID_num);
				mAutoPagingTimerID_num = NaN;
			}
				
			mCurrentPage_num = pIndex_num;
			
			for (var i:Number = 0; i < mPageBtn_array.length; i++ )
			{
				if(i != pIndex_num)
					LabelButtonWithText(mPageBtn_array[i]).reset();
				else
					LabelButtonWithText(mPageBtn_array[i]).select();
			}
			
			this.onChangePage(pIndex_num);
		}
		
		public function enablePageBtn(pEnable_bol:Boolean):void
		{
			for (var i:Number = 0; i < mPageBtn_array.length; i++ )
			{
				LabelButtonWithText(mPageBtn_array[i]).enabled = pEnable_bol;
			}
			
			if (pEnable_bol)
			{
				if(mPrevBtn_mc)
					mPrevBtn.reset();
				if(mNextBtn_mc)
					mNextBtn.reset();
			}
			
			if(mPrevBtn_mc)
				mPrevBtn.enabled = mCurrentPage_num != 0 && pEnable_bol;
			if(mNextBtn_mc)
				mNextBtn.enabled = mCurrentPage_num != mNumberOfPage_num - 1 && pEnable_bol;
				
			this.enablePause(pEnable_bol);
		}
		
		public function changePageDone():void
		{
			this.enablePageBtn(true);
			
			if (!mPaused_bol && !isNaN(mAutoPagingTimeInterval_num))
			{
				mAutoPagingTimerID_num = TimerUtil.setDelay(mAutoPagingTimeInterval_num, new FunctionCall(this, nextPage));
			}
		}
		
		public function resume():void
		{
			mPaused_bol = false;
			if(mPauseBtn_mc)
				mPauseBtn.reset();
				
			this.changePageDone();
		}
		
		public function pause():void
		{
			if(mPauseBtn_mc)
				mPauseBtn.onPress();
		}
		
		private function buildPagination():void
		{
			var btnConstructor:Class = mBtnWithText_mc.constructor;
			mPageBtn_array = new Array();
			
			var coordinate_num:Number = 0;
			for (var i:Number = 0; i < mNumberOfPage_num; i++ )
			{
				var btnWithText_mc:MovieClip = new btnConstructor();
				var btnWithText:LabelButtonWithText = new LabelButtonWithText(btnWithText_mc);
				btnWithText.setText(i + 1);
				btnWithText.setPressCall(new FunctionCall(this, changeToPage, i));
				mContainer_mc.addChild(btnWithText_mc);
				mPageBtn_array.push(btnWithText);
				
				btnWithText_mc.x = (mAlign_num - 2) % 2 * i * btnWithText_mc.width;
				btnWithText_mc.y = (mAlign_num - 3) % 2 * i * btnWithText_mc.height;
			}
			
			if (mPrevBtn_mc)
			{
				mPrevBtn = new LabelButton(mPrevBtn_mc);
				mPrevBtn.setPressCall(new FunctionCall(this, onPrevBtnPress));
			}
			
			if (mNextBtn_mc)
			{
				mNextBtn = new LabelButton(mNextBtn_mc);
				mNextBtn.setPressCall(new FunctionCall(this, onNextBtnPress));
			}
			
			if (mPauseBtn_mc)
			{
				mPauseBtn = new LabelButton(mPauseBtn_mc);
				mPauseBtn.setPressCall(new FunctionCall(this, onPauseBtnPress));
			}
			
			this.enablePause(true);
		}
		
		private function enablePause(pEnable_bol:Boolean):void
		{
			if(mPauseBtn_mc)
				mPauseBtn.enabled = pEnable_bol;
				
			if (pEnable_bol)
			{
				if (mRollOverDetector_mc)
				{
					mRollOverDetector_mc.addEventListener(MouseEvent.ROLL_OVER, onRollOverHandler);
					mRollOverDetector_mc.addEventListener(MouseEvent.ROLL_OUT, onRollOutHandler);
					
					if (mRollOverDetector_mc.mouseX > 0 && mRollOverDetector_mc.mouseX < mRollOverDetector_mc.width && mRollOverDetector_mc.mouseY > 0 && mRollOverDetector_mc.mouseY < mRollOverDetector_mc.height)
					{
						this.onRollOverHandler(null);
					}
				}
			}
			else
			{
				if (mRollOverDetector_mc)
				{
					mRollOverDetector_mc.removeEventListener(MouseEvent.ROLL_OVER, onRollOverHandler);
					mRollOverDetector_mc.removeEventListener(MouseEvent.ROLL_OUT, onRollOutHandler);
				}
			}
		}
		
		private function onRollOverHandler(e:MouseEvent):void
		{
			this.pause();
		}
		
		private function onRollOutHandler(e:MouseEvent):void
		{
			this.resume();
		}
		
		private function onChangePage(pIndex_num:Number):void
		{
			if (mDisablePageBtnWhenChangingContent_bol)
				this.enablePageBtn(false);
			
			if(mChangePageCall)
				mChangePageCall.execute(pIndex_num);
			
			//if (!mDisablePageBtnWhenChangingContent_bol)
				//this.changePageDone();
		}
		
		private function onPrevBtnPress():void
		{
			//this.changeToPage(Math.max(0, mCurrentPage_num - 1));
			this.changeToPage((mCurrentPage_num + mNumberOfPage_num - 1) % mNumberOfPage_num);
		}
		
		private function onNextBtnPress():void
		{
			//this.changeToPage(Math.min(mNumberOfPage_num - 1, mCurrentPage_num + 1));
			this.changeToPage((mCurrentPage_num + 1) % mNumberOfPage_num);
		}
		
		private function onPauseBtnPress():void
		{
			mPaused_bol = true;
			
			if (!isNaN(mAutoPagingTimerID_num))
			{
				TimerUtil.cancel(mAutoPagingTimerID_num);
				mAutoPagingTimerID_num = NaN;
			}
		}
	}

}