/*****************************************************************************************************
* Easy Javascript Validation by Daniel Boorn
* http://dboorn.com/javascript_form_validation.php?catID=69
* Copyright 2006, All Rights reserved by Daniel Boorn
* Contact: daniel.boorn@gmail.com - wwww.dboorn.com
* In any form element add the following form attributes to validate
* required ="yes"
* validate = { "int", "float", "text", "email" }
* message = "Error Message for Element"
* Example: <input type="text" validate="int" message="Please enter valid zip code" name="zip">
*
* It is required that you add the following to any submit button
*     onClick="validate(this.form); return document.formSubmit;"

Step 1:
Create form and add form element with additional attributes in element tag.
required="yes" validate="email" message="Please enter a valid email address."
Where:
required = form field is required
validate = type of validation required { "email" or "int" or "float" or "text" }
message = message to be displayed "error message to alert"

Step 2:
Add the following onClick event to your submit button in your HTML form.
onClick="validate(this.form); return document.formSubmit;"
******************************************************************************************************/

	// Validator Object
    var valid = new Object();

	// REGEX Elements

	// matches zip codes
	valid.zipCode = /\d{5}(-\d{4})?/;

	// matches $17.23 or $14,281,545.45 or ...
	valid.Currency = /\$\d{1,3}(,\d{3})*\.\d{2}/;

	// matches 5:04 or 12:34 but not 75:83
	valid.Time = /^([1-9]|1[0-2]):[0-5]\d$/;

	//matches email
	valid.emailAddress = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;

	// matches phone ###-###-####
	valid.phoneNumber = /^\(?\d{3}\)?\s|-\d{3}-\d{4}$/;

	// International Phone Number
	valid.phoneNumberInternational = /^\d(\d|-){7,20}/;

	// IP Address
	valid.ipAddress = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;

	// Date xx/xx/xxxx
	valid.Date = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;

	// State Abbreviation
	valid.State = /^(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NB|NC|ND|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)$/i;

	// Social Security Number
	valid.SSN = /^\d{3}\-\d{2}\-\d{4}$/;

	// CC Date xx/xx/xxxx
	valid.ccDate = /^\d{2}(\-|\/|\.)\d{2}$/;

	// Simple CC no xxxxxxxxxxxxxxxx (9-16)
	valid.SimpleCC = /^\d{9,16}/;
    
	// Simple CVV no Credit card Security code (3-4)
	valid.CVV = /^\d{3,4}/;

	function validateForm(theForm) {
           
		var error = "";
		//for each form element
		for(var i=0; i<theForm.length; i++){
			var element = theForm[i];
			var toTest = false;
			var Req = "";
			//if exists required element
			// alert(element.name);

			Req = element.getAttribute("required");
			if(element.getAttribute("required") != "") {
				toTest = true;
			}
			if(element.getAttribute("condition") != null) {
				 //alert(element.name +" - "+ element.getAttribute("condition"));
				var parent = document.getElementById(element.getAttribute("condition"));
				var ret = "ret = document."+theForm.name+"."+parent.name+"[0].checked;";
				eval(ret);
				// alert("element name, parent value, checked - "+ element.name +","+ parent.value +","+ ret);
				if(ret) {
					toTest = true;
				}
				else {
					Req = "no";
				}
			}

			if(toTest) {
				// alert(element.name +"="+ element.value +" -"+ element.getAttribute("validate") +"-"+ Req);
				//if form element if empty
				if( ! isvalid(element.value,element.getAttribute("validate"),Req) ) {
					if (error=="") {
						element.select();
						element.focus(); 
					}
					error += element.getAttribute("message") + "\r\n";	
					
				}
			}
		}
		/*if(error != ""){
			alert(error);
			document.formSubmit = false;
		}
		else
			document.formSubmit = true;*/
			if(error != ""){
				alert(error);
				return false
			}
			else
				return  true;
			
	};

	function isvalid(value,type,req){
		if(req=="yes")
			if(value=="" || value==null)
				return false;
		if(type=="" || type==null)
			return true;
		switch(type){
			case "int":
				if(isNaN(parseInt(value)))
					return false;
				break;
			case "float":
				if(isNaN(parseFloat(value)))
					return false;
				break;
			case "email":
				var p = value.indexOf('@');
				if(p<1 || p==(value.length-1))
					return false;
			default://string
				if(type!="" && type!="string") {
					// alert("value="+value+" type="+type+" req="+req);
					var thePat = valid[type];
					var gotIt = thePat.exec(value); 
					if(! gotIt){
						if (value!="")
							return false;
						else
							return true;
					}
				}
				break;
		}
		return true;
	};
