From 23846a98488bec2aaade6d983b4c0b0db13af80c Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Sun, 3 Jul 2011 19:00:54 +0300 Subject: ajax mediamanager --- lib/scripts/media.js | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index ebbee5a78..e03d1cf7b 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -328,7 +328,17 @@ jQuery('div.success, div.info, div.error, div.notify').remove(); - content = $('#media__content'); + if (document.getElementById('media__content')) { + content = $('#media__content'); + } else { + content = $('#mediamanager__files'); + if (link.hasClass('idx_dir')) { + change_tab($('.files'), '#mediamanager__tabs_files'); + $('#mediamanager__layout_detail').empty(); + } else { + change_tab(link, '#mediamanager__tabs_files'); + } + } content.html('...'); // fetch the subtree @@ -345,6 +355,77 @@ }; + /** + * Changes selected tab + * + * @author Kate Arzamastseva + */ + change_tab = function (tab, tab_menu_id) { + $(tab_menu_id + ' a').each(function (i) { + $(this).removeClass('selected'); + }); + tab.addClass('selected'); + }; + + /** + * Changes view of media files list + * + * @author Kate Arzamastseva + */ + list_view = function (event) { + var link, content; + link = $(this); + + event.preventDefault(); + + content = $('#mediamanager__file_list'); + if (link.hasClass('mediamanager-link-thumbnails')) { + content.removeClass('mediamanager-list'); + content.addClass('mediamanager-thumbs'); + } else if (link.hasClass('mediamanager-link-list')) { + content.removeClass('mediamanager-thumbs'); + content.addClass('mediamanager-list'); + } + }; + + /** + * Lists the content of the right column (image details) using AJAX + * + * @author Kate Arzamastseva + */ + details = function (event) { + var link, content, call, full; + link = $(this); + + event.preventDefault(); + + jQuery('div.success, div.info, div.error, div.notify').remove(); + + full=''; + if (document.getElementById('mediamanager__details')) { + content = $('#mediamanager__details'); + } else { + content = $('#mediamanager__layout_detail'); + full = '&full=true'; + } + + if (link.hasClass('name')) { + change_tab($('.view'), '#mediamanager__tabs_details'); + } else { + change_tab(link, '#mediamanager__tabs_details'); + } + content.html('...'); + + $.post( + DOKU_BASE + 'lib/exe/ajax.php', + link[0].search.substr(1)+'&call=mediadetails'+full, + function (data) { + content.html(data); + }, + 'html' + ); + }; + prepare_content = function (content) { // hide syntax example content.find('div.example:visible').hide(); @@ -748,5 +829,12 @@ $('#media__tree').delegate('img', 'click', toggle) .delegate('a', 'click', list); + + $('#mediamanager__tabs_files').delegate('a', 'click', list); + + $('#mediamanager__files').delegate('#mediamanager__tabs_list a', 'click', list_view) + .delegate('#mediamanager__file_list a', 'click', details); + + $('#mediamanager__layout_detail').delegate('#mediamanager__tabs_details a', 'click', details); }); }(jQuery)); -- cgit v1.2.3 From ed69a2ae06c0707fdd5634e18d569c25f0cda6d5 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Sun, 3 Jul 2011 23:56:26 +0300 Subject: ajax mediamanager fix --- lib/scripts/media.js | 68 ++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index e03d1cf7b..a7574b804 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -11,7 +11,7 @@ * @author Pierre Spring */ (function ($) { - var toggle, list, prepare_content, insert, confirmattach, attachoptions, initpopup, updatehide, setalign, setsize, inSet, outSet, media_manager, hasFlash; + var toggle, list, prepare_content, insert, confirmattach, attachoptions, initpopup, updatehide, setalign, setsize, inSet, outSet, media_manager, hasFlash, form_params, list_view, details; var media_manager = { keepopen: false, @@ -321,7 +321,7 @@ * @author Pierre Spring */ list = function (event) { - var link, content; + var link, content, params; link = $(this); event.preventDefault(); @@ -329,22 +329,33 @@ jQuery('div.success, div.info, div.error, div.notify').remove(); if (document.getElementById('media__content')) { + //popup content = $('#media__content'); + } else { - content = $('#mediamanager__files'); + //fullscreen media manager + content = $('#mediamanager__layout_list'); + if (link.hasClass('idx_dir')) { - change_tab($('.files'), '#mediamanager__tabs_files'); + //changing namespace $('#mediamanager__layout_detail').empty(); - } else { - change_tab(link, '#mediamanager__tabs_files'); } } - content.html('...'); + + params = ''; + + if (link[0].search) { + params = link[0].search.substr(1)+'&call=medialist'; + } else if (link[0].action) { + params = form_params(link)+'&call=medialist'; + } + + $('.scroll-container', content).html('...'); // fetch the subtree $.post( DOKU_BASE + 'lib/exe/ajax.php', - link[0].search.substr(1)+'&call=medialist', + params, function (data) { content.html(data); prepare_content(content); @@ -356,15 +367,16 @@ }; /** - * Changes selected tab + * Returns form parameters * * @author Kate Arzamastseva */ - change_tab = function (tab, tab_menu_id) { - $(tab_menu_id + ' a').each(function (i) { - $(this).removeClass('selected'); - }); - tab.addClass('selected'); + form_params = function (form) { + 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; }; /** @@ -394,31 +406,19 @@ * @author Kate Arzamastseva */ details = function (event) { - var link, content, call, full; + var link, content; link = $(this); event.preventDefault(); jQuery('div.success, div.info, div.error, div.notify').remove(); - full=''; - if (document.getElementById('mediamanager__details')) { - content = $('#mediamanager__details'); - } else { - content = $('#mediamanager__layout_detail'); - full = '&full=true'; - } - - if (link.hasClass('name')) { - change_tab($('.view'), '#mediamanager__tabs_details'); - } else { - change_tab(link, '#mediamanager__tabs_details'); - } - content.html('...'); + content = $('#mediamanager__layout_detail'); + $('.scroll-container', content).html('...'); $.post( DOKU_BASE + 'lib/exe/ajax.php', - link[0].search.substr(1)+'&call=mediadetails'+full, + link[0].search.substr(1)+'&call=mediadetails', function (data) { content.html(data); }, @@ -830,11 +830,11 @@ $('#media__tree').delegate('img', 'click', toggle) .delegate('a', 'click', list); - $('#mediamanager__tabs_files').delegate('a', 'click', list); - - $('#mediamanager__files').delegate('#mediamanager__tabs_list a', 'click', list_view) + $('#mediamanager__layout_list').delegate('#mediamanager__tabs_files a', 'click', list) + .delegate('#mediamanager__tabs_list a', 'click', list_view) .delegate('#mediamanager__file_list a', 'click', details); - $('#mediamanager__layout_detail').delegate('#mediamanager__tabs_details a', 'click', details); + $('#mediamanager__layout_detail').delegate('#mediamanager__tabs_details a', 'click', details) + .delegate('#mediamanager__btn_update', 'submit', list); }); }(jQuery)); -- cgit v1.2.3 From 7d7ab775ac0252d50835987b276a95b790cd1434 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Mon, 4 Jul 2011 22:35:44 +0300 Subject: mediamanager ajax forms --- lib/scripts/media.js | 55 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 17 deletions(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index a7574b804..245519cbc 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -11,7 +11,7 @@ * @author Pierre Spring */ (function ($) { - var toggle, list, prepare_content, insert, confirmattach, attachoptions, initpopup, updatehide, setalign, setsize, inSet, outSet, media_manager, hasFlash, form_params, list_view, details; + var toggle, list, prepare_content, insert, confirmattach, attachoptions, initpopup, updatehide, setalign, setsize, inSet, outSet, media_manager, hasFlash, form_params, list_view, details, update_content; var media_manager = { keepopen: false, @@ -331,6 +331,7 @@ if (document.getElementById('media__content')) { //popup content = $('#media__content'); + content.html('...'); } else { //fullscreen media manager @@ -340,6 +341,8 @@ //changing namespace $('#mediamanager__layout_detail').empty(); } + + $('.scroll-container', content).html('...'); } params = ''; @@ -350,19 +353,8 @@ params = form_params(link)+'&call=medialist'; } - $('.scroll-container', content).html('...'); - // fetch the subtree - $.post( - DOKU_BASE + 'lib/exe/ajax.php', - params, - function (data) { - content.html(data); - prepare_content(content); - updatehide(); - }, - 'html' - ); + update_content(content, params); }; @@ -406,7 +398,7 @@ * @author Kate Arzamastseva */ details = function (event) { - var link, content; + var link, content, params, update_list; link = $(this); event.preventDefault(); @@ -416,9 +408,32 @@ content = $('#mediamanager__layout_detail'); $('.scroll-container', content).html('...'); + params = ''; + + if (link[0].search) { + params = link[0].search.substr(1)+'&call=mediadetails'; + } else { + params = form_params(link)+'&call=mediadetails'; + } + + update_content(content, params); + + update_list = (link[0].id == 'mediamanager__btn_delete' || link[0].id == 'mediamanager__btn_restore'); + if (update_list) { + var link1, content1, params1; + link1 = $('a.files'); + params1 = link1[0].search.substr(1)+'&call=medialist'; + content1 = $('#mediamanager__layout_list'); + $('.scroll-container', content1).html('...'); + + update_content(content1, params1); + } + }; + + update_content = function (content, params) { $.post( DOKU_BASE + 'lib/exe/ajax.php', - link[0].search.substr(1)+'&call=mediadetails', + params, function (data) { content.html(data); }, @@ -832,9 +847,15 @@ $('#mediamanager__layout_list').delegate('#mediamanager__tabs_files a', 'click', list) .delegate('#mediamanager__tabs_list a', 'click', list_view) - .delegate('#mediamanager__file_list a', 'click', details); + .delegate('#mediamanager__file_list a', 'click', details) + .delegate('#dw__mediasearch', 'submit', list); $('#mediamanager__layout_detail').delegate('#mediamanager__tabs_details a', 'click', details) - .delegate('#mediamanager__btn_update', 'submit', list); + .delegate('#mediamanager__btn_update', 'submit', list) + .delegate('#page__revisions', 'submit', details) + .delegate('#page__revisions a', 'click', details) + .delegate('#mediamanager__save_meta', 'submit', details) + .delegate('#mediamanager__btn_delete', 'submit', details) + .delegate('#mediamanager__btn_restore', 'submit', details); }); }(jQuery)); -- cgit v1.2.3 From 6183fb05112cd318d9a6885d9405cff9917ee82f Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Fri, 8 Jul 2011 13:54:15 +0300 Subject: mediamanager fix --- lib/scripts/media.js | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 245519cbc..4eb1e7b63 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -405,6 +405,9 @@ 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 = $('#mediamanager__layout_detail'); $('.scroll-container', content).html('...'); -- cgit v1.2.3 From f6f771ca288974ca7d259cf35f0d416fef44ef6e Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Sat, 9 Jul 2011 21:04:18 +0300 Subject: media.js fix --- lib/scripts/media.js | 102 +++++++++++++++++++++++++-------------------------- 1 file changed, 51 insertions(+), 51 deletions(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 4eb1e7b63..8c68fa569 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -321,8 +321,8 @@ * @author Pierre Spring */ list = function (event) { - var link, content, params; - link = $(this); + var $link, $content, params; + $link = jQuery(this); event.preventDefault(); @@ -330,31 +330,31 @@ if (document.getElementById('media__content')) { //popup - content = $('#media__content'); - content.html('...'); + $content = jQuery('#media__content'); + $content.html('...'); } else { //fullscreen media manager - content = $('#mediamanager__layout_list'); + $content = jQuery('#mediamanager__layout_list'); - if (link.hasClass('idx_dir')) { + if ($link.hasClass('idx_dir')) { //changing namespace - $('#mediamanager__layout_detail').empty(); + jQuery('#mediamanager__layout_detail').empty(); } - $('.scroll-container', content).html('...'); + jQuery('.scroll-container', $content).html('...'); } params = ''; - if (link[0].search) { - params = link[0].search.substr(1)+'&call=medialist'; - } else if (link[0].action) { - params = form_params(link)+'&call=medialist'; + if ($link[0].search) { + params = $link[0].search.substr(1)+'&call=medialist'; + } else if ($link[0].action) { + params = form_params($link)+'&call=medialist'; } // fetch the subtree - update_content(content, params); + update_content($content, params); }; @@ -363,11 +363,11 @@ * * @author Kate Arzamastseva */ - form_params = function (form) { - var elements = form.serialize(); + form_params = function ($form) { + var elements = $form.serialize(); var action = ''; - var i = form[0].action.indexOf('?'); - if (i >= 0) action = form[0].action.substr(i+1); + var i = $form[0].action.indexOf('?'); + if (i >= 0) action = $form[0].action.substr(i+1); return elements+'&'+action; }; @@ -377,18 +377,18 @@ * @author Kate Arzamastseva */ list_view = function (event) { - var link, content; - link = $(this); + var $link, $content; + $link = jQuery(this); event.preventDefault(); - content = $('#mediamanager__file_list'); - if (link.hasClass('mediamanager-link-thumbnails')) { - content.removeClass('mediamanager-list'); - content.addClass('mediamanager-thumbs'); - } else if (link.hasClass('mediamanager-link-list')) { - content.removeClass('mediamanager-thumbs'); - content.addClass('mediamanager-list'); + $content = jQuery('#mediamanager__file_list'); + if ($link.hasClass('mediamanager-link-thumbnails')) { + $content.removeClass('mediamanager-list'); + $content.addClass('mediamanager-thumbs'); + } else if ($link.hasClass('mediamanager-link-list')) { + $content.removeClass('mediamanager-thumbs'); + $content.addClass('mediamanager-list'); } }; @@ -398,43 +398,43 @@ * @author Kate Arzamastseva */ details = function (event) { - var link, content, params, update_list; - link = $(this); + 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 = $('#mediamanager__layout_detail'); - $('.scroll-container', content).html('...'); + $content = $('#mediamanager__layout_detail'); + jQuery('.scroll-container', $content).html('...'); params = ''; - if (link[0].search) { - params = link[0].search.substr(1)+'&call=mediadetails'; + if ($link[0].search) { + params = $link[0].search.substr(1)+'&call=mediadetails'; } else { - params = form_params(link)+'&call=mediadetails'; + params = form_params($link)+'&call=mediadetails'; } - update_content(content, params); + update_content($content, params); - update_list = (link[0].id == 'mediamanager__btn_delete' || link[0].id == 'mediamanager__btn_restore'); + update_list = ($link[0].id == 'mediamanager__btn_delete' || $link[0].id == 'mediamanager__btn_restore'); if (update_list) { - var link1, content1, params1; - link1 = $('a.files'); - params1 = link1[0].search.substr(1)+'&call=medialist'; - content1 = $('#mediamanager__layout_list'); - $('.scroll-container', content1).html('...'); + var $link1, $content1, params1; + $link1 = jQuery('a.files'); + params1 = $link1[0].search.substr(1)+'&call=medialist'; + $content1 = jQuery('#mediamanager__layout_list'); + jQuery('.scroll-container', $content1).html('...'); - update_content(content1, params1); + update_content($content1, params1); } }; - update_content = function (content, params) { - $.post( + update_content = function ($content, params) { + jQuery.post( DOKU_BASE + 'lib/exe/ajax.php', params, function (data) { @@ -831,29 +831,29 @@ }; $(function () { - var content = $('#media__content'); - prepare_content(content); + var $content = jQuery('#media__content'); + prepare_content($content); attachoptions(); initpopup(); // add the action to autofill the "upload as" field - content.delegate('#upload__file', 'change', suggest) + $content.delegate('#upload__file', 'change', suggest) // Attach the image selector action to all links .delegate('a.select', 'click', select) // Attach deletion confirmation dialog to the delete buttons .delegate('#media__content a.btn_media_delete', 'click', confirmattach); - $('#media__tree').delegate('img', 'click', toggle) + jQuery('#media__tree').delegate('img', 'click', toggle) .delegate('a', 'click', list); - $('#mediamanager__layout_list').delegate('#mediamanager__tabs_files a', 'click', list) + jQuery('#mediamanager__layout_list').delegate('#mediamanager__tabs_files a', 'click', list) .delegate('#mediamanager__tabs_list a', 'click', list_view) .delegate('#mediamanager__file_list a', 'click', details) .delegate('#dw__mediasearch', 'submit', list); - $('#mediamanager__layout_detail').delegate('#mediamanager__tabs_details a', 'click', details) + jQuery('#mediamanager__layout_detail').delegate('#mediamanager__tabs_details a', 'click', details) .delegate('#mediamanager__btn_update', 'submit', list) .delegate('#page__revisions', 'submit', details) .delegate('#page__revisions a', 'click', details) -- cgit v1.2.3 From de11c42f80968ac41dc4164829845c1e5dae25c2 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Sat, 9 Jul 2011 23:21:50 +0300 Subject: media-manager fixes --- lib/scripts/media.js | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 8c68fa569..f261bd2d5 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -340,6 +340,10 @@ if ($link.hasClass('idx_dir')) { //changing namespace jQuery('#mediamanager__layout_detail').empty(); + jQuery('#media__tree .selected').each(function(){ + $(this).removeClass('selected'); + }); + $link.addClass('selected'); } jQuery('.scroll-container', $content).html('...'); -- cgit v1.2.3 From e1dc10a4aab705171d34c7bde642ed77032c95c7 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Sun, 10 Jul 2011 15:36:01 +0300 Subject: media.js fixes --- lib/scripts/media.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 3f263f42a..36c06a3aa 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -253,7 +253,7 @@ var dw_mediamanager = { //changing namespace jQuery('#mediamanager__layout_detail').empty(); jQuery('#media__tree .selected').each(function(){ - $(this).removeClass('selected'); + jQuery(this).removeClass('selected'); }); $link.addClass('selected'); } @@ -272,7 +272,7 @@ var dw_mediamanager = { // fetch the subtree dw_mediamanager.update_content($content, params); - }; + }, /** * Returns form parameters @@ -324,7 +324,7 @@ var dw_mediamanager = { 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 = $('#mediamanager__layout_detail'); + $content = jQuery('#mediamanager__layout_detail'); jQuery('.scroll-container', $content).html('...'); params = ''; @@ -354,7 +354,7 @@ var dw_mediamanager = { DOKU_BASE + 'lib/exe/ajax.php', params, function (data) { - content.html(data); + $content.html(data); dw_mediamanager.prepare_content($content); dw_mediamanager.updatehide(); }, @@ -604,7 +604,7 @@ var dw_mediamanager = { var allowed = bind(dw_mediamanager.allowedOpt, opt); // Current value - if (dw_mediamanager[opt] !== false && allowed(dw_mediamanager[opt]) { + if (dw_mediamanager[opt] !== false && allowed(dw_mediamanager[opt])) { return dw_mediamanager[opt]; } -- cgit v1.2.3 From 4928b6eb7137cb1e8727ca7a7fc99db614b0df88 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Sun, 10 Jul 2011 16:38:04 +0300 Subject: mediamanager resizable --- lib/scripts/media.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 36c06a3aa..af5346cbe 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -354,14 +354,43 @@ var dw_mediamanager = { DOKU_BASE + 'lib/exe/ajax.php', params, function (data) { + jQuery('.ui-resizable').each(function(){ + jQuery(this).resizable('destroy'); + }); + $content.html(data); dw_mediamanager.prepare_content($content); dw_mediamanager.updatehide(); + dw_mediamanager.update_resizable(0); }, 'html' ); }, + update_resizable: function (count_width) { + jQuery(".layout").resizable({ handles: 'e' }); + jQuery(".layout").bind("resize", function(event, ui) { + var w = 0; + jQuery(".layout").each(function() { + w += jQuery(this).width(); + }); + jQuery('#id-mediamanager-layout').width(w+30); + }); + + var w = 0; + jQuery(".layout").each(function() { + if (count_width) jQuery(this).width(jQuery(this).width()); + w += jQuery(this).width(); + }); + jQuery('#id-mediamanager-layout').width(w+30); + + var windowHeight = jQuery(window).height(); + var height = windowHeight - 300; + jQuery('.scroll-container').each(function (i) { + jQuery(this).height(height); + }); + }, + prepare_content: function ($content) { // hide syntax example $content.find('div.example:visible').hide(); @@ -642,4 +671,8 @@ function hasFlash(version){ return ver >= version; } +jQuery(document).ready(function() { + dw_mediamanager.update_resizable(1); +}); + jQuery(dw_mediamanager.init); -- cgit v1.2.3 From dd9ba38e965cfc3c06fbb80fed65556dbfbfda1c Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Thu, 14 Jul 2011 11:36:48 +0300 Subject: mediamanager tabs, upload form fix --- lib/scripts/media.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index af5346cbe..de3d03dfe 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -64,7 +64,8 @@ var dw_mediamanager = { jQuery('#mediamanager__layout_list').delegate('#mediamanager__tabs_files a', 'click', dw_mediamanager.list) .delegate('#mediamanager__tabs_list a', 'click', dw_mediamanager.list_view) .delegate('#mediamanager__file_list a', 'click', dw_mediamanager.details) - .delegate('#dw__mediasearch', 'submit', dw_mediamanager.list); + .delegate('#dw__mediasearch', 'submit', dw_mediamanager.list) + .delegate('#upload__file', 'change', dw_mediamanager.suggest); jQuery('#mediamanager__layout_detail').delegate('#mediamanager__tabs_details a', 'click', dw_mediamanager.details) .delegate('#mediamanager__btn_update', 'submit', dw_mediamanager.list) @@ -216,6 +217,9 @@ var dw_mediamanager = { $file = jQuery(this); $name = jQuery('#upload__name'); + + if ($name.val() != '') return; + if(!$file.length || !$name.length) { return; } -- cgit v1.2.3 From 23786fd7ff0ff9c41ba627bc43ba6a45d3b779cc Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Thu, 14 Jul 2011 23:37:38 +0300 Subject: mediamanager icons --- lib/scripts/media.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index de3d03dfe..62cc1e7bb 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -329,7 +329,11 @@ var dw_mediamanager = { if ($link[0].id == 'mediamanager__btn_restore' && !confirm(LANG['restore_confirm'])) return false; $content = jQuery('#mediamanager__layout_detail'); - jQuery('.scroll-container', $content).html('...'); + if (jQuery('.scroll-container', $content).length) { + jQuery('.scroll-container', $content).html('...'); + } else { + jQuery($content).html('...'); + } params = ''; -- cgit v1.2.3 From e136d6cc09a2c32050ecc37d7b0deebd0979c15d Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Sat, 16 Jul 2011 23:48:48 +0300 Subject: mediamanager image diff --- lib/scripts/media.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 777eb4825..8500166dc 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -369,6 +369,9 @@ var dw_mediamanager = { dw_mediamanager.prepare_content($content); dw_mediamanager.updatehide(); dw_mediamanager.update_resizable(0); + dw_mediamanager.opacity_slider(); + dw_mediamanager.portions_slider(); + }, 'html' ); @@ -398,6 +401,30 @@ var dw_mediamanager = { }); }, + opacity_slider: function () { + var $slider = jQuery( "#mediamanager__opacity_slider" ); + $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_opacity_image2').css({ opacity: $slider.slider("option", "value")}); + }); + }, + + portions_slider: function () { + var $slider = jQuery( "#mediamanager__portions_slider" ); + $slider.slider(); + $slider.slider("option", "min", 0); + $slider.slider("option", "max", 100); + $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")+'%'}); + }); + }, + prepare_content: function ($content) { // hide syntax example $content.find('div.example:visible').hide(); @@ -680,6 +707,8 @@ function hasFlash(version){ jQuery(document).ready(function() { dw_mediamanager.update_resizable(1); + dw_mediamanager.opacity_slider(); + dw_mediamanager.portions_slider(); }); jQuery(dw_mediamanager.init); -- cgit v1.2.3 From fa8e5c7713944541c907aea2b81c6a44382a15f0 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Sun, 17 Jul 2011 18:42:43 +0300 Subject: mediamanager html, css reworking --- lib/scripts/media.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 8500166dc..c5e6afc9b 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -302,10 +302,12 @@ var dw_mediamanager = { event.preventDefault(); $content = jQuery('#mediamanager__file_list'); - if ($link.hasClass('mediamanager-link-thumbnails')) { + + if ($link[0].id == 'mediamanager__link_thumbs') { $content.removeClass('mediamanager-list'); $content.addClass('mediamanager-thumbs'); - } else if ($link.hasClass('mediamanager-link-list')) { + + } else if ($link[0].id == 'mediamanager__link_list') { $content.removeClass('mediamanager-thumbs'); $content.addClass('mediamanager-list'); } -- cgit v1.2.3 From 80291f9e4256d8bd01f0b0a0589aab2ea402ab64 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Mon, 18 Jul 2011 16:51:47 +0300 Subject: mediamanager resize --- lib/scripts/media.js | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index c5e6afc9b..00a4821d0 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -380,27 +380,38 @@ var dw_mediamanager = { }, update_resizable: function (count_width) { - jQuery(".layout").resizable({ handles: 'e' }); - jQuery(".layout").bind("resize", function(event, ui) { - var w = 0; - jQuery(".layout").each(function() { - w += jQuery(this).width(); - }); - jQuery('#id-mediamanager-layout').width(w+30); - }); + $resizable = jQuery("#mediamanager__layout .layout-resizable"); + + $resizable.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")); - var w = 0; - jQuery(".layout").each(function() { - if (count_width) jQuery(this).width(jQuery(this).width()); - w += jQuery(this).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); + } }); - jQuery('#id-mediamanager-layout').width(w+30); var windowHeight = jQuery(window).height(); var height = windowHeight - 300; - jQuery('.scroll-container').each(function (i) { + jQuery('#mediamanager__layout .scroll-container').each(function (i) { jQuery(this).height(height); }); + $resizable.each(function() { + jQuery(this).height(height+100); + }); }, opacity_slider: function () { @@ -711,6 +722,7 @@ jQuery(document).ready(function() { dw_mediamanager.update_resizable(1); dw_mediamanager.opacity_slider(); dw_mediamanager.portions_slider(); + jQuery(window).resize(dw_mediamanager.update_resizable); }); jQuery(dw_mediamanager.init); -- cgit v1.2.3 From 67c8cda19c0bf26a746d5c5cf9c82ee7ae5f23ca Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Tue, 19 Jul 2011 18:36:15 +0300 Subject: mediamanager revisions form --- lib/scripts/media.js | 2 +- lib/scripts/script.js | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 00a4821d0..a6f6c25d4 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -373,7 +373,7 @@ var dw_mediamanager = { dw_mediamanager.update_resizable(0); dw_mediamanager.opacity_slider(); dw_mediamanager.portions_slider(); - + addInitEvent(revisionsForm); }, 'html' ); diff --git a/lib/scripts/script.js b/lib/scripts/script.js index b44d95d6f..33916a92e 100644 --- a/lib/scripts/script.js +++ b/lib/scripts/script.js @@ -285,12 +285,7 @@ function closePopups(){ jQuery('div.JSpopup').hide(); } -/** - * disable multiple revisions checkboxes if two are checked - * - * @author Anika Henke - */ -addInitEvent(function(){ +function revisionsForm(){ var revForm = $('page__revisions'); if (!revForm) return; var elems = revForm.elements; @@ -312,7 +307,15 @@ addInitEvent(function(){ input1.disabled = true; } } -}); +} + + +/** + * disable multiple revisions checkboxes if two are checked + * + * @author Anika Henke + */ +addInitEvent(revisionsForm); /** -- cgit v1.2.3 From b5941dfab8516bd445afebc91d6a4942cab4d5f0 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Mon, 25 Jul 2011 14:06:25 +0300 Subject: Recent Changes integration of media changes --- lib/scripts/behaviour.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/scripts') diff --git a/lib/scripts/behaviour.js b/lib/scripts/behaviour.js index dd7676432..24704565a 100644 --- a/lib/scripts/behaviour.js +++ b/lib/scripts/behaviour.js @@ -73,7 +73,9 @@ var dw_behaviour = { quickSelect: function(){ jQuery('select.quickselect') .change(function(e){ e.target.form.submit(); }) - .parents('form').find('input[type=submit]').hide(); + .parents('form').find('input[type=submit]').each(function(){ + if (!jQuery(this).hasClass('not_hide')) jQuery(this).hide(); + }); }, /** -- cgit v1.2.3 From abc306f45f2ace038967bf7c51abd6ea53f56170 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Mon, 25 Jul 2011 16:23:24 +0300 Subject: mediamanager sort button --- lib/scripts/media.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index a6f6c25d4..44928417f 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -60,18 +60,33 @@ var dw_mediamanager = { }}); $tree.delegate('a', 'click', dw_mediamanager.list); + jQuery('#mediamanager__form_sort').find('input[type=submit]').hide(); + + // 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) + // loading file details .delegate('#mediamanager__file_list a', 'click', dw_mediamanager.details) + // search form .delegate('#dw__mediasearch', 'submit', dw_mediamanager.list) - .delegate('#upload__file', 'change', dw_mediamanager.suggest); + // "upload as" field autofill + .delegate('#upload__file', 'change', dw_mediamanager.suggest) + // sort type selection + .delegate('#mediamanager__form_sort select', 'change', dw_mediamanager.list); + // changing opened tab in the file details panel jQuery('#mediamanager__layout_detail').delegate('#mediamanager__tabs_details 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); }, @@ -270,6 +285,8 @@ var dw_mediamanager = { 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'; } // fetch the subtree -- cgit v1.2.3 From 4ee1558545059fa73700709a9ef4c0ab22ce8f92 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Tue, 26 Jul 2011 11:55:38 +0300 Subject: image diffs fixes --- lib/scripts/media.js | 72 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 5 deletions(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 44928417f..42035a595 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -61,6 +61,7 @@ var dw_mediamanager = { $tree.delegate('a', 'click', dw_mediamanager.list); jQuery('#mediamanager__form_sort').find('input[type=submit]').hide(); + dw_mediamanager.image_diff(); // changing opened tab in the file list panel jQuery('#mediamanager__layout_list').delegate('#mediamanager__tabs_files a', 'click', dw_mediamanager.list) @@ -357,8 +358,10 @@ var dw_mediamanager = { if ($link[0].search) { params = $link[0].search.substr(1)+'&call=mediadetails'; - } else { + } 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'; } dw_mediamanager.update_content($content, params); @@ -385,17 +388,24 @@ var dw_mediamanager = { }); $content.html(data); + dw_mediamanager.prepare_content($content); dw_mediamanager.updatehide(); + dw_mediamanager.update_resizable(0); - dw_mediamanager.opacity_slider(); - dw_mediamanager.portions_slider(); addInitEvent(revisionsForm); + jQuery('#mediamanager__form_sort').find('input[type=submit]').hide(); + dw_mediamanager.image_diff(); }, 'html' ); }, + /** + * Updates mediamanager layout + * + * @author Kate Arzamastseva + */ update_resizable: function (count_width) { $resizable = jQuery("#mediamanager__layout .layout-resizable"); @@ -431,6 +441,55 @@ var dw_mediamanager = { }); }, + /** + * Prints 'select' for image difference representation type + * + * @author Kate Arzamastseva + */ + image_diff: function () { + if (jQuery('#mediamanager__difftype').length) return; + + $form = jQuery('#mediamanager__form_diffview'); + $label = jQuery(document.createElement('label')); + $label.append(''+LANG.media_diff+''); + $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); + }, + + /** + * Handles selection of image difference representation type + * + * @author Kate Arzamastseva + */ + change_diff_type: function () { + $select = jQuery('#mediamanager__difftype'); + $content = jQuery('#mediamanager__diff'); + + params = dw_mediamanager.form_params($select.parents('form'))+'&call=mediadiff'; + jQuery.post( + DOKU_BASE + 'lib/exe/ajax.php', + params, + function (data) { + $content.html(data); + dw_mediamanager.opacity_slider(); + dw_mediamanager.portions_slider(); + }, + 'html' + ); + }, + + /** + * Sets options for opacity diff slider + * + * @author Kate Arzamastseva + */ opacity_slider: function () { var $slider = jQuery( "#mediamanager__opacity_slider" ); $slider.slider(); @@ -443,6 +502,11 @@ var dw_mediamanager = { }); }, + /** + * Sets options for red line diff slider + * + * @author Kate Arzamastseva + */ portions_slider: function () { var $slider = jQuery( "#mediamanager__portions_slider" ); $slider.slider(); @@ -737,8 +801,6 @@ function hasFlash(version){ jQuery(document).ready(function() { dw_mediamanager.update_resizable(1); - dw_mediamanager.opacity_slider(); - dw_mediamanager.portions_slider(); jQuery(window).resize(dw_mediamanager.update_resizable); }); -- cgit v1.2.3 From 676706d3b056c9ad075c09b3bed23a4c2b248f52 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Tue, 26 Jul 2011 11:59:39 +0300 Subject: mediamanager files view state persisted --- lib/scripts/media.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 42035a595..ebd9da2f8 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -22,6 +22,9 @@ var dw_mediamanager = { size: false, forbidden_opts: {}, + // File list view type + view: false, + init: function () { var $content, $tree; $content = jQuery('#media__content'); @@ -60,6 +63,7 @@ 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(); dw_mediamanager.image_diff(); @@ -322,12 +326,28 @@ var dw_mediamanager = { $content = jQuery('#mediamanager__file_list'); if ($link[0].id == 'mediamanager__link_thumbs') { + dw_mediamanager.set_filelist_view('thumbs', true); + + } else if ($link[0].id == 'mediamanager__link_list') { + dw_mediamanager.set_filelist_view('list', true); + } + }, + + set_filelist_view: function (type, cookies) { + var $content = jQuery('#mediamanager__file_list'); + if (!type) type = DokuCookie.getValue('view'); + + if (type == 'thumbs') { $content.removeClass('mediamanager-list'); $content.addClass('mediamanager-thumbs'); + if (cookies) DokuCookie.setValue('view', 'thumbs'); + dw_mediamanager.view = 'thumbs'; - } else if ($link[0].id == 'mediamanager__link_list') { + } else if (type == 'list') { $content.removeClass('mediamanager-thumbs'); $content.addClass('mediamanager-list'); + if (cookies) DokuCookie.setValue('view', 'list'); + dw_mediamanager.view = 'list'; } }, @@ -395,6 +415,7 @@ var dw_mediamanager = { dw_mediamanager.update_resizable(0); addInitEvent(revisionsForm); jQuery('#mediamanager__form_sort').find('input[type=submit]').hide(); + dw_mediamanager.set_filelist_view(dw_mediamanager.view, false); dw_mediamanager.image_diff(); }, 'html' -- cgit v1.2.3 From d971ea8b02ccca4dd879a5db966670e0f3b4f102 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Sat, 30 Jul 2011 20:50:49 +0300 Subject: issue #39 sort by date desc, saved in cookie --- lib/scripts/media.js | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index ebd9da2f8..ff87299cf 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -292,6 +292,10 @@ var dw_mediamanager = { 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); + } } // fetch the subtree @@ -305,6 +309,7 @@ var dw_mediamanager = { * @author Kate Arzamastseva */ form_params: function ($form) { + if (!$form.length) return; var elements = $form.serialize(); var action = ''; var i = $form[0].action.indexOf('?'); @@ -471,6 +476,8 @@ var dw_mediamanager = { if (jQuery('#mediamanager__difftype').length) return; $form = jQuery('#mediamanager__form_diffview'); + if (!$form.length) return; + $label = jQuery(document.createElement('label')); $label.append(''+LANG.media_diff+''); $select = jQuery(document.createElement('select')) -- cgit v1.2.3 From 9bd9c4373f31bb381fd80564decd8671d942fdc8 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Sun, 31 Jul 2011 22:47:47 +0300 Subject: issue #32 calculation of the panels width is redone when browser window is resized --- lib/scripts/media.js | 59 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index ff87299cf..17006e289 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -25,6 +25,8 @@ var dw_mediamanager = { // File list view type view: false, + layout_width: 0, + init: function () { var $content, $tree; $content = jQuery('#media__content'); @@ -417,7 +419,7 @@ var dw_mediamanager = { dw_mediamanager.prepare_content($content); dw_mediamanager.updatehide(); - dw_mediamanager.update_resizable(0); + dw_mediamanager.update_resizable(); addInitEvent(revisionsForm); jQuery('#mediamanager__form_sort').find('input[type=submit]').hide(); dw_mediamanager.set_filelist_view(dw_mediamanager.view, false); @@ -427,12 +429,53 @@ var dw_mediamanager = { ); }, + 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); + }); + }, + /** * Updates mediamanager layout * * @author Kate Arzamastseva */ - update_resizable: function (count_width) { + update_resizable: function () { $resizable = jQuery("#mediamanager__layout .layout-resizable"); $resizable.resizable({ handles: 'e' , @@ -454,6 +497,13 @@ var dw_mediamanager = { 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); + }); } }); @@ -828,8 +878,9 @@ function hasFlash(version){ } jQuery(document).ready(function() { - dw_mediamanager.update_resizable(1); - jQuery(window).resize(dw_mediamanager.update_resizable); + dw_mediamanager.update_resizable(); + dw_mediamanager.layout_width = jQuery("#mediamanager__layout").width(); + jQuery(window).resize(dw_mediamanager.window_resize); }); jQuery(dw_mediamanager.init); -- cgit v1.2.3 From 69143ff27bdf2a979818367613e604f8ee4aef88 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Mon, 1 Aug 2011 01:21:21 +0300 Subject: issue #40 image resized in all diff views --- lib/scripts/media.js | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index 17006e289..e8c492f5f 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -436,6 +436,10 @@ var dw_mediamanager = { dw_mediamanager.layout_width = jQuery('#mediamanager__layout').width(); + // rebuild sliders if exists + dw_mediamanager.opacity_slider(); + dw_mediamanager.portions_slider(); + $r = jQuery("#mediamanager__layout .layout-resizable, #mediamanager__layout .layout"); var w = 0, wSum = 0, mCount = 0, mArray = []; @@ -586,15 +590,39 @@ var dw_mediamanager = { * @author Kate Arzamastseva */ portions_slider: function () { - var $slider = jQuery( "#mediamanager__portions_slider" ); - $slider.slider(); - $slider.slider("option", "min", 0); - $slider.slider("option", "max", 100); - $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")+'%'}); - }); + var $image2 = jQuery('#mediamanager__diff_portions_image2 img'); + if ($image2) { + $image2 = jQuery($image2[0]); + + $image2.parent().css({ + width: '100%' + }); + + $image2.css({ + width: '100%', + height: 'auto' + }); + + $image2.css({ + width: $image2.width() + 'px', + height: $image2.height() + 'px' + }); + + var $div = jQuery("#mediamanager__diff_layout"); + if ($image2.width() < $div.width()) { + $div.width($image2.width()); + } + + var $slider = jQuery("#mediamanager__portions_slider"); + $slider.slider(); + $slider.slider("option", "min", 0); + $slider.slider("option", "max", 100); + $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")+'%'}); + }); + } }, prepare_content: function ($content) { -- cgit v1.2.3 From d5daba103cb1ed14fd07618ef936ca8d5cffb50c Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Mon, 1 Aug 2011 01:39:36 +0300 Subject: css class name fix --- lib/scripts/behaviour.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/scripts') diff --git a/lib/scripts/behaviour.js b/lib/scripts/behaviour.js index 24704565a..f3fcccdfe 100644 --- a/lib/scripts/behaviour.js +++ b/lib/scripts/behaviour.js @@ -74,7 +74,7 @@ var dw_behaviour = { jQuery('select.quickselect') .change(function(e){ e.target.form.submit(); }) .parents('form').find('input[type=submit]').each(function(){ - if (!jQuery(this).hasClass('not_hide')) jQuery(this).hide(); + if (!jQuery(this).hasClass('show')) jQuery(this).hide(); }); }, -- cgit v1.2.3 From a1a02ef6d327f2de7ffc7db57a7907465761b407 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Wed, 3 Aug 2011 19:10:16 +0300 Subject: issue #43 diff slider --- lib/scripts/media.js | 49 +++++++++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 28 deletions(-) (limited to 'lib/scripts') diff --git a/lib/scripts/media.js b/lib/scripts/media.js index e8c492f5f..f0c4c679c 100644 --- a/lib/scripts/media.js +++ b/lib/scripts/media.js @@ -560,8 +560,8 @@ var dw_mediamanager = { params, function (data) { $content.html(data); - dw_mediamanager.opacity_slider(); dw_mediamanager.portions_slider(); + dw_mediamanager.opacity_slider(); }, 'html' ); @@ -574,6 +574,7 @@ var dw_mediamanager = { */ opacity_slider: function () { var $slider = jQuery( "#mediamanager__opacity_slider" ); + if (!$slider.length) return; $slider.slider(); $slider.slider("option", "min", 0); $slider.slider("option", "max", 0.999); @@ -590,39 +591,31 @@ var dw_mediamanager = { * @author Kate Arzamastseva */ portions_slider: function () { + var $image1 = jQuery('#mediamanager__diff_portions_image1 img'); var $image2 = jQuery('#mediamanager__diff_portions_image2 img'); - if ($image2) { - $image2 = jQuery($image2[0]); + if (!$image1.length || !$image2.length) return; - $image2.parent().css({ - width: '100%' - }); + var $div = jQuery("#mediamanager__diff_layout"); + if (!$div.length) return; - $image2.css({ - width: '100%', - height: 'auto' - }); + if ($image1.width() < $div.width()) { + $div.width($image1.width()); + } - $image2.css({ - width: $image2.width() + 'px', - height: $image2.height() + 'px' - }); + $image2.parent().width('50%'); + $image2.width($image1.width()); - var $div = jQuery("#mediamanager__diff_layout"); - if ($image2.width() < $div.width()) { - $div.width($image2.width()); - } + var $slider = jQuery("#mediamanager__portions_slider"); + if (!$slider.length) return; + $slider.slider(); + $slider.slider("option", "min", 0); + $slider.slider("option", "max", 100); + $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")+'%'}); + }); - var $slider = jQuery("#mediamanager__portions_slider"); - $slider.slider(); - $slider.slider("option", "min", 0); - $slider.slider("option", "max", 100); - $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")+'%'}); - }); - } }, prepare_content: function ($content) { -- cgit v1.2.3 From 09063cc66339d6e5daa12af4896a2457c03cfaf3 Mon Sep 17 00:00:00 2001 From: Kate Arzamastseva Date: Thu, 4 Aug 2011 20:32:16 +0300 Subject: issue #44 multi file uploader --- lib/scripts/fileuploader.js | 1247 +++++++++++++++++++++++++++++++++++++++++++ lib/scripts/media.js | 45 ++ 2 files changed, 1292 insertions(+) create mode 100644 lib/scripts/fileuploader.js (limited to 'lib/scripts') diff --git a/lib/scripts/fileuploader.js b/lib/scripts/fileuploader.js new file mode 100644 index 000000000..5368d9739 --- /dev/null +++ b/lib/scripts/fileuploader.js @@ -0,0 +1,1247 @@ +/** + * http://github.com/valums/file-uploader + * + * Multiple file upload component with progress-bar, drag-and-drop. + * © 2010 Andrew Valums ( andrew(at)valums.com ) + * + * Licensed under GNU GPL 2 or later and GNU LGPL 2 or later, see license.txt. + */ + +// +// Helper functions +// + +var qq = qq || {}; + +/** + * Adds all missing properties from second obj to first obj + */ +qq.extend = function(first, second){ + for (var prop in second){ + first[prop] = second[prop]; + } +}; + +/** + * Searches for a given element in the array, returns -1 if it is not present. + * @param {Number} [from] The index at which to begin the search + */ +qq.indexOf = function(arr, elt, from){ + if (arr.indexOf) return arr.indexOf(elt, from); + + from = from || 0; + var len = arr.length; + + if (from < 0) from += len; + + for (; from < len; from++){ + if (from in arr && arr[from] === elt){ + return from; + } + } + return -1; +}; + +qq.getUniqueId = (function(){ + var id = 0; + return function(){ return id++; }; +})(); + +// +// Events + +qq.attach = function(element, type, fn){ + if (element.addEventListener){ + element.addEventListener(type, fn, false); + } else if (element.attachEvent){ + element.attachEvent('on' + type, fn); + } +}; +qq.detach = function(element, type, fn){ + if (element.removeEventListener){ + element.removeEventListener(type, fn, false); + } else if (element.attachEvent){ + element.detachEvent('on' + type, fn); + } +}; + +qq.preventDefault = function(e){ + if (e.preventDefault){ + e.preventDefault(); + } else{ + e.returnValue = false; + } +}; + +// +// Node manipulations + +/** + * Insert node a before node b. + */ +qq.insertBefore = function(a, b){ + b.parentNode.insertBefore(a, b); +}; +qq.remove = function(element){ + element.parentNode.removeChild(element); +}; + +qq.contains = function(parent, descendant){ + // compareposition returns false in this case + if (parent == descendant) return true; + + if (parent.contains){ + return parent.contains(descendant); + } else { + return !!(descendant.compareDocumentPosition(parent) & 8); + } +}; + +/** + * Creates and returns element from html string + * Uses innerHTML to create an element + */ +qq.toElement = (function(){ + var div = document.createElement('div'); + return function(html){ + div.innerHTML = html; + var element = div.firstChild; + div.removeChild(element); + return element; + }; +})(); + +// +// Node properties and attributes + +/** + * Sets styles for an element. + * Fixes opacity in IE6-8. + */ +qq.css = function(element, styles){ + if (styles.opacity != null){ + if (typeof element.style.opacity != 'string' && typeof(element.filters) != 'undefined'){ + styles.filter = 'alpha(opacity=' + Math.round(100 * styles.opacity) + ')'; + } + } + qq.extend(element.style, styles); +}; +qq.hasClass = function(element, name){ + var re = new RegExp('(^| )' + name + '( |$)'); + return re.test(element.className); +}; +qq.addClass = function(element, name){ + if (!qq.hasClass(element, name)){ + element.className += ' ' + name; + } +}; +qq.removeClass = function(element, name){ + var re = new RegExp('(^| )' + name + '( |$)'); + element.className = element.className.replace(re, ' ').replace(/^\s+|\s+$/g, ""); +}; +qq.setText = function(element, text){ + element.innerText = text; + element.textContent = text; +}; + +// +// Selecting elements + +qq.children = function(element){ + var children = [], + child = element.firstChild; + + while (child){ + if (child.nodeType == 1){ + children.push(child); + } + child = child.nextSibling; + } + + return children; +}; + +qq.getByClass = function(element, className){ + if (element.querySelectorAll){ + return element.querySelectorAll('.' + className); + } + + var result = []; + var candidates = element.getElementsByTagName("*"); + var len = candidates.length; + + for (var i = 0; i < len; i++){ + if (qq.hasClass(candidates[i], className)){ + result.push(candidates[i]); + } + } + return result; +}; + +/** + * obj2url() takes a json-object as argument and generates + * a querystring. pretty much like jQuery.param() + * + * how to use: + * + * `qq.obj2url({a:'b',c:'d'},'http://any.url/upload?otherParam=value');` + * + * will result in: + * + * `http://any.url/upload?otherParam=value&a=b&c=d` + * + * @param Object JSON-Object + * @param String current querystring-part + * @return String encoded querystring + */ +qq.obj2url = function(obj, temp, prefixDone){ + var uristrings = [], + prefix = '&', + add = function(nextObj, i){ + var nextTemp = temp + ? (/\[\]$/.test(temp)) // prevent double-encoding + ? temp + : temp+'['+i+']' + : i; + if ((nextTemp != 'undefined') && (i != 'undefined')) { + uristrings.push( + (typeof nextObj === 'object') + ? qq.obj2url(nextObj, nextTemp, true) + : (Object.prototype.toString.call(nextObj) === '[object Function]') + ? encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj()) + : encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj) + ); + } + }; + + if (!prefixDone && temp) { + prefix = (/\?/.test(temp)) ? (/\?$/.test(temp)) ? '' : '&' : '?'; + uristrings.push(temp); + uristrings.push(qq.obj2url(obj)); + } else if ((Object.prototype.toString.call(obj) === '[object Array]') && (typeof obj != 'undefined') ) { + // we wont use a for-in-loop on an array (performance) + for (var i = 0, len = obj.length; i < len; ++i){ + add(obj[i], i); + } + } else if ((typeof obj != 'undefined') && (obj !== null) && (typeof obj === "object")){ + // for anything else but a scalar, we will use for-in-loop + for (var i in obj){ + add(obj[i], i); + } + } else { + uristrings.push(encodeURIComponent(temp) + '=' + encodeURIComponent(obj)); + } + + return uristrings.join(prefix) + .replace(/^&/, '') + .replace(/%20/g, '+'); +}; + +// +// +// Uploader Classes +// +// + +var qq = qq || {}; + +/** + * Creates upload button, validates upload, but doesn't create file list or dd. + */ +qq.FileUploaderBasic = function(o){ + this._options = { + // set to true to see the server response + debug: false, + action: '/server/upload', + params: {}, + button: null, + multiple: true, + maxConnections: 3, + // validation + allowedExtensions: [], + sizeLimit: 0, + minSizeLimit: 0, + // events + // return false to cancel submit + onSubmit: function(id, fileName){}, + onProgress: function(id, fileName, loaded, total){}, + onComplete: function(id, fileName, responseJSON){}, + onCancel: function(id, fileName){}, + // messages + messages: { + typeError: "{file} has invalid extension. Only {extensions} are allowed.", + sizeError: "{file} is too large, maximum file size is {sizeLimit}.", + minSizeError: "{file} is too small, minimum file size is {minSizeLimit}.", + emptyError: "{file} is empty, please select files again without it.", + onLeave: "The files are being uploaded, if you leave now the upload will be cancelled." + }, + showMessage: function(message){ + alert(message); + } + }; + qq.extend(this._options, o); + + // number of files being uploaded + this._filesInProgress = 0; + this._handler = this._createUploadHandler(); + + if (this._options.button){ + this._button = this._createUploadButton(this._options.button); + } + + this._preventLeaveInProgress(); +}; + +qq.FileUploaderBasic.prototype = { + setParams: function(params){ + this._options.params = params; + }, + getInProgress: function(){ + return this._filesInProgress; + }, + _createUploadButton: function(element){ + var self = this; + + return new qq.UploadButton({ + element: element, + multiple: this._options.multiple && qq.UploadHandlerXhr.isSupported(), + onChange: function(input){ + self._onInputChange(input); + } + }); + }, + _createUploadHandler: function(){ + var self = this, + handlerClass; + + if(qq.UploadHandlerXhr.isSupported()){ + handlerClass = 'UploadHandlerXhr'; + } else { + handlerClass = 'UploadHandlerForm'; + } + + var handler = new qq[handlerClass]({ + debug: this._options.debug, + action: this._options.action, + maxConnections: this._options.maxConnections, + onProgress: function(id, fileName, loaded, total){ + self._onProgress(id, fileName, loaded, total); + self._options.onProgress(id, fileName, loaded, total); + }, + onComplete: function(id, fileName, result){ + self._onComplete(id, fileName, result); + self._options.onComplete(id, fileName, result); + }, + onCancel: function(id, fileName){ + self._onCancel(id, fileName); + self._options.onCancel(id, fileName); + } + }); + + return handler; + }, + _preventLeaveInProgress: function(){ + var self = this; + + qq.attach(window, 'beforeunload', function(e){ + if (!self._filesInProgress){return;} + + var e = e || window.event; + // for ie, ff + e.returnValue = self._options.messages.onLeave; + // for webkit + return self._options.messages.onLeave; + }); + }, + _onSubmit: function(id, fileName){ + this._filesInProgress++; + }, + _onProgress: function(id, fileName, loaded, total){ + }, + _onComplete: function(id, fileName, result){ + this._filesInProgress--; + if (result.error){ + this._options.showMessage(result.error); + } + }, + _onCancel: function(id, fileName){ + this._filesInProgress--; + }, + _onInputChange: function(input){ + if (this._handler instanceof qq.UploadHandlerXhr){ + this._uploadFileList(input.files); + } else { + if (this._validateFile(input)){ + this._uploadFile(input); + } + } + this._button.reset(); + }, + _uploadFileList: function(files){ + for (var i=0; i this._options.sizeLimit){ + this._error('sizeError', name); + return false; + + } else if (size && size < this._options.minSizeLimit){ + this._error('minSizeError', name); + return false; + } + + return true; + }, + _error: function(code, fileName){ + var message = this._options.messages[code]; + function r(name, replacement){ message = message.replace(name, replacement); } + + r('{file}', this._formatFileName(fileName)); + r('{extensions}', this._options.allowedExtensions.join(', ')); + r('{sizeLimit}', this._formatSize(this._options.sizeLimit)); + r('{minSizeLimit}', this._formatSize(this._options.minSizeLimit)); + + this._options.showMessage(message); + }, + _formatFileName: function(name){ + if (name.length > 33){ + name = name.slice(0, 19) + '...' + name.slice(-13); + } + return name; + }, + _isAllowedExtension: function(fileName){ + var ext = (-1 !== fileName.indexOf('.')) ? fileName.replace(/.*[.]/, '').toLowerCase() : ''; + var allowed = this._options.allowedExtensions; + + if (!allowed.length){return true;} + + for (var i=0; i 99); + + return Math.max(bytes, 0.1).toFixed(1) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i]; + } +}; + + +/** + * Class that creates upload widget with drag-and-drop and file list + * @inherits qq.FileUploaderBasic + */ +qq.FileUploader = function(o){ + // call parent constructor + qq.FileUploaderBasic.apply(this, arguments); + + // additional options + qq.extend(this._options, { + element: null, + // if set, will be used instead of qq-upload-list in template + listElement: null, + + template: '
' + + '
Drop files here to upload
' + + '
Upload a file
' + + '
    ' + + '
    ', + + // template for one item in file list + fileTemplate: '
  • ' + + '' + + '' + + '' + + 'Cancel' + + 'Failed' + + '
  • ', + + classes: { + // used to get elements from templates + button: 'qq-upload-button', + drop: 'qq-upload-drop-area', + dropActive: 'qq-upload-drop-area-active', + list: 'qq-upload-list', + + file: 'qq-upload-file', + spinner: 'qq-upload-spinner', + size: 'qq-upload-size', + cancel: 'qq-upload-cancel', + + // added to list item when upload completes + // used in css to hide progress spinner + success: 'qq-upload-success', + fail: 'qq-upload-fail' + } + }); + // overwrite options with user supplied + qq.extend(this._options, o); + + this._element = this._options.element; + this._element.innerHTML = this._options.template; + this._listElement = this._options.listElement || this._find(this._element, 'list'); + + this._classes = this._options.classes; + + this._button = this._createUploadButton(this._find(this._element, 'button')); + + this._bindCancelEvent(); + this._setupDragDrop(); +}; + +// inherit from Basic Uploader +qq.extend(qq.FileUploader.prototype, qq.FileUploaderBasic.prototype); + +qq.extend(qq.FileUploader.prototype, { + /** + * Gets one of the elements listed in this._options.classes + **/ + _find: function(parent, type){ + var element = qq.getByClass(parent, this._options.classes[type])[0]; + if (!element){ + throw new Error('element not found ' + type); + } + + return element; + }, + _setupDragDrop: function(){ + var self = this, + dropArea = this._find(this._element, 'drop'); + + var dz = new qq.UploadDropZone({ + element: dropArea, + onEnter: function(e){ + qq.addClass(dropArea, self._classes.dropActive); + e.stopPropagation(); + }, + onLeave: function(e){ + e.stopPropagation(); + }, + onLeaveNotDescendants: function(e){ + qq.removeClass(dropArea, self._classes.dropActive); + }, + onDrop: function(e){ + dropArea.style.display = 'none'; + qq.removeClass(dropArea, self._classes.dropActive); + self._uploadFileList(e.dataTransfer.files); + } + }); + + dropArea.style.display = 'none'; + + qq.attach(document, 'dragenter', function(e){ + if (!dz._isValidFileDrag(e)) return; + + dropArea.style.display = 'block'; + }); + qq.attach(document, 'dragleave', function(e){ + if (!dz._isValidFileDrag(e)) return; + + var relatedTarget = document.elementFromPoint(e.clientX, e.clientY); + // only fire when leaving document out + if ( ! relatedTarget || relatedTarget.nodeName == "HTML"){ + dropArea.style.display = 'none'; + } + }); + }, + _onSubmit: function(id, fileName){ + qq.FileUploaderBasic.prototype._onSubmit.apply(this, arguments); + this._addToList(id, fileName); + }, + _onProgress: function(id, fileName, loaded, total){ + qq.FileUploaderBasic.prototype._onProgress.apply(this, arguments); + + var item = this._getItemByFileId(id); + var size = this._find(item, 'size'); + size.style.display = 'inline'; + + var text; + if (loaded != total){ + text = Math.round(loaded / total * 100) + '% from ' + this._formatSize(total); + } else { + text = this._formatSize(total); + } + + qq.setText(size, text); + }, + _onComplete: function(id, fileName, result){ + qq.FileUploaderBasic.prototype._onComplete.apply(this, arguments); + + // mark completed + var item = this._getItemByFileId(id); + qq.remove(this._find(item, 'cancel')); + qq.remove(this._find(item, 'spinner')); + + if (result.success){ + qq.addClass(item, this._classes.success); + } else { + qq.addClass(item, this._classes.fail); + } + }, + _addToList: function(id, fileName){ + var item = qq.toElement(this._options.fileTemplate); + item.qqFileId = id; + + var fileElement = this._find(item, 'file'); + qq.setText(fileElement, this._formatFileName(fileName)); + this._find(item, 'size').style.display = 'none'; + + this._listElement.appendChild(item); + }, + _getItemByFileId: function(id){ + var item = this._listElement.firstChild; + + // there can't be txt nodes in dynamically created list + // and we can use nextSibling + while (item){ + if (item.qqFileId == id) return item; + item = item.nextSibling; + } + }, + /** + * delegate click event for cancel link + **/ + _bindCancelEvent: function(){ + var self = this, + list = this._listElement; + + qq.attach(list, 'click', function(e){ + e = e || window.event; + var target = e.target || e.srcElement; + + if (qq.hasClass(target, self._classes.cancel)){ + qq.preventDefault(e); + + var item = target.parentNode; + self._handler.cancel(item.qqFileId); + qq.remove(item); + } + }); + } +}); + +qq.UploadDropZone = function(o){ + this._options = { + element: null, + onEnter: function(e){}, + onLeave: function(e){}, + // is not fired when leaving element by hovering descendants + onLeaveNotDescendants: function(e){}, + onDrop: function(e){} + }; + qq.extend(this._options, o); + + this._element = this._options.element; + + this._disableDropOutside(); + this._attachEvents(); +}; + +qq.UploadDropZone.prototype = { + _disableDropOutside: function(e){ + // run only once for all instances + if (!qq.UploadDropZone.dropOutsideDisabled ){ + + qq.attach(document, 'dragover', function(e){ + if (e.dataTransfer){ + e.dataTransfer.dropEffect = 'none'; + e.preventDefault(); + } + }); + + qq.UploadDropZone.dropOutsideDisabled = true; + } + }, + _attachEvents: function(){ + var self = this; + + qq.attach(self._element, 'dragover', function(e){ + if (!self._isValidFileDrag(e)) return; + + var effect = e.dataTransfer.effectAllowed; + if (effect == 'move' || effect == 'linkMove'){ + e.dataTransfer.dropEffect = 'move'; // for FF (only move allowed) + } else { + e.dataTransfer.dropEffect = 'copy'; // for Chrome + } + + e.stopPropagation(); + e.preventDefault(); + }); + + qq.attach(self._element, 'dragenter', function(e){ + if (!self._isValidFileDrag(e)) return; + + self._options.onEnter(e); + }); + + qq.attach(self._element, 'dragleave', function(e){ + if (!self._isValidFileDrag(e)) return; + + self._options.onLeave(e); + + var relatedTarget = document.elementFromPoint(e.clientX, e.clientY); + // do not fire when moving a mouse over a descendant + if (qq.contains(this, relatedTarget)) return; + + self._options.onLeaveNotDescendants(e); + }); + + qq.attach(self._element, 'drop', function(e){ + if (!self._isValidFileDrag(e)) return; + + e.preventDefault(); + self._options.onDrop(e); + }); + }, + _isValidFileDrag: function(e){ + var dt = e.dataTransfer, + // do not check dt.types.contains in webkit, because it crashes safari 4 + isWebkit = navigator.userAgent.indexOf("AppleWebKit") > -1; + + // dt.effectAllowed is none in Safari 5 + // dt.types.contains check is for firefox + return dt && dt.effectAllowed != 'none' && + (dt.files || (!isWebkit && dt.types.contains && dt.types.contains('Files'))); + + } +}; + +qq.UploadButton = function(o){ + this._options = { + element: null, + // if set to true adds multiple attribute to file input + multiple: false, + // name attribute of file input + name: 'file', + onChange: function(input){}, + hoverClass: 'qq-upload-button-hover', + focusClass: 'qq-upload-button-focus' + }; + + qq.extend(this._options, o); + + this._element = this._options.element; + + // make button suitable container for input + qq.css(this._element, { + position: 'relative', + overflow: 'hidden', + // Make sure browse button is in the right side + // in Internet Explorer + direction: 'ltr' + }); + + this._input = this._createInput(); +}; + +qq.UploadButton.prototype = { + /* returns file input element */ + getInput: function(){ + return this._input; + }, + /* cleans/recreates the file input */ + reset: function(){ + if (this._input.parentNode){ + qq.remove(this._input); + } + + qq.removeClass(this._element, this._options.focusClass); + this._input = this._createInput(); + }, + _createInput: function(){ + var input = document.createElement("input"); + + if (this._options.multiple){ + input.setAttribute("multiple", "multiple"); + } + + input.setAttribute("type", "file"); + input.setAttribute("name", this._options.name); + + qq.css(input, { + position: 'absolute', + // in Opera only 'browse' button + // is clickable and it is located at + // the right side of the input + right: 0, + top: 0, + fontFamily: 'Arial', + // 4 persons reported this, the max values that worked for them were 243, 236, 236, 118 + fontSize: '118px', + margin: 0, + padding: 0, + cursor: 'pointer', + opacity: 0 + }); + + this._element.appendChild(input); + + var self = this; + qq.attach(input, 'change', function(){ + self._options.onChange(input); + }); + + qq.attach(input, 'mouseover', function(){ + qq.addClass(self._element, self._options.hoverClass); + }); + qq.attach(input, 'mouseout', function(){ + qq.removeClass(self._element, self._options.hoverClass); + }); + qq.attach(input, 'focus', function(){ + qq.addClass(self._element, self._options.focusClass); + }); + qq.attach(input, 'blur', function(){ + qq.removeClass(self._element, self._options.focusClass); + }); + + // IE and Opera, unfortunately have 2 tab stops on file input + // which is unacceptable in our case, disable keyboard access + if (window.attachEvent){ + // it is IE or Opera + input.setAttribute('tabIndex', "-1"); + } + + return input; + } +}; + +/** + * Class for uploading files, uploading itself is handled by child classes + */ +qq.UploadHandlerAbstract = function(o){ + this._options = { + debug: false, + action: '/upload.php', + // maximum number of concurrent uploads + maxConnections: 999, + onProgress: function(id, fileName, loaded, total){}, + onComplete: function(id, fileName, response){}, + onCancel: function(id, fileName){} + }; + qq.extend(this._options, o); + + this._queue = []; + // params for files in queue + this._params = []; +}; +qq.UploadHandlerAbstract.prototype = { + log: function(str){ + if (this._options.debug && window.console) console.log('[uploader] ' + str); + }, + /** + * Adds file or file input to the queue + * @returns id + **/ + add: function(file){}, + /** + * Sends the file identified by id and additional query params to the server + */ + upload: function(id, params){ + var len = this._queue.push(id); + + var copy = {}; + qq.extend(copy, params); + this._params[id] = copy; + + // if too many active uploads, wait... + if (len <= this._options.maxConnections){ + this._upload(id, this._params[id]); + } + }, + /** + * Cancels file upload by id + */ + cancel: function(id){ + this._cancel(id); + this._dequeue(id); + }, + /** + * Cancells all uploads + */ + cancelAll: function(){ + for (var i=0; i= max && i < max){ + var nextId = this._queue[max-1]; + this._upload(nextId, this._params[nextId]); + } + } +}; + +/** + * Class for uploading files using form and iframe + * @inherits qq.UploadHandlerAbstract + */ +qq.UploadHandlerForm = function(o){ + qq.UploadHandlerAbstract.apply(this, arguments); + + this._inputs = {}; +}; +// @inherits qq.UploadHandlerAbstract +qq.extend(qq.UploadHandlerForm.prototype, qq.UploadHandlerAbstract.prototype); + +qq.extend(qq.UploadHandlerForm.prototype, { + add: function(fileInput){ + fileInput.setAttribute('name', 'qqfile'); + var id = 'qq-upload-handler-iframe' + qq.getUniqueId(); + + this._inputs[id] = fileInput; + + // remove file input from DOM + if (fileInput.parentNode){ + qq.remove(fileInput); + } + + return id; + }, + getName: function(id){ + // get input value and remove path to normalize + return this._inputs[id].value.replace(/.*(\/|\\)/, ""); + }, + _cancel: function(id){ + this._options.onCancel(id, this.getName(id)); + + delete this._inputs[id]; + + var iframe = document.getElementById(id); + if (iframe){ + // to cancel request set src to something else + // we use src="javascript:false;" because it doesn't + // trigger ie6 prompt on https + iframe.setAttribute('src', 'javascript:false;'); + + qq.remove(iframe); + } + }, + _upload: function(id, params){ + var input = this._inputs[id]; + + if (!input){ + throw new Error('file with passed id was not added, or already uploaded or cancelled'); + } + + var fileName = this.getName(id); + + var iframe = this._createIframe(id); + var form = this._createForm(iframe, params); + form.appendChild(input); + + var self = this; + this._attachLoadEvent(iframe, function(){ + self.log('iframe loaded'); + + var response = self._getIframeContentJSON(iframe); + + self._options.onComplete(id, fileName, response); + self._dequeue(id); + + delete self._inputs[id]; + // timeout added to fix busy state in FF3.6 + setTimeout(function(){ + qq.remove(iframe); + }, 1); + }); + + form.submit(); + qq.remove(form); + + return id; + }, + _attachLoadEvent: function(iframe, callback){ + qq.attach(iframe, 'load', function(){ + // when we remove iframe from dom + // the request stops, but in IE load + // event fires + if (!iframe.parentNode){ + return; + } + + // fixing Opera 10.53 + if (iframe.contentDocument && + iframe.contentDocument.body && + iframe.contentDocument.body.innerHTML == "false"){ + // In Opera event is fired second time + // when body.innerHTML changed from false + // to server response approx. after 1 sec + // when we upload file with iframe + return; + } + + callback(); + }); + }, + /** + * Returns json object received by iframe from server. + */ + _getIframeContentJSON: function(iframe){ + // iframe.contentWindow.document - for IE<7 + var doc = iframe.contentDocument ? iframe.contentDocument: iframe.contentWindow.document, + response; + + this.log("converting iframe's innerHTML to JSON"); + this.log("innerHTML = " + doc.body.innerHTML); + + try { + response = eval("(" + doc.body.innerHTML + ")"); + } catch(err){ + response = {}; + } + + return response; + }, + /** + * Creates iframe with unique name + */ + _createIframe: function(id){ + // We can't use following code as the name attribute + // won't be properly registered in IE6, and new window + // on form submit will open + // var iframe = document.createElement('iframe'); + // iframe.setAttribute('name', id); + + var iframe = qq.toElement('