/*
© 2003 Openfinance - www.openfinance.es - alejandroi@openfinance.es
validacion_formularios.js v1.0

v2.45: g_bAutofixM		Texto2Numero()	
v2.46: NS 4/7 compatible	L_	Calendario	ValidarCC()		RellenarForms()	RellenarInputTipo()		CheckTipoForm()
v2.47: EsMoneda			C_ con expresiones regulares


USO:

<SCRIPT language="JavaScript" src="libs/validacion_formularios.js"></SCRIPT>


function Init() {
	InitForm()
}


function ComprobarForm(){
	var oForm = document.forms.Fdatos
	if (ValidarForm(oForm)) oForm.submit();
}
*/



// ********************** [HTML] ************************
g_sTecladoFuncion = "ComprobarForm"	// funcion que ejecuta al pulsar RETURN (dejarla vacia)
g_bSelectSubmit = 0					// 0/1 no/si ejecutar g_sTecladoFuncion al pulsar RETURN en un SELECT
g_bControlKeys  = 1					// 0/1 no/si ejecutar funciones complementarias
g_bAutoFocus = 1					// 0/1 no/si ejecutar autofocus en InitForm()
g_bAutofixM = 1						// 0/1 Autofix numeros tipo M (cambia el VALUE a formato numero)

// * Si se usan los colores o arrays, hay que ponerlos en el HTML (y ponerlos despues de cargar la libreria)
sColorForm 	= "#F4F4F4"		//poner TODOS "...=0" si no se quiere cambiar colores del form
sColorOK 	= "#839AA5"
sColorActivo= "#C4C4C4"
sColorError	= "#E6AE3F"
sColorObligatorio	= "#E6AE3F"


// * 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,16,"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")
// ***************************************************

var g_oOnErrorEvent=window.onerror;
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
var g_oInputError

if (bIE) document.onkeyup = TeclaPulsada;
else document.onkeypress = TeclaPulsada;

function InitForm(oForm,nFormSize,bInitColor){
	if (!oForm) oForm=document.forms[0]
	if (!oForm) return
	oFormName =oForm
	if (g_bAutoFocus) AutoFocus(oForm)
	if (nFormSize) FormResize(oForm,nFormSize)	//Hace los forms de IE un % mas grandes, para que se parezcan a los de NS
	InitCheckmarks(oForm)						//No vale para nada !!!
	if (typeof(a_sFormNames)!="undefined" && a_vFormValues.length) RellenarForms(oForm)
	if (bInitColor) InitColor(oForm)
	AutoInitInput()
}


function InitFormValidar(oForm,nFormSize,bInitColor){			//Deprecated (solo por compatibilidad)
	InitForm(oForm,nFormSize,bInitColor)
}

function InitValidarForm(oForm,nFormSize){						//Deprecated (solo por compatibilidad)
	InitForm(oForm,nFormSize,1)
}

function ValidarForm (oForm) {
var oInput, sInputType

	if (typeof(oForm)!="object"){
		ErroresForm("No existe un FORM con el nombre pasado a 'ValidarForm()'")		
		return
	}		

	if (oFormName!=oForm) g_sColorForm=""		//Fix: varios FORMS
	ResetCampo()
	InitColor(oForm)
	g_bCamposVacios=1
	var bError = false;
	var formC=0
	bFormOK= true;
	oFormName =oForm
	g_oInputError = ""

	while (!bError && formC<oForm.length) {
		oInput = oForm[formC]
		sInputType = oInput.type

		if (sInputType=="select-one"){				//SELECT
			nSelected=oInput.selectedIndex
			vValueForm=oInput[nSelected].value
		}
		else{
			vValueForm = oInput.value
		}
		bError=ValidaCampo (oInput,vValueForm)
		formC++
	}
	if (bError) {
		if (g_oInputError) oInput=g_oInputError
		CampoError(oInput)
	}
	else {
		ValidarCheckmarks(oForm)
	}
	return bFormOK
}


function ValidarCampo (oInput) {
	ResetCampo()
	oFormName= oInput.form
	vValueForm = oInput.value
	bError=ValidaCampo (oInput,vValueForm)
	if (bError) CampoError(oInput)
}

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 cTipo,bValor,vValor
	var formC=0
	while (formC<oForm.length) {
		if (CheckInputName(oForm[formC])){
			sNameForm  = oForm[formC].name
			cTipo = sNameForm.substr(0,1)
			if (cTipo=="K" || (cTipo=="k" && oForm[formC].checked)){
				bValor=0
				if (oForm[formC].checked) {
					bValor = 1
					vValor = oForm[formC].value
					if (vValor && !(vValor=="0" || vValor=="False" || vValor=="Falso" || vValor=="on")) bValor = vValor
				}
				oForm[formC].checked = true
				oForm[formC].value = bValor
			}
		}
		formC++
	}
}

