1superacl = {
2    init: function(){
3        this.ctl = $('superacl_manager');
4        if(!this.ctl) return;
5
6        var sel = $('acl__user').getElementsByTagName('select')[0];
7
8        addEvent(sel,'change',superacl.userselhandler);
9        addEvent($('acl__tree'),'click',superacl.treehandler);
10        addEvent($('acl__user').getElementsByTagName('input')[1],'click',superacl.loadinfo);
11        addEvent($('acl__user').getElementsByTagName('input')[1],'keypress',superacl.loadinfo);
12
13        addEvent($('acl__filter'),'click',superacl.filterhandler);
14    },
15
16
17    /**
18     * Handle user dropdown
19     */
20    userselhandler: function(e){
21        // make entry field visible/invisible
22        if(this.value == '__g__' || this.value == '__u__'){
23            $('acl__user').getElementsByTagName('input')[0].style.display = ''; //acl_w
24            $('acl__user').getElementsByTagName('input')[1].style.display = ''; //submit
25        }else{
26            $('acl__user').getElementsByTagName('input')[0].style.display = 'none';
27            $('acl__user').getElementsByTagName('input')[1].style.display = 'none';
28        }
29
30        superacl.loadinfo();
31    },
32
33    /**
34     * Load the current permission info and edit form
35     *
36     * @param frm - Form element with needed data
37     */
38    loadinfo: function(){
39        // get form
40        var frm = $('acl__detail').getElementsByTagName('form')[0];
41
42        // prepare an AJAX call
43        var ajax = new sack(DOKU_BASE + 'lib/plugins/superacl2/ajax.php');
44        ajax.AjaxFailedAlert = '';
45        ajax.encodeURIString = false;
46        if(ajax.failed) return true;
47
48        // prepare data
49        var data = Array();
50        data[0] = ajax.encVar('ns',frm.elements['ns'].value);
51        data[1] = ajax.encVar('id',frm.elements['id'].value);
52        data[2] = ajax.encVar('acl_t',frm.elements['acl_t'].value);
53        data[3] = ajax.encVar('acl_w',frm.elements['acl_w'].value);
54        data[4] = ajax.encVar('ajax','info');
55
56        ajax.elementObj = $('acl__info');
57
58        ajax.runAJAX(data.join('&'));
59        return false;
60    },
61
62    /**
63     * parse URL attributes into a associative array
64     *
65     * @todo put into global script lib?
66     */
67    parseatt: function(str){
68        if(str[0] == '?') str = str.substr(1);
69        var attributes = {};
70        var all = str.split('&');
71        for(var i=0; i<all.length; i++){
72            var att = all[i].split('=');
73            attributes[att[0]] = decodeURIComponent(att[1]);
74        }
75        return attributes;
76    },
77
78    /**
79     * htmlspecialchars equivalent
80     *
81     * @todo put in gloabl scripts lib?
82     */
83    hsc: function(str) {
84        str = str.replace(/&/g,"&amp;");
85        str = str.replace(/\"/g,"&quot;");
86        str = str.replace(/\'/g,"&#039;");
87        str = str.replace(/</g,"&lt;");
88        str = str.replace(/>/g,"&gt;");
89        return str;
90    },
91
92
93    /**
94     * Open or close a subtree using AJAX
95     *
96     * @author Andreas Gohr <andi@splitbrain.org>
97     */
98    treetoggle: function(clicky){
99        var listitem = clicky.parentNode.parentNode;
100
101        // if already open, close by removing the sublist
102        var sublists = listitem.getElementsByTagName('ul');
103        if(sublists.length){
104            listitem.removeChild(sublists[0]);
105            clicky.src = DOKU_BASE+'lib/images/plus.gif';
106            clicky.alt = '+';
107            return false;
108        }
109
110        // get the enclosed link (is always the first one)
111        var link = listitem.getElementsByTagName('a')[0];
112
113        // prepare an AJAX call to fetch the subtree
114        var ajax = new sack(DOKU_BASE + 'lib/plugins/superacl2/ajax.php');
115        ajax.AjaxFailedAlert = '';
116        ajax.encodeURIString = false;
117        if(ajax.failed) return true;
118
119        //prepare the new ul
120        var ul = document.createElement('ul');
121        listitem.appendChild(ul);
122        ajax.elementObj = ul;
123        ajax.runAJAX(link.search.substr(1)+'&ajax=tree');
124        clicky.src = DOKU_BASE+'lib/images/minus.gif';
125        return false;
126    },
127
128    /**
129     * Handles all clicks in the tree, dispatching the right action based on the
130     * clicked element
131     */
132    treehandler: function(e){
133        if(e.target.src){ // is it an image?
134            superacl.treetoggle(e.target);
135        } else if(e.target.href){ // is it a link?
136            // remove highlighting
137            var obj = getElementsByClass('cur',$('acl__tree'),'a')[0];
138            if(obj) obj.className = obj.className.replace(/ cur/,'');
139
140            // add new highlighting
141            e.target.className += ' cur';
142
143            // set new page to detail form
144            var frm = $('acl__detail').getElementsByTagName('form')[0];
145            if(e.target.className.search(/wikilink1/) > -1){
146                frm.elements['ns'].value = '';
147                frm.elements['id'].value = superacl.hsc(superacl.parseatt(e.target.search)['id']);
148            }else if(e.target.className.search(/idx_dir/) > -1){
149                frm.elements['ns'].value = superacl.hsc(superacl.parseatt(e.target.search)['ns']);
150                frm.elements['id'].value = '';
151            }
152
153            superacl.loadinfo();
154	    	if (! $('acl__filter').checked)
155	    	  superacl.filter_tablerows();
156        }
157
158        e.stopPropagation();
159        e.preventDefault();
160        return false;
161    },
162
163    /**
164     * Handles clicks on the "filter" checkbox
165     */
166
167    filterhandler: function(e) {
168	    var frm = $('acl__detail').getElementsByTagName('form')[0];
169
170    	if ($('acl__filter').checked) {
171    	  superacl.show_all_tablerows();
172    	  frm.elements['acl__filter'].value = $('acl__filter').value;
173    	} else {
174    	  superacl.filter_tablerows();
175    	  frm.elements['acl__filter'].value = "";
176    	}
177    },
178
179    /**
180     * Shows all html_table rows
181     */
182    show_all_tablerows: function() {
183      window.setTimeout(function() {
184	      var rows = $('acl__htmltable').getElementsByTagName('tr');
185	      for ( i = 1; i < rows.length; i++) {
186	        rows[i].className = "";
187	      }
188      },10);
189    },
190
191    /**
192     * Only shows rows matching to the current namespace/page selected
193     */
194     filter_tablerows: function() {
195     	window.setTimeout(function() {
196
197	        var frm = $('acl__detail').getElementsByTagName('form')[0];
198	        var ns = frm.elements['ns'].value;
199	        if(! ns) {
200	          ns = frm.elements['id'].value;
201	          ns = ns.substr(0,ns.lastIndexOf(':'));
202	        }
203	        if (ns =="*")
204	          ns = "";
205
206	        var rows = $('acl__htmltable').getElementsByTagName('tr');
207	        for ( i = 1; i < rows.length; i++) {
208	          var isNs = (rows[i].firstChild.firstChild.className == "aclns");
209	          var id = rows[i].firstChild.firstChild.innerHTML;
210	          id = id.substr(0,id.lastIndexOf(':'));
211
212	          var show;
213	          if (! isNs) {
214	            show = (id == ns);
215	          } else {
216	            show = (ns.substr(0,id.length) == id);
217	          }
218
219	          if (show)
220	            rows[i].className = "";
221	          else
222	            rows[i].className = "hidden";
223	        }
224
225	     },10);
226
227     }
228
229
230};
231
232addInitEvent(superacl.init);
233