// (C) 2001 evoluciona - www.evoluciona.com - manuel@evoluciona.com 
// wm_form_validar.js v1.35 [Libs 1.35]

sColorForm 	= "#FF9C08"		//ponerlos a 0 si no quieres cambiar colores del form
sColorOK 	= "#8995A9"
sColorActivo= "#c4c4c4"
sColorError	= "#ffc4c4"
sColorObligatorio	= "#ff3000"


a_cValidos_B = new Array (" ","_","Á","É","Í","Ó","Ú","Ñ",",",";",".",":","+","-","@")

a_sError = new Array ("nxCampo2","¿Cuantas veces tendre que decirte que este campo solo admite numeros?")

a_vTamanoLimitado= new Array ("axCampo1",2,2,"Xxseudonimo",4,16,"Xxpassword",4,16)

a_vValorLimitado = new Array ("N_Numero",18,0)



bNS=(document.layers)? true:false;
bIE=(document.all)? true:false;
var	oFormName,sNameForm,vValueForm,cTipoForm,cValidacion,bError;
var g_vTimeoutID,g_sColorForm;
var g_bCamposVacios;


function InitValidarForm(oForm,nFormSize){
	if (nFormSize) FormResize(oForm,nFormSize)	
	InitColor(oForm)
	InitCheckmarks(oForm)
	if (typeof(a_sFormNames)!="undefined") RellenarForms(oForm)
}

function ValidarForm (oForm) {
	ResetCampo()
	InitColor(oForm)
	g_bCamposVacios=1
	var bError = false;
	var formC=0
	bFormOK= true;
	oFormName = oForm
	while (!bError && formC<oForm.length) {
		sNameForm  = oForm[formC].name
		vValueForm = oForm[formC].value
		bError=ValidaCampo (sNameForm,vValueForm)
		formC++
	}
    if (bError) CampoError()
    else ValidarCheckmarks(oForm)
	return bFormOK
}


function ValidarCampo (oCampo) {
	ResetCampo()
	oFormName= oCampo.form
	sNameForm	= oCampo.name
	vValueForm = oCampo.value
	bError=ValidaCampo (sNameForm,vValueForm)
    if (bError) CampoError()
}

function ActivarCampo (oCampo) {
	if (bIE){
		ResetCampo()
		oFormName= oCampo.form
		sNameForm	= oCampo.name
		vValueForm = oCampo.value
		eval ("sColor=oFormName."+sNameForm+".style.backgroundColor")
		g_sColorForm = "oFormName."+sNameForm+".style.backgroundColor = '"+sColor+"'"
		CicloColores(sNameForm,sColorForm,sColorActivo,20,40,0)
	}
}

function ValidarCheckmarks(oForm){
	var formC=0
	while (formC<oForm.length) {
		sNameForm  = oForm[formC].name
		if (sNameForm.substr(0,1).toLowerCase()=="k"){
			var bValor=0
			if (eval("oForm."+sNameForm+".checked")) bValor=1
			eval("oForm."+sNameForm+".value="+bValor)
			eval("oForm."+sNameForm+".checked=true")
		}
		formC++
	}
}

function InitCheckmarks(oForm){
	var formC=0
	while (formC<oForm.length) {
		sNameForm  = oForm[formC].name
		if (sNameForm.substr(0,1).toLowerCase()=="k"){
			eval("oForm."+sNameForm+".checked=false")		
		}
		formC++
	}
}

function FormResize(oForm,nPorcentaje){
	var nFormC=0
	if (bIE){
		while (nFormC<oForm.length) {
			var sTipo=oForm[nFormC].type
			if (sTipo=="text" || sTipo=="textarea") {
				var nSize = oForm[nFormC].size 
				nSize += Math.ceil((nSize*nPorcentaje)/100)
				oForm[nFormC].size = nSize 
			}
			nFormC++
		}
	}
}

function ValidaCampo(sNameForm,vValueForm){		
	var bError=(ValidaValor (sNameForm,vValueForm))
	if (!bError && (cValidacion=="_" || cValidacion=="x")) {
		ColorForm (sNameForm,1)
	}
	return bError
}

