summaryrefslogtreecommitdiffstats
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/expanding-tree.js157
1 files changed, 157 insertions, 0 deletions
diff --git a/js/expanding-tree.js b/js/expanding-tree.js
new file mode 100644
index 000000000..d210a629c
--- /dev/null
+++ b/js/expanding-tree.js
@@ -0,0 +1,157 @@
+/* The contents of this file are subject to the Mozilla Public
+ * License Version 1.1 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * rights and limitations under the License.
+ *
+ * The Original Code is the Bugzilla Bug Tracking System.
+ *
+ * The Initial Developer of the Original Code is Netscape Communications
+ * Corporation. Portions created by Netscape are
+ * Copyright (C) 1998 Netscape Communications Corporation. All
+ * Rights Reserved.
+ *
+ * Contributor(s): Mike Shaver <shaver@mozilla.org>
+ * Christian Reis <kiko@async.com.br>
+ * André Batosti <batosti@async.com.br>
+ */
+
+if (!Node) {
+ // MSIE doesn't define Node, so provide a compatibility object
+ var Node = { TEXT_NODE: 3 }
+}
+
+if (!highlighted) {
+ var highlighted = 0;
+ var highlightedclass = "";
+ var highlightedover = 0;
+}
+
+function doToggle(node, event) {
+ var deep = event.altKey || event.ctrlKey;
+
+ if (node.nodeType == Node.TEXT_NODE)
+ node = node.parentNode;
+
+ var toggle = node.nextSibling;
+ while (toggle && toggle.tagName != "UL")
+ toggle = toggle.nextSibling;
+
+ if (toggle) {
+ if (deep) {
+ var direction = toggleDisplay(toggle, node);
+ changeChildren(toggle, direction);
+ } else {
+ toggleDisplay(toggle, node);
+ }
+ }
+ /* avoid problems with default actions on links (mozilla's
+ * ctrl/shift-click defaults, for instance */
+ event.preventBubble();
+ event.preventDefault();
+ return false;
+}
+
+function changeChildren(node, direction) {
+ var item = node.firstChild;
+ while (item) {
+ /* find the LI inside the UL I got */
+ while (item && item.tagName != "LI")
+ item = item.nextSibling;
+ if (!item)
+ return;
+
+ /* got it, now find the first A */
+ var child = item.firstChild;
+ while (child && child.tagName != "A")
+ child = child.nextSibling;
+ if (!child) {
+ return
+ }
+ var bullet = child;
+
+ /* and check if it has its own sublist */
+ var sublist = item.firstChild;
+ while (sublist && sublist.tagName != "UL")
+ sublist = sublist.nextSibling;
+ if (sublist) {
+ if (direction && isClosed(sublist)) {
+ openNode(sublist, bullet);
+ } else if (!direction && !isClosed(sublist)) {
+ closeNode(sublist, bullet);
+ }
+ changeChildren(sublist, direction)
+ }
+ item = item.nextSibling;
+ }
+}
+
+function openNode(node, bullet) {
+ node.style.display = "block";
+ bullet.className = "b b_open";
+}
+
+function closeNode(node, bullet) {
+ node.style.display = "none";
+ bullet.className = "b b_closed";
+}
+
+function isClosed(node) {
+ /* XXX we should in fact check our *computed* style, not the display
+ * attribute of the current node, which may be inherited and not
+ * set. However, this really only matters when changing the default
+ * appearance of the tree through a parent style. */
+ return node.style.display == "none";
+}
+
+function toggleDisplay(node, bullet) {
+ if (isClosed(node)) {
+ openNode(node, bullet);
+ return true;
+ }
+
+ closeNode(node, bullet);
+ return false;
+}
+
+function duplicated(element) {
+ var allsumm= document.getElementsByTagName("span");
+ if (highlighted) {
+ for (i = 0;i < allsumm.length; i++) {
+ if (allsumm.item(i).id == highlighted) {
+ allsumm.item(i).className = highlightedclass;
+ }
+ }
+ if (highlighted == element) {
+ highlighted = 0;
+ return;
+ }
+ }
+ highlighted = element;
+ var elem = document.getElementById(element);
+ highlightedclass = elem.className;
+ for (var i = 0;i < allsumm.length; i++) {
+ if (allsumm.item(i).id == element) {
+ allsumm.item(i).className = "summ_h";
+ }
+ }
+}
+
+function duplicatedover(element) {
+ if (!highlighted) {
+ highlightedover = 1;
+ duplicated(element);
+ }
+}
+
+function duplicatedout(element) {
+ if (highlighted == element && highlightedover) {
+ highlightedover = 0;
+ duplicated(element);
+ }
+}
+