i_form_nVersion=1.369;

/*
	©2006 Intelygenz - www.intelygenz.com
	[INFO] 	 M:\ig_intelygenz\ig05_intranet\desarrollo\areas\dev\docs\i_form.txt
	[UPDATE] M:\ig_intelygenz\ig05_intranet\desarrollo\areas\dev\libs\js\i_form.js

	i_lang_es.js / 	i_lang_en.js
*/

g_bShield = 1;
g_sShieldBGColor="#F0F0F0";
g_sShieldInner ="<FONT color='#505050' size='2'><B>Procesando datos . . .</B></FONT>";
g_nShieldAlpha =80;

g_sTecladoFuncion = "ComprobarForm"
g_bSelectSubmit = 1
g_bControlKeys = 1
g_bTextareaTabKey = 0
g_bAutoFocus = 1
g_bAutofixM = 1
g_bNullAs0M = 0
g_bInitEnabler	= [0,[0,0,0,0]]
g_bSubmitEnabler= [0,[0,0,0,0]]
g_nAllErrors = 0
g_bRellenarAll = 0
g_bInputMismoNombre=0
g_sParentNodeVisible = ""
g_bAvisarCambios= 0
g_a_sAvisarCambios = []
g_bAddPrefix = 1
g_bClearAutoCheckbox = 0

g_sFormatoFechaInD	= ""					//"YMD" a_sDateTypes
g_sFormatoFechaInF	= ""
g_sFormatoFechaInG	= ""
g_sFormatoFechaShowD	= "nDD/nMM/nYYYY"	//"nYYYYnMMnDD nHH24:nMMN" m_a_sDateChars
g_sFormatoFechaShowF	= "nDD/nMM/nYYYY"
g_sFormatoFechaShowG	= "nDD/nMM/nYYYY"
g_sFormatoFechaD = ""
g_sFormatoFechaF = ""
g_sFormatoFechaG = ""

g_nFormatoFechaD = 0		//DEP
g_nFormatoFechaF = 0		//DEP
g_nY2K = 20

sColorForm 	= "#ffffff"		//=""
sColorOK 	= "#e7e7e7"
sColorActivo= "#c4c4c4"
sColorError	= "#ffc4c4"
sColorObligatorio	= "#f0f080"

g_a_sNoValidar 		= []
g_a_sSiValidar 		= []
g_a_sSiValidarExt	= []
a_cValidos_B = [" ","_","Á","É","Í","Ó","Ú","Ñ",",",";",".",":","+","-","@"]
a_sError = []
a_vTamanoLimitado= []
a_vValorLimitado = []
g_a_sAutoCorregir = []
g_ma_sInitValues = [["name","value"],[]]
g_bInitValuesSinPrefijo = 0
g_sAlertas = ""

/*
if (typeof(oIGZ)!="undefined") 	{
	oIGZ.f_loadLib("i_form",i_form_nVersion);
	oIGZ.f_require ("i_core",0.710);
}
else{
	try{
		g_sLang = IsUndefined( g_sLang ) || IsNull( g_sLang ) ? "es" : g_sLang;
	}catch( e ){
		g_sLang = "es"
	}
//dificil encontrar path correcto en servidores compartidos como Aspirina !!!
	document.write ("<SCRIPT language='JavaScript' charset='iso-8859-1' src='/libs/js/i_lang_"+g_sLang + ".js'></SCRIPT>\n");
}
*/
try{
	g_sLang = IsUndefined( g_sLang ) || IsNull( g_sLang ) ? "es" : g_sLang;
}catch( e ){
	g_sLang = "es"
}

if (typeof(oIGZ)!="undefined") 	{
	oIGZ.f_loadLib ("i_form",i_form_nVersion);
	oIGZ.f_require ("i_core",0.783);
	oIGZ.f_require ("i_lang_"+g_sLang,1.015);
}else{
	document.write ("<SCRIPT language='JavaScript' charset='iso-8859-1' src='/libs/js/i_lang_"+g_sLang + ".js'></SCRIPT>\n");
}


oIForm=new function(){
	this.m_sObj="oIForm";
	this.m_nVersion=i_form_nVersion;
	this.m_oForm
	this.m_sInputName
	this.m_maValues = []
	this.m_sFechaMax = "31/12/9999"
	
	this.m_nFile2Text = 0
	this.bForceDateFormat = 1		//1.363
}

oISelect = new function (){
	this.f_add = function (oSelect, sText, vValue, nPos, bUnique){
		var oOption = new Option(sText, vValue);
		oSelect.options[oSelect.options.length] = oOption;
	}

	this.f_del = function (oSelect, sText, vValue, bOR){
		var nPos = this.f_indexOf(oSelect, sText, vValue, bOR);
		if ( nPos != -1 ) {
			oSelect.options[nPos] = null;
		}
	}

	this.f_set = function (oSelect, sText, vValue, bOR){
		var nPos = this.f_indexOf(oSelect, sText, vValue, bOR);
		if ( nPos != -1 ) {
			oSelect.selectedIndex = nPos;
		}
	}

	this.f_indexOf = function (oSelect, sText, vValue, bOR) {
		var a_oOptions = oSelect.options;
		var f = -1, F = a_oOptions.length;
		var nPos = f;

		if ( !IsNull(sText) && !IsNull(vValue) ) {
			if ( IsNull(bOR) || !bOR) {
				while ( nPos == -1 && ++f < F ) {
					if ( a_oOptions[f].text == sText
					  && a_oOptions[f].value == vValue
					   ) nPos = f;
				}
			}
			else {
				while ( nPos == -1 && ++f < F ) {
					if ( a_oOptions[f].text == sText
					  || a_oOptions[f].value == vValue
					   ) nPos = f;
				}
			}
		}
		else if( !IsNull(sText) ) {
			while ( nPos == -1 && ++f < F ) {
				if ( a_oOptions[f].text == sText ) nPos = f;
			}
		}
		else if( !IsNull(vValue) ) {			
			while ( nPos == -1 && ++f < F ) {
				if ( a_oOptions[f].value == vValue ) nPos = f;
			}
		}
		return ( nPos );
	}
}

var g_oOnErrorEvent=window.onerror;
document.write ("<SCRIPT>bNS=(document.layers)? true:false;</SCRIPT>")			//NS4
bIE=(document.all)? true:false;

var g_vTimeoutID,g_sColorForm;
var g_bCamposVacios;
var g_sErrorFormName,g_sErrorInputName,	g_sErrorInput
var g_sErrorValue,g_sErrorText,g_sAllErrorsText,g_ErrorTipo
var g_oInputError
var g_a_vFixAtSubmit = []
var g_bSubmitOn=0

if(typeof(oIGZ)!="undefined" && oIGZ.m_nVersion>=0.530) {
	new oIGZ.f_keyEvent (["ENTER"], TeclaPulsada );
	new oIGZ.f_keyEvent (["CTRL","F7"], TeclaPulsadaF7 );
	new oIGZ.f_keyEvent (["CTRL","F8"], TeclaPulsadaF8 );
	new oIGZ.f_keyEvent (["CTRL","F9"], TeclaPulsadaF9 );
	new oIGZ.f_keyEvent (["CTRL","F10"], TeclaPulsadaF10 );
	if (bIE) new oIGZ.f_keyEvent (["SHIFT","TAB"], TeclaPulsadaTAB );
}
else{
	if (bIE) document.onkeyup = TeclaPulsada;
	else document.onkeypress = TeclaPulsada;
}

//	[oForm],[nFormSize],[bInitColor],[bSinPrefijo],[vArrayBase]
function InitForm(oForm,nFormSize,bInitColor,bSinPrefijo,vArrayBase){
	if (typeof(bSinPrefijo)=='undefined') bSinPrefijo=1
	oForm=GetForm(oForm)
	if (typeof(oForm)!="object"){
		if (typeof(oForm)!='undefined') ErroresForm("[i_form.InitForm] No existe el FORM de nombre '"+ oForm +"' pasado a 'InitForm()'")
		return
	}

//	oIForm.f_resetAutoCheckmark (oForm)
	if (g_bClearAutoCheckbox) oIForm.f_clearAutoCheckmark (oForm)
//	GetForm (oForm)
	if ( typeof(a_sFormNames)!="undefined" || typeof(maFormNamesValues)!="undefined" || vArrayBase){
		if (!vArrayBase && typeof(maFormNamesValues)!="undefined") vArrayBase = maFormNamesValues
		RellenarForms(oForm,vArrayBase,bSinPrefijo)
		if (g_bInitEnabler[0]) InputEnabler (g_bInitEnabler[1][0],g_bInitEnabler[1][1],g_bInitEnabler[1][2],g_bInitEnabler[1][3], oForm)
	}
	AutoInitInput(oForm);
	if (g_bAvisarCambios) {
		if (typeof(oIGZ)!="undefined") {
			oIGZ.m_a_sPostStartUps[oIGZ.m_a_sPostStartUps.length] = "GetInitValues();";
		}
		else {
			GetInitValues(oForm)
		}
		StartSalirSinGuardar()
	}

	if (bInitColor) InitColor(oForm)
	if (nFormSize) FormResize(oForm,nFormSize)
	InitTextAreaMaxLength()

	if (g_bAutoFocus) AutoFocus(oForm)
}

function StartSalirSinGuardar() {
	window.onbeforeunload=SalirSinGuardar
}

function StopSalirSinGuardar() {
	window.onbeforeunload=null
}

function SalirSinGuardar() {
	var nCambios = CompareInitValues ()
	if (nCambios) {
		var cPlural = ""
		if (nCambios>1) cPlural = "s"
		return oIGZ.f_langText("SalirSinGuardar", [nCambios, cPlural]);
	}
}

function GetInitValues (oForm) {
	var n=0
	var oInput
	oForm = GetForm (oForm)
	for (var i=0;i<oForm.length;i++) {
		oInput = oForm.elements[i]
		if (ValidarInput (oInput,0,g_bInitValuesSinPrefijo)) {
			g_ma_sInitValues.f_maSetVal ("name", oInput.name, n)
			g_ma_sInitValues.f_maSetVal ("value", GetInputValueChecked(oInput), n)
			n++
		}
	}
}

function CompareInitValues (oForm) {
	var oInput,sInputName,nPos,sInputValue,nCambios=0
//	var n=0
	var a_sInfo = []
	var a_sInputNames = []
	oForm = GetForm(oForm)
//	if (!oForm) oForm=GetForm()

	for (var i=0;i<oForm.length;i++) {
		oInput = oForm.elements[i]
		if (ValidarInput (oInput,0,g_bInitValuesSinPrefijo)) {
			sInputName = oInput.name
			if (g_bAvisarCambios>=2) {
				nPos = BuscaArray (g_a_sAvisarCambios,sInputName)
				if ((g_bAvisarCambios==2 && nPos==-1) || (g_bAvisarCambios==3 && nPos!=-1)) {
					continue
				}
			}
			sInputValue = GetInputValueChecked(oInput)
//if (sInputValue!=g_ma_sInitValues.f_maGetValIf ("value","name",sInputName)) alert (sInputValue +"\nOLD:"+g_ma_sInitValues.f_maGetVal ("value", n) + "\nNEW:" + g_ma_sInitValues.f_maGetValIf ("value","name",sInputName))
//1.137			if (sInputValue!=g_ma_sInitValues.f_maGetVal ("value", n) ){
			if (sInputValue!=g_ma_sInitValues.f_maGetValIf ("value","name",sInputName) ){
				nCambios++
				a_sInfo[nCambios]= "" +sInputName +": [OLD:"+ g_ma_sInitValues.f_maGetValIf ("value","name",sInputName)+"=NOW:"+sInputValue+"]"
			}
//			n++
		}
	}
	return (nCambios)
}


function InitDateFormat (a_sFormNames,a_sInputs,sInputFormat,sFormat) {
	var f,nPos
	if (typeof(oIGZ)!="undefined") {
		for (f=0;f<a_sInputs.length;f++){
			nPos = BuscaArray (a_sFormNames,a_sInputs[f])
			if (nPos !=-1 && a_vFormValues[nPos]){
				a_vFormValues[nPos] = a_vFormValues[nPos].f_toDateDraw  (sInputFormat,sFormat)
			}
		}
	}
}

function GetForm(oForm){
	if (!oForm) {
		if (oIForm.m_oForm) {
			oForm = oIForm.m_oForm
		}
		else {
			var nForms = document.forms.length
			if (nForms) {
				oForm=document.forms[0]
				if(oForm.name=="FORM_iCalendar") oForm=document.forms[1];					//Muy importante para iCalendar !!!
				if (nForms>1) g_sAlertas += "* Esta página tiene "+nForms+" FORMs\n"
			}
		}
	}
	oIForm.m_oForm = oForm
	return oForm
}


//nModo 1=Avisar cambios/2=Restaurar valores
//nXJS  1 - Envia por XJS / 2 - Abre el resultado del XJS en ventana nueva (Solo Debug)
function SubmitForm(oForm, bShield, nModo, nXJS, f_xjsOnLoad){
	var	bAvisarCambios=g_bAvisarCambios
	if (nModo==1) {
		bAvisarCambios=1
	}
	else {
		bAvisarCambios=0
		StopSalirSinGuardar()
	}

	if (g_bSubmitOn) return
	g_bSubmitOn = 1
	oForm=GetForm(oForm)
	if (typeof(oForm)!="object"){
		ErroresForm("[i_form.SubmitForm] No existe el FORM de nombre '"+ oForm +"' pasado a 'SubmitForm()'")
		g_bSubmitOn = 0
		return
	}
	else{
		if (nModo==2) GetInitValues (oForm)
		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 (IsNull(bShield)) bShield=g_bShield

//1.312 el IF debia estar por alguna razon, ¿pero si lo ponemos no muestra los errores al hacer submit con un GET? !!!
//		window.onerror = function ErrorTrapJS(sError,sURL,nLinea) { var sFullError="[i_form.SubmitForm] al hacer el SUBMIT con METHOD='"+oForm.method +"'\n\n"+sURL+"\nLinea "+nLinea + " : " + sError; if (!g_bAvisarCambios && sError!="Error no especificado.") ErroresForm (sFullError,oForm[0]); return (true);}
		window.onerror = function ErrorTrapJS(sError,sURL,nLinea) { var sFullError="[i_form.SubmitForm] al hacer el SUBMIT con METHOD='"+oForm.method +"'\n\n"+sURL+"\nLinea "+nLinea + " : " + sError +"\nRevisar nombre del FORM por caracteres especiales como (_+*/...)"; ErroresForm (sFullError,oForm); return (true);}

		if (bAvisarCambios) g_bSubmitOn = 0
		if (nXJS) {
			switch(nXJS) {
				case 1 :
					if (bShield) oIFormShield.f_setShow();
					oXJS.f_load(oForm.action+"?xjs=1&", function (){
																	g_bSubmitOn = 0;
																	if (bShield) oIFormShield.f_setHide();
																	if (f_xjsOnLoad) f_xjsOnLoad();
															}
								, oForm
								);
					break;
				case 2 :
					oForm.target = "_blank";
					oForm.action = oForm.action+"?xjs=1";
					oForm.submit();
					break;
			}
		}
		else {
			oForm.submit();
		}
//A partir de aqui solo se hace si hay Submit
		if (bShield) {
			oIFormShield.f_setShow();
			g_bSubmitOn = 1
		}
		if (nModo==2) {
			RellenarForms(oForm,[g_ma_sInitValues.f_maGetCol ("name"), g_ma_sInitValues.f_maGetCol ("value") ])
		}
/* para que valia esto? !!!
		if (bAvisarCambios) {
			StopSalirSinGuardar()
			setTimeout ("StartSalirSinGuardar()",300)
		}
*/
		window.onerror=g_oOnErrorEvent
	}
}

