i_form_nVersion=1.535;

/**
 * @overview Esta librería contiene los objetos y metodos relacionado con Formularios.
 * @overview ©2008 Intelygenz - www.intelygenz.com
 * [JSDOC]	http://intranet.intelygenz.com/ig11_desarrollo_librerias/ig11_01_js/docs/i_form.html
 * [VER]	P:\IG_IntelyGenZ\IG11_Desarrollo_Librerias\IG11_01_Js\docs\i_form.txt
 * [DOC]	http://intranet.intelygenz.com/ig05_intranet/desarrollo/areas/dev/docs/i_form.html
 * [DEV] 	P:\IG_IntelyGenZ\IG11_Desarrollo_Librerias\IG11_01_Js\src\i_form.js
 * [SVN] 	http://alex:8100/svn/ig_intelygenz/IG11_01_Js/src/i_form.js
 * [PRO] 	___P:\IG_IntelyGenZ\IG11_Desarrollo_Librerias\IG11_01_Js\pro\
 *
 * @name i_form.js
 * @author <a href="mailto:manuel.martin-vivaldi@intelygenz.com">Manuel</a>
 * @version    1.535
 */


if(typeof(oIGZ)=="undefined" && document) {	//1.529
	alert (document.location.pathname +"\n[i_form "+ i_form_nVersion + "] Falta 'i_core.js' o 'i_igz.js'.\n Estas libs se requieren desde la v1.324")
}

oIGZ.f_loadLib("i_form",i_form_nVersion);
oIGZ.f_require("i_core",0.919);
oIGZ.f_require("i_igz", 0.747);
oIGZ.f_require("i_lang_"+ICore.m_sLang,1.024);

g_bShield = 1;
g_sShieldBGColor="#F0F0F0";
g_sShieldInner ="<FONT color='#505050' size='2'><B>"+oIGZ.f_langText("TextoShield")+" . . .</B></FONT>";
g_nShieldAlpha =80;

g_sTecladoFuncion = "ComprobarForm";
g_bSelectSubmit = 0;	//1.523
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;			//Esto deberia estar a 0 en todas las paginas (esta a 1 por retrocompatibilidad)
g_bClearAutoCheckbox = 0;

g_bIFile_clearAll =1;		//1 XBD Borra los INPUT FILE para que no se reenvien varias veces

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 = "";

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;


IForm = new function(){
	this.m_sObj="IForm";
	this.m_nVersion=i_form_nVersion;
	this.m_oForm=null;
	this.m_sInputName="";
	this.m_maValues = [];

	this.m_nFile2Text = 0;
	this.bForceDateFormat = 1;		//1.363

	this.m_a_oForms = [];

	this.f_init = function (oFormOrFormName, maData, bSinPrefijo, nFormSize, bInitColor ) {
		if ( IsNull(bSinPrefijo) ) {
			bSinPrefijo = 1;
		}
		if ( GetType(oFormOrFormName)==String ) {
			oFormOrFormName = IForm.f_getForm(oFormOrFormName);
		}
		InitForm(oFormOrFormName, nFormSize, bInitColor, bSinPrefijo, maData);

	}

	this.f_refresh = function (oForm) {	
		var f,oInput;
		if (!oForm){
			oForm = this.m_oForm;
		}
		for (f=0;f<oForm.length;f++) {
			oInput = oForm[f]
			IInput.f_refresh (oInput)
		}
	}


	this.f_clearForm = function (oForm) {
		if (!oForm){
			oForm = this.m_oForm;
		}
		for (var f=0;f<oForm.length;f++){
			if ( CheckInput(oForm[f],0,1) && oForm[f].name.indexOf("xbd_")!=0 ) {
				IInput.f_clearInputValue (oForm[f]);
			}
		}
	}

	this.f_initInputText = function ( oInput ) {
		var sTitulo;
		var sType = String(oInput.type).toUpperCase();

		if ( sType=="TEXT" || sType=="TEXTAREA" || sType=="PASSWORD" ) {
			sTitulo = oInput.getAttribute("_titulo");
			if ( sTitulo!=null ) {
				oIInput.f_init(oInput);
				oIInput.f_restoreTitulo(oInput);
			}
		}
	}

	this.f_getForm = function (sNameForm) {
		var oForm = document["forms"][sNameForm];
		if ( IsNull(oForm) ) {
			var a_oForms = document["forms"];
			var a_sForms = [];
			for ( var f=0, F=a_oForms.length; f<F; f++ ) {
				a_sForms.push(a_oForms[f].name);
			}
			ErrorJS("No existe el FORM ["+sNameForm+"] en la página\nFORMs ("+a_oForms.length+")["+a_sForms+"]");
			oForm = null;
		}
		return oForm;
	}

	this.f_initInput = function (oInput) {
		var cTipo,vValor,sFF;
		cTipo = CheckTipoForm (oInput.name);
		vValor = oInput.value;
		if (cTipo=="D" && !vValor) {
			sFF = IInput.f_getDateFormatShow(oInput);
			if (sFF) {
				vValor = (new Date()).f_drawFormat (sFF);
			}
			else {
				vValor = FechaHoy(0);
			}
			oInput.value = vValor;
		}
	}

//GetInitValues([oForm])	//Recoge de nuevo los valores por si los hemos cargado/cambiado despues de InitForm()
	this.f_getNewInputValues = function (oForm) {		//Añade nuevos pero no actualiza antiguos
		oForm = GetForm (oForm);
//Recorre form, si no existe input lo añade al MA
// Que pasa con los que hayamos borrado? otra rutina?
		for (var i=0;i<oForm.length;i++) {
			oInput = oForm.elements[i];
			if (ValidarInput (oInput,1,g_bInitValuesSinPrefijo)) {
				if (g_ma_sInitValues.f_maGetRegIf ("name", oInput.name)==-1) {
					g_ma_sInitValues.f_maNewRow([oInput.name,GetInputValue(oInput)]);
				}
			}
		}
	}

	this.f_updateInputValue = function (oInput) {	//1.534
		if (ValidarInput (oInput,1,g_bInitValuesSinPrefijo)) {
			var nReg = g_ma_sInitValues.f_maGetRegIf ("name", oInput.name)
			if (nReg!=-1) {
				g_ma_sInitValues.f_maSetVal ("value", GetInputValue(oInput), nReg)
			}
			else {
				g_ma_sInitValues.f_maNewRow([oInput.name,GetInputValue(oInput)]);
			}
		}
	}


	this.m_sRellenarPre = "(";
	this.m_sRellenarPost = ")";
	this.f_getNombreCampo = function (sInputName,bRemovePreBD){
		var sNC = ""
		if (sInputName || this.m_sRellenarPre || this.m_sRellenarPost) {
			sInputName = this.f_removeDTO(sInputName)
			sInputName = RemovePrefijoSufijo (sInputName)
			if (bRemovePreBD){
				var a_sPre = ["fkid","cd","ds","fc","idx"]		//"id" es un poco peligroso
				for (var f=0;f<a_sPre.length;f++){
				   sInputName = sInputName.replace(RegExp("^"+a_sPre[f],"i"),"");
				}
			}
			sNC = this.m_sRellenarPre + sInputName
			if (this.m_sRellenarPost) sNC += this.m_sRellenarPost
		}
		return sNC;
	}

	this.f_removeDTO = function (sInputName) {
		if(sInputName){
			var nPosT = sInputName.indexOf ("@")
			if (nPosT!=-1 ) {
				sInputName = sInputName.substring(0,nPosT)
			}
		}
		return sInputName;
	}


	this.m_sDebug = "";
}


