DOM = (document.getElementById) ? 1 : 0;
Opera = (navigator.userAgent.indexOf("Opera") > -1) ? 1 : 0;
IE = (navigator.userAgent.indexOf("MSIE") > -1) ? 1 : 0;
IE = IE && !Opera;
IE4 = (document.all) ? 1 : 0;
IE4 = IE4 && IE && !DOM;
using_status = false;

function get_element_by_id(name) {
  if (!IE4) {
    return document.getElementById(name);
  } else {
    return document.all(name);
  }
}

function t_select(table_id, node_id) {
  prefix = 't_' + table_id + '_' + node_id + '_n';

  name_nod_l = prefix + '_l';
  name_nod_m = prefix;
  name_nod_r = prefix + '_r';

  t_select_element(name_nod_l);
  t_select_element(name_nod_m);
  t_select_element(name_nod_r);

  update_status(table_id, node_id);
}

function update_status(table_id, node_id) {
  prefix = 't_' + table_id + '_' + node_id + '_n';

  element = get_element_by_id(prefix);
  status_set(element.alt + " this node");
}

function status_set(status) {
  if (using_status) {
    window.status = status;
  }
}

function t_deselect(table_id, node_id) {
  prefix = 't_' + table_id + '_' + node_id + '_n';

  name_nod_l = prefix + '_l';
  name_nod_m = prefix;
  name_nod_r = prefix + '_r';

  t_deselect_element(name_nod_l);
  t_deselect_element(name_nod_m);
  t_deselect_element(name_nod_r);

  status_set("");
}

function t_deselect_element(name) {
  element = get_element_by_id(name);

  new_image = deselect_if_s(get_leaf(element.src));
  if (new_image != null) {
    element.src = image_directory + new_image;
  }
}

function t_select_element(name) {
  element = get_element_by_id(name);

  new_image = select_if_deselected(get_leaf(element.src));
  if (new_image != null) {
    element.src = image_directory + new_image;
  }
}

function t_select_element_and_set_status(name, status) {
  t_select_element(name);

  status_set(status);
}

function t_deselect_element_and_status(name) {
  t_deselect_element(name);
  status_set("");
}

function tog_t_menu(table_id, node_id) {
  prefix = 't_' + table_id + '_' + node_id;

  name_son = prefix + '_son';
  name_nol = prefix + '_n_l';
  name_nod = prefix + '_n';
  name_nor = prefix + '_n_r';
  name_fle = prefix + '_f_l';
  name_fmi = prefix + '_f_m';
  name_fri = prefix + '_f_r';
  name_fmc = prefix + '_f_m_colr';
  name_fld = prefix + '_f';

  element_son = get_element_by_id(name_son);
  element_nol = get_element_by_id(name_nol);
  element_nod = get_element_by_id(name_nod);
  element_nor = get_element_by_id(name_nor);
  element_fle = get_element_by_id(name_fle);
  element_fmi = get_element_by_id(name_fmi);
  element_fri = get_element_by_id(name_fri);
  element_fmc = get_element_by_id(name_fmc);
  element_fld = get_element_by_id(name_fld);

  src_leaf = get_leaf(element_nod.src);

  //if (element_son == null) {
    //return;
  //}

  //if (element_son.style == null) {
    //return;
  //}

  if (element_son.style.display == "none") {
    element_son.style.display = "block";

    element_nod.src = image_directory + get_leaf(element_nod.src).replace("_pl", "_mi");

    element_fle.src = image_directory + get_leaf(element_fle.src).replace("_cl_", "_op_");
    element_fmi.src = image_directory + get_leaf(element_fmi.src).replace("_cl_", "_op_");
    element_fri.src = image_directory + get_leaf(element_fri.src).replace("_cl_", "_op_");

    element_fmc.style.background = "#808080";
    element_fld.value = "+";
    element_nol.alt = "Collapse";
    element_nod.alt = "Collapse";
    element_nor.alt = "Collapse";
  } else {
    element_son.style.display = "none";

    element_nod.src = image_directory + get_leaf(element_nod.src).replace("_mi", "_pl");

    element_fle.src = image_directory + get_leaf(element_fle.src).replace("_op_", "_cl_");
    element_fmi.src = image_directory + get_leaf(element_fmi.src).replace("_op_", "_cl_");
    element_fri.src = image_directory + get_leaf(element_fri.src).replace("_op_", "_cl_");

    element_fmc.style.background = "";
    element_fld.value = "-";
    element_nol.alt = "Expand";
    element_nod.alt = "Expand";
    element_nor.alt = "Expand";
  }

  update_status(table_id, node_id);
}