oIForm.f_afterSubmit = function (oForm) {	//1.366
	oForm=GetForm(oForm)

	oIForm.f_resetAutoCheckmark (oForm)
	oIForm.f_resetFixAtSubmit (oForm)
	oIForm.f_resetColor(oForm)
	oIFormShield.f_setHide();	
	g_bSubmitOn = 0
}

function InitFormValidar(oForm,nFormSize,bInitColor){			//DEP
	status += ("[i_form.js] Usar InitForm()")
	InitForm(oForm,nFormSize,bInitColor)
}
function InitValidarForm(oForm,nFormSize){						//DEP
	InitFormValidar(oForm,nFormSize,1)
}

//[a_sInput]
function ValidarForm (oForm,a_sInput) {
var oInput, oInputError, sInputType
	if (g_bSubmitOn) return
	oForm=GetForm(oForm)
	if (typeof(oForm)!="object"){
		ErroresForm("[i_form.ValidarForm] No existe el FORM de nombre '"+ oForm +"' pasado a 'ValidarForm()'")
		return
	}
/*
	if (oIForm.m_oForm!=GetForm(oForm)) {
		g_sColorForm=""
		oIForm.m_oForm = oForm
	}
*/
	InitFixAtSubmit()
	ResetCampo()
	InitColor(oForm)
	g_bCamposVacios=1
	var bError = false;
	var nErrors = 0;
	var formC=0
	g_oInputError = ""
	g_sAllErrorsText = ""

	while ((!nErrors || (nErrors && g_nAllErrors)) && formC<oForm.length) {
		oInput = oForm[formC]

		if (!a_sInput || a_sInput.f_indexOf (oInput.name)!=-1) {
			var 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()
	var bError=ValidaCampo (oInput)
	if (bError) CampoError(oInput)
	return (bError)
}

function ActivarCampo (oCampo) {
	if (!bNS){
		ResetCampo()
		var sNameForm = oCampo.name
		g_sColorForm =  oCampo.form[sNameForm].style.backgroundColor = oCampo.style.backgroundColor
		if (sColorActivo && sColorForm) CicloColores(sNameForm,sColorForm,sColorActivo,20,40,0)
	}
}

function ValidarCheckmarks(oForm){
	var formC=0
	while (formC<oForm.length) {
		oIForm.f_validarCheckmark (oForm[formC++])
	}
}

oIForm.f_validarCheckmark = function (oInput){
	var cTipo,bValor,vValor 
	if (CheckInputName(oInput)){
		cTipo = oInput.name.substr(0,1)
		if (cTipo=="K" || (cTipo=="k" && oInput.checked)){
			bValor=0
			if (oInput.checked) {
				bValor = 1
				vValor = oInput.value
				if (vValor && !(vValor=="0" || vValor=="False" || vValor=="Falso" || vValor=="on")) bValor = vValor
			}
/*
			else if (cTipo=="K"){
//alert (oInput.name)
				oInput.setAttribute("K_auto", 1);
			}	
*/
			oInput.checked = true
			oInput.value = bValor
		}
	}
}

oIForm.f_resetAutoCheckmark = function (oForm){
	var oInput;
	var formC=0
	while (formC<oForm.length) {
		oInput = oForm[formC++]
		if (CheckInputName(oInput) && GetObjAttribute(oInput,"K_auto") ){
//alert (oInput.name)
			oInput.checked = false;
		}
	}
}

oIForm.f_clearAutoCheckmark = function (oForm,bForce){
	var oInput;
	var formC=0
	while (formC<oForm.length) {
		oInput = oForm[formC++]
		if (CheckInputName(oInput) && (bForce || oInput.name.substr(0,1)=="K") ){
			oInput.checked = false;
		}
	}
}

function InitCheckmarks(oForm){
	var oInput,cTipo
	var formC=0
	oForm =  GetForm(oForm);
	while (formC<oForm.length) {
		oInput = oForm[formC]
		if (CheckInputName(oInput)){
			cTipo = oInput.name.substr(0,1)
			if (cTipo=="K" && oInput.checked && oInput.value==0) oInput.checked = false
		}
		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++
		}
	}
}

// oInput,[vValueForm]
function ValidaCampo(oInput,vValueForm,bFixInput){
	var bError=0
	if (g_sParentNodeVisible=="" || ParentNodeVisible (oInput,g_sParentNodeVisible)) {
		if (CheckInputName(oInput,0,1,0)){
			if (typeof(vValueForm)=="undefined") vValueForm = oInput.value
			var sNameForm = oInput.name
			GetForm (oInput.form)
			oIForm.m_sInputName = sNameForm
			bError=(ValidaValor (sNameForm,vValueForm,oInput,bFixInput))
			var cValidacion = sNameForm.substr(1,1)
			if (!bError && (cValidacion=="_" || cValidacion=="x")) {
				ColorForm (oInput,1)
			}
		}
	}
	if (!bError) {		// Error en pantalla en vez de alert
		var sElementId = GetObjAttribute(oInput,"m_sErrorTextElementId")
		if (sElementId){
			var oErrorTextElement = document.getElementById(sElementId);
			if (oErrorTextElement!=null) oErrorTextElement.innerHTML = "";
		}
	}
	return bError
}

function ParentNodeVisible (oInput,sTag) {
	var bVisible = 1
	var oObj = GetParentNode(oInput, sTag)
	if (oObj && ( oObj.style.visibility == "hidden" ||  oObj.style.display == "none")){
		var bVisible = 0
	}
	return (bVisible)
}


function GetPrefixFromType( oInput ){
	var cTipoForm
	switch( oInput.tipo.toLowerCase() ){
		case "alfanumérico":case "alfanumerico":case "cadena":
			cTipoForm = "A";
			break;
		case "numérico":case "numerico":case "numero":case "número":
			cTipoForm = "M";
			break;
		case "correo":case "email":
			cTipoForm = "E";
			break;
		case "codigo postal":case "cp":case"código postal":
			cTipoForm = "C";
			break;
		case "fecha":
			cTipoForm = "G";
			break;
		case "hora":
			cTipoForm = "H";
			break;
		case "password": case "contraseña":
			cTipoForm = "P";
			break;
		default:
			try{
				var sInputType = typeof( oInput.length ) != "undefined" && typeof( oInput.name ) == "undefined" ? "radio" : oInputRelacionado.type.toLowerCase();
				switch (sInputType){
					case "text": case "password": case "file":
						cTipoForm = "a";
						break;
					case "checkbox":
						cTipoForm = "k";
						break;
					case "select-one": case "select-multiple":
						cTipoForm = "s";
						break;
					case "radio":
						cTipoForm = "r";
						break;
					default:
						cTipoForm = "";
				}
			}catch( e ){
				cTipoForm = "";
			}
			break;
	}
	return cTipoForm;
}


function GetObjAttribute( oObj,sAtributo ){
	sReturn = null
	if ( !IsNull ( oObj ) ) {
		sReturn = oObj.getAttribute(sAtributo)
	}
	return sReturn;
}

function SetObjAttribute( oObj,sAtributo,sVal ){
	if ( !IsNull ( oObj ) ) {
		oObj.setAttribute(sAtributo,sVal)
	}
}

function EsCampoNumerico( oInput ){
	var cInTipoForm= oInput.name.substr(0,1)
	if ( GetObjAttribute( oInput,"tipo" ) != null ){
		cInTipoForm = GetPrefixFromType( oInput );
	}
	switch (cInTipoForm){
		case "M": case "N": case "Q": case "O":
		return true;
	}
	return false;
}

//bFixInput : existe oInput y modificamos su valor para normalizarlo
//NO tienen porque existir los valores que le pasamos (ni Form ni Value)
function ValidaValor (sNameForm,vValueForm,oInput,bFixInput){
	var oForm
	var sInputType;
	var bError = false;
	var bValidar=0
	var bFormValido = 0				// Existe el Input?

	if (!IsNull(oInput)){
		sNameForm = oInput.name
		sInputType = oInput.type.toLowerCase()
		bFormValido = CheckInput (oInput,0,1)
		oForm = oInput.form
	}
	else {
		oInput = null
		if (CheckInput (sNameForm,0,1)) bFormValido =1
	}
	oIForm.m_sInputName = sNameForm
	var cValidacion = sNameForm.substr(1,1)
	var cTipoForm= sNameForm.substr(0,1)
	var nPosInput = BuscaArray (g_a_sSiValidarExt,sNameForm)
	if (nPosInput!=-1) {
		if (g_a_sSiValidarExt[nPosInput+1]) cTipoForm = g_a_sSiValidarExt[nPosInput+1]
		bValidar=1
	}
	if (cValidacion=="_" || cValidacion=="x") bValidar=1

	var sAttValidar = GetObjAttribute( oInput,"validar" )
	if ( sAttValidar != null ){
		if ( sAttValidar == "no" || sAttValidar == "0" ){
			bValidar = 0;
		}else{
			bValidar = 1;
		}
	}
	if ( GetObjAttribute( oInput,"tipo" ) != null ) bValidar = 1;
	if ( GetObjAttribute( oInput,"funcion_validar" ) != null || GetObjAttribute( oInput,"expresion_validar" ) != null ) bValidar = 1;
	if (bValidar && sInputType=="file" && vValueForm=="") {
		vValueForm = GetFormValue (oInput)
	}

	if (bValidar){
		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

		if ( GetObjAttribute( oInput,"tipo" ) != null ) {
			cTipoForm = GetPrefixFromType( oInput );
		}

		if ( (cTipoForm == cTipoForm.toLowerCase() && !vValueForm && cTipoForm!="f") || cTipoForm=="r") bValidar=0

		if ( ( sAttObligatorio = GetObjAttribute( oInput,"obligatorio" ) ) != null ){
			if ( sAttObligatorio == "si" || sAttObligatorio == 1 ){
				bValidar = true;
			}
			else if ( sAttObligatorio != "no" && sAttObligatorio != "0" ){
				var bCumple;
				try{
				  bCumple = eval( sAttObligatorio );
				}
				catch( ine ){
				}
				if ( typeof( bCumple ) == "boolean" ){
					bValidar = bCumple;
				}
				else{
					try{
						oInputRelacionado = oForm[oInput.obligatorio];
						if ( typeof( oInputRelacionado.length ) != "undefined" || CheckInput(oInputRelacionado,0,1) ){
							var sInputRelType = typeof( oInputRelacionado.length ) != "undefined" && typeof( oInputRelacionado.name ) == "undefined" ? "radio" : oInputRelacionado.type.toLowerCase();
							switch (sInputRelType){
								case "text": case "password": case "hidden": case "file":
									bValidar = ( !EsCampoNumerico( oInputRelacionado ) && oInputRelacionado.value != "" ) || ( g_bNullAs0M && Texto2Numero( oInputRelacionado.value ) != 0 );
									break;
								case "checkbox": case "select-one": case "select-multiple":
									bValidar = GetInputValueChecked( oInputRelacionado );
									break;
								case "radio":
									bValidar = CheckRadios( oInputRelacionado ) ? 1 : 0;
									break;
								default:
							}
						}else{
							bValidar = vValueForm == "" ? false : true;
						}
					}catch( e ){
						bValidar = vValueForm == "" ? false : true;
					}
				}
			}else{
				bValidar = vValueForm == "" ? false : true;
			}
		}
	}

	if (BuscaArray (g_a_sNoValidar,sNameForm)!=-1) bValidar=0
	if (BuscaArray (g_a_sSiValidar,sNameForm)!=-1) bValidar=1

	if ( bValidar ){
		bError = false;
		bSaltarValidacion = false;
		if ( ( sAttMinLength = GetObjAttribute( oInput,"minlength" ) ) != null ){
			var nMinLength = parseInt( sAttMinLength );
			if ( vValueForm && vValueForm.length < nMinLength ){
				bError = true;
				g_sErrorText= oIGZ.f_langText("CorregirLongitud", [nMinLength] );
			}
		}

		if ( ( sAttIncVal = GetObjAttribute( oInput,"incluir_valores" ) ) != null ){
			eval( "var a_nIncluir = [ " + sAttIncVal + " ]" );
			var nValido = BuscaArray( a_nIncluir, vValueForm );
			if ( nValido >= 0 ){
				bSaltarValidacion = true;
			}
		}

		if ( ( sAttFuncVal = GetObjAttribute( oInput,"funcion_validar" ) ) != null ){
			bSaltarValidacion = 1;
			eval( "sError = " + sAttFuncVal + "( vValueForm )" );
			if (sError) {
				bError = true;
				g_sErrorText= sError
			}
		}else if ( ( sAttExprVal = GetObjAttribute( oInput,"expresion_validar" ) ) != null ){
			bSaltarValidacion = 1;
			re = eval( "re="+sAttExprVal );
			if (!vValueForm.match(re)) {
				bError = true;
				g_sErrorText= oIGZ.f_langText("CorregirCampo");
			}
		}

		if ( ( sAttExclVal = GetObjAttribute( oInput,"excluir_valores" ) ) != null ){
			eval( "var a_nExcluir = [ " + sAttExclVal + " ]" );
			var nInvalido = BuscaArray( a_nExcluir, vValueForm );
			if ( nInvalido >= 0 ){
				bError = true;
				bSaltarValidacion = true;
				g_sErrorText= oIGZ.f_langText("CorregirValor", [vValueForm] );
			}
		}

		cTipoForm = cTipoForm.toUpperCase()
		if (cTipoForm!="F" && cTipoForm!="K" && (bFormValido && oInput.type!="hidden")) g_bCamposVacios=0
				if ( !bError && !bSaltarValidacion ){
			switch (cTipoForm) {
				case "A":
					if (vValueForm == "") {
						bError = true;
						g_sErrorText= oIGZ.f_langText("RellenarCampo");
					}
					if ( ( sAttCharVal = GetObjAttribute( oInput,"caracteres_validos" ) ) != null ){
						var re = new RegExp("[^A-Z0-9" + sAttCharVal +"]","i");
	 					cInvalido = vValueForm.match(re);
						if (cInvalido) {
							bError = true;
							g_sErrorText= oIGZ.f_langText("CorregirCaracter", [cInvalido] );
						}
					}
					break
				case "B":
					if (vValueForm == "") {
						bError = true;
						g_sErrorText= oIGZ.f_langText("RellenarCampo");
					}
					cInvalido = ValidarCadena (vValueForm,a_cValidos_B)
					if (cInvalido) {
						bError = true;
							g_sErrorText= oIGZ.f_langText("CorregirCaracter", [cInvalido] );
					}
					break
				case "C":
					var re = /^\d{5}$/;
					if ( !vValueForm.match(re) ) {
						bError = true;
						g_sErrorText= oIGZ.f_langText("CorregirCP");
					}
					break
				case "D":
					var sFF = oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaShowD) 
					if (vValueForm == "") {
						vValueForm = new Date ().f_drawFormat (sFF)		//FechaHoy(0)
						if (bFormValido && bFixInput) oInput.value=vValueForm
					}
//					if (!EsFecha(vValueForm)) {		//1.383
					else {
						if (!oIForm.f_validaFecha(vValueForm, sFF)) {
							bError = true;
							g_sErrorText= oIGZ.f_langText("CorregirFecha", [sFF,vValueForm]);
						}
/*
					else {
						if (g_sFormatoFechaD && typeof(oIGZ)!="undefined") {
//							var sFormatoD = "D/M/Y"
//							if (vValueForm.indexOf(" ")!=-1) sFormatoD = "D/M/Y h:m"	//1.355
//							AddFixAtSubmit(sNameForm,vValueForm.f_toDateDraw (sFormatoD,g_sFormatoFechaD))

							AddFixAtSubmit(sNameForm,vValueForm.f_toDateDraw (sFF,g_sFormatoFechaD))
						}
						if (g_nFormatoFechaD) {
							AddFixAtSubmit(sNameForm,FechaHoy(g_nFormatoFechaD))
						}
*/
						else if (typeof(oIGZ)!="undefined") {
							if (!IsDateRange(oInput,1)){
								bError = true;
							}
						}
					}
					
					if (!bError) {
						var sFF_out = oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaD,"formato_out") 
						if (sFF_out) AddFixAtSubmit(sNameForm,vValueForm.f_toDateDraw (sFF,sFF_out))
					}
					break
				case "E":
					var re = /^[A-Za-z0-9]\w*([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,4})+$/
					if (!vValueForm.match(re)) {
						bError = true;
						g_sErrorText= oIGZ.f_langText("CorregirEMail");
					}
					break
				case "F":
					sError = ValidarFecha()
					if (sError) {
						bError = true;
						g_sErrorText= sError
					}
					break
				case "G":
//					if (!EsFecha(vValueForm)) {		//1.383
					var sFF = oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaShowG) 
					if (!oIForm.f_validaFecha(vValueForm,sFF)) {
						bError = true;
						g_sErrorText= oIGZ.f_langText("CorregirFecha", [sFF,vValueForm]);
					}
					else if (typeof(oIGZ)!="undefined") {
						if (!IsDateRange(oInput,1)){
							bError = true;
						}

						if (!bError) {
//							var sFormatoD = "D/M/Y"
//							if (vValueForm.indexOf(" ")!=-1) sFormatoD = "D/M/Y h:m"	//1.355
//							AddFixAtSubmit(sNameForm,vValueForm.f_toDateDraw (sFormatoD,g_sFormatoFechaG))
							var sFF_out = oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaG,"formato_out") 
							if (sFF_out) {
//alert (sNameForm+"\n"+vValueForm+"\n"+sFF+"\n"+sFF_out)
								AddFixAtSubmit(sNameForm,vValueForm.f_toDateDraw (sFF,sFF_out))
							}
//							AddFixAtSubmit(sNameForm,vValueForm.f_toDateDraw (sFF,g_sFormatoFechaG))
						}
					}
					break
				case "H":
					var re = /^([0-1]?\d|2[0-3])(:[0-5]\d(:[0-5]\d)?)$/
					if (!vValueForm.match(re)) {
						bError = true;
//						g_sErrorText= "Por favor, introduce una hora válida en formato: HH:mm\nValor actual: "+vValueForm
//						g_sErrorText= GetTextHoraInvalida(vValueForm)
						g_sErrorText= oIGZ.f_langText("CorregirHora", [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= oIGZ.f_langText("CorregirFecha", ["aaaammdd",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= oIGZ.f_langText("CorregirFecha", ["aaaa/mm/dd",vValueForm]);
					}
					break
				case "_J":
					var nNumero = new Number( vValueForm );
					if (isNaN( nNumero ) || nNumero <= 0 || ((vValueForm/1000)!=Math.ceil(vValueForm/1000))) {
						bError = true;
						g_sErrorText= "Por favor, introduce un número multiplo de 1000"
						g_sErrorText= oIGZ.f_langText("CorregirMultiplo1000");
					}
					else{
						if (bFormValido && bFixInput) oInput.value=parseFloat(vValueForm)	//v2.00
					}
					break
				case "L":
					if(!ValidarCC(sNameForm,vValueForm,oForm)){
						bError = true;
					}
					break
				case "M":							// Euro
					var nMinValue = null;
					var nMaxValue = null;
					var bAdmitePuntosMiles = true;
					var bEntero = false;
					var bAutofixM = false;
					var bForzarNumero = false;
					var sAttForzarNumero = GetObjAttribute(oInput,"forzar_numero")
					if (sAttForzarNumero != null ){
						bForzarNumero = ( sAttForzarNumero == "si" );
					}
					var sAttAutofix = GetObjAttribute(oInput,"autofix")
					if (sAttAutofix != null ){
						bAutofixM = ( sAttAutofix == "si" );
					}
					var nAttMinVal = GetObjAttribute(oInput,"minvalue")
					if (nAttMinVal != null ){
						nMinValue = nAttMinVal;
					}
					var nAttMaxVal = GetObjAttribute(oInput,"maxvalue")
					if (nAttMaxVal != null ){
						nMaxValue = nAttMaxVal;
					}
					var sTipoNum = GetObjAttribute(oInput,"tipo_numero")
					if (sTipoNum != null ){
						bEntero = ( sTipoNum == "entero" );
					}
					var sPuntosMiles = GetObjAttribute(oInput,"puntos_miles")
					if (sPuntosMiles != null ){
						bAdmitePuntosMiles = ( sPuntosMiles == "si" || sPuntosMiles == "1" );
					}

					var vValueC = vValueForm.length == 0 && ( !g_bNullAs0M || !bAutofixM ) ? Number.NaN : new Number( vValueForm );
					if (!bAutofixM) bAutofixM = g_bAutofixM

					if ( bAdmitePuntosMiles ){
						if (vValueC) vValueC = Texto2Numero(vValueForm,(~bAutofixM)&1)
					}else{
						vValueC = new Number( vValueForm );
					}

					if( !isNaN( vValueC ) && bEntero ){
						nNumeroEntero = parseInt(vValueC);
						if ( isNaN( vValueC ) || vValueC != nNumeroEntero ){
							vValueC = bAutofixM ? 0 : Number.NaN;
						}
					}

					if ( isNaN( vValueC ) ) {
						bError = true;
//						g_sErrorText= GetTextoNumeroInvalido( bEntero, bAdmitePuntosMiles );
						g_sErrorText= oIGZ.f_langText("NumeroFormato", [bEntero,bAdmitePuntosMiles]);
					}
					else{
/* 1.332
						if ( nMinValue != null && vValueC < nMinValue ){
							bError = true;
//							g_sErrorText= GetTextoNumeroMayorIgual( nMinValue );
//							g_sErrorText= oIGZ.f_langText("CorregirNumeroMayor", [nMinValue]);
							g_sErrorText=oIGZ.f_langText("NumeroLimite", [nMinValue])
						}else if ( nMaxValue != null && vValueC > nMaxValue ){
							bError = true;
//							g_sErrorText= GetTextoNumeroMenorIgual( nMaxValue );
//							g_sErrorText= oIGZ.f_langText("CorregirNumeroMenor", [nMaxValue]);
							g_sErrorText=oIGZ.f_langText("NumeroLimite", [null,nMaxValue])
						}
*/
						if ( (nMinValue != null && vValueC < nMinValue) || (nMaxValue != null && vValueC > nMaxValue) ){
							bError = true;
							g_sErrorText=oIGZ.f_langText("NumeroLimite", [nMinValue,nMaxValue])
						}


						if (bFormValido && ( bAutofixM || bForzarNumero ) && bFixInput) AddFixAtSubmit(sNameForm,parseFloat(vValueC))
					}
					break
				case "N":
					var nNumero = Number( vValueForm );
					if (vValueForm=="" || isNaN( nNumero ) || nNumero < 0 ) {
						bError = true;
						g_sErrorText= oIGZ.f_langText("CorregirNumeroN");
					}
					else if (!IsNumberRange(oInput,1)) {
						bError = true;
					}
					else{
						if (bFormValido && bFixInput) AddFixAtSubmit(sNameForm,parseFloat(vValueForm))
					}
					break
				case "O":
					var nNumero = Number( vValueForm );
					if (vValueForm=="" || isNaN( nNumero ) || nNumero < 0 || nNumero != parseInt( nNumero ) ) {
						bError = true;
						g_sErrorText= oIGZ.f_langText("CorregirNumeroO");
					}
					else if (!IsNumberRange(oInput,1)) {
						bError = true;
					}
					else{
						if (bFormValido && bFixInput) AddFixAtSubmit(sNameForm,parseFloat(vValueForm))
					}
					break
				case "P":
					if (vValueForm == "") {
						bError = true;
						g_sErrorText= oIGZ.f_langText("RellenarPass");
					}
					else {
						t_sNameForm2 = sNameForm.substr(0,1)+"x"+sNameForm.substr(2)
						var oInputPass = oForm[t_sNameForm2]
						if (oInputPass) {
							t_vValueForm2 = oInputPass.value
							if (vValueForm!=t_vValueForm2) {
								bError = true;
								g_sErrorText= oIGZ.f_langText("CorregirPass");
							}
						}
					}
					break
				case "Q":
					var nNumero = Number( vValueForm );
					if (vValueForm=="" || isNaN( nNumero ) ) {
						bError = true;
						g_sErrorText= oIGZ.f_langText("CorregirNumeroQ");
					}
					else if (!IsNumberRange(oInput,1)) {
						bError = true;
					}
					else{
						if (bFormValido && bFixInput) AddFixAtSubmit(sNameForm,parseFloat(vValueForm))
					}
					break
				case "R":
					if (!CheckRadios(oInput)) {
						bError = true;
						g_sErrorText= oIGZ.f_langText("RellenarRadio");
					}
					break
				case "S":
					if (vValueForm == "") {
						bError = true;
						g_sErrorText= oIGZ.f_langText("RellenarSelect");
					}
					break
				case "T":
					if (isNaN(vValueForm) || vValueForm<600000000 || vValueForm>999999999 || vValueForm.length!=9) {
						bError = true;
						g_sErrorText= oIGZ.f_langText("CorregirTF");
					}
					break
				case "U":
					if(!ValidarNIF(vValueForm)){
						bError = true;
						g_sErrorText= oIGZ.f_langText("CorregirNIF");
					}
					break
				case "V":
					var cLetra = vValueForm.substring(0,1)
					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= oIGZ.f_langText("CorregirDNICIFNIF");
								}
							}
						}
					}
					break
				case "W":
					if (vValueForm == "") {
						bError = true;
						g_sErrorText= oIGZ.f_langText("RellenarSelectMultiple");
					}
					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"
							g_sErrorText= oIGZ.f_langText("CorregirTarjetaCredito");
						}
					}
					break
				case "Y":
					var nOpciones = oInput.length
					if (!nOpciones) {
						bError = true;
						g_sErrorText= oIGZ.f_langText("RellenarSelectMultiple");
					}
					break
				case "Z":
					var nPosInput = BuscaArray (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,vValueForm)
	if (!bError) bError = LimiteValor(sNameForm,vValueForm)
	g_sErrorValue = vValueForm
	g_ErrorTipo =	cTipoForm

	if ( bError &&  oInput && typeof( oInput.texto_error ) != "undefined" && oInput.texto_error != null){
		g_sErrorText = oInput.texto_error;
	}
	return bError;
}

