var hasSurvey = false; // This needs to be put into the SYSTEM_COTNROL table.
var xmlSource = "";
var FOOTER_TOP = 730;
var FOOTER_POSITION = 730;
var FOOTER_POSITION_BUFFER = 30;
var ERROR_MSG_HEIGHT = 10;
var PUSHED_FOOTER_TOP = 1000;
var SEARCH_PLACE_HEIGHT = 240;
var ERROR_PLACE_HEIGHT = 30;

var tempStreetName = "";
var tempStreetType = "";
var tempSuburb = "";
var tempRegion = "";
var tempPostcode = "";

var pleaseUpdate = false;
var registeredUserUsername = "";
var registeredUserUserId = "";

function performPostcodeSearch(region, suburb)
{
    getPostcode(region, suburb);
    validateCustomerStreet();
}

function checkForErrors()
{
    setFooterPosition(calculateFooterPostition(0));
}

function processStreetResult(streetResult)
{
    var streetList = streetResult.split(cRowlDelim);
    var count = streetList.length;

    if (count == 1)
    {
        if (doesSingleAddressFoundMatch(streetList[0].split(';;')))
        {
            // Do nothing.  Street is validated.
        }
        else
        {
            clearSelect("StreetSelect");
            showAddressList(streetList, 0);
        }
    }
    else
    {
        clearSelect("StreetSelect");
        showAddressList(streetList, 1);
    }
}

function showAddressList(streetList, offset)
{
    var street;
    var footerPosition = 0;

    // offset is used to determine whether the last element in the streetList array is blank.
    // This is the case when multiple records are found.

    for (var index = 0; index < streetList.length - offset; index++)
    {
        street = streetList[index].split(";;");
        createOption("StreetSelect", streetList[index], street[7]);
    }

    setFooterPosition(calculateFooterPostition(0));
    displaySection("divAddressSelectPlace", true);
}

function setAddress(streetDetails)
{
    fillInSelectedStreet(streetDetails.split(";;"));
    closePanel("divAddressSelectPlace");
    storeTempAddressDetails();
}

function doesSingleAddressFoundMatch(streetAddress)
{
    var streetName = streetAddress[0].split(',')[0];
    var streetType = streetAddress[0].split(',')[1];
    var suburb = streetAddress[1];
    var region = streetAddress[5];
    var postcode = streetAddress[6];

    if (haveAddressDetailsChanged(streetName, streetType, suburb, region, postcode))
        return false;
    else
        return true;
}

function storeTempAddressDetails()
{
    tempStreetName = document.getElementById("StreetName").value;
    tempStreetType = document.getElementById("StreetType").value;
    tempSuburb = document.getElementById("Suburb").value;
    tempRegion = document.getElementById("Region").value;
    tempPostcode = document.getElementById("Postcode").value;
}

function haveAddressDetailsChanged(streetName, streetType, suburb, region, postcode)
{
    switch (true)
    {
        case trim(streetName.toUpperCase()) != trim(document.getElementById("StreetName").value.toUpperCase()):
        case trim(streetType.toUpperCase()) != trim(document.getElementById("StreetType").value.toUpperCase()):
        case trim(suburb.toUpperCase()) != trim(document.getElementById("Suburb").value.toUpperCase()):
        case trim(region.toUpperCase()) != trim(document.getElementById("Region").value.toUpperCase()):
        case trim(postcode.toUpperCase()) != trim(document.getElementById("Postcode").value.toUpperCase()):
            return true;
            break;

        default:
            return false;
            break;
    }
}

function validateCustomerStreet()
{
    if (haveAddressDetailsChanged(tempStreetName, tempStreetType, tempSuburb, tempRegion, tempPostcode))
    {
        switch (true)
        {
            case document.getElementById("StreetName").value == "":
            case document.getElementById("StreetType").value == "":
            case document.getElementById("Suburb").value == "":
            case document.getElementById("Region").value == "":
            case document.getElementById("Postcode").value == "":
                break;

            default:
                storeTempAddressDetails();
                validateStreet(document.getElementById("StreetName").value, document.getElementById("StreetType").value, document.getElementById("Suburb").value, document.getElementById("Region").value, document.getElementById("Postcode").value);
                break;
        }
    }
}

