function MatchingFields(f1, f2, msg)
	{
		this.field1 = f1;
		this.field2 = f2;
		this.message = msg;
		this.validate = MatchingFields_validate;
	}
	
	function MatchingFields_validate()
	{
		if(this.field1.value == this.field2.value)
			return true;
		else
			return false;
	}
	
	function ValidatedField(fld, valtype, msg)
	{
		this.field = fld;
		this.type = valtype;
		this.message = msg;
		this.validate = ValidatedField_validate;
	}
	
	function ValidatedField_validate()
	{
		var value = this.field.value;

		if(this.type == "notblank")
		{
			return !IsBlank(value);
		}
		else if(this.type == "email")
		{
			return IsEmail(value);
		}
		else if(this.type == "emailorblank")
		{
			return (IsBlank(value) || IsEmail(value));
		}
		else if(this.type == "chosen")
		{
			value = this.field.options[this.field.selectedIndex].value;
			return !IsBlank(value);
		}
		else if(this.type == "year")
		{
			return IsYear(value);
		}
		else if(this.type == "integer")
		{
			return IsInteger(value);
		}
		else if(this.type == "zip")
		{
			return IsZipCode(value);
		}
		else if(this.type == "ziporblank")
		{
			return (IsBlank(value) || IsZipCode(value));
		}
		else
			return true;
	}

	function IsBlank(v)
	{
		if(v == null || v.length == 0)
			return true;
		else
			return false;
	}

	function IsEmail(v)
	{
		var apos = v.indexOf("@"); 
		var dotpos = v.lastIndexOf(".");
		var lastpos = v.length-1;
		if (apos < 1 || dotpos - apos < 2 || lastpos - dotpos > 3 || lastpos - dotpos < 2) 
			return false;
		else 
			return true;
	}

	function IsInteger(v) 
	{
		for (var i=0; i < v.length; i++) 
		{
			if (!IsDigit(v.charAt(i))) 
			{ 
				return false; 
			}
		}
		return true;
	}

	function IsZipCode(v)
	{
		if(v.length == 5 && IsInteger(v))
			return true;
		else
			return false;
	}

	function IsYear(v)
	{
		if(v.length == 4 && IsInteger(v))
			return true;
		else
			return false;
	}

	function IsNumeric(v) 
	{
		var dp = false;
		for (var i=0; i < v.length; i++) 
		{
			if (!IsDigit(v.charAt(i))) 
			{ 
				if (v.charAt(i) == '.') 
				{
					if (dp == true) 
					{ 
						return false; 
					} 
					else 
					{ 
						dp = true; 
					}
				}	
				else 
				{
					return false; 
				}
			}
		}
		return true;
	}


	function IsDigit(v) 
	{
		var nums = "1234567890";
		if (nums.indexOf(v) != -1) 
		{
			return true;
		}
		return false;
	}
	
	function ValidateAll()
	{ 
		var ok = true;
		var message = "";
		for(var i = 0; i < FieldsToValidate.length; i++)
		{
			if(!FieldsToValidate[i].validate())
			{
				message += FieldsToValidate[i].message + "\n";
				ok = false;
			}
		}
		if(!ok)
		{
			message = "Sorry, the form was not completed properly.\n\n" + message;
			alert(message);
		}
	
		return ok;
		
	}
	
	function AddValidatedField(fld, valtype, msg)
	{
		FieldsToValidate[FieldsToValidate.length] = new ValidatedField(fld, valtype, msg);
	}
	
	function AddMatchingFields(fld1, fld2, msg)
	{
		FieldsToValidate[FieldsToValidate.length] = new MatchingFields(fld1, fld2, msg);
	}