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