/*
 * jstree - Árbol implementado con Javascript
 * Modificado para arreglar un bug en Netscape 7.x, y para abrir niveles completos
 */
/*
 * Modified on November 11, 2000 to correct some problems
 * encountered with the build ID: 2000112020
 * These problems were mostly associated with eliminating
 * Text Objects
 */

var jstreeDebug = false;
var _jstreePatternExtraeIdNumber = /[^0-9]+([0-9].*)/g;
var _jstreePatternExtraeSeccion = /[0-9\.]/g;

/* -------------------------------------------------------------------------------------- */
function _jstreeGetChildElement(obj, childNum) {
  var child = 0;
  if (obj.hasChildNodes()) {
    for (var i=0; i < obj.childNodes.length; i++) {
      if (obj.childNodes[i].nodeType != 1) continue;
      if (child != childNum) {
         child++;
         continue;
      } else
         return obj.childNodes[i];
    }
  }
  return null;
} // _jstreeGetChildElement

/* ************************************************************************************** */
function jstreeChngto(evt, toWhat){
  var el;
  if (document.all)
    el = event.srcElement;
  else {
    el = evt.target;
    if (el.nodeType == 3) el = el.parentNode;
  }
  if ("B" == el.tagName || "SPAN" == el.tagName || "IMG" == el.tagName) {
   if ("IMG" == el.tagName) {
      if (!el.name) return;
   } else {
     var parent = el.parentNode;
     while (parent.tagName != "TD") parent = parent.parentNode;
     tableLayer = _jstreeGetChildElement(parent, 1);
     if (tableLayer == null || tableLayer.tagName != "DIV") return;
     // dump("element: " + el.tagName + " ChangeTo: " + toWhat + "  Class: " + el.className + "\n");
     el.className = toWhat;
   }
   if (toWhat == 'hover') {
     el.style.cursor = (document.all) ? 'hand' : 'pointer';
     // el.style.color = 'red';
   } else {
     el.style.cursor = 'default';
     // el.style.color = 'black';
   }
  }
} // jstreeChngto

/* -------------------------------------------------------------------------------------- */
/** @todo se usa? */
function jstreeGetElFromEvt(evt) {
  var el;
  if (document.all)
    el = event.srcElement;
  else {
    el = evt.target;
    if (el.nodeType == 3) el = el.parentNode;
  }
  return el;
}

/* ************************************************************************************** */
// Abre una rama si estaba cerrada, o viceversa
function jstreeExposeTable(evt) {
  var el;
  if (document.all)
    el = event.srcElement;
  else {
    el = evt.target;
    if (el.nodeType == 3) el = el.parentNode;
  }

  _jstreeRamasEstadoPrepara();

  _jstreeExposeElement(el, (void 0)/*valor undefined, hacer toggle*/);

  _jstreeRamasEstadoRegresa();
} // jstreeExposeTable

/* ************************************************************************************** */
// Abre las ramas de un nivel hacia arriba, cerrando las ramas de niveles inferiores
function jstreeAbrirNivel(callee, nivelAAbrir, tablaPrincipalId) {
  // Abre niveles completos del árbol

  if ("noop" != nivelAAbrir.toLowerCase()) {
    if (nivelAAbrir < 0) nivelAAbrir = 9999; // abrir todos los niveles

    // Las ramas que tengan un nivel superior a nivelAAbrir las cierra,
    // y las que tengan un nivel inferior o igual a nivelAAbrir las abre.

    var tablaPrincipal = document.getElementById(tablaPrincipalId);
    if (tablaPrincipal != null) {
      var images = tablaPrincipal.getElementsByTagName("IMG");
      if (typeof images != "undefined" && images != null && images.length != 0) {
        _jstreeRamasEstadoPrepara();

        for (var iImages = 0; iImages < images.length; iImages++) {
          var img = images[iImages];
          var profundidad = _jstreeObtieneProfundidad(img);
          if (profundidad == null) continue; // si la imagen no es del jstree la pasa por alto
var oldjstreeDebug = jstreeDebug;
jstreeDebug = false;
          if (profundidad > nivelAAbrir) {
            // cierra la rama
            _jstreeExposeElement(img, "closed");
          } else {
            // abre la rama
            _jstreeExposeElement(img, "open");
          }
jstreeDebug = oldjstreeDebug;
        } // for

        _jstreeRamasEstadoRegresa();
      } // typeof images != "undefined" && images != null && images.length != 0
    } // tablaPrincipal != null
  } // "noop" != nivelAAbrir.toLowerCase()

  if (callee.type == "select-one") {
    callee.selectedIndex = 0;
  }
  callee.blur();
  window.focus();
} // jstreeAbrirNivel

