/**
 * Validador de formularios
 *
 * Este es un validador de formularios que permite el uso
 * de atributos dentro de los tags del formulario (inputs y textareas)
 * para verificar la informacion antes de ser enviada al servidor.
 *
 * Funciona de manera simple. Ejemplo
 * <TAGFORMA name="xx" ... validate="[OPCIONES:=O1|O2|..|On]" msg="Mensaje de error" [ffocus="campo a foco"]
 * Nueva funcionalidad por Javier Ortiz - jortiz@virtualsigma.com
 * [minlength=entero] [mxnlength=entero] [comparewith=nombre de campo de formulario]>
 ********************************************
 * MODIFICADO: 2005-07-08 04:20:23 GMT-5
 * POR JAVIER ORTIZ
 * Se incorporan tres nuevas etiquetas (minlength, maxlength y comparewith) para resolver el problema de revision
 * de longitudes minimas y maximas de texto y comparaciones con otros campos del formulario 
 * combinadas con otras validaciones.
 * Eliminadas las propiedades complejas (ie L=4)
 * Eliminada la funcion validateComplexProperty
 * Adicionada la capacidad de generar imagenes de error en vez de alertas. Para esto, se pasa un segundo argumento a
 * la funcion validate (string 'images')
 ********************************************
 * Opciones son:
 * R -> campo requerido.
 * E -> direccion de correo electronico
 * F -> real (positivo y negativo).
   P -> real (positivo)
 * I -> entero (positivo y negativo)
 * G -> GMT ((+-)H:MM o (+-)H)
 * A -> nn.nn.nn.nn.nn (numero de registro de partida arancelaria)
 * U -> nombre de usuario (letras y guion)
 * C -> GIF File
 * Z -> Archivo Windows Media
 * M -> Mayusculas
 *
 */

var validators = new Array();
validators['G'] = /^(\+|-)?\d(:[012345][\d])?$/;
validators['F'] = /^(((\+|-)?\d+(\.\d*)?)|((\+|-)?(\d*\.)?\d+))$/;
validators['P'] = /^((\d+(\.\d*)?)|((\d*\.)?\d+))$/;
validators['I'] = /^((\+|-)?\d+)$/;
validators['E'] = /^([\w_\-]+)(\.[\w_\-]+)*@((\[[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.)|(([\w\-]+\.)+))([a-zA-Z]{2,4}|[\d]{1,3})(\]?)$/;
validators['A'] = /^(\d){2}(\.(\d){2}){4}$/;
validators['U'] = /^([A-Za-z])+(-)*([A-Za-z])*$/;
validators['J'] = /\.(jpg|JPG|gif|GIF|png|PNG)$/;
validators['D'] = /\.(pdf|PDF)$/;
validators['C'] = /\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF)$/;
validators['K'] = /\.(jpg|gif|pdf|doc|xls|ppt)$/;
validators['Z'] = /\.(wmv)$/;
validators['M'] = /[A-Z]{1,}$/;