IInput = new function () {
	this.m_a_oInputs = [];

	this.f_clearInputValue = function (oInput) {
		if (typeof(oInput)=="object"){
			var noClear;
			switch( oInput.type ){
				case"radio":
				case"checkbox":
					var nRadios = oInput.length
					if (nRadios){
						for (i=0;i<nRadios;i++) {
							noClear = oInput[i].getAttribute("_noClear");
							if(!noClear){ oInput[i].checked=false; }
						}
					}
					else{
						noClear = oInput.getAttribute("_noClear");
						if(!noClear){ oInput.checked=false; }
					}
					break;
				case"button":
					break;
				default:
					noClear = oInput.getAttribute("_noClear");
					if(!noClear){
						SetInputValue(oInput,"",0);
					}
			}
			if(!noClear){
				this.f_refresh (oInput);
			}
		}
	}

	this.f_refresh = function  (oInput) {
		var g = BuscaArray (IForm.m_maValues[0],oInput.name,1)
		if (g!=-1 && oInput.type!="file") {
			var sVal = oInput.value; 
			IForm.m_maValues[1][g] = sVal;
			a_vFormValues[g] = sVal;
		}		
	}

	this.f_getDateFormat = function (oInput, sTipo) {
		var sDateFormat;
		var sCaracter = oInput.name.substring(0, 1);

		switch (sCaracter.toUpperCase()) {
			case "D":
				if ( sTipo=="IN" ){
					sDateFormat = g_sFormatoFechaInD;
				}
				else if ( sTipo=="SHOW" ) {
					sDateFormat = g_sFormatoFechaShowD;
				}
				else {
					sDateFormat = g_sFormatoFechaD;
				}
				break;
			case "F":
				if ( sTipo=="IN" ) {
					DateFormat = g_sFormatoFechaInF;
				}
				else if ( sTipo=="SHOW" ) {
					sDateFormat = g_sFormatoFechaShowF;
				}
				else {
					sDateFormat = g_sFormatoFechaF;
				}
				break;
			case "G":
				if ( sTipo=="IN" ) {
					sDateFormat = g_sFormatoFechaInG;
				}
				else if ( sTipo=="SHOW" )  {
					sDateFormat = g_sFormatoFechaShowG;
				}
				else {
					sDateFormat = g_sFormatoFechaG;
				}
				break;
		}
		return sDateFormat;
	}

	this.f_getDateFormatIn = function (oInput) {
		var sDateFormat;
		if ( !IsNull(oInput) ) {
			sDateFormat = oInput.getAttribute("_dateFormatIn");
			if ( IsNull(sDateFormat) ) {
				sDateFormat =oInput.getAttribute("formato_in"); // Retrocompatibilidad
			}
		}
		if ( IsNull(sDateFormat) ) {
			sDateFormat = this.f_getDateFormat(oInput, "IN");
		}
		return sDateFormat;
	}
	this.f_getDateFormatShow = function (oInput) {
		var sDateFormat;
		if ( !IsNull(oInput) ) {
			sDateFormat = oInput.getAttribute("_dateFormatShow");
			if ( IsNull(sDateFormat) ) {
				sDateFormat =oInput.getAttribute("formato");	// Retrocompatibilidad
			}
		}
		if ( IsNull(sDateFormat) ) {
			sDateFormat = this.f_getDateFormat(oInput, "SHOW");
		}
		return sDateFormat;
	}
	this.f_getDateFormatOut = function (oInput) {
		var sDateFormat;
		if ( !IsNull(oInput) ) {
			sDateFormat = oInput.getAttribute("_dateFormatOut");
			if ( IsNull(sDateFormat) ) {
				sDateFormat =oInput.getAttribute("formato_out"); // Retrocompatibilidad
			}
		}
		if ( IsNull(sDateFormat) ) {
			sDateFormat = this.f_getDateFormat(oInput, "OUT");
		}
		return sDateFormat;
	}

	this.f_init = function (oInput) {
		this.m_a_oInputs.push(oInput);

		var sTituloStyle = oInput.getAttribute("_classNameTit");
		if ( IsNull(sTituloStyle) ) {
			oInput.setAttribute("_classNameTit", oInput.className);
		}

		if ( oInput.maxLength>0 ) {
			oInput.setAttribute("_maxLength", oInput.maxLength);
		}
		else {
			oInput.setAttribute("_maxLength", 10000);
		}
 		oInput.maxLength = 10000;

		var sType = String(oInput.type).toUpperCase();

		var f_onfocus = oInput.onfocus;
		var f_onblur  = oInput.onblur;
		oInput.onfocus = function () {
			oIInput.f_cleanTitulo(this);
			if ( f_onfocus ) {
				f_onfocus();
			}
		}
		oInput.onblur = function () {
			oIInput.f_restoreTitulo(this);
			if ( f_onblur ) {
				f_onblur();
			}
		}
	}

	this.f_cleanTitulo = function ( oInput ) {
	    if ( oInput.value==oInput.getAttribute("_titulo") ){
	    	oInput.className = String(oInput.getAttribute("_classNameTit"));
			oInput.maxLength = oInput.getAttribute("_maxLength");
	    	oInput.value 	 = "";
	    }
	}

	this.f_restoreTitulo = function ( oInput ) {
		if ( !oInput.value ){
			oInput.className = oInput.getAttribute("_classNameTit");
			oInput.maxLength = 10000;
			oInput.value 	 = oInput.getAttribute("_titulo");
		}
	}

	this.f_restoreAll = function () {
		var oInput;
		for ( var f=0, F=this.m_a_oInputs.length; f<F; f++ ) {
			oInput = this.m_a_oInputs[f];
			this.f_restoreTitulo(oInput);
		}
	}
}
oIInput = IInput;


IFile = new function (){
	this.f_clearAll = function ( oForm ) {		// Limpia el contenido de todos los campos file
		if (g_bIFile_clearAll) {
			var a_oInputs = oForm;
			var oInput;
			for ( var f=0, F=a_oInputs.length; f<F; f++ ) {
				oInput = a_oInputs[f];

				if ( oInput && oInput.type && oInput.type.toUpperCase()=="FILE" ) {
					this.f_clear(oInput);
				}
			}
		}
	}

	this.f_clear = function ( oFile ) {
		// var oFileNew = oFile.cloneNode(true);
		var oFileNew = document.createElement("INPUT");
		oFileNew.setAttribute("name", oFile.name);
		oFileNew.setAttribute("type", oFile.type);
		oFileNew.setAttribute("className", oFile.className);
		if(oFile.disabled){	//1.512
			oFileNew.setAttribute("disabled", oFile.disabled);
		}
		oFile.parentNode.insertBefore(oFileNew, oFile)
		oFile.parentNode.removeChild(oFile);
	}

	this.m_sKeyName = "[i_form v"+i_form_nVersion+" : IFile] - ";

	this.f_drawText = function ( sFileName, sFilePath, nFileId, sFuncDel) {
		var sIcono = oIGZ.m_sRootPath+"pix/ico_docs/";
		sIcono += sFileName.substring(sFileName.lastIndexOf("."), sFileName.length);
		sIcono += ".gif";
		var sHTML = "<TABLE cellpadding=0 cellspacing=0 border=0>"
				  + "<TR>"
				  + "<TD style='cursor: pointer;'><IMG src='"+sIcono+"' border=0 /></TD>"
				  + "<TD>"+sFileName+"</TD>"
				  ;
		if ( sFuncDel ) {
			sHTML += "<TD onclick='"+sFuncDel+"'>"+oIGZ.f_drawItem("ICO_DEL")+"</TD>";
		}

		sHTML += "</TR>"
			   + "</TABLE>"
			   ;

		return sHTML;
	}

}
oIFile = IFile;

