function show(id){
  if (browserNavi){
    var style = document.getElementById(id).style;
    if (style.display == 'block')
      style.display = 'none';
    else {
      style.display = 'block';
      if (id.indexOf('prot') == 0) appendList(id);
    }
  }
}
function swap(imgId){
  if (browserNavi){
    var img = document.getElementById(imgId);
    if (img.src.indexOf('Down') > -1)
      img.src = img.src.replace('Down', 'Right');
    else if (img.src.indexOf('minus') > -1){
      img.src = img.src.replace('min', 'pl');
      setBorder('prot'+imgId.substr(6), false);
    }
    else if (img.src.indexOf('plus') > -1){
      img.src = img.src.replace('pl', 'min');
      setBorder('prot'+imgId.substr(6), true);
    }
    else if(img.src.indexOf('Right') > -1)
      img.src = img.src.replace('Right', 'Down');
  }
}
function alig(trigger){
  show('alig' + trigger.id.substr(8));
  swap(trigger.id);
}
function branch(trigger){
  show('branch' + trigger.id.substr(6));
  swap(trigger.id);
}
function prot(trigger){
  show('prot' + trigger.id.substr(8));
  swap(trigger.id);
}
function setBorder(id, show){
  var proteinlist = document.getElementById(id);
  if (proteinlist){
    if (show) proteinlist.style.borderLeftColor = 'black';
    else proteinlist.style.borderLeftColor = 'white';
  }
}
function collapseAlignments(){
  if (browserNavi){
    var elem = document.getElementsByTagName('pre');
    for (var i = 0; i < elem.length; i++){
      if (elem[i].id.indexOf('alig') == 0 
          && document.getElementById('triangle' + elem[i].id.substr(4)).src.indexOf('Down') > -1){
        swap('triangle' + elem[i].id.substr(4));
        show(elem[i].id);
      }
    }
  }
}
function expandAlignments(){
  if (browserNavi){
    var elem = document.getElementsByTagName('pre');
    for (var i = 0; i < elem.length; i++){
      if (elem[i].id.indexOf('alig') == 0 
          && document.getElementById('triangle' + elem[i].id.substr(4)).src.indexOf('Right') > -1){
        swap('triangle' + elem[i].id.substr(4));
        show(elem[i].id);
      }
    }
  }
}
function switchBranches(state){
  if (browserNavi){
    var elem = document.getElementById(rootNodeId).getElementsByTagName('img');
    for (var i = 0; i < elem.length; i++){
      if (elem[i].src.indexOf(state) > -1){
        elem[i].onclick();
      }
    }
  }
}
function switchLists(state){
  if (browserNavi){
    var elem = document.getElementById(rootNodeId).getElementsByTagName('img');
    for (var i = 0; i < elem.length; i++){
      if (elem[i].parentNode.id.indexOf('head') == 0 && elem[i].src.indexOf(state) > -1){
        elem[i].onclick();
      }
    }
  }
}
function appendList(id){
  if (browserDyna && !(document.getElementById(id).getElementsByTagName('div')[0].hasChildNodes())){
    var proteinList = document.getElementById(id);
    for (var i = 0; i < proteinList.childNodes.length; i++){
      if (proteinList.childNodes[i].id){
        var proteinId = proteinList.childNodes[i].id;
        var leafProtein = document.getElementById('prco' + proteinId.substr(proteinId.indexOf('_')));
        var clone = cloneElem(leafProtein, id, true);
        clone.className = '';
        clone.id = '';
        proteinList.childNodes[i].appendChild(clone);
      }
    }
  }
}
function cloneElem(elem, idAppendix, withChildren){
  var clone = elem.cloneNode(withChildren);
  makeIdsUnique(clone, idAppendix);
  return clone;
}
function makeIdsUnique(element, idAppendix){
  if (element.id){
    element.id = element.id.concat('_' + idAppendix);
  }
  if (element.hasChildNodes()){
    for (var i = 0; i < element.childNodes.length; i++){
      if (element.childNodes[i].nodeType == 1) makeIdsUnique(element.childNodes[i], idAppendix);
    }
  }
}
function createPreview(branchId, previewId, isNextLevel){
  var orig = document.getElementById(branchId);
  var elem = cloneElem(orig, previewId, false);
  elem.style.display = 'block';
  elem.className = 'prBranch';
  for (var i = 0; i < orig.childNodes.length; i++){
    if (orig.childNodes[i].id && orig.childNodes[i].id.indexOf('prot') < 0){
      var origChild = orig.childNodes[i];
      var clonedChild = cloneElem(origChild, previewId, false);
      elem.appendChild(clonedChild);
      var clonedHead = cloneElem(document.getElementById('head' + origChild.id.substr(4)), previewId, true);
      if (isNextLevel) clonedHead.className = 'prNext';
      var images = clonedHead.getElementsByTagName('img');
      for (k = 0; k < images.length; k++){
        images[k].className = '';
        if (images[k].src.indexOf('usBottom.gif') > -1) images[k].src = 'http://webclu.bio.wzw.tum.de/TTSS/images/simap/circBottom.gif';
        else if (images[k].src.indexOf('us.gif') > -1) images[k].src = 'http://webclu.bio.wzw.tum.de/TTSS/images/simap/circ.gif';
        else if (images[k].src.indexOf('Down') > -1) images[k].src = 'http://webclu.bio.wzw.tum.de/TTSS/images/simap/triangleRight.gif';
      }
      clonedChild.appendChild(clonedHead);
      if (clonedChild.id.indexOf('node') == 0)
        clonedChild.appendChild(createPreview('branch' + origChild.id.substr(4), previewId));
    }
  }
  return elem;
}
function createPreviewContainer(branchId){
  var previewId = 'preview' + branchId.substr(6);
  var elem = createPreview(branchId, previewId, true);
  elem.className = 'pr';
  var preview = document.createElement('div');
  preview.setAttribute('id', previewId);
  var inner = document.createElement('div');
  inner.className = 'prNext';
  var pretext = document.createElement('div');
  pretext.appendChild(document.createTextNode('preview'));
  pretext.className = 'prText';
  inner.appendChild(pretext);
  inner.appendChild(elem);
  preview.appendChild(inner);
  document.getElementById('invisible').appendChild(preview);
}
function flyOut(branchId){
  if (browserDyna && document.getElementById('navico' + branchId.substr(6)).src.indexOf('plus') > -1){
    var previewId = 'preview' + branchId.substr(6);
    var alignId = 'head' + branchId.substr(6);
    if (!(document.getElementById(previewId))) createPreviewContainer(branchId);
    return coolTip(USECONTENTS,previewId,ANCHOR,alignId,ANCHORALIGN,'LL','UL');
  }
}
function showDefaultLevel(nodeId, remainingLevels){
  if (remainingLevels){
    document.getElementById('navico' + nodeId.substr(4)).onclick();
    var children = document.getElementById('branch' + nodeId.substr(4)).childNodes;
    for (var i = 0; i < children.length; i++){
      var id = children[i].id;
      if (id && id.indexOf('node') == 0)
        showDefaultLevel(id, remainingLevels - 1);
    }
  }
}
function isVisible(elem){
  if (elem.style.display == 'block') return true;
  else return false;
}
function selectAllVisible(){
  if (browserNavi){
    var checks = document.getElementsByName('hit');
    for (var i = 0; i < checks.length && checks[0].parentNode; i++){
      var proteinList = checks[i].parentNode.parentNode;
      if (proteinList.id.indexOf('prco') == 0) proteinList = proteinList.parentNode;
      var branch = proteinList.parentNode.parentNode;
      var checkIsVisible = isVisible(proteinList) && isVisible(branch);
      while (checkIsVisible && branch.parentNode.parentNode.id){
        branch = branch.parentNode.parentNode;
        checkIsVisible = checkIsVisible && isVisible(branch);
      }
      checks[i].checked = checkIsVisible;
    }
  }
}
function overTest(obj){
  obj.src='http://webclu.bio.wzw.tum.de/TTSS/images/simap/hourglass.gif';
  setTimeout("document.getElementById('img1').src='http://webclu.bio.wzw.tum.de/TTSS/images/simap/triangleRight.gif';", 400);
  for (var i = 0; i < 999999; i++) u = 'abc' + i + 5;
  //obj.src='img/triangleRight.gif';
  alert('afterwards');
  var start = new Date();
  var millis = (new Date()).getTime() - start.getTime();
  alert('time: ' + millis);
}
function choose(checkbox){
  if (browserDyna){
    var node = checkbox.parentNode.parentNode;
    var willBeAdded = checkbox.checked;
    taxons_include = document.getElementsByName('taxons_include')[0];
    taxons_exclude = document.getElementsByName('taxons_exclude')[0];
    if (taxons_include.value.length) taxons_include.value = '_' + taxons_include.value + '_';
    else taxons_include.value = '_';
    if (taxons_exclude.value.length) taxons_exclude.value = '_' + taxons_exclude.value + '_';
    else taxons_exclude.value = '_';
    clearNode(node, willBeAdded);
    if (inheritsWrong(node, willBeAdded)){
      if (willBeAdded){
        node.style.backgroundColor = '#99ff99';
        taxons_include.value = taxons_include.value + node.id.substr(4) + '_';
      }
      else{
        node.style.backgroundColor = '#ebebeb';
        if (node.id != rootNodeId) taxons_exclude.value = taxons_exclude.value + node.id.substr(4) + '_';
      }
    }
    taxons_include.value = taxons_include.value.substr(1, taxons_include.value.length - 2);
    taxons_exclude.value = taxons_exclude.value.substr(1, taxons_exclude.value.length - 2);
  }
}
/*function olDclearNode(node, willBeAdded){
  if (node.style) node.style.backgroundColor = '';
  var str = '_' + node.id.substr(4) + '_';
  var checkbox = document.getElementById('choose' + node.id.substr(4));
  checkbox.checked = willBeAdded;
  if (taxons_include.value.indexOf(str) > -1){
    taxons_include.value = taxons_include.value.substring(0, taxons_include.value.indexOf(str) + 1) + 
      taxons_include.value.substr(taxons_include.value.indexOf(str) + str.length);
  }
  if (taxons_exclude.value.indexOf(str) > -1){
    taxons_exclude.value = taxons_exclude.value.substring(0, taxons_exclude.value.indexOf(str) + 1) + 
      taxons_exclude.value.substr(taxons_exclude.value.indexOf(str) + str.length);
  }
  var branch = document.getElementById('branch' + node.id.substr(4));
  if (branch){
    for (var i = 0; i < branch.childNodes.length; i++)
      if (branch.childNodes[i].id) clearNode(branch.childNodes[i], willBeAdded);
  }
}*/
function clearNode(node, willBeAdded){
  clearDetails(node, willBeAdded);
  var branch = document.getElementById('branch' + node.id.substr(4));
  if (branch){
    var checkboxes = branch.getElementsByTagName('input');
    if (checkboxes){
      for (var i = 0; i < checkboxes.length; i++){
        checkboxes[i].checked = willBeAdded;
        var str = '_' + checkboxes[i].id.substr(6) + '_';
        if (taxons_include.value.indexOf(str) > -1 || taxons_exclude.value.indexOf(str) > -1)
          clearDetails(checkboxes[i].parentNode.parentNode, willBeAdded);
      }
    }
  }
}
function clearDetails(node, willBeAdded){
  if (node.style) node.style.backgroundColor = '';
  var str = '_' + node.id.substr(4) + '_';
  var checkbox = document.getElementById('choose' + node.id.substr(4));
  checkbox.checked = willBeAdded;
  if (taxons_include.value.indexOf(str) > -1){
    taxons_include.value = taxons_include.value.substring(0, taxons_include.value.indexOf(str) + 1) + 
      taxons_include.value.substr(taxons_include.value.indexOf(str) + str.length);
  }
  if (taxons_exclude.value.indexOf(str) > -1){
    taxons_exclude.value = taxons_exclude.value.substring(0, taxons_exclude.value.indexOf(str) + 1) + 
      taxons_exclude.value.substr(taxons_exclude.value.indexOf(str) + str.length);
  }
}
function inheritsWrong(node, willBeAdded){
  if (node.id != rootNodeId){
    var parentTaxon = node.parentNode.parentNode;
    var checkbox = document.getElementById('choose' + parentTaxon.id.substr(4));
    if (checkbox.checked) return !willBeAdded;
    else return willBeAdded;
  }
  else return true;
}
function chooseAgain(){
  if (browserDyna){
    var includedTaxons = new Array();
    taxonsToArray(includedTaxons, initTaxons_include + '_');
    var excludedTaxons = new Array();
    taxonsToArray(excludedTaxons, initTaxons_exclude + '_');
    if (!arrayContainsTaxon(includedTaxons, rootNodeId)){
      var rootCheckbox = document.getElementById('choose' + rootNodeId.substr(4));
      rootCheckbox.checked = false;
      choose(rootCheckbox);
    }
    traverseTree(document.getElementById(rootNodeId), includedTaxons, excludedTaxons);
  }
}
function traverseTree(node, includedTaxons, excludedTaxons){
  var id = node.id.substr(4);
  if (includedTaxons.length && arrayContainsTaxon(includedTaxons, id)){
    var checkbox = document.getElementById('choose' + id);
    if (!checkbox.checked){
      checkbox.checked = true;
      choose(checkbox);
    }
  }
  if (excludedTaxons.length && arrayContainsTaxon(excludedTaxons, id)){
    var checkbox = document.getElementById('choose' + id);
    if (checkbox.checked){
      checkbox.checked = false;
      choose(checkbox);
    }
  }
  var branch = document.getElementById('branch' + id);
  if (branch){
    for (var i = 0; i < branch.childNodes.length; i++)
      if (branch.childNodes[i].id && (includedTaxons.length > 0 || excludedTaxons.length > 0)) 
        traverseTree(branch.childNodes[i], includedTaxons, excludedTaxons);
  }
}
function taxonsToArray(taxonsArray, taxonsString){
  if (taxonsString){
    var currentTaxon = taxonsString.substring(0, taxonsString.indexOf('_'));
    var remainingTaxons = taxonsString.substr(taxonsString.indexOf('_') + 1);
    taxonsArray[taxonsArray.length] = currentTaxon;
    taxonsToArray(taxonsArray, remainingTaxons);
  }
}
function arrayContainsTaxon(array, taxon){
  for (var i = 0; i < array.length; i++){
    if (array[i] == taxon){
      removeFromArray(array, i);
      return true;
    }
  }
  return false;
}
function removeFromArray(array, index){
  var last = array.length - 1;
  var tmp = array[last];
  array[last] = array[index];
  array[index] = tmp;
  array.length = last;
}
function createLink(href, text){
  return '<a href="' + href + '">' + text + '</a>';
}
function init(){
  if (browserNavi){
    var root = document.getElementById(rootNodeId);
    var images = root.getElementsByTagName('img');
    for (var i = 0; i < images.length; i++){
      if (images[i].id) swap(images[i].id);
    }
    showDefaultLevel(rootNodeId, nLevelsDefault);
    var elem = document.getElementById('quickNavi');
    if (elem) elem.style.display = 'block';
    else elem = root;
    browserDyna = elem.appendChild && elem.cloneNode && document.createElement && elem.setAttribute;
    if (document.getElementById('choose' + rootNodeId.substr(4))){
      document.getElementsByName('taxons_include')[0].value = rootNodeId.substr(4);
      document.getElementsByName('taxons_exclude')[0].value = '';
      var checkboxes = root.getElementsByTagName('input');
      for (var i = 0; i < checkboxes.length; i++) checkboxes[i].checked = true;
      if (initTaxons_include || initTaxons_exclude){
        chooseAgain();
      }
    }
  }
}
