function submitPassword() {
	if (checkPassword()) {
		if (_retUrl != null) {
			window.location.href = add_jsessionid(_retUrl);
		} else {
			// reload, with jsessionid in url
			var rewritten = add_jsessionid(window.location.href);
			if (rewritten != window.location.href) {
				window.location.href = add_jsessionid(window.location.href);
			} else {
				window.location.reload(true); // reload
			}
		}
	}
	return false;
}

// functions for handling user login
// note, relies on util.js for some functionality
// and on the login servlet (so declare in web.xml)
function checkPassword() {
	var emailE = document.getElementById("user");
	var passwordE = document.getElementById("password");
	var saveE = document.getElementById("save");

	if (emailE.value == null || emailE.value == "") {
		alert("Please enter your email address");
		return false;
	}

	if (passwordE.value == null || passwordE.value == "") {
		alert("Please enter your password");
		return false;
	}

	var email = emailE.value;
	var password = passwordE.value;

	if (saveE.value) {
		setCookie("subjectEmail", email, 365);
		setCookie("subjectPassword", password, 365);
	}

	var isValid = false;
	var request = newXMLRequest();

	var prefix = (_retUrl != null) ? "./../../../" : "";

	var url = prefix + "login?operation=login&user=" + escape(email)
			+ "&password=" + escape(password) + "&timeDummyParam="
			+ new Date().getTime();
	url = add_jsessionid(url);
	request.open('GET', url, false);
	request.send(null);
	if (request.status != 200) {
		alert("Could not contact server to check password");
		return false;
	}

	var valid = request.responseXML.getElementsByTagName("passwordResult")[0];
	isValid = valid.getAttribute("valid") == "true";

	if (!isValid) {
		alert("Incorrect username/password combination");
		postEvent("LOGIN_ATTEMPT", "failure");
	} else {
		postEvent("LOGIN_ATTEMPT", "success");
	}

	return isValid;

}

function forgotPassword() {
	var forgotPasswordDiv = document.getElementById("ForgotPasswordDiv");
	var loginDiv = document.getElementById("LoginDiv");
	var signupDiv = document.getElementById("SignupDiv");

	forgotPasswordDiv.style.display = "inline";
	loginDiv.style.display = "none";
	signupDiv.style.display = "none";

	return false;
}

function createUser() {
	var request = newXMLRequest();
	var name = document.getElementById("name").value;
	var email = document.getElementById("user").value;
	var password = document.getElementById("password").value;
	var admin = (document.getElementById("admin").checked ? "true" : "false");
	var url = "login?operation=create&name=" + name + "&user=" + email
			+ "&password=" + password + "&admin=" + admin;
	url = add_jsessionid(url);

	var request = newXMLRequest();
	request.open('GET', url, false);
	request.send(null);

	if (request.readyState == 4) {
		if (request.status == 200) {
			document.write(request.responseText);
			document.close();
		}
	}
}

function doSignup() {
	var forgotPasswordDiv = document.getElementById("ForgotPasswordDiv");
	var loginDiv = document.getElementById("LoginDiv");
	var signupDiv = document.getElementById("SignupDiv");

	forgotPasswordDiv.style.display = "none";
	signupDiv.style.display = "inline";
	loginDiv.style.display = "none";
	return false;
}

function rememberedPassword() {
	var forgotPasswordDiv = document.getElementById("ForgotPasswordDiv");
	var loginDiv = document.getElementById("LoginDiv");
	var signupDiv = document.getElementById("SignupDiv");

	forgotPasswordDiv.style.display = "none";
	signupDiv.style.display = "none";
	loginDiv.style.display = "inline";

	return false;
}

function doTooManyUsers() {
	var forgotPasswordDiv = document.getElementById("ForgotPasswordDiv");
	var loginDiv = document.getElementById("LoginDiv");
	var signupDiv = document.getElementById("SignupDiv");
	var tooManyUsersDiv = document.getElementById("TooManyUsers");

	forgotPasswordDiv.style.display = "none";
	signupDiv.style.display = "none";
	loginDiv.style.display = "none";
	tooManyUsersDiv.style.display = "inline";
}

function logout() {
	var request = newXMLRequest();
	var url = "login?operation=logout&timeDummyParam=" + new Date().getTime();
	url = add_jsessionid(url);
	request.open('GET', url, false);

	postEvent("LOGOUT_USER");

	request.send(null);
	if (request.status != 200) {
		alert("Error: could not contact server to logout");
		return false;
	}

	window.location.reload(true); // reload the application
	return false;
}

/**
 * This implements a warning for when a session time's out. This is not used
 * when a Galaxy hub is connected to the AjaxGUI.
 */
function checkTimeout() {
	var request = newXMLRequest();
	var url = "login?operation=timeoutwarning&warningTime=60";
	url = add_jsessionid(url);
	request.open('GET', url, true);
	request.send(null);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			if (request.status == 200) {
				startTimer(60);
				checkReset();
			}
		}
	}
}

