xref: /dokuwiki/lib/plugins/acl/script.js (revision 9ee7fd095e8cb3c84ad95dd52c35630147333ecb)
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    init: function(){
11        if(!jQuery('#acl_manager').length) return; //FIXME only one underscore!!
12
13        jQuery('#acl__user select').change(acl.userselhandler);
14        jQuery('#acl__tree').click(acl.treehandler);
15        jQuery('#acl__user input[type=submit]').click(acl.loadinfo);
16    },
17
18    /**
19     * Handle user dropdown
20     *
21     * Hides or shows the user/group entry box depending on what was selected in the
22     * dropdown element
23     */
24    userselhandler: function(e){
25        // make entry field visible/invisible
26        if(this.value == '__g__' || this.value == '__u__'){
27            jQuery('#acl__user input').show();
28        }else{
29            jQuery('#acl__user input').hide();
30        }
31        acl.loadinfo();
32    },
33
34    /**
35     * Load the current permission info and edit form
36     */
37    loadinfo: function(){
38        var frm = jQuery('#acl__detail form')[0];
39
40        jQuery('#acl__info').load(
41            DOKU_BASE + 'lib/plugins/acl/ajax.php',
42            {
43                'ns':       frm.elements['ns'].value,
44                'id':       frm.elements['id'].value,
45                'acl_t':    frm.elements['acl_t'].value,
46                'acl_w':    frm.elements['acl_w'].value,
47                'sectok':   frm.elements['sectok'].value,
48                'ajax':     'info',
49            }
50        );
51        return false;
52    },
53
54    /**
55     * parse URL attributes into a associative array
56     *
57     * @todo put into global script lib?
58     */
59    parseatt: function(str){
60        if(str[0] == '?') str = str.substr(1);
61        var attributes = {};
62        var all = str.split('&');
63        for(var i=0; i<all.length; i++){
64            var att = all[i].split('=');
65            attributes[att[0]] = decodeURIComponent(att[1]);
66        }
67        return attributes;
68    },
69
70    /**
71     * Open or close a subtree using AJAX
72     *
73     * @author Andreas Gohr <andi@splitbrain.org>
74     * @param  DOMElement clicky - the plus/minus icon in front of a namespace
75     */
76    treetoggle: function(clicky){
77        var listitem = jQuery(clicky).parent().parent();
78
79        // if already open, close by removing the sublist
80        var sublists = listitem.find('ul');
81        if(sublists.length){
82            listitem.remove('ul');
83            clicky.src = DOKU_BASE+'lib/images/plus.gif';
84            clicky.alt = '+';
85            return false;
86        }
87
88        // prepare new ul to load into it via ajax
89        var ul = document.createElement('ul');
90        listitem[0].appendChild(ul);
91
92        // get the enclosed link and the edit form
93        var link = listitem.find('a')[0];
94        var frm  = jQuery('#acl__detail form')[0];
95
96        // prepare ajax data
97        var data           = acl.parseatt(link.search);
98        data['ajax']       = 'tree';
99        data['current_ns'] = frm.elements['ns'].value;
100        data['current_id'] = frm.elements['id'].value;
101
102        // run ajax
103        jQuery(ul).load(DOKU_BASE + 'lib/plugins/acl/ajax.php', data);
104
105        clicky.src = DOKU_BASE+'lib/images/minus.gif';
106        return false;
107    },
108
109    /**
110     * Handles all clicks in the tree, dispatching the right action based on the
111     * clicked element
112     *
113     * @param Event e The event object that caused the execution
114     */
115    treehandler: function(e){
116        if(e.target.src){ // is it an image?
117            acl.treetoggle(e.target);
118        } else if(e.target.href){ // is it a link?
119            // remove highlighting
120            jQuery('#acl__tree a.cur').removeClass('cur');
121
122            var link = jQuery(e.target);
123
124            // add new highlighting
125            link.addClass('cur');
126
127            // set new page to detail form
128            var frm = jQuery('#acl__detail form')[0];
129            if(link.hasClass('wikilink1')){
130                jQuery('#acl__detail form input[name=ns]').val('');
131                jQuery('#acl__detail form input[name=id]').val(acl.parseatt(link[0].search)['id']);
132            }else if(link.hasClass('idx_dir')){
133                jQuery('#acl__detail form input[name=ns]').val(acl.parseatt(link[0].search)['ns']);
134                jQuery('#acl__detail form input[name=id]').val('');
135            }
136            acl.loadinfo();
137        }
138
139        e.stopPropagation();
140        e.preventDefault();
141        return false;
142    }
143
144};
145
146jQuery(acl.init);
147