/**
*
* 	ActiveFacebook JS Wrapper API Facebook - AS3 Bridge
*
*	Copyright (c) 2008-2009 Gianluca Cirone @ RMG Connect Milano
*
**/

var ActiveFacebookEvent = {
	WAITING_FOR_LOGIN:"waitingForLogin",
	ON_LOGGEDIN:"onLoggedIn",
	ON_LOGGEDOUT:"onLoggedOut",
	ON_PERMISSION:"onPermission",
	ON_CALL_COMPLETE:"onCallComplete",
	ON_GETUSERINFO:"onGetUserInfo",
	ON_ERROR:"onError"
}

var FlashCallback = {
	WAITINGFORLOGIN:"CallbackWaitingForLogin",
	LOGGEDIN:"CallbackLoggedIn",
	LOGGEDOUT:"CallbackLoggedOut",
	PERMISSION:"CallbackPermission",
	CALLCOMPLETE:"CallbackCallComplete",
	GETUSERINFO:"CallbackGetUserInfo"
}

var ActiveFacebook = function(){
	
	var api = {},
	apiKey = "",
	xdReceiver = "",
	requireFeatures = ["XFBML"],
	objsFlash = new Array(),
	isFlashReady = false,
	isLoggedIn = false,
	isSessionExist = false,
	isFirstLogin = false,
	eventObj = {};
	UserObj = undefined;

	// Init Facebook Api 
	function initApi(){
		FB_RequireFeatures(requireFeatures, function() {
			FB.Facebook.init(apiKey, xdReceiver);
			ceckSession();
		});
	
	}
	// Wait until Session in ready
	function ceckSession(){
		FB.ensureInit(function(){
			dispatchEvent(ActiveFacebookEvent.WAITING_FOR_LOGIN);
			dispatchFlashCallback(FlashCallback.WAITINGFORLOGIN);
			isSessionExist = false;			
			FB.Facebook.get_sessionState().waitUntilReady(function(session) {
				if(session) {
					isSessionExist = true;
					sessionReady();
				}
			});		
		});
	}
	
	// Session is ready apiClient active
	function sessionReady(apiObj){
		if(apiObj != null) api = apiObj;
		else api = FB.Facebook.apiClient;
		isLoggedIn = true;
		if(!isFirstLogin) {
			dispatchEvent(ActiveFacebookEvent.ON_LOGGEDIN, api._session);
			dispatchFlashCallback(FlashCallback.LOGGEDIN, api._session);
			isFirstLogin = true;
		}
	}
	
	// Flash is ready
	function flashReady() {
		isFlashReady = true;
		dispatchFlashCallback(FlashCallback.WAITINGFORLOGIN);
		if(isLoggedIn) {
			dispatchFlashCallback(FlashCallback.LOGGEDIN, api._session);
		}
	}
	
	// Require login
	function logIn(){
		FB.Connect.requireSession(function() {
			sessionReady();
		});
	}	
		
	// Logout from Facebook 
	function logOut(){
		if(isLoggedIn){
			FB.Connect.logout(function() {	
				isLoggedIn = false;
				isFirstLogin = false;
				dispatchEvent(ActiveFacebookEvent.ON_LOGGEDOUT);
				dispatchFlashCallback(FlashCallback.LOGGEDOUT);
			});
		}
	}
	
	/**
	* 	Facebook API Usage
	**/
	function callMethod(methodName, objParams){
		if(isLoggedIn){
			FB.ensureInit(function() {
				api.callMethod(methodName, objParams, function(result, exception) {
					dispatchEvent(ActiveFacebookEvent.ON_CALL_COMPLETE, result, exception);
					removeEventListener(ActiveFacebookEvent.ON_CALL_COMPLETE);
					dispatchFlashCallback(FlashCallback.CALLCOMPLETE, {res:result, ex:exception});
				});
			});
		}
	}
	
	
	function getUserInfo(){
		if(isLoggedIn){
			FB.ensureInit(function() {
				if(UserObj == undefined ){
					var userFiled = "first_name,last_name,name,locale,birthday,birthday_date,current_location,hometown_location,affiliations,pic_square,profile_url,email_hashes,proxied_email,pic_big,sex";
					var obj = new Object();
					obj.query = "SELECT uid,"+userFiled+" FROM user WHERE uid="+api._session.uid;
					
					api.callMethod("fql.query", obj, function(result, exception) {
						if(result != undefined ) UserObj = result;
						dispatchEvent(ActiveFacebookEvent.ON_GETUSERINFO, result, exception);
						removeEventListener(ActiveFacebookEvent.ON_GETUSERINFO);
						dispatchFlashCallback(FlashCallback.GETUSERINFO, {res:result, ex:exception});
					});
				
				}else{
					dispatchEvent(ActiveFacebookEvent.ON_GETUSERINFO, UserObj, undefined);
					removeEventListener(ActiveFacebookEvent.ON_GETUSERINFO);
					dispatchFlashCallback(FlashCallback.GETUSERINFO, {res:UserObj, ex:undefined});
				}
			});
		}
	}
	
	function promptPermission(permission) {
		FB.ensureInit(function() {
			FB.Connect.showPermissionDialog(permission, function(success) {	
				dispatchEvent(ActiveFacebookEvent.ON_PERMISSION, success);
				dispatchFlashCallback(FlashCallback.PERMISSION,  success);	
			});
		});
	}
	
	function shareLink(link) {
		FB.ensureInit(function() {
			FB.Connect.showShareDialog(link, function(){});
		});
	}
	
	function publishFeedStory(templateBundleId, templateData) {
		FB.ensureInit(function() {
			FB.Connect.showFeedDialog(parseInt(templateBundleId), templateData, null, null, FB.FeedStorySize.shortStory, FB.RequireConnect.promptConnect);
		});
	}
	
	function openInvite(inviteData) {
		FB.ensureInit(function() {			
			var dialog = new FB.UI.FBMLPopupDialog(inviteData.title, 'Invita Amici');
        	var UID = api._session.uid;
			
			var Cont = "<fb:fbml><fb:name uid='"+UID+"' firstnameonly='false' shownetwork='true'/> "+inviteData.messageInvite+"<fb:req-choice url='";
			Cont+= inviteData.urlReqChoice;
			Cont+="' label='"+inviteData.label+"'/></fb:fbml>";
					
			var fbml = '<fb:request-form action="'+inviteData.action+'" method="POST" invite="false" type="'+inviteData.title+'" content="'+Cont+'">';		
			fbml += '<fb:multi-friend-selector style="width: 600px; height:560px;" actiontext="'+inviteData.header+'" exclude_ids="'+inviteData.exclude+'"';
			fbml += ' max="20" cols="5" rows="4" email_invite="false" showborder="false" />';
			fbml += '</fb:request-form>';
			
			dialog.setFBMLContent(fbml);
			
			dialog.setContentWidth(620);
			dialog.setContentHeight(560);
			//dialog.set_placement(FB.UI.PopupPlacement.topCenter);		
			
			dialog.show();
		});
	}	
	
	
	// Dispatch event for flash listeners - Under construction
	function dispatchFlashCallback(type) {
		for(var i=0; i<objsFlash.length; i++){	
			if(objsFlash[i] != null){
				var obj = objsFlash[i];			
				if( obj[type] != null && obj!=null && isFlashReady ){
					if(arguments.length > 1)
						obj[type](Array.prototype.slice.call(arguments).slice(1)[0]);
					else
						obj[type]();
				}
			}
		}
	}
	
	function addFlashDelegate(objfl) {
		objsFlash.push(objfl);
	}
	
	// Dispatch event for javascript listeners
	function dispatchEvent(type) {
		if(eventObj[type] != null){
			if(arguments.length > 1)
				eventObj[type](Array.prototype.slice.call(arguments).slice(1)[0]);
			else
				eventObj[type]();
		}
	}
	
	function addEventListener(type, func) {
		eventObj[type] = func;
	}
	function removeEventListener(type, func) {
		eventObj[type] = null;
	}

	return {
		/**
		* 	Public API
		**/
		init:function(apikey, xdfile){ apiKey = apikey; xdReceiver = xdfile; initApi();},	
		
		getApi:function(){	return api;},
		setApi:function(apiset){ api = apiset; },
		
		getUserObj:function(){	return UserObj;},
		setUserObj:function(useropt){ UserObj = useropt; },
		
		logIn:logIn,
		logOut:logOut,
		logInPopUp:function(){	var win = window.open ("activefb.php?cmd=login","fbpop","status=1,width=470,height=200"); },
		
		ceckSession:ceckSession,
		sessionReady:function(apiObj){ sessionReady(apiObj); },
		
		getUserInfo:getUserInfo,
		
		callMethod:callMethod,
		promptPermission:promptPermission,
		shareLink:shareLink,
		publishFeedStory:publishFeedStory,
		openInvite:openInvite,
		openInviteInPopUp:function(inviteData){ var my_window = window.open ("activefb.php?cmd=invite","fbpop","status=1,width=640,height=580");},
		
		flashReady:flashReady,
		addFlashDelegate:addFlashDelegate,
		addEventListener:addEventListener,
		removeEventListener:removeEventListener
	};
	
}();