// ---========== cross browser bs.
// ---========== 2/11/2002 justin / josh
if (document.all) {
	var isIE = true;
} else {
	var isIE = false;
}

//=====================================
function dateAdd( start, interval, number ) {
		// get the milliseconds for this Date object. 
		var buffer = Date.parse( start ) ;

		switch (interval.charAt(0)) {
				case 'd': case 'D': 
						number *= 24 ; // days to hours
						// fall through! 
				case 'h': case 'H':
						number *= 60 ; // hours to minutes
						// fall through! 
				case 'm': case 'M':
						number *= 60 ; // minutes to seconds
						// fall through! 
				case 's': case 'S':
						number *= 1000 ; // seconds to milliseconds
						break ;
				default:
				return null ;
		}
		return new Date( buffer + number ) ;
}
//=====================================
function nullValueInArray(aData, sValue) {
	for (var i=0; i<aData.length; i++) {
		if (String(aData[i]) == String(sValue)) {
			aData[i] = null;
			return aData;
		}
	}
	return aData;
}
//=====================================
// core object def.
function DataValidator() {
	//this.Validate = DataValidator_Validate;
	this.Validate = DataValidator_ValidateCollectionAware;
	this.Reset = DataValidator_Reset;
	this.toString = DataValidator_toString;
	var _DATATYPE_EXAMPLES = new Array();
	_DATATYPE_EXAMPLES["time"] = "time (ex: hh:mm)";
	_DATATYPE_EXAMPLES["int"] = "a Number value (ex: 1) no longer than nine digits";
	_DATATYPE_EXAMPLES["int>0"] = "a Number value greater than zero (ex: 1) no longer than nine digits";
	_DATATYPE_EXAMPLES["datetime"] = "a datetime formated value (ex: hh:mm mm/dd/yyyy)";
	_DATATYPE_EXAMPLES["date"] = "a date formated value (ex: mm/dd/yyyy)";
	_DATATYPE_EXAMPLES["money"] = "a money formated value (ex: x.xx)";
	_DATATYPE_EXAMPLES["emailaddress"] = "an email address (ex: example@somewhere.com)";
	_DATATYPE_EXAMPLES["phonenumber"] = "a phone number formated value (ex: xxx-xxx-xxxxx)";
	_DATATYPE_EXAMPLES["tinyint"] = "x";
	_DATATYPE_EXAMPLES["smallint"] = "x";
	_DATATYPE_EXAMPLES["string"] = "a string value";
	_DATATYPE_EXAMPLES["real"] = "a precision formated value (ex: x.xxxx)";
	_DATATYPE_EXAMPLES["boolean"] = "x";
	_DATATYPE_EXAMPLES["hexcolor"] = "a valid html hex color value (ex: FFFFFF)";
	this._DATATYPE_EXAMPLES = _DATATYPE_EXAMPLES;
}
function DataValidator_toString() {
	return "DataControl 0.0.7 (stable)";
}
function DataValidator_Reset(oTargetForm) {
	// 09/14/2001 jmoore: updated to be compatible with msie 4.x.x
	// reset the styles from previous any errors
	for (var iIndex=0; iIndex < oTargetForm.elements.length; iIndex++) {
		if (String(oTargetForm.elements[iIndex].type).toUpperCase() != "TEXT") continue;
		var sElementName = oTargetForm.elements[iIndex].name;
		if (sElementName == "") continue;
		if (oTargetForm.elements[sElementName].length)	{
			for (var iElementCount=0; iElementCount < oTargetForm.elements[sElementName].length; iElementCount++) {
				if (oTargetForm.elements[sElementName][iElementCount].type == "text") oTargetForm.elements[sElementName][iElementCount].className = "norm";
			}
		} else {
			if (oTargetForm.elements[sElementName].type == "text") oTargetForm.elements[sElementName].className = "norm";
		}
	}
	clearCSWarning();
}

