function validateForm(formObj) {
	
	//Remove all alerts.
	clearErrors();
	
	//Loop through the required fields and make sure they are not empty.
	if ($("#required_fields").length > 0) {
		var reqFields = $("#required_fields").attr("value");	
		reqFields = reqFields.split(",");
		var errorMessage = "";
		var numErrors = 0;
		for (field in reqFields) {
			var fieldID = jQuery.trim(reqFields[field]);
			fieldObj = $("#"+fieldID, formObj);
			if (fieldObj.length) {
				fieldType = document.getElementById(fieldID).nodeName.toLowerCase();
				if (fieldType == "input") {
					fieldType = document.getElementById(fieldID).type;
				}
				if (fieldType == "td") {
					fieldType = "select-group";
				}
				
				switch(fieldType) {			
					default:
						var fieldValue = fieldObj.attr("value");
					
						if (!fieldValue) {
							addError(fieldObj, fieldType);
						}
						
						//If the form field name contains "email", we 
						//will do an email address format validation.
						var fieldName = fieldObj.attr("name");						
						var containsEmail = fieldName.indexOf("email");
						if (containsEmail != -1) {
							if (!isValidEmail(fieldValue)) {
								addError(fieldObj, fieldType);
							}
						}						
						
						break;
						
					case "hidden":
						break;
						
					case "select-group":
						var fieldObj = $("input:first", fieldObj);					
						var fieldName = fieldObj.attr("name");
						var fieldValue = $('input[name="'+fieldName+'"]:checked').val(); 
						if (!fieldValue) {
							addError(fieldObj, fieldType);
						}
						break;
						
					/*For files, allow the form to pass validation if a file preview is available.
					This means the user previously uploaded a file, so another upload is not
					necessary. */ 
					case "file":
						var fieldValue = fieldObj.attr("value");
						
						//Is a file preview available?
						//Is so, allow this field to validate.
						var preview = fieldObj.next("span.filePreview");
						if (preview.length) {
							break;
						
						//Otherwise, check for a value.
						} else if (!fieldValue) {
							addError(fieldObj, fieldType);
						}					
						break;
				}
			}
		}
	}
	
	//Were there any errors?
	if (numErrors > 0) {
		if ($("div.errorWrap").length == 0) {
			formObj.parent().prepend("" +
					"<div class='errorWrap'>" +
					"	<h3>Please complete the highlighted fields.</h3>" +
					"</div>");
		}
		return false;
	} else {
		return true;
	}
	
	//Add some sort of visual display to let the user know there was an error.
	function addError(fieldObj, fieldType) {
		var containerObj = $(fieldObj.parents(".field"));
		hasError = containerObj.hasClass("alerted");
		if (hasError == false) {
			containerObj.addClass("alerted");
		}		
		numErrors += 1;
	}
	
	function clearErrors() {
		$(".alerted").removeClass("alerted");
	}
	
	function isValidEmail(str) {

		var at="@"
		var dot="."
		var lat=str.indexOf(at)
		var lstr=str.length
		var ldot=str.indexOf(dot)
		if (str.indexOf(at)==-1){
		   return false;
		}
		
		if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
		   return false;
		}
		
		if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
		    return false;
		}
		
		if (str.indexOf(at,(lat+1))!=-1){
			return false;
		}
		
		if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
			return false;
		}
				
		if (str.indexOf(dot,(lat+2))==-1){
			return false;
		}
		
		if (str.indexOf(" ")!=-1){
			return false;
		}
		
		return true;
		
	}
}
