package com.guru.facebookApplicationBase.friendPanel
{
	import com.guru.call.FunctionCall;
	import com.guru.call.ICall;
	import com.guru.display.externalLoader.LoaderQueue;
	import com.guru.display.LabelMovieClip;
	import com.guru.facebook.FacebookDataBridge;
	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 mScrollPanel:ScrollPanel;
		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;
		
		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();
			
			//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];	
				}
				else
				{
					//mWorldSelectedData_array = SELECTED_DATA;
					mWorldSelectedData_array = new Array();
				}
				
				if (pData_obj[FILTER_CRITERIA] != null && pData_obj[FILTER_CRITERIA] != undefined)
				{
					mFilterCriteria_array = pData_obj[FILTER_CRITERIA];	
				}
				else
				{
					mFilterCriteria_array = new Array();
				}
			}
			
			mLoaderQueue = new LoaderQueue();
			
			mFriendPanelSearchText = new FriendPanelSearchText(mContent_mc.search_mc);
			mFriendPanelSearchText.setChangeTextCall(new FunctionCall(this, onUpdateSearchKeyword));
			mScrollPanel = new ScrollPanel(mContent_mc.scrollPane, mContent_mc.scrollContent_mc);
			
			this.buildItem(mFriendData_array, new FunctionCall(this, buildItemDone));
			
			super.showPanel(pDoneCall);
		}
		
		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 
		{
			mLoaderQueue.reset();
			mLoaderQueue = null;
			
			this.clearItem();
			
			mFriendPanelSearchText.dispose();
			mScrollPanel.dispose();
			mScrollPanel = null;
			
			TraceUtil.printArray(mCurrentSelectedData_array);
			
			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();
					mScrollPanel.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();
			
			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));
			mScrollPanel.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)
				mScrollPanel.update();
		}
		
		private function buildItemDone():void
		{
			mScrollPanel.update();
			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();
			for (var i:Number = 0; i < mFriendData_array.length; i++ )
			{
				if (String(mFriendData_array[i]["name"]).toLowerCase().indexOf(pKeyword_str) >= 0)
				{
					result_array.push(mFriendData_array[i]);
				}
			}
			
			return result_array;
		}
	}

}