function validateStreet(streetName, streetType, suburb, region, postcode)
{
    getHTMLViaXML(XML_VALIDATE_STREET, streetName + cColDelim + streetType + cColDelim + suburb + cColDelim + region + cColDelim + postcode);
}

function getHTMLViaXML(source, filter)
{
    xmlSource = source;

    switch (source)
    {
        case XML_POSTCODE:
            processXMLHttpResult(loadXMLDoc("CustomerProfile.asp?GetHTML=" + source + "&Filter=" + filter, false));
            break;

        case XML_VALIDATE_STREET:
            processXMLHttpResult(loadXMLDoc("CustomerProfile.asp?GetHTML=" + source + "&Filter=" + filter, false));
            break;
    }
}

function checkEmailField(control)
{
    var footerPosition = 0;
    var errorHeight = 1;

    if (checkField(EMAIL_REGEXP, control, "Email", true, false))
    {
        matchUsername();
        control.className = "";
        setErrmsg("", "");
        errorHeight--;
    }

    footerPosition = calculateFooterPostition(errorHeight);
    setFooterPosition(footerPosition);
}

function isPostcodePlaceShowing()
{
    return isPanelShowing("divPostcodeSelectPlace");
}

function isAddressPlaceShowing()
{
    return isPanelShowing("divAddressSelectPlace");
}

function checkConfirmationFields(value)
{
    switch (value)
    {
        case "Fax":
            resetField(document.getElementById("Email"));
            break;

        case "Email":
            resetField(document.getElementById("FaxAreaCode"));
            resetField(document.getElementById("FaxNum"));
            break;

        case "Post":
            resetField(document.getElementById("Email"));
            resetField(document.getElementById("FaxAreaCode"));
            resetField(document.getElementById("FaxNum"));
            break;
    }

    document.getElementById("NotifyType").value = value;
}

function resetField(control)
{
    if (control.value == "")
        control.className = ""
}

function resetForm()
{
    document.frmNewUser.reset();
    setErrmsg("", "");

    closePanel("divPostcodeSelectPlace");
    closePanel("divAddressSelectPlace");

    for (var index = 0; index < document.frmNewUser.elements.length; index++)
    {
        var element = document.frmNewUser.elements[index];

        if (element.className = "err")
            element.className = "";
    }
}

function closePanel(panel)
{
    displaySection(panel, false);
    setFooterPosition(calculateFooterPostition(0));
}

function setFooterPosition(top)
{
    document.getElementById("divFooterPlace").style.top = top + "px";
}

function goBack(destination)
{
    document.getElementById("frmNewUser").action = destination;
    document.getElementById("frmNewUser").submit();
}

function selectRegisteredUser(row, username, userId)
{
    if (document.getElementById("tblFoundUsers"))
    {
        var table = document.getElementById("tblFoundUsers");
        var rows = table.getElementsByTagName("tr");

        for (var index = 1; index < rows.length; index++)
            rows[index].className = "rowunselect";

        rows[row].className = "rowselect";
        registeredUserUsername = username;
        registeredUserUserId = userId;
    }
}

function init()
{
    displaySection("divLogoutButton", isLoggedIn);
    displaySection("spanUsernameDisplay", isLoggedIn);
    displaySection("divTerms", !isLoggedIn);

    if (parseInt(createSuccess) == 1)
    {
        if (isOperator)
        {
            alert("Your registration has been completed successfully and you'll now be taken to the customer details page.");
            window.open(windowOpen, "_top");
        }
        else
        {
            alert("Your registration has been completed successfully and you'll now be taken back to the login page.");
            window.open("../logout.asp", "_top");
        }
    }

    // Setup phone entries
    document.getElementById("WorkNumber").onkeydown = chkKeyNumericNoDecimal;
    document.getElementById("MobileSMS").onkeydown = chkKeyNumericNoDecimal;
    document.getElementById("FaxNum").onkeydown = chkKeyNumericNoDecimal;

    if (trim(errmsg) != "")
    {
        document.getElementById("divErrmsg").scrollIntoView(true);
        showErrorPanelOnLoad(errmsg);
        document.getElementById("divErrmsg").style.display = "";
    }
    
    if (parseInt(updateSuccess) == 1)
        setErrorPanelTitle("");

    if (isPanelShowing("divFoundUsers"))
    {
        document.getElementById("CheckForRegisteredUsers").value = "0";
        setFooterPosition(DEFAULT_FOOTER_TOP - 70);
        document.getElementById("chkTerms").checked = true;
    }
}