function CheckRadios (oInput){
	var bChecked=false
	if (typeof(oInput)=="object"){
		if (String(oInput.length)=="undefined") oInput = oInput.form[oInput.name]		// otra forma de ver cuantos radios tiene? !!" Si hay varios peta!!!
		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,vValueForm){
var bError=false;
	var nPosicion = BuscaArray (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,vValueForm){
	var bError=false;
	var nPosicion = BuscaArray (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){
	if (g_sAllErrorsText) g_sErrorText = g_sAllErrorsText
	if (!sError)	{
		sError = GetObjAttribute(oInput,"m_sErrorText")
	}
	if (sError) g_sErrorText = sError;

	ColorForm(oInput,0)
	FocusInput(oInput)

	if (typeof(oIGZ)!="undefined" && oCore.m_sServer=="DEV") {
		g_sErrorText += "\n\n" + InfoDevPage() + InfoDevForm(oInput.form) + InfoDevInput (oInput)
	}

	// Error en pantalla en vez de alert
	var sElementId = GetObjAttribute(oInput,"m_sErrorTextElementId")
	if (sElementId){
//		var oErrorTextElement = document.getElementById(sElementId);
/*
		if (oErrorTextElement!=null){
			var sErrorText = GetObjAttribute(oInput,"m_sErrorText")
			if (!sErrorText) sErrorText = g_sErrorText;
			oErrorTextElement.innerHTML = sErrorText;
		}
*/
		var oErrorTextElement = document.getElementById(sElementId);
		if (oErrorTextElement!=null){
			oErrorTextElement.innerHTML = g_sErrorText;
		}
	}
	else alert (g_sErrorText);
}


function CampoErrorT(oInput,sError){
	var	sNameForm = oInput.name
	if (sError){
		g_sErrorText = sError
	}
	else {
		nPosicion = BuscaArray (a_sError,sNameForm)
		if (nPosicion!=-1) g_sErrorText=a_sError[nPosicion+1]
	}
	if (g_nAllErrors==2) g_sAllErrorsText += "[" + sNameForm.substring(2)+ "] "
	g_sAllErrorsText += g_sErrorText + "\n"
}


function ValidarFecha(){
	var sReturn = ""
	var oForm = GetForm()
	var sNameForm = oIForm.m_sInputName
	var t_sNameForm = sNameForm.substr(2)

	var t_nDia = oForm["Dz"+t_sNameForm].value
	var t_nMes = oForm["Mz"+t_sNameForm].value
	var t_nAno = oForm["Az"+t_sNameForm].value

	if (sNameForm.substr(0,1)=="f" && (t_nDia =="" && t_nMes=="" && t_nAno=="")){
		oForm[sNameForm].value=''
		ColorForm(oForm['Dz'+t_sNameForm],1)
		ColorForm(oForm['Mz'+t_sNameForm],1)
		ColorForm(oForm['Az'+t_sNameForm],1)
		return sReturn;
	}

	if (t_nAno < g_nY2K)  t_nAno = 2000 + parseInt(t_nAno)
	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=="") {
		if (g_sFormatoFechaF && typeof(oIGZ)!="undefined") {
			oForm[sNameForm].value=t_dFecha.f_drawFormat (g_sFormatoFechaF)
		}
		else {
			var sFecha
			if (g_nFormatoFechaF==2) {
				t_nDia = "0"+ t_nDia.toString()
				t_nMes = "0"+ t_nMes.toString()
				sFecha =  t_nDia.substr(t_nDia.length-2) + "/" + t_nMes.substr(t_nMes.length-2) + "/" + t_nAno.toString()
			}
			else if (g_nFormatoFechaF==4) {
				t_nDia = "0"+ t_nDia.toString()
				t_nMes = "0"+ t_nMes.toString()
				sFecha =  t_nDia.substr(t_nDia.length-2) + "-" + t_nMes.substr(t_nMes.length-2) + "-" + t_nAno.toString()
			}
			else {
				sFecha =t_nDia+"/"+ t_nMes+"/"+t_nAno
			}
			oForm[sNameForm].value=sFecha
		}
		ColorForm(oForm["Dz"+t_sNameForm],1)
		ColorForm(oForm["Mz"+t_sNameForm],1)
		ColorForm(oForm["Az"+t_sNameForm],1)
	}
	else{
		sNameForm = sReturn+"z"+t_sNameForm
		g_oInputError = oForm[sNameForm]
		switch (sReturn) {
			case "D":
				sReturn = oIGZ.f_langText("CorregirFechaDD");
				break
			case "M":
				ColorForm(oForm["Dz"+t_sNameForm],1)
				sReturn = oIGZ.f_langText("CorregirFechaMM");
				break
			case "A":
				ColorForm(oForm["Dz"+t_sNameForm],1)
				ColorForm(oForm["Mz"+t_sNameForm],1)
				sReturn = oIGZ.f_langText("CorregirFechaYY");
				break
		}
	}
	return sReturn;
}

oIForm.f_GetFormatoFecha = function (oInput,sFormatoFecha,sAtributo) {	//1.365
	var sFF = null;
	if (sAtributo) {
		sFF = GetObjAttribute( oInput,sAtributo);
	} 
	if (IsNull(sFF)) {
		sFF = GetObjAttribute( oInput,"formato");
	}
	if (!IsNull(sFF)) sFormatoFecha = sFF;
//alert("f_GetFormatoFecha: "+ "\n" +  oInput.name + "\n" + sFF +"\n"+ sFormatoFecha)
	return sFormatoFecha;
}

oIForm.f_validaFecha = function (sFecha,sFormatoFecha) {	//1.363
	var bOk = 0
	if (typeof(oIGZ)!="undefined") {
//alert ("fds".f_toDate(sFormatoFecha))
		if (!IsNull(sFecha.f_toDate(sFormatoFecha,this.bForceDateFormat))) bOk=1
	}
	else {
		bOk = EsFecha(sFecha)
	}
	return bOk;
}

function EsFecha(dFecha){
	var nPosMins=-1,nPosSecs=-1, nDia,nMes,nAno,nHora, nMins, nSecs
	var	nAnoEnd = dFecha.length
	var nMinsEnd = dFecha.length
	var barra1= dFecha.indexOf("/")
	var barra2= dFecha.indexOf("/",barra1+1)
	if (barra2==-1) return false

	var nPosHora= dFecha.indexOf(" ",barra2+1)
	if (nPosHora!=-1) {
		nAnoEnd = nPosHora
		nPosMins= dFecha.indexOf(":",nPosHora+1)
		if (nPosMins!=-1) {
			nPosSecs= dFecha.indexOf(":",nPosMins+1)
			if (nPosSecs!=-1) {
				nMinsEnd = nPosSecs
			}
		}
	}

	nDia = dFecha.substring(0,barra1)
	nMes = dFecha.substring(barra1+1,barra2)
	nAno = dFecha.substring(barra2+1,nAnoEnd)

	if (nPosHora!=-1) nHora = dFecha.substring(nPosHora+1,nPosMins)
	if (nPosMins!=-1) nMins = dFecha.substring(nPosMins+1,nMinsEnd)
	if (nPosSecs!=-1) nSecs = dFecha.substring(nPosSecs+1)

	return (ValidaFecha (nDia,nMes,nAno,nHora,nMins,nSecs))
}

// ""=? / -1= F1 menor / 0 iguales / 1 F1 mayor
function ComparaFechas (sFecha1,sFecha2,cSeparador){
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
	nAAAA = Number (nAAAA)
	if (nAAAA < g_nY2K) nAAAA = 2000 + nAAAA
	if (nAAAA < 100) nAAAA = 1900 + nAAAA
	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 ValidarCC(sInputName,sCuenta,oForm) {
	var nRegs,sName,bValidar,sNameDatoCC,f,nPos,oInput,vValue
	var sCuentaDatos=""
	var szBank, szSuc, szAccount, szValidDigit, szDigit ;
	var a_vDatosCC = ["Entidad","Ez",4
				,"Sucursal","Sz",4
				,"Dígito de Control","Dz",2
				,"Número de Cuenta","Cz",10];
	var 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 = 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 = oForm[a_vDatosCC[1] + sName]
		if ( eval("typeof(oForm."+sInputName+")")=="object") AddFixAtSubmit(oIForm.m_sInputName,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(vValueForm){
var cLetra;
var bRetCode = false;

	var nDNI=vValueForm;
	nDNI=nDNI.replace(/\s/g,"");
	nDNI=nDNI.replace(/\./g,"");
	nDNI=nDNI.replace(/-/g,"");

	var nDNIfixed=nDNI;

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

	var nNumero = new Number( vValueForm );
 	if( !isNaN( nNumero ) && nNumero > 0 && (nDNI>=1 && nDNI<=99999999)) {
		bRetCode=true;
		if (BuscaArray (g_a_sAutoCorregir,oIForm.m_sInputName) !=-1) AddFixAtSubmit(oIForm.m_sInputName,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();
	nLetra = cLetra.charCodeAt(0)
	if(nLetra<65 || nLetra>90) {
		cLetra=sNIF.substring(0,1).toUpperCase();
		sNIF = sNIF.substring(1,sNIF.length);
	}
	nLetra = cLetra.charCodeAt(0)
	if(nLetra>=65 && nLetra<=90) {
		nNIF = Texto2Numero(sNIF)
 		if(cLetra==a_cOrden.substr(nNIF % 23,1)) {
 			bRetCode=true;
			if (BuscaArray (g_a_sAutoCorregir,oIForm.m_sInputName) !=-1) AddFixAtSubmit(oIForm.m_sInputName,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 && BuscaArray (g_a_sAutoCorregir,oIForm.m_sInputName) !=-1) AddFixAtSubmit(oIForm.m_sInputName,sCIF)
	return bRetCode;
}

var digitos = "0123456789";
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	array caracteres validos/caracteres invalidos
function ValidarCadena(sCadena,a_cValidos,bInvalidos,a_sExtValidas){
var f,bCaracter
	var sCadenaMay = sCadena.toUpperCase();
	var nLenCadena = sCadena.length
	for (f = 0; f < nLenCadena ; f++){
		bCaracter = sCadenaMay.charAt(f);
		nCaracterPos =	BuscaArray (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;
}


function ValidarExtension (oInput,a_sExtValidas,a_cValidos,sError,bOnlyFilename) {
	var sFichero = oInput.value
	if (!sFichero && oInput.type.toLowerCase()=="file") {
		nPos = BuscaArray (oIForm.m_maValues[0],oInput.name,1)
		if (nPos!=-1) {
			sFichero = oIForm.m_maValues[1][nPos]
		}
	}

	var sExtension = CheckExtension (sFichero,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
		var sFullName = oInput.value
		if (bOnlyFilename) sFullName = sFullName.substring(sFullName.lastIndexOf("\\")+1)
		if (ValidaValor ("B_",sFullName)) {
			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 = BuscaArray (a_sExtValidas,sExt,1)
	if (nPos==-1) return (sExt)

	return 0;
}

oIForm.f_resetColor = function (oForm) {	//1.366
	var formC=0
	if (sColorForm) {
		while (formC<oForm.length) {
			if (CheckInput (oForm[formC])){
				ColorForm(oForm[formC],1,sColorForm)
			}
			formC++;
		}
	}
}

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
					if (cValidacion=="y" || cValidacion=="z") bValidar=0

					var oInput = null;
					try{
						oInput = oForm[sNameForm];
						if (BuscaArray (g_a_sNoValidar,oInput.name)!=-1) bValidar=0
						if ( typeof( oInput.validar ) != "undefined" && oInput.validar != null ){
							if ( oInput.validar == "no" || oInput.validar == "0" ){
								bValidar = 0;
							}
						}
					}catch( e ){
						bValidar = 0;
					}
//					if ( bValidar == null ) bValidar = 0;
					if (bValidar && CheckColorForm(sNameForm)){
						cTipoForm= sNameForm.substr(0,1)

						var bObligatorio  = cTipoForm == cTipoForm.toUpperCase() && cTipoForm.match( /[A-Z]/i );
						if ( typeof( oInput.obligatorio ) != "undefined" && oInput.obligatorio != null ){
							if ( oInput.obligatorio == "si" || oInput.obligatorio == "1" ){
								bObligatorio = 1;
							}
						}
						if (bObligatorio){
							sColor = sColorObligatorio
						}
						else{
							if (sColorForm) sColor = sColorForm
						}
						ColorForm(oForm[formC],1,sColor)
					}
				}
			}
			formC++
		}
	}
}

function ColorForm(oInput,bFormOK,sColor){
	GetForm (oInput.form)
	var sNameForm = oInput.name
	if (!bNS) {
		ResetCampo()
		var cTipoFormU = sNameForm.substr(0,1).toUpperCase()

		if ( ( typeof( oInput.type ) != "undefined" && oInput.type != null ) || typeof( oInput.length ) != "undefined" ){
			if( typeof( oInput.type ) != "undefined" && oInput.type == "checkbox" ){
				cTipoFormU = "K"
			}else if ( typeof( oInput.type ) == "undefined" || oInput.type == "radio" ){
				cTipoFormU = "R"
			}
		}

		if (cTipoFormU!="R" && cTipoFormU!="K"){
			if (!sColor){
				var sColor = sColorError
				if (bFormOK) sColor = sColorOK
				if (!sColor && sColorForm) sColor = sColorForm
			}
			if (sColor) {
				oInput.style.backgroundColor = sColor
				if (CheckColorForm(sNameForm)){
					window.onerror = function ErrorTrapJS(sError,sURL,nLinea) { sError="[i_form.ColorForm] Nombre de INPUT inexistente o duplicado: "+sNameForm+"\n\n"+sURL+"\nLinea "+nLinea + " : " + sError;ErroresForm (sError,oInput); return (true);}
					g_sColorForm = "oIForm.m_oForm['"+sNameForm+"'].style.backgroundColor = '"+sColor+"'"
					eval(g_sColorForm);
					window.onerror=g_oOnErrorEvent
					if (!bFormOK && sColorForm) 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("oIForm.m_oForm")+14,g_sColorForm.indexOf(".style.backgroundColor"))
		if (CheckColorForm(sNameForm)) eval(g_sColorForm);
	}
}

// sModo : 1=solo Prefijo 2=solo Sufijo
function RemovePrefijoSufijo (sName,sModo){
	var cValidacion = sName.substr(1,1).toLowerCase()
	if (sModo!=2 && (cValidacion=="_" || cValidacion=="x" || cValidacion=="y" || cValidacion=="z")) {
		sName = sName.substr(2)
	}
	var nLen = sName.length
	if (sModo!=1 && sName.charAt(nLen-1)=="_"){
		var nPos = sName.lastIndexOf("_",nLen-2)
		if (nPos!=-1) sName = sName.substr(0,nPos)
	}
	return (sName)
}


function GetFormValue (oInput) {
	var sValue=""
	var nPos = BuscaArray (oIForm.m_maValues[0],oInput.name,1)
	if (nPos!=-1) {
		sValue = oIForm.m_maValues[1][nPos]
	}
	return (sValue)
}

// [oForm],[sJSarrayBase/ma_InputInitValues],[bSinPrefijo]
function RellenarForms(oForm,vArrayBase,bSinPrefijo){
var sInputsSinValue = "", sInputAnt
var oInput,sInputName,sInputType,sCampo,nPos,sFF_in
var e,f,g,sFormName,vNewValor,bValor,vValor,sNameP

	if (!vArrayBase && typeof(maFormNamesValues)!="undefined") vArrayBase = maFormNamesValues
	if (vArrayBase) {
		if(IsArray(vArrayBase)){
			if (vArrayBase.length!=2) ErroresForm ("El array de RellenarForms tiene "+(vArrayBase.length-1)+" registros\n\n"+vArrayBase.f_maDebug())
			a_sFormNames = vArrayBase[0];
			a_vFormValues = vArrayBase[1];
		}
		else if (typeof(vArrayBase)=="string") {
			a_sFormNames = eval ("a_s"+vArrayBase)
			a_vFormValues = eval ("a_v"+vArrayBase)
		}
		else if (IsMArray(vArrayBase)){
			if (vArrayBase.f_length()!=1) {
				if (vArrayBase.f_length()>1) ErroresForm ("El MArray de RellenarForms tiene "+vArrayBase.f_length()+" registros\n\n"+vArrayBase.f_debug())
				a_vFormValues = []
			}
			else{
				a_sFormNames  = vArrayBase.m_a_sCOLs;
				a_vFormValues = vArrayBase.m_a_aROWs[0];
			}
		}
	}

	if (a_vFormValues.length==0) return (0)
	oIForm.m_maValues[0] = a_sFormNames.concat()
	oIForm.m_maValues[1] = a_vFormValues.concat()


	var nForms=1
	if (!oForm) nForms = document.forms.length
	for (e=0;e<nForms;e++) {
		if (!oForm || e>0) oForm=document.forms[e]

		if (bSinPrefijo){
			for (g=0;g<oForm.length;g++) {
				if (ValidarInput (oForm[g],1)) {
					sInputName = oForm[g].name
					if (sInputName != sInputAnt){
						sInputAnt = sInputName
						sCampo = RemovePrefijoSufijo (sInputName)
						nPos = BuscaArray (a_sFormNames,sCampo,1)
						if (nPos==-1 ) {
							nPos = sCampo.indexOf ("@")
							if (nPos!=-1 ) {
								nPos = BuscaArray (a_sFormNames,sCampo.substring(0,nPos) ,1)
							}
						}
						if (nPos!=-1) {
							oIForm.m_maValues[0][nPos] = sInputName
							if (g_bAddPrefix) a_sFormNames[nPos] = sInputName
						}
						else {	
							if (BuscaArray (a_sFormNames,sInputName,1)==-1) sInputsSinValue += sInputName + " / "
						}
					}
				}

			}
			if (sInputsSinValue) g_sAlertas += "* INPUTS sin values:"+ sInputsSinValue + "\n"
		}

		for (e=0;e<oForm.length;e++) {
			oInput = oForm[e]
			f = BuscaArray (oIForm.m_maValues[0],oInput.name,1)

			if (f!=-1 && oInput.type!="file") {
				sInputName = oIForm.m_maValues[0][f]
				vNewValor = a_vFormValues[f]
				sFormName = oForm[sInputName]

				if (IsNull(vNewValor) || vNewValor.toString().toLowerCase()=="null") vNewValor=""

				if (g_bRellenarAll && !oInput.value) oInput.value = vNewValor
				if (ValidarInput (oInput,1)) {			//v1.18

					var cTipoForm= sInputName.substr(0,1).toUpperCase()
					if ( GetObjAttribute( oInput,"tipo" ) != null ){
						cTipoForm = GetPrefixFromType( oInput );
					}
					switch (cTipoForm) {
						case "D":
							var sFF_in = oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaInD,"formato_in") 
							if (sFF_in && typeof(oIGZ)!="undefined") {
//							if (g_sFormatoFechaInD && typeof(oIGZ)!="undefined") {
								vNewValor = vNewValor.f_toDateDraw (sFF_in,oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaShowD))
							}
							oInput.value= vNewValor
							break
						case "F":
							var sFF_in = oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaInF,"formato_in") 
							if (sFF_in && typeof(oIGZ)!="undefined") {
//							if (g_sFormatoFechaInF && typeof(oIGZ)!="undefined") {
								vNewValor = vNewValor.f_toDateDraw (sFF_in,oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaShowF))
							}
							RellenarInputTipo(oInput,cTipoForm,vNewValor)
							break
						case "G":
							var sFF_in = oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaInG,"formato_in") 
							if (sFF_in && typeof(oIGZ)!="undefined") {
//							if (g_sFormatoFechaInG && typeof(oIGZ)!="undefined") {
								vNewValor = vNewValor.f_toDateDraw (sFF_in,oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaShowG))
							}
							oInput.value= vNewValor
							break
						case "K":
							bValor=false
							vValor = vNewValor

							if (g_bInputMismoNombre) {
								var a_nIndex = oIForm.m_maValues[0].f_subIndexOf (oInput.name,1)
								var a_vInput = a_vFormValues.f_subVal(a_nIndex)

								var nPos = a_vInput.f_indexOf (oInput.value)
								if (nPos==-1) vValor=0
							}

							if (vValor) {
								vValor = vValor.toString().toLowerCase()
								if (vValor!="0" && vValor!="false" && vValor!="falso" && vValor!="null") bValor=true
							}
							oInput.checked = bValor
							break
						case "L":
							RellenarInputTipo(oInput,cTipoForm,vNewValor)
							break
						case "M":
							var nMoneda = vNewValor

							var nDecs = 2;
							var sTipoNumero = GetObjAttribute( oInput,"tipo_numero")
							if ( sTipoNumero!= null && sTipoNumero == "entero" ){
								nDecs = 0;
							}
							var sPuntosMiles = GetObjAttribute( oInput,"puntos_miles")
							if ( nMoneda && ( sPuntosMiles == null || sPuntosMiles == "si" || sPuntosMiles == "1" ) ){
								nMoneda = Numero2Texto(nMoneda,nDecs,1,1,0)	//v1.352
							}
//alert(vNewValor+"\nTipo: "+sTipoNumero+"\nPuntos: "+sPuntosMiles+"\n"+Texto2Numero(vNewValor)+"\n"+nMoneda+"\n"+nDecs)
							oInput.value = nMoneda
							break
						case "P":
							oInput.value = vNewValor
							sNameP = sInputName.substr(0,1) + "x" + sInputName.substr(2)
							oInput = oForm[sNameP]
							if (oInput)	oInput.value=vNewValor
							break
						case "R":
							var vValor = vNewValor
							if (vValor && !(vValor=="False" || vValor=="Falso" || vValor=="null")){
								if (oInput.value==vValor) oInput.checked=true;
							}
							break
						case "S":
							if (sFormName) {
								SetInputValue(sFormName,vNewValor)
							}
							break
						case "W":
							SelectOptions(oForm,sInputName,0)
							var a_sValor=vNewValor
//1.351						if(!IsArray(a_sValor)) a_sValor=a_sValor.split(", ");
							if(typeof(a_sValor)=="string") a_sValor=a_sValor.split(", ");
							SetInputValue(oInput,a_sValor)
							break
						case "Y":
							SelectOptions(oForm,sInputName,0)
							var a_sValor=vNewValor
//1.351						if(!IsArray(a_sValor)) a_sValor=a_sValor.split(", ");
							if(typeof(a_sValor)=="string") a_sValor=a_sValor.split(", ");
							SelectOptions(oForm,sInputName,1,a_sValor)
							DelSelected(oForm,sInputName,0,0)
							SelectOptions(oForm,sInputName,0)
							break
						default:
							oInput.value = vNewValor
					}
				}
				else {
					oInput.value = vNewValor
				}
			}
			else if (f!=-1 && oInput.type=="file" && oIForm.m_nFile2Text) {
				var oSpan = document.createElement("SPAN");
				oSpan.innerHTML = "<BR />" + a_vFormValues[f];
				oInput.parentNode.appendChild(oSpan);			
				if (oIForm.m_nFile2Text==1) oInput.parentNode.removeChild(oInput);
			}
		}
	}
}

function RellenarInputTipo(oInput,cTipo,vValor){
	var sNombre = RemovePrefijoSufijo (oInput.name)
	var oForm = oInput.form
	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]=""
			}
			oForm["Dz"+sNombre].value= a_vFechas[0]
			oForm["Mz"+sNombre].value= a_vFechas[1]
			oForm["Az"+sNombre].value= a_vFechas[2]
			break
		case "L":
			var regDigitos=/[^0-9]/gi
			vValor = vValor.replace(regDigitos,"")
			oInput.value= vValor
			oForm["Ez"+sNombre].value= vValor.substr(0,4)
			oForm["Sz"+sNombre].value= vValor.substr(4,4)
			oForm["Dz"+sNombre].value= vValor.substr(8,2)
			oForm["Cz"+sNombre].value= vValor.substr(10)
			break
		default:
			oInput.value = vValor

	}
}


function AutoFill (oForm,bSoloObligatorios){
var e,f,g,cTipo,nTipoFind,vInputValue,nMaxLength
var	sNameP1,sNameP2,oInput
var sText=""
var nAutoFill = 2
var	a_AutoFill = [ "C",28010
				,"H",new Date ().f_drawFormat ("nHH24:nMMN")		//HoraHoy()
				,"I",new Date ().f_drawFormat ("nYYYYnMMnDD")		//FechaHoy(1)
				,"J",new Date ().f_drawFormat ("nYYYY/nMM/nDD")		//"2005/12/31"
				,"L","0078 0050 26 4000000737"
				,"M",9.10
				,"N",19.123
				,"O",29
				,"P","1'\r\n\'1"
				,"Q",-91.789
				,"T","900900900"
				,"U","2618976N"
				,"V","B81402059"
				]

	var nForms = 1
	if (!oForm) nForms = document.forms.length
	if (nForms==0) DebugForm ()
	for (e=0;e<nForms;e++) {
		if (!oForm || f>0) oForm=document.forms[e]
		for (f=0;f<oForm.length;f++) {
			GetForm (oForm)
			oInput = oForm[f];
			if (CheckInputName (oInput,0,1) && oInput.type!="file") {
				sInputName = oInput.name
				vInputValue = ""
				cTipo = CheckTipoForm (sInputName,0)
				if (!bSoloObligatorios) cTipo=cTipo.toUpperCase()
				if ( GetObjAttribute( oInput,"tipo" ) != null ){
					cTipo = GetPrefixFromType( oInput );
				}
				sAttOblig = GetObjAttribute( oInput,"obligatorio" )
				if ( sAttOblig!= null ){
					if ( sAttOblig == "si" || sAttOblig == "1" ){
						cTipo=cTipo.toUpperCase()
					}else if ( bSoloObligatorios ) {
						cTipo=cTipo.toLowerCase()
					}
				}
				if (oInput.value && cTipo!="S" && cTipo!="K" && cTipo!="R") cTipo=""

				if (BuscaArray (g_a_sNoValidar,sInputName)!=-1) cTipo=""
				var sAttValidar = GetObjAttribute( oInput,"validar" )
				if ( sAttValidar!= null && ( sAttValidar == "no" || sAttValidar == "0" ) ){
					cTipo = "";
				}
				if (cTipo){
					var sValue = ""
					switch (cTipo){
						case "A":
							vInputValue = sInputName + " [\\'\n\\n\'\"''€] (" + GetMaxLength(oInput) + ")\\"
							sAttCharVal = GetObjAttribute( oInput,"caracteres_validos")
							if ( sAttCharVal!= null ){
								var re = new RegExp( "[^A-Z0-9" + sAttCharVal + "]", "gi" );
								vInputValue = vInputValue.replace( re, "" );
							}
							break
						case "B":
							vInputValue = sInputName + " (" + GetMaxLength(oInput) + ")"
							var sCadenaValidos = "";
							for( var i = 0; i < a_cValidos_B; i++ ){
								sCadenaValidos += a_cValidos[ i ];
							}
							var re = new RegExp( "[^A-Z0-9" + sCadenaValidos + "]", "gi" );
							vInputValue = vInputValue.replace( re, "" );
							break
						case "D":
							vInputValue = new Date ().f_drawFormat (oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaShowD))		//FechaHoy(0)
							break
						case "E":						
							var re = new RegExp( "@", "gi" );
							vInputValue = sInputName.replace (re,"_") + "_" + GetMaxLength(oInput) + "@igz.biz"
							break
						case "F":
							RellenarInputTipo(oInput,cTipo,FechaHoy(0))
							break
						case "G":
							vInputValue = new Date ().f_drawFormat (oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaShowG))		//FechaHoy(0)
							break
						case "K":
							oInput.checked=1
							break
						case "L":
							nTipoFind = BuscaArray (a_AutoFill,cTipo)
							RellenarInputTipo(oInput,cTipo,a_AutoFill[nTipoFind+1])
							break
						case "R":
							oInput.checked=1
							break
						case "S":
							sValue = GetInputValueChecked(oInput)
							if (sValue=="" || sValue=="null") oInput.selectedIndex=1
							break
						case "W":
						case "Y":
							var nOpciones = oInput.length
							if (!nOpciones)	InsertOption(oForm,oInput,1,sInputName)

							for (g=0;g<oInput.options.length;g++){
								oInput.options[g].selected=1
							}
							break
						default:
							nTipoFind = BuscaArray (a_AutoFill,cTipo)
							if (nTipoFind!=-1) {
								var nInc=0
								if ("MNOQ".indexOf(cTipo)!=-1) {
									nInc = 1
								}
								if (nInc) a_AutoFill[nTipoFind+1] += nInc
								vInputValue += a_AutoFill[nTipoFind+1]
							}
					}

					if (vInputValue) {
						nMaxLength = GetMaxLength(oInput)
						if (nMaxLength){
							 vInputValue = vInputValue.substr(0,nMaxLength)
						}
						oInput.value = vInputValue
						if ("MNOQ".indexOf(cTipo)!=-1 && !IsNumberRange (oInput)) oInput.value = GetValueRange(oInput)
						if ("G".indexOf(cTipo)!=-1 && !IsDateRange (oInput)) oInput.value = GetValueRange(oInput)
					}
				}
			}
		}
	}
}

