function CheckItem(Item, ValuesObj)
{
//Item must be an array in the form of
//		true or false (true if Required, false if Optional) - does not apply to Checkbox
//		char for validation type
//		appropriate parameter for validation type
//		form object
//		object name
//		
// Validation types
//	T text field - specify 
//		* any chars
//		# numeric only (0-9)
//		A alpha only (A-Z, a-z)
//		$ money values only (0-9, one decimal, appropriate commas, and one leading dollar sign)
//		E email
//		P phone
//		Z zip code
//		D date
//	Y yes / no array
//	A single selection array - specify number of choices
//	M multiple selection array - specify number of choices
//	S state list box
//	C check box
//
//ValuesObj is an optional argument - It is an object that have the name & value of Item appended to it upon successful validation.
//	It is formatted as "Field Name: Field Value\n"


	switch (Item[1]) {
		case 'T':
			if (!CheckText(Item[3], Item[4], Item[2], Item[0] == true ? true : false, ValuesObj))
				return false
			break;

		case 'Y':
			if (!CheckArray(Item[3], Item[4], 2, Item[0] == true ? true : false, false, ValuesObj))
				return false
			break;

		case 'S':
			if (!CheckStateListBox(Item[3], Item[4], Item[0] == true ? true : false, ValuesObj))
				return false
			break;

		case 'A':
			if (!CheckArray(Item[3], Item[4], Item[2], Item[0] == true ? true : false, false, ValuesObj))
				return false
			break;

		case 'M':
			if (!CheckArray(Item[3], Item[4], Item[2], Item[0] == true ? true : false, true, ValuesObj))
				return false
			break;

		case 'C':
			if (!CheckCheckBox(Item[3], Item[4], ValuesObj))
				return false
			break;

		default:
			alert("bad data in javascript items table")
			return false
	}

	return true
}



function CheckCheckBox(obj, objname, ValuesObj)
{
	if (obj.checked == true) {
		//if we have a value obj, append value
		if (ValuesObj)
			ValuesObj.value += objname + ": Checked\n";
	}
	else {
		//if we have a value obj, append value
		if (ValuesObj)
			ValuesObj.value += objname + ": Un-checked\n";
	}

	return true
}

function CheckArray(obj, objname, arraysize, isrequired, allowmultiple, ValuesObj)
{
	var truecount = 0
	var selectedlist = ""

	for (var i = 0; i < arraysize; ++i) {
		if (obj[i].checked == true) {
			++truecount;

			//build a string of selected values for values obj
			if (selectedlist != "")
				selectedlist += ", ";

			selectedlist += obj[i].value;
		}
	}

	if (isrequired && !truecount) {
		alert("You left the '" + objname + "' field blank.")
		obj[0].focus()
		return false
	}

	if (truecount > 1 && !allowmultiple) {
		alert("You may only select one '" + objname + "'")
		obj[0].focus()
		return false
	}


	//if we have a value obj, append selected values
	if (ValuesObj)
		ValuesObj.value += objname + ": " + selectedlist + "\n";

	return true
}

