var signinLoaded = false
var captchaShown = false
var loginNeedsCaptcha = false

function createCaptcha(divid) {

	if(divid == "recaptcha_reg") {
		$("#loginLeft").css("width", "306px");
		$("#loginRight").css("width", "236px");
	} else if(divid == "recaptcha_login") {
		$("#loginRight").css("width", "306px");
		$("#loginLeft").css("width", "236px");
	}

	Recaptcha.create("6LdFnAgAAAAAAGx_QZe4PQ-rv7WY0XakZXE1MUhq", divid, {
		theme: "blackglass",
		tabindex: 0,
		callback: function() {
			Recaptcha.focus_response_field()
		}
	});

	captchaShown = true;
}

function regError(message, needsCaptcha) {
	$("#regError").text(message);

	if(captchaShown) {
		Recaptcha.destroy();
	}

	if(needsCaptcha) {
		createCaptcha("recaptcha_reg");
	}
}

function loginError(message, needsCaptcha) {
	$("#loginError").text(message);

	if(captchaShown) {
		Recaptcha.destroy();
	}

	if(needsCaptcha) {
		createCaptcha("recaptcha_login");
	}
}

function validatePasswordMatch() {
	var password = $("#password_reg").val();
	var password_v = $("#password_v_reg").val();

	if(password != password_v)
	{
		$("#password_v_reg_err").text("Does not match");
		$("#password_v_reg").css("border-color", "red");
	}
	else
	{
		$("#password_v_reg_err").text("");
		$("#password_v_reg").css("border-color", "");
	}
}

function hookLogin() {
	if(loginNeedsCaptcha) {
		createCaptcha("recaptcha_login");
	}

	$("#closeLoginButton").click(function() {
		$(".login").hide();
		return false;
	});

	$("#username_reg").blur(function() {
		var username = $("#username_reg").val();
		var hasError = false;

		if(username.length < 3)
		{
			$("#username_reg_err").text("Too short");
			hasError = true;
		}
		else if(!/^[0-9A-Z _,.-]{3,}$/i.test(username))
		{
			$("#username_reg_err").text("Contains invalid characters");
			hasError = true;
		}

		if(hasError)
		{
			$("#username_reg").css("border-color", "red");
		}
		else
		{
			$("#username_reg").css("border-color", "");
			$("#username_reg_err").text("");
		}
	});


	$("#password_reg").blur(function() {
		var password = $("#password_reg").val();
		var password_v = $("#password_v_reg").val();

		if(password.length < 3)
		{
			$("#password_reg_err").text("Too short");
			$("#password_reg").css("border-color", "red");
		}
		else
		{
			$("#password_reg_err").text("");
			$("#password_reg").css("border-color", "");
		}

		if(password_v.length > 0)
		{
			validatePasswordMatch();
		}
	});

	$("#password_v_reg").blur(function() {
		validatePasswordMatch();
	});

	$("#register").submit(function() {
		var username = $("#username_reg").val();
		var password = $("#password_reg").val();
		var password_v = $("#password_v_reg").val();
		var emailaddr = $("#email_reg").val();
		var nonce = $("#nonce").val();
		var captcha_challenge = "";
		var captcha = "";

		if(captchaShown) {
			captcha_challenge = Recaptcha.get_challenge();
			captcha = Recaptcha.get_response();
		}

		if(password != password_v) {
			$("#regError").text("The passwords do not match.");
			return false;
		}

		$.ajax({
		type: "POST",
		url: "/doRegister.php",
		cache: false,
		data: ({
			'user' : username,
			'pass' : password,
			'email' : emailaddr,
			'nonce' : nonce,
			'recaptcha_challenge_field' : captcha_challenge,
			'recaptcha_response_field' : captcha
		}),
		dataType: "json",
		success: function(data) {
			if(data.error) {
				regError(data.errmsg);
			} else {
				$("#regError").text("");
				$.cookie('username', data.username, {expires: 1825, path: '/'});
				$.cookie('session', data.session, {path: '/'});
				if($("#remember_reg").attr("checked")) {
					$.cookie('cookie', data.cookie, {expires: 1825, path: '/'});
				} else {
					$.cookie('cookie', null, {path: '/'});
				}

				reloadPage();
			}
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			regError("An error occured on the server. Try again.");
		}
		});
		return false;
	});

	$("#login").submit(function() {
		var username = $("#username_login").val();
		var password = $("#password_login").val();
		var nonce = $("#nonce").val();
		var captcha_challenge = "";
		var captcha = "";

		if(captchaShown) {
			captcha_challenge = Recaptcha.get_challenge();
			captcha = Recaptcha.get_response();
		}

		if(username.length == 0 || password.length == 0) {
			$("#loginError").text("The form is incomplete.");
			return false;
		}

		$.ajax({
		type: "POST",
		url: "/doLogin.php",
		cache: false,
		data: ({
			'user' : username,
			'pass' : password,
			'nonce' : nonce,
			'recaptcha_challenge_field' : captcha_challenge,
			'recaptcha_response_field' : captcha
		}),
		dataType: "json",
		success: function(data) {
			if(data.error) {
				loginError(data.errmsg, data.needscaptcha);
			} else {
				$("#loginError").text("");
				$.cookie('username', data.username, {expires: 1825, path: '/'});
				$.cookie('session', data.session, {path: '/'});
				if($("#remember_login").attr("checked")) {
					$.cookie('cookie', data.cookie, {expires: 1825, path: '/'});
				} else {
					$.cookie('cookie', null, {path: '/'});
				}

				reloadPage();
			}
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			loginError("An error occured on the server. Try again.", false);
		}
		});

		return false;
	});
}

function reloadPage() {
	// This is not ideal because in firefox all images will refresh as well
	// until the next page load.
	//window.location.reload(true);

	// If there is a hash, remove it and set page to that.
	// This is necessary to get the page content to actually reload.
	if(window.location.href.match(window.location.hash + "$") == window.location.hash)
	{
		window.location.href = window.location.href.substring(0, window.location.href.length - window.location.hash.length);
	}
	else
	{
		window.location.href=window.location.href;
	}
}

function doLogout() {
	$.cookie("username", null, {path: '/'});
	$.cookie("session", null, {path: '/'});
	$.cookie("cookie", null, {path: '/'});
	reloadPage();
}

$(function() {
	$(".signinLink").click(function() {
		$(".login").show();
		if(signinLoaded == false) {
			$.ajax({
			type: "GET",
			url: "/signin.php",
			cache: false,
			dataType: "html",
			success: function(data) {
				$(".loginPopup").html(data);
				hookLogin();
			},
			error: function(XMLHttpRequest, textStatus, errorThrown) {
				$(".loginPopup").html("<h1 style=\"text-align: center;\">An error occured on the server.</h1>");
			}
			});
			signinLoaded = true;
		}

		return false;
	});

	$(".logoutLink").click(function() {
		$.ajax({
		type: "POST",
		url: "/logout.php",
		cache: false,
		dataType: "json",
		success: function(data) {
			doLogout();
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			doLogout();
		}
		});

		return false;
	});

	$(".loginPopupCover").click(function() {
		$(".login").hide();
	});
});
