// JavaScript Document
function _objectValidator(){
	var obj=this;
	this.mensajes=new Array()
	this.validaciones=new Array()
	this.add=function(valid,mensaje){
		
		obj.validaciones.push(valid)
		obj.mensajes.push(mensaje)
	}
}

function validaciones(){
	this.requerido = function(item){
		val = item.value;
		val.replace(/^\s+|\s+$/g,"");
		if(!val.length)
			return false;
		return true;
	}
	
	this.decimal = function(item){
		var charpos = item.value.search('[^0-9\.]'); 
    	if(item.value.length > 0 &&  charpos >= 0){ 
    		return false;
    	}//if 
	 return true;	
	}
	
	this.numerico = function(item){
		var charpos = item.value.search('[^0-9]'); 
    	if(item.value.length > 0 &&  charpos >= 0){ 
    		return false;
    	}//if 
	 return true;	
	}
	
	this.checked = function(item){
		return item.checked;
	}
	this.correoElectronico= function(item){
		email=item.value;
		if(email.length==0) return true;
	    var splitted = email.match("^(.+)@(.+)$");
	    if(splitted == null) return false;
	    if(splitted[1] != null ){
	      var regexp_user=/^\"?[\w-_\.]*\"?$/;
	      if(splitted[1].match(regexp_user) == null) return false;
	    }
	    if(splitted[2] != null){
	      var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
	      if(splitted[2].match(regexp_domain) == null){
		    var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
		    if(splitted[2].match(regexp_ip) == null) return false;
	      }// if
	      return true;
	    }
		return false;
	}
	
	this.minlong = function (item,minimo){
		if(item.value.length<minimo)
			return false;
		return true;
	}
	
	this.maxlong = function (item,maximo){
		if(item.value.length>maximo)
			return false;
		return true;
	}
	
	this.noseleccionado = function (item,valor){
		//alert("abc");
		if(item.value==valor)
			return false;
		return true;
	}
}


function Validator(nombreForma, object, callback){
	var referencia=this
	var valids = new validaciones();
	this.errors=new Array()
	this.errorElements = new Array();
	this.formulario = document.forms[nombreForma]
	//for(i=0;i<document.forms.length;i++)
	this.reportedError = function(){			// Esta funcion esta preparada para esta aplicacion especifica, y peude ser reescrita
		cadenita="";
	/*	cadenita = '<ul>'
		for(i=0;i<this.errors.length;i++){
			cadenita += '<li>'+this.errors[i]+'</li>\n'
		}
		for(i=0;i<referencia.formulario.elements.length;i++)
			
			$$('#'+referencia.formulario.elements[i].id).removeClass('InputError')
		cadenita += '</ul></div>';
		document.getElementById('mensajesDeError').innerHTML=cadenita;
		document.getElementById('mensajesDeError').style.display='block';
		for(i=0;i<this.errorElements.length;i++){
			$$('#'+this.errorElements[i].id).addClass('InputError')
		}*/
		for(i=0;i<this.errors.length;i++){
			cadenita += this.errors[i] + "\r\n";
		}
		
		alert(cadenita);
	}
	
	/*this.formulario.onsubmit*/
	document.getElementById(object).onclick=function(){
	referencia.errors=new Array()
	referencia.errorElements=new Array()
	
	var validFormData = true;
	forma = referencia.formulario;
		for(i=0;i<forma.elements.length;i++){
		//alert(forma.elements[i].name + ":" + forma.elements[i].validHandle);
			if(forma.elements[i].validHandle!=null){
				validacionesElemento = forma.elements[i].validHandle.validaciones
				for(j=0;j<validacionesElemento.length;j++){
					dataValidate = validacionesElemento[j].split("=");
					stringCall = ""
					if(dataValidate.length == 1)
						stringCall = 'valids.'+dataValidate[0]+'(referencia.formulario.elements['+i+'])'
					else if(dataValidate.length == 2) {
						if (dataValidate[1] == '') dataValidate[1] = "''";
						stringCall  = 'valids.'+dataValidate[0]+'(referencia.formulario.elements['+i+'],'+dataValidate[1]+')'
					}
					if(stringCall.length == 0){
						 alert("BUG: Error en el paso de parametros de validacion")
						 return
					}
					//alert(stringCall);
					passValid = eval(stringCall)
					//alert('valids.'+validacionesElemento[j]+'(this.elements['+i+'])'); //for debug propose
					validFormData = validFormData && passValid;
					if(!passValid){
						referencia.errors.push(forma.elements[i].validHandle.mensajes[j])
						referencia.errorElements.push(forma.elements[i])
					}
				}
			}
		}
		//alert(validFormData);
		if(!validFormData) {
				referencia.reportedError();
		}
		else {
			callback();
		}
		return validFormData;
	}
	this.enviar=function(){
		if(referencia.formulario.onsubmit()!=false)
			referencia.formulario.submit()
	}
	
	this.deleteAll = function () {
		var i;
		for (i=0; i<referencia.formulario.length;i++) {
			referencia.formulario[i].validHandle = null;
		}
	}
	
	this.agregarValidacion=function(elemento,validacion,mensaje){
		
		formElement=referencia.formulario[elemento]
		if(formElement==null){
			alert('Bug: El elemento '+elemento+' no existe o no se pudo referenciar');
			return false;
		}
		if(formElement.validHandle==null) { formElement.validHandle = new _objectValidator();	 }
		formElement.validHandle.add(validacion,mensaje)
	}
}