function AutoFocus(oForm){
var oInput
var f = 0
//	if (!oForm) oForm=document.forms[0]
	oForm = GetForm (oForm)
	if (!oForm) return
	while (f<oForm.length) {
		oInput = oForm[f++]
		if (CheckInput (oInput,0,0,0)){
			if (GetInputValue(oInput)==""){
				FocusInput(oInput)
			}
			break;
		}
	}
}

function FocusInput(oInput){
//alert (oInput.name +"/"+ CheckInput (oInput,0,0,0,0) +"/"+ oInput.clientTop +"/"+ oInput.type.indexOf("select-"))
	if (CheckInput (oInput,0,0,0,0) && (oInput.clientTop || oInput.type.indexOf("select-")!=-1 ) ){			// 1.360 oInput.clientTop
		window.onerror = function ErrorTrapJS(sError,sURL,nLinea) { sError="[i_form.FocusInput] 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
	}
}

function ChangeComboValue (oSelect,vValor,vIndices) {
	if (SetInputValue(oSelect,vValor,vIndices) && typeof (oSelect.onchange)=="function") {
		oSelect.onchange ()
	}
}

// sInput/a_sInput
function ClearInputValue(oForm,sInput){
	var a_sInput = sInput
	if(!IsArray(sInput)) a_sInput=[sInput];

	for (var f=0;f<a_sInput.length;f++){
		var oInput = oForm[a_sInput[f]]
		if (typeof(oInput)=="object"){
			switch( oInput.type ){
			case"radio":
			case"checkbox":
				var nRadios = oInput.length
				if (nRadios){
					for (i=0;i<nRadios;i++) {
						oInput[i].checked=false
					}
				}
				else{
					oInput.checked=false
				}
				break
			default:
				SetInputValue(oInput,"",0)
			}
		}
	}
}

function SetInputValue(oInput,vValor,vIndices){
	var h,i
	var bChanged=0
	if (typeof(oInput)=="object"){
		switch( oInput.type ){
		case "select-one":
			if (IsNull(vIndices)) {
				for (i=0;i<oInput.length;i++){
					if (oInput[i].value==vValor || oInput[i].text==vValor) {
						vIndices = i
						break
					}
				}

			}
			if (!IsNull(vIndices)) {
				oInput.selectedIndex=vIndices
				bChanged=1
			}
			break
		case "select-multiple":
			if (!vIndices) {
				vIndices = []
				var a_sValor=vValor
				if(!IsArray(vValor)) a_sValor=[vValor];
				for (var h=0;h<a_sValor.length;h++){
					for (var i=0;i<oInput.options.length;i++){
						if (oInput[i].value==a_sValor[h] || oInput[i].text==a_sValor[h]){
							vIndices.push (i)
							break
						}
					}
				}
			}
			for (i=0; i<vIndices.length; i++) {
				oInput.options[vIndices[i]].selected=true
				bChanged=1
			}
			break
		default:
			oInput.value=vValor
			bChanged=1
		}
	}
	return (bChanged)
}

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

function GetInputValueChecked(oInput,bValue){
	var vValor=""

	if (CheckInput (oInput,0,1,1)){
		var sInputType;
		if (oInput.length) sInputType = oInput[0].type
		else sInputType=oInput.type
		if (sInputType) sInputType = sInputType.toLowerCase()		//1.357

		if (sInputType=="radio" || sInputType=="checkbox"){
			var nRadios = oInput.length
			if (nRadios){
				for (i=0;i<nRadios;i++) {
					if (oInput[i].checked) {
						oInput = oInput[i]
						vValor=true
						break
					}
				}
			}
			else{
				if (oInput.checked) vValor=true
			}
			if (vValor && bValue) vValor = oInput.value
		}
		else if (sInputType=="select-one"){
			var nSelected=oInput.selectedIndex
			if (nSelected!=-1) vValor=oInput[nSelected].value
		}
		else if (sInputType=="select-multiple"){
			vValor = oInput.value != ""
		}
		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
		}
	}
}

