//ie: <form action="index.php" method="post" onsubmit="return validateForm(this);">

function validateForm( formObj ) {
	var retVal = true;
	var msg = new Array();
	for( var i = 0; i < formObj.elements.length; i++ ) {
		var ok = false;
		var item = formObj.elements[i];
		var validator = item.getAttribute("validator");
		if( validator != null ) {
			var required  = (item.getAttribute("required") == "false"?false:true);
			//alert( item.title+"\r\nvalidator: "+validator+"\r\nrequired: "+required );
			if( required == false ) {
				if( item.value.length == 0 ) { ok = true; }
			}

			if (item.disabled==true) {
				ok=true;
			}

			if( ok == false ) {
				// item.type
				// item.name
				var value = item.value;
				var list = validator.split( "(" );
				var func = list[0];
				var p = validator.substr(func.length+1);
				var p = p.substr(0,p.length-1);
				var params = p.split( "," );
				//alert( "Validator = ["+validator+"]\r\nValue = ["+value+"]\r\nparams = ["+params+"]\r\np = ["+p+"]" );
				var funcRet = true;
				switch( func ) {
					case "minmax":
						funcRet = FV_MinMax( parseFloat(value), parseFloat(params[0]), parseFloat(params[1]) );
						break;
					case "minlen":
						funcRet = FV_MinLen( value, parseFloat(p) );
						break;
          case "minmaxlen":
						funcRet = FV_MinMaxLen( value, parseFloat(params[0]), parseFloat(params[1]) );
						break;
					case "regex":
						funcRet = FV_Regex( value, p );
						break;
					case "date":
						funcRet = FV_Date( value, p );
						break;
					case "email":
						funcRet = FV_Email( value );
						break;
					case "usphone":
						funcRet = FV_USPhone( value, (p=="true")?true:false );
						break;
					case "uszip":
						funcRet = FV_USZip( value );
						break;
          case "canadazip":
						funcRet = FV_CANADAZip( value );
						break;
          case "ukzip":
						funcRet = FV_UKZip( value );
						break;
					case "isChecked":
						funcRet = item.checked;
						break;
				}

				if( funcRet == false ) {
					msg[msg.length] = item.title;
					retVal = false;
				}
			}
		}
	}

	if( retVal != true ) {
		var message = "Please Correct The Following Errors:\r\n\r\n";
		for( var i = 0; i < msg.length; i++ ) {
			message += "* "+msg[i]+"\r\n";
		}
		alert( message );
	}
	return retVal;
}

function FV_MinMax( value, min, max ) {
	//alert( value+"\r\n"+min+"\r\n"+max )
	if( isNaN(value) || (value < min) || (value > max) ) { return false; }
	return true;
}

function FV_MinLen( value, minLen ) {
	var retVal = false;
	if( typeof( value ) == "string" ) {
		if( value.length >= minLen ) { retVal = true; }
	}
	return retVal;
}

function FV_MinMaxLen( value, minLen, maxLen ) {
	//alert('minmaxlen');
	var retVal = false;
	if( typeof( value ) == "string" ) {
		if( value.length >= minLen && value.length <= maxLen) { retVal = true; }
	}
	return retVal;
}

function FV_Regex( value, exp ) {
	try {
		var re = new RegExp( exp );
		return re.test( value );
	}

	catch( e ) {
		alert(e);
	}
	return false;
}

function FV_Date( value, exp ) {
	var dVal = "^"+exp+"$"
	dVal = dVal.replace( /Y/g, "\\d{4}" );
	dVal = dVal.replace( /M/g, "\\d{2}" );
	dVal = dVal.replace( /D/g, "\\d{2}" );
	retVal = FV_Regex( value, dVal );
	if( retVal ) {
		/*
		var sep = exp.substr( 1, 1 );
		dArray = dStr.split( sep );
		exec
		tempDate = new Date( dArray[0], dArray[1]-1, dArray[2] );\r\n";
		*/
		var s;
		var re = new RegExp(dVal,"ig");
		var arr = re.exec(value);
		s  = "$1 contains: "+RegExp.$1+"\n";
		s += "$2 contains: "+RegExp.$2+"\n";
		s += "$3 contains: "+RegExp.$3;
		alert( s );
	}
	return retVal;
}