/* -------------------------------------------------------------------------------------- */
function _jstreeExposeElement(el, state) {
  if ("B" == el.tagName || "SPAN" == el.tagName || "IMG" == el.tagName) {
    if ("IMG" == el.tagName) {
      if (_jstreeObtieneProfundidad(el) == null) return; // si el elemento no es del jstree la pasa por alto
      //      if (!el.name) return; // ATS cambiado, pues no toda imagen dentro de la tabla que simplemente tenga el atributo NAME es válida para abrir y cerrar la rama
      var parent = el.parentNode;
      while (parent.tagName != "TD") parent = parent.parentNode;  // get containing table cell element
      el = parent.nextSibling;
      while (el.nodeType != 1) el = el.nextSibling;  // get first sibling ELEMENT
      tableLayer = _jstreeGetChildElement(el, 1);  // get second child element
      parent = el;
      el = el.firstChild;   // should be the SPAN or DIV element
      while (el.nodeType != 1) el = el.nextSibling;  // get first sibling ELEMENT, should be the SPAN or DIV element
    } else {
      var parent = el.parentNode;
      while (parent.tagName != "TD") parent = parent.parentNode;
      tableLayer = _jstreeGetChildElement(parent, 1);
    }
    if (jstreeDebug) {
      var msg = "";
      msg += "el: "
      if (el.nodeType == 1) msg += el + " Element: " + el.tagName;
      if (el.nodeType == 1) msg += "\n" + el + " Name: " + el.name;
      if (el.nodeType == 1) msg += "\n" + el + " Id: " + el.id;
      if (el.nodeType == 3) msg += "\n" + el + " Value: " + escape(el.nodeValue);
      msg += "\n---------\n"
      msg += "Parent: " + parent.tagName + " No of Children: " + parent.childNodes.length + "\n";
      for (var i=0; i<parent.childNodes.length; i++) {
        msg += "    Child[" + i + "]: ";
        if (parent.childNodes[i].nodeType == 1) msg += parent.childNodes[i] + " Element: " + parent.childNodes[i].tagName;
        if (parent.childNodes[i].nodeType == 1) msg += parent.childNodes[i] + " Name: " + parent.childNodes[i].name;
        if (parent.childNodes[i].nodeType == 3) msg += parent.childNodes[i] + " Value: " + escape(parent.childNodes[i].nodeValue);
        msg += "\n";
      }
      msg += "---------\n"
      msg += "tableLayer: "
      if (tableLayer.nodeType == 1) msg += tableLayer + " Element: " + tableLayer.tagName;
      if (tableLayer.nodeType == 3) msg += tableLayer + " Value: " + escape(tableLayer.nodeValue);

      alert(msg);
    }
    if (typeof state == "undefined") {
      // no se especificó state, hacer toggle
      if (tableLayer == null || tableLayer.tagName != "DIV") return;
      var loc = document.images[el.id.toLowerCase()].src.indexOf(jstreeCloseImg);
      state = (loc != -1 ? 'open' : 'closed');
    }
    if (state == 'open') {
      tableLayer.style.display = 'block';
      document.images[el.id.toLowerCase()].src = jstreeOpenImg;
      document.images[el.id.toLowerCase()].alt = jstreeOpenAlt;

      _jstreeQuitaRama(el,"Cerradas");
      _jstreeAgregaRama(el,"Abiertas");
    } else {
      tableLayer.style.display = 'none';
      document.images[el.id.toLowerCase()].src = jstreeCloseImg;
      document.images[el.id.toLowerCase()].alt = jstreeCloseAlt;

      _jstreeQuitaRama(el,"Abiertas");
      _jstreeAgregaRama(el,"Cerradas");
    }
  }
} // _jstreeExposeElement