ISelect = new function (){
	this.m_sKeyName = "[i_form v"+i_form_nVersion+" : ISelect] - ";
	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 );
	}

	this.f_draw = function (sSelectName,sFuncion,vTitulo,a_sNombre,a_sValor,vValorSelected) {
		return DrawCombo(sSelectName,sFuncion,vTitulo,a_sNombre,a_sValor,vValorSelected);
	}
	this.f_print = function (sSelectName,sFuncion,vTitulo,a_sNombre,a_sValor,vValorSelected) {
		document.write( this.f_draw (sSelectName,sFuncion,vTitulo,a_sNombre,a_sValor,vValorSelected) );
	}

	this.m_a_sSelects = [];
	this.m_a_oSelects = [];
	this.f_init = function () {
		var oSelect = null;
		var oTools  = null;
		for ( var f=0, F=this.m_a_sSelects.length; f<F; f++ ) {
			oTools = GetElement("SPAN_"+this.m_a_sSelects[f]+"_Tools");
			if ( oTools!=null ) {
				this.f_initTools ( this.m_a_sSelects[f] );
			}
			//oSelect = GetElement("SPAN_"+this.m_a_sSelects[f]);
			//this.m_a_oSelects.push( oSelect );
		}
	}

	// Edicion de combos en linea
	//
	this.m_oSPAN_Tools = null;
	this.m_maConfig = [["StyleAdd", "StyleEdit", "StyleSave", "StyleCancel", "StyleDel"], ["ISELECT_Add", "ISELECT_Edit", "ISELECT_Save", "ISELECT_Cancel", "ISELECT_Del"]];
	this.f_printTools = function (sNameComboTarget, sPageXBD, sDsColName, sIdColName) { document.write( this.f_drawTools(sNameComboTarget, sPageXBD, sDsColName, sIdColName) ); }
	this.f_drawTools = function (sNameComboTarget, sPageXBD, sDsColName, sIdColName) {
		var sHTML = "";
		if ( IsNull(sIdColName) ) { sIdColName = ""; }
		if ( IsNull(sDsColName) ) { ErrorJS(this.m_sKeyName+" f_printTools : No has definido un nombre para el campo descripción del SELECT '"+sNameComboTarget+"', no se pintaran SelectTools"); }
		else {
			sHTML = "<SPAN id='SPAN_"+sNameComboTarget+"_Tools' m_sNameComboTarget='"+sNameComboTarget+"' m_sPageXBD='"+sPageXBD+"' m_sDsColName='"+sDsColName+"' m_sIdColName='"+sIdColName+"'>"+this.f_drawInnerTools(sNameComboTarget)+"</SPAN>";
		}
		// if ( this.m_oSPAN==null ) this.m_oSPAN = oIGZ.f_newElement("SPAN", ["id", "SPAN_ISELECT", "style", "position: absolute; visibility: hidden;", ""]);
		// var sHTML = DrawComboEXML(sSelectName,sXtra,vTitulo,vArrayBase,sEXMLtexto,sEXMLvalor,vValorSelected,sCampoOrden,sCampoDistinct)
		return sHTML;
	}
	this.f_drawInnerTools = function (sNameComboTarget) {
		var oComboTarget = GetElement("SELECT_"+sNameComboTarget);
		var oComboTools  = GetElement("SPAN_"+sNameComboTarget+"_Tools");

		var sHTML = "";
		sHTML += "<TABLE cellpadding=1 cellspacing=1 border=0>";
		sHTML += "<TR>";

		var bEditing = (!IsNull(oComboTarget) && !IsNull(oComboTarget.getAttribute("m_bEditing")) && oComboTarget.getAttribute("m_bEditing")=="1" ) ? 1 : 0;

		if ( !bEditing ) {
			sHTML += "<TD onclick='oISelect.f_toolsAdd(\""+sNameComboTarget+"\")' class='"+this.m_maConfig.f_maGetVal("StyleAdd", 0)+"'>add</TD>";
			if ( !IsNull(oComboTarget) && oComboTarget.selectedIndex>0 ) {
				sHTML += "<TD onclick='oISelect.f_toolsEdit(\""+sNameComboTarget+"\")' class='"+this.m_maConfig.f_maGetVal("StyleEdit", 0)+"'>edit</TD>";
				sHTML += "<TD onclick='oISelect.f_toolsDel(\""+sNameComboTarget+"\")' class='"+this.m_maConfig.f_maGetVal("StyleDel", 0)+"'>del</TD>";
			}
		}
		else {
			sHTML += "<TD onclick='oISelect.f_toolsSave(\""+sNameComboTarget+"\")' class='"+this.m_maConfig.f_maGetVal("StyleSave", 0)+"'>save</TD>";
			sHTML += "<TD onclick='oISelect.f_toolsCancel(\""+sNameComboTarget+"\")' class='"+this.m_maConfig.f_maGetVal("StyleCancel", 0)+"'>cancel</TD>";
		}

		sHTML += "</TR>";
		sHTML += "</TABLE>";

		return sHTML;
	}
	this.f_drawBoxTools = function (sNameComboTarget) {
		var oComboTarget = this.f_initTools(sNameComboTarget);
		var sText  = "";
		var vValue = "";
		var nWidth    = oComboTarget.style.width;
		var nSelected = oComboTarget.selectedIndex;
		if ( nSelected>0 ) {
			sText  = oComboTarget[nSelected].text;
			vValue = oComboTarget[nSelected].value;
		}
		var sHTML = "<INPUT type='text' name='zzIForm_ISelect_Tools_Name' id='INPUT_IForm_ISelect_Tools_Name' style='width: "+nWidth+";' value='"+sText+"' />"
				  + "<INPUT type='hidden' name='zzIForm_ISelect_Tools_Value' id='INPUT_IForm_ISelect_Tools_Value' value='"+vValue+"' /> "
				  ;
		return sHTML;
	}
	this.f_initTools = function (sNameComboTarget) {
		var oComboTarget = GetElement("SELECT_"+sNameComboTarget);

		if ( IsNull(oComboTarget) ) ErrorJS(this.m_sKeyName+" f_initTools : No existe ningún SELECT con name='"+sNameComboTarget+"'");
		else {

			if ( IsNull(this.m_oSPAN_Tools) ) {
				this.m_oSPAN_Tools = document.createElement("SPAN");
				oComboTarget.parentNode.insertBefore( this.m_oSPAN_Tools, oComboTarget );
			}

			if ( IsNull(oComboTarget.getAttribute("m_bEditing")) ) {
				var oComboTools  = GetElement("SPAN_"+sNameComboTarget+"_Tools");
				oComboTarget.setAttribute("m_bEditing", 0);
				// oComboTarget.setAttribute("m_sName", RemovePrefijoSufijo(sNameComboTarget, 1));

				var f_onchange = oComboTarget.onchange;
				oComboTarget.onchange = function (){
					oISelect.f_changeTarget(sNameComboTarget);
					if ( !IsNull(f_onchange) ) f_onchange();
				}

				var sIdColName = oComboTools.getAttribute("m_sIdColName");
				if ( !sIdColName || IsNull(sIdColName) ) {
					var sName   = oComboTarget.name;
					var nArroba = sName.indexOf("@");
					if ( nArroba!=-1 ) {
						sIdColName = sName.substring(nArroba+1, sName.length);
						sIdColName = "id"+sIdColName+"@"+sIdColName;
					}
					else ErrorJS(this.m_sKeyName+" f_initTools : El nombre del select "+sName+" no contiene @ y no se definio sIdColName en oISelect.f_drawTools("+sNameComboTarget+")");
				}
				oComboTarget.setAttribute("m_sIdColName", sIdColName);
				oComboTarget.setAttribute("m_sDsColName", oComboTools.getAttribute("m_sDsColName"));

				var sPageXBD = oComboTools.getAttribute("m_sPageXBD");
				oComboTarget.setAttribute("m_sPageXBD", sPageXBD);
			}
		}
		return oComboTarget;
	}
	this.f_toolsRefresh = function (sNameComboTarget) {
		var oComboTools  = GetElement("SPAN_"+sNameComboTarget+"_Tools");
		oComboTools.innerHTML = this.f_drawInnerTools(sNameComboTarget);
	}
	this.f_toolsAdd = function (sNameComboTarget) {
		var oComboTarget = this.f_initTools(sNameComboTarget);
		oComboTarget.selectedIndex = 0;
		this.f_toolsEdit(sNameComboTarget);
	}
	this.f_toolsEdit = function (sNameComboTarget) {
		var oComboTarget = this.f_initTools(sNameComboTarget);
		oComboTarget.setAttribute("m_bEditing", 1);
		oComboTarget.style.display = "none";
		this.m_oSPAN_Tools.innerHTML = this.f_drawBoxTools(sNameComboTarget);
		this.m_oSPAN_Tools.style.display = "block";

		this.f_toolsRefresh(sNameComboTarget);
	}
	this.f_toolsSave = function (sNameComboTarget) {
		var oComboTarget = this.f_initTools(sNameComboTarget);
		oComboTarget.setAttribute("m_bEditing", 0);

		this.f_toolSendXBD(sNameComboTarget, 1);
	}
	this.f_toolsCancel = function (sNameComboTarget) {
		var oComboTarget = this.f_initTools(sNameComboTarget);
		oComboTarget.setAttribute("m_bEditing", 0);
		this.m_oSPAN_Tools.style.display = "none";
		this.m_oSPAN_Tools.innerHTML = "";
		oComboTarget.style.display = "block";

		this.f_toolsRefresh(sNameComboTarget);
	}
	this.f_toolsDel = function (sNameComboTarget) {
		var oComboTarget = this.f_initTools(sNameComboTarget);
		oComboTarget.setAttribute("m_bEditing", 0);

		this.m_oSPAN_Tools.innerHTML = this.f_drawBoxTools(sNameComboTarget);

		this.f_toolSendXBD(sNameComboTarget, -1);
	}
	this.f_changeTarget = function (sNameComboTarget) {
		this.f_toolsRefresh(sNameComboTarget);
	}
	this.f_toolSendXBD = function (sNameComboTarget, nAction) {
		var oComboTarget = this.f_initTools(sNameComboTarget);
		var sPageXBD   = oComboTarget.getAttribute("m_sPageXBD");
		var sTextName  = oComboTarget.getAttribute("m_sDsColName");
		var sTextValue = GetElement("INPUT_IForm_ISelect_Tools_Name").value;
		var sValueName = oComboTarget.getAttribute("m_sIdColName");
		var sValueValue= GetElement("INPUT_IForm_ISelect_Tools_Value").value;
		oXBD.f_submit( sPageXBD+"?xbd_action="+nAction+"&"+sTextName+"="+sTextValue+"&"+sValueName+"="+sValueValue
					 , function (){
							// DelSelected(oComboTarget.form, oComboTarget, 1);
						 	// Array2Select(a_vArray,a_sArray,oComboTarget.form,oComboTarget)
					   }
					 );
	}

	oIGZ.m_a_sStartUps.push( "oISelect.f_init()" );
}
oISelect = ISelect;

var g_oOnErrorEvent=window.onerror;

var oUserAgent = window.navigator.userAgent.toLowerCase();
// Browser name
bGecko     = (oUserAgent.indexOf('gecko') != -1);
bNS		  =	bGecko;
bIE = ( (oUserAgent.indexOf("msie") != -1) && (oUserAgent.indexOf("opera") == -1) && (oUserAgent.indexOf("webtv") == -1) );



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 );

//	[oForm],[nFormSize],[bInitColor],[bSinPrefijo],[vArrayBase]
/**
	 * @description Ejecuta las rutinas básicas de inicialización de formularios.
	 * @param {object} oForm Formulario que se desea inicializar. Si se omite cogerá el primero que encuentre. (Opcional)
	 * @param {number} nFormSize Especifica un tamaño para las propiedades maxlength de Text y Textarea. (Opcional)
	 * @param {boolean} bInitColor Indica si se inicializarán los colores también. (Opcional)
	 * @param {boolean} bSinPrefijo Indica si se tratarán los campos sin prefijos. (Opcional)
	 * @param {variable} vArrayBase MArray del que tomará los datos para rellenar los inputs. Si se omite los tomará de maFormNamesValues. (Opcional)
	 * @example
	 *
	 * Normalmente suele usarse en la función Init:
	 * 
	 * maFormNamesValues = new Array (['B_login'],['Maria']);
	 * function Init() {
   *     InitForm();
   * }
   *
   * Este código rellenaría el input B_login con su dato correspondiente.
   *
   * Nota: Suele llamarse sin parámetros, sólo se le pasaría el parámetro oForm en el caso de que haya varios formularios.
	 *
	 */
function InitForm(oForm,nFormSize,bInitColor,bSinPrefijo,vArrayBase){
//	focus();
	oCore.f_debugLoad ("[i_form]InitForm()")

	if ( IsNull(bSinPrefijo) )  bSinPrefijo=1		//1.516
	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
	}

	/* Desabilita el envio automatico que hace el IE al pulsar Enter y solo haber un input en la página (Jonas) */
	var sTag = "INPUT"
	if (bIE) sTag = "<INPUT name='zzIFormNoSubmitInput' />"		//1.468
	var oNoSubmitInput = document.createElement(sTag);
	oNoSubmitInput.name = "zzIFormNoSubmitInput";
	oNoSubmitInput.style.display = "none";
	oNoSubmitInput.style.visibility = "hidden";
	oForm.appendChild( oNoSubmitInput );


