/* ####### VARIABLE SANITY AND CONVERSION FUNCTIONS ####### */

/* global variable for valid area codes */
var validAreaCode = new Array("201",
        "202", "203", "204", "205", "206", "207", "208", "209", "210", "212", "213", "214", "215", "216", "217", "218",
        "219", "224", "225", "228", "229", "231", "234", "239", "240", "242", "246", "248", "250", "251", "252", "253",
        "254", "256", "260", "262", "264", "267", "268", "269", "270", "276", "281", "284", "289", "301", "302", "303",
        "304", "305", "306", "307", "308", "309", "310", "312", "313", "314", "315", "316", "317", "318", "319", "320",
        "321", "323", "325", "330", "334", "336", "337", "339", "340", "345", "347", "351", "352", "360", "361", "386",
        "401", "402", "403", "404", "405", "406", "407", "408", "409", "410", "412", "413", "414", "415", "416", "417",
        "418", "419", "423", "425", "430", "432", "434", "435", "440", "441", "443", "450", "469", "470",
        "473", "478", "479", "480", "484", "501", "502", "503", "504", "505", "506", "507", "508", "509", "510", "512",
        "513", "514", "515", "516", "517", "518", "519", "520", "530", "540", "541", "551", "557", "559", "561", "562",
        "563", "567", "570", "571", "573", "574", "580", "585", "586", "601", "602", "603", "604", "605", "606", "607",
        "608", "609", "610", "612", "613", "614", "615", "616", "617", "618", "619", "620", "623", "626", "630", "631",
        "636", "641", "646", "647", "649", "650", "651", "660", "661", "662", "664", "670", "671", "678", "682", "684",
        "701", "702", "703", "704", "705", "706", "707", "708", "709", "712", "713", "714", "715", "716", "717", "718",
        "719", "720", "724", "727", "731", "732", "734", "740", "754", "757", "758", "760", "763", "765", "767", "769",
        "770", "772", "773", "774", "775", "778", "780", "781", "784", "785", "786", "787", "800", "801", "888", "877", "866", "802", "803", "804",
        "805", "806", "807", "808", "809", "810", "812", "813", "814", "815", "816", "817", "818", "819", "828", "829",
        "830", "831", "832", "843", "845", "847", "848", "850", "856", "857", "858", "859", "860", "862", "863", "864",
        "865", "867", "868", "869", "870", "876", "878", "901", "902", "903", "904", "905", "906", "907", "908", "909", "910",
        "912", "913", "914", "915", "916", "917", "918", "919", "920", "925", "928", "931", "936", "937", "939", "940",
        "941", "947", "949", "951", "952", "954", "956", "970", "971", "972", "973", "978", "979", "980", "985", "989");

/* Invalid zipcodes comprised of 5 identical digits */
    var ALL_ZEROES_ZIPCODE  = "00000";
    var ALL_ONES_ZIPCODE    = "11111";
    var ALL_THREES_ZIPCODE  = "33333";
    var ALL_SIXES_ZIPCODE   = "66666";
    var ALL_SEVENS_ZIPCODE  = "77777";
    var ALL_EIGHTS_ZIPCODE  = "88888";
    var ALL_NINES_ZIPCODE   = "99999";
    var INVALID_ZIPCODE_00011	= "00011";
    var INVALID_ZIPCODE_00001	= "00001";

/* global variable for valid area codes with toll free numbers added */
var validAreaCodeWithFreeNumbers = validAreaCode.concat("800", "888", "877", "866");

/* global variable for sidepanel height constant */
var sidePanelExpanded = false;

function trimString(strIn) {
    if (/^\s/.test(strIn)) {
        strIn = strIn.replace(/^\s{1,}/, "");
    }
    if (/\s$/.test(strIn)) {
        strIn = strIn.replace(/\s{1,}$/, "");
    }
    return strIn;
}
function getIntegerString(strIn) {
    return strIn.replace(/[^0-9]/g, "");
}
function getAlphabetString(strIn) {
    return strIn.replace(/[^a-zA-Z]/g, "");
}
function getInteger(vNum) {
    vNum = getIntegerString(vNum.toString());
    if (vNum == "") {
        vNum = 0;
    }
    return Number(vNum);
}
function getDecimalString(strIn) {
    strIn = strIn.replace(/[^0-9\.]/g, "");
    var iPoint = strIn.indexOf(".");
    if (iPoint > -1) {
        strIn = strIn.substring(0, iPoint + 1) + getIntegerString(strIn.substring((iPoint + 1), strIn.length));
    }
    return strIn;
}
function addCommasToNumString(strIn) {
    var arrTemp = strIn.split("");
    var i = strIn.length - 4;
    var iPoint = strIn.indexOf(".");
    if (iPoint > -1) {
        i -= (strIn.length - iPoint);
    }
    for (i; i >= 0; i -= 3) {
        arrTemp[i] += ",";
    }
    return arrTemp.join("");
}

