
var submitcount = 0;
var RequiredFields = Array();

var isNS = (!document.all);
var isIE = (document.all);
var isNS6 = isNS && document.getElementById;

var g_blRunValidation = false;
var g_strClientID = "";
var g_strSubVertical = "";

var CheckType = new Object();
CheckType.Required = 1;
CheckType.Numeric = 2;
CheckType.Alpha = 4;
CheckType.MinValue = 8;
CheckType.MaxValue = 16;
CheckType.MinLength = 32;
CheckType.MaxLength = 64;
CheckType.RegEx = 128;
CheckType.Zipcode = 256;
CheckType.Telephone = 512;
CheckType.SSN = 1024;
CheckType.Creditcard = 2048;
CheckType.Email = 4096;



// Set global validation flag so that misc buttons dont trigger validation
function SetValidationStatus(blStatus, strClientID, strSubVertical) {
    g_blRunValidation = blStatus;
    g_strClientID = strClientID;
    g_strSubVertical = strSubVertical;

    //alert(g_strSubVertical, g_blRunValidation);
}


if (document.captureEvents) {
    if (Event.KEYUP) //non IE
    {
        document.captureEvents(Event.KEYUP);
        document.captureEvents(Event.KEYPRESS);
        document.captureEvents(Event.CLICK);
    }
}

document.onkeypress = KeyPressHandler;
document.onkeyup = KeyPressHandler;
document.onclick = ClickHandler;

var previousObj = '';
var previousValue = '';
var eventObj;
var intended = /INPUT|TEXTAREA|SELECT|OPTION/; //Regular expression to highlight only form elements
var ErrorMsg = '';
var FirstErrorField = new Object();

var isBackspace = false;
var isTab = false;
var isShiftTab = false;
var isDel = false;
var isShift = false;

function getEvent(e) {
    var retval = false;
    if (!e) {
        retval = (window.event) ? window.event : false;
    }
    return retval;
}

function getKeyCode(e) {
    var retval = false;

    isBackspace = false;
    isTab = false;
    isShiftTab = false;
    isDel = false;
    isShift = false;

    try {
        if (typeof (e.keyCode) == 'number') {
            retval = e.keyCode; //IE, NS 6+, Mozilla 0.9+
        }
        else if (typeof (e.which) == 'number') {
            retval = e.which; //NS 4, NS 6+, Mozilla 0.9+, Opera
        }
        else if (typeof (e.charCode) == 'number') {
            retval = e.charCode; //also NS 6+, Mozilla 0.9+
        }
    }
    catch (ex) {
    }

    return retval;
}

function KeyUpHandler(e) {
    var retval = true;

    try {
        e = getEvent(e);
        if (!e) return retval;

        var keyCode = getKeyCode(e);
        if (!keyCode) return retval;
        var key = String.fromCharCode(keyCode)

        //		window.alert('KEYUP keycode ' + keyCode + ' and is key ' + key );	

        eventObj = isNS ? e.target : event.srcElement;
        previousValue = eventObj.value;

        switch (keyCode) {
            case 8:
                isBackspace = true;
                fieldAdvance(eventObj);
                break;
            case 9:
                isTab = true;
                isShift = (isIE) ? window.event.shiftKey : (e.modifiers & Event.SHIFT_MASK)
                break;
            case 46:
                isDel = true;
                break;
        }
    }
    catch (ex) {
    }
}

function KeyPressHandler(e) {
    var retval = true;

    e = getEvent(e);
    if (!e) return retval;

    var keyCode = getKeyCode(e);
    if (!keyCode) return retval;
    var key = String.fromCharCode(keyCode)

    //    window.alert('KEYPRESSED keycode ' + keyCode + ' and is key ' + key );	

    eventObj = isNS ? e.target : event.srcElement;

    previousValue = eventObj.value;

    retval = doValidateKey(eventObj, key);
    if (retval) {
        // Advance Field if @ Max Field Length. Good for Tel# & etc.
        if (eventObj.maxLength < 50000) {
            fieldAdvance(eventObj);
        }
        else {
            FieldActiveHighlight(eventObj);
        }
    }
    else {
        e.returnValue = false;
        e.cancelBubble = true;
    }

    return retval;

}

