sColorForm 	= "#F4F4F4"		
sColorOK 	= "#E7FF60"
sColorActivo= "#C4C4C4"
sColorError	= "#87CCDD"
sColorObligatorio	= "#87CCDD"



// * Inputs que NO validara NUNCA
g_a_sNoValidar 		= new Array ("B_Nombre_Lo_","vxCIF")		
// * Inputs que validara SIEMPRE. 
g_a_sSiValidar 		= new Array ("B_Nombre_Lo_","vxCIF")		
// * g_a_sSiValidarExt: permite cambiar el tipo de validacion o personalizar la funcion de validacion
//						(InputName,["tipoValidacion"],["FuncionValidacionEspecial" (caso Z)])
g_a_sSiValidarExt	= new Array ("B_Nombre_Lo_","Z","TestFuncionZ(vValueForm)")		
// * Caracteres que admite los INPUT de tipo B
a_cValidos_B = new Array (" ","_","Á","É","Í","Ó","Ú","Ñ",",",";",".",":","+","-","@")
// * 0.Nombre campo 1.Mensajes de Error personalizados para cada campo
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",8,8,"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)
// *  Corrige los Input (de tipo NIF/DNI/...) cuyo nombre esten en el array
g_a_sAutoCorregir = new Array ("U_NIF","V_NIF")
// ***************************************************

g_nDebugMode = 0

document.write ("<SCRIPT>bNS=(document.layers)? true:false;</SCRIPT>")			//NS4
bIE=(document.all)? true:false;
var	oFormName="",sNameForm,vValueForm,cTipoForm,cValidacion,bError;
var g_vTimeoutID,g_sColorForm;

var g_bCamposVacios;
var g_sErrorFormName,g_sErrorInputName,g_sErrorValue,g_sErrorText,g_ErrorTipo	// Variables Error globales





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+"'"
		if (sColorActivo) CicloColores(sNameForm,sColorForm,sColorActivo,20,40,0)
	}
}

