<!--
// Febrero, 2002
// Jose Hernandez Espinosa/GEE@SICA

//	-------------------------------------
//	Rutina Global de Validación de Formas
//	-------------------------------------

//	**********************************************

//			Instrucciones para su uso

//	1.- Incluir una referencia externa a este script:
//		<script language="JavaScript" src="validacion.js"></script>

//	2.- Crear en el documento HTML o ASP una función local
//	    que mande llamar a la función DefinirCampo():
//
//		<script language="JavaScript">
//		<!--
//		function DefinirCampos() {
//			DefinirCampo('nombre=cuenta','tipo=num');
//		}
//		//-->
//		</script>

//	3.- Llamar a esa función local en el evento onLoad:
//		<body onLoad="DefinirCampos()">

//	4.- Agregar la llamada a la función de validación 
//	    GEE_validarForma() en el evento onSubmit del 
//	    objeto Form adecuado:
//		<form name="Form1" action="proceso.asp" method="post" onSubmit="GEE_validarForma(); return GEE_returnValue;">

//	**********************************************


//	Constructor de mensaje

	var checkObjects	= new Array();
	var errors		= "";
	var returnVal		= false;
	var language		= new Array();
	language["header"]	= "Favor de verificar la información proporcionada:\n"
	language["start"]	= "* ";
	language["field"]	= " ";
	language["require"]	= " es requerido";
	language["opcional"]	= " es opcional ";


//	Valores String
	language["min"]		= " y debe contener entre ";
	language["max"]		= " y ";
	language["minmax"]	= " y ";
	language["chars"]	= " caracteres";
	language["justMax"]		= " y no debe exceder de ";
	language["justMin"]		= " y debe contener por lo menos ";


	language["email"]	= " debe ser una dirección de correo válida";

//	Valores Numéricos
	language["num"]		= " y debe ser un valor numérico";
	language["minNum"]		= " entre ";
	language["maxNum"]		= " y ";
	language["minmaxNum"]	= " y ";
	language["justMaxNum"]		= " no mayor a ";
	language["justMinNum"]		= " no menor a ";




function DefinirCampo(settings) {

	// Definir Campo

	// Esta rutina simula el uso de "named arguments"
	// en donde no importa el orden en que se envíen
	// siempre y cuando correspondan a un parámetro válido
	// Cada "argumento" debe ser un string, que incluya 
	// el nombre del parámetro y su valor.

	// Al final, esta rutina llama a la función define()
	// que es la verdadera rutina que se encarga de crear
	// los objetos para su explotación por la rutina
	// GEE_validarForma()

	// Sintaxis general

	// nombre: nombre del campo (Requerido)
	// tipo = string, num, email (Requerido)
	// alias = nombre del campo para desplegar en el mensaje de validación (Opcional)
	//		Si se omite, se tomará el nombre del campo como alias
	// requerido =	-1 el campo es requerido
	//			0 el campo no es requerido
	//			Si se omite, se crea un campo requerido por default.
	// min = valor mínimo [caracteres para String, valor para Numérico] (Opcional)
	//			Si se omite y el campo es de tipo num, automáticamente se
	//			asignará un valor mínimo de 1
	// max = valor máximo [caracteres para String, valor para Numérico] (Opcional)
	// validarcomo = el tipo de validación que será aplicada al campo (Opcional)
	//			Si se omite, se validará de acuerdo a la definición de tipo

	// Ejemplo de uso:

	// DefinirCampo('nombre=id', 'tipo=num');

	var args = DefinirCampo.arguments
	var lParam = new Array(6)

	for (var i = 0; i < args.length; i++) {
		v = args[i];
		ret = v.split("=")
		if (ret[0]=='nombre') {
		//	nombre de campo
			lParam[0]=ret[1];
		} else if (ret[0]=='tipo') {
		//	tipo de campo
			lParam[1]=ret[1];
		} else if (ret[0]=='alias') {
		//	alias
			lParam[2]=ret[1];
		} else if (ret[0]=='requerido') {
		//	requerido
			lParam[3]=ret[1];
		} else if (ret[0]=='min') {
		//	min
			lParam[4]=ret[1];
		} else if (ret[0]=='max') {
		//	max
			lParam[5]=ret[1];
		} else if (ret[0]=='validarcomo') {
		//	validarcomo
			lParam[6]=ret[1];
		}
	}

	if (lParam[1] == 'num') {
		eval(define(lParam[0],lParam[1],lParam[2],lParam[3],parseInt(lParam[4]),parseInt(lParam[5]), lParam[6]));
	} else {
		eval(define(lParam[0],lParam[1],lParam[2],lParam[3],lParam[4],lParam[5],lParam[6]));
	}
}


