/*
©2003 IntelyGenZ - www.intelygenz.com - info@intelygenz.com
i_form.js v1.17beta10 [libs v1.17]

http://aspirina/ig_intelygenz/ig05_intranet/desarrollo/areas/dev/docs/i_form.html

v1.17: [Fix] RellenarForms()	[Fix] RETURN->2 ComprobarForm()	[New] CheckNeedFull [Upd] CheckIntegrity()	[Upd] CheckInputName()	[Upd] CheckInput()	[Upd] ChangeFieldsState() EnabledFields() DisabledFields()	[Upd] CampoError()


BUGS:
BUG: RETURN->2 ComprobarForm(), pero al menos ahora no hace 2 ValidarForm/SubmitForm
¿Hacer algo parecido a g_a_sNoValidar[] pero con INPUT que no hay que rellenar?
Hacer un array para los errores que permita usar un array de errores en otros idiomas
Comprobar que ValidarForm() funciona bien
Documentar mejor las funciones de Select Multiple (y OrdenarSelect())
Efecto: los bordes de los INPUTs se pinten 1 a 1 (Arriba,derecha, abajo, izquierda)
DebugForm() : Listar nombre de INPUTs repetidos
Los FORMs antiguos que no usan SubmitForm() pueden dar problemas (ver como comprobarlo)
	quiza hacer un aviso si al ValidarForm le pasan el Form? (grave problema de compatibilidad con paginas antiguas)
Pintar SELECT sin bordes (como en cocacola)
GetInputValueChecked : en SELECT, no permite que la primera opcion sea 0 o -1

NEW:
	CheckNeedFull:	Checkea como obligatorios los campos que le pasemos en el array a_sFields
					CheckNeedFull(oFormOrElement, a_sFields)


EJ: CreaCombo("S_Name","class='input'",["Tit","Val"],[ma_vTexto,[2],[3]],[ma_vValor,[1],[3]],"ValorSeleccionado")

USO:

<SCRIPT language="JavaScript" src="../libs/js/i_form.js"></SCRIPT>

function Init() {
	InitForm()
}

function ComprobarForm(){
	if (ValidarForm()) SubmitForm();
}

*/


// *** [HTML] ***
g_bShield = 1;
g_sShieldBGColor="#EE6C38";
g_sShieldInner ="<FONT color='#f0f0f0' size='2'><B>Procesando datos . . .</B></FONT>";
g_nShieldAlpha =80;

g_sTecladoFuncion = "ComprobarForm"	// funcion que ejecuta al pulsar RETURN (dejarla vacia)
g_bSelectSubmit = 0					// no/si ejecutar g_sTecladoFuncion al pulsar RETURN en un SELECT
g_bControlKeys = 1					// no/si ejecutar funciones debug
g_bAutoFocus = 1					// no/si ejecutar autofocus en InitForm()
g_bAutofixM = 1						// Autofix numeros tipo M (cambia el VALUE a formato numero)
g_bInitEnabler	= [0,[0,0,0,0]]		// InputEnabler (bValido,bFilled,bEmpty,bHidden)
g_bSubmitEnabler= [0,[0,0,0,0]]		// InputEnabler (bValido,bFilled,bEmpty,bHidden)
g_bAllErrors = 0					// Muestra 1 error / Muestra todos 
g_bRellenarAll = 1					// RellenarForms() rellena cualquier INPUT de a_sFormNames() (aunque el tipo no coincida)

// * Si se usan los colores o arrays, hay que ponerlos en el HTML (y ponerlos despues de cargar la libreria)
sColorForm 	= "#f4f4f4"		//poner TODOS ...="" si no se quiere cambiar colores del form
sColorOK 	= "#e7e7e7"
sColorActivo= "#c4c4c4"
sColorError	= "#ffc4c4"
sColorObligatorio	= "#f0f080"

// * Inputs que NO validara NUNCA
g_a_sNoValidar 		= ["B_Nombre_Lo_","vxCIF"]
// * Inputs que validara SIEMPRE.
g_a_sSiValidar 		= ["B_Nombre_Lo_","vxCIF"]
// * g_a_sSiValidarExt: permite cambiar el tipo de validacion o personalizar la funcion de validacion
//								(InputName,["tipoValidacion"],["FuncionValidacionEspecial" (para tipoValidacion=Z)])
g_a_sSiValidarExt	= ["B_Nombre_Lo_","Z","TestFuncionZ(oInput)"]
// * Caracteres que admite los INPUT de tipo B
a_cValidos_B = [" ","_","Á","É","Í","Ó","Ú","Ñ",",",";",".",":","+","-","@"]
// * 0.Nombre campo 1.Mensajes de Error personalizados para cada campo
a_sError = ["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= ["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 = ["N_Numero",18,0]
// * Corrige los Input (de tipo NIF/DNI/...) cuyo nombre esten en el array
g_a_sAutoCorregir = ["U_NIF","vxCIF"]
// ***

oIForm=new function(){
	this.m_sObj="oIForm";

	this.m_nVersion=1.17;
}

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_sErrorInput
var g_sErrorValue,g_sErrorText,g_sAllErrorsText,g_ErrorTipo	// Variables Error globales
var g_oInputError
var g_a_vFixAtSubmit = []		// oInput1,vValue1,... Modifica los valores antes del Submit
var g_bSubmitOn=0


if(typeof(oIGZ)!="undefined" && oIGZ.m_nVersion>=0.53) {
	new oIGZ.f_keyEvent (["ENTER"], TeclaPulsada );
	new oIGZ.f_keyEvent (["CTRL","F7"], TeclaPulsada );
	new oIGZ.f_keyEvent (["CTRL","F8"], TeclaPulsada );
	new oIGZ.f_keyEvent (["CTRL","F9"], TeclaPulsada );
	new oIGZ.f_keyEvent (["CTRL","F10"], TeclaPulsada );
	new oIGZ.f_keyEvent (["CTRL","F12"], TeclaPulsada );
}
else{
	if (bIE) document.onkeyup = TeclaPulsada;
	else document.onkeypress = TeclaPulsada;
}

//	[oForm],[nFormSize],[bInitColor],[bSinPrefijo],[vArrayBase]
function InitForm(oFormInit,nFormSize,bInitColor,bSinPrefijo,vArrayBase){
	oForm = oFormInit
	if (!oForm) oForm=GetForm()
	if (typeof(oForm)!="object"){
		if (typeof(oForm)!='undefined') ErroresForm("No existe el FORM de nombre '"+ oForm +"' pasado a 'InitForm()'")		
		return
	}
	oFormName =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" || typeof(maFormNamesValues)!="undefined" || vArrayBase){
		RellenarForms(oFormInit,vArrayBase,bSinPrefijo)
		if (g_bInitEnabler[0]) InputEnabler (g_bInitEnabler[1][0],g_bInitEnabler[1][1],g_bInitEnabler[1][2],g_bInitEnabler[1][3])
	}
	if (bInitColor) InitColor(oForm)
	AutoInitInput()

	InitTextAreaMaxLength()
	if (g_bAutoFocus) AutoFocus(oForm)
}