function ValidaValor (sNameForm,vValueForm){		
	var bError = false;
	var bValidar=0
	cValidacion = sNameForm.substr(1,1)
	cTipoForm= sNameForm.substr(0,1)							
	if (cValidacion=="_" || cValidacion=="x") bValidar=1		
	
	if (bValidar && ((cTipoForm == cTipoForm.toLowerCase() && !vValueForm && cTipoForm!="f") || cTipoForm=="r")) bValidar=0
	if (bValidar) {
		if (cTipoForm!="f") g_bCamposVacios=0
		cTipoForm =  cTipoForm.toUpperCase()
		if (cTipoForm=="L" || cTipoForm=="M") cTipoForm="N"
		if (cTipoForm=="H") cTipoForm="O"
		switch (cTipoForm) {
			case "A":							
				if (vValueForm == "") {
					bError = true;
					errorT= "Please, fill this field."
				}
				break
			case "B":
				if (vValueForm == "") {
					bError = true;
					errorT= "Please, fill this field."
				}
				cInvalido = ValidarCadena (vValueForm,a_cValidos_B)
				if (cInvalido) {
					bError = true;
					errorT= "This character is not valid: "+cInvalido
				}
				break
			case "C":
				if (vValueForm.length!=5) {
					bError = true;
					errorT= "Please, enter a valid postal code."
				}
				break
			case "D":
			    var t_dFecha = new Date();				
			    var t_nDia = t_dFecha.getDate()
			   	var t_nMes = t_dFecha.getMonth() + 1
				var t_nAno = t_dFecha.getFullYear()
				var dHoy = t_nDia + "/" + t_nMes + "/" + t_nAno
				eval ("oFormName."+sNameForm+".value=dHoy")
				break
			case "E":
				sError=EsEmail(vValueForm)
				if (sError) {
					bError = true;
					errorT= "Please, enter a valid e-mail adress."+sError
				}
				break
			case "F":
				sError = validarFecha()
				if (sError) {
					bError = true;
					errorT= sError
				}
				break
			case "G":
				if (!EsFecha(vValueForm)) {
					bError = true;
					errorT= "Por favor, introduce la fecha en formato: dd/mm/aaaa\nFecha: "+vValueForm
				}
				break
			case "I":
				if (!EsNumero(vValueForm) || ((vValueForm/100)!=Math.ceil(vValueForm/100))) {
					bError = true;
					errorT= "Por favor, introduce un número multiplo de 100"
				}
				break
			case "J":
				if (!EsNumero(vValueForm) || ((vValueForm/1000)!=Math.ceil(vValueForm/1000))) {
					bError = true;
					errorT= "Por favor, introduce un número multiplo de 1000"
				}
				break
			case "N":							
				if (!EsNumero0(vValueForm)) {
					bError = true;
					errorT= "Please, enter a correct number"
				}
				break
			case "O":
				if (!EsNumero(vValueForm)) {
					bError = true;
					errorT= "Por favor, introduce un número distinto de cero"
				}
				break					
			case "P":
				if (vValueForm == "") {
					bError = true;
					errorT= "Por favor, rellena tu contraseña."
				}
				else {
					t_sNameForm2 = sNameForm.substr(0,1)+"x"+sNameForm.substr(2)
					t_vValueForm2 = eval("oFormName."+t_sNameForm2+".value")
					if (vValueForm!=t_vValueForm2) {
						bError = true;
						errorT= "Por favor, las contraseñas no coinciden"
					}
				}
				break
			case "Q":
				if (!EsNumeroNegativo(vValueForm)) {
					bError = true;
					errorT= "Por favor, el campo donde esta el cursor debe ser un número"
				}
				break
			case "R":
				var bChecked=false
				var nRadios = eval("oFormName."+sNameForm+".length")							
				if (nRadios){
					for (i=0;i<nRadios;i++) {
						if (eval("oFormName."+sNameForm+"[i].checked")) bChecked=true
					}
				}
				else{
					if (eval("oFormName."+sNameForm+".checked")) bChecked=true				
				}

				if (!bChecked) {
					bError = true;
					errorT= "Por favor, seleccione una opción"
				}
				break					
			case "S":
				if (vValueForm == "") {
					bError = true;
					errorT= "Por favor, selecciona una opción."
				}
				break
			case "T":
				if (vValueForm<"600000000" || vValueForm>999999999 || vValueForm.length!=9) {
					bError = true;
					errorT= "Por favor, corrige tu número de teléfono."
				}		
				break
			case "U":
				if(!validarNIF(vValueForm)){
					bError = true;
					errorT= "Por favor, este campo debe ser un NIF correcto con la letra al final [xxxxxxxY]"
				}		
				break
			case "V":
				if (typeof(ValidaNumeroTarjeta)=="undefined") alert("ERROR: Necesitas cargar la libreria 'wm_form_tarjetas.js'")
				else{
					if(!ValidaNumeroTarjeta(0,vValueForm)){
						bError = true;
						errorT= "Por favor, el numero de tarjeta de credito no es valido"
					}		
				}
				break
			case "W":
				if (vValueForm == "") {
					bError = true;
					errorT= "Por favor, selecciona al menos una opción."
				}
				break
			default:
		}
	}
	if (!bError) bError = LimiteTamano(sNameForm)
	if (!bError) bError = LimiteValor(sNameForm)
	return bError;
}