/* -------------------------------------------------------------------------------------- */
function _jstreeQuitaRama(el,grupo) {
  var elIdNumber = el.id.replace(_jstreePatternExtraeIdNumber,"$1");
  var elSeccion = el.id.replace(_jstreePatternExtraeSeccion,"");

  var ramasNombre = jstreePrefijoRamas+"_"+elSeccion+"_"+grupo;
  var ramasArr = _jstreeRamasEstado[ramasNombre];

  for (var i=0; i < ramasArr.length; i++) {
    if (elIdNumber == ramasArr[i]) {
      ramasArr.splice(i,1); // borra elemento
      break;
    }
  }

  _jstreeRamasEstado[ramasNombre] = ramasArr;
} // _jstreeQuitaRama

/* -------------------------------------------------------------------------------------- */
function _jstreeAgregaRama(el,grupo) {
  var elIdNumber = el.id.replace(_jstreePatternExtraeIdNumber,"$1");
  var elSeccion = el.id.replace(_jstreePatternExtraeSeccion,"");

  var ramasNombre = jstreePrefijoRamas+"_"+elSeccion+"_"+grupo;
  var ramasArr = _jstreeRamasEstado[ramasNombre];

  var encontrado = false;
  for (var i=0; i < ramasArr.length; i++) {
    if (elIdNumber == ramasArr[i]) {
      encontrado = true;
      break;
    }
  }
  if ( ! encontrado) {
    ramasArr[ramasArr.length] = elIdNumber;
  }

  _jstreeRamasEstado[ramasNombre] = ramasArr;
} // _jstreeAgregaRama

/* -------------------------------------------------------------------------------------- */
function _jstreeObtieneProfundidad(el, attName) {
  if (typeof el == "undefined") return null; // no existe el elemento

  var att;
  if (typeof attName != "undefined" && attName == "id") {
    att = el.id;
  } else {
    att = el.name;
  }
  if (typeof att == "undefined") return null; // no tiene atributo
  if (att.substring(0,6).toLowerCase() != "jstree") return null;
  var indexOfPoint = att.lastIndexOf(".");
  if (indexOfPoint == -1) return null;
  return Number(att.substring(indexOfPoint+1));
} // _jstreeObtieneProfundidad

/* ************************************************************************************** */
function jstreeSeleccionaNivel(callee, nivelASeleccionar, tablaPrincipalId, funcion) {
  // Busca y selecciona los checkbox de nivel inferior o igual a nivelASeleccionar
  // y los de niveles superiores los deselecciona

  if ("noop" != nivelASeleccionar.toLowerCase()) {
    if (nivelASeleccionar < 0) nivelASeleccionar = 9999; // seleccionar todos los niveles

    var tablaPrincipal = document.getElementById(tablaPrincipalId);
    if (tablaPrincipal != null) {
      var divs = tablaPrincipal.getElementsByTagName("DIV");
      if (typeof divs != "undefined" && divs != null && divs.length != 0) {
        for (var iDivs = 0; iDivs < divs.length; iDivs++) {
          var div = divs[iDivs];
          var profundidad = _jstreeObtieneProfundidad(div, "id");
          if (profundidad == null) continue; // si el DIV no es del jstree lo pasa por alto

          var inputs = div.getElementsByTagName("INPUT");
          if (typeof inputs == "undefined" || inputs == null || inputs.length == 0) continue;
          for (var iInputs = 0; iInputs < inputs.length; iInputs++) {
            var input = inputs[iInputs];
            if (input.type == "checkbox") {
              funcion(input, profundidad, nivelASeleccionar);
              break; // al primer checkbox encontrado se detiene de buscar dentro de este DIV
            }
          } // for imputs
        } // for divs
      } // typeof divs != "undefined" && divs != null && divs.length != 0
    } // tablaPrincipal != null
  } // "noop" != nivelASeleccionar.toLowerCase()

  if (callee.type == "select-one") {
    callee.selectedIndex = 0;
  }
  callee.blur();
  window.focus();
} // jstreeSeleccionaNivel

