source: extensions/rv_menutree/branches/2.0-radu/rvtree.js @ 3574

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

rv menutree better compatibility with IE 8

  • 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                if (window.attachEvent && !window.opera)
52                {
53                        if ( new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})").exec( navigator.userAgent ) != null )
54                                RVTree.options.IEVersion = parseFloat( RegExp.$1 );
55                }
56                RVTree._processList(root, true);
57        },
58
59        _processList: function(ul, isRoot)
60        {
61                if (!ul.childNodes || ul.childNodes.length==0) return;
62
63                for (var i=0; i<ul.childNodes.length; i++)
64                { //Iterate LIs
65                        var item = ul.childNodes[i];
66                        if (item.nodeName != "LI")
67                                continue;
68
69                        // Iterate things in this LI
70                        var subLists = false;
71                        for (var sitemi=0;sitemi<item.childNodes.length;sitemi++)
72                        {
73                                var sitem = item.childNodes[sitemi];
74                                if (sitem.nodeName=="UL")
75                                {
76                                        subLists = true;
77                                        RVTree._processList(sitem, false);
78                                }
79                        }
80
81                        var s= document.createElement("SPAN");
82                        var t= '\u00A0'; // &nbsp;
83                        s.className = RVTree.options.nodeLinkClass;
84                        if (subLists)
85                        {
86                                // This LI has UL's in it, so it's a +/- node
87                                if ( !XElement.hasClassName(item, RVTree.options.nodeOpenClass) )
88                                        XElement.addClassName(item, RVTree.options.nodeClosedClass);
89
90                                // If it's just text, make the text work as the link also
91                                if (item.firstChild.nodeName=="#text")
92                                {
93                                        t = t+item.firstChild.nodeValue;
94                                        item.removeChild(item.firstChild);
95                                }
96                                s.onclick = function ()
97                                {
98                                        XElement.toggleClassName( this.parentNode, RVTree.options.nodeOpenClass );
99                                        XElement.toggleClassName( this.parentNode, RVTree.options.nodeClosedClass );
100                                        return false;
101                                }
102                        }
103                        else
104                        {// No sublists
105                                if ( XElement.hasClassName(item, RVTree.options.nodeClosedClass) )
106                                {
107                                        s.onclick = function()
108                                        {
109                                                var nodes = this.parentNode.getElementsByTagName("A");
110                                                if (nodes.length)
111                                                        document.location = nodes[0].href;
112                                        }
113                                }
114                                else
115                                        XElement.addClassName(item, RVTree.options.nodeBulletClass);
116                        }
117
118                        item.style.listStyleType='none';
119                        if (isRoot && RVTree.options.IEVersion && RVTree.options.IEVersion < 8)
120                                item.style.marginLeft="-16px"; // thats IE6,IE7 ; IE8 seems more compliant
121                        if (s)
122                        {
123                                s.appendChild(document.createTextNode(t));
124                                item.insertBefore(s,item.firstChild);
125                        }
126                }
127                ul.style.marginLeft = 0;
128                ul.style.paddingLeft = isRoot ? 0 : "8px";
129        }
130}
Note: See TracBrowser for help on using the repository browser.