function LimiteTamano(sNameForm){
var bError=false;
	var nPosicion = BuscaEnArray (a_vTamanoLimitado,sNameForm)
	if (nPosicion!=-1) {
		var cTipoForm= sNameForm.substr(0,1)
		if (vValueForm!="" || cTipoForm == cTipoForm.toUpperCase()) {
			t_nSizeMin = a_vTamanoLimitado[nPosicion+1]
			if (t_nSizeMin && t_nSizeMin>vValueForm.length){
				bError = true;
				errorT= "Por favor, este campo no puede ser menor de "+t_nSizeMin+" caracteres (ahora tiene "+vValueForm.length+")"
			}
			t_nSizeMax = a_vTamanoLimitado[nPosicion+2]
			if (t_nSizeMax && t_nSizeMax<vValueForm.length){
				bError = true;
				errorT= "Por favor, este campo no puede ser mayor de "+t_nSizeMax+" caracteres (ahora tiene "+vValueForm.length+")"
			}
		}
	}
	return bError
}

function LimiteValor(sNameForm){
var bError=false;
	nPosicion = BuscaEnArray (a_vValorLimitado,sNameForm)
	if (nPosicion!=-1) {
		var cTipoForm= sNameForm.substr(0,1)
		if (vValueForm!="" || cTipoForm == cTipoForm.toUpperCase()) {
			t_nValorMin = a_vValorLimitado[nPosicion+1]
			if (t_nValorMin && t_nValorMin>vValueForm){
				bError = true;
				errorT= "Para ser socio debes tener mas de "+t_nValorMin+" años."
			}
			t_nValorMax = a_vValorLimitado[nPosicion+2]
			if (t_nValorMax && t_nValorMax<vValueForm){
				bError = true;
				errorT= "Por favor, este campo no puede ser mayor de "+t_nValorMax
			}
		}
	}
	return bError
}

function CampoError(){
	bFormOK=false
	nPosicion = BuscaEnArray (a_sError,sNameForm)
	if (nPosicion!=-1) errorT=a_sError[nPosicion+1]
	if (bNS) alert (errorT);
//vValueForm &&
	if (cTipoForm!="R" && eval("oFormName."+sNameForm+".type")!="hidden"){	//No puedo hacer FOCUS en los RADIOS,CHECKS,HIDDEN
		ColorForm(sNameForm,0)
		eval("oFormName."+sNameForm+".focus()")
	}
//	if (bIE) alert (errorT);
	alert (errorT);
}


