// DEPRECATED !!!
// Usar: ev_form_validar.js

// (C) 2001 WebMedia - www.webmedia.es - manuel@webmedia.es   
// wm_form_validar.js v1.38 [Libs 1.38]
// v0.40: A partir de esta version no es compatible con las anteriores
// v0.60: Admite mensajes de error propios para cada campo
// v0.64: B_: solo admiten caracteres basicos [a_cValidos_B]
// v0.65: R_: para RadioButtons obligatorios
// v0.70: E_: muy mejorada (no admite los tipicos errores en los emails) [a_cValidos_E]
// v0.75: añado ciclo de colores para los errores
// v0.90: Valida campos en el momento <input...onBlur= "ValidarCampo(this)">
// v0.91: Colorea el seleccionado 	  <input...onClick="ActivarCampo(this)" onBlur="ResetCampo()">
// v0.92: B_: Admite la ñ. Bugs con algunos campos fixed
// v0.93: FormResize() Hace los forms de IE mas grandes, para que se parezcan a los de NS
// v0.95: U_: NIF
// v0.96: V_: Tarjetas Visa, MasterCard, AmEx, DinersClub, Discover, enRoute, JCBC
// v0.97: Calendario grafico
// v0.98: Cambio de nombre. 
// v0.99: RellenarForms(oForm)
// v1.00: K_: checkmark auto
// v1.01: RellenarForms() mejorado
// v1.02: W_: SELECT MULTIPLE
// v1.03: RellenarForms() mejorado
// v1.05: Q_: para numeros negativos. A partir de ahora el resto solo admite numeros positivos 
// v1.10: Tamaños y valores Min y Max valen para cualquier campo 
// v1.15: K_: activa los checkmarks solo al final
// v1.16: K_: <BODY onLoad="InitCheckmarks(document.forms.F_Test)"...Limpia todos los checkmarks
// v1.20: ValidaValor ("N_","13") Valida cualquier valor con la regla que queramos
// v1.30: g_bCamposVacios=1 si no son obligatorios, pero todos los campos esten vacios
// v1.31: Fixed: P_ / LimiteTamano() / LimiteValor()
// v1.32: Updated: F_
// v1.33: InitColor(oForm)	
// v1.34: InitValidarForm(oForm,nFormSize)
// v1.35: Fixed: G_
// v1.36: Fixed: NS6 / SELECT en NS
// v1.37: Fixed: InitValidarForm() / Caso hay varios FORMS distintos
// v1.38: InitFormValidar(oForm,nFormSize,bInitColor)	Deprecated:InitValidarForm()


//Bugs:
// Probar en NS4 y NS6
// Admita Euros (Que admita/valide numeros (en formato texto) con puntos y comas) (En funciones.js esta hecho)
// Tipos de alerta: 0.Ninguna 1.Todas 2.Auto 3.Tooltips
// 	Modo AutoValidar: valida colores al CAMBIAR de input y saca alerts al ENVIAR
// Nuevos tipos:
// 		Validar como numero en JS y guardar con texto en BD
//		Fechas David: aaaammdd
// Problema con FORMS con el mismo nombre (en realidad el HTML si los permite, pero parece jodido)
// W_: se pueda modificar el caracter que separa valores de los SELECT MULTIPLE (esto es en ASP?)
// W_ : ahora solo coge los caracteres de 1 en 1 (i.e. solo admite values de 1 caracter)
// N_ : admite -0 y 000... como numeros positivos (¿podria dar problemas en ASP o BD?)
// Estudiar B_: porque tiene 2 funciones distintas: en JS valida caracteres y en ASP usa LIKE
// En NS calcula mal el numero de Radios/Checks si solo hay uno (dice que hay 4) [Bug de NS]
// K_: al volver atras InitCheckmarks() borre solo los que debe (pero no se puede porque pierde el valor)
// NS: Calendario: hay que poner el HTML al final de la pagina / no se oculta
// Calendario: debia aparecer en las coord donde pinchamos 
// Calendario: boton de cerrar
// Calendario: intentar simplificar el codigo HTML necesario y las librerias
// ...onBlur="ResetCampo()"> Tiene problemillas ()
// Como hago focus/cambio de color los radios?
// Haga un ciclo de colores en el form del error hasta que pinche (activar en el form del error un onChange para que pare el ciclo)
// Que valide directamente cada form al cambiarlo haciendo un onChange() global (si se puede)
// Repasar SELECT, TEXTAREA, RADIO y CHECKMARK.Hace falta comprobar Checkboxes? (creo que no)


