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 tree_select(table_id, node_id) {
  prefix = 'tree_' + table_id + '_' + node_id + '_node';

  name_nod_l = prefix + '_left';
  name_nod_m = prefix;
  name_nod_r = prefix + '_right';

  tree_select_element(name_nod_l);
  tree_select_element(name_nod_m);
  tree_select_element(name_nod_r);

  update_status(table_id, node_id);
}

function update_status(table_id, node_id) {
  prefix = 'tree_' + table_id + '_' + node_id + '_node';

  element = get_element_by_id(prefix);
  set_status(element.alt + " this node");
}

function set_status(status) {
  if (using_status) {
    window.status = status;
  }
}

function tree_deselect(table_id, node_id) {
  prefix = 'tree_' + table_id + '_' + node_id + '_node';

  name_nod_l = prefix + '_left';
  name_nod_m = prefix;
  name_nod_r = prefix + '_right';

  tree_deselect_element(name_nod_l);
  tree_deselect_element(name_nod_m);
  tree_deselect_element(name_nod_r);

  set_status("");
}

function tree_deselect_element(name) {
  element = get_element_by_id(name);

  new_image = deselect_if_selected(get_leaf(element.src));
  if (new_image != null) {
    element.src = image_directory + new_image;
  }
}

function tree_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 tree_select_element_and_set_status(name, status) {
  tree_select_element(name);

  set_status(status);
}

function tree_deselect_element_and_status(name) {
  tree_deselect_element(name);
  set_status("");
}

function toggle_tree_menu(table_id, node_id) {
  prefix = 'tree_' + table_id + '_' + node_id;

  name_son = prefix + '_son';
  name_nol = prefix + '_node_left';
  name_nod = prefix + '_node';
  name_nor = prefix + '_node_right';
  name_fle = prefix + '_folder_left';
  name_fmi = prefix + '_folder_middle';
  name_fri = prefix + '_folder_right';
  name_fmc = prefix + '_folder_middle_colour';
  name_fld = prefix + '_field';

  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.style.display == "none") {
    element_son.style.display = "block";

    element_nod.src = image_directory + get_leaf(element_nod.src).replace("_plus", "_minus");

    element_fle.src = image_directory + get_leaf(element_fle.src).replace("_closed_", "_open_");
    element_fmi.src = image_directory + get_leaf(element_fmi.src).replace("_closed_", "_open_");
    element_fri.src = image_directory + get_leaf(element_fri.src).replace("_closed_", "_open_");

    element_fmc.style.background = "#808080";
    element_fld.value = "expanded";
    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("_minus", "_plus");

    element_fle.src = image_directory + get_leaf(element_fle.src).replace("_open_", "_closed_");
    element_fmi.src = image_directory + get_leaf(element_fmi.src).replace("_open_", "_closed_");
    element_fri.src = image_directory + get_leaf(element_fri.src).replace("_open_", "_closed_");

    element_fmc.style.background = "";
    element_fld.value = "collapsed";
    element_nol.alt = "Expand";
    element_nod.alt = "Expand";
    element_nor.alt = "Expand";
  }

  update_status(table_id, node_id);
}

function set_tree_menu(table_id, node_id, new_value) {
  name_fld = 'tree_' + table_id + '_' + node_id + '_field';

  element_fld = get_element_by_id(name_fld);

  element_fld.value = new_value;
}

function collapse_all_nodes(tree_id) {
  toggle_matching_nodes_in_range(tree_id, "expanded", 0, 199);
}

function expand_all_nodes(tree_id) {
  toggle_matching_nodes_in_range(tree_id, "collapsed", 0, 199);
}

function open_as_far_as(tree_id, level) {
  toggle_matching_nodes_in_range(tree_id, "collapsed", 0, level);
  toggle_matching_nodes_in_range(tree_id, "expanded", level, 199);
}

function open_descendants_of(node) {
  tree = get_tree_from_node_name(node);
  row = get_row_from_node_name(node);
  max_row = get_row_total(tree);

  prefix = 'tree_' + tree + '_' + row;
  level_id = prefix + '_level';
  element_level = get_element_by_id(level_id);
  if (element_level != null) {
    initial_level = element_level.value;
    initial_row = row;
    do {
      prefix = 'tree_' + tree + '_' + row;
      level_id = prefix + '_level';
      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)) {
          toggle_node(tree, row, "collapsed");
        }
      }
      row++;
    } while ((row <= (initial_row + 2)) || ((current_level > initial_level) && (row < max_row)));
  }
}

