package com.guru.component.friendPanel.friendSelector 
{
	import com.guru.call.FunctionCall;
	import com.guru.call.ICall;
	import com.guru.display.button.LabelButton;
	import com.guru.display.externalLoader.LoaderQueue;
	import com.guru.display.LabelMovieClip;
	import com.guru.display.scrollPanel.GuruScrollPanel;
	import com.guru.display.Text;
	import com.guru.facebook.FacebookDataBridge;
	import com.guru.component.friendPanel.FriendPanelSearchText;
	import com.guru.component.friendPanel.FriendPanelTimerUtil;
	import com.guru.utils.TraceUtil;
	import flash.display.MovieClip;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class FriendSelector
	{
		private var mTimeline_mc:MovieClip;
		private var mHoriSegment_num:Number;
		private var mGuruScrollPanel:GuruScrollPanel;
		private var mFriendData_array:Array;
		private var mItemClass:Class;
		private var mItem_array:Array;
		private var mCurrentSelectedData_array:Array;
		private var mWorldSelectedData_array:Array;
		private var mFilterCriteria_array:Array;
		private var mFriendPanelSearchText:FriendPanelSearchText;
		private var mTimerUtilId_array:Array;
		private var mDelta_num:Number = 5;
		private var mLoaderQueue:LoaderQueue;
		private var mScrollContentControl:LabelMovieClip;
		private var mAllBtn:LabelButton;
		private var mMaleBtn:LabelButton;
		private var mFemaleBtn:LabelButton;
		private var mSelectedBtn:LabelButton;
		private var mConfirmBtn:LabelButton;
		private var mResetBtn:LabelButton;
		private var mFilterBtn_array:Array;
		private var mSelectCall:ICall;
		private var mLimitText:Text;
		private var mFriendQuotaLeft_num:Number;
		private var mFriendQuota_num:Number;
		private var mLimitError_mc:MovieClip;
		private var mResetCall:ICall;
		
		public function FriendSelector(pTimeline_mc:MovieClip, pFriendSelectionQuota_num:Number = 10, pHoriSegment_num:Number = 3, pWorldSelectedData_array:Array = null)
		{
			mTimeline_mc = pTimeline_mc;
			mHoriSegment_num = pHoriSegment_num;
			mFriendQuota_num = pFriendSelectionQuota_num;
			mFriendQuotaLeft_num = mFriendQuota_num;
			
			mItemClass = mTimeline_mc.friendItemBtn_mc.constructor;
			mTimeline_mc.friendItemBtn_mc.visible = false;
			
			mFilterCriteria_array = new Array();
			mWorldSelectedData_array = new Array();
			mCurrentSelectedData_array = new Array();
			
			if (pWorldSelectedData_array != null)
				mWorldSelectedData_array = pWorldSelectedData_array;
			
			//mWorldSelectedData_array = [{uid:1}, {uid:2}, {uid:3}];
			
			this.getFriendData();
			this.init();
			mAllBtn.onPress();
		}
		
		public function setSelectCall(pCall:ICall):void
		{
			mSelectCall = pCall;
		}
		
		public function dispose():void
		{
			FriendPanelTimerUtil.cancelAll();
			this.clearItem();
			mLoaderQueue.reset();
			mLoaderQueue = null;
			mAllBtn.dispose();
			mMaleBtn.dispose();
			mFemaleBtn.dispose();
			mSelectedBtn.dispose();
			mScrollContentControl.jumpTo("hide");
			mScrollContentControl.dispose();
			mGuruScrollPanel.dispose();
			mFriendPanelSearchText.dispose();
			mLimitText.dispose();
			
			mFilterBtn_array = new Array();
		}
		
		public function setResetCall(pCall:ICall):void
		{
			mResetCall = pCall;
		}
		
		public function resetConfirmBtn():void
		{
			mConfirmBtn.reset();
			mConfirmBtn.enabled = mFriendQuotaLeft_num < mFriendQuota_num;
		}
		
		private function onConfirmBtnPress():void
		{	
			if (mSelectCall)
				mSelectCall.execute(mCurrentSelectedData_array);
		}
		
		private function onResetBtnPress():void
		{
			mCurrentSelectedData_array = new Array();
			mLimitError_mc.gotoAndStop(1);
			mFriendQuotaLeft_num = mFriendQuota_num;
			mLimitText.setText(mFriendQuotaLeft_num);
			mFriendPanelSearchText.setText("");
			this.onUpdateSearchKeyword();
			mConfirmBtn.enabled = false;
			
			for (var i:Number = 0; i < mItem_array.length; i++ )
			{
				FriendSelectorItem(mItem_array[i]).reset();
			}
			
			if (mResetCall)
				mResetCall.execute();
		}
		
		private function init():void
		{
			mAllBtn = new LabelButton(mTimeline_mc.allBtn_mc);
			mMaleBtn = new LabelButton(mTimeline_mc.maleBtn_mc);
			mFemaleBtn = new LabelButton(mTimeline_mc.femaleBtn_mc);
			mSelectedBtn = new LabelButton(mTimeline_mc.selectedBtn_mc);
			mConfirmBtn = new LabelButton(mTimeline_mc.confirmBtn_mc);
			mResetBtn = new LabelButton(mTimeline_mc.resetBtn_mc);
			
			mFilterBtn_array = new Array();
			mFilterBtn_array.push(mAllBtn);
			mFilterBtn_array.push(mMaleBtn);
			mFilterBtn_array.push(mFemaleBtn);
			mFilterBtn_array.push(mSelectedBtn);
			
			mAllBtn.setPressCall(new FunctionCall(this, handleFilterBtn, 0));
			mMaleBtn.setPressCall(new FunctionCall(this, handleFilterBtn, 1));
			mFemaleBtn.setPressCall(new FunctionCall(this, handleFilterBtn, 2));
			mSelectedBtn.setPressCall(new FunctionCall(this, handleFilterBtn, 3));
			mConfirmBtn.setPressCall(new FunctionCall(this, onConfirmBtnPress));
			mResetBtn.setPressCall(new FunctionCall(this, onResetBtnPress));
			mResetBtn.setPressDoneCall(new FunctionCall(mResetBtn, mResetBtn.reset));
			
			mConfirmBtn.reset();
			mConfirmBtn.enabled = false;
			
			mLimitError_mc = mTimeline_mc.limitError_mc;
			mLimitText = new Text(mTimeline_mc.limitText_mc);
			mLimitText.setText(mFriendQuotaLeft_num);
			
			mLoaderQueue = new LoaderQueue();
			mFriendPanelSearchText = new FriendPanelSearchText(mTimeline_mc.search_mc);
			mFriendPanelSearchText.setChangeTextCall(new FunctionCall(this, onUpdateSearchKeyword));
			var scrollControlContent_mc:MovieClip = mTimeline_mc.scrollPanelControl_mc.content_mc;
			mGuruScrollPanel = new GuruScrollPanel(scrollControlContent_mc.scrollContent_mc, scrollControlContent_mc.mask_mc, scrollControlContent_mc.scrollBar_mc);
			mScrollContentControl = new LabelMovieClip(mTimeline_mc.scrollPanelControl_mc, "hide");
		}
		
		private function handleFilterBtn(pIndex_num:Number, pDoneCall:ICall = null):void
		{
			for (var i:Number = 0; i < mFilterBtn_array.length; i++ )
			{
				LabelButton(mFilterBtn_array[i]).enabled = false;
			}
			
			mScrollContentControl.playTo("hide", new FunctionCall(this, handleFilterBtn2, pIndex_num, pDoneCall));
		}
		
		private function handleFilterBtn2(pIndex_num:Number, pDoneCall:ICall = null):void
		{
			mLoaderQueue.reset();
			this.clearItem();
			mGuruScrollPanel.update(0, true);
			
			for (var i:Number = 0; i < mFilterBtn_array.length; i++ )
			{
				if(pIndex_num != i)
					mFilterBtn_array[i].reset();
			}
			
			//to get male, filter away female
			mFilterCriteria_array = new Array();
			if (pIndex_num == 0)
			{
				
			}
			else if (pIndex_num == 1)
			{
				mFilterCriteria_array["sex"] = "male";
			}
			else if (pIndex_num == 2)
			{
				mFilterCriteria_array["sex"] = "female";
			}
			else if (pIndex_num == 3)
			{
				mFilterCriteria_array["selected"] = true;
			}
			this.buildItem(mFriendData_array, new FunctionCall(this, buildItemDone));
			mScrollContentControl.playTo("show", new FunctionCall(this, handleFilterBtn3, pIndex_num, pDoneCall));
		}
		
		private function handleFilterBtn3(pIndex_num:Number, pDoneCall:ICall = null):void
		{
			for (var i:Number = 0; i < mFilterBtn_array.length; i++ )
			{
				LabelButton(mFilterBtn_array[i]).enabled = true;
			}
			
			if (pDoneCall != null)
				pDoneCall.execute();
		}
		
		private function onUpdateSearchKeyword():void
		{
			mLoaderQueue.reset();
			this.clearItem();
			var data_array:Array = this.filterFriendData(mFriendPanelSearchText.getData());
			this.buildItem(data_array, new FunctionCall(this, buildItemDone));
		}
		
		private function clearItem():void
		{
			FriendPanelTimerUtil.cancelAll();
			
			if (mItem_array != null)
			{
				while (mItem_array.length > 0)
				{
					var item:FriendSelectorItem = mItem_array.shift();
					mGuruScrollPanel.getScrollContentTimeline().removeChild(item.getTimeline());
					item.dispose();
				}
				mItem_array = null;
			}
		}
		
		private function isFriendDataMatchFilterCriteria(pFriendData_array:Array, pFilterCritera_array:Array):Boolean
		{
			var allMatch_bol:Boolean = true;
			
			for (var i in pFilterCritera_array)
			{
				if (pFriendData_array[i] != null && pFriendData_array[i] != pFilterCritera_array[i])
				{
					allMatch_bol = false;
					break;
				}
			}
			return allMatch_bol;
		}
		
		private function buildItem(pFriendData_array:Array, pDoneCall:ICall = null):void
		{
			mItem_array = new Array();
			mTimerUtilId_array = new Array();
			FriendPanelTimerUtil.cancelAll();
			mGuruScrollPanel.enable(false);
			mGuruScrollPanel.update(0, true);
			
			var delay_num:Number = 0;
			var added_num:Number = 0;
			
			for (var i:Number = 0; i < pFriendData_array.length; i++ )
			{
				delay_num = Math.floor(added_num / mHoriSegment_num / mDelta_num);
				
				if (this.isFriendDataMatchFilterCriteria(pFriendData_array[i], mFilterCriteria_array))
				{
					mTimerUtilId_array.push(FriendPanelTimerUtil.setFrameDelay(delay_num, new FunctionCall(this, doBuildItem, added_num, pFriendData_array[i], i % mHoriSegment_num == mHoriSegment_num - 1)));
					added_num++;
				}
			}
			
			if (pDoneCall != null)
			{
				FriendPanelTimerUtil.setFrameDelay(delay_num+1, pDoneCall);
			}
		}
		
		private function doBuildItem(pIndex_num:Number, pFriendData_array:Array, pIsLineEnd_bol:Boolean):void
		{
			mTimerUtilId_array.shift();
			var item_mc:MovieClip = new mItemClass();
			var item:FriendSelectorItem = new FriendSelectorItem(item_mc, mLoaderQueue);
			item.setData(pFriendData_array);
			
			var matched_bol:Boolean = false;
			
			for (var i:Number = 0; i < mCurrentSelectedData_array.length; i++ )
			{
				if (mCurrentSelectedData_array[i]["uid"] == pFriendData_array["uid"])
				{
					matched_bol = true;
					break;
				}
			}
			
			if (mCurrentSelectedData_array != null && matched_bol)
			{
				item.select();
			}
			
			else if(mWorldSelectedData_array != null)
			{
				for (var j in mWorldSelectedData_array)
				{
					if (mWorldSelectedData_array[j]["uid"] == pFriendData_array["uid"])
					{
						//item.select();
						item.enable(false);
						break;
					}
				}
			}
			
			item.setPressCall(new FunctionCall(this, onItemPress, item));
			mGuruScrollPanel.getScrollContentTimeline().addChild(item_mc);
			mItem_array.push(item);
			
			item_mc.x = (pIndex_num % mHoriSegment_num) * item.getSpacer().width;
			item_mc.y = Math.floor(pIndex_num / mHoriSegment_num) * item.getSpacer().height;
			
			if (pIsLineEnd_bol)
			{
				mGuruScrollPanel.update(-1, true);
			}
		}
		
		private function buildItemDone():void
		{
			mGuruScrollPanel.enable(true);
			mGuruScrollPanel.update(-1, true);
			mLoaderQueue.start();
		}
		
		private function onItemPress(item:FriendSelectorItem, pData_array:Array):void
		{
			pData_array["selected"] = item.isSelected();
			
			if (item.isSelected())
			{
				mFriendQuotaLeft_num--;
			}
			else
			{
				for (var i:Number = 0; i < mCurrentSelectedData_array.length; i++ )
				{
					if (mCurrentSelectedData_array[i]["uid"] == pData_array["uid"])
					{
						mCurrentSelectedData_array.splice(i, 1);
					}
				}
				
				mFriendQuotaLeft_num++;
			}
			
			mConfirmBtn.enabled = mFriendQuotaLeft_num < mFriendQuota_num;
			
			if (mFriendQuotaLeft_num > 0)
			{
				mLimitError_mc.gotoAndStop(1);
				mLimitText.setText(mFriendQuotaLeft_num);
				
				if(item.isSelected())
					mCurrentSelectedData_array.push(pData_array);
			}
			else if (mFriendQuotaLeft_num == 0)
			{
				mLimitError_mc.gotoAndStop(2);
				mLimitText.setText(mFriendQuotaLeft_num);
				
				if(item.isSelected())
					mCurrentSelectedData_array.push(pData_array);
			}
			else
			{
				mLimitError_mc.gotoAndStop(2);
				mFriendQuotaLeft_num = 0;
				item.reset();
			}
		}
		
		private function getFriendData():void
		{	
			mFriendData_array = FacebookDataBridge.getFriendList();
			
			for (var i:Number = 0; i < mFriendData_array.length; i++ )
			{
				mFriendData_array[i]["selected"] = false;
			}
		}
		
		private function filterFriendData(pKeyword_str:String):Array
		{
			var result_array:Array = new Array();
			pKeyword_str = pKeyword_str.toLowerCase();
			var keyword_array:Array = pKeyword_str.split(" ");
			
			for (var i:Number = 0; i < mFriendData_array.length; i++ )
			{
				var allMatch_bol:Boolean = true;
				
				for (var j:Number = 0; j < keyword_array.length; j++ )
				{
					if (String(mFriendData_array[i]["name"]).toLowerCase().indexOf(keyword_array[j]) == -1)
					{
						allMatch_bol = false
						break;
					}
				}
				
				if (allMatch_bol)
					result_array.push(mFriendData_array[i]);
			}
			
			return result_array;
		}
	}

}
