function removeDefinition(link) {
  var gp = link.parentNode.parentNode;
  if(gp.lastChild.flag) {
    gp.removeChild(gp.lastChild);
  }
  return true;
}

function createDefinition(link) {
  nodeId = link.href.split('#');
  if (nodeId.length <= 1) {
    return false;
  }
  var node = document.getElementById(nodeId[1]);
  var nodeDDs = node.getElementsByTagName('dd');
  var nodeDL = document.createElement('dl');

  for (var i=0; i < nodeDDs.length; i++) {
    var dd = nodeDDs.item(i);
    nodeDL.appendChild(dd.cloneNode(true));
  }

  var span = document.createElement("span");
  span.className = "lensinfo hiddenStructure";
  span.appendChild(nodeDL);

  link.parentNode.parentNode.appendChild(span);
  span.flag = true;
  return false;
}

function addGlossaryToolTip(link) {
  var hrefparts;
  var linkTargetId;
  var bGotTargetId;
  var nodeDL;
  var nodeDDs;
  var strDLHtml;
  var nodeDD;

  hrefparts = link.href.split('#');
  bGotTargetId = ( hrefparts.length > 1 );
  if ( !bGotTargetId ) {
    return false;
  }

  linkTargetId = hrefparts[1];
  nodeDL = document.getElementById(linkTargetId);
  if ( nodeDL && nodeDL.nodeName.toLowerCase() == 'dl' ) {
    nodeDDs = nodeDL.getElementsByTagName('dd');

    if ( nodeDDs && nodeDDs.length > 0 ) {
      strDLHtml = "<dl>";

      for (var i=0; i < nodeDDs.length; i++) {
        nodeDD = nodeDDs.item(i);
        if ( nodeDD ) {
          strDLHtml = strDLHtml + "<dd>" + nodeDD.innerHTML + "</dd>";
        }
      }

      strDLHtml = strDLHtml + "</dl>";

      if (link.setAttributeNS) { link.setAttributeNS("ext", "qtip", strDLHtml); }
      else                     { link.setAttribute  ("ext:qtip",    strDLHtml); }
    }
  }

  return false;
}

var switchLenses = function(){
    var lens_switch = Ext.get('cnx_switch_inner').dom;
    var selval = lens_switch.value;
    var all = lens_switch.getElementsByTagName('option');  //childNodes;
    var len = all.length;
    for (var x = 0; x <= len; x++) {
        var elt = all[x];
        if (elt) {
            var eltval = elt.value;
            var frm = Ext.get(eltval).dom;
            if (eltval == selval) {
                frm.style.display = 'block';
            } else {
                frm.style.display = 'none';
            }
        }
    }
}

var afterLoad = function(oElement, bSuccess, oResponse){
    // unhide lens select button
    var switcher = Ext.get('cnx_lens_switch')
    if (switcher) {
        switcher.dom.style.display = 'block';

        switchLenses();

        var lens_switch = Ext.get('cnx_switch_inner');
        lens_switch.on('change', switchLenses);
    }

    // if login form, set came_from field intelligently
    var login = Ext.get('portlet-login');
    if (login) {
        // hack to get dialog relaunched; see other globalTarget uses
        var whichdialog = "unknown";
        if (globalTarget) {
            whichdialog = globalTarget.id;
        }

        var came_from = login.child('input[name=came_from]');
        var baseurl = document.URL;
        came_from.dom.value = baseurl + "#login=" + whichdialog;
    }

    LensAdd.resize();
}

var globalTarget;   // for setting came_from; see in afterLoad above. hack: won't be necessary forever.