// Uso: 
// <SCRIPT LANGUAGE="JavaScript" SRC="libs/wm_form_validar.js"></SCRIPT>
//HTML: 	if (ValidarForm(document.forms.FormularioX)) document.forms.FormularioX.submit();
//DHTML:	var sForm=document.forms.Formulario
//			if(bNS) sForm=document.Lcontenido.document.forms.Formulario
//			if (ValidarForm(sForm)) sForm.submit();

// Extras:
// ValidaValor ("N_","13")	//Podemos validar cualquier valor que queramos con la regla que queramos
//		No vale para estos tipos: (D_/P_/R_) porque buscan un Form
// if (g_bCamposVacios) alert("Rellena algo")			//1=todos los campos estan vacios
// InitFormValidar(oForm,nFormSize,bInitColor)	//Ejecuta las rutinas basicas de inicializacion
// Deprecated: InitValidarForm(oForm,nFormSize)	//lo mantenemos por compatibilidad
// InitColor(oForm)		//Reinicia colores de todo. Ya lo hace auntomatizamente antes de validar
// ValidarCadena(sCadena,a_cValidos)	// Comprueba que solo haya caracteres y numeros
// <BODY onLoad="InitCheckmarks(document.forms.F_Test)"...	//Limpia todos los checkmarks
// FormResize(document.forms.Formulario,50)	//Hace los forms de IE un % mas grandes, para que se parezcan a los de NS
// <input...onBlur ="ValidarCampo(this)">		//Valida campos en el momento 
// <input...onFocus="ActivarCampo(this)">		//Colorea el seleccionado
// <input...onFocus="ActivarCampo(this)" onBlur="ResetCampo()">		//Aun tiene problemillas
// Para validar tarjetas de credito tambien necesita la siguiente libreria:
//		<SCRIPT LANGUAGE="JavaScript" SRC="libs/wm_form_tarjetas.js"></SCRIPT>
// Si quieres calendario hacen falta tambien estas 2 librerias:
//		<SCRIPT LANGUAGE="JavaScript" SRC="libs/calendario/api.js"></SCRIPT>
//		<SCRIPT LANGUAGE="JavaScript" SRC="libs/calendario/calendario.js"></SCRIPT>
// 		Y este codigo al principio del BODY
//			<div id="capabug">&nbsp;</div>
//			<script>
//			Cal1=new Calendario('Cal1','document.F_Test.F_fecha1','.')
//			document.write(Cal1.Pintar())
//			</script>
// 		Y el enlace al calendario:	
// 			<input type="button" value="Calendario" onclick="Cal1.MuestraCalendario()"


// ********************** [HTML] ************************
// * Si se usan los colores o arrays, hay que ponerlos en el HTML (y cargarlos despues de la libreria)
sColorForm 	= "#80241D"		//ponerlos a 0 si no quieres cambiar colores del form
sColorOK 	= "#80241D"
sColorActivo= "#80241D"
sColorError	= "#000000"
sColorObligatorio	= "#80241D"

// * Caracteres que admite los INPUT de tipo B
a_cValidos_B = new Array (" ","_","Á","É","Í","Ó","Ú","Ñ",",",";",".",":","+","-","@")
// * 0.Nombre campo 1.Texto de Error
a_sError = new Array ("nxCampo2","¿Cuantas veces tendre que decirte que este campo solo admite numeros?")
// * 0.Nombre 1.TamañoMin 2.TamañoMax 	(tamaño de campos con limite de caracteres)
a_vTamanoLimitado= new Array ("axCampo1",2,2,"Xxseudonimo",4,16,"Xxpassword",4,16)
// * 0.Nombre 1.ValorMin 2.ValorMax		(valores de campos limitados por su valor numerico)
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 InitFormValidar(oForm,nFormSize,bInitColor){
	if (nFormSize) FormResize(oForm,nFormSize)	//Hace los forms de IE un % mas grandes, para que se parezcan a los de NS
	InitCheckmarks(oForm)		//clear CkeckBoxes. Usar siempre !!!
	if (typeof(a_sFormNames)!="undefined") RellenarForms(oForm)
	if (bInitColor) InitColor(oForm)
}