function goPretendBack()
{
    document.getElementById("CheckForRegisteredUsers").value = "1";
    displaySection("divFoundUsers", false);
    displaySection("divMain", true);
    setFooterPosition(FOOTER_POSITION);
}

function checkUsernameBeforeResendingPassword(username, userId)
{
    if (trim(username).length > 0)
    {
        if (!isOperator)
        {
            // Goto Resend Password Page
            document.getElementById("NewRegResendUsername").value = username;
            document.getElementById("frmNewUser").action = "../ForgotPassword.asp";
            document.getElementById("frmNewUser").submit();
        }
        else
        {
            window.open("../Login.asp?UserId=" + userId + operatorURL + mediumURL, "_top");
        }
    }
    else
    {
        alert("Please select a previously registered user before trying to resend their password.");
    }
}

function resendPassword(username)
{
    if (pleaseUpdate)
    {
        alert("Please update this profile before attempting to resend password.");
    }
    else
    {
        xmlSource = XML_PASSWORD;
        setErrmsg("Retrieving password details...", "");
        setFooterPosition(calculateFooterPostition(1));
        setErrorPanelTitle("");
        document.getElementById("divLoginDetails").scrollIntoView(true);

        loadXMLDoc("CustomerProfile.asp?Resend=True&Username=" + username, true);

        if (isPanelShowing("divFoundUsers"))
            setFooterPosition(DEFAULT_FOOTER_TOP - 70);
    }

    return true;
}

function processXMLHttpResult(responseText)
{
    switch (xmlSource)
    {
        case XML_PASSWORD:
            if (responseText == "SUCCESS")
                setErrmsg("Password sent successfully.", "");
            else
                setErrmsg("Error sending password.", "");

            setFooterPosition(calculateFooterPostition(1));
            setErrorPanelTitle("");
            break;

        case XML_POSTCODE:
            fillInPostcode(responseText);
            setErrmsg("");
            setFooterPosition(calculateFooterPostition(0));
            break;

        case XML_VALIDATE_STREET:
            if (responseText.indexOf("Warning") == -1)
            {
                processStreetResult(responseText);
                setErrmsg("");
            }
            else
            {
                setErrmsg(responseText);
            }
            
            setFooterPosition(calculateFooterPostition(1));
            break;
    }
}

function processXMLHttpResultError()
{
    switch (xmlSource)
    {
        case XML_PASSWORD:
            setErrmsg("Error contacting server.", "");
            break;

        case XML_POSTCODE:
            setErrmsg("Error retrieving postcode.");
            break;

        case XML_VALIDATE_STREET:
            setErrmsg("Error validating street.");
            break;
    }

    setErrorPanelTitle("");
}

function matchUsername()
{
    if (document.getElementById("Username").value == "")
        document.getElementById("Username").value = document.getElementById("Email").value;
}

