<!--#if expr='$validator=loaded'-->
<!--#else -->
<!--#set var="validator" value="loaded"-->
function getElement(name,doc) {
if(doc!=null) return doc.getElementById(name);
else return (document.getElementById(name));
}

function getElements(name,doc){
if(doc!=null) return doc.getElementsByName(name);
else return (document.getElementsByName(name));
}

function getElementsByTag(name,doc){
if(doc!=null) return doc.getElementsByTagName(name);
else return (document.getElementsByTagName(name));
}

// Enables or disables (and clears value) objects based on the flag value
function enableObject(o, flag) {
var obj = getElement(o);
if (obj==null) return;
if( obj.type !=null)
enableOther(obj, flag);
else	// radio button has undefined type
for (k=0; k<obj.length; k++) enableOther(obj[k], flag);
}

function enableOther(obj, flag) {
if (obj != null)
obj.disabled = !flag;
} 

function displayObject(o,value){
var obj = getElements(o);
if(obj==null){
	obj=getElement(o);
}
if(obj!=null){
if(obj.style){
	obj.style.display=value;
} else{
	for(var i=0; i<obj.length; i++){
		obj[i].style.display=value;
	}
}
}
}

function isElementVisible(o) {
   var obj = getElement(o);
   return (null == obj) ? false : obj.style.display != "none";
}

function displayElement(o,value){
	var obj = getElement(o);
	if(obj!=null){obj.style.display=value;}
}

function toggle(id){
	var elem = getElement(id);
	if(elem!=null){
		if(elem.style.display=="none"){
			displayElement(id,"");
		}else{
			displayElement(id,"none");
		}
	}
}
function getRadioValue(o){
	var obj=getElement(o);
	if(obj==null){
		return "";
	}
	var frmObj=eval("obj.form."+o);
	
	// need to massage radio groups that contain just 1 entry, so they can be treated
	// like an array.
	if( typeof(frmObj.length) == "undefined" ) {
		frmObj.length = 1;
		frmObj[0] = frmObj;
	}
	
	for(var k = 0; k<frmObj.length;k++){
		if(frmObj[k].checked){
			return frmObj[k].value;
		}
	}
	return "";
}

function isPatternChar(chr){
if(chr=="5" || chr=="A" || chr=="a")return true;
else return false;
}

function matchPattern(chr,ptrn){
	switch(ptrn){
	case "5":
		return chr>="0"&&chr<="9";
	case "A":
		return chr>="A"&&chr<="Z";
	case "a":
		return chr>="a"&&chr<="z";
	default:
		return false;
	}
}

function normalizedField(fld,msk){
var res = "";
var i = 0;
var j = 0;
while(j<msk.length&&i<fld.value.length){
	if(!isPatternChar(msk.charAt(j))){
		if(msk.charAt(j)==fld.value.charAt(i)){
			res += fld.value.charAt(i);
			i++;j++;
		} else if(j+1<msk.length){
			res +=msk.charAt(j);
			j++;
		} else {
			return null;
		}
	} else if(matchPattern(fld.value.charAt(i),msk.charAt(j))){
		res += fld.value.charAt(i);
		i++;j++;
	} else {
		return null;
	}
}
	return res;
}

function handleRegexp(fld,regexp,hint){
	var fldValue = fld.value;
	if( null == fldValue || fldValue.length == 0 ) {
	hideHint();
	return true;
	}
	
	if( fldValue.match(regexp) ) {
	hideHint();
	return true;
	}
	
	
	showHint(fld,hint);
	return false;
}


function validate(fld, msk){
var mask=msk[0];
var hint=msk[1];
var mm=msk[2];
var regexp = msk[3];

if( null != regexp ){
	return handleRegexp(fld,regexp,hint);
}

var shadowvalue=normalizedField(fld,mask);
if(shadowvalue==null){
	showHint(fld,hint);
	return false;
}

if(shadowvalue==fld.value){
	if((hint=checkMinMax(shadowvalue,mask,mm))!=null){
		showHint(fld,hint);
		return false;
	} else {
		hideHint();
		return true;
	}
}

var idx = shadowvalue.length;
if(idx<mask.length && !isPatternChar(mask.charAt(idx))){
	while(idx<mask.length && !isPatternChar(mask.charAt(idx))){
		shadowvalue += mask.charAt(idx);
		idx++;
	}
} 
if(fld.value.length>0)fld.value = shadowvalue;

var mmHint=null;

if((mmHint=checkMinMax(fld.value,mask,mm))!=null){
	hint = hint + "\n" + mmHint;
	showHint(fld,hint);
	return false;
} else {
	hideHint();
	return true;
}
}

