// $Id: supptreeparser.js 861 2003-06-24 16:31:13Z fbrabec $

function SuppNode( stKey) {
    this.name = stKey;
    this.items = new Array();
}

function isNumber(nr){
    var field = parseFloat(nr);
    return !isNaN(field);
}

function lookup(node, nm) {
    for (i = 0; i < node.items.length; i++) {
	if (node.items[i].name == nm) {
	    return i;
	}
    }
    return 
}


function myobject(val)
{ this.value = val; }

function get_max_depth(defstring) {
    depth = 1;
    maxdepth = 1;
  for (pos = 0; pos < defstring.length; pos++) {
    ch = defstring.charAt(pos);
    switch(ch){
    case '(':
	depth++;
	if (maxdepth < depth) maxdepth = depth;
	break;
    case ')':
	depth--;
	break;
    }
  }
  return maxdepth;
}

function parse_suppfield(node, defstring, pos) {
  word = "";

  while (pos.value < defstring.length) {
    ch = defstring.charAt(pos.value++);
    switch(ch){
    case '(':

      newnode = new SuppNode(word);
      node.items[node.items.length] = newnode;
      word = "";
      parse_suppfield(newnode, defstring, pos);
      break;
    case ")":
	if (word) {
	    newnode = new SuppNode(word);
	    node.items[node.items.length] = newnode;
	}
	word = "";
	return;
	break;
    case "|":
      newnode = new SuppNode(word);
      node.items[node.items.length] = newnode;
      word = "";
      break;
    default:
      word += ch;
      break;
    }
  }
  if (word) {
    newnode = new SuppNode(word);
    node.items[node.items.length] = newnode;
  }
}

function set_menus(aForm, id) {
    var pt, i, j, treestring, treedepth, newindex;
    var info_value, info_value_field, selected;

    info_value = new Array();
    pt = new SuppNode("root");
    treestring = aForm.elements["tree_values_" + id].value;
    treedepth = get_max_depth(treestring);
    parse_suppfield(pt, treestring, new myobject(0));
    info_value_field = aForm.elements["info_value_" + id].value;
    if (info_value_field) {
      info_value = info_value_field.split("|");
    } else {
      // add 'Empty' to the first menu
      aForm.elements["tree_info_value_" + id + "_0"].options[0] = new Option("--Empty--", "invalid");
    }
    for (i=0; i < treedepth;i++) {
      for (j=0; j < pt.items.length; j++) {
	selected = info_value.length > i && pt.items[j].name==info_value[i];
	next_index = aForm.elements["tree_info_value_" + id + "_" + i].options.length;
	aForm.elements["tree_info_value_" + id + "_" + i].options[next_index] = new Option(pt.items[j].name, j);
	aForm.elements["tree_info_value_" + id + "_" + i].options[next_index].selected = selected;
      }
      newindex = lookup(pt, info_value[i]);
      if (newindex >= 0)
	pt = pt.items[newindex];
      else
	break;
    }

}

function reset_menus(aForm, id, tid) {
    var pt, i, j, treestring, treedepth;
    var info_value = new Array();

    pt = new SuppNode("root");
    treestring = aForm.elements["tree_values_" + id].value;
    treedepth = get_max_depth(treestring);
    parse_suppfield(pt, treestring, new myobject(0));

    i=0; 
    do {
	if (!isNumber(aForm.elements["tree_info_value_" + id + "_" + i].value)) {
	    tid--;
	    break;
	}
	pt = pt.items[aForm.elements["tree_info_value_" + id + "_" + i].value];
	info_value[i] = pt.name;
	i++;
    } while(i <= tid);

    aForm.elements["info_value_" + id].value = info_value.join("|");

    for (i=tid+1; i < treedepth;i++) {
	// clear make select
	oldlength = aForm.elements["tree_info_value_" + id + "_" + i].options.length;
	aForm.elements["tree_info_value_" + id + "_" + i].options.length = 0;
	aForm.elements["tree_info_value_" + id + "_" + i].options[0] = new Option('---', 'empty');
    }
	
    if (tid < treedepth-1) {
	for (j=0; j < pt.items.length; j++) {
	  next_index = aForm.elements["tree_info_value_" + id + "_" + (tid+1)].options.length;
	    aForm.elements["tree_info_value_" + id + "_" + (tid+1)].options[next_index] = new Option(pt.items[j].name, j);
	}
    }
}

