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