//	IForm.f_resetAutoCheckmark (oForm)
	if (g_bClearAutoCheckbox) IForm.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);	// Jonas - Es mejor que se ejecute para todos los forms de la página por lo que no le paso el oForm
	AutoInitInput();

	if (g_bAvisarCambios) {
		if ( oIGZ.m_bInitialized ) {
			GetInitValues();
		}
		else {
			oIGZ.m_a_sPostStartUps[oIGZ.m_a_sPostStartUps.length] = "GetInitValues();";
		}
		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]) + IForm.f_debug();
	}
}

function GetInitValues (oForm) {
	var oInput
	oForm = GetForm (oForm)
	g_ma_sInitValues[1]=[]
	for (var i=0;i<oForm.length;i++) {
		oInput = oForm.elements[i]
		if (ValidarInput (oInput,1,g_bInitValuesSinPrefijo)) {
/*
			g_ma_sInitValues.f_maSetVal ("name", oInput.name, n)
//			g_ma_sInitValues.f_maSetVal ("value", GetInputValueChecked(oInput), n)
			g_ma_sInitValues.f_maSetVal ("value", GetInputValue(oInput), n)
//if (oInput.name=="R_C1") alert(GetInputValueChecked(oInput))
*/
			g_ma_sInitValues.f_maNewRow([oInput.name,GetInputValue(oInput)])
		// v1.427 - (oInput,0 <- Cambiado a 1 porque si no pasa de los visibility hidden - Jonas y Manuel
	}
	}
// DebugForm()
// alert (g_ma_sInitValues.f_maGetValIf ("value","name","R_C1"))
}

function CompareInitValues (oForm) {
	var oInput,sInputName,nPos,sInputValue,nCambios=0
	var n=0
	var nReg
//	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]
		// v1.427 - (oInput,0 <- Cambiado a 1 porque si no pasa de los visibility hidden - Jonas y Manuel
		if (ValidarInput (oInput,1,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)) {
					n++
					continue
				}
			}
//			sInputValue = GetInputValueChecked(oInput)
			sInputValue = GetInputValue(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 (sInputName == g_ma_sInitValues.f_maGetVal ("name",n)) {
				nReg = n
			}
			else {
				nReg = g_ma_sInitValues.f_maGetRegIf ("name",sInputName)
			}
//			if (sInputValue!=g_ma_sInitValues.f_maGetVal ("value",nReg) ){
			if (!CompareValues(sInputValue,g_ma_sInitValues.f_maGetVal ("value",nReg)) ){
				nCambios++
//1.390			a_sInfo[nCambios]= "" +sInputName +": [OLD:"+ g_ma_sInitValues.f_maGetValIf ("value","name",sInputName)+"=NOW:"+sInputValue+"]"
				IForm.m_sDebug += sInputName +" OLD=["+ g_ma_sInitValues.f_maGetValIf ("value","name",sInputName)+"] NOW=["+sInputValue+"]\n"	//v1.390
			}
			n++
		}
	}
	return (nCambios)
}


function InitDateFormat (a_sFormNames,a_sInputs,sInputFormat,sFormat) {
	var f,nPos
	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 (IForm.m_oForm) {
			oForm = IForm.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"
			}
		}
	}
	IForm.m_oForm = oForm
	return oForm
}

/**
 * @description Envia el formulario y ajusta algunos valores 
 * @param {object} [oForm] (el primer formulario de la página) Objeto formulario sobre el que se hace el submit
 * @param {boolean} [bShield] (g_bShield)  Añade el escudo.  Indica si aparece el pantallazo flash cuando se hace el submit
 * @param {number} [nModo]	nModo: 1=Avisar cambios /2=Restaurar valores (retorne los campos al valor que puso el usuario)
 * @param {number} [nXJS]	Actualmente no se usa. nXJS: 1= Envia por XJS / 2= Abre el resultado del XJS en ventana nueva (Solo Debug)
 * @param {funcion} [f_xjsOnLoad] Actualmente no se usa. Función que ejecuta cuando usamos nXJS
 *
 */
function SubmitForm(oForm, bShield, nModo, nXJS, f_xjsOnLoad){
	var	bAvisarCambios=g_bAvisarCambios
	if (nModo==1) {
		bAvisarCambios=1
	}
	else {
		bAvisarCambios=0
		StopSalirSinGuardar()
	}

	if (g_bSubmitOn) {
		ErrorJS ("[i_form.SubmitForm] g_bSubmitOn=1 ","",5)
		return 0;
	}
	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 0;		//1.432
	}
	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 (_+*/...)"
			if (oForm.method.toUpperCase()=="GET")  sFullError += " o estemos usando GET con demasiados datos";
			ErroresForm (sFullError,oForm);
			return (true);
		}

		if (bAvisarCambios) g_bSubmitOn = 0
		if (nXJS) {
			switch(nXJS) {
				case 1 :
					if (bShield) IFormShield.f_setShow();
					oXJS.f_load(oForm.action+"?xjs=1&", function (){
																	g_bSubmitOn = 0;
																	if (bShield) IFormShield.f_setHide();
																	if (f_xjsOnLoad) f_xjsOnLoad();
															}
								, oForm
								);
					break;
				case 2 :
					oForm.target = "_blank";
					oForm.action = oForm.action+"?xjs=1";
//Error acceso denegado: probablemente hay un INPUT FILE con un fichero que no existe
					oForm.submit();
					break;
			}
		}
		else {
//Error acceso denegado: probablemente hay un INPUT FILE con un fichero que no existe
			oForm.submit();
		}
//A partir de aqui solo se hace si hay Submit
		if (bShield) {
			IFormShield.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)
		}
*/

		oIInput.f_restoreAll();

		window.onerror=g_oOnErrorEvent
	}
}

IForm.f_afterSubmit = function (oForm) {	//1.366
	oForm=GetForm(oForm)

//	IForm.f_resetAutoCheckmark (oForm)		//1.436
	IForm.f_resetFixAtSubmit (oForm)
	IForm.f_resetColor(oForm)
	IFormShield.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
	var bError = false
	if (g_bSubmitOn) {
		ErrorJS ("[i_form.ValidarForm] g_bSubmitOn=1 ","",5)		//1.439
		return bError;			// 1.432
	}
	oForm=GetForm(oForm)
	if (typeof(oForm)!="object"){
		ErroresForm("[i_form.ValidarForm] No existe el FORM de nombre '"+ oForm +"' pasado a 'ValidarForm()'")
		return bError;			// 1.432
	}
/*
	if (IForm.m_oForm!=GetForm(oForm)) {
		g_sColorForm=""
		IForm.m_oForm = oForm
	}
*/
	InitFixAtSubmit()
	ResetCampo()
	InitColor(oForm)
	g_bCamposVacios=1;
	var nErrors = 0;
	var formC=0
	g_oInputError = ""
	g_sAllErrorsText = ""

	while ((!nErrors || (nErrors && g_nAllErrors)) && formC<oForm.length) {
		oInput = oForm[formC]

//Repasar si esta linea hace falta y esta terminado (Jonas) !!!
		oIInput.f_cleanTitulo(oInput);

		if (!a_sInput || a_sInput.f_indexOf (oInput.name)!=-1) {
//			var vValueForm = GetInputValueChecked(oInput)
			var vValueForm = GetInputValue(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) {
		IForm.f_validarCheckmark (oForm[formC++])
	}
}

IForm.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
				oInput.setAttribute("K_auto", 0);		//
			}
			else if (cTipo=="K"){
				oInput.setAttribute("K_auto", 1);
			}
			oInput.checked = true
			oInput.value = bValor
		}
	}
}

IForm.f_resetAutoCheckmark = function (oForm){
	var oInput,vVal;
	var formC=0
	while (formC<oForm.length) {
		oInput = oForm[formC++]
		if (oInput.type=="checkbox" && CheckInputName(oInput)) {
//alert (oInput.name + "_" +oInput.value + "\n" + isNaN(GetObjAttribute(oInput,"K_auto")))
			vVal = GetObjAttribute(oInput,"K_auto")
			if (!isNaN(vVal) && Number(vVal)) {
				oInput.checked = false;
			}
		}
	}
}

IForm.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;
		}
	}
}


IForm.f_printComboEXML2Text = function  (sInput,maDatos,sTextEXML,sCampoVal,sVal) {
	document.write (IForm.f_drawComboEXML2Text (sInput,maDatos,sTextEXML,sCampoVal,sVal))
}
//sInput,maDatos,sTextEXML,sCampoVal,[sVal]
IForm.f_drawComboEXML2Text = function  (sInput,maDatos,sTextEXML,sCampoVal,sVal) {
	var sHTML = ""
	if (IsUndefined(sVal) && typeof(maFormNamesValues)!="undefined") {
		var sInitName = IForm.f_getInitName (sInput)
		if (!IsNull(sInitName)) {
			sVal = maFormNamesValues.f_maGetVal (sInitName,0,null)
		}
	}
	if (!IsNull(sVal)) {
		var nReg = maDatos.f_maGetReg (sCampoVal, sVal)
		if (nReg!=-1) {
			sHTML += ParseEXMLs (sTextEXML,"",maDatos,nReg)
			sHTML += "<INPUT name='"+sInput+"' type='hidden' value='"+sVal+"'>"
		}
	}
	return sHTML
}

//find nombre en maFormNamesValues a partir de un Input name
IForm.f_getInitName  = function (sInputName) {
	var sValue = null
	var nPos = maFormNamesValues.f_maGetColPos(sInputName)
	if (nPos==-1 ) {
		sInputName = RemovePrefijoSufijo (sInputName)
		nPos = maFormNamesValues.f_maGetColPos(sInputName)
		if (nPos==-1 ) {
			var nPosT = sInputName.indexOf ("@")
			if (nPosT!=-1 ) {
				sInputName = sInputName.substring(0,nPosT)
				nPos = maFormNamesValues.f_maGetColPos(sInputName)
			}
			if (nPos==-1 ) sInputName = null
		}
	}
	return (sInputName)
}


