/* $Id: validateInputs.js,v 1.1 2003/12/12 16:51:40 lsa Exp $ */

function ValueTypes() {
	this.dtNumeric = "dtNumeric";
	this.dtFloat = "dtFloat";
	this.dtDate = "dtDate";
	this.dtTime = "dtTime";
	this.dtDateTime = "dtDateTime";
	this.dtEMail = "dtEMail";
	this.dtMoney = "dtMoney";
	this.dtNatural = "dtNatural";
	this.dtCustom = "dtCustom";
}

var valueTypes = new ValueTypes();

function ExtendedAttributes() {
	this.vValidate = "vValidate";
	this.vValidateEx = "vValidateEx";
	this.vRequired = "vRequired";
	this.vDataType = "vDataType";
	this.vExtStyle = "vExtStyle";
	this.vRequireMsg = "vRequireMsg";
	this.vValidateMsg = "vValidateMsg";
	this.vCustomValidate = "vCustomValidate";
	this.vCustomValidateMsg = "vCustomValidateMsg";
}

var extAttributes = new ExtendedAttributes();

function ExtendedStyles() {
	this.precision = "extPrecision";
	this.scale = "extScale";
}

var extStyles = new ExtendedStyles();

var emptyValue;

function StyleParser(sStyles) {
	this.style = new Object();
	var vItems = String(sStyles).split(';');
	var sProperties;
	for (var i = 0; i < vItems.length; i++) {
		sProperties = vItems[i];
		var vProperty = sProperties.split(":");
		var sPropertyName, sPropertyValue;
		if (vProperty.length == 2) {
			sPropertyName = trim(vProperty[0]);
			sPropertyValue = trim(vProperty[1]);
			try {
				eval('this.style.' + sPropertyName + ' = ' + '"' + sPropertyValue + '"');
			}
			catch(e){}
		}
	}
	this.length = getStylesItemsLength;
	this.items = getStyleItemValue;
}

function getStylesItemsLength() {
	var length = 0;
	var sPropertyName;
	for (sPropertyName in this.style) length++;
	return length;
}

function getStyleItemValue(ind) {
	var vValue;
	if (isFinite(ind)) {
		if (ind >= 0) {
			var sPropertyName;
			for (sPropertyName in this.style) {
				ind--;
				if (ind < 0) {
					vValue = eval('this.style.' + sPropertyName);
					break;
				}
			}
		}
	}
	else {
		try {
			vValue = eval('this.style.' + ind);
		}
		catch(e){}
	}
	return vValue;
}

var DefMsgErrDataTypeUnknown = "Error: data type unknown.";
var DefMsgErrDataTypeUnsupported = "Error: unsupported data type.";

var DefMsgRequired = "Error: value required.";
var DefMsgValidate = "Error: invalid value.";
var DefMsgPrefix = "Some mandatory fields are left empty or are in invalid format:";
var DefMsgSuffix = "Please check and try again.";

function getValidateMessage(msg) {
	return (DefMsgPrefix + "\n\n" + msg + "\n\n" + DefMsgSuffix);
}

function checkElementsBySuffArr(form, objPrefArr, objSuffArr, objRequireMsgArr, objValidateMsgArr, objCustomValidateMsgArr) {
	var result = true;
	var element = null;
	
	for (var i = 0; i < objSuffArr.length; i++) {
		var checker = document.getElementById(objPrefArr[0] + objSuffArr[i]);
		var msg;
		if (checker.checked) {
			for (var j = 1; j < objPrefArr.length; j++) {
				var sRequireMsg;
				if (objRequireMsgArr instanceof Array) sRequireMsg = objRequireMsgArr[j - 1];
				var sValidateMsg;
				if (objValidateMsgArr instanceof Array) sValidateMsg = objValidateMsgArr[j - 1];
				var sCustomValidateMsg;
				if (objCustomValidateMsgArr instanceof Array) sCustomValidateMsg = objCustomValidateMsgArr[j - 1];
				element = form.elements[objPrefArr[j] + objSuffArr[i]];
				if (element != null) {
					result = (!(msg = checkelement(element, sRequireMsg, sValidateMsg, sCustomValidateMsg)));
					if (msg) {
						element.focus();
						alert(getValidateMessage(msg));
						break;
					}
				}
			}
		}
		if (msg) break;
	}
	return result;
}

