
function validateForm(theForm) {
	for (var i = 0; i < theForm.elements.length; i++) {
		if ( theForm.elements[i].type == "hidden" ) {
			if ( (j = theForm.elements[i].name.lastIndexOf("_")) != -1 ) {
				fieldName = theForm.elements[i].name.substring(0, j);
				
				if ( theForm.elements[fieldName] != null ) {
					fieldValue = theForm.elements[fieldName].value;
					rule = theForm.elements[i].name.substring(j + 1);

					message = theForm.elements[i].value;
					/*
					alert("rule: " + rule + 
						"\nfieldValue: " + fieldValue + 
						"\nfieldName: " + fieldName + 
						"\nfieldValue: " + fieldValue + 
						"\nmessage: " + message);
					*/
					switch (rule.toLowerCase()) {
						case "required":
							switch ( "" + theForm.elements[fieldName].type ) {
								case "text": case "textarea": case "password":
									//if ( fieldValue == null || fieldValue == "" ) {
										//theForm.elements[fieldName].focus();
										//alert( message );
										//return false;
                                                                        //}

									if ( !isEmpty(fieldValue) ) {
										theForm.elements[fieldName].select();
										theForm.elements[fieldName].focus();
										alert( message );
										return false;
									}
									
									break;
								case "select-one": case "select-multiple":
									if ( theForm.elements[fieldName].selectedIndex == -1 || theForm.elements[fieldName].selectedIndex == 0 ) {
										theForm.elements[fieldName].focus();
										alert(message);
										return false;
									}		
									break;
								case "undefined":
									var checked = false;
									
									for (var k = 0; k < theForm.elements[fieldName].length; k++) {
										if ( theForm.elements[fieldName][k].checked ) {
											checked = true;
											break;
										}
									}
			
									if (!checked) {
										alert(message);
										return false;
									}
									
									break;
							}
							
							break;
						case "date":
							if ( fieldValue != null || fieldValue != "" ) {
								if ( !isDate(fieldValue) ) {
									theForm.elements[fieldName].select();
									theForm.elements[fieldName].focus();
									alert( message );
									return false;
								}
							}
							break;
						case "letters":
							if ( fieldValue != null || fieldValue != "" ) {
								if ( !isLetters(fieldValue) ) {
									theForm.elements[fieldName].select();
									theForm.elements[fieldName].focus();
									alert( message );
									return false;
								}
							}
						
							break;
						case "digits":
							if ( fieldValue != null || fieldValue != "" ) {
								if ( !isDigits(fieldValue) ) {
									theForm.elements[fieldName].select();
									theForm.elements[fieldName].focus();
									alert( message );
									return false;
								}
							}
						
							break;
						case "characters":
							if ( fieldValue != null || fieldValue != "" ) {
								if ( !isCharacters(fieldValue) ) {
									theForm.elements[fieldName].select();
									theForm.elements[fieldName].focus();
									alert( message );
									return false;
								}
							}
						
							break;
						case "lettersOrdigits":
							if ( fieldValue != null || fieldValue != "" ) {
								if ( !isLettersOrDigits(fieldValue) ) {
									theForm.elements[fieldName].select();
									theForm.elements[fieldName].focus();
									alert( message );
									return false;
								}
							}
						
							break;
						case "charactersOrdigits":
							if ( fieldValue != null || fieldValue != "" ) {
								if ( !isCharactersOrDigits(fieldValue) ) {
									theForm.elements[fieldName].select();
									theForm.elements[fieldName].focus();
									alert( message );
									return false;
								}
							}
						
							break;
						case "length":
							if ( fieldValue != null || fieldValue != "" ) {
								if ( !inLength(fieldValue, 0, 0) ) {
									theForm.elements[fieldName].select();
									theForm.elements[fieldName].focus();
									alert( message );
									return false;
								}
							}
						
							break;
						case "range":
							if ( fieldValue != null || fieldValue != "" ) {
								if ( !isRange(fieldValue, 0, 0) ) {
									theForm.elements[fieldName].select();
									theForm.elements[fieldName].focus();
									alert( message );
									return false;
								}
							}
						
							break;
						case "userdefined":
							/*
							if ( fieldValue != null || fieldValue != "" ) {
								for (var l = 0; l < fieldValue.length; l++) {
									if ( userValue.indexOf(fieldValue.charAt(l)) == -1 ) {
										theForm.elements[fieldName].select();
										theForm.elements[fieldName].focus();
										alert( message );
										return false;
									}
								}
							}
							*/
						
							break;
						case "email":
							if ( fieldValue != null && trim(fieldValue).length > 0) {
								if ( !isEmailAddress(fieldValue) ) {
									theForm.elements[fieldName].select();
									theForm.elements[fieldName].focus();
									alert( message );
									return false;
								}
							}
							break;
						case "emailrequired":
							if ( fieldValue != null && trim(fieldValue).length > 0) {
								if ( !isEmailAddress(fieldValue) ) {
									theForm.elements[fieldName].select();
									theForm.elements[fieldName].focus();
									alert( "Please enter a valid e-mail address." );
									return false;
								}
							}else{
								theForm.elements[fieldName].select();
								theForm.elements[fieldName].focus();
								alert( message );
								return false;
							}
						
							break;
						case "float":
							if ( fieldValue != null || fieldValue != "" ) {
								if ( !isFloat(fieldValue) ) {
									theForm.elements[fieldName].select();
									theForm.elements[fieldName].focus();
									alert( message );
									return false;
								}
							}
						
							break;
						case "zipcode":
						        var re = new RegExp("^\\d{5}$");
						        if (!fieldValue.match(re))
						        {
						        	alert(message);
								return false;
						        }


					}
				}
			}
		}
	}
	
	return true;
}