function GetForm(){
	var oForm;
	var nForms = document.forms.length
	if (nForms) {
		oForm=document.forms[0]
		if (nForms>1) status = "Aviso: esta página tiene varios FORMs"
	}
	return oForm
}

function SubmitForm(oForm){
	if (g_bSubmitOn) return
	g_bSubmitOn = 1
	if (!oForm) oForm=GetForm()
	if (typeof(oForm)!="object"){
		ErroresForm("No existe el FORM de nombre '"+ oForm +"' pasado a 'SubmitForm()'")		
		g_bSubmitOn = 0
		return
	}
	else{
		ValidarCheckmarks(oForm)
		FixAtSubmit(oForm);
		if (g_bSubmitEnabler[0]) InputEnabler (g_bSubmitEnabler[1][0],g_bSubmitEnabler[1][1],g_bSubmitEnabler[1][2],g_bSubmitEnabler[1][3])

		g_sTecladoFuncion = "";
		if (g_bShield) oIFormShield.f_setEnabled();
		oForm.submit();
	}
}

function InitFormValidar(oForm,nFormSize,bInitColor){			//Deprecated
	status = ("[i_form.js] Usar InitForm()")
	InitForm(oForm,nFormSize,bInitColor)
}

function InitValidarForm(oForm,nFormSize){						//Deprecated
	status = ("[i_form.js] Usar InitForm()")
	InitForm(oForm,nFormSize,1)
}

function ValidarForm (oForm) {
var oInput, oInputError, sInputType

	if (g_bSubmitOn) return (0)
	if (oForm) status = ("[i_form.js] ValidarForm(oForm) deprecated.Usar: if (ValidarForm()) SubmitForm()")
	
	if (!oForm) oForm=GetForm()

	if (typeof(oForm)!="object"){
		ErroresForm("No existe el FORM de nombre '"+ oForm +"' pasado a 'ValidarForm()'")		
		return
	}		

	if (oFormName!=oForm) g_sColorForm=""
	oFormName = oForm
	InitFixAtSubmit()
	ResetCampo()
	InitColor(oForm)
	g_bCamposVacios=1
	var bError = false;
	var nErrors = 0;
	var formC=0
	oFormName =oForm
	g_oInputError = ""
	g_sAllErrorsText = ""

	while ((!nErrors || (nErrors && g_bAllErrors)) && formC<oForm.length) {
		oInput = oForm[formC]

		vValueForm = GetInputValueChecked(oInput)

		bError=ValidaCampo (oInput,vValueForm,1)
		if (bError){
			nErrors++
			if (!oInputError) oInputError = oInput
			CampoErrorT(oInput)
		}
		formC++
	}
	if (nErrors) {
		if (nErrors>1) g_sAllErrorsText = "Hay "+ nErrors +" campos incorrectos:\n\n" + g_sAllErrorsText
		if (g_oInputError) oInputError=g_oInputError
		CampoError(oInputError)
		bError=1
	}

	return (!bError)
}


function ValidarCampo (oInput) {
	ResetCampo()
	oFormName= oInput.form
	bError=ValidaCampo (oInput)
	if (bError) CampoError(oInput)
	return (bError)
}

function ActivarCampo (oCampo) {
	if (!bNS){
		ResetCampo()
		oFormName = oCampo.form
		sNameForm = oCampo.name
		vValueForm = oCampo.value
		sColor=oCampo.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++
		}
	}
}

// ValidaCampo(oInput,[vValueForm])
function ValidaCampo(oInput,vValueForm,bFixInput){
var bError=0
	if (CheckInputName(oInput,0,1)){
		if (typeof(vValueForm)=="undefined") vValueForm = oInput.value
		var sNameForm = oInput.name
		bError=(ValidaValor (sNameForm,vValueForm,oInput,bFixInput))
		if (!bError && (cValidacion=="_" || cValidacion=="x")) {
			ColorForm (oInput,1)
		}
	}
	return bError
}