function set_t_menu(table_id, node_id, new_value) {
  name_fld = 't_' + table_id + '_' + node_id + '_f';

  element_fld = get_element_by_id(name_fld);

  element_fld.value = new_value;
}

function collapse_all_nodes(t_id) {
  status_set("[Closing all nodes]");
  using_status = false;
  tog_matching_nodes_in_range(t_id, "+", 0, 199);
  status_free_and_clear();
}

function expand_all_nodes(t_id) {
  status_set("[Opening all nodes]");
  using_status = false;
  tog_matching_nodes_in_range(t_id, "-", 0, 199);
  status_free_and_clear();
}

function open_as_far_as(t_id, level) {
  status_set("[Opening nodes as far as level " + level + "]");
  using_status = false;

  tog_matching_nodes_in_range(t_id, "-", 0, level);
  tog_matching_nodes_in_range(t_id, "+", level, 199);

  status_free_and_clear();
}

function t_d_c(t_id) {
  status_set("[Toggling descendant controls]");
  using_status = false;

  var action = false;
  for (var i = get_r_total(t_id); --i >= 0; ) {
    e_id = 't_' + t_id + '_op_descendants_of_t_' + t_id + "_" + i + "_x";
    toggle_element_visibility(e_id);
    e_id = 't_' + t_id + '_close_descendants_of_t_' + t_id + "_" + i + "_x";
    toggle_element_visibility(e_id);
  }

  status_free_and_clear();
}

function toggle_element_visibility(e_id) {
  element_fld = get_element_by_id(e_id);
  if (element_fld != null) {
    if (element_fld.style.display != "none") {
      element_fld.style.display = "none";
    } else {
      element_fld.style.display = "";
    }
  }
}

function open_descendants_of(node) {
  tree = get_t_from_n_name(node);
  row = get_r_from_n_name(node);
  max_row = get_r_total(tree);

  status_set("[Opening all descendants]");
  using_status = false;

  prefix = 't_' + tree + '_' + row;
  level_id = prefix + '_l';
  element_level = get_element_by_id(level_id);
  if (element_level != null) {
    initial_level = element_level.value;
    initial_row = ++row;
    do {
      prefix = 't_' + tree + '_' + row;
      level_id = prefix + '_l';
      element_level = get_element_by_id(level_id);
      if (element_level != null) {
        current_level = element_level.value;
        if ((current_level > initial_level) || (initial_row == row)) {
          tog_node(tree, row, "-");
        }
      }
      row++;
    } while ((row <= (initial_row + 2)) || ((current_level > initial_level) && (row < max_row)));
  }

  row = get_r_from_n_name(node);
  level_id = prefix + '_l';
  element_level = get_element_by_id(level_id);
  if (element_level != null) {
    prefix = 't_' + tree + '_' + row;
    level_id = prefix + '_l';
    element_level = get_element_by_id(level_id);
    if (element_level != null) {
      tog_node(tree, row, "-");
    }
  }

  status_free_and_clear();
}

function close_descendants_of(node) {
  status_set("[Closing all descendants]");
  using_status = false;

  tree = get_t_from_n_name(node);
  row = get_r_from_n_name(node);
  max_row = get_r_total(tree);

  prefix = 't_' + tree + '_' + row;
  level_id = prefix + '_l';
  element_level = get_element_by_id(level_id);
  if (element_level != null) {
    initial_level = element_level.value;
    initial_row = ++row;
    do {
      prefix = 't_' + tree + '_' + row;
      level_id = prefix + '_l';
      element_level = get_element_by_id(level_id);
      if (element_level != null) {
        current_level = element_level.value;
        if ((current_level > initial_level) || (row == initial_row)) {
          tog_node(tree, row, "+");
        }
      }
      row++;
    } while ((row <= (initial_row + 2)) || ((current_level > initial_level) && (row < max_row)));
  }

  status_free_and_clear();
}

