String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ""); };

var valida={

	alertaContinua:true,
	tipoAlerta:"capa",
	aspectoAlerta:"",
	setDesignControls:false,
	genericMsg:true,

	f:null,
	datos:[],
	correcto:true,
	esp:true,
	expecial:[],
	cumpleDependencias:true,
	dependencias:[],
	edadMax:120,
	rutaIdiomas:"../../js/idiomas/lang",
	strAlertaContinua:"",
	idsAlertaContinua:[],
	controlError:true,
	ids:null,
	esCorrecto:[],
	msgInicial:false,
	targetForm:"",
	W3CDOM:(document.createElement && document.getElementsByTagName),
	cuentaErr:0,
	separadorFecha:"/",
	setTarget:function(arg){ valida.targetForm = arg; },
	
	cargaIdioma:function(){
		var codIdioma=document.getElementsByTagName("html")[0].lang.toUpperCase();
		var htmlHead=document.getElementsByTagName("head")[0];
		var eleScript=document.createElement("script");
		eleScript.src=valida.rutaIdiomas+codIdioma+".js";		
		htmlHead.appendChild(eleScript);
	},		
	cargaMensajeInicial:function(){
		var txt = literal["ElSiguienteFormulario..."]
		var pElement = document.createElement("p");
		var emElement = document.createElement("em");
		pElement.className = "initFormMessage";
		var obj = document.getElementById(valida.ids);
		emElement.appendChild(document.createTextNode(txt));				
		pElement.appendChild(emElement);
		obj.insertBefore(pElement, obj.firstChild);			
	},
	captura:function(){
		valida.obj=(this.id)? this : window.event.srcElement;
		valida.f=valida.obj.name;
		valida.nforms+=1;
		valida.ids=valida.obj.id.toString();
		var dts=new Array();
		dts[valida.ids]=(valida.datos[valida.ids])?  valida.datos[valida.ids]:valida.datos;
		valida.esCorrecto[valida.ids]=false;
		los_datos=dts[valida.ids];
		valida.ejecuta();
	
		var cform = (this.id)? this : window.event.srcElement;
		if(valida.correcto) {			
			if(valida.esp && valida.cumpleDependencias){
				if(valida.targetForm != ""){
					popUp.openWindow("about:blank","yes",592,422,"resultForm");
					cform.target = "resultForm";
				}
				valida.esCorrecto[valida.ids]=true;cform.campoValidaciones.value="";cform.submit();
			}
		}		
		return false;
	},
	rf:function(id,cp_esp){
		var cp=(isNaN(parseInt(id)))? id:los_datos[id][0];
		if(cp_esp)return eval("document."+valida.f+ "." +cp+"[0]");
		return eval("document."+valida.f+ "." +cp);
	},
	setId:function(id){
		valida.ids=id;
		if(!valida.datos[id])valida.datos[id]=[];
		if(!valida.dependencias[id])valida.dependencias[id]=[];
		if(!valida.expecial[id])valida.expecial[id]=[];
		if(valida.msgInicial && valida.W3CDOM)valida.cargaMensajeInicial();
		
	},
	addValidacion:function(){valida.datos[valida.ids][valida.datos[valida.ids].length]=[arguments[0],arguments[1],arguments[2],arguments[3],arguments[4],arguments[5]]},
	addDependencia:function(){valida.dependencias[valida.ids][valida.dependencias[valida.ids].length]=[arguments[0],arguments[1],arguments[2]]},	
	addEspecial:function(){valida.expecial[valida.ids][valida.expecial[valida.ids].length]=[arguments[0],arguments[1],arguments[2]]},	
	muestraError:function(err,cp){
		switch (valida.tipoAlerta){
		    case "alerta":alert(":::: " + err);break
		    case "capa":							
				var obj = document.getElementById(valida.ids);
				var errorUnico=false;
				var divError = pError = ulError = null;				

				if(err.indexOf("\n")){
					err=err.replace(/\n/gi, "<br>");						
				}else{
					err=err
					errorUnico=true;					
				}				
				var numErrors=err.split("<br>");												

				if(valida.W3CDOM){
					if(!document.getElementById("messageError")){						
						divError = document.createElement("div");
						divError.setAttribute("id", "messageError");
						pError = document.createElement("p");												
					}else{
						divError = document.getElementById("messageError");
						pError = divError.getElementsByTagName("p")[0];					
						pError.removeChild(pError.firstChild);
						divError.removeChild(divError.getElementsByTagName("ul")[0]);
					}						
					// si el mensaje es de tipo generico al usuario no se le indican cuantos errores tiene en el formulario
					if(valida.genericMsg){literal["ElSiguienteFormulario..."]
						pError.appendChild(document.createTextNode(literal["MensajeGenerico"]));
					}else{					
						if(numErrors.length > 1) pError.appendChild(document.createTextNode(literal["MensajeNoGenerico"] + (numErrors.length - 1) + literal["ErroresAlRellenar"]));
						else pError.appendChild(document.createTextNode(literal["UnError"]));
					}
					divError.appendChild(pError);				
					
					ulError = document.createElement("ul");
					ulError.className = "enlacesError";
					
					for(var i = 0; i < numErrors.length - 1 ; i++){
						var liError = document.createElement("li");
						liError.className = "black";
						var liEnlace=document.createElement("a");						
						liEnlace.href="javascript:void(null)";
						liEnlace.obj=valida.idsAlertaContinua[i]										
						liEnlace.onclick=function(){		
							if(this.obj){										
								this.obj.focus();
								if(this.obj.type=="text") this.obj.select();
							}else valida.obj.focus();
						}						
						liEnlace.onkeypress=function(){						
							if(this.obj){								
								this.obj.focus();
								if(this.obj.type=="text") this.obj.select();
							}else valida.obj.focus();
						}
						liEnlace.appendChild(document.createTextNode(numErrors[i]));
						liError.appendChild(liEnlace);
						ulError.appendChild(liError);				
						if(valida.setDesignControls) valida.dotarDeAspecto(valida.idsAlertaContinua[i],false)
					}
					divError.appendChild(ulError);
					divError.tabIndex = -1;					
					obj.parentNode.insertBefore(divError, obj);					
//					obj.insertBefore(divError, obj.firstChild);
					/* establezco el foco en la parte que se muestra para ayudar a los usuarios que utilicen una herramienta de asistencia por voz */	
					divError.focus();
					
					return false;
				}break;
		}return false;
	},
	dotarDeAspecto:function (node,reset){	
		if(node && node.type!="radio" && node.type!="checkbox"){
			var color=(reset)? "fff":"fdfda0"
			var destaca=(reset)? "normal":"bold"						
			node.style.background="#" + color;
		}
	}, 
	ejecuta:function(){
	
		
		valida.correcto=true;
		valida.cumpleDependencias=true;
		valida.esp=true;
		valida.strAlertaContinua="";
		valida.idsAlertaContinua=[]
		
		var idFoco=null;
		for(var xx=0;xx<los_datos.length;xx++){		
			campoAct=los_datos[xx]
			campoEsp=(campoAct[2]=="esRadio" || campoAct[2]=="esCheck" )			
			if(!campoEsp) valida.rf(xx).value=valida.rf(xx).value.trim().replace(/\'/gi, "\"");
			 if(!campoEsp) {
			    valida.rf(xx).value=valida.rf(xx).value.trim().replace(/\'/gi, "\"");
			    if(valida.setDesignControls) valida.dotarDeAspecto(valida.rf(xx),true)
		   }else{if(valida.setDesignControls) valida.dotarDeAspecto(valida.rf(xx,true),true)}
			if(campoAct[3]=="obligatorio" || valida.rf(xx).value!=""){
				var ccValor = valida.rf(xx).value;
				if (ccValor == "\\") {
					ccValor = ccValor.replace(/\\/gi, "\\\\");
				}
				var compVal=false;
				if(campoAct[2].indexOf(",")==-1){
					compVal=eval("valida."+campoAct[2]+"('"+ccValor+"')")
				}else{
					arrValAux=campoAct[2].split(",")
					for(var dd in arrValAux){
						if(eval("valida."+arrValAux[dd]+"('"+valida.rf(xx).value+"')")){compVal=true;break;}
					}
				}
				if(compVal){	
					if(!campoEsp){
						if(valida.rf(xx).value.length<campoAct[4]){
							if(idFoco==null) idFoco=xx; valida.error(xx,"min");if(!valida.alertaContinua)break; 
						}else if(valida.rf(xx).value.length>campoAct[5]){
							if(idFoco==null) idFoco=xx; valida.error(xx,"max");if(!valida.alertaContinua)break;
						}
					}
				}else{							
					if(idFoco==null) idFoco=xx;
					valida.error(xx);
					if(!valida.alertaContinua)break;
				}
			}
		}
		if(valida.strAlertaContinua!=""){
			valida.muestraError(valida.strAlertaContinua)			
		}
		if(valida.dependencias[valida.ids]!=null && valida.dependencias[valida.ids].length>0 && valida.correcto){			
			for(var pp=0;pp<valida.dependencias[valida.ids].length;pp++){
				if(!valida.depende(valida.dependencias[valida.ids][pp][0],valida.dependencias[valida.ids][pp][1])){
					valida.errorDeDependencia(pp)
					break;
				}
			}
		}
		if( valida.expecial[valida.ids]!=null && valida.expecial[valida.ids].length>0 && valida.correcto && valida.cumpleDependencias){
			for(var pp=0;pp<valida.expecial[valida.ids].length;pp++){
				if(!eval("window." + valida.expecial[valida.ids][pp][0])){
					valida.errorDeValidacionEspecial(pp)
					break;
				}
			}
		}
	},
	errorDeValidacionEspecial:function(id){
		valida.esp=false;
		valida.idsAlertaContinua[valida.idsAlertaContinua.length]=eval("document."+valida.f+"."+valida.expecial[valida.ids][id][2])
		valida.muestraError(valida.expecial[valida.ids][id][1] +"\n")
	},
	errorDeDependencia:function(id){
		valida.cumpleDependencias=false;
		var campoFoco=valida.dependencias[valida.ids][id][0].split(" ")[0]
		valida.idsAlertaContinua[valida.idsAlertaContinua.length]=eval("document."+valida.f+"."+campoFoco)
		var condDep=valida.dependencias[valida.ids][id][0]
		if(condDep.indexOf(" ")!=-1) {condDep=condDep.split(" ");condDep=condDep[0];}				
		valida.muestraError(valida.dependencias[valida.ids][id][2] + "\n");
	},
	error:function(id,maxmin){	
		var explica="";
		var strAlerta="";
		valida.correcto=false;

		var cpObligatorio=(los_datos[id][3]=="obligatorio")? " (campo obligatorio)" :""
		switch (los_datos[id][2]){
			case "esUsuarioValido":explica=literal["Recuerde_caracteres_usuario"];break;
		    case "esCadena":explica=literal["Recuerde_caracteres"];break;
		    case "esNumero":explica=literal["Recuerde_numero"];break;
		    case "esNumeroDecimal":explica=literal["Recuerde_numeroDecimal"];break;
		    case "esLista":explica=literal["debeSelecionarOpcion"];break;
		    case "esRadio":explica=literal["radioObligatorio"];break;
		    case "esCheck":explica=literal["checkObligatorio"];break;
		    case "esCodigoPostal":explica=literal["codigoNoEspaniol"];break;
		    default:explica="";
		}
		if(!maxmin || maxmin==null){
			switch (los_datos[id][2])
			{
				case "esLista":strAlerta= explica + ": '"+ los_datos[id][1] + "'"+cpObligatorio+" "+  ". ";break;
		    	case "esRadio":strAlerta= explica + ": '"+ los_datos[id][1] + "'"+cpObligatorio+" "+  ". ";break;
		    	case "esCheck":strAlerta= explica + ": '"+ los_datos[id][1] + "'"+cpObligatorio+" "+  ". " ;break;
		  /*  	case "esCodigoPostal":strAlerta= explica + ": '"+ los_datos[id][1];break;*/
		    	default:strAlerta= literal["debesIntroducirUn"]+ " '" + los_datos[id][1] + "'"+cpObligatorio+" "+literal["valido"]+  ". " + explica;
			}
		}else{
			if((los_datos[id][4]==los_datos[id][5]) && (los_datos[id][4] !=null))
				strAlerta=literal["elCampo"] +" '"+los_datos[id][1]+"'"+cpObligatorio+" "+literal["debeTenerExactamente"] +" "+los_datos[id][4]+" " +literal["caracteres"]
			else if(maxmin=="min" && valida.rf(id).value.length<los_datos[id][4])
				strAlerta=literal["elCampo"] +" '"+los_datos[id][1]+"'"+cpObligatorio+" "+literal["esDemasiado"]+ " " +literal["corto"]+ ", "+literal["suLongMinimaEsDe"]+"  "+los_datos[id][4]+" " + literal["caracteres"]
			else if(maxmin=="max" && valida.rf(id).value.length>los_datos[id][5])
				strAlerta=literal["elCampo"]  +" '"+los_datos[id][1]+"'"+cpObligatorio+" "+literal["esDemasiado"]+ " " +literal["largo"]+ ", "+literal["suLongMaximaEsDe"]+"  "+los_datos[id][5]+" " + literal["caracteres"]
		}
		if(!valida.alertaContinua){
			valida.muestraError(strAlerta);			
		}else {
			valida.strAlertaContinua+=strAlerta +" \n"
			valida.cuentaErr+=1
			valida.idsAlertaContinua[valida.idsAlertaContinua.length]=(los_datos[id][2]=="esRadio")? valida.rf(id,true):valida.rf(id)
		
		}
		return false;
	},
	esUsuarioValido:function(c) { return /[^=()><@%,;:$\\\"\[\]]+$/.test(c); },
	esCadena:function(c){ return /^[0-9A-Za-z-\\-\\.\\/\\/ÑñÁÉÍÓÚÀÈÒáéíóúàèòÜüÄäËëÏïÖöçÇ,\"\'/\\t\n\r ]+$/.test(c);},
	esTexto:function(c){ return (c.length > 0);},
	esNumero:function(c){return /^[0-9]+$/.test(c);},
	esEdad:function(c){return (valida.esNumero(c) && c<valida.edadMax) ;},
	esMail:function(c){return /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(c)},
	esCodigoPostal:function(c){return /^([0-4]{1}[1-9]{1}|10|20|30|40|50|51|52)([0-9]{3})+$/.test(c);},
	esTelefono:function(c){return /^[0-9\s\+\-)(]+$/.test(c)},
	esHora:function(c){return /^([0-1]{1}[0-9]{1}|20|21|22|23|24):[0-5][0-9]$/.test(c)},
	esLista:function(c) { return !((campoAct[3]=="obligatorio") &&  (c=="-1" ||c=="")) },
	esRadio:function(c){
		var rdb=(c!="undefined")? c:campoAct[0]
		var obl=(c)? "obligatorio":campoAct[3]
		var radio=valida.rf(rdb);
		if(obl=="obligatorio"){
			if(radio.length>0) {
				for(var uu=0;uu<radio.length;uu++){
					if(radio[uu].checked)return true 
				}
			}else {return radio.checked}
			return false;
		}return true;
	},
	esCheck:function(c){
		var rdb=(c!="undefined")? c:campoAct[0]
		var obl=(c)? "obligatorio":campoAct[3]
		var radio=valida.rf(rdb);
		if(obl=="obligatorio"){
			if(radio.length>0) {
				for(var uu=0;uu<radio.length;uu++){
					if(radio[uu].checked)return true 
				}
			}else {return radio.checked}
			return false;
		}return true;
	},
	esFecha:function(c){
		var cadenaREXP = new RegExp("^([0-2]{1}[1-9]{1}|10|20|30|31)"+valida.separadorFecha+"(0[1-9]{1}|10|11|12)"+valida.separadorFecha+"([0-9]{4})+$");
		if (!cadenaREXP.test(c)){return false;}
		//if(!/^([0-2]{1}[1-9]{1}|10|20|30|31)\/(0[1-9]{1}|10|11|12)\/([0-9]{4})+$/.test(c))return false;
		var fch=c.split("/")
		var bisiesto=((fch[2] % 4 == 0 && fch[2] % 100 != 0) || (fch[2] % 400 == 0))? 29 : 28;
		var diasMes=[31,bisiesto,31,30,31,30,31,31,30,31,30,31];
		if(fch[0]>diasMes[fch[1]-1]) return false;
		return true;
	},
	esNif:function(c){
		if(!/^[0-9]{8}([A-Za-z]{1})$/.test(c)) return false
		var letras = 'TRWAGMYFPDXBNJZSQVHLCKE';		
		return (c.substr(8,9).toUpperCase()==letras.charAt(c.substr(0,8)%23)) ;
	},
	esNie:function(c){
		if(c.charAt(0).toUpperCase()!="X") return false
		return valida.esNif(c.substr(1,c.length))
	},				
	esCif:function(c){
		if (!/^[A-Za-z0-9]{9}$/.test(c) || !/^[ABCDEFGHKLMNPQS]/.test(c)) return false;
		var v1 = new Array(0,2,4,6,8,1,3,5,7,9); 
		var digCrtl=c.charAt(c.length-1);
		var temp = 0;
		for(i=2;i<=6;i+=2 ) {
		      temp = temp + v1[ parseInt(c.substr(i-1,1)) ];
		      temp = temp + parseInt(c.substr(i,1));
		};
		temp = temp + v1[ parseInt(c.substr(7,1)) ];                   
		temp = (10 - ( temp % 10));
		if( temp == 10 ){if(!(digCrtl=="J" || digCrtl=="0")) return false;
		}else{if(digCrtl!=temp) return false; }
		return true;
	},
	comparaFechas:function(c1,c2){
		var f1=c1.split("/");
		var f2=c2.split("/");
		var fecha1=new Date();
		var fecha2=new Date();
		fecha1.setFullYear(f1[2],f1[1]-1,f1[0]);
		fecha2.setFullYear(f2[2],f2[1]-1,f2[0]);
		return (fecha2-fecha1)/1000/60/60/24;
	},
	crearRegla:function(id){
		var regla=id.trim().replace(/\(/gi, "( ").replace(/\)/gi, " )").replace(/ o /gi, " || ").replace(/ y /gi, " && ")
		
		regla=regla.split(" ")
		var reglaFinal=[];
		var negacion="";
		for(var aa=0;aa<regla.length;aa++){
			if(regla[aa]==")" ||  regla[aa]=="(" || regla[aa]=="o" || regla[aa]=="y" || regla[aa]=="&&" || regla[aa]=="||" ){
				reglaFinal[aa]=regla[aa]
			}else{
				if(regla[aa].charAt(0)=="!"){
					negacion="!";
					regla[aa]=regla[aa].substr(1,regla[aa].length)
				}
				
				ObjF=eval("document."+valida.f+"."+regla[aa]);
				if(ObjF.type) {}
				else{
					if(ObjF[0]) ObjF.type="radio"					
				}
				switch (ObjF.type){
				    case "text": reglaFinal[aa]=negacion +"document."+valida.f+"."+regla[aa]+".value!=''";break;
				    case "select-multiple": reglaFinal[aa]=negacion +"document."+valida.f+"."+regla[aa]+".value!=''";break;
				    case "select-one":reglaFinal[aa]=negacion +"document."+valida.f+"."+regla[aa]+".value!='-1'";break;
				    case "checkbox":reglaFinal[aa]=negacion +"valida.esRadio('"+regla[aa]+"')";break;
				    case "radio":reglaFinal[aa]=negacion +"valida.esRadio('"+regla[aa]+"')";break;
				    default:alert("Mesaje para Desarrollo******:\nEl tipo de obj de formulario que se esta intentado validar su dependencia no esta contemplado en el script de validacion : validar.js");explica="";
				}
			}
			negacion="";
		}
		return eval(reglaFinal.join(" "))
	},
	depende:function(c,d){
		var r1=valida.crearRegla(c)
		if(d!=null){ 
			var r2=valida.crearRegla(d)
			if(r1) return r2
		}else{return r1}
		return true;
	},
	generacionAutomatica:function(){	
		var separadorPrincipal="#"
		var separadorSecundario="~"
		var raizNombreValidacion="datosValidacion"
		var raizNombreDependencia="datosDependencias"
		var raizNombreEspecial="datosEspeciales"
		
		var totalFormularios=document.forms.length
		var data;	
		for(var tt=0;tt<totalFormularios;tt++){
			var objF1=document.getElementById(raizNombreValidacion+parseInt(tt+1))
			if(objF1){
				valida.setId(objF1.parentNode.id)
				data=objF1.value.split(separadorPrincipal);
				for(var xx=0;xx<data.length;xx++){
					var subData=data[xx].split(separadorSecundario);
					if(!isNaN(subData[3]))subData[3]=(parseInt(subData[3])==1)? "obligatorio":"opcional"
					valida.addValidacion(subData[0],subData[1],subData[2],subData[3],subData[4],subData[5])		
				}
			}
			var objF2=document.getElementById(raizNombreDependencia+parseInt(tt+1))
			if(objF2){
				if(!objF1)valida.setId(objF2.parentNode.id)
				data=objF2.value.split(separadorPrincipal);
			
				for(var xx=0;xx<data.length;xx++){
					var subData=data[xx].split(separadorSecundario);	
					subData[1]=(subData[1]=="null")? null:subData[1]		
					valida.addDependencia(subData[0],subData[1],subData[2])		
				}
			}
			
			var objF3=document.getElementById(raizNombreEspecial+parseInt(tt+1))
			if(objF3){
				if(!objF1 && objF2)valida.setId(objF3.parentNode.id)
				data=objF3.value.split(separadorPrincipal);
				for(var xx=0;xx<data.length;xx++){
					var subData=data[xx].split(separadorSecundario);			
					valida.addEspecial(subData[0],subData[1],subData[2])		
				}
			}			
			if(objF1) {
				objF1.parentNode.campoValidaciones = objF1;
				objF1.parentNode.onsubmit=valida.captura;
			}
		}
	}	
}
//valida.cargaIdioma()
//window.onload = valida.generacionAutomatica;