//bFixInput : existe oInput y modificamos su valor para normalizarlo
function ValidaValor (sNameFormT,vValueForm,oInput,bFixInput){		//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,0,1)) bFormValido =1 	
///		else 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.toUpperCase()=="Y") AddFixAtSubmit(sNameForm,"Tipo_Y")
	if (cTipoForm=="r" && CheckRadios(oInput)) g_bCamposVacios=0
	if (cTipoForm.toUpperCase()=="K" && GetInputValueChecked(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) {
		cTipoForm = cTipoForm.toUpperCase()
		if (cTipoForm!="F" && cTipoForm!="K" && (bFormValido && eval("oFormName."+sNameForm+".type")!="hidden")) g_bCamposVacios=0
		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":
				if (vValueForm.length!=5 || !EsNumero0(vValueForm) ) {
					bError = true;
					g_sErrorText= "Por favor, introduce el código postal correctamente."
				}
				break
			case "D":
				if (vValueForm == "") {
					dHoy = FechaHoy()
					if (bFormValido && bFixInput) 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 && bFixInput) eval("oFormName."+sNameForm+".value=parseFloat(vValueForm)")	//v2.00
				}
				break
			case "L":
				if(!ValidarCC(sNameForm,vValueForm,oFormName)){
					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 = vValueForm
				if (vValueC) vValueC = Texto2Numero(vValueForm,(~g_bAutofixM) & 1)
				if (!EsNumeroNegativo(vValueC)) {
					bError = true;
					g_sErrorText= "Por favor, el campo donde esta el cursor debe ser una cifra"
				}
				else{
					if (bFormValido && g_bAutofixM && bFixInput) AddFixAtSubmit(sNameForm,parseFloat(vValueC))
				}
				break
			case "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 && bFixInput) AddFixAtSubmit(sNameForm,parseFloat(vValueForm))
				}
				break
			case "O":
				if (!EsNumero(vValueForm)) {
					bError = true;
					g_sErrorText= "Por favor, introduce un número positivo distinto de cero"
				}
				else{
					if (bFormValido && bFixInput) AddFixAtSubmit(sNameForm,parseFloat(vValueForm))
				}
				break
			case "P":
				if (vValueForm == "") {
					bError = true;
					g_sErrorText= "Por favor, rellena la 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 && bFixInput) AddFixAtSubmit(sNameForm,parseFloat(vValueForm))
				}
				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 (isNaN(vValueForm) || vValueForm<600000000 || vValueForm>999999999 || vValueForm.length!=9) {
					bError = true;
					g_sErrorText= "Por favor, corrige el número de teléfono."
				}
				break
			case "U":
				/*comentado por la validación de los extranjeros 28/01/2009 Kiko*/
				/*if(!ValidarNIF(vValueForm)){
					bError = true;
					g_sErrorText= "Por favor, este campo debe ser un NIF correcto con la letra al final [xxxxxxxY]"
				}*/
				bError = false;
				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
}

// [sError] Mensaje de error personalizado
function CampoError(oInput,sError){
////	CampoErrorT(oInput,sError)	
//	g_sErrorFormName = oInput.form
//	g_sErrorInputName = sNameForm
//	g_sErrorInput = oInput

	if (g_sAllErrorsText) g_sErrorText = g_sAllErrorsText
	if (sError)	g_sErrorText = sError

	ColorForm(oInput,0)

	window.onerror = function ErrorTrapJS(sError,sURL,nLinea) { sError="Imposible hacer focus en el INPUT '"+oInput.name+"' de tipo '"+oInput.type+"'\n\n"+sURL+"\nLinea "+nLinea + " : " + sError;ErroresForm (sError,oInput); return (true);}
	oInput.focus()
	window.onerror=g_oOnErrorEvent

	alert (g_sErrorText)
}

function CampoErrorT(oInput,sError){
	if (sError){
		g_sErrorText = sError
	}
	else {
		var	sNameForm = oInput.name
		nPosicion = BuscaEnArray (a_sError,sNameForm)
		if (nPosicion!=-1) g_sErrorText=a_sError[nPosicion+1]
	}	
	g_sAllErrorsText += g_sErrorText + "\n"
}


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(eval ("oFormName.Dz"+t_sNameForm),1)
		ColorForm(eval ("oFormName.Mz"+t_sNameForm),1)
		ColorForm(eval ("oFormName.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(eval ("oFormName.Dz"+t_sNameForm),1)
		ColorForm(eval ("oFormName.Mz"+t_sNameForm),1)
		ColorForm(eval ("oFormName.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(eval("oFormName.Dz"+t_sNameForm),1)
				sReturn = "Por favor, corrija el mes"
				break
			case "A":
				ColorForm(eval ("oFormName.Dz"+t_sNameForm),1)
				ColorForm(eval ("oFormName.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))
}


function ComparaFechas (sFecha1,sFecha2,cSeparador){			//1.13 ""=? / -1= F1 menor / 0 iguales / 1 F1 mayor
var d1,d2
var nComparacion = 0
	if (!cSeparador) cSeparador="/"

	d1=Fecha2Date(sFecha1,cSeparador)
	d2=Fecha2Date(sFecha2,cSeparador)
	if (d1>d2) nComparacion=1
	if (d1<d2) nComparacion=-1
	if (d1==d2) nComparacion=0
	return (nComparacion)
}

function Fecha2Date(sFecha,cSeparador){
	dFecha = new Date()
	if (sFecha)	{
		sFecha = CambiaFecha (sFecha,cSeparador)
		dFecha = new Date(sFecha)
	}
	return (dFecha)
}


function ValidaFecha (nDD,nMM,nAAAA,nHora,nMins,nSecs){
	if (!nDD || !nMM || !nAAAA) return false
	if (isNaN(nDD)|| isNaN(nMM)|| isNaN(nAAAA)) return false
	if (nAAAA < 100) nAAAA+=1900
	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 FechaDifDias(sFecha1,sFecha2){
	dFecha1 = Fecha2Date (sFecha1);
	dFecha2 = Fecha2Date (sFecha2);

	interval = dFecha2.getTime() - dFecha1.getTime();
	msecondsPerDay = 1000 * 60 * 60 * 24;

	days = Math.ceil( interval / msecondsPerDay );
	return (days)
}



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)
	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 ValidarCC(sInputName,sCuenta,oForm) {
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") AddFixAtSubmit(sNameForm,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) AddFixAtSubmit(sNameForm,nDNIfixed)
	}
	return bRetCode;
}


function ValidarNIF(sNIF){
var a_cOrden = "TRWAGMYFPDXBNJZSQVHLCKEF"
var cLetra,nLetra;
var bRetCode = false;

	sNIF=sNIF.replace(/\s/g,"")
	sNIF=sNIF.replace(/\./g,"")
	sNIF=sNIF.replace(/-/g,"")

	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) AddFixAtSubmit(sNameForm,nNIF+cLetra)
		}
	}

	return bRetCode;
}


function ValidarCIF(sCIF){
var cLetra,nLetra;
var bRetCode = false;
var letrasInicialesCIF= "ABCDEFGHKLMPQSXZ";

	sCIF=sCIF.replace(/\s/g,"")
	sCIF=sCIF.replace(/\./g,"")
	sCIF=sCIF.replace(/-/g,"")

	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) AddFixAtSubmit(sNameForm,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,a_sExtValidas){		// 9.5 Comprueba que solo haya letras, numeros y los caracteres del array que le pasamos
var f,bCaracter
	var sCadenaMay = sCadena.toUpperCase();
	var 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);
		}
		else{
			if (!(nCaracterPos!=-1 || (bCaracter >= "A" && bCaracter <= "Z") || (bCaracter >= "0" && bCaracter <= "9"))) return sCadena.charAt(f);
		}
	}
	return 0;
}


//	a_cValidos = ["_","Á","É","Í","Ó","Ú","Ñ",",",";",".","+","-","@",":","/","\\"]
function ValidarExtension (oInput,a_sExtValidas,a_cValidos,sError) {
	var sExtension = CheckExtension (oInput.value,a_sExtValidas)
	if (sExtension) {
		if (!sError) sError = "No se aceptan ficheros de tipo: "+ sExtension +"\nLos tipos de ficheros aceptados son:\n"+a_sExtValidas
		CampoError(oInput,sError)
	}
	else if (a_cValidos){
		var a_cValidosTemp = a_cValidos_B

		a_cValidos_B = a_cValidos
		if (ValidaValor ("B_",oInput.value)) {
			CampoError(oInput)
			sExtension = "error"
		}
		a_cValidos_B = a_cValidosTemp
	}
	return (sExtension)
}


function CheckExtension (sCadena,a_sExtValidas){
	var nPos = sCadena.lastIndexOf(".")
	var sExt = sCadena.substr(nPos+1)
	if (nPos==-1 || sExt=="") return ("sin extensión")

	nPos = BuscaEnArray (a_sExtValidas,sExt,1)
	if (nPos==-1) return (sExt)

	return 0;
}


function InitColor(oForm){
var formC=0,bValidar,sColor,sNameForm,cValidacion,cTipoForm,g_sColorForm
	if (!bNS && typeof(oForm)=="object") {
		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(oForm[formC],1,sColor)
					}
				}
			}
			formC++
		}
	}
}