function checkElementsBySuff(form, objPrefArr, objSuffCount, objRequireMsgArr, objValidateMsgArr, objCustomValidateMsgArr) {
	var result = true;
	var element = null;
	
	for (var i = 1; i <= objSuffCount; i++) {
		var checker = document.getElementById(objPrefArr[0] + i);
		var msg;
		if (checker.checked) {
			for (var j = 1; j < objPrefArr.length; j++) {
				var sRequireMsg;
				if (objRequireMsgArr instanceof Array) sRequireMsg = objRequireMsgArr[j - 1];
				var sValidateMsg;
				if (objValidateMsgArr instanceof Array) sValidateMsg = objValidateMsgArr[j - 1];
				var sCustomValidateMsg;
				if (objCustomValidateMsgArr instanceof Array) sCustomValidateMsg = objCustomValidateMsgArr[j - 1];
				element = form.elements[objPrefArr[j] + i];
				if (element != null) {
					result = (!(msg = checkelement(element, sRequireMsg, sValidateMsg, sCustomValidateMsg)));
					if (msg) {
						element.focus();
						alert(getValidateMessage(msg));
						break;
					}
				}
			}
		}
		if (msg) break;
	}
	return result;
}

function checkElements(form) {
	var msgFull = "", msg;
	var element = null;
	for (var i = 0; i < form.elements.length; i++) {
		if (msg = checkelement(form.elements[i])) {
			if (element == null) element = form.elements[i];
			if (msgFull == "") {
				msgFull = msg;
			}
			else {
				msgFull = msgFull + "\n" + msg;
			}
		}
	}
	if (msgFull != "") {
		alert(getValidateMessage(msgFull));
		if (element != null) element.focus();
	}
	return (msgFull == "");
}

function checkElement(element) {
	var msg;
	if (msg = checkelement(element)) {
		element.focus();
		alert(getValidateMessage(msg));
		return (false);
	}
	else return (true);
}