// Para no validar Botones, Hidden, Disabled, NoInputs...
// 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){
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 (!bButton && sInputType == "button") return(0)
				if (oInput.style && oInput.style.visibility=="hidden") sInputType = "hidden"
				if (!bHidden && sInputType == "hidden") 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 con nuestros prefijos (_ y x), que existen y enabled
// [bHidden] admite Hiddens
function ValidarInput (oInput,bHidden,bSinPrefijo){
	var bInputValido = 0
	if (!bHidden) bHidden = 0
	if (CheckInputName(oInput,0,bHidden)) {
		if (bSinPrefijo) {
			bInputValido=1
		}
		else {
			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="[i_form.CheckColorForm] FORM invalido '"+ oIForm.m_oForm + "' o nombre de INPUT erroneo: '"+ sNameForm+ "'\n\n"+sURL+"\nLinea "+nLinea + " : " + sError;ErroresForm (sError); return (true);}
	var oInput = oIForm.m_oForm[sNameForm]
	window.onerror=g_oOnErrorEvent
	if (CheckInput (oInput) && (isNaN(oInput.length) || oInput.length<2)) {
		bColorFormOK=1
		var cTipoFormU = sNameForm.substr(0,1).toUpperCase()
	}
	return bColorFormOK
}

//[bTodos] 0/1 Solo tipo _x / todos
function CheckTipoForm (sNameForm,bTodos){
	if (!sNameForm) return
	var cTipoForm= ""
	var cValidacion = sNameForm.substr(1,1)
	if (bTodos || cValidacion=="_" || cValidacion=="x") {
		cTipoForm= sNameForm.substr(0,1)
	}
	return (cTipoForm)
}


function DebugForm (oForm,sInputName){
	ErrorJS (DebugFormInfo (oForm,sInputName,1),null,null,4)
}

function DebugFormInfo (oForm,sInputName,bMini){
	var sText= InfoDevPage()
	if (sInputName){
		var oInput = oForm[sInputName]
		sText += DebugInput (oInput)
	}
	else{
		var nForms=1;
		if (!oForm) nForms = document.forms.length
		if (nForms==0) sText += "\nEsta página no tiene ningún <FORM> válido."
		for (var g=0;g<nForms;g++) {
			if (!oForm || g>0) oForm=document.forms[g]
			sText += InfoDevForm(oForm)
			for (var f=0;f<oForm.length;f++) {
				sText += DebugInput (oForm[f],bMini) + "\n"
			}
		}
	}
	return (sText)
}

function DebugInput (oInput,bMini){
var sInputType,f,nMaxLength
var sText = ""
var sSeparador= " / "

	sText += oInput.name + sSeparador

	sInputType=oInput.type
	if (!sInputType) sInputType = oInput.tagName
	sText += sInputType + sSeparador

	sText += (oInput.disabled ? "disabled":"enabled") + sSeparador

	if (oInput.style && oInput.style.visibility=="hidden") sText += "visibility: hidden" + sSeparador

	if (sInputType=="select-one" || sInputType=="select-multiple") {
		var nOptions = oInput.length
		sText += "(" + oInput.length + " opciones)"
		sText += " [" + oInput.value + "]"
		if (nOptions) sText += "\n"
		var sEOL = ""
		if (bMini && nOptions>3) {
			nOptions=3
			sEOL = ""
		}
		for (f=0;f<nOptions;f++){
			sText += DebugOption(oInput,f,sEOL)
		}
		if (oInput.length>nOptions) {
			sText += "\t. . . ."
			sText += DebugOption(oInput,oInput.length-1,sEOL)
		}
	}
	else{
		nMaxLength = GetMaxLength(oInput)
		if (nMaxLength) sText += " (" + nMaxLength + ") "
		sText += " [" + oInput.value + "]"
		if (oInput.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 f,g,h,sNameInput,cValidacionO,cValidacion,cTipoForm,a_sInputNames,a_sInputsDistintos,a_sInputsRepetidos;
	var sText = ""
	var nForms = 1
	if (!oForm) nForms = document.forms.length
	if (nForms==0) sText += "\nEsta página no tiene ningún <FORM> válido."
	for (g=0;g<nForms;g++) {
		if (!oForm || g>0) oForm=document.forms[g]

		sText += "- "+ oForm.name +" -\n"
		h=0
		a_sInputNames = []
		for (f=0;f<oForm.length;f++) {
			if (CheckInput (oForm[f],0,1,0,1)){
				if (CheckInputName (oForm[f],0,1,0,1)){
					sNameInput = oForm[f].name
					a_sInputNames[h++] = sNameInput
					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(oForm[f])==0) sText += "WARN\t["+sNameInput+"]\tNo tiene definido el 'maxlength'\n"
					}
				}
				else{
					sText += "ERROR\t[...]\tHay un INPUT de tipo '"+oForm[f].type+"' sin 'name' definido\n"
				}
			}
			else{
				sNameInput = oForm[f].name
				if (CheckInput (oForm[f],0,1,1)) sText += "WARN\t["+sNameInput+"]\tEsta 'disabled'\n"
			}
		}
		if (typeof(oIGZ)!="undefined" && a_sInputNames.length) {
			a_sInputsRepetidos = a_sInputNames.f_subDistinct (0,0,1)
			if (a_sInputsRepetidos.length) {
				sText += "ERROR !\t["+a_sInputsRepetidos+"]\tEstos INPUTs tienen el nombre repetido\n"
			}
		}

	}
	sText += "\n\n" + g_sAlertas
	return (sText)
}

function TeclaPulsadaF7() {
	TeclaPulsada("",118)
}
function TeclaPulsadaF8() {
	TeclaPulsada("",119)
}
function TeclaPulsadaF9() {
	TeclaPulsada("",120)
}
function TeclaPulsadaF10() {
	TeclaPulsada("",121)
}

function TeclaPulsadaTAB() {
	TeclaPulsada("",9)
}

function TeclaPulsada(e,nKey) {
	var bKey,sInputType,oInput
	var bCTRL = 1
	if (bIE){
		oInput = event.srcElement
		sInputType = oInput.tagName.toUpperCase()
	}
	if (!nKey) {
		bCTRL = 0
		if (bIE){
			nKey = window.event.keyCode;
		}
		else {
			nKey = e.which;
			sInputType =  e.target.tagName
		}
		if (bIE && g_bControlKeys && window.event.ctrlKey) bCTRL = 1			// solo IE !!!

		if (nKey==13){
			bKey=1

			if (bIE && event.srcElement.protocol=="javascript:") bKey = 0		// BUG: RET+HREF

			if ((!g_bSelectSubmit && sInputType=="SELECT") || sInputType=="TEXTAREA"){
				bKey=0
			}

			if (bKey && g_sTecladoFuncion && g_bSubmitOn==0){
				window.onerror = function ErrorTrapJS(sError,sURL,nLinea) { sError="[TeclaPulsada] No existe o da error la funcion: '"+g_sTecladoFuncion+"'\n\n"+sURL+"\nLinea "+nLinea + " : " + sError;ErroresForm (sError); return (true);}
				var oForm = ( bIE ? event.srcElement.form : e.target.form );
				if (oForm && oForm.length && CountInputsByType(oForm,"text")+CountInputsByType(oForm,"password")==1) ErroresForm ("AVISO 1",oForm)
				else eval (g_sTecladoFuncion+"(oForm)")
				window.onerror=g_oOnErrorEvent
			}
		}
	}

	if (bCTRL) {
		switch (nKey){
			case 118 :			//F7
				DebugForm ()
				break
			case 119 :			//F8
				ErrorJS (CheckIntegrity()+"\n"+DebugInitValues(),null,null,4)
				break
			case 120 :			//F9
				AutoFill ("",1)
				break
			case 121 :			//F10
				AutoFill ()
				break
			case 9 :			//TAB
				if (g_bTextareaTabKey && sInputType=="TEXTAREA") {
				  oInput.selection = document.selection.createRange();
				  oInput.selection.text = String.fromCharCode(9);
				  event.returnValue = false;
				}
				break
		}
	}

}

function CountInputsByType (oForm,sType){
	var nCount=0
	for (var f=0;f<oForm.length;f++) {
		if (oForm[f].type==sType.toLowerCase()) nCount++
	}
	return nCount
}


function DebugInitValues(){
	var sHTML = ""
	if (typeof(oIForm.m_maValues[0])!="undefined" && oIForm.m_maValues[1].length) {
		sHTML += "[maFormNamesValues]\n"
		for (f=0;f<oIForm.m_maValues[0].length;f++){
			sHTML += (f+1) + ".\t" + oIForm.m_maValues[0][f] + "\t=\t'" + a_vFormValues[f] + "'\n"
		}
	}
	else {
		sHTML += "No estan definidos los arrays 'a_sFormNames' y 'a_vFormValues'"
	}
	return (sHTML)
}

function InitTextAreaMaxLength(){
	var a_TEXTAREAs = document.getElementsByTagName("TEXTAREA");
	var f = -1, F = a_TEXTAREAs.length;
	while ( ++f < F ) {
		a_TEXTAREAs[f].onkeyup=TextAreaMaxLength;
	}
}

function TextAreaMaxLength(){
	if ( this.value.length > this.maxlength ) {
		var sStr=this.value;
		this.value=sStr.substring(0,this.maxlength);
		ColorForm(this,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=oForm[vSelect1]
	if (typeof(vSelect2)=="object") oSelect2 = vSelect2
	else oSelect2=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=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++;
		}
	}
}

// Borra los valores de S2 que estan en S1
function DelDuplicated (vForm,vSelect1,vSelect2) {
	var oForm,oSelect1,oSelect2,nSelC1,nSelC2,vValue

	if (typeof(vForm)=="object") oForm = vForm
	else oForm=eval("document.forms."+vForm);
	if (typeof(vSelect1)=="object") oSelect1 = vSelect1
	else oSelect1=oForm[vSelect1]

	if (typeof(vSelect2)=="object") oSelect2 = vSelect2
	else oSelect2=oForm[vSelect2]

	if (!IsNull(oSelect1) && !IsNull(oSelect2)) {
		nSelC1=0;
		while(nSelC1<oSelect1.length){
			vValue = oSelect1[nSelC1].value
			nSelC2=0;
			while(nSelC2<oSelect2.length){
				if (oSelect2.options[nSelC2].value == vValue) oSelect2[nSelC2]=null
				else nSelC2++;
			}
			nSelC1++;
		}
	}
}

//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 = null

	if (typeof(vForm)=="object") oForm = vForm
	else oForm=eval("document.forms."+vForm);
	if (typeof(vSelect)=="object") oSelect = vSelect
	else oSelect=oForm[vSelect]

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

	if (IsNull(a_vArray)){			//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=oForm[vSelect1]
	if (typeof(vSelect2)=="object") oSelect2 = vSelect2
	else oSelect2=oForm[vSelect2]

	SelectOptions(oForm,oSelect1,1,a_vValues,a_sNames);
	AddSelected(oForm,oSelect1,oSelect2,bMove);
}

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, bOrderByVal){
	if(!bOrderByVal) bOrderByVal=0;
	var nPos
	var oForm = oSelect.form
	var sForm = oSelect.form.name
	var sSelect  = oSelect.name
	var a_vSelect= Select2MArray (oSelect)

	var a_vOrdenado1 = a_vSelect[bOrderByVal].concat();
	a_vOrdenado1.sort();
	var a_vOrdenado2 = [];
	SelectOptions(oForm,oSelect,1)
	DelSelected(oForm,oSelect,1)
	for (var f=0;f<a_vOrdenado1.length;f++){
		nPos = BuscaArray (a_vSelect[bOrderByVal],a_vOrdenado1[f],0)
		a_vOrdenado2[f] = a_vSelect[1-bOrderByVal][nPos]
	}

	if(bOrderByVal) Array2Select(a_vOrdenado1,a_vOrdenado2,oForm,oSelect);
	else Array2Select(a_vOrdenado2,a_vOrdenado1,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=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);
	}
}

