diff options
author | Adrian Lang <mail@adrianlang.de> | 2011-11-10 15:43:15 +0100 |
---|---|---|
committer | Adrian Lang <mail@adrianlang.de> | 2011-11-10 15:43:15 +0100 |
commit | 16a774a8a61756df2d8fb813bfbaed98b42e3e65 (patch) | |
tree | 3a48d311e74ccbf4017330cef8af00003b0ddb34 /lib/scripts/media.js | |
parent | 662a7b3fcc22d8327026bc1ef161a096683f1580 (diff) | |
parent | a5a71ecfcc1ed6bfca1995b39cd0abe4b8dd9eeb (diff) | |
download | rpg-16a774a8a61756df2d8fb813bfbaed98b42e3e65.tar.gz rpg-16a774a8a61756df2d8fb813bfbaed98b42e3e65.tar.bz2 |
Merge branch 'master' into stable
Conflicts:
doku.php
Diffstat (limited to 'lib/scripts/media.js')
-rw-r--r-- | lib/scripts/media.js | 1379 |
1 files changed, 767 insertions, 612 deletions
diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 57f599163..7f5514f56 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -2,778 +2,933 @@ * JavaScript functionality for the media management popup * * @author Andreas Gohr <andi@splitbrain.org> + * @author Pierre Spring <pierre.spring@caillou.ch> */ -var media_manager = { + +var dw_mediamanager = { keepopen: false, hide: false, - align: false, popup: false, - id: false, display: false, - link: false, - size: false, ext: false, + $popup: null, - /** - * Attach event handlers to all "folders" below the given element - * - * @author Andreas Gohr <andi@splitbrain.org> - */ - treeattach: function(obj){ - if(!obj) return; - - var items = obj.getElementsByTagName('li'); - for(var i=0; i<items.length; i++){ - var elem = items[i]; - - // attach action to make the +/- clickable - var clicky = elem.getElementsByTagName('img')[0]; - clicky.style.cursor = 'pointer'; - addEvent(clicky,'click',function(event){ return media_manager.toggle(event,this); }); + // Image insertion opts + align: false, + link: false, + size: false, + forbidden_opts: {}, + + // File list options + view_opts: {list: false, sort: false}, + + layout_width: 0, + + // The minimum height of the full-screen mediamanager in px + minHeights: {thumbs: 200, rows: 100}, + + init: function () { + var $content, $tree; + $content = jQuery('#media__content'); + $tree = jQuery('#media__tree'); + + dw_mediamanager.prepare_content($content); + + dw_mediamanager.attachoptions(); + dw_mediamanager.initpopup(); + + // add the action to autofill the "upload as" field + $content.delegate('#upload__file', 'change', dw_mediamanager.suggest) + // Attach the image selector action to all links + .delegate('a.select', 'click', dw_mediamanager.select) + // Attach deletion confirmation dialog to the delete buttons + .delegate('#media__content a.btn_media_delete', 'click', + dw_mediamanager.confirmattach) + .delegate('#mediamanager__done_form', 'submit', dw_mediamanager.list); + + $tree.dw_tree({toggle_selector: 'img', + load_data: function (show_sublist, $clicky) { + // get the enclosed link (is always the first one) + var $link = $clicky.parent().find('div.li a.idx_dir'); + + jQuery.post( + DOKU_BASE + 'lib/exe/ajax.php', + $link[0].search.substr(1) + '&call=medians', + show_sublist, + 'html' + ); + }, + + toggle_display: function ($clicky, opening) { + $clicky.attr('src', + DOKU_BASE + 'lib/images/' + + (opening ? 'minus' : 'plus') + '.gif'); + }}); + $tree.delegate('a', 'click', dw_mediamanager.list); + + // Init view property + dw_mediamanager.set_fileview_list(); + + dw_mediamanager.init_options(); + + dw_mediamanager.image_diff(); + dw_mediamanager.init_ajax_uploader(); + + // changing opened tab in the file list panel + jQuery('#mediamanager__page div.filelist').delegate('ul.tabs a', 'click', dw_mediamanager.list) + // loading file details + .delegate('div.panelContent a', 'click', dw_mediamanager.details) + // search form + .delegate('#dw__mediasearch', 'submit', dw_mediamanager.list) + // "upload as" field autofill + .delegate('#upload__file', 'change', dw_mediamanager.suggest) + // uploaded images + .delegate('.qq-upload-file a', 'click', dw_mediamanager.details); + + // changing opened tab in the file details panel + jQuery('#mediamanager__page div.file').delegate('ul.tabs a', 'click', dw_mediamanager.details) + // "update new version" button + .delegate('#mediamanager__btn_update', 'submit', dw_mediamanager.list) + // revisions form + .delegate('#page__revisions', 'submit', dw_mediamanager.details) + .delegate('#page__revisions a', 'click', dw_mediamanager.details) + // meta edit form + .delegate('#mediamanager__save_meta', 'submit', dw_mediamanager.details) + // delete button + .delegate('#mediamanager__btn_delete', 'submit', dw_mediamanager.details) + // "restore this version" button + .delegate('#mediamanager__btn_restore', 'submit', dw_mediamanager.details) + // less/more recent buttons in media revisions form + .delegate('.btn_newer, .btn_older', 'submit', dw_mediamanager.details); + + dw_mediamanager.update_resizable(); + dw_mediamanager.layout_width = jQuery("#mediamanager__page").width(); + jQuery(window).resize(dw_mediamanager.window_resize); + }, - // attach action load folder list via AJAX - var link = elem.getElementsByTagName('a')[0]; - link.style.cursor = 'pointer'; - addEvent(link,'click',function(event){ return media_manager.list(event,this); }); + init_options: function () { + var $options = jQuery('div.filelist div.panelHeader form.options'), + $listType, $sortBy, $both; + if ($options.length === 0) { + return; } + + $listType = $options.find('li.listType'); + $sortBy = $options.find('li.sortBy'); + $both = $listType.add($sortBy); + + // Remove the submit button + $options.find('input[type=submit]').parent().hide(); + + // Prepare HTML for jQuery UI buttonset + $both.find('label').each(function () { + var $this = jQuery(this); + $this.children('input').appendTo($this.parent()); + }); + + // Init buttonset + $both.buttonset(); + + // Change handlers + $listType.children('input').change(function (event) { + dw_mediamanager.set_fileview_list(); + }); + $sortBy.children('input').change(function (event) { + dw_mediamanager.set_fileview_sort(); + dw_mediamanager.list.call(this, event); + }); }, /** - * Attach the image selector action to all links below the given element - * also add the action to autofill the "upload as" field + * build the popup window * - * @author Andreas Gohr <andi@splitbrain.org> + * @author Dominik Eckelmann <eckelmann@cosmocode.de> */ - selectorattach: function(obj){ - if(!obj) return; + initpopup: function () { + var opts, $insp, $insbtn; + + dw_mediamanager.$popup = jQuery(document.createElement('div')) + .attr('id', 'media__popup_content') + .dialog({autoOpen: false, width: 280, modal: true, + draggable: true, title: LANG.mediatitle, + resizable: false}); + + opts = [{id: 'link', label: LANG.mediatarget, + btns: ['lnk', 'direct', 'nolnk', 'displaylnk']}, + {id: 'align', label: LANG.mediaalign, + btns: ['noalign', 'left', 'center', 'right']}, + {id: 'size', label: LANG.mediasize, + btns: ['small', 'medium', 'large', 'original']} + ]; + + jQuery.each(opts, function (_, opt) { + var $p, $l; + $p = jQuery(document.createElement('p')) + .attr('id', 'media__' + opt.id); + + if (dw_mediamanager.display === "2") { + $p.hide(); + } - var items = getElementsByClass('select',obj,'a'); - for(var i=0; i<items.length; i++){ - var elem = items[i]; - elem.style.cursor = 'pointer'; - addEvent(elem,'click',function(event){ return media_manager.select(event,this); }); - } + $l = jQuery(document.createElement('label')) + .text(opt.label); + $p.append($l); - // hide syntax example - items = getElementsByClass('example',obj,'div'); - for(var i=0; i<items.length; i++){ - elem = items[i]; - elem.style.display = 'none'; - } + jQuery.each(opt.btns, function (i, text) { + var $btn, $img; + $btn = jQuery(document.createElement('button')) + .addClass('button') + .attr('id', "media__" + opt.id + "btn" + (i + 1)) + .attr('title', LANG['media' + text]) + .click(bind(dw_mediamanager.setOpt, opt.id)); - var file = $('upload__file'); - if(!file) return; - addEvent(file,'change',media_manager.suggest); - }, + $img = jQuery(document.createElement('img')) + .attr('src', DOKU_BASE + 'lib/images/media_' + + opt.id + '_' + text + '.png'); - /** - * Attach deletion confirmation dialog to the delete buttons. - * - * Michael Klier <chi@chimeric.de> - */ - confirmattach: function(obj){ - if(!obj) return; - - items = getElementsByClass('btn_media_delete',obj,'a'); - for(var i=0; i<items.length; i++){ - var elem = items[i]; - addEvent(elem,'click',function(e){ - if(e.target.tagName == 'IMG'){ - var name = e.target.parentNode.title; - }else{ - var name = e.target.title; - } - if(!confirm(LANG['del_confirm'] + "\n" + name)) { - e.preventDefault(); - return false; - } else { - return true; - } + $btn.append($img); + $p.append($btn); }); - } + + dw_mediamanager.$popup.append($p); + }); + + // insert button + $insp = jQuery(document.createElement('p')); + dw_mediamanager.$popup.append($insp); + + $insbtn = jQuery(document.createElement('input')) + .attr('id', 'media__sendbtn') + .attr('type', 'button') + .addClass('button') + .val(LANG.mediainsert); + $insp.append($insbtn); }, /** - * Creates checkboxes for additional options + * Insert the clicked image into the opener's textarea * * @author Andreas Gohr <andi@splitbrain.org> + * @author Dominik Eckelmann <eckelmann@cosmocode.de> + * @author Pierre Spring <pierre.spring@caillou.ch> */ - attachoptions: function(obj){ - if(!obj) return; + insert: function (id) { + var opts, alignleft, alignright, edid, s; - // keep open - if(opener){ - var kobox = document.createElement('input'); - kobox.type = 'checkbox'; - kobox.id = 'media__keepopen'; - if(DokuCookie.getValue('keepopen')){ - kobox.checked = true; - kobox.defaultChecked = true; //IE wants this - media_manager.keepopen = true; - } - addEvent(kobox,'click',function(event){ return media_manager.togglekeepopen(event,this); }); + // set syntax options + dw_mediamanager.$popup.dialog('close'); - var kolbl = document.createElement('label'); - kolbl.htmlFor = 'media__keepopen'; - kolbl.innerHTML = LANG['keepopen']; + opts = ''; + alignleft = ''; + alignright = ''; - var kobr = document.createElement('br'); + if ({img: 1, swf: 1}[dw_mediamanager.ext] === 1) { - obj.appendChild(kobox); - obj.appendChild(kolbl); - obj.appendChild(kobr); - } - - // hide details - var hdbox = document.createElement('input'); - hdbox.type = 'checkbox'; - hdbox.id = 'media__hide'; - if(DokuCookie.getValue('hide')){ - hdbox.checked = true; - hdbox.defaultChecked = true; //IE wants this - media_manager.hide = true; - } - addEvent(hdbox,'click',function(event){ return media_manager.togglehide(event,this); }); + if (dw_mediamanager.link === '4') { + opts = '?linkonly'; + } else { - var hdlbl = document.createElement('label'); - hdlbl.htmlFor = 'media__hide'; - hdlbl.innerHTML = LANG['hidedetails']; + if (dw_mediamanager.link === "3" && dw_mediamanager.ext === 'img') { + opts = '?nolink'; + } else if (dw_mediamanager.link === "2" && dw_mediamanager.ext === 'img') { + opts = '?direct'; + } - var hdbr = document.createElement('br'); + s = parseInt(dw_mediamanager.size, 10); - obj.appendChild(hdbox); - obj.appendChild(hdlbl); - obj.appendChild(hdbr); - media_manager.updatehide(); - }, + if (s && s >= 1 && s < 4) { + opts += (opts.length)?'&':'?'; + opts += dw_mediamanager.size + '00'; + if (dw_mediamanager.ext === 'swf') { + switch (s) { + case 1: + opts += 'x62'; + break; + case 2: + opts += 'x123'; + break; + case 3: + opts += 'x185'; + break; + } + } + } + alignleft = dw_mediamanager.align === '2' ? '' : ' '; + alignright = dw_mediamanager.align === '4' ? '' : ' '; + } + } + edid = String.prototype.match.call(document.location, /&edid=([^&]+)/); + opener.insertTags(edid ? edid[1] : 'wiki__text', + '{{'+alignleft+id+opts+alignright+'|','}}',''); - /** - * Toggles the keep open state - * - * @author Andreas Gohr <andi@splitbrain.org> - */ - togglekeepopen: function(event,cb){ - if(cb.checked){ - DokuCookie.setValue('keepopen',1); - media_manager.keepopen = true; - }else{ - DokuCookie.setValue('keepopen',''); - media_manager.keepopen = false; + if(!dw_mediamanager.keepopen) { + window.close(); } + opener.focus(); + return false; }, /** - * Toggles the hide details state + * Prefills the wikiname. * * @author Andreas Gohr <andi@splitbrain.org> */ - togglehide: function(event,cb){ - if(cb.checked){ - DokuCookie.setValue('hide',1); - media_manager.hide = true; - }else{ - DokuCookie.setValue('hide',''); - media_manager.hide = false; + suggest: function(){ + var $file, $name, text; + + $file = jQuery(this); + $name = jQuery('#upload__name'); + + if ($name.val() != '') return; + + if(!$file.length || !$name.length) { + return; } - media_manager.updatehide(); + + text = $file.val(); + text = text.substr(text.lastIndexOf('/')+1); + text = text.substr(text.lastIndexOf('\\')+1); + $name.val(text); }, /** - * Sets the visibility of the image details accordingly to the - * chosen hide state + * list the content of a namespace using AJAX * * @author Andreas Gohr <andi@splitbrain.org> + * @author Pierre Spring <pierre.spring@caillou.ch> */ - updatehide: function(){ - var obj = $('media__content'); - if(!obj) return; - var details = getElementsByClass('detail',obj,'div'); - for(var i=0; i<details.length; i++){ - if(media_manager.hide){ - details[i].style.display = 'none'; - }else{ - details[i].style.display = ''; - } + list: function (event) { + var $link, $content, params; + + if (event) { + event.preventDefault(); } - }, - /** - * shows the popup for a image link - */ - select: function(event,link){ - var id = link.name.substr(2); + jQuery('div.success, div.info, div.error, div.notify').remove(); - media_manager.id = id; - if(!opener){ - // if we don't run in popup display example - var ex = $('ex'+id.replace(/:/g,'_')); - if(ex.style.display == ''){ - ex.style.display = 'none'; - } else { - ex.style.display = ''; - } - return false; - } + $link = jQuery(this); - media_manager.ext = false; - var dot = id.lastIndexOf("."); - if (dot != -1) { - var ext = id.substr(dot,id.length); + //popup + $content = jQuery('#media__content'); - if (ext != '.jpg' && ext != '.jpeg' && ext != '.png' && ext != '.gif' && ext != '.swf') { - media_manager.insert(null); - return false; + if ($content.length === 0) { + //fullscreen media manager + $content = jQuery('div.filelist'); + + if ($link.hasClass('idx_dir')) { + //changing namespace + jQuery('div.file').empty(); + jQuery('div.namespaces .selected').removeClass('selected'); + $link.addClass('selected'); } - } else { - media_manager.insert(null); - return false; } - media_manager.popup.style.display = 'inline'; - media_manager.popup.style.left = event.pageX + 'px'; - media_manager.popup.style.top = event.pageY + 'px'; + params = 'call=medialist&'; - // set all buttons to outset - for (var i = 1; i < 5; i++) { - media_manager.outSet('media__linkbtn' + i); - media_manager.outSet('media__alignbtn' + i); - media_manager.outSet('media__sizebtn' + i); + if ($link[0].search) { + params += $link[0].search.substr(1); + } else if ($link.is('form')) { + params += dw_mediamanager.form_params($link); + } else if ($link.closest('form').length > 0) { + params += dw_mediamanager.form_params($link.closest('form')); } - if (ext == '.swf') { - media_manager.ext = 'swf'; - - // disable display buttons for detail and linked image - $('media__linkbtn1').style.display = 'none'; - $('media__linkbtn2').style.display = 'none'; + // fetch the subtree + dw_mediamanager.update_content($content, params); + }, - // set the link button to default - if (media_manager.link !== false) { - if ( media_manager.link == '2' || media_manager.link == '1') { - media_manager.inSet('media__linkbtn3'); - media_manager.link = '3'; - DokuCookie.setValue('link','3'); - } else { - media_manager.inSet('media__linkbtn'+media_manager.link); - } - } else if (DokuCookie.getValue('link')) { - if ( DokuCookie.getValue('link') == '2' || DokuCookie.getValue('link') == '1') { - // this options are not availible - media_manager.inSet('media__linkbtn3'); - media_manager.link = '3'; - DokuCookie.setValue('link','3'); - } else { - media_manager.inSet('media__linkbtn'+DokuCookie.getValue('link')); - media_manager.link = DokuCookie.getValue('link'); - } - } else { - // default case - media_manager.link = '3'; - media_manager.inSet('media__linkbtn3'); - DokuCookie.setValue('link','3'); - } + /** + * Returns form parameters + * + * @author Kate Arzamastseva <pshns@ukr.net> + */ + form_params: function ($form) { + if (!$form.length) return; + var action = ''; + var i = $form[0].action.indexOf('?'); + if (i >= 0) action = $form[0].action.substr(i+1); + return action+'&'+$form.serialize(); + }, - // disable button for original size - $('media__sizebtn4').style.display = 'none'; - if (media_manager.size == 4) { - media_manager.size = 2; - DokuCookie.setValue('size', '2'); - media_manager.inSet('media__sizebtn2'); - } + set_fileview_list: function (new_type) { + dw_mediamanager.set_fileview_opt(['list', 'listType', function (new_type) { + jQuery('div.filelist div.panelContent ul') + .toggleClass('rows', new_type === 'rows') + .toggleClass('thumbs', new_type === 'thumbs'); + }], new_type); - } else { - media_manager.ext = 'img'; + // FIXME: Move to onchange handler (opt[2])? + dw_mediamanager.resize(); + }, - // ensure that the display buttons are there - $('media__linkbtn1').style.display = 'inline'; - $('media__linkbtn2').style.display = 'inline'; - $('media__sizebtn4').style.display = 'inline'; + set_fileview_sort: function (new_sort) { + dw_mediamanager.set_fileview_opt(['sort', 'sortBy', function (new_sort) { + // FIXME + }], new_sort); + }, - // set the link button to default - if (DokuCookie.getValue('link')) { - media_manager.link = DokuCookie.getValue('link'); - } - if (!media_manager.link) { - // default case - media_manager.link = '1'; - DokuCookie.setValue('link','1'); - } - media_manager.inSet('media__linkbtn'+media_manager.link); + set_fileview_opt: function (opt, new_val) { + if (typeof new_val === 'undefined') { + new_val = jQuery('form.options li.' + opt[1] + ' input') + .filter(':checked').val(); } - if (media_manager.link == '4') { - media_manager.align = false; - media_manager.size = false; - $('media__align').style.display = 'none'; - $('media__size').style.display = 'none'; - } else { - $('media__align').style.display = 'block'; - $('media__size').style.display = 'block'; - - // set the align button to default - if (media_manager.align !== false) { - media_manager.inSet('media__alignbtn'+media_manager.align); - } else if (DokuCookie.getValue('align')) { - media_manager.inSet('media__alignbtn'+DokuCookie.getValue('align')); - media_manager.align = DokuCookie.getValue('align'); - } else { - // default case - media_manager.align = '1'; - media_manager.inSet('media__alignbtn1'); - DokuCookie.setValue('align','1'); - } + if (new_val !== dw_mediamanager.view_opts[opt[0]]) { + opt[2](new_val); - // set the size button to default - if (DokuCookie.getValue('size')) { - media_manager.size = DokuCookie.getValue('size'); - } - if (!media_manager.size || (media_manager.size === '4' && ext === '.swf')) { - // default case - media_manager.size = '2'; - DokuCookie.setValue('size','2'); - } - media_manager.inSet('media__sizebtn'+media_manager.size); + DokuCookie.setValue(opt[0], new_val); - $('media__sendbtn').focus(); + dw_mediamanager.view_opts[opt[0]] = new_val; } - - return false; }, - /** - * build the popup window + /** + * Lists the content of the right column (image details) using AJAX * - * @author Dominik Eckelmann <eckelmann@cosmocode.de> + * @author Kate Arzamastseva <pshns@ukr.net> */ - initpopup: function() { - - media_manager.popup = document.createElement('div'); - media_manager.popup.setAttribute('id','media__popup'); - media_manager.popup.style.display = 'none'; - - var root = document.getElementById('media__manager'); - if (root === null) return; - root.appendChild(media_manager.popup); - - var headline = document.createElement('h1'); - headline.innerHTML = LANG.mediatitle; - var headlineimg = document.createElement('img'); - headlineimg.src = DOKU_BASE + 'lib/images/close.png'; - headlineimg.id = 'media__closeimg'; - addEvent(headlineimg,'click',function(event){ return media_manager.closePopup(event,this); }); - headline.insertBefore(headlineimg, headline.firstChild); - media_manager.popup.appendChild(headline); - drag.attach(media_manager.popup,headline); + details: function (event) { + var $link, $content, params, update_list; + $link = jQuery(this); + event.preventDefault(); - // link + jQuery('div.success, div.info, div.error, div.notify').remove(); - var linkp = document.createElement('p'); - - linkp.id = "media__linkstyle"; - if (media_manager.display == "2") { - linkp.style.display = "none"; + if ($link[0].id == 'mediamanager__btn_delete' && !confirm(LANG.del_confirm)) { + return false; } - - var linkl = document.createElement('label'); - linkl.innerHTML = LANG.mediatarget; - linkp.appendChild(linkl); - - var linkbtns = ['lnk', 'direct', 'nolnk', 'displaylnk']; - for (var i = 0 ; i < linkbtns.length ; ++i) { - var linkbtn = document.createElement('button'); - linkbtn.className = 'button'; - linkbtn.id = "media__linkbtn" + (i+1); - linkbtn.title = LANG['media' + linkbtns[i]]; - linkbtn.style.borderStyle = 'outset'; - addEvent(linkbtn,'click',function(event){ return media_manager.setlink(event,this); }); - - var linkimg = document.createElement('img'); - linkimg.src = DOKU_BASE + 'lib/images/media_link_' + linkbtns[i] + '.png'; - - linkbtn.appendChild(linkimg); - linkp.appendChild(linkbtn); + if ($link[0].id == 'mediamanager__btn_restore' && !confirm(LANG.restore_confirm)) { + return false; } - media_manager.popup.appendChild(linkp); - - // align - - var alignp = document.createElement('p'); - var alignl = document.createElement('label'); + $content = jQuery('div.file'); + params = 'call=mediadetails&'; - alignp.appendChild(alignl); - alignp.id = 'media__align'; - if (media_manager.display == "2") { - alignp.style.display = "none"; + if ($link[0].search) { + params += $link[0].search.substr(1); + } else if ($link.is('form')) { + params += dw_mediamanager.form_params($link); + } else if ($link.closest('form').length > 0) { + params += dw_mediamanager.form_params($link.closest('form')); } - alignl.innerHTML = LANG['mediaalign']; - var alignbtns = ['noalign', 'left', 'center', 'right']; - for (var n = 0 ; n < alignbtns.length ; ++n) { - var alignbtn = document.createElement('button'); - var alignimg = document.createElement('img'); - alignimg.src = DOKU_BASE + 'lib/images/media_align_' + alignbtns[n] + '.png'; + update_list = ($link[0].id == 'mediamanager__btn_delete' || + $link[0].id == 'mediamanager__btn_restore'); - alignbtn.id = "media__alignbtn" + (n+1); - alignbtn.title = LANG['media' + alignbtns[n]]; - alignbtn.className = 'button'; - alignbtn.appendChild(alignimg); - alignbtn.style.borderStyle = 'outset'; - addEvent(alignbtn,'click',function(event){ return media_manager.setalign(event,this); }); + dw_mediamanager.update_content($content, params, update_list); + }, - alignp.appendChild(alignbtn); - } + update_content: function ($content, params, update_list) { + var $container; - media_manager.popup.appendChild(alignp); + jQuery.post( + DOKU_BASE + 'lib/exe/ajax.php', + params, + function (data) { + dw_mediamanager.$resizables().resizable('destroy'); - // size + if (update_list) { + dw_mediamanager.list.call(jQuery('input[value="Apply"]')[0]); + } - var sizep = document.createElement('p'); - var sizel = document.createElement('label'); + $content.html(data); - sizep.id = 'media__size'; - if (media_manager.display == "2") { - sizep.style.display = "none"; - } - sizep.appendChild(sizel); - sizel.innerHTML = LANG['mediasize']; + dw_mediamanager.prepare_content($content); + dw_mediamanager.updatehide(); - var sizebtns = ['small', 'medium', 'large', 'original']; - for (var size = 0 ; size < sizebtns.length ; ++size) { - var sizebtn = document.createElement('button'); - var sizeimg = document.createElement('img'); + dw_mediamanager.update_resizable(); + dw_behaviour.revisionBoxHandler(); - sizep.appendChild(sizebtn); - sizeimg.src = DOKU_BASE + 'lib/images/media_size_' + sizebtns[size] + '.png'; + // Make sure that the list view style stays the same + dw_mediamanager.set_fileview_list(dw_mediamanager.view_opts.list); - sizebtn.className = 'button'; - sizebtn.appendChild(sizeimg); - sizebtn.id = 'media__sizebtn' + (size + 1); - sizebtn.title = LANG['media' + sizebtns[size]]; - sizebtn.style.borderStyle = 'outset'; - addEvent(sizebtn,'click',function(event){ return media_manager.setsize(event,this); }); - } + dw_mediamanager.image_diff(); + dw_mediamanager.init_ajax_uploader(); + dw_mediamanager.init_options(); - media_manager.popup.appendChild(sizep); + }, + 'html' + ); + $container = $content.find('div.panelContent'); + if ($container.length === 0) { + $container = $content; + } + $container.html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />'); + }, - // send and close button + window_resize: function () { + dw_mediamanager.resize(); - var btnp = document.createElement('p'); - media_manager.popup.appendChild(btnp); - btnp.setAttribute('class','btnlbl'); + dw_mediamanager.opacity_slider(); + dw_mediamanager.portions_slider(); + }, - var btn = document.createElement('input'); - btn.type = 'button'; - btn.id = 'media__sendbtn'; - btn.setAttribute('class','button'); - btn.value = LANG['mediainsert']; - btnp.appendChild(btn); - addEvent(btn,'click',function(event){ return media_manager.insert(event); }); + $resizables: function () { + return jQuery('#mediamanager__page').find('div.namespaces, div.filelist'); }, /** - * Insert the clicked image into the opener's textarea + * Updates mediamanager layout * - * @author Andreas Gohr <andi@splitbrain.org> - * @author Dominik Eckelmann <eckelmann@cosmocode.de> + * @author Kate Arzamastseva <pshns@ukr.net> */ - insert: function(event){ - var id = media_manager.id; - // set syntax options - $('media__popup').style.display = 'none'; - - var opts = ''; - var optsstart = ''; - var alignleft = ''; - var alignright = ''; - - if (media_manager.ext == 'img' || media_manager.ext == 'swf') { + update_resizable: function () { + $resizables = dw_mediamanager.$resizables(); + + $resizables.resizable({ + handles: 'e', + resize: function(event, ui){ + var widthFull = jQuery('#mediamanager__page').width(); + var widthResizables = 0; + $resizables.each(function() { + widthResizables += jQuery(this).width(); + }); + var $filePanel = jQuery('#mediamanager__page div.panel.file'); + + // set max width of resizable column + var widthOtherResizable = widthResizables - jQuery(this).width(); + var minWidthNonResizable = parseFloat($filePanel.css("min-width")); + var maxWidth = widthFull - (widthOtherResizable + minWidthNonResizable); + $resizables.resizable( "option", "maxWidth", maxWidth ); + + // width of file panel in % = 100% - width of resizables in % + // this calculates with 99.99 and not 100 to overcome rounding errors + var relWidthNonResizable = 99.99 - (100 * widthResizables / widthFull); + // set width of file panel + $filePanel.width(relWidthNonResizable+'%'); + + // FIXME: please fix without browser sniffing + if (!jQuery.browser.webkit) { + $resizables.each(function() { + w = jQuery(this).width(); + w = (99.99 * w / widthFull); + w += "%"; + jQuery(this).width(w); + }); + } - if (media_manager.link == '4') { - opts = '?linkonly'; - } else { + dw_mediamanager.opacity_slider(); + dw_mediamanager.portions_slider(); + } + }); - if (media_manager.link == "3" && media_manager.ext == 'img') { - opts = '?nolink'; - optsstart = true; - } else if (media_manager.link == "2" && media_manager.ext == 'img') { - opts = '?direct'; - optsstart = true; - } + dw_mediamanager.resize(); + }, - var s = parseInt(media_manager.size, 10); + resize: function () { + var $contents = jQuery('#mediamanager__page div.panelContent'), + height = jQuery(window).height() - jQuery(document.body).height() + + Math.max.apply(null, jQuery.map($contents, function (v) { + return jQuery(v).height(); + })); - if (s && s >= 1) { - opts += (optsstart)?'&':'?'; - if (s=="1") { - opts += '100'; - if (media_manager.ext == 'swf') { - opts += 'x62'; - } - } else if (s=="2") { - opts += '200'; - if (media_manager.ext == 'swf') { - opts += 'x123'; - } - } else if (s=="3"){ - opts += '300'; - if (media_manager.ext == 'swf') { - opts += 'x185'; - } - } - } - if (media_manager.align == '2') { - alignleft = ''; - alignright = ' '; - } - if (media_manager.align == '3') { - alignleft = ' '; - alignright = ' '; - } - if (media_manager.align == '4') { - alignleft = ' '; - alignright = ''; - } - } + // If the screen is too small, don’t try to resize + if (height < dw_mediamanager.minHeights[dw_mediamanager.view_opts.list]) { + $contents.add(dw_mediamanager.$resizables()).height('auto'); + } else { + $contents.height(height); + dw_mediamanager.$resizables().each(function () { + var $this = jQuery(this); + $this.height(height + $this.find('div.panelContent').offset().top - + $this.offset().top); + }); } - var edid = String.prototype.match.call(document.location, /&edid=([^&]+)/); - edid = edid ? edid[1] : 'wiki__text'; - opener.insertTags(edid,'{{'+alignleft+id+opts+alignright+'|','}}',''); + }, - if(!media_manager.keepopen) window.close(); - opener.focus(); - return false; + /** + * Prints 'select' for image difference representation type + * + * @author Kate Arzamastseva <pshns@ukr.net> + */ + image_diff: function () { + if (jQuery('#mediamanager__difftype').length) return; + + $form = jQuery('#mediamanager__form_diffview'); + if (!$form.length) return; + + $label = jQuery(document.createElement('label')); + $label.append('<span>'+LANG.media_diff+'</span> '); + $select = jQuery(document.createElement('select')) + .attr('id', 'mediamanager__difftype') + .attr('name', 'difftype') + .change(dw_mediamanager.change_diff_type); + $select.append(new Option(LANG.media_diff_both, "both")); + $select.append(new Option(LANG.media_diff_opacity, "opacity")); + $select.append(new Option(LANG.media_diff_portions, "portions")); + $label.append($select); + $form.append($label); + + // for IE + var select = document.getElementById('mediamanager__difftype'); + select.options[0].text = LANG.media_diff_both; + select.options[1].text = LANG.media_diff_opacity; + select.options[2].text = LANG.media_diff_portions; }, /** - * list the content of a namespace using AJAX + * Handles selection of image difference representation type * - * @author Andreas Gohr <andi@splitbrain.org> + * @author Kate Arzamastseva <pshns@ukr.net> */ - list: function(event,link){ - // prepare an AJAX call to fetch the subtree - var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php'); - ajax.AjaxFailedAlert = ''; - ajax.encodeURIString = false; - if(ajax.failed) return true; - - cleanMsgArea(); - - var content = $('media__content'); - content.innerHTML = '<img src="'+DOKU_BASE+'lib/images/loading.gif" alt="..." class="load" />'; - - ajax.elementObj = content; - ajax.afterCompletion = function(){ - media_manager.selectorattach(content); - media_manager.confirmattach(content); - media_manager.updatehide(); - media_manager.initFlashUpload(); - }; - ajax.runAJAX(link.search.substr(1)+'&call=medialist'); - return false; + change_diff_type: function () { + $select = jQuery('#mediamanager__difftype'); + $content = jQuery('#mediamanager__diff'); + + params = dw_mediamanager.form_params($select.closest('form'))+'&call=mediadiff'; + jQuery.post( + DOKU_BASE + 'lib/exe/ajax.php', + params, + function (data) { + $content.html(data); + dw_mediamanager.portions_slider(); + dw_mediamanager.opacity_slider(); + }, + 'html' + ); }, - /** - * Open or close a subtree using AJAX + * Sets options for opacity diff slider * - * @author Andreas Gohr <andi@splitbrain.org> + * @author Kate Arzamastseva <pshns@ukr.net> */ - toggle: function(event,clicky){ - var listitem = clicky.parentNode; - - // if already open, close by removing the sublist - var sublists = listitem.getElementsByTagName('ul'); - if(sublists.length){ - listitem.removeChild(sublists[0]); - clicky.src = DOKU_BASE+'lib/images/plus.gif'; - return false; - } + opacity_slider: function () { + var $slider = jQuery( "#mediamanager__diff div.slider" ); + if (!$slider.length) return; + + var $image = jQuery('#mediamanager__diff div.imageDiff.opacity div.image1 img'); + if (!$image.length) return; + $slider.width($image.width()-20); + + $slider.slider(); + $slider.slider("option", "min", 0); + $slider.slider("option", "max", 0.999); + $slider.slider("option", "step", 0.001); + $slider.slider("option", "value", 0.5); + $slider.bind("slide", function(event, ui) { + jQuery('#mediamanager__diff div.imageDiff.opacity div.image2 img').css({ opacity: $slider.slider("option", "value")}); + }); + }, - // get the enclosed link (is always the first one) - var link = listitem.getElementsByTagName('a')[0]; + /** + * Sets options for red line diff slider + * + * @author Kate Arzamastseva <pshns@ukr.net> + */ + portions_slider: function () { + var $image1 = jQuery('#mediamanager__diff div.imageDiff.portions div.image1 img'); + var $image2 = jQuery('#mediamanager__diff div.imageDiff.portions div.image2 img'); + if (!$image1.length || !$image2.length) return; - // prepare an AJAX call to fetch the subtree - var ajax = new sack(DOKU_BASE + 'lib/exe/ajax.php'); - ajax.AjaxFailedAlert = ''; - ajax.encodeURIString = false; - if(ajax.failed) return true; + var $div = jQuery("#mediamanager__diff"); + if (!$div.length) return; - //prepare the new ul - var ul = document.createElement('ul'); - //fixme add classname here - listitem.appendChild(ul); - ajax.elementObj = ul; - ajax.afterCompletion = function(){ media_manager.treeattach(ul); }; - ajax.runAJAX(link.search.substr(1)+'&call=medians'); - clicky.src = DOKU_BASE+'lib/images/minus.gif'; - return false; + $div.width('100%'); + $image2.parent().width('97%'); + $image1.width('100%'); + $image2.width('100%'); + + if ($image1.width() < $div.width()) { + $div.width($image1.width()); + } + + $image2.parent().width('50%'); + $image2.width($image1.width()); + $image1.width($image1.width()); + + var $slider = jQuery("#mediamanager__diff div.slider"); + if (!$slider.length) return; + $slider.width($image1.width()-20); + + $slider.slider(); + $slider.slider("option", "min", 0); + $slider.slider("option", "max", 97); + $slider.slider("option", "step", 1); + $slider.slider("option", "value", 50); + $slider.bind("slide", function(event, ui) { + jQuery('#mediamanager__diff div.imageDiff.portions div.image2').css({ width: $slider.slider("option", "value")+'%'}); + }); }, /** - * Prefills the wikiname. + * Parse a URI query string to an associative array * - * @author Andreas Gohr <andi@splitbrain.org> + * @author Kate Arzamastseva <pshns@ukr.net> */ - suggest: function(){ - var file = $('upload__file'); - var name = $('upload__name'); - if(!file || !name) return; - - var text = file.value; - text = text.substr(text.lastIndexOf('/')+1); - text = text.substr(text.lastIndexOf('\\')+1); - name.value = text; + params_toarray: function (str) { + var vars = [], hash; + var hashes = str.split('&'); + for(var i = 0; i < hashes.length; i++) { + hash = hashes[i].split('='); + vars[decodeURIComponent(hash[0])] = decodeURIComponent(hash[1]); + } + return vars; }, + init_ajax_uploader: function () { + if (!jQuery('#mediamanager__uploader').length) return; + if (jQuery('.qq-upload-list').length) return; - initFlashUpload: function(){ - if(!hasFlash(8)) return; - var oform = $('dw__upload'); - var oflash = $('dw__flashupload'); - if(!oform || !oflash) return; + var params = dw_mediamanager.form_params(jQuery('#dw__upload'))+'&call=mediaupload'; + params = dw_mediamanager.params_toarray(params); - var clicky = document.createElement('img'); - clicky.src = DOKU_BASE+'lib/images/multiupload.png'; - clicky.title = LANG['mu_btn']; - clicky.alt = LANG['mu_btn']; - clicky.style.cursor = 'pointer'; - clicky.onclick = function(){ - oform.style.display = 'none'; - oflash.style.display = ''; - }; - oform.appendChild(clicky); + var uploader = new qq.FileUploaderExtended({ + element: document.getElementById('mediamanager__uploader'), + action: DOKU_BASE + 'lib/exe/ajax.php', + params: params + }); }, - /** - * closes the link type popup - */ - closePopup: function(event) { - $('media__popup').style.display = 'none'; + prepare_content: function ($content) { + // hide syntax example + $content.find('div.example:visible').hide(); }, /** - * set the align - * - * @author Dominik Eckelmann <eckelmann@cosmocode.de> + * shows the popup for a image link */ - setalign: function(event,cb){ - - var id = cb.id.substring(cb.id.length -1); - if(id){ - DokuCookie.setValue('align',id); - media_manager.align = id; - for (var i = 1; i<=4; i++) { - media_manager.outSet("media__alignbtn" + i); - } - media_manager.inSet("media__alignbtn"+id); - }else{ - DokuCookie.setValue('align',''); - media_manager.align = false; + select: function(event){ + var $link, id, dot, ext; + + event.preventDefault(); + + $link = jQuery(this); + id = $link.attr('name').substr(2); + + if(!opener){ + // if we don't run in popup display example + // the id's are a bit wierd and jQuery('#ex_wiki_dokuwiki-128.png') + // will not be found by Sizzle (the CSS Selector Engine + // used by jQuery), hence the document.getElementById() call + jQuery(document.getElementById('ex_'+id.replace(/:/g,'_').replace(/^_/,''))).dw_toggle(); + return; + } + + dw_mediamanager.ext = false; + dot = id.lastIndexOf("."); + + if (-1 === dot) { + dw_mediamanager.insert(id); + return; } + + ext = id.substr(dot); + + if ({'.jpg':1, '.jpeg':1, '.png':1, '.gif':1, '.swf':1}[ext] !== 1) { + dw_mediamanager.insert(id); + return; + } + + // remove old callback from the insert button and set the new one. + jQuery('#media__sendbtn').unbind().click(bind(dw_mediamanager.insert, id)); + + dw_mediamanager.unforbid('ext'); + if (ext === '.swf') { + dw_mediamanager.ext = 'swf'; + dw_mediamanager.forbid('ext', {link: ['1', '2'], + size: ['4']}); + } else { + dw_mediamanager.ext = 'img'; + } + + // Set to defaults + dw_mediamanager.setOpt('link'); + dw_mediamanager.setOpt('align'); + dw_mediamanager.setOpt('size'); + + // toggle buttons for detail and linked image, original size + jQuery('#media__linkbtn1, #media__linkbtn2, #media__sizebtn4') + .toggle(dw_mediamanager.ext === 'img'); + + dw_mediamanager.$popup.dialog('open'); + + jQuery('#media__sendbtn').focus(); }, + /** - * set the link type + * Deletion confirmation dialog to the delete buttons. * - * @author Dominik Eckelmann <eckelmann@cosmocode.de> + * @author Michael Klier <chi@chimeric.de> + * @author Pierre Spring <pierre.spring@caillou.ch> */ - setlink: function(event,cb){ - var id = cb.id.substring(cb.id.length -1); - if(id){ - DokuCookie.setValue('link',id); - for (var i = 1; i<=4; i++) { - media_manager.outSet("media__linkbtn"+i); - } - media_manager.inSet("media__linkbtn"+id); - - var size = document.getElementById("media__size"); - var align = document.getElementById("media__align"); - if (id != '4') { - size.style.display = "block"; - align.style.display = "block"; - if (media_manager.link == '4') { - media_manager.align = '1'; - DokuCookie.setValue('align', '1'); - media_manager.inSet('media__alignbtn1'); - - media_manager.size = '2'; - DokuCookie.setValue('size', '2'); - media_manager.inSet('media__sizebtn2'); - } - - } else { - size.style.display = "none"; - align.style.display = "none"; - } - media_manager.link = id; - }else{ - DokuCookie.setValue('link',''); - media_manager.link = false; + confirmattach: function(e){ + if(!confirm(LANG.del_confirm + "\n" + jQuery(this).attr('title'))) { + e.preventDefault(); } }, /** - * set the display type + * Creates checkboxes for additional options * - * @author Dominik Eckelmann <eckelmann@cosmocode.de> + * @author Andreas Gohr <andi@splitbrain.org> + * @author Pierre Spring <pierre.spring@caillou.ch> */ - setdisplay: function(event,cb){ - if(cb.value){ - DokuCookie.setValue('display',cb.value); - media_manager.display = cb.value; - media_manager.outSet("media__displaybtn1"); - media_manager.outSet("media__displaybtn2"); - media_manager.inSet("media__displaybtn"+cb.value); + attachoptions: function(){ + var $obj, opts; - }else{ - DokuCookie.setValue('display',''); - media_manager.align = false; + $obj = jQuery('#media__opts'); + if($obj.length === 0) { + return; + } + + opts = []; + // keep open + if(opener){ + opts.push(['keepopen', 'keepopen']); } + opts.push(['hide', 'hidedetails']); + + jQuery.each(opts, + function(_, opt) { + var $box, $lbl; + $box = jQuery(document.createElement('input')) + .attr('type', 'checkbox') + .attr('id', 'media__' + opt[0]) + .click(bind(dw_mediamanager.toggleOption, + opt[0])); + + if(DokuCookie.getValue(opt[0])){ + $box.prop('checked', true); + dw_mediamanager[opt[0]] = true; + } + + $lbl = jQuery(document.createElement('label')) + .attr('for', 'media__' + opt[0]) + .text(LANG[opt[1]]); + + $obj.append($box, $lbl, document.createElement('br')); + }); + + dw_mediamanager.updatehide(); }, /** - * sets the border to outset + * Generalized toggler + * + * @author Pierre Spring <pierre.spring@caillou.ch> */ - outSet: function(id) { - var ele = document.getElementById(id); - if (ele == null) return; - ele.style.borderStyle = "outset"; + toggleOption: function (variable) { + if (jQuery(this).prop('checked')) { + DokuCookie.setValue(variable, 1); + dw_mediamanager[variable] = true; + } else { + DokuCookie.setValue(variable, ''); + dw_mediamanager[variable] = false; + } + if (variable === 'hide') { + dw_mediamanager.updatehide(); + } }, + /** - * sets the border to inset + * Sets the visibility of the image details accordingly to the + * chosen hide state + * + * @author Andreas Gohr <andi@splitbrain.org> */ - inSet: function(id) { - var ele = document.getElementById(id); - if (ele == null) return; - ele.style.borderStyle = "inset"; + updatehide: function(){ + jQuery('#media__content div.detail').dw_toggle(!dw_mediamanager.hide); }, /** - * set the image size + * set media insertion option * * @author Dominik Eckelmann <eckelmann@cosmocode.de> */ - setsize: function(event,cb){ - var id = cb.id.substring(cb.id.length -1); - if (id) { - DokuCookie.setValue('size',id); - media_manager.size = id; - for (var i = 1 ; i <=4 ; ++i) { - media_manager.outSet("media__sizebtn" + i); - } - media_manager.inSet("media__sizebtn"+id); + setOpt: function(opt, e){ + var val, i; + if (typeof e !== 'undefined') { + val = this.id.substring(this.id.length - 1); } else { - DokuCookie.setValue('size',''); - media_manager.width = false; + val = dw_mediamanager.getOpt(opt); + } + + if (val === false) { + DokuCookie.setValue(opt,''); + dw_mediamanager[opt] = false; + return; + } + + if (opt === 'link') { + if (val !== '4' && dw_mediamanager.link === '4') { + dw_mediamanager.unforbid('linkonly'); + dw_mediamanager.setOpt('align'); + dw_mediamanager.setOpt('size'); + } else if (val === '4') { + dw_mediamanager.forbid('linkonly', {align: false, size: false}); + } + + jQuery("#media__size, #media__align").dw_toggle(val !== '4'); + } + + DokuCookie.setValue(opt, val); + dw_mediamanager[opt] = val; + + for (i = 1; i <= 4; i++) { + jQuery("#media__" + opt + "btn" + i).removeClass('selected'); + } + jQuery('#media__' + opt + 'btn' + val).addClass('selected'); + }, + + unforbid: function (group) { + delete dw_mediamanager.forbidden_opts[group]; + }, + + forbid: function (group, forbids) { + dw_mediamanager.forbidden_opts[group] = forbids; + }, + + allowedOpt: function (opt, val) { + var ret = true; + jQuery.each(dw_mediamanager.forbidden_opts, + function (_, forbids) { + ret = forbids[opt] !== false && + jQuery.inArray(val, forbids[opt]) === -1; + return ret; + }); + return ret; + }, + + getOpt: function (opt) { + var allowed = bind(dw_mediamanager.allowedOpt, opt); + + // Current value + if (dw_mediamanager[opt] !== false && allowed(dw_mediamanager[opt])) { + return dw_mediamanager[opt]; + } + + // From cookie + if (DokuCookie.getValue(opt) && allowed(DokuCookie.getValue(opt))) { + return DokuCookie.getValue(opt); + } + + // size default + if (opt === 'size' && allowed('2')) { + return '2'; } + + // Whatever is allowed, and be it false + return jQuery.grep(['1', '2', '3', '4'], allowed)[0] || false; } }; -addInitEvent(function(){ - media_manager.treeattach($('media__tree')); - media_manager.selectorattach($('media__content')); - media_manager.confirmattach($('media__content')); - media_manager.attachoptions($('media__opts')); - media_manager.initpopup(); - media_manager.initFlashUpload(); -}); +// moved from helpers.js temporarily here +/** + * Very simplistic Flash plugin check, probably works for Flash 8 and higher only + * + */ +function hasFlash(version){ + var ver = 0, axo; + try{ + if(navigator.plugins !== null && navigator.plugins.length > 0){ + ver = navigator.plugins["Shockwave Flash"].description.split(' ')[2].split('.')[0]; + }else{ + axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); + ver = axo.GetVariable("$version").split(' ')[1].split(',')[0]; + } + }catch(e){ } + + return ver >= version; +} + +jQuery(dw_mediamanager.init); |