// xCollapsible, Copyright 2005 Michael Foster (Cross-Browser.com) // Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL function xCollapsible(outerEle, bShow) // object prototype { // Constructor var container = xGetElementById(outerEle); if (!container) {return null;} this.activeE=new Array(); var isUL = container.nodeName.toUpperCase() == 'UL'; var i, trg, aTgt = xGetElementsByTagName(isUL ? 'UL':'DIV', container); for (i = 0; i < aTgt.length; ++i) { trg = xPrevSib(aTgt[i]); if (trg && (isUL || trg.nodeName.charAt(0).toUpperCase() == 'H')) { aTgt[i].xTrgPtr = trg; aTgt[i].style.display = bShow ? 'block' : 'none'; trg.style.cursor = 'pointer'; trg.xTgtPtr = aTgt[i]; trg.onclick = trg_onClick; } } // Private function trg_onClick() { var tgt = this.xTgtPtr.style; var oldActiveE=menu.activeE; var mA=this.id.match(/e(\d+)-(\d+)-(\d+)/); menu.activeE=mA.slice(1,4); if (tgt.display == 'none') { tgt.display = 'block'; this.className="on"; this.parentNode.style.listStyleType="none"; this.parentNode.style.color="#FFFFFF"; if (oldActiveE[0]) { deactivateNavpoints(oldActiveE,null); } } else { tgt.display = 'none'; if (menu.activeE[0] != oldActiveE[0]) { this.className="off"; this.parentNode.style.listStyleType="none"; this.parentNode.style.color="#FFFFFF"; } deactivateNavpoints(oldActiveE,1); // return false; } //displayFrameset(this); } function deactivateNavpoints(oldActiveE,switchOff) { if (menu.activeE[0] != oldActiveE[0]) { if (oldActiveE[2] != "0") { var e3=xGetElementById('e'+oldActiveE.join('-')); if (menu.activeE[2] != oldActiveE[2]) { e3.className="off"; e3.parentNode.style.listStyleType="none"; e3.parentNode.style.color="#FFFFFF"; } } if (oldActiveE[1] != "0") { var e2=xGetElementById('e'+oldActiveE[0]+'-'+oldActiveE[1]+'-0'); if (menu.activeE[1] != oldActiveE[1]) { e2.className="off"; e2.parentNode.style.listStyleType="none"; e2.parentNode.style.color="#FFFFFF"; } var u2=xGetElementById('u'+oldActiveE[0]+'-'+oldActiveE[1]+'-0'); u2.style.display="none"; } var e1=xGetElementById('e'+oldActiveE[0]+'-0-0'); e1.className="off"; var u1=xGetElementById('u'+oldActiveE[0]+'-0-0'); u1.style.display="none"; } else if (switchOff || (menu.activeE[1] != oldActiveE[1])) { if (oldActiveE[2] != "0") { var e3=xGetElementById('e'+oldActiveE.join('-')); if (menu.activeE[2] != oldActiveE[2]) { e3.className="off"; e3.parentNode.style.listStyleType="none"; e3.parentNode.style.color="#FFFFFF"; } } if (oldActiveE[1] != "0") { var e2=xGetElementById('e'+oldActiveE[0]+'-'+oldActiveE[1]+'-0'); if (menu.activeE[1] != oldActiveE[1]) { e2.className="off"; e2.parentNode.style.listStyleType="none"; e2.parentNode.style.color="#FFFFFF"; } var u2=xGetElementById('u'+oldActiveE[0]+'-'+oldActiveE[1]+'-0'); u2.style.display="none"; } } } // Public this.displayAll = function(bShow) { for (var i = 0; i < aTgt.length; ++i) { if (aTgt[i].xTrgPtr) { xDisplay(aTgt[i], bShow ? "block":"none"); } } }; // The unload listener is for IE's circular reference memory leak bug. this.onUnload = function() { if (!xIE4Up || !container || !aTgt) {return;} for (i = 0; i < aTgt.length; ++i) { trg = aTgt[i].xTrgPtr; if (trg) { if (trg.xTgtPtr) { trg.xTgtPtr.TrgPtr = null; trg.xTgtPtr = null; } trg.onclick = null; } } }; }