// create the lens addition popup application (single instance)
var LensAdd = function(){
    // everything in this space is private and only accessible in the HelloWorld block

    // define some private variables
    var targetelt, dialog, showBtn, dialogUpdater, defaultTitle;
    var contentId, version, urlbase, innerform = "", title;

    var dialogheight = 300;
    var dialogwidth = 500;

    // return a public interface
    return {
        init : function(){
             Ext.select('a.cnx_lens_trigger_link', true).on('click', this.showEvent, this, {stopEvent : true});

/*             submitBtn = Ext.get('cnx_lens_simple_submit');
             submitBtn.on('click', this.submitForm, this, {stopEvent : true});*/

            // hack to relaunch dialog after login; see also globalTarget
            var preceededby = "#login=";
            var fragment = document.URL.match(preceededby+".*");
            if (fragment && fragment.length==1) {
                var fragid = fragment[0].slice(preceededby.length, fragment[0].length);
                if (fragid) {
                    var trigger = Ext.get(fragid);
                    if (trigger) {
                        this.showDialog(trigger);
                    }
                } else {
                    alert("You are now logged in. Please click 'A lens' or 'My Favorites' again to continue.");
                }
            }
        },

        showEvent : function(event){
            var eventTarget = event.getTarget();
            this.showDialog(eventTarget);
        },

        showDialog : function(eventTarget){
            var elt;
            var difftarget = targetelt != eventTarget;
            targetelt = eventTarget;
            globalTarget = targetelt;
            showBtn = Ext.get(eventTarget);

            if (!contentId || difftarget) {
                contentId = showBtn.child('input.cnx_lens_contentId').dom.value;
            }
            if (!version || difftarget) {
                version = showBtn.child('input.cnx_lens_version').dom.value;
            }
            if (!urlbase || difftarget) {
                elt = showBtn.child('input.cnx_lens_urlbase');
                if (elt) {
                    urlbase = elt.dom.value + '/';
                } else {
                    urlbase = "";
                }
            }
            if (!innerform || difftarget) {
                elt = showBtn.child('input.cnx_lens_innerform');
                if (elt) {
                    innerform = elt.dom.value;
                } else {
                    innerform = "lens_add_inner";
                }
            }

            if (!dialog) { // lazy initialize the dialog and only create it once
                dialog = new Ext.BasicDialog("cnx_lens_popup", {
                        autoTabs:false,
                        closable:true,
                        collapsible:false,
                        width:dialogwidth,
                        height:dialogheight,
                        shadow:true,
                        minWidth:300,
                        minHeight:250,
                        proxyDrag: true
                });
                dialog.addKeyListener(27, dialog.hide, dialog);
                //dialog.addButton('Add this Content', dialog.hide, dialog).disable();
                //dialog.addButton('Close', dialog.hide, dialog);
                defaultTitle = dialog.header.dom.innerHTML;
            }

            if (!dialogUpdater || difftarget) {
                dialogUpdater = Ext.get('cnx_lens_inner').getUpdateManager();
                dialogUpdater.update({url:urlbase+innerform,
                                      callback:afterLoad,
                                      params: {contentId: contentId, version: version}
                                     });
            }

            elt = showBtn.child('input.cnx_lens_title');
            if (elt) {
                title = elt.dom.value;
                dialog.setTitle(title);
            }
            else {
                // use the default dlg title
                title = defaultTitle;
                dialog.setTitle(title);
            }

            dialog.show(showBtn.dom);
        },

//         submitForm : function(){
//             dialogUpdater = Ext.get('cnx_lens_results').getUpdateManager();
//             dialogUpdater.formUpdate('cnx_lensform');
//         },

         resize : function(){
             var seenBottom = Ext.get('cnx_lens_popup').getBottom();
             var buttonBottom = Ext.get('cnx_lens_add_button');
             if (buttonBottom) {
                buttonBottom = buttonBottom.getBottom();
                var difference = buttonBottom - seenBottom;
                if (difference) {
                    dialog.resizeTo(dialogwidth, dialogheight+difference+15);
                }
             }
         },

        // not used yet...
        makeForm : function(){
            if(!lensform){ // lazy initialize the form and only create it once
                lensform = new Ext.form.Form({
                                  labelWidth: 75,
                                  url:'addLens'
                           });
                lensform.applyToFields('cnx_lensform');
            }
        }
    };
}();

// using onDocumentReady instead of window.onload initializes the application
// when the DOM is ready, without waiting for images and other resources to load
Ext.onReady(LensAdd.init, LensAdd, true);