function CheckText(obj, objname, validationtype, isrequired, ValuesObj)
{
//	validationtype 
//		* any chars
//		# numeric only (0-9)
//		A alpha only (A-Z, a-z)
//		$ money values only (0-9, one decimal, appropriate commas, and one leading dollar sign)
//		E email
//		P phone
//		Z zip code
//		D date

	//check required
	if (isrequired && obj.value == "") {
		alert("You left the '" + objname + "' field blank.")
		obj.focus()
		return false
	}

	//optional & blank is valid
	if (!isrequired && obj.value == "") {
		if (ValuesObj)
			ValuesObj.value += objname + ": (blank)\n"
		return true
	}

	switch (validationtype) {
		case '*':	//any chars
			break;

		case '#':	//numeric only (0-9)
			if (!checknumeric(obj, objname))
				return false
			break;

		case 'A':	//alpha only (A-Z, a-z)
			if (!checkalpha(obj, objname))
				return false
			break;

		case '$':	//money values only (0-9, one decimal, appropriate commas, and one leading dollar sign)
			if (!checkmoney(obj, objname))
				return false
			break;

		case 'D':	//date
			if (!checkdate(obj, objname))
				return false
			break;

		case 'E':	//email
			if (!checkemail(obj, objname))
				return false
			break;

		case 'P':	//phone
			if (!checkphone(obj, objname))
				return false
			break;

		case 'Z':	//zip code
			if (!checkzip(obj, objname))
				return false
			break;

		default:
			alert("bad validationtype passed to CheckText")
			return false
	}

	//if we have a value obj, append value
	if (ValuesObj)
		ValuesObj.value += objname + ": " + obj.value + "\n";

	return true;
}

function CheckStateListBox(obj, objname, isrequired, ValuesObj)
{
	//check required
	if (isrequired && obj.options[obj.selectedIndex].text == "") {
		alert("'" + objname + "' must be specified.")
		obj.focus()
		return false
	}

	//optional & blank is valid
	if (!isrequired && obj.options[obj.selectedIndex].text == "") {
		if (ValuesObj)
			ValuesObj.value += objname + ": (blank)\n"
		return true;
	}

	//make sure it is a valid abbreviation
	if (!isvalidstate(obj.options[obj.selectedIndex].text)) {
		alert("'" + objname + "' must be a valid state abbreviation.")
		obj.focus()
		return false
	}

	//if we have a value obj, append value
	if (ValuesObj)
		ValuesObj.value += objname + ": " + obj.options[obj.selectedIndex].text + "\n";

	return true
}

function isvalidstate(str)
{
	//make sure it is a valid abbreviation
	var states = new Array(
		"AK", "AL", "AR", "AZ", "CA", "CO", "CT", "DE", "FL", "GA", 
		"HI", "IA", "ID", "IL", "IN", "KS", "KY", "LA", "MA", "MD", 
		"ME", "MI", "MN", "MO", "MS", "MT", "NC", "ND", "NE", "NH", 
		"NJ", "NM", "NV", "NY", "OH", "OK", "OR", "PA", "RI", "SD", 
		"SC", "TN", "TX", "UT", "VA", "VT", "WA", "WI", "WV", "WY"
	);

	for (var i = 0; i < states.length; ++i) {
		if (str == states[i])
			return true
	}

	return false
}

function checkemail(obj, objname)
{
	var str = obj.value

	var re = /[^\w\@\.\-]/
	var check = re.exec(str)

	if (check != null) {
		alert("'" + objname + "' contains an invalid character [" + check[0] + "]")
		obj.focus()
		obj.select()
		return false
	}

	var re1 = /([\w\.\-]+)(\@)(\w+\.)(\w[\w\.\-]+)/
	var re2 = /([\w\.\-]+)(\@)(\w+\-\w+)(\.|\-)(\w\w+|\.\w\w+)+/
	var re3 = /spam/i

	var check1 = re1.exec(str)
	var check2 = re2.exec(str)
	var check3 = re3.test(str)

	if (check1 == null && check2 == null) {
		alert("'" + objname + "' appears to be incomplete.")
		obj.focus()
		obj.select()
		return false
	}

	if (check3 == true) {
		alert("'" + objname + "' may not contain the word SPAM")
		obj.focus()
		obj.select()
		return false
	}

	return true
}

function checkphone(obj, objname)
{
	var str = obj.value.replace(/\D/g,"")

	var re = /\d{10}/
	if (!re.test(str)) {
		alert("'" + objname + "' must contain ten digits.")
		obj.focus()
		obj.select()
		return false
	}

	re = /\d{11}/
	if (re.test(str)) {
		alert("'" + objname + "' may contain only ten digits.")
		obj.focus()
		obj.select()
		return false
	}

	return true
}

