package com.guru.facebook 
{
	import com.adobe.serialization.json.JSON;
	import com.facebook.data.users.GetInfoFieldValues;
	import com.guru.call.FunctionCall;
	import com.guru.call.ICall;
	import com.guru.conn.ConnAbstract;
	import com.guru.conn.ConnPath;
	import com.guru.facebookApplicationBase.message.Message;
	import com.guru.panel.Panel;
	import com.guru.panel.StatusBar;
	import com.guru.utils.TimerUtil;
	import com.guru.utils.TraceUtil;
	import flash.system.Security;
	/**
	 * ...
	 * @author Eddy Lee
	 */
	public class FacebookIFrameCenter
	{
		private static var sSessionForBrowserBug:String = "";
		
		//Guru Aya uid
		public static var UID:String;
		public static var NAME:String;
		public static var BIRTHDAY:String;
		public static var PIC:String;
		public static var SEX:String;
		public static var FRIEND_LIST:Array;
		
		private static var sInitStack_array:Array;
		private static var sInitDoneCall:ICall;
		private static var sInfoFieldsValue_str:String;
		private static var sConnAbstract:ConnAbstract;
		
		public function FacebookIFrameCenter() 
		{
			
		}
		
		public static function init(pJSON_str:String, pDoneCall:ICall = null):void
		{
			FRIEND_LIST = new Array();
			sInitStack_array = new Array();
			sInitDoneCall = pDoneCall;
			
			Security.loadPolicyFile("http://profile.ak.fbcdn.net/crossdomain.xml");
			
			sInfoFieldsValue_str = GetInfoFieldValues.NAME + "," + GetInfoFieldValues.SEX + "," + GetInfoFieldValues.PIC_SQUARE + "," + GetInfoFieldValues.BIRTHDAY;
			
			Panel.showStatusBar(StatusBar.LOADING, Message.IFRAME_CENTER_LOAD_PERSONAL_DATA);
			
			if (pJSON_str != null && pJSON_str.length > 0)
			{
				setSelfProfileFromJSON(pJSON_str);
			}
			else
			{
				var data_obj:Object = new Object();
				data_obj["uid"] = "100001033246788";
				data_obj[GetInfoFieldValues.NAME] = "aya";
				data_obj[GetInfoFieldValues.SEX] = "male";
				data_obj[GetInfoFieldValues.BIRTHDAY] = "May 29, 1990";
				data_obj[GetInfoFieldValues.PIC_SQUARE] = "image/face.jpg";
				setSelfProfileFromJSON(JSON.encode(data_obj));
			}
			
			sInitStack_array.push(new FunctionCall(FacebookIFrameCenter, FacebookIFrameCenter.getFriends));
			
			invokeNextCallInStack();
		}
		
		public static function getSessionForBrowserBug():String
		{
			return encodeURIComponent(sSessionForBrowserBug);
		}
		
		public static function setSessionForBrowserBug(pSession_str:String):void
		{
			Logger.eddy("SessionForBrowserBug set");
			sSessionForBrowserBug = pSession_str;
		}
		
		public static function setUid(pUid_str:String):void
		{
			UID = pUid_str;
		}

		private static function setSelfProfileFromJSON(pJSON_str:String):void
		{
			Logger.eddy("json: " + pJSON_str);
			var data_obj:Object = JSON.decode(pJSON_str);
			Logger.eddy("JSON decoded!");
			UID = data_obj["uid"];
			NAME = data_obj[GetInfoFieldValues.NAME];
			SEX = data_obj[GetInfoFieldValues.SEX];
			BIRTHDAY = data_obj[GetInfoFieldValues.BIRTHDAY];
			PIC = data_obj[GetInfoFieldValues.PIC_SQUARE];
		}
		
		public static function getFriends(pDoneCall:ICall = null):void
		{
			Panel.showStatusBar(StatusBar.LOADING, Message.IFRAME_CENTER_LOAD_FRIEND_DATA);
			Logger.eddy("FacebookIFrameCenter.getFriends()");
			sConnAbstract = new ConnAbstract(ConnPath.getFriendsPath(), new FunctionCall(FacebookIFrameCenter, onGetFriendsSuccess, pDoneCall), new FunctionCall(FacebookIFrameCenter, onConnFail));
			sConnAbstract.send({fields:sInfoFieldsValue_str});
		}
		
		private static function onGetFriendsSuccess(pDoneCall:ICall = null):void
		{
			var xml:XML = sConnAbstract.getXML();
			
			if (xml..status[0] == "true")
			{
				FRIEND_LIST = new Array();
				
				var xml_array:Array = new Array();
				for  each (var tempItem in  xml.item)
				{
					xml_array.push(tempItem);
				}
				xml_array.sortOn("name");
				for (var i:Number = 0; i < xml_array.length; i++ )
				{
					var data_array:Array = new Array();
					
					data_array["uid"] = xml_array[i]["uid"][0];
					data_array["name"] = xml_array[i][GetInfoFieldValues.NAME][0];
					data_array["sex"] = xml_array[i][GetInfoFieldValues.SEX][0];
					data_array["pic"] = xml_array[i][GetInfoFieldValues.PIC_SQUARE][0];
					data_array["birthday"] = xml_array[i][GetInfoFieldValues.BIRTHDAY][0];
					
					FRIEND_LIST.push(data_array);
				}
			}
			else
			{
				
			}
			
			if(pDoneCall != null)
				pDoneCall.execute();
		}
		
		private static function onConnFail():void
		{
			invokeNextCallInStack();
		}
		
		private static function invokeNextCallInStack():void
		{
			if (sInitStack_array.length > 0)
			{
				var call:ICall = sInitStack_array.shift();
				call.execute(new FunctionCall(FacebookIFrameCenter, invokeNextCallInStack));
			}
			else
			{
				onGetAllDataDone();
			}
		}
		
		private static function onGetAllDataDone():void
		{
			Logger.eddy("*****************************************");
			Logger.eddy("* UID: " + UID);
			Logger.eddy("* NAME: " + NAME);
			Logger.eddy("* SEX: " + SEX);
			Logger.eddy("* BIRTHDAY: " + BIRTHDAY);
			Logger.eddy("* PROFILE_PIC: " + PIC);
			Logger.eddy("* Number of friends: " + FRIEND_LIST.length);
			Logger.eddy("* Get Date From Facebook Done!");
			Logger.eddy("*****************************************");
			
			Panel.hideStatusBar();
			
			if (sInitDoneCall != null)
			{
				sInitDoneCall.execute();
				sInitDoneCall = null;
			}
		}
	}

}