function validate (form) {
var mode;//Debe tomar solo dos valores ('alerts' o 'images')
if(validate.arguments[1]){
mode=validate.arguments[1];
}else{
mode='alerts';
}

var i;
var field;
var msgAlert;
var pass;
var minValue;
var maxValue;
var comparison;
var validation;
var tmpsum=0;
	if (form == null){
	alert ('Intenta validar una forma invalida');
	return false;
	}
	for (i = 0; i < form.elements.length; i++){
	pass=true;
	field = form.elements[i];
	minValue=field.getAttribute('minlength');
	maxValue=field.getAttribute('maxlength');
	comparison=field.getAttribute('comparewith');
	validation=field.getAttribute('validate');

		if (!field.getAttribute('msg')){
		msgAlert='El campo no ha sido diligenciado correctamente';
		}else{
		msgAlert=field.getAttribute('msg');
		}
		
		//Revisa si hay longitud minima
		if(minValue){
			if(field.value.length>0 && field.value.length<minValue){
			pass= false;
			}
		}
		//Revisa si hay longitud maxima
		if(maxValue){
			if(field.value.length>0 && field.value.length>maxValue){
			pass= false;
			}
		}
		//Revisa si se compara con otro campo
		if(comparison){
			if(field.value!=form.elements[comparison].value){
			pass= false;
			}
		}
		//Revisa si hay validacion	
		if(validation){
			if (!validateField (field, form)){
			pass= false;
			}
		}
		if(!pass){
		tmpsum++;		
			if (!field.getAttribute('ffocus')){
				if(field.type=='text' || field.type=='password'){
				field.select();
				}
				if(field.type!='hidden'){
				field.focus();
				}
			}else{
				if(field.type=='text' || field.type=='password'){
				form.elements[field.getAttribute('ffocus')].select();
				}else{
				form.elements[field.getAttribute('ffocus')].focus();
				}
			}
			if(mode=='alerts'){
			alert(msgAlert);
			return false;
			}
		}
		if(mode=='images'){		
			if(field.getAttribute('validate')){
			printErrorImages(field,msgAlert,pass);
			}
		}
	}
	if(tmpsum>0 && mode=='images'){
	alert(validate.arguments[2],validate.arguments[3]);
	}
	if(tmpsum==0){
	form.submit();
	return true;	
	}
	
}

function validateField (field, form)
{
	var properties;
	var property;	
	if (field.getAttribute('validate') != null) 
	{
		properties = field.getAttribute('validate').split('|');
		for (i = 0; i < properties.length; i++)
		{
			property = properties[i];
			if(property)
			{			
				if (property == 'R' && field.value.length == 0)
				{
				return false;
				}
				if (property != 'R' && field.value.length > 0)
				{
					if (!validators[property].test(field.value))
					{
					return false;
					}
				}
			}
		}
	}	
	return true;
}
function printErrorImages(field,msgAlert,pass){

	if(field.type!='hidden' && field.type!='checkbox' && field.type!='radio'){
	var parentCell=field.parentNode;
	var img=document.images['imgerror'+field.name];
	var errorLayer=document.getElementById('errorLayer'+field.name);
	var imgsrc=pass?'images/ok.png':'images/wrong.png';
	var msgAlert=pass?'OK':msgAlert;
		if(img){
		img.src=imgsrc;
		img.setAttribute('TITLE',msgAlert);
		//IE :(
		img.alt=msgAlert;
		//
		}else{
		img=document.createElement('IMG');
		img.setAttribute('NAME','imgerror'+field.name);
		img.setAttribute('TITLE',msgAlert);
		img.setAttribute('HSPACE',5);
		//IE :(
		img.id='imgerror'+field.name;
		img.alt=msgAlert;
		img.src=imgsrc;
		img.hspace=5;
		//
		parentCell.appendChild(img);
		}
		if(errorLayer){
			if(pass){
				for(i=0;i<parentCell.childNodes.length;i++){
					if(parentCell.childNodes[i].tagName=='DIV'){
					parentCell.removeChild(parentCell.childNodes[i]);
					}
				}
			}else{
			errorLayer.innerHTML=msgAlert;
			}		
		}else{
			if(!pass){
			errorLayer=document.createElement('DIV');
			errorLayer.setAttribute('ID','errorLayer'+field.name);
			errorLayer.className='errorLayer';
			errorLayer.style.top=findPosY(field);
			errorLayer.style.left=findPosX(field)+235;
			errorLayer.style.position='absolute';
			errorLayer.innerHTML=msgAlert;
			errorLayer.id='errorLayer'+field.name;
			parentCell.appendChild(errorLayer);
			}
		}
	}
}
function handleEnter (field, event) {
		var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
		if (keyCode == 13) {
			var i;
			for (i = 0; i < field.form.elements.length; i++)
				if (field == field.form.elements[i])
					break;
			i = (i + 1) % field.form.elements.length;
			return false;
		} 
		else
		return true;
	}