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,"&"); 85 str = str.replace(/\"/g,"""); 86 str = str.replace(/\'/g,"'"); 87 str = str.replace(/</g,"<"); 88 str = str.replace(/>/g,">"); 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