function validate_field(fi,reg) {
	if (fi.match(reg)) {
		return true;
	}
	return false;
}



function validateForm(frm,fi,validreg) {
	var el,noerr,frm;
	noerr = true;
	if (document.forms[frm])
	{
		frm = document.forms[frm];
	} else {
		return true;
	}

	for (var i in fi) {
		el = frm[fi[i]];
		if (el) {
			if (el.value == '') {
				noerr = false;
				el.style.background = '#ffdddd';
			} else {
				el.style.background = '#ffffff';
			}
		}
	}
	if (!noerr) {
		if (errmsg)	alert(errmsg);
	} else {
		var messages = '';
		for (i in validreg) {
			if (frm[i]) {
				if (!validate_field(frm[i].value,validreg[i])) {
					frm[i].style.background = '#ffdddd';
					messages += errormsg[i] + '\n';
					noerr = false;
				}
			}
		}
		if (!noerr) {
			alert(messages);
		}
	}

	return noerr;
}


function validateNumeric(value) {
	if (value.length == 0) return true;
	value = parseFloat(value);
	if (isNaN(value)) return false;
	return true;
}

function validateRegExp(value,param) {
	var rg = new RegExp(param);
	if (value.match(rg)) {
		return true;
	}
	return false;
}

function validateMin(value,param) {
	value = parseFloat(value);
	if (value < parseFloat(param)) {
		return false;
	}
	return true;
}

function validateMax(value,param) {
	value = parseFloat(value);
	if (value > parseFloat(param)) {
		return false;
	}
	return true;
}

function validateNotEmpty(value) {
	if (value.length == 0) return false;
	return true;
}

function formValidate(frmname) {
	var frm,prefix,inp,i,j,rez,result;
	result = true;
	if (prefix = frmname.match(/^frm_(\w+)$/)) {
		prefix = prefix[1];
		if (document.forms[frmname]) {
			frm = document.forms[frmname];
			if (formRules[prefix]) {
				var rules = formRules[prefix];
				for (i in rules) {
					inp = 'prop_' + i;
					if (frm[inp]) {
						for (j in rules[i]) {
							rez = true;
							switch (rules[i][j].type) {
							case PR_NUMERIC:
								rez = validateNumeric(frm[inp].value);
								break;
							case PR_REGEXP:
								rez = validateRegExp(frm[inp].value,rules[i][j].value);
								break;
							case PR_MIN:
								rez = validateMin(frm[inp].value,rules[i][j].value);
								break;
							case PR_MAX:
								rez = validateMax(frm[inp].value,rules[i][j].value);
								break;
							case PR_NOTEMPTY:
								rez = validateNotEmpty(frm[inp].value);
								break;
							}
							if (!rez) {
								frm[inp].style.background = '#ffdddd';
								result = false;
							} else {
								frm[inp].style.background = '#ffffff';
							}
						}
					}
				}
			};
		};
	};
	return result;
}

function cValidator (field,rules) {
	this.field = field;
	this.rules = rules;

	this.validate = function(value) {
		var i;
		result = true;
		for (i = 0;i < this.rules.length; i++) {
			rez = true;
			switch (rules[i].type) {
			case PR_NUMERIC:
				rez = validateNumeric(value);
				break;
			case PR_REGEXP:
				rez = validateRegExp(value,rules[i][j].value);
				break;
			case PR_MIN:
				rez = validateMin(value,rules[i][j].value);
				break;
			case PR_MAX:
				rez = validateMax(value,rules[i][j].value);
				break;
			case PR_NOTEMPTY:
				rez = validateNotEmpty(value);
				break;
			}

			if (!rez) {
				result = false;
			}
		}
		return result;
	}
}

function cFormValidator() {
	this.forms = [];

	this.addForm = function(frm,fields) {
		this.forms[frm.name] = {form:frm,validators:[fields]};
	}

	this.parseFormStruct = function(frm,struct) {

	}

	this.validateForms = function() {
		for (var i = 0;i < arguments.length;i++) {
			if (this.forms[arguments[i]]) {
				this.validate(this.forms[arguments[i]]);
			}
		}
	}

	this.validate = function (frm) {
		var i,result;
		var f = frm.form;
		var v= frm.validators;
		result = true;
		for (i = 0 ; i < v.length; i++) {
			if (f[v[i].field]) {
				if (!v[i].validate(f[v[i].field].value)) result = false;
			}
		}
		return result;
	}
}


var formRules = {};
