package com.guru.facebookApplicationBase.friendPanel
{
	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.facebook.FacebookDataBridge;
	import com.guru.panel.Panel;
	import com.guru.panel.PanelBase;
	import com.guru.display.scrollPanel.ScrollPanel;
	import com.guru.utils.TimerUtil;
	import com.guru.utils.TraceUtil;
	import flash.display.Bitmap;
	import flash.display.MovieClip;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class FriendPanel extends PanelBase
	{
		public static var SELECTED_DATA:Array;
		public static var LOCAL_SELECT:String = "local_select";
		public static var GLOBAL_SELECT:String = "global_select";
		public static var FILTER_CRITERIA:String = "filter_criteria";
		
		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 mFilterBtn_array:Array;
		
		public function FriendPanel(pName_str:String, pTimeline_mc:MovieClip, pHoriSegment_num:Number = 3)
		{
			super(pName_str, pTimeline_mc);
			mHoriSegment_num = pHoriSegment_num;
			
			mItemClass = mContent_mc.friendItemBtn_mc.constructor;
			mContent_mc.friendItemBtn_mc.visible = false;
			
			SELECTED_DATA = new Array();
			mFilterCriteria_array = new Array();
			mWorldSelectedData_array = new Array();
			mCurrentSelectedData_array = new Array();
			
			//SELECTED_DATA[0] = new Array();
			//SELECTED_DATA[0]["uid"] = 5;
			//
			//SELECTED_DATA[1] = new Array();
			//SELECTED_DATA[1]["uid"] = 10;
			//
			//SELECTED_DATA[2] = new Array();
			//SELECTED_DATA[2]["uid"] = 15;
			//
			//SELECTED_DATA[3] = new Array();
			//SELECTED_DATA[3]["uid"] = 18;
		}
		
		override public function showPanel(pDoneCall:ICall = null, pData_obj:Object = null):void 
		{
			if (mFriendData_array == null)
			{
				this.getFriendData();
			}
			
			if (pData_obj != null)
			{
				if (pData_obj[LOCAL_SELECT] != null && pData_obj[LOCAL_SELECT] != undefined)
				{
					mCurrentSelectedData_array = pData_obj[LOCAL_SELECT];	
				}
				else
				{
					mCurrentSelectedData_array = new Array();
				}
				
				if (pData_obj[GLOBAL_SELECT] != null && pData_obj[GLOBAL_SELECT] != undefined)
				{
					mCurrentSelectedData_array = pData_obj[GLOBAL_SELECT];	
				}
				
				if (pData_obj[FILTER_CRITERIA] != null && pData_obj[FILTER_CRITERIA] != undefined)
				{
					mFilterCriteria_array = pData_obj[FILTER_CRITERIA];	
				}
				else
				{
					mFilterCriteria_array = new Array();	
				}
			}
			
			this.init();
			
			super.showPanel(pDoneCall);
			
			mAllBtn.onPress();
		}
		
		private function init():void
		{
			mAllBtn = new LabelButton(mContent_mc.allBtn_mc);
			mMaleBtn = new LabelButton(mContent_mc.maleBtn_mc);
			mFemaleBtn = new LabelButton(mContent_mc.femaleBtn_mc);
			
			mFilterBtn_array = new Array();
			mFilterBtn_array.push(mAllBtn);
			mFilterBtn_array.push(mMaleBtn);
			mFilterBtn_array.push(mFemaleBtn);
			
			mAllBtn.setPressCall(new FunctionCall(this, handleFilterBtn, 0));
			mMaleBtn.setPressCall(new FunctionCall(this, handleFilterBtn, 1));
			mFemaleBtn.setPressCall(new FunctionCall(this, handleFilterBtn, 2));
			
			mLoaderQueue = new LoaderQueue();
			mFriendPanelSearchText = new FriendPanelSearchText(mContent_mc.search_mc);
			mFriendPanelSearchText.setChangeTextCall(new FunctionCall(this, onUpdateSearchKeyword));
			var scrollControlContent_mc:MovieClip = mContent_mc.scrollPanelControl_mc.content_mc;
			mGuruScrollPanel = new GuruScrollPanel(scrollControlContent_mc.scrollContent_mc, scrollControlContent_mc.mask_mc, scrollControlContent_mc.scrollBar_mc);
			mScrollContentControl = new LabelMovieClip(mContent_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
		{
			this.clearItem();
			mGuruScrollPanel.update(0, true);
			//mGuruScrollPanel.update(-1);
			
			for (var i:Number = 0; i < mFilterBtn_array.length; i++ )
			{
				if(pIndex_num != i)
					mFilterBtn_array[i].reset();
			}
			
			//to get male, filter away female
			var filter_criteria:Array = new Array();
			if (pIndex_num == 0)
				mFilterCriteria_array = new Array();
			else if(pIndex_num == 1)
				mFilterCriteria_array["sex"] = "female";
			else if (pIndex_num == 2)
				mFilterCriteria_array["sex"] = "male";
			
			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 selfDispose():void
		{
			this.clearItem();
			
			mLoaderQueue.reset();
			mLoaderQueue = null;
			mAllBtn.dispose();
			mMaleBtn.dispose();
			mFemaleBtn.dispose();
			mScrollContentControl.jumpTo("hide");
			mScrollContentControl.dispose();
			mGuruScrollPanel.dispose();
			mFriendPanelSearchText.dispose();
			
			mFilterBtn_array = new Array();
		}
		
		override protected function onPanelShowDone(pDoneCall:ICall = null):void 
		{
			super.onPanelShowDone(pDoneCall);
		}
		
		override public function hidePanel(pDoneCall:ICall = null):void 
		{
			super.hidePanel(pDoneCall);
			FriendPanelTimerUtil.cancelAll();
		}
		
		override protected function onPanelHideDone(pDoneCall:ICall = null):void 
		{
			this.selfDispose();
			
			if (mHideDoneCall != null)
			{
				mHideDoneCall.execute(mCurrentSelectedData_array);
				mHideDoneCall = null;
			}
			
			super.onPanelHideDone(pDoneCall);
		}
		
		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:FriendPanelItem = 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(i:Number, pFriendData_array:Array, pIsLineEnd_bol:Boolean):void
		{
			mTimerUtilId_array.shift();
			var item_mc:MovieClip = new mItemClass();
			var item:FriendPanelItem = new FriendPanelItem(item_mc, mLoaderQueue);
			item.setData(pFriendData_array);
			
			if (mCurrentSelectedData_array != null && mCurrentSelectedData_array["uid"] == pFriendData_array["uid"])
			{
				item.select();
			}
			else if(mWorldSelectedData_array != null)
			{
				for (var j in mWorldSelectedData_array)
				{
					if (mWorldSelectedData_array[j]["uid"] == pFriendData_array["uid"])
					{
						item.select();
						break;
					}
				}
			}
			
			item.setPressCall(new FunctionCall(this, onItemPress));
			mGuruScrollPanel.getScrollContentTimeline().addChild(item_mc);
			mItem_array.push(item);
			
			item_mc.x = (i % mHoriSegment_num) * item.getSpacer().width;
			item_mc.y = Math.floor(i / 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(pData_array:Array):void
		{
			mCurrentSelectedData_array = pData_array;
			this.hidePanel();
		}
		
		private function getFriendData():void
		{	
			mFriendData_array = FacebookDataBridge.getFriendList();
		}
		
		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;
		}
	}

}