/* ************************************************************************************** */
function jstreeAbreRamas(sufijo) {
  _jstreeRamasEstadoPrepara();

  // Itera con grupoAbiertas en false y luego en true
  var grupoAbiertas = false;
  do {
    var grupo;
    if (grupoAbiertas) grupo = "Abiertas"; else grupo = "Cerradas";
    var ramasAbiertasEl = document.getElementById(jstreePrefijoRamas+'_'+sufijo.replace('\.','')+'_'+grupo)

/** @todo optimizar busqueda? */
    if (typeof ramasAbiertasEl == "undefined") return; // no existe el elemento
    var ramasAbiertasArr = _jstreeUtilSplit(ramasAbiertasEl.value, ",");

    for (var i=0; i < ramasAbiertasArr.length; i++) {
      var imgArr = document.getElementsByName(sufijo+ramasAbiertasArr[i]);
      var img = (void 0)/*valor undefined*/;
      for (var iImgArr=0; iImgArr<imgArr.length; iImgArr++) {
        if (imgArr[iImgArr].tagName == "IMG") {
          img = imgArr[iImgArr];
          break;
        }
      }
      if (typeof img != "undefined" && img) {
        if (grupoAbiertas) {
          _jstreeExposeElement(img, "open");
        } else {
          _jstreeExposeElement(img, "closed");
        }
      }
    }

    grupoAbiertas = ! grupoAbiertas;
  } while (grupoAbiertas);

  _jstreeRamasEstadoRegresa();
} // jstreeAbreRamas

/*

onmouseover="this.T_FIX=[xxx(this), yyy(this)];   this.T_STICKY=true;   return escape('<img src=\'image.jpg\' height=\'10\' width=\'10\'>');"

//onmouseover="var el=jstreeGetElFromEvt(event);this.T_FIX=[el.offsetLeft,el.offsetTop]; this.T_STICKY=true;return escape('<img src=\'image.jpg\' height=\'10\' width=\'10\'>')"
function _jstreeGetAbsoluteLeft(el) {
  var left = el.offsetLeft;
  if (el.offsetParent != null) {
    return left + _jstreeGetAbsoluteLeft(el.offsetParent);
  } else {
    return left;
  }
} // _jstreeGetAbsoluteLeft
function _jstreeGetAbsoluteTop(el) {
alert("el="+el);
  var top = el.offsetTop;
  if (el.offsetParent != null) {
    return top + _jstreeGetAbsoluteTop(el.offsetParent);
  } else {
    return top;
  }
} // _jstreeGetAbsoluteTop

function yyy(evt) {
  return _jstreeGetAbsoluteTop(this);
}
function xxx(evt) {
  return _jstreeGetAbsoluteLeft(this);
}
*/

/*
  var el=jstreeGetElFromEvt(evt);
//alert("callee="+callee);
//  alert(el.tagName+': '+el.offsetLeft+' , '+el.offsetTop+': el.offsetParent.tagName='+el.offsetParent.tagName
//+"\n*"+_jstreeGetAbsoluteLeft(el)
//+"\n*"+_jstreeGetAbsoluteTop(el));
  callee.T_FIX=[_jstreeGetAbsoluteLeft(el), _jstreeGetAbsoluteTop(el)];
  callee.T_STICKY=true;
  return callee.escape('<img src=\'image.jpg\' height=\'10\' width=\'10\'>')
}*/

/* ************************************************************************************** */
function jstreeCheckSupportedBrowsers(txt) {
  // Sie el browser no es soportado: mostrar todas las ramas del árbol
  var tt_db = (document.compatMode && document.compatMode != 'BackCompat')? document.documentElement : document.body? document.body : null;
  var tt_n = navigator.userAgent.toLowerCase();
  var tt_op = window.opera && document.getElementById;
  var msieIndex = tt_n.indexOf("msie");

  var tt_ie505 = msieIndex != -1 && document.all && tt_db && !tt_op
      && parseFloat ( tt_n.substring ( msieIndex+5, tt_n.indexOf ( ";", msieIndex ) ) ) >= 5.05;
  var tt_n6 = (!tt_op && document.defaultView && typeof document.defaultView.getComputedStyle != "undefined");
  if (jstreeDebug) {
    alert("tt_ie505="+tt_ie505+"\n"+
          "version="+parseFloat ( tt_n.substring ( msieIndex+5, tt_n.indexOf ( ";", msieIndex ) ) )+"\n"+
          "tt_n6="+tt_n6);
  }
  return tt_ie505 || tt_n6;
} // jstreeCheckSupportedBrowsers

