diff options
author | ahriman <ahriman@falte.red> | 2018-12-03 19:22:25 -0500 |
---|---|---|
committer | ahriman <ahriman@falte.red> | 2018-12-03 19:22:25 -0500 |
commit | 0ae8cbf5c0b1a198b963490985b7738392ebcb97 (patch) | |
tree | b2c77ae72c6b717e2b97492065196ac5ffb2d9e2 /wiki/lib/scripts/media.js | |
parent | f57f6cc5a2d159f90168d292437dc4bd8cd7f934 (diff) | |
download | site-0ae8cbf5c0b1a198b963490985b7738392ebcb97.tar.gz |
installed dokuwiki, added to navbar, updated news
Diffstat (limited to 'wiki/lib/scripts/media.js')
-rw-r--r-- | wiki/lib/scripts/media.js | 966 |
1 files changed, 966 insertions, 0 deletions
diff --git a/wiki/lib/scripts/media.js b/wiki/lib/scripts/media.js new file mode 100644 index 0000000..1e9d032 --- /dev/null +++ b/wiki/lib/scripts/media.js @@ -0,0 +1,966 @@ +/** + * JavaScript functionality for the media management popup + * + * @author Andreas Gohr <andi@splitbrain.org> + * @author Pierre Spring <pierre.spring@caillou.ch> + */ + +var dw_mediamanager = { + keepopen: false, + hide: false, + popup: false, + display: false, + ext: false, + $popup: null, + + // 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'); + if (!$tree.length) return; + + dw_mediamanager.prepare_content($content); + + dw_mediamanager.attachoptions(); + dw_mediamanager.initpopup(); + + // add the action to autofill the "upload as" field + $content + .on('change', '#upload__file', dw_mediamanager.suggest) + // Attach the image selector action to all links + .on('click', 'a.select', dw_mediamanager.select) + // Attach deletion confirmation dialog to the delete buttons + .on('click', '#media__content a.btn_media_delete', dw_mediamanager.confirmattach) + .on('submit', '#mediamanager__done_form', 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.on('click', 'a', 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 + var $page = jQuery('#mediamanager__page'); + $page.find('div.filelist') + .on('click', 'ul.tabs a', dw_mediamanager.list) + // loading file details + .on('click', 'div.panelContent a', dw_mediamanager.details) + // search form + .on('submit', '#dw__mediasearch', dw_mediamanager.list) + // "upload as" field autofill + .on('change', '#upload__file', dw_mediamanager.suggest) + // uploaded images + .on('click', '.qq-upload-file a', dw_mediamanager.details); + + // changing opened tab in the file details panel + $page.find('div.file') + .on('click', 'ul.tabs a', dw_mediamanager.details) + // "update new version" button + .on('submit', '#mediamanager__btn_update', dw_mediamanager.list) + // revisions form + .on('submit', '#page__revisions', dw_mediamanager.details) + .on('click', '#page__revisions a', dw_mediamanager.details) + // meta edit form + .on('submit', '#mediamanager__save_meta', dw_mediamanager.details) + // delete button + .on('submit', '#mediamanager__btn_delete', dw_mediamanager.details) + // "restore this version" button + .on('submit', '#mediamanager__btn_restore', dw_mediamanager.details) + // less/more recent buttons in media revisions form + .on('submit', '.btn_newer, .btn_older', dw_mediamanager.details); + + dw_mediamanager.update_resizable(); + dw_mediamanager.layout_width = $page.width(); + jQuery(window).resize(dw_mediamanager.window_resize); + }, + + 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('button[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.find("input[type='radio']").checkboxradio({icon: false}); + $both.controlgroup(); + + // Change handlers + $listType.children('input').change(function () { + dw_mediamanager.set_fileview_list(); + }); + $sortBy.children('input').change(function (event) { + dw_mediamanager.set_fileview_sort(); + dw_mediamanager.list.call(jQuery('#dw__mediasearch')[0] || this, event); + }); + }, + + /** + * build the popup window + * + * @author Dominik Eckelmann <eckelmann@cosmocode.de> + */ + 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(); + } + + $l = jQuery(document.createElement('label')) + .text(opt.label); + $p.append($l); + + 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)); + + $img = jQuery(document.createElement('img')) + .attr('src', DOKU_BASE + 'lib/images/media_' + opt.id + '_' + text + '.png'); + + $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); + }, + + /** + * 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> + */ + insert: function (id) { + var opts, cb, edid, s; + + // set syntax options + dw_mediamanager.$popup.dialog('close'); + + opts = ''; + + if ({img: 1, swf: 1}[dw_mediamanager.ext] === 1) { + + if (dw_mediamanager.link === '4') { + opts = '?linkonly'; + } else { + + if (dw_mediamanager.link === "3" && dw_mediamanager.ext === 'img') { + opts = '?nolink'; + } else if (dw_mediamanager.link === "2" && dw_mediamanager.ext === 'img') { + opts = '?direct'; + } + + s = parseInt(dw_mediamanager.size, 10); + var size = s * 200; + + if (s && s >= 1 && s < 4) { + opts += (opts.length) ? '&' : '?'; + opts += size; + if (dw_mediamanager.ext === 'swf') { + switch (s) { + case 1: + opts += 'x62'; + break; + case 2: + opts += 'x123'; + break; + case 3: + opts += 'x185'; + break; + } + } + } + } + } + edid = String.prototype.match.call(document.location, /&edid=([^&]+)/); + edid = edid ? edid[1] : 'wiki__text'; + cb = String.prototype.match.call(document.location, /&onselect=([^&]+)/); + cb = cb ? cb[1].replace(/[^\w]+/, '') : 'dw_mediamanager_item_select'; + + // arguments here only match the dw_mediamanager_item_select function, these will need to change if you override cb with onselect GET param + opener[cb](edid, id, opts, dw_mediamanager.align, dw_mediamanager.keepopen); + if (!dw_mediamanager.keepopen) { + window.close(); + } + opener.focus(); + return false; + }, + + + /** + * Prefills the wikiname. + * + * @author Andreas Gohr <andi@splitbrain.org> + */ + suggest: function () { + var $file, $name, text; + + $file = jQuery(this); + $name = jQuery('#upload__name'); + + if ($name.val() != '') return; + + if (!$file.length || !$name.length) { + return; + } + + text = $file.val(); + text = text.substr(text.lastIndexOf('/') + 1); + text = text.substr(text.lastIndexOf('\\') + 1); + $name.val(text); + }, + + /** + * list the content of a namespace using AJAX + * + * @author Andreas Gohr <andi@splitbrain.org> + * @author Pierre Spring <pierre.spring@caillou.ch> + */ + list: function (event) { + var $link, $content, params; + + if (event) { + event.preventDefault(); + } + + jQuery('div.success, div.info, div.error, div.notify').remove(); + + $link = jQuery(this); + + //popup + $content = jQuery('#media__content'); + + 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'); + } + } + + params = 'call=medialist&'; + + 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')); + } + + // fetch the subtree + dw_mediamanager.update_content($content, params); + }, + + /** + * 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(); + }, + + 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); + + // FIXME: Move to onchange handler (opt[2])? + dw_mediamanager.resize(); + }, + + set_fileview_sort: function (new_sort) { + dw_mediamanager.set_fileview_opt(['sort', 'sortBy', function (new_sort) { + // FIXME + }], new_sort); + }, + + 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 new_val is still undefined (because form.options is not in active tab), set to most spacious option + if (typeof new_val === 'undefined') { + new_val = 'thumbs'; + } + } + + if (new_val !== dw_mediamanager.view_opts[opt[0]]) { + opt[2](new_val); + + DokuCookie.setValue(opt[0], new_val); + + dw_mediamanager.view_opts[opt[0]] = new_val; + } + }, + + /** + * Lists the content of the right column (image details) using AJAX + * + * @author Kate Arzamastseva <pshns@ukr.net> + */ + details: function (event) { + var $link, $content, params, update_list; + $link = jQuery(this); + event.preventDefault(); + + jQuery('div.success, div.info, div.error, div.notify').remove(); + + if ($link[0].id == 'mediamanager__btn_delete' && !confirm(LANG.del_confirm)) { + return false; + } + if ($link[0].id == 'mediamanager__btn_restore' && !confirm(LANG.restore_confirm)) { + return false; + } + + $content = jQuery('div.file'); + params = 'call=mediadetails&'; + + 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')); + } + + update_list = ($link[0].id == 'mediamanager__btn_delete' || + $link[0].id == 'mediamanager__btn_restore'); + + dw_mediamanager.update_content($content, params, update_list); + }, + + update_content: function ($content, params, update_list) { + var $container; + + jQuery.post( + DOKU_BASE + 'lib/exe/ajax.php', + params, + function (data) { + dw_mediamanager.$resizables().resizable('destroy'); + + if (update_list) { + dw_mediamanager.list.call(jQuery('#mediamanager__page').find('form.options button[type="submit"]')[0]); + } + + $content.html(data); + + dw_mediamanager.prepare_content($content); + dw_mediamanager.updatehide(); + + dw_mediamanager.update_resizable(); + dw_behaviour.revisionBoxHandler(); + + // Make sure that the list view style stays the same + dw_mediamanager.set_fileview_list(dw_mediamanager.view_opts.list); + + dw_mediamanager.image_diff(); + dw_mediamanager.init_ajax_uploader(); + dw_mediamanager.init_options(); + + }, + '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" />'); + }, + + window_resize: function () { + dw_mediamanager.resize(); + + dw_mediamanager.opacity_slider(); + dw_mediamanager.portions_slider(); + }, + + $resizables: function () { + return jQuery('#mediamanager__page').find('div.namespaces, div.filelist'); + }, + + /** + * Updates mediamanager layout + * + * @author Kate Arzamastseva <pshns@ukr.net> + */ + update_resizable: function () { + var $resizables = dw_mediamanager.$resizables(); + + $resizables.resizable({ + handles: (jQuery('html[dir=rtl]').length ? 'w' : 'e'), + resize: function (event, ui) { + var $page = jQuery('#mediamanager__page'); + var widthFull = $page.width(); + var widthResizables = 0; + $resizables.each(function () { + widthResizables += jQuery(this).width(); + }); + var $filePanel = $page.find('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) - 1; + $resizables.resizable("option", "maxWidth", maxWidth); + + // width of file panel in % = 100% - width of resizables in % + // this calculates with 99.9 and not 100 to overcome rounding errors + var relWidthNonResizable = 99.9 - (100 * widthResizables / widthFull); + // set width of file panel + $filePanel.width(relWidthNonResizable + '%'); + + dw_mediamanager.resize(); + + dw_mediamanager.opacity_slider(); + dw_mediamanager.portions_slider(); + } + }); + + dw_mediamanager.resize(); + }, + + resize: function () { + var $contents = jQuery('#mediamanager__page').find('div.panelContent'), + height = jQuery(window).height() - jQuery(document.body).height() + + Math.max.apply(null, jQuery.map($contents, function (v) { + return jQuery(v).height(); + })); + + // 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); + }); + } + }, + + /** + * Prints 'select' for image difference representation type + * + * @author Kate Arzamastseva <pshns@ukr.net> + */ + image_diff: function () { + if (jQuery('#mediamanager__difftype').length) return; + + var $form = jQuery('#mediamanager__form_diffview'); + if (!$form.length) return; + + var $label = jQuery(document.createElement('label')); + $label.append('<span>' + LANG.media_diff + '</span> '); + var $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; + }, + + /** + * Handles selection of image difference representation type + * + * @author Kate Arzamastseva <pshns@ukr.net> + */ + change_diff_type: function () { + var $select = jQuery('#mediamanager__difftype'); + var $content = jQuery('#mediamanager__diff'); + + var 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' + ); + }, + + /** + * Sets options for opacity diff slider + * + * @author Kate Arzamastseva <pshns@ukr.net> + */ + opacity_slider: function () { + var $diff = jQuery("#mediamanager__diff"); + var $slider = $diff.find("div.slider"); + if (!$slider.length) return; + + var $image = $diff.find('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.on("slide", function (event, ui) { + jQuery('#mediamanager__diff').find('div.imageDiff.opacity div.image2 img').css({opacity: $slider.slider("option", "value")}); + }); + }, + + /** + * Sets options for red line diff slider + * + * @author Kate Arzamastseva <pshns@ukr.net> + */ + portions_slider: function () { + var $diff = jQuery("#mediamanager__diff"); + if (!$diff.length) return; + + var $image1 = $diff.find('div.imageDiff.portions div.image1 img'); + var $image2 = $diff.find('div.imageDiff.portions div.image2 img'); + if (!$image1.length || !$image2.length) return; + + $diff.width('100%'); + $image2.parent().width('97%'); + $image1.width('100%'); + $image2.width('100%'); + + if ($image1.width() < $diff.width()) { + $diff.width($image1.width()); + } + + $image2.parent().width('50%'); + $image2.width($image1.width()); + $image1.width($image1.width()); + + var $slider = $diff.find("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.on("slide", function (event, ui) { + jQuery('#mediamanager__diff').find('div.imageDiff.portions div.image2').css({width: $slider.slider("option", "value") + '%'}); + }); + }, + + /** + * Parse a URI query string to an associative array + * + * @author Kate Arzamastseva <pshns@ukr.net> + */ + 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; + + var params = dw_mediamanager.form_params(jQuery('#dw__upload')) + '&call=mediaupload'; + params = dw_mediamanager.params_toarray(params); + + var uploader = new qq.FileUploaderExtended({ + element: document.getElementById('mediamanager__uploader'), + action: DOKU_BASE + 'lib/exe/ajax.php', + params: params + }); + }, + + prepare_content: function ($content) { + // hide syntax example + $content.find('div.example:visible').hide(); + }, + + /** + * shows the popup for a image link + */ + select: function (event) { + var $link, id, dot, ext; + + event.preventDefault(); + + $link = jQuery(this); + id = $link.attr('id').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. + var $sendbtn = jQuery('#media__sendbtn'); + $sendbtn.off().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'); + + $sendbtn.focus(); + }, + + /** + * Deletion confirmation dialog to the delete buttons. + * + * @author Michael Klier <chi@chimeric.de> + * @author Pierre Spring <pierre.spring@caillou.ch> + */ + confirmattach: function (e) { + if (!confirm(LANG.del_confirm + "\n" + jQuery(this).attr('title'))) { + e.preventDefault(); + } + }, + + /** + * Creates checkboxes for additional options + * + * @author Andreas Gohr <andi@splitbrain.org> + * @author Pierre Spring <pierre.spring@caillou.ch> + */ + attachoptions: function () { + var $obj, opts; + + $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(); + }, + + /** + * Generalized toggler + * + * @author Pierre Spring <pierre.spring@caillou.ch> + */ + 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 visibility of the image details accordingly to the + * chosen hide state + * + * @author Andreas Gohr <andi@splitbrain.org> + */ + updatehide: function () { + jQuery('#media__content').find('div.detail').dw_toggle(!dw_mediamanager.hide); + }, + + /** + * set media insertion option + * + * @author Dominik Eckelmann <eckelmann@cosmocode.de> + */ + setOpt: function (opt, e) { + var val, i; + if (typeof e !== 'undefined') { + val = this.id.substring(this.id.length - 1); + } else { + 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; + } +}; + +/** + * Default implementation for the media manager's select action + * + * Can be overriden with the onselect URL parameter. Is called on the opener context + * + * @param {string} edid + * @param {string} mediaid + * @param {string} opts + * @param {string} align [none, left, center, right] + */ +function dw_mediamanager_item_select(edid, mediaid, opts, align, keepopen) { + var alignleft = ''; + var alignright = ''; + + // Get the 2 characters after the cursor to check if we're currently inside an image tag + var cursorInImageTag = false; + var textArea = jQuery('#' + edid)[0]; + var selection = DWgetSelection(textArea); + selection.end = selection.end + 2; + var charsAfterCursor = selection.getText(); + if (charsAfterCursor === '}}') { + cursorInImageTag = true; + } + + if (align !== '1') { + alignleft = align === '2' ? '' : ' '; + alignright = align === '4' ? '' : ' '; + } + if (keepopen && cursorInImageTag) { + selection.start = selection.start + 2; + DWsetSelection(selection); + } + insertTags(edid, '{{' + alignleft + mediaid + opts + alignright + '|', '}}', ''); +} + +jQuery(dw_mediamanager.init); |