function ClickHandler(e) {
    eventObj = isNS ? e.target : event.srcElement;
    FieldActiveHighlight(eventObj);
}


function doValidateKey(theField, key) {
    var retval = true;

    try {
        if (theField) {
            if (theField.validkey != undefined) {
                switch (theField.validkey.toLowerCase()) {
                    case 'numeric':
                        retval = (!isNaN(key));
                        break;
                    case 'alpha':
                        retval = (isNaN(key));
                        break;
                }
            }
        }
    }
    catch (ex) {
    }

    return retval;
}

function setError(field, description) {
    if (typeof (description) != 'undefined') {
        ErrorMsg += '- ' + description + '\n';
    }
    FieldErrorHighlight(field);
    if (FirstErrorField == null) {
        FirstErrorField = field;
    }
}

function doValidateField(field, validation) {

    var isError = false;
    var thetype;
    var description;

    if (typeof (field) == 'undefined') return;

    thetype = field.type.toLowerCase();

    // check standard fields (field.name has a ":", while field.id has a "_")
    // thus
    // use field.id and strRegExp = "regExp = /" + g_strClientID + "\_" + "/gi;" 
    // or 
    // use field.name and strRegExp = "regExp = /" + g_strClientID + "\:" + "/gi;" 

    f = field.id

    //alert(g_strClientID)

    if (f.indexOf(g_strClientID) > -1) {
        strRegExp = "regExp = /" + g_strClientID + "\_" + "/gi;"
        eval(strRegExp)

        f = f.replace(regExp, "")
        //alert("regExp = " + regExp)
        //alert(f)
    }
    
    switch (f) {
        // panel 1 Email address validation 
        case "EMAdd":
            isError = !isEmail(field.value);
            description = 'Email Address';
            break;
        // panel 2 Email address validation 
        case "EM":
            isError = !isEmail(field.value);
            description = 'Email Address';
            break;
        case "FN":
            isError = !isName(field.value);
            description = 'First Name';
            break;
        case "LN":
            isError = !isName(field.value);
            description = 'Last Name';
            break;
        // panel 1 zip code validation 
        case "ZC":
            isError = !isZipcode(field.value);
            description = 'Zip Code';
            break;
        // panel 2 zip code validation 
        case "txtPC":
        case "PC":
            isError = !isZipcode(field.value);
            description = 'Zip Code';
            break;
        case "HT1":
            isError = !isPhoneAreaCode(field.value);
            description = 'Primary Phone Area Code';
            break;
        case "HT2":
            isError = !isPhonePrefix(field.value);
            if (field.value.indexOf("0") == 0 || field.value.indexOf("1") == 0)
                isError = true;
            if (field.value.indexOf("11") == 1)
                isError = true;
            description = 'Primary Phone Prefix';
            break;
        case "HT3":
            isError = !isPhoneSuffix(field.value);
            description = 'Primary Phone Suffix';
            break;
        case "OT1":
            if (!isEmpty(field.value))
                isError = !isPhoneAreaCode(field.value);
            description = 'Secondary Phone Area Code';
            break;
        case "OT2":
            if (!isEmpty(field.value))
                isError = !isPhonePrefix(field.value);
            if (field.value.indexOf("0") == 0 || field.value.indexOf("1") == 0)
                isError = true;
            if (field.value.indexOf("11") == 1)
                isError = true;
            description = 'Secondary Phone Prefix';
            break;
        case "OT3":
            if (!isEmpty(field.value))
                isError = !isPhoneSuffix(field.value);
            description = 'Secondary Phone Suffix';
            break;
        case "COLLEGE_NAME":
            isError = !isName_Num(field.value);
            description = 'College attended';
            break;
        case "A1":
        case "txtA1":
            isError = !isAddress(field.value);
            description = 'Address';
            break;
        default:
            if (typeof (validation) != 'undefined') {
                try {
                    eval("isError = " + validation + "(field.value)");
                }
                catch (ex) {
                    alert("[doValidateField] bad eval");
                }
            }
            else {
                switch (thetype) {
                    case "select-one":
                    case "select-multiple":
                    case "text":
                    case "textarea":
                        isError = isEmpty(field.value);
                        break;
                    case "checkbox":
                        isError = !field.checked;
                        break;
                    default:
                        if (thetype == 'undefined') {
                            var blnchecked = false;
                            for (var j = 0; j < field.length; j++) {
                                if (field[j].checked) {
                                    blnchecked = true;
                                }
                            }
                            isError = !blnchecked;
                        }
                }
            }
            break;
    }
    if (field.title.length > 0)
        description = field.title;

    if (isError) {
        setError(field, description);
    }
    else {
        FieldRemoveHighlight(field);
    }
}



