package com.guru.component.pagination
{
	import caurina.transitions.Tweener;
	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.display.button.LabelDragButton;
	import com.guru.display.Text;
	import com.guru.utils.Delegate;
	import flash.display.MovieClip;
	import flash.geom.Rectangle;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class PageListingPagination implements IPagination
	{
		private var mTimeline_mc:MovieClip;
		private var mPrevBtn:LabelButton;
		private var mNextBtn:LabelButton;
		private var mTotalPage_num:Number;
		private var mCurrentPage_num:Number;
		private var mChangePageCall:ICall;
		private var mPageBtn_array:Array;
		private var mBtnConstructor:Class;
		private var mBtnContainer_mc:MovieClip;
		
		public function PageListingPagination(pTimeline_mc:MovieClip)
		{
			mTimeline_mc = pTimeline_mc;
			
			mPrevBtn = new LabelButton(mTimeline_mc.prevBtn_mc);
			mNextBtn = new LabelButton(mTimeline_mc.nextBtn_mc);
			
			mBtnConstructor = mTimeline_mc.btnWithText_mc.constructor;
			mBtnContainer_mc = mTimeline_mc.container_mc;
			mTimeline_mc.btnWithText_mc.visible = false;
			
			mPageBtn_array = new Array();
			
			mNextBtn.setPressCall(new FunctionCall(this, onNextBtnPress));
			mPrevBtn.setPressCall(new FunctionCall(this, onPrevBtnPress));
			
			this.reset();
		}
		
		public function getTotalPage():Number
		{
			return mTotalPage_num;
		}
		
		public function getCurrentPage():Number
		{
			return mCurrentPage_num;
		}
		
		public function setChangePageCall(pCall:ICall):void
		{
			mChangePageCall = pCall;
		}
		
		public function dispose():void
		{
			mPrevBtn.dispose();
			mNextBtn.dispose();
			
			while (mPageBtn_array.length > 0)
			{
				var btn:LabelButtonWithText = mPageBtn_array.shift();
				mBtnContainer_mc.removeChild(btn.getTimeline());
				btn.dispose();
			}
		}
		
		public function setTotalPage(pValue_num:Number):void
		{
			mTotalPage_num = pValue_num;
			
			this.buildPageButton();
		}
		
		public function gotoPage(pValue_num:Number, pDoneCall:ICall = null):void
		{
			this.onPageBtnPress(Math.max(1, Math.min(pValue_num, mTotalPage_num)), pDoneCall);
		}
		
		public function reset():void
		{
			mTotalPage_num = 0;
			mCurrentPage_num = 0;
			this.enable(false);
		}
		
		public function nextPage():void
		{
			mNextBtn.onPress();
		}
		
		public function prevPage():void
		{
			mPrevBtn.onPress();
		}
		
		public function enable(pEnable_bol:Boolean):void
		{
			mNextBtn.enabled = pEnable_bol;
			mPrevBtn.enabled = pEnable_bol;
			
			for (var i:Number = 0; i < mPageBtn_array.length; i++ )
			{
				LabelButtonWithText(mPageBtn_array[i]).enabled = pEnable_bol;
			}
			
			if (pEnable_bol)
			{
				mNextBtn.reset();
				mPrevBtn.reset();
			}
			
			if (mCurrentPage_num == 1)
			{
				mPrevBtn.enabled = false;
			}
			
			if (mCurrentPage_num == mTotalPage_num)
			{
				mNextBtn.enabled = false;
			}
		}
		
		private function changeToPage(pValue_num:Number, pDoneCall:ICall = null):void
		{
			var targetPage_num:Number = Math.min(Math.max(pValue_num, 1), mTotalPage_num);
			
			if (mTotalPage_num > 0 && targetPage_num != mCurrentPage_num)
			{
				mCurrentPage_num = targetPage_num;
				this.refresh(pDoneCall);
			}
			else
			{
				if(pDoneCall)
					pDoneCall.execute();
			}
		}
		
		private function onNextBtnPress():void
		{
			this.onPageBtnPress(Math.min(mCurrentPage_num + 1, mTotalPage_num));
		}
		
		private function onPrevBtnPress():void
		{
			this.onPageBtnPress(Math.max(mCurrentPage_num - 1, 1));
		}
		
		private function refresh(pDoneCall:ICall = null):void
		{
			this.enable(false);
			
			if (mChangePageCall)
				mChangePageCall.execute();
				
			this.enable(true);
			
			if(pDoneCall)
				pDoneCall.execute();
		}
		
		private function onPageBtnPress(pIndex_num:Number, pDoneCall:ICall = null):void
		{
			for (var i:Number = 0; i < mPageBtn_array.length; i++ )
			{
				if (i + 1 != pIndex_num)
					LabelButtonWithText(mPageBtn_array[i]).reset();
				else
					LabelButtonWithText(mPageBtn_array[i]).select();
			}
			
			this.changeToPage(pIndex_num, pDoneCall);
		}
		
		private function buildPageButton():void
		{
			var x_num:Number = 0;
			for (var i:Number = 0; i < mTotalPage_num; i++ )
			{
				var btn_mc:MovieClip = new mBtnConstructor();
				var btn:LabelButtonWithText = new LabelButtonWithText(btn_mc);
				btn.setText(i + 1);
				btn.setPressCall(new FunctionCall(this, onPageBtnPress, i+1));
				mBtnContainer_mc.addChild(btn_mc);
				btn_mc.x = x_num;
				x_num += btn_mc.width;
				mPageBtn_array.push(btn);
			}
		}
	}
}