~ubuntu-branches/ubuntu/quantal/dokuwiki/quantal

« back to all changes in this revision

Viewing changes to lib/scripts/media.js

  • Committer: Package Import Robot
  • Author(s): Tanguy Ortolo
  • Date: 2012-01-26 23:10:28 UTC
  • mfrom: (1.1.14) (19.1.3 experimental)
  • Revision ID: package-import@ubuntu.com-20120126231028-gdcxrxo3j4jqp2de
Tags: 0.0.20120125-1
* New upstream release.
* debian/patches/debianize.diff: updated for the new release.

Show diffs side-by-side

added added

removed removed

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