function validarFecha(){
	var sReturn = ""
	var t_sNameForm = sNameForm.substr(2)

	var t_nDia = eval("oFormName.Dz"+t_sNameForm+".value")
	var t_nMes = eval("oFormName.Mz"+t_sNameForm+".value")
	var t_nAno = eval("oFormName.Az"+t_sNameForm+".value")

	if (sNameForm.substr(0,1)=="f" && (t_nDia =="" && t_nMes=="" && t_nAno=="")){
		eval ("oFormName."+sNameForm+".value=''")
		ColorForm("Dz"+t_sNameForm,1)
		ColorForm("Mz"+t_sNameForm,1)
		ColorForm("Az"+t_sNameForm,1)
		return sReturn; 			
	}


	if (t_nAno < 100) t_nAno=1900 + parseInt(t_nAno);	
	if (!(t_nAno >1900 && t_nAno <=3000)) sReturn="A"
	if (!(t_nMes >= 1 && t_nMes <= 12)) sReturn="M" 
	if (!(t_nDia >= 1 && t_nDia <= 31)) sReturn="D"

	if (sReturn==""){
		var t_dFecha=new Date(t_nAno,t_nMes-1,t_nDia)
		if (t_nAno!=t_dFecha.getFullYear()) sReturn="A"
		if (t_nMes!=(t_dFecha.getMonth()+1)) sReturn="M"
		if (t_nDia!=t_dFecha.getDate()) sReturn="D"
	}

	if (sReturn=="") {
		eval ("oFormName."+sNameForm+".value='"+t_nDia+"/"+ t_nMes+"/"+t_nAno+"'")
		ColorForm("Dz"+t_sNameForm,1)
		ColorForm("Mz"+t_sNameForm,1)
		ColorForm("Az"+t_sNameForm,1)
	}
	else{
		sNameForm = sReturn+"z"+t_sNameForm
		switch (sReturn) {
			case "D":
				sReturn = "Por favor, corrija el día"
				break
			case "M":
				ColorForm("Dz"+t_sNameForm,1)
				sReturn = "Por favor, corrija el mes"
				break
			case "A":
				ColorForm("Dz"+t_sNameForm,1)
				ColorForm("Mz"+t_sNameForm,1)
				sReturn = "Por favor, corrija el año"
				break
		}
	}
	return sReturn; 
}



function EsFecha(dFecha){
	var barra1= dFecha.indexOf("/")
	var barra2= dFecha.indexOf("/",barra1+1)

	var dia = parseInt(dFecha.substring(0,barra1),10)
	var mes = parseInt(dFecha.substring(barra1+1,barra2),10)
	var ano = parseInt(dFecha.substring(barra2+1),10)

	var i = 0    
	if (dia > 0 && dia <= 31) i++;
	if (mes > 0 && mes <= 12) i++;	
	if (ano < 100) ano=ano+1900;	
	if (ano > 0 && ano <3000) i++;

	if (i == 3)	return true;
	else return false;
}

function EsNumero0 (vVariable){		// True  (0 / 23 / 12.5 / "23") Este si acepta el cero, pero no negativos
	if (vVariable=="" || vVariable!=Math.abs(vVariable)) return (false)
    return !(isNaN(vVariable));		// False ("" / "eew" / 12,3)
}

function EsNumero (vVariable){		// True  ( 23 / 12.5 / "23")  No acepta el 0 ni negativos
	if (vVariable="" || vVariable==0 || vVariable!=Math.abs(vVariable)) return (false)
    return !(isNaN(vVariable));		// False (0 / "" / "eew" / 12,3)
}

function EsNumeroNegativo (vVariable){		// True  (0 / 23 / 12.5 / "23") Este si acepta el cero y negativos
	if (vVariable=="") return (false)
    return !(isNaN(vVariable));				// False ("" / "eew" / 12,3)
}


function EsEmail (s){
a_cValidos_E = new Array (".","_","-","@");
var sError=" "

	cInvalido = ValidarCadena (s,a_cValidos_E)
	if (cInvalido) {
		return "\n\nInvalid character:["+cInvalido+"]"
	}
    
    var i = 0;
    var sLength = s.length-1;
    while ((i <= sLength) && (s.charAt(i) != "@")){
    	i++
    }
    if (i==sLength) return sError;
    if ((s.charAt(i+1) == "." || s.charAt(i+1) == "@")) return sError;

	bFaltaPunto=sError;
	while (i<=sLength){  
	    if (s.charAt(i)==".") {
			bFaltaPunto=false;
		    if ((i==sLength) || (s.charAt(i+1)==".")) return sError;
		}
    	i++;
	}
    return bFaltaPunto;
}

