function MyFacebookWorkFlow(self_obj_name) {
	var me = this;
	
	var MyFB = new MyFacebookLib();
	
	me.allow_api = false;
	me.show_desc_info = false;
	me.subscriber_id = 0;
	
	var user_data = false;
	var my_facebook_options = false;
	var fb_request_has_error = false;
	
	/***************** START: WORK-FLOW FUNCTIONS *******************/
	me.executeAllowApi = function() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.executeAllowApi()");
		
		if(me.allow_api) {
			if(me.show_desc_info) {
				MyFB.init();
			}
			else {
				showDescInfoPopup();
			}
		}
	};
	
	me.reexecuteAllowApi = function() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.reexecuteAllowApi()");
		
		me.setMyFacebookOptions(my_facebook_options);
		me.executeAllowApi();
	};
	
	me.saveShowDescInfoAnswer = function(answer) {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.saveShowDescInfoAnswer()");
		
		$("#fb_api_show_des_info_popup_div").remove();
		
		saveUserDataToDB({"allow_api" : (answer == 1 ? 1 : 0), "show_desc_info" : 1});
		
		me.show_desc_info = true;
		
		if(answer == 1) {
			me.allow_api = true;
			
			MyFB.init();
		}
		else {
			me.allow_api = false;
		}
	};
	
	me.linkNewFBAccountToPSC = function() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.linkNewFBAccountToPSC()");
		
		$("#fb_api_show_wrong_subscriber_id_div").remove();
		
		me.subscriber_id = 0;
		saveUserDataToDB({"subscriber_id" : me.subscriber_id, "email" : ""});
		
		//force user to logout and reconnect with facebook. clears out the current fb session key as well.
		FB.ensureInit(function() {
			FB.Connect.logout(function() {
				me.reexecuteAllowApi();
			});
		});
		
		$("#RES_ID_fb_pop_dialog_table #RES_ID_fb_logout_info").each(function(index, elm) {
			$("#RES_ID_fb_pop_dialog_table").css("display", "none");
		});
	}
	
	me.linkCurrentFBAccountToPSC = function() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.linkCurrentFBAccountToPSC()");
		
		$("#fb_api_show_wrong_subscriber_id_div").remove();
		
		initUserData();
		if(user_data) {
			me.subscriber_id = user_data && user_data.uid ? user_data.uid : false;
			var email = user_data.proxied_email ? user_data.proxied_email : false;
			
			saveUserDataToDB({"subscriber_id" : me.subscriber_id, "email" : email});
			
			me.setMyFacebookOptions(my_facebook_options);
			me.executeAllowApi();
		}
	}
	
	function checkPreviousSubscriberId() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.checkPreviousSubscriberId()");
		
		if(!user_data || typeof user_data != "object") {
			initUserData();
		}
		
		if(!fb_request_has_error) {
			if(user_data && user_data.uid && me.subscriber_id && user_data.uid == me.subscriber_id) {
				return checkUserDOB(user_data.birthday_date, user_data.allowed_restrictions);
			}
			else {
				showWrongSubscriberIdPopup();
			
				MyLib.DebugHandler.showMessage("return SUBSCRIBER_ID_DOES_NOT_MATCH in MyFacebookWorkFlow.checkPreviousSubscriberId()");
			
				return "SUBSCRIBER_ID_DOES_NOT_MATCH";
			}
		}
		return false;
	};
	
	function saveNewSubscriberId() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.saveNewSubscriberId()");
		
		initUserData();
		
		if(!fb_request_has_error) {
			if(user_data) {
				me.subscriber_id = user_data && user_data.uid ? user_data.uid : false;
				var email = user_data.proxied_email ? user_data.proxied_email : false;
				var pic_square = user_data.pic_square ? user_data.pic_square : false;
				var pic_big = user_data.pic_big ? user_data.pic_big : false;
				
				saveUserDataToDB({"subscriber_id" : me.subscriber_id, "email" : email, "photo" : pic_square + "|" + pic_big});
		
				return checkUserDOB(user_data.birthday_date, user_data.allowed_restrictions);
			}
		}
		return false;
	}
	
	function checkUserDOB(dob, allowed_restrictions) {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.checkUserDOB()");
		
		var is_dob_valid = true;
		
		if(allowed_restrictions) {
			is_dob_valid = allowed_restrictions.toString().indexOf("alcohol") >= 0 ? true : false;
		}
		else if(dob) {
			var parts = dob.toString().split("/");
			if(parts.length == 3) {
				var time = parts[2] + "" + parts[0] + "" + parts[1];
				var current_date = new Date();
				var current_time = dateToInt(current_date);
		
			//alert(current_time+"-"+time+"="+(current_time - time));
				var minimum_age = typeof FACEBOOK_MINIMUM_AGE != "undefined" && FACEBOOK_MINIMUM_AGE > 0 ? FACEBOOK_MINIMUM_AGE * 10000 : 210000;
				is_dob_valid = current_time - time >= minimum_age ? true : false;
			}
		}
		
		if(is_dob_valid) {
			return callAction();
		}
		else {
			showWrongDOBPopup();
			
			return false;
		}
	}
	
	function dateToInt(date) {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.dateToInt()");
		
		var year = date.getFullYear();
		var month = date.getMonth() + 1;
		var day = date.getDate();
		
		if(month < 10) month = "0" + month;
		if(day < 10) day = "0" + day;
		
		return year + "" + month + "" + day;
	}
	
	function callAction() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.callAction()");
		
		if(my_facebook_options) {
			var func_params = typeof my_facebook_options.params != "undefined" ? my_facebook_options.params : false;
		
			return MyLib.FunctionHandler.callFunction(my_facebook_options.func, func_params);
		}
		return false;
	}
	
	function initUserData() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.initUserData()");
		
		var date = new Date();
		date = date.getTime();
		
		user_data = MyLib.AjaxHandler.gets("/facebook/executeaction/userdata?time="+date, {"result_type" : 2});
		
		if(user_data.toString().substring(0,1) != "{") {
			fb_request_has_error = user_data;//LOGIN REQUIRED or other errors
			user_data = false;
		}
		else {
			try {
				eval("user_data = "+user_data);
			}
			catch(e) {
				user_data = false;
				
				onerror(e.message ? e.message : e);
				
				MyLib.DebugHandler.showException(e);
			}
		}
	}
	
	function saveUserDataToDB(user_data) {
		var date = new Date();
		date = date.getTime();
		
		var parameters = MyLib.AjaxHandler.prepareParameters(user_data);
		return MyLib.AjaxHandler.posts("/facebook/savedata/?time="+date, {"result_type" : 2, "parameters" : parameters});
	}
	/***************** END: WORK-FLOW FUNCTIONS *******************/
	
	/***************** START: POPUP FUNCTIONS *******************/
	function showDescInfoPopup() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.showDescInfoPopup()");
		
		var div = document.createElement("div");
		div.id = "fb_api_show_des_info_popup_div";
		div.className = "fb_api_show_des_info_popup";
		div.innerHTML = '<p style="padding: 0 30px;"><img src="/img/facebook/facebookPopup_head.gif" alt="Connect with facebook"/></p>' + 
		'<div style="float:left;width:420px;text-align:left;">' + 
			'<p style="padding: 0 30px;line-height:1em;font-weight:bold;">Connect Patr&oacute;n Social Club with Facebook to:</p>' + 
			'<ul style="padding-left:30px;">' + 
				'<li style="list-style:disc inside;">See and be seen in our new social news feed.</li>' + 
				'<li style="list-style:disc inside;">Share what you&rsquo;re doing on PSC with Facebook friends.</li>' + 
				'<li style="list-style:disc inside;">As always, our most involved members receive special consideration.</li>' + 
			'</ul>' + 
		'</div>' + 
		'<div style="float:left;width:250px;border-left:1px solid white;padding-left:10px;text-align:center;">' + 
			'<p><span style="font-weight:bold;font-size:1.1em;cursor:pointer;text-align:center;" onclick="'+self_obj_name+'.saveShowDescInfoAnswer(1);return false;"><img src="/img/facebook/facebookPopup_connect.gif" /></span>' + 
			'<br/>' + 
			'<br/>' + 
			'<span style="font-weight:bold;font-size:1.3em;cursor:pointer;text-align:center;" onclick="'+self_obj_name+'.saveShowDescInfoAnswer(0);return false;">No thanks.</span></p>' + 
			'<p style="font-size:12px;font-style:italic;color:#ababab;padding-left:15px;text-align:left;">(Whatever you choose now, you can always turn it on or off later from your PSC account settings.)</p>' + 
		'</div>' + 
		'<div style="clear:left;"></div>';
		
		
		div.style.position = "absolute";
		div.style.left = "100px";
		div.style.top = "100px";
		div.style.width = "700px";
		div.style.textAlign = "center";
		div.style.backgroundColor = "#090909";
		div.style.color = "#ffffff";
		div.style.zIndex = "100";
		div.style.padding = "20px 0";

		document.body.appendChild(div);

		centerElm("fb_api_show_des_info_popup_div");
	}
	
	function showWrongSubscriberIdPopup() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.showWrongSubscriberIdPopup()");
		
		var div = document.createElement("div");
		div.id = "fb_api_show_wrong_subscriber_id_div";
		div.className = "fb_api_show_wrong_subscriber_id_popup";
		div.innerHTML = '<p style="padding: 0 30px;text-align:center;"><img src="/img/facebook/facebookPopup_wrongID.gif" alt="Mistaken identity?"/></p><p style="padding: 0 30px;text-align:center;">Your browser is logged in to Facebook, but it&rsquo;s not the profile you connected to PSC. We&rsquo;ll log you out of Facebook so you can use the right account.</p><p style="text-align:center;"><span style="font-weight:bold;font-size:1.1em;cursor:pointer;" onclick="'+self_obj_name+'.linkNewFBAccountToPSC();return false;">Logout</span> <img src="/img/facebook/facebookPopup_slash.gif" style="position:relative;top:4px;"/> <span style="font-weight:bold;font-size:1.1em;cursor:pointer;" onclick="'+self_obj_name+'.linkCurrentFBAccountToPSC();return false;">Relink</span></p>';
		
		div.style.position = "absolute";
		div.style.left = "100px";
		div.style.top = "100px";
		div.style.width = "700px";
		div.style.textAlign = "center";
		div.style.backgroundColor = "#090909";
		div.style.color = "#ffffff";
		div.style.zIndex = "100";
		div.style.padding = "20px 0";

		document.body.appendChild(div);
		
		centerElm("fb_api_show_wrong_subscriber_id_div");
	}
	
	function showWrongDOBPopup() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.showWrongDOBPopup()");
		
		var div = document.createElement("div");
		div.id = "fb_api_show_wrong_dob_div";
		div.className = "fb_api_show_wrong_dob_popup";
		div.innerHTML = '<p style="padding: 0 30px;text-align:center;"><img src="/img/facebook/facebookPopup_badDOB.gif" alt="Time travel much?"/></p><p>The Facebook profile you&rsquo;re trying to log in with says you&rsquo;re under 21.</p><p style="text-align:center;"><span style="font-weight:bold;font-size:1.1em;cursor:pointer;" onclick="document.location=\'http://www.centurycouncil.org/\';$(\'#fb_api_show_wrong_subscriber_id_div\').remove();return false;">Okay</span></p>';
		
		div.style.position = "absolute";
		div.style.left = "100px";
		div.style.top = "100px";
		div.style.width = "700px";
		div.style.textAlign = "center";
		div.style.backgroundColor = "#090909";
		div.style.color = "#ffffff";
		div.style.zIndex = "100";
		div.style.padding = "20px 0";

		document.body.appendChild(div);
		
		centerElm("fb_api_show_wrong_dob_div");
	}
	/***************** END: POPUP FUNCTIONS *******************/
	
	
	/***************** START: MyFacebookLib FUNCTIONS *******************/
	
	me.setMyFacebookOptions = function(options) {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.setMyFacebookOptions()");
		
		my_facebook_options = false;
		
		if(options) {
			my_facebook_options = options;
			
			try {
				MyFB.set({
					"func" : func,
					"oncomplete" : oncomplete,
					"onerror" : onerror,
					"onlogout" : onlogout,
					"onloginok" : onloginok,
					"onlogincancel" : onlogincancel,
					"onpermsallow" : onpermsallow,
					"onpermscancel" : onpermscancel, 
					"perms" : typeof options.perms != "undefined" ? options.perms : false
				});
			}
			catch(e) {
				onerror(e.message ? e.message : e);
				
				MyLib.DebugHandler.showException(e);
			}
		}
	};
	
	function func() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.func()");
		
		try {
			var result = false;
			if(!me.subscriber_id || me.subscriber_id == 0 || me.subscriber_id == "") {
				result = saveNewSubscriberId();
			}
			else {
				result = checkPreviousSubscriberId();
			}
			
			if(fb_request_has_error) {
				var fb_error = fb_request_has_error;
				fb_request_has_error = false;
				return fb_error;
			}
			else {
				return result;
			}
		}
		catch(e) {
			MyLib.DebugHandler.showException(e);
		}
		return false;
	};
	
	function oncomplete(result) {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.oncomplete()");
		
		if(result == "SUBSCRIBER_ID_DOES_NOT_MATCH") {
			//DO NOT DO ANYTHING
		}
		else {
			if(my_facebook_options) {
				return MyLib.FunctionHandler.callFunction(my_facebook_options.oncomplete, result);
			}
		}
	};
	
	function onerror(message) {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.onerror()");
	
		if(my_facebook_options) {
			return MyLib.FunctionHandler.callFunction(my_facebook_options.onerror, message);
		}
	};
	
	function onlogout() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.onlogout()");
	
		if(my_facebook_options) {
			return MyLib.FunctionHandler.callFunction(my_facebook_options.onlogout, false);
		}
	};
	
	function onloginok() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.onloginok()");
	
		if(my_facebook_options) {
			return MyLib.FunctionHandler.callFunction(my_facebook_options.onloginok, false);
		}
	};
	
	function onlogincancel() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.onlogincancel()");
	
		if(my_facebook_options) {
			return MyLib.FunctionHandler.callFunction(my_facebook_options.onlogincancel, false);
		}
	};
	
	function onpermsallow() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.onpermsallow()");
	
		if(my_facebook_options) {
			return MyLib.FunctionHandler.callFunction(my_facebook_options.onpermsallow, false);
		}
	};
	
	function onpermscancel() {
		MyLib.DebugHandler.showMessage("call MyFacebookWorkFlow.onpermscancel()");
	
		if(my_facebook_options) {
			return MyLib.FunctionHandler.callFunction(my_facebook_options.onpermscancel, false);
		}
	};
	
	/***************** END: MyFacebookLib FUNCTIONS *******************/
}
