function Validate() {};
Validate.EMAIL   = 1;
Validate.INT     = 2;
Validate.STR     = 4;
Validate.DATE    = 8;
Validate.ZIP     = 16;   // either
Validate.ZIP9    = 32;   // xxxxx-xxxx
Validate.ZIP5    = 64;   // xxxxx
Validate.DECIMAL = 128;
Validate.REQ     = 256;
Validate.TOPTYPE = 256;

Validate.types = Array();
Validate.types[Validate.EMAIL]   = "a valid Email Address";
Validate.types[Validate.INT]     = "a Number";
Validate.types[Validate.STR]     = "a String";
Validate.types[Validate.DATE]    = "a Date";
Validate.types[Validate.ZIP]     = "a valid US Zip Code (00000 or 00000-0000)";
Validate.types[Validate.ZIP9]    = "a valid US Zip Code + 4 (00000-0000)";
Validate.types[Validate.ZIP5]    = "a valid US Zip Code (00000)";
Validate.types[Validate.DECIMAL] = "a valid Number with optional Decimal (0 or 0.00)";
Validate.types[Validate.REQ]     = "completed";

Validate.getType = function(type) { return Validate.types[type];}
Validate.validateField = function(fieldSpecs,field) {
//	try {
		var val = field.value;
		var r,tempType;
		var curType = Validate.TOPTYPE;
		var iType = Validate.getIType (fieldSpecs,field);
		while (iType > 0) {
			tempType = iType - curType;
			if (tempType >= 0) {
				iType = tempType;
				r = Validate.validateFunctions[curType](val);
				if (!r) { if (!document.layers) field.style.backgroundColor = '#446688'; return curType; }
			}
			curType/=2;
		}
		if (!document.layers) field.style.backgroundColor = '#cccccc';
		return 0;
/*	}
	catch (e) {
		alert ("Validate::validateField exception.  Field: "+field.name+" Value: "+val);
	}*/
}
Validate.getIType = function(fieldSpecs,field) {
	var iType = fieldSpecs[field.name];
	if (!iType) return (0); else return (iType);
/*DynAPI.TLfunctions.debugObj(field);
	var valStr;
	if (field.getAttribute)
		valStr = field.getAttribute('tl_validate');
	else
		valStr = field['tl_validate'];
	return (eval(valStr));*/
/*	try { return (eval(valStr)); }
	catch (e) { alert ("Error in tl_validate attribute ["+valStr+"] for field "+field.name); return null; }*/
}
Validate.containsType = function(field,checkType) {
	var iType = Validate.getIType(field);
	var mi = checkType;
	var ma = checkType*2-1;
	return ((iType >= mi) && (iType <= ma));
}
Validate.validateField.EMAIL = function(val) {
	if ((Validate.numOf('@',val)!=1) || (Validate.numOf('.',val)<1)) return false; else return true;
}
Validate.validateField.DATE = function(val) {
	while (val.indexOf("-")!=-1) val = val.replace("-","/");
	var firstSl = val.indexOf("/");
	if (firstSl == 1) val = "0"+val;
	var secondSl = val.substring(val.indexOf("/")+1).indexOf("/") + 3;
	if (secondSl == 4) val = val.substring(0,3)+"0"+val.substring(3);

	if (val.length != 10) return false;
	for (i=0; (i<10) && (valid==true); i++) {
		cur = val.substring(i,i+1);
		if ((i==2) || (i==5)) {
			if (cur != "/") return false;
		} 
		else if (Validate.isNumber(cur) == false) return false;
	}
	return true;
}
Validate.validateField.ZIP5 = function(val) {
	if (val.length != 5) return false;
	var cur;
	for (i=0; i<5; ++i) {
		cur = val.substring(i,i+1);
		if (Validate.isNumber(cur) == false) return false;
	}
	return true;
}
Validate.validateField.ZIP9 = function(val) {
	if (val.length != 10) return false;
	var cur;
	for (i=0; i<5; ++i) {
		cur = val.substring(i,i+1);
		if (Validate.isNumber(cur) == false) return false;
	}
	cur = val.substring(i,i+1);
	if (cur != '-') return false;
	for (i=6; i<10; ++i) {
		cur = val.substring(i,i+1);
		if (Validate.isNumber(cur) == false) return false;
	}
	return true;
}
Validate.validateField.ZIP = function(val) {
	return (Validate.validateField.ZIP5 (val) || Validate.validateField.ZIP9 (val));
}
Validate.validateField.DECIMAL = function(val) {
	var cur;
	while (val.indexOf(",")!=-1) val = val.replace(",","");
	var numdot = 0;
	for (i=0; i<val.length; i++) {
		cur = val.substring(i,i+1);
		if (cur==".") numdot++;
		if (!((((cur>="0") && (cur<="9")) || (cur==".")) && (numdot<=1))) return false;
	}
	return true;
}
Validate.validateField.INT = function(val) {
	var cur;
	while (val.indexOf(",")!=-1) val = val.replace(",","");
	for (i=0; (i<val.length) && (valid==true); i++) {
		cur = val.substring(i,i+1);
		if (!((cur>="0") && (cur<="9"))) return false;
	}
	return true;
}
Validate.validateField.STR = function(val) { return true; }
Validate.validateField.REQ = function(val) { return (val != ''); }

// -- helpers --
Validate.isNumber = function(val) { return ((val>="0") && (val<="9")); }
Validate.numOf = function(key,val) {
	var numof = 0;
	var i;
	var kl = key.length;
	var maxl = val.length-kl+1;
	for (i = 0; i<maxl; i++) {
		if (val.substring(i,i+kl)==key) numof++;
	}
	return (numof);
}

// -- static form walker --
Validate.validateForm = function(fieldSpecs,form) {
	var errorMsg   = '';
	var firstError = null;
	var result;
	for (var i in fieldSpecs) {
		var cur = form[i];
		if ((result = Validate.validateField(fieldSpecs,cur)) != 0) {
			errorMsg += cur.name + ' must be ' + Validate.types[result]+'\n';
			if (!firstError) firstError = cur;
		}
	}
	if (errorMsg == '') form.submit(); else {
		alert ('Please correct any errors before continuing.\n\n'+errorMsg);
		firstError.focus();
	}
}

// -- Functions array --
Validate.validateFunctions = Array();
Validate.validateFunctions[Validate.EMAIL]   = Validate.validateField.EMAIL;
Validate.validateFunctions[Validate.INT]     = Validate.validateField.INT;
Validate.validateFunctions[Validate.STR]     = Validate.validateField.STR;
Validate.validateFunctions[Validate.DATE]    = Validate.validateField.DATE;
Validate.validateFunctions[Validate.ZIP]     = Validate.validateField.ZIP;
Validate.validateFunctions[Validate.ZIP9]    = Validate.validateField.ZIP9;
Validate.validateFunctions[Validate.ZIP5]    = Validate.validateField.ZIP5;
Validate.validateFunctions[Validate.DECIMAL] = Validate.validateField.DECIMAL;
Validate.validateFunctions[Validate.REQ]     = Validate.validateField.REQ;

