$(function() {
	window.NRecoSiteUser = {
		labels: {},
		isAuthenticated : false,
		forgotPasswordEnabled : false,
		facebookAppId : null,
		
		setUserBlockState : function(isAuth, login, roles) {
			NRecoSiteUser.isAuthenticated = isAuth;
			if (isAuth) {
				$('.userBlockLinks .authenticated').show();
				$('.userBlockLinks .anonymous, .userBlockLinks .authenticated.role').hide();
				if (roles)
					$.each(roles, function(idx,role) {
						$('.userBlockLinks .authenticated.role.role'+role).show();
					});
				$('.userBlockLinks .login').html(escape(login));
			} else {
				$('.userBlockLinks .anonymous').show();
				$('.userBlockLinks .authenticated').hide();
			}
		},
		
		doLogout : function() {
			$.ajax({
				type: "POST", async: true,url: 'UserAjaxHandler.axd',
				data : { action : "logout"},
				success : function(res) {
					NRecoSiteUser.setUserBlockState(false);
				}
			});			
			if (this.facebookAppId!=null && FB) {
				FB.logout(function() { });
			}
		},
				
		showLoginForm : function(callbackFunc) {
			var loginDialogContext = {
				labels: this.labels,
				uniqueId : (new Date()).getTime(),
				forgotPasswordEnabled : this.forgotPasswordEnabled
			};
			if (this.facebookAppId!=null) {
				loginDialogContext.externalLogin = {
					facebook : this.facebookAppId!=null
				};
			}
			var $loginDialog =$('#loginForm').processTemplate(loginDialogContext).find('.modal');
			var $loginDialogOverlay = $loginDialog.overlay(NRecoCommon.overlayOptions).load();
			// init
			NRecoCommon.initForm($loginDialog);
			// validation
			NRecoCommon.validateForm($loginDialog);
			
			$loginDialog.find('button.login,a.login,input.login').click(function() {
				$loginDialog.find('.error').hide();
				if (NRecoCommon.isValidForm($loginDialog)) {
					var fields = NRecoCommon.readForm($loginDialog);
					fields.action = "login";
					$.ajax({
						type: "POST", async: true,url: 'UserAjaxHandler.axd', data : fields,
						success : function(res) {
							var data = NRecoCommon.jsonDeserialize(res);
							NRecoSiteUser.setUserBlockState(true,fields.login,data.roles);
							$loginDialogOverlay.close();
							if (callbackFunc)
								callbackFunc(fields.login);
						}, 
						error : function(XMLHttpRequest, textStatus, errorThrown) {
							$loginDialog.find('.error').html(XMLHttpRequest.responseText).show('fast');
						}
					});
				}
			});
			// login by enter on pwd
			$loginDialog.find('input[name=password]').keydown( function(e) {
				if (e.keyCode==13) $loginDialog.find('button.login,a.login,input.login').click();
			});
		
			$loginDialog.find('button.register,input.register,a.register').click(function() {
				$loginDialogOverlay.close();
				NRecoSiteUser.showRegisterForm(callbackFunc);
			});
			$loginDialog.find('button.forgotpassword,input.forgotpassword,a.forgotpassword').click(function() {
				$loginDialogOverlay.close();
				NRecoSiteUser.showForgotPwdForm();
			});
			
			//FB
			if (this.facebookAppId!=null) {
				FB.init({appId: this.facebookAppId, status: true, cookie: true,xfbml: true});
				
				var doFbLogin = function() {
					$.ajax({
						type: "POST", async: true,url: 'UserAjaxHandler.axd', data : {action:"fblogin"},
						success : function(res) {
							var data = NRecoCommon.jsonDeserialize(res);
							if (data && data.login) {
								NRecoSiteUser.setUserBlockState(true,data.login,data.roles);
								$loginDialogOverlay.close();
								if (callbackFunc)
									callbackFunc(fields.login);
							}
						}, 
						error : function(XMLHttpRequest, textStatus, errorThrown) {
							$loginDialog.find('.error').html(XMLHttpRequest.responseText).show('fast');
						}
					});
				};
				
				$loginDialog.find('button.facebooklogin,input.facebooklogin,a.facebooklogin').click(function() {
					doFbLogin();
				});
			}
			
		},
		
		showForgotPwdForm : function() {
			var $forgotPwdDialog =$('#forgotPwdForm').processTemplate({
				labels: this.labels
			}).find('.modal');
			var $forgotPwdDialogOverlay = $forgotPwdDialog.overlay(NRecoCommon.overlayOptions).load();
			NRecoCommon.initForm($forgotPwdDialog);
			NRecoCommon.validateForm($forgotPwdDialog);
			$forgotPwdDialog.find('button.forgotpassword,a.forgotpassword,input.forgotpassword').click(function() {
				$forgotPwdDialog.find('.error').hide();
				if (NRecoCommon.isValidForm($forgotPwdDialog)) {
					var fields = NRecoCommon.readForm($forgotPwdDialog);
					$.ajax({
						type: "POST", async: true,url: 'UserAjaxHandler.axd', data : {
							action : "forgotpassword",
							userid : fields.userid
						},
						success : function(res) {
							$forgotPwdDialogOverlay.close();
							NRecoCommon.setStatusText(NRecoSiteUser.labels.forgotPasswordSuccessStatusText);
						}, 
						error : function(XMLHttpRequest, textStatus, errorThrown) {
							$forgotPwdDialog.find('.error').html(XMLHttpRequest.responseText).show('fast');
						}
					});
				}
			});	
		
		},
		
		showChangePwdForm : function(confirmCode) {
			var $forgotPwdDialog =$('#forgotChangePwdForm').processTemplate({
				labels: this.labels
			}).find('.modal');
			var $forgotPwdDialogOverlay = $forgotPwdDialog.overlay(NRecoCommon.overlayOptions).load();
			NRecoCommon.initForm($forgotPwdDialog);
			NRecoCommon.validateForm($forgotPwdDialog);
			$forgotPwdDialog.find('button.forgotpassword,a.forgotpassword,input.forgotpassword').click(function() {
				$forgotPwdDialog.find('.error').hide();
				if (NRecoCommon.isValidForm($forgotPwdDialog)) {
					var fields = NRecoCommon.readForm($forgotPwdDialog);
					$.ajax({
						type: "POST", async: true,url: 'UserAjaxHandler.axd', data : {
							action : "forgotchangepassword",
							newpassword : fields.newpassword,
							code : confirmCode
						},
						success : function(res) {
							var data = NRecoCommon.jsonDeserialize(res);
							NRecoSiteUser.setUserBlockState(true,data.login,data.roles);
							$forgotPwdDialogOverlay.close();
							NRecoCommon.setStatusText(NRecoSiteUser.labels.forgotPasswordChangedStatusText);
						}, 
						error : function(XMLHttpRequest, textStatus, errorThrown) {
							$forgotPwdDialog.find('.error').html(XMLHttpRequest.responseText).show('fast');
						}
					});
				}
			});	
		
		},
		
		showRegisterForm : function(callbackFunc) {
			var $registerDialog =$('#registerForm').processTemplate({
				labels: this.labels
			}).find('.modal');
			var $registerDialogOverlay = $registerDialog.overlay(NRecoCommon.overlayOptions).load();
			// init
			NRecoCommon.initForm($registerDialog);
			// validation
			NRecoCommon.validateForm($registerDialog);
			
			// load data
			$.get('UserAjaxHandler.axd', {action:'loadprofile'},function(res){
				var data = NRecoCommon.jsonDeserialize(res);
				data.login = data.email;
				NRecoCommon.fillForm($registerDialog,data);
				NRecoCommon.initForm($registerDialog);
			},'text');			
			
			$registerDialog.find('button.register,a.register,input.register').click(function() {
				$registerDialog.find('.error').hide();
				if (NRecoCommon.isValidForm($registerDialog)) {
					var fields = NRecoCommon.readForm($registerDialog);
					if (!fields.login)
						fields.login = fields.email;
					$.ajax({
						type: "POST", async: true,url: 'UserAjaxHandler.axd', data : {
							action : "register",
							profile : NRecoCommon.jsonSerialize(fields),
							login : fields.login,
							password : fields.password,
							email : fields.email
						},
						success : function(res) {
							NRecoSiteUser.setUserBlockState(true,fields.login);
							$registerDialogOverlay.close();
							NRecoCommon.setStatusText(NRecoSiteUser.labels.registrationSuccessStatusText);
							if (callbackFunc)
								callbackFunc(fields.login);
						}, 
						error : function(XMLHttpRequest, textStatus, errorThrown) {
							$registerDialog.find('.error').html(XMLHttpRequest.responseText).show('fast');
						}
					});
				}
			});	
			
		},
		
		showProfileForm : function(callbackFunc) {
			var $profileDialog =$('#profileForm').processTemplate({
				labels: this.labels
			}).find('.modal');
			var $profileDialogOverlay = $profileDialog.overlay(NRecoCommon.overlayOptions).load();
			// validation
			NRecoCommon.validateForm($profileDialog);			
			// load data
			$.get('UserAjaxHandler.axd', {action:'loadprofile'},function(res){
				var data = NRecoCommon.jsonDeserialize(res);
				NRecoCommon.fillForm($profileDialog,data);
				// init
				NRecoCommon.initForm($profileDialog);
			},'text');
			
			$profileDialog.find('button.save,a.save,input.save').click(function() {
				$profileDialog.find('.error').hide();
				if (NRecoCommon.isValidForm($profileDialog)) {
					var fields = NRecoCommon.readForm($profileDialog);
					$.ajax({
						type: "POST", async: true,url: 'UserAjaxHandler.axd', data : {
							action : "saveprofile",
							profile : NRecoCommon.jsonSerialize(fields)
						},
						success : function(res) {
							$profileDialogOverlay.close();
							NRecoCommon.setStatusText(NRecoSiteUser.labels.saveStatusText);
						}, 
						error : function(XMLHttpRequest, textStatus, errorThrown) {
							$profileDialog.find('.error').html(XMLHttpRequest.responseText).show('fast');
						}
					});
				}
			});	
		}
		
	};
});