//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=oForm[vSelect]

	if (!IsNull(oSelect)) {
		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 UpdateSelect (oSelectS,sSelectD,maDatos,sCampoCmp,sCampoTxt,sCampoVal,a_sTitulo) {
	var oForm = oSelectS.form
	var vValor = oSelectS.value

	if (IsNull (a_sTitulo)) {
		a_sTitulo= ['- elegir -','']
	}

	var a_nRegs = maDatos.f_maGetRegsIf ([sCampoCmp],[vValor])

	var a_sText = [a_sTitulo[0]].concat (maDatos.f_maGetVal (sCampoTxt,a_nRegs))
	var a_vValue = [a_sTitulo[1]].concat (maDatos.f_maGetVal (sCampoVal,a_nRegs))

	DelSelected(oForm,sSelectD, 1);
	Array2Select(a_vValue,a_sText,oForm,sSelectD);

	if (oForm[sSelectD].onchange) oForm[sSelectD].onchange()
}

// 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){
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){
		var oInput = 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
	}
	return (nInputsRellenos);
}

function FechaHoy(nTipoFecha){
	var dFecha = new Date();
	var nDia = dFecha.getDate()
	var nMes = dFecha.getMonth() + 1
	var nAno = dFecha.getFullYear()
	var dHoy = nDia + "/" + nMes + "/" + nAno

	var sDia = "0"+ nDia.toString()
	var sMes = "0"+ nMes.toString()
	if (nTipoFecha==1){
		dHoy = nAno.toString() + sMes.substr(sMes.length-2) + sDia.substr(sDia.length-2)
	}
	if (nTipoFecha==2){
		dHoy =  sDia.substr(sDia.length-2) + "/" + sMes.substr(sMes.length-2) + "/" + nAno.toString()
	}
	if (nTipoFecha==3){
		dHoy =  sDia.substr(sDia.length-2) + sMes.substr(sMes.length-2) + nAno.toString()
	}
	if (nTipoFecha==4){
		dHoy =  sDia.substr(sDia.length-2) + "-" + sMes.substr(sMes.length-2) + "-" + nAno.toString()
	}
	return dHoy
}

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

