function checkform(formObj) {	
	
	//Remove the error message if it exists.
	jQuery("#alertMessage").remove();
	
	//Loop over each required field.
	if (jQuery("#required").length) {
		var fields = document.getElementById('required').value.split(',');
		for (var loopi=0;loopi<fields.length;loopi++) {
			var fieldID = str = fields[loopi].replace(/[\s]/g,' ');
			fieldObj = document.getElementById(fields[loopi]);
			checkField(fieldObj,formObj,true);
		}
	}
	
	//Were there any errors?
	if(jQuery(".alerted").length > 0) {
		jQuery.scrollTo(jQuery("#alertMessage"));
		return false;
	} else {
		return true;
	}	
}

function checkField(field,formObj,submissionAttempt) { 
	var obj = jQuery("#"+(field.id));
	formObj = obj.parents('form:first');
	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;
				
			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,submissionAttempt);
				} else {
					removeError(obj,objType,formObj);
				}		
				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,submissionAttempt);
						} else {
							removeError(obj,objType,formObj);
						}
						break;
						
					case 'phone':
						var note = validate(obj, labelName, 'phone');
						if (note !== true) {
							addError(obj,objType,formObj,note,submissionAttempt);
						} else {
							removeError(obj,objType,formObj);
						}
						break;
						
					case "zip":
						var note = validate(obj, labelName, 'zip');
						if (note !== true) {									
							addError(obj,objType,formObj,note,submissionAttempt);
						} else {
							removeError(obj,objType,formObj);
						}									
						break;
						
					case "userLogin":	
						if (objValue) {
							var url = SETTINGS.webRoot + "login.php?mode=validatelogin&login="+objValue;
							if (obj.parent().parent().hasClass("success") == true) {
								obj.parent().parent().removeClass("success");
							}
							$.ajax({
								async:false,
								url:url,
								type:"GET",
								success:function(html){
									html = parseInt(html);
									if (html == 0) {
										var note = 'This login is already in use by another member. <a href="'+SETTINGS.webRoot+'login.php?mode=userlogin">Click here to login or reset your password</a>';
										addError(jQuery("#userLogin"),getFormFieldType(jQuery("#userLogin")),formObj,note);
									} else {
										removeError(jQuery("#userLogin"),getFormFieldType(jQuery("#userLogin")),formObj);
										if (obj.parent().parent().hasClass("success") == false) {
											obj.parent().parent().addClass("success");
										}
									}
								}
							});	
						} else {
							var note = labelName + " cannot be empty.";	
							addError(obj,objType,formObj,note,submissionAttempt);
						}
						break;
						
					case "nickName":
						if(objValue){
							checkNickName(field);
						} else {
							var note = labelName + " cannot be empty.";	
							addError(obj,objType,formObj,note,submissionAttempt);
						}
						break;
						
					case "groupname":
						if(objValue){
							checkGroupNickName(field);
						} else {
							var note = labelName + " cannot be empty.";	
							addError(obj,objType,formObj,note,submissionAttempt);
						}
						break;
															
					case "pass":	
						var value = jQuery("#pass").attr('value');
						if(value != ""){
							var note = validate(obj, labelName, 'pass');
							if (note !== true) {
								addError(obj,objType,formObj,note,submissionAttempt);
							} else {
								removeError(obj,objType,formObj);
							}
						}else{
							jQuery("#pass2").attr('value','');
							removeError(obj,objType,formObj);
						}
						break;	
													
					case "pass2":	
						var value = jQuery("#pass").attr('value');
						if(value != ""){
							var note = validate(obj, labelName, 'confirmpass');
							if (note !== true) {
								addError(obj,objType,formObj,note,submissionAttempt);
							} else {
								removeError(obj,objType,formObj);
							}
						}else{
							removeError(obj,objType,formObj);
						}	
						break;
						
					case "metaField-cellphone":
						var note = validate(obj, labelName, 'phone');
						if (note !== true) {
							addError(obj,objType,formObj,note,submissionAttempt);
						} else {
							removeError(obj,objType,formObj);
						}
						break;	
					
					case "metaField-stride_length":
						var note = validate(obj, labelName, 'numeric');
						if (note !== true) {
							addError(obj,objType,formObj,note,submissionAttempt);
						} else {
							removeError(obj,objType,formObj);
						}
						break;	
					
					case "metaField-walk_pace":
						var note = validate(obj, labelName, 'numeric');
						if (note !== true) {
							addError(obj,objType,formObj,note,submissionAttempt);
						} else {
							removeError(obj,objType,formObj);
						}
						break;	
					
					case "metaField-weight":
						var note = validate(obj, labelName, 'numeric');
						if (note !== true) {
							addError(obj,objType,formObj,note,submissionAttempt);
						} else {
							removeError(obj,objType,formObj);
						}
						break;	
															
					default:
						if (objValue.length > 0) {
							removeError(obj,objType,formObj);
						} else {
							var note = labelName + " cannot be empty.";	
							addError(obj,objType,formObj,note,submissionAttempt);									
						}									
						break;
				}
				break;
		}
	}
}

//Validate an array of single form fields.
function validate(formField, labelName, method) {
		
		
	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) == false) {
					var note = labelName + ' must be a valid email address.';
					return note;
				} else {
					return true;
				}
				break;
				
			case "zip":
				if (!isNumeric(value) || (value.length !== 5)) {
					var note = labelName + ' must be a valid zip code.';
					return note;
				} else {
					return true;
				}
				break;
				
			case "pass":
				if (!validPassword(value)) {
					var note = 'Please enter a valid password. Passwords must be at least 8 characters long.';
					return note;
				} else {
					return true;
				}
				break;
				
			case "confirmpass":
				if (!passwordsMatch(value, formField)) {
					var note = 'Please enter a valid password. The passwords you entered do not match.';
					return note;
				} else if (!validPassword(value)) {
					var note = 'Please enter a valid password. Passwords must be at least 8 characters in length.';
					return note;
				} else {
					return true;
				}
				break;
				
			case "phone":
				if (!isPhone(value)) {
					var note = labelName + ' must be a valid phone number.';
					return note;
				} else {
					return true;
				}
				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")
	}	
	if(jQuery(".alerted").length == 0){
		jQuery("#alertMessage").remove();
	}
}	

function addError(obj,objType,formObj,note,submissionAttempt) {
	
	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+"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 />");
	}
	if(submissionAttempt)
		formObj.parent().prepend(alertDiv);
}

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) {
    return str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/);
}

function isPhone(str) {
	str = str.replace( /[^0-9]/g, "" ); // Strip out non-numerics 
	var reg = /^([0-9]{3})([0-9]{3})([0-9]{4})$/;
	if (vals = reg.exec(str)) {
		return "(" + vals[1] + ") " + vals[2] + "-" + vals[3];
	} 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);
}