function DataValidator_ValidateCollectionAware(oTargetForm, aFormFieldDatatypes, aRequiredFormFields, aFieldDescriptions) {
	this.Reset(oTargetForm);
	// preforms validation on the supplied form fields.
	// init form error variables
	var aErrors = new Array();
	var aRequiredErrors = new Array();
// 1/9/2002 justin. begin new array
	var aRequiredErrorFieldNames = new Array();
// 1/9/2002 justin. end new array
	var aDatatypeErrorFieldNames = new Array();
	// var sErrorMsg = "The following warnings were generated: <br />";
	var sErrorMsg = "";
	var bError = false;
	var sFirstErrorField = null;

	// datatype validation
	for (sFormField in aFormFieldDatatypes) {
		if (!oTargetForm.elements[sFormField]) continue;
		if (oTargetForm.elements[sFormField].length) {
			// multi
			for (var iElementCount=0; iElementCount < oTargetForm.elements[sFormField].length; iElementCount++) {
				if (String(oTargetForm.elements[sFormField][iElementCount].type).toUpperCase() == "HIDDEN") continue;
				if (oTargetForm.elements[sFormField][iElementCount].disabled == true) continue;
				if (oTargetForm.elements[sFormField][iElementCount].value != "") {
					if (oTargetForm.elements[sFormField][iElementCount].tagName != "SELECT") {
//						if (!validate(oTargetForm.elements[sFormField][iElementCount].value, aFormFieldDatatypes[sFormField])) aErrors[aErrors.length] = oTargetForm.elements[sFormField][iElementCount];
						if (!validate(oTargetForm.elements[sFormField][iElementCount].value, aFormFieldDatatypes[sFormField])) {
							aErrors[aErrors.length] = oTargetForm.elements[sFormField][iElementCount];
							aDatatypeErrorFieldNames[aDatatypeErrorFieldNames.length] = sFormField + "." + String(iElementCount);
						}
					}
				}
			}
		} else {
			// single
			if (String(oTargetForm.elements[sFormField].type).toUpperCase() == "HIDDEN") continue;
			if (oTargetForm.elements[sFormField].disabled == true) continue;
			if (oTargetForm.elements[sFormField].value != "") {
				if (oTargetForm.elements[sFormField].tagName != "SELECT") {
					if (!validate(oTargetForm.elements[sFormField].value, aFormFieldDatatypes[sFormField])) {
						aErrors[aErrors.length] = oTargetForm.elements[sFormField];
						aDatatypeErrorFieldNames[aDatatypeErrorFieldNames.length] = sFormField;
					}
				}
			}
		}
	}
	for (var i=0; i<aErrors.length; i++) {
		var oElement = aErrors[i];
		if (oElement.type == "HIDDEN") continue;
		var sFormField = String(oElement.name);
		sErrorMsg += '- You must supply ' + this._DATATYPE_EXAMPLES[aFormFieldDatatypes[sFormField]] + ' for the ' 
		// use descriptions if available.
		if (aFieldDescriptions) {
			var sFormField = aDatatypeErrorFieldNames[i];
			if (!aFieldDescriptions[sFormField]) {
			if (sFormField.substr(sFormField.indexOf('.')+1).indexOf(".") > -1) {
				var sTemp = sFormField.substr(sFormField.indexOf('.')+1);
				sFormField = sFormField.replace(sTemp.substr(sTemp.indexOf('.')), "");
			}
			}
			sErrorMsg += aFieldDescriptions[sFormField];
		} else {
			sErrorMsg += sFormField.substr(sFormField.indexOf('.')+1);
		}
		sErrorMsg += ' field.<br />';
		oElement.className = "error";
		if (sFirstErrorField == null) sFirstErrorField = oElement;
		bError = true
	}
	// required field check
	for (var i=0; i<aRequiredFormFields.length; i++) {
		if (aRequiredFormFields[i] == null) continue;
		var sFieldName = String(aRequiredFormFields[i]);
// collection aware required conditional
		if (sFieldName.indexOf(".") != sFieldName.lastIndexOf(".")) {
			// special case of optional required within a collection.
			var iIndex = parseInt(sFieldName.slice(sFieldName.lastIndexOf(".")+1, sFieldName.length));
			var sName = sFieldName.slice(0, sFieldName.lastIndexOf("."));
// 1/9/2002 justin. i changed the line below
//			if (String(oTargetForm.elements[sName][iIndex].value).length == 0) aRequiredErrors[aRequiredErrors.length] = oTargetForm.elements[sName][iIndex];
			if (String(oTargetForm.elements[sName][iIndex].value).length == 0) {
				aRequiredErrors[aRequiredErrors.length] = oTargetForm.elements[sName][iIndex];
				aRequiredErrorFieldNames[aRequiredErrorFieldNames.length] = sFieldName;
			}
		} else {
			if (oTargetForm.elements[aRequiredFormFields[i]].length) {
				if (oTargetForm.elements[sFieldName].options) {
					// select list?
					if (String(oTargetForm.elements[aRequiredFormFields[i]].options[oTargetForm.elements[aRequiredFormFields[i]].selectedIndex].value).length == 0) {
						aRequiredErrors[aRequiredErrors.length] = oTargetForm.elements[aRequiredFormFields[i]];
						aRequiredErrorFieldNames[aRequiredErrorFieldNames.length] = sFieldName;
					}
				} else {
					// multi
					for (var iElementCount=0; iElementCount < oTargetForm.elements[aRequiredFormFields[i]].length; iElementCount++) {
						if (oTargetForm.elements[aRequiredFormFields[i]][iElementCount].disabled == true) continue;

						if (String(oTargetForm.elements[aRequiredFormFields[i]][iElementCount].value).length == 0) {
							aRequiredErrors[aRequiredErrors.length] = oTargetForm.elements[aRequiredFormFields[i]][iElementCount];
							aRequiredErrorFieldNames[aRequiredErrorFieldNames.length] = sFieldName;
						}
					}
				}
			} else {
				// single
				//if (String(oTargetForm.elements[aRequiredFormFields[i]].value).length == 0) aRequiredErrors[aRequiredFormFields[i]] = "required";
				if (oTargetForm.elements[aRequiredFormFields[i]].disabled == false) {
					if (String(oTargetForm.elements[aRequiredFormFields[i]].value).length == 0) {
						aRequiredErrors[aRequiredErrors.length] = oTargetForm.elements[aRequiredFormFields[i]];
						aRequiredErrorFieldNames[aRequiredErrorFieldNames.length] = sFieldName;
					}
				}
			}
		}
	}
	for (var i=0; i<aRequiredErrors.length; i++) {
		var oElement = aRequiredErrors[i];
		if (oElement == null) continue;
		if (oElement.type == "HIDDEN") continue;
/* 1/9/2002 justin. this is the original copy of the part i changed for collection aware descriptions
		var sFormField = String(oElement.name);
		sErrorMsg += '- You must supply a value for the ';
		if (aFieldDescriptions) {
			sErrorMsg += aFieldDescriptions[sFormField];
		} else {
			sErrorMsg += sFormField.substr(sFormField.indexOf('.')+1);
		}
end original copy */
		sErrorMsg += '- You must supply a value for the ';

		if (aFieldDescriptions) {
			var sFormField = String(aRequiredErrorFieldNames[i]);
			sErrorMsg += aFieldDescriptions[sFormField];
		} else {
			var sFormField = String(oElement.name);
			sErrorMsg += sFormField.substr(sFormField.indexOf('.')+1);
		}

		sErrorMsg += ' field.<br />';
		oElement.className = "error";
		if (sFirstErrorField == null) sFirstErrorField = oElement;
		bError = true
	}
	
	if (bError) {
		if (!document.getElementById("warning")) {
			window.alert(sErrorMsg);
		} else {
			throwCSWarning(sErrorMsg);
		}
		//window.location.href = "#Warning"
		sFirstErrorField.focus();
		delete sErrorMsg;
		delete aErrors;
		delete aRequiredErrors;
		//oTargetForm.elements[sFirstErrorField].focus();
	}

	if (bError) {
		return false;
	} else {
		return true;
	}
}


