// Author: Richard Littin, Modified a fair bit by Kurt Gaastra
// $Id: nav.js,v 1.2 2009/03/19 01:30:09 rjk Exp $
// $Revision: 1.2 $

// Generates a navigtion widget from anchor tags.
// Uses anchors whose name is formatted a nav:xxx:yyy, where xxx is a text string and yyy is a number


var nav = /^nav:(.+):([0-9]+)$/;

var names = new Array();
var navs = new Array();
var navis = new Array();

var currentAnchor = 0;

function display(element) {
  element.style.display = "block";
}
function writeNav(content) {
  var navDiv = document.getElementById("nav_div");
  navDiv.innerHTML = navDiv.innerHTML + content;
  display(navDiv);
}

function generateNavigator() {
  var classname;

  var queried = "";
  var unqueried = "";
  var matchResult;
  var foo;

  currentAnchor = 0;

  names = new Array();
  navs = new Array();
  navis = new Array();

  // find navigation anchors
  for (var i = 0; i < document.anchors.length; i++) {
    var a = document.anchors[i];
    var n = a.name;
    var result = n.match(nav);
    if (result != null) {
      var r1 = result[1].toLowerCase();
      if (navs[r1] == null) {
        names[names.length] = r1;
        navs[r1] = new Array();
        navis[r1] = -1;
      }
      navs[r1][navs[r1].length] = i;
    }
    
  }

  // navigator table
  res = "<div class=\"navinner\">";
  res += "<table class=\"navtable\">";
       
  names.sort();

  for (i in names) {
    n = names[i];
    t = document.anchors[navs[n][0]].innerHTML.toLowerCase();
    name = document.anchors[navs[n][0]].name;
    matchResult = name.match(/nav:(.*):\d*/);
    t2 = matchResult[1];
    classname = "" + document.anchors[navs[n][0]].className;
    if (classname.match(/.*querymatch.*/) != null) {
      queried = addNavRow(queried, t2, n);
    } else {
      unqueried = addNavRow(unqueried, t2, n);
    }
    
  }
  if (names.length != 0) {
    navstring = "";
    
    
    if (queried.length > 0 || unqueried.length > 0) {
      //navstring = "<fieldset><legend>Navigation</legend>"
    //navstring = "<h3>Navigation</h3>";
    navstring = "<div class=\"navinner\">";
    navstring += "<table class=\"navtable\">";
      
      if (queried.length > 0) {
        //navstring += "<tr><td colspan=3 class=\"defaultText\"><b>Queries</b></td></tr>";
        navstring += queried;
      }
      if (unqueried.length > 0) {
        //navstring += "<tr><td colspan=3 class=\"defaultText\"><b>Compounds</b></td></tr>";
        navstring += unqueried;
      }
      
    }
    
    navstring += "<\/table>";
    navstring += "<\/div>";
    //navstring +="</fieldset>"
    
    writeNav(navstring);
  }
}

function addNavRow(res, title, n) {
  var cleanN = n.replace(/\s*/g,"_");
	
	var cleanT = idUnclean(n);
  cleanT = cleanT.replace(/_/g," ");
  cleanT = cleanT.replace(/<wbr>/,"");
    
    res += "<tr>";
    res += "<td class=\"navtable\">";
    if (navs[n].length > 1) {
      res += "<button style=\"cursor:pointer;\" onClick=\"highlightButton('" + cleanN +"'); prevAnchor('" + n + "'); return true\">&lt;<\/button>"
    }
    res += "<\/td>";
    res += "<td class=\"navtable\"><button class=\"word button_" + cleanN + "\" style=\"cursor:pointer;\" onClick=\"highlightButton('" + cleanN +"');firstAnchor('" + n + "'); return true\" title=\"\" onmouseover=\"doTooltip(event,'','" + cleanT + "')\" onmouseout=\"hideTip()\">" + cleanT + "<\/button><\/td>";
    res += "<td class=\"navtable\">";
    if (navs[n].length > 1) {
      res += "<button style=\"cursor:pointer;\" onClick=\"highlightButton('" + cleanN + "');nextAnchor('" + n + "'); return true\">&gt;<\/button>";
    }
    res += "<\/td>";
    res += "<\/tr>";
    return res;
}

var bgcolor="transparent";
var hilightcolor="#ffff00";

function updateHighlight(newindex) {
  var name = "" + document.anchors[currentAnchor].name;
  var matches = name.match(/^nav:(.*):(\d*)$/);
  if (matches) {
    var cleanName = matches[1].replace(/\s+/, "_");
    //cleanName = matches[1].replace(/<wbr>/g, "&lt;wbr&gt;");
    removeHighlightClass(cleanName + "_" + matches[2]);
  }
  name = "" + document.anchors[newindex].name;
  //document.getElementsByName(name)[0].className);
  matches = name.match(/^nav:(.*):(\d*)$/);
 	
  var cleanName = matches[1].replace(/\s+/, "_");
  //cleanName = cleanName.replace(/<wbr>/g, "&lt;wbr&gt;");
  
  addHighlightClass(cleanName + "_" + matches[2]);

  window.scrollTo(0, getPosition(document.anchors[newindex]) - 50);

  /*if(window.scrollByLines) {
    window.scrollByLines(-2);
  } else {
    window.scrollBy(0, -50);
  }
  */
  currentAnchor = newindex;
}
function getPosition(element) {
  var position = element.offsetTop;
  var obj = element.offsetParent;
  while (obj) {
    position += obj.offsetTop;
    obj = obj.offsetParent;
  }
  return position;
  
}
    
