function focusTab(str){
    if(tabFocus != undefined){
    	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) {

	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!=11 && 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) {
		try {
			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();
		} catch(e){
			alert("Error: " + e.message);
		}		
		return false;
	}
	else {
		return true;
	}
}

