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