function hideHint(){
displayObject("validateHint","none");
}

function findPosX(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curleft += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	} else if (obj.x) {
		curleft += obj.x;
	}
	return curleft;
}

function findWidth(obj) {
	if(obj.offsetWidth){
		return obj.offsetWidth;
	} else if (obj.left){
		return obj.right - obj.left;
	}
}

function findHeight(obj) {
	if(obj.offsetHeight){
		return obj.offsetHeight;
	} else if (obj.top){
		return obj.bottom - obj.top;
	}
}


function findPosY(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curtop += obj.offsetTop;
			obj = obj.offsetParent;
		}
	} else if (obj.y) {
		curtop += obj.y;
	}
	return curtop;
}



function showHint(fld,hint){
var obj = getElement("validateHint");
if(obj==null)return;
obj.style.left=findPosX(fld) + "px";
obj.style.top=findPosY(fld)+fld.offsetHeight + "px";
obj.innerHTML=hint;
//obj.style.width=200;
//obj.style.height=200;

displayObject("validateHint","inline");
}

function checkMinMax(val,msk,minmax){
if(minmax==null)return null;
var acc = "";
var cur = 0;
for(var i=0;i<val.length;i++){
	if(isPatternChar(msk.charAt(i))){
		acc+=val.charAt(i);
	} else {
		var mm = minmax[cur];
		if(mm!=null){
			var min = mm[0];
			var max = mm[1];
			var len = mm[2];
			if(min!=null && acc<min) return mm[3];
			if(max!=null && acc>max) return mm[3];	
			if(val.length==msk.length&&acc.length!=len) return mm[3];
		}
		acc="";
		cur++;
	}
}
if(acc!=""){
	var mm = minmax[cur];
	if(mm!=null){
		var min = mm[0];
		var max = mm[1];
		var len = mm[2];
		if(min!=null && acc<min) return mm[3];
		if(max!=null && acc>max) return mm[3];	
		if(val.length==msk.length&&acc.length!=len) return mm[3];
	}
}
return null;
}



var focusField=null;
var focusFieldHint=null;
var focusSkipValidation=null;
function reFocus(){
	if(focusField!=null){
		focusSkipValidation=focusField;
		focusField.select();
		focusField.focus();
		if(focusFieldHint!=null){
			showHint(focusField,focusFieldHint);
		}
		focusField=null;
		focusFieldHint=null;
	}
}

function onFocusValidate(fld,msk){
	return (focusField==null || focusField==fld);
}


function onChangeValidate(fld,mask){
if(focusSkipValidation!=null && focusSkipValidation!=fld){
	return true;
} else if (focusSkipValidation==fld){
	focusSkipValidation = null;
}
if(fld.value.length==0) return true;
// if(!confirm("validate " + fld.name + "?")) return true;
var msk=mask[0];
var hint=mask[1];
var mm = mask[2];
var regexp = mask[3];
if( null != regexp ) {	
	if( handleRegexp(fld,regexp,hint) ) {
		return true; 
	} 

	focusFieldHint=hint;
	focusField=fld;
	if(document.all){ // IE.
		reFocus();
	} else { // the rest. This works in IE too but calling reFocus() right away is better
		window.setTimeout("reFocus()",20);
	}
	return false;	
}

var nrm = normalizedField(fld,msk);
if(nrm!=null){
fld.value=nrm;
}

var mmHint = null;
if((mm!=null && (mmHint=checkMinMax(fld.value,msk,mm))!=null) || !nrm || fld.value.length!=msk.length ){
	if(mmHint!=null){
		hint = hint + "\n" + mmHint;
	}
	focusFieldHint=hint;
	focusField=fld;
	if(document.all){ // IE.
		reFocus();
	} else { // the rest. This works in IE too but calling reFocus() right away is better
		window.setTimeout("reFocus()",20);
	}
	return false;
}else{
	hideHint();
}
return true;
}