IForm.f_debug = function (oInput,sText,bForce) {
	var sDebug= ""
	if (oCore.m_sServer=="DEV" || bForce) {
		sDebug += "\n\n" + InfoDevPage()
		if (oInput) {
			sDebug += InfoDevForm(oInput.form) + InfoDevInput (oInput)
		}
		if (sText) sDebug += "\n" + sText
		if (this.m_sDebug) {
			sDebug += "\n" + this.m_sDebug
			this.m_sDebug = ""	//Solo se usa 1 vez
		}
	}
	return sDebug
}

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)
			IForm.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")){
		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)		//Cuidado con FF, que devuelve todo como string (incluso números)
	}
	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
	}
	IForm.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 (cTipoForm.toUpperCase()=="K" && GetInputValue(oInput)) g_bCamposVacios=0

		if ( GetObjAttribute( oInput,"tipo" ) != null ) {
			cTipoForm = GetPrefixFromType( oInput );
		}

		if ( (cTipoForm == cTipoForm.toLowerCase() && !vValueForm && cTipoForm!="f" && cTipoForm!="l") || 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 );
									bValidar = GetInputValue( 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",[oIForm.f_getNombreCampo(sNameForm,1)]);
					}
					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",[oIForm.f_getNombreCampo(sNameForm,1)]);
					}
					cInvalido = ValidarCadena (vValueForm,a_cValidos_B)
					if (cInvalido) {
						bError = true;
						if (cInvalido=="\r" || cInvalido=="\n") cInvalido = "NEWLINE"
						g_sErrorText= oIGZ.f_langText("CorregirCaracter", [cInvalido] );
					}
					break
				case "C":
					var re = /^\d{4,5}$/;		//1.514
					if (!vValueForm.match(re) || !IsNumberRange(oInput,1)) {	//1.526
						bError = true;
						g_sErrorText= oIGZ.f_langText("CorregirCP");
					}
					break
				case "D":
					var sFF = IInput.f_getDateFormatShow(oInput);
					if (vValueForm == "") {
						vValueForm = new Date ().f_drawFormat (sFF)		//FechaHoy(0)
						if (bFormValido && bFixInput) oInput.value=vValueForm
					}
//					if (!EsFecha(vValueForm)) {		//1.383
					else {
						if (!IForm.f_validaFecha(vValueForm, sFF)) {
							bError = true;
							g_sErrorText= oIGZ.f_langText("CorregirFecha", [String(sFF).f_replace("n", ""), vValueForm]);
						}
/*
					else {
						if (g_sFormatoFechaD) {
//							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 (!IsDateRange(oInput,1)){
							bError = true;
						}
					}

					if (!bError) {
						var sFF_out = IInput.f_getDateFormatOut(oInput);
						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.substring(0,4+vValueForm.lastIndexOf("."))).match(re)) {	//1.387 se cuelga si es muy larga AutoFill
					if (!vValueForm.match(re)) {
						bError = true;
						g_sErrorText= oIGZ.f_langText("CorregirEMail");
					}
					break
				case "F":
					sError = ValidarFecha(oInput)
					if (sError) {
						bError = true;
						g_sErrorText= sError
					}
					break
				case "G":
//					if (!EsFecha(vValueForm)) {		//1.383
					var sFF = IInput.f_getDateFormatShow(oInput);
					if (!IForm.f_validaFecha(vValueForm,sFF)) {
						bError = true;
						g_sErrorText= oIGZ.f_langText("CorregirFecha", [String(sFF).f_replace("n", ""), vValueForm]);
					}
					else {
						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 = IInput.f_getDateFormatOut(oInput);
							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 ) ? 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 : 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 = vValueForm.f_toNumber("I.")	//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",[oIForm.f_getNombreCampo(sNameForm,1)]);
					}
					break
				case "S":
					if (vValueForm == "" && !oInput.selectedIndex) {
						bError = true;
						g_sErrorText= oIGZ.f_langText("RellenarSelect",[oIForm.f_getNombreCampo(sNameForm,1)]);
					}
					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=="K" || cLetra=="L" || cLetra=="X")	{ 	//1.470 NIE ¿no es solo la X?
						vValueForm=vValueForm.substring(1)
					}
//					if (cLetra!="T"){		//1.469 Por que haciamos esto?
						if(!ValidarCIF(vValueForm)){
							if(!ValidarNIF(vValueForm)){
								if(!ValidarDNI(vValueForm)){
									bError = true;
									g_sErrorText= oIGZ.f_langText("CorregirDNICIFNIF");
								}
							}
						}
//					}
					break
				case "W":
					if (vValueForm == "") {
						bError = true;
						g_sErrorText= oIGZ.f_langText("RellenarSelectMultiple",[oIForm.f_getNombreCampo(sNameForm,1)]);
					}
					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",[oIForm.f_getNombreCampo(sNameForm,1)]);
					}
					break
				case "Z":
					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

	
	// v1.535
	if ( bError &&  oInput ){
		var sTextoError = oInput.getAttribute( "texto_error" );
		if ( typeof( sTextoError ) != "undefined" && sTextoError != null){
			g_sErrorText = sTextoError;
		}
	}
	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)

	g_sErrorText += IForm.f_debug (oInput)	//v1.390
/*
	if (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 {
		oIGZ.f_showMsg(g_sErrorText)		//1.515
//		ErrorJS (g_sErrorText,null,0,1)
//		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(oInput){
	var sReturn = ""
	var oForm = GetForm()
	var sNameForm = IForm.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 (!IsNull(oInput) && IInput.f_getDateFormatOut(oInput)) {
			oForm[sNameForm].value=t_dFecha.f_drawFormat( IInput.f_getDateFormatOut(oInput) )
		}
		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;
}

// [deprecated] se usan las funciones de IInput
IForm.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;
}

IForm.f_validaFecha = function (sFecha,sFormatoFecha) {	//1.363
	var bOk = 0
//alert ("fds".f_toDate(sFormatoFecha))
	if (!IsNull(sFecha.f_toDate(sFormatoFecha,this.bForceDateFormat))) bOk=1
	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)
}

// Esta funcion esta duplicada en i_exml.js !!!
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,vValue
	var oInput = oForm[sInputName]
	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);
/*
Manuel: hace falta, porque siempre salta aqui (incluso con 'l'), asi que añado el atributo obligatorio
Old:  Comentado eromera: Si se llama aquí, ya se ha comprobado que hay que validar.Si no se deja así, no funciona con el atributo "obligatorio"
*/
	if (sInputName.substr(0,1)=="L" || GetObjAttribute( oInput,"obligatorio" )!=null) {
		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(IForm.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 ["+sCuenta+"]"
		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 bRetCode = false;

	var nDNI=vValueForm;
	nDNI=nDNI.replace(/\s/g,"");
	nDNI=nDNI.replace(/\./g,"");
	nDNI=nDNI.replace(/-/g,"");
	var nDNIfixed=nDNI;

/*
	var cLetra=nDNI.substring(0,1).toUpperCase();
	if ((cLetra=="K" || cLetra=="L" || cLetra=="X")) {	//NIE
		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)
	}
alert (nDNIfixed+"\n"+nDNI)
*/
	var nNumero = new Number( vValueForm );
 	if( !isNaN( nNumero ) && nNumero > 0 && (nDNI>=1 && nDNI<=99999999)) {
		bRetCode=true;
		if (BuscaArray (g_a_sAutoCorregir,IForm.m_sInputName) !=-1) AddFixAtSubmit(IForm.m_sInputName,nDNIfixed)
	}
	return bRetCode;
}


function ValidarNIF(sNIF){			//NIF/NIE
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();
		nLetra = cLetra.charCodeAt(0)
		sNIF = sNIF.substring(1,sNIF.length);
	}
	if(nLetra>=65 && nLetra<=90) {
		nNIF = Texto2Numero(sNIF)
 		if(cLetra==a_cOrden.substr(nNIF % 23,1)) {
 			bRetCode=true;
			if (BuscaArray (g_a_sAutoCorregir,IForm.m_sInputName) !=-1) {
				AddFixAtSubmit(IForm.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,IForm.m_sInputName) !=-1) AddFixAtSubmit(IForm.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 (IForm.m_maValues[0],oInput.name,1)
		if (nPos!=-1) {
			sFichero = IForm.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;
}

IForm.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	1.413
	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 (sColorForm && cTipoFormU!="R" && cTipoFormU!="K"){	//1.527
			if (!sColor){
				sColor = sColorError
				if (bFormOK) sColor = sColorOK
				if (!sColor) sColor = sColorForm
			}
			if (sColor) {
				oInput.style.backgroundColor = sColor
				if (CheckColorForm(sNameForm)){
					window.onerror = function ErrorTrapJS(sError,sURL,nLinea) { sError="[i_form.ColorForm] Nombre de INPUT inexistente o duplicado: "+sNameForm+"\n\n"+sURL+"\nLinea "+nLinea + " : " + sError;ErroresForm (sError,oInput); return (true);}
					g_sColorForm = "IForm.m_oForm['"+sNameForm+"'].style.backgroundColor = '"+sColor+"'"
					eval(g_sColorForm);
					window.onerror=g_oOnErrorEvent
					if (!bFormOK) CicloColores(sNameForm,sColorForm,sColorError,20,40,0)
				}
			}
		}
	}
}

function ResetCampo(){
	if (g_vTimeoutID) clearTimeout(g_vTimeoutID)
	if (g_sColorForm){
		var sNameForm = g_sColorForm.substring(g_sColorForm.indexOf("IForm.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 (IForm.m_maValues[0],oInput.name,1)
	if (nPos!=-1) {
		sValue = IForm.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,h,i,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)
	IForm.m_maValues[0] = a_sFormNames.concat()
	IForm.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)) {		//1.455
					sInputName = oForm[g].name
					if (sInputName != sInputAnt){
						sInputAnt = sInputName
						sCampo = RemovePrefijoSufijo (sInputName)
						//nPos = BuscaArray (a_sFormNames,sCampo,1)
						nPos = a_sFormNames.f_indexOf (sCampo,"",1)
						if (nPos==-1 ) {
							nPos = sCampo.indexOf ("@")
							if (nPos!=-1 ) {
	//							nPos = BuscaArray (a_sFormNames,sCampo.substring(0,nPos) ,1)
								nPos = a_sFormNames.f_indexOf (sCampo.substring(0,nPos),"",1)
							}
						}
						if (nPos!=-1) {
							IForm.m_maValues[0][nPos] = sInputName
							if (g_bAddPrefix) {
								a_sFormNames[nPos] = sInputName
							}
						}
						else {
//							if (BuscaArray (a_sFormNames,sInputName,1)==-1) sInputsSinValue += sInputName + " / "
							if (a_sFormNames.f_indexOf (sInputName,"",1)==-1) sInputsSinValue += sInputName + " / "
						}
					}
				}
			}
			if (sInputsSinValue) g_sAlertas += "* INPUTS sin values:"+ sInputsSinValue + "\n"
		}
//alert (IForm.m_maValues[0])
		for (i=0;i<oForm.length;i++) {	//1.511
			oInput = oForm[i]
//			f = BuscaArray (IForm.m_maValues[0],oInput.name,1)
			f = IForm.m_maValues[0].f_indexOf  (oInput.name,"",1)
			if (f!=-1 && oInput.type!="file") {
				sInputName = IForm.m_maValues[0][f]
				vNewValor = a_vFormValues[f]
//1.511				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":
							sFF_in = IInput.f_getDateFormatIn(oInput);
							if (sFF_in) {
//							if (g_sFormatoFechaInD) {
								vNewValor = vNewValor.f_toDateDraw (sFF_in, IInput.f_getDateFormatShow(oInput))
							}
							oInput.value= vNewValor
							break
						case "F":
							sFF_in = IInput.f_getDateFormatIn(oInput);
							if (sFF_in) {
//							if (g_sFormatoFechaInF) {
								vNewValor = vNewValor.f_toDateDraw (sFF_in, IInput.f_getDateFormatShow(oInput))
							}
							RellenarInputTipo(oInput,cTipoForm,vNewValor)
							break
						case "G":
							sFF_in = IInput.f_getDateFormatIn(oInput)
							if (sFF_in) {
//							if (g_sFormatoFechaInG) {
								vNewValor = vNewValor.f_toDateDraw (sFF_in, IInput.f_getDateFormatShow(oInput))
							}

							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)

								nPos = a_vInput.f_indexOf (oInput.value)
								if (nPos==-1) vValor=0
							}

							if ( IsArray(vValor) ) {
								for (h=0; h<vValor.length; h++ ) {
									if (oInput.value == vValor[h]) {
										bValor=true;
									}
								}
							}
							else 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":
							vValor = vNewValor
							if (vValor && !(vValor=="False" || vValor=="Falso" || vValor=="null")){
								if (oInput.value==vValor) oInput.checked=true;
							}
							break
						case "S":
//1.511						if (sFormName) {
								SetInputValue(oInput,vNewValor)
//							}
							break
						case "W":
							SelectOptions(oForm,sInputName,0)
							var a_sValor=vNewValor
//1.511						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.511						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 {
//1.511				oInput.value = vNewValor
					SetInputValue(oInput,vNewValor)
				}
			}
			else if (f!=-1 && oInput.type=="file" && IForm.m_nFile2Text) {
				var oSpan = document.createElement("SPAN");
				oSpan.innerHTML = "<BR />" + a_vFormValues[f];
				oInput.parentNode.appendChild(oSpan);
				if (IForm.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,sValue,sValSpecial
var	sNameP1,sNameP2,oInput
var sText=""
//var sExtraText = document["body"].innerHTML.replace (/<(?:.*?\s*)?>/g,"")
var sExtraText = document["body"].innerHTML.replace (/[^0-9^a-z]/gi,"")
var reApos = new RegExp("'","gi");
var a_sMatches;
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
				,"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,0) && 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){
					sValue = ""
					sValSpecial = " [áño'\"€\\n''] (" + GetMaxLength(oInput) + ")_"		//  FF interpreta /n como fin de cadena y IE no, por eso no lo usamos
					switch (cTipo){
						case "A":
							vInputValue = sInputName + sValSpecial
							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 ( IInput.f_getDateFormatShow(oInput) )		//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 ( IInput.f_getDateFormatShow(oInput) )		//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 "P":
							vInputValue = "P_" + sInputName.substring(2) + sValSpecial
						case "R":
							oInput.checked=1
							break
						case "S":
//							sValue = GetInputValueChecked(oInput)
							sValue = GetInputValue(oInput)
							if ((sValue=="" || sValue=="null") && (oInput.length>1)) 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) {
						if ("ABEPUV".indexOf(cTipo)!=-1){
							nMaxLength = GetMaxLength(oInput)
							if (!nMaxLength){
								sText += "[" + oInput.name + "] no tiene MAXLENGTH\n"
								nMaxLength = 8000;
							}
							if ("ABPU".indexOf(cTipo)!=-1){
// v1.408 : esto hacia falta ?
//								a_sMatches = vInputValue.match(reApos);
//								if (!IsNull(a_sMatches)) nMaxLength -= a_sMatches.length;
//alert(vInputValue+"\n"+a_sMatches.length)
								if (oInput.type=="textarea") nMaxLength-=10		//Margen de seguridad por TEXTAREA: con 2 parece que basta ¿sera por los \n, las ' o que? !!!
								vInputValue = (vInputValue+"_____"+sExtraText).substr(0,nMaxLength)
							}
						}
						oInput.value = vInputValue
						if ("CMNOQ".indexOf(cTipo)!=-1 && !IsNumberRange (oInput)) oInput.value = GetValueRange(oInput)	//1.526
						if ("G".indexOf(cTipo)!=-1 && !IsDateRange (oInput)) oInput.value = GetValueRange(oInput)
					}
/*
					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"
					}
*/
				}
			}
		}
	}
	if (sText) ErrorJS(sText,null,4,1)
}

