diff options
Diffstat (limited to 'lib/scripts/media.js')
-rw-r--r-- | lib/scripts/media.js | 443 |
1 files changed, 201 insertions, 242 deletions
diff --git a/lib/scripts/media.js b/lib/scripts/media.js index f4064efd5..7f5514f56 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -1,6 +1,3 @@ -/*jslint white: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: false, strict: true, newcap: true, immed: true, sloppy: true, browser: true */ -/*global jQuery, DOKU_BASE, LANG, bind, DokuCookie, opener, confirm*/ - /** * JavaScript functionality for the media management popup * @@ -22,11 +19,13 @@ var dw_mediamanager = { size: false, forbidden_opts: {}, - // File list view type - view: false, + // File list options + view_opts: {list: false, sort: false}, layout_width: 0, - layout_height: 0, + + // The minimum height of the full-screen mediamanager in px + minHeights: {thumbs: 200, rows: 100}, init: function () { var $content, $tree; @@ -67,28 +66,27 @@ var dw_mediamanager = { }}); $tree.delegate('a', 'click', dw_mediamanager.list); - dw_mediamanager.set_filelist_view(dw_mediamanager.view, false); - jQuery('#mediamanager__form_sort').find('input[type=submit]').hide(); + // 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__layout_list').delegate('#mediamanager__tabs_files a', 'click', dw_mediamanager.list) - // changing type of the file list view - .delegate('#mediamanager__tabs_list a', 'click', dw_mediamanager.list_view) + jQuery('#mediamanager__page div.filelist').delegate('ul.tabs a', 'click', dw_mediamanager.list) // loading file details - .delegate('#mediamanager__file_list a', 'click', dw_mediamanager.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) - // sort type selection - .delegate('#mediamanager__form_sort select', 'change', dw_mediamanager.list) // uploaded images .delegate('.qq-upload-file a', 'click', dw_mediamanager.details); // changing opened tab in the file details panel - jQuery('#mediamanager__layout_detail').delegate('#mediamanager__tabs_details a', 'click', dw_mediamanager.details) + 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 @@ -103,6 +101,42 @@ var dw_mediamanager = { // 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); + }, + + 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); + }); }, /** @@ -160,8 +194,7 @@ var dw_mediamanager = { }); // insert button - $insp = jQuery(document.createElement('p')) - .addClass('btnlbl'); + $insp = jQuery(document.createElement('p')); dw_mediamanager.$popup.append($insp); $insbtn = jQuery(document.createElement('input')) @@ -266,56 +299,42 @@ var dw_mediamanager = { */ list: function (event) { var $link, $content, params; - $link = jQuery(this); - event.preventDefault(); + if (event) { + event.preventDefault(); + } jQuery('div.success, div.info, div.error, div.notify').remove(); - if (document.getElementById('media__content')) { - //popup - $content = jQuery('#media__content'); - } else { + $link = jQuery(this); + + //popup + $content = jQuery('#media__content'); + + if ($content.length === 0) { //fullscreen media manager - $content = jQuery('#mediamanager__layout_list'); + $content = jQuery('div.filelist'); if ($link.hasClass('idx_dir')) { //changing namespace - jQuery('#mediamanager__layout_detail').empty(); - jQuery('#media__tree .selected').each(function(){ - jQuery(this).removeClass('selected'); - }); + jQuery('div.file').empty(); + jQuery('div.namespaces .selected').removeClass('selected'); $link.addClass('selected'); } } - params = ''; + params = 'call=medialist&'; if ($link[0].search) { - params = $link[0].search.substr(1)+'&call=medialist'; - } else if ($link[0].action) { - params = dw_mediamanager.form_params($link)+'&call=medialist'; - } else if ($link.parents('form')) { - params = dw_mediamanager.form_params($link.parents('form'))+'&call=medialist'; - - if ($link.parents('form')[0].id == 'mediamanager__form_sort') { - DokuCookie.setValue('sort', $link[0].value); - params += '&q=' + jQuery('#mediamanager__sort_textfield').val(); - params += '&mediado=searchlist'; - } + 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); - - if (document.getElementById('media__content')) { - //popup - $content = jQuery('#media__content'); - $content.html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />'); - } else { - //fullscreen media manager - jQuery('.scroll-container', $content).html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />'); - } }, /** @@ -325,49 +344,41 @@ var dw_mediamanager = { */ form_params: function ($form) { if (!$form.length) return; - var elements = $form.serialize(); var action = ''; var i = $form[0].action.indexOf('?'); if (i >= 0) action = $form[0].action.substr(i+1); - return elements+'&'+action; + return action+'&'+$form.serialize(); }, - /** - * Changes view of media files list - * - * @author Kate Arzamastseva <pshns@ukr.net> - */ - list_view: function (event) { - var $link, $content; - $link = jQuery(this); - - event.preventDefault(); + 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); - $content = jQuery('#mediamanager__file_list'); + // FIXME: Move to onchange handler (opt[2])? + dw_mediamanager.resize(); + }, - if ($link[0].id == 'mediamanager__link_thumbs') { - dw_mediamanager.set_filelist_view('thumbs', true); + set_fileview_sort: function (new_sort) { + dw_mediamanager.set_fileview_opt(['sort', 'sortBy', function (new_sort) { + // FIXME + }], new_sort); + }, - } else if ($link[0].id == 'mediamanager__link_list') { - dw_mediamanager.set_filelist_view('list', true); + set_fileview_opt: function (opt, new_val) { + if (typeof new_val === 'undefined') { + new_val = jQuery('form.options li.' + opt[1] + ' input') + .filter(':checked').val(); } - }, - set_filelist_view: function (type, cookies) { - var $content = jQuery('#mediamanager__file_list'); - if (!type) type = DokuCookie.getValue('view'); + if (new_val !== dw_mediamanager.view_opts[opt[0]]) { + opt[2](new_val); - if (type == 'thumbs') { - $content.removeClass('mediamanager-list'); - $content.addClass('mediamanager-thumbs'); - if (cookies) DokuCookie.setValue('view', 'thumbs'); - dw_mediamanager.view = 'thumbs'; + DokuCookie.setValue(opt[0], new_val); - } else if (type == 'list') { - $content.removeClass('mediamanager-thumbs'); - $content.addClass('mediamanager-list'); - if (cookies) DokuCookie.setValue('view', 'list'); - dw_mediamanager.view = 'list'; + dw_mediamanager.view_opts[opt[0]] = new_val; } }, @@ -379,43 +390,46 @@ var dw_mediamanager = { 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; + 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('#mediamanager__layout_detail'); - params = ''; + $content = jQuery('div.file'); + params = 'call=mediadetails&'; if ($link[0].search) { - params = $link[0].search.substr(1)+'&call=mediadetails'; - } else if ($link[0].action) { - params = dw_mediamanager.form_params($link)+'&call=mediadetails'; - } else if ($link.parents('form')) { - params = dw_mediamanager.form_params($link.parents('form'))+'&call=mediadetails'; + 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_list = ($link[0].id == 'mediamanager__btn_delete' || + $link[0].id == 'mediamanager__btn_restore'); - if (jQuery('.scroll-container', $content).length) { - jQuery('.scroll-container', $content).html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />'); - } else { - jQuery($content).html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />'); - } + 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) { - jQuery('.ui-resizable').each(function(){ - jQuery(this).resizable('destroy'); - }); + dw_mediamanager.$resizables().resizable('destroy'); + + if (update_list) { + dw_mediamanager.list.call(jQuery('input[value="Apply"]')[0]); + } $content.html(data); @@ -424,128 +438,101 @@ var dw_mediamanager = { dw_mediamanager.update_resizable(); dw_behaviour.revisionBoxHandler(); - jQuery('#mediamanager__form_sort').find('input[type=submit]').hide(); - dw_mediamanager.set_filelist_view(dw_mediamanager.view, false); + + // 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(); - if (update_list) { - var $link1, $content1, params1; - $link1 = jQuery('a.files'); - params1 = $link1[0].search.substr(1)+'&call=medialist'; - $content1 = jQuery('#mediamanager__layout_list'); - dw_mediamanager.update_content($content1, params1); - jQuery('.scroll-container', $content1).html('<img src="' + DOKU_BASE + 'lib/images/loading.gif" alt="..." class="load" />'); - } }, '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 () { - if (jQuery('#mediamanager__layout').width() == dw_mediamanager.layout_width) { - return; - } - - dw_mediamanager.layout_width = jQuery('#mediamanager__layout').width(); - $r = jQuery("#mediamanager__layout .layout-resizable, #mediamanager__layout .layout"); - - var w = 0, wSum = 0, mCount = 0, mArray = []; - $r.each(function() { - w = jQuery(this).width(); - if (w == parseFloat(jQuery(this).css("min-width"))) { - wSum += w; - } else { - mArray[mCount] = jQuery(this); - mCount++; - } - }); - - if (mCount > 0) { - var width = (0.95 * jQuery('#mediamanager__layout').width() - wSum - 30); - wSum = 0; - for(var i = 0; i < mArray.length; i++) { - wSum += mArray[i].width(); - } - for(var i = 0; i < mArray.length; i++) { - w = mArray[i].width(); - w = 100*w / wSum; - mArray[i].width(width*w/100); - } - } - - $r.each(function() { - w = jQuery(this).width(); - w = (100 * w / jQuery('#mediamanager__layout').width()); - w += "%"; - jQuery(this).width(w); - }); - - var windowHeight = jQuery(window).height(); - var height = windowHeight - 300; - if (layout_height < height) { - layout_height = height; - jQuery('#mediamanager__layout .scroll-container').each(function (i) { - jQuery(this).height(height); - }); - $resizable.each(function() { - jQuery(this).height(height+100); - }); - } + 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 () { - $resizable = jQuery("#mediamanager__layout .layout-resizable"); + $resizables = dw_mediamanager.$resizables(); - $resizable.resizable({ handles: 'e' , + $resizables.resizable({ + handles: 'e', resize: function(event, ui){ - var w = 0; - $resizable.each(function() { - w += jQuery(this).width(); - }); - wSum = w + parseFloat(jQuery('#mediamanager__layout_detail').css("min-width")); - - // max width of resizable column - var maxWidth = 0.95 * jQuery('#mediamanager__layout').width() - wSum + jQuery(this).width() - 30; - $resizable.resizable( "option", "maxWidth", maxWidth ); - - // percentage width of the first two columns - var wLeft = ( 100*(w+30) / jQuery('#mediamanager__layout').width() ); - - // width of the third column - var wRight = 95-wLeft; - wRight += "%"; - jQuery('#mediamanager__layout_detail').width(wRight); - - $resizable.each(function() { - w = jQuery(this).width(); - w = (100 * w / jQuery('#mediamanager__layout').width()); - w += "%"; - jQuery(this).width(w); + 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); + }); + } dw_mediamanager.opacity_slider(); dw_mediamanager.portions_slider(); } }); - var windowHeight = jQuery(window).height(); - var height = windowHeight - 300; - layout_height = height; - jQuery('#mediamanager__layout .scroll-container').each(function (i) { - jQuery(this).height(height); - }); - $resizable.each(function() { - jQuery(this).height(height+100); - }); + dw_mediamanager.resize(); + }, + + 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 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); + }); + } }, /** @@ -560,7 +547,7 @@ var dw_mediamanager = { if (!$form.length) return; $label = jQuery(document.createElement('label')); - $label.append('<span>'+LANG.media_diff+'</span>'); + $label.append('<span>'+LANG.media_diff+'</span> '); $select = jQuery(document.createElement('select')) .attr('id', 'mediamanager__difftype') .attr('name', 'difftype') @@ -571,11 +558,11 @@ var dw_mediamanager = { $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; + // 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; }, /** @@ -587,7 +574,7 @@ var dw_mediamanager = { $select = jQuery('#mediamanager__difftype'); $content = jQuery('#mediamanager__diff'); - params = dw_mediamanager.form_params($select.parents('form'))+'&call=mediadiff'; + params = dw_mediamanager.form_params($select.closest('form'))+'&call=mediadiff'; jQuery.post( DOKU_BASE + 'lib/exe/ajax.php', params, @@ -606,10 +593,10 @@ var dw_mediamanager = { * @author Kate Arzamastseva <pshns@ukr.net> */ opacity_slider: function () { - var $slider = jQuery( "#mediamanager__opacity_slider" ); + var $slider = jQuery( "#mediamanager__diff div.slider" ); if (!$slider.length) return; - var $image = jQuery('#mediamanager__diff_opacity_image1 img'); + var $image = jQuery('#mediamanager__diff div.imageDiff.opacity div.image1 img'); if (!$image.length) return; $slider.width($image.width()-20); @@ -619,7 +606,7 @@ var dw_mediamanager = { $slider.slider("option", "step", 0.001); $slider.slider("option", "value", 0.5); $slider.bind("slide", function(event, ui) { - jQuery('#mediamanager__diff_opacity_image2').css({ opacity: $slider.slider("option", "value")}); + jQuery('#mediamanager__diff div.imageDiff.opacity div.image2 img').css({ opacity: $slider.slider("option", "value")}); }); }, @@ -629,11 +616,11 @@ var dw_mediamanager = { * @author Kate Arzamastseva <pshns@ukr.net> */ portions_slider: function () { - var $image1 = jQuery('#mediamanager__diff_portions_image1 img'); - var $image2 = jQuery('#mediamanager__diff_portions_image2 img'); + 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; - var $div = jQuery("#mediamanager__diff_layout"); + var $div = jQuery("#mediamanager__diff"); if (!$div.length) return; $div.width('100%'); @@ -649,7 +636,7 @@ var dw_mediamanager = { $image2.width($image1.width()); $image1.width($image1.width()); - var $slider = jQuery("#mediamanager__portions_slider"); + var $slider = jQuery("#mediamanager__diff div.slider"); if (!$slider.length) return; $slider.width($image1.width()-20); @@ -659,16 +646,21 @@ var dw_mediamanager = { $slider.slider("option", "step", 1); $slider.slider("option", "value", 50); $slider.bind("slide", function(event, ui) { - jQuery('#mediamanager__diff_portions_image2').css({ width: $slider.slider("option", "value")+'%'}); + jQuery('#mediamanager__diff 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[hash[0]] = hash[1]; + vars[decodeURIComponent(hash[0])] = decodeURIComponent(hash[1]); } return vars; }, @@ -828,33 +820,6 @@ var dw_mediamanager = { } }, - initFlashUpload: function () { - var $oform, $oflash; - if(!hasFlash(8)) { - return; - } - - $oform = jQuery('#dw__upload'); - $oflash = jQuery('#dw__flashupload'); - - if(!$oform.length || !$oflash.length) { - return; - } - - jQuery(document.createElement('img')) - .attr('src', DOKU_BASE+'lib/images/multiupload.png') - .attr('title', LANG.mu_btn) - .attr('alt', LANG.mu_btn) - .css('cursor', 'pointer') - .click( - function () { - $oform.hide(); - $oflash.show(); - } - ) - .appendTo($oform); - }, - /** * Sets the visibility of the image details accordingly to the * chosen hide state @@ -966,10 +931,4 @@ function hasFlash(version){ return ver >= version; } -jQuery(document).ready(function() { - dw_mediamanager.update_resizable(); - dw_mediamanager.layout_width = jQuery("#mediamanager__layout").width(); - jQuery(window).resize(dw_mediamanager.window_resize); -}); - jQuery(dw_mediamanager.init); |