function InitCheckmarks(oForm){		//como al ir hacia atras los valores son falsos, esto no vale para nada !!!
var sNameForm,cTipo,bChecked
	var formC=0
	oFormName =oForm
	while (formC<oForm.length) {
		if (CheckInputName(oForm[formC])){
			sNameForm  = oForm[formC].name
			cTipo = sNameForm.substr(0,1)
			if (cTipo=="K"){
				bChecked = false
				if (oForm[formC].checked && oForm[formC].value==1) bChecked = true
//					oForm[formC].checked=bChecked
			}
		}
		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(oInput,vValueForm){
var bError=0
	if (CheckInputName(oInput,0,1)){
		var sNameForm = oInput.name
		bError=(ValidaValor (sNameForm,vValueForm,oInput))
		if (!bError &&  (cValidacion=="_" || cValidacion=="x")) {
			ColorForm (sNameForm,1)
		}
	}
	return bError
}

function ValidaValor (sNameFormT,vValueForm,oInput){		//NO tienen porque existir los valores que le pasamos (ni Form ni Value)
var oInput
	var bError = false;
	var bValidar=0
	var bFormValido = 0				// Existe el Input?
	sNameForm = sNameFormT

	if (oInput){
		sNameForm = oInput.name
		bFormValido = CheckInput (oInput,0,1)
	}
	else {
		if (! CheckInput (sNameForm,1,1)) return(bError)		//Si validamos los HIDDEN
	}

	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=="l") bValidar=1
	if (cTipoForm=="r" && CheckRadios(oInput)) 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;
					g_sErrorText= "Por favor, rellena este campo."
				}
				break
			case "B":
				if (vValueForm == "") {
					bError = true;
					g_sErrorText= "Por favor, rellena este campo."
				}
				cInvalido = ValidarCadena (vValueForm,a_cValidos_B)
				if (cInvalido) {
					bError = true;
					g_sErrorText= "Por favor, este campo no admite el caracter: "+cInvalido
				}
				break
			case "C":
				var regCP = /^\d{5}$/   //-->el cp 02123 se come el 0
				if ( !regCP.test(vValueForm) ) {
				
					bError = true;
					g_sErrorText= "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;
					g_sErrorText= "Por favor, introduce una fecha válida en formato: dd/mm/aaaa\nFecha: "+vValueForm
				}
				break
			case "E":
				sError=EsEmail(vValueForm)
				if (sError) {
					bError = true;
					g_sErrorText= "Por favor, escribe una dirección de correo electrónica válida."+sError
				}
				break
			case "F":
				sError = ValidarFecha()
				if (sError) {
					bError = true;
					g_sErrorText= sError
				}
				break
			case "G":
				if (!EsFecha(vValueForm)) {
					bError = true;
					g_sErrorText= "Por favor, introduce una fecha válida en formato: dd/mm/aaaa\nFecha: "+vValueForm
				}
				break
			case "H":
				if (!EsHora(vValueForm)) {
					bError = true;
					g_sErrorText= "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;
					g_sErrorText= "Por favor, introduce una fecha válida en formato: aaaammdd\nFecha: "+vValueForm
				}
				break
			case "J":
				var bBarra1 = vValueForm.substring(4,5)
				var bBarra2 = vValueForm.substring(7,8)
				var nDia = vValueForm.substring(8,10)
				var nMes = vValueForm.substring(5,7)
				var nAno = vValueForm.substring(0,4)
				if (bBarra1!="/" && bBarra2!="/" && !ValidaFecha (nDia,nMes,nAno)) {
					bError = true;
					g_sErrorText= "Por favor, introduce una fecha válida en formato: aaaa/mm/dd\nFecha: "+vValueForm
				}
				break
			case "_J":
				if (!EsNumero(vValueForm) || ((vValueForm/1000)!=Math.ceil(vValueForm/1000))) {
					bError = true;
					g_sErrorText= "Por favor, introduce un número multiplo de 1000"
				}
				else{
					if (bFormValido) eval("oFormName."+sNameForm+".value=parseFloat(vValueForm)")	//v2.00
				}
				break
			case "L":
				if(!ValidarCC(sNameForm,vValueForm)){
					bError = true;
//					g_sErrorText= "Por favor, el Dígito de Control es incorrecto. Compruebe el número de cuenta"
				}
				break
			case "M":							// Euro
				var vValueC = Texto2Numero(vValueForm,(~g_bAutofixM) & 1)
				if (!EsMoneda0(vValueC)) {
					bError = true;
					g_sErrorText= "Por favor, el campo donde esta el cursor debe ser una cifra"
				}
				else{
					if (bFormValido && g_bAutofixM) eval("oFormName."+sNameForm+".value=parseFloat(vValueC)")	//v2.00
				}
				break
			case "N":							// N
				if (!EsNumero0(vValueForm)) {
					bError = true;
					g_sErrorText= "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;
					g_sErrorText= "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;
					g_sErrorText= "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;
						g_sErrorText= "Por favor, las contraseñas no coinciden"
					}
				}
				break
			case "Q":
				if (!EsNumeroNegativo(vValueForm)) {
					bError = true;
					g_sErrorText= "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(oInput)) {
					bError = true;
					g_sErrorText= "Por favor, marque alguno de los botones de selección"
				}
				break
			case "S":
				if (vValueForm == "") {
					bError = true;
					g_sErrorText= "Por favor, selecciona una opción."
				}
				break
			case "T":
				if (vValueForm<"600000000" || vValueForm>999999999 || vValueForm.length!=9) {
					bError = true;
					g_sErrorText= "Por favor, corrige tu número de teléfono."
				}
				break
			case "U":
				if(!ValidarNIF(vValueForm)){
					bError = true;
					g_sErrorText= "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;
								g_sErrorText= "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 "W":
				if (vValueForm == "") {
					bError = true;
					g_sErrorText= "Por favor, selecciona al menos una opción."
				}
				break
			case "X":
				if (typeof(ValidaNumeroTarjeta)=="undefined") alert("ERROR: Necesitas cargar la libreria 'wm_form_tarjetas.js'")
				else{
					if(!ValidaNumeroTarjeta(0,vValueForm)){
						bError = true;
						g_sErrorText= "Por favor, el numero de tarjeta de credito no es valido"
					}
				}
				break
			case "Y":
				var nOpciones = eval ("oFormName."+sNameForm+".length")
				if (!nOpciones) {
					bError = true;
					g_sErrorText= "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;
						g_sErrorText= sError
					}
				}
				break
			default:
		}
		if (!bError && oInput && oInput.type=="textarea" && oInput.maxlength!= "undefined"){
			 bError = TextareaLen(oInput)				//limite de texto de TextArea
		}
	}
	if (!bError) bError = LimiteTamano(sNameForm)
	if (!bError) bError = LimiteValor(sNameForm)
	g_sErrorValue = vValueForm
	g_ErrorTipo =	cTipoForm
	return bError;
}