function validarNIF(nNIF){
	var a_cOrden = new Array ("T","R","W","A","G","M","Y","F","P","D","X","B","N","J","Z","S","Q","V","H","L") 
	var d,letra;
	var retCode = true;
	
	letra=nNIF.substring(nNIF.length-1,nNIF.length).toUpperCase();
	if(letra.charCodeAt(0)<65 || letra.charCodeAt(0)>90) retCode=false;
	d=parseFloat(nNIF)%23;
 	if(letra!=a_cOrden[d]) retCode=false;

	return retCode;
}

function ValidarCadena(sCadena,a_cValidos){		// Comprueba que solo haya caracteres y numeros
	var bCaracter,sCadenaMay
	sCadenaMay = sCadena.toUpperCase();
	for (f = 0; f < sCadena.length ; f++){
		bCaracter = sCadenaMay.charAt(f);		
		if (!((bCaracter >= "A" && bCaracter <= "Z") || (bCaracter >= "0" && bCaracter <= "9") || BuscaEnArray (a_cValidos,bCaracter)!=-1 )) return sCadena.charAt(f);
	}
	return 0;
}


function InitColor(oForm){
var formC=0,bValidar,sColor,sNameForm,cValidacion,cTipoForm,g_sColorForm
	if (bIE) {
		while (formC<oForm.length) {
			bValidar=0
			sNameForm  = oForm[formC].name
			cValidacion = sNameForm.substr(1,1)
			if (cValidacion=="_" || cValidacion=="x") bValidar=1	//Nombre Form correcto
			if (bValidar){
				cTipoForm= sNameForm.substr(0,1)					//Codigo Original
				if (cTipoForm == cTipoForm.toUpperCase()){			//Obligatorio
					sColor = sColorObligatorio
				}
				else{
					sColor = sColorForm
				}
				g_sColorForm = "oForm."+sNameForm+".style.backgroundColor = '"+sColor+"'"
				if (sColor) eval(g_sColorForm);
			}
			formC++
		}
	}
}


function ColorForm(sNameForm,bFormOK){
	if (bIE) {
		ResetCampo()
		var cTipoFormU =  cTipoForm.toUpperCase()
		if (cTipoFormU!="R" && cTipoFormU!="K" && eval("oFormName."+sNameForm+".type")!="hidden"){	//No puedo hacer FOCUS en los RADIOS,CHECKS,HIDDEN
			var sColor = sColorError
			if (bFormOK) sColor = sColorOK
			if (!sColor) sColor= sColorForm 
			g_sColorForm = "oFormName."+sNameForm+".style.backgroundColor = '"+sColor+"'"
			if (sColor) eval(g_sColorForm);
			if (!bFormOK) CicloColores(sNameForm,sColorForm,sColorError,20,40,0)
		}
	}
}

function ResetCampo(){
	if (g_vTimeoutID) clearTimeout(g_vTimeoutID)
	if (g_sColorForm) eval(g_sColorForm);
}

