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