

function FormValidation(FormObj) {
	// Run through each text field in this form and call the field validation code
	// Assumes each field has a validation function named the same as the field name
	var Name, CleanName, i, Char;
	for (i = 0; i < FormObj.length; i++) {
		if ('text' == FormObj.elements[i].type ||
          'textarea' == FormObj.elements[i].type) { // validate only the text fields
			Name = FormObj.elements[i].name;
			if (Name != "") {
				CleanName = Name + "1"; // Field Name changed slightly so not same as field name
				//alert('Processing:'+ CleanName+"(FormObj."+Name+")")
				try {
					if (!eval(CleanName + "(FormObj." + Name + ")")) return false; // If field fails validation, stop
				}
				catch (ex) {
					alert("Error edit checking: " + Name);
				}
			}
		}
	}
	if (CustomValidation(FormObj)) return true; // Supplied by programmer; Custom for each form
	return false;
}

function ErrorMsg(FormObj, Text) {
	if (confirm(Text)) {
		var FocusCode = "document." + (FormObj.form.name) + "." + FormObj.name + ".focus()"
		setTimeout(FocusCode, 50) // need to wait for tab key to finish transfer before jumping back 
	}
}

function StripNum(Val) {
	//  Remove decorations (commas, dollar signs) from number
	var RefString = "-.0123456789", TempChar, OutString = "";
	Val = "" + Val; // Make sure Val is character string
	// Only keep chars in Val that are valid numeric chars (i.e. in "RefString")
	if (Val.length == 0) return ("");
	for (var i = 0; i < Val.length; i++) {
		TempChar = Val.substring(i, i + 1);
		if (RefString.indexOf(TempChar, 0) != -1) OutString = OutString + TempChar; // TempChar is valid number
	}
	return (OutString);
}

function CommaFmt(Num) {
	// Add commas to large numbers
	var Result, IX, Trailer
	Result = "";
	var Neg = ""
	if (Num < 0) {
		Neg = "-";
		Num = Math.abs(Num)
	}
	Num = Num.toString()
	IX = Num.indexOf('.', 0);
	if (IX < 0) {
		IX = Num.length
	} else {
		Num = Num + "00"
	}
	if ((Num.length - IX) > 3) Num = Num.substring(0, IX + 3) // only 2 decimal places past .
	if (IX <= 4) return Num; // too short for commas
	Result = Num.substring(IX, Num.length)
	Num = Num.substring(0, IX)
	while (Num.length > 3) {
		Result = "," + Num.substring(Num.length - 3, Num.length) + Result;
		Num = Num.substring(0, Num.length - 3)
	}
	Result = Neg + Num + Result;
	return Result;
}

function isDate(Value) {
	// return false if Value is not a valid date
	var IX = Value.indexOf('/', 0);
	if (-1 == IX) return false;
	var MM = 1 * Value.substring(0, IX);
	Value = Value.substring(IX + 1);
	IX = Value.indexOf('/', 0);
	if (-1 == IX) return false;
	var DD = 1 * Value.substring(0, IX);
	var YY = 1 * Value.substring(IX + 1);
	if (isNaN(DD)) return false;
	if (isNaN(MM)) return false;
	if (isNaN(YY)) return false;
	if ((MM < 1) || (MM > 12)) return false;
	if ((DD < 1) || (DD > 32)) return false;
	if (YY < 0) return false;
	if (YY > 2100) return false;
	var Ndays = 28;
	if (0 == YY % 4) Ndays = 29;
	if ((MM == 2) && (DD > Ndays)) return false
	if (((MM == 6) || (MM == 9) || (MM == 11)) && (DD > 30)) return false;
	return true // must be ok
}

function isNum(cNum) {
	cNum = parseFloat(StripNum(cNum))
	return (!isNaN(cNum));
}

function isNumFmt(FormObj) {
	// Return false if Field isn't in numeric Format or empty"
	// Also reformat to x,xxx.xx format
	var Val = StripNum(FormObj.value);
	FormObj.value = Val;
	if (Val.length == 0) return (true);
	Val = parseFloat(Val);
	if (isNaN(Val)) {
		ErrorMsg(FormObj, 'Please enter a valid number');
		return (false);
	}
	FormObj.value = CommaFmt(Val);
	return true;
}

function isNumRange(FormObj, Low, High) {
	// Return false if Field isn't in integer Format or empty and within range
	// Also reformat to x,xxx format
	var Val = StripNum(FormObj.value);
	FormObj.value = Val;
	if (Val.length == 0) return (true);
	Val = parseFloat(Val);
	if (isNaN(Val)) {
		ErrorMsg(FormObj, 'Please enter a valid number');
		return (false);
	}
	if ((Val < Low) || (High < Val)) {
		ErrorMsg(FormObj, 'Please enter a whole number between ' + Low + ' and ' + High);
		return (false);
	}
	FormObj.value = CommaFmt(Val);
	return true;
}