function ColorForm(oInput,bFormOK,sColor){
	sNameForm = oInput.name
	if (!bNS) {	 // && sColor
		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) {
				oInput.style.backgroundColor = sColor
				if (CheckColorForm(sNameForm)){
					window.onerror = function ErrorTrapJS(sError,sURL,nLinea) { sError="Nombre de INPUT inexistente o duplicado: "+sNameForm+"\n\n"+sURL+"\nLinea "+nLinea + " : " + sError;ErroresForm (sError,oInput); return (true);}

					g_sColorForm = "oFormName."+sNameForm+".style.backgroundColor = '"+sColor+"'"
					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){
		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/ma_InputInitValues],[bSinPrefijo]
function RellenarForms(oForm,vArrayBase,bSinPrefijo){
var nForms=0, oFormC, sInputsSinValue = ""
var sInputName,sCampo,nPos
var e,f,g,sForm,bValor,vValor,sNameP

	if (!vArrayBase && typeof(maFormNamesValues)!="undefined") vArrayBase = maFormNamesValues
	if (vArrayBase) {
		if(IsArray(vArrayBase)){
			a_sFormNames = vArrayBase[0];
			a_vFormValues = vArrayBase[1];
		}
		else{
			a_sFormNames = eval ("a_s"+vArrayBase)
			a_vFormValues = eval ("a_v"+vArrayBase)		
		}
	}
	if (a_vFormValues.length==0) return (0)

	if (!oForm) nForms = document.forms.length
	else oFormC = oForm

	for (e=0;e<nForms;e++) {
		if (!oForm) oFormC = document.forms[e]
		if (!oFormC) return

		if (bSinPrefijo){	
			for (g=0;g<oFormC.length;g++) {
				if (ValidarInput (oFormC[g],1)) {
					sInputName = oFormC[g].name	
					sCampo = RemovePrefijoSufijo (sInputName)
					nPos = BuscaEnArray (a_sFormNames,sCampo,1)
					if (nPos!=-1) {
						a_sFormNames[nPos] = sInputName
					}
					else {
						sInputsSinValue += sInputName + " / "	
					}
				}
			}
			if (sInputsSinValue) status = ("[i_form.js] INPUTS sin values:"+ sInputsSinValue)
		}
	
		for (f=0;f<a_sFormNames.length;f++) {
			var oInput = eval("oFormC."+a_sFormNames[f])
			if (oInput){
				if (g_bRellenarAll) oInput.value = a_vFormValues[f]	
				if (ValidarInput (oInput,1)) {
					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 = a_vFormValues[f]
							if (nMoneda) nMoneda = Numero2Texto(nMoneda,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 ("oFormC."+sNameP)				
							if (oInput) {
								oInput.value=a_vFormValues[f]						
							}
							break
						case "R":
							var vValor = a_vFormValues[f]
							if (vValor && !(vValor=="False" || vValor=="Falso")){
								var nRadios = oInput.length;
								if (nRadios){			//&& !isNaN(vValor)
									for (i=0;i<nRadios;i++) {
										vRadioValue = oInput[i].value
										if (vRadioValue==vValor) {
											oInput[i].checked=true;
											break	
										}
									}
								}
								else{
									if (oInput.value==vValor) oInput.checked=true;
								}
							}
							break
						case "S":
							oFormName = eval("oFormC."+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("oFormC."+a_sFormNames[f])
							SelectOptions(oFormC,a_sFormNames[f],0)
							var a_sValor=a_vFormValues[f]
							if(!IsArray(a_sValor)) a_sValor=a_sValor.split(", ");
							for (var h=0;h<a_sValor.length;h++){
								for (var i=0;i<oFormName.options.length;i++){
									if (oFormName[i].value==a_sValor[h] || oFormName[i].text==a_sValor[h]){
										oFormName.options[i].selected=true
										break
									}
								}
							}
							break
						case "Y":
							oFormName = eval("oFormC."+a_sFormNames[f])
							SelectOptions(oFormC,a_sFormNames[f],0)
							var a_sValor=a_vFormValues[f]
							if(!IsArray(a_sValor)) a_sValor=a_sValor.split(", ");
							SelectOptions(oFormC,a_sFormNames[f],1,a_sValor)
							DelSelected(oFormC,a_sFormNames[f],0,0)
							SelectOptions(oFormC,a_sFormNames[f],0)
							break
						default:
							oInput.value = a_vFormValues[f]
						}
					}
				else {
					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
var	a_AutoFill = new Array ( "C",28010
							,"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","914463903"
							,"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!="S" && 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 + "@igz.biz-" + 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":
							if (GetInputValueChecked(oFormC[f])=="") oFormC[f].selectedIndex=1							
							break
/*						case "W":
							for (g=0;g<oFormC[f].options.length;g++){
								oFormC[f].options[g].selected=1
							}
							break
*/
						case "W":
						case "Y":
							var nOpciones = oFormC[f].length
							if (!nOpciones)	InsertOption(oFormC,oFormC[f],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
var f = 0
	if (!oForm) oForm=document.forms[0]
	if (!oForm) return
	oFormName =oForm

	while (f<oForm.length) {
		oInput = oForm[f++]
		if (CheckInput (oInput,0,0)){
			if (GetInputValue(oInput)==""){				
				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)
}

function GetInputValueChecked(oInput){
var vValor=""
	if (CheckInput (oInput,0,1,1)){
		var sInputType=oInput.type.toLowerCase()

		if (sInputType=="radio" || sInputType=="checkbox"){
			var nRadios = oInput.length
			if (nRadios){
				for (i=0;i<nRadios;i++) {
					if (oInput[i].checked) vValor=true
				}
			}
			else{
				if (oInput.checked) vValor=true
			}
		}
		else if (sInputType=="select-one"){
			var nSelected=oInput.selectedIndex
			if (nSelected!=-1) vValor=oInput[nSelected].value		
			if (nSelected==0 && (vValor=="0" || vValor==-1)) vValor=""	//Quiza este mal forzar esto !!! 
		}
		else{
			vValor = oInput.value
		}
	}
	return (vValor)
}

function SwapAllChecked(oInput,bChecked){
	var nRadios = oInput.length
	if (nRadios){
		if (bChecked==null){
			bChecked=1
			if (oInput[0].checked) bChecked=0 
		}	
		for (i=0;i<nRadios;i++) {
			oInput[i].checked=bChecked
		}
	}
}

// Usar CheckInputName() para verificar que el INPUT tiene nombre
// [bVirtual] admite Forms que no existen
// [bHidden] admite Hiddens
function CheckInput (oInput,bVirtual,bHidden,bDisabled,bButton,bObject){			// 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
				sInputTag = sInputTag.toLowerCase()
				if (sInputTag == "fieldset") return(0)
				if (sInputTag == "object" && !bObject) return(0)
				sInputType = oInput.type
				if (sInputType) sInputType = sInputType.toLowerCase()
				if (sInputType == "hidden" && !bHidden) return(0)
				if (sInputType == "button" && !bButton) return(0)
			}
		}
	}
	return (bFormValido)
}

function CheckInputName (oInput,bVirtual,bHidden,bDisabled,bButton){
var bInputName=0
	bInputName = CheckInput (oInput,bVirtual,bHidden,bDisabled,bButton)
	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
	if (!bHidden) bHidden = 0
	if (CheckInputName(oInput,0,bHidden)) {
		var sNameInput = oInput.name
		var cValidacion = sNameInput.substr(1,1)
		if ((cValidacion=="_" || cValidacion=="x") ) bInputValido=1
	}
	return (bInputValido)
}

function CheckColorForm(sNameForm){
var bColorFormOK=0

	window.onerror = function ErrorTrapJS(sError,sURL,nLinea) { sError="FORM invalido '"+ oFormName + "' o nombre de INPUT erroneo: '"+ sNameForm+ "'\n\n"+sURL+"\nLinea "+nLinea + " : " + sError;ErroresForm (sError); return (true);}
	var oInput = eval("oFormName."+sNameForm)
	window.onerror=g_oOnErrorEvent

	if (CheckInput (oInput) && (isNaN(oInput.length) || oInput.length<2)) {
		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){
	var sFormInfo = DebugFormInfo (oForm,sInputName,1)
	sFormInfo += "\n\nPulsa 'CANCELAR' para ver toda la informacion."
	if (!confirm (sFormInfo)) DebugFormInfo (oForm,sInputName)

}

function DebugFormInfo (oForm,sInputName,bMini){
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],bMini) + "\n"
			}
		}
	}
	return (sText)
}


function DebugInput (oFormInput,bMini){
var sInputType,f,nMaxLength
var sText = ""
var sSeparador= " / "

	sText += oFormInput.name + sSeparador

	sInputType=oFormInput.type
	if (!sInputType) sInputType = oFormInput.tagName
	sText += sInputType + sSeparador

	sText += (oFormInput.disabled ? "disabled":"enabled") + sSeparador

	if (sInputType=="select-one" || sInputType=="select-multiple") {
		var nOptions = oFormInput.length
		sText += "(" + oFormInput.length + " opciones)"
		if (nOptions) sText += "\n"
		var sEOL = ""
		if (bMini && nOptions>3) {
			nOptions=3
			sEOL = ""
		}
		for (f=0;f<nOptions;f++){
			sText += DebugOption(oFormInput,f,sEOL)
		}
		if (oFormInput.length>nOptions) {
			sText += "\t. . . ."
			sText += DebugOption(oFormInput,oFormInput.length-1,sEOL)
		}
	}
	else{
		nMaxLength = GetMaxLength(oFormInput)
		if (nMaxLength) sText += " (" + nMaxLength + ") "
		sText += " [" + oFormInput.value + "]"
		if (oFormInput.checked) sText += " checked"
	}

	return (sText)
}

function DebugOption(oFormInput,f,sEOL){
	var sSelected = ""
	if (oFormInput.options[f].selected) sSelected = " selected"
	var sText = sEOL + "\t" + (f+1) + ". " + oFormInput.options[f].text + " "
	sText += "[" + oFormInput.options[f].value + "]" + sSelected
	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,0,1)){
				if (CheckInputName (oFormC[f],0,1,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"
					}
					if ( sNameInput.indexOf(" ")!=-1 ){
						sText += "ERROR\t["+sNameInput+"]\tTiene espacios en el nombre\n"
					}
					if (sNameInput.toLowerCase()=="submit"){
						sText += "ERROR\t["+sNameInput+"]\tHay un INPUT con name='"+sNameInput+"'\n"
					}
					cTipoForm= sNameInput.substr(0,1).toLowerCase()
					if ( cTipoForm=="p" && cValidacionO=="X"){
						sText += "ERROR\t["+sNameInput+"]\tEl modo de validacion es 'X' y debe ser 'x' en minuscula\n"
					}
					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"
					}
				}
				else{
					sText += "ERROR\t[...]\tHay un INPUT de tipo '"+oFormC[f].type+"' sin 'name' definido\n"
				}
			}
			else{
				sNameInput = oFormC[f].name
				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 && g_sTecladoFuncion && g_bSubmitOn==0){ 
			window.onerror = function ErrorTrapJS(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
			case 123 :			//F11
				DebugInitValues ()
				break
		}
	}
}


function DebugInitValues(){
	if (typeof(a_sFormNames)!="undefined" && a_vFormValues.length) {
		var sHTML = ""
		for (f=0;f<a_sFormNames.length;f++){
			sHTML += (f+1) + ".\t" + a_sFormNames[f] + "\t=\t'" + a_vFormValues[f] + "'\n"
		}
		alert (sHTML)
	}
	else {
		status = "No estan definidos los arrays 'a_sFormNames' y 'a_vFormValues'"
	}
}



//Iniciar esto con la página
function InitTextAreaMaxLength(){
	if (bIE){
		var oForm;
		for(var n=0;n<document.forms.length;n++){
			oForm=document.forms[n];
			for(var i=0;i<oForm.length;i++){
				if(oForm[i].type=="textarea") oForm[i].onkeyup=TextAreaMaxLength;
			}
		}
	}
}

//<TEXTAREA maxlength="50"></TEXTAREA>
function TextAreaMaxLength(){
	if(event.srcElement.value.length>event.srcElement.maxlength){
		var sStr=event.srcElement.value;
		event.srcElement.value=sStr.substring(0,event.srcElement.maxlength);
		ColorForm(event.srcElement,0)	
	}
}

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
//vForm	: oForm / sNombre del formulario
//vSelectX: oSelectX / sNombre del SELECTX
//bMove : 0-copia , 1-mueve
//bAll : copia o mueve todas las opciones
function AddSelected(vForm,vSelect1,vSelect2,bMove,bAll){
	var oForm,oSelect1,oSelect2

	if (typeof(vForm)=="object") oForm = vForm
	else oForm=eval("document.forms."+vForm);
	if (typeof(vSelect1)=="object") oSelect1 = vSelect1
	else oSelect1=eval("oForm."+vSelect1);
	if (typeof(vSelect2)=="object") oSelect2 = vSelect2
	else oSelect2=eval("oForm."+vSelect2);

	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(bMove) oSelect1[nSelC]=null;
				else nSelC++;
			}
			else nSelC++;
		}
		else nSelC++;
	}
}

