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,"&"); 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 * @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