function checkzip(obj, objname)
{
	if (!checknumeric(obj, objname))
		return false

	//if 9 digits
	var re = /\d{9}/
	if (re.test(obj.value)) {

		//but not 10+
		re = /\d{10}/
		if (!re.test(obj.value))
			return true
	}
	else {
		//if 5 digits
		re = /\d{5}/
		if (re.test(obj.value)) {

			//but not 6+
			re = /\d{6}/
			if (!re.test(obj.value))
				return true
		}
	}

	//less than 5 digits or any err found falls thru here

	alert("'" + objname + "' must contain a five or nine digit zip code.")
	obj.focus()
	obj.select()
	return false
}


function checkalpha(obj, objname)
{
	var re = /[^a-zA-Z]/
	if (re.test(obj.value)) {
		alert("'" + objname + "' must contain only alphabetic letters.")
		obj.focus()
		obj.select()
		return false
	}

	return true
}

function checknumeric(obj, objname)
{
	var re = /[^\d]/
	if (re.test(obj.value)) {
		alert("'" + objname + "' must contain only numbers.")
		obj.focus()
		obj.select()
		return false
	}

	return true
}

function checkdate(obj, objname)
{
	var indate = obj.value;

	var sdate = (indate.indexOf("-") != -1) ? indate.split("-") : indate.split("/");

	if (sdate[2].length < 4) {
		alert("Please specify a four digit year for '" + objname + "'.")
		obj.focus()
		obj.select()
		return false;
	}

	var chkDate = new Date(Date.parse(indate))

	var year = chkDate.getYear();

	if (year < 1900)
		year += 1900;

	var cmpDate = (chkDate.getMonth() +1) + "/" + (chkDate.getDate()) + "/" + (year);
	var indate2 = (Math.abs(sdate[0])) + "/" + (Math.abs(sdate[1])) + "/" + (Math.abs(sdate[2]));

	if (indate2 != cmpDate || cmpDate == "NaN/NaN/NaN") {
		alert("'" + objname + "' must be a valid date.")
		obj.focus()
		obj.select()
		return false;
	}

	return true;
}

function checkmoney(obj, objname)
{
	var re = /[^\d\$\.\,]/
	if (re.test(obj.value)) {
		alert("'" + objname + "' must be a value money amount.")
		obj.focus()
		obj.select()
		return false
	}

	//dollar sign must be 1st char
	if (0 < obj.value.indexOf('$')) {
		alert("'" + objname + "' must be a value money amount (dollar sign must be the first character).")
		obj.focus()
		obj.select()
		return false
	}

	//if dec pt, must be followed by two digits
	var dec = obj.value.indexOf('.')
	var lastdec = obj.value.lastIndexOf('.')
	if (dec != -1 && (dec != obj.value.length -3 || dec != lastdec) ) {
		alert("'" + objname + "' must be a value money amount (decimal point must be followed by two digits).")
		obj.focus()
		obj.select()
		return false
	}

	//commas must be preceded by a digit and followed by exactly 3 digits
	var notdigitre = /[^\d]/

	for (var i = 0; i < obj.value.length; ++i) {
		c = obj.value.substring(i, i +1)
		if (c == ',') {
			var success = false

			//must followed by 3 digits
			s = obj.value.substring(i +1,i +4)
			if (s.length == 3) {
				if (!notdigitre.test(s)) {

					//can't followed by 4 digits
					s = obj.value.substring(i +4,i +5)
					if (s.length != 1 || notdigitre.test(s)) {

						//must preceded by a digit
						s = obj.value.substring(i -1, i)
						if (s.length == 1) {
							if (!notdigitre.test(s))
								success = true
						}
					}
				}
			}

			if (!success) {
				alert("'" + objname + "' must be a value money amount (bad comma usage).")
				obj.focus()
				obj.select()
				return false
			}
		}
	}

	return true
}