//Borra las opciones seleccionadas en sCombo
//vForm	: oForm / sNombre del formulario
//vSelect: oSelect / sNombre del SELECT 
//[bAll] : Borra todas las opciones
//[bSelected] : deselecciona/selecciona (por defecto)
//[nOption] : Borra solo esta opcion (este seleccionada o no) 
function DelSelected(vForm,vSelect,bAll,bSelected,nOption){
	var oForm,oSelect

	if (typeof(vForm)=="object") oForm = vForm
	else oForm=eval("document.forms."+vForm);
	if (typeof(vSelect)=="object") oSelect = vSelect
	else oSelect=eval("oForm."+vSelect);

	if (typeof(bSelected)=="undefined") bSelected=1

	if (nOption>=0) {
		oSelect[nOption] = null
	}
	else {
		var nSelC=0;
		while(nSelC<oSelect.length){
			if(bAll || oSelect[nSelC].selected==bSelected) oSelect[nSelC]=null;
			else nSelC++;
		}	
	}
}

//Selecciona opciones de un SELECT multiple
//vForm: oForm / sNombre del formulario
//vSelect: oSelect / sNombre del SELECT 
//bSelected : deselecciona/selecciona
//[a_sValues],[a_sNames] si no se le pasa selecciona todos
function SelectOptions(vForm,vSelect,bSelected,a_vValues,a_sNames){
var bValues,bNames,nSelC,nOpcionText,nOpcionValue,oForm,oSelect
var a_vArray = new Array()

	if (typeof(vForm)=="object") oForm = vForm
	else oForm=eval("document.forms."+vForm);
	if (typeof(vSelect)=="object") oSelect = vSelect
	else oSelect=eval("oForm."+vSelect);

	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
			}
		}
	}
}