/* **************************************************************************************
 * _jstreeRamasEstado
 */
var _jstreeRamasEstado;
function _jstreeRamasEstadoCrea() {
  _jstreeRamasEstado = new Object()

  // Itera con grupoAbiertas en false y luego true
  var grupoAbiertas = false;
  do {
    var grupo;
    if (grupoAbiertas) grupo = "Abiertas"; else grupo = "Cerradas";

    for (var inombre = 0; inombre<jstreeRamasNombres.length; inombre++) {
      _jstreeRamasEstado[jstreePrefijoRamas+'_'+jstreeRamasNombres[inombre]+'_'+grupo] = [];
    }

    grupoAbiertas = ! grupoAbiertas;
  } while (grupoAbiertas);
} // _jstreeRamasEstadoCrea
function _jstreeRamasEstadoPrepara() {
  // Prepara _jstreeRamasEstado
  for (var nombreRamas in _jstreeRamasEstado) {
    _jstreeRamasEstado[nombreRamas] = _jstreeUtilSplit(document.getElementById(nombreRamas).value, ",");
  }
} // _jstreeRamasEstadoPrepara
function _jstreeRamasEstadoRegresa() {
  // Regresa _jstreeRamasEstado
  for (var nombreRamas in _jstreeRamasEstado) {
    document.getElementById(nombreRamas).value = _jstreeRamasEstado[nombreRamas].join(",");
    _jstreeRamasEstado[nombreRamas] = []; // borra para hacer que el garbage collector recupere la memoria
  }
} // _jstreeRamasEstadoRegresa