function status_free() {
  using_status = true;
}

function status_free_and_clear() {
  status_free();
  status_set("");
}


function initially_collapse_all_nodes(t_id, min, max) {
  tog_matching_nodes_in_range(t_id, "i", min, max);
}

function get_leaf(str) {
  idx = str.indexOf("/");
  while (idx > -1) {
    str = str.substring(idx + 1);
    idx = str.indexOf("/");
  }

  return str;
}

function deselect_if_s(str) {
  idx = str.indexOf(".");
  branch = str.substring(0,idx);

  sel_idx = branch.indexOf("_sel");
  if (sel_idx > -1) {
    len = branch.length;
    return branch.substring(0,len - 4) + ".png";
  }

  return null;
}

function select_if_deselected(str) {
  idx = str.indexOf(".");
  branch = str.substring(0,idx);

  sel_idx = branch.indexOf("_sel");
  if (sel_idx <= -1) {
    return branch + "_sel.png";
  }

  return null;
}

function restore_state_from_form_fields(t_id) {
  var action = false;
  for (var i = get_r_total(t_id); --i >= 0; ) {
    prefix = 't_' + t_id + '_' + i;
    fld_id = prefix + '_f';
    element_fld = get_element_by_id(fld_id);
    if (element_fld != null) {
      id_son = prefix + '_son';
      element_son = get_element_by_id(id_son);
      if (element_son != null) {
        if ((element_son.style.display != "none") && (element_fld.value == "-")) {
          tog_t_menu(t_id, i);
          action = true;
        } else if ((element_son.style.display == "none") && (element_fld.value == "+")) {
          tog_t_menu(t_id, i);
          action = true;
        }
      }
    }
  }

  status_free();

  return action;
}

function tog_matching_nodes_in_range(t_id, matchstring, min, max) {
  for (var i = get_r_total(t_id); --i >= 0; ) {
    prefix = 't_' + t_id + '_' + i;
    fld_id = prefix + '_f';
    element_fld = get_element_by_id(fld_id);
    if (element_fld != null) {
      if (element_fld.value == matchstring) {
        indent_id = prefix + '_l';
        element_level = get_element_by_id(indent_id);
        if (element_level != null) {
          if (element_level.value >= min) {
            if (element_level.value <= max) {
              tog_t_menu(t_id, i);
            }
          }
        }
      }
    }
  }
}

function tog_node(tree, row, matchstring) {
  prefix = 't_' + tree + '_' + row;
  fld_id = prefix + '_f';
  element_fld = get_element_by_id(fld_id);
  if (element_fld != null) {
    if (element_fld.value == matchstring) {
      tog_t_menu(tree, row);
    }
  }
}

function set_up_nodes_not_in_range(t_id, matchstring, min, max) {
  for (var i = get_r_total(t_id); --i >= 0; ) {
    prefix = 't_' + t_id + '_' + i;
    fld_id = prefix + '_f';
    element_fld = get_element_by_id(fld_id);
    if (element_fld != null) {
      if (element_fld.value == matchstring) {
        indent_id = prefix + '_l';
        element_level = get_element_by_id(indent_id);
        if (element_level != null) {
          if ((element_level.value < min) || (element_level.value > max)) {
            set_t_menu(t_id, i, "+");
          }
        }
      }
    }
  }
}

function get_r_total(t_id) {
  count_name = 't_' + t_id + '_r_total';
  element_count = get_element_by_id(count_name);
  if (element_count != null) {
    return element_count.value;
  }

  return 100;
}

function open_named_node(name) {
  tree = get_t_from_n_name(name);
  row = get_r_from_n_name(name);

  prefix = 't_' + tree + '_' + row;

  fld_id = prefix + '_f';
  element_fld = get_element_by_id(fld_id);

  if (element_fld.value != "+") {
    tog_t_menu(tree, row);
  }
}

function get_t_from_n_name(name) {
  t_name = "t_" + name;
  element_tree = get_element_by_id(t_name);

  return element_tree.value;
}

function get_r_from_n_name(name) {
  r_name = "r_" + name;
  element_row = get_element_by_id(r_name);

  return element_row.value;
}

function preload_image(img) {
  (new Image()).src = image_directory + img;
}

