//tree defaults to fully expanded for browsers that don't
//support getElementById(), fully collapsed otherwise

if(!COOKIES) {
  var COOKIES = 1;
  function getCookie(NameOfCookie) {
    if (document.cookie.length > 0) {
      begin = document.cookie.indexOf(NameOfCookie+"=");
      if (begin != -1) {
        begin += NameOfCookie.length+1;
        end = document.cookie.indexOf(";", begin);
        if (end == -1) end = document.cookie.length;
          return unescape(document.cookie.substring(begin, end));
      }
    }
    return "";
  }
  function setCookie(NameOfCookie, value, expiredays) {
    var ExpireDate = new Date ();
    ExpireDate.setTime(ExpireDate.getTime() + (expiredays * 24 * 3600 * 1000));
    document.cookie = NameOfCookie + "=" + escape(value) +
      ((expiredays == null) ? "" : "; expires=" + ExpireDate.toGMTString());
  }
  function delCookie (NameOfCookie) {
    if (getCookie(NameOfCookie)) {
      document.cookie = NameOfCookie + "=" + "; expires=Thu, 01-Jan-70 00:00:01 GMT";
    }
  }
}


if(!TREE_COLLAPSE) {
  var TREE_COLLAPSE = 1;
  function toggle_node(id, remember) {
    var i;
    var obj;
    var expNodes = new Array;
    if(remember != 0)
      remember = 1;
    for(i=0; i<nodes.length; i++) {
      if(nodes[i]) {
        if(nodes[i]['id']==id) {
          var l = nodes[i]['l'];
          var r = nodes[i]['r'];
          var exp = nodes[i]['exp'];
          var index = i;
          break;
        }
      }
    }
    if(exp) {
      for(i=0; i<nodes.length; i++) {
        if(nodes[i]) {
          if(l < nodes[i]['l'] && r > nodes[i]['r'] && !nodes[i]['folded_by']) {
            nodes[i]['folded_by'] = id;
            obj = document.getElementById('node_'+nodes[i]['id']);
            obj.style.display = 'none';
          }
        }
      }
      nodes[index]['exp'] = 0;
      if(obj = document.getElementById('img_'+id))
        obj.src = obj.src.replace(/m(\d?\.gif)/, "p$1");
    }
    else {
      for(i=0; i<nodes.length; i++) {
        if(nodes[i]) {
          if(l < nodes[i]['l'] && r > nodes[i]['r'] && nodes[i]['folded_by'] == id) {
            nodes[i]['folded_by'] = 0;
            obj = document.getElementById('node_'+nodes[i]['id']);
            obj.style.display = '';
          }
        }
      }
      nodes[index]['exp'] = 1;
      if(obj = document.getElementById('img_'+id))
        obj.src = obj.src.replace(/p(\d?\.gif)/, "m$1");
    }
    if(remember) {
      var j = 0;
      for(i=0; i<nodes.length; i++) {
        if(nodes[i]) {
          if(nodes[i]['exp']) {
            expNodes[j++] = nodes[i]['id'];
          }
        }
      }
      setCookie("expNodes", expNodes.join(","));
    }
  }
  function toggle_all(act,l,r) {
    var i;
    if(act=='exp') {
      for(i=0; i<nodes.length; i++) {
        if(nodes[i] //element exists
          && nodes[i]['r']-nodes[i]['l']>1) {//has children
            if(l && r && !(nodes[i]['l'] >= l && nodes[i]['l'] <= r)) //in requested range
              continue;
            if(!nodes[i]['exp'])
              toggle_node(nodes[i]['id']);
        }
      }
    } else {
      for(i=nodes.length-1; i>=0; i--) {
        if(nodes[i] //element exists
          && nodes[i]['r']-nodes[i]['l']>1) {//has children
          if(l && r && ! (nodes[i]['l'] >= l && nodes[i]['l'] <= r)) //in requested range
            continue;
          if(nodes[i]['exp'])
            toggle_node(nodes[i]['id']);
        }
      }
    }
  }
  function restore_trees() {
    var obj;
    var i;
    var img_obj;
    for(i=0; i<nodes.length; i++) {
      if(nodes[i]) {
        if(img_obj = document.getElementById('img_'+nodes[i]['id'])) {
          if(nodes[i]['exp'])
            img_obj.src = img_obj.src.replace(/p(\d?\.gif)/, "m$1");
          else
            img_obj.src = img_obj.src.replace(/m(\d?\.gif)/, "p$1");
        }
        if(obj = document.getElementById('node_'+nodes[i]['id'])) {
          if(nodes[i]['folded_by']) {
            obj.style.display = 'none';
          }
          else {
            obj.style.display = '';
          }
        }
      }
    }
    //make expand_all and collapse_all links visible...
    if(obj = document.getElementById('toggle_row')) {
      obj.style.display = '';
    }
    i=1
    while(obj = document.getElementById('toggle_row_'+i)) {
      obj.style.display = '';
      i++;
    }
  }
}

function getExpNodes() {
  var tmp;
  var ret = new Array();
  if(tmp=getCookie("expNodes")) {
    if(tmp = tmp.split(",")) {
      for(i=0; i<tmp.length; i++)
        ret[tmp[i]] = 1;
    }
  }
  else
    setCookie("expNodes","");
  return ret;
}

function add_node(id,l,r,parent_id,state) {
  //state is optional and overrides whatever may be stored in expNodes cookie
  var p = parent_id;
  if(!this.i) this.i=0;
  //if(!this.map) this.map=new Array();
  map[id]=i;
  nodes[i] = new Array();
  nodes[i]['id']=id;
  nodes[i]['parent_id']=parent_id;
  nodes[i]['l']=l;
  nodes[i]['r']=r;
  if(state == 'exp') {
    nodes[i]['exp'] = 1;
    nodes[i]['folded_by']=0;
  }
  else if(state == 'col') {
    nodes[i]['exp'] = 0;
    if(nodes[i]['parent_id'])
      nodes[i]['folded_by']=nodes[i]['parent_id'];
  }
  else {
    nodes[i]['exp']=expNodes[id] ? 1 : 0;
    while(p) {
      //recurse through parent ids to see if node needs to be folded...
      if(!expNodes[p]) {
        nodes[i]['folded_by']=p;
        break;
      }
      if(nodes[map[p]])
        p=nodes[map[p]]['parent_id'];
      else
        p=0;
    }
  }
  i++;
}

var map = new Array();
var nodes = new Array();
var expNodes = getExpNodes();