//Cambia entre dd/mm/aa y mm/dd/aa
function CambiaFecha(sFecha,cSeparador) {
var nBarra1,nBarra2,sDia,sMes,sAnoHora

	if (!sFecha) sFecha = FechaHoy(0)
	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
}

g_vCicloInputValue = null

function CicloColores(sNameForm,sColorS,sColorD,nPasos,nTime,nPasosC){
	if (CheckColorForm(sNameForm)){
		var oInput = oIForm.m_oForm[sNameForm]
		if (!oInput.clientTop) {		//v1.326
			var nColorS,nColorD,sFuncion,sColor = "#"
			if (IsNull(g_vCicloInputValue)) g_vCicloInputValue=oInput.value

			if (g_vCicloInputValue!=oInput.value) {
				g_vCicloInputValue = null
			}
			else {
				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)
				oInput.style.backgroundColor = sColor;
			}
		}
	}
}

function AutoInitInput(oForm) {		//rellena campos VACIOS de tipo D
	var f,g,oInput,cTipo,vValor,sFF
	var nForms = 1
	if(!oForm) nForms = document.forms.length;
	for (f=0;f<nForms;f++) {
		if (!oForm || f>0) oForm=document.forms[f]
		for (g=0;g<oForm.length;g++) {
			oInput = oForm[g]
			cTipo = CheckTipoForm (oInput.name)
			vValor = oInput.value
			if (cTipo=="D" && !vValor) {
				sFF = oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaShowD)
				if (sFF && typeof(oIGZ)!="undefined") {
					vValor = (new Date()).f_drawFormat (sFF)
				}
				else {
					vValor = FechaHoy(0)
				}
				oInput.value = vValor
			}
		}
	}
}