//vForm: oForm / sNombre del formulario
//vSelectX: oSelectX / sNombre del SELECTX
function AddSelectedArray(vForm,vSelect1,vSelect2,a_vValues,a_sNames,bMove){
	var oForm,oSelect1,oSelect2

	if (typeof(vForm)=="object") oForm = vForm
	else oForm=eval("document.forms."+vForm);
	if (typeof(vSelect1)=="object") oSelect1 = vSelect1
	else oSelect1=eval("oForm."+vSelect1);
	if (typeof(vSelect2)=="object") oSelect2 = vSelect2
	else oSelect2=eval("oForm."+vSelect2);
	SelectOptions(oForm,oSelect1,1,a_vValues,a_sNames);
	AddSelected(oForm,oSelect1,oSelect2,bMove);
}

//Inserta un valor y un texto en una opcion de un select
//vForm: oForm / sNombre del formulario
//vSelect: oSelect / sNombre del SELECT 
//vValue : Valor del OPTION
//sText: Texto del OPTION
//[bUnico]	No permitir VALUES repetidos
function InsertOption(vForm,vSelect,sValue,sText,bUnico){
	var oForm,oSelect

	if (typeof(vForm)=="object") oForm = vForm
	else oForm=eval("document.forms."+vForm);
	if (!oForm) return

	if (typeof(vSelect)=="object") oSelect = vSelect
	else oSelect=eval("oForm."+vSelect);

	if (bUnico){
		var nSelC=0;
		while(nSelC<oSelect.length){
			if (oSelect.options[nSelC].value== sValue) oSelect[nSelC]=null
			else nSelC++;
		}
	}
	oSelect.options[oSelect.length]=new Option(sText, sValue);
}

function Select2MArray (oSelect){
	var nSelC = 0
	var a_vSelect = [[0],[0]]
	while(nSelC<oSelect.length){
		a_vSelect[0][nSelC] = oSelect.options[nSelC].text
		a_vSelect[1][nSelC] = oSelect.options[nSelC].value
		nSelC++;
	}
	return (a_vSelect)	
}

function OrdenarSelect (oSelect){
	var nPos

	var oForm = oSelect.form
	var sForm = oSelect.form.name

	var sSelect = oSelect.name
	
	var a_vSelect = Select2MArray (oSelect)	
	var a_vTextOrdenado = a_vSelect[0].concat()
	a_vTextOrdenado.sort()
	var a_vValueOrdenado = []
	SelectOptions(oForm,oSelect,1)
	DelSelected(oForm,oSelect,1)
	for (var f=0;f<a_vTextOrdenado.length;f++){
		nPos = BuscaEnArray (a_vSelect[0],a_vTextOrdenado[f],0)
		a_vValueOrdenado[f] = a_vSelect[1][nPos]
//alert (f + "_" + nPos + "_" + a_vTextOrdenado[f] + "_"+a_vSelect[0][nPos])
	}
	Array2Select(a_vValueOrdenado,a_vTextOrdenado,oForm,oSelect)
}

//Inserta en un SELECT todos los valores de un array
//[a_vArray]:
//a_sArray:
//vForm: oForm / sNombre del formulario
//vSelect: oSelect / sNombre del SELECT 
//[bUnico]	No permitir VALUES repetidos
function Array2Select(a_vArray,a_sArray,vForm,vSelect,bUnico){
	var nLen,n,vValue,sText;
	var oForm,oSelect

	if (typeof(vForm)=="object") oForm = vForm
	else oForm=eval("document.forms."+vForm);
	if (typeof(vSelect)=="object") oSelect = vSelect
	else oSelect=eval("oForm."+vSelect);

	if(a_vArray) nLen = a_vArray.length
	nLen = a_sArray.length
	for(var n=0;n<nLen;n++){
		vValue=n;
		if(a_vArray) vValue =a_vArray[n];
		sText = vValue;
		if(a_sArray) sText =a_sArray[n];
		InsertOption(oForm,oSelect,vValue,sText,bUnico);
	}
}


// 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_sInputName,bValidar,bAlguno){		//IsOneOfUs
var sAccion
	if(!IsArray(a_sInputName)) a_sInputName=[a_sInputName];
	var bRelleno=0;
	var bIsInside =0;
	var nInputsRellenos =0;
	var n=0;	
	while (n<a_sInputName.length){				//Relleno
		var oInput = eval("oForm."+a_sInputName[n])
		if (CheckInput(oInput,0,1,1) && GetInputValueChecked(oInput)) {
			bRelleno=1;
			nInputsRellenos++;
		}
		n++;
	}
	var a_sValidar = g_a_sNoValidar
	if (bValidar) a_sValidar=g_a_sSiValidar
	if (SearchPosInArray(a_sValidar,a_sInputName[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_sInputName);
		}
		else{
			for(var n=0;n<a_sInputName.length;n++){
				a_sValidar=DelElement(a_sValidar,a_sInputName[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 (nInputsRellenos);
}



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,cSeparador) {				//1.6 Cambia entre dd/mm/aa y mm/dd/aa
var nBarra1,nBarra2,sDia,sMes,sAnoHora

	if (!sFecha) sFecha = FechaHoy()
	if (!cSeparador) {
		cSeparador = sFecha.substr (1,1)
		if (!isNaN(cSeparador)) cSeparador = sFecha.substr (2,1)
		if (!isNaN(cSeparador)) cSeparador="/"
	}

	nBarra1 = sFecha.indexOf(cSeparador)
	nBarra2 = sFecha.lastIndexOf(cSeparador)

	if (nBarra1!=-1 || nBarra2!=-1){	
		sDia= sFecha.substring(0,nBarra1)
		sMes= sFecha.substring(nBarra1+1,nBarra2)
		sAnoHora = sFecha.substring(nBarra2+1)

		sFecha = sMes + cSeparador + sDia + cSeparador + sAnoHora
	}
	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 VACIOS de tipo D
var nForms,oFormC,f,g,cTipo,vValor
	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)
			vValor = oFormC[g].value
			if (cTipo=="D" && !vValor) oFormC[g].value = FechaHoy()
		}
	}
}


function BuscaEnArray (a_vArray,vValor,bCaseIndepen){
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){
	return( (a_vArray && typeof(a_vArray)=="object" && a_vArray.constructor==Array)? 1 : 0 );
}

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));
}