function InitValidarForm(oForm,nFormSize){
	if (nFormSize) FormResize(oForm,nFormSize)	//Hace los forms de IE un % mas grandes, para que se parezcan a los de NS
	InitCheckmarks(oForm)
	if (typeof(a_sFormNames)!="undefined") {
		RellenarForms(oForm)
	}
	else {
		InitColor(oForm)
	}
}

function ValidarForm (oForm) {
	if (oFormName!=oForm) g_sColorForm=""		//Fix: varios FORMS
	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
		if (oForm[formC].type=="select-one"){				//SELECT	
			nSelected=oForm[formC].selectedIndex
			vValueForm=oForm[formC][nSelected].value
		}
		else{
			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 (!bNS){
		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"){
//alert(eval("oForm."+sNameForm+".value"))
//			if (eval("oForm."+sNameForm+".value!=1")) eval("oForm."+sNameForm+".checked=false")
			eval("oForm."+sNameForm+".checked=false")		//Vacio todos
		}
		formC++
	}
}

function FormResize(oForm,nPorcentaje){
	var nFormC=0
	if (!bNS){
		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){		//Debe existir el Form
	var bError=(ValidaValor (sNameForm,vValueForm))
	if (!bError && (cValidacion=="_" || cValidacion=="x")) {
//		 if (cTipoForm=="F"){
//			var t_sNameForm = sNameForm.substr(2)
//			ColorForm("Dz"+t_sNameForm,1)
//			ColorForm("Mz"+t_sNameForm,1)
//			ColorForm("Az"+t_sNameForm,1)		 	
//		 }
//		 else
		ColorForm (sNameForm,1)
	}
	return bError
}

function ValidaValor (sNameForm,vValueForm){		//NO tienen porque existir los valores que le pasamos (ni Form ni Value)
	var bError = false;
	var bValidar=0
	cValidacion = sNameForm.substr(1,1)
	cTipoForm= sNameForm.substr(0,1)							//Codigo Original
	if (cValidacion=="_" || cValidacion=="x") bValidar=1		//Nombre Form correcto
	
	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":							// A y B
				if (vValueForm == "") {
					bError = true;
					errorT= "Por favor, rellena este campo."
				}
				break
			case "B":
				if (vValueForm == "") {
					bError = true;
					errorT= "Por favor, rellena este campo."
				}
				cInvalido = ValidarCadena (vValueForm,a_cValidos_B)
				if (cInvalido) {
					bError = true;
					errorT= "Por favor, este campo no admite el caracter: "+cInvalido
				}
				break
			case "C":
				if (vValueForm.length!=5) {
					bError = true;
					errorT= "Por favor, introduce el código postal correctamente."
				}
				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= "Por favor, escribe una dirección de correo electrónica válida."+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":							// N, L y M
				if (!EsNumero0(vValueForm)) {
					bError = true;
					errorT= "Por favor, el campo donde esta el cursor debe ser un número positivo"
				}
				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)			//1.36
}


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 "\nCaracter invalido:["+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 (!bNS) {
		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++
		}
	}
//		ResetCampo()
//		var cTipoFormU =  cTipoForm.toUpperCase()
//		if (cTipoFormU!="R" && cTipoFormU!="K" && eval("oFormName."+sNameForm+".type")!="hidden"){	//No puedo hacer FOCUS en los RADIOS,CHECKS,HIDDEN
}


function ColorForm(sNameForm,bFormOK){
	if (!bNS) {
		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":
	// si hay varios radios/checkboxes, quiza habria que tratarlo de otra forma
	//				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 (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){		//Busca la posicion en el array del valor que se le pasa
	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
}




