xref: /dokuwiki/lib/scripts/media.js (revision cb5d414667f275f3cf88f62f30eb7de9d943835a)
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    params_toarray: function (str) {
686        var vars = [], hash;
687        var hashes = str.split('&');
688        for(var i = 0; i < hashes.length; i++) {
689            hash = hashes[i].split('=');
690            vars[hash[0]] = hash[1];
691        }
692        return vars;
693    },
694
695    init_ajax_uploader: function () {
696        if (!jQuery('#mediamanager__uploader').length) return;
697        if (jQuery('.qq-upload-list').length) return;
698
699        var params = dw_mediamanager.form_params(jQuery('#dw__upload'))+'&call=mediaupload';
700        params = dw_mediamanager.params_toarray(params);
701
702        var uploader = new qq.FileUploaderExtended({
703            element: document.getElementById('mediamanager__uploader'),
704            action: DOKU_BASE + 'lib/exe/ajax.php',
705            params: params
706        });
707    },
708
709    prepare_content: function ($content) {
710        // hide syntax example
711        $content.find('div.example:visible').hide();
712    },
713
714    /**
715     * shows the popup for a image link
716     */
717    select: function(event){
718        var $link, id, dot, ext;
719
720        event.preventDefault();
721
722        $link = jQuery(this);
723        id = $link.attr('name').substr(2);
724
725        if(!opener){
726            // if we don't run in popup display example
727            // the id's are a bit wierd and jQuery('#ex_wiki_dokuwiki-128.png')
728            // will not be found by Sizzle (the CSS Selector Engine
729            // used by jQuery), hence the document.getElementById() call
730            jQuery(document.getElementById('ex_'+id.replace(/:/g,'_').replace(/^_/,''))).dw_toggle();
731            return;
732        }
733
734        dw_mediamanager.ext = false;
735        dot = id.lastIndexOf(".");
736
737        if (-1 === dot) {
738            dw_mediamanager.insert(id);
739            return;
740        }
741
742        ext = id.substr(dot);
743
744        if ({'.jpg':1, '.jpeg':1, '.png':1, '.gif':1, '.swf':1}[ext] !== 1) {
745            dw_mediamanager.insert(id);
746            return;
747        }
748
749        // remove old callback from the insert button and set the new one.
750        jQuery('#media__sendbtn').unbind().click(bind(dw_mediamanager.insert, id));
751
752        dw_mediamanager.unforbid('ext');
753        if (ext === '.swf') {
754            dw_mediamanager.ext = 'swf';
755            dw_mediamanager.forbid('ext', {link: ['1', '2'],
756                                           size: ['4']});
757        } else {
758            dw_mediamanager.ext = 'img';
759        }
760
761        // Set to defaults
762        dw_mediamanager.setOpt('link');
763        dw_mediamanager.setOpt('align');
764        dw_mediamanager.setOpt('size');
765
766        // toggle buttons for detail and linked image, original size
767        jQuery('#media__linkbtn1, #media__linkbtn2, #media__sizebtn4')
768            .toggle(dw_mediamanager.ext === 'img');
769
770        dw_mediamanager.$popup.dialog('open');
771
772        jQuery('#media__sendbtn').focus();
773    },
774
775    /**
776     * Deletion confirmation dialog to the delete buttons.
777     *
778     * @author Michael Klier <chi@chimeric.de>
779     * @author Pierre Spring <pierre.spring@caillou.ch>
780     */
781    confirmattach: function(e){
782        if(!confirm(LANG.del_confirm + "\n" + jQuery(this).attr('title'))) {
783            e.preventDefault();
784        }
785    },
786
787    /**
788     * Creates checkboxes for additional options
789     *
790     * @author Andreas Gohr <andi@splitbrain.org>
791     * @author Pierre Spring <pierre.spring@caillou.ch>
792     */
793    attachoptions: function(){
794        var $obj, opts;
795
796        $obj = jQuery('#media__opts');
797        if($obj.length === 0) {
798            return;
799        }
800
801        opts = [];
802        // keep open
803        if(opener){
804            opts.push(['keepopen', 'keepopen']);
805        }
806        opts.push(['hide', 'hidedetails']);
807
808        jQuery.each(opts,
809                    function(_, opt) {
810                        var $box, $lbl;
811                        $box = jQuery(document.createElement('input'))
812                                 .attr('type', 'checkbox')
813                                 .attr('id', 'media__' + opt[0])
814                                 .click(bind(dw_mediamanager.toggleOption,
815                                             opt[0]));
816
817                        if(DokuCookie.getValue(opt[0])){
818                            $box.prop('checked', true);
819                            dw_mediamanager[opt[0]] = true;
820                        }
821
822                        $lbl = jQuery(document.createElement('label'))
823                                 .attr('for', 'media__' + opt[0])
824                                 .text(LANG[opt[1]]);
825
826                        $obj.append($box, $lbl, document.createElement('br'));
827                    });
828
829        dw_mediamanager.updatehide();
830    },
831
832    /**
833     * Generalized toggler
834     *
835     * @author Pierre Spring <pierre.spring@caillou.ch>
836     */
837    toggleOption: function (variable) {
838        if (jQuery(this).prop('checked')) {
839            DokuCookie.setValue(variable, 1);
840            dw_mediamanager[variable] = true;
841        } else {
842            DokuCookie.setValue(variable, '');
843            dw_mediamanager[variable] = false;
844        }
845        if (variable === 'hide') {
846            dw_mediamanager.updatehide();
847        }
848    },
849
850    /**
851     * Sets the visibility of the image details accordingly to the
852     * chosen hide state
853     *
854     * @author Andreas Gohr <andi@splitbrain.org>
855     */
856    updatehide: function(){
857        jQuery('#media__content div.detail').dw_toggle(!dw_mediamanager.hide);
858    },
859
860    /**
861     * set media insertion option
862     *
863     * @author Dominik Eckelmann <eckelmann@cosmocode.de>
864     */
865    setOpt: function(opt, e){
866        var val, i;
867        if (typeof e !== 'undefined') {
868            val = this.id.substring(this.id.length - 1);
869        } else {
870            val = dw_mediamanager.getOpt(opt);
871        }
872
873        if (val === false) {
874            DokuCookie.setValue(opt,'');
875            dw_mediamanager[opt] = false;
876            return;
877        }
878
879        if (opt === 'link') {
880            if (val !== '4' && dw_mediamanager.link === '4') {
881                dw_mediamanager.unforbid('linkonly');
882                dw_mediamanager.setOpt('align');
883                dw_mediamanager.setOpt('size');
884            } else if (val === '4') {
885                dw_mediamanager.forbid('linkonly', {align: false, size: false});
886            }
887
888            jQuery("#media__size, #media__align").dw_toggle(val !== '4');
889        }
890
891        DokuCookie.setValue(opt, val);
892        dw_mediamanager[opt] = val;
893
894        for (i = 1; i <= 4; i++) {
895            jQuery("#media__" + opt + "btn" + i).removeClass('selected');
896        }
897        jQuery('#media__' + opt + 'btn' + val).addClass('selected');
898    },
899
900    unforbid: function (group) {
901        delete dw_mediamanager.forbidden_opts[group];
902    },
903
904    forbid: function (group, forbids) {
905        dw_mediamanager.forbidden_opts[group] = forbids;
906    },
907
908    allowedOpt: function (opt, val) {
909        var ret = true;
910        jQuery.each(dw_mediamanager.forbidden_opts,
911                    function (_, forbids) {
912                        ret = forbids[opt] !== false &&
913                              jQuery.inArray(val, forbids[opt]) === -1;
914                        return ret;
915                    });
916        return ret;
917    },
918
919    getOpt: function (opt) {
920        var allowed = bind(dw_mediamanager.allowedOpt, opt);
921
922        // Current value
923        if (dw_mediamanager[opt] !== false && allowed(dw_mediamanager[opt])) {
924            return dw_mediamanager[opt];
925        }
926
927        // From cookie
928        if (DokuCookie.getValue(opt) && allowed(DokuCookie.getValue(opt))) {
929            return DokuCookie.getValue(opt);
930        }
931
932        // size default
933        if (opt === 'size' && allowed('2')) {
934            return '2';
935        }
936
937        // Whatever is allowed, and be it false
938        return jQuery.grep(['1', '2', '3', '4'], allowed)[0] || false;
939    }
940};
941
942// moved from helpers.js temporarily here
943/**
944 * Very simplistic Flash plugin check, probably works for Flash 8 and higher only
945 *
946 */
947function hasFlash(version){
948    var ver = 0, axo;
949    try{
950        if(navigator.plugins !== null && navigator.plugins.length > 0){
951           ver = navigator.plugins["Shockwave Flash"].description.split(' ')[2].split('.')[0];
952        }else{
953           axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
954           ver = axo.GetVariable("$version").split(' ')[1].split(',')[0];
955        }
956    }catch(e){ }
957
958    return ver >= version;
959}
960
961jQuery(dw_mediamanager.init);
962