// Return false if "string" is empty or all blank
function isNotEmpty(String) {
	if (String.length == 0) { return (false); }
	for (var i = 0; i < String.length; i++) {
		if (String.substring(i, i + 1) != " ") { return (true); }
	}
	return (false);
}



function isEmpty(str) {
	// Check whether string is empty.
	for (var intLoop = 0; intLoop < str.length; intLoop++)
		if (" " != str.charAt(intLoop))
		return (false);
	return (true);
}


function isPhoneFmt(FormObj) {
	// Return false if field isn't in Phone Format (10 digit) or empty"
	// Also reformat phone to xxx-xxx-xxxx format
	var i, Tmp, String, NewString;
	String = FormObj.value;
	if (String.length == 0) { return (true); }
	NewString = "";
	var NumChars = 0;
	var OKchars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwyxz'
	for (var i = 0; i < String.length; i++) {
		Tmp = String.substring(i, i + 1);
		if (OKchars.indexOf(Tmp, 0) > -1) {
			NewString = NewString + Tmp;
			NumChars = NumChars + 1;
		}
	}
	if (0 == NumChars) { return (true); }
	if (10 <= NumChars) { // ok reformat
		String = ""
		if ('1' == NewString.substring(0, 1)) {
			String = "1-"
			NewString = NewString.substring(1, NewString.length)
		}
		String += NewString.substring(0, 3) + "-";
		String += NewString.substring(3, 6) + "-";
		String += NewString.substring(6, 10) + " ";
		String += NewString.substring(10, NewString.length);
		FormObj.value = String;
		return (true);
	}
	return (false);
}

function isEmailFmt(sEmail) {
	// Return true if this is probably an email address or empty
	// Valid email string must have a @ followed by a period
	if (false == isNotEmpty(sEmail)) return true; // Empty email ok
	var Loc1 = sEmail.indexOf("@");
	var Loc2 = sEmail.lastIndexOf(".");
	if (Loc1 == -1) return false; // must have an @ imbedded in string
	if (Loc2 < Loc1) return false; // must have an . after the @
	if (2 > (sEmail.length - Loc2)) return false; // more than 2 characters after .
	return true;
}

function isLength(String, Len) {
	// return false if String has fewer than "Len" non-blank characters
	if (String.length == 0) return false;
	var count = 0;
	for (var i = 0; i < String.length; ++i) {
		var ch = String.charAt(i);
		if (ch != ' ' & ch != '\t') count++;
	}
	if (count >= Len) return true;
	return false;
}

function isMoneyFmt(FormObj) {
	// Return false if Field isn't in Money Format or empty"
	// Also reformat to $xxx.xx format
	var Val = StripNum(FormObj.value)
	FormObj.value = Val;
	if (Val.length == 0) return (true);
	Val = parseFloat(Val)
	if (isNaN(Val)) {
		ErrorMsg(FormObj, 'Please enter a valid dollar amount.');
		return (false);
	}
	FormObj.value = "$" + CommaFmt(roundto(.01, Val))
	return true;
}

function isPct(FormObj) {
	// Return false if field isn't a percentage or empty"
	// Also reformat to xx% format
	var Value, NumVal
	Value = StripNum(FormObj.value)
	FormObj.value = Value
	if (Value.length == 0) return (true);
	FormObj.value = Value + "%"
	NumVal = parseFloat(Value)
	if (isNaN(NumVal)) {
		ErrorMsg(FormObj, 'Please enter a valid valid percentage');
		return (false);
	}
	if ((0 <= NumVal) && (NumVal <= 100)) return (true);
	ErrorMsg(FormObj, "Please enter a number between 0 and 100");
	return (false);
}

function isYear(FormObj) {
	// Return false if field isn't a valid year"
	var Value
	Value = StripNum(FormObj.value)
	if (Value.length == 0) return (true);
	NumVal = parseFloat(Value)
	if (isNaN(NumVal)) {
		ErrorMsg(FormObj, "Please enter a valid year");
		return (false);
	}
	if ((0 <= NumVal) && (NumVal < 50)) NumVal = 2000 + NumVal;
	if ((50 < NumVal) && (NumVal < 100)) NumVal = 1900 + NumVal;
	FormObj.value = NumVal
	if ((1900 <= NumVal) && (NumVal <= 2050)) return (true);
	ErrorMsg(FormObj, "Please enter a year between 1900 and 2050");
	return (false);

}

function roundto(Factor, Num) {
	// Round "Num" to nearest "Factor"
	/*    Ex: roundto (100, 2532)      --> 2500    (for nearest 100)
	roundto (1, 252.4284)    --> 252     (for nearest whole number)
	roundto (.01, 252.4284)  --> 252.43  (for dollars & cents)
	roundto (.125, 252.4284) --> 252.375 (for nearest 1/8th of a point)
	*/
	if (Factor == 0) return (0); // No can do if factor is zero -- just return zero
	Num = Factor * (Math.floor(.5 + (Num / Factor)));
	return (Num);
}