function SqlTextLen (sString) {
	var nLen = sString.length
	var reApos = new RegExp("'","gi");
	var a_sMatches = sString.match(reApos);
	if (a_sMatches) nLen += a_sMatches.length
	return (nLen);
}

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) && (oInput.type=="text" || oInput.type=="textarea") ){	//1.506 textarea
			FocusInput(oInput)
//			if (GetInputValue(oInput)!="") oInput.blur()		//1.383
/*
			if (GetInputValue(oInput)==""){
				FocusInput(oInput)
			}
*/
			break;
		}
	}
}

/**
 * @description Permite poner el focus sobre un input en particular del formulario.
 *
 * @param {input} el objeto input que tendrá el focus
 *
 * @example: Este ejemplo, va a poner el focus sobre el input "d_fcRealizacion@Accion" del formulario "FPage"
 * g_oForm = document.forms["FPage"];
 * FocusInput(g_oForm["d_fcRealizacion@Accion"]);
 */
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
	if (CheckInput (oInput,0,0,0,0) && (!bIE || 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+"'\nAviso:"+ g_sErrorText +"\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,a_sInput){
	if(!IsArray(a_sInput)) a_sInput=[a_sInput];

	for (var f=0;f<a_sInput.length;f++){
		IInput.f_clearInputValue (oForm[a_sInput[f]])
	}
}




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)) {	//no vale else!
				oInput.selectedIndex=vIndices
				bChanged=1
			}
			break
		case "select-multiple":
			if (!vIndices) {
				vIndices = []
				var a_sValor=vValor
				if(!IsArray(vValor)) a_sValor=[vValor];
				for (h=0;h<a_sValor.length;h++){
					for (i=0;i<oInput.options.length;i++){
						if (oInput[i].value==a_sValor[h] || oInput[i].text==a_sValor[h]){
							vIndices.push (i)
							break
						}
					}
				}
			}
			else if (!IsArray(vIndices)){
				vIndices = [vIndices]
			}
/*
			for (i=0; i<vIndices.length; i++) {
				oInput.options[vIndices[i]].selected=true
				bChanged=1
			}
*/
			for (i=0;i<oInput.options.length;i++){
				if (oInput.options[i].selected) {		//estaba activo
					if (vIndices.f_indexOf (i)==-1){	//ahora no
						oInput.options[i].selected=false
						bChanged=1
					}
				}
				else {				// no estaba activo
					if (vIndices.f_indexOf (i)!=-1){	//ahora si
						oInput.options[i].selected=true
						bChanged=1
					}
				}
			}

			break
		default:
			oInput.value=vValor
			bChanged=1
		}
	}
	return (bChanged)
}

function GetInputValue(oInput,bText){
//	var vValor=""
//	if (typeof(oInput)=="object"){
//		vValor = GetInputValueChecked(oInput,1)
//	}
	return (GetInputValueChecked(oInput,1,bText))
}

