first commit. dokuwiki.
[h2N7SspZmY.git] / lib / plugins / indexmenu / indexmenu-full.js
blobfef2b2c7dbf0b8294ab71e73af58c84a3d48242c
1 /*----------------------------------------------------|
2   | dTree 2.05 | www.destroydrop.com/javascript/tree/ |
3   |---------------------------------------------------|
4   | Copyright (c) 2002-2003 Geir Landro               |
5   |                                                   |
6   | This script can be used freely as long as all     |
7   | copyright messages are intact.                    |
8   |                                                   |
9   | Updated: 17.04.2003                               |
10   |---------------------------------------------------|
11   | Modified for Dokuwiki by                          |
12   | Samuele Tognini <samuele@netsons.org>             |
13   | under GPL 2 license                               |
14   | (http://www.gnu.org/licenses/gpl.html)            | 
15   | Updated: 29.08.2009                               |
16   |---------------------------------------------------|
17   | indexmenu  | wiki.splitbrain.org/plugin:indexmenu |
18   |--------------------------------------------------*/
20 // Node object
21 function Node(dokuid, id, pid, name, hns, isdir, ajax) {
22     this.dokuid = dokuid;
23     this.id = id;
24     this.pid = pid;
25     this.name = name;
26     this.hns = hns;
27     this.isdir = isdir;
28     this.ajax = ajax;
29     this._io = 0;
30     this._is = false;
31     this._ls = false;
32     this._hc = ajax;
33     this._ai = 0;
34     this._p = false;
35     this._lv = 0;
36     this._ok = false;
37     this._cp=false;
39 // Tree object
40 function dTree(objName,theme) {
41     var objExt = indexmenu_findExt(theme);
42     this.config = {
43         urlbase:DOKU_BASE+'doku.php?id=',
44         plugbase:DOKU_BASE+'lib/plugins/indexmenu',
45         useCookies: true,
46         scroll:true,
47         toc:true,
48         maxjs:1,
49         jsajax:'',
50         sepchar:':',
51         theme:theme
52     };
53     var objImg=this.config.plugbase+'/images/'+theme+'/';
54     this.icon = {
55         root: objImg + 'base.'+objExt,
56         folder: objImg + 'folder.'+objExt,
57         folderH: objImg + 'folderh.'+objExt,
58         folderOpen: objImg + 'folderopen.'+objExt,
59         folderHOpen: objImg + 'folderhopen.'+objExt,
60         node: objImg + 'page.'+objExt,
61         empty: objImg + 'empty.'+objExt,
62         line: objImg + 'line.'+objExt,
63         join: objImg + 'join.'+objExt,
64         joinBottom: objImg + 'joinbottom.'+objExt,
65         plus: objImg + 'plus.'+objExt,
66         plusBottom: objImg + 'plusbottom.'+objExt,
67         minus: objImg + 'minus.'+objExt,
68         minusBottom: objImg + 'minusbottom.'+objExt,
69         nlPlus: objImg + 'nolines_plus.'+objExt,
70         nlMinus: objImg + 'nolines_minus.'+objExt
71     };
72     this.obj = objName;
73     this.aNodes = [];
74     this.aIndent = [];
75     this.root = new Node(false,-1);
76     this.selectedNode = null;
77     this.selectedFound = false;
78     this.completed = false;
79     this.scrllTmr=0;
80     this.pageid=window.indexmenu_ID||'';
81     this.fajax=false;
84 // Adds a new node to the node array
85 dTree.prototype.add = function(dokuid, id, pid, name, hns, isdir, ajax) {
86     this.aNodes[this.aNodes.length] = new Node(dokuid, id, pid, name, hns, isdir, ajax);
89 // Open/close all nodes
90 dTree.prototype.openAll = function() {
91     if (!this.getCookie('co' + this.obj)) {
92         this.oAll(true);
93     }
96 // Outputs the tree to the page
97 dTree.prototype.toString = function() {
98     var str='';
99     if (this.config.scroll) {str += '<div id="cdtree_'+this.obj+'" class="dtree" style="position:relative;overflow:hidden;width:100%;">';}
100     str += '<div id="dtree_'+this.obj+'" class="dtree '+this.config.theme+'" style="overflow:';
101     if (this.config.scroll) { str += 'visible;position:relative;width:100%"';} else {str += 'hidden;"';}
102     str += '>';
103     if ($('dtree_'+this.obj)) {str += '<div class="error">Indexmenu id conflict</div>';}
104     if (this.config.toc) {
105         str += '<div id="t' + this.obj + '" class="indexmenu_tocbullet '+this.config.theme+'" style="display:none;" title="Table of contents"></div>';
106         str += '<div id="toc_' + this.obj + '" style="display:none;"></div>';
107     }
108     if (this.config.useCookies) { this.selectedNode = this.getSelected(); }
109     str += this.addNode(this.root)+'</div>';
110     if (this.config.scroll) {
111         str += '<div id="z' + this.obj + '" class="indexmenu_rarrow"></div>';
112         str += '<div id="left_'+this.obj+'" class="indexmenu_larrow" style="display:none;" title="Click to scroll back" onmousedown="javascript:'+this.obj+'.scroll(\'r\',1);" onmouseup="javascript:'+this.obj+'.stopscroll();"></div>';
113         str += '</div>';
114     }
115     this.completed = true;
116     this.divdisplay('nojs_',0);
117     return str;
120 // Creates the tree structure
121 dTree.prototype.addNode = function(pNode) {
122     var str = '',cn,n=pNode._ai,l=pNode._lv+1;
123     for (n; n<this.aNodes.length; n++) {
124         if (this.aNodes[n].pid == pNode.id) {
125             cn = this.aNodes[n];
126             cn._p = pNode;
127             cn._ai = n;
128             cn._lv=l;
129             this.setCS(cn);
130             if (cn._hc && !cn._io && this.config.useCookies) {cn._io = this.isOpen(cn.id);}
131             if (this.pageid == (!cn.hns && cn.dokuid || cn.hns)) {
132                 cn._cp=true;
133             } else if (cn.id == this.selectedNode && !this.selectedFound) {
134                 cn._is = true;
135                 this.selectedNode = n;
136                 this.selectedFound = true;
137             }
138             if (!cn._hc && cn.isdir && !cn.ajax && !cn.hns) {
139                 if (cn._ls) {str += this.noderr(cn, n);}
140             } else {
141                 str += this.node(cn, n);
142             }
143             if (cn._ls) {break;}
144         }
145     }
146     return str;
149 dTree.prototype.noderr = function(node, nodeId) {
150     var str = '<div class="dTreeNode">' + this.indent(node, nodeId);
151     str += '<div class="emptynode" title="Empty"></div></div>';
152     return str;
155 // Creates the node icon, url and text
156 dTree.prototype.node = function(node, nodeId) {
157     var h=1,jsfnc,str;
158     jsfnc='onmouseover="'+this.obj+'.show_feat(\''+nodeId+'\');" onmousedown="return indexmenu_checkcontextm(\''+nodeId+'\','+this.obj+',event);" oncontextmenu="return indexmenu_stopevt(event)"';
159     if (node._lv > this.config.maxjs) {h=0;} else {node._ok=true;}
160     str = '<div class="dTreeNode">' + this.indent(node, nodeId);
161     node.icon = (this.root.id == node.pid) ? this.icon.root : ((node.hns) ? this.icon.folderH : ((node._hc) ? this.icon.folder : this.icon.node));
162     node.iconOpen = (node._hc) ? ((node.hns) ? this.icon.folderHOpen : this.icon.folderOpen) : this.icon.node;
163     if (this.root.id == node.pid) {
164         node.icon = this.icon.root;
165         node.iconOpen = this.icon.root;
166     }
167     str += '<img id="i' + this.obj + nodeId + '" src="' + ((node._io) ? node.iconOpen : node.icon) + '" alt="" />';
168     if (!node._hc || node.hns) {
169         str += '<a id="s' + this.obj + nodeId + '" class="' + ((node._cp) ? 'navSel' : ((node._is) ? 'nodeSel' : (node._hc) ? 'nodeFdUrl' : 'nodeUrl')) ;
170         str += '" href="' + this.config.urlbase;
171         (node.hns) ? str +=node.hns : str += node.dokuid;
172         str += '"' + ' title="' + node.name + '"' +jsfnc;
173         str += ' onclick="javascript: ' + this.obj + '.s(' + nodeId + ');"';
174         str += '>'+node.name+'</a>';
175     }
176     else if (node.pid != this.root.id) {
177         str += '<a id="s' + this.obj + nodeId + '" href="javascript: ' + this.obj + '.o(' + nodeId + '); " class="node"' + jsfnc + '>'+node.name+'</a>';
178     } else {
179         str += node.name;
180     }
181     str += '</div>';
182     if (node._hc) {
183         str += '<div id="d' + this.obj + nodeId + '" class="clip" style="display:' + ((this.root.id == node.pid || node._io) ? 'block' : 'none') + ';">';
184         if (h) {str += this.addNode(node);}
185         str += '</div>';
186     }
187     this.aIndent.pop();
188     return str;
191 // Adds the empty and line icons
192 dTree.prototype.indent = function(node, nodeId) {
193     var n,str = '';
194     if (this.root.id != node.pid) {
195         for (n=0; n<this.aIndent.length; n++) {
196             str += '<img src="' + ( (this.aIndent[n] == 1) ? this.icon.line : this.icon.empty ) + '" alt="" />';
197         }
198         if (node._ls) {
199             this.aIndent.push(0);
200         } else {
201             this.aIndent.push(1);
202         }
203         if (node._hc) {
204             str += '<a href="javascript: ' + this.obj + '.o(' + nodeId+');"><img id="j' + this.obj + nodeId + '" src="';
205             str += ( (node._io) ? ((node._ls) ? this.icon.minusBottom : this.icon.minus) : ((node._ls) ? this.icon.plusBottom : this.icon.plus ) );
206             str += '" alt="" /></a>';
207         } else {str += '<img src="' + ((node._ls) ? this.icon.joinBottom : this.icon.join) + '" alt="" />';}
208     }
209     return str;
212 // Checks if a node has any children and if it is the last sibling
213 dTree.prototype.setCS = function(node) {
214     var lastId,n;
215     for (n=0; n<this.aNodes.length; n++) {
216         if (this.aNodes[n].pid == node.id) {node._hc = true;}
217         if (this.aNodes[n].pid == node.pid) {lastId = this.aNodes[n].id;}
218     }
219     if (lastId==node.id) {node._ls = true;}
222 // Returns the selected node
223 dTree.prototype.getSelected = function() {
224     var sn = this.getCookie('cs' + this.obj);
225     return (sn) ? sn : null;
228 // Highlights the selected node
229 dTree.prototype.s = function(id) {
230     var eOld,eNew,cn = this.aNodes[id];
231     if (this.selectedNode != id) {
232         eNew = $("s" + this.obj + id);
233         if (!eNew ) {return;}
234         if (this.selectedNode || this.selectedNode===0) {
235             eOld = $("s" + this.obj + this.selectedNode);
236             eOld.className = "node";
237         }
238         eNew.className = "nodeSel";
239         this.selectedNode = id;
240         if (this.config.useCookies) {this.setCookie('cs' + this.obj, cn.id);}
241     }
244 // Toggle Open or close
245 dTree.prototype.o = function(id) {
246     var cn = this.aNodes[id];
247     this.nodeStatus(!cn._io, id, cn._ls);
248     cn._io = !cn._io;
249     if (this.config.useCookies) {this.updateCookie();}
250     this.divdisplay('z',0);
251     this.resizescroll("block");
254 // Open or close all nodes
255 dTree.prototype.oAll = function(status) {
256     for (var n=0; n<this.aNodes.length; n++) {
257         if (this.aNodes[n]._hc && this.aNodes[n].pid != this.root.id) {
258             this.nodeStatus(status, n, this.aNodes[n]._ls);
259             this.aNodes[n]._io = status;
260         }
261     }
262     if (this.config.useCookies) {this.updateCookie();}
265 // Opens the tree to a specific node
266 dTree.prototype.openTo = function(nId, bSelect, bFirst) {
267     var n,cn;
268     if (!bFirst) {
269         for (n=0; n<this.aNodes.length; n++) {
270             if (this.aNodes[n].id == nId) {
271                 nId=n;
272                 break;
273             }
274         }
275     }
276     this.fill(this.aNodes[nId].pid);
277     cn=this.aNodes[nId];
278     if (cn.pid==this.root.id || !cn._p) {return;}
279     cn._io = 1;
280     if (this.completed && cn._hc) {this.nodeStatus(true, cn._ai, cn._ls);}
281     if (cn._is) {
282         (this.completed) ? this.s(cn._ai) : this._sn=cn._ai;
283     }
284     this.openTo(cn._p._ai, false, true);
287 dTree.prototype.getOpenTo = function(nodes) {
288     if (nodes === '') {
289         this.openAll();
290     } else if (!this.config.useCookies ||!this.getCookie('co' + this.obj)) {
291         for (var n=0; n<nodes.length; n++) {
292             this.openTo(nodes[n],false,true);
293         }
294     }
297 // Change the status of a node(open or closed)
298 dTree.prototype.nodeStatus = function(status, id, bottom) {
299     if (status && !this.fill(id)) {return;}
300     var eJoin,eIcon;
301     eJoin= $('j' + this.obj + id);
302     eIcon= $('i' + this.obj + id);
303     eIcon.src = (status) ? this.aNodes[id].iconOpen : this.aNodes[id].icon;
304     eJoin.src = ((status)?((bottom)?this.icon.minusBottom:this.icon.minus):((bottom)?this.icon.plusBottom:this.icon.plus));
305      $('d' + this.obj + id).style.display = (status) ? 'block': 'none';
308 // [Cookie] Clears a cookie
309 dTree.prototype.clearCookie = function() {
310     var now,yday;
311     now = new Date();
312     yday = new Date(now.getTime() - 1000 * 60 * 60 * 24);
313     this.setCookie('co'+this.obj, 'cookieValue', yday);
314     this.setCookie('cs'+this.obj, 'cookieValue', yday);
317 // [Cookie] Sets value in a cookie
318 dTree.prototype.setCookie = function(cookieName, cookieValue, expires, path, domain, secure) {
319     document.cookie =
320     escape(cookieName) + '=' + escape(cookieValue) +
321     (expires ? '; expires=' + expires.toGMTString() : '') +
322     ';path=/' +
323     (domain ? '; domain=' + domain : '') +
324     (secure ? '; secure' : '');
327 // [Cookie] Gets a value from a cookie
328 dTree.prototype.getCookie = function(cookieName) {
329     var cookieValue = '',pN,posValue,endPos;
330     pN = document.cookie.indexOf(escape(cookieName) + '=');
331     if (pN != -1) {
332         posValue = pN + (escape(cookieName) + '=').length;
333         endPos = document.cookie.indexOf(';', posValue);
334         if (endPos != -1) {cookieValue = unescape(document.cookie.substring(posValue, endPos));}
335         else {cookieValue = unescape(document.cookie.substring(posValue));}
336     }
337     return (cookieValue);
340 // [Cookie] Returns ids of open nodes as a string
341 dTree.prototype.updateCookie = function() {
342     var str = '',n;
343     for (n=0; n<this.aNodes.length; n++) {
344         if (this.aNodes[n]._io && this.aNodes[n].pid != this.root.id) {
345             if (str) {str += '.';}
346             str += this.aNodes[n].id;
347         }
348     }
349     this.setCookie('co' + this.obj, str);
352 // [Cookie] Checks if a node id is in a cookie
353 dTree.prototype.isOpen = function(id) {
354     var n,aOpen = this.getCookie('co' + this.obj).split('.');
355     for (n=0; n<aOpen.length; n++){
356         if (aOpen[n] == id) {return true;}
357     }
358     return false;
361 dTree.prototype.openCurNS = function (max){
362     var r,cn,match,t,i,n,cnsa,cna,cns=this.pageid;
363     r=new RegExp ("\\b"+this.config.sepchar+"\\b","g");
364     match=cns.match(r)||-1;
365     if (max>0 && match.length >= max) {
366         t = cns.split(this.config.sepchar);
367         n = (this.aNodes[0].dokuid == '') ? 0 :this.aNodes[0].dokuid.split(this.config.sepchar).length;
368         t.splice(max + n,t.length);
369         cnsa=t.join(this.config.sepchar);
370     }
371     for (i=0; i<this.aNodes.length; i++){
372         cn=this.aNodes[i];
373         if (cns == cn.dokuid || cns == cn.hns) {
374             this.openTo(cn.id,false,true);
375             this.fajax=false;
376             if (cn.pid >= 0) {
377                 addInitEvent(this.scroll("l",4,cn.pid,1));
378             }
379             break;
380         }
381         if (cnsa == cn.dokuid || cnsa == cn.hns) {
382             cna=cn;
383             this.fajax=true;
384         }
385     }
386     if (cna) {this.openTo(cna.id,false,true);}
389 dTree.prototype.fill = function(id) {
390     if (id == -1 || this.aNodes[id]._ok ) {return true;}
391     var n=id,eLoad,node,a,rd,ln,eDiv;
392     if (this.aNodes[n].ajax) {
393         eLoad=$('l' + this.obj);
394         node=$('s'+this.obj+n);
395         if (!eLoad) {eLoad=indexmenu_createPicker('l' + this.obj);}
396         eLoad.innerHTML='Loading ...';
397         $('s'+this.obj+n).parentNode.appendChild(eLoad);
398         eLoad.style.width='auto';
399         eLoad.style.display='inline';
400         this.getAjax(n);
401         return true;
402     }
403     rd = [];
404     while (!this.aNodes[n]._ok) {
405         rd[rd.length]=n;
406         n=this.aNodes[n].pid;
407     }
408     for (ln=rd.length-1; ln>=0; ln--) {
409         id=rd[ln];
410         a=this.aNodes[id];
411         eDiv=$('d' + this.obj + id);
412         if (!eDiv) {return false;}
413         this.aIndent = [];
414         n=a;
415         while (n.pid>=0) {
416             if (n._ls) {
417                 this.aIndent.unshift(0);
418             } else {
419                 this.aIndent.unshift(1);
420             }
421             n=n._p;
422         }
423         eDiv.innerHTML=this.addNode(a);
424         a._ok=true;
425     }
426     return true;
429 dTree.prototype.openCookies = function() {
430     var n,cn,aOpen = this.getCookie('co' + this.obj).split('.');
431     for (n=0; n<aOpen.length; n++){
432         if (aOpen[n] === "") {break;}
433         cn = this.aNodes[aOpen[n]];
434         if (!cn._ok) {this.nodeStatus(true, aOpen[n], cn._ls);cn._io = 1;}
435     }
438 dTree.prototype.scroll = function (where,s,n,i){
439     if (!this.config.scroll) {return false;}
440     var w,dtree,dtreel,nodeId;
441     dtree=$('dtree_'+this.obj);
442     dtreel=parseInt(dtree.offsetLeft,0);
443     if (where=="r") {
444         $('left_'+this.obj).style.border="thin inset";
445         this.scrollRight(dtreel,s);
446     } else {
447         nodeId=$('s'+this.obj+n);
448         w = parseInt(dtree.parentNode.offsetWidth - nodeId.offsetWidth - nodeId.offsetLeft,0);
449         if (this.config.toc) {w=w-11;}
450         if (dtreel <= w) {return;}
451         this.resizescroll("none");
452         this.stopscroll();
453         this.scrollLeft(dtreel,s,w-3,i);
454     }
457 dTree.prototype.scrollLeft = function (lft,s,w,i){
458     if(lft < w - i -10) {
459         this.divdisplay('z',0);
460         this.scrllTmr=0;
461         return;
462     }
463     var self=this;
464     $('dtree_'+self.obj).style.left = lft + "px";
465     this.scrllTmr=setTimeout(function (){self.scrollLeft(lft - s,s+i,w,i);},20);
468 //Scroll Back
469 dTree.prototype.scrollRight = function (lft,s){
470     if(lft >= s) {
471         this.divdisplay('left_',0);
472         this.stopscroll();
473         return;
474     }
475     var self=this;
476     $('dtree_'+self.obj).style.left = lft + "px";
477     if (lft>-15) {s=1;}
478     this.scrllTmr=setTimeout(function (){self.scrollRight(lft+s,s+1);},20);
481 dTree.prototype.stopscroll = function (){
482         $('left_'+this.obj).style.border="none";
483         clearTimeout(this.scrllTmr);
484         this.scrllTmr=0;
487 dTree.prototype.show_feat = function (n){
488     var w,div,id,dtree,dtreel,self,node=$('s'+this.obj+n);
489     self=this;
490     if (this.config.toc && node.className != "node") {
491         div=$('t'+this.obj);
492         id =(this.aNodes[n].hns) ? this.aNodes[n].hns : this.aNodes[n].dokuid;
493         div.onmousedown=function (){indexmenu_createTocMenu('req=toc&id='+decodeURIComponent(id),'picker_'+self.obj,'t'+self.obj);};
494         node.parentNode.appendChild(div);
495         if (div.style.display=="none") {div.style.display="inline";}
496     }
497     if (this.config.scroll) {
498         div=$('z'+this.obj);
499         div.onmouseover=function(){div.style.border="none";self.scroll("l",1,n,0);};
500         div.onmousedown=function(){div.style.border="thin inset";self.scroll("l",4,n,1);};
501         div.onmouseout=function(){div.style.border="none";self.stopscroll();};
502         div.onmouseup=div.onmouseover;
503         dtree=$('dtree_'+this.obj);
504         dtreel=parseInt(dtree.offsetLeft,0);
505         w = parseInt(dtree.parentNode.offsetWidth - node.offsetWidth - node.offsetLeft + 1,0);
506         if (dtreel > w) {
507             div.style.display="none";
508             div.style.top = node.offsetTop+"px";
509             div.style.left = parseInt(node.offsetLeft + node.offsetWidth + w - 12,0)+"px";
510             div.style.display="block";
511         }
512     }
515 dTree.prototype.resizescroll = function (status){
516     var dtree,w,h,left=$('left_'+this.obj);
517     if (!left) {return;}
518     if (left.style.display==status) {
519         dtree=$('dtree_'+this.obj);
520         w=parseInt(dtree.offsetHeight/3,0);
521         h= parseInt(w/50,0)*50;
522         if (h < 50) {h=50;}
523         left.style.height=h+"px";
524         left.style.top = w+"px";
525         if (status=="none") {left.style.display="block";}
526     }
529 // Toggle Open or close
530 dTree.prototype.getAjax = function(n) {
531     var node,req,curns,selft=this;
532     node=selft.aNodes[n];
533     // We use SACK to do the AJAX requests
534     var Ajax = new sack(DOKU_BASE+'lib/plugins/indexmenu/ajax.php');
535     req='req=index&idx='+node.dokuid+decodeURIComponent(this.config.jsajax);
536     curns=this.pageid.substring(0,this.pageid.lastIndexOf(this.config.sepchar));
537     Ajax.encodeURIString=false;
538     Ajax.onCompletion = function(){
539         var i,ajxnodes,ajxnode,plus;
540         plus=selft.aNodes.length -1;
541         eval(this.response);
542         if (!isArray(ajxnodes) || ajxnodes.length < 1) {
543             ajxnodes=[['', 1, 0, '', 0, 1, 0]];
544         }
545         node.ajax=false;
546         for(i=0;i<ajxnodes.length;i++){
547             ajxnode=ajxnodes[i];
548             ajxnode[2]=(ajxnode[2]==0) ? node.id : ajxnode[2] + plus;
549             ajxnode[1] += plus;
550             selft.add(ajxnode[0],ajxnode[1],ajxnode[2],ajxnode[3],ajxnode[4],ajxnode[5],ajxnode[6]);
551         }
552         if (selft.fajax) {
553             selft.fajax=false;
554             selft.openCurNS(0);
555         } else {
556             selft.openTo(node.id,false,true);
557         }
558         $('l'+selft.obj).style.display='none';
559     };
560     if (this.fajax) {
561         req +='&nss='+curns+'&max=1';
562     }
563     Ajax.encodeURIString = false;
564     Ajax.runAJAX(encodeURI(req));
567 //Load custom css
568 dTree.prototype.loadCss = function() {
569     var oLink = document.createElement("link");
570     oLink.href = this.config.plugbase+'/images/'+this.config.theme+'/style.css';
571     oLink.rel = "stylesheet";
572     oLink.type = "text/css";
573     document.getElementsByTagName('head')[0].appendChild(oLink);
576 //Right click
577 dTree.prototype.contextmenu = function(n,e) {
578     var li,id,html,type,node,self,cmenu,cdtree,rmenu,X=0,Y=0,i;
579     cdtree= $("cdtree_" + this.obj);
580     rmenu=$('r' + this.obj);
581     if(!rmenu) { return true; }
582     indexmenu_mouseposition(rmenu,e);
583     cmenu=window.indexmenu_contextmenu[0];
584     node =this.aNodes[n];
585     self=this;
586     rmenu.innerHTML='<div class="indexmenu_rmenuhead" title="'+node.name+'">'+node.name+"</div>";
587     for (i=0; i<cmenu.length; i++,i++,i++,i++) {
588       if (((!node._hc || node.hns) && !cmenu[i+2])||(node._hc && !node.hns && !cmenu[i+3])) {continue;}
589         html=cmenu[i];
590         if (cmenu[i+1]) {
591             type='li';
592             id =(node.hns) ? node.hns : node.dokuid;
593             html='<a title="'+cmenu[i]+'" href="'+eval(cmenu[i+1])+'">'+html+'</a>';
594         } else {
595             type='span';
596             rmenu.appendChild(document.createElement('ul'));
597         }
598         li=document.createElement(type);
599         li.innerHTML=html;
600         rmenu.lastChild.appendChild(li);
601     }
602     rmenu.style.display='inline';
603     return false;
606 dTree.prototype.divdisplay = function(obj,v) {
607     var o=$(obj+this.obj);
608     if (!o) {return false;}
609     (v) ? o.style.display='inline': o.style.display='none' ;
612 dTree.prototype.init = function(s,c,n,nav,max) {
613   if (s) {this.loadCss();}
614   if (!c) {this.openCookies();}
615   if (n) {this.getOpenTo(n.split(" "));}
616   if (nav) {this.openCurNS(max);}
617   if (window.indexmenu_contextmenu) {
618       var self = this;
619       indexmenu_createPicker('r'+ this.obj,'indexmenu_rmenu '+this.config.theme);
620       $('r'+ this.obj).oncontextmenu=indexmenu_stopevt;
621       addEvent(document, 'click', function() {self.divdisplay('r',0);});
622   }
625 // If Push and pop is not implemented by the browser
626 if (!Array.prototype.push) {
627     Array.prototype.push = function array_push() {
628         for(var i=0;i<arguments.length;i++){
629             this[this.length]=arguments[i];
630         }
631         return this.length;
632     };
634 if (!Array.prototype.pop) {
635     Array.prototype.pop = function array_pop() {
636         var lstEl = this[this.length-1];
637         this.length = Math.max(this.length-1,0);
638         return lstEl;
639     };