// include this file with the following code somewhere in your HTML <script src="validate.js"></script>
//
// create a form with a unique name property
// also add the following to the form tag :-
// onSubmit="return validateForm(this);"
// error="The header of the returned error if there is an error"
// each element in the form can have a validate property which must be set to one of the following :-
//
// integer		= the field must contain an integer, a blank entry will not be accepted.
// blankOrInteger	= the field can contain an integer or blank.
// float		= the field must contain a floating point number, a blank entry will not be accepted.
// blankOrFloat		= similar to blankOrInteger except floating point numbers are accepted.
// text N		= any number of characters upto N can be entered including blanks.
// text> N		= any number of characters more than N can be entered.
// email		= a valid email address or blank must be entered.

// each form element can also have the following properties :-
//
// mandatory		= if this is set to anything then the field will be considered mandatory.
// error		= this is the specific error message if this fields entry fails validation.
// validateName		= a friendly name for this field when a mandatory field is not entered.
//
// example of a mandatory email entry field in a form is :-
//
// <form name="frm" action="post.asp" method="post" onSubmit="return validateForm(this);" error="Data entry error/s :-\n\n">
// <input type="text" name="emailAddress" mandatory="true" validate="email" validateName="Your email address" error="You must enter your email address">
// </form>

function validateForm( formObj ) {

	err = "";


	for ( n = 0 ; n < formObj.elements.length ; n++ ) {

		validate = formObj.elements[n].validate;

		if ( validate != undefined ) {

			elementName = "document." + formObj.getAttributeNode("name").value + "." + formObj.elements[n].name;

			elementValue = formObj.elements[n].value;

			validateName = formObj.elements[n].validateName;
			if ( validateName == undefined ) {
				validateName = formObj.elements[n].name;
			}

			errorText = formObj.elements[n].error;

			if ( errorText == undefined ) {
				errorText = "-- No detailed error supplied for " + elementName + " but it failed validation test '" + validate + "' --\n";
			} else {
				eval("errorText = '" + formObj.elements[n].error.replace(/\'/g,"") + "';");
			}

			if ( validate.indexOf(" ") != -1 ) {
				validateExtra = validate.substring(validate.indexOf(" ")+1);
				validateType = validate.substring(0, validate.indexOf(" ") );
			} else {
				validateType = validate;
			}

			if ( ( elementValue == "" ) && ( formObj.elements[n].mandatory != undefined ) ) {
				err += validateName + " is a mandatory field.\n";
			} else {
			
				switch ( validateType ) {
					case "pulldown":
						selectable = eval(elementName + ".options[" + elementName + ".selectedIndex].validate");
						if ( selectable == "cant select" ) {
							err += errorText + "\n";
						}
						break;
					case "date":
						var regex = /^(?=\d)(?:(?!(?:(?:0?[5-9]|1[0-4])(?:\.|-|\/)10(?:\.|-|\/)(?:1582))|(?:(?:0?[3-9]|1[0-3])(?:\.|-|\/)0?9(?:\.|-|\/)(?:1752)))(31(?!(?:\.|-|\/)(?:0?[2469]|11))|30(?!(?:\.|-|\/)0?2)|(?:29(?:(?!(?:\.|-|\/)0?2(?:\.|-|\/))|(?=\D0?2\D(?:(?!000[04]|(?:(?:1[^0-6]|[2468][^048]|[3579][^26])00))(?:(?:(?:\d\d)(?:[02468][048]|[13579][26])(?!\x20BC))|(?:00(?:42|3[0369]|2[147]|1[258]|09)\x20BC))))))|2[0-8]|1\d|0?[1-9])([-.\/])(1[012]|(?:0?[1-9]))\2((?=(?:00(?:4[0-5]|[0-3]?\d)\x20BC)|(?:\d{4}(?:$|(?=\x20\d)\x20)))\d{4}(?:\x20BC)?)(?:$|(?=\x20\d)\x20))?((?:(?:0?[1-9]|1[012])(?::[0-5]\d){0,2}(?:\x20[aApP][mM]))|(?:[01]\d|2[0-3])(?::[0-5]\d){1,2})?$/;
//						var regex = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
						if ( !regex.test(elementValue) ) {
							err += errorText + "\n";
						}
						break;
					case "integer":
						if ( ( elementValue == "" ) || ( isNaN(elementValue) || ( elementValue != parseInt(elementValue) ) ) ) {
							err += errorText + "\n"
						}
						break;
					case "blankOrInteger": 
						if ( ( elementValue != "" ) && ( isNaN(elementValue) || ( elementValue != parseInt(elementValue) ) ) ) {
							err += errorText + "\n"
						}
						break;
					case "float":
						if ( ( elementValue == "" ) || ( isNaN(elementValue) ) ) {
							err += errorText + "\n"
						}
						break;
					case "blankOrFloat":
						if ( ( elementValue != "" ) && ( isNaN(elementValue) ) ) {
							err += errorText + "\n"
						}
						break;
					case "text":
						if ( elementValue.length > validateExtra ) {
							err += errorText + "\n";
						}
						break;
					case "text>":
						if ( elementValue.length <= validateExtra ) {
							err += errorText + "\n";
						}
						break;
					case "match":
						if ( elementValue != eval("document." + formObj.getAttributeNode("name").value + "." + validateExtra + ".value") ) {
							err += errorText + "\n";
						}
						break;
					case "email":
						if ( elementValue != "" ) {
							var regex = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;
							if ( !regex.test(elementValue) ) {
								err += errorText + "\n";
							}
						}
						break;
					case "checked":
						if ( formObj.elements[n].checked == false ) {
							err += errorText + "\n";
						}
						break;
					default :
						alert("Unknown validation (" + validate + ") for object document." + elementName)
				}
			}
		}
	}

	if ( err == "" ) {
		return true;
	} else {
		eval("errTitle = '" + formObj.getAttributeNode("error").value + "';");
		alert( errTitle + "\n" + err );
		return false;
	}
}