function define(n, type, HTMLname, requerido, min, max, validarcomo, d) {

//	var args = define.arguments
//	for (var i = 0; i < args.length; i++) {
//		alert(args[i]);
//	}


	// -----------------------------------------------------------------------------
	// n = nombre del campo (Requerido)
	// tipo= string, num, email (Requerido)
	// requerido =	'-1' el campo es requerido
	//			'0' el campo no es requerido
	//			Si se omite, se crea un campo requerido por default.
	//			Si se envían mínimo y máximo, este parámetro DEBE especificarse
	// min = valor mínimo [caracteres para String, valor para Numérico] (Opcional)
	// max = valor máximo [caracteres para String, valor para Numérico] (Opcional)
	// d = (por completo opcional)
	// -----------------------------------------------------------------------------

	var p;
	var i;
	var x;
	if (!HTMLname) HTMLname = n
	if (!requerido) requerido = parseInt("-1")
	if (!validarcomo) validarcomo = type
	if (!d) d = document;
	if (type=="num" && !min) {
		min="1";
	}
	if ((p=n.indexOf("?"))>0&&parent.frames.length) {
		d = parent.frames[n.substring(p+1)].document;
		n = n.substring(0,p);
	}
	if (!(x = d[n]) && d.all) x = d.all[n];
	for (i = 0; !x && i < d.forms.length; i++) {
		x = d.forms[i][n];
	}
	for (i = 0; !x && d.layers && i < d.layers.length; i++) {
		x = define(n, type, HTMLname, requerido, min, max, validarcomo, d.layers[i].document);
		return x;       
	}
	eval("V_"+n+" = new formResult(x, type, HTMLname, requerido, min, max, validarcomo);");
	checkObjects[eval(checkObjects.length)] = eval("V_"+n);
}

function formResult(form, type, HTMLname, requerido, min, max, validarcomo) {
	this.form = form;
	this.type = type;
	this.HTMLname = HTMLname;
	this.requerido = requerido;
	this.min  = min;
	this.max  = max;
	this.validarcomo = validarcomo;
}

function GEE_validarForma() {
	if (checkObjects.length > 0) {
		errorObject = "";
		for (i = 0; i < checkObjects.length; i++) {
			validateObject = new Object();
			validateObject.form = checkObjects[i].form;
			validateObject.HTMLname = checkObjects[i].HTMLname;
			validateObject.requerido = parseInt(checkObjects[i].requerido);
			validateObject.val = checkObjects[i].form.value;
			validateObject.len = checkObjects[i].form.value.length;
			validateObject.min = checkObjects[i].min;
			validateObject.max = checkObjects[i].max;
			validateObject.type = checkObjects[i].type;
			validateObject.validarcomo = checkObjects[i].validarcomo;

			if (validateObject.requerido == -1) {
				checkValue(validateObject);
			} else if ((validateObject.requerido == 0 && validateObject.len > 0)) {
				checkValue(validateObject);
			}
		}
	}

if (errors) {
	alert(language["header"].concat("\n" + errors));
	errors = "";
	GEE_returnValue = false;
} else {
	GEE_returnValue = true;
   }
}