function GetInputValueChecked(oInput,bValue,bText){
	var vValor=""

	if (CheckInput (oInput,0,1,1)){
		var f;
		var sInputType=oInput.type;
		if (!IsUndefined(oInput.length) && IsUndefined(sInputType) ) {
			sInputType = oInput[0].type
		}
//		sInputType = sInputType.toLowerCase()		//1.357

//alert(oInput.length +"_"+oInput.name +"_"+sInputType)
		switch (sInputType.toLowerCase()){
			case "radio":
			case "checkbox":
				var nRadios = oInput.length
				if (nRadios){
					for (f=0;f<nRadios;f++) {
						if (oInput[f].checked) {
							oInput = oInput[f]
							vValor=true
							break
						}
					}
				}
				else{
					if (oInput.checked) vValor=true
				}
//alert(oInput.name+"\n"+nRadios+"\n"+vValor)
				if (vValor && bValue) vValor = oInput.value
				break;
			case "select-one":
				var nSelected=oInput.selectedIndex
				if (nSelected!=-1) {
					if (bText){
						vValor=oInput[nSelected].text
					}
					else{
						vValor=oInput[nSelected].value
					}
				}
				break;
			case "select-multiple":		//1.451
				if (oInput.length) {
					var vValorC = []
					var g=0
					for (f=0;f<oInput.length;f++) {
						if (oInput[f].selected) {
							if (bText){
								vValorC[g++] = oInput[f].text
							}
							else{
								vValorC[g++] = oInput[f].value
							}
						}
					}
					if (vValorC.length) vValor = vValorC;
				}
				break;
			default:
				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" || oInput.style.display=='none')) sInputType = "hidden"	//1.506 none
				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 '"+ IForm.m_oForm + "' o nombre de INPUT erroneo: '"+ sNameForm+ "'\n\n"+sURL+"\nLinea "+nLinea + " : " + sError;ErroresForm (sError); return (true);}
	var oInput = IForm.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,4,1)
}

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

	var sAtr = " / ("
	for (var i=0;i<oInput.attributes.length;i++){
		if (oInput.attributes[i].specified) {
			sAtr += oInput.attributes[i].nodeName+":"+oInput.attributes[i].nodeValue+","
		}
	}
	sAtr += ")"

	if (sInputType=="select-one" || sInputType=="select-multiple") {
		var nOptions = oInput.length
		sText += "(" + oInput.length + " opciones)"
		sText += " [" + GetInputValue(oInput) + "]"
		sText += sAtr
		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 += " (" + SqlTextLen(oInput.value) +"/"+ nMaxLength + ") "
		sText += " [" + GetInputValue(oInput) + "]"
		if (oInput.checked) sText += " checked"
	}
	return sText;
}

function DebugOption(oInput,f,sEOL){
	var sSelected = ""
	if (oInput.options[f].selected) sSelected = " selected"
	var sText = sEOL + "\t" + (f+1) + ". " + oInput.options[f].text + " "
	sText += "[" + oInput.options[f].value + "]" + sSelected
	return (sText)

}

function GetMaxLength(oInput){
	var nMaxLength = 0
	if (oInput.attributes["maxlength"]) nMaxLength = oInput.attributes["maxlength"].nodeValue
	else if (typeof(oInput.maxLength )!="undefined") nMaxLength = oInput.maxLength
	else if (typeof(oInput.maxlength )!="undefined") nMaxLength = oInput.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 (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,4,1)
				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(IForm.m_maValues[0])!="undefined" && IForm.m_maValues[1].length) {
		sHTML += "[maFormNamesValues]\n"
		for (f=0;f<IForm.m_maValues[0].length;f++){
			sHTML += (f+1) + ".\t" + IForm.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 ) {
		if(oIGZ.m_bFF) {
			a_TEXTAREAs[f].addEventListener('onkeyup', TextAreaMaxLength, true);
		}
		a_TEXTAREAs[f].onkeyup=TextAreaMaxLength;
	}
}

function TextAreaMaxLength(event,bDelText){
	var oObj = this;
	if(oIGZ.m_bFF) oObj = event.currentTarget;
	if ( oObj.getAttribute("maxlength") && oObj.value.length > oObj.getAttribute("maxlength") ) {
		if (bDelText) {
			var sStr=oObj.value;
			oObj.value=sStr.substring(0,oObj.getAttribute("maxlength"));
		}
		ColorForm(oObj,0);
	}
}