function doValidateForm(theForm) {

    //alert(g_blRunValidation);
    //alert(g_strClientID);

    if (!g_blRunValidation) {
        return true
    }

    g_blRunValidation = false;

    var errors = '';
    var isOK = true;

    ErrorMsg = '';
    FirstErrorField = null;

    rExp = / /ig;


    switch (g_strSubVertical) {
        case "DebtForm":
            eval("doValidateField(theForm." + g_strClientID + "_FN)");
            eval("doValidateField(theForm." + g_strClientID + "_LN)");
            eval("doValidateField(theForm." + g_strClientID + "_HT1)");
            eval("doValidateField(theForm." + g_strClientID + "_HT2)");
            eval("doValidateField(theForm." + g_strClientID + "_HT3)");
            eval("doValidateField(theForm." + g_strClientID + "_OT1)");
            eval("doValidateField(theForm." + g_strClientID + "_OT2)");
            eval("doValidateField(theForm." + g_strClientID + "_OT3)");
            eval("doValidateField(theForm." + g_strClientID + "_DEBT_UNSECURED, 'isEmpty')");
            //alert(theForm.EM);
            // HACK: Get around EM Validation for short forms (where EM needs to be passed into the form)
            if (theForm.EM == undefined) {
                eval("theForm." + g_strClientID + "_EM.value = theForm." + g_strClientID + "_EM.value.replace(rExp,'')");
                eval("doValidateField(theForm." + g_strClientID + "_EM)");
            }
            else {
                theForm.EM.value = theForm.EM.value.replace(rExp, "")
                doValidateField(theForm.EM);
            }


            eval("doValidateField(theForm." + g_strClientID + "_PC)");
            break;

    }


    if (ErrorMsg.length > 0) {
        isOK = false;
        alert('You have some incorrect information.\n\nPlease complete the highlighted fields to continue:\n' + ErrorMsg);
        try {
            FirstErrorField.focus();
        }
        catch (ex) {
        }
    }
    //alert(isOK);
    return isOK;
}