function checkValue(validateObject) {

//	Llamado a rutinas de validación

//	Valores numéricos
	if (validateObject.validarcomo == "num") {
		validarComoNumero(validateObject)
//	Validación de e-mail
	} else if(validateObject.validarcomo == "email") {
		validarComoEMail(validateObject)
//	Valores string
	} else if (validateObject.validarcomo == "string") {
		validarComoString(validateObject)
	}

}


function validarComoString() {

//	min y max presentes y len < min ó len > max
	if (validateObject.min && validateObject.max && (validateObject.len < validateObject.min || validateObject.len > validateObject.max)) {
		if (validateObject.requerido == -1) {
			errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n";
		} else {
			errors += language['start'] + language['field'] + validateObject.HTMLname + language['opcional'] + language['min'] + validateObject.min + language['minmax'] + validateObject.max+language['chars'] + "\n";
		}
//	min presente y len < min
	} else if (validateObject.min && !validateObject.max && (validateObject.len < validateObject.min)) { 
		if (validateObject.requerido == -1) {
			errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['justMin'] + validateObject.min + language['chars'] + "\n";
		} else {
			errors += language['start'] + language['field'] + validateObject.HTMLname + language['opcional'] + language['justMin'] + validateObject.min + language['chars'] + "\n";
		}
//	max presente y len > max
	} else if (validateObject.max && !validateObject.min && (validateObject.len > validateObject.max)) { 
		if (validateObject.requerido == -1) {
			errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['justMax'] + validateObject.max + language['chars'] + "\n";
		} else {
			errors += language['start'] + language['field'] + validateObject.HTMLname + language['opcional'] + language['justMax'] + validateObject.max + language['chars'] + "\n";
		}
//	min y max NO presentes y len <= 0
	} else if (!validateObject.min && !validateObject.max && validateObject.len <= 0) { 
		if (validateObject.requerido == -1) {
			errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
		} else {
			errors += language['start'] + language['field'] + validateObject.HTMLname + language['opcional'] + "\n";
		}
	}
}

function validarComoEMail(validateObject) {
	if ((validateObject.val.indexOf("@") == -1) || (validateObject.val.charAt(0) == ".") || (validateObject.val.charAt(0) == "@") || (validateObject.len < 6) || (validateObject.val.indexOf(".") == -1) || (validateObject.val.charAt(validateObject.val.indexOf("@")+1) == ".") || (validateObject.val.charAt(validateObject.val.indexOf("@")-1) == ".")) { 
		errors += language['start'] + language['field'] + validateObject.HTMLname + language['email'] + "\n"; 
	}

}

function validarComoNumero(validateObject) {

//	no se escribió nada en el campo
//	o lo que se escribió no es un valor numérico
	if ((validateObject.type == "num" && validateObject.len <= 0) || (validateObject.type == "num" && isNaN(validateObject.val))) {
		errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['num'] + "\n";

//	min y max presentes y val fuera de rango
	} else if (validateObject.min && validateObject.max && (validateObject.val < validateObject.min || validateObject.val > validateObject.max)) {
		errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['num'] + language['minNum'] + validateObject.min + language['minmaxNum'] + validateObject.max + "\n";

//	min presente y val < min
	} else if (validateObject.min && !validateObject.max && (validateObject.val < validateObject.min)) { 
		errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['justMinNum'] + validateObject.min + "\n";

//	max presente y val > max
	} else if (validateObject.max && !validateObject.min &&(validateObject.val > validateObject.max)) { 
		errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + language['num'] + language['justMaxNum'] + validateObject.max + "\n";

//	min y max NO presentes y val <= 0
	} else if (!validateObject.min && !validateObject.max && validateObject.val <= 0) { 
		errors += language['start'] + language['field'] + validateObject.HTMLname + language['require'] + "\n";
	}

}

//-->

