1/** 2 * JavaScript functionalitiy for the media management popup 3 * 4 * @author Andreas Gohr <andi@splitbrain.org> 5 */ 6media = { 7 keepopen: false, 8 hide: false, 9 10 /** 11 * Attach event handlers to all "folders" below the given element 12 * 13 * @author Andreas Gohr <andi@splitbrain.org> 14 */ 15 treeattach: function(obj){ 16 if(!obj) return; 17 18 var items = obj.getElementsByTagName('li'); 19 for(var i=0; i<items.length; i++){ 20 var elem = items[i]; 21 22 // attach action to make the +/- clickable 23 var clicky = elem.getElementsByTagName('img')[0]; 24 clicky.style.cursor = 'pointer'; 25 addEvent(clicky,'click',function(event){ return media.toggle(event,this); }); 26 27 // attach action load folder list via AJAX 28 var link = elem.getElementsByTagName('a')[0]; 29 link.style.cursor = 'pointer'; 30 addEvent(link,'click',function(event){ return media.list(event,this); }); 31 } 32 }, 33 34 /** 35 * Attach the image selector action to all links below the given element 36 * also add the action to autofill the "upload as" field 37 * 38 * @author Andreas Gohr <andi@splitbrain.org> 39 */ 40 selectorattach: function(obj){ 41 if(!obj) return; 42 43 var items = getElementsByClass('select',obj,'a'); 44 for(var i=0; i<items.length; i++){ 45 var elem = items[i]; 46 elem.style.cursor = 'pointer'; 47 addEvent(elem,'click',function(event){ return media.select(event,this); }); 48 } 49 50 // hide syntax example 51 items = getElementsByClass('example',obj,'div'); 52 for(var i=0; i<items.length; i++){ 53 elem = items[i]; 54 elem.style.display = 'none'; 55 } 56 57 var file = $('upload__file'); 58 if(!file) return; 59 addEvent(file,'change',media.suggest); 60 }, 61 62 /** 63 * Attach deletion confirmation dialog to the delete buttons. 64 * 65 * Michael Klier <chi@chimeric.de> 66 */ 67 confirmattach: function(obj){ 68 if(!obj) return; 69 70 items = getElementsByClass('btn_media_delete',obj,'a'); 71 for(var i=0; i<items.length; i++){ 72 var elem = items[i]; 73 addEvent(elem,'click',function(e){ 74 if(e.target.tagName == 'IMG'){ 75 var name = e.target.parentNode.title; 76 }else{ 77 var name = e.target.title; 78 } 79 if(!confirm(LANG['del_confirm'] + "\n" + name)) { 80 e.preventDefault(); 81 return false; 82 } else { 83 return true; 84 } 85 }); 86 } 87 }, 88 89 /** 90 * Creates checkboxes for additional options 91 * 92 * @author Andreas Gohr <andi@splitbrain.org> 93 */ 94 attachoptions: function(obj){ 95 if(!obj) return; 96 97 // search link 98 var searcha = document.createElement('a'); 99 searcha.id = 'media__search'; 100 searcha.href = '#'; 101 addEvent(searcha,'click',function(event){ return media.showsearchfield(event,this); }); 102 103 var searchlbl = document.createElement('label'); 104 searchlbl.htmlFor = 'media__searchmedia'; 105 searchlbl.innerHTML = LANG['searchmedia']; 106 107 var searchbr = document.createElement('br'); 108 109 searcha.appendChild(searchlbl); 110 obj.appendChild(searcha); 111 obj.appendChild(searchbr); 112 113 // keep open 114 if(opener){ 115 var kobox = document.createElement('input'); 116 kobox.type = 'checkbox'; 117 kobox.id = 'media__keepopen'; 118 if(DokuCookie.getValue('keepopen')){ 119 kobox.checked = true; 120 kobox.defaultChecked = true; //IE wants this 121 media.keepopen = true; 122 } 123 addEvent(kobox,'click',function(event){ return media.togglekeepopen(event,this); }); 124 125 var kolbl = document.createElement('label'); 126 kolbl.htmlFor = 'media__keepopen'; 127 kolbl.innerHTML = LANG['keepopen']; 128 129 var kobr = document.createElement('br'); 130 131 obj.appendChild(kobox); 132 obj.appendChild(kolbl); 133 obj.appendChild(kobr); 134 } 135 136 // hide details 137 var hdbox = document.createElement('input'); 138 hdbox.type = 'checkbox'; 139 hdbox.id = 'media__hide'; 140 if(DokuCookie.getValue('hide')){ 141 hdbox.checked = true; 142 hdbox.defaultChecked = true; //IE wants this 143 media.hide = true; 144 } 145 addEvent(hdbox,'click',function(event){ return media.togglehide(event,this); }); 146 147 var hdlbl = document.createElement('label'); 148 hdlbl.htmlFor = 'media__hide'; 149 hdlbl.innerHTML = LANG['hidedetails']; 150 151 var hdbr = document.createElement('br'); 152 153 obj.appendChild(hdbox); 154 obj.appendChild(hdlbl); 155 obj.appendChild(hdbr); 156 media.updatehide(); 157 }, 158 159 /** 160 * Opens the searchfield 161 * 162 * @author Tobias Sarnowski <sarnowski@cosmocode.de> 163 */ 164 showsearchfield: function(event,link){ 165 // prepare an AJAX call to fetch the search 166 var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php'); 167 ajax.AjaxFailedAlert = ''; 168 ajax.encodeURIString = false; 169 if(ajax.failed) return true; 170 171 cleanMsgArea(); 172 173 var content = $('media__content'); 174 content.innerHTML = '<img src="'+DOKU_BASE+'lib/images/loading.gif" alt="..." class="load" />'; 175 176 ajax.elementObj = content; 177 ajax.afterCompletion = function(){ 178 media.selectorattach(content); 179 media.confirmattach(content); 180 media.updatehide(); 181 }; 182 ajax.runAJAX(link.search.substr(1)+'&call=mediasearchlist'); 183 return false; 184 }, 185 186 /** 187 * Toggles the keep open state 188 * 189 * @author Andreas Gohr <andi@splitbrain.org> 190 */ 191 togglekeepopen: function(event,cb){ 192 if(cb.checked){ 193 DokuCookie.setValue('keepopen',1); 194 media.keepopen = true; 195 }else{ 196 DokuCookie.setValue('keepopen',''); 197 media.keepopen = false; 198 } 199 }, 200 201 /** 202 * Toggles the hide details state 203 * 204 * @author Andreas Gohr <andi@splitbrain.org> 205 */ 206 togglehide: function(event,cb){ 207 if(cb.checked){ 208 DokuCookie.setValue('hide',1); 209 media.hide = true; 210 }else{ 211 DokuCookie.setValue('hide',''); 212 media.hide = false; 213 } 214 media.updatehide(); 215 }, 216 217 /** 218 * Sets the visibility of the image details accordingly to the 219 * chosen hide state 220 * 221 * @author Andreas Gohr <andi@splitbrain.org> 222 */ 223 updatehide: function(){ 224 var obj = $('media__content'); 225 if(!obj) return; 226 var details = getElementsByClass('detail',obj,'div'); 227 for(var i=0; i<details.length; i++){ 228 if(media.hide){ 229 details[i].style.display = 'none'; 230 }else{ 231 details[i].style.display = ''; 232 } 233 } 234 }, 235 236 /** 237 * Insert the clicked image into the opener's textarea 238 * 239 * @author Andreas Gohr <andi@splitbrain.org> 240 */ 241 select: function(event,link){ 242 var id = link.name.substr(2); 243 244 if(!opener){ 245 // if we don't run in popup display example 246 var ex = $('ex_'+id.replace(/:/g,'_')); 247 if(ex.style.display == ''){ 248 ex.style.display = 'none'; 249 }else{ 250 ex.style.display = ''; 251 } 252 return false; 253 } 254 opener.insertTags('wiki__text','{{'+id+'|','}}',''); 255 256 if(!media.keepopen) window.close(); 257 opener.focus(); 258 return false; 259 }, 260 261 /** 262 * list the content of a namespace using AJAX 263 * 264 * @author Andreas Gohr <andi@splitbrain.org> 265 */ 266 list: function(event,link){ 267 // prepare an AJAX call to fetch the subtree 268 var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php'); 269 ajax.AjaxFailedAlert = ''; 270 ajax.encodeURIString = false; 271 if(ajax.failed) return true; 272 273 cleanMsgArea(); 274 275 var content = $('media__content'); 276 content.innerHTML = '<img src="'+DOKU_BASE+'lib/images/loading.gif" alt="..." class="load" />'; 277 278 ajax.elementObj = content; 279 ajax.afterCompletion = function(){ 280 media.selectorattach(content); 281 media.confirmattach(content); 282 media.updatehide(); 283 media.initFlashUpload(); 284 }; 285 ajax.runAJAX(link.search.substr(1)+'&call=medialist'); 286 return false; 287 }, 288 289 290 /** 291 * Open or close a subtree using AJAX 292 * 293 * @author Andreas Gohr <andi@splitbrain.org> 294 */ 295 toggle: function(event,clicky){ 296 var listitem = clicky.parentNode; 297 298 // if already open, close by removing the sublist 299 var sublists = listitem.getElementsByTagName('ul'); 300 if(sublists.length){ 301 listitem.removeChild(sublists[0]); 302 clicky.src = DOKU_BASE+'lib/images/plus.gif'; 303 return false; 304 } 305 306 // get the enclosed link (is always the first one) 307 var link = listitem.getElementsByTagName('a')[0]; 308 309 // prepare an AJAX call to fetch the subtree 310 var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php'); 311 ajax.AjaxFailedAlert = ''; 312 ajax.encodeURIString = false; 313 if(ajax.failed) return true; 314 315 //prepare the new ul 316 var ul = document.createElement('ul'); 317 //fixme add classname here 318 listitem.appendChild(ul); 319 ajax.elementObj = ul; 320 ajax.afterCompletion = function(){ media.treeattach(ul); }; 321 ajax.runAJAX(link.search.substr(1)+'&call=medians'); 322 clicky.src = DOKU_BASE+'lib/images/minus.gif'; 323 return false; 324 }, 325 326 /** 327 * Prefills the wikiname. 328 * 329 * @author Andreas Gohr <andi@splitbrain.org> 330 */ 331 suggest: function(){ 332 var file = $('upload__file'); 333 var name = $('upload__name'); 334 if(!file || !name) return; 335 336 var text = file.value; 337 text = text.substr(text.lastIndexOf('/')+1); 338 text = text.substr(text.lastIndexOf('\\')+1); 339 name.value = text; 340 }, 341 342 343 initFlashUpload: function(){ 344 if(!hasFlash(8)) return; 345 var oform = $('dw__upload'); 346 var oflash = $('dw__flashupload'); 347 if(!oform || !oflash) return; 348 349 var clicky = document.createElement('img'); 350 clicky.src = DOKU_BASE+'lib/images/multiupload.png'; 351 clicky.title = LANG['mu_btn']; 352 clicky.alt = LANG['mu_btn']; 353 clicky.style.cursor = 'pointer'; 354 clicky.onclick = function(){ 355 oform.style.display = 'none'; 356 oflash.style.display = ''; 357 }; 358 oform.appendChild(clicky); 359 } 360}; 361 362addInitEvent(function(){ 363 media.treeattach($('media__tree')); 364 media.selectorattach($('media__content')); 365 media.confirmattach($('media__content')); 366 media.attachoptions($('media__opts')); 367 media.initFlashUpload(); 368}); 369