function checkReset() {
	var request = newXMLRequest();
	var url = "login?operation=timeoutreset&waitTime=60";
	url = add_jsessionid(url);
	request.open('GET', url, true);
	request.send(null);
	request.onreadystatechange = function() {
		if (request.readyState == 4) {
			if (request.status == 200) {
				var doc = request.responseXML;
				var timeoutN = doc.getElementsByTagName('timeout')[0];
				var reset = timeoutN.getAttribute('reset');

				if (reset == 'true') {
					clearTimer();
					checkTimeout();
				} else {
					logout();
				}
			}
		}
	}
}

/**
 * Get the session ID so that we can load it when we transfer to another gui.
 */
function contextSwitchSave(baseurl) {
	if (baseurl == null) {
		baseurl = "";
	}

	var sessionID = null;
	var request = newXMLRequest();
	var url = baseurl + "login?operation=contextswitchsave";
	url = add_jsessionid(url);

	request.open('GET', url, false);
	request.send(null);
	if (request.readyState == 4) {
		if (request.status == 200) {
			var doc = request.responseXML;
			var resultN = doc.getElementsByTagName('result')[0];
			sessionID = resultN.getAttribute("sessionId");
		}
	}

	return sessionID;
}

/**
 * Given the base URL of a particular Ajax GUI (doesn't need to be this one),
 * make that GUI attempt a context switch load. This doesn't actually switch the
 * page. This can be done immediately after the call.
 */
function remoteContextSwitchLoad(csid, baseurl) {
	if (baseurl == null) {
		baseurl = "";
	}

	var request = newXMLRequest();
	var url = baseurl + "login?operation=contextswitchload&contextswitchid="
			+ csid;
	url = add_jsessionid(url);

	// alert("Trying to context switch using this: " + url);

	request.open('GET', url, false);
	request.send(null);
	if (request.readyState == 4) {
		if (request.status == 200) {

		}
	}
}

function forceTimeout() {
	var request = newXMLRequest();
	var url = "login?operation=timeout";
	url = add_jsessionid(url);

	request.open('GET', url, true);
	request.send(null);
}

function resetPassword() {
	var emailE = document.getElementById("emailForgotPassword");

	if (emailE.value == null || emailE.value == "") {
		alert("Please enter your email address");
		return false;
	}

	var email = emailE.value;
	var request = newXMLRequest();
	var url = "login?operation=sendresetemail&user=" + escape(email);
	url = add_jsessionid(url);

	request.open('GET', url, false);
	request.send(null);
	if (request.status != 200) {
		alert("Could not contact server to reset password, please try again");
		return false;
	}

	var result = request.responseXML
			.getElementsByTagName("resetPasswordResult")[0];

	if (result == null) {
		alert("Error contacting server, please try again");
		return false;
	}

	var isValidUser = result != null
			&& result.getAttribute("validUser") == "true";

	if (!isValidUser) {
		alert("The email address you entered is not in our database");
		return false;
	}

	var isEmailed = result.getAttribute("reset") == "true";
	if (!isEmailed) {
		alert("The server encountered difficulty sending an email.  Please try again");
		return false;
	}

	postEvent("RESET_PASSWORD", email);

	rememberedPassword();

	alert("An email instructing you on how to reset your password has been sent to you.");

	return false;
}

function signup(gid, requiresValidation) {
	var emailE = document.getElementById("emailSignup");
	if (emailE.value == null || emailE.value == "") {
		alert("Please enter your email address");
		return false;
	}

	var email = emailE.value;
	var request = newXMLRequest();
	var url = "login?operation=signup&user=" + escape(email);
	url = add_jsessionid(url);

	if (gid != -1) {
		url = url + "&gid=" + gid;
	}

	request.open('GET', url, false);
	request.send(null);
	if (request.status != 200) {
		alert("Could not contact server to signup, please try again");
		return false;
	}

	var result = request.responseXML.getElementsByTagName("signupResult")[0];
	if (result == null) {
		alert("Error contacting server, please try again");
		return false;
	}

	var userExists = result.getAttribute("userExists");
	if (userExists == "true") {
		alert("Your email address is already in our database.  An email asking you to reset your password has been sent to you (if you remember it, feel free to log-in).");
		rememberedPassword();
		return false;
	}

	var tooManyUsers = result.getAttribute("tooManyUsers");
	if (tooManyUsers == "true") {
		doTooManyUsers();
		return false;
	}

	var signupOK = result.getAttribute("signupOK");
	if (signupOK == "false") {
		alert("There was an error in the sign up process.  Please try again later");
		return false;
	}

	postEvent("SIGNUP_USER", email);

	if (requiresValidation == "true") {
		window.location.href = "generic/sls/forward/requires_validation.jsp";
	} else {
		alert("Thanks for signing up!  You are now logged in and can begin the tasks.  Should you need to come back later to finish, an email has been sent to "
				+ email + " with a login name and password");
		var pagelink = window.location.href;
		pagelink = pagelink.replace("signup=true", "");
		pagelink = pagelink.replace("signup-auto=true", "");
		pagelink += "&management-study=true";

		pagelink = pagelink.replace("&&", "&"); // fix the parameters
		pagelink = pagelink.replace("?&", "?"); // fix the parameters
		// alert(pagelink);
		window.location.href = pagelink;
	}

	// rememberedPassword();
	return false;
}