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 cambia_manifiesto( ){

manifiestos_fotos  = ['<IMG src="pix/ana-gargallo.jpg" />', '<IMG src="pix/ma-pilar.jpg" />','<IMG src="pix/sergio-duche.jpg" />','<IMG src="pix/asuncion-capapey.jpg" />','<IMG src="pix/pilar-mateo.jpg" />'];
manifiestos_textos = ['<P class="testimonio_persona">Ana Gargallo</P><P class="cuerpo_lateral">"El mantenimiento de la central es fundamental para que siga habiendo vida en el pueblo, para que sigan abiertas las tiendas, el bar... Quizás mi hijo no pueda venir a la escuela porque no hay gente joven suficiente para que  siga abierta. Quizás de esto dependa que me tenga que ir de aquí y trasladar mi residencia a otro sitio."</P>',
					 '<P class="testimonio_persona">Mª Pilar Gil</P><P class="cuerpo_lateral">"Estoy convencida de con que nos vengamos a vivir aquí los viejitos no solucionamos mucho. Necesitamos gente joven. Y gracias a esta empresa el pueblo se está rejuveneciendo y hay más niños en la escuela   Eso es lo que realmente da vida a los pueblos de este entorno."</P>'
					 ,'<P class="testimonio_persona">Sergio Uche</P><P class="cuerpo_lateral">"El cierre no se va a dar, vamos a  luchar hasta el final, hay miles de acciones que se pueden hacer hasta que consigamos que esto funcione con todos los permisos y en regla. Es importantísimo, son 11 puestos y podrían ser muchos más. Es como si cerraran la GM en Zaragoza, tendría el mismo impacto social. Quizá no han entendido bien el proyecto los directivos de Medio Ambiente. Habrá que explicarlo bien, y tendremos que  buscar soluciones y llegar a un consenso, estoy seguro de que esto se va a solucionar."</P>'
					 ,'<P class="testimonio_persona">Asunción Capapey Lozano</P><P class="cuerpo_lateral">"Ahora que nos han abierto una tienda se puede cerrar la planta. El pueblo tiene que ir para arriba, no para abajo. Que bastantes viejos estamos ya, si se van los jóvenes, ¿qué  hacemos? No hacemos nada."</P>'
					 ,'<P class="testimonio_persona">Pilar Mateo</P><P class="cuerpo_lateral">"Desearíamos que los matrimonios jóvenes y algunos más que se pueden incorporar se quedaran en el pueblo, ese es el motivo principal para quedarse aquí. Y por otra parte es la única empresa que ha optado por esto y no la podemos defraudar, ha gastado muchísimo dinero y creo que todo eso no se pude quedar en saco roto."</P>'];

	document.getElementById('div_foto').innerHTML = manifiestos_fotos[indice];
	document.getElementById('div_manifiesto').innerHTML = manifiestos_textos[indice];
	indice++ ;
	if (indice == manifiestos_fotos.length)
	indice = 0;
	setTimeout("cambia_manifiesto()", 30000);
}

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
} 
