<!--
var vf_gWHITE_SPACE = " \f\n\r\t";
var vf_gErrorMsg;

function vfTrimLeft(Str) {
	var count = 0, len = Str.length;
	for (var i=0; i<len; i++)
		if (vf_gWHITE_SPACE.indexOf(Str.charAt(i))!=-1) count++; else break;
	return count ? Str.substr(count) : Str;
}

function vfTrimRight(Str) {
	var count = 0, len = Str.length;
	for (var i=len-1; i>=0; i--)
		if (vf_gWHITE_SPACE.indexOf(Str.charAt(i))!=-1) count++; else break;
	return count ? Str.substr(0,len-count) : Str;
}

function vfTrim(Str) {
	return vfTrimRight(vfTrimLeft(Str));
}

function vfTrimFormText(AForm) {
	for (var i = 0; i < AForm.length; i++) {
		var formObj = AForm.elements[i];
		if (formObj.type == "text" || formObj.type =="textarea" || formObj.type =="password") 
			formObj.value = vfTrim(formObj.value);
	}	  
}

function vfTrimAllText() {
	if (!(document.all || document.getElementById))
		return;
	for (var k = 0; k < document.forms.length; k++) 
		vfTrimFormText(document.forms[k]);
}

function vfSetOnFocus() {
	if (!(document.all || document.getElementById))
		return;
	for (var k = 0; k < document.forms.length; k++) {
		var thisForm = document.forms[k];
		for (var i = 0; i < thisForm.length; i++) {
			var formObj = thisForm.elements[i];
			if (formObj.type == "text" || formObj.type =="textarea" || formObj.type =="password")
				formObj.onfocus = formObj.select;
		}	  
	}
}

function vfLegalChars(Str, Chars, EmptyOkay) {
	var len = Str.length;
	if (!len)
		return EmptyOkay ? true : false;
	for (var i = 0; i < len; i++)
		if (Chars.indexOf(Str.charAt(i))==-1)
			return false;
	return true;
}

function vfIsInteger(Str) {
	return vfLegalChars(Str, "0123456789", false);
}

function vfCheckTextLen(Obj, MinLen, MaxLen, Msg) {
	var len = Obj.value.length;
	if (!((!MinLen || len>=MinLen) && (!MaxLen || len<=MaxLen))) {
		alert(Msg);
		Obj.focus();
		return false;
	}
	return true;
}

function vfIsAllAscii(Str) {
	for (var i=0; i < Str.length; i++)
		if (Str.charCodeAt(i)>127)
			return false;
	return true;
}

function vfIsValidTopDomain(Str) {
	var regTopDomains=/^(com|edu|gov|int|mil|net|org|aero|arpa|biz|coop|info|museum|name|pro|tv)$/;
	return (Str.search(regTopDomains)!=-1) || (Str.length==2);
}

function vfIsValidEmail(EmailStr, CheckTopLevel) {
	var regUserInQuotes="(\"[^\"]*\")";
	var regNotBadStuff="\[^\\s<>\\[\\]\\(\\)@,;:\\\\\\\"\\.\]+";
	var arrEmailParts=EmailStr.match(/^(.+)@(.+)$/);
	if (!arrEmailParts) {
		vf_gErrorMsg = "There is an error in the form of the email address.";
		return false;
	}
	var userName=arrEmailParts[1];
	var domainLevel=arrEmailParts[2];
	if (!vfIsAllAscii(userName) || !vfIsAllAscii(domainLevel)) {
		vf_gErrorMsg = "The email address contains non-ASCII characters.";
		return false;
	}
	var userPart="(" + regUserInQuotes + "|" + regNotBadStuff + ")";
	var regUserName=new RegExp("^" + userPart + "(\\." + userPart + ")*$");
	if (!userName.match(regUserName)) {
		vf_gErrorMsg = "There is an error in the email address's user name.";
		return false;
	}
	var arrDomain=domainLevel.split(".");
	var len=arrDomain.length;
	if (len<2) {
		vf_gErrorMsg = "The email address lacks a domain level, e.g., .com or .org.";
		return false;
	}
	var atomPat=new RegExp("^" + regNotBadStuff + "$");
	for (var i = 0; i < len; i++) 
		if (arrDomain[i].search(atomPat)==-1) {
			vf_gErrorMsg = "The domain level " + arrDomain[i] + " in\n\n" + EmailStr + "\n\ncontains an illegal character.";
			return false;
		}
	if (CheckTopLevel && !vfIsValidTopDomain(arrDomain[arrDomain.length-1])) {
		vf_gErrorMsg = "The email address must include a recognized top-level domain, e.g., .com, .org, .biz,\n\nor two letters representing a country domain, e.g., .uk.";
		return false;
	}
	return true;
}