/* ************************************************************************************** */
var jstreeRamasEstadoInicial;
/* ************************************************************************************** */
/* ************************************************************************************** */
function jstree_toggleRamasEstadoInicial() {
  jstreeRamasEstadoInicial = !jstreeRamasEstadoInicial;
  $('#jstreeRamas_ramasEstadoInicial').attr('value', jstreeRamasEstadoInicial);

  _jstree_setRamasEstadoInicial(jstreeRamasEstadoInicial);
}
/* ************************************************************************************** */
function _jstree_setRamasEstadoInicial(cambiarAEstadoInicial) {
  /* Muestra las ramas cuyo estado inicial es desplegado */
  $('div.ramaAbierta').css('display','block');
  $('img.ramaAbierta').attr('src', jstreeOpenImg);

  /* Actualiza la lista de ramas abiertas, para que si se consulta un cuadro y después se regresa se abran automáticamente */
  $('img.ramaAbierta').each(function(n){ _jstree_agregaATextArea(n,this,'Abiertas'); });
  $('img.ramaAbierta').each(function(n){ _jstree_quitaDeTextArea(n,this,'Cerradas'); });

  /* Actualiza el texto y la imagen del triángulo que despliega/restaura todo el árbol */
  jstree_actualizaControlEstadoInicial(cambiarAEstadoInicial);

  if (cambiarAEstadoInicial) {
    /* Esconde las ramas cuyo estado inicial es escondido */
    $('div.ramaCerrada').css('display','none');
    $('img.ramaCerrada').attr('src', jstreeCloseImg);

    /* Actualiza la lista de ramas abiertas, para que si se consulta un cuadro y después se regresa se abran automáticamente */
    $('img.ramaCerrada').each(function(n){ _jstree_quitaDeTextArea(n,this,'Abiertas'); });
    $('img.ramaCerrada').each(function(n){ _jstree_agregaATextArea(n,this,'Cerradas'); });
  } else {
    /* Muestra las ramas cuyo estado inicial es escondido */
    $('div.ramaCerrada').css('display','block');
    $('img.ramaCerrada').attr('src', jstreeOpenImg);

    /* Actualiza la lista de ramas abiertas, para que si se consulta un cuadro y después se regresa se abran automáticamente */
    $('img.ramaCerrada').each(function(n){ _jstree_agregaATextArea(n,this,'Abiertas'); });
    $('img.ramaCerrada').each(function(n){ _jstree_quitaDeTextArea(n,this,'Cerradas'); });
  }
}
/* ************************************************************************************** */
/* Actualiza el texto y la imagen del triángulo que despliega/restaura todo el árbol */
function jstree_actualizaControlEstadoInicial(cambiarAEstadoInicial) {
  if (cambiarAEstadoInicial) {
    $('#toggleRamasEstadoInicialTexto').text(jstreeCloseAlt);
    $('#toggleRamasEstadoInicialImagen').attr('src', jstreeCloseImg);
  } else {
    $('#toggleRamasEstadoInicialTexto').text(jstreeRestaurarMsg);
    $('#toggleRamasEstadoInicialImagen').attr('src', jstreeOpenImg);
  }
}
/* ************************************************************************************** */
var pg = /.+\.([^0-9]+).+/g;
var pn = /[^0-9]+(.+)/g;
/* ************************************************************************************** */
function _jstree_agregaATextArea(n,el,sufjio,b,c,d) {
  /* el.name es del tipo 'jstree.resumen10014.2' */
  var grupo = el.name.replace(pg,"$1");
  /* g queda del tipo 'resumen' */
  var n = el.name.replace(pn,"$1");
  /* n queda del tipo '10014.2' */

  /* sólo lo agrega si todavía no está */
  var v = $('#jstreeRamas_jstree'+grupo+'_'+sufjio).attr('value');
  var va = v.split(",");
  for (var i = 0; i < va.length; i++) {
    if (va[i] == n) {
      return;
    }
  }

  if ('' == $('#jstreeRamas_jstree'+grupo+'_'+sufjio).attr('value')) {
    $('#jstreeRamas_jstree'+grupo+'_'+sufjio).attr('value', n);
  } else {
    $('#jstreeRamas_jstree'+grupo+'_'+sufjio).attr('value', v + ',' + n);
  }
}
/* ************************************************************************************** */
function _jstree_quitaDeTextArea(n,el,sufjio,b,c,d) {
  /* el.name es del tipo 'jstree.resumen10014.2' */
  var grupo = el.name.replace(pg,"$1");
  /* g queda del tipo 'resumen' */
  var n = el.name.replace(pn,"$1");
  /* n queda del tipo '10014.2' */

  var v = $('#jstreeRamas_jstree'+grupo+'_'+sufjio).attr('value');
  var va = v.split(",");
  var vnuevo = '';
  for (var i = 0; i < va.length; i++) {
    if (va[i] != n) {
      if ('' != vnuevo) {
        vnuevo = vnuevo + ',' + va[i];
      } else {
        vnuevo = va[i];
      }
    }
  }

  var v = $('#jstreeRamas_jstree'+grupo+'_'+sufjio).attr('value', vnuevo);
}

/* -------------------------------------------------------------------------------------- */
function _jstreeUtilSplit(s) {
    if (s.length > 0) {
      return s.split(",");
    } else {
      return [];
    }
}

/* **************************************************************************************
 * Inicialización
 */

document.write("<style TYPE=\"text/css\">");
document.write(".jstreeTableContainerVisible { display:block; }");
if (jstreeCheckSupportedBrowsers()) {
  document.write(".jstreeTableContainerInvisible { display:none; }");
} else {
  document.write(".jstreeTableContainerInvisible { display:block; }");
  jstreeExposeTable = new Function("event", ";");  // deshabilitar la función que abre y cierra las ramas
  jstreeChngto = new Function("event", "toWhat", ";");  // deshabilitar la función que cambia el mouse
}
document.write("</style>");

// Crea objeto que almacena el estado abierto o cerrado de las ramas
_jstreeRamasEstadoCrea();