function checkelement(element, sRequireMsg, sValidateMsg, sCustomValidateMsg) {

	var vValidate = element.getAttribute(extAttributes.vValidate);
	var vValidateEx = element.getAttribute(extAttributes.vValidateEx);
	if (vValidateEx) {
		vValidateEx = eval(vValidateEx);
	}
	else vValidateEx = true;
	var vRequireMsg;
	var vRequired;
	var vDataType;
	var vValidateMsg;
	var vCustomValidateMsg;

	if ((vValidate) && ((vValidate == "1") || (vValidate.toUpperCase() == "YES") || (vValidate.toUpperCase() == "TRUE")) && (vValidateEx)) {

		vRequireMsg = element.getAttribute(extAttributes.vRequireMsg);
		if (!(vRequireMsg)) vRequireMsg = sRequireMsg;
		if (!(vRequireMsg)) vRequireMsg = DefMsgRequired;
		
		vRequired = element.getAttribute(extAttributes.vRequired);
		if ((vRequired) && ((vRequired == "1") || (vRequired.toUpperCase() == "YES") || (vRequired.toUpperCase() == "TRUE"))) {
			if (element.tagName.toUpperCase() == "SELECT") {
				if (element.selectedIndex == -1) return (vRequireMsg);
				if ((element.type == "select-one") && (!((new NonEmptyParser(element.value)).doCheck()))) return (vRequireMsg);
			}
			else {
				if (!((new NonEmptyParser(element.value)).doCheck())) return (vRequireMsg);
			}
		}
		else {
			if (!((new NonEmptyParser(element.value)).doCheck())) return (false);
		}
		
		if (element.tagName.toUpperCase() == "SELECT") return (false);
		
		if (!(vDataType = element.getAttribute(extAttributes.vDataType))) {
			return ("\nElement id: " + element.id + "\nElement name: " + element.name + "\n" + DefMsgErrDataTypeUnknown + "\n");
		}

		vValidateMsg = element.getAttribute(extAttributes.vValidateMsg);
		if (!(vValidateMsg)) vValidateMsg = sValidateMsg;
		if (!(vValidateMsg)) vValidateMsg = DefMsgValidate;

		vCustomValidateMsg = element.getAttribute(extAttributes.vCustomValidateMsg);
		if (!(vCustomValidateMsg)) vCustomValidateMsg = sCustomValidateMsg;
		if (!(vCustomValidateMsg)) vCustomValidateMsg = vValidateMsg;

		var vCustomValidate = element.getAttribute(extAttributes.vCustomValidate);
		if (vCustomValidate == null) vCustomValidate = emptyValue;

		switch(vDataType) {
			case valueTypes.dtNumeric: {
				var precision = eval('element.style.' + extStyles.precision);
				if (typeof(precision) == 'undefined') {
					precision = new StyleParser(element.getAttribute(extAttributes.vExtStyle)).items(extStyles.precision);
				}
				
				var scale = eval('element.style.' + extStyles.scale);
				if (typeof(scale) == 'undefined') {
					scale = new StyleParser(element.getAttribute(extAttributes.vExtStyle)).items(extStyles.scale);
				}
				
				var result = (new NumericParser(element.value, precision, scale, vCustomValidate)).doCheck();
				if (result == 2) return (vCustomValidateMsg)
				else if (result != 0) return (vValidateMsg);
				break;
			}
			case valueTypes.dtFloat: {
				var result = (new FloatParser(element.value, vCustomValidate)).doCheck();
				if (result == 2) return (vCustomValidateMsg)
				else if (result != 0) return (vValidateMsg);
				break;
			}
			case valueTypes.dtDate: {
				var result = (new DateParser(element.value, vCustomValidate)).doCheck();
				if (result == 2) return (vCustomValidateMsg)
				else if (result != 0) return (vValidateMsg);
				break;
			}
			case valueTypes.dtTime: {
				var result = (new TimeParser(element.value, vCustomValidate)).doCheck();
				if (result == 1) return (vValidateMsg)
				else if (result == 2) return (vCustomValidateMsg);
				break;
			}
			case valueTypes.dtDateTime: {
				var result = (new DateTimeParser(element.value, vCustomValidate)).doCheck();
				if (result == 2) return (vCustomValidateMsg)
				else if (result != 0) return (vValidateMsg);
				break;
			}
			case valueTypes.dtEMail: {
				var result = (new EMailParser(element.value, vCustomValidate)).doCheck();
				if (result == 2) return (vCustomValidateMsg)
				else if (result != 0) return (vValidateMsg);
				break;
			}
			case valueTypes.dtMoney: {
				var precision = eval('element.style.' + extStyles.precision);
				if (typeof(precision) == 'undefined') {
					precision = new StyleParser(element.getAttribute(extAttributes.vExtStyle)).items(extStyles.precision);
				}

				var scale = eval('element.style.' + extStyles.scale);
				if (typeof(scale) == 'undefined') {
					scale = new StyleParser(element.getAttribute(extAttributes.vExtStyle)).items(extStyles.scale);
				}
				
				var result = (new MoneyParser(element.value, precision, scale, vCustomValidate)).doCheck();
				if (result == 2) return (vCustomValidateMsg)
				else if (result != 0) return (vValidateMsg);
				break;
			}
			case valueTypes.dtNatural: {
				var precision = eval('element.style.' + extStyles.precision);
				if (typeof(precision) == 'undefined') {
					precision = new StyleParser(element.getAttribute(extAttributes.vExtStyle)).items(extStyles.precision);
				}
				
				var result = (new NaturalParser(element.value, precision, vCustomValidate)).doCheck();
				if (result == 2) return (vCustomValidateMsg)
				else if (result != 0) return (vValidateMsg);
				break;
			}
			case valueTypes.dtCustom: {
				var precision = eval('element.style.' + extStyles.precision);
				if (typeof(precision) == 'undefined') {
					precision = new StyleParser(element.getAttribute(extAttributes.vExtStyle)).items(extStyles.precision);
				}
				
				var scale = eval('element.style.' + extStyles.scale);
				if (typeof(scale) == 'undefined') {
					scale = new StyleParser(element.getAttribute(extAttributes.vExtStyle)).items(extStyles.scale);
				}
				
				var result = (new CustomParser(element.value, precision, scale, vCustomValidate)).doCheck();
				if (result == 2) return (vCustomValidateMsg)
				else if (result != 0) return (vValidateMsg);
				break;
			}
			default: {
				return ("\nElement id: " + element.id + "\nElement name: " + element.name + "\n" + DefMsgErrDataTypeUnsupported + "\n");
			}
		}
	}
	
	return (false);
}

function checkExp(value, regExp) {
	var arr = regExp.exec(value);
	if (arr) {
		for (var i = 0; i < arr.length; i++) {
			if (arr[i] == value) return true;
		}
	}
	return false;
}

function NonEmptyParser(value) {
	if (typeof(value) == 'undefined') this.value = "";
	else this.value = value;
	
	this.getRegExp = getNonEmptyRegExp;
	this.doCheck = doCheckNonEmpty;
}

function getNonEmptyRegExp() {
	return new RegExp("\\S");
}

function doCheckNonEmpty() {
	return ((this.getRegExp()).test(this.value));
}

function NumericParser(value, precision, scale, vCustomValidate) {
	this.dataType = valueTypes.dtNumeric;
	
	if (typeof(value) == 'undefined') this.value = 0;
	else this.value = value;
	
	if (typeof(precision) == 'undefined') this.precision = 12;
	else this.precision = precision;
	
	if (typeof(scale) == 'undefined') this.scale = 2;
	else this.scale = scale;
	
	this.vCustomValidate = vCustomValidate;
	
	this.getRegExp = getNumericRegExp;
	this.doCheck = doCheckNumeric;
}