function close_descendants_of(node) {
  tree = get_tree_from_node_name(node);
  row = get_row_from_node_name(node);
  max_row = get_row_total(tree);

  prefix = 'tree_' + tree + '_' + row;
  level_id = prefix + '_level';
  element_level = get_element_by_id(level_id);
  if (element_level != null) {
    initial_level = element_level.value;
    initial_row = ++row;
    do {
      prefix = 'tree_' + tree + '_' + row;
      level_id = prefix + '_level';
      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)) {
          toggle_node(tree, row, "expanded");
        }
      }
      row++;
    } while ((row <= (initial_row + 2)) || ((current_level > initial_level) && (row < max_row)));
  }
}


function initially_collapse_all_nodes(tree_id, min, max) {
  toggle_matching_nodes_in_range(tree_id, "initial", 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_selected(str) {
  idx = str.indexOf(".");
  branch = str.substring(0,idx);

  sel_idx = branch.indexOf("_selected");
  if (sel_idx > -1) {
    len = branch.length;
    return branch.substring(0,len - 9) + ".png";
  }

  return null;
}

function select_if_deselected(str) {
  idx = str.indexOf(".");
  branch = str.substring(0,idx);

  sel_idx = branch.indexOf("_selected");
  if (sel_idx <= -1) {
    return branch + "_selected.png";
  }

  return null;
}

function restore_state_from_form_fields(tree_id) {
  var action = false;
  for (var i = get_row_total(tree_id); --i >= 0; ) {
    prefix = 'tree_' + tree_id + '_' + i;
    fld_id = prefix + '_field';
    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 == "collapsed")) {
          toggle_tree_menu(tree_id, i);
          action = true;
        } else if ((element_son.style.display == "none") && (element_fld.value == "expanded")) {
          toggle_tree_menu(tree_id, i);
          action = true;
        }
      }
    }
  }

  using_status = true;

  return action;
}

function toggle_matching_nodes_in_range(tree_id, matchstring, min, max) {
  for (var i = get_row_total(tree_id); --i >= 0; ) {
    prefix = 'tree_' + tree_id + '_' + i;
    fld_id = prefix + '_field';
    element_fld = get_element_by_id(fld_id);
    if (element_fld != null) {
      if (element_fld.value == matchstring) {
        indent_id = prefix + '_level';
        element_level = get_element_by_id(indent_id);
        if (element_level != null) {
          if (element_level.value >= min) {
            if (element_level.value <= max) {
              toggle_tree_menu(tree_id, i);
            }
          }
        }
      }
    }
  }
}

function toggle_node(tree, row, matchstring) {
  prefix = 'tree_' + tree + '_' + row;
  fld_id = prefix + '_field';
  element_fld = get_element_by_id(fld_id);
  if (element_fld != null) {
    if (element_fld.value == matchstring) {
      toggle_tree_menu(tree, row);
    }
  }
}

function set_up_nodes_not_in_range(tree_id, matchstring, min, max) {
  for (var i = get_row_total(tree_id); --i >= 0; ) {
    prefix = 'tree_' + tree_id + '_' + i;
    fld_id = prefix + '_field';
    element_fld = get_element_by_id(fld_id);
    if (element_fld != null) {
      if (element_fld.value == matchstring) {
        indent_id = prefix + '_level';
        element_level = get_element_by_id(indent_id);
        if (element_level != null) {
          if ((element_level.value < min) || (element_level.value > max)) {
            set_tree_menu(tree_id, i, "expanded");
          }
        }
      }
    }
  }
}

function get_row_total(tree_id) {
  count_name = 'tree_' + tree_id + '_row_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_tree_from_node_name(name);
  row = get_row_from_node_name(name);

  prefix = 'tree_' + tree + '_' + row;

  fld_id = prefix + '_field';
  element_fld = get_element_by_id(fld_id);

  if (element_fld.value != "expanded") {
    toggle_tree_menu(tree, row);
  }
}

function get_tree_from_node_name(name) {
  tree_name = "tree_" + name;
  element_tree = get_element_by_id(tree_name);

  return element_tree.value;
}

function get_row_from_node_name(name) {
  row_name = "row_" + name;
  element_row = get_element_by_id(row_name);

  return element_row.value;
}

function preload_image(img) {
  (new Image()).src = image_directory + img;
}