function checkAddress(errMsg)
{
    var value;

    if (trim(document.getElementById("StreetNo").value) == "" && trim(document.getElementById("AddressPrefix").value) == "")
        value = !isInputFieldEmpty(document.getElementById("StreetNo"));
    else
        document.getElementById("StreetNo").className = "valid";

    if (left(document.frmNewUser.AddressPrefix.value.toUpperCase(), 2) == "PO" ||
            left(document.frmNewUser.AddressPrefix.value.toUpperCase(), 2) == "RD" ||
            left(document.frmNewUser.AddressPrefix.value.toUpperCase(), 3) == "RFN")
    {
	    value = !isInputFieldNotEmpty(document.frmNewUser.StreetNo);
	    value = !isInputFieldNotEmpty(document.frmNewUser.StreetName) && value;
	    value = !isInputFieldNotEmpty(document.frmNewUser.StreetType) && value;

        if (!value)
        {
	        errMsg += "Please ensure no values are entered in for Street No, Name and Type for a PO BOX type address.<br />";
	    }
    }

	value = !isInputFieldEmpty(document.frmNewUser.Suburb);
	value = !isInputFieldEmpty(document.frmNewUser.Region);
	value = !isInputFieldEmpty(document.frmNewUser.Postcode);

	return errMsg;
}