function BuscaArray (a_vArray,vValor,bCaseIndepen){
	var nLen,nPos,vDato
	nPos=-1
	if (IsArray(a_vArray) && vValor) {
		nLen = a_vArray.length
		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){
	var nPos=-1;
	if (IsArray(a_vArray)) {
		var nLen=a_vArray.length;
		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){
	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(sMsgError, oFormInput, nType){
	sMsgError = "["+ oIForm.m_sObj +" v"+ oIForm.m_nVersion + "]\n" +sMsgError
	if (oFormInput) {
		var oInput
		var oForm = oFormInput
		if (oFormInput.form) {
			oForm = oFormInput.form
			oInput = oFormInput
		}
		if (oForm) sMsgError += "1\nFORM:\n " + InfoDevForm (oForm)
		if (oInput) sMsgError += "2\nINPUT:\n " + DebugInput (oInput,0)
	}
	if (typeof(oIGZ)!="undefined") 	ErrorJS (sMsgError,null,nType,1)
	else alert(location.href + "\n" + sMsgError);
}

function Texto2NumeroLib(sNumero){		//Numero a 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;
	return(importe_retorno);
}

// [bReturnNaN] Devuelve "" si sNumero no es un numero
function Texto2Numero(sNumeroIn,bReturnNaN){		// Numero a String - 1.000,5 a 1000.5
var sNumero,nPuntoPos1,nComaPos1,nPuntoPos2,nComaPos2,regExp,nNumero
var regCantidades=/[^0-9 .,-]/gi

	sNumeroIn = new String( sNumeroIn );
	bExponente = sNumeroIn.toLowerCase().indexOf( "e" ) > 0;
	if ( bExponente ){
		sNumero=parseFloat(sNumeroIn);
		if ( !isNaN( sNumero ) ){
			return sNumero;
		}
	}

	sNumeroIn = "" + sNumeroIn
	sNumero = sNumeroIn.replace(regCantidades,"")
	if (bReturnNaN && sNumeroIn!=sNumero) return (sNumeroIn)
	if (sNumero=="") sNumero="0"

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

	if (nComaPos2>nPuntoPos2){
		nComaPos1 = sNumero.indexOf(",")
		regExp = /[\x2e]/g
		sNumero = sNumero.replace(regExp,"")
		if (nComaPos1==nComaPos2){
			regExp = /[\x2c]/g
			sNumero = sNumero.replace(regExp,"\x2e")
		}
		else{
			regExp = /[\x2c]/g
			sNumero = sNumero.replace(regExp,"")
		}
	}
	else{
		nPuntoPos1 = sNumero.indexOf(".")
		regExp = /[\x2c]/g
		sNumero = sNumero.replace(regExp,"")
		if (nPuntoPos1!=nPuntoPos2){
			regExp = /[\x2e]/g
			sNumero = sNumero.replace(regExp,"")
		}
	}

	nPuntoPos2 = sNumero.lastIndexOf(".")
	if ((new Number(sNumero.substring(0,nPuntoPos2)))!=0&&nPuntoPos2==sNumero.length-4 && sNumero.length<=7){
		regExp = /[\x2e]/g
		sNumero = sNumero.replace(regExp,"")
	}
	nNumero= parseFloat(sNumero)
	return nNumero
}

// Devuelve el numero con la puntuación y el numero de decimales que se le diga.
// [nFormato] 1/2/3 (Español/Ingles/sin separador de miles)
function Numero2Texto(nNum,nNumDec,nFormato,bForzarDecs,bInputEsNumero){
var a_sPuntEnt = [0,".",",",""]
var a_sPuntDec = [0,",",".","."]
var sSigno="";
	if ( !bInputEsNumero ){
		nNum = Texto2Numero(nNum)
	}else if ( isNaN( parseFloat( nNum ) ) ){
		nNum = 0;
	}
	if (nFormato==null) nFormato=1
	if (nNum<0){
		sSigno="-";
		nNum= Math.abs(nNum);
	}

	if (nNumDec) {
		nNum = Math.round(nNum * Math.pow(10,nNumDec))
		nNum = nNum/Math.pow(10,nNumDec)
		sNumeroEntero = Math.floor(nNum).toString()
	}
	else{
		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){
	var 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: cumplen las reglas
// bFilled: estan rellenos
// bEmpty : estan vacios
// bHidden: permite hidden
function InputEnabler (bValido,bFilled,bEmpty,bHidden, oForm) {
	var e,f
	var nForms = 1
	if(!oForm) nForms = document.forms.length;
	for (e=0;e<nForms;e++) {
		if (!oForm || e>0) oForm=document.forms[e]
		for (f=0;f<oForm.length;f++) {
			if (!bValido || CheckInput (oForm[f],0,bHidden,1) ){
				if (oForm[f].disabled) {
					if (!oForm[f].value) {
						if (bEmpty) oForm[f].disabled=0
					}
					else{
						if (bFilled) oForm[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=oFormOrElement, sError="";
	if(oFormOrElement.form) oForm=oFormOrElement.form;
	else if(oFormOrElement.tagName.toUpperCase()!="FORM") ErroresForm("[i_form.ChangeFieldsState] 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) ErroresForm("No se encontrarón los campos:\n"+sError);
}
function EnabledFields(oFormOrElement, a_sFields, sClassName){ ChangeFieldsState(oFormOrElement, a_sFields, 0, sClassName); }
function DisabledFields(oFormOrElement, a_sFields, sClassName){ ChangeFieldsState(oFormOrElement, a_sFields, 1, sClassName); }

function SetObjState(vObj, sClassName, vForm, bState){
	if(document.forms.length>1 && GetType(vObj)==String){
		if(!vForm) alert("SetObjState: Debes indicar un <FORM> para el elemento '"+vObj+"' porque existen varios <FORM> en la página.");
		else{
			if(GetType(vForm)==String) vForm=document.forms[vForm];
			vObj=vForm[vObj];
		}
	}
	else if(GetType(vObj)==String) vObj=document.forms[0][vObj];

	if(!sClassName){
		if(vObj.getAttribute("oldClassName")) sClassName=vObj.getAttribute("oldClassName")
		else sClassName=vObj.getAttribute("className")
	}

	vObj.setAttribute("oldClassName", vObj.getAttribute("className"));
	vObj.setAttribute("className", sClassName);

	if(bState) vObj.disabled=0;
	else vObj.disabled =1;
}
function SetObjEnabled(vObj, sClassName, vForm) { SetObjState(vObj, sClassName, vForm, 1); }
function SetObjDisabled(vObj, sClassName, vForm){ SetObjState(vObj, sClassName, vForm, 0); }

function SetAllState(vForm, sClassName, bState){
	if(vForm && GetType(vForm)==String) vForm=document.forms[vForm];
	else if(!vForm) vForm=document.forms[0];
	for(var f=0; f<vForm.length; f++){
		SetObjState(vForm[f], sClassName, "", bState);
	}
}
function SetAllEnabled(vForm, sClassName){ SetAllState(vForm, sClassName, 1); }
function SetAllDisabled(vForm, sClassName){ SetAllState(vForm, sClassName, 0); }

//Checkea como obligatorios los campos que le pasemos en el array
function CheckNeedFull(oFormOrElement, a_sFields){
	var oForm=oFormOrElement;
	if(oFormOrElement.form) oForm=oFormOrElement.form;
	else if(oFormOrElement.tagName.toUpperCase()!="FORM") ErroresForm("No se encontró el objeto FORM");
	if(oForm){
		var oInput,sError = ""
		for(var f=0; f<a_sFields.length; f++){
			oInput=oForm[a_sFields[f]];
			if (!CheckInput (oInput)) sError+=a_sFields[f]+"\n";
		}
		if(sError) ErroresForm("No se encontrarón los campos:\n"+sError);
	}
}

function CreaCombo(sSelectName,sFuncion,vTitulo,a_sNombre,a_sValor,vValorSelected) {
	var i,nValue
	var nValor=0
	if (!a_sNombre) a_sNombre = []

	if (a_sValor==-1) {
		a_sValor=a_sNombre
		nValor=1
	}
	if (IsArray(a_sNombre) && IsArray(a_sNombre[0])) a_sNombre = GetCol (a_sNombre[0],a_sNombre[1],a_sNombre[2])
	if (IsArray(a_sValor) && 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=[]
		for (i=0;i<a_sNombre.length;i++){	// X
			a_sValor[i]=i+nValue
		}
	}

	var a_sCombo = [];
	var sCombo ='<SELECT name="'+sSelectName+'"'
	if (sFuncion) sCombo+= " " +sFuncion
	sCombo+='>'
	a_sCombo[a_sCombo.length]=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>"

		a_sCombo[a_sCombo.length]=sCombo;

	}

	for (i=0;i<a_sNombre.length-nValor;i+=1+nValor){
		if (a_sNombre[i]){
			sCombo = "<OPTION "
			if (IsArray(a_sValor)){
				sCombo += 'value="' + a_sValor[i+nValor] + '"'
				if (vValorSelected && (a_sValor[i+nValor]==vValorSelected || a_sNombre[i]==vValorSelected)) sCombo +=" selected"
			}
			sCombo += ">" + a_sNombre[i] + "</OPTION>"
			a_sCombo[a_sCombo.length]=sCombo;
		}
	}
	sCombo='</SELECT>'
	a_sCombo[a_sCombo.length]=sCombo;
	return a_sCombo.join(" ");
}

function PrintCombo(sSelectName,sFuncion,vTitulo,a_sNombre,a_sValor,vValorSelected){
	document.write(CreaCombo(sSelectName,sFuncion,vTitulo,a_sNombre,a_sValor,vValorSelected));
}

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 GetValueRange (oInput) {
	var vVal = ""
	if (oInput) {
		vVal = GetObjAttribute( oInput,"minvalue" )
		if (IsNull(vVal)) vVal = GetObjAttribute( oInput,"maxvalue" )
		if (isNaN(vVal) && !EsFecha(vVal)) vVal = oInput.form[vVal].value
	}
	return (vVal)
}

function IsNumberRange (oInput,bErrorText) {
	var bOk = 1
	if (oInput && oInput.value!="") {		
		var oForm = oInput.form
		var oNumber = oInput.value.f_toNumber ()
		var sMin = GetObjAttribute( oInput,"minvalue" )
		var sMax = GetObjAttribute( oInput,"maxvalue" )
		if (sMin && isNaN(sMin)) sMin = oForm[sMin].value
		if (sMax && isNaN(sMax)) sMax = oForm[sMax].value
		bOk = oNumber.f_range(sMin,sMax)
		if (!bOk && bErrorText) {
//			g_sErrorText= GetNumeroLimite (sMin,sMax);
			g_sErrorText=oIGZ.f_langText("NumeroLimite", [sMin,sMax])
		}
	}
	return (bOk)
}

function IsDateRange (oInput,bErrorText) {
	var oFechaMin, oFechaMax
	var bOk = 1
	var oForm = oInput.form
	if (oInput && oInput.value!="") {
		var oFecha = GetInputDate (oInput)
		var sFechaMin = GetObjAttribute( oInput,"minvalue" )
		var sFechaMax = GetObjAttribute( oInput,"maxvalue" )
		if (!sFechaMax) sFechaMax = oIForm.m_sFechaMax
//alert ("IDR0:"+sFechaMin + "\n" + !IsNull(oForm[sFechaMin]) + "\n" + document.getElementsByName(oForm[sFechaMin]))
//alert ("IDR1:"+sFechaMin + "\n" + !IsNull(oForm[sFechaMin]))
//		if (sFechaMin && !EsFecha(sFechaMin)) {
		if (sFechaMin && !IsNull(oForm[sFechaMin]) && oForm[sFechaMin].value.length) {	//Es el nombre de un Input
//alert("IDRMIN1" + oForm[sFechaMin].value +"\n"+oForm[sFechaMin].value.length)
			oFechaMin = GetInputDate(oForm[sFechaMin])
			sFechaMin = oForm[sFechaMin].value
		}
		else {
			oFechaMin = sFechaMin	
		}
//		if (sFechaMax && !EsFecha(sFechaMax)) {
//		if (sFechaMax && !IsNull(oForm[sFechaMax]) && document.getElementsByName(oForm[sFechaMax]).value.length) {	//Es el nombre de un Input
		if (sFechaMax && !IsNull(oForm[sFechaMax]) && oForm[sFechaMax].value.length) {	//Es el nombre de un Input
//alert (document.getElementsByName(sFechaMax).length + "_Max:"+sFechaMax +": "+ oForm[sFechaMax].value + "\n" +CheckInputName(oForm[sFechaMax]) + "\n" + (oForm[sFechaMax].form==oForm))
			oFechaMax = GetInputDate(oForm[sFechaMax])
			sFechaMax = oForm[sFechaMax].value
		}
		else {
			oFechaMax = sFechaMax
		}
//alert ("IDR2:"+ oInput.name +"\nMIN:"+oFechaMin + "\n" + sFechaMin +"\nMAX:"+ oFechaMax + "\n" + sFechaMax  )
		bOk = oFecha.f_range(oFechaMin,oFechaMax)
		if (!bOk && bErrorText) {
//			g_sErrorText= GetTextFechaLimite(sFechaMin,sFechaMax);
			g_sErrorText=oIGZ.f_langText("FechaLimite", [sFechaMin,sFechaMax])
		}
	}
	return (bOk)
}

function GetInputDate (oInput) {		//1.363
	var sFormat = null
	var sDate = oInput.value
	if (sDate) {
		var cTipoForm;
		if ( GetObjAttribute( oInput,"tipo" ) != null ) {
			cTipoForm = GetPrefixFromType( oInput );
		}
		else {
			cTipoForm = CheckTipoForm (oInput.name,1)
		}
		if (cTipoForm){
			switch (cTipoForm.toUpperCase()) {
				case "D":
					sFormat = oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaShowD)
					break
				case "F":
					sFormat = oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaShowF)
					break
				case "G":
					sFormat = oIForm.f_GetFormatoFecha (oInput,g_sFormatoFechaShowG)
			}						
		}
//alert ("GetInputDate:\n" + sDate+ "\n" + sFormat)
		sDate = sDate.f_toDate (sFormat,1)
	}	
	return (sDate)
}


function TestFuncionZ(oInput){
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
}

// [sMarca] cambia solo los que estan marcados o en un estado de visibilidad distinto
// [nModo] 0/1 Marcados/Marcar Visibles
function SetVisibAllSelect(bShow,sAtributo,nModo){
	var oForm, oInput, bSet, 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++){
			oInput=oForm[i];
			if(oInput.type=="select-one" || oInput.type=="select-multiple"){
				bSet = 1
				if (typeof(oIGZ)!="undefined" && oIGZ.m_nVersion>=0.707 && sAtributo) {
					if (nModo==1) {
						if (IsVisible(oInput)!=bShow) oInput.setAttribute (sAtributo,1)
					}
					else if (!oInput.getAttribute (sAtributo)) {
						bSet = 0
					}
				}
				if (bSet) oInput.style.visibility=sVisib;
			}
		}
	}
}
function SetShowAllSelect(sAtributo){
	SetVisibAllSelect(1,sAtributo);
}

function SetHideAllSelect(sAtributo,nModo){
	SetVisibAllSelect(0,sAtributo,nModo);
}

function InitFixAtSubmit(){
	g_a_vFixAtSubmit = []
}

function AddFixAtSubmit(sInput,vNewVal){
	var nLen = g_a_vFixAtSubmit.length
	g_a_vFixAtSubmit [nLen++] = sInput
	g_a_vFixAtSubmit [nLen++] = vNewVal
	g_a_vFixAtSubmit [nLen] = ""
}

function FixAtSubmit(oForm){
	var sInput
	for (var f=0;f<g_a_vFixAtSubmit.length;f=f+3){
		if (g_a_vFixAtSubmit [f+1]=="Tipo_Y") SelectOptions(oForm,g_a_vFixAtSubmit[f],1)
		else {
			g_a_vFixAtSubmit[f+2] = GetInputValue(oForm[g_a_vFixAtSubmit[f]])			//1.366
			SetInputValue(oForm[g_a_vFixAtSubmit[f]],g_a_vFixAtSubmit [f+1])
		}
	}
}

oIForm.f_resetFixAtSubmit = function (oForm) {	//1.366
	for (var f=0;f<g_a_vFixAtSubmit.length;f=f+3){
		SetInputValue(oForm[g_a_vFixAtSubmit[f]],g_a_vFixAtSubmit [f+2])
	}
}

// [oForm]
function FormCambios (oForm) {
	var f,g,oInput

	if (oForm) oForm = document.forms[0]
	var nCambios=0
	if (oIForm.m_maValues[1].length==0) return(0)
	for (var f=0;f<oForm.length;f++) {
		oInput = oForm[f]
		if (ValidarInput (oInput,0)) {
			g = BuscaArray (oIForm.m_maValues[0],oInput.name,1)
			if (g!=-1 && oInput.type!="file" && oInput.type!="hidden") {
				if (oInput.value != oIForm.m_maValues[1][g]) {
					nCambios++
				}
			}
		}
	}
	return (nCambios)
}

function InfoDevPage () {
	var sInfoDEV= "["+location.href+"]\n"
	return (sInfoDEV)
}
function InfoDevForm (oForm) {
	var sInfoDEV = "name='"+ oForm.name +"' action='"+oForm.action+"' method='"+oForm.method+"' enctype='"+oForm.encoding+"'\n"
	return (sInfoDEV)
}
function InfoDevInput (oInput) {
	var sInfoDEV = "INPUT: "+ DebugInput (oInput,1) + "\n"
	return (sInfoDEV)
}

//Mejor Usar: DrawCalendar, PrintCalendar y OpenCalendar
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");
}

// Funciones del Calendario
// DrawCalendar, PrintCalendar y OpenCalendar
var protected_oCalendarInput;
function DrawCalendar(sInputName){
	var bOk=0, sHTML="";
	if(!sInputName) bOk=1;
	if(!bOk && document.getElementsByName(sInputName).length==0) alert("No hay ningún elemento con la propiedad name="+sInputName);
	else if(!bOk && document.getElementsByName(sInputName).length>1) alert("Existe más de un elemento con la propiedad name="+sInputName);
	else{
		var sInput="";
		if(sInputName){
			var oInput=document.getElementsByName(sInputName)(0);
			var oForm =oInput.form;
			sInput=oForm.name+"."+oInput.name;
		}
		if(GetType("g_sFullPathIcons", 1)) g_sFullPathIcons="../../pix/ico/calendar/";
		sHTML+="<A tipo='editar' href='javascript://' onclick='OpenCalendar(\""+sInput+"\", this)'><IMG src='" +g_sFullPathIcons+ "calendario.gif' width=26 height=23 border=0 /></A>";
	}
	return (sHTML);
}
function PrintCalendar(sInputName){ document.write(DrawCalendar(sInputName)) }
function OpenCalendar(sInput, oObj){
	if(!sInput) protected_oCalendarInput=GetInputElement(oObj);
	NewWin("wCalendario", oIGZ.m_sRootPath+ "libs/js/calendario.html?input="+sInput+"&modo=1",250,160);
}

function IFormMouseMove(e){
	oIFormShield.m_nMousePosX=event.clientX;
	oIFormShield.m_nMousePosY=event.clientY;
}

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 (){
		var oLayer = document.getElementById(this.m_sId);
		if (IsNull(oLayer)) {
			this.f_setEnabled(1)
		}
		else {
			var oLayerTxt = document.getElementById(this.m_sId+"Txt");
			oLayer.style.visibility='visible'
			oLayerTxt.style.visibility='visible'
		}
		SetHideAllSelect(this.m_sBase,1)
	}
	this.f_setHide=function (){
		var oLayer = document.getElementById(this.m_sId);
		if (IsNull(oLayer)) ErroresForm ("oIFormShield.f_setHide : necesita hacer un f_setShow() antes")
		var oLayerTxt = document.getElementById(this.m_sId+"Txt");
		oLayer.style.visibility='hidden'
		oLayerTxt.style.visibility='hidden'
		SetShowAllSelect(this.m_sBase)
	}
	this.f_innerHTML=function (sInner,sId){
		this.m_sInnerHTML=sInner;
		eval(this.m_sElement+".innerHTML=this.m_sInnerHTML");
	}

	this.f_setEnabled=function (bShow){
		var oLayer = document.getElementById(this.m_sId);
		var oLayerTxt = document.getElementById(this.m_sId+"Txt");
		if(oLayer)
			oLayer.parentNode.removeChild(oLayer);
		if(oLayerTxt)
			oLayerTxt.parentNode.removeChild(oLayerTxt);
		if(this.m_bNS4) return 0;
		var nWinSizeX=document.body.clientWidth;
		var nWinSizeY=document.body.clientHeight;
		var nScrollX =document.body.scrollWidth;
		var nScrollY =document.body.scrollHeight;
		var nPosX	 =(Math.min(nWinSizeX,nScrollX)/2)+document.body.scrollLeft-50;
		var nPosY	 =(Math.min(nWinSizeY,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+"'>";
		sHTML+="<TR>";
		sHTML+="<TD bgcolor='"+g_sShieldBGColor+"' height='50' valign='top'>&#160;</TD>";
		sHTML+="</TR>";
		sHTML+="</TABLE>";
		sHTML+="</SPAN>";

		sHTML+="<SPAN id='"+oIFormShield.m_sId+"Txt' style='position: absolute; top: "+nPosY+"; left: "+nPosX+"; z-index: 51;'>";
		sHTML+=g_sShieldInner;
		sHTML+="</SPAN>";

		var oSpan=document.createElement("SPAN");
		oSpan.innerHTML=sHTML
		document.body.appendChild(oSpan);

		if(this.m_bIE){
			eval(this.m_sLay+".filter='alpha(opacity="+g_nShieldAlpha+")'");
		}
		else{
			try {
				eval(this.m_sLay+".opacity="+(g_nShieldAlpha/100));
			}
			catch (ex) {
				ErroresForm ("[i_form.oIFormShield] error. ¿FF1.5?")
			}
		}
		if (!bShow) this.f_setShow()
	}
}

function TextInput2Input( oInput ){
	if ( oInput.noShow ){
		oInput.style.display = 'inline';
	}else{
		switch( oInput.type ){
		case "text": case "textarea": case "password":
		case "select-multiple": case "select-one":
			var oSPAN = document.getElementById( "ig_" + oInput.name );
			oSPAN.parentElement.removeChild( oSPAN );
			oInput.style.display = 'inline';
			break;
		case "submit": case "image":
			oInput.style.display = 'inline';
			break;
		case "hidden":
			break;
		default:
			oInput.disabled = false;
			break;
		}
	}
}


function Input2TextInput( a_oInput, sStyle ){
	var f,oInput
	var oForm=GetForm()
	if(!IsArray(a_oInput)) a_oInput=[a_oInput];
	var sTexto
	for (f=0; f<a_oInput.length;f++) {
		oInput = a_oInput [f]
		if (typeof(oInput)!="object"){
			oInput = oForm [oInput]
		}
		if (oInput.noShow ){
			oInput.style.display = 'none';
		}else{
			var sType = oInput.type
			if (sType=="undefined") sType = oInput.tagName
			if ( typeof( sType ) == "undefined" ) sType = "";

			sType = sType.toLowerCase()
			switch( sType ){
			case "text":
				Input2Text (oInput,oInput.value,sStyle)
				break;
		 	case "textarea":
				Input2Text (oInput,oInput.innerHTML,sStyle)
				break;
			case "select-multiple":
			case "select-one":
			case "select":
				sTexto = "";
				for( var k = 0; k < oInput.options.length; k++ ){
					if ( oInput.options[ k ].selected && oInput.options[ k ].value != "" ){
						sTexto += oInput.options[ k ].text + "<BR/>";
					}
				}
				if ( sTexto ){
					sTexto = sTexto.substring( 0, sTexto.length - 5 );
				}
				Input2Text (oInput,sTexto,sStyle)
			 	break;
			case "password":
				sTexto = sTexto ? "*****" : "";
				break;
			case "submit":
			case "image":
				oInput.style.display = 'none';
				break;
			case "button":
			case "hidden":
			case "fieldset":
				break;
			default:
				oInput.disabled = true;
				break;
			}
		}
	}
}

function Input2Text (oInput,sTexto,sStyle){
	oInput.style.display = 'none';
	var oSPAN = document.createElement("SPAN");
	if ( sStyle ) oSPAN.style.cssText = sStyle;
	oSPAN.innerHTML = sTexto;
	oSPAN.id = "ig_" + oInput.name;
	oInput.parentNode.insertBefore( oSPAN, oInput );
}

function SwapHideActionElements(bShow){
  var a = document.all.item("noShow");
	if (a!=null) {		
		if (a.length!=null) {		//multiple tags found
			for (i=0; i< a.length; i++) {
				a(i).style.display = bShow ? "inline" :"none";
			}
		} 
		else {	//only one tag
			a.style.display = bShow ? "inline" :"none";
		}
	}
}

function Form2TextForm( oForm, sStyle ){
	var oElements = oForm.elements;
	for( var j = 0; j < oElements.length; j++ ){
		var oInput = oElements[ j ];
		Input2TextInput( oInput, sStyle );
	}
	SwapHideActionElements(false);
}

function TextForm2Form( oForm ){
	var oElements = oForm.elements;
	for( var j = 0; j < oElements.length; j++ ){
		var oInput = oElements[ j ];
		TextInput2Input( oInput );
	}
	SwapHideActionElements(true);
}

function AllForms2TextForms( sStyle ){
	for( var i = 0; i < document.forms.length; i++ ){
		Form2TextForm( document.forms[ i ], sStyle );
	}
}

function AllTextForms2Forms(){
	for( var i = 0; i < document.forms.length; i++ ){
		TextForm2Form( document.forms[ i ] );
	}
}

function ComprobarForm(){
	ErroresForm("Falta la funcion ComprobarForm()","",3);
}

oFormFile = function (){
	this.f_draw = function (sHTMLFile, sHTMLAdd, sURL2bd, bWinMode){
		var sHTML = "<SPAN onclick='' >"+sHTMLAdd+"</SPAN>";
		return (sHTML);
	}
	this.f_print = function (sHTMLFile, sHTMLAdd, sURL2bd, bWinMode){ document.write( this.f_draw(sHTMLFile, sHTMLAdd, sURL2bd, bWinMode) ); }
}
