xref: /dokuwiki/lib/plugins/acl/script.js (revision cf82a5b57d89343301a5a819c70ca5d7b336e68e)
1/**
2 * ACL Manager AJAX enhancements
3 *
4 * @author Andreas Gohr <andi@splitbrain.org>
5 */
6acl = {
7    /**
8     * Initialize the object and attach the event handlers
9     *
10     * @todo move to jQuery
11     */
12    init: function(){
13        this.ctl = $('acl_manager');
14        if(!this.ctl) return;
15
16        var sel = $('acl__user').getElementsByTagName('select')[0];
17
18        addEvent(sel,'change',acl.userselhandler);
19        addEvent($('acl__tree'),'click',acl.treehandler);
20        addEvent($('acl__user').getElementsByTagName('input')[1],'click',acl.loadinfo);
21    },
22
23    /**
24     * Handle user dropdown
25     *
26     * Hides or shows the user/group entry box depending on wht was selected in the
27     * dropdown element
28     */
29    userselhandler: function(e){
30        // make entry field visible/invisible
31        if(this.value == '__g__' || this.value == '__u__'){
32            jQuery('#acl__user input').show();
33        }else{
34            jQuery('#acl__user input').hide();
35        }
36        acl.loadinfo();
37    },
38
39    /**
40     * Load the current permission info and edit form
41     */
42    loadinfo: function(){
43        var frm = jQuery('#acl__detail form')[0];
44
45        jQuery('#acl__info').load(
46            DOKU_BASE + 'lib/plugins/acl/ajax.php',
47            {
48                'ns':       frm.elements['ns'].value,
49                'id':       frm.elements['id'].value,
50                'acl_t':    frm.elements['acl_t'].value,
51                'acl_w':    frm.elements['acl_w'].value,
52                'sectok':   frm.elements['sectok'].value,
53                'ajax':     'info',
54            }
55        );
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     * @param  DOMElement clicky - the plus/minus icon in front of a namespace
95     */
96    treetoggle: function(clicky){
97        var listitem = jQuery(clicky).parent().parent();
98
99        // if already open, close by removing the sublist
100        var sublists = listitem.find('ul');
101        if(sublists.length){
102            listitem.remove('ul');
103            clicky.src = DOKU_BASE+'lib/images/plus.gif';
104            clicky.alt = '+';
105            return false;
106        }
107
108        // prepare new ul to load into it via ajax
109        var ul = document.createElement('ul');
110        listitem[0].appendChild(ul);
111
112        // get the enclosed link and the edit form
113        var link = listitem.find('a')[0];
114        var frm  = jQuery('#acl__detail form')[0];
115
116        // prepare ajax data
117        var data           = acl.parseatt(link.search);
118        data['ajax']       = 'tree';
119        data['current_ns'] = frm.elements['ns'].value;
120        data['current_id'] = frm.elements['id'].value;
121
122        // run ajax
123        jQuery(ul).load(DOKU_BASE + 'lib/plugins/acl/ajax.php', data);
124
125        clicky.src = DOKU_BASE+'lib/images/minus.gif';
126        return false;
127    },
128
129    /**
130     * Handles all clicks in the tree, dispatching the right action based on the
131     * clicked element
132     *
133     * @todo move to jQuery
134     */
135    treehandler: function(e){
136        if(e.target.src){ // is it an image?
137            acl.treetoggle(e.target);
138        } else if(e.target.href){ // is it a link?
139            // remove highlighting
140            var obj = getElementsByClass('cur',$('acl__tree'),'a');
141            for(var i=0; i<obj.length; i++){
142                obj[i].className = obj[i].className.replace(/ cur/,'');
143            }
144
145            // add new highlighting
146            e.target.className += ' cur';
147
148            // set new page to detail form
149            var frm = $('acl__detail').getElementsByTagName('form')[0];
150            if(e.target.className.search(/wikilink1/) > -1){
151                frm.elements['ns'].value = '';
152                frm.elements['id'].value = acl.hsc(acl.parseatt(e.target.search)['id']);
153            }else if(e.target.className.search(/idx_dir/) > -1){
154                frm.elements['ns'].value = acl.hsc(acl.parseatt(e.target.search)['ns']);
155                frm.elements['id'].value = '';
156            }
157
158            acl.loadinfo();
159        }
160
161        e.stopPropagation();
162        e.preventDefault();
163        return false;
164    }
165
166};
167
168addInitEvent(acl.init);
169