	function dateValid(txt) {
		if (!txt.value) return true;
	
		var dateObj = new Date(txt.value);
		if (isNaN(dateObj)) {
			return false;
		}
		
		txt.value = formatDate(dateObj);
		return true;
	}

	function formatDate(dateObj) {
		var month = twoDigit(dateObj.getMonth() + 1);
		var day = twoDigit(dateObj.getDate());
		var year = getFullYear(dateObj);
		return month + "/" + day + "/" + year;
	}
	
	function twoDigit(n) {
		var s = "0" + n;
		return s.substring(s.length - 2, s.length);
	}
	
	function getFullYear(d) {
		var y = d.getYear();
		if (y <= 10 && y < 1000){
		 y += 2000;
		 }
		else if (y > 10 && y < 1000) {
		 y += 1900;
		 }
		 return y;
	}

	function formatIfDate(txt) {
		var val = txt.value;
		if (numberIsLike(val,"########") || numberIsLike(val,"######")) {
			val = val.substring(0,2) + "/" + val.substring(2,4) + "/" + val.substring(4,8);
		}
		var dateObj = new Date(val);
		if (!isNaN(dateObj)) {
			txt.value = formatDate(dateObj);
			return true;
		}
		return false;
	}
	
	function numberIsLike(sNumber,sMask) {
		if (sNumber.length != sMask.length) return false;
		for (var i = 0; i < sNumber.length; i++) {
			if (sMask.substring(i,i+1) == "#") {
				var curChar = sNumber.substring(i,i+1);
				if (curChar < "0" || curChar > "9") return false;
			} else {
				if (sNumber.substring(i,i+1) != sMask.substring(i,i+1)) {
						return false;
				}
			}
		}
		return true;
	}	
	
	function txtEmpty(txt,desc) {
		var bEmpty = false;
		switch (txt.type) {
			case "text":
			case "textarea":
				bEmpty = (!txt.value);
				break;
			case "select-one":
				bEmpty = (!txt.value && txt.options.length > 1);
				break;
			case "select-multiple":
				bEmpty = (txt.selectedIndex == -1);
				break;
		}
		if (bEmpty) {
			txt.focus();
			if (txt.select) txt.select();
			alert("[ALERT]\n\n" + desc + " required.");
			txt.focus();
			if (txt.select) txt.select();
		}
		return bEmpty;
	}

	function radioChecked(rad,desc) {
		var result;
		if (!rad) result = false;
		else if (!rad.length) {
			result = rad.checked;
		} else {
			result = false;
			for (var i = 0; i < rad.length; i++) {
				if (rad[i].checked) {
					result = true;
					break;
				}
			}
			rad = rad[0];
		}
		if (!result) {
			if (rad) rad.focus();
			alert("[ALERT]\n\n" + desc + " required.")
			if (rad) rad.focus();
		}
		return result;
	}

	function iSradioChecked(rad) {
		var result;
		if (!rad) result = false;
		else if (!rad.length) {
			result = rad.checked;
		} else {
			result = false;
			for (var i = 0; i < rad.length; i++) {
				if (rad[i].checked) {
					result = true;
					break;
				}
			}
			rad = rad[0];
		}
		return result;
	}
	
	function phoneValid(txt) {
		if (!txt.value) return true;
		if (numberIsLike(txt.value,"(###) ###-####")) return true;
		txt.focus();
		alert("[ALERT]\n\nPhone format must be \"(###) ###-####\"");
		txt.focus();
		txt.select();
		return false;
	}
	
	function formatPhone(txt) {
		txt.value = formatPhoneString(txt.value);
	}

	function formatPhoneString(phone) {
		var sResult = "";
		for (var i = 0; i < phone.length; i++) {
			var curChar = phone.substring(i,i + 1);
			if (curChar >= "0" && curChar <= "9") {
				sResult += curChar;
			}
		}
		if (!sResult) return "";
		
		sResult += "		  ";
		var area = sResult.substring(0,3);
		var exchange = sResult.substring(3,6);
		var extension = sResult.substring(6,10);
		sResult = "(" + area + ") " + exchange + "-" + extension;
		return sResult;
	}
	
	function zipValid(txt) {
		if (!txt.value) return true;
		if (numberIsLike(txt.value,"#####")) return true;
		if (numberIsLike(txt.value,"#########")) return true;
		txt.focus();
		alert("[ALERT]\n\nZip format must be \"#####\" or \"#########\"");
		txt.focus();
		txt.select();
		return false;
	}
	
	function formatIfTime(txt) {
		var v = txt.value;
		if (!v) return true;
		if (numberIsLike(v,"###") || numberIsLike(v,"####")) {
			var l = v.length;
			v = v.substring(0,l - 2) + ":" + v.substring(l - 2, l);
		}
		var t = new Date("1/1/1970 " + v);
		if (isNaN(t)) return false;
		var hours;
		var minutes;
		var ampm;
		hours = t.getHours();
		if (hours < 12) ampm = "am";
		else ampm = "pm";
		hours = (hours + 11) % 12 + 1;
		minutes = "0" + t.getMinutes();
		minutes = minutes.substring(minutes.length - 2,minutes.length);
		var sResult = hours + ":" + minutes + " " + ampm;
		txt.value = sResult;
		return true;
	}

	function timeValid(txt) {
		if (!formatIfTime(txt)) {
			with (txt) {
				focus();
				select();
				alert("[ALERT]\n\nTime format must be \"HH:MM am/pm\"");
				focus();
				select();
			}
			return false;
		}
		return true;
	}

