	  <!-- ............................................................................................ -->
	  <!-- SERVICIOS GENERALES 																			-->
	      // Tipo de navegador
	      var nav       = null;

	      // Mensaje de espera
	      var msgCargando = "Cargando datos.."
	      var selectsEnCarga = true;    // True si los select se deben vaciar y poner como "cargando"

	      // Detector de navegador
	      function browserSniff() {
	        if (document.layers)         return "NS";
	        if (document.all)            return "IE";
	        if (document.getElementById) return "MOZ";
	        return "OTHER";
	      }
	  <!-- ............................................................................................ -->

  	  <!-- ............................................................................................ -->
	  <!-- CONTENEDOR DE FORMULARIOS 																	-->

		  var contForms 				= new Array();

		  var contForms_maxCols			= 6
		  var contForms_FORM 			= 0;
		  var contForms_SELECTS 		= 1;
		  var contForms_CONTAINER 		= 2;
		  var contForms_FORMOCULTO 		= 3;
		  var contForms_URL 			= 4;
		  var contForms_CONTAINERVALUE 	= 5;

		  // Declara un contenedor de Formularios de selects navegables
		  //
		  // Se compone de la siguiente información:
		  //	- [0](contForms_FORM) 		nombreForm
		  //	- [1](contForms_SELECTS) 	lista de nombre de selects
		  //	- [2](contForms_CONTAINER) 	container
		  //	- [3](contForms_FORMOCULTO) nombreFormOcultoasociado
		  // 	- [4](contForms_URL) 		urldeCarga
		  //	- [5](contForms_CONTAINERVALUE) containerValue
		  function contForms_set ( nombreForm, selects, container, nombreFormOculto, urlCarga) {

				var nelementos = contForms.length;

				// Buscamos si el form ya esta declarado
				var filas = 0;
			  	var encontrado = contForms_getFila( nombreForm );

				if (encontrado == -1) {
				    contForms[nelementos] = new Array(contForms_maxCols);

					// Add el nuevo formulario en el array
					contForms[nelementos][contForms_FORM] 			= nombreForm;
					contForms[nelementos][contForms_SELECTS] 		= selects;
					contForms[nelementos][contForms_CONTAINER]		= container;
					contForms[nelementos][contForms_FORMOCULTO]		= nombreFormOculto;
					contForms[nelementos][contForms_URL]			= urlCarga;
					contForms[nelementos][contForms_CONTAINERVALUE] = null;

				}

		  }

		  // Encuentra la fila adecuada para el formulario dentro del contenedor de formularios
		  function contForms_getFila ( formulario ) {

  				var nelementos = contForms.length;

				var filas = 0;
			  	var encontrado = -1;

				for (filas = 0; filas < nelementos; filas++){
					if (contForms[filas] != null) {
				   		if (contForms[filas][contForms_FORM] == formulario) {
							encontrado = filas;
						}
					}
			  	}

				return encontrado;
		  }

		  // Devuelve un elemento del contenedor de Formularios
		  // Valores posibles: FORM, SELECTS, CONTAINER, FORMOCULTO, URL, CONTAINERVALUE
		  function contForms_getValorId( formulario, id ) {

			  var fila = -1;
			  var columna = -1;
			  var valor = -1;

			  // Comprueba si el para id proporcionado existe valor en el contendor
			  switch ( id ){
				case "FORM" :
					columna = contForms_FORM;
					break;
				case "SELECTS" :
					columna = contForms_SELECTS;
					break;
				case "CONTAINER" :
					columna = contForms_CONTAINER;
					break;
				case "FORMOCULTO" :
					columna = contForms_FORMOCULTO;
					break;
				case "URL" :
					columna = contForms_URL;
					break;
				case "CONTAINERVALUE" :
					columna = contForms_CONTAINERVALUE;
					break;
			  }

			  // Buscamos si el form ya esta declarado
			  var filas = 0;
			  var encontrado = contForms_getFila( formulario );

			  if ( encontrado != -1 ) {
			  	  return contForms[encontrado][columna];
			  } else
			  	  return null;
		  }

		  // Establece el valor del container
		  function contForms_setContainer ( nombreForm, containerValue ){
				// Buscamos si el form ya esta declarado
			  	var encontrado = contForms_getFila( nombreForm );

				if (encontrado != -1) {
					contForms[encontrado][contForms_CONTAINERVALUE] = containerValue;
				}
		  }

	  <!-- ............................................................................................ -->

  	  <!-- ............................................................................................ -->
	  <!-- GESTORES DE FUNCIONAMIENTO DE LOS SELECTS 													-->

      // Inicialización del sistema (debe llamarse en el onLoad)
      function contForms_init(nombreForm) {
		var containerValue = null;
		<!-- Recuperamos del formulario sus datos -->
		eval( "var nombreFormOculto = document." + nombreForm + ".formOculto.value");
		eval( "var nombresSelects = document." + nombreForm + ".nombreSelects.value");
		eval( "var selects = nombresSelects.split(',') " );
		eval( "var container = document." + nombreForm + ".nombreContainer.value");
		eval( "var urlCarga = document." + nombreForm + ".url.value");

	    // Declaramos el nombre del formulario
	    contForms_set ( nombreForm, selects, container, nombreFormOculto, urlCarga );

		nav = browserSniff();
		if (selectsEnCarga) {
            contForms_enCarga( nombreForm );
        }
        containerValue  = contForms_creaContenedor(container, urlCarga);

		contForms_setContainer ( nombreForm, containerValue );
      }

      // Inicialización del sistema (debe llamarse en el onLoad)
      // Como contForms_init, pero sin vaciar los selects del formulario.
      // Usar cuando los selects ya contienen los datos iniciales, y no necesita precargarlos desde el contenedor
      function contForms_init_sinCarga(nombreForm) {
        selectsEnCarga = false;
        contForms_init(nombreForm);
      }

      // Para todos los selects, borra su contenido y los pone con un mensaje de espera
      function contForms_enCarga( formulario ) {
   	    var selects = contForms_getValorId( formulario, "SELECTS" );

        for (i=0;i<selects.length;i++) {
          eval("numOpt = document." + formulario + "." + selects[i] + ".options.length");
          for (j=0;j<numOpt;j++) {
            eval("document." + formulario + "." + selects[i] + ".options[" + j + "] = null");
          }
          eval("document." + formulario + "." + selects[i] + ".options[0] = new Option(msgCargando, '')");
          eval("document." + formulario + "." + selects[i] + ".selectedIndex = 0");
          eval("document." + formulario + "." + selects[i] + ".disabled = true");
        }
      }

      // Crea el contenedor invisible donde irán las peticiones post
      function contForms_creaContenedor(nombre, url) {
        var container;
        switch(nav) {
          case 'NS':
            container             = new Layer(100);
            container.name        = nombre;
            container.id          = nombre;
            container.visibility  = 'hidden';
            container.clip.width  = 100;
            container.clip.height = 100;
            container.src         = url;
            break;

          case 'IE':
            document.body.insertAdjacentHTML( "afterBegin", '<span id="SPAN' + nombre + '"></span>' );
            var span = document.all("SPAN" + nombre);
            var html = '<iframe id="' + nombre + '" name="' + nombre + '" src=""></iframe>';
            span.innerHTML = html;
            span.style.display = 'none';
            eval("container = window.document." + nombre);
            container.document.location.replace(url);
            break;

          case 'MOZ':
            var span = document.createElement('SPAN');
            span.id = "SPAN" + nombre;
            span.style.visibility ='hidden'
            document.body.appendChild(span);
            var iframe = document.createElement('IFRAME');
            iframe.name = nombre;
            iframe.id   = nombre;
            span.appendChild(iframe);
            container = iframe;
            container.src  = '';
            container.src  = url;
            break;
        }
        return container;
      }


      // Devuelve una referencia al input indicado del formulario oculto del contenedor
      function contForms_getInputOculto(formulario, clave) {

	    var formOculto = contForms_getValorId( formulario, "FORMOCULTO" );
		var container = contForms_getValorId( formulario, "CONTAINERVALUE" );

        switch(nav) {
          case 'NS':
            return container.document.forms[formOculto].elements[clave];
          case 'IE':
            return container.document.forms[formOculto][clave];
          case 'MOZ':
            //return window.frames[container.name].contentDocument.forms[formOculto][clave];
            return container.contentDocument.forms[formOculto][clave];
        }
      }

      // Lanza un submit en el formulario oculto del contenedor
      function contForms_submitOculto(formulario) {

  	    var formOculto = contForms_getValorId( formulario, "FORMOCULTO" );
		var container = contForms_getValorId( formulario, "CONTAINERVALUE" );

        switch(nav) {
          case 'NS':
            return container.document.forms[formOculto].submit();
          case 'IE':
            return container.document.forms[formOculto].submit();
          case 'MOZ':
            //return window.frames[container.name].contentDocument.forms[formOculto].submit();
            return container.contentDocument.forms[formOculto].submit();
        }
      }

      // Manejador del Onchange por defecto de los select.
      // Genera un submit en el container habiendo cambiado los valores del formulario oculto de forma jeráquica.
      // El orden de los nombres del array de selects implica el orden jerárquico
      function contForms_manejador(formulario, nombreSelect, valor) {
		  eval("contForms_getInputOculto('" + formulario + "','" + nombreSelect + "').value = valor");
          pasado = false;

		  var selects = contForms_getValorId( formulario, "SELECTS" );
          for (i=0;i<selects.length;i++) {
            if (selects[i] == nombreSelect) {
              pasado = true;
            } else if (pasado) {
              eval("contForms_getInputOculto('" + formulario + "','" + selects[i] + "').value = ''");
            }
          }
          contForms_submitOculto( formulario );
          contForms_enCarga( formulario );
      }

	  <!-- ............................................................................................ -->