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