1/** 2 * JavaScript functionality for the media management popup 3 * 4 * @author Andreas Gohr <andi@splitbrain.org> 5 * @author Pierre Spring <pierre.spring@caillou.ch> 6 */ 7 8var dw_mediamanager = { 9 keepopen: false, 10 hide: false, 11 popup: false, 12 display: false, 13 ext: false, 14 $popup: null, 15 16 // Image insertion opts 17 align: false, 18 link: false, 19 size: false, 20 forbidden_opts: {}, 21 22 // File list view type 23 view: false, 24 25 layout_width: 0, 26 layout_height: 0, 27 28 init: function () { 29 var $content, $tree; 30 $content = jQuery('#media__content'); 31 $tree = jQuery('#media__tree'); 32 33 dw_mediamanager.prepare_content($content); 34 35 dw_mediamanager.attachoptions(); 36 dw_mediamanager.initpopup(); 37 38 // add the action to autofill the "upload as" field 39 $content.delegate('#upload__file', 'change', dw_mediamanager.suggest) 40 // Attach the image selector action to all links 41 .delegate('a.select', 'click', dw_mediamanager.select) 42 // Attach deletion confirmation dialog to the delete buttons 43 .delegate('#media__content a.btn_media_delete', 'click', 44 dw_mediamanager.confirmattach) 45 .delegate('#mediamanager__done_form', 'submit', dw_mediamanager.list); 46 47 $tree.dw_tree({toggle_selector: 'img', 48 load_data: function (show_sublist, $clicky) { 49 // get the enclosed link (is always the first one) 50 var $link = $clicky.parent().find('div.li a.idx_dir'); 51 52 jQuery.post( 53 DOKU_BASE + 'lib/exe/ajax.php', 54 $link[0].search.substr(1) + '&call=medians', 55 show_sublist, 56 'html' 57 ); 58 }, 59 60 toggle_display: function ($clicky, opening) { 61 $clicky.attr('src', 62 DOKU_BASE + 'lib/images/' + 63 (opening ? 'minus' : 'plus') + '.gif'); 64 }}); 65 $tree.delegate('a', 'click', dw_mediamanager.list); 66 67 dw_mediamanager.set_filelist_view(dw_mediamanager.view, false); 68 69 dw_mediamanager.init_options(); 70 71 dw_mediamanager.image_diff(); 72 dw_mediamanager.init_ajax_uploader(); 73 74 console.log(jQuery('#mediamanager__page div.filelist').find('div.panelContent a')); 75 // changing opened tab in the file list panel 76 jQuery('#mediamanager__page div.filelist').delegate('ul.tabs a', 'click', dw_mediamanager.list) 77 // loading file details 78 .delegate('div.panelContent a', 'click', dw_mediamanager.details) 79 // search form 80 .delegate('#dw__mediasearch', 'submit', dw_mediamanager.list) 81 // "upload as" field autofill 82 .delegate('#upload__file', 'change', dw_mediamanager.suggest) 83 // uploaded images 84 .delegate('.qq-upload-file a', 'click', dw_mediamanager.details); 85 86 // changing opened tab in the file details panel 87 jQuery('#mediamanager__page div.file').delegate('ul.tabs a', 'click', dw_mediamanager.details) 88 // "update new version" button 89 .delegate('#mediamanager__btn_update', 'submit', dw_mediamanager.list) 90 // revisions form 91 .delegate('#page__revisions', 'submit', dw_mediamanager.details) 92 .delegate('#page__revisions a', 'click', dw_mediamanager.details) 93 // meta edit form 94 .delegate('#mediamanager__save_meta', 'submit', dw_mediamanager.details) 95 // delete button 96 .delegate('#mediamanager__btn_delete', 'submit', dw_mediamanager.details) 97 // "restore this version" button 98 .delegate('#mediamanager__btn_restore', 'submit', dw_mediamanager.details) 99 // less/more recent buttons in media revisions form 100 .delegate('.btn_newer, .btn_older', 'submit', dw_mediamanager.details); 101 102 }, 103 104 init_options: function () { 105 var $options = jQuery('div.filelist div.panelHeader form.options'), 106 $listType, $sortBy; 107 if ($options.length === 0) { 108 return; 109 } 110 111 $listType = $options.find('li.listType'); 112 $sortBy = $options.find('li.sortBy'); 113 114 // Remove the submit button 115 $options.find('input[type=submit]').parent().hide(); 116 117 // Prepare HTML for jQuery UI buttonset 118 $listType.add($sortBy).find('label').each(function () { 119 var $this = jQuery(this); 120 $this.children('input').appendTo($this.parent()); 121 $this.find('span span').addClass('a11y'); 122 }); 123 124 // Init buttonset 125 $listType.add($sortBy).buttonset(); 126 127 // Change handlers 128 $listType.children('input').change(function (event) { 129 event.preventDefault(); 130 dw_mediamanager.set_filelist_view(this.value, true); 131 }); 132 $sortBy.children('input').change(dw_mediamanager.list); 133 }, 134 135 /** 136 * build the popup window 137 * 138 * @author Dominik Eckelmann <eckelmann@cosmocode.de> 139 */ 140 initpopup: function () { 141 var opts, $insp, $insbtn; 142 143 dw_mediamanager.$popup = jQuery(document.createElement('div')) 144 .attr('id', 'media__popup_content') 145 .dialog({autoOpen: false, width: 280, modal: true, 146 draggable: true, title: LANG.mediatitle, 147 resizable: false}); 148 149 opts = [{id: 'link', label: LANG.mediatarget, 150 btns: ['lnk', 'direct', 'nolnk', 'displaylnk']}, 151 {id: 'align', label: LANG.mediaalign, 152 btns: ['noalign', 'left', 'center', 'right']}, 153 {id: 'size', label: LANG.mediasize, 154 btns: ['small', 'medium', 'large', 'original']} 155 ]; 156 157 jQuery.each(opts, function (_, opt) { 158 var $p, $l; 159 $p = jQuery(document.createElement('p')) 160 .attr('id', 'media__' + opt.id); 161 162 if (dw_mediamanager.display === "2") { 163 $p.hide(); 164 } 165 166 $l = jQuery(document.createElement('label')) 167 .text(opt.label); 168 $p.append($l); 169 170 jQuery.each(opt.btns, function (i, text) { 171 var $btn, $img; 172 $btn = jQuery(document.createElement('button')) 173 .addClass('button') 174 .attr('id', "media__" + opt.id + "btn" + (i + 1)) 175 .attr('title', LANG['media' + text]) 176 .click(bind(dw_mediamanager.setOpt, opt.id)); 177 178 $img = jQuery(document.createElement('img')) 179 .attr('src', DOKU_BASE + 'lib/images/media_' + 180 opt.id + '_' + text + '.png'); 181 182 $btn.append($img); 183 $p.append($btn); 184 }); 185 186 dw_mediamanager.$popup.append($p); 187 }); 188 189 // insert button 190 $insp = jQuery(document.createElement('p')); 191 dw_mediamanager.$popup.append($insp); 192 193 $insbtn = jQuery(document.createElement('input')) 194 .attr('id', 'media__sendbtn') 195 .attr('type', 'button') 196 .addClass('button') 197 .val(LANG.mediainsert); 198 $insp.append($insbtn); 199 }, 200 201 /** 202 * Insert the clicked image into the opener's textarea 203 * 204 * @author Andreas Gohr <andi@splitbrain.org> 205 * @author Dominik Eckelmann <eckelmann@cosmocode.de> 206 * @author Pierre Spring <pierre.spring@caillou.ch> 207 */ 208 insert: function (id) { 209 var opts, alignleft, alignright, edid, s; 210 211 // set syntax options 212 dw_mediamanager.$popup.dialog('close'); 213 214 opts = ''; 215 alignleft = ''; 216 alignright = ''; 217 218 if ({img: 1, swf: 1}[dw_mediamanager.ext] === 1) { 219 220 if (dw_mediamanager.link === '4') { 221 opts = '?linkonly'; 222 } else { 223 224 if (dw_mediamanager.link === "3" && dw_mediamanager.ext === 'img') { 225 opts = '?nolink'; 226 } else if (dw_mediamanager.link === "2" && dw_mediamanager.ext === 'img') { 227 opts = '?direct'; 228 } 229 230 s = parseInt(dw_mediamanager.size, 10); 231 232 if (s && s >= 1 && s < 4) { 233 opts += (opts.length)?'&':'?'; 234 opts += dw_mediamanager.size + '00'; 235 if (dw_mediamanager.ext === 'swf') { 236 switch (s) { 237 case 1: 238 opts += 'x62'; 239 break; 240 case 2: 241 opts += 'x123'; 242 break; 243 case 3: 244 opts += 'x185'; 245 break; 246 } 247 } 248 } 249 alignleft = dw_mediamanager.align === '2' ? '' : ' '; 250 alignright = dw_mediamanager.align === '4' ? '' : ' '; 251 } 252 } 253 edid = String.prototype.match.call(document.location, /&edid=([^&]+)/); 254 opener.insertTags(edid ? edid[1] : 'wiki__text', 255 '{{'+alignleft+id+opts+alignright+'|','}}',''); 256 257 if(!dw_mediamanager.keepopen) { 258 window.close(); 259 } 260 opener.focus(); 261 return false; 262 }, 263 264 /** 265 * Prefills the wikiname. 266 * 267 * @author Andreas Gohr <andi@splitbrain.org> 268 */ 269 suggest: function(){ 270 var $file, $name, text; 271 272 $file = jQuery(this); 273 $name = jQuery('#upload__name'); 274 275 if ($name.val() != '') return; 276 277 if(!$file.length || !$name.length) { 278 return; 279 } 280 281 text = $file.val(); 282 text = text.substr(text.lastIndexOf('/')+1); 283 text = text.substr(text.lastIndexOf('\\')+1); 284 $name.val(text); 285 }, 286 287 /** 288 * list the content of a namespace using AJAX 289 * 290 * @author Andreas Gohr <andi@splitbrain.org> 291 * @author Pierre Spring <pierre.spring@caillou.ch> 292 */ 293 list: function (event) { 294 var $link, $content, params; 295 $link = jQuery(this); 296 297 event.preventDefault(); 298 299 jQuery('div.success, div.info, div.error, div.notify').remove(); 300 301 if (document.getElementById('media__content')) { 302 //popup 303 $content = jQuery('#media__content'); 304 } else { 305 //fullscreen media manager 306 $content = jQuery('div.filelist'); 307 308 if ($link.hasClass('idx_dir')) { 309 //changing namespace 310 jQuery('div.file').empty(); 311 jQuery('div.namespaces .selected').removeClass('selected'); 312 $link.addClass('selected'); 313 } 314 } 315 316 params = ''; 317 318 if ($link[0].search) { 319 params = $link[0].search.substr(1)+'&call=medialist'; 320 } else if ($link[0].action) { 321 params = dw_mediamanager.form_params($link)+'&call=medialist'; 322 } else if ($link.parents('form')) { 323 params = dw_mediamanager.form_params($link.parents('form'))+'&call=medialist'; 324 325 if ($link.parents('form').hasClass('options')) { 326 DokuCookie.setValue('sort', $link.val()); 327 params += '&q=' + $link.val(); 328 params += '&mediado=searchlist'; 329 } 330 } 331 332 // fetch the subtree 333 dw_mediamanager.update_content($content, params); 334 335 if (document.getElementById('media__content')) { 336 //popup 337 $content = jQuery('#media__content'); 338 $content.html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />'); 339 } else { 340 //fullscreen media manager 341 jQuery('div.panelContent', $content).html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />'); 342 } 343 }, 344 345 /** 346 * Returns form parameters 347 * 348 * @author Kate Arzamastseva <pshns@ukr.net> 349 */ 350 form_params: function ($form) { 351 if (!$form.length) return; 352 var elements = $form.serialize(); 353 var action = ''; 354 var i = $form[0].action.indexOf('?'); 355 if (i >= 0) action = $form[0].action.substr(i+1); 356 return elements+'&'+action; 357 }, 358 359 set_filelist_view: function (type, cookies) { 360 type = type || DokuCookie.getValue('view'); 361 362 jQuery('div.filelist div.panelContent ul') 363 .toggleClass('rows', type === 'rows') 364 .toggleClass('thumbs', type === 'thumbs'); 365 366 if (cookies) { 367 DokuCookie.setValue('view', type); 368 } 369 dw_mediamanager.view = type; 370 }, 371 372 /** 373 * Lists the content of the right column (image details) using AJAX 374 * 375 * @author Kate Arzamastseva <pshns@ukr.net> 376 */ 377 details: function (event) { 378 var $link, $content, params, update_list; 379 $link = jQuery(this); 380 event.preventDefault(); 381 382 jQuery('div.success, div.info, div.error, div.notify').remove(); 383 384 if ($link[0].id == 'mediamanager__btn_delete' && !confirm(LANG['del_confirm'])) return false; 385 if ($link[0].id == 'mediamanager__btn_restore' && !confirm(LANG['restore_confirm'])) return false; 386 387 $content = jQuery('div.file'); 388 params = ''; 389 390 if ($link[0].search) { 391 params = $link[0].search.substr(1)+'&call=mediadetails'; 392 } else if ($link[0].action) { 393 params = dw_mediamanager.form_params($link)+'&call=mediadetails'; 394 } else if ($link.parents('form')) { 395 params = dw_mediamanager.form_params($link.parents('form'))+'&call=mediadetails'; 396 } 397 398 update_list = ($link[0].id == 'mediamanager__btn_delete' || $link[0].id == 'mediamanager__btn_restore'); 399 dw_mediamanager.update_content($content, params, update_list); 400 401 if (jQuery('div.panelContent', $content).length) { 402 jQuery('div.panelContent', $content).html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />'); 403 } else { 404 jQuery($content).html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />'); 405 } 406 }, 407 408 update_content: function ($content, params, update_list) { 409 jQuery.post( 410 DOKU_BASE + 'lib/exe/ajax.php', 411 params, 412 function (data) { 413 dw_mediamanager.$resizables().resizable('destroy'); 414 415 $content.html(data); 416 417 dw_mediamanager.prepare_content($content); 418 dw_mediamanager.updatehide(); 419 420 dw_mediamanager.update_resizable(); 421 dw_behaviour.revisionBoxHandler(); 422 dw_mediamanager.set_filelist_view(dw_mediamanager.view, false); 423 dw_mediamanager.image_diff(); 424 dw_mediamanager.init_ajax_uploader(); 425 dw_mediamanager.init_options(); 426 427 if (update_list) { 428 var $link1, $content1, params1; 429 $link1 = jQuery('a.files'); 430 params1 = $link1[0].search.substr(1)+'&call=medialist'; 431 $content1 = jQuery('div.filelist'); 432 dw_mediamanager.update_content($content1, params1); 433 jQuery('div.panelContent', $content1).html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />'); 434 } 435 }, 436 'html' 437 ); 438 }, 439 440 window_resize: function () { 441 if (jQuery('#mediamanager__page').width() == dw_mediamanager.layout_width) { 442 return; 443 } 444 445 dw_mediamanager.layout_width = jQuery('#mediamanager__page').width(); 446 $r = jQuery("#mediamanager__page div.panel"); 447 448 var w = 0, wSum = 0, mCount = 0, mArray = []; 449 $r.each(function() { 450 w = jQuery(this).width(); 451 if (w == parseFloat(jQuery(this).css("min-width"))) { 452 wSum += w; 453 } else { 454 mArray[mCount] = jQuery(this); 455 mCount++; 456 } 457 }); 458 459 if (mCount > 0) { 460 var width = (0.95 * jQuery('#mediamanager__page').width() - wSum - 30); 461 wSum = 0; 462 for(var i = 0; i < mArray.length; i++) { 463 wSum += mArray[i].width(); 464 } 465 for(var i = 0; i < mArray.length; i++) { 466 w = mArray[i].width(); 467 w = 100*w / wSum; 468 mArray[i].width(width*w/100); 469 } 470 } 471 472 $r.each(function() { 473 w = jQuery(this).width(); 474 w = (100 * w / jQuery('#mediamanager__page').width()); 475 w += "%"; 476 jQuery(this).width(w); 477 }); 478 479 var windowHeight = jQuery(window).height(); 480 var height = windowHeight - 300; 481 if (layout_height < height) { 482 layout_height = height; 483 jQuery('#mediamanager__page div.panelContent').height(height); 484 dw_mediamanager.$resizables().height(height+100); 485 } 486 487 dw_mediamanager.opacity_slider(); 488 dw_mediamanager.portions_slider(); 489 }, 490 491 $resizables: function () { 492 return jQuery('#mediamanager__page').find('div.namespaces, div.filelist'); 493 }, 494 495 /** 496 * Updates mediamanager layout 497 * 498 * @author Kate Arzamastseva <pshns@ukr.net> 499 */ 500 update_resizable: function () { 501 $resizables = dw_mediamanager.$resizables(); 502 503 $resizables.resizable({ handles: 'e' , 504 resize: function(event, ui){ 505 var w = 0; 506 $resizables.each(function() { 507 w += jQuery(this).width(); 508 }); 509 wSum = w + parseFloat(jQuery('#mediamanager__page div.file').css("min-width")); 510 511 // max width of resizable column 512 var maxWidth = 0.95 * jQuery('#mediamanager__page').width() - wSum + jQuery(this).width() - 30; 513 $resizables.resizable( "option", "maxWidth", maxWidth ); 514 515 // percentage width of the first two columns 516 var wLeft = ( 100*(w+30) / jQuery('#mediamanager__page').width() ); 517 518 // width of the third column 519 var wRight = 95-wLeft; 520 wRight += "%"; 521 jQuery('#mediamanager__page div.file').width(wRight); 522 523 $resizables.each(function() { 524 w = jQuery(this).width(); 525 w = (100 * w / jQuery('#mediamanager__page').width()); 526 w += "%"; 527 jQuery(this).width(w); 528 }); 529 530 dw_mediamanager.opacity_slider(); 531 dw_mediamanager.portions_slider(); 532 } 533 }); 534 535 var windowHeight = jQuery(window).height(); 536 var height = windowHeight - 300; 537 layout_height = height; 538 jQuery('#mediamanager__page .panelContent').height(height); 539 $resizables.height(height+100); 540 }, 541 542 /** 543 * Prints 'select' for image difference representation type 544 * 545 * @author Kate Arzamastseva <pshns@ukr.net> 546 */ 547 image_diff: function () { 548 if (jQuery('#mediamanager__difftype').length) return; 549 550 $form = jQuery('#mediamanager__form_diffview'); 551 if (!$form.length) return; 552 553 $label = jQuery(document.createElement('label')); 554 $label.append('<span>'+LANG.media_diff+'</span>'); 555 $select = jQuery(document.createElement('select')) 556 .attr('id', 'mediamanager__difftype') 557 .attr('name', 'difftype') 558 .change(dw_mediamanager.change_diff_type); 559 $select.append(new Option(LANG.media_diff_both, "both")); 560 $select.append(new Option(LANG.media_diff_opacity, "opacity")); 561 $select.append(new Option(LANG.media_diff_portions, "portions")); 562 $label.append($select); 563 $form.append($label); 564 565 // for IE 566 var select = document.getElementById('mediamanager__difftype'); 567 select.options[0].text = LANG.media_diff_both; 568 select.options[1].text = LANG.media_diff_opacity; 569 select.options[2].text = LANG.media_diff_portions; 570 }, 571 572 /** 573 * Handles selection of image difference representation type 574 * 575 * @author Kate Arzamastseva <pshns@ukr.net> 576 */ 577 change_diff_type: function () { 578 $select = jQuery('#mediamanager__difftype'); 579 $content = jQuery('#mediamanager__diff'); 580 581 params = dw_mediamanager.form_params($select.parents('form'))+'&call=mediadiff'; 582 jQuery.post( 583 DOKU_BASE + 'lib/exe/ajax.php', 584 params, 585 function (data) { 586 $content.html(data); 587 dw_mediamanager.portions_slider(); 588 dw_mediamanager.opacity_slider(); 589 }, 590 'html' 591 ); 592 }, 593 594 /** 595 * Sets options for opacity diff slider 596 * 597 * @author Kate Arzamastseva <pshns@ukr.net> 598 */ 599 opacity_slider: function () { 600 var $slider = jQuery( "#mediamanager__diff div.diff_slider" ); 601 if (!$slider.length) return; 602 603 var $image = jQuery('#mediamanager__diff div.diff_opacity div.image1 img'); 604 if (!$image.length) return; 605 $slider.width($image.width()-20); 606 607 $slider.slider(); 608 $slider.slider("option", "min", 0); 609 $slider.slider("option", "max", 0.999); 610 $slider.slider("option", "step", 0.001); 611 $slider.slider("option", "value", 0.5); 612 $slider.bind("slide", function(event, ui) { 613 jQuery('#mediamanager__diff div.diff_opacity div.image2 img').css({ opacity: $slider.slider("option", "value")}); 614 }); 615 }, 616 617 /** 618 * Sets options for red line diff slider 619 * 620 * @author Kate Arzamastseva <pshns@ukr.net> 621 */ 622 portions_slider: function () { 623 var $image1 = jQuery('#mediamanager__diff div.diff_portions div.image1 img'); 624 var $image2 = jQuery('#mediamanager__diff div.diff_portions div.image2 img'); 625 if (!$image1.length || !$image2.length) return; 626 627 var $div = jQuery("#mediamanager__diff_layout"); 628 if (!$div.length) return; 629 630 $div.width('100%'); 631 $image2.parent().width('97%'); 632 $image1.width('100%'); 633 $image2.width('100%'); 634 635 if ($image1.width() < $div.width()) { 636 $div.width($image1.width()); 637 } 638 639 $image2.parent().width('50%'); 640 $image2.width($image1.width()); 641 $image1.width($image1.width()); 642 643 var $slider = jQuery("#mediamanager__diff div.diff_slider"); 644 if (!$slider.length) return; 645 $slider.width($image1.width()-20); 646 647 $slider.slider(); 648 $slider.slider("option", "min", 0); 649 $slider.slider("option", "max", 97); 650 $slider.slider("option", "step", 1); 651 $slider.slider("option", "value", 50); 652 $slider.bind("slide", function(event, ui) { 653 jQuery('#mediamanager__diff div.diff_portions div.image2').css({ width: $slider.slider("option", "value")+'%'}); 654 }); 655 }, 656 657 params_toarray: function (str) { 658 var vars = [], hash; 659 var hashes = str.split('&'); 660 for(var i = 0; i < hashes.length; i++) { 661 hash = hashes[i].split('='); 662 vars[hash[0]] = hash[1]; 663 } 664 return vars; 665 }, 666 667 init_ajax_uploader: function () { 668 if (!jQuery('#mediamanager__uploader').length) return; 669 if (jQuery('.qq-upload-list').length) return; 670 671 var params = dw_mediamanager.form_params(jQuery('#dw__upload'))+'&call=mediaupload'; 672 params = dw_mediamanager.params_toarray(params); 673 674 var uploader = new qq.FileUploaderExtended({ 675 element: document.getElementById('mediamanager__uploader'), 676 action: DOKU_BASE + 'lib/exe/ajax.php', 677 params: params 678 }); 679 }, 680 681 prepare_content: function ($content) { 682 // hide syntax example 683 $content.find('div.example:visible').hide(); 684 }, 685 686 /** 687 * shows the popup for a image link 688 */ 689 select: function(event){ 690 var $link, id, dot, ext; 691 692 event.preventDefault(); 693 694 $link = jQuery(this); 695 id = $link.attr('name').substr(2); 696 697 if(!opener){ 698 // if we don't run in popup display example 699 // the id's are a bit wierd and jQuery('#ex_wiki_dokuwiki-128.png') 700 // will not be found by Sizzle (the CSS Selector Engine 701 // used by jQuery), hence the document.getElementById() call 702 jQuery(document.getElementById('ex_'+id.replace(/:/g,'_').replace(/^_/,''))).dw_toggle(); 703 return; 704 } 705 706 dw_mediamanager.ext = false; 707 dot = id.lastIndexOf("."); 708 709 if (-1 === dot) { 710 dw_mediamanager.insert(id); 711 return; 712 } 713 714 ext = id.substr(dot); 715 716 if ({'.jpg':1, '.jpeg':1, '.png':1, '.gif':1, '.swf':1}[ext] !== 1) { 717 dw_mediamanager.insert(id); 718 return; 719 } 720 721 // remove old callback from the insert button and set the new one. 722 jQuery('#media__sendbtn').unbind().click(bind(dw_mediamanager.insert, id)); 723 724 dw_mediamanager.unforbid('ext'); 725 if (ext === '.swf') { 726 dw_mediamanager.ext = 'swf'; 727 dw_mediamanager.forbid('ext', {link: ['1', '2'], 728 size: ['4']}); 729 } else { 730 dw_mediamanager.ext = 'img'; 731 } 732 733 // Set to defaults 734 dw_mediamanager.setOpt('link'); 735 dw_mediamanager.setOpt('align'); 736 dw_mediamanager.setOpt('size'); 737 738 // toggle buttons for detail and linked image, original size 739 jQuery('#media__linkbtn1, #media__linkbtn2, #media__sizebtn4') 740 .toggle(dw_mediamanager.ext === 'img'); 741 742 dw_mediamanager.$popup.dialog('open'); 743 744 jQuery('#media__sendbtn').focus(); 745 }, 746 747 /** 748 * Deletion confirmation dialog to the delete buttons. 749 * 750 * @author Michael Klier <chi@chimeric.de> 751 * @author Pierre Spring <pierre.spring@caillou.ch> 752 */ 753 confirmattach: function(e){ 754 if(!confirm(LANG.del_confirm + "\n" + jQuery(this).attr('title'))) { 755 e.preventDefault(); 756 } 757 }, 758 759 /** 760 * Creates checkboxes for additional options 761 * 762 * @author Andreas Gohr <andi@splitbrain.org> 763 * @author Pierre Spring <pierre.spring@caillou.ch> 764 */ 765 attachoptions: function(){ 766 var $obj, opts; 767 768 $obj = jQuery('#media__opts'); 769 if($obj.length === 0) { 770 return; 771 } 772 773 opts = []; 774 // keep open 775 if(opener){ 776 opts.push(['keepopen', 'keepopen']); 777 } 778 opts.push(['hide', 'hidedetails']); 779 780 jQuery.each(opts, 781 function(_, opt) { 782 var $box, $lbl; 783 $box = jQuery(document.createElement('input')) 784 .attr('type', 'checkbox') 785 .attr('id', 'media__' + opt[0]) 786 .click(bind(dw_mediamanager.toggleOption, 787 opt[0])); 788 789 if(DokuCookie.getValue(opt[0])){ 790 $box.prop('checked', true); 791 dw_mediamanager[opt[0]] = true; 792 } 793 794 $lbl = jQuery(document.createElement('label')) 795 .attr('for', 'media__' + opt[0]) 796 .text(LANG[opt[1]]); 797 798 $obj.append($box, $lbl, document.createElement('br')); 799 }); 800 801 dw_mediamanager.updatehide(); 802 }, 803 804 /** 805 * Generalized toggler 806 * 807 * @author Pierre Spring <pierre.spring@caillou.ch> 808 */ 809 toggleOption: function (variable) { 810 if (jQuery(this).prop('checked')) { 811 DokuCookie.setValue(variable, 1); 812 dw_mediamanager[variable] = true; 813 } else { 814 DokuCookie.setValue(variable, ''); 815 dw_mediamanager[variable] = false; 816 } 817 if (variable === 'hide') { 818 dw_mediamanager.updatehide(); 819 } 820 }, 821 822 initFlashUpload: function () { 823 var $oform, $oflash; 824 if(!hasFlash(8)) { 825 return; 826 } 827 828 $oform = jQuery('#dw__upload'); 829 $oflash = jQuery('#dw__flashupload'); 830 831 if(!$oform.length || !$oflash.length) { 832 return; 833 } 834 835 jQuery(document.createElement('img')) 836 .attr('src', DOKU_BASE+'lib/images/multiupload.png') 837 .attr('title', LANG.mu_btn) 838 .attr('alt', LANG.mu_btn) 839 .css('cursor', 'pointer') 840 .click( 841 function () { 842 $oform.hide(); 843 $oflash.show(); 844 } 845 ) 846 .appendTo($oform); 847 }, 848 849 /** 850 * Sets the visibility of the image details accordingly to the 851 * chosen hide state 852 * 853 * @author Andreas Gohr <andi@splitbrain.org> 854 */ 855 updatehide: function(){ 856 jQuery('#media__content div.detail').dw_toggle(!dw_mediamanager.hide); 857 }, 858 859 /** 860 * set media insertion option 861 * 862 * @author Dominik Eckelmann <eckelmann@cosmocode.de> 863 */ 864 setOpt: function(opt, e){ 865 var val, i; 866 if (typeof e !== 'undefined') { 867 val = this.id.substring(this.id.length - 1); 868 } else { 869 val = dw_mediamanager.getOpt(opt); 870 } 871 872 if (val === false) { 873 DokuCookie.setValue(opt,''); 874 dw_mediamanager[opt] = false; 875 return; 876 } 877 878 if (opt === 'link') { 879 if (val !== '4' && dw_mediamanager.link === '4') { 880 dw_mediamanager.unforbid('linkonly'); 881 dw_mediamanager.setOpt('align'); 882 dw_mediamanager.setOpt('size'); 883 } else if (val === '4') { 884 dw_mediamanager.forbid('linkonly', {align: false, size: false}); 885 } 886 887 jQuery("#media__size, #media__align").dw_toggle(val !== '4'); 888 } 889 890 DokuCookie.setValue(opt, val); 891 dw_mediamanager[opt] = val; 892 893 for (i = 1; i <= 4; i++) { 894 jQuery("#media__" + opt + "btn" + i).removeClass('selected'); 895 } 896 jQuery('#media__' + opt + 'btn' + val).addClass('selected'); 897 }, 898 899 unforbid: function (group) { 900 delete dw_mediamanager.forbidden_opts[group]; 901 }, 902 903 forbid: function (group, forbids) { 904 dw_mediamanager.forbidden_opts[group] = forbids; 905 }, 906 907 allowedOpt: function (opt, val) { 908 var ret = true; 909 jQuery.each(dw_mediamanager.forbidden_opts, 910 function (_, forbids) { 911 ret = forbids[opt] !== false && 912 jQuery.inArray(val, forbids[opt]) === -1; 913 return ret; 914 }); 915 return ret; 916 }, 917 918 getOpt: function (opt) { 919 var allowed = bind(dw_mediamanager.allowedOpt, opt); 920 921 // Current value 922 if (dw_mediamanager[opt] !== false && allowed(dw_mediamanager[opt])) { 923 return dw_mediamanager[opt]; 924 } 925 926 // From cookie 927 if (DokuCookie.getValue(opt) && allowed(DokuCookie.getValue(opt))) { 928 return DokuCookie.getValue(opt); 929 } 930 931 // size default 932 if (opt === 'size' && allowed('2')) { 933 return '2'; 934 } 935 936 // Whatever is allowed, and be it false 937 return jQuery.grep(['1', '2', '3', '4'], allowed)[0] || false; 938 } 939}; 940 941// moved from helpers.js temporarily here 942/** 943 * Very simplistic Flash plugin check, probably works for Flash 8 and higher only 944 * 945 */ 946function hasFlash(version){ 947 var ver = 0, axo; 948 try{ 949 if(navigator.plugins !== null && navigator.plugins.length > 0){ 950 ver = navigator.plugins["Shockwave Flash"].description.split(' ')[2].split('.')[0]; 951 }else{ 952 axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); 953 ver = axo.GetVariable("$version").split(' ')[1].split(',')[0]; 954 } 955 }catch(e){ } 956 957 return ver >= version; 958} 959 960jQuery(document).ready(function() { 961 dw_mediamanager.update_resizable(); 962 dw_mediamanager.layout_width = jQuery("#mediamanager__page").width(); 963 jQuery(window).resize(dw_mediamanager.window_resize); 964}); 965 966jQuery(dw_mediamanager.init); 967