xref: /dokuwiki/lib/scripts/media.js (revision 6183fb05112cd318d9a6885d9405cff9917ee82f)
1/*jslint white: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: false, strict: true, newcap: true, immed: true */
2/*global jQuery, window, DOKU_BASE*/
3"use strict";
4
5// * refactor once the jQuery port is over ;)
6
7/**
8 * JavaScript functionality for the media management popup
9 *
10 * @author Andreas Gohr <andi@splitbrain.org>
11 * @author Pierre Spring <pierre.spring@caillou.ch>
12 */
13(function ($) {
14    var toggle, list, prepare_content, insert, confirmattach, attachoptions, initpopup, updatehide, setalign, setsize, inSet, outSet, media_manager, hasFlash, form_params, list_view, details, update_content;
15
16    var media_manager = {
17        keepopen: false,
18        hide: false,
19        align: false,
20        popup: false,
21        display: false,
22        link: false,
23        size: false,
24        ext: false,
25    };
26
27
28
29
30    /**
31     * build the popup window
32     *
33     * @author Dominik Eckelmann <eckelmann@cosmocode.de>
34     */
35    initpopup = function() {
36        var popup;
37
38        popup = document.createElement('div');
39        popup.setAttribute('id','media__popup');
40        popup.style.display = "none";
41
42        var root = document.getElementById('media__manager');
43        if (root === null) return;
44        root.appendChild(popup);
45
46        var headline    = document.createElement('h1');
47        headline.innerHTML = LANG.mediatitle;
48        var headlineimg = document.createElement('img');
49        headlineimg.src = DOKU_BASE + 'lib/images/close.png';
50        headlineimg.id  = 'media__closeimg';
51        $(headlineimg).click(function () {$(popup).hide()});
52        headline.insertBefore(headlineimg, headline.firstChild);
53        popup.appendChild(headline);
54        $(popup).draggable({handle: headline});
55
56        // link
57        var linkp = document.createElement('p');
58
59        linkp.id = "media__linkstyle";
60        if (media_manager.display == "2") {
61            linkp.style.display = "none";
62        }
63
64        var linkl = document.createElement('label');
65        linkl.innerHTML = LANG.mediatarget;
66        linkp.appendChild(linkl);
67
68        var linkbtns = ['lnk', 'direct', 'nolnk', 'displaylnk'];
69        for (var i = 0 ; i < linkbtns.length ; ++i) {
70            var linkbtn = document.createElement('button');
71            linkbtn.className = 'button';
72            linkbtn.id    = "media__linkbtn" + (i+1);
73            linkbtn.title = LANG['media' + linkbtns[i]];
74            linkbtn.style.borderStyle = 'outset';
75            $(linkbtn).click(function (event) { return setlink(event,this); });
76
77            var linkimg = document.createElement('img');
78            linkimg.src = DOKU_BASE + 'lib/images/media_link_' + linkbtns[i] + '.png';
79
80            linkbtn.appendChild(linkimg);
81            linkp.appendChild(linkbtn);
82        }
83
84        popup.appendChild(linkp);
85
86        // align
87
88        var alignp    = document.createElement('p');
89        var alignl    = document.createElement('label');
90
91        alignp.appendChild(alignl);
92        alignp.id = 'media__align';
93        if (media_manager.display == "2") {
94            alignp.style.display = "none";
95        }
96        alignl.innerHTML = LANG['mediaalign'];
97
98        var alignbtns = ['noalign', 'left', 'center', 'right'];
99        for (var n = 0 ; n < alignbtns.length ; ++n) {
100            var alignbtn = document.createElement('button');
101            var alignimg = document.createElement('img');
102            alignimg.src = DOKU_BASE + 'lib/images/media_align_' + alignbtns[n] + '.png';
103
104            alignbtn.id    = "media__alignbtn" + (n+1);
105            alignbtn.title = LANG['media' + alignbtns[n]];
106            alignbtn.className = 'button';
107            alignbtn.appendChild(alignimg);
108            alignbtn.style.borderStyle = 'outset';
109            $(alignbtn).click(function (event) { return setalign(event,this); });
110
111            alignp.appendChild(alignbtn);
112        }
113
114        popup.appendChild(alignp);
115
116        // size
117
118        var sizep    = document.createElement('p');
119        var sizel    = document.createElement('label');
120
121        sizep.id = 'media__size';
122        if (media_manager.display == "2") {
123            sizep.style.display = "none";
124        }
125        sizep.appendChild(sizel);
126        sizel.innerHTML = LANG['mediasize'];
127
128        var sizebtns = ['small', 'medium', 'large', 'original'];
129        for (var size = 0 ; size < sizebtns.length ; ++size) {
130            var sizebtn = document.createElement('button');
131            var sizeimg = document.createElement('img');
132
133            sizep.appendChild(sizebtn);
134            sizeimg.src = DOKU_BASE + 'lib/images/media_size_' + sizebtns[size] + '.png';
135
136            sizebtn.className = 'button';
137            sizebtn.appendChild(sizeimg);
138            sizebtn.id    = 'media__sizebtn' + (size + 1);
139            sizebtn.title = LANG['media' + sizebtns[size]];
140            sizebtn.style.borderStyle = 'outset';
141            $(sizebtn).click(function (event) { return setsize(event,this); });
142        }
143
144        popup.appendChild(sizep);
145
146        // send and close button
147
148        var btnp = document.createElement('p');
149        popup.appendChild(btnp);
150        btnp.setAttribute('class','btnlbl');
151
152        var btn  = document.createElement('input');
153        btn.type = 'button';
154        btn.id   = 'media__sendbtn';
155        btn.setAttribute('class','button');
156        btn.value = LANG['mediainsert'];
157        btnp.appendChild(btn);
158    };
159
160    // moved from helpers.js temporarily here
161    /**
162     * Very simplistic Flash plugin check, probably works for Flash 8 and higher only
163     *
164     */
165    hasFlash = function(version){
166        var ver = 0;
167        try{
168            if(navigator.plugins != null && navigator.plugins.length > 0){
169               ver = navigator.plugins["Shockwave Flash"].description.split(' ')[2].split('.')[0];
170            }else{
171               var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
172               ver = axo.GetVariable("$version").split(' ')[1].split(',')[0];
173            }
174        }catch(e){ }
175
176        if(ver >= version) return true;
177        return false;
178    };
179
180    /**
181     * Insert the clicked image into the opener's textarea
182     *
183     * @author Andreas Gohr <andi@splitbrain.org>
184     * @author Dominik Eckelmann <eckelmann@cosmocode.de>
185     * @author Pierre Spring <pierre.spring@caillou.ch>
186     */
187    insert = function (id) {
188        var opts, optsstart, alignleft, alignright;
189
190        // set syntax options
191        $('#media__popup').hide();
192
193        opts = '';
194        optsstart = '';
195        alignleft = '';
196        alignright = '';
197
198        if (media_manager.ext == 'img' || media_manager.ext == 'swf') {
199
200            if (media_manager.link == '4') {
201                    opts = '?linkonly';
202            } else {
203
204                if (media_manager.link == "3" && media_manager.ext == 'img') {
205                    opts = '?nolink';
206                    optsstart = true;
207                } else if (media_manager.link == "2" && media_manager.ext == 'img') {
208                    opts = '?direct';
209                    optsstart = true;
210                }
211
212                var s = parseInt(media_manager.size, 10);
213
214                if (s && s >= 1) {
215                    opts += (optsstart)?'&':'?';
216                    if (s=="1") {
217                        opts += '100';
218                        if (media_manager.ext == 'swf') {
219                            opts += 'x62';
220                        }
221                    } else if (s=="2") {
222                        opts += '200';
223                        if (media_manager.ext == 'swf') {
224                            opts += 'x123';
225                        }
226                    } else if (s=="3"){
227                        opts += '300';
228                        if (media_manager.ext == 'swf') {
229                            opts += 'x185';
230                        }
231                    }
232                }
233                if (media_manager.align == '2') {
234                    alignleft = '';
235                    alignright = ' ';
236                }
237                if (media_manager.align == '3') {
238                    alignleft = ' ';
239                    alignright = ' ';
240                }
241                if (media_manager.align == '4') {
242                    alignleft = ' ';
243                    alignright = '';
244                }
245            }
246        }
247        var edid = String.prototype.match.call(document.location, /&edid=([^&]+)/);
248        edid = edid ? edid[1] : 'wiki__text';
249        opener.insertTags(edid,'{{'+alignleft+id+opts+alignright+'|','}}','');
250
251        if(!media_manager.keepopen) window.close();
252        opener.focus();
253        return false;
254    };
255
256    /**
257     * Prefills the wikiname.
258     *
259     * @author Andreas Gohr <andi@splitbrain.org>
260     */
261    suggest = function(){
262        var file, name, text;
263
264        file = $(this);
265        name = $('#upload__name');
266        if(!file.size() || !name.size()) return;
267
268        text = file.val();
269        text = text.substr(text.lastIndexOf('/')+1);
270        text = text.substr(text.lastIndexOf('\\')+1);
271        name.val(text);
272    };
273
274    /**
275     * Open or close a subtree using AJAX
276     *
277     * @author Andreas Gohr <andi@splitbrain.org>
278     * @author Pierre Spring <pierre.spring@caillou.ch>
279     */
280    toggle = function (event) {
281        var clicky, listitem, sublist, link, ul;
282
283        event.preventDefault(); // TODO: really here?
284
285        var clicky = $(this);
286        var listitem = clicky.parent();
287
288        // if already open, close by removing the sublist
289        sublist = listitem.find('ul').first();
290        if(sublist.size()){
291            sublist.remove(); // TODO: really? we could just hide it, right?
292            clicky.attr('src', DOKU_BASE + 'lib/images/plus.gif');
293            return;
294        }
295
296        // get the enclosed link (is always the first one)
297        link = listitem.find('a').first();
298
299        //prepare the new ul
300        ul = $('<ul/>');
301
302        //fixme add classname here
303
304        $.post(
305            DOKU_BASE + 'lib/exe/ajax.php',
306            link[0].search.substr(1) + '&call=medians',
307            function (data) {
308                ul.html(data);
309                listitem.append(ul);
310            },
311            'html'
312        );
313
314        clicky.attr('src', DOKU_BASE + 'lib/images/minus.gif');
315    };
316
317    /**
318     * list the content of a namespace using AJAX
319     *
320     * @author Andreas Gohr <andi@splitbrain.org>
321     * @author Pierre Spring <pierre.spring@caillou.ch>
322     */
323    list = function (event) {
324        var link, content, params;
325        link = $(this);
326
327        event.preventDefault();
328
329        jQuery('div.success, div.info, div.error, div.notify').remove();
330
331        if (document.getElementById('media__content')) {
332            //popup
333            content = $('#media__content');
334            content.html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />');
335
336        } else {
337            //fullscreen media manager
338            content = $('#mediamanager__layout_list');
339
340            if (link.hasClass('idx_dir')) {
341                //changing namespace
342                $('#mediamanager__layout_detail').empty();
343            }
344
345            $('.scroll-container', content).html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />');
346        }
347
348        params = '';
349
350        if (link[0].search) {
351            params = link[0].search.substr(1)+'&call=medialist';
352        } else if (link[0].action) {
353            params = form_params(link)+'&call=medialist';
354        }
355
356        // fetch the subtree
357        update_content(content, params);
358
359    };
360
361     /**
362     * Returns form parameters
363     *
364     * @author Kate Arzamastseva <pshns@ukr.net>
365     */
366    form_params = function (form) {
367        var elements = form.serialize();
368        var action = '';
369        var i = form[0].action.indexOf('?');
370        if (i >= 0) action = form[0].action.substr(i+1);
371        return elements+'&'+action;
372    };
373
374     /**
375     * Changes view of media files list
376     *
377     * @author Kate Arzamastseva <pshns@ukr.net>
378     */
379    list_view  = function (event) {
380        var link, content;
381        link = $(this);
382
383        event.preventDefault();
384
385        content = $('#mediamanager__file_list');
386        if (link.hasClass('mediamanager-link-thumbnails')) {
387            content.removeClass('mediamanager-list');
388            content.addClass('mediamanager-thumbs');
389        } else if (link.hasClass('mediamanager-link-list')) {
390            content.removeClass('mediamanager-thumbs');
391            content.addClass('mediamanager-list');
392        }
393    };
394
395     /**
396     * Lists the content of the right column (image details) using AJAX
397     *
398     * @author Kate Arzamastseva <pshns@ukr.net>
399     */
400    details = function (event) {
401        var link, content, params, update_list;
402        link = $(this);
403
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'])) return false;
409        if (link[0].id == 'mediamanager__btn_restore' && !confirm(LANG['restore_confirm'])) return false;
410
411        content = $('#mediamanager__layout_detail');
412        $('.scroll-container', content).html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />');
413
414        params = '';
415
416        if (link[0].search) {
417            params = link[0].search.substr(1)+'&call=mediadetails';
418        } else {
419            params = form_params(link)+'&call=mediadetails';
420        }
421
422        update_content(content, params);
423
424        update_list = (link[0].id == 'mediamanager__btn_delete' || link[0].id == 'mediamanager__btn_restore');
425        if (update_list) {
426            var link1, content1, params1;
427            link1 = $('a.files');
428            params1 = link1[0].search.substr(1)+'&call=medialist';
429            content1 = $('#mediamanager__layout_list');
430            $('.scroll-container', content1).html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />');
431
432            update_content(content1, params1);
433        }
434    };
435
436    update_content = function (content, params) {
437        $.post(
438            DOKU_BASE + 'lib/exe/ajax.php',
439            params,
440            function (data) {
441                content.html(data);
442            },
443            'html'
444        );
445    };
446
447    prepare_content = function (content) {
448        // hide syntax example
449        content.find('div.example:visible').hide();
450        initFlashUpload();
451    };
452
453    /**
454         * shows the popup for a image link
455         */
456        select = function(event){
457            var link, id, dot, ext;
458
459            event.preventDefault();
460
461            link = $(this);
462            id = link.attr('name').substr(2);
463
464            if(!opener){
465                // if we don't run in popup display example
466                // the id's are a bit wired and $('#ex_wiki_dokuwiki-128.png') will not be found
467                // by Sizzle (the CSS Selector Engine used by jQuery),
468                // hence the document.getElementById() call
469                $(document.getElementById('ex_'+id.replace(/:/g,'_').replace(/^_/,''))).toggle();
470                return;
471            }
472
473            link = link[0];
474
475            media_manager.ext = false;
476            dot = id.lastIndexOf(".");
477
478            if (-1 === dot) {
479                insert(id);
480                return;
481            }
482
483            ext = id.substr(dot);
484
485            if (ext != '.jpg' && ext != '.jpeg' && ext != '.png' && ext != '.gif' && ext != '.swf') {
486                insert(id);
487                return;
488            }
489
490            // remove old callback from the insert button and set the new one.
491            $('#media__sendbtn').unbind().click(function () {insert(id)});
492
493            $('#media__popup').show()
494                .css('left', event.pageX + 'px')
495                .css('top', event.pageY + 'px');
496
497            $('#media__popup button.button').each(function (index, element) { outSet(element) } );
498
499
500            if (ext == '.swf') {
501                media_manager.ext = 'swf';
502
503                // disable display buttons for detail and linked image
504                $('#media__linkbtn1').hide();
505                $('#media__linkbtn2').hide();
506
507                // set the link button to default
508                if (media_manager.link != false) {
509                    if ( media_manager.link == '2' || media_manager.link == '1')  {
510                        inSet('media__linkbtn3');
511                        media_manager.link = '3';
512                        DokuCookie.setValue('link','3');
513                    } else {
514                        inSet('media__linkbtn'+media_manager.link);
515                    }
516                } else if (DokuCookie.getValue('link')) {
517                    if ( DokuCookie.getValue('link') == '2' ||  DokuCookie.getValue('link') == '1')  {
518                        // this options are not availible
519                        inSet('media__linkbtn3');
520                        media_manager.link = '3';
521                        DokuCookie.setValue('link','3');
522                    } else {
523                        inSet('media__linkbtn'+DokuCookie.getValue('link'));
524                        media_manager.link = DokuCookie.getValue('link');
525                    }
526                } else {
527                    // default case
528                    media_manager.link = '3';
529                    inSet('media__linkbtn3');
530                    DokuCookie.setValue('link','3');
531                }
532
533                // disable button for original size
534                $('#media__sizebtn4').hide();
535
536            } else {
537                media_manager.ext = 'img';
538
539                // ensure that the display buttons are there
540                $('#media__linkbtn1').show();
541                $('#media__linkbtn2').show();
542                $('#media__sizebtn4').show();
543
544                // set the link button to default
545                if (DokuCookie.getValue('link')) {
546                    media_manager.link = DokuCookie.getValue('link');
547                }
548                if (media_manager.link == false) {
549                    // default case
550                    media_manager.link = '1';
551                    DokuCookie.setValue('link','1');
552                }
553                inSet('media__linkbtn'+media_manager.link);
554            }
555
556            if (media_manager.link == '4') {
557                media_manager.align = false;
558                media_manager.size = false;
559                $('#media__align').hide();
560                $('#media__size').hide();
561            } else {
562                $('#media__align').show();
563                $('#media__size').show();
564
565                // set the align button to default
566                if (media_manager.align != false) {
567                    inSet('media__alignbtn'+media_manager.align);
568                } else if (DokuCookie.getValue('align')) {
569                    inSet('media__alignbtn'+DokuCookie.getValue('align'));
570                    media_manager.align = DokuCookie.getValue('align');
571                } else {
572                    // default case
573                    media_manager.align = '0';
574                    inSet('media__alignbtn0');
575                    DokuCookie.setValue('align','0');
576                }
577
578                // set the size button to default
579                if (DokuCookie.getValue('size')) {
580                    media_manager.size = DokuCookie.getValue('size');
581                }
582                if (media_manager.size == false || (media_manager.size === '4' && ext === '.swf')) {
583                    // default case
584                    media_manager.size = '2';
585                    DokuCookie.setValue('size','2');
586                }
587                inSet('media__sizebtn'+media_manager.size);
588
589                $('#media__sendbtn').focus();
590            }
591
592           return;
593        };
594
595    /**
596     * Deletion confirmation dialog to the delete buttons.
597     *
598     * @author Michael Klier <chi@chimeric.de>
599     * @author Pierre Spring <pierre.spring@caillou.ch>
600     */
601    confirmattach = function(e){
602        if(!confirm(LANG['del_confirm'] + "\n" + jQuery(this).attr('title'))) {
603            e.preventDefault();
604        }
605    };
606
607    /**
608     * Creates checkboxes for additional options
609     *
610     * @author Andreas Gohr <andi@splitbrain.org>
611     * @author Pierre Spring <pierre.spring@caillou.ch>
612     */
613    attachoptions = function(){
614        obj = $('#media__opts')[0];
615        if(!obj) return;
616
617        // keep open
618        if(opener){
619            var kobox  = document.createElement('input');
620            kobox.type = 'checkbox';
621            kobox.id   = 'media__keepopen';
622            if(DokuCookie.getValue('keepopen')){
623                kobox.checked  = true;
624                kobox.defaultChecked = true; //IE wants this
625                media_manager.keepopen = true;
626            }
627
628            $(kobox).click(
629                function () {
630                    toggleOption(this, 'keepopen');
631                }
632            );
633
634            var kolbl  = document.createElement('label');
635            kolbl.htmlFor   = 'media__keepopen';
636            kolbl.innerHTML = LANG['keepopen'];
637
638            var kobr = document.createElement('br');
639
640            obj.appendChild(kobox);
641            obj.appendChild(kolbl);
642            obj.appendChild(kobr);
643        }
644
645        // hide details
646        var hdbox  = document.createElement('input');
647        hdbox.type = 'checkbox';
648        hdbox.id   = 'media__hide';
649        if(DokuCookie.getValue('hide')){
650            hdbox.checked = true;
651            hdbox.defaultChecked = true; //IE wants this
652            media_manager.hide    = true;
653        }
654        $(hdbox).click(
655            function () {
656                toggleOption(this, 'hide');
657                updatehide();
658            }
659        );
660
661        var hdlbl  = document.createElement('label');
662        hdlbl.htmlFor   = 'media__hide';
663        hdlbl.innerHTML = LANG['hidedetails'];
664
665        var hdbr = document.createElement('br');
666
667        obj.appendChild(hdbox);
668        obj.appendChild(hdlbl);
669        obj.appendChild(hdbr);
670        updatehide();
671    };
672
673    /**
674     * Generalized toggler
675     *
676     * @author Pierre Spring <pierre.spring@caillou.ch>
677     */
678    toggleOption = function (checkbox, variable) {
679        if (checkbox.checked) {
680            DokuCookie.setValue(variable, 1);
681            media_manager[variable] = true;
682        } else {
683            DokuCookie.setValue(variable, '');
684            media_manager[variable] = false;
685        }
686    };
687
688    initFlashUpload = function () {
689        var oform, oflash, title;
690        if(!hasFlash(8)) return;
691
692        oform  = $('#dw__upload');
693        oflash = $('#dw__flashupload');
694
695        if(!oform.size() || !oflash.size()) return;
696
697        title = LANG['mu_btn'];
698
699        $('<img/>').attr('src', DOKU_BASE+'lib/images/multiupload.png')
700            .attr('title', title)
701            .attr('alt', title)
702            .css('cursor', 'pointer')
703            .click(
704                function () {
705                    oform.hide();
706                    oflash.show();
707                }
708            )
709            .appendTo(oform);
710    };
711
712    /**
713     * Sets the visibility of the image details accordingly to the
714     * chosen hide state
715     *
716     * @author Andreas Gohr <andi@splitbrain.org>
717     */
718    updatehide = function(){
719        var content = $('#media__content');
720        if(0 === content.size()) {
721            return;
722        }
723        content.find('div.detail').each(
724            function (index, element) {
725                if(media_manager.hide){
726                    element.style.display = 'none';
727                }else{
728                    element.style.display = '';
729                }
730            }
731
732        );
733    };
734
735    /**
736     * set the align
737     *
738     * @author Dominik Eckelmann <eckelmann@cosmocode.de>
739     */
740    setalign = function(event,cb){
741
742        var id = cb.id.substring(cb.id.length -1);
743        if(id){
744            DokuCookie.setValue('align',id);
745            media_manager.align = id;
746            for (var i = 1; i<=4; i++) {
747                outSet("media__alignbtn" + i);
748            }
749            inSet("media__alignbtn"+id);
750        }else{
751            DokuCookie.setValue('align','');
752            media_manager.align = false;
753        }
754    };
755
756    /**
757     * set the link type
758     *
759     * @author Dominik Eckelmann <eckelmann@cosmocode.de>
760     */
761    setlink = function(event,cb){
762        var id = cb.id.substring(cb.id.length -1);
763        if(id){
764            DokuCookie.setValue('link',id);
765            for (var i = 1; i<=4; i++) {
766                outSet("media__linkbtn"+i);
767            }
768            inSet("media__linkbtn"+id);
769
770            var size = $("#media__size");
771            var align = $("#media__align");
772            if (id != '4') {
773                size.show();
774                align.show();
775                if (media_manager.link == '4') {
776                    media_manager.align = '1';
777                    DokuCookie.setValue('align', '1');
778                    inSet('media__alignbtn1');
779
780                    media_manager.size = '2';
781                    DokuCookie.setValue('size', '2');
782                    inSet('media__sizebtn2');
783                }
784
785            } else {
786                size.hide();
787                align.hide();
788            }
789            media_manager.link = id;
790        }else{
791            DokuCookie.setValue('link','');
792            media_manager.link = false;
793        }
794    };
795
796    /**
797     * set the image size
798     *
799     * @author Dominik Eckelmann <eckelmann@cosmocode.de>
800     */
801    setsize = function(event,cb){
802        var id = cb.id.substring(cb.id.length -1);
803        if (id) {
804            DokuCookie.setValue('size',id);
805            media_manager.size = id;
806            for (var i = 1 ; i <=4 ; ++i) {
807                outSet("media__sizebtn" + i);
808            }
809            inSet("media__sizebtn"+id);
810        } else {
811            DokuCookie.setValue('size','');
812            media_manager.width = false;
813        }
814    };
815
816    /**
817     * sets the border to inset
818     */
819    inSet = function(id) {
820        var ele = $('#' + id).css('border-style', 'inset');
821    };
822
823    /**
824     * sets the border to outset
825     */
826    outSet = function(element) {
827        if ('string' === typeof element) {
828            element = '#' + element;
829        }
830        $(element).css('border-style', 'outset');
831    };
832
833    $(function () {
834        var content = $('#media__content');
835        prepare_content(content);
836
837        attachoptions();
838        initpopup();
839
840        // add the action to autofill the "upload as" field
841        content.delegate('#upload__file', 'change', suggest)
842            // Attach the image selector action to all links
843            .delegate('a.select', 'click', select)
844            // Attach deletion confirmation dialog to the delete buttons
845            .delegate('#media__content a.btn_media_delete', 'click', confirmattach);
846
847
848        $('#media__tree').delegate('img', 'click', toggle)
849            .delegate('a', 'click', list);
850
851        $('#mediamanager__layout_list').delegate('#mediamanager__tabs_files a', 'click', list)
852            .delegate('#mediamanager__tabs_list a', 'click', list_view)
853            .delegate('#mediamanager__file_list a', 'click', details)
854            .delegate('#dw__mediasearch', 'submit', list);
855
856        $('#mediamanager__layout_detail').delegate('#mediamanager__tabs_details a', 'click', details)
857            .delegate('#mediamanager__btn_update', 'submit', list)
858            .delegate('#page__revisions', 'submit', details)
859            .delegate('#page__revisions a', 'click', details)
860            .delegate('#mediamanager__save_meta', 'submit', details)
861            .delegate('#mediamanager__btn_delete', 'submit', details)
862            .delegate('#mediamanager__btn_restore', 'submit', details);
863    });
864}(jQuery));
865