//-------- form validation functions

var RegEx_Postal = "^\\d{5}-\\d{4}|\\d{5}|[ABCEGHJKLMNPRSTVXY]\\d[A-Z]\\s?\\d[A-Z]\\d$"
var RegEx_EMail = "^[A-Z0-9._%-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}$"
var RegEx_Phone = "^\\(?[0-9]{3}\\)?[ -.]?[0-9]{3}[ -.]?[0-9]{4}[ -.]?[0-9]*$"

var RegEx_Phone_Prompt = "Please enter a valid phone number, including area code.\nValid formats include:\n\n(555)-555-5555\n555-555-5555\n555.555.5555\n\nAn extension may also be added (one or more digits)."


// Reg Ex references: 
//		http://www.regular-expressions.info/reference.html
//		http://msdn.microsoft.com/en-us/library/1400241x(VS.85).aspx
//
// meta characters:  [\^$.|?*+()	to match these, add \\ in front
//		? match preceding token 0 or more times
//		+ match preceding token 1 or more times
//		. match any character
//		^ match the start of the string
//		$ match the end of the string
//		\d match digit
//		\D match non-digit
//		\w match word character
//		\W match non-word
//		\s match space
//		\S match non-space
//		[^ negate match (caret inside [



function ValidateForm (theForm)
{
	//*** client side form validation
	//*** auto field validation 
	for (var i=0;i<theForm.elements.length;i++)
	{
		var e = theForm.elements[i]
		if (e.getAttribute("required") == "true")
			if (NotFilled(e))
				return false
		switch (e.getAttribute("validation"))
		{
			case "number":
				if (NotNumeric(e))
					return false
				break
			case "email":
				if (NotEmail(e))
					return false
				break
			case "date":
				if (NotDate(e))
					return false
				break
			case "postal":
				if (NotPostalZip(e))
					return false
				break
			case "phone":
				if (NotPhoneNumber(e))
					return false
				break
		}
	}
	return true
}


function NotFilled (fld)
{
	if (fld.type == "checkbox")
		if (!fld.checked)
		{
			alert ("Checkbox must be checked.")
			fld.focus ()
			fld.select ()
			return true
		}
	if (fld.value == "")
	{
		alert ("Required field is missing.  Please enter.")
		fld.focus ()
		return true
	}
	return false
}

function NotNumeric (fld)
{
	if (fld.value == "")
		return false
	if (isNaN(fld.value))
	{
		alert ("Please enter a number.")
		FocusField (fld)
		return true
	}
	return false
}

function NotDate (fld, cantBeBlank)
{
	if (fld.value == "")
		if (cantBeBlank)
		{
			alert ("Please enter a Date either as MMM DD YYYY (eg. Jan 31 2000), or MM/DD/YYYY (eg. 1/31/2000) .")
			FocusField (fld)
			return true
		}
		else
			return false
	try
	{
		var d = new Date (fld.value)
		if (isNaN(d))
		{
			alert ("Please enter a Date either as MMM DD YYYY (eg. Jan 31 2000), or MM/DD/YYYY (eg. 1/31/2000) .")
			FocusField (fld)
			return true
		}
		if (d.getFullYear() < 1900)
		{
			alert ("Please enter a year 1900 or greater.")
			FocusField (fld)
			return true
		}
		return false
	}
	catch (e)	{	}
	alert ("Please enter a Date either as MMM DD YYYY (eg. Jan 31 2000), or MM/DD/YYYY (eg. 1/31/2000) .")
	FocusField (fld)
	return true
}

function NotPostalZip (fld)
{
	if ((fld.value != "") && (!ValidateRegEx (fld.value, RegEx_Postal)))
	{
		alert ("Please enter a valid postal code or zip code.")
		FocusField (fld)
		return true
	}
	return false
}

function NotEmail (fld)
{
	if ((fld.value != "") && (!ValidateRegEx (fld.value, RegEx_EMail)))
	{
		alert ("Please enter a valid email address.")
		FocusField (fld)
		return true
	}
	return false
}

function NotPhoneNumber (fld)
{
	if ((fld.value != "") && (!ValidateRegEx (fld.value, RegEx_Phone)))
	{
		alert (RegEx_Phone_Prompt)
		FocusField (fld)
		return true
	}
	return false
}

function ValidateRegEx (strSearch, expr)
{
	try
	{
		var regEx = new RegExp (expr, "i")
	}
	catch (e)
	{
		alert ('regular expression error: ' + e)
	}
	var arr = strSearch.match(regEx)
	return ((arr != null) && (arr.length == 1) && (strSearch == arr[0]))
}

function FocusField (fld)
{
	try
	{
		fld.focus ()
		fld.select ()
	}
	catch (e) {}
}