var n = "0123456789";
var a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
function isValid(parm, val) { if (parm == "") return false; for (var i = 0; i < parm.length; i++) { if (val.indexOf(parm.charAt(i), 0) == -1) return false; } return true; }
function isAlpha(str) { return isValid(str, a) };
function isAlphaNumeric(str) { return isValid(str, n + a) };
function isName(str) { r1 = new RegExp("^[a-zA-Z]+[-a-zA-Z' ]+[ ]*$"); r2 = new RegExp("[AaEeIiOoUuYy]+"); return (r1.test(str) && r2.test(str)); }
function isName_Num(str) { r1 = new RegExp("^[a-zA-Z]+[-a-zA-Z' 0-9]+[ ]*$"); r2 = new RegExp("[AaEeIiOoUuYy]+"); return (r1.test(str) && r2.test(str)); } // numbers allowed 
function isAddress(str) { r1 = new RegExp("[a-zA-Z]+"); r2 = new RegExp("[0-9]+"); return (r1.test(str) && r2.test(str)); }
function isZipcode(str) { r1 = new RegExp("^([ ]*)([0-9]{5})([ ]*)$"); r2 = new RegExp("^([ ]*)([A-Za-z][0-9][A-Za-z][ ]?([0-9][A-Za-z][0-9])?)([ ]*)$"); if (str.indexOf("-") == 5) str = str.substring(0, 5); return (r1.test(str) || r2.test(str)); }
function isPhoneAreaCode(str) { with (new RegExp("[2-9][0-9]{2}")) return (test(str)) }
function isPhonePrefix(str) { r1 = new RegExp("[0-9]{3}"); r2 = new RegExp("000|555|800"); return (r1.test(str) && !r2.test(str)); }
function isPhoneSuffix(str) { r1 = new RegExp("[0-9]{4}"); r2 = new RegExp("0000"); return (r1.test(str) && !r2.test(str)); }
//function isPhoneSuffix(str){with(new RegExp("[0-9]{4}"))return(test(str))}
function isPhoneExtension(str) { with (new RegExp("^[0-9]*$")) return (test(str)) }
function isValidPhone(str) { r = new RegExp("[1]{7}|[2]{7}|[3]{7}|[4]{7}|[5]{7}|[6]{7}|[7]{7}|[8]{7}|[9]{7}"); return (!r.test(str)); }
function isSSN(str) { r1 = new RegExp("^([0-7]{1}[0-9]{8})$"); r2 = new RegExp("[0]{9}|[1]{9}|[2]{9}|[3]{9}|[4]{9}|[5]{9}|[6]{9}|[7]{9}|123456789|111223333|123121234"); return (r1.test(str) && !r2.test(str)); }
function isDate(y, m, d) { with (new Date(y, m - 1, d)) return ((getDate() == d) && (getMonth() == m - 1)) }
function isEmpty(str) { strObj = new String(str); r = /(\s+)/g; strObj = strObj.replace(r, ""); return (strObj.length == 0); }
function isChecked(str) { alert(str); return true; }

//function isEmail(str){ with(new RegExp("^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$")) return(test(str));}
function isEmail(str) {
    supported = 0;
    if (window.RegExp) {
        tempStr = "a";
        tempReg = new RegExp(tempStr);
        if (tempReg.test(tempStr)) supported = 1;
    }
    if (!supported)
        return (str.indexOf(".") > 2) && (str.indexOf("@") > 0);
    r1 = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)");
    r2 = new RegExp("^.+\\@[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,4}|[0-9]{1,4})([ ]*)$");

    return (!r1.test(str) && r2.test(str));
}


/**********************************************************************/

function IsValidRawSSN(str) {
    if (str == "111111111" ||
		str == "222222222" ||
		str == "333333333" ||
		str == "444444444" ||
		str == "555555555" ||
		str == "666666666" ||
		str == "777777777" ||
		str == "888888888" ||
		str == "999999999" ||
		str == "123456789" ||
		str == "987654321") {
        return false;
    }
    else {
        return true;
    }
}

/**********************************************************************

/**********************************************************************
FormatNumber(num,decimalNum,bolCommas,bolLeadingZero,bolParens)
parameters:
num - the number to format
decimalNum - the number of decimal places to format the number to
bolCommas - put commas as number separators.
bolLeadingZero - true / false - display a leading zero for
numbers between -1 and 1
bolParens - true / false - use parenthesis around negative numbers
return:
The formatted number!
**********************************************************************/

function FormatNumber(num, decimalNum, bolCommas, bolLeadingZero, bolParens) {
    if (isNaN(parseInt(num))) return "NaN";

    var tmpNum = num;
    var iSign = num < 0 ? -1 : 1; // Get sign of number

    // Adjust number so only the specified number of numbers after the decimal point are shown.
    tmpNum *= Math.pow(10, decimalNum);
    tmpNum = Math.round(Math.abs(tmpNum))
    tmpNum /= Math.pow(10, decimalNum);
    tmpNum *= iSign; // Readjust for sign

    var tmpNumStr = new String(tmpNum);

    // See if we need to strip out the leading zero or not.
    if (!bolLeadingZero && num < 1 && num > -1 && num != 0)
        if (num > 0)
        tmpNumStr = tmpNumStr.substring(1, tmpNumStr.length);
    else
        tmpNumStr = "-" + tmpNumStr.substring(2, tmpNumStr.length);

    // See if we need to put in the commas
    if (bolCommas && (num >= 1000 || num <= -1000)) {
        var iStart = tmpNumStr.indexOf(".");
        if (iStart < 0)
            iStart = tmpNumStr.length;

        iStart -= 3;
        while (iStart >= 1) {
            tmpNumStr = tmpNumStr.substring(0, iStart) + "," + tmpNumStr.substring(iStart, tmpNumStr.length)
            iStart -= 3;
        }
    }

    // See if we need to use parenthesis
    if (bolParens && num < 0)
        tmpNumStr = "(" + tmpNumStr.substring(1, tmpNumStr.length) + ")";

    return tmpNumStr; 	// Return our formatted string!
}