function getNumericRegExp() {
	var s = "[+|-]{0,1}[\\d]{0," + this.precision + "}";
	if (this.scale > 0) {
		s = s + "(\\.[\\d]{1," + this.scale + "}|)";
	}
	return new RegExp(s);
}

function doCheckNumeric() {
	var result = 0;
	if (checkExp(this.value, this.getRegExp())) {
		if (typeof(this.vCustomValidate) != 'undefined') {
			if (!eval(this.vCustomValidate)) {
				result = 2;
			}
		}

	}
	else result = 1;
	
	return result;
}

function FloatParser(value, vCustomValidate) {
	this.dataType = valueTypes.dtFloat;
	
	if (typeof(value) == 'undefined') this.value = 0;
	else this.value = value;
	
	this.vCustomValidate = vCustomValidate;
	
	this.getRegExp = getFloatRegExp;
	this.doCheck = doCheckFloat;
}

function getFloatRegExp() {
	return new RegExp("[+|-]{0,1}[\\d]*(\\.[\\d]*|)");
}

function doCheckFloat() {
	var result = 0;
	if (checkExp(this.value, this.getRegExp())) {
		if (typeof(this.vCustomValidate) != 'undefined') {
			if (!eval(this.vCustomValidate)) {
				result = 2;
			}
		}

	}
	else result = 1;
	
	return result;
}

function DateParser(value, vCustomValidate) {
	this.dataType = valueTypes.dtDate;
	
	if (typeof(value) == 'undefined') this.value = "01/01/2000";
	else this.value = value;
	
	this.vCustomValidate = vCustomValidate;
	
	this.getRegExp = getDateRegExp;
	this.doCheck = doCheckDate;
}

function getDateRegExp() {
	return new RegExp("[\\d]{1,2}[/]{1}[\\d]{1,2}[/]{1}[\\d]{1,4}");
}

function doCheckDate() {
	var result = 1;
	if (!checkExp(this.value, this.getRegExp())) return (result);
	var days = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	var date = this.value.split("/");
	var day = new Number(date[0]);
	var month = new Number(date[1]);
	var year = new Number(date[2]);
	if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) {
		days[1] = 29;
	}
	if ((month < 1) || (12 < month)) return (result);
	if ((day < 1) || (days[month - 1] < day)) return (result);

	result = 0;
	if (typeof(this.vCustomValidate) != 'undefined') {
		if (!eval(this.vCustomValidate)) {
			result = 2;
		}
	}
	
	return result;
}

function TimeParser(value, vCustomValidate) {
	this.dataType = valueTypes.dtTime;
	
	if (typeof(value) == 'undefined') this.value = "00:00:00";
	else this.value = value;
	
	this.vCustomValidate = vCustomValidate;
	
	this.getRegExp = getTimeRegExp;
	this.doCheck = doCheckTime;
}

function getTimeRegExp() {
	return new RegExp("[\\d]{1,2}[:]{1}[\\d]{1,2}([:]{1}[\\d]{1,2}|)");
}

function doCheckTime() {
	var result = 1;
	if (!checkExp(this.value, this.getRegExp())) return (result);
	var time = this.value.split(":");
	var hour = new Number(time[0]);
	var minute = new Number(time[1]);
	var second = new Number(time[2]);
	if ((hour < 0) || (23 < hour)) return (result);
	if ((minute < 0) || (59 < minute)) return (result);
	if ((second < 0) || (59 < second)) return (result);
	
	result = 0;
	
	if (typeof(this.vCustomValidate) != 'undefined') {
		if (!eval(this.vCustomValidate)) {
			result = 2;
		}
	}
	
	return result;
}

function DateTimeParser(value, vCustomValidate) {
	this.dataType = valueTypes.dtDateTime;
	
	if (typeof(value) == 'undefined') this.value = "01/01/2000 00:00:00";
	else this.value = value;
	
	this.vCustomValidate = vCustomValidate;
	
	this.getRegExp = getDateTimeRegExp;
	this.doCheck = doCheckDateTime;
}

function getDateTimeRegExp() {
	return new RegExp("[\\d]{1,2}[/]{1}[\\d]{1,2}[/]{1}[\\d]{1,4}[ ]{1}[\\d]{1,2}[:]{1}[\\d]{1,2}([:]{1}[\\d]{1,2}|)");
}