function clearCSWarning() {
	var oWarningDiv = (document.all) ? document.all["warning"] : document.getElementById("warning");
	if (oWarningDiv) oWarningDiv.style.display = "none";
	return;
}
function throwCSWarning(sWarning) {
	var oSuccessDiv = (document.all) ? document.all["success"] : document.getElementById("success");
	var oWarningDiv = (document.all) ? document.all["warning"] : document.getElementById("warning");
	var oErrorDiv = (document.all) ? document.all["error"] : document.getElementById("error");
	if (oSuccessDiv) oSuccessDiv.style.display = "none";
	if (oErrorDiv) oErrorDiv.style.display = "none";
	if (oWarningDiv) { 
		(isIE) ? oWarningDiv.style.display = "block" : oWarningDiv.style.display = "table";
		document.getElementById("warningData").innerHTML = String(sWarning).replace(/\n/g, "<br />");
		window.scroll(0,0);
	} else {
		window.alert(sWarning);
	}
}
function clearFieldError(oElement) {
	oElement.className = "norm";
}
function throwFieldError(oElement) {
	oElement.className = "error";
}


function parseBoolean(value) {
	if (String(value).toUpperCase()=="TRUE") return "1";
	if (String(value).toUpperCase()=="FALSE") return "0";
}
function validate(val, type) {
	var expInt = /\D/;
	var expDateTime = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
	var expTime = /^\d{1,2}\:\d{1,2}$/;
	var expMoney = /\$?\d*\.\d{2}$/;
	var expEmail = /^[\w\.\-]+\@([(\w\.{0,1}\w)\-]|([\w\-]))+\.\w{2,3}$/;
	var expPhone = /^\d{3}\-\d{3}\-\d{4}$/;
	var expTinyint = /\d{1,3}/;
	var expSmallint = /\-?\d+/;
	var expString = /[\'\,]+/;
	var expStringComma = /[\']+/;
	// assuming a precision   v
	var expReal = /\-?\d*\.\d{2,4}$/;
	var expBoolean = /\[0-1]/;
	var expHexColor = /^[a-fA-F0-9]{6}$/;

	switch (type) {
		case 'time' :
			return expTime.test(val);
		case 'int' :
			if (String(val).length > 9) return false;
			return !expInt.test(val);
		case 'int>0' :
			if (String(val).length > 9) return false;
				return (val > 0) ? !expInt.test(val) : false;
		case 'datetime' :
			return expDateTime.test(val);
		case 'date' :
			return expDateTime.test(val);
		case 'money' :
			return expMoney.test(val);
		case 'emailaddress' :
			return expEmail.test(val);
		case 'phonenumber' :
			return expPhone.test(val);
		case 'tinyint' :
			return (val >= 0 && val <= 255) ? expTinyint.test(val) : false;
			//((val >= 0) && (val <= 255)) ? return expTinyint.test(val) : return false;
		case 'smallint' :
			return (val >= -32768 && val <= 32767) ? expSmallint.test(val) : false;
		case 'string' :	
			return !expString.test(val);
		case 'stringComma' :	
			return !expStringComma.test(val);
		case 'real' :
			return expReal.test(val);
		case 'boolean' :
			return expBoolean.test(val);
		case 'hexcolor' : 
			return expHexColor.test(val);
		default :
			return false
	}
}