/*
 * 
	bm_login

 */

;(function($){

var $$;


$$ = $.fn.bm_login = function($options) {

	// set default options
	var $defaults = {

	};
	
	// extend the options
	var $opts = $.extend($defaults, $options);
	
	// bring the options to the jquery object
	for (var i in $opts) {
		$.bm_login[i]  = $opts[i];
	}
};


$$.onPageLoad = function() {	
	alert("in onPageLoad");
}

$.extend({bm_login : {
	current_user_key : 0,  // id of current user. To put into a UI class.
	logged_in : false, //equals true when logged in 
	login_in_process : 0,
	// There is a need to synchronize these values with the login.php script.
	SUCCESS : 0,
	ERROR_MISSING_ARGUMENTS : 1,
	ERROR_NO_DATABASE_CONNECTION : 2,
	ERROR_INVALID_USERNAME_PASSWORD : 3,
	ERROR_USER_NAME_ALREADY_EXISTS : 4,
	DEFAULT_USERNAME : "enter your username or email",
	DEFAULT_PASSWORD : "enter your password",
	DEFAULT_EMAIL : "enter your email",
	DEFAULT_CITY : "enter your city",
	SUBMIT_BUTTON : "login-submit-button",
	LOGIN_URL : "php/login.php",
	LOGEVENT_URL : "php/logEvent.php",
	PREFERENCES_UPDATE_URL : "php/preferencesUpdate.php",
	USERS_UPDATE_URL : "php/usersUpdate.php",
	CHANGE_PASSWORD_URL : "php/changePassword.php",

	/* LOGIN and USER PREFERENCES */
	loginEventHandler : function()
	{

		var e = document.getElementById($.bm_login.SUBMIT_BUTTON);
		e.onclick = function() {$.bm_login.login(this);}	
		e = document.getElementById('password');
		e.onfocus = function() {$.bm_login.passwordOnFocus();}
		e = document.getElementById('username');
		e.onfocus = function() {$.bm_login.usernameOnFocus();}

		//$(".edit-control").blur(function(){$.bm_main.current_edit_mode = $.bm_main.EDITING_NOTHING;});
		$("#new-user").click(function(){$.bm_ui.toggleInput(this,".new-user-input");$.bm_login.setFocusPasswordOrRememberMe("new-user")});

		$("#div-new-user").keypress(function(event){$.bm_login.divNewUserKeypress(event),$.bm_ui.toggleInput("#new-user",".new-user-input");document.getElementById("confirm-password").focus()});
		$("#div-remember-me").keypress(function(event){$.bm_login.divRememberMeKeypress(event);document.getElementById("login-submit-button").focus()});

		$("#logout").click(function(event){$.bm_login.logout();$.bm_login.changeInterfaceAfterLogin(0)});
	},
	changeInterfaceAfterLogin : function(i){
		//NB Non-generic - typically show user preference information after login. This varies across systems.
		switchTab(i);
	},
	usernameOnFocus : function()
	{
		try
		{
			//$.bm_main.current_edit_mode = $.bm_main.EDITING_USERNAME;
			var e;
			e = document.getElementById("username");
			if (e.value == $.bm_login.DEFAULT_USERNAME)
			{
				e.value = "";
			};
			e.select();
		} catch(err)
		{
			errorHandler("usernameOnFocus",err);
		}
	},
	divNewUserKeypress : function(event)
	{
		var iKey = getKeystroke(event);
		if (iKey == $.bm_ui.KEY_SPACE) 
		{
			document.getElementById("new-user").checked =  !document.getElementById("new-user").checked;
			return;
		}
	},
	divRememberMeKeypress : function(event)
	{
		var iKey = getKeystroke(event);
		//Put the div parents of checkboxs in the tab order in tab.html and toggle checked value on space bar keypress. 
		//Necessary because check boxes weren't entering the tab order in firefox 
		if (iKey == $.bm_ui.KEY_SPACE)
		{
			document.getElementById("remember-me").checked =  !document.getElementById("remember-me").checked;
		}  
	},
	setFocusPasswordOrRememberMe : function(e)
	{
		if (document.getElementById(e).checked) 
		{
			document.getElementById("confirm-password").focus();
		} else 
		{
			//document.getElementById("remember-me").focus();
		}
	},
	usernamePasswordEmailInit : function()
	{
		var e;
		e = document.getElementById("username");
		e.value = $.bm_login.DEFAULT_USERNAME; 
		e = document.getElementById("password");
		//e.value = $.bm_main.DEFAULT_PASSWORD;
		e = document.getElementById("city");
		e.value = $.bm_login.DEFAULT_CITY;
		e = document.getElementById("email");
		e.value = $.bm_login.DEFAULT_EMAIL;
	},
	login : function(e)
	{
		try
		{
			if ($.bm_login.logged_in)
			{
				//shouldn't happen
				alert("in loggined in");
				return;
			};
			if ($.bm_login.login_in_process)
			{
				//alert("double login");  // should never happen
				//return;
			}
			document.getElementById($.bm_login.SUBMIT_BUTTON).disabled = true;
			$.bm_login.login_in_process = true;	
			if ($.bm_login.validateUsername() && $.bm_login.validatePassword())
			{
				var e =  document.getElementById("login");

				var sPassword =  escape(document.getElementById("password").value);
				var sUsername =  escape(document.getElementById("username").value);

				var sParams = "?login_name="+escape(sUsername);
				sParams += "&password="+escape(sPassword);
				sParams += "&new_user="+document.getElementById("new-user").checked;

				//alert(LOGIN_URL+sParams);
				httpRequest.open("GET", $.bm_login.LOGIN_URL+sParams, true);
				httpRequest.onreadystatechange = $.bm_login.loginHttpResponse;
				httpRequest.send(null);
			} else
			{
				loginShowError("Invalid username");
				document.getElementById($.bm_login.SUBMIT_BUTTON).disabled=false;
				$.bm_login.login_in_process = false;
				return false;
			}
		}
		catch(err)
		{
			errorHandler("login",err);
			$.bm_login.login_in_process = false;
		}
	},
	validateUsername : function()
	{
		var e;  // local element
		var s = ""; // local string
		var i = 0; // local integer
		try
		{
			e = document.getElementById("username");
			if (e.value == $.bm_main.DEFAULT_USERNAME)
			{
				loginShowError("Please enter a username. It needs to be at least four characters long.");
				return false;
			}
			if (e.value.length <= 3)
			{
				loginShowError("Your username needs to be at least four characters long.");
				return false;
			} else
			{
				//alert("about to return 1 in validateUserName");
				return true;
			}
		} catch(err)
		{
			errorHandler("validateUsername",err);
		}	
	},
	validatePassword : function()
	{
		// NB Brian As of version 1.0 no password is required. This will change.
		var e;  // local element
		var s = ""; // local string
		var i = 0; // local integer
		try
		{
			e = document.getElementById("password");
			if (e.value==$.bm_main.DEFAULT_PASSWORD)
			{
				e.value = ""; // a password should only be required if an email is recorded.
			}
			return true;
			/*
			// soon enough passwords will be required and this can get turned on
			if (e.value.length <= 3)
			{
				e = document.getElementById("login-error");
				e.value = "Your password needs to be at least four characters.";
				e = document.getElementById("why-login");
				e.style.display=="none";
				e = document.getElementById("why-login-text");
				e.style.display=="none";
				document.getElementById("password").focus();
				return 0;
			} else 
			{
				return 1;
			} 
			*/
		} catch(err)
		{
			errorHandler("validatePassword",err);
		}
	},

	validateEmail : function(e,pbRequired)
	{
		//NB Brian to do. This needs to be made generic.
		var s = ""; // local string
		var i = 0; // local integer
		try
		{
			s  =  $(e).attr("value");
			//test for presence of @ sign and period ?@*.* 
			var sResult = "";
			var bSkipCheck = false; //cc for example can be blank (ie !required)
			var sTempString = $(e).attr("value");
			//NB Brian = trim spaces.
			if (!pbRequired && sTempString.length==0){bSkipCheck=true}
			if (!bSkipCheck)
			{
				if (sTempString.indexOf("@")<0){sResult+="missing required character '@'"} else {/*do nothing*/};
				if (sTempString.indexOf(".")<0){if (sResult.length>0){sResult+="; "};sResult+="mssing required character '.' ";} else {/*do nothing*/};
				if (s.length > 3)
				{
					//do nothing. valid condition
				} else
				{
					if (sResult.length>0){sResult+="; "};
					sResult +="email name is less than 4 characters long";
				}
			}
			if (sResult.length>0 && !bSkipCheck){
				$(e).css("background-color",$.bm_ui.ERROR_COLOR);$(e).attr("title","Edit check failure: "+sResult+".");return false;
			} else 
			{
				$(e).css("background-color",$.bm_ui.TEMPLATE_COLOR); 
				return true;
			}
		} catch(err)
		{
			errorHandler("validateEmail",err);
		}
	},
	preferencesUpdate : function()
	{
		try
		{
			var sEmail = document.getElementById("email").value;
			if (sEmail == $.bm_main.DEFAULT_EMAIL)
			{
				sEmail="defaultEmail@email.com";
			}
			var sCity = document.getElementById("city").value;
			var sUserName = document.getElementById("username").value;
			var sPassword = document.getElementById("new-password").value;
			var sFirstName = "";
			var sLastName = "";
			var sParams = "?login_name="+escape(sUserName)+"&user_key="+$.bm_login.current_user_key+"&login_name="+sUserName;
			sParams += "&show_navigation_arrows="+booleanToInteger(document.getElementById("show-navigation-arrows").checked);
			sParams += "&wide_text_columns="+booleanToInteger(document.getElementById("wide-text-columns").checked);
			sParams += "&show_footer="+booleanToInteger(document.getElementById("show-footer").checked);
			sParams += "&show_help="+booleanToInteger(document.getElementById("show-help").checked);
			sParams += "&show_comments="+booleanToInteger(document.getElementById("show-comments").checked);
			sParams += "&show_preferences="+booleanToInteger(document.getElementById("show-preferences").checked);
			sParams += "&show_ratings="+booleanToInteger(document.getElementById("show-ratings").checked);
			sParams += "&show_editor="+booleanToInteger(document.getElementById("show-editor").checked);
			httpRequest.open("GET", PREFERENCES_UPDATE_URL+sParams, true);
			httpRequest.onreadystatechange = preferencesUpdateHttpResponse;
			httpRequest.send(null);	
		} catch(err)
		{
			errorHandler("preferencesUpdate",err);
			$.bm_login.login_in_process = false;
		}
	},
	preferencesUpdatePassword : function()
	{
		try
		{
			var sReturn = validateNewPassword();
			//sReturn = ""; // fakeout  NB BRIAN Begin here 
			if (sReturn=="")
			{
				sPassword=document.getElementById("confirm-new-password").value;
			} else
			{
				alert(sReturn);
				document.getElementById("new-password").focus();
				return;
			}
			var sEmail = document.getElementById("email").value;
			if (sEmail == $.bm_main.DEFAULT_EMAIL)
			{
				sEmail="";
			}
			var sCity = document.getElementById("city").value;
			var sUserName = document.getElementById("username").value;
			var sFirstName = document.getElementById("first-name").value;
			var sLastName = document.getElementById("last-name").value;
			//alert("user key "+$.bm_login.current_user_key);
			var sParams = "?login_name="+escape(sUserName)+"&user_key="+$.bm_login.current_user_key+"&email="+sEmail+"&city="+escape(sCity)+"&first_name="+escape(sFirstName)+"&last_name="+escape(sLastName)+"&password="+escape(sPassword);
			//alert(USERS_UPDATE_URL+sParams);
			httpRequest.open("GET",USERS_UPDATE_URL+sParams, true);
			//httpRequest.open("GET",CHANGE_PASSWORD_URL+sParams, true);
			httpRequest.onreadystatechange = usersUpdateHttpResponse;
			httpRequest.send(null);	
		} catch(err)
		{
			errorHandler("preferencesUpdate",err);
			$.bm_login.login_in_process = false;
		}
	},
	validatePassword : function()
	{
		return true;
	},
	validateNewPassword : function()
	{
		var sReturn = "";
		if (document.getElementById("new-password").value==document.getElementById("confirm-new-password").value)
		{
			// do nothing
		} else
		{
			// raise error
			sReturn = "Password confirmation failure. New password is different from old password.";
		}
		return sReturn;
	},
	usersUpdate : function()
	{
		try
		{
			var sEmail = document.getElementById("email").value;
			if (sEmail == $.bm_main.DEFAULT_EMAIL)
			{
				sEmail="";
			}
			var sCity = document.getElementById("city").value;
			var sUserName = document.getElementById("username").value;
			var sPassword = document.getElementById("password").value;
			var sFirstName = document.getElementById("first-name").value;
			var sLastName = document.getElementById("last-name").value;
			//alert("user key "+$.bm_login.current_user_key);
			var sParams = "?login_name="+escape(sUserName)+"&user_key="+$.bm_login.current_user_key+"&email="+sEmail+"&city="+escape(sCity)+"&first_name="+escape(sFirstName)+"&last_name="+escape(sLastName)+"&password="+escape(sPassword);
			//alert(USERS_UPDATE_URL+sParams);
			httpRequest.open("GET", USERS_UPDATE_URL+sParams, true);
			httpRequest.onreadystatechange = usersUpdateHttpResponse;
			httpRequest.send(null);	
		} catch(err)
		{
			errorHandler("preferencesUpdate",err);
			$.bm_login.login_in_process = false;
		}	
	},
	preferencesUpdateHttpResponse : function()
	{
		try
		{
			var sResults = httpRequest.responseText;
			var sResultsArray;
			var e;
			if (httpRequest.readyState == 4) 
			{
				//alert(sResults);
				sResultsArray = sResults.split(",");
				if (sResultsArray[0] == SUCCESS)
				{
					//alert("preferences update success");
				} else
				{
					alert("preferences update failure");
				}
			}		
		} catch(err)
		{
			errorHandler("commentsInsertHttpResponse",err);
		}
	},
	usersUpdateHttpResponse : function()
	{
		try
		{
			var sResults = httpRequest.responseText;
			var sResultsArray;
			var e;
			if (httpRequest.readyState == 4) 
			{
				//alert(sResults);
				sResultsArray = sResults.split(",");
				if (sResultsArray[0] == SUCCESS)
				{
					alert("Your changes have been recorded.");
				} else
				{
					alert("users update failure");
				}
			}		
		} catch(err)
		{
			errorHandler("commentsInsertHttpResponse",err);
		}
	}
	,
	logout : function()
	{
		//alert("in logout");
		try
		{
			$.bm_login.logged_in = false;
		} catch(err) 
		{
			errorHandler("logout",err);
		}
	},
	passwordOnFocus : function()
	{
		document.getElementById("password").select();
		//$.bm_main.current_edit_mode = $.bm_main.EDITING_PASSWORD;
		var e = document.getElementById("password");
		if (e.value == $.bm_login.DEFAULT_PASSWORD)
		{
			e.value = "";
		};
	},
	loginShowError : function(psMessage)
	{
		document.getElementById("login-error").innerHTML = psMessage;
		document.getElementById("why-login").style.display="none";
		document.getElementById("username").focus();
	},
	loginHideError : function()
	{
		try
		{
			var e;
			e = document.getElementById("login-error");
			e.innerHTML = "";
			e.style.display="none";
			e = document.getElementById("why-login");
			e.style.display="block";
			e = document.getElementById("why-login-text");
			e.style.display="block";		
		} catch(err) 
		{
			errorHandler("loginHideError",err);
		}
	},
	loginHttpResponse : function() 
	{
		//alert("in loginHttpResponse");
		try
		{
			/*
				Response message:
				Error number integer
				Error message string
				User_key integer - the primary key to the user table
			*/
			var sResults = httpRequest.responseText;
			var sResultsArray;
			var e;
			if (httpRequest.readyState == 4) 
			{
				sResultsArray = sResults.split(",");

				if (sResultsArray[0] == $.bm_login.SUCCESS)
				{
					$.bm_login.logged_in = true;
					//alert("sResults are "+sResults);
					setPreferences(sResultsArray);

					//alert("loginHttpResponse Your user key is "+$.bm_login.current_user_key);

					// if login successful then do the following.
					//loginHideShow();
					//$.bm_tab.current_edit_mode = $.bm_main.EDITING_NOTHING;
					//e =  document.getElementById("options");
					//e.style.display = "block";

					$.bm_login.loginHideError();

					//footerRightHideShow("none");

					//preferencesShow();

					$.bm_comments.commentsShowExistingHideNew();
					$.bm_comments.commentsGet($.colflow.bookid,$.colflow.chapterid);
					//commentsShow();

					//helpShow();

					//removeTabFromList(TAB_LOGIN);

					$.bm_login.login_in_process = false;
					document.getElementById($.bm_login.SUBMIT_BUTTON).disabled=false;
					switchLoginTab(1);

				} else
				{
					//NB Brian display error
					//loginShowError(sResultsArray[1]);
					//This substring nonsense is related to a trailing 0 which is mysteriously 
					//appearing in the error message element. I wonder if that is 
					//because I'm sending the message to innerHTML.
					if (sResults=="")
					{
						alert("Error in loginHttpResponse "+sResults);
					} else
					{

						loginShowError(sResultsArray[1].substr(0,(sResultsArray[1].length-1)));
					}
					$.bm_login.logged_in = false;
					document.getElementById($.bm_login.SUBMIT_BUTTON).disabled = false;
				}
		  	} else
			{
				// NB Brian Is there a need to handle other ready states?
				//alert("ready state = "+http.readyState)
			}
		} catch(err)
		{
			errorHandler("loginHttpResponse",err);
		}
		$.bm_login.login_in_process = false;
	}
}
})

})(jQuery);

