glossary = window.glossary || {};
glossary.ROOT_ID = 'content-body';
glossary.ITEM_TAG = 'em';
glossary.ITEM_CLASS = 'glossary-item';
glossary.OMIT_CLASS = 'no-glossary';
glossary.OMIT_TAGS = /^(a|sup)$/i;
glossary.OVER_DELAY = 1000;
glossary.PANEL_ID = 'glossary-panel';
glossary.PANEL_WIDTH = '325px';
glossary.PANEL_HEAD = 'ResearchHERPathways.com Glossary';
glossary.PANEL_BODY = '<dl><dt>Loading&#8230;<dt><dl>';
glossary.ERROR_BODY = '<dl><dt class="error">An error occurred</dt><dd><p>Please try again later.</p></dd></dl>';
glossary.BUTTONS = {
    on: { active: 'glossary-on-active', inactive: 'glossary-on-inactive' },
    off: { active: 'glossary-off-active', inactive: 'glossary-off-inactive' } };
glossary.panel = null;
glossary.transport = null;
glossary.cache = {};
glossary.target = null;
glossary.timeout = null;
glossary.init = function() { if (1 == getCookie('glossary')) glossary.enable(); };
glossary.enable = function() {
    var g = glossary;
    var root = document.getElementById(g.ROOT_ID);
    var nodes = getMatchingTextNodes(root, g.REGEX);
    if (g.enabled || !g.REGEX || !g.URL || !root || !nodes)
        return;
    for (var i = nodes.length; i--; ) {
        var node = nodes[i][0];
        var match = nodes[i][1];
        var text = match[0];
        var parent = node.parentNode;
        if (parent.className == g.OMIT_CLASS || parent.tagName.match(g.OMIT_TAGS))
            continue;
        var el = document.createElement(g.ITEM_TAG);
        el.setAttribute('id', 'glossary-item-' + i);
        el.className = g.ITEM_CLASS;
        addEvent(el, 'click', g.lookup);
        addEvent(el, 'mouseover', g.mouseover);
        addEvent(el, 'mouseout', g.mouseout);
        el.appendChild(document.createTextNode(text));
        textnode = node.splitText(match.index);
        textnode.replaceData(0, text.length, '');
        textnode.parentNode.insertBefore(el, textnode);
    }
    var panelcfg = {
        close: true,
        constraintoviewport: true,
        draggable: true,
        underlay: 'none',
        visible: false,
        width: g.PANEL_WIDTH
    };
    g.panel = new YAHOO.widget.Panel(g.PANEL_ID, panelcfg);
    g.panel.setHeader(g.PANEL_HEAD);
    g.panel.render(root);
    g.enabled = true;
    g.syncButtons(g.enabled);
    setCookie('glossary', 1, 365, '/');
};
glossary.disable = function() {
    var g = glossary;
    if (!g.enabled)
        return;
    var root = document.getElementById(g.ROOT_ID);
    var els = root.getElementsByTagName(g.ITEM_TAG);
    for (var i = els.length; i--; ) {
        var el = els[i];
        if (hasClass(el, g.ITEM_CLASS)) {
            var textnode = el.firstChild.cloneNode(true);
            var parent = el.parentNode;
            parent.replaceChild(textnode, el);
            /*@cc_on continue; @*/ // IE crashes on normalize()
            parent.normalize();
        }
    }
    g.panel.destroy();
    g.panel = null;
    g.enabled = false;
    g.syncButtons(g.enabled);
    setCookie('glossary', 0, 365, '/');
};
glossary.mouseover = function(e) {
    var g = glossary;
    g.mouseout();
    g.target = getTarget(e);
    g.timeout = setTimeout('glossary.lookup(null, glossary.target)', g.OVER_DELAY);
};
glossary.mouseout = function() { clearTimeout(glossary.timeout); };
glossary.lookup = function(e, target) {
    var g = glossary;
    g.mouseout();
    var target = target || getTarget(e);
    if (target.nodeType == 3)
        target = target.parentNode;
    var term = target.firstChild.data.toLowerCase();
    var def = g.cache[term];
    if (def) {
        g.panel.setBody(def);
    } else {
        g.panel.setBody(g.PANEL_BODY);
        try {
            g.transport = getTransport();
            try { g.transport.overrideMimeType('text/xml'); } catch (ex) {}
            g.transport.open('GET', g.URL + urlencode(term));
            g.transport.onreadystatechange = g.update;
            g.transport.send(null);
        } catch (ex) {
            g.panel.setBody(g.ERROR_BODY);
        }
    }
    g.panel.cfg.setProperty('context', [target.getAttribute('id'), 'tl', 'bl']);
    g.panel.show();
    g.panel.render();
};
glossary.update = function() {
    var g = glossary;
    if (g.transport.readyState != 4)
        return;
    if (g.transport.status < 200 || g.transport.status > 307) {
        g.panel.setBody(g.ERROR_BODY);
        return;
    }
    g.panel.setBody(g.transport.responseText);
    g.panel.align('tl', 'bl');
    // update cache
    var dts = g.transport.responseXML.getElementsByTagName('dt');
    for (var i = 0; i < dts.length; i++) {
        var dt = dts[i];
        var term = dt.firstChild.data.trim().toLowerCase();
        var def = g.transport.responseText;
        g.cache[term] = def;
    }
};
glossary.syncButtons = function(enabled) {
  var control = document.getElementById("glossary-control");
  var c1, c2;

  if(control) {
    for(var i=0; i<control.childNodes.length; i++) {
      if(control.childNodes[i].innerHTML) {
        if(control.childNodes[i].innerHTML.toLowerCase() == "on") {
          c1 = control.childNodes[i];
        }
        if(control.childNodes[i].innerHTML.toLowerCase() == "off") {
          c2 = control.childNodes[i];
        }
      }
    }

    if(enabled) {
      c1.className = "highlight";
      c2.className = "";
    } else {
      c1.className = "";
      c2.className = "highlight";
    }
  }

/* DEPRECATED
    var buttons = glossary.BUTTONS;
    if (enabled) {
        $(buttons.on.active).style.display = 'inline';
        $(buttons.on.inactive).style.display = 'none';
        $(buttons.off.active).style.display = 'none';
        $(buttons.off.inactive).style.display = 'inline';
    } else {
        $(buttons.on.active).style.display = 'none';
        $(buttons.on.inactive).style.display = 'inline';
        $(buttons.off.active).style.display = 'inline';
        $(buttons.off.inactive).style.display = 'none';
    }
    function $(id) { return document.getElementById(id); }
*/
};
addEvent(window, 'load', glossary.init);