function vfForwardSlash(UrlStr) {
	var s = "";
	for (var i = 0; i < UrlStr.length; i++) {
		var ch = UrlStr.charAt(i);
		if (ch == '\\')
			ch = '/';
		s += ch;
	}
	return s;
}

function vfForwardSlashAllUrls(AForm, IdentifyingSubstr) {
	if (!(document.all || document.getElementById))
		return;
	for (var i = 0; i < AForm.length; i++) {
		var formObj = AForm.elements[i];
		if ((formObj.type == "text") && (formObj.name.indexOf(IdentifyingSubstr)!=-1)) 
			formObj.value = vfForwardSlash(formObj.value);
	}	  
}

function vfIsValidUrl(UrlStr, CheckTopLevel, RequiredExtPat) {
	if (UrlStr.match(/^(.+\s.+)$/)) {
		vf_gErrorMsg = "The web address contains a space, a tab, or other white space.";
		return false;
	}
	if (!vfIsAllAscii(UrlStr)) {
		vf_gErrorMsg = "The web address contains non-ASCII characters.";
		return false;
	}
	var urlStr = vfForwardSlash(UrlStr).toLowerCase();
	var arrUrlParts=urlStr.match(/^(http:\/\/|https:\/\/|ftp:\/\/)(.+)$/);
	if (!arrUrlParts) {
		vf_gErrorMsg = "There is an error in the form of the URL.\n\nUse http://... or ftp://...";
		return false;
	}
	var protocol=arrUrlParts[1], address=arrUrlParts[2];
	var arrAddrParts=address.match(/^(www\.|ftp\.)(.+)$/);
	if (arrAddrParts) {
		var ap1 = arrAddrParts[1];
		if ((protocol=="http://" && ap1!="www." && ap1!="ftp.") || (protocol=="ftp://" && ap1!="ftp.")) {
			vf_gErrorMsg = "Error:  " + protocol + " and " + ap1 + " in the same URL do not agree.";
			return false;
		}
		address = arrAddrParts[2]; //stripped of 'ftp.' or 'www.'
	}
	if (RequiredExtPat.length) {
		var re = new RegExp("^(" + RequiredExtPat + ")$");
		var arrFileParts = address.split(".");
		if (arrFileParts[arrFileParts.length-1].search(re)==-1) {
			vf_gErrorMsg = "Error in file type.  Accepted types are:  " + RequiredExtPat.replace("|", ", ") + ".";
			return false
		}
	}
	var domainName = address.indexOf("/")==-1?address:address.substr(0, address.indexOf("/"));
	var arrDomainParts = domainName.match(/^(.+)(\..+)$/);
//err var arrDomainParts = domainName.match(/^(.+)(\..+)([\?\/]*.*|)$/);
	if (!arrDomainParts) {
		vf_gErrorMsg = "The web address lacks a domain level, e.g., .com or .org.";
		return false;
	}
	if (CheckTopLevel) {
		if (!vfIsValidTopDomain(arrDomainParts[arrDomainParts.length-1].substr(1))) {
			vf_gErrorMsg = "The web address must include a recognized top-level domain, e.g., .com, .org, .biz,\nor two letters representing a country domain, e.g., .uk.";
			return false;
		}
	}
	return true;
}

function vfCheckEmail(Obj, MaxLen, Msg) {
	if (!vfCheckTextLen(Obj, 5, MaxLen, Msg))
		return false;
	if (!vfIsValidEmail(Obj.value, true)) {
		alert(Msg+"\n\n"+vf_gErrorMsg);
		Obj.focus();
		return false;
	}
	return true;
}