function submitform()
{
	var mandatory = true;
	var regExp_valid = true;
	var email_valid = true;
	var email_match = true;

	var password_length = true;
	var password_match = true;
	var password_entered = true;
	var term_checked = true;
	var errorMessage = "";

    var notifyType = getRadioButtonValue(document.frmNewUser.SendConfirmationBy);

    document.frmNewUser.FirstName.value = convertProperCustProfile(ConvertProperNew(trim(document.frmNewUser.FirstName.value)));
    document.frmNewUser.LastName.value = convertProperCustProfile(ConvertProperNew(trim(document.frmNewUser.LastName.value)));

	mandatory = !isInputFieldEmpty(document.frmNewUser.UserType);
	mandatory = !isInputFieldEmpty(document.frmNewUser.FirstName);
	mandatory = !isInputFieldEmpty(document.frmNewUser.LastName);

    errorMessage = checkAddress(errorMessage);

	mandatory = !isInputFieldEmpty(document.frmNewUser.WorkAreaCode);
	mandatory = !isInputFieldEmpty(document.frmNewUser.WorkNumber);

    mandatory = !isInputFieldEmpty(document.frmNewUser.Occupation);
    mandatory = !isInputFieldEmpty(document.frmNewUser.Affiliation);

    if (hasSurvey)
    {
	    mandatory = !isInputFieldEmpty(document.frmNewUser.Referral);
	    mandatory = !isInputFieldEmpty(document.frmNewUser.OperationType);
    }

	mandatory = !isInputFieldEmpty(document.frmNewUser.lstPassRemindQues);
	mandatory = !isInputFieldEmpty(document.frmNewUser.txtAnswer);

    if (mandatoryEmail)
	    mandatory = !isInputFieldEmpty(document.frmNewUser.Email);

    if (mandatoryUsername)
        mandatory = !isInputFieldEmpty(document.frmNewUser.Username);

	mandatory = checkFormValidation("frmNewUser");
    setPostalAddress();

    if (isLoggedIn)
    {
        term_checked = true;
	}
	else if (mandatory)
	{
    	if (trim(document.frmNewUser.Email.value.toUpperCase()) != trim(document.frmNewUser.OldEmail.value.toUpperCase()))
	    	 mandatory = !isInputFieldEmpty(document.frmNewUser.ConfirmEmail);

	    term_checked = isCheckBoxChecked(document.frmNewUser.chkTerms, "You must agree to term of use", true);    

        if (trim(document.frmNewUser.Username.value.toUpperCase()) != trim(document.frmNewUser.OldUsername.value.toUpperCase()))
        {
            if (trim(document.frmNewUser.Password.value) == "")
            {
                document.frmNewUser.Password.className = "err";
                password_entered = false;
            }
        }
	}

	regExp_valid = checkField(ALP_REGEXP, document.frmNewUser.FirstName, "First Name", false, true);
	regExp_valid = checkField(ALP_REGEXP, document.frmNewUser.LastName, "Last Name", false, true);
	regExp_valid = checkField(ALP_REGEXP, document.frmNewUser.Suburb, "Suburb", false, true);
	regExp_valid = checkField(PHONE_REGEXP, document.frmNewUser.WorkAreaCode, "Primary Area Code", false, true);
	regExp_valid = checkField(PHONE_REGEXP, document.frmNewUser.WorkNumber, "Primary Phone", false, true);

	if (trim(document.frmNewUser.MobileSMS.value) != "")
		regExp_valid = checkField(PHONE_REGEXP, document.frmNewUser.MobileSMS, "Mobile\/SMS", false, true);

    if (trim(document.frmNewUser.Email.value) != "")
    {
	    email_valid = checkField(EMAIL_REGEXP, document.frmNewUser.Email, "Email", true, true);

	    if (email_valid && trim(document.frmNewUser.Email.value.toUpperCase()) != trim(document.frmNewUser.OldEmail.value.toUpperCase()))
		    email_match = check_match(document.frmNewUser.Email, document.frmNewUser.ConfirmEmail, "Email Addresses", true);
	}

	regExp_valid = checkFormValidation("frmNewUser");

    var passwordLength = document.frmNewUser.Password.value.length;

    if (password_entered)
    {
	    if (passwordLength < 6 && passwordLength > 0)
	    {
		    document.frmNewUser.Password.className = "err";
		    char_invalid = char_invalid + " Password,";
		    password_length = false;
	    }
	    else
	    {
		    regExp_valid = checkField(PWD_REGEXP, document.frmNewUser.Password, "Password", true, true);

		    if (regExp_valid)
			    password_match = check_match(document.frmNewUser.Password, document.frmNewUser.ConfirmPassword, "Passwords", true);
	    }
    }

	if (!mandatory)
		errorMessage += "Please complete the highlighted mandatory fields.<br />";

	if (!term_checked)
		errorMessage += "You must agree to terms of use.<br />";

    if (isLoggedIn || isOperator)
    {
        switch (notifyType)
        {
            case "Email":
                if (isInputFieldEmpty(document.getElementById("Email")))
		            errorMessage += "Please enter a valid email address as you have selected <b>Email</b> as your preferred communication method." 
                                    + "  Alternatively, you can proceed to the Enquiry Settings screen and choose another communication method.<br />";

                setRadioButtonClass(document.frmNewUser.SendConfirmationBy, "");
                break;

            case "Fax":
                if (isInputFieldEmpty(document.getElementById("FaxNum")) || isInputFieldEmpty(document.getElementById("FaxAreaCode")))
		            errorMessage += "Please enter a valid fax number as you have selected <b>Fax</b> as your preferred communication method." 
                                    + "  Alternatively, you can proceed to the Enquiry Settings screen and choose another communication method.<br />";
                
                setRadioButtonClass(document.frmNewUser.SendConfirmationBy, "");
                break;

            case "Post":
                if (document.getElementById("PostalAddress").value == "")
		            errorMessage += "Please enter a valid street address as you have selected <b>Post</b> as your preferred communication method." 
                                    + "  Alternatively, you can proceed to the Enquiry Settings screen and choose another communication method.<br />";

                setRadioButtonClass(document.frmNewUser.SendConfirmationBy, "");
                break;

            default:
                errorMessage += "Please choose a medium to receive confirmations.<br />";
                setRadioButtonClass(document.frmNewUser.SendConfirmationBy, "err");
                break;
        }
    }

	if (!regExp_valid)
	{	
	    if (errorMessage == "")
			errorMessage = "Highlighted fields contain invalid characters.";
		else
			errorMessage += "<br />Fields:" + char_invalid.substr(0, char_invalid.length - 1) + " contain invalid characters.";
	}

	if (!email_valid)
		errorMessage += "<br />Email is invalid.";

	if (!email_match)
		errorMessage += "<br />Email addresses don\'t match.";

    if (!password_entered)
        errorMessage += "<br />Please enter in a password.";

	if (!password_length)
		errorMessage += "<br />Password must be at least 6 characters in length and contain both letters and numbers.";

	if (!password_match)
		errorMessage += "<br />Passwords don\'t match.";

	if (errorMessage != "")
	{
        showErrorPanelOnLoad(errorMessage);
		return false;
	}

	setErrmsg("");
	document.frmNewUser.submit();
}

