var numErrors = 0;

function checkform(formObj) {	
	
	numErrors = 0;
	
	//Remove the error message if it exists.
	if(jQuery("#alertMessage").length) {
		jQuery("#alertMessage").remove();
	}
	
	//Loop over each required field.
	if (jQuery("#required").length) {
		var fields = jQuery("#required").attr("value").split(",");
		for (i in fields) {
			var fieldID = fields[i].split(" ").join();
			fieldID = fieldID.replace(",", "");
			var obj = jQuery("#"+(fieldID));	
			if (obj.length) {
				var objID = obj.attr("id");
				var objType = getFormFieldType(obj);				
				var labelName = jQuery("label:first", obj.parents(".field")).html();
				
				switch(objType) {
					
					//The user has no control over hidden inputs, so there is no use in validating them.
					case "hidden":
						break;
						
					default:
						var objValue = obj.attr("value");
						switch(objID) {		
												
							case 'email':
								var note = validate(obj, labelName, 'email');
								if (note !== true) {
									addError(obj,objType,formObj,note);
								} else {
									removeError(obj,objType,formObj);
								}
								break;
								
							case 'phone':
								var note = validate(obj, labelName, 'phone');
								if (note !== true) {
									addError(obj,objType,formObj,note);
								} else {
									removeError(obj,objType,formObj);
								}
								break;
																	
							default:
								if (objValue) {
									removeError(obj,objType,formObj);
								} else {
									var note = labelName + " cannot be empty.";	
									addError(obj,objType,formObj,note);									
								}									
								break;
						}
						break;
					case 'select-group':
						var inputName = jQuery("input:first", obj).attr("name");				
						var objName = obj.attr("name");	
						var objValue = jQuery('input[name='+inputName+']:checked').val();
						if(!objValue){
							var note = labelName + " cannot be empty.";	
							addError(obj,objType,formObj,note);
						} else {
							removeError(obj,objType,formObj);
						}		
						break;
				}
			}
		}
	}
	
	//Were there any errors?
	if(numErrors > 0) {
		return false;
	} else {
		return true;
	}	
}

//Validate an array of single form fields.
function validate(formField, labelName, method) {
		
	//Remove the error message if it exists.
	if (numErrors == 0) {
		if(jQuery("#alertMessage").length) {
			jQuery("#alertMessage").remove();
		}
	}
		
	var value = formField.attr("value");
	var formObj = jQuery(formField.parents("form"));
	
	if (value) {
		switch(method) {
			case "numeric":
				if (isNumeric(value) == false) {
					var note = labelName + ' must contain only numeric values.';
					return note;
				} else {
					return true;
				}	
				break;
				
			case "email":
				if (isEmailAddr(value) == true) {
					return true;
				} else {
					var note = labelName + ' must be a valid email address.';
					return note;
				}
				break;				

			case "phone":
				if (isPhone(value) == true) {
					return true;
				} else {
					var note = labelName + ' must be a valid phone number.';
					return note;
				}
				break;
			}	
	} else {
		var note = labelName + ' cannot be empty.';
		return note;
	}	
}

function passwordsMatch(value, formField) {
	
	//Get the previous input, as this will be the password field.
	var passContainer = formField.parents(".field").prev();
	var passField = jQuery("input:first", passContainer);
	
	if (passField.attr("value") == value) {
		return true;
	} else {
		return false;
	}
}

function validPassword(value) {	
	var valid = false;	
	if (value.length >= 8) {
		valid = true;
	}	
	return valid;	
}

function removeError(obj,objType,formObj) {		
	var containerDiv = getContainerDiv(obj, objType);
	if (containerDiv.hasClass("alerted") == true) {
		containerDiv.removeClass("alerted")
	}	
}	

function addError(obj,objType,formObj,note) {
	
	var containerDiv = getContainerDiv(obj, objType);
	
	//Add some sort of display to let the user know there is something wrong with this field.
	containerDiv.addClass("alerted");	
	
	//If this is the first error, we need to create the error message container.
	if (!jQuery("#alertMessage").length) {
		var alertDiv = jQuery(
		"<div id='alertMessage' class='container'>" +
			"<div id='alertIcon'>" +
				"<img alt='We were unable to process your form. Please review the highlighted fields and resubmit.' src='"+SETTINGS.webRoot+"intranet/img/alertIcon.gif' />" +
			"</div>" +
			"<p>We were unable to process your form.<span class='notes'>"+note+"</span><br /></p>" +									
		"</div>");
	} else {
		jQuery("p:first", jQuery("#alertMessage")).append("<span class='notes'>"+note+"</span><br />");
	}
	formObj.parent().prepend(alertDiv);
	numErrors += 1;
}

function getFormFieldType(obj) {
	
	var objID = obj.attr("id");
	if (document.getElementById(objID)) {	
		var objType = document.getElementById(objID).nodeName.toLowerCase();
		if (objType == "input") {
			objType = document.getElementById(objID).type.toLowerCase();
		} else if (objType == "textarea") {
			objType = "textarea";
		} else if (objType == "select") {
			objType = "select";
		} else {
			objType = "select-group";
		}
	}	
	return objType;
}


function getContainerDiv(obj, objType) {
	switch(objType) {
		default:
			containerDiv = jQuery(obj.parents(".field,.container"));
			break;
			
		case "select-group":
			containerDiv = obj;
			break;
	}
	
	return containerDiv;
}


function isNumeric(strString) {
	var strValidChars = "0123456789.";
	var strChar;
	var blnResult = true;
	if (strString.length == 0) {
		return false;
	}
	for (i = 0; i < strString.length && blnResult == true; i++)	{
		strChar = strString.charAt(i);
		if (strValidChars.indexOf(strChar) == -1){
			blnResult = false;
		}
	}
	return blnResult;
}

function isEmailAddr(str) {
	var match = str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
	if (match != null) {
		return true;
	} else {
		return false;
	}
}

function isPhone(str) {
	str = str.replace( /[^0-9]/g, "" );
	var reg = /^([0-9]{3})([0-9]{3})([0-9]{4})$/;
	if (vals = reg.exec(str)) {
		return true;
	} else {
		return false;
	}
}

function leaveDigits(master) {
	master.value=strip(master.value);
}

function strip(_str) {
	var STR="";
	var _exp =/\d+|\./g;
	var _array;
	while(_array=_exp.exec(_str)) {
		STR+=_array.join();
	}
	return(STR);
}