source: extensions/rv_menutree/trunk/rvtree.js @ 3572

Last change on this file since 3572 was 3572, checked in by rvelices, 15 years ago

added extension rv_menutree

  • Property svn:eol-style set to LF
File size: 3.6 KB
Line 
1/* this is not directly used - compress it as rvtree-min.js on http://www.compressjavascript.com/ or somewhere else
2Based on Matt Kruse <matt@mattkruse.com> http://www.mattkruse.com/ */
3var XElement = {
4  hasClassName: function(element, className) {
5    if (!element) return false;
6    var elementClassName = element.className;
7    if (elementClassName.length == 0) return false;
8    if (elementClassName == className ||
9        elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
10      return true;
11    return false;
12  },
13
14  addClassName: function(element, className) {
15    if (!element) return;
16    var classNames = element.className.split(/\s+/);
17    for (var i=0; i<classNames.length; i++)
18      if (className==classNames[i]) return;
19    classNames.splice(0,0,className);
20    element.className = classNames.join(' ');
21    return element;
22  },
23
24  toggleClassName: function(element, className) {
25    if (!element) return;
26    var classNames = element.className.split(/\s+/);
27    for (var i=0; i<classNames.length; i++)
28      if (classNames[i]==className) break;
29    if (i==classNames.length)
30      classNames.splice(0,0,className);
31    else
32      classNames.splice(i, 1);
33    element.className = classNames.join(' ');
34    return element;
35  }
36};
37
38var RVTree =
39{
40        options :
41        {
42                nodeClosedClass: "liClosed",
43                nodeOpenClass: "liOpen",
44                nodeBulletClass: "liBullet",
45                nodeLinkClass: "bullet"
46        },
47
48        convertTree: function (root)
49        {
50                if (!document.createElement) return; // Without createElement, we can't do anything
51                RVTree._processList(root, true);
52        },
53
54        _processList: function(ul, isRoot)
55        {
56                if (!ul.childNodes || ul.childNodes.length==0) return;
57
58                for (var i=0; i<ul.childNodes.length; i++)
59                { //Iterate LIs
60      var item = ul.childNodes[i];
61      if (item.nodeName != "LI")
62        continue;
63
64      // Iterate things in this LI
65                  var subLists = false;
66                  for (var sitemi=0;sitemi<item.childNodes.length;sitemi++)
67      {
68        var sitem = item.childNodes[sitemi];
69        if (sitem.nodeName=="UL")
70        {
71          subLists = true;
72          RVTree._processList(sitem, false);
73        }
74                        }
75
76                        var s= document.createElement("SPAN");
77                        var t= '\u00A0'; // &nbsp;
78                        s.className = RVTree.options.nodeLinkClass;
79                        if (subLists)
80      {
81                                // This LI has UL's in it, so it's a +/- node
82                                if ( !XElement.hasClassName(item, RVTree.options.nodeOpenClass) )
83                                        XElement.addClassName(item, RVTree.options.nodeClosedClass);
84
85                                // If it's just text, make the text work as the link also
86                                if (item.firstChild.nodeName=="#text")
87        {
88                                        t = t+item.firstChild.nodeValue;
89                                        item.removeChild(item.firstChild);
90                                }
91                                s.onclick = function ()
92        {
93          XElement.toggleClassName( this.parentNode, RVTree.options.nodeOpenClass );
94          XElement.toggleClassName( this.parentNode, RVTree.options.nodeClosedClass );
95                                        return false;
96                                }
97                        }
98                        else
99      {// No sublists
100        if ( XElement.hasClassName(item, RVTree.options.nodeClosedClass) )
101        {
102          s.onclick = function()
103          {
104            var nodes = this.parentNode.getElementsByTagName("A");
105            if (nodes.length)
106              document.location = nodes[0].href;
107          }
108        }
109        else
110          XElement.addClassName(item, RVTree.options.nodeBulletClass);
111                        }
112
113                        item.style.listStyleType='none';
114                        if (isRoot && /*IE*/ (window.attachEvent && !window.opera) )
115        item.style.marginLeft="-16px"; // thats IE6 what about IE7 ?
116                        if (s)
117                        {
118                                s.appendChild(document.createTextNode(t));
119                                item.insertBefore(s,item.firstChild);
120                        }
121                }
122                ul.style.marginLeft = 0;
123                ul.style.paddingLeft = isRoot ? 0 : "8px";
124        }
125}
Note: See TracBrowser for help on using the repository browser.