function fieldAdvance(obj, dir) {
    try {
        var maxLen = obj.maxLength;
        var curLen = obj.value.length;
        var parentForm = obj.form;
        var id;
        var nextElement;
        var prevElement;

        if (curLen >= maxLen) {
            id = getElementID(obj);
            //jb: these next 4 lines prevent user from being able to type over an entry, they can only back space to change it, so anoying that I've commented this out !!!
            //nextElement = (id + 1) % parentForm.elements.length;  
            //prevElement = (id - 1) % parentForm.elements.length;				
            //parentForm.elements[nextElement].focus();
            //FieldActiveHighlight(parentForm.elements[nextElement]);

            //alert('c:' + obj.name);
            //alert('p:' + parentForm.elements[prevElement].name);
            //alert('n:' + parentForm.elements[nextElement].name);
        }
        /*
        if (curLen == 0 && isBackspace && (obj.value == previousValue))
        {
        id = getElementID(obj);
        nextElement = (id + 1) % parentForm.elements.length;
        prevElement = (id - 1) % parentForm.elements.length;				
        parentForm.elements[prevElement].focus();
        FieldActiveHighlight(parentForm.elements[prevElement]);
        }
        */
    }
    catch (ex) {
    }

}

function getElementID(obj) {
    var i;
    var parentForm = obj.form;

    for (i = 0; i < parentForm.elements.length; i++)
        if (obj == parentForm.elements[i])
        break;
    return i;
}

function ToggleSubmit(theForm, IsEnabled) {
    var tempobj;
    try {
        if (document.all || document.getElementById) // IE & NS6
        {
            //screen thru every element in the form, and hunt down "submit" and "reset"
            for (i = 0; i < theForm.length; i++) {
                tempobj = theForm.elements[i];
                if (tempobj.type.toLowerCase() == "submit" || tempobj.type.toLowerCase() == "reset")
                    tempobj.disabled = !IsEnabled;
            }
        }
    }
    catch (ex) {
    }
}

//Function to check whether element clicked is form element
function checkel(which) {
    if (which.style && intended.test(which.tagName)) {
        if (isNS6 && (eventobj.nodeType == 3))
            eventobj = eventobj.parentNode.parentNode
        return true
    }
    else
        return false
}

function FieldErrorHighlight(field) {

    var obj = field;

    if (field.tagName.toLowerCase() == 'input' || field.tagName.toLowerCase() == 'table') {
        obj.style.borderColor = 'red';
        obj.style.borderStyle = 'solid';
        obj.style.borderWidth = '1px;';
    }
    else if (field.tagName.toLowerCase() == 'select') {
        obj.style.color = 'red';
    }

}

function FieldRemoveHighlight(field) {

    var obj = field;

    if (field.tagName.toLowerCase() == 'input') {
        obj.style.borderColor = '';
        obj.style.borderStyle = '';
        obj.style.borderWidth = '';
    }
    else if (field.tagName.toLowerCase() == 'select') {
        obj.style.color = '';
    }

}

function FieldActiveHighlight(obj) {

    return;

    if (previousObj != '') {
        if (previousObj != obj) {
            if (checkel(previousObj)) {
                previousObj.className = '';
            }
            previousObj = obj;
            if (checkel(obj)) {
                obj.className = 'ActiveElement';
            }
        }
    }
    else {
        previousObj = obj
        if (checkel(obj)) {
            obj.className = 'ActiveElement';
        }
    }
}