function isLetter(source) {
	if ( source == null || source.length != 1 ) {
		return false;
	}
	else {
		if ( (source >= 'A' && source <= 'Z') || (source >= 'a' && source <= 'z') ) {
			return false;
		}
		
		return true;
	}
}

function isLetters(source) {
	if ( source == null || source.length == 0) {
		return false;
	}
	else {
		for (var i = 0; i < source.length; i++) {
			if ( !isLetter(source.charAt(i)) ) {
				return false;
			}
		}
		
		return true;
	}
}

function isDigit(source) {
	if ( source == null || source.length != 1 ) {
		return false;
	}
	else {
		if ( source < '0' || source > '9' ) {
			return false;
		}

		return true;
	}
}

function isDigits(source) {
	if ( source == null || source.length == 0 ) {
		return false;
	}
	else {
		for (var i = 0; i < source.length; i++) {
			if ( !isDigit(source.charAt(i)) ) {
				return false;
			}
		}
		
		return true;
	}
}

function isCharacters(source) {
	return true;
}

function isLettersOrDigits(source) {
	if ( source == null || source.length == 0) {
		return false;
	}
	else {
		for (var i = 0; i < source.length; i++) {
			if ( !isLetter(source.charAt(i)) && !isDigit(source.charAt(i)) ) {
				return false;
			}
		}
	}
	
	return true;
}

function isCharactersOrDigits(source) {
	return true;
}

function isFloat(source) {
	if ( source.length == 0) {
		return false;
	}
	else {
		for (var i = 0; i < source.length; i++) {
			if ( !isDigit(source.charAt(i)) && source.charAt(i) != "." ) {
				return false;
			}
		}
	}
	
	return true;
}

function isDate(source) {
	if ( source.length == 0) {
		return false;
	}
	else {
		if ( isNaN(Date.parse(source)) ) {
			return false;
		}
		else {
			return true;
		}
	}
}

function inLength(source, min, max) {
	if ( source == null || source.length < min || source.length > max ) {
		return false;
	}
	else {
		return true;
	}
}

function inRange(source, min, max) {
	return true;
}

function trim(source) {
	for (var i = 0; i < source.length; i++) {
		if ( source.charAt(i) != ' ' ) {
			source = source.substring(i);
			break;
		}
	}

	for (var i = source.length - 1; i >= 0 ; i--) {
		if ( source.charAt(i) != ' ' ) {
			source = source.substring(0, i + 1);
			break;
		}
	}

	return source;
}

function isEmailAddress(fieldValue)
{
	var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	var isValid = false;

	if (filter.test(fieldValue)) 
	{
		isValid = true;
	}
	else 
	{
		isValid = false;
	}
	return isValid;
}



function isEmpty(source) {
	var re = /\s/g; 					//Match any white space including space, tab, form-feed, etc. 
	//var re = new RegExp('\s');	 			// Match any white space including space, tab, form-feed, etc. 
	re.multiline = true; 					// IE support
	//var str = source.replace(/\s*/, "");
	var str = source.replace(re, "");
	if (str.length == 0) {
		//alert('false length=' + str.length);
		return false;
	} 
	else {
		//alert('true length=' + str.length);
		return true;
	}
}