function onKeyUp(fld, mask){
	validate(fld,mask);
	return true;
}

function onBlur(fld, mask){
	return onChangeValidate(fld,mask);
}


function attach(obj,mask){
var o = getElements(obj);

if(o.length){
	for(var i=0;i<o.length;i++){
		o[i].onkeyup=function(){return onKeyUp(this,mask);};
		o[i].onblur=function(){return onBlur(this,mask);};
	}
} else {
	o.onkeyup=function(){return onKeyUp(this,mask);};
	o.onblur=function(){return onBlur(this,mask);};
}
}

function attachDateValidator(obj){
	attach(obj,dateMask);
}

function attachPhoneValidator(obj){
	attach(obj,phoneMask);
}

function attachMMYYDateValidator(obj){
	attach(obj,dateMMYYMask);
}

function attachDateTimeValidator(obj){
	attach(obj,dateTimeMask);
}

function attachIntValidator(obj){
	attach(obj,intMask);
}

function attachFloatValidator(obj){
	attach(obj,floatMask);
}

function attachSSNValidator(obj){
	attach(obj,ssnMask);
}

function attachCurrencyValidator(obj){
	attach(obj,currencyMask);
}

function attachZipValidator(obj){
	attach(obj,zipMask);
}

//////////// date parts validator (min, max, size, tooltip)
var dateParts=new Array(
new Array(1,12,2,"Month must be entered as a 2 digit number within the range of 01-12"),
new Array(1,31,2,"Day must be entered as a 2 digit number within the range of 01-31"),
new Array(1950,2020,4,"Year must be entered as a 4 digit number within the range of 1950-2020")
);

//////////// date MMYY parts validator (min, max, size, tooltip)
var dateMMYYParts=new Array(
new Array(1,12,2,"Month must be entered as a 2 digit number within the range of 01-12"),
new Array(0,99,2,"Year must be entered as a 2 digit number within the range of 0 to 99")
);

//////////// date time parts validator(min, max, size, tooltip)
var dateTimeParts=new Array(
new Array(1,12,2,"Month must be entered as a 2 digit number within the range of 01-12"),
new Array(1,31,2,"Day must be entered as a 2 digit number within the range of 01-31"),
new Array(1950,2020,4,"Year must be entered as a 4 digit number within the range of 1950-2020"),
new Array(0,23,2,"Hour must be entered as a 2 digit number within the range of 00-23"),
new Array(0,59,2,"Minute must be entered as a 2 digit number within the range of 00-59")
);


/////////// validators (format, tooltip, individual_parts_validator)
var phoneMask = new Array("(555)555-5555","Correct phone format: (000)000-0000", null);
var dateMask = new Array("55/55/5555", "Correct date format: mm/dd/yyyy", dateParts);
var dateMMYYMask = new Array("55/55", "Correct date format: mm/yy", dateMMYYParts);
var dateTimeMask = new Array("55/55/5555 55:55", "Correct date-time format: mm/dd/yyyy HH:MM", dateTimeParts);
var intMask = new Array(null, "Accepted characters: 0123456789 (numeric only -- spaces, punctuation, and alphabetic characters are invalid)", null, /^(\d)*$/);
var floatMask = new Array(null, "Accepted characters: 0.123456789 (numeric and decimal only -- spaces, punctuation, and alphabetic characters are invalid)", null, /^(\d)+(\.)?(\d)*$/);
var ssnMask = new Array("555-55-5555", "Correct Social Security Number format: 555-55-5555", /^(\d){3}-(\d){2}-(\d){4}$/);
var currencyMask = new Array(null, "Correct currency format: 123.50 (commas, dollar signs, and alphabetic characters are invalid)", null, /^([1-9]{1}[0-9]{0,}(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|\.[0-9]{1,2})$/);
var zipMask = new Array(null, "Correct zip code format: 94111", null, /^(\d){5}(-\d{4})?$/);

if(getElement("validateHint")==null){
document.write(
"<div id=\"validateHint\" name=\"validateHint\" style=\"display:none; position:absolute; z-index: 10; background-color:#eebbbb; color: black; font-size: 11px; font-family: verdana, arial; border: 1px solid #333333;padding-left:2px; padding-right:2px\"></div>");
}
<!--#endif -->
