/// <reference path="jQuery.intellisense.js"/>
/// <reference path="xeko.js"/>
/// <reference path="messaging.js"/>
$(document).ready(function()
{
	xeko.drawers.items.registerDrawer = {"id" : "registerDrawer", "closed" : "-900px", "open" : "0px"};
	
	$("#registerContinue, #registerDone").click(function(e)			// override the click default, instead go the next step in the form
	{
		e.preventDefault();
		if (xeko.widgets.register.validate()) xeko.widgets.register.nextStep();
	});
	
	$("#registerGoBack").click(function(e)			// override the click default, instead go the previous step in the form
	{
		e.preventDefault();
		xeko.widgets.register.prevStep();
	});
	$("#underageYes").click(function(e)			// user has confirmed that they are under 13
	{
		e.preventDefault();
		
		xeko.widgets.register.ageConfirmedUnder13 = true;
		
		// Birthdate is no longer editable
		xeko.widgets.register.commitDob();
	
		// show Parent email fields
		$(".parentEmail").show();
		$(".optIn").show();
		
		//TODO UPDATE THIS TO BE A STATIC DISPLAY
		$("#registerLightboxDrawer").hide();// xeko.drawers.slideDrawer("registerLightboxDrawer", true);
	});
	
	$("#underageNo").click(function(e)			// user opts to edit birthdate
	{
		e.preventDefault();
		$("#registerLightboxDrawer").hide(); //xeko.drawers.slideDrawer("registerLightboxDrawer", true);
	});
	
	// Check availability of Agent ID as soon as it's changed
	$("#registerAgentId").bind("change", function()
	{
		if (xeko.validation.validateAgentId(this.value)) xeko.widgets.register.checkAgentId(this.value);
	});
	
	$("#registerClose").click(function(e)			// close drawer
	{
		e.preventDefault();
		xeko.drawers.slideDrawer("registerDrawer", false);
	});
});