function FV_Email( value ) {
	var re = "^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$";
	//var re = "^[\\w-_][\\w-_\.]*\@[\\w-_]+\.[a-zA-Z]{2,5}$";
	//var re = "^[\\w-_][\\w-_\.]*\@[\\w-_\-\.]+\.[a-zA-Z]{2,6}$";
	//var re = "^a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?";
	//var re ="^[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}$/";
	//var re = "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$";
	//var re = "^[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}$";
    //var re = "^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$";
	return FV_Regex( value, re ); // change email to re if not working properly
}

function FV_USPhone( value, full ) {
	var phone = "^([1][- ])?[(]?\\d{3}[)]?[- ]\\d{3}[- ]\\d{4}$";
	var retVal = FV_Regex( value, phone );
	if( !full && !retVal ) {
		phone = "^\\d{3}[-]\\d{4}$";
		retVal = FV_Regex( value, phone );
	}
	return retVal;
}

function FV_USZip( value ) {
	var zip = "^\\d{5}([-]\\d{4}){0,4}$";
	var retVal = FV_Regex( value, zip );
	return retVal;
}

function FV_CANADAZip( value ) {
	value = value.toUpperCase();
	//this is a PHP REGEX '\b[ABCEGHJKLMNPRSTVXY][0-9][A-Z] [0-9][A-Z][0-9]\b'
	var zip = "^[ABCEGHJKLMNPRSTVXY]\\d[A-Z] \\d[A-Z]\\d";
    //var zip = "/^\s*[a-ceghj-npr-tvxy]\d[a-z](\s)?\d[a-z]\d\s*$/i";
	var retVal = FV_Regex( value, zip );
	//alert(zip);
	return retVal;
}

function FV_UKZip( value ) {
	//Postal code (UK)
	//this is the original PHP REGEX '\b[A-Z]{1,2}[0-9][A-Z0-9]? [0-9][ABD-HJLNP-UW-Z]{2}\b'
	//this is still a PHP REGEX var zip = "^[A-Z]{1,2}[0-9][A-Z0-9]? [0-9][ABD-HJLNP-UW-Z]{2}";
	var retVal = FV_Regex( value, zip );
	//alert(zip);
	return retVal;
}

function onlyNumbers( allowPeriod ) {
	retVal = true;
	if( event.keyCode == 46 && allowPeriod ) {
		retVal = true;
	} else if( event.keyCode > 57 || event.keyCode < 48 ) {
		retVal = false;
	}
	return retVal;
}

/*
function allowNumbersKD( allowPeriod )
{
	retVal = true;

	switch( event.keyCode )
	{
		// Allow general movement keys and keypad keys
		case 8:		//Backspace
		case 9:		// Tab
		case 13:	// Enter
		case 16:	// Shift
		case 17:	// Ctrl
		case 18:	// Alt
		case 20:	// Caps lock
		case 27:	// Esc
		case 33:	// Page Up
		case 34:	// Page Down
		case 35:	// End
		case 36:	// Home
		case 37:	// Arrow Left
		case 38:	// Arrow Up
		case 39:	// Arrow Right
		case 40:	// Arrow Down
		case 45:	// Insert Key
		case 46:	// Delete Key
		case 96:	// KP 0
		case 97:	// KP 1
		case 98:	// KP 2
		case 99:	// KP 3
		case 100:	// KP 4
		case 101:	// KP 5
		case 102:	// KP 6
		case 103:	// KP 7
		case 104:	// KP 8
		case 105:	// KP 9
		case 144:	// Num lock
			if( event.altKey )
			{
				retVal = false;
			}
			break;

		case 190:	// Period
		case 110:	// KP Period
			retVal = allowPeriod;
			break;

		// Allow number keys as long as shift, ctrl and alt are not pressed
		case 48:	// 0
		case 49:	// 1
		case 50:	// 2
		case 51:	// 3
		case 52:	// 4
		case 53:	// 5
		case 54:	// 6
		case 55:	// 7
		case 56:	// 8
		case 57:	// 9
			if( !event.shiftKey && !event.cltrKey && !event.altKey )
			{
				// If the shift, ctrl and alt keys are not pressed
				// Then let this key through
				retVal = true;
			} else
			{
				// Otherwise stop the key.
				retVal = false;
			}
			break;

		// Do not allow most keys through.
		default:
			retVal = false;
			break;
	}

	event.returnValue = retVal;
	return retVal;
}
*/