function doCheckDateTime() {
	var result = 1;
	if (!checkExp(this.value, this.getRegExp())) return (result);
	var datetime = this.value.split(" ");
	var result = ((((new DateParser(datetime[0])).doCheck())) && (((new TimeParser(datetime[1])).doCheck())));
	
	if ((result == 0) && (typeof(this.vCustomValidate) != 'undefined')) {
		if (!eval(this.vCustomValidate)) {
			result = 2;
		}
	}

	return result;
}

function EMailParser(value, vCustomValidate) {
	this.dataType = valueTypes.dtEMail;
	
	if (typeof(value) == 'undefined') this.value = "";
	else this.value = value;
	
	this.vCustomValidate = vCustomValidate;
	
	this.getRegExp = getEMailRegExp;
	this.doCheck = doCheckEMail;
}

function getEMailRegExp() {
	return new RegExp("[\\S]{1,}[\\@]{1}[\\S]{1,}[\\.]{1}[\\S]{1,}");
}

function doCheckEMail() {
	var result = 0;
	if (checkExp(this.value, this.getRegExp())) {
		if (typeof(this.vCustomValidate) != 'undefined') {
			if (!eval(this.vCustomValidate)) {
				result = 2;
			}
		}

	}
	else result = 1;
	
	return result;
}

function MoneyParser(value, precision, scale, vCustomValidate) {
	this.dataType = valueTypes.dtMoney;
	
	if (typeof(value) == 'undefined') this.value = 0;
	else this.value = value;
	
	if (typeof(precision) == 'undefined') this.precision = 12;
	else this.precision = precision;
	
	if (typeof(scale) == 'undefined') this.scale = 2;
	else this.scale = scale;
	
	this.vCustomValidate = vCustomValidate;
	
	this.getRegExp = getMoneyRegExp;
	this.doCheck = doCheckMoney;
}

function getMoneyRegExp() {
	var s = "[+|-]{0,1}[\\d]{0," + this.precision + "}";
	if (this.scale > 0) {
		s = s + "(\\.[\\d]{1," + this.scale + "}|)";
	}
	return new RegExp(s);
}

function doCheckMoney() {
	var result = 0;
	if (checkExp(this.value, this.getRegExp())) {
		if ((new Number(this.value)) >= 0) {
			if (typeof(this.vCustomValidate) != 'undefined') {
				if (!eval(this.vCustomValidate)) {
					result = 2;
				}
			}
		}
		else result = 1;
	}
	else result = 1;
	
	return result;
}

function NaturalParser(value, precision, vCustomValidate) {
	this.dataType = valueTypes.dtNatural;

	if (typeof(value) == 'undefined') this.value = 0;
	else this.value = value;
	
	if (typeof(precision) == 'undefined') this.precision = 12;
	else this.precision = precision;
	
	this.scale = 0;

	this.vCustomValidate = vCustomValidate;
	
	this.getRegExp = getNaturalRegExp;
	this.doCheck = doCheckNatural;
}

function getNaturalRegExp() {
	var s = "[+|-]{0,1}[\\d]{0," + this.precision + "}";
	if (this.scale > 0) {
		s = s + "(\\.[\\d]{1," + this.scale + "}|)";
	}
	return new RegExp(s);
}

function doCheckNatural() {
	var result = 0;
	if (checkExp(this.value, this.getRegExp())) {
		if ((new Number(this.value)) > 0) {
			if (typeof(this.vCustomValidate) != 'undefined') {
				if (!eval(this.vCustomValidate)) {
					result = 2;
				}
			}
		}
		else result = 1;
	}
	else result = 1;
	
	return result;
}

function CustomParser(value, precision, scale, vCustomValidate) {
	this.dataType = valueTypes.dtCustom;

	if (typeof(value) == 'undefined') this.value = "";
	else this.value = value;
	
	if (typeof(precision) == 'undefined') this.precision = 12;
	else this.precision = precision;
	
	if (typeof(scale) == 'undefined') this.scale = 2;
	else this.scale = scale;
	
	this.vCustomValidate = vCustomValidate;
	
	this.getRegExp = getCustomRegExp;
	this.doCheck = doCheckCustom;
}

function getCustomRegExp() {
	return new RegExp("(\\s|\\S)*");
}

function doCheckCustom() {
	var result = 0;
	if (checkExp(this.value, this.getRegExp())) {
		if (typeof(this.vCustomValidate) != 'undefined') {
			if (!eval(this.vCustomValidate)) {
				result = 2;
			}
		}

	}
	else result = 1;
	
	return result;
}

function ltrim(s) {
	return (s.replace(/^[\s]*/, ''));
}

function rtrim(s) {
	return (s.replace(/[\s]*$/, ''));
}

function trim(s) {
	return (ltrim(rtrim(s)));
}