/* ####### FORM FIELD FILTERING FUNCTIONS ####### */
function filterAlphabet(hField) {
    hField.value = getAlphabetString(hField.value);
}
function filterInteger(hField) {
    hField.value = getIntegerString(hField.value);
}
function filterIntegerAddCommas(hField) {
    hField.value = addCommasToNumString(getIntegerString(hField.value));
}
function filterDecimal(hField) {
    hField.value = getDecimalString(hField.value);
}
function filterDecimalAddCommas(hField) {
    hField.value = addCommasToNumString(getDecimalString(hField.value));
}


/* ####### SPECIAL ####### */

function autoTab(hField, event) {
    // Automatically focuses the next form field if you reach the maxlength of a text input while typing.
    if ("0,8,9,16,17,18,38,39,40,46".indexOf(event.keyCode.toString()) != -1) {
        return;
    }
    if (hField.value.length < getInteger(hField.getAttribute("maxlength"))) {
        return;
    }
    var form = hField.form;
    try{
        for (var i = 0; i < form.elements.length; i++) {
            if ((hField == form.elements[i]) && (i < form.elements.length - 1)) {
                form.elements[i + 1].focus();
                return;
            }
        }
    }
    catch(e){
        try{
            var err = new Object();
            err.errorLocation = "autoTab";
            err.functionParamField = hField.name;
            err.error = e;
            lmbUtil.log(err);
        }
        catch(le){}
    }
}

function validationAlert(strAlert, hField) {
    // Displays an alert, focuses a form field, and returns false.
    alert(strAlert);
    try {
        hField.focus();
    } catch(ex) {
    }
    return false;
}

function refreshSelectbox(hSelectbox, arrOptions) {
    // Repopulates a form selectbox.
    // param arrOptions is a two-dimensional array containing option text and values.
    var iSelected = (hSelectbox.selectedIndex) ? hSelectbox.selectedIndex : 0;
    hSelectbox.options.length = 0;
    for (var i = 0; i < arrOptions.length; i++) {
        hSelectbox.options[hSelectbox.options.length] = new Option(arrOptions[i][0], arrOptions[i][1], false, false);
        // text, value, defaultSel, selected
    }
    if ((iSelected != -1) && (hSelectbox.options.length > iSelected)) {
        hSelectbox.selectedIndex = iSelected;
    }
}

function isValueInSelectbox(hSelectbox, strValue) {
    for (var i = 0; i < hSelectbox.options.length; i++) {
        if (hSelectbox.options[i].value == strValue) {
            return true;
        }
    }
    return false;
}

function isNotHiddenFormField(form, strName) {
    // Tells you if a non-hidden field exists in a form.
    var type;
    var field = form.elements[strName];
    if (field && (typeof(field) == "object")) {
        try {
            type = field.getAttribute("type");
        } catch(ex) {
            // probably a radio button group (no attribute)
            return true;
        }
        if ((type) && (type.toLowerCase() == "hidden")) {
            return false;
        }
        return true;
    }
    return false;
}

function getFormFieldValue(hField) {
    if (!hField) {
        return undefined;
    }
    try {
        if (hField.type) {
            if (hField.type == "radio") {
                return getRadioValue(hField.form.elements[hField.name]);
            } else if (hField.type == "select-multiple") {
                return getMultipleSelectBoxValues(hField);
            } else {
                return hField.value;
            }
        }
    } catch (ex) {
    }
    try {
        if (hField.length && hField[0] && (hField[0].type == "radio")) {
            return getRadioValue(hField[0].form.elements[hField[0].name]);
        }
    } catch(ex) {
    }
    return undefined;
}

function setFormFieldValue(hField, selectedValue) {
    if (!hField) {
        return;
    }
    try {
        if (hField.type) {
            if (hField.type == "radio") {
                setRadioValue(hField.form.elements[hField.name], selectedValue);
                return;
            } else {
                hField.value = selectedValue;
                return;
            }
        }
    } catch(ex) {
    }
    try {
        if (hField.length && hField[0] && (hField[0].type == "radio")) {
            setRadioValue(hField[0].form.elements[hField[0].name], selectedValue);
            return;
        }
    } catch(ex) {
    }
}

function getRadioValue(hRadioGroup) {
    // Gets the selected value of a radio button group. If no radio button is selected, returns an empty string.
    for (var i = 0; i < hRadioGroup.length; i++) {
        if (hRadioGroup[i].checked) {
            return hRadioGroup[i].value;
        }
    }
    return "";
}

function setRadioValue(hRadioGroup, selectedValue) {
    // Sets the checkmark for a radio button group.
    for (var i = 0; i < hRadioGroup.length; i++) {
        if (hRadioGroup[i].value == selectedValue) {
            hRadioGroup[i].checked = true;
            return;
        }
    }
}