function CheckRadios (oInput){
var bChecked
	if (typeof(oInput)=="object"){
		oInput = eval ("oInput.form."+oInput.name)		// otra forma de ver cuantos radios tiene? !!"
		var nRadios = oInput.length		// BUG NS, si hay 1 solo radio da un numero falso
		if (nRadios){
			for (i=0;i<nRadios;i++) {
				if (oInput[i].checked) bChecked=true
			}
		}
		else{
			if (oInput.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;
				g_sErrorText= "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;
				g_sErrorText= "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;
				g_sErrorText= "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;
				g_sErrorText= "Por favor, este campo no puede ser mayor de "+t_nValorMax
			}
		}
	}
	return bError
}

function CampoError(oInput){
var nInputLen
	var	sNameForm = oInput.name

	bFormOK=false
	nPosicion = BuscaEnArray (a_sError,sNameForm)
	if (nPosicion!=-1) g_sErrorText=a_sError[nPosicion+1]

	ColorForm(sNameForm,0)
	nInputLen = oInput.length
	if (oInput[0]){
//		alert(oInput.name+"_"+oInput.length)
		if (bIE) oInput[0].focus()
	}
	else {
		oInput.focus()
	}

	g_sErrorFormName = oInput.form
	g_sErrorInputName = sNameForm

	alert (g_sErrorText)
}


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
		g_oInputError = eval ("oFormName."+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,nHora,nMins,nSecs){		//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			//Chapucilla
	if (!nHora) nHora=0;
	if (!nMins) nMins=0;
	if (!nSecs) nSecs=0;
	var dFecha=new Date(nAAAA,nMM-1,nDD,nHora,nMins,nSecs)
	if (nHora!=dFecha.getHours()) return false
	if (nMins!=dFecha.getMinutes()) return false
	if (nSecs!=dFecha.getSeconds()) return false
	if (nDD!=dFecha.getDate()) return false
	if (nMM!=(dFecha.getMonth()+1)) return false
	if (nAAAA!=dFecha.getFullYear()) return false
	return true;
}


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)
}


// Comprueba si una cadena representa una moneda
/**
  *  Formatos válidos
  *  - Español para moneda (separador de miles el punto (.) y de decimales la coma (,)
  *  - USA ( sin separadores de miles, y con separador decimal el punto )
  *  - Enteros (con y sin separador de miles) positivos (ni cero ni negativos)
  *
  *  Nota: los formatos decimales, sólo con dos dígitos en la parte decimal
  */
function EsMoneda(sNumero){
var regNumero = /^[1-9]{1,3}(?:\.\d{3})*(?:,\d{1,2})?$|^[1-9]+(\.\d{1,2})?$/;
return regNumero.test( sNumero );
}

// Comprueba si una cadena representa una moneda
/**
  *  Formatos válidos
  *  - Español para moneda (separador de miles el punto (.) y de decimales la coma (,)
  *  - USA ( sin separadores de miles, y con separador decimal el punto )
  *  - Enteros (con y sin separador de miles) positivos (cero ni negativos)
  *
  *  Nota: los formatos decimales, sólo con dos dígitos en la parte decimal
  */
function EsMoneda0(sNumero){
var regNumero = /^\d{1,3}(?:\.\d{3})*(?:,\d{1,2})?$|^\d+(\.\d{1,2})?$/;
return regNumero.test( sNumero );
}

// Comprueba si una cadena representa un saldo
/**
  *  Formatos válidos
  *  - Español para moneda (separador de miles el punto (.) y de decimales la coma (,)
  *  - USA ( sin separadores de miles, y con separador decimal el punto )
  *  - Enteros (con y sin separador de miles) positivos, cero y negativos.
  *
  *  Nota: los formatos decimales, sólo con dos dígitos en la parte decimal
  */