Ext.onReady(function() {
    var morden = new Ext.Shadow({mode:'sides', offset:4});
    morden.hide();

    var animShow = false; //{duration: 0.35};
    var animHide = false; //true;

    //var layer;

    var active = false;

    //* on mouseover, set active to true. if it stays this way after some delay, we'll show box
    var hoverOnNotice = function(e) {
        active = true;
    }

    //* on mouseout, set active to false. if false after some delay, don't show box
    var hoverOffNotice = function(e) {
        active = false;
        hoverOff(e);
    }

    //* triggered some time after mouseover, checks 'active' to determine if we've left the link since
    //* hover box is not shown if a hoverOffNotice has happened
    var hoverOnTest = function(e) {
        if (active) {
            hoverOn(e);
        }
    }

    //* display hover box, with drop shadow
    var hoverOn = function(e) {
        //a = Ext.get(e.target);
        var li = Ext.get(e.target).up('.lensinfowrap');
        var block = li.child('.lensinfo');
        if (block) {
            block.removeClass('hiddenStructure');   // accessibility-related
            block.alignTo(li, 'bl-tr?');  // original
            //block.alignTo(li, 'bl-tr?', [5, 25]); //better
            //block.alignTo(li, 'br-tr?');  // for #6037
            //block.alignTo(li, 'r-l?');  // experimental
            block.show(animShow);
            morden.show(block);
            //layer = new Ext.Layer({cls:"x-tip", shadow:"drop", shim: true, constrain:true, shadowOffset:3}, block.dom);
            //layer.alignTo(li, 'bl-tr?');
            //layer.show(animShow);
        }
    }

    //* hide hover box and drop shadow
    var hoverOff = function(e) {
        var li = Ext.get(e.target).up('.lensinfowrap');
        var block = li.child('.lensinfo');
        if(block) {
          block.hide(animHide);
        }
        morden.hide();
        //layer.hide(animHide);
    }

    // ...CSS moves lensinfos to (0,0) like we might do with a 'position()' here
    //Ext.select('.lensinfo').hide(false); // otherwise, it'll be in the wrong position the first time

    Ext.select('.lenslink').on('mouseover', hoverOn, this, {stopEvent : true});
    Ext.select('.lenslink').on('mouseout', hoverOff, this, {stopEvent : true});

    if (true) {
    //if (Ext.isIE && !Ext.isIE7) {
        // unibroswer does the equivalent of the following:
        // Ext.select('.hovlink').on('mouseover', createDefinition);
        // Ext.select('.hovlink').on('mouseout',  removeDefinition);
        Ext.select('.hovlink').on('mouseover', hoverOn,  this, {stopEvent : true});
        Ext.select('.hovlink').on('mouseout',  hoverOff, this, {stopEvent : true});
        // for mouse dwell... except that 'delay' doesn't work in IE6 yet.
        //Ext.select('.hovlink').on('mouseover', hoverOnTest, this, {stopEvent : true, delay : 200});
        //Ext.select('.hovlink').on('mouseover', hoverOnNotice, this, {stopEvent : true});
        //Ext.select('.hovlink').on('mouseout', hoverOffNotice, this, {stopEvent : true});
    }
    else {
        // waiting for ExtJs 2.x before making this live
        var cnxlinks;

        cnxlinks = Ext.select('.hovlink');
        if ( cnxlinks && cnxlinks.elements.length > 0 ) {
            var i, cnxlink;
            for (i=0; i<cnxlinks.elements.length; i++) {
                cnxlink = cnxlinks.elements[i];
                if (cnxlink.setAttributeNS) { cnxlink.setAttributeNS("ext", "qtip", "Undefined."); }
                else                        { cnxlink.setAttribute  ("ext:qtip",    "Undefined."); }
                addGlossaryToolTip(cnxlink);
                if (cnxlink.setAttributeNS) { cnxlink.setAttributeNS("ext", "qclass", "lensinfo"); }
                else                        { cnxlink.setAttribute  ("ext:qclass",    "lensinfo"); }
            }
            Ext.QuickTips.init();
            // delay before tool tip is displayed
            Ext.QuickTips.showDelay = 500; /* for ExtJS 2.2: Ext.QuickTips.getQuickTip().showDelay = 2000; */
            // delay after mouseout event fires before the tool tip is hidden
            Ext.QuickTips.hideDelay = 0;
            // controls whether the tool tip goes away after "awhile"
            Ext.QuickTips.autoDismiss = false;
            // controls the maximun width of the tool tip
            Ext.QuickTips.maxWidth = 375;
        }
    }
});

var relatedUpdater;
var recentReplace = function(e) {
    var urlContent;
    var charLast;
    if(!relatedUpdater){
        urlContent = window.location.href;
        charLast = urlContent[urlContent.length-1];
        if ( charLast != '/' ) {
            urlContent += '/';
        }
        relatedUpdater = Ext.get('cnx_recentview_contents').getUpdateManager();
        relatedUpdater.update({url:"content/recentContent.php",
                               params:{urlContent: urlContent}});

    }
}

Ext.onReady(function(e) {
    // handle shown/not shown based on cookie-set values
    var uparrow = Ext.get("cnx_recentview_hide").dom.style.display;  // elt is named for action, not state

    if (uparrow == "none") {   // this is true for known-hidden and initial (both none) states
        // no show: register and blank warning message
        Ext.get('cnx_recentview_contents').dom.style.display = 'none';
        Ext.get("cnx_recentview_header").on('click', this.recentReplace, this, {preventDefault: true});
    } else {
        // show: loading recent view
        recentReplace(null);
    }
});