function vfCheckUrl(Obj, MaxLen, RequiredExtPat, Msg) {
	if (!vfCheckTextLen(Obj, 1, MaxLen, Msg))
		return false;
	if (!vfIsValidUrl(Obj.value, true, RequiredExtPat)) {
		alert(vf_gErrorMsg+"\n\n"+Msg);
		Obj.focus();
		return false;
	}
	return true;
}

function vfCheckUrlIfFilled(Obj, MaxLen, RequiredExtPat, Msg) {
	return Obj.value.length ? vfCheckUrl(Obj, MaxLen, RequiredExtPat, Msg) : true;
}

function vfCheckSelect(Obj, MinSelect, MaxSelect, Msg) {
	var count = 0;
	for (var i = 0; i < Obj.options.length; i++)
		if (Obj.options[i].selected)
			count++;
	if (!((!MinSelect || count>=MinSelect) && (!MaxSelect || count<=MaxSelect))) {
		alert(Msg);
		Obj.focus();
		return false;
	}
	return true;
}

function vfGetSelectOptionsStr(Obj) {
	var count = 0, s = "";
	for (var i = 0; i < Obj.options.length; i++) {
		if (Obj.options[i].selected) {
			if (count++) 
				s += ",";
			s += Obj.options[i].text;
		}
	}
	return s;
}

function vfIsInRange(Num, MinVal, MaxVal) {
	var num = parseFloat(Num);
	return (num >= MinVal) && (num <= MaxVal);
}

function vfCheckNumber(Obj, MinVal, MaxVal, AllowedPunc, EmptyOkay, Msg) {
	var objValue = Obj.value;
	var okay = vfLegalChars(objValue, "0123456789"+AllowedPunc, EmptyOkay) && ((EmptyOkay && !Obj.value.length) || vfIsInRange(objValue, MinVal, MaxVal));
	if (!okay) {
		alert(Msg);
		Obj.focus();
		return false;
	}
	return true;
}

function vfIsFloat(Obj, EmptyOkay, Msg) {
	var objValue = Obj.value;
	var okay = vfLegalChars(objValue, "0123456789,.", EmptyOkay) && !isNaN(objValue);
	if (!okay) {
		alert(Msg);
		Obj.focus();
		return false;
	}
	return true;
}

function vfCheckPasswords(Obj1, Obj2, Msg) {
	var passwordPat = /^([A-Za-z0-9_]){6,16}$/; 
	if ((Obj1.value != Obj2.value) || !Obj1.value.match(passwordPat) || !Obj2.value.match(passwordPat)) {
		alert(Msg);
		Obj1.focus();
		return false;
	}
	return true;
}

function vfFormBoxesChecked(AForm) {
	var count = 0;
	for (var i = 0; i < AForm.length; i++) {
		var formObj = AForm.elements[i];
		if ((formObj.type == "checkbox") && formObj.checked)
			count++;
	}
	return count;
}

function vfDateCheck(Obj, ConfirmYear) {
	var parts=Obj.value.split("/"), i, changed, d=new Date();
	if (parts.length!=3)
		return false;
	for (i=0; i<3; i++) {
		if (!vfIsInteger(parts[i]))
			return false;
		if (parts[i].length < 2) {
			parts[i] = "0"+parts[i];
			changed=true;
		}
	}
	if (!vfIsInRange(parts[0],1,12) || !vfIsInRange(parts[1],1,31) || !vfIsInRange(parts[2],1000,3000))
		return false;
	if (ConfirmYear && (parts[2]!=d.getFullYear()) && !confirm("The year "+parts[2]+" is not this year.\n\nAccept date anyway?"))
		return false;
	if (changed)
		Obj.value = parts[0]+"/"+parts[1]+"/"+parts[2];
	return true;
}

function vfFindObject(NameOrId, Doc) {
	var i, obj;
	if (!Doc)
		Doc = document;
	if (!(obj=Doc[NameOrId]) && Doc.all)
		obj=Doc.all[NameOrId];
	if (!obj && document.getElementById)
		obj = document.getElementById(NameOrId);
	for (i=0; !obj && i<Doc.forms.length; i++)
		obj = Doc.forms[i][NameOrId];
	for (i=0; !obj && Doc.layers && i<Doc.layers.length; i++)
		obj = vfFindObject(NameOrId, Doc.layers[i].document);
	return obj;
}

-->