function EsSaldo(sNumero){
var regNumero = /^-?\d{1,3}(?:\.\d{3})*(?:,\d{1,2})?$|^-?\d+(\.\d{1,2})?$/;
return regNumero.test( sNumero );
}


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 ValidarCC(sInputName,sCuenta) {
var nRegs,sName,bValidar,sNameDatoCC,f,nPos,oInput,vValue
var sCuentaDatos=""
var szBank, szSuc, szAccount, szDigit ; 
a_vDatosCC = new Array ("Entidad","Ez",4
			,"Sucursal","Sz",4
			,"Dígito de Control","Dz",2
			,"Número de Cuenta","Cz",10);
nDatosCC= 3
var regDigitos=/[^0-9]/gi

	nRegs = a_vDatosCC.length / nDatosCC
	sName = sInputName.substr(2); 
	if (sInputName.substr(0,1)=="L") bValidar=1

	for (f=0;f<nRegs;f++){
		nPos = f*nDatosCC
		sNameDatoCC = a_vDatosCC[nPos+1] + sName
		if ( eval("typeof(oForm."+sNameDatoCC+")")=="object") {
			oInput = eval("oForm."+sNameDatoCC)
			vValue = oInput.value
			if (vValue!="" || bValidar){ 
				bValidar=1
				vValue = vValue.replace(regDigitos,"")
				if (vValue.length!=a_vDatosCC[nPos+2]){
					g_oInputError = oInput
					g_sErrorText= "El valor "+a_vDatosCC[nPos]+" debe tener "+a_vDatosCC[nPos+2]+" caracteres numéricos"
					return false;				
				}
			}
			sCuentaDatos += vValue
		}
	}

	if (oInput) {
		sCuenta = sCuentaDatos		
		oInput = eval("oForm."+a_vDatosCC[1] + sName)
		if ( eval("typeof(oForm."+sInputName+")")=="object") eval("oForm."+sInputName+".value=sCuentaDatos")
	}
	if (!bValidar && sCuenta=="") return true
	sCuenta = sCuenta.replace(regDigitos,"")
	if ( sCuenta == null || sCuenta.length != 20 || isNaN( sCuenta ) ){
		g_oInputError = oInput
		g_sErrorText= "El número de Cuenta debe tener 20 caracteres numéricos"
		return false;
	}
	
	szBank		= sCuenta.substr( 0, 4 ); 
	szSuc		= sCuenta.substr( 4, 4 ); 
	szAccount	= sCuenta.substr( 10 ); 
	szValidDigit = get_control_digit( szBank, szSuc, szAccount ); 
	szDigit		= sCuenta.substr( 8, 2 ); 
	if( szValidDigit != szDigit ) {
		g_oInputError = oInput
		g_sErrorText= "Por favor, el Dígito de Control es incorrecto. Revise todos los datos"
		return false;
	}
	return true;
} 

function get_control_digit( szBank, szSuc, szAccount ) { 
var nBank = Number( szBank ); 
var nSuc = Number( szSuc ); 
var nAccount = Number( szAccount ); 
var aNumbers = Array; 
var nSumaPesos1, nSumaPesos2; 
	
	aNumbers[0] = Math.floor( nBank / 1000 ); 
	nBank -= ( aNumbers[0] * 1000 ); 
	aNumbers[1] = Math.floor( nBank / 100 ); 
	nBank -= ( aNumbers[1] * 100 ); 
	aNumbers[2] = Math.floor( nBank / 10 ); 
	nBank -= ( aNumbers[2] * 10 ); 
	aNumbers[3] = Math.floor( nBank ); 
	
	aNumbers[4] = Math.floor( nSuc / 1000 ); 
	nSuc -= ( aNumbers[4] * 1000 ); 
	aNumbers[5] = Math.floor( nSuc / 100 ); 
	nSuc -= ( aNumbers[5] * 100 ); 
	aNumbers[6] = Math.floor( nSuc / 10 ); 
	nSuc -= ( aNumbers[6] * 10 ); 
	aNumbers[7] = Math.floor( nSuc ); 
	
	aNumbers[8] = Math.floor( nAccount / 1000000000 ); 
	nAccount -= ( aNumbers[8] * 1000000000 ); 
	aNumbers[9] = Math.floor( nAccount / 100000000 ); 
	nAccount -= ( aNumbers[9] * 100000000 ); 
	aNumbers[10] = Math.floor( nAccount / 10000000 ); 
	nAccount -= ( aNumbers[10] * 10000000 ); 
	aNumbers[11] = Math.floor( nAccount / 1000000 ); 
	nAccount -= ( aNumbers[11] * 1000000 ); 
	aNumbers[12] = Math.floor( nAccount / 100000 ); 
	nAccount -= ( aNumbers[12] * 100000 ); 
	aNumbers[13] = Math.floor( nAccount / 10000 ); 
	nAccount -= ( aNumbers[13] * 10000 ); 
	aNumbers[14] = Math.floor( nAccount / 1000 ); 
	nAccount -= ( aNumbers[14] * 1000 ); 
	aNumbers[15] = Math.floor( nAccount / 100 ); 
	nAccount -= ( aNumbers[15] * 100 ); 
	aNumbers[16] = Math.floor( nAccount / 10 ); 
	nAccount -= ( aNumbers[16] * 10 ); 
	aNumbers[17] = Math.floor( nAccount ); 
	nSumaPesos1= aNumbers[7] * 6 
		+ aNumbers[6] * 3 
		+ aNumbers[5] * 7 
		+ aNumbers[4] * 9 
		+ aNumbers[3] * 10 
		+ aNumbers[2] * 5 
		+ aNumbers[1] * 8 
		+ aNumbers[0] * 4; 
	nSumaPesos1 = Math.floor( 11 - ( nSumaPesos1 % 11 ) ); 
	nSumaPesos1 = (nSumaPesos1 == 11 ? 0 : nSumaPesos1 ); 
	nSumaPesos1 = (nSumaPesos1 == 10 ? 1 : nSumaPesos1 ); 
	
	nSumaPesos2= aNumbers[17] * 6 
		+ aNumbers[16] * 3 
		+ aNumbers[15] * 7 
		+ aNumbers[14] * 9 
		+ aNumbers[13] * 10 
		+ aNumbers[12] * 5 
		+ aNumbers[11] * 8 
		+ aNumbers[10] * 4 
		+ aNumbers[9] * 2 
		+ aNumbers[8] * 1; 
	nSumaPesos2 = Math.floor( 11 - ( nSumaPesos2 % 11 ) ); 
	nSumaPesos2 = (nSumaPesos2 == 11 ? 0 : nSumaPesos2 ); 
	nSumaPesos2 = (nSumaPesos2 == 10 ? 1 : nSumaPesos2 ); 
	
	return nSumaPesos1.toString() + nSumaPesos2.toString(); 
}



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 = "TRWAGMYFPDXBNJZSQVHLCKEF"
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.substr(nNIF % 23,1)) {
 			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;
}