function getMultipleSelectBoxValues(hSelect) {
    var i, option, arrSelected = new Array();
    while (hSelect.selectedIndex >= 0) {
        arrSelected[arrSelected.length] = hSelect.selectedIndex;
        hSelect.options[hSelect.selectedIndex].selected = false;
    }
    for (i = 0; i < arrSelected.length; i++) {
        option = hSelect.options[arrSelected[i]];
        option.selected = true;
        arrSelected[i] = option.value;
    }
    return arrSelected;
}

function getFormValueQueryString(form) {
    var i, j, val, name, arrParams = new Array();
        if(form.elements != null) {
            for (i = 0; i < form.elements.length; i++) {
                try {
                    if (((form.elements[i].type == "checkbox") || (form.elements[i].type == "radio"))
                            && (form.elements[i].checked == false)) {
                        continue;
                    }
                } catch(ex) {
                    alert(ex);
                }
                name = form.elements[i].name;
                val = getFormFieldValue(form.elements[i]);
                if (typeof(val) == "object") {
                    for (j = 0; j < val.length; j++) {
                        val[j] = name + "=" + escape(val[j]);
                    }
                    arrParams[i] = val.join("&");
                } else {
                    arrParams[i] = name + "=" + escape(val);
                }
            }
        }
    return arrParams.join("&");
}

function pluralize(num, singular, plural) {
    return (num == 1) ? singular : plural;
}

/* ####### STRING VALIDATION ####### */
function trimString (str) {
  str = this != window? this : str;
  return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
}

function isValidFirstName(strName) {

    if (trimString(strName).length ==0) {
        return false;
    }

    if (/[^A-Za-z -]/.test(strName)) {
        return false;
    }

    if (/^-/.test(strName)) {
        return false;
    }

    var dashOccurrences = strName.match(/-/g);
    if ((dashOccurrences != null) && (dashOccurrences.length > 1)) {
        return false;
    }

    return true;
}

function isValidLastName(strName) {

    if (trimString(strName).length ==0) {
        return false;
    }

    if (/[^A-Za-z -]/.test(strName)) {
        return false;
    }

    if (/^-/.test(strName)) {
        return false;
    }

    var dashOccurrences = strName.match(/-/g);
    if ((dashOccurrences != null) && (dashOccurrences.length > 1)) {
        return false;
    }

    return true;
}

function isValidStreetAddress(strAddress) {
    if (strAddress.length < 3) {
        return false;
    }
    if (strAddress.replace(/[^0-9]/g, "").length < 1) {
        return false;
    }
    if (strAddress.replace(/[^A-Za-z]/g, "").length < 1) {
        return false;
    }
    return true;
}

function isValidCity(strCity) {
    if (strCity.length < 2) {
        return false;
    }
    if (/[^A-Za-z -\.]/.test(strCity)) {
        return false;
    }
    return true;
}

/* NPA validator without free numbers */
function isValidPhoneNPA(strNPA) {
    if (isValidPhoneAreaCode(strNPA, validAreaCode)) {
        return true;
    }
    return false;
}

/* NPA validator with free numbers */
function isValidPhoneNPAWithFreeNumbers(strNPA) {
    if (isValidPhoneAreaCode(strNPA, validAreaCodeWithFreeNumbers)) {
        return true;
    }
    return false;
}

/* inner function.  Do not use directly  use isValidPhoneNPA or isValidPhoneNPAWithFreeNumbers*/
function isValidPhoneAreaCode(strNPA, areaCodes) {

    if (strNPA.length < 3) {
        return false;
    }
    if (/[^0-9]/.test(strNPA)) {
        return false;
    }
    if (/^[01]/.test(strNPA)) {
        return false;
    }
    for (var i = 0; i < areaCodes.length; i++) {
        if (strNPA == areaCodes[i])
            return true;
    }
    return false;
}


function isValidPhoneNXX(strNXX) {
    if (strNXX.length < 3) {
        return false;
    }
    if (/[^0-9]/.test(strNXX)) {
        return false;
    }
    if (/^[01]/.test(strNXX)) {
        return false;
    }
    return true;
}