function ValidarCheckmarks(oForm){
	var formC=0
	while (formC<oForm.length) {
		sNameForm  = oForm[formC].name
		if (CheckInput(sNameForm)){
			if (sNameForm.substr(0,1).toUpperCase()=="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 (CheckInput (sNameForm)){
			if (sNameForm.substr(0,1).toUpperCase()=="K"){
//alert(eval("oForm."+sNameForm+".value"))			//no guarda el valor real !!!
				eval("oForm."+sNameForm+".checked=false")		//asi que 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){
	var bError=(ValidaValor (sNameForm,vValueForm))
	if (!bError && CheckInput(sNameForm) &&  (cValidacion=="_" || cValidacion=="x")) {
		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
	var bFormValido = 0				// Existe el Input?	

	if (! CheckInput (sNameForm,1)) return(bError)

	bFormValido = CheckInput (sNameForm)
	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 (cTipoForm=="r" && CheckRadios()) g_bCamposVacios=0

// Para no validar Botones, Hidden, Disabled, NoInputs....	!!!
// Existe el Form y tiene nombre
// 	if (sNameForm!="" && bFormValido) {		
//		if (eval("oFormName."+sNameForm+".disabled") || eval("oFormName."+sNameForm+".type")=="hidden") bValidar=0
//	}
	if (!bFormValido) bValidar = bFormValido
	
	if (BuscaEnArray (g_a_sNoValidar,sNameForm)!=-1) bValidar=0
	if (BuscaEnArray (g_a_sSiValidar,sNameForm)!=-1) bValidar=1
	var nPosInput = BuscaEnArray (g_a_sSiValidarExt,sNameForm)
	if (nPosInput!=-1) {
		bValidar=1
		if (g_a_sSiValidarExt[nPosInput+1]) cTipoForm = g_a_sSiValidarExt[nPosInput+1]
	}
	
	if (bValidar) {
		if (cTipoForm!="f") g_bCamposVacios=0			// && cTipoForm!="K"
		cTipoForm =  cTipoForm.toUpperCase()
		switch (cTipoForm) {
			case "A":
				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 || !EsNumero0(vValueForm) ) {
					bError = true;
					errorT= "Por favor, introduce el código postal correctamente."
				}
				break
			case "D":
				if (vValueForm == "") {
					dHoy = FechaHoy()
					if (bFormValido) eval ("oFormName."+sNameForm+".value=dHoy")
					vValueForm=dHoy
				}
				if (!EsFecha(vValueForm)) {
					bError = true;
					errorT= "Por favor, introduce una fecha válida en formato: dd/mm/aaaa\nFecha: "+vValueForm
				}
				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 una fecha válida en formato: dd/mm/aaaa\nFecha: "+vValueForm
				}
				break
			case "H":
				if (!EsHora(vValueForm)) {
					bError = true;
					errorT= "Por favor, introduce una hora válida en formato: HH:mm\nValor actual: "+vValueForm
				}
				break
			case "I":
				var nDia = vValueForm.substring(6,8)
				var nMes = vValueForm.substring(4,6)
				var nAno = vValueForm.substring(0,4)
				if (!ValidaFecha (nDia,nMes,nAno)) {
					bError = true;
					errorT= "Por favor, introduce una fecha válida en formato: aaaammdd\nFecha: "+vValueForm
				}
				break
			case "J":
				if (!EsNumero(vValueForm) || ((vValueForm/1000)!=Math.ceil(vValueForm/1000))) {
					bError = true;
					errorT= "Por favor, introduce un número multiplo de 1000"
				}
				else{
					if (bFormValido) eval("oFormName."+sNameForm+".value=parseFloat(vValueForm)")	//v2.00
				}
				break
			case "M":							// Euro
				var vValueC = Texto2Numero(vValueForm)
				if (!EsNumero0(vValueC)) {
					bError = true;
					errorT= "Por favor, el campo donde esta el cursor debe ser una cifra"
				}
				else{
					if (bFormValido) eval("oFormName."+sNameForm+".value=parseFloat(vValueC)")	//v2.00
				}
				break
			case "N":							// N
				if (!EsNumero0(vValueForm)) {
					bError = true;
					errorT= "Por favor, el campo donde esta el cursor debe ser un número positivo"
				}
				else{
					if (bFormValido) eval("oFormName."+sNameForm+".value=parseFloat(vValueForm)")	//v2.00
				}
				break
			case "O":
				if (!EsNumero(vValueForm)) {
					bError = true;
					errorT= "Por favor, introduce un número positivo distinto de cero"
				}
				else{
					if (bFormValido) eval("oFormName."+sNameForm+".value=parseFloat(vValueForm)")	//v2.00
				}
				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"
				}
				else{
					if (bFormValido) eval("oFormName."+sNameForm+".value=parseFloat(vValueForm)")	//v2.00
				}
				break
			case "R":
				if (!CheckRadios()) {
					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":
				var cLetra = vValueForm.substring(0,1)		//.toUpperCase()
				if (cLetra!="T"){
					if(!ValidarCIF(vValueForm) || (cLetra=="K" || cLetra=="L" || cLetra=="X") ){
						if(!ValidarNIF(vValueForm)  || (cLetra=="K" || cLetra=="L" || cLetra=="X")){
							if(!ValidarDNI(vValueForm)){
								bError = true;
								errorT= "Por favor, este campo debe ser un DNI, NIE, CIF correcto con la letra al principio [Axxxxxxx] o un NIF correcto con la letra al final [xxxxxxxY]"
							}
						}		
					}
				}
				break
			case "X":
				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
			case "Y":
				var nOpciones = eval ("oFormName."+sNameForm+".length")
				if (!nOpciones) {
					bError = true;
					errorT= "Por favor, debes seleccionar alguna opción."
				}
				else {
					SelectOptions(oFormName.name,sNameForm,1)
				}
				break
			case "Z":
				var nPosInput = BuscaEnArray (g_a_sSiValidarExt,sNameForm)
				if (nPosInput!=-1) {
					var sError=eval (g_a_sSiValidarExt[nPosInput+2])
					if (sError) {
						bError = true;
						errorT= sError
					}

				}
				break
			default:
		}
	}
	if (!bError) bError = LimiteTamano(sNameForm)
	if (!bError) bError = LimiteValor(sNameForm)
	g_sErrorValue = vValueForm
	g_ErrorTipo =	cTipoForm
	return bError;
}

function CheckRadios (){
var bChecked
	var nRadios = eval("oFormName."+sNameForm+".length")	// BUG NS, si hay 1 solo radio da un numero falso

	if (nRadios){
		for (i=0;i<nRadios;i++) {
			if (eval("oFormName."+sNameForm+"[i].checked")) bChecked=true
		}
	}
	else{
		if (eval("oFormName."+sNameForm+".checked")) bChecked=true				
	}
	return bChecked
}


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 (cTipoForm!="R" && eval("oFormName."+sNameForm+".type")!="hidden"){	//No puedo hacer FOCUS en los RADIOS,CHECKS,HIDDEN
		ColorForm(sNameForm,0)
		eval("oFormName."+sNameForm+".focus()")
	}

	g_sErrorFormName = oFormName
	g_sErrorInputName = sNameForm
	g_sErrorText= 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)
	if (barra2==-1) return false

	var nDia = dFecha.substring(0,barra1)
	var nMes = dFecha.substring(barra1+1,barra2)
	var nAno = dFecha.substring(barra2+1)
	return (ValidaFecha (nDia,nMes,nAno))
}



//wm_funciones.js
function ValidaFecha (nDD,nMM,nAAAA){		//1.7 0/1  Invalida/Valida
	if (!nDD || !nMM || !nAAAA) return false
	if (isNaN(nDD)|| isNaN(nMM)|| isNaN(nAAAA)) return false

	if (nAAAA < 100) nAAAA+=1900
	var dFecha=new Date(nAAAA,nMM-1,nDD)
	var bFechaVal=true;
	if (nDD!=dFecha.getDate()) bFechaVal=false;
	if (nMM!=(dFecha.getMonth()+1)) bFechaVal=false;
	if (nAAAA!=dFecha.getFullYear()) bFechaVal=false;
	return bFechaVal;
}


function EsHora(sHora){
var nPuntos1,nPuntos2,nHoras,nMinutos,nSegundos

	nPuntos1= sHora.indexOf(":")
	nPuntos2= sHora.indexOf(":",nPuntos1+1)
	if (nPuntos1==-1 || nPuntos1==sHora.length-1) return false

	nHoras = sHora.substring(0,nPuntos1)
	if (nPuntos2==-1){
		nMinutos = sHora.substring(nPuntos1+1)
		nSegundos=0
	}
	else{
		nMinutos = sHora.substring(nPuntos1+1,nPuntos2)
		nSegundos = sHora.substring(nPuntos2+1)
	}
	return (ValidaHora (nHoras,nMinutos,nSegundos))
}

function ValidaHora (nHoras,nMinutos,nSegundos){		//0/1  Invalida/Valida
	if (isNaN(nSegundos)) nSegundos=0
	if (isNaN(nHoras)|| isNaN(nMinutos)) return false

	if (nHoras>24 || nHoras<0) return false
	if (nMinutos>59 || nMinutos<0) return false
	if (nSegundos>59 || nSegundos<0) return false

	if (nHoras==24 && nMinutos>0) return false
	return true;
}




function EsNumero0 (vVariable){		// True  (0 / 23 / 12.5 / "23") Este si acepta el cero, pero no negativos
	if (isNaN(parseInt(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 (isNaN(parseInt(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 (isNaN(parseInt(vVariable))) return (false) 	//v2.00 Para espacios y vacios
    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 ValidarDNI(nDNI){				//DNI o NIE
var cLetra;
var bRetCode = false;

	nDNI=nDNI.replace(/\s/g,"");		//Quita espacios
	nDNI=nDNI.replace(/\./g,"");		//Quita puntos
	nDNI=nDNI.replace(/-/g,"");			//Quita guiones

	var nDNIfixed=nDNI;

	cLetra=nDNI.substring(0,1).toUpperCase();		//NIE
	if ((cLetra=="K" || cLetra=="L" || cLetra=="X")) {
		nDNI=nDNI.substring(1,nDNI.length)
		cLetra=nDNI.substring(nDNI.length-1,nDNI.length).toUpperCase();		//letra al final
		nLetra = cLetra.charCodeAt(0)
		if(nLetra>=65 || nLetra<=90) nDNI=nDNI.substring(0,nDNI.length-1)
	}

 	if(EsNumero(nDNI) && (nDNI>=1 && nDNI<=99999999)) {
//		nDNI = Texto2Numero(nDNI)
		bRetCode=true;
		if (BuscaEnArray (g_a_sAutoCorregir,sNameForm) !=-1) eval ("oFormName."+sNameForm+".value=nDNIfixed")
	}
	return bRetCode;
}


function ValidarNIF(sNIF){
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","C","K","E","F") 
var cLetra,nLetra;
var bRetCode = false;

	sNIF=sNIF.replace(/\s/g,"");		//Quita espacios
	sNIF=sNIF.replace(/\./g,"");		//Quita puntos
	sNIF=sNIF.replace(/-/g,"");			//Quita guiones

	cLetra=sNIF.substring(sNIF.length-1,sNIF.length).toUpperCase();		//letra al final
	nLetra = cLetra.charCodeAt(0)
	if(nLetra<65 || nLetra>90) {
		cLetra=sNIF.substring(0,1).toUpperCase();		//o al principio
		sNIF  = sNIF.substring(1,sNIF.length);			//sino falla Texto2Numero
	}
	nLetra = cLetra.charCodeAt(0)
	if(nLetra>=65 && nLetra<=90) {
		nNIF = Texto2Numero(sNIF)
 		if(cLetra==a_cOrden[(nNIF % 23)]) {
 			bRetCode=true;
			if (BuscaEnArray (g_a_sAutoCorregir,sNameForm) !=-1) eval ("oFormName."+sNameForm+".value=nNIF+cLetra")
		}
	}

	return bRetCode;
}


function ValidarCIF(sCIF){
var cLetra,nLetra;
var bRetCode = false;
var letrasInicialesCIF= "ABCDEFGHKLMPQSXZ";

	sCIF=sCIF.replace(/\s/g,"");		//Quita espacios
	sCIF=sCIF.replace(/\./g,"");		//Quita puntos
	sCIF=sCIF.replace(/-/g,"");			//Quita guiones

	if (sCIF.length==9){			
		cLetra=sCIF.substring(0,1).toUpperCase();		//letra al principio
		sIdentificacion = sCIF

		if (perteneceA(sIdentificacion.charAt(0),letrasInicialesCIF)){
			if ( valV10 (sIdentificacion.substr(1,sIdentificacion.length -2 ))){
				bRetCode = true;
				var Valor =  sIdentificacion.substr(1 , sIdentificacion.length - 2);                      
				var cerosAdicionales = 7 - Valor.length;
				for ( i=0 ; i < cerosAdicionales ; i++){
					Valor = "0" + Valor;
				}
	
				var DC = sIdentificacion.charAt(sIdentificacion.length-1);
				var sumaA = Number(Valor.charAt(1)) + Number(Valor.charAt(3)) + Number(Valor.charAt(5));
				var sumaB = 0;
				for (i = 0 ; i < 8 ; i = i + 2)	{
					aux1 = String(Number(Valor.charAt(i)) * 2);
					if (aux1.length > 1){
						aux2 = Number(aux1.charAt(0)) + Number(aux1.charAt(1));	
					}
					else{
						aux2 = Number(aux1);	
					}									
					sumaB = sumaB + aux2;
				}								
				var sumaC= String(sumaA + sumaB);
				
				var DCbis;
				DCbis = 10 - Number(sumaC.charAt(1));
				if (sumaC.length > 1){
					if (sumaC.charAt(1) == "0"){
						DCbis = 0;
					}
					else{
						DCbis = 10 - Number(sumaC.charAt(1));
					}
				}
				else{
					DCbis = 10 - Number(sumaC);
				}
	
				if (perteneceA(DC,mayusculas)){
					if (DCbis != (mayusculas.indexOf(DC)+1)) bRetCode = false
				}
				else if (perteneceA(DC,digitos)){
						if (DCbis != DC) bRetCode = false
				}
				else{
					bRetCode = false
				}
			}
		}
	}
	if (bRetCode && BuscaEnArray (g_a_sAutoCorregir,sNameForm) !=-1) eval ("oFormName."+sNameForm+".value=sCIF")
	return bRetCode;
}

var digitos = "0123456789";
var minusculas = "abcdefghijklmnopqrstuvwxyz";
var mayusculas = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

function perteneceA(c,s){
var result = false;  
    for (var i = 0; i < s.length; i++){
        if (c == s.charAt(i)){
            result = true;
            break;
        }
    }   
    return result;
}

function valV10(s){
var c;
var result = true;    
    for (var i = 0; i < s.length; i++){
        c = s.charAt(i);                            
        if (!(perteneceA(c,digitos))){
            result = false;
            break;
        }
    }
    return result;
}




function __ValidarCadena(sCadena,a_cValidos,bInvalidos){		// Comprueba que solo haya caracteres y numeros
	var sCadenaMay,f,bCaracter
	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;
}

//bInvalidos : 0/1	Por defecto el array es de caracteres validos/array de caracteres invalidos
function ValidarCadena(sCadena,a_cValidos,bInvalidos){		// 9.5 Comprueba que solo haya letras, numeros y los caracteres del array que le pasamos
var sCadenaMay,f,bCaracter
	sCadenaMay = sCadena.toUpperCase();
	nLenCadena = sCadena.length
	for (f = 0; f < nLenCadena ; f++){
		bCaracter = sCadenaMay.charAt(f);
		nCaracterPos =	BuscaEnArray (a_cValidos,bCaracter)
		if (bInvalidos) {
			if (nCaracterPos!=-1) return sCadena.charAt(f);
//			if (!((bCaracter >= "A" && bCaracter <= "Z") || (bCaracter >= "0" && bCaracter <= "9") || BuscaEnArray (a_cValidos,bCaracter)==-1 )) return sCadena.charAt(f);
		}
		else{
			if (!(nCaracterPos!=-1 || (bCaracter >= "A" && bCaracter <= "Z") || (bCaracter >= "0" && bCaracter <= "9"))) return sCadena.charAt(f);
		}
	}
	return 0;
}



function InitColor(oForm){
var formC=0,bValidar,sColor,sNameForm,cValidacion,cTipoForm,g_sColorForm
	if (!bNS && typeof(oForm)=="object") {				// ver que sea un form de verdad !!!
		while (formC<oForm.length) {
			bValidar=0
			sNameForm  = oForm[formC].name
			if (CheckInput (sNameForm)){
				cValidacion = sNameForm.substr(1,1)
				if (cValidacion=="_" || cValidacion=="x") bValidar=1	//Nombre Form correcto
				if (cValidacion=="y" || cValidacion=="z") bValidar=0	//Nombre Form correcto !!!
				if (bValidar && CheckColorForm(sNameForm)){		
					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 && CheckColorForm(sNameForm)) {
		ResetCampo()
		var cTipoFormU =  cTipoForm.toUpperCase()

		if (cTipoFormU!="R" && cTipoFormU!="K"){	//No puedo hacer FOCUS en los RADIOS,CHECKS
			var sColor = sColorError
			if (bFormOK) sColor = sColorOK
			if (!sColor) sColor= sColorForm 
			if (sColor) {
				g_sColorForm = "oFormName."+sNameForm+".style.backgroundColor = '"+sColor+"'"
				eval(g_sColorForm);
				if (!bFormOK) CicloColores(sNameForm,sColorForm,sColorError,20,40,0)
			}
		}
	}
}

function ResetCampo(){
	if (g_vTimeoutID) clearTimeout(g_vTimeoutID)	
	if (g_sColorForm){	//existe aun el form?
		var sNameForm = g_sColorForm.substring(g_sColorForm.indexOf("oFormName.")+10,g_sColorForm.indexOf(".style.backgroundColor"))
		if (CheckColorForm(sNameForm)) eval(g_sColorForm);
	}
}

function RellenarForms(oForm){				//oForm = document.forms.FormName
var sForm,bValor,vValor,f=0;
	while (f<a_sFormNames.length) {
		var oInput = eval("oForm."+a_sFormNames[f])
		if (oInput){	 //si existe ese Input
			cTipoForm= a_sFormNames[f].substr(0,1).toUpperCase()
			switch (cTipoForm) {
				case "F":							//Y ya lo hace el ASP
					RellenarInput(oInput,cTipoForm,a_vFormValues[f])
					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 "K":
//					eval("var bValor=oForm."+a_sFormNames[f]+".value")
					bValor=false
					vValor = a_vFormValues[f]					
					if (vValor && !(vValor=="0" || vValor=="False" || vValor=="Falso")) bValor=true
					sForm = "oForm."+a_sFormNames[f]+".checked="+bValor
					eval (sForm)
					break					
				case "M":
					var nMoneda = Numero2Texto(a_vFormValues[f],2,1,1)
//					var nMoneda = a_vFormValues[f]
					eval ("oForm."+a_sFormNames[f]+".value='"+ nMoneda +"'")
				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" || a_vFormValues[f]=="Falso")){
						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 RellenarInput(oInput,cTipo,vValor){
	switch (cTipo){
		case "F":
			oInput.value= vValor
			var a_vFechas = vValor.split("/");
			if (typeof(a_vFechas[2])=="undefined"){
				a_vFechas[0]=""
				a_vFechas[1]=""
				a_vFechas[2]=""
			}
			var sNombre = oInput.name.substring(2)
			var oForm = oInput.form
			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
		default:
			oInput.value = vValor

	}				
}


function AutoFill (oForm,bSoloObligatorios){
var f,g,cTipo,nTipoFind,sText=""
var nAutoFill = 2						// tipoValidacion,valor
var	a_AutoFill = new Array ("C",28004
							,"D",FechaHoy()
							,"E","info@evoluciona.com"
							,"G",FechaHoy()
							,"H",HoraHoy()
							,"I",FechaHoy(1)
							,"J",1000
							,"M","59,95"
							,"N",120
							,"O",123
							,"P","1"
							,"Q",-123
							,"T","913197144"
							,"U","2618976N"
							,"V","B81402059"
							)			


	if (!oForm) oForm=document.forms[0]

	for (f=0;f<oForm.length;f++) {
		if (!oFormName) oFormName= oForm
		sInputName  = oForm[f].name
 		if (CheckInput (sInputName)) {
			cTipo = CheckTipoForm (sInputName)
			if (!bSoloObligatorios) cTipo=cTipo.toUpperCase()
			if (oForm[f].value && cTipo!="K" && cTipo!="R") cTipo=""
			if (cTipo){
				switch (cTipo){
					case "A":
						oForm[f].value = sInputName		//.substr(2)
						break
					case "B":
						oForm[f].value = sInputName		//.substr(2)
						break
					case "F":
						RellenarInput(oForm[f],cTipo,FechaHoy())
					case "K":
						oForm[f].checked=1
						break					
					case "R":
						oForm[f].checked=1
						break					
					case "S":
						oForm[f].selectedIndex=1
					break
					case "W":
						for (g=0;g<oForm[f].options.length;g++){
							oForm[f].options[g].selected=1
						}
					break
					case "Y":
						var nOpciones = oForm[f].length
						if (!nOpciones)	InsertOption(oForm.name,sInputName,1,sInputName)

						for (g=0;g<oForm[f].options.length;g++){
							oForm[f].options[g].selected=1
						}
					break
					default:				
						nTipoFind = BuscaEnArray (a_AutoFill,cTipo)
						if (nTipoFind!=-1) oForm[f].value = a_AutoFill[nTipoFind+1]
				}
			}
		}
	}
}


// BUG: Para SELECT en NS quiza no funcione !!!
// BUG: tampoco funciona para SELECT MULTIPLE !!!
function SetInputValue(oInput,vValor){
	if (typeof(oInput)=="object"){
		oInput.value=vValor
	}
}

function GetInputValue(oInput){
var vValor=""
	if (typeof(oInput)=="object"){
		vValor = oInput.value
	}
	return (vValor)
}


// bVirtual : si recibe un sNameForm, admite Forms que no existen
function CheckInput (sNameInput,bVirtual){			// Para no validar Botones, Hidden, Disabled, NoInputs...
var oInput
var bFormValido=0
	// Añadido por Manuel:
	// He puesto la segunda condición para que no evalúe los inputs con nombres que contengan un corchete
 	if (sNameInput && sNameInput.indexOf("[")==-1){
		if (bVirtual) bFormValido=1		
		oInput = eval ("oFormName."+sNameInput)
 		if (typeof(oInput)=="object"){
			bFormValido=1
			if (oInput.disabled) bFormValido=0
			if (oInput.type=="hidden") bFormValido=0
			if (oInput.type=="button") bFormValido=0
		}
	}
	return (bFormValido)
}

function CheckColorForm(sNameForm){
var bColorFormOK=0

	if (CheckInput (sNameForm)){
		bColorFormOK=1
//		var oInput = eval("oFormName."+sNameForm)
//		if (eval("oFormName."+sNameForm+".disabled") || eval("oFormName."+sNameForm+".type")=="hidden") bColorFormOK=0

		var cTipoFormU =  sNameForm.substr(0,1).toUpperCase()
		if (cTipoFormU=="R" || cTipoFormU=="K") bColorFormOK=0
	}
	return bColorFormOK
}

function CheckTipoForm (sNameForm){
var cValidacion,cTipoForm
var bValidar=0
	cTipoForm= sNameForm.substr(0,1)							//Codigo Original
	cValidacion = sNameForm.substr(1,1)
	if (cValidacion=="_" || cValidacion=="x") bValidar=1		//Nombre Form correcto
//	if (bValidar && ((cTipoForm == cTipoForm.toLowerCase() && !vValueForm && cTipoForm!="f") || cTipoForm=="r")) bValidar=0
//	if (cTipoForm=="r" && CheckRadios()) g_bCamposVacios=0

	if (!bValidar) cTipoForm=""
	return (cTipoForm)
}



function DebugForm (oForm,sInputName){
var f;
var sText=""
	if (!oForm) oForm=document.forms[0]

	if (sInputName){
		oInput = eval ("oForm."+sInputName)
		sText = DebugInput (oInput) 	
	}
	else{
		for (f=0;f<oForm.length;f++) {
			sText += DebugInput (oForm[f]) + "\n"
		}
	}
	alert (sText)
}

function DebugInput (oFormInput){
var sInputType,f,sSelected
var sText = ""
var sSeparador= " / " 

	sText += oFormInput.name + sSeparador
	sText += (oFormInput.disabled ? "Disabled":"Enabled") + sSeparador	

	sInputType=oFormInput.type
	sText += " (" + sInputType + ")" + sSeparador
//alert (oFormInput.length)			// en NS da problemas
	if (sInputType=="select-one" || sInputType=="select-multiple") {
		for (f=0;f<oFormInput.length;f++){
			sSelected = ""
			if (oFormInput.options[f].selected) sSelected = " SELECTED" 
			
			sText += "\n\t" + f + ". " + oFormInput.options[f].text + " "
			sText += "[" + oFormInput.options[f].value + "]" + sSelected
		}
	}
	else{
		sText += " [" + oFormInput.value + "]"
	}

	return (sText)
}

// SELECT MULTIPLE


//Añade las opciones seleccionadas en sSelect1 y las copia o mueve a sSelect2
//sForm: Nombre del formulario
//bCut : 0-copia , 1-mueve
//bAll : copia o mueve todas las opciones
function AddSelected(sForm,sSelect1,sSelect2,bCut,bAll){
	var oForm   =eval("document.forms."+sForm);
	var oSelect1=eval("oForm."+sSelect1);
	var oSelect2=eval("oForm."+sSelect2);

	var nSelC=0;
	while(nSelC<oSelect1.length){
		if(bAll || oSelect1[nSelC].selected){
			if(SearchPosInArray(oSelect2,oSelect1[nSelC].value,"value")==-1){
				oSelect2.options[oSelect2.length]=new Option(oSelect1[nSelC].text, oSelect1[nSelC].value);
				if(bCut) oSelect1[nSelC]=null;
				else nSelC++;
			}
			else nSelC++;
		}
		else nSelC++;
	}
}

//Borra las opciones seleccionadas en sCombo
//sForm: Nombre del formulario
//bAll : Borra todas las opciones
function DelSelected(sForm,sCombo,bAll){
	var oForm  =eval("document.forms."+sForm);
	var oSelect=eval("oForm."+sCombo);

	var nSelC=0;
	while(nSelC<oSelect.length){
		if(bAll || oSelect[nSelC].selected) oSelect[nSelC]=null;
		else nSelC++;
	}
}

//Selecciona opciones de un SELECT multiple
//sForm  : Nombre del formulario
//sSelect: Nombre del SELECT
//[a_sValues],[a_sNames] si no se le pasa selecciona todos
function SelectOptions(sForm,sSelect,bSelected,a_vValues,a_sNames){
var bValues,bNames,nSelC,nOpcionText,nOpcionValue
var a_vArray = new Array()

	var oForm  =eval("document.forms."+sForm);
	var oSelect=eval("oForm."+sSelect);

	if (a_sNames) {
		bNames=1
		a_vArray = a_sNames
	}
	if (a_vValues) {
		bValues=1
		a_vArray = a_vValues
	}

	if (a_vArray.length==0){			//Todos
		nSelC=0
		while(nSelC<oSelect.length){
			oSelect.options[nSelC].selected=bSelected
			nSelC++;
		}	
	}
	else{								//solo los del array
		for(var n=0;n<a_vArray.length;n++){
			nSelC=0
			nOpcionText=-1
			nOpcionValue=-1
			while(nSelC<oSelect.length){
				if (bNames && oSelect.options[nSelC].text== a_sNames[n]) nOpcionText=nSelC
				if (bValues && oSelect.options[nSelC].value== a_vValues[n]) nOpcionValue=nSelC
				nSelC++;
			}
			nOpcion=-1

			if (!bNames && nOpcionValue!=-1) nOpcion=nOpcionValue
			if (!bValues && nOpcionText!=-1) nOpcion=nOpcionText
			if ((bNames && bValues) && (nOpcionValue==nOpcionText) && nOpcionValue!=-1) nOpcion=nOpcionText
	
			if (nOpcion!=-1){
				oSelect.options[nOpcion].selected=bSelected
			}
		}
	}
}

function AddSelectedArray(sForm,sSelect1,sSelect2,a_vValues,a_sNames,bCut){
	SelectOptions(sForm,sSelect1,1,a_vValues,a_sNames);
	AddSelected(sForm,sSelect1,sSelect2,bCut);
}

//Inserta un valor y un texto en una opcion de un select
//sForm  : Nombre del formulario
//sSelect: Nombre del SELECT
//vValue : Valor del OPTION
//sText  : Texto del OPTION
function InsertOption(sForm,sSelect,sValue,sText){
	var oForm  =eval("document.forms."+sForm);
	var oSelect=eval("oForm."+sSelect);

	oSelect.options[oSelect.length]=new Option(sText, sValue);
}

//Inserta en un SELECT todos los valores de un array
//a_vArray: 
//a_sArray: 
//sForm   : Nombre del formulario
//sSelect : Nombre del SELECT
function Array2Select(a_vArray,a_sArray,sForm,sSelect){
	for(var n=0;n<a_vArray.length;n++){
		var vValue=a_vArray[n];
		var sText =a_vArray[n];
		if(a_sArray) sText =a_sArray[n];
		InsertOption(sForm,sSelect,vValue,sText);
	}
}


// Arrays con INPUTS, que hay que rellenar 1 al menos, o rellenar todos si rellenas alguno
// [bAlguno] Alguno relleno en vez de todos (Todos por defecto)
function GrupoInputs (oForm,a_vArray,bValidar,bAlguno){		//IsOneOfUs
var sAccion
	if(!IsArray(a_vArray)) a_vArray=[a_vArray];
	var bRelleno=0;
	var bIsInside =0;
	var n=0;
	while (!bRelleno && n<a_vArray.length){				//Relleno
		if(eval("oForm."+a_vArray[n]+".value")) bRelleno=1;
		n++;
	}
	var a_sValidar = g_a_sNoValidar
	if (bValidar) a_sValidar=g_a_sSiValidar
	if (SearchPosInArray(a_sValidar,a_vArray[0],"")!=-1) bIsInside=1;

	if (bAlguno){
		if (bRelleno == bIsInside){
			if(bRelleno && bIsInside) sAccion = "Del"
			else sAccion = "Add"
		}
	}
	else {
		if (bRelleno!=bIsInside){
			if (bRelleno ^ bValidar) sAccion = "Del"
			else sAccion = "Add"
		}
	}

	if (sAccion){
		if (sAccion == "Add") {
			a_sValidar = a_sValidar.concat(a_vArray);
		}
		else{
			for(var n=0;n<a_vArray.length;n++){
				a_sValidar=DelElement(a_sValidar,a_vArray[n],"");
			}		
		}		
		if (bValidar) g_a_sSiValidar = a_sValidar
		else g_a_sNoValidar = a_sValidar
	}
//alert ("Relleno:"+bRelleno+"\nInside:"+bIsInside+"\nValidar:"+bValidar+"\nAlguno:"+bAlguno+"\nAccion:"+sAccion)
//alert (a_sValidar+"\n"+g_a_sSiValidar+"\n"+g_a_sNoValidar)
	return (bRelleno);
}



function FechaHoy(nTipoFecha){			// 0.d/m/a 1.amd
	var dFecha = new Date();				
	var nDia = dFecha.getDate()
	var nMes = dFecha.getMonth() + 1
	var nAno = dFecha.getFullYear()
	var dHoy = nDia + "/" + nMes + "/" + nAno
	if (nTipoFecha==1){
		sDia = "0"+  nDia.toString()
		sMes = "0"+  nMes.toString()
		dHoy = nAno.toString() + sMes.substr(sMes.length-2) +  sDia.substr(sDia.length-2)
	}
	return dHoy
}

function HoraHoy(){
	var dFecha = new Date();				
   	var nHora = dFecha.getHours();
   	var nMins = "0" + dFecha.getMinutes()
	
	return (nHora + ":" + nMins.substr(nMins.length-2))	
}	


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,sFuncion,sColor = "#"

	if (CheckColorForm(sNameForm)){		//mirar si existe el form, porque a veces lo borramos en tiempo real
		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
			}
			sFuncion="CicloColores('"+sNameForm+"','"+sColorS+"','"+sColorD+"',"+nPasos+","+nTime+","+nPasosC+")"
		}
		else {
			sColor=sColorD
			nPasosC=0
			sFuncion="CicloColores('"+sNameForm+"','"+sColorD+"','"+sColorS+"',"+nPasos+","+nTime+","+nPasosC+")"
		}
		g_vTimeoutID=setTimeout (sFuncion,nTime)	
		eval("oFormName."+sNameForm+".style.backgroundColor = sColor");
	}
}





function BuscaEnArray (a_vArray,vValor){			//3.1 Busca la posicion en el array del ultimo valor que se le pasa (Devuelve -1 si no encuentra ninguna)
	var nLen = a_vArray.length
	var nPos=-1
	while (nPos<--nLen){ 
		if (a_vArray[nLen]==vValor) nPos=nLen
	}
	return nPos
}



function IsArray(a_vArray){
	var bArray=0;
	if(a_vArray!=null && typeof(a_vArray)=="object" && a_vArray.length!="undefined") bArray=1;
	return (bArray);
}

function SearchPosInArray(a_vArray,vValue,sProp){	//Busca la posición en el array del último valor que se le pasa
	var nLen=a_vArray.length;
	var nPos=-1;
	while(nPos<--nLen){
		if(sProp){
			if(eval("a_vArray[nLen]."+sProp)==vValue) nPos=nLen;
		}
		else if (a_vArray[nLen]==vValue) nPos=nLen;
	}
	return (nPos);
}

function DelElement(a_vArray,vValue,sProp){
	var nPos=SearchPosInArray(a_vArray,vValue,sProp);
	if(nPos!=-1) a_vArray=DelOfArray(a_vArray,nPos,1);
	return (a_vArray);
}

function DelOfArray(a_vArray,nPos,nElements){	//a_vArray = RemoveDeArray (a_vArray,2,0)
	if(!nElements) nElements=a_vArray.length-nPos;
	var a_vItem1=a_vArray.slice(0, nPos);
	var a_vItem2=a_vArray.slice(nPos+nElements);
	return (a_vItem1.concat(a_vItem2)); 		//Devuelve el array original sin los nElements 
}



function Texto2NumeroLib(sNumero){		// 	Genera un Numero a partir de un String - Transforma de 1.000,5 a 1000.5 
	sNumero = "" + sNumero; // Casting a cadena
										
	reg = /[\x2e\x25\s]/g	
	importe_sin_puntos  = sNumero.replace(reg,"");			
	importe_coma2punto = importe_sin_puntos.replace(",","\x2e")    
	importe_retorno = 1 * importe_coma2punto; // Casting a numero
//	if (isNaN(importe_retorno)) importe_retorno=0
	return(importe_retorno);				
}

function Texto2Numero(sNumero){		// 	Genera un Numero a partir de un String - Transforma de 1.000,5 a 1000.5 
var nPuntoPos1,nComaPos1,nPuntoPos2,nComaPos2,regExp,nNumero
var regCantidades=/[^0-9 .,-]/gi

	sNumero = "" + sNumero
	sNumero = sNumero.replace(regCantidades,"")		//quito puntos	
	if (sNumero=="") sNumero="0"

	nPuntoPos2 = sNumero.lastIndexOf(".")
	nComaPos2 = sNumero.lastIndexOf(",")

	if (nComaPos2>nPuntoPos2){		//'Decimales con ,
		nComaPos1 = sNumero.indexOf(",")
		regExp = /[\x2e]/g			// \x25\s
		sNumero = sNumero.replace(regExp,"")		//quito puntos	
		if (nComaPos1==nComaPos2){
			regExp = /[\x2c]/g
			sNumero = sNumero.replace(regExp,"\x2e")  		//cambio comas por puntos  
		}
		else{
			regExp = /[\x2c]/g
			sNumero = sNumero.replace(regExp,"")		//quito comas		
		}
	}
	else{							// Decimales con .
		nPuntoPos1 = sNumero.indexOf(".")
		regExp = /[\x2c]/g
		sNumero = sNumero.replace(regExp,"")		//quito comas		
		if (nPuntoPos1!=nPuntoPos2){
			regExp = /[\x2e]/g
			sNumero = sNumero.replace(regExp,"")		//quito puntos
		}
	}

	nPuntoPos2 = sNumero.lastIndexOf(".")	//Excepcion para numeros del tipo 1.000
	if (nPuntoPos2==sNumero.length-4 && sNumero.length<=7){
		regExp = /[\x2e]/g
		sNumero = sNumero.replace(regExp,"")		//quito puntos	
	}
	nNumero= parseFloat(sNumero)
	return nNumero
}


// Devuelve el numero con la puntuación y el numero de decimales que se le diga.
function Numero2Texto(nNum,nNumDec,nFormato,bForzarDecs){			//1.05	nFormato: 1/2 (Español/Ingles)
var a_sPuntEnt = new Array (0,".",",");
var a_sPuntDec = new Array (0,",",".");
var sSigno="";

	nNum = Texto2Numero(nNum)			//Verifica el numero
	if (nFormato==null) nFormato=1
	if (nNum<0){
		sSigno="-";
		nNum= Math.abs(nNum);
	}

	if (nNumDec) {				// Con decimales los redondea
		nNum = Math.round(nNum * Math.pow(10,nNumDec))
		nNum = nNum/Math.pow(10,nNumDec)
		sNumeroEntero = Math.floor(nNum).toString()
	}
	else{ 						// Sin decimales
		sNumeroEntero = Math.round(nNum).toString()
	}
	sNumero=nNum.toString()

	nInicioDec = sNumeroEntero.length+1
	sDecimales = sNumero.substring(nInicioDec,nInicioDec+nNumDec)
	if (bForzarDecs) for (i=sDecimales.length;i<nNumDec;i++) sDecimales += "0";

	sEntero=""
	while (sNumeroEntero>=1000){
		sEntero = a_sPuntEnt[nFormato] + sNumeroEntero.substring(sNumeroEntero.length-3,sNumeroEntero.length) + sEntero ;
		sNumeroEntero = sNumeroEntero.substring(0,sNumeroEntero.length-3) ;
	}
	sEntero = sNumeroEntero + sEntero;
	if (sDecimales.length) sNumeroEntero= sSigno + sEntero + a_sPuntDec[nFormato] + sDecimales;
	else sNumeroEntero= sSigno + sEntero;
	return sNumeroEntero;
}

function TestFuncionZ(vValor){			//Prueba de funcion para Tipo Z
var sError=""
	if (vValor=="EVIL") {
		sError="ERROR: Te he dicho que este campo no admite el valor: EVIL"
	}
	else{
		alert("Value="+vValor+ " (nunca uses el valor EVIL)")
	}
	return sError
} 