function TextareaLen(oInput){
	var nLenMaxima = GetMaxLength(oInput)	//oInput.maxlength
	var nLen = SqlTextLen (oInput.value)
//alert (nLenMaxima+"\n"+nLen+"\n"+GetMaxLength(oInput)+"\n")	//+oInput.attributes["maxlength"].nodeValue)
	var bError = 0
	if (nLenMaxima && nLen>nLenMaxima) {
		bError = 1
//		g_sErrorText = "El texto es demasiado largo. Sobran "+(nLen-nLenMaxima)+" caracteres."
		g_sErrorText=oIGZ.f_langText("CorregirLongitudMaxima", [nLen-nLenMaxima])
	}
	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=document["forms"][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=document["forms"][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=document["forms"][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(oForm,oSelect,bSelected,a_vValues,a_sNames){
	var bValues,bNames,nSelC,nOpcionText,nOpcionValue
	var a_vArray = null

	if (typeof(oSelect)!="object") {
		if (typeof(oForm)!="object") {
			oForm=document["forms"][oForm];
		}
		oSelect=oForm[oSelect]
	}

	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=document["forms"][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 CompararCIAI(s1,s2){
	return s1.f_compare(s2);
}
function OrdenarSelect (oSelect, bOrderByVal,bIgnoreAccentAndCase){
	if ( oSelect.options.length ){
		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(bIgnoreAccentAndCase?"".f_compare:null);
		a_vOrdenado1.sort(bIgnoreAccentAndCase?CompararCIAI:null);
		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=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(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=document["forms"][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
// [bValidar] Validar o no validar los Inputs
// [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 (GetInputValue(oInput)) {
//status += (oInput.name+":"+GetInputValue(oInput))
			bRelleno=1;
			nInputsRellenos++;
		}
	}
	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(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 = IForm.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) {		//autorellena campos VACIOS de tipo D
	var f,g,oInput
	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]

			IForm.f_initInput (oInput)

			IForm.f_initInputText(oInput);
		}
	}
}


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 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 = "["+ IForm.m_sObj +" v"+ IForm.m_nVersion + "]\n" +sMsgError
	if (oFormInput) {
		var oInput
		var oForm = oFormInput
		if (oFormInput.form) {
			oForm = oFormInput.form
			oInput = oFormInput
		}
		if (oForm) sMsgError += "\nFORM:\n " + InfoDevForm (oForm)
		if (oInput) sMsgError += "\nINPUT:\n " + DebugInput (oInput,0)
	}
	ErrorJS (sMsgError,null,nType,1)
}

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 || ( sNumero.length==8 && parseFloat(sNumero)<0))){
		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
//bDisabled		 : 0-enabled, 1-disabled
function ChangeFieldsState(oForm, a_sFields, bDisabled, sClass){
	var f,g,oInput,oI, sError="";
	if(oForm.form) oForm=oForm.form;
	else if(oForm.tagName.toUpperCase()!="FORM") ErroresForm("[i_form.ChangeFieldsState] No se encontró el objeto FORM");
	if(oForm){
		for(f=0; f<a_sFields.length; f++){
			oInput = oForm[a_sFields[f]]
			if(oInput){
				if(!oInput.length || !oInput[0].name) oInput=[oInput];
				for (g=0; g<oInput.length;g++) {
					oI = oInput[g]
					oI.disabled=bDisabled;
					if(sClass) oI.className=sClass;
				}
			}
			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);
	}
}

/**
 * @description Devuelve el código HTML de un Combo con datos de un array o MArray.
 *
 * @param {string} sSelectName el nombre del input. Normalmente tiene que ser algo del estilo S_xxxx o s_xxxx.
 * @param {string} sFuncion atributos extras para el input como "class=''" o "onChange=''", etc ...
 * @param {string,array} vTitulo El texto que va a aparecer por defecto cuando el combo aparece. Puede ser un texto "-- elije --" o un array con valor y clave.
 * @param {array} a_sNombre array con los datos que van a aparecer en el combo.
 * @param {array} a_sValor array con los valores.
 * @param {string} [vValorSelected] valor seleccionado por defecto.
 *
 * @example
 * maProvincias = new MArray(["idProvincia", "dsProvincia"],[["1","Madrid"], ["2","Barcelona"], ["3","Jaen"]]);
 * var sHTML = DrawCombo("S_idProvincia", "onClick='alert(2);'", "-- elije --", maProvincias.f_getCol("dsProvincia"), maProvincias.f_getCol("idProvincia") );
 *
 * @example
 * var sHTML = DrawCombo("S_Name","class='input'",["Tit","Val"],[a_sTexto,2,3],[a_sValor,1,3],"ValorSeleccionado");
 *
 */
function DrawCombo(sSelectName,sFuncion,vTitulo,a_sNombre,a_sValor,vValorSelected) {
	oISelect.m_a_sSelects.push(sSelectName);

	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+'" id="SELECT_'+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"
				}
			}
			else if (vValorSelected && a_sNombre[i]==vValorSelected) {	//v1.465
				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("");
}

/**
 * @deprecated usar el metodo <A href='#DrawCombo'>DrawCombo</A> o <A href='#PrintCombo'>PrintCombo</A>
 * @description Devuelve un combo con los datos de un array o MArray
 */
function CreaCombo(sSelectName,sFuncion,vTitulo,a_sNombre,a_sValor,vValorSelected){
	ErrorJS ("[i_form] CreaCombo() deprecado. Usar DrawCombo()","",5)
	return DrawCombo(sSelectName,sFuncion,vTitulo,a_sNombre,a_sValor,vValorSelected);
}

/**
 * @description ver documentación de uso en <A href='#DrawCombo'>DrawCombo</A>
 *
 */
function PrintCombo(sSelectName,sFuncion,vTitulo,a_sNombre,a_sValor,vValorSelected){
	document.write(DrawCombo(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 (sFechaMin && !EsFecha(sFechaMin)) {
//		if (sFechaMin && !IsNull(oForm[sFechaMin]) && CheckInputName(oForm[sFechaMin]) && oForm[sFechaMin].value && oForm[sFechaMin].value.length) {	//Es el nombre de un Input
//alert ("IDR_Min:"+sFechaMin + "\nCIN:" + CheckInputName(oForm[sFechaMin]) +"\n!Null:"+ !IsNull(oForm[sFechaMin]) + "\nElement:" + document.getElementsByName(oForm[sFechaMin]))
		if (sFechaMin && !IsNull(oForm[sFechaMin]) && oForm[sFechaMin].name==sFechaMin ) {	//Es el nombre de un Input
//alert("IDRMin1:" + sFechaMin +"\nV:"+ oForm[sFechaMin].value +"\nL:"+oForm[sFechaMin].value.length + "\nGID:"+ GetInputDate(oForm[sFechaMin]))
			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
//alert ("IDR_Max:"+sFechaMax + "\nCheck:" + CheckInputName(oForm[sFechaMax]) +"\n!IsNull:"+ !IsNull(oForm[sFechaMax]) + "\nElement:" + document.getElementsByName(oForm[sFechaMax]))
//		if (sFechaMax && !IsNull(oForm[sFechaMax]) && CheckInputName(oForm[sFechaMax]) && oForm[sFechaMax].value && oForm[sFechaMax].value.length) {	//Es el nombre de un Input
		if (sFechaMax && !IsNull(oForm[sFechaMax]) && oForm[sFechaMax].name==sFechaMax ) {	//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 = IInput.f_getDateFormatShow(oInput);
					break
				case "F":
					sFormat = IInput.f_getDateFormatShow(oInput);
					break
				case "G":
					sFormat = IInput.f_getDateFormatShow(oInput);
			}
		}
//alert ("GetInputDate:\n" + sDate+ "\n" + sFormat)
		sDate = sDate.f_toDate (sFormat,1)
	}
	return (sDate)
}

// [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 (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		//value/Tipo_Y
	g_a_vFixAtSubmit [nLen] = ""
}

// *** Si modificamos esta funcion hay que modificar f_fixValue() de [i_xbd.js]
function FixAtSubmit(oForm){
	var oInput
	ValidarCheckmarks(oForm)
	for (var f=0;f<g_a_vFixAtSubmit.length;f=f+3){
		oInput = oForm[g_a_vFixAtSubmit[f]]
		if (CheckInput(oInput,0,1,1)) {
//			if (g_a_vFixAtSubmit [f+1]=="Tipo_Y") SelectOptions(oForm,g_a_vFixAtSubmit[f],1)
			if (g_a_vFixAtSubmit [f+1]=="Tipo_Y") SelectOptions(null,oInput,1)
			else {
				g_a_vFixAtSubmit[f+2] = GetInputValue(oInput)
				SetInputValue(oInput,g_a_vFixAtSubmit [f+1])
			}
		}
	}
}

IForm.f_resetFixAtSubmit = function (oForm, bError) {	//1.366
	IForm.f_resetAutoCheckmark (oForm)			//1.436
	for (var f=0;f<g_a_vFixAtSubmit.length;f=f+3){
		SetInputValue(oForm[g_a_vFixAtSubmit[f]],g_a_vFixAtSubmit [f+2])
	}

//	if(!bError) IFile.f_clearAll();	// Limpia el contenido de todos los campos file
}

// [oForm]
function FormCambios (oForm) {
	var f,g,oInput

	if (oForm) oForm = document["forms"][0]
	var nCambios=0
	if (IForm.m_maValues[1].length==0) return(0)
	for (f=0;f<oForm.length;f++) {
		oInput = oForm[f]
		if (ValidarInput (oInput,0)) {
			g = BuscaArray (IForm.m_maValues[0],oInput.name,1)
			if (g!=-1 && oInput.type!="file" && oInput.type!="hidden") {
				if (oInput.value != IForm.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(IFormShield.m_bIE){
		nPosX=IFormShield.m_nMousePosX+top.window.screenLeft+20
		nPosY=IFormShield.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/";
		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){
	if (!IsNull(event)){
		IFormShield.m_nMousePosX=event.clientX;
		IFormShield.m_nMousePosY=event.clientY;
	}
}

IFormShield=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;
	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 (){
		if ( GetType("i_gfx_nVersion", 1) && i_gfx_nVersion>1.83) {
			oShield.f_on();
		}
		else {
			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 (){
		if ( GetType("i_gfx_nVersion", 1) && i_gfx_nVersion>1.83) {
			oShield.f_off();
		}
		else {
			var oLayer = document.getElementById(this.m_sId);
			if (IsNull(oLayer)) ErroresForm ("IFormShield.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='"+IFormShield.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='"+IFormShield.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{
			eval(this.m_sLay+".opacity="+(g_nShieldAlpha/100));
		}
		if (!bShow) this.f_setShow()
	}
}

function TextInput2Input( oInput ){
	if ( oInput.getAttribute("noShow") ){
		oInput.style.display = 'inline';
	}else{
		switch( oInput.type ){
		case "textarea":
		  oInput.value = oInput.value.f_replace("<BR>","\n",0,false,0,true);
		//case "text": case "textarea": case "password": case "select-multiple": case "select-one": case "file":
		case "text": case "password": case "select-multiple": case "select-one": case "file":
			var oSPAN = document.getElementById( "ig_" + oInput.name );
			if (oSPAN) {
//alert(oSPAN)
				oSPAN.parentNode.removeChild( oSPAN );
			}
			oInput.style.display = 'inline';
			break;
		case "submit": case "image":
			oInput.style.display = 'inline';
			break;
		case "hidden":
			break;
		default:
			oInput.disabled = false;
			break;
		}

		var sName = oIForm.f_removeDTO  (oInput.name)
		if (sName && oIGZ.f_checkLib("i_gfx", 0.200)) {
			oGFX.f_changeStyle("#"+sName+".form2Text","display: inline;")		//1.506
		}
	}
}

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.getAttribute("noShow") ){
			oInput.style.display = 'none';
		}else{
			var sType = oInput.type
			if ( IsUndefined(sType)) sType = oInput.tagName
			if ( IsUndefined( sType )) sType = "";

			sType = sType.toLowerCase()
			switch( sType ){
			case "text":
				Input2Text (oInput,oInput.value,sStyle)
				break;
			case "textarea":
			  Input2Text (oInput,oInput.value.f_replace("\n","<BR>",0,false,0,true),sStyle)
				break;
/*									oTextarea.innerHTML -> NO FUNCIONA EN FIREFOX NI EN IE 7 - Jonas v1.423
		 	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":
			case "submit":
			case "image":
			case "file":
				oInput.style.display = 'none';
				break;
			case "button":
			case "hidden":
			case "fieldset":
				break;
			default:
				oInput.disabled = true;
				break;
			}
			var sName = oIForm.f_removeDTO  (oInput.name)
			if (sName && oIGZ.f_checkLib("i_gfx", 0.200)) {
				oGFX.f_changeStyle("#"+sName+".form2Text","display: none;")		//1.506
			}
		}
	}
}

 /**
 * @description Recibe un objeto del tipo Input y lo oculta sustituyéndolo por sTexto con el estilo sStyle
 * @param {object} oInput Objeto Input que queremos ocultar.
 * @param {string} sTexto Texto por el que queremos sustituir oInput
 * @param {string} sStyle Estilo que tendrá el texto.
 * @example
 * var oForm=document.forms["nombreFormulario"];
 * var oInput=oForm["Input"];
 * Input2Text(oInput,"Cambio realizado","none");
 */

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){
	if (oIGZ.f_checkLib("i_gfx",0.187)){
		if (bShow) oGFX.f_changeStyle(".form2Text","display: inline;")
		else oGFX.f_changeStyle(".form2Text","display: none;")
	}

	if (bIE){	//Elementos con ID='noShow', solo en IE
		var a = document.all.item("noShow");
		if (a!=null) {
			ErrorJS ("[i_form.SwapHideActionElements] id='noShow' deprecado. Usar class='form2Text'","",5)
			if (a.length!=null) {
				for (i=0; i< a.length; i++) {
					a[i].style.display = bShow ? "none" :"none";
				}
			}
			else {
				a.style.display = bShow ? "" :"none";
			}
		}
	}
}

 /**
 * @description Sustituye los campos del formulario oForm en SPAN con el texto que contenga su atributo "value"
 *
 * @param {object} oForm Objecto de tipo formulario.
 * @param {string} [sStyle] Estilo que queremos que tenga el SPAN.
 * @example
 * Form2TextForm(document.forms["fBuscarLibro"]);
 */
function Form2TextForm( oForm, sStyle ){
	oForm =  GetForm(oForm);
	var oElements = oForm.elements;
	for( var j = 0; j < oElements.length; j++ ){
		var oInput = oElements[ j ];
		if (oInput.className.indexOf('noForm2Text')==-1) {
			Input2TextInput( oInput, sStyle );
			oInput.setAttribute ("_display","none")		//1.421
		}
	}
	SwapHideActionElements(false);
}

function TextForm2Form( oForm ){
	oForm =  GetForm(oForm);
	var oElements = oForm.elements;
	for( var j = 0; j < oElements.length; j++ ){
		var oInput = oElements[ j ];
		if (oInput.className.indexOf('noForm2Text')==-1) {
			TextInput2Input( oInput );
			oInput.setAttribute ("_display","inline")	//1.421
		}
	}
	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()");
}

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) ); }
}

oIForm = IForm;
oIFormShield = IFormShield;