xeko.widgets.register = {
	"currentStep": 1,
	"numberOfSteps": 4,
	"ageConfirmed": false,
	"ageConfirmedUnder13": false,
	"agentIdCheckComplete": false,
	"agentIdAvailable": false,
	"dob": null,
	"email": null,
	"products": "",
	"validate": function() {
		var isValid = false;
		switch (this.currentStep) {
			case 1:
				// valid when user agrees to code of conduct
				if ($("#registerCodeOfConduct").get(0).checked) {
					isValid = true;
					xeko.validation.clearMessage("registerCodeOfConductContainer");
				}
				else xeko.validation.showMessage("registerCodeOfConductContainer", xeko.messaging.alert.CODE_OF_CONDUCT_AGREE);
				break;
			case 2:
				if ($("input[name='registerAlterEco']:checked").length > 0) {
					var alterEco = $("input[name='registerAlterEco']:checked").val();
					xeko.validation.clearMessage("registerAvatarSelect");
					isValid = true;
					$("div.alterEco>span").text(alterEco);
					xeko.debug.trace(alterEco);
					// Set alter-eco image
					var selectedId = $("input[name='registerAlterEco']:checked").attr("id");
					$(".alterEco img").attr("src", $("label[for='" + selectedId + "'] img").attr("src"));
				}
				else {
					xeko.validation.showMessage("registerAvatarSelect", xeko.messaging.alert.ALTER_ECO_MUST_SELECT);
				}
				break;
			case 3:
				isValid = true;

				// Agent ID must be valid and available
				if (!xeko.validation.validateAgentId($("#registerAgentId").val())) {
					xeko.validation.showMessage("registerAgentIdLabel", xeko.messaging.alert.AGENT_ID_INVALID);
					isValid = false;
				}
				else if (!this.agentIdAvailable) {
					xeko.validation.showMessage("registerAgentIdLabel", xeko.messaging.alert.AGENT_ID_NOT_AVAILABE);
					isValid = false;
				}
				else xeko.validation.clearMessage("registerAgentIdLabel");

				// Password must be specified and be at least five non-whitespace characters
				if (!xeko.validation.validatePassword($("#registerPassword").val())) {
					xeko.validation.showMessage("registerPasswordLabel", xeko.messaging.alert.PASSWORD_INVALID);
					isValid = false;
				}
				else xeko.validation.clearMessage("registerPasswordLabel");

				// Passowrds must match
				if ($("#registerPassword").val() != $("#registerPasswordConfirm").val()) {
					xeko.validation.showMessage("registerPasswordConfirmLabel", xeko.messaging.alert.PASSWORDS_DO_NOT_MATCH);
					isValid = false;
				}
				else xeko.validation.clearMessage("registerPasswordConfirmLabel");

				break;
			case 4:
				isValid = true;

				// First name is required
				if ($("#registerFirstName").val().length < 1) {
					xeko.validation.showMessage("registerFirstNameLabel", xeko.messaging.alert.FIRST_NAME_MISSING);
					isValid = false;
				}
				else xeko.validation.clearMessage("registerFirstNameLabel");

				// Postal code is required
				if ($("#registerZipCode").val().length < 1) {
					xeko.validation.showMessage("registerZipCodeLabel", xeko.messaging.alert.ZIP_CODE_MISSING);
					isValid = false;
				}
				else xeko.validation.clearMessage("registerZipCodeLabel");

				// Xeko products checkboxes are optional
				xeko.widgets.register.products = "";
				$("input[name='registerXekoProducts']").each(function() {
					if (this.checked) xeko.widgets.register.products += $(this).val() + ",";
				});

				// Must agree to Terms of Use
				if (!$("#registerTermsOfUse").get(0).checked) {
					xeko.validation.showMessage("registerTermsOfUse", xeko.messaging.alert.TERMS_OF_USE_NOT_CHECKED);
					isValid = false;
				}
				else xeko.validation.clearMessage("registerTermsOfUse");

				// Must enter birthdate
				var month = $("#registerBirthMonth").get(0).options[$("#registerBirthMonth").get(0).selectedIndex].value;
				var day = $("#registerBirthDay").get(0).options[$("#registerBirthDay").get(0).selectedIndex].value;
				var year = $("#registerBirthYear").get(0).options[$("#registerBirthYear").get(0).selectedIndex].value;
				if (month.length == 0 || isNaN(month) || day.length == 0 || isNaN(day) || year.length == 0 || isNaN(year)) {
					xeko.validation.showMessage("registerDateOfBirthLabel", xeko.messaging.alert.BIRTHDATE_MISSING);
					isValid = false;
				}
				else {
					xeko.validation.clearMessage("registerDateOfBirthLabel");

					if (this.ageConfirmed) {
						var userEmail = $("#registerUserEmail").val();
						// Validate email address
						if (!xeko.validation.validateEmail(userEmail)) {
							xeko.validation.showMessage("registerUserEmailLabel", xeko.messaging.alert.USER_EMAIL_INVALID);
							isValid = false;
						}
						// TODO: ENABLE EMAIL CHECK FOR UNIQUENESS FOR LAUNCH 
						//else if (!xeko.widgets.register.emailAddressIsUnique(userEmail)) {
						//	xeko.validation.showMessage("registerUserEmailLabel", xeko.messaging.alert.REG_EMAIL_NOT_UNIQUE);
						//	isValid = false;
						//}
						else {
							xeko.validation.clearMessage("registerUserEmailLabel");
							xeko.widgets.register.email = $("#registerUserEmail").val();
						}
					}
					else if (this.ageConfirmedUnder13) {
						// Validate parent's email address
						if (!xeko.validation.validateEmail($("#registerParentEmail").val())) {
							xeko.validation.showMessage("registerParentEmailLabel", xeko.messaging.alert.PARENT_EMAIL_INVALID);
							isValid = false;
						}
						else {
							xeko.validation.clearMessage("registerParentEmailLabel");
							xeko.widgets.register.email = $("#registerParentEmail").val();
						}
					}
					else {
						isValid = false;

						// Is user younger than 13?
						var today = new Date;

						xeko.widgets.register.dob = new Date(parseInt(year), parseInt(month) - 1, parseInt(day));

						var yearsOld = today.getFullYear() - parseInt(year);

						if (today.getMonth() + 1 < parseInt(month)) yearsOld--; // birthday is next month; subtract a year

						else if (parseInt(month) == (today.getMonth() + 1) && today.getDate() < parseInt(day)) yearsOld--; // birthday is this month, but after today; subtract a year


						if (yearsOld < 0) {
							xeko.validation.showMessage("registerDateOfBirthLabel", xeko.messaging.alert.BIRTHDATE_INVALID);
						}
						else if (yearsOld < 13) {
							xeko.validation.clearMessage("registerDateOfBirthLabel");
							$("#registerLightboxDrawer>div>p").text(xeko.messaging.confirmation.BIRTHDATE_UNDER_13.replace("[age]", yearsOld));
							//TODO HERE
							$("#registerLightboxDrawer").show();
							//xeko.drawers.slideDrawer("registerLightboxDrawer", false);
						}
						else {
							xeko.validation.clearMessage("registerDateOfBirthLabel");
							this.ageConfirmed = true;
							this.showUserEmailFields();
						}
					}
				}

				break;
		}
		return isValid;
	},
	"checkAgentId": function(agentId) {

		$.ajax(
		{
			method: "get",
			url: "/widgets/widget.AgentInfo.handler.php?request=agentlookupbyagentid&agentid=" + agentId,
			beforeSend: function() {
				// let user know lookup is in process
				xeko.validation.showMessage("registerAgentIdLabel", xeko.messaging.alert.AGENT_ID_LOOKUP);

				$("#registerContinue").get(0).disabled = true;
			},

			success: function(xml) {
				// Check for existence of <agent> node for this Agent ID
				if ($(xml).find("agent").length == 0) {
					xeko.validation.clearMessage("registerAgentIdLabel");
					xeko.widgets.register.agentIdAvailable = true;
				}
				else {
					xeko.validation.clearMessage("registerAgentIdLabel");
					xeko.validation.showMessage("registerAgentIdLabel", xeko.messaging.alert.AGENT_ID_NOT_AVAILABE);
					xeko.widgets.register.agentIdAvailable = false;
				}
			},
			error: function(xmlHttpRequest, status, err) {
				if (xmlHttpRequest.status > 0) {
					xeko.validation.clearMessage("registerAgentIdLabel");
					xeko.widgets.register.throwError(xeko.messaging.error.REG_AGENTID_LOOKUP_ERROR);
				}
			},
			complete: function() {
				this.agentIdCheckComplete = true;
				$("#registerContinue").get(0).disabled = false;
			}
		});
	},
	"emailAddressIsUnique": function(email) {
		var isUnique = false;
		// See if email address is unique
		$.ajax(
		{
			"method": "get",
			"async": false,
			"url": "/widgets/widget.AgentInfo.handler.php?request=agentlookupbyemail",
			"data": { "agentemail": email },
			"beforeSend": function() {
				xeko.lightbox.show(xeko.strings.LOADING, true, "RegisterValidateEmail");
				$("#registerContinue").get(0).disabled = true;
			},
			"complete": function() {
				xeko.lightbox.hide("RegisterValidateEmail");
				$("#registerContinue").get(0).disabled = false;
			},
			"success": function(xml) {
				alert(xml);
				var agentGuid = "";
				if (xml != null) {
					agentGuid = $("agent", xml).attr("id");
				}
				if (agentGuid.length == 0) {
					isUnique = true;
				}
			},
			"error": function(xmlHttpRequest, status, err) {
			}
		});
		return isUnique;
	},
	"save": function() {
		// Params
		var now = new Date;
		var password = $("#registerPassword").val();
		var activationStatus = "1";
		if (xeko.widgets.register.ageConfirmedUnder13) {
			activationStatus = "0";
		}

		var alterEco = $("input[name='registerAlterEco']:checked").val();

		var queryString = "userid=" + $("#registerAgentId").val() + "&" +
				"firstname=" + $("#registerFirstName").val() + "&" +
				"birthdate=" + xeko.utilities.formatDavinciDate(xeko.widgets.register.dob) + "&" +
				"postalcode=" + $("#registerZipCode").val() + "&" +
				"emailaddress=" + xeko.widgets.register.email + "&" +
				"getsnewsletter=" + $("#registerOptIn").get(0).checked + "&" +
				"joindate=" + xeko.utilities.formatDavinciDate(now) + "&" +
				"isparentapproved=" + (xeko.widgets.register.ageConfirmedUnder13 ? "0" : "1") + "&" +
				"password=" + password + "&" +
				"status=" + activationStatus + "&" +
				"cardid=" + alterEco + "&" +
				"products=" + xeko.widgets.register.products + "&" +
				"action=POST";

		$.ajax(
		{
			type: "POST",
			url: "/widgets/widget.Register.handler.php",
			data: queryString,
			beforeSend: function() {
				// lightbox while the POST is in progress
				xeko.lightbox.show("Please wait while we create your account.", true, "register");
			},

			success: function(xml) {
				// success?
				if ($(xml).find("agent").length == 0) {
					xeko.widgets.register.throwError(xeko.messaging.error.REG_ERROR);
				}
				else {
					// Set agent name
					$("#step5Heading>h1>span.agentName").text($("#registerAgentId").val());

					// Show confirmation screen
					flashObj = document.getElementById("headerflash");
					flashObj.passLoginFromJS();
					xeko.widgets.register.goTo(xeko.widgets.register.currentStep, xeko.widgets.register.currentStep += 1);

					// update agent obj
					xeko.debug.trace("updating...");
					xeko.widgets.logIn.updateUser();
					xeko.debug.trace("updated");

					// Reset birthdate
					xeko.widgets.register.ageConfirmed = false;
					xeko.widgets.register.ageConfirmedUnder13 = false;
					xeko.widgets.register.unCommitDob();

					// Clear all form values
					$("#registerCodeOfConduct").get(0).checked = false;
					$.each($("input[name='registerAlterEco']"), function() { this.checked = false; });
					$("#registerAgentId").val("");
					$("#registerPassword").val("");
					$("#registerPasswordConfirm").val("");
					$("#registerFirstName").val("");
					$("#registerZipCode").val("");
					$("#registerBirthMonth").get(0).selectedIndex = 0;
					$("#registerBirthDay").get(0).selectedIndex = 0;
					$("#registerBirthYear").get(0).selectedIndex = 0;
					$("#registerUserEmail").val("");
					$("#registerParentEmail").val("");
					$("#registerOptIn").get(0).checked = false;
					$.each($("input[name='registerXekoProducts']"), function() { this.checked = false; });
					$("#registerTermsOfUse").get(0).checked = false;
				}
			},
			error: function(xmlHttpRequest, status, err) {
				if (xmlHttpRequest.status > 0) {
					xeko.validation.clearMessage("registerAgentIdLabel");
					xeko.widgets.register.throwError(xeko.messaging.error.REG_ERROR);
				}
			},
			complete: function() {
				// hide lightbox
				xeko.lightbox.hide("register");
			}
		});
	},
	"prevStep": function() {
		this.goTo(this.currentStep, this.currentStep -= 1);
	},
	"nextStep": function() {
		xeko.debug.trace(this.currentStep);
		if (this.currentStep < this.numberOfSteps) { this.goTo(this.currentStep, this.currentStep += 1); }
		else this.save();
	},
	"goTo": function(from, to) {

		xeko.widgets.register.hideError();

		// Step Image
		if (Number(to) <= Number(xeko.widgets.register.numberOfSteps)) {
			$("#showStep").attr("class", "step" + to).attr("alt", "Step " + to);

			// hide back button
			if (Number(to) == 1) {
				$("#registerGoBack").hide();
			}
			else {
				$("#registerGoBack").show();
			}

			if (Number(to) == 2) {
				xeko.widgets.register.getAvatars();
			}

			if (Number(to) == 3) {
				xeko.widgets.register.getProducts();
			}

			if (Number(to) == 4) {
				$.ajax({
					type: "GET",
					url: "/termsofuse.xml",
					success: function(data) {
						$("#registerTermsOfUseContainer").html($("htmlcontent", data).text());
					}
				});

				$("#registerDone").show();
				$("#registerContinue").hide();
			}
			else {
				$("#registerContinue").show();
				$("#registerDone").hide();
			}

			// Adjust heading
			$("#registerHeading").show();
			$("#step5Heading").hide();
		}
		else {
			$("#showStep").attr("class", "stepComplete").attr("alt", "Complete!");

			// Adjust heading
			$("#registerHeading").hide();
			$("#step5Heading").show();

			// Hide buttons
			$("#registerGoBack").hide();
			$("#registerContinue").hide();
			$("#registerDone").hide();
		}

		// Show/hide next step
		if (xeko.widgets.register.ageConfirmedUnder13 == false && to == 5) {
			to += "_13";
		}

		$("#registerStep" + from).hide();
		$("#registerStep" + to).show();
	},
	"showUserEmailFields": function() {
		// Birthdate is no longer editable; replace with static text
		this.commitDob()

		// show user email fields
		$(".userEmail").show();
		$(".optIn").show();
	},
	"commitDob": function() {
		$("#registerDobFields>select").hide();
		var months = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
		$("#registerDobFields").append("<span>" + months[xeko.widgets.register.dob.getMonth()] + " " + xeko.widgets.register.dob.getDate() + ", " + xeko.widgets.register.dob.getFullYear() + "</span>");
	},
	"unCommitDob": function() {
		$("#registerDobFields>select").show();
		$("#registerDobFields>span").remove();
		$(".userEmail").hide();
		$(".optIn").hide();
	},
	"submitForm": function() {
		return true;
	},
	"throwError": function(msg) {
		$("div#registerDrawer p.error").text(msg).show();
	},
	"hideError": function() {
		$("div#registerDrawer p.error").hide();
	},
	"onSuccess": null,
	"getAvatars": function() {
		$.ajax(
		{
			method: "get",
			url: "/widgets/widget.AgentInfo.handler.php?request=avatars",
			success: function(xml) {
				$("div#registerAvatarSelect").html("");
				var count = 1;

				// TODO: GET LATIN NAME
				$("avatar", xml).each(function() {
					var avatarName = $("name:eq(0)", this).text();
					var guid = $(this).attr("id");
					var hotspot = xeko.utilities.removeSpaces($("card>hotspot:eq(0)", this).text());
					var cardNo = $("card>number:eq(0)", this).text();
					var src = "/images/cardart/" + hotspot + "/altereco/" + cardNo + ".png";
					var latinName = "";	// TODO "<br/><span class='latinName'>(latin name)</span>";
					$("div#registerAvatarSelect").append("<div class='avatarrow'><input type=\"radio\" value=\"" + guid + "\" name=\"registerAlterEco\" id=\"registerAlterEco" + count + "\" /><label class=\"checkbox\" for=\"registerAlterEco" + count + "\"><img src=\"" + src + "\" /><div style='padding-top: 8px;'><strong> " + avatarName + "</strong>" + latinName + "</div></label></div>");
					count++;
				});

				$("div#registerAvatarSelect div.avatarrow").click(function(e) {
					$("div#registerAvatarSelect div.avatarrow").removeClass("selected");
					$(this).addClass("selected");
					$("input", this).attr("checked", "checked");
					xeko.debug.trace("clicked me");
				});
			},
			error: function(xmlHttpRequest, status, err) {
				if (xmlHttpRequest.status > 0) xeko.widgets.register.throwError(xeko.messaging.error.AVATAR_SERVICE_ERROR);
			}
		});
	},
	"getProducts": function() {
		$.ajax({
			method: "get",
			url: "/widgets/widget.AgentInfo.handler.php?request=products",
			success: function(xml) {
				$("#registerXekoProductsContainer>p:first").remove();

				$("product", xml).each(function() {
					var productName = $("name", this).text();
					var guid = $(this).attr("id");
				
					var itemDiv = $("#registerProduct").clone().appendTo("#registerXekoProductsContainer");
					xeko.utilities.appendGuidToId(itemDiv, guid);
					$("input", itemDiv).attr("id", "registerProductCheck" + guid);
					$("input", itemDiv).val(guid);
					$("label", itemDiv).attr("for", "registerProductCheck" + guid);
					$("label", itemDiv).text(productName);
				});
			},
			error: function(xmlHttpRequest, status, err) {
				if (xmlHttpRequest.status > 0) xeko.widgets.register.throwError(xeko.messaging.error.PRODUCTS_SERVICE_ERROR);
			}
		});
	},
	"ageconfirmation": function() {

	}
}
