<!--

function Validator(form) {
	
	/**** Propiedades privadas ****/
	
	var elements = new Array();

	/**** Propiedades públicas ****/
	
	this.form = form;
	
	/**** Métodos públicos ****/
	
	this.setExpressions = function() {
		for (var i = 0; i < arguments.length; i += 3) {
			this.form[arguments[i]].expression = arguments[i + 1];
			this.form[arguments[i]].displayName = arguments[i + 2];
			elements[elements.length] = this.form[arguments[i]];
		}
	}

	function focus(element) {
		try {
			element.focus();
			element.select();
		} catch(e) {
			return;
		}
	}

	this.validate = function() {
		var item, expression, displayName, otrodisplayName, atoms, subatoms, i;
		for (var e = 0; e < elements.length; e ++) {
			item = elements[e];
			expression = item.expression;
			displayName = item.displayName;
			if (null != expression) {
				atoms = expression.split("|");
				for (i=0; i<atoms.length; i++) {
					switch(atoms[i]) {
						case "v": //Campo requerido
							if (!item.value) {
								alert("Debe ingresar algún valor para el campo " + displayName + ".");
								focus(item);
								return false;
							}
							break;
						case "e": //E-mail válido
							if ("" != item.value) {
								if (! validEmail(item.value)) {
									alert("El valor del campo " + displayName + " no es válido.");
									focus(item);
									return false;
								}
							}
							break;
						case "f": //Fecha válida
							if ("" != item.value) {
								if (! validDate(item.value)) {
									alert("El valor del campo " + displayName + " no es válido.");
									focus(item);
									return false;
								}
							}
							break;
						case "c": //Cédula válida
							if ("" != item.value) {
								if (! validIdentityDocument(item.value)) {
									alert("El valor del campo " + displayName + " no es válido.");
									focus(item);
									return false;
								}
							}
							break;
						case "n": //Número natural
							var esNatural = true;
							if (isNaN(item.value)) {
								esNatural = false;
							} else if (parseInt(item.value) < 0) {
								esNatural = false;
							} else if (item.value.indexOf(".") >= 0) {
								esNatural = false;
							}
							if (! esNatural) {
								alert("El valor del campo " + displayName + " no es válido.");
								focus(item);
								return false;
							}
							break;
						default:
							subatoms = atoms[i].split("\:");
							switch(subatoms[0]) {
								case "i": //El campo debe ser igual a otro campo
									otroitem = this.form[subatoms[1]];
									otrodisplayName = otroitem.displayName;
									if (item.value != otroitem.value) {
										alert("Los campos " + otrodisplayName + " y " + displayName + " deben coincidir.")
										focus(item);
										return false;
									}
									break;
								case "fm": //Fecha mayor o igual que otro campo fecha
									otroitem = this.form[subatoms[1]];
									otrodisplayName = otroitem.displayName;
									if (compareDates(item.value, otroitem.value) < 0) {
										alert(displayName + " debe ser mayor o igual que " + otrodisplayName + ".")
										focus(item);
										return false;
									}
									break;
								case "re": //Debe cumplir una expresión regular
									if (! validRegExp(subatoms[1], item.value)) {
										alert("El valor del campo " + displayName + " no es válido.");
										focus(item);
										return false;
									}
									break;
							}
					}
				}
			}
		}
		return true;
	}
}

//-->