function removeHighlightClass(className){
  var spans = getElementsByClassName(document, "span", className);
  for (var i = 0; i < spans.length; i++) {
    removeHighlight(spans[i]);
  }
}
function addHighlightClass(className){
  var spans = getElementsByClassName(document, "span", className);
  for (var i = 0; i < spans.length; i++) {
    addHightlight(spans[i]);
  }
}

function addHightlight(element) {
  var classString = "" + element.className
  if (classString.indexOf("highlight") == -1) {
    element.className = classString + " highlight";
  }
}

function highlightButton(button) {
  var b = getElementsByClassName(document.getElementById("nav_div"), "button", "word");
  for (var i = 0; i < b.length; i++) {
    removeHighlight(b[i]);
  }
  b = getElementsByClassName(document.getElementById("nav_div"), "button", "button_" + button);
  for (var i = 0; i < b.length; i++) {
    addHightlight(b[i]);
  }
}

function removeHighlight(element) {
  var pattern = /\s*highlight\s*/
  var classString = "" + element.className
  element.className = classString.replace(pattern, " ");
}


function firstAnchor(tag) {
  navis[tag] = 0;
  updateHighlight(navs[tag][0]);
}
function nextAnchor(tag) {
  i = navis[tag];
  i++;
  max = navs[tag].length;
  if (i >= max) {
    i = max - 1;
  }
  navis[tag] = i;
  updateHighlight(navs[tag][i]);
}
function prevAnchor(tag) {
  i = navis[tag];
  i--;
  if (i < 0) {
    i = 0;
  }
  navis[tag] = i;
  updateHighlight(navs[tag][i]);
}
function lastAnchor(tag) {
  last = navs[tag].length - 1;
  navis[tag] = last;
  updateHighlight(navs[tag][last]);
}

var ns = (navigator.appName.indexOf("Netscape") != -1);
function JSFX_FloatDiv(id, sx, sy) {
  var d = document;
  var px = document.layers ? "" : "px";

  var el = d.getElementById ? d.getElementById(id) : d.all ? d.all[id] : d.layers[id];
  window[id + "_obj"] = el;
  if (d.layers) el.style = el;
  el.cx = el.sx = sx; el.cy = el.sy = sy;
  el.sP = function(x,y) { this.style.left = x + px; this.style.top = y + px; }; 
  el.flt = function() {
    var pX, pY;
    pX = (this.sx >= 0) ? 0 : ns ? innerWidth : 
      document.documentElement && document.documentElement.clientWidth ? 
      document.documentElement.clientWidth : document.body.clientWidth;
    pY = ns ? pageYOffset : document.documentElement && document.documentElement.scrollTop ? 
      document.documentElement.scrollTop : document.body.scrollTop;
    //alert(pX + "," + pY);
    if(this.sy < 0) {
      pY += ns ? innerHeight : document.documentElement && document.documentElement.clientHeight ? 
        document.documentElement.clientHeight : document.body.clientHeight;
    }
    this.cx += (pX + this.sx - this.cx)/2;
    this.cy += (pY + this.sy - this.cy)/2;
    this.sP(this.cx, this.cy);

    setTimeout(this.id + "_obj.flt()", 30);
  };
  return el;
}

window.onunload = function() {
}

function getElementsByClassName(oElm, strTagName, strClassName){
  var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
  var arrReturnElements = new Array();
  strClassName = strClassName.replace(/\-/g, "\\-");
  strClassName = strClassName.replace(/\(/g, "\\(");
  strClassName = strClassName.replace(/\)/g, "\\)");
  strClassName = strClassName.replace(/\]/g, "\\]");
  strClassName = strClassName.replace(/\[/g, "\\[");
  var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
  var oElement;
  for(var i=0; i<arrElements.length; i++){
    oElement = arrElements[i];      
    if(oRegExp.test(oElement.className)){
      arrReturnElements.push(oElement);
    }   
  }
  return (arrReturnElements)
}

//put back in the characters removed in the idClean function in patent_inc.php
function idUnclean(id) {
	var str = id.replace(/cleaned/,"");
  var x = str.match(/__[0-9]+__/g);
  if (x != null) {
	  for (var i = 0; i < x.length; i++) {
	  	var y = x[i].match(/[0-9]+/);
	  	var r = String.fromCharCode(y);
	  	var z = "__" + y + "__";
	  	str = str.replace(z,r); 
	  }
  }
  
  return str;
}