function isValidEmail(strEmail) {
    var re = /^(([^<>&()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/

    if (strEmail.length < 5) {
        return false;
    }

    if (!strEmail.match(re)) {
        return false;
    }

    return true;
}

/* ####### GENERIC FORM VALIDATORS ####### */

function validateInput(hInput, minLength, inputDescription) {
    if (hInput.value.length == 0) {
        return validationAlert("Please enter " + inputDescription + ".", hInput);
    } else if (hInput.value.length < minLength) {
        return validationAlert("Please re-enter " + inputDescription + ".\n(The information you entered is incomplete.)", hInput);
    }
    return true;
}

function validateSelectbox(hSelectbox, strAlert) {
    if (hSelectbox.value.length == 0) {
        return validationAlert(strAlert, hSelectbox);
    }
    return true;
}

function validateComparison(hInput, strCompare, inputDescription, extraDescription) {
    if (hInput.value != strCompare) {
        return validationAlert("Please re-enter " + inputDescription + " " + extraDescription + ".", hInput);
    }
    return true;
}

function validateNumbersOnly(hInput, strAlert) {
    if (/[^0-9]/.test(hInput.value)) {
        return validationAlert(strAlert, hInput);
    }
    return true;
}

function validateIntegerInput(hInput, minLength, inputDescription) {
    if (!validateInput(hInput, minLength, inputDescription)) {
        return false;
    }
    if (!validateNumbersOnly(hInput, inputDescription)) {
        return false;
    }
    return true;
}


/* ####### FORM VALIDATION STRING CONSTANTS ####### */

var ErrorMsg = new Object();
ErrorMsg.VAR1 = "%VAR1%";
ErrorMsg.EMPTY_FIRSTNAME = "Please enter the First Name.";
ErrorMsg.INVALID_FIRSTNAME = "The First Name may only contain letters, a single hyphen, or spaces. Please update your entry.";
ErrorMsg.EMPTY_LASTNAME = "Please enter the Last Name.";
ErrorMsg.INVALID_LASTNAME = "The Last Name may only contain letters, a single hyphen, or spaces. Please update your entry.";
ErrorMsg.EMPTY_ADDRESS = "Please enter the Street Address.";
ErrorMsg.INVALID_ADDRESS = "The Street Address must contain letters and numbers. Please update your entry.";
ErrorMsg.EMPTY_CITY = "Please enter the City.";
ErrorMsg.INVALID_CITY = "The City may only contain letters, hyphens, or spaces. Please update your entry.";
ErrorMsg.EMPTY_PROPERTY_CITY = "Please enter the City.";
ErrorMsg.INVALID_PROPERTY_CITY = "The City may only contain letters, hyphens, or spaces. Please update your entry.";
ErrorMsg.EMPTY_CURRENT_CITY = "Please enter the City.";
ErrorMsg.INVALID_CURRENT_CITY = "The City may only contain letters, hyphens, or spaces. Please update your entry.";
ErrorMsg.UNSELECTED_STATE = "Please select the State.";
// Add this label to the preexisting ErrorMsg object
ErrorMsg.UNSELECTED_PROPERTY_COUNTY = "Please select the County.";
ErrorMsg.EMPTY_ZIPCODE = "Please enter the ZIP Code.";
ErrorMsg.INVALID_ZIPCODE = "The ZIP Code must be at least five numbers. Please enter a valid U.S. ZIP Code.";
ErrorMsg.INVALID2_ZIPCODE = "The ZIP Code may only contain numbers. Please update your entry.";
ErrorMsg.INVALID3_ZIPCODE = "Please enter a valid U.S. ZIP Code.";
ErrorMsg.EMPTY_PHONE_NPA = "Please enter the Phone Number Area Code.";
ErrorMsg.INVALID_PHONE_NPA = "The Phone Number Area Code must be a valid three-digit area code. Please update your entry.";
ErrorMsg.EMPTY_PHONE_NXX = "Please enter the first three digits of the Phone Number.";
ErrorMsg.INVALID_PHONE_NXX = "The Phone Number must begin with three numbers. Please update your entry.";
ErrorMsg.INVALID2_PHONE_NXX = "The Phone Number may not begin with a \"1\" or a \"0\". Please update your entry.";
ErrorMsg.EMPTY_PHONE_STATION = "Please enter the last four digits of the Phone Number.";
ErrorMsg.INVALID_PHONE_STATION = "The Phone Number must end with four numbers. Please update your entry.";
ErrorMsg.EMPTY_EMAIL = "Please enter the Email Address.";
ErrorMsg.INVALID_EMAIL = "You must enter a valid Email Address. Please update your entry.";
ErrorMsg.EMPTY_STREET_NUMBER = "Please enter the Street Number.";
ErrorMsg.EMPTY_STREET_NAME = "Please enter the Street Name.";
ErrorMsg.INVALID_STREET_NAME = "Please enter a valid Street Name.";
ErrorMsg.UNSELECTED_BEST_CALL_TIME = "Please select Best Time to Call.";
ErrorMsg.EMPTY_PREMATCH_NPA = "Please enter the Area Code.";
ErrorMsg.EMPTY_PROPERTY_AREA_CODE = "Please enter the Area Code.";
ErrorMsg.INVALID_PROPERTY_AREA_CODE = "The Area Code must be a valid three-digit area code. Please update your entry.";
ErrorMsg.EMPTY_YOUR_AREA_CODE = "Please enter the Area Code.";
ErrorMsg.INVALID_YOUR_AREA_CODE = "The Area Code must be a valid three-digit area code. Please update your entry.";
ErrorMsg.INVALID_PREMATCH_NPA = "The Area Code must be a valid three-digit area code. Please update your entry.";
ErrorMsg.RESTRICTED_PREMATCH_NPA = "Please enter the Area Code. No 800, 866, 877, 888 numbers please.";
ErrorMsg.UNSELECTED_ANNUAL_INCOME = "Please enter the Gross Annual Income.";
ErrorMsg.EMPTY_MONTHLY_DEBT = "Please enter the Minimum Monthly Debt Payments.";

ErrorMsg.INVALID_PHONE_NPA_SERVER_DAY = "Please enter a valid Preferred phone number.";
ErrorMsg.INVALID_PHONE_NPA_SERVER_NIGHT = "Please enter a valid Alternate phone number.";
ErrorMsg.INVALID_PHONE_NPA_SERVER_BOTH = "Please enter a valid Preferred and Alternate phone number.";


ErrorMsg.UNSELECTED_BIRTHYEAR = "Please select the Year of Birth.";



/* ####### SPECIFIC-USE FORM VALIDATORS ####### */

function validateFirstNameInput(hInput) {
    if (hInput.value.length == 0) {
        if(hInput.name.indexOf("coborrower") != -1){
            try{logHbError("MT_FNAME_COAP");}catch(ex){}
        }
        else{
            try{logHbError("MT_FNAME");}catch(ex){}
        }
        return validationAlert(ErrorMsg.EMPTY_FIRSTNAME, hInput);
    }
    if (!isValidFirstName(hInput.value)) {
        if(hInput.name.indexOf("coborrower") != -1){
            try{logHbError("INVLD_FNAME_COAPP");}catch(ex){}
        }
        else{
            try{logHbError("INVLD_FNAME");}catch(ex){}
        }
        return validationAlert(ErrorMsg.INVALID_FIRSTNAME, hInput);
    }
    return true;
}

function validateLastNameInput(hInput) {
    if (hInput.value.length == 0) {
        if(hInput.name.indexOf("coborrower") != -1){
            try{logHbError("MT_LNAME_COAPP");}catch(ex){}
        }
        else{
            try{logHbError("MT_LNAME");}catch(ex){}
        }
        return validationAlert(ErrorMsg.EMPTY_LASTNAME, hInput);
    }
    if (!isValidLastName(hInput.value)) {
        if(hInput.name.indexOf("coborrower") != -1){
            try{logHbError("INVLD_LNAME_COAPP");}catch(ex){}
        }
        else{
            try{logHbError("INVLD_LNAME");}catch(ex){}
        }
        return validationAlert(ErrorMsg.INVALID_LASTNAME, hInput);
    }
    return true;
}

function validateStreetAddressInput(hInput) {
    if(hInput.value.length == 0) {
        try{logHbError("MT_ADDR");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_ADDRESS, hInput);
    }
    if (!isValidStreetAddress(hInput.value)) {
        try{logHbError("INVLD_ADDR");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_ADDRESS, hInput);
    }
    return true;
}

function validateStreetNumberInput(hInput) {
    if (hInput.value.length == 0) {
        try{logHbError("MT_ST_NO");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_STREET_NUMBER, hInput);
    }
    return true;
}

function validateStreetNameInput(hInput) {
    if (hInput.value.length == 0) {
        try{logHbError("MT_ST_NAME");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_STREET_NAME, hInput);
    }

    if (hInput.value.replace(/[^A-Za-z]/g, "").length < 1) {
        try{logHbError("INVLD_ST_NAME");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_STREET_NAME, hInput);
    }
    return true;
}

function validateCityInput(hInput) {
    hInput.value = trimString(hInput.value);
    if (hInput.value.length == 0) {
        try{logHbError("MT_CITY");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_CITY, hInput);
    }
    if (!isValidCity(hInput.value)) {
        try{logHbError("INVLD_CITY");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_CITY, hInput);
    }
    return true;
}

function validatePropertyCityInput(hInput) {
    if (hInput.value.length == 0) {
        try{logHbError("MT_CITY");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_PROPERTY_CITY, hInput);
    }
    if (!isValidCity(hInput.value)) {
        try{logHbError("INVLD_CITY");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_PROPERTY_CITY, hInput);
    }
    return true;
}

function validateCurrentCityInput(hInput) {
    if (hInput.value.length == 0) {
        try{logHbError("MT_CITY");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_CURRENT_CITY, hInput);
    }
    if (!isValidCity(hInput.value)) {
        try{logHbError("INVLD_CITY");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_CURRENT_CITY, hInput);
    }
    return true;
}

function validateZipCodeInput(hInput) {

    if (hInput.value.length == 0) {
        try{logHbError("MT_ZIP");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_ZIPCODE, hInput);
    }
    if (hInput.value.length < 5) {
        try{logHbError("INVLD_ZIP");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_ZIPCODE, hInput);
    }
    if (/[^0-9]/.test(hInput.value)) {
        try{logHbError("INVLD_ZIP");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID2_ZIPCODE, hInput);
    }

    /*
    * Check for illegal zipcodes comprised of five identical numbers.
    *
    * Issue/Request #23360 - Lending verticals accept invalid zipcode
    */
    if ((hInput.value == ALL_ZEROES_ZIPCODE) || (hInput.value == ALL_ONES_ZIPCODE)
            || (hInput.value == ALL_THREES_ZIPCODE) || (hInput.value == ALL_SIXES_ZIPCODE)
            || (hInput.value == ALL_SEVENS_ZIPCODE) || (hInput.value == ALL_EIGHTS_ZIPCODE)
            || (hInput.value == ALL_NINES_ZIPCODE) || (hInput.value == INVALID_ZIPCODE_00011)
            || (hInput.value == INVALID_ZIPCODE_00001)) {
        try{logHbError("INVLD_ZIP");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID3_ZIPCODE, hInput);
    }
    return true;
}

function validatePrematchNPAInput(hInput) {
    if (hInput.value.length == 0) {
        try{logHbError("MT_PRE_NPA");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_PREMATCH_NPA, hInput);
    }
    if (hInput.value.length < 3) {
        try{logHbError("INVLD_PRE_NPA");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_PREMATCH_NPA, hInput);
    }
    if (!isValidPhoneNPA(hInput.value)) {
        try{logHbError("INVLD_PRE_NPA");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_PREMATCH_NPA, hInput);
    }
    if ((hInput.value == "800") || (hInput.value == "888") || (hInput.value == "877") || (hInput.value == "866")) {
        try{logHbError("INVLD_PRE_NPA");}catch(ex){}
        return validationAlert(ErrorMsg.RESTRICTED_PREMATCH_NPA, hInput);
    }
    return true;
}

function validateAreaCodeInput(hInput) {
    //only used in LHP 3201 for issue
    if (hInput.value.length == 0) {
        try{logHbError("MT_PRE_NPA");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_YOUR_AREA_CODE, hInput);
    }
    if (hInput.value.length < 3) {
        try{logHbError("INVLD_PRE_NPA");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_PREMATCH_NPA, hInput);
    }
    if (!isValidPhoneNPA(hInput.value)) {
        try{logHbError("INVLD_PRE_NPA");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_PREMATCH_NPA, hInput);
    }
    if ((hInput.value == "800") || (hInput.value == "888") || (hInput.value == "877") || (hInput.value == "866")) {
        try{logHbError("INVLD_PRE_NPA");}catch(ex){}
        return validationAlert(ErrorMsg.RESTRICTED_PREMATCH_NPA, hInput);
    }
    return true;
}

function validatePropertyAreaCodeInput(hInput) {
    if (hInput.value.length == 0) {
        try{logHbError("MT_PRE_NPA");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_PROPERTY_AREA_CODE, hInput);
    }
    if (hInput.value.length < 3) {
        try{logHbError("INVLD_PRE_NPA");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_PROPERTY_AREA_CODE, hInput);
    }
    return true;
}

function validateCurrentAreaCodeInput(hInput) {
    if (hInput.value.length == 0) {
        try{logHbError("MT_PRE_NPA");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_YOUR_AREA_CODE, hInput);
    }
    if (hInput.value.length < 3) {
        try{logHbError("INVLD_PRE_NPA");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_YOUR_AREA_CODE, hInput);
    }
    return true;
}


function validatePhoneNPAWithFreeNumbersInput(hInput, strPhoneType) {
    if (hInput.value.length == 0) {
        return validationAlert(ErrorMsg.EMPTY_PHONE_NPA.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    if (hInput.value.length < 3) {
        return validationAlert(ErrorMsg.INVALID_PHONE_NPA.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    if (!isValidPhoneNPAWithFreeNumbers(hInput.value)) {
        return validationAlert(ErrorMsg.INVALID_PHONE_NPA.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    return true;
}

function validatePhoneNPAInput(hInput, strPhoneType) {
    if (hInput.value.length == 0) {
        try{logHbError("MT_PHONE");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_PHONE_NPA.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    if (hInput.value.length < 3) {
        try{logHbError("INVLD_PHONE");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_PHONE_NPA.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    if (!isValidPhoneNPA(hInput.value)) {
        try{logHbError("INVLD_PHONE");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_PHONE_NPA.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    return true;
}

function validatePhoneNXXInput(hInput, strPhoneType) {
    if (hInput.value.length == 0) {
        try{logHbError("MT_NXX");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_PHONE_NXX.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    if (hInput.value.length < 3) {
        try{logHbError("INVLD_NXX");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_PHONE_NXX.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    if (/[^0-9]/.test(hInput.value)) {
        try{logHbError("INVLD_NXX");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_PHONE_NXX.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    if (/^[01]/.test(hInput.value)) {
        try{logHbError("INVLD_NXX");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID2_PHONE_NXX.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    return true;
}

function validatePhoneStationInput(hInput, strPhoneType) {
    if (hInput.value.length == 0) {
        try{logHbError("MT_STATION");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_PHONE_STATION.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    if (hInput.value.length < 4) {
        try{logHbError("INVLD_STATION");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_PHONE_STATION.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    if (/[^0-9]/.test(hInput.value)) {
        try{logHbError("INVLD_STATION");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_PHONE_STATION.replace(ErrorMsg.VAR1, strPhoneType), hInput);
    }
    return true;
}

function validateEmailInput(hInput) {
    hInput.value = trimString(hInput.value);
    if (hInput.value.length == 0) {
        try{logHbError("MT_EMAIL");}catch(ex){}
        return validationAlert(ErrorMsg.EMPTY_EMAIL, hInput);
    }
    if (!isValidEmail(hInput.value)) {
        try{logHbError("INVLD_EMAIL");}catch(ex){}
        return validationAlert(ErrorMsg.INVALID_EMAIL, hInput);
    }
    return true;
}


function validateBirthYear(hInput) {
    hInput.value = trimString(hInput.value);
    if (hInput.value.length == 0) {
        try{logHbError("MT_BIRTHYEAR");}catch(ex){}
        return validationAlert(ErrorMsg.UNSELECTED_BIRTHYEAR, hInput);
    }
    return true;
}





/* ####### DYNAMIC FORM FIELD FUNCTIONS ####### */

function interestRateBoxLogic(hBox, hDecimalBox) {
    // Disables the decimal box for interest dropdowns if the last whole number option (e.g. 10+) is selected.
    if (!hBox.options || !hDecimalBox.options) {
        return;
    }
    if (hBox.options.selectedIndex == (hBox.options.length - 1)) {
        hDecimalBox.value = "0";
        hDecimalBox.disabled = true;
    } else {
        try {
            if (hBox.getAttribute("lastSelectedIndex") == String(hBox.options.length - 1)) {
                hDecimalBox.value = "";
            }
        } catch(ex) {
        }
        hDecimalBox.disabled = false;
    }
    try {
        hBox.setAttribute("lastSelectedIndex", hBox.options.selectedIndex);
    } catch(ex) {
    }
}

function initOtherField(hHidden, hSelectbox, hTextbox, strOtherFormBlock) {
    // Initialize an "other value" selectbox/textbox combo (on page load).
    hSelectbox.value = hHidden.value;
    if (hSelectbox.value == hHidden.value) {
        hTextbox.value = "";
    } else {
        hSelectbox.value = "other";
        hTextbox.value = hHidden.value;
    }
    toggleOtherField(hSelectbox, strOtherFormBlock);
}

function toggleOtherField(hSelectbox, strOtherFormBlock) {
    // Shows another form block if an option with value "other" is selected in a SELECT form element.
    if (hSelectbox.value == "other") {
        showElement(strOtherFormBlock);
    } else {
        hideElement(strOtherFormBlock);
    }
}

function focusOtherField(hSelectbox, hTextbox) {
    // Focuses the appropriate field in a selectbox/textbox combo (for "other value" form validation).
    if (hSelectbox.value != "other") {
        hSelectbox.focus();
    } else {
        hTextbox.focus();
    }
}

function focusFirstEmptyField(form) {
    var hField;
    for (var i = 0; i < form.elements.length; i++) {
        hField = form.elements[i];
        try {
            if (isNotHiddenFormField(form, hField.name) && (getFormFieldValue(hField) == "")) {
                hField.focus();
                return;
            }
        } catch(ex) {
        }
    }
}

function toggleElementBasedOnField(element, field, listOfValues) {
    // Toggles the visibility of the specified element, checking the value of the specified field against
    // the list of specified values.  If any values in the list match the field value, the field is made
    // visible--otherwise, the field is hidden
    var fieldValue = getFormFieldValue(field);
    var show = false;
    for (var i = 0; i < listOfValues.length; i++) {
        if (listOfValues[i] == fieldValue) {
            show = true;
            break;
        }
    }

    if (show) {
        showElement(element);
    }
    else {
        hideElement(element);
    }
}

function setFieldNumbers(nextNum) {
    if (arguments.length < 2) {
        return nextNum;
    }
    var element;
    for (var i = 1; i < arguments.length; i++) {
        element = document.getElementById(arguments[i]);
        if (!element) {
            continue;
        }
        try {
            element.innerHTML = nextNum;
            nextNum++;
        } catch(ex) {
        }
    }
    return nextNum;
}

function fillSidePanel() {
    try {
        var fillheight = document.getElementById("sidepanelcell").offsetHeight;
        var sidePanelFillElement = document.getElementById("sidepanelbottom");
        var templist = document.getElementById("sidepaneldiv").childNodes;
        var sidePanelElementHeight = sidePanelFillElement.offsetHeight;
        for (var i = 0; i < templist.length; i++) {
            fillheight = fillheight - templist[i].offsetHeight;
        }
        fillheight = fillheight + sidePanelElementHeight;
        if ((fillheight) > sidePanelElementHeight) {
            sidePanelFillElement.style.height = (fillheight) + 'px';
        }
    } catch(ex) {
    }
}

function correctSidePanel(offset) {
    try {
        var fillheight = document.getElementById("sidepanelcell").offsetHeight;
        var sidePanelFillElement = document.getElementById("sidepanelbottom");
        var templist = document.getElementById("sidepaneldiv").childNodes;
        var sidePanelElementHeight = sidePanelFillElement.offsetHeight;
        for (var i = 0; i < templist.length; i++) {
            fillheight = fillheight - templist[i].offsetHeight;
        }
        fillheight = fillheight + sidePanelElementHeight;
        if ((fillheight) > sidePanelElementHeight && (sidePanelExpanded)) {
            sidePanelFillElement.style.height = (fillheight - offset) + 'px';
            document.getElementById("qefimage").style.paddingTop = (((fillheight - 98) / 2) - (offset)) + 'px';
        }
    } catch(ex) {
    }
}

function validatePg3AVMForm(form) {
    /*Purpose of Refinance Loan*/
    if(form.cashOut.value == "0") {

        if (!validateSelectbox(form.refi_purpose_alt, "Please select the Purpose of Your Refinance Loan.")) {
            try{logHbError("MT_PURPOSE");}catch(ex){}
            return false;
        }
    }
    /* Validate ANNUAL INCOME */
    if (form.annualIncome.value == "") {
        alert(ErrorMsg.UNSELECTED_ANNUAL_INCOME);
        form.annualIncome.focus();
        return false;
    }


    /* Validate STREET ADDRESS */
    if (!validateStreetAddressInput(form.address)) {
        return false;
    }

    /* Validate CITY */
    if (!validateCityInput(form.city)) {
        return false;
    }
     /*validate  state/city combo */
        if (!validateSelectbox(form.zipId, "Please select the State / City.")) {
            try{logHbError("MT_PURPOSE");}catch(ex){}
            return false;
        }
    /* Validate STATE */
    if (!validateSelectbox(form.stateCode, ErrorMsg.UNSELECTED_STATE)) {
        try{logHbError("MT_STATE");}catch(ex){}
        return false;
    }

    /* Validate ZIP CODE */
    if (!validateZipCodeInput(form.zipcode)) {
        return false;
    }

    /* Validate EMAIL */
    if (!validateEmailInput(form.email)) {
        return false;
    }

    if (!ValidatePage3Form(form)) {
        return false;
    }

    return true;
}

function validatePg3AVMLongForm(form) {

    /* Validate STREET NUMBER */
    if (!validateStreetNumberInput(form.streetNumber)) {
        return false;
    }
    /* Validate STREET */
    if (!validateStreetNameInput(form.street)) {
        return false;
    }

    /* Validate CITY */
    if (!validateCityInput(form.city)) {
        return false;
    }

    /* Validate STATE */
    if (!validateSelectbox(form.stateCode, ErrorMsg.UNSELECTED_STATE)) {
        return false;
    }

    /* Validate ZIP CODE */
    if (!validateZipCodeInput(form.zipcode)) {
        return false;
    }

    /* Validate EMAIL */
    if (!validateEmailInput(form.email)) {
        return false;
    }

    if (!ValidatePage3Form(form)) {
        return false;
    }

    return true;
}

function clearSSN() {
    if (window.document.application.socialSecurityNumber1.value != "") {
        window.document.application.socialSecurityNumber1.value = "XXX";
    }
    if (window.document.application.socialSecurityNumber2.value != "") {
        window.document.application.socialSecurityNumber2.value = "XX";
    }
    if (window.document.application.socialSecurityNumber3.value != "") {
        window.document.application.socialSecurityNumber3.value = "XXXX";
    }

    if (window.document.application.coborrowerSsn1.value != "") {
        window.document.application.coborrowerSsn1.value = "XXX";
    }
    if (window.document.application.coborrowerSsn2.value != "") {
        window.document.application.coborrowerSsn2.value = "XX";
    }
    if (window.document.application.coborrowerSsn3.value != "") {
        window.document.application.coborrowerSsn3.value = "XXXX";
    }
}

function  expandCoBorrower(form) {
    if (form.isCoborrower[0].checked) {
     showElement('coapplicantFields');
     }
}

