;(function($)
{
		var __FBConnect_hidden     = '__facebook_connect__';
		var __FBConnectors = [];

		var options;	
		$.FacebookRun = function(app_id,logout_link_id)
		{
				if(logout_link_id != null)
				{
					$(logout_link_id).click(function(e)
					{
						e.preventDefault();
						FB.init({appId:app_id,status:true,cookie:true,xfbml:true});
						session = FB.getSession();
						if(session)
						{
							FB.logout(function(response)
							{
								apply_logout(true);
								window.location.replace($(logout_link_id).attr('href'));
							});
						}
						else
							window.location.replace($(logout_link_id).attr('href'));
					});
				}

				 //Run facebook connect
				 if($('#'+__FBConnect_hidden).val() != undefined)
				 {
					 jQuery.each(__FBConnectors, function(i,value) 
					 {
						$(__FBConnectors[i].id).live(__FBConnectors[i].event,function(e)
						{
							e.preventDefault();
							jQuery.each(__FBConnectors, function(i,value)
							{
								$(__FBConnectors[i].id).removeClass(__FBConnectors[i].login_css);
								$(__FBConnectors[i].id).removeClass(__FBConnectors[i].logout_css);

								$(__FBConnectors[i].id).addClass(__FBConnectors[i].onprocess_css);
							});
							FB.init({appId:app_id,status:true,cookie:true,xfbml:true});
							var status = $('#'+__FBConnect_hidden).val();
							if(status == 'login')
							{
								FB.login(function(response) 
								{
									if (response.session)
										 load_profile(true);
									else
									{
										jQuery.each(__FBConnectors, function(i,value)
										{
											$(__FBConnectors[i].id).removeClass(__FBConnectors[i].onprocess_css);
											$(__FBConnectors[i].id).addClass(__FBConnectors[i].login_css);
										});
									}
								},{perms:options.perms.join(',')});
							}
							else
							{
								FB.logout(function(response){apply_logout(true);});
								jQuery.each(__FBConnectors, function(i,value)
								{
									$(__FBConnectors[i].id).removeClass(__FBConnectors[i].onprocess_css);
									$(__FBConnectors[i].id).addClass(__FBConnectors[i].login_css);
								});
							}
						});
					 });
					
					 FB.init({appId:app_id,status:true,cookie:true,xfbml:true});
					 session = FB.getSession();
					 if (session) 
						 load_profile(false);
					 else 
						apply_logout(false);
				 }
				//Internal function
				function apply_logout(callback)
				{
					if(options.messagePlane)
						$(options.messagePlane).empty();
					
					jQuery.each(__FBConnectors, function(i,value)
					{
						$(__FBConnectors[i].id).removeClass(__FBConnectors[i].onprocess_css);
						$(__FBConnectors[i].id).addClass(__FBConnectors[i].login_css);
					});

					$('#'+__FBConnect_hidden).val('login');
					if(callback)
						options.success('logout',null,null);
				}
				function apply_login(mode,profile,data)
				{
					if(options.messagePlane)
					{
						$(options.messagePlane).empty();
						$(options.messagePlane).show();
					}
					for(i = 0; i < options.required.length;i++)
					{
						if(options.required[i] in data)
							continue;

						msg = 'Can not retrieve required property \''+options.required[i]+'\' Facebook user profile it maybe';
						if(options.messagePlane)
							$(options.messagePlane).append(options.messageTpl.replace("{msg}", msg));
						else
							alert(msg);
					}

					jQuery.each(__FBConnectors, function(i,value)
					{
						//Remove onprocess_css & login_css
						$(__FBConnectors[i].id).removeClass(__FBConnectors[i].onprocess_css);
						//Add logout theme instead
						$(__FBConnectors[i].id).addClass(__FBConnectors[i].logout_css);
					});

					$('#'+__FBConnect_hidden).val('logout');
					options.success(mode,profile,data);
				}
				function load_profile(ajax)
				{					
					FB.api('/me',function(response) 
					{
						if(ajax && response)
						{
							//Call login Ajax if URL available
							$.ajax({url:options.url,
							type:'post',
							dataType:options.dataType,
							data:response,
							success:function(data){apply_login('login',response,data);}});
						}
						else
							apply_login('login',response,null);
					});
				}
		}
		$.FacebookConnect = function(nodes,config) 
		{
				options = $.extend(true,{url:'', //Login url by ajax
										 messagePlane:null,
										 messageTpl:'<font color=\'red\'>{msg}</font>',
										 required:[],
									     dataType:'html',
									     perms: ['email','user_birthday','read_stream','publish_stream','offline_access'],
										 method:'POST',
									     //mode : autologin,login_ajax,login,logout
										 success: function(mode,profile,data){}},config);
			
				$('<input type=\'hidden\' id=\''+__FBConnect_hidden+'\' value=\'\'>').appendTo('body');
				jQuery.each(nodes,function(i,value)
				{
					__FBConnectors[i] = $.extend(true,{id:null,event:'click',
													   onprocess_css:'facebook_connect_onprocess',
													   login_css    :'facebook_connect_login',
													   logout_css   :'facebook_connect_logout'},
													   nodes[i]);
				});
			}
})(jQuery);

