function focusTab(str){
    if(tabFocus[str]!=''){
        if(tabs) showTabtabs(tabFocus[str]);
    }
}

function isblank(s){
	notOnlySpaces = /^\S/;
	if ((s==null) || (s=="") || (!notOnlySpaces.test(s))) return true;
	else return false;
}

function validateForm(rootName) {
    try{
        arrayName = rootName + "Array";
        doc = "document." + rootName + ".";
        errorMsgArray = new Array(0);
        errorMsgArray.length = 0;
        errorMsgCnt = 0;
            var errorFocus = null;
        nonNumeric = /[^0-9]/g;
            nonPhone = /[^0-9 \.\-\(\)]/g;
        nonAlpha = /[^\sa-zA-Z'_-]/g;
        nonAlphaNum = /[^\sa-zA-Z0-9'_.,-:;"\?<>\(\)!\$#%&\*\/]/g;
        notOnlySpaces = /[\S]/g;
        isDateFormat = /\d{2}(\/|-)\d{2}(\/|-)\d{4}/;
        numVal = "";
        optnCnt = "";
        optnSelected = false;

        arrayCnt = eval(arrayName + ".length");
        for (i = 0; i < arrayCnt; i++) {
            textErrMsg = "";
            val = "";
            val = eval(doc + eval(arrayName + "[i][0]") + ".value");
            valType = "";
            valType = eval(arrayName + "[i][1]");
            isReq = false;
            isReq = ((eval(arrayName + "[i][2]") == "true") ? true : false);

            switch(valType) {
                case "special" :
                                    textErrMsg = eval("validate" + eval(arrayName + "[i][0]") + "();");
                                    if (textErrMsg != "" && textErrMsg != 'undefined') {
                                            errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                                    break;
                case "alpha":
                    if ((isReq) && (isblank(val))) {
                        textErrMsg = " is required";
                    }
                    if (eval(doc + eval(arrayName + "[i][0]") + ".value") != "" ) {
                        if (nonAlpha.test(eval(doc + eval(arrayName + "[i][0]") + ".value"))) {
                            textErrMsg = " contains invalid characters";
                        }
                    }
                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;
                case "alphanum":
                    if ((isReq) && (isblank(val))) {
                        textErrMsg = " is required";
                    }
                    if (eval(doc + eval(arrayName + "[i][0]") + ".value") != "" ) {
                        if (nonAlphaNum.test(eval(doc + eval(arrayName + "[i][0]") + ".value"))) {
                            textErrMsg = " contains invalid characters";
                        }
                    }
                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;

                case "amt":
                    nonAmt = /[^0-9.]/g;
                    if ((isReq) && (isblank(val))) {
                        textErrMsg = " is required";
                    }
                    if (eval(doc + eval(arrayName + "[i][0]") + ".value") != "" ) {
                        if (nonAmt.test(eval(doc + eval(arrayName + "[i][0]") + ".value"))) {
                            textErrMsg = " contains invalid characters";
                        }
                    }
                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;

                case "linkie" :
                    if((isReq) && val=='0' || val==''){
                        textErrMsg = " is required";
                    }
                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                        //if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;
                case "zip":
                    zipVal = "";
                    if ((isReq) && (isblank(val))) {
                        textErrMsg = " is required";
                    }
                    if (eval(doc + eval(arrayName + "[i][0]") + ".value") != "" ) {
                        if (nonNumeric.test(eval(doc + eval(arrayName + "[i][0]") + ".value"))) {
                            textErrMsg = " contains invalid characters";
                        }
                        else {
                            zipVal = eval(doc + eval(arrayName + "[i][0]") + ".value");
                            zipString = new String(zipVal);
                            if (zipString.length != 5) {
                                if (zipString.length < 5) {
                                    textErrMsg = " does not contain enough numbers";
                                }
                                else if (zipString.length > 5) {
                                    textErrMsg = " contains too many numbers";
                                }
                            }
                        }
                    }
                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;

                case "phone":
                    phoneVal = "";
                    if ((isReq) && (isblank(val))) {
                        textErrMsg = " is required";
                    }
                    if (eval(doc + eval(arrayName + "[i][0]") + ".value") != "") {
                        phoneVal = eval(doc + eval(arrayName + "[i][0]") + ".value");
                        if (!nonPhone.test(phoneVal)) {
                            var num = /[0-9]/g;
                                                    var nums = phoneVal.match(num);
                            if (nums.length != 10 && nums.length != 7) {
                                textErrMsg = " does not contain a complete phone number (" + nums.length + ")";
                            }
                        }
                        else {
                            textErrMsg = " contains invalid characters";
                        }
                    }
                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;

                case "date":
                    dateVal = "";
                    monthVal = "";
                    dayVal = "";
                    yearVal = "";
                    leapYear = false;
                    daysInMonth = 0;

                    if ((isReq) && (isblank(val))) {
                        textErrMsg = " is required";
                    }
                    if (eval(doc + eval(arrayName + "[i][0]") + ".value") != ""){
                        dateVal = eval(doc + eval(arrayName + "[i][0]") + ".value");
                        if (isDateFormat.test(dateVal)) {
                            monthVal = dateVal.substr(0,2);
                            dayVal = dateVal.substr(3,2);
                            yearVal = dateVal.substr(6);
                            if (((yearVal % 4)==0) && ((yearVal % 100)!=0) || ((yearVal % 400)==0)) {
                                leapYear = true;
                            }
                            if (monthVal=="04" || monthVal=="06" || monthVal=="09" || monthVal=="11") {
                                daysInMonth=30;
                            }
                            else if (monthVal=="02") {
                                if (leapYear) {
                                    daysInMonth=29;
                                }
                                else {
                                    daysInMonth=28;
                                }
                            }
                            else{
                                daysInMonth=31;
                            }
                            if (dayVal > daysInMonth) {
                                if (textErrMsg == "") {
                                    textErrMsg = " includes a day that is not valid for the selected month and year";
                                }
                                else {
                                    textErrMsg = " includes a day that is not valid for the selected month and year and " + dateErrMsg;
                                }
                            }
                        }
                        else {
                            textErrMsg = " not a valid date format (eg mm/dd/yyyy)";
                        }
                    }
                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;

                case "address":
                    if ((isReq) && (isblank(val))) {
                        textErrMsg = " is required";
                    }
                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;

                case "textarea":
                    if ((isReq) && (isblank(val))) {
                        textErrMsg = " is required";
                    }
                    if (eval(doc + eval(arrayName + "[i][0]") + ".value.length") > 250 ) {
                        textErrMsg = " contains too many characters.  Please limit response to 250 characters";
                    }

                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;

                case "ssn":
                    ssnVal = "";
                    if ((isReq) && (isblank(val))) {
                        textErrMsg = " is required";
                    }
                    if (eval(doc + eval(arrayName + "[i][0]") + ".value") != "") {
                        ssnVal = eval(doc + eval(arrayName + "[i][0]") + ".value");
                        if (!nonNumeric.test(ssnVal)) {
                            ssnString = new String(ssnVal);
                            if (ssnString.length < 9) {
                                textErrMsg = " does not contain enough numbers";
                            }
                        }
                        else {
                            textErrMsg = " contains invalid characters";
                        }
                    }
                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;

                case "num":
                    if ((isReq) && (isblank(val))) {
                        textErrMsg = " is required";
                    }
                    if (eval(doc + eval(arrayName + "[i][0]") + ".value") != "") {
                        numVal = eval(doc + eval(arrayName + "[i][0]") + ".value");
                        if (nonNumeric.test(numVal)) {
                            textErrMsg = " should only contain numbers";
                        }
                    }
                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;

                case "select":
                    if ((isReq) && (eval(doc + eval(arrayName + "[i][0]") + ".selectedIndex") == 0)) {
                        textErrMsg = " is required";
                    }
                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;

                case "radio":
                    optnCnt = 0;
                    optCnt = eval(doc + eval(arrayName + "[i][0]") + ".length")
                    optnSelected = false;
                    for (k = 0; k < optCnt; k++) {
                        if (eval(doc + eval(arrayName + "[i][0]") + "[k].checked")) {
                            optnSelected = true;
                        }
                    }
                    if ((isReq) && (!optnSelected)) {
                        textErrMsg = " is required";
                    }
                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;

                default:
                                    if(isReq && isblank(val)){
                                        textErrMsg = " is required.";
                                    }
                                    if (textErrMsg != "") {
                        errorMsgArray[errorMsgCnt] = eval(arrayName + "[i][3]") + textErrMsg;
                        errorMsgCnt++;
                                            if(!errorFocus) errorFocus=eval(doc + eval(arrayName + "[i][0]"));
                    }
                    break;
            }
        }
        if (errorMsgCnt > 0) {
            for (h = 0; h < errorMsgCnt; h++) {
                if (h == 0) {
                    errorMsg = errorMsgArray[h] + "\n";
                }
                else {
                    errorMsg = errorMsg + errorMsgArray[h] + "\n";
                }
            }
            alert(errorMsg)
                    if(errorFocus) focusTab(errorFocus.name);
                    if(errorFocus) errorFocus.focus();
            return false;
        }
        else {
            return true;
	    }
    } catch(error){
        //
        return false;
    }
}

