/*
	JavaScript Form Validation Scripts

	Allows the following tests:
	 - validRequired(field, label) - Must contain something
	 - validNotNULL(field, label) - Must contain something and not 'NULL'
	 - validEmail(field,label,required) - Checks valid email format, required 1 or 0
	 - validLength(field,label,minlength,required) - Checks for certain length content, required = 1 or 0
	 - validNum(field,label,required) - Checks that all values are '0-9', required = 1 or 0
	 - validPhone(field,label,required) - Same as validNum with a better message for phone numbers
	 - validFloat(field,label,required) - Checks that all values are '0-9.', required = 1 or 0
	 - validMoney(field,label,required) - Same as validFloat with a better message for money
	 - validMatch(field,label,field2,label2,required) - Check that two fields match, required = 1 or 0
	 - validDependant(field,label,field2,label2,required) - Requires field2 if field is filled, required = 1 or 0 (applies to first field)
	 - validRadio(formField,fieldLabel) - Checks if a radio button is selected, acts as required

	 Use:
	 - Include the validate.js file in the head section if possible, the body in necessary
	 	<script language="JavaScript" src="validate.js"></script>

	 - Create a JavaScript function called validateForm. Put all validation in there
			<script language="JavaScript">
				function validateForm(theForm) {
					if(!validRequired(theForm.Username,"Username")) {return false;}
					if(!validRequired(theForm.Password,"Password")) {return false;}
					return true;
				}
			</script>

	 - On your form definition make a onSubmit entry, point to your function validateForm
	 	<form name="form_name" action="index.php" method="POST" onSubmit="return validateForm(this);">

	 - Now, when the form is submitted, the validation rules are checked. Alert messages are displayed
	   and false is returned if ANY of the validation fails
*/

// check that field contains something
function validRequired(formField,fieldLabel) {
	var result = true;
	if(formField.value == "") {
		alert('Please enter a value for the "' + fieldLabel +'" field.');
		formField.focus();
		result = false;
	}
	return result;
}

// check that field contains an something and not 'NULL'
function validNotNULL(formField,fieldLabel) {
	var result = true;
	if(formField.value == "" || formField.value == 'NULL') {
		alert('Please enter a value for the "' + fieldLabel +'" field.');
		formField.focus();
		result = false;
	}
	return result;
}

// defines digits character set
function allDigits(str) {
	return inValidCharSet(str,"0123456789");
}

// defines digits and dots character set (for money)
function allDigitsorDot(str) {
	return inValidCharSet(str,"0123456789.");
}

// parses a field for a defined char set (see allDigits above)
function inValidCharSet(str,charset) {
	var result = true;
	// Note: doesn't use regular expressions to avoid early Mac browser bugs
	for(var i=0; i<str.length; i++) {
		if(charset.indexOf(str.substr(i,1))<0) {
			result = false;
			break;
		}
	}
	return result;
}

// defines what an email address looks like
function isEmailAddr(email) {
	var result = false;
	var theStr = new String(email);
	var index = theStr.indexOf("@");
	if(index > 0) {
		var pindex = theStr.indexOf(".",index);
		if((pindex > index+1) && (theStr.length > pindex+1)) {
			result = true;
		}
	}
	return result;
}

// checks field for anemail address
function validEmail(formField,fieldLabel,required) {
	var result = true;
	if(required && !validRequired(formField,fieldLabel)) {
		result = false;
	}
 	if(result && (formField.value.length > 0)) {
		if((formField.value.length < 3) || !isEmailAddr(formField.value)) {
			alert("Please enter a complete email address in the form: yourname@yourdomain.com");
			formField.focus();
			result = false;
		}
	}
	return result;
}

// checks field for minimum string length
function validLength(formField,fieldLabel,minlength,required) {
	var result = true;
	if(required && !validRequired(formField,fieldLabel)) {
		result = false;
	}
 	if(result && (formField.value.length > 0)) {
		if(formField.value.length < minlength) {
			alert(fieldLabel +" must be at least "+ minlength +" characters long.");
			formField.focus();
			result = false;
		}
	}
	return result;
}


// checks field for a number
function validNum(formField,fieldLabel,required) {
	var result = true;
	if(required && !validRequired(formField,fieldLabel)) {
		result = false;
	}
 	if(result && (formField.value.length > 0)) {
 		if(!allDigits(formField.value)) {
 			alert('Please enter a number for the "' + fieldLabel +'" field. (Please use no punctuation or spaces.)');
			formField.focus();
			result = false;
		}
	}
	return result;
}

// checks field for a number, can have decimals
function validFloat(formField,fieldLabel,required) {
	var result = true;
	if(required && !validRequired(formField,fieldLabel)) {
		result = false;
	}
 	if(result && (formField.value.length > 0)) {
 		if(!allDigitsorDot(formField.value)) {
 			alert('Please enter a number for the "' + fieldLabel +'" field.');
			formField.focus();
			result = false;
		}
	}
	return result;
}

// checks field for a number with better error for phones
function validPhone(formField,fieldLabel,required) {
	var result = true;
	if(required && !validRequired(formField,fieldLabel)) {
		result = false;
	}
 	if(result && (formField.value.length > 0)) {
 		if(!allDigits(formField.value)) {
 			alert('Please enter a number for the "' + fieldLabel +'" field. (Please use no punctuation or spaces.)');
			formField.focus();
			result = false;
		}
	}
	return result;
}

// checks field for a number with better error for money (allows .'s)
function validMoney(formField,fieldLabel,required) {
	var result = true;
	if(required && !validRequired(formField,fieldLabel)) {
		result = false;
	}
 	if(result && (formField.value.length > 0)) {
 		if(!allDigitsorDot(formField.value)) {
 			alert('Please enter a number for the "' + fieldLabel +'" field. (Please use no $ symbols)');
			formField.focus();
			result = false;
		}
	}
	return result;
}

// check that two fields match each other
function validMatch(formField,fieldLabel,formField2,fieldLabel2,required) {
	var result = true;
	if(required && !validRequired(formField,fieldLabel)) {
		result = false;
	}
 	if(result && (formField.value.length > 0)) {
		if(formField.value != formField2.value) {
			alert('The values in the "' + fieldLabel +'" field and "' + fieldLabel2 +'" field do not match.');
			formField2.focus();
			result = false;
		}
	}
	return result;
}

// requires a field if the first field is filled out
function validDependant(formField,formField2,fieldLabel,fieldLabel2,required) {
	var result = true;
	if(required && !validRequired(formField,fieldLabel)) {
		result = false;
	}
 	if(result && (formField.value.length > 0)) {
		if(formField2.value != "") {
			if(formField.value == "") {
				alert('The values in the "' + fieldLabel +'" field and "' + fieldLabel2 +'" are dependant upon one another.\r\n\r\nBoth must be filled in or neither filled in.');
				formField.focus();
				result = false;
			}
		}
	}
	return result;
}

// validates that a radio button is selected, acts as required
function validRadio(formField,fieldLabel) {
	var result = -1;
	for(i=formField.length-1; i>-1; i--) {
		if(formField[i].checked) {
			result = i;
		}
	}
	if(result == -1) {
		alert('Please select an option for the "' + fieldLabel +'" field.');
		return false;
	} else {
		return true;
	}
}