function ErroresForm(sError,oInput){
var sMsgError;
	sMsgError = "ERROR FORM: " + sError
	if (oInput) sMsgError += "\n\nINPUT: " + DebugInput (oInput,0)

	alert(sMsgError)
}


function Texto2NumeroLib(sNumero){		// 	Genera un Numero a partir de un String - 1.000,5 a 1000.5
	sNumero = "" + sNumero;

	reg = /[\x2e\x25\s]/g
	importe_sin_puntos = sNumero.replace(reg,"");
	importe_coma2punto = importe_sin_puntos.replace(",","\x2e")
	importe_retorno = 1 * importe_coma2punto;
//	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 - 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.
// [nFormato] 1/2 (Español/Ingles)
function Numero2Texto(nNum,nNumDec,nFormato,bForzarDecs){
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;
}

// A partir de HH:MM da Hora y Minutos
function HoraSplit(oForm,sNombre){
	sHora = eval("oForm.hzHora"+sNombre+".value")	
	if (sHora){
		var sHoras = sHora.split(":")
		eval("oForm.S_Hora"+sNombre+".value=parseFloat(sHoras[0])")
		eval("oForm.S_Mins"+sNombre+".value=sHoras[1]")
	}
}

// A partir de Hora y Minutos da HH:MM
function HoraJoin(oForm,sNombre){
	sHora =	eval("oForm.S_Hora"+sNombre+".value")
	sMins =	eval("oForm.S_Mins"+sNombre+".value")

	sHoras = sHora + ":" + sMins
	eval("oForm.hzHora"+sNombre+".value=sHoras")
}

// Activa los INPUT disabled
// bValido: solo los que cumplen las reglas
// bFilled: solo los que estan rellenos
// bEmpty : solo los que estan vacios
// bHidden: permite enable hidden
function InputEnabler (bValido,bFilled,bEmpty,bHidden) {
	var e,f
	var nForms = document.forms.length
	for (e=0;e<nForms;e++) {
		var oFormC=document.forms[e]
		if (!oFormC) return

		for (f=0;f<oFormC.length;f++) {
			if (!bValido || CheckInput (oFormC[f],0,bHidden,1) ){
				if (oFormC[f].disabled) {
					if (!oFormC[f].value) {
						if (bEmpty) oFormC[f].disabled=0
					}
					else{
						if (bFilled) oFormC[f].disabled=0
					}
				}
			}
		}
	}
}


//Cambia el estado de los elementos que queramos
//
//oFormOrElement : Objeto Form o elemento de un form (calcula el form)
//a_sFields		 : Array de campos en los que se aplica el estado
//nState		 : 0-disabled, 1-enabled
function ChangeFieldsState(oFormOrElement, a_sFields, nState, sClassName){
	var oForm="", sError="";
	if(oFormOrElement.form) oForm=oFormOrElement.form;
	else if(oFormOrElement.tagName.toUpperCase()!="FORM") ErrorJS("No se encontró el objeto FORM");
	if(oForm){
		for(var f=0; f<a_sFields.length; f++){
			if(oForm[a_sFields[f]]){
				oForm[a_sFields[f]].disabled=nState;
				if(sClassName) oForm[a_sFields[f]].className=sClassName;
			}
			else sError+=a_sFields[f]+"\n";
		}
	}
	if(sError) ErrorJS("No se encontrarón los campos:\n"+sError);
}
//Usar estas para habilitar y deshabilitar !!!
function EnabledFields(oFormOrElement, a_sFields, sClassName){ ChangeFieldsState(oFormOrElement, a_sFields, 0, sClassName); }
function DisabledFields(oFormOrElement, a_sFields, sClassName){ ChangeFieldsState(oFormOrElement, a_sFields, 1, sClassName); }

//Checkea como obligatorios los campos que le pasemos en el array
//
function CheckNeedFull(oFormOrElement, a_sFields){
	var oForm="", oInput, sError="";
	if(oFormOrElement.form) oForm=oFormOrElement.form;
	else if(oFormOrElement.tagName.toUpperCase()!="FORM") ErrorJS("No se encontró el objeto FORM");
	if(oForm){
		for(var f=0; f<a_sFields.length; f++){
			oInput=oForm[a_sFields[f]];
			if (CheckInput (oInput)) bError=ValidaValor (oInput.name.substring(0,2).toLowerCase(), oInput.value);
			else sError+=a_sFields[f]+"\n";
		}
	}
	if(sError) ErrorJS("No se encontrarón los campos:\n"+sError);
}


// Si son arrays EXML, cargar i_exml.js y usar CreaComboEXML()
// vTitulo : permite un string 'sTitulo' o un array [sTitulo,sValue]
// 	Modo 1: Array
// 		a_sNombre (pasa de los valores nulos del array de textos)
// 		a_sValor: array de valores
//			-1 = usa el valor siguiente de a_sNombre
//			 X = usa pos del array+X
// 	Modo 2: MArray
// 		[a_sNombre,nCol,(nCols)]		(nCols=2)
// 		[a_sValor ,nCol,(nCols)]		(nCols=2)
// vValorSelected --> "Valor1" ó "Valor2" ... (es el que aparece por defecto)
function CreaCombo(sSelectName,sFuncion,vTitulo,a_sNombre,a_sValor,vValorSelected) {
	var i,nValue
	var nValor=0
	if (a_sValor==-1) {
		a_sValor=a_sNombre
		nValor=1
	}

	if (IsArray(a_sNombre[0])) a_sNombre = GetCol (a_sNombre[0],a_sNombre[1],a_sNombre[2])
	if (IsArray(a_sValor[0])) a_sValor = GetCol (a_sValor[0],a_sValor[1],a_sValor[2])

	if (typeof(a_sValor)=="number") {
		nValue=a_sValor
		a_sValor=new Array()
		for (i=0;i<a_sNombre.length;i++){	// X
			a_sValor[i]=i+nValue
		}
	}

	var sCombo ='<SELECT name="'+sSelectName+'"'
	if (sFuncion) sCombo+= " " +sFuncion
	sCombo+='>'

	if (vTitulo!=""){
		var sTitulo=vTitulo
		var sValue=""
		if (IsArray(vTitulo)){
			sTitulo = vTitulo[0]
			sValue = vTitulo[1]
		}
		sCombo += "<OPTION value='"+sValue+"'"
		if (vValorSelected && (sTitulo==vValorSelected || sValue==vValorSelected)) sCombo +=" selected"
		sCombo += ">" + sTitulo + "</OPTION>"
	}

	for (i=0;i<a_sNombre.length-nValor;i+=1+nValor){
		if (a_sNombre[i]){
			sCombo += "<OPTION "
			sCombo += 'value="' + a_sValor[i+nValor] + '"'
			if (vValorSelected && (a_sValor[i+nValor]==vValorSelected || a_sNombre[i]==vValorSelected)) sCombo +=" selected"
			sCombo += ">" + a_sNombre[i] + "</OPTION>"
		}
	}
	sCombo+='</SELECT>'
	return sCombo
}

function GetCol (a_vArray,nCol,nCols){
	var a_vCol = []
	var g=0
	if (!nCols) nCols=2
	nCol = parseInt (nCol)
	nCols = parseInt (nCols)
	for (var f=0;f<a_vArray.length;f=f+nCols){
		a_vCol [g++] = a_vArray[f+nCol] 	
	}
	return (a_vCol)
}


function TestFuncionZ(oInput){			//Prueba de funcion para Tipo Z
var sError=""
var vValor = oInput.value
	if (vValor=="EVIL") {
		sError="ERROR: Te he dicho que el campo " + oInput.name + " no admite el valor:" + vValor
	}
	else{
		status += ("TestFuncionZ() Value="+ vValor + " (nunca uses el valor EVIL)")
	}
	return sError
}

function SetVisibAllSelect(bShow){
	var oForm, oFormObject, sVisib=(bShow)? "visible" : "hidden";
	for(var n=0;n<document.forms.length;n++){
		oForm=document.forms[n];
		for(var i=0;i<oForm.length;i++){
			oFormObject=oForm[i];
			if(oFormObject.type=="select-one" || oFormObject.type=="select-multiple"){
				oFormObject=oFormObject.style;
				oFormObject.visibility=sVisib;
			}
		}
	}
}
function SetShowAllSelect(){
	SetVisibAllSelect(1);
}
function SetHideAllSelect(){
	SetVisibAllSelect(0);
}

function InitFixAtSubmit(){
	g_a_vFixAtSubmit = []
}

function AddFixAtSubmit(sInput,vValue){
	var nLen = g_a_vFixAtSubmit.length
	g_a_vFixAtSubmit [nLen++] = sInput
	g_a_vFixAtSubmit [nLen] = vValue
}

function FixAtSubmit(oForm){
	var sInput
	for (var f=0;f<g_a_vFixAtSubmit.length;f=f+2){
		if (g_a_vFixAtSubmit [f+1]=="Tipo_Y") SelectOptions(oForm,g_a_vFixAtSubmit[f],1)
		else SetInputValue(eval("oForm."+g_a_vFixAtSubmit[f]),g_a_vFixAtSubmit [f+1])
	}
}

function AbrirCalendario(sField,sURL,nPosX,nPosY){
	var nMousePosX, nMousePosY;
	if(!sURL) sURL ="calendario.html";
	if(!nPosX) nPosX=50;
	if(!nPosY) nPosY=50;

	if(oIFormShield.m_bIE){
		nPosX=oIFormShield.m_nMousePosX+top.window.screenLeft+20
		nPosY=oIFormShield.m_nMousePosY+top.window.screenTop-50
	}
	window.open(sURL+"?input="+sField+"&modo=0","wCalendario","left="+nPosX+",top="+nPosY+",width=250,height=160");
}

function IFormMouseMove(e){
	oIFormShield.m_nMousePosX=event.clientX;
	oIFormShield.m_nMousePosY=event.clientY;
}

//Capa que protege el formulario una vez ha sido validado y enviado
oIFormShield=new function (){
var oUserAgent = navigator.userAgent.toLowerCase();
	this.m_bGecko= (oUserAgent.indexOf('gecko') != -1);
	this.m_bNS	 =	this.m_bGecko;
	this.m_bNS4 = ( (this.m_bGecko) ? (oUserAgent.indexOf('netscape') != -1) : ( (oUserAgent.indexOf('mozilla') != -1) && (oUserAgent.indexOf('spoofer') == -1) && (oUserAgent.indexOf('compatible') == -1) && (oUserAgent.indexOf('opera') == -1) && (oUserAgent.indexOf('webtv') == -1) && (oUserAgent.indexOf('hotjava') == -1) ) );
	this.m_bIE = ( (oUserAgent.indexOf("msie") != -1) && (oUserAgent.indexOf("opera") == -1) && (oUserAgent.indexOf("webtv") == -1) );
	this.m_bIE4 = (this.m_bIE && !document.getElementById)? 1 : 0;

	if(this.m_bIE) document.onmousemove=IFormMouseMove;
		
	this.m_sBase="IFormShield";
	this.m_sObj ="o"+this.m_sBase;
	this.m_sId ="L"+this.m_sBase;
	if(this.m_bIE || this.m_bNS) this.m_sElement="document.getElementById('"+this.m_sId+"')";
	if(this.m_bIE4) this.m_sElement="document.all['"+this.m_sId+"']";
	this.m_sLay=this.m_sElement+".style";

	this.f_setShow=function (){
		eval(this.m_sLay+".visibility='visible'");
	}
	this.f_setHide=function (){
		eval(this.m_sLay+".visibility='hidden'");
	}
	this.f_innerHTML=function (sInner,sId){
		this.m_sInnerHTML=sInner;
		eval(this.m_sElement+".innerHTML=this.m_sInnerHTML");
	}

	this.f_setEnabled=function (){
		if(this.m_bNS4) return 0;
		var nWinSizeX=(this.m_bIE)? document.body.clientWidth : window.innerWidth;
		var nWinSizeY=(this.m_bIE)? document.body.clientHeight : window.innerHeight;
		var nScrollX =document.body.scrollWidth;
		var nScrollY =document.body.scrollHeight;
		var nPosX	 =(nScrollX/2)+document.body.scrollLeft;
		var nPosY	 =(nScrollY/2)+document.body.scrollTop;
		
		var sHTML="";

		sHTML+="<SPAN id='"+oIFormShield.m_sId+"' style='position: absolute; top: 0; left: 0; z-index: 50; width: "+nScrollX+"; height: "+nScrollY+"'>";
		sHTML+="<TABLE cellpadding='5' cellspacing='0' border='0' width='"+ nScrollX +"' height='"+nScrollY+"'>";
		if(this.m_bNS) sHTML+="<TR><TD height='50%'>&#160;</TD></TR>";
		sHTML+="<TR>";
		sHTML+="<TD bgcolor='"+g_sShieldBGColor+"' height='50' valign='top'>&#160;</TD>";
		sHTML+="</TR>";
		if(this.m_bNS) sHTML+="<TR><TD height='50%'>&#160;</TD></TR>";
		sHTML+="</TABLE>";
		sHTML+="</SPAN>";

		sHTML+="<SPAN id='"+oIFormShield.m_sId+"Txt' style='position: absolute; top: "+nPosY+"; left: "+(nPosX-50)+"; z-index: 51;'>";
		sHTML+=g_sShieldInner;
		sHTML+="</SPAN>";

		var oSpan=document.createElement("SPAN");
		oSpan.innerHTML=sHTML
		document.body.appendChild(oSpan);

		if(this.m_bIE){
			SetHideAllSelect();
			eval(this.m_sLay+".filter='alpha(opacity="+g_nShieldAlpha+")'");
		}
	}
}