//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
			if (CheckInput (oForm[formC])){
				sNameForm  = oForm[formC].name
				if (typeof(sNameForm)!="undefined"){
					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
						}
						ColorForm(sNameForm,1,sColor)
					}
				}
			}
			formC++
		}
	}
}

function ColorForm(sNameForm,bFormOK,sColor){
var oInput
	if (!bNS && CheckColorForm(sNameForm)) {
		ResetCampo()
		var cTipoFormU =  sNameForm.substr(0,1).toUpperCase()

		if (cTipoFormU!="R" && cTipoFormU!="K"){	//No cambio color en los RADIOS,CHECKS pq queda mal
			if (!sColor){
				var sColor = sColorError
				if (bFormOK) sColor = sColorOK
				if (!sColor) sColor= sColorForm
			}
			if (sColor) {
				if (cTipoFormU=="R") sNameForm +="[0]"
				g_sColorForm = "oFormName."+sNameForm+".style.backgroundColor = '"+sColor+"'"

				window.onerror = function ErrorJS(sError,sURL,nLinea) { sError="Nombre de INPUT inexistente o duplicado: "+sNameForm+"\n\n"+sURL+"\nLinea "+nLinea + " : " + sError;ErroresForm (sError); return (true);}
				eval(g_sColorForm);
				window.onerror=g_oOnErrorEvent
				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);
	}
}


// sModo : 1=solo Prefijo 2=solo Sufijo
function RemovePrefijoSufijo (sName,sModo){
var cValidacion,nLen,nPos
	cValidacion = sName.substr(1,1).toLowerCase()
	if (sModo!=2 && (cValidacion=="_" || cValidacion=="x" || cValidacion=="y" || cValidacion=="z")) {
		sName = sName.substr(2)
	}
	nLen = sName.length

	if (sModo!=1 && sName.charAt(nLen-1)=="_"){
		nPos = sName.lastIndexOf("_",nLen-2)
		if (nPos!=-1) sName = sName.substr(0,nPos)
	}  

	return (sName)
}

// oForm,[sJSarrayBase],[bSinPrefijo]
function RellenarForms(oForm,sJSarrayBase,bSinPrefijo){				//oForm = document.forms.FormName
var nForms=0
var sInputName,sCampo,nPos
var f,sForm,bValor,vValor,sNameP
	if (sJSarrayBase) {
		a_sFormNames = eval ("a_s"+sJSarrayBase)
		a_vFormValues = eval ("a_v"+sJSarrayBase)
	}
	if (bSinPrefijo){
		for (f=0;f<oForm.length;f++) {
			if (CheckInputName (oForm[f],0,1)) {
				sInputName  = oForm[f].name	
				sCampo = RemovePrefijoSufijo (sInputName)
				nPos = BuscaEnArray (a_sFormNames,sCampo,1)
				if (nPos!=-1) a_sFormNames[nPos] = sInputName
			}
		}
	}	

	for (f=0;f<a_sFormNames.length;f++) {
		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":
					RellenarInputTipo(oInput,cTipoForm,a_vFormValues[f])
					break
				case "G":			//Solo deberia dar la vuelta Fechas americanas
					var fFecha = a_vFormValues[f]	//CambiaFecha(a_vFormValues[f])
					oInput.value= fFecha 
					break
				case "K":
					bValor=false
					vValor = a_vFormValues[f]
					if (vValor && !(vValor=="0" || vValor=="False" || vValor=="Falso")) bValor=true
					oInput.checked = bValor 
					break
				case "L":
					RellenarInputTipo(oInput,cTipoForm,a_vFormValues[f])
					break
				case "M":
					var nMoneda = Numero2Texto(a_vFormValues[f],2,1,1)
					oInput.value = nMoneda
				break
				case "P":
					oInput.value = a_vFormValues[f]

					sNameP = a_sFormNames[f].substr(0,1) + "x" + a_sFormNames[f].substr(2)
					oInput = eval ("oForm."+sNameP)				
					if (oInput) {
						oInput.value=a_vFormValues[f]						
					}
				case "R":
// si hay varios radios/checkboxes, quiza habria que tratarlo de otra forma
					if (a_vFormValues[f] && !(a_vFormValues[f]=="False" || a_vFormValues[f]=="Falso")){

						var nRadios = (eval("oForm."+a_sFormNames[f]+".length"));
						var nValor = a_vFormValues[f]
						if (nRadios && !isNaN(nValor)){
//							for (i=0;i<nRadios;i++) {
								eval("oForm."+a_sFormNames[f]+"[nValor-1].checked=true");
//							}
						}
						else{
							eval("oForm."+a_sFormNames[f]+".checked=true");
						}
					}
/*
					if (a_vFormValues[f] && !(a_vFormValues[f]=="False" || a_vFormValues[f]=="Falso")){
						sForm = "oForm."+a_sFormNames[f]+"[0].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]")
					oInput.value = a_vFormValues[f]
			}
		}
	}
}

function RellenarInputTipo(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 = RemovePrefijoSufijo (oInput.name)
			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
		case "L":
			var regDigitos=/[^0-9]/gi
			vValor = vValor.replace(regDigitos,"")
			oInput.value= vValor
			var sNombre = RemovePrefijoSufijo (oInput.name)
			var oForm = oInput.form
			eval("oForm.Ez"+sNombre+".value='"+ vValor.substr(0,4) +"'")
			eval("oForm.Sz"+sNombre+".value='"+ vValor.substr(4,4) +"'")
			eval("oForm.Dz"+sNombre+".value='"+ vValor.substr(8,2) +"'")
			eval("oForm.Cz"+sNombre+".value='"+ vValor.substr(10) +"'")
			break
		default:
			oInput.value = vValor

	}
}


function AutoFill (oForm,bSoloObligatorios){
var e,f,g,oFormC,cTipo,nTipoFind,vInputValue,nMaxLength
var	sNameP1,sNameP2,oInput
var sText=""
var nForms = 1
var nAutoFill = 2						// tipoValidacion,valor
var	a_AutoFill = new Array ( "C",28004
							,"D",FechaHoy()
							,"G",FechaHoy()
							,"H",HoraHoy()
							,"I",FechaHoy(1)
							,"J",1000
							,"L","0078 0050 26 4000000737"
							,"M","59,95"
							,"N",120
							,"O",123
							,"P","1"
							,"Q",-123
							,"T","913197144"
							,"U","2618976N"
							,"V","B81402059"
							)

	oFormC = oForm
	if (!oForm) nForms = document.forms.length

	for (e=0;e<nForms;e++) {
		if (!oForm) oFormC=document.forms[e]
		if (!oFormC) return

		for (f=0;f<oFormC.length;f++) {
			if (!oFormName) oFormName= oFormC
			if (CheckInputName (oFormC[f],0,1)) {
				sInputName  = oFormC[f].name
				vInputValue = ""
				cTipo = CheckTipoForm (sInputName,0)
				if (!bSoloObligatorios) cTipo=cTipo.toUpperCase()
				if (oFormC[f].value && cTipo!="K" && cTipo!="R") cTipo=""
				if (cTipo){
					switch (cTipo){
						case "A":
							vInputValue = sInputName + " (" + GetMaxLength(oFormC[f]) + ")"	//.substr(2)
							break
						case "B":
							vInputValue = sInputName + " (" + GetMaxLength(oFormC[f]) + ")"	//.substr(2)
							break
						case "E":
							vInputValue = sInputName + "@web.com-" + GetMaxLength(oFormC[f]) + "-"
							break
						case "F":
							RellenarInputTipo(oFormC[f],cTipo,FechaHoy())
							break
						case "K":
							oFormC[f].checked=1
							break
						case "L":
							nTipoFind = BuscaEnArray (a_AutoFill,cTipo)
							RellenarInputTipo(oFormC[f],cTipo,a_AutoFill[nTipoFind+1])
							break
						case "R":
							oFormC[f].checked=1
							break
						case "S":
							oFormC[f].selectedIndex=1
							break
						case "W":
							for (g=0;g<oFormC[f].options.length;g++){
								oFormC[f].options[g].selected=1
							}
							break
						case "Y":
							var nOpciones = oFormC[f].length
							if (!nOpciones)	InsertOption(oFormC.name,sInputName,1,sInputName)

							for (g=0;g<oFormC[f].options.length;g++){
								oFormC[f].options[g].selected=1
							}
							break
						default:
							nTipoFind = BuscaEnArray (a_AutoFill,cTipo)
							if (nTipoFind!=-1) vInputValue += a_AutoFill[nTipoFind+1]
					}

					if (vInputValue) {
						nMaxLength = GetMaxLength(oFormC[f])
						if (nMaxLength){
							 vInputValue = vInputValue.substr(0,nMaxLength)
						}
						oFormC[f].value = vInputValue
					}
				}
			}
		}
	}
}

function AutoFocus(oForm){				//Hace Focus en el primer INPUT visible
var oInput,sNameInput
var f = 0
	if (!oForm) oForm=document.forms[0]
	if (!oForm) return
	oFormName =oForm

	while (f<oForm.length) {
		oInput = oForm[f++]
		sNameInput  = oInput.name
		if (CheckInput (oInput,0,0)){
			oInput.focus()
			break;
		}
	}
}

// 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)
}


// Usar CheckInputName() para verificar que el INPUT tiene nombre
// [bVirtual] admite Forms que no existen
// [bHidden]  admite Hiddens
function CheckInput (oInput,bVirtual,bHidden,bDisabled){			// Para no validar Botones, Hidden, Disabled, NoInputs...
var sInputType;
var bFormValido=0
	if (bVirtual) {
		bFormValido=1
	}
	else {
	 	if (oInput){
	 		if (typeof(oInput)=="object"){
				bFormValido=1
				if (!bDisabled && oInput.disabled) return(0)
				sInputTag = oInput.tagName
				if (sInputTag && sInputTag.toLowerCase() == "fieldset") return(0)
				sInputType = oInput.type
				if (sInputType) sInputType = sInputType.toLowerCase()
				if (sInputType == "hidden" && !bHidden) return(0)
				if (sInputType == "button") return(0)
			}
		}
	}
	return (bFormValido)
}

function CheckInputName (oInput,bVirtual,bHidden,bDisabled){
var bInputName=0
	bInputName = CheckInput (oInput,bVirtual,bHidden,bDisabled)
	if (bInputName) {
		if (typeof(oInput.name)=="undefined" || oInput.name=="") bInputName=0
	}
	return (bInputName)
}


// Admite solo Inputs Reales que existen y enabled
// [bHidden] admite Hiddens
function ValidarInput (oInput,bHidden){
	var bInputValido = 0
	var sNameInput = oInput.name
	var cValidacion = sNameInput.substr(1,1)
	if ((cValidacion=="_" || cValidacion=="x") && CheckInput(oInput,0,bHidden)) bInputValido=1
	return (bInputValido)
}

function CheckColorForm(sNameForm){
var bColorFormOK=0

	var oInput = eval("oFormName."+sNameForm)
	if (CheckInput (oInput)){
		bColorFormOK=1
//		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
}

//[bTodos] 0/1 Solo tipo _x / todos
function CheckTipoForm (sNameForm,bTodos){
var cValidacion,cTipoForm
var bValidar=0

	if (!sNameForm) return
	cTipoForm= sNameForm.substr(0,1)							//Codigo Original
	cValidacion = sNameForm.substr(1,1)
	if (bTodos || 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){
	alert (DebugFormInfo (oForm,sInputName))
}

function DebugFormInfo (oForm,sInputName){
var f,g,oFormC;
var nForms=1;
var sText=""

	if (sInputName){
		oInput = eval ("oForm."+sInputName)
		sText = DebugInput (oInput)
	}
	else{
		oFormC = oForm
		if (!oForm) nForms = document.forms.length

		for (g=0;g<nForms;g++) {
			if (!oForm) oFormC=document.forms[g]
			if (!oFormC) return
			sText += "--------- "+ oFormC.name +" --------\n"
			for (f=0;f<oFormC.length;f++) {
				sText += DebugInput (oFormC[f]) + "\n"
			}
		}

	}
	return (sText)
}


function DebugInput (oFormInput){
var sInputType,f,sSelected,nMaxLength
var sText = ""
var sSeparador= " / "

	sText += oFormInput.name + sSeparador

	sInputType=oFormInput.type
	sText += sInputType + sSeparador

	sText += (oFormInput.disabled ? "disabled":"enabled") + sSeparador

	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{
		nMaxLength = GetMaxLength(oFormInput)
		if (nMaxLength) sText += " (" + nMaxLength + ") "
		sText += " [" + oFormInput.value + "]"
	}

	return (sText)
}


function GetMaxLength(oFormInput){
var nMaxLength = 0
	if (typeof(oFormInput.maxLength )!="undefined") nMaxLength = oFormInput.maxLength
	else if (typeof(oFormInput.maxlength )!="undefined") nMaxLength = oFormInput.maxlength
	if (nMaxLength>1000000 || nMaxLength<0) nMaxLength=0
	return (nMaxLength)
}

function CheckIntegrity (oForm){
var oFormC,f,g,sNameInput,cValidacionO,cValidacion,cTipoForm;
var sText = ""
var nForms = 1

	oFormC = oForm
	if (!oForm) nForms = document.forms.length

	for (g=0;g<nForms;g++) {
		if (!oForm) oFormC=document.forms[g]
		if (!oFormC) return
		sText += "--------- "+ oFormC.name +" --------\n"

		for (f=0;f<oFormC.length;f++) {
			if (CheckInput (oFormC[f],0,1)){
				if (CheckInputName (oFormC[f],0,1)){
					sNameInput = oFormC[f].name
					cValidacionO = sNameInput.substr(1,1)
					cValidacion = cValidacionO.toLowerCase()
					if (cValidacion!="_" && cValidacion!="x" && cValidacion!="y" && cValidacion!="z") {
						sText += "ERROR\t["+sNameInput+"]\tModo de validacion '"+ cValidacionO +"' desconocido" + "\n"
					}
					cTipoForm= sNameInput.substr(0,1).toLowerCase()
					if (cValidacion!="z" && (cTipoForm=="a" || cTipoForm=="b"|| cTipoForm=="c"|| cTipoForm=="e" || cTipoForm=="p"|| cTipoForm=="u"|| cTipoForm=="v")){
						if (GetMaxLength(oFormC[f])==0) sText += "WARN\t["+sNameInput+"]\tNo tiene definido el 'maxlength'\n"
					}
					if ( cTipoForm=="p" && cValidacionO=="X"){
						sText += "ERROR\t["+sNameInput+"]\tEl modo de validacion es 'X' y debe ser 'x' en minuscula\n"
					}
				}
				else{
					sText += "ERROR\t[...]\tHay un INPUT de tipo '"+oFormC[f].type+"' sin 'name' definido\n"
				}
			}
			else{
				if (CheckInput (oFormC[f],0,1,1)) sText += "WARN\t["+sNameInput+"]\tEsta 'disabled'\n"
			}
		}
	}


	return (sText)
}


function TeclaPulsada(e) {
var nKey,bKey,sInputType
var bCTRL = 0
	if (bIE) nKey = window.event.keyCode;
	else nKey = e.which;
	if (bIE & g_bControlKeys && window.event.ctrlKey) bCTRL = 1			// solo IE !!!

	if (nKey==13){
		bKey=1
		if (bIE){
			bKey = 0
			sInputType = event.srcElement.tagName.toUpperCase()
			if (g_bSelectSubmit || sInputType!="SELECT"){
				if (sInputType!="TEXTAREA") bKey=1
			}
		}

		if (bKey){ 
			window.onerror = function ErrorJS(sError,sURL,nLinea) { sError="No existe la funcion: '"+g_sTecladoFuncion+"'\n\n"+sURL+"\nLinea "+nLinea + " : " + sError;ErroresForm (sError); return (true);}
			eval (g_sTecladoFuncion+"()")
			window.onerror=g_oOnErrorEvent
		}
	}

	if (bCTRL) {
		switch (nKey){
			case 118 :			//F7
				DebugForm ()
				break
			case 119 :			//F8
				alert (CheckIntegrity ())
				break
			case 120 :			//F9
				AutoFill  ()
				break
			case 121 :			//F10
				AutoFill ("",1)
				break
		}
	}
//	alert(nKey)
//	if( !e.modifiers || (e.modifiers == Event.CONTROL_MASK) && e.which) alert(String.fromCharCode(e.which));

}


function TextareaLen(oInput){
	var nLenMaxima = oInput.maxlength
	var nLen = oInput.value.length
	var bError = 0

	if (nLen>nLenMaxima) {
		bError = 1
		g_sErrorText = "El texto es demasiado largo. Sobran "+(nLen-nLenMaxima)+" caracteres."
	}
	return (bError)
}


// 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);
if (!oForm) return
	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 AutoInitInput() {		//rellena campos de tipo D
var nForms,oFormC,f,g
	nForms = document.forms.length
	for (f=0;f<nForms;f++) {
		oFormC=document.forms[f]
		for (g=0;g<oFormC.length;g++) {
			cTipo = CheckTipoForm (oFormC[g].name)
			if (cTipo=="D")	oFormC[g].value = FechaHoy()
		}
	}
}


function BuscaEnArray (a_vArray,vValor,bCaseIndepen){			//3.1 Busca la posicion en el array del ultimo valor que se le pasa (Devuelve -1 si no encuentra ninguna)
var nLen,nPos,vDato
	nLen = a_vArray.length
	nPos=-1
	if (bCaseIndepen) vValor = vValor.toLowerCase()
	while (nPos<--nLen){ 
		vDato = a_vArray[nLen]
		if (bCaseIndepen) vDato = vDato.toLowerCase()
		if (vDato==vValor) {
			nPos=nLen
			break
		}
	}
	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 ErroresForm(sError){
var sMsgError;
	sMsgError = "ERROR FORM: " + sError
	alert(sMsgError)
}


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);
}

// [bReturnNaN] Devuelve "" si sNumero no es un numero
function Texto2Numero(sNumeroIn,bReturnNaN){		// 	Genera un Numero a partir de un String - Transforma de 1.000,5 a 1000.5
var sNumero,nPuntoPos1,nComaPos1,nPuntoPos2,nComaPos2,regExp,nNumero
var regCantidades=/[^0-9 .,-]/gi

	sNumeroIn = "" + sNumeroIn
	sNumero = sNumeroIn.replace(regCantidades,"")		//quito puntos
	if (bReturnNaN && sNumeroIn!=sNumero) return (sNumeroIn)
//	if (!bReturnNaN && sNumero=="") sNumero="0"
	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{
		status = ("TestFuncionZ() Value="+vValor+ " (nunca uses el valor EVIL)")
	}
	return sError
} 