From 4a65ce61df83ec6d8afdae46873130c53e2fdfdd Mon Sep 17 00:00:00 2001 From: Lars Jung Date: Sun, 30 Oct 2011 21:50:25 +0100 Subject: [PATCH] Improves file selection for zipped download. Zipped download is now disabled by default. --- src/h5ai/css/inc/extended.less | 4 +- src/h5ai/footer.html | 4 +- src/h5ai/header.html | 2 +- src/h5ai/header.php | 6 +- src/h5ai/js/inc/Extended.js | 4 +- src/h5ai/js/inc/H5ai.js | 111 ++++++++++++------ src/h5ai/js/inc/jquery.utils.js | 31 ----- src/h5ai/js/inc/lib/amplify.min.js | 10 ++ .../js/{ => inc}/lib/jquery.fracs-core.min.js | 0 src/h5ai/js/{ => inc}/lib/jquery.min.js | 0 .../js/{ => inc}/lib/jquery.mousewheel.min.js | 0 .../js/inc/{ => lib}/jquery.scrollpanel.js | 2 +- src/h5ai/js/lib/modernizr.min.js | 4 - src/h5ai/js/libs.js | 7 ++ src/h5ai/js/main-js.js | 4 - src/h5ai/js/main-php.js | 4 - src/h5ai/js/modernizr.min.js | 4 + src/h5ai/options.js | 4 +- src/h5ai/php/zipcontent.php | 5 +- src/js.htaccess | 3 +- 20 files changed, 109 insertions(+), 100 deletions(-) delete mode 100644 src/h5ai/js/inc/jquery.utils.js create mode 100644 src/h5ai/js/inc/lib/amplify.min.js rename src/h5ai/js/{ => inc}/lib/jquery.fracs-core.min.js (100%) rename src/h5ai/js/{ => inc}/lib/jquery.min.js (100%) rename src/h5ai/js/{ => inc}/lib/jquery.mousewheel.min.js (100%) rename src/h5ai/js/inc/{ => lib}/jquery.scrollpanel.js (99%) delete mode 100644 src/h5ai/js/lib/modernizr.min.js create mode 100644 src/h5ai/js/libs.js create mode 100644 src/h5ai/js/modernizr.min.js diff --git a/src/h5ai/css/inc/extended.less b/src/h5ai/css/inc/extended.less index 6aa5b6d0..a89a2c1b 100644 --- a/src/h5ai/css/inc/extended.less +++ b/src/h5ai/css/inc/extended.less @@ -45,7 +45,7 @@ background-color: #f6f6f6; color: #e80; } - &.selected { + &.selected:not(.selecting), &.selecting:not(.selected) { border-color: rgba(240,100,0,0.2); background-color: rgba(240,100,0,0.2); } @@ -193,7 +193,7 @@ border-color: #eee; background-color: #f6f6f6; } - &.selected { + &.selected:not(.selecting), &.selecting:not(.selected) { border-color: rgba(240,100,0,0.2); background-color: rgba(240,100,0,0.2); } diff --git a/src/h5ai/footer.html b/src/h5ai/footer.html index 1d81b3f8..07167e41 100644 --- a/src/h5ai/footer.html +++ b/src/h5ai/footer.html @@ -27,9 +27,7 @@ - - - + diff --git a/src/h5ai/header.html b/src/h5ai/header.html index 7764bd33..11cd52a7 100644 --- a/src/h5ai/header.html +++ b/src/h5ai/header.html @@ -14,7 +14,7 @@ - +
diff --git a/src/h5ai/header.php b/src/h5ai/header.php index 79ec5817..6e645106 100644 --- a/src/h5ai/header.php +++ b/src/h5ai/header.php @@ -15,7 +15,7 @@ - +
@@ -60,9 +60,7 @@ - - - +
diff --git a/src/h5ai/js/inc/Extended.js b/src/h5ai/js/inc/Extended.js index d5acd5a4..1de1bec1 100644 --- a/src/h5ai/js/inc/Extended.js +++ b/src/h5ai/js/inc/Extended.js @@ -95,7 +95,7 @@ H5aiJs.factory.Extended = function () { } }); }, - initCounts = function () { + initTotals = function () { $(".folderCount").text($("#extended .entry.folder:not(.parentfolder)").size()); $(".fileCount").text($("#extended .entry.file").size()); @@ -107,6 +107,6 @@ H5aiJs.factory.Extended = function () { initBreadcrumb(); initExtendedView(); customize(); - initCounts(); + initTotals(); }; }; diff --git a/src/h5ai/js/inc/H5ai.js b/src/h5ai/js/inc/H5ai.js index 70a4df45..6b3d1adb 100644 --- a/src/h5ai/js/inc/H5ai.js +++ b/src/h5ai/js/inc/H5ai.js @@ -1,12 +1,13 @@ -/*global window, $, H5aiJs, localStorage */ H5aiJs.factory.H5ai = function (options, langs) { + /*global window, $, amplify*/ var $window = $(window), + $document = $(document), defaults = { store: { - viewmode: "h5ai.viewmode", - lang: "h5ai.lang" + viewmode: "h5ai.pref.viewmode", + lang: "h5ai.pref.lang" }, callbacks: { pathClick: [] @@ -47,14 +48,14 @@ H5aiJs.factory.H5ai = function (options, langs) { }, getViewmode = function () { - var viewmode = localStorage.getItem(settings.store.viewmode); + var viewmode = amplify.store(settings.store.viewmode); return $.inArray(viewmode, settings.viewmodes) >= 0 ? viewmode : settings.viewmodes[0]; }, applyViewmode = function (viewmode) { if (viewmode) { - localStorage.setItem(settings.store.viewmode, viewmode); + amplify.store(settings.store.viewmode, viewmode); } viewmode = getViewmode(); @@ -189,7 +190,7 @@ H5aiJs.factory.H5ai = function (options, langs) { }, localize = function (langs, lang, useBrowserLang) { - var storedLang = localStorage.getItem(settings.store.lang), + var storedLang = amplify.store(settings.store.lang), browserLang, selected, key; if (langs[storedLang]) { @@ -219,7 +220,7 @@ H5aiJs.factory.H5ai = function (options, langs) { }, initLangSelector = function (langs) { - var idx, lang, + var $langOptions = $(".langOptions"), sortedLangsKeys = [], $ul; @@ -235,18 +236,22 @@ H5aiJs.factory.H5ai = function (options, langs) { .text(lang + " - " + langs[lang].lang) .appendTo($ul) .click(function () { - localStorage.setItem(settings.store.lang, lang); + amplify.store(settings.store.lang, lang); localize(langs, lang, false); }); }); $("#langSelector .langOptions").append($ul); $("#langSelector").hover( function () { - var $ele = $(".langOptions"); - $ele.css("top", "-" + $ele.outerHeight() + "px").stop(true, true).fadeIn(); + $langOptions + .css("top", "-" + $langOptions.outerHeight() + "px") + .stop(true, true) + .fadeIn(); }, function () { - $(".langOptions").stop(true, true).fadeOut(); + $langOptions + .stop(true, true) + .fadeOut(); } ); }, @@ -296,14 +301,23 @@ H5aiJs.factory.H5ai = function (options, langs) { var x = 0, y = 0, - selected = function (hrefs) { + ctrl = false, + updateDownloadBtn = function () { - var query, idx; - $.each(hrefs, function (idx, href) { - query = query ? query + ":" + href : href; - }); - query = "/h5ai/php/zipcontent.php?hrefs=" + query; - $("#download").show().find("a").attr("href", query); + var query, + href, + $selected = $("#extended a.selected"); + + if ($selected.size() > 0) { + $selected.each(function () { + href = $(this).attr("href"); + query = query ? query + ":" + href : href; + }); + query = "/h5ai/php/zipcontent.php?hrefs=" + query; + $("#download").show().find("a").attr("href", query); + } else { + $("#download").hide().find("a").attr("href", "#"); + } }, selectionUpdate = function (event) { @@ -317,41 +331,45 @@ H5aiJs.factory.H5ai = function (options, langs) { $("#selection-rect").css({left: l, top: t, width: w, height: h}); sel = $("#selection-rect").fracs("rect"); - $("#extended a").removeClass("selected").each(function () { + $("#extended a").removeClass("selecting").each(function () { var $a = $(this), rect = $a.fracs("rect"), inter = sel.intersection(rect); if (inter && !$a.closest(".entry").hasClass("folder-parent")) { - $a.addClass("selected"); + $a.addClass("selecting"); } }); }, selectionEnd = function (event) { event.preventDefault(); + $document.unbind("mousemove", selectionUpdate); $("#selection-rect").hide().css({left: 0, top: 0, width: 0, height: 0}); - - $window.unbind("mousemove", selectionUpdate); - - var hrefs = []; - $("#extended a.selected").each(function () { - hrefs.push($(this).attr("href")); - }); - if (hrefs.length > 0) { - selected(hrefs); - } + $("#extended a.selecting.selected").removeClass("selecting").removeClass("selected"); + $("#extended a.selecting").removeClass("selecting").addClass("selected"); + updateDownloadBtn(); }, selectionStart = function (event) { - event.preventDefault(); + var view = $.fracs.viewport(); + x = event.pageX; y = event.pageY; - $("#download").hide().find("a").attr("href", "#"); - $("#extended a").removeClass("selected"); - $("#selection-rect").show().css({left: x, top: y, width: 0, height: 0}); + if (x >= view.right || y >= view.bottom) { + // don't block the scrollbars + return; + } - $window + event.preventDefault(); + if (!ctrl) { + $("#extended a").removeClass("selected"); + updateDownloadBtn(); + } + $("#selection-rect").show().css({left: x, top: y, width: 0, height: 0}); + selectionUpdate(event); + + $document .bind("mousemove", selectionUpdate) .one("mouseup", selectionEnd); }, @@ -359,12 +377,29 @@ H5aiJs.factory.H5ai = function (options, langs) { event.stopPropagation(); return false; + }, + noSelectionUnlessCtrl = function (event) { + + if (!ctrl) { + noSelection(event); + } }; if (settings.zippedDownload) { - $("body>nav,body>footer,#tree,#extended a").bind("mousedown", noSelection); - $("#extended a").live("mousedown", noSelection); - $window.bind("mousedown", selectionStart); + $("body>nav,body>footer,#tree").bind("mousedown", noSelection); + $("#extended .entry a").bind("mousedown", noSelectionUnlessCtrl).live("mousedown", noSelectionUnlessCtrl); + $document + .bind("mousedown", selectionStart) + .keydown(function (event) { + if (event.keyCode === 17) { + ctrl = true; + } + }) + .keyup(function (event) { + if (event.keyCode === 17) { + ctrl = false; + } + }); } }, init = function () { diff --git a/src/h5ai/js/inc/jquery.utils.js b/src/h5ai/js/inc/jquery.utils.js deleted file mode 100644 index 02d9dac0..00000000 --- a/src/h5ai/js/inc/jquery.utils.js +++ /dev/null @@ -1,31 +0,0 @@ -/*global window, jQuery */ - -(function ($) { - "use strict"; - - // http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/ - // modified - $.log = function () { - - $.log.history = $.log.history || []; - $.log.history.push(arguments); - if (window.console) { - window.console.log(Array.prototype.slice.call(arguments)); - } - }; - - $.timer = (function () { - - var start = $.now(), - last = start; - - return { - log: function (label) { - var now = $.now(); - $.log("timer", label, "+" + (now - last), "=" + (now - start)); - last = now; - } - }; - }()); - -}(jQuery)); diff --git a/src/h5ai/js/inc/lib/amplify.min.js b/src/h5ai/js/inc/lib/amplify.min.js new file mode 100644 index 00000000..6e6a9a95 --- /dev/null +++ b/src/h5ai/js/inc/lib/amplify.min.js @@ -0,0 +1,10 @@ +/*! + * AmplifyJS 1.0.0 - Core, Store, Request + * + * Copyright 2011 appendTo LLC. (http://appendto.com/team) + * Dual licensed under the MIT or GPL licenses. + * http://appendto.com/open-source-licenses + * + * http://amplifyjs.com + */ +(function(a,b){var c=[].slice,d={},e=a.amplify={publish:function(a){var b=c.call(arguments,1),e,f,g=0,h;if(!d[a])return!0;for(f=d[a].length;g=0;i--)if(d[a][i].priority<=e){d[a].splice(i+1,0,j);return c}d[a].unshift(j)}return c},unsubscribe:function(a,b){if(!!d[a]){var c=d[a].length,e=0;for(;e",a,""].join(""),k.id=i,k.innerHTML+=f,g.appendChild(k),h=c(k,a),k.parentNode.removeChild(k);return!!h},w=function(b){if(a.matchMedia)return matchMedia(b).matches;var c;v("@media "+b+" { #"+i+" { position: absolute; } }",function(b){c=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle).position=="absolute"});return c},x=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=D(e[d],"function"),D(e[d],c)||(e[d]=c),e.removeAttribute(d))),e=null;return f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),y,z={}.hasOwnProperty,A;!D(z,c)&&!D(z.call,c)?A=function(a,b){return z.call(a,b)}:A=function(a,b){return b in a&&D(a.constructor.prototype[b],c)};var H=function(c,d){var f=c.join(""),g=d.length;v(f,function(c,d){var f=b.styleSheets[b.styleSheets.length-1],h=f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"",i=c.childNodes,j={};while(g--)j[i[g].id]=i[g];e.touch="ontouchstart"in a||j.touch.offsetTop===9,e.csstransforms3d=j.csstransforms3d.offsetLeft===9,e.generatedcontent=j.generatedcontent.offsetHeight>=1,e.fontface=/src/i.test(h)&&h.indexOf(d.split(" ")[0])===0},g,d)}(['@font-face {font-family:"font";src:url("https://")}',["@media (",o.join("touch-enabled),("),i,")","{#touch{top:9px;position:absolute}}"].join(""),["@media (",o.join("transform-3d),("),i,")","{#csstransforms3d{left:9px;position:absolute}}"].join(""),['#generatedcontent:after{content:"',m,'"}'].join("")],["fontface","touch","csstransforms3d","generatedcontent"]);r.flexbox=function(){function c(a,b,c,d){a.style.cssText=o.join(b+":"+c+";")+(d||"")}function a(a,b,c,d){b+=":",a.style.cssText=(b+o.join(c+";"+b)).slice(0,-b.length)+(d||"")}var d=b.createElement("div"),e=b.createElement("div");a(d,"display","box","width:42px;padding:0;"),c(e,"box-flex","1","width:10px;"),d.appendChild(e),g.appendChild(d);var f=e.offsetWidth===42;d.removeChild(e),g.removeChild(d);return f},r.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},r.canvastext=function(){return!!e.canvas&&!!D(b.createElement("canvas").getContext("2d").fillText,"function")},r.webgl=function(){return!!a.WebGLRenderingContext},r.touch=function(){return e.touch},r.geolocation=function(){return!!navigator.geolocation},r.postmessage=function(){return!!a.postMessage},r.websqldatabase=function(){var b=!!a.openDatabase;return b},r.indexedDB=function(){for(var b=-1,c=p.length;++b7)},r.history=function(){return!!a.history&&!!history.pushState},r.draganddrop=function(){return x("dragstart")&&x("drop")},r.websockets=function(){for(var b=-1,c=p.length;++b";return(a.firstChild&&a.firstChild.namespaceURI)==q.svg},r.smil=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"animate")))},r.svgclippaths=function(){return!!b.createElementNS&&/SVG/.test(n.call(b.createElementNS(q.svg,"clipPath")))};for(var J in r)A(r,J)&&(y=J.toLowerCase(),e[y]=r[J](),u.push((e[y]?"":"no-")+y));e.input||I(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)A(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return;b=typeof b=="boolean"?b:!!b(),g.className+=" "+(b?"":"no-")+a,e[a]=b}return e},B(""),j=l=null,a.attachEvent&&function(){var a=b.createElement("div");a.innerHTML="";return a.childNodes.length!==1}()&&function(a,b){function s(a){var b=-1;while(++b=u.minw)&&(!u.maxw||u.maxw&&l<=u.maxw))m[u.media]||(m[u.media]=[]),m[u.media].push(f[u.rules])}for(var t in g)g[t]&&g[t].parentNode===j&&j.removeChild(g[t]);for(var t in m){var v=c.createElement("style"),w=m[t].join("\n");v.type="text/css",v.media=t,v.styleSheet?v.styleSheet.cssText=w:v.appendChild(c.createTextNode(w)),n.appendChild(v),g.push(v)}j.insertBefore(n,o.nextSibling)}},s=function(a,b){var c=t();if(!!c){c.open("GET",a,!0),c.onreadystatechange=function(){c.readyState==4&&(c.status==200||c.status==304)&&b(c.responseText)};if(c.readyState==4)return;c.send()}},t=function(){var a=!1,b=[function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new XMLHttpRequest}],c=b.length;while(c--){try{a=b[c]()}catch(d){continue}break}return function(){return a}}();m(),respond.update=m,a.addEventListener?a.addEventListener("resize",u,!1):a.attachEvent&&a.attachEvent("onresize",u)}}(this,Modernizr.mq("only all")),function(a,b,c){function k(a){return!a||a=="loaded"||a=="complete"}function j(){var a=1,b=-1;while(p.length- ++b)if(p[b].s&&!(a=p[b].r))break;a&&g()}function i(a){var c=b.createElement("script"),d;c.src=a.s,c.onreadystatechange=c.onload=function(){!d&&k(c.readyState)&&(d=1,j(),c.onload=c.onreadystatechange=null)},m(function(){d||(d=1,j())},H.errorTimeout),a.e?c.onload():n.parentNode.insertBefore(c,n)}function h(a){var c=b.createElement("link"),d;c.href=a.s,c.rel="stylesheet",c.type="text/css",!a.e&&(w||r)?function a(b){m(function(){if(!d)try{b.sheet.cssRules.length?(d=1,j()):a(b)}catch(c){c.code==1e3||c.message=="security"||c.message=="denied"?(d=1,m(function(){j()},0)):a(b)}},0)}(c):(c.onload=function(){d||(d=1,m(function(){j()},0))},a.e&&c.onload()),m(function(){d||(d=1,j())},H.errorTimeout),!a.e&&n.parentNode.insertBefore(c,n)}function g(){var a=p.shift();q=1,a?a.t?m(function(){a.t=="c"?h(a):i(a)},0):(a(),j()):q=0}function f(a,c,d,e,f,h){function i(){!o&&k(l.readyState)&&(r.r=o=1,!q&&j(),l.onload=l.onreadystatechange=null,m(function(){u.removeChild(l)},0))}var l=b.createElement(a),o=0,r={t:d,s:c,e:h};l.src=l.data=c,!s&&(l.style.display="none"),l.width=l.height="0",a!="object"&&(l.type=d),l.onload=l.onreadystatechange=i,a=="img"?l.onerror=i:a=="script"&&(l.onerror=function(){r.e=r.r=1,g()}),p.splice(e,0,r),u.insertBefore(l,s?null:n),m(function(){o||(u.removeChild(l),r.r=r.e=o=1,j())},H.errorTimeout)}function e(a,b,c){var d=b=="c"?z:y;q=0,b=b||"j",C(a)?f(d,a,b,this.i++,l,c):(p.splice(this.i++,0,a),p.length==1&&g());return this}function d(){var a=H;a.loader={load:e,i:0};return a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=r&&!s,u=s?l:n.parentNode,v=a.opera&&o.call(a.opera)=="[object Opera]",w="webkitAppearance"in l.style,x=w&&"async"in b.createElement("script"),y=r?"object":v||x?"img":"script",z=w?"img":y,A=Array.isArray||function(a){return o.call(a)=="[object Array]"},B=function(a){return typeof a=="object"},C=function(a){return typeof a=="string"},D=function(a){return o.call(a)=="[object Function]"},E=[],F={},G,H;H=function(a){function f(a){var b=a.split("!"),c=E.length,d=b.pop(),e=b.length,f={url:d,origUrl:d,prefixes:b},g,h;for(h=0;h",a,""].join(""),k.id=i,k.innerHTML+=f,g.appendChild(k),h=c(k,a),k.parentNode.removeChild(k);return!!h},v=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=B(e[d],"function"),B(e[d],c)||(e[d]=c),e.removeAttribute(d))),e=null;return f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),w,x={}.hasOwnProperty,y;!B(x,c)&&!B(x.call,c)?y=function(a,b){return x.call(a,b)}:y=function(a,b){return b in a&&B(a.constructor.prototype[b],c)};var F=function(a,c){var d=a.join(""),f=c.length;u(d,function(a,c){var d=b.styleSheets[b.styleSheets.length-1],g=d.cssRules&&d.cssRules[0]?d.cssRules[0].cssText:d.cssText||"",h=a.childNodes,i={};while(f--)i[h[f].id]=h[f];e.csstransforms3d=i.csstransforms3d.offsetLeft===9,e.generatedcontent=i.generatedcontent.offsetHeight>=1,e.fontface=/src/i.test(g)&&g.indexOf(c.split(" ")[0])===0},f,c)}(['@font-face {font-family:"font";src:url("https://")}',["@media (",o.join("transform-3d),("),i,")","{#csstransforms3d{left:9px;position:absolute}}"].join(""),['#generatedcontent:after{content:"',m,'";visibility:hidden}'].join("")],["fontface","csstransforms3d","generatedcontent"]);q.flexbox=function(){function c(a,b,c,d){a.style.cssText=o.join(b+":"+c+";")+(d||"")}function a(a,b,c,d){b+=":",a.style.cssText=(b+o.join(c+";"+b)).slice(0,-b.length)+(d||"")}var d=b.createElement("div"),e=b.createElement("div");a(d,"display","box","width:42px;padding:0;"),c(e,"box-flex","1","width:10px;"),d.appendChild(e),g.appendChild(d);var f=e.offsetWidth===42;d.removeChild(e),g.removeChild(d);return f},q.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},q.canvastext=function(){return!!e.canvas&&!!B(b.createElement("canvas").getContext("2d").fillText,"function")},q.postmessage=function(){return!!a.postMessage},q.websqldatabase=function(){var b=!!a.openDatabase;return b},q.indexedDB=function(){for(var b=-1,c=p.length;++b7)},q.history=function(){return!!a.history&&!!history.pushState},q.draganddrop=function(){return v("dragstart")&&v("drop")},q.websockets=function(){for(var b=-1,c=p.length;++b";return a.childNodes.length!==1}()&&function(a,b){function s(a){var b=-1;while(++bzip($hrefs); if ($zipFile !== false) { @@ -22,7 +21,7 @@ if ($zipFile !== false) { header("Connection: close"); readfile($zipFile); } else { - echo "sorry, something went wrong while building the zip."; + echo "2: something went wrong while building the zip"; } ?> \ No newline at end of file diff --git a/src/js.htaccess b/src/js.htaccess index 39436a20..d18f8cff 100644 --- a/src/js.htaccess +++ b/src/js.htaccess @@ -27,7 +27,8 @@ IndexIgnore h5ai h5ai.header.html h5ai.footer.html # table options ################################ -# syntax for default sort order is: IndexOrderDefault Ascending|Descending Name|Date|Size +# syntax for default sort order is: +# IndexOrderDefault Ascending|Descending Name|Date|Size IndexOrderDefault Ascending Name IndexOptions Type=text/html;h5ai=%BUILD_VERSION%