function Highlighter(link_set_id, class_name) {
  this.link_set_id = link_set_id;
  this.class_name = (class_name) ? class_name : "highlighter";
  this.curr_elm = null;

  if (typeof Highlighter._initialized == "undefined") {

    Highlighter.prototype.init = function () {
      var mySet = document.getElementById(this.link_set_id);
      var myLinks = mySet.getElementsByTagName('a');

      for (i=0;i<myLinks.length;i++) {
        myLinks[i].pageObj = this;
        addEvent(myLinks[i], 'click', this.addHighlight, false);
      }
    }

    Highlighter.prototype.addHighlight = function (e) {
      var el = null;
      el = getTarget(e);

      if (!el) {
        return;
      }
      var pageObj = (this.pageObj) ? this.pageObj: el.pageObj;

      if (pageObj.curr_elm) {
        pageObj.removeHighlight(null,el);
      }

      if (el.href) {
        var pos = el.href.lastIndexOf('#');
        if (pos) {
          var elm_id = el.href.substr(pos+1);
          var myElm = document.getElementById(elm_id);
          var top_link = pageObj.createTopLink();
          top_link.pageObj = pageObj;
          addEvent(top_link, 'click', pageObj.removeHighlight, false);
          myElm.appendChild(top_link);
          changeClass(elm_id, pageObj.class_name);
          pageObj.curr_elm = elm_id;
        }
      }
    }

    Highlighter.prototype.createTopLink = function () {
      // create the top link
      var top_link = document.createElement('p');
      top_link.className = "highlighter_topLink";
      var myLink = document.createElement('a');
      myLink.href = "#top";
      var myText = document.createTextNode("top");
      myLink.appendChild(myText);
      top_link.appendChild(myLink);
      return top_link;
    }


    Highlighter.prototype.removeHighlight = function (e,elmt) {
      var el = null;
      var pageObj = null;
      if (elmt) {
        el = elmt;
        if (!el) {
          return;
        }

        pageObj = (this.pageObj) ? this.pageObj: el.pageObj;
        var curr_elm = document.getElementById(pageObj.curr_elm);
        var top_link = getChildByClass(curr_elm,"highlighter_topLink");
        if (top_link && top_link.parentNode) {
          top_link.parentNode.removeChild(top_link);
        }
      } else {
        el = getTarget(e);
        if (!el) {
          return;
        }

        if (el.nodeName != "p") {
          el = ascendDOM(el,"p");
        }

        if (!el) {
          return;
        }

        pageObj = (this.pageObj) ? this.pageObj: el.pageObj;
        if (el.parentNode) {
          el.parentNode.removeChild(el);
        }
      }

      if (!el) {
        return;
      }

      if (pageObj && pageObj.curr_elm) {
        changeClass(pageObj.curr_elm, 'none');

      }
    }

    Highlighter._initialized = true;
  }
}

//var hl = new Highlighter("faq_links");

function initHighlighter() {
  hl.initHL();
}