function RellenarForms(oForm){				//oForm = document.forms.FormName
	var sForm,f=0;
	while (f<a_sFormNames.length) {
		if (eval("oForm."+a_sFormNames[f])){	 //si existe ese form
			cTipoForm= a_sFormNames[f].substr(0,1).toUpperCase()
			switch (cTipoForm) {
				case "K":
	//				eval("var bValor=oForm."+a_sFormNames[f]+".value")
	//				if (bValor==0) eval("oForm."+a_sFormNames[f]+".checked=false")
					bValor=false
					if (a_vFormValues[f] && a_vFormValues[f]!="False") bValor=true
					sForm = "oForm."+a_sFormNames[f]+".checked="+bValor
					eval (sForm)
					break					
				case "G":			//Solo deberia dar la vuelta Fechas americanas
					var fFecha = a_vFormValues[f]	//CambiaFecha(a_vFormValues[f])
					eval ("oForm."+a_sFormNames[f]+".value='"+ fFecha +"'")
					break
				case "F":							//Y ya lo hace el ASP
					var fFecha = a_vFormValues[f]	//CambiaFecha(a_vFormValues[f])
					eval ("oForm."+a_sFormNames[f]+".value='"+ fFecha +"'")

					var sNombre=a_sFormNames[f].substring(2)
					var a_vFechas = fFecha.split("/");
					if (typeof(a_vFechas[2])=="undefined"){
						a_vFechas[0]=""
						a_vFechas[1]=""
						a_vFechas[2]=""
					}
					eval( "oForm.Dz"+sNombre+".value='"+ a_vFechas[0] +"'")
					eval( "oForm.Mz"+sNombre+".value='"+ a_vFechas[1] +"'")
					eval( "oForm.Az"+sNombre+".value='"+ a_vFechas[2] +"'")
				break
				case "R":
	
					if (a_vFormValues[f] && a_vFormValues[f]!="False"){
						sForm = "oForm."+a_sFormNames[f]+".checked=true"
						eval (sForm)
					}
				break
				case "S":
					oFormName = eval("oForm."+a_sFormNames[f])
					for (i=0;i<oFormName.length;i++){
						if (oFormName[i].value==a_vFormValues[f] || oFormName[i].text==a_vFormValues[f]) {
							oFormName.selectedIndex=i
							break
						}
					}
				break
				case "W":
					oFormName = eval("oForm."+a_sFormNames[f])
					var sValor=a_vFormValues[f]
					for (var h=0;h<sValor.length;h++){
						for (var i=0;i<oFormName.options.length;i++){
							if (oFormName[i].value==sValor.charAt(h) || oFormName[i].text==sValor.charAt(h)){
								 oFormName.options[i].selected=true
								break
							}
						}
					}
				break
				default:
					eval("oForm."+a_sFormNames[f]+".value=a_vFormValues[f]")
			}
		}
		f++
	}
}

function CambiaFecha(sFecha) {				//1.6 Cambia entre dd/mm/aa y mm/dd/aa
	nBarra1 = sFecha.indexOf("/")
	nBarra2 = sFecha.lastIndexOf("/")

	if (nBarra1!=-1 || nBarra2!=-1){	
		sDia= sFecha.substring(0,nBarra1)
		sMes= sFecha.substring(nBarra1+1,nBarra2)
		sAno= sFecha.substring(nBarra2+1)

		sFecha = sMes + "/" + sDia + "/" + sAno
	}
	return sFecha
}

function CicloColores(sNameForm,sColorS,sColorD,nPasos,nTime,nPasosC){	//Form,hexColor1,hexColor2,nPasos,nVelocidad
	var nColorS,nColorD
	var sColor = "#"
	nPasosC++
	if (nPasosC!=nPasos){
		for (f=0;f<3;f++){
			nColorS = parseInt("0x"+ sColorS.substr(1+(f*2),2))
			nColorD = parseInt("0x"+ sColorD.substr(1+(f*2),2))
			nColorS = Math.round( nColorS + ((nColorD-nColorS)*nPasosC)/nPasos )
			if (nColorS<16) sColor +="0"
			sColor += nColorS.toString(16)			//Dec2Hex
		}
		var sFuncion="CicloColores('"+sNameForm+"','"+sColorS+"','"+sColorD+"',"+nPasos+","+nTime+","+nPasosC+")"
	}
//	else sColor=sColorD
	else {
		sColor=sColorD
		nPasosC=0
		var sFuncion="CicloColores('"+sNameForm+"','"+sColorD+"','"+sColorS+"',"+nPasos+","+nTime+","+nPasosC+")"
	}
	g_vTimeoutID=setTimeout (sFuncion,nTime)	
	eval("oFormName."+sNameForm+".style.backgroundColor = sColor");
}



function BuscaEnArray (a_vArray,vValor){		
	var nPos = -1
	var nLen = a_vArray.length
	var f=-1
	while (nPos==-1 && f++ < nLen){ 
		if (a_vArray[f]==vValor) nPos=f
	}
	return nPos
}



