xref: /dokuwiki/lib/plugins/acl/script.js (revision df3678d8c02fdace2a95a6e72bf0ffb2d3323b85)
1acl = {
2    init: function(){
3        this.ctl = $('acl_manager');
4        if(!this.ctl) return;
5
6        var sel = $('acl__user').getElementsByTagName('select')[0];
7
8        addEvent(sel,'change',acl.userselhandler);
9        addEvent($('acl__tree'),'click',acl.treehandler);
10        addEvent($('acl__user').getElementsByTagName('input')[1],'click',acl.loadinfo);
11    },
12
13
14    /**
15     * Handle user dropdown
16     */
17    userselhandler: function(e){
18        // make entry field visible/invisible
19        if(this.value == '__g__' || this.value == '__u__'){
20            $('acl__user').getElementsByTagName('input')[0].style.display = ''; //acl_w
21            $('acl__user').getElementsByTagName('input')[1].style.display = ''; //submit
22        }else{
23            $('acl__user').getElementsByTagName('input')[0].style.display = 'none';
24            $('acl__user').getElementsByTagName('input')[1].style.display = 'none';
25        }
26
27        acl.loadinfo();
28    },
29
30    /**
31     * Load the current permission info and edit form
32     *
33     * @param frm - Form element with needed data
34     */
35    loadinfo: function(){
36        // get form
37        var frm = $('acl__detail').getElementsByTagName('form')[0];
38
39        // prepare an AJAX call
40        var ajax = new sack(DOKU_BASE + 'lib/plugins/acl/ajax.php');
41        ajax.AjaxFailedAlert = '';
42        ajax.encodeURIString = false;
43        if(ajax.failed) return true;
44
45        // prepare data
46        var data = Array();
47        data[0] = ajax.encVar('ns',frm.elements['ns'].value);
48        data[1] = ajax.encVar('id',frm.elements['id'].value);
49        data[2] = ajax.encVar('acl_t',frm.elements['acl_t'].value);
50        data[3] = ajax.encVar('acl_w',frm.elements['acl_w'].value);
51        data[4] = ajax.encVar('ajax','info');
52
53        ajax.elementObj = $('acl__info');
54
55        ajax.runAJAX(data.join('&'));
56        return false;
57    },
58
59    /**
60     * parse URL attributes into a associative array
61     *
62     * @todo put into global script lib?
63     */
64    parseatt: function(str){
65        if(str[0] == '?') str = str.substr(1);
66        var attributes = {};
67        var all = str.split('&');
68        for(var i=0; i<all.length; i++){
69            var att = all[i].split('=');
70            attributes[att[0]] = decodeURIComponent(att[1]);
71        }
72        return attributes;
73    },
74
75    /**
76     * htmlspecialchars equivalent
77     *
78     * @todo put in gloabl scripts lib?
79     */
80    hsc: function(str) {
81        str = str.replace(/&/g,"&amp;");
82        str = str.replace(/\"/g,"&quot;");
83        str = str.replace(/\'/g,"&#039;");
84        str = str.replace(/</g,"&lt;");
85        str = str.replace(/>/g,"&gt;");
86        return str;
87    },
88
89
90    /**
91     * Open or close a subtree using AJAX
92     *
93     * @author Andreas Gohr <andi@splitbrain.org>
94     */
95    treetoggle: function(clicky){
96        var listitem = clicky.parentNode.parentNode;
97
98        // if already open, close by removing the sublist
99        var sublists = listitem.getElementsByTagName('ul');
100        if(sublists.length){
101            listitem.removeChild(sublists[0]);
102            clicky.src = DOKU_BASE+'lib/images/plus.gif';
103            clicky.alt = '+';
104            return false;
105        }
106
107        // get the enclosed link (is always the first one)
108        var link = listitem.getElementsByTagName('a')[0];
109
110        // prepare an AJAX call to fetch the subtree
111        var ajax = new sack(DOKU_BASE + 'lib/plugins/acl/ajax.php');
112        ajax.AjaxFailedAlert = '';
113        ajax.encodeURIString = false;
114        if(ajax.failed) return true;
115
116        //prepare the new ul
117        var ul = document.createElement('ul');
118        listitem.appendChild(ul);
119        ajax.elementObj = ul;
120        ajax.runAJAX(link.search.substr(1)+'&ajax=tree');
121        clicky.src = DOKU_BASE+'lib/images/minus.gif';
122        return false;
123    },
124
125    /**
126     * Handles all clicks in the tree, dispatching the right action based on the
127     * clicked element
128     */
129    treehandler: function(e){
130        if(e.target.src){ // is it an image?
131            acl.treetoggle(e.target);
132        } else if(e.target.href){ // is it a link?
133            // remove highlighting
134            var obj = getElementsByClass('cur',$('acl__tree'),'a');
135            for(var i=0; i<obj.length; i++){
136                obj[i].className = obj[i].className.replace(/ cur/,'');
137            }
138
139            // add new highlighting
140            e.target.className += ' cur';
141
142            // set new page to detail form
143            var frm = $('acl__detail').getElementsByTagName('form')[0];
144            if(e.target.className.search(/wikilink1/) > -1){
145                frm.elements['ns'].value = '';
146                frm.elements['id'].value = acl.hsc(acl.parseatt(e.target.search)['id']);
147            }else if(e.target.className.search(/idx_dir/) > -1){
148                frm.elements['ns'].value = acl.hsc(acl.parseatt(e.target.search)['ns']);
149                frm.elements['id'].value = '';
150            }
151
152            acl.loadinfo();
153        }
154
155        e.stopPropagation();
156        e.preventDefault();
157        return false;
158    }
159
160};
161
162addInitEvent(acl.init);
163