var __noItemToDelete = "Seleccione el elemento de la lista que desea retirar";

/** Agrega la categoría o subgrupo actuales a la lista de selecciones */
function agregarSeleccionTaxonomia(idCategoria, texto, forma) {
    var hashSeleccionadas = armarHashSeleccionadas(forma);

    hashSeleccionadas[idCategoria] = idCategoria + ' ' + texto;

    actualizarSeleccionadas(forma, hashSeleccionadas);
}

/** Verifica si la categoría o subgrupo señalados se pueden eliminar.
 *  Básicamente lo que se comprueba es que esté seleccionada una categoría o un
 *  subgrupo */
function puedeEliminarSeleccion(forma) {
  // Se inicia en 1 y no en 0 porque la primera opción siempre es un texto informativo
  for (var i = 1; i < forma.categoriasSeleccionadas.options.length; i++)
    if (forma.categoriasSeleccionadas.options[i].selected)
      return true;
  return false;
}

/** Elimina las categorías señaladas de la lista de selecciones */
function eliminarSeleccionesTaxonomia(forma) {
  if (!puedeEliminarSeleccion(forma)) {
    alert(__noItemToDelete);
    return;
  }

  var hashSeleccionadas = armarHashSeleccionadas(forma);
  var clavesAEliminar = getClavesAEliminar(forma);

  for (var i = 0; i < clavesAEliminar.length; i++) {
      hashSeleccionadas[clavesAEliminar[i]] = null;
  }

  actualizarSeleccionadas(forma, hashSeleccionadas);
}

/** Elimina una categoría desmarcada del menú de selecciones */
function eliminarSeleccionTaxonomia(idCategoria, forma) {
    var hashSeleccionadas = armarHashSeleccionadas(forma);

    hashSeleccionadas[idCategoria] = null;

    actualizarSeleccionadas(forma, hashSeleccionadas);
}

/** Arma un hastable con lo actualmente seleccionado de la taxonomía; la clave
 *  de cada elemento es el código completo de la categoría y subgrupo y el valor
 *  es una cadena con el nombre del elemento: "[categoría: ]subgrupo: grupo"
 *  2005-01-27 Cambio: Se cambia el código para colocar el idCategoria al principio
 *  de los textos listados.
 */
function armarHashSeleccionadas(forma) {
    var lasSeleccionadas = forma.compania_seleccionTaxonomia.value.split("??");
    var listaCategorias = new Array();
    var idCategoria;

    for (var i = 0; i < lasSeleccionadas.length; i++) {
        lasSeleccionadas[i] = unescape(lasSeleccionadas[i]);

        if (lasSeleccionadas[i].length <= 1)
            continue;

        idCategoria = lasSeleccionadas[i].substring(0, lasSeleccionadas[i].indexOf(" "));
        listaCategorias[idCategoria] = lasSeleccionadas[i];
    }

    return listaCategorias;
}

/** Actualiza tanto la lista visible como la oculta de categorías seleccionadas */
function actualizarSeleccionadas(forma, hashSeleccionadas) {
    var valAAsignar = "";
    var opt = 1;

    /* Se limpian categorias escogidas */
    for (var j = (forma.categoriasSeleccionadas.options.length - 1); j >= 1; j--) {
        forma.categoriasSeleccionadas.options[j] = null;
    }

    /* Se agregan las categorias del Hash */
    /* 2005-01-27 Cambio: El hash ya viene con el idCategoria. */
    for (var i in hashSeleccionadas) {
        if (hashSeleccionadas[i] != null) {
            valAAsignar += escape(hashSeleccionadas[i]) + "??";

            forma.categoriasSeleccionadas.options[opt++] = new Option(hashSeleccionadas[i], i);
        }
    }

    if (valAAsignar.length >= 2)
        valAAsignar = valAAsignar.substring(0, valAAsignar.length - 2);

    forma.compania_seleccionTaxonomia.value = valAAsignar;
}

/** Obtiene las claves de los elementos que se desea eliminar */
function getClavesAEliminar(forma) {
  var aRetornar = new Array;
  var j = 0;

  // Se inicia en 1 y no en 0 porque la primera opción siempre es un texto informativo
  for (var i = 1; i < forma.categoriasSeleccionadas.options.length; i++) {
      if (forma.categoriasSeleccionadas.options[i].selected)
          aRetornar[j++] = forma.categoriasSeleccionadas.options[i].value;
  }

  return aRetornar;
}

/** Verifica que la lista de categorías seleccionadas refleje el estado actual del campo oculto */
var __formaAActualizar;

function checkToUpdateSelectedItems(forma) {
    __formaAActualizar = forma;
    setTimeout("checkToUpdateSelectedItemsReal()", 1000);
}

function checkToUpdateSelectedItemsReal() {
    if ( (__formaAActualizar.categoriasSeleccionadas.options.length > 1)
         || (trim(__formaAActualizar.compania_seleccionTaxonomia.value).length == 0) )
      return;

    actualizarSeleccionadas(__formaAActualizar, armarHashSeleccionadas(__formaAActualizar));

    setTimeout("checkToUpdateSelectedItemsReal()", 1000);
}