function showErrorPanelOnLoad(errorMessage)
{
    var errors = errorMessage.split('<br').length;
    setErrmsg(errorMessage);
    setFooterPosition(calculateFooterPostition(errors));
	setErrorPanelTitle("Action required.");
}

function calculateFooterPostition(errors)
{
    var buffer = 0;
    var searchHeight = 0;
    var errorHeight = 0;
    
    if (pageHasError())
    {
        buffer = FOOTER_POSITION_BUFFER;

        if (errors > 0)
        {
            //errors++;
            errorHeight = ERROR_PLACE_HEIGHT + (errors * ERROR_MSG_HEIGHT);
        }
    }

    if (isPostcodePlaceShowing() || isAddressPlaceShowing())
    {
        if (isPostcodePlaceShowing() && isAddressPlaceShowing())
            searchHeight = (SEARCH_PLACE_HEIGHT * 2) + 10;
        else
            searchHeight = SEARCH_PLACE_HEIGHT;
    }

    return FOOTER_POSITION + buffer + errorHeight + searchHeight;
}

function isCheckBoxChecked(control, sMessage, isSubmission)
{
	if (!control.checked)
	{
		control.className = "err";

		if (!isSubmission)
		{
		    setErrmsg("You must agree to" + sMessage);
		    setErrorPanelTitle("Action required.");
        }

		return false;
	}

	control.className = "valid";

	if (!isSubmission)
	    setErrmsg("");

	return true;
}

function Password_OnBlur(objTextbox)
{
	if (objTextbox.value.length < 6 && trim(objTextbox.value) != "")
	{
		objTextbox.className = "err";
		setErrmsg("Password must be at least 6 characters in length and contain both letters and numbers.");
		setErrorPanelTitle("Action required.");
		setFooterPosition(calculateFooterPostition(1));

		return false;
	}
	else if (!checkField(PWD_REGEXP, objTextbox, "Password", true, false))
	{
		objTextbox.className = "err";
		setErrmsg("Passwords must contain both letters and numbers and no special characters.");
		setErrorPanelTitle("Action required.");
		setFooterPosition(calculateFooterPostition(1));

		return false;
	}

	objTextbox.className = "valid";
	setErrmsg("");

	return true;
}

function SetMailingName()
{
	var userType = "";

	if (document.frmNewUser.UserType.value.toUpperCase() != "NULL" && document.frmNewUser.UserType.value != null)
		userType = document.frmNewUser.UserType.value;

	document.frmNewUser.MailingName.value = ConvertProperNew(userType) 
	                                        + " "
	                                        + convertProperCustProfile(document.frmNewUser.FirstName.value) 
	                                        + " "
	                                        + convertProperCustProfile(document.frmNewUser.LastName.value);
}

function setPostalAddress()
{
	if ((document.frmNewUser.AddressPrefix.value == "" || document.frmNewUser.AddressPrefix.value.indexOf("/") != -1 ) && document.frmNewUser.StreetNo.value == "")
	{
		document.frmNewUser.PostalAddress.value = "";
	}
	else
	{
		if (document.frmNewUser.AddressPrefix.value == "" || document.frmNewUser.AddressPrefix.value.indexOf("/") > -1)
			document.frmNewUser.PostalAddress.value = cSecureDelim1 + document.frmNewUser.StreetNo.value;
		else if (document.frmNewUser.StreetNo.value == "")
			document.frmNewUser.PostalAddress.value =  document.frmNewUser.AddressPrefix.value;
		else
			document.frmNewUser.PostalAddress.value = document.frmNewUser.AddressPrefix.value + cSecureDelim1 + document.frmNewUser.StreetNo.value;
	}
}

function generateRandomPassword()
{
    var randomPassword = getPassword(7, "", true, true, false, true, true, false);
    document.getElementById("Password").value = randomPassword;
    document.getElementById("ConfirmPassword").value = randomPassword;
    document.getElementById("divLoginDetails").scrollIntoView(true);
    Password_OnBlur(document.getElementById("Password"));
    pleaseUpdate = true;

    return true;
}

function thisForm()
{
    return document.getElementById("frmNewUser");
}