diff --git a/.gitignore b/.gitignore
index 40bcedd9..206365b2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,8 @@
# Build folders to ignore
-bin
build
-target
-
build.local.*
+release
# Eclipse
diff --git a/README.md b/README.md
index 0f42c519..caac9efd 100644
--- a/README.md
+++ b/README.md
@@ -2,13 +2,37 @@
* Website with download, docs and demo:
* Sources:
+* Q&A group:
h5ai is provided under the terms of the [MIT License](http://github.com/lrsjng/h5ai/blob/master/LICENSE.txt).
-It uses the [Faenza icon set](http://tiheum.deviantart.com/art/Faenza-Icons-173323228) (GPL license).
+
+
+## h5ai profits from these great projects
+
+* [AmplifyJS](http://amplifyjs.com) (MIT/GPL)
+* [Datejs](http://www.datejs.com) (MIT)
+* [Faenza icon set](http://tiheum.deviantart.com/art/Faenza-Icons-173323228) (GPL)
+* [HTML5 ★ Boilerplate](http://html5boilerplate.com)
+* [jQuery](http://jquery.com) (MIT/GPL)
+* [jQuery.mousewheel](http://github.com/brandonaaron/jquery-mousewheel) (MIT)
+* [modernizr](http://www.modernizr.com) (MIT/BSD)
## Changelog
+### v0.16 · *2011-11-02*
+
+* sorts translations in `options.js`
+* improves HTML head sections
+* refactors JavaScript and PHP a lot
+* improves/fixes file selection for zipped download
+* fixes scrollbar and header/footer link issues (didn't work when zipped download enabled)
+* adds support for ctrl-select
+* `dateFormat` in `options.js` changed, now affecting JS and PHP version
+* `dateFormat` is localizable by adding it to a translation in `options.js`
+* PHP version is now configurable via `php/config.php` (set custom doc root and other PHP related things)
+* image thumbs and zipped download is disabled by default now, but works fine if PHP is configured
+
### v0.15.2 · *2011-09-18*
diff --git a/build.properties b/build.properties
index 1cf65d42..061dc895 100644
--- a/build.properties
+++ b/build.properties
@@ -3,7 +3,7 @@ custom = true
# project
project.name = h5ai
-project.version = 0.15.2
+project.version = 0.16
# src
@@ -16,5 +16,5 @@ release.dir = release
# tools
-wepp = tools/wepp
+tool.wepp = tools/wepp
diff --git a/release/h5ai-0.15.2.tar.gz b/release/h5ai-0.15.2.tar.gz
deleted file mode 100644
index 8b4ee6b6..00000000
Binary files a/release/h5ai-0.15.2.tar.gz and /dev/null differ
diff --git a/release/h5ai-0.15.2.zip b/release/h5ai-0.15.2.zip
deleted file mode 100644
index ad8cfb94..00000000
Binary files a/release/h5ai-0.15.2.zip and /dev/null differ
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 3eacc917..07167e41 100644
--- a/src/h5ai/footer.html
+++ b/src/h5ai/footer.html
@@ -27,7 +27,7 @@
-
+
diff --git a/src/h5ai/header.php b/src/h5ai/header.php
index a6987061..6e645106 100644
--- a/src/h5ai/header.php
+++ b/src/h5ai/header.php
@@ -1,17 +1,21 @@
-
+
+
+
+
+
getTitle(); ?>
-
+
-
-
-
+
+
+
@@ -56,7 +60,7 @@
-
+
diff --git a/src/h5ai/js/inc/tree.js b/src/h5ai/js/inc/Connector.js
similarity index 80%
rename from src/h5ai/js/inc/tree.js
rename to src/h5ai/js/inc/Connector.js
index db7a5883..ab644855 100644
--- a/src/h5ai/js/inc/tree.js
+++ b/src/h5ai/js/inc/Connector.js
@@ -1,14 +1,13 @@
+/*global $, H5aiJs */
-var Tree = function (pathCache, h5ai) {
- "use strict";
- /*global $*/
+H5aiJs.factory.Connector = function () {
var contentTypeRegEx = /^text\/html;h5ai=/,
pathnameStatusCache = {},
fetchStatus = function (pathname, callback) {
- if (h5ai.settings.folderStatus[pathname]) {
- callback(h5ai.settings.folderStatus[pathname]);
+ if (H5aiJs.h5ai.settings.folderStatus[pathname]) {
+ callback(H5aiJs.h5ai.settings.folderStatus[pathname]);
return;
} else if (pathnameStatusCache[pathname]) {
callback(pathnameStatusCache[pathname]);
@@ -38,18 +37,16 @@ var Tree = function (pathCache, h5ai) {
if (status !== "h5ai") {
path.status = status;
}
- path.updateHtml();
- h5ai.linkHoverStates();
+ H5aiJs.html.updateHtml(path);
+ H5aiJs.h5ai.linkHoverStates();
});
}
},
updatePaths = function () {
- var ref;
-
- for (ref in pathCache.cache) {
- updatePath(pathCache.cache[ref]);
- }
+ $.each(H5aiJs.pathCache.cache, function (ref, cached) {
+ updatePath(cached);
+ });
},
fetchStatusAndContent = function (pathname, includeParent, callback) {
@@ -79,7 +76,7 @@ var Tree = function (pathCache, h5ai) {
$(html).find("#table td").closest("tr").each(function () {
- var path = pathCache.getPath(pathname, this);
+ var path = H5aiJs.pathCache.getPath(pathname, this);
if (path.isFolder && (!path.isParentFolder || includeParent)) {
content[path.absHref] = path;
@@ -95,7 +92,7 @@ var Tree = function (pathCache, h5ai) {
fetchStatusAndContent(pathname, false, function (status, content) {
- var path = pathCache.getPath(pathname);
+ var path = H5aiJs.pathCache.getPath(pathname);
path.status = status;
path.content = content;
@@ -106,7 +103,7 @@ var Tree = function (pathCache, h5ai) {
fetchPath(pathname, function (path) {
- var parent = pathCache.splitPathname(pathname)[0];
+ var parent = H5aiJs.pathCache.splitPathname(pathname)[0];
path.treeOpen = true;
if (childPath) {
@@ -123,25 +120,24 @@ var Tree = function (pathCache, h5ai) {
fetchTree(document.location.pathname, function (path) {
$("#tree")
- .append(path.updateTreeHtml())
+ .append(H5aiJs.html.updateTreeHtml(path))
.scrollpanel()
.show();
- h5ai.shiftTree(false, true);
- h5ai.linkHoverStates();
+ H5aiJs.h5ai.shiftTree(false, true);
+ H5aiJs.h5ai.linkHoverStates();
setTimeout(function () { $("#tree").get(0).updateScrollbar(); }, 1);
});
},
init = function () {
- if (h5ai.settings.showTree) {
+ if (H5aiJs.h5ai.settings.showTree) {
updatePaths();
populateTree();
}
- },
- tree = {
- fetchStatusAndContent: fetchStatusAndContent,
- init: init
};
- return tree;
+ return {
+ fetchStatusAndContent: fetchStatusAndContent,
+ init: init
+ };
};
diff --git a/src/h5ai/js/inc/extended.js b/src/h5ai/js/inc/Extended.js
similarity index 61%
rename from src/h5ai/js/inc/extended.js
rename to src/h5ai/js/inc/Extended.js
index b4641193..03d46a4e 100644
--- a/src/h5ai/js/inc/extended.js
+++ b/src/h5ai/js/inc/Extended.js
@@ -1,7 +1,6 @@
+/*global $, H5aiJs */
-var Extended = function (pathCache, h5ai) {
- "use strict";
- /*global $*/
+H5aiJs.factory.Extended = function () {
var settings = {
customHeader: "h5ai.header.html",
@@ -16,21 +15,19 @@ var Extended = function (pathCache, h5ai) {
},
initBreadcrumb = function () {
- var idx, part,
- $ul = $("body > nav ul"),
+ var $ul = $("body > nav ul"),
pathname = "/",
- path = pathCache.getPath(pathname),
+ path = H5aiJs.pathCache.getPath(pathname),
pathnameParts = document.location.pathname.split("/");
- $ul.append(path.updateCrumbHtml());
+ $ul.append(H5aiJs.html.updateCrumbHtml(path));
- for (idx in pathnameParts) {
- part = pathnameParts[idx];
+ $.each(pathnameParts, function (idx, part) {
if (part !== "") {
pathname += part + "/";
- $ul.append(pathCache.getPath(pathname).updateCrumbHtml());
+ $ul.append(H5aiJs.html.updateCrumbHtml(H5aiJs.pathCache.getPath(pathname)));
}
- }
+ });
},
initExtendedView = function () {
@@ -40,24 +37,24 @@ var Extended = function (pathCache, h5ai) {
$size = $ths.eq(3).find("a"),
sortquery = document.location.search,
order = {
- column: (sortquery.indexOf("C=N") >= 0) ? "name" : (sortquery.indexOf("C=M") >= 0) ? "date" : (sortquery.indexOf("C=S") >= 0) ? "size" : h5ai.settings.sortorder.column,
- ascending: (sortquery.indexOf("O=A") >= 0) ? true : (sortquery.indexOf("O=D") >= 0) ? false : h5ai.settings.sortorder.ascending
+ column: (sortquery.indexOf("C=N") >= 0) ? "name" : (sortquery.indexOf("C=M") >= 0) ? "date" : (sortquery.indexOf("C=S") >= 0) ? "size" : H5aiJs.h5ai.settings.sortorder.column,
+ ascending: (sortquery.indexOf("O=A") >= 0) ? true : (sortquery.indexOf("O=D") >= 0) ? false : H5aiJs.h5ai.settings.sortorder.ascending
},
$icon, $ul, $li;
$ul = $("");
$li = $("")
- .appendTo($ul)
- .append($(""))
- .append($("" + $label.text() + ""))
- .append($("" + $date.text() + ""))
- .append($("" + $size.text() + ""));
+ .appendTo($ul)
+ .append($(""))
+ .append($("" + $label.text() + ""))
+ .append($("" + $date.text() + ""))
+ .append($("" + $size.text() + ""));
// header sort icons
if (order.ascending) {
- $icon = $("
");
+ $icon = $("
");
} else {
- $icon = $("
");
+ $icon = $("
");
}
if (order.column === "date") {
$li.find("a.date").prepend($icon);
@@ -69,8 +66,8 @@ var Extended = function (pathCache, h5ai) {
// entries
$("#table td").closest("tr").each(function () {
- var path = pathCache.getPath(document.location.pathname, this);
- $ul.append(path.updateExtendedHtml());
+ var path = H5aiJs.pathCache.getPath(document.location.pathname, this);
+ $ul.append(H5aiJs.html.updateExtendedHtml(path));
});
$("#extended").append($ul);
@@ -98,22 +95,18 @@ var Extended = function (pathCache, h5ai) {
}
});
},
- initCounts = function () {
+ initTotals = function () {
$(".folderCount").text($("#extended .entry.folder:not(.parentfolder)").size());
$(".fileCount").text($("#extended .entry.file").size());
- },
- init = function () {
-
- initTitle();
- initBreadcrumb();
- initExtendedView();
- customize();
- initCounts();
- },
- extended = {
- init: init
};
- return extended;
+ this.init = function () {
+
+ initTitle();
+ initBreadcrumb();
+ initExtendedView();
+ customize();
+ initTotals();
+ };
};
diff --git a/src/h5ai/js/inc/h5ai.js b/src/h5ai/js/inc/H5ai.js
similarity index 55%
rename from src/h5ai/js/inc/h5ai.js
rename to src/h5ai/js/inc/H5ai.js
index 79818ad4..924cd603 100644
--- a/src/h5ai/js/inc/h5ai.js
+++ b/src/h5ai/js/inc/H5ai.js
@@ -1,17 +1,19 @@
-var H5ai = function (options, langs) {
- "use strict";
- /*global $, window, localStorage*/
+H5aiJs.factory.H5ai = function (options, langs) {
+ /*global window, $, amplify*/
- var defaults = {
+ var $window = $(window),
+ $document = $(document),
+ defaults = {
store: {
- viewmode: "h5ai.viewmode",
- lang: "h5ai.lang"
+ viewmode: "h5ai.pref.viewmode",
+ lang: "h5ai.pref.lang"
},
callbacks: {
pathClick: []
},
+ h5aiAbsHref: "/h5ai",
viewmodes: ["details", "icons"],
sortorder: {
column: "name",
@@ -24,15 +26,22 @@ var H5ai = function (options, langs) {
useBrowserLang: true,
setParentFolderLabels: true,
linkHoverStates: true,
-
- dateFormat: "Y-m-d H:i",
- ignore: ["h5ai", "h5ai.header.html", "h5ai.footer.html"],
- ignoreRE: ["/^\\./"],
+ dateFormat: "yyyy-MM-dd HH:mm",
showThumbs: true,
-
zippedDownload: true
},
settings = $.extend({}, defaults, options),
+ api = function () {
+ return settings.h5aiAbsHref + "/php/api.php";
+ },
+ image = function (id) {
+
+ return settings.h5aiAbsHref + "/images/" + id + ".png";
+ },
+ icon = function (id, big) {
+
+ return settings.h5aiAbsHref + "/icons/" + (big ? "48x48" : "16x16") + "/" + id + ".png";
+ },
pathClick = function (fn) {
if ($.isFunction(fn)) {
@@ -41,22 +50,20 @@ var H5ai = function (options, langs) {
},
triggerPathClick = function (path, context) {
- var i, l, a = settings.callbacks.pathClick;
-
- for (i = 0, l = a.length; i < l; i++) {
- a[i].call(window, path, context);
- }
+ $.each(settings.callbacks.pathClick, function (idx, callback) {
+ callback(path, context);
+ });
},
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();
@@ -85,7 +92,7 @@ var H5ai = function (options, langs) {
var adjustTopSpace = function () {
- var winHeight = $(window).height(),
+ var winHeight = $window.height(),
navHeight = $("body > nav").outerHeight(),
footerHeight = $("body > footer").outerHeight(),
contentSpacing = 50,
@@ -106,7 +113,7 @@ var H5ai = function (options, langs) {
} catch (err) {}
};
- $(window).resize(function () {
+ $window.resize(function () {
adjustTopSpace();
});
adjustTopSpace();
@@ -144,14 +151,14 @@ var H5ai = function (options, langs) {
$(".status.default").show();
$(".status.dynamic").empty().hide();
}
- );
+ );
},
shiftTree = function (forceVisible, dontAnimate) {
var $tree = $("#tree"),
$extended = $("#extended");
- if (settings.slideTree && $tree.outerWidth() < $extended.offset().left || forceVisible) {
+ if ((settings.slideTree && $tree.outerWidth() < $extended.offset().left) || forceVisible) {
if (dontAnimate) {
$tree.stop().css({ left: 0 });
} else {
@@ -170,10 +177,21 @@ var H5ai = function (options, langs) {
$("#tree").hover(
function () { shiftTree(true); },
function () { shiftTree(); }
- );
- $(window).resize(function () { shiftTree(); });
+ );
+ $window.resize(function () { shiftTree(); });
shiftTree(false, true);
},
+ selectLinks = function (href) {
+
+ var elements = [];
+ $("a[href^='/']").each(function () {
+
+ if ($(this).attr("href") === href) {
+ elements.push(this);
+ }
+ });
+ return $(elements);
+ },
linkHoverStates = function () {
if (settings.linkHoverStates) {
@@ -183,15 +201,16 @@ var H5ai = function (options, langs) {
href = $a.attr("href");
$a.hover(
- function () { $("a[href='" + href + "']").addClass("hover"); },
- function () { $("a[href='" + href + "']").removeClass("hover"); }
- );
+ function () { selectLinks(href).addClass("hover"); },
+ function () { selectLinks(href).removeClass("hover"); }
+ );
});
}
},
localize = function (langs, lang, useBrowserLang) {
- var storedLang = localStorage.getItem(settings.store.lang),
+ var storedLang = amplify.store(settings.store.lang),
+ dateFormat = settings.dateFormat,
browserLang, selected, key;
if (langs[storedLang]) {
@@ -211,102 +230,125 @@ var H5ai = function (options, langs) {
selected = langs[lang];
if (selected) {
- for (key in selected) {
- $(".l10n-" + key).text(selected[key]);
- }
+ $.each(selected, function (key, value) {
+ $(".l10n-" + key).text(value);
+ });
$(".lang").text(lang);
$(".langOption").removeClass("current");
$(".langOption." + lang).addClass("current");
}
+
+ dateFormat = selected.dateFormat || dateFormat;
+ $("#extended .entry .date").each(function () {
+
+ var $this = $(this),
+ time = $this.data("time"),
+ formattedDate = time ? new Date(time).toString(dateFormat) : "";
+
+ $this.text(formattedDate);
+ });
+
},
initLangSelector = function (langs) {
- var idx, lang,
+ var $langOptions = $(".langOptions"),
sortedLangsKeys = [],
$ul;
- for (lang in langs) {
+ $.each(langs, function (lang) {
sortedLangsKeys.push(lang);
- }
+ });
sortedLangsKeys.sort();
$ul = $("");
- for (idx in sortedLangsKeys) {
- (function (lang) {
- $("")
- .addClass(lang)
- .text(lang + " - " + langs[lang].lang)
- .appendTo($ul)
- .click(function () {
- localStorage.setItem(settings.store.lang, lang);
- localize(langs, lang, false);
- });
- })(sortedLangsKeys[idx]);
- }
+ $.each(sortedLangsKeys, function (idx, lang) {
+ $("")
+ .addClass(lang)
+ .text(lang + " - " + langs[lang].lang)
+ .appendTo($ul)
+ .click(function () {
+ 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();
}
- );
+ );
+ },
+ onIndicatorClick = function (event) {
+
+ var $indicator = $(this),
+ $entry = $indicator.closest(".entry");
+
+ if ($indicator.hasClass("unknown")) {
+ $.get(api(), { "action": "tree", "href": $entry.find("> a").attr("href") }, function (html) {
+
+ var $content = $(html);
+
+ $indicator.removeClass("unknown");
+ if ($content.find("> li").size() === 0) {
+ $indicator.replaceWith($(""));
+ } else {
+ $indicator.addClass("open");
+ $entry.find("> .content").replaceWith($content);
+ $("#tree").get(0).updateScrollbar();
+ $content.find(".indicator:not(.initiated)")
+ .click(onIndicatorClick)
+ .addClass("initiated");
+ }
+ });
+ } else if ($indicator.hasClass("open")) {
+ $indicator.removeClass("open");
+ $("#tree").get(0).updateScrollbar(true);
+ $entry.find("> .content").slideUp(function () {
+ $("#tree").get(0).updateScrollbar();
+ });
+ } else {
+ $indicator.addClass("open");
+ $("#tree").get(0).updateScrollbar(true);
+ $entry.find("> .content").slideDown(function () {
+ $("#tree").get(0).updateScrollbar();
+ });
+ }
},
initIndicators = function () {
- $("#tree .entry.folder:not(.initiatedIndicator)").each(function () {
-
- var $entry = $(this).addClass("initiatedIndicator"),
- $indicator = $entry.find("> .indicator");
-
- $indicator.click(function (event) {
-
- var $content;
-
- if ($indicator.hasClass("unknown")) {
- $.get("/h5ai/php/treecontent.php", { "href": $entry.find("> a").attr("href") }, function (html) {
- $content = $(html);
- $indicator.removeClass("unknown");
- if ($content.find("> li").size() === 0) {
- $indicator.replaceWith($(""));
- } else {
- $indicator.addClass("open");
- $entry.find("> .content").replaceWith($content);
- $("#tree").get(0).updateScrollbar();
- initIndicators();
- }
- });
- } else if ($indicator.hasClass("open")) {
- $indicator.removeClass("open");
- $("#tree").get(0).updateScrollbar(true);
- $entry.find("> .content").slideUp(function () {
- $("#tree").get(0).updateScrollbar();
- });
- } else {
- $indicator.addClass("open");
- $("#tree").get(0).updateScrollbar(true);
- $entry.find("> .content").slideDown(function () {
- $("#tree").get(0).updateScrollbar();
- });
- }
- });
- });
+ $("#tree .entry.folder .indicator:not(.initiated)")
+ .click(onIndicatorClick)
+ .addClass("initiated");
},
initZippedDownload = function () {
var x = 0,
y = 0,
- $window = $(window),
- selected = function (hrefs) {
+ ctrl = false,
+ updateDownloadBtn = function () {
- var query, idx;
- for (idx in hrefs) {
- query = query ? query + ":" + hrefs[idx] : hrefs[idx];
+ var query,
+ href,
+ $selected = $("#extended a.selected");
+
+ if ($selected.size() > 0) {
+ $selected.each(function () {
+ href = $(this).attr("href");
+ query = query ? query + ":" + href : href;
+ });
+ query = api() + "?action=zip&hrefs=" + query;
+ $("#download").show().find("a").attr("href", query);
+ } else {
+ $("#download").hide().find("a").attr("href", "#");
}
- query = "/h5ai/php/zipcontent.php?hrefs=" + query;
- $("#download").show().find("a").attr("href", query);
},
selectionUpdate = function (event) {
@@ -320,41 +362,45 @@ var 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});
+ // only on left button and don't block the scrollbars
+ if (event.button !== 0 || x >= view.right || y >= view.bottom) {
+ 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);
},
@@ -362,12 +408,29 @@ var 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 () {
@@ -381,15 +444,18 @@ var H5ai = function (options, langs) {
localize(langs, settings.lang, settings.useBrowserLang);
initIndicators();
initZippedDownload();
- },
- h5ai = {
- settings: settings,
- shiftTree: shiftTree,
- linkHoverStates: linkHoverStates,
- pathClick: pathClick,
- triggerPathClick: triggerPathClick,
- init: init
};
- return h5ai;
+ return {
+ settings: settings,
+ api: api,
+ image: image,
+ icon: icon,
+ shiftTree: shiftTree,
+ linkHoverStates: linkHoverStates,
+ pathClick: pathClick,
+ triggerPathClick: triggerPathClick,
+ initIndicators: initIndicators,
+ init: init
+ };
};
diff --git a/src/h5ai/js/inc/Html.js b/src/h5ai/js/inc/Html.js
new file mode 100644
index 00000000..86159622
--- /dev/null
+++ b/src/h5ai/js/inc/Html.js
@@ -0,0 +1,260 @@
+/*global $, H5aiJs */
+
+H5aiJs.factory.Html = function () {
+
+ var thumbExts = ["bmp", "gif", "ico", "image", "jpg", "jpeg", "png", "tiff"],
+ onClick = function (path, context) {
+
+ H5aiJs.h5ai.triggerPathClick(path, context);
+ },
+ updateCrumbHtml = function (path) {
+
+ var $html, $a;
+
+ if (path.html.$crumb && path.html.$crumb.data("status") === path.status) {
+ return path.html.$crumb;
+ }
+
+ $html = $("")
+ .data("path", path)
+ .addClass(path.isFolder ? "folder" : "file");
+
+ if (path.status) {
+ $html.data("status", path.status);
+ }
+
+ $a = $("
" + path.label + "")
+ .appendTo($html)
+ .attr("href", path.absHref)
+ .click(function() { onClick(path, "crumb"); });
+
+ if (path.isDomain) {
+ $html.addClass("domain");
+ $a.find("img").attr("src", H5aiJs.h5ai.image("home"));
+ }
+
+ if (path.isCurrentFolder) {
+ $html.addClass("current");
+ }
+
+ if (!isNaN(path.status)) {
+ if (path.status === 200) {
+ $("
").appendTo($a);
+ } else {
+ $("(" + path.status + ")").appendTo($a);
+ }
+ }
+
+ if (path.html.$crumb) {
+ path.html.$crumb.replaceWith($html);
+ }
+ path.html.$crumb = $html;
+
+ return $html;
+ },
+ updateExtendedHtml = function (path) {
+
+ var $html, $a, $label,
+ formattedDate = path.date ? path.date.toString(H5aiJs.h5ai.settings.dateFormat) : "",
+ ext = path.absHref.substr((path.absHref.lastIndexOf('.') + 1)),
+ icon16 = path.icon16,
+ icon48 = path.icon48;
+
+ if (path.html.$extended && path.html.$extended.data("status") === path.status) {
+ return path.html.$extended;
+ }
+
+ $html = $("")
+ .data("path", path)
+ .addClass(path.isFolder ? "folder" : "file");
+
+ if (path.status) {
+ $html.data("status", path.status);
+ }
+
+ if (H5aiJs.h5ai.settings.showThumbs && $.inArray(ext.toLowerCase(), thumbExts) >= 0) {
+ icon16 = H5aiJs.h5ai.api() + "?action=thumb&href=" + path.absHref + "&width=16&height=16&mode=square";
+ icon48 = H5aiJs.h5ai.api() + "?action=thumb&href=" + path.absHref + "&width=96&height=46&mode=rational";
+ }
+
+ $label = $("" + path.label + "");
+ $a = $("")
+ .attr("href", path.absHref)
+ .click(function() { onClick(path, "extended"); })
+ .appendTo($html)
+ .append($("
"))
+ .append($("
"))
+ .append($label)
+ .append($(""))
+ .append($("" + path.size + ""));
+
+ $a.hover(
+ function () {
+ if ($("#extended").hasClass("icons-view")) {
+ var $this = $(this);
+ $(".status.default").hide();
+ $(".status.dynamic")
+ .empty()
+ .append($this.find(".label").clone())
+ .append($("·"))
+ .append($this.find(".date").clone())
+ .show();
+
+ if (!$this.closest(".entry").hasClass("folder")) {
+ $(".status.dynamic")
+ .append($("·"))
+ .append($this.find(".size").clone());
+ }
+ }
+ },
+ function () {
+ $(".status.default").show();
+ $(".status.dynamic").empty().hide();
+ }
+ );
+
+ if (path.isParentFolder) {
+ if (!H5aiJs.h5ai.settings.setParentFolderLabels) {
+ $label.addClass("l10n-parentDirectory");
+ }
+ $html.addClass("folder-parent");
+ }
+
+ if (!isNaN(path.status)) {
+ if (path.status === 200) {
+ $html.addClass("page");
+ $a.find(".icon.small img").attr("src", H5aiJs.h5ai.icon("folder-page"));
+ $a.find(".icon.big img").attr("src", H5aiJs.h5ai.icon("folder-page", true));
+ } else {
+ $html.addClass("error");
+ $label.append($(" " + path.status + " "));
+ }
+ }
+
+ if (path.html.$extended) {
+ path.html.$extended.replaceWith($html);
+ }
+ path.html.$extended = $html;
+
+ return $html;
+ },
+ updateTreeHtml = function (path) {
+
+ var $html, $blank, $a, $indicator, $ul, idx;
+
+ $html = $("")
+ .data("path", path)
+ .addClass(path.isFolder ? "folder" : "file");
+
+ $blank = $("").appendTo($html);
+
+ $a = $("")
+ .attr("href", path.absHref)
+ .click(function() { path.onClick(path, "tree"); })
+ .appendTo($html)
+ .append($("
"))
+ .append($("" + path.label + ""));
+
+ if (path.isFolder) {
+ // indicator
+ if (path.status === undefined || !path.isEmpty()) {
+ $indicator = $("
")
+ .click(function (event) {
+
+ var $entry = $indicator.closest(".entry"); // $html
+
+ if ($indicator.hasClass("unknown")) {
+ H5aiJs.connector.fetchStatusAndContent(path.absHref, false, function (status, content) {
+
+ path.status = status;
+ path.content = content;
+ path.treeOpen = true;
+ $("#tree").get(0).updateScrollbar(true);
+ updateTreeHtml(path);
+ $("#tree").get(0).updateScrollbar();
+ });
+ } else if ($indicator.hasClass("open")) {
+ path.treeOpen = false;
+ $indicator.removeClass("open");
+ $("#tree").get(0).updateScrollbar(true);
+ $entry.find("> ul.content").slideUp(function() {
+
+ $("#tree").get(0).updateScrollbar();
+ });
+ } else {
+ path.treeOpen = true;
+ $indicator.addClass("open");
+ $("#tree").get(0).updateScrollbar(true);
+ $entry.find("> ul.content").slideDown(function() {
+
+ $("#tree").get(0).updateScrollbar();
+ });
+ }
+
+ });
+
+ if (path.status === undefined) {
+ $indicator.addClass("unknown");
+ } else if (path.treeOpen) {
+ $indicator.addClass("open");
+ }
+
+ $blank.replaceWith($indicator);
+ }
+
+ // is path the domain?
+ if (path.isDomain) {
+ $html.addClass("domain");
+ $a.find(".icon img").attr("src", H5aiJs.h5ai.icon("folder-home"));
+ }
+
+ // is path the current folder?
+ if (path.isCurrentFolder) {
+ $html.addClass("current");
+ $a.find(".icon img").attr("src", H5aiJs.h5ai.icon("folder-open"));
+ }
+
+ // does it have subfolders?
+ if (!path.isEmpty()) {
+ $ul = $("").appendTo($html);
+ $.each(path.content, function (idx, entry) {
+ $("").append(updateTreeHtml(entry)).appendTo($ul);
+ });
+ if (path.status === undefined || !path.treeOpen) {
+ $ul.hide();
+ }
+ }
+
+ // reflect folder status
+ if (!isNaN(path.status)) {
+ if (path.status === 200) {
+ $a.find(".icon img").attr("src", H5aiJs.h5ai.icon("folder-page"));
+ $a.append($("
"));
+ } else {
+ $html.addClass("error");
+ $a.append($("" + path.status + ""));
+ }
+ }
+ }
+
+ if (path.html.$tree) {
+ path.html.$tree.replaceWith($html);
+ }
+ path.html.$tree = $html;
+
+ return $html;
+ },
+ updateHtml = function (path) {
+
+ updateCrumbHtml(path);
+ updateExtendedHtml(path);
+ updateTreeHtml(path);
+ };
+
+ return {
+ updateCrumbHtml: updateCrumbHtml,
+ updateExtendedHtml: updateExtendedHtml,
+ updateTreeHtml: updateTreeHtml,
+ updateHtml: updateHtml
+ };
+};
diff --git a/src/h5ai/js/inc/Path.js b/src/h5ai/js/inc/Path.js
new file mode 100644
index 00000000..9cf72a2f
--- /dev/null
+++ b/src/h5ai/js/inc/Path.js
@@ -0,0 +1,102 @@
+/*global $, H5aiJs */
+
+H5aiJs.factory.Path = function (folder, tableRow) {
+
+ var checkedDecodeUri = function (uri) {
+
+ try { return decodeURI(uri); } catch (err) {}
+ return uri;
+ },
+ $tds, $img, $a, splits;
+
+ // parentFolder: undefined,
+ // label: undefined,
+ // dateOrgStr: undefined,
+ // date: undefined,
+ // time: undefined,
+ // size: undefined,
+ // href: undefined,
+ // absHref: undefined,
+ // alt: undefined,
+ // icon16: undefined,
+ // icon48: undefined,
+ // isFolder: undefined,
+ // isParentFolder: undefined,
+ // isCurrentFolder: undefined,
+ // isDomain: undefined,
+
+ this.status = undefined; // undefined, "h5ai" or HTTP response code
+ this.content = undefined; // associative array path.absHref -> path
+ this.html = {
+ $crumb: undefined,
+ $extended: undefined,
+ $tree: undefined
+ };
+ this.treeOpen = false;
+
+ if (!H5aiJs.pathCache.pathEndsWithSlash(folder)) {
+ folder += "/";
+ }
+
+ if (tableRow) {
+ $tds = $(tableRow).find("td");
+ $img = $tds.eq(0).find("img");
+ $a = $tds.eq(1).find("a");
+
+ this.parentFolder = folder;
+ this.label = $a.text();
+ this.dateOrgStr = $tds.eq(2).text();
+ this.date = Date.parse(this.dateOrgStr);
+ this.time = this.date ? this.date.getTime() : 0;
+ this.size = $tds.eq(3).text();
+ this.href = $a.attr("href");
+ this.alt = $img.attr("alt");
+ this.icon16 = $img.attr("src");
+ } else {
+ splits = H5aiJs.pathCache.splitPathname(folder);
+
+ this.parentFolder = splits[0];
+ this.label = checkedDecodeUri(splits[1]);
+ if (this.label === "/") {
+ this.label = checkedDecodeUri(document.domain) + "/";
+ }
+ this.dateOrgStr = "";
+ this.date = null;
+ this.time = 0;
+ this.size = "";
+ this.href = splits[1];
+ this.alt = "[DIR]";
+ this.icon16 = H5aiJs.h5ai.icon("folder");
+ }
+
+ if (H5aiJs.pathCache.pathEndsWithSlash(this.label)) {
+ this.label = this.label.slice(0, -1);
+ }
+
+ this.icon48 = this.icon16.replace("16x16", "48x48");
+ this.isFolder = (this.alt === "[DIR]");
+ this.isParentFolder = (this.isFolder && this.label === "Parent Directory");
+ this.absHref = this.isParentFolder ? this.href : this.parentFolder + this.href;
+ this.isCurrentFolder = (this.absHref === document.location.pathname);
+ this.isDomain = (this.absHref === "/");
+
+ if (this.isParentFolder && H5aiJs.h5ai.settings.setParentFolderLabels) {
+ if (this.isDomain) {
+ this.label = checkedDecodeUri(document.domain);
+ } else {
+ this.label = checkedDecodeUri(H5aiJs.pathCache.splitPathname(H5aiJs.pathCache.splitPathname(this.parentFolder)[0])[1].slice(0, -1));
+ }
+ }
+};
+
+H5aiJs.factory.Path.prototype = {
+
+ isEmpty: function () {
+
+ return !this.content || $.isEmptyObject(this.content);
+ },
+ onClick: function (context) {
+
+ H5aiJs.h5ai.triggerPathClick(this, context);
+ }
+};
diff --git a/src/h5ai/js/inc/PathCache.js b/src/h5ai/js/inc/PathCache.js
new file mode 100644
index 00000000..f0689616
--- /dev/null
+++ b/src/h5ai/js/inc/PathCache.js
@@ -0,0 +1,56 @@
+/*global $, H5aiJs */
+
+H5aiJs.factory.PathCache = function () {
+
+ var cache = {},
+ rePathnameSplit = /^(\/(.*\/)*)([^\/]+\/?)$/,
+ rePathEndsWithSlash = /\/$/,
+ splitPathname = function (pathname) {
+
+ var match;
+
+ if (pathname === "/") {
+ return ["", "/"];
+ }
+ match = rePathnameSplit.exec(pathname);
+ return [match[1], match[3]];
+ },
+ pathEndsWithSlash = function (pathname) {
+
+ return rePathEndsWithSlash.test(pathname);
+ },
+ getAbsHref = function (folder, tableRow) {
+
+ var $a, isParentFolder, href;
+
+ if (!pathEndsWithSlash(folder)) {
+ folder += "/";
+ }
+ if (!tableRow) {
+ return folder;
+ }
+ $a = $(tableRow).find("td").eq(1).find("a");
+ isParentFolder = ($a.text() === "Parent Directory");
+ href = $a.attr("href");
+ return isParentFolder ? undefined : folder + href;
+ },
+ getPath = function (folder, tableRow) {
+
+ var absHref = getAbsHref(folder, tableRow),
+ path = cache[absHref];
+
+ if (!path) {
+ path = new H5aiJs.factory.Path(folder, tableRow);
+ if (!path.isParentFolder) {
+ cache[path.absHref] = path;
+ }
+ }
+
+ return path;
+ };
+
+ this.splitPathname = splitPathname;
+ this.pathEndsWithSlash = pathEndsWithSlash;
+ this.getPath = getPath;
+ this.cache = cache;
+};
diff --git a/src/h5ai/js/inc/jquery.fracs.js b/src/h5ai/js/inc/jquery.fracs.js
deleted file mode 100644
index b1780f9d..00000000
--- a/src/h5ai/js/inc/jquery.fracs.js
+++ /dev/null
@@ -1,871 +0,0 @@
-/*
- * jQuery.fracs 0.10
- * http://larsjung.de/fracs
- *
- * provided under the terms of the MIT License
- */
-
-/*
- * ModPlug 0.4
- * http://larsjung.de/modplug
- *
- * provided under the terms of the MIT License
- */
-
-(function ($) {
- "use strict";
- /*globals jQuery */
- /*jslint confusion: true */
-
- var reference = "_mp_api";
-
- $.ModPlug = $.ModPlug || {
- plugin: function (namespace, options) {
-
- if (!namespace || $[namespace] || $.fn[namespace]) {
- // $.error("No namespace specified, or a plugin already exists on 'jQuery." + namespace + "'");
- return !namespace ? 1 : ($[namespace] ? 2 : 3);
- }
-
- var defaults = {
- statics: {},
- methods: {},
- defaultStatic: undefined,
- defaultMethod: undefined
- },
- settings = $.extend({}, defaults, options),
- staticPlug = function () {
-
- var args, defaultMethod;
-
- args = Array.prototype.slice.call(arguments);
- defaultMethod = settings.defaultStatic instanceof Function ? settings.defaultStatic.apply(this, args) : settings.defaultStatic;
- if (staticPlug[defaultMethod] instanceof Function) {
- return staticPlug[defaultMethod].apply(this, args);
- }
- $.error("Static method defaulted to '" + defaultMethod + "' does not exist on 'jQuery." + namespace + "'");
- },
- methods = {},
- methodPlug = function (method) {
-
- var args, defaultMethod;
-
- if (methods[method] instanceof Function) {
- args = Array.prototype.slice.call(arguments, 1);
- return methods[method].apply(this, args);
- }
-
- args = Array.prototype.slice.call(arguments);
- defaultMethod = settings.defaultMethod instanceof Function ? settings.defaultMethod.apply(this, args) : settings.defaultMethod;
- if (methods[defaultMethod] instanceof Function) {
- return methods[defaultMethod].apply(this, args);
- }
- $.error("Method '" + method + "' defaulted to '" + defaultMethod + "' does not exist on 'jQuery." + namespace + "'");
- },
- api = {
- addStatics: function (newStatics) {
-
- $.extend(staticPlug, newStatics);
- staticPlug[reference] = api;
- return this;
- },
- addMethods: function (newMethods) {
-
- $.extend(methods, newMethods);
- return this;
- }
- };
-
- api.addStatics(settings.statics).addMethods(settings.methods);
- $[namespace] = staticPlug;
- $.fn[namespace] = methodPlug;
- return 0;
- },
- module: function (namespace, options) {
-
- if (!$[namespace] || !$[namespace][reference]) {
- // $.error("No ModPlug plugin exists on 'jQuery." + namespace + "'");
- return !$[namespace] ? 1 : 2;
- }
-
- var defaults = {
- statics: {},
- methods: {}
- },
- settings = $.extend({}, defaults, options);
-
- $[namespace][reference].addStatics(settings.statics).addMethods(settings.methods);
- return 0;
- }
- };
-
-}(jQuery));
-
-/*
- * jQuery.fracs - Core API
- */
-
-(function ($) {
- "use strict";
- /*globals jQuery, HTMLElement */
- /*jslint browser: true, vars: true */
-
-
- var FracsData = function (htmlElementOrRect) {
-
- var target = htmlElementOrRect,
- callbacks = [],
- prevFracs;
-
- this.size = function () {
-
- return callbacks.length;
- };
-
- this.bind = function (callback) {
-
- if (callback instanceof Function && $.inArray(callback, callbacks) === -1) {
- callbacks.push(callback);
- }
- };
-
- this.unbind = function (callback) {
-
- if (callback instanceof Function) {
- var idx = $.inArray(callback, callbacks);
- if (idx >= 0) {
- callbacks.splice(idx, 1);
- }
- } else {
- callbacks = [];
- }
- };
-
- this.check = function () {
-
- var rect = target instanceof HTMLElement ? $.fracs.rect(target) : target,
- fracs = $.fracs.fracs(rect, $.fracs.viewport());
-
- if (!prevFracs || !prevFracs.equals(fracs)) {
- $.each(callbacks, function (idx, callback) {
- callback.call(target, fracs, prevFracs);
- });
- prevFracs = fracs;
- }
- };
- };
-
-
- var Rect = function (left, top, width, height) {
-
- var fracsData;
-
- this.left = Math.round(left);
- this.top = Math.round(top);
- this.width = Math.round(width);
- this.height = Math.round(height);
- this.right = this.left + this.width;
- this.bottom = this.top + this.height;
-
- this.equals = function (that) {
-
- return this.left === that.left && this.top === that.top && this.width === that.width && this.height === that.height;
- };
-
- this.area = function () {
-
- return this.width * this.height;
- };
-
- this.intersection = function (rect) {
-
- var left = Math.max(this.left, rect.left),
- right = Math.min(this.right, rect.right),
- top = Math.max(this.top, rect.top),
- bottom = Math.min(this.bottom, rect.bottom),
- width = right - left,
- height = bottom - top;
-
- return (width >= 0 && height >= 0) ? new Rect(left, top, width, height) : undefined;
- };
-
- this.envelope = function (rect) {
-
- var left = Math.min(this.left, rect.left),
- right = Math.max(this.right, rect.right),
- top = Math.min(this.top, rect.top),
- bottom = Math.max(this.bottom, rect.bottom),
- width = right - left,
- height = bottom - top;
-
- return new Rect(left, top, width, height);
- };
-
- this.bind = function (callback) {
-
- if (!fracsData) {
- fracsData = new FracsData(this);
- $(window).bind("scroll resize", fracsData.check);
- }
- fracsData.bind(callback);
- };
-
- this.unbind = function (callback) {
-
- if (fracsData) {
- fracsData.unbind(callback);
- if (fracsData.size() === 0) {
- $(window).unbind("scroll resize", fracsData.check);
- fracsData = undefined;
- }
- }
- };
-
- this.check = function () {
-
- if (fracsData) {
- fracsData.check();
- }
- };
-
- this.fracs = function () {
-
- $.fracs.fracs(this);
- };
- };
-
-
- var FracsResult = function (rectDocument, rectElement, rectViewport, visible, viewport, possible) {
-
- /*jslint confusion: true */
-
- if (!rectDocument || !rectElement || !rectViewport || !visible || !viewport || !possible) {
- this.rects = undefined;
- this.visible = 0;
- this.viewport = 0;
- this.possible = 0;
- } else {
- this.rects = {
- document: rectDocument,
- element: rectElement,
- viewport: rectViewport
- };
- this.visible = visible;
- this.viewport = viewport;
- this.possible = possible;
- }
-
- this.equals = function (that) {
-
- return this.fracsEqual(that) && this.rectsEqual(that);
- };
-
- this.fracsEqual = function (that) {
-
- return this.visible === that.visible && this.viewport === that.viewport && this.possible === that.possible;
- };
-
- this.rectsEqual = function (that) {
-
- if (!this.rects || !that.rects) {
- return this.rects === that.rects;
- }
- return this.rects.document.equals(that.rects.document)
- && this.rects.element.equals(that.rects.element)
- && this.rects.viewport.equals(that.rects.viewport);
- };
- };
-
-
- var ScrollState = function () {
-
- var document = $.fracs.document(),
- viewport = $.fracs.viewport(),
- width = document.width - viewport.width,
- height = document.height - viewport.height;
-
- this.width = width <= 0 ? undefined : viewport.left / width;
- this.height = height <= 0 ? undefined : viewport.top / height;
- this.left = viewport.left;
- this.top = viewport.top;
- this.right = document.right - viewport.right;
- this.bottom = document.bottom - viewport.bottom;
-
- this.equals = function (that) {
-
- return this.width === that.width && this.height === that.height
- && this.left === that.left && this.top === that.top
- && this.right === that.right && this.bottom === that.bottom;
- };
- };
-
-
- var ScrollStateTracker = function () {
-
- var prevState,
- callbacks = [],
- check = function () {
-
- var state = new ScrollState();
- if (!prevState || !prevState.equals(state)) {
- $.each(callbacks, function (idx, callback) {
- callback.call(window, state, prevState);
- });
- prevState = state;
- }
- };
-
- $(window).bind("resize scroll load", check);
-
- this.bind = function (callback) {
-
- callbacks.push(callback);
- };
- };
-
-
- // @beta
- var FracsElement = function (htmlElement, fracs) {
-
- this.element = htmlElement;
- this.fracs = fracs;
-
- this.update = function () {
-
- var fracs = $.fracs.fracs(this.element),
- changed = !this.fracs || !this.fracs.equals(fracs);
- this.fracs = fracs;
- return changed;
- };
- };
-
-
- // @beta
- var FracsGroup = function (htmlElements, property, callback) {
-
- var THIS = this,
- targets = [],
- prevBest = null;
-
- $.each(htmlElements, function (idx, element) {
- if (element instanceof HTMLElement) {
- targets.push(new FracsElement(element));
- }
- });
-
- this.check = function () {
-
- var best,
- viewport = $.fracs.viewport();
-
- $.each(targets, function (idx, target) {
- target.update();
- if (!best || target.fracs[property] > best.fracs[property]) {
- best = target;
- }
- });
-
-
- if (best && best.fracs[property] === 0) {
- best = null;
- }
-
- if (prevBest !== best) {
- callback.call(THIS, best, prevBest);
- prevBest = best;
- }
- };
- };
-
-
- var $document = $(document),
- $window = $(window),
- $htmlBody = $("html,body"),
- scrollStateTracker,
- dataNs = "fracs",
- statics = {
- document: function () {
-
- /*jslint confusion: true */
- return new Rect(0, 0, $document.width(), $document.height());
- },
- viewport: function () {
-
- /*jslint confusion: true */
- return new Rect($window.scrollLeft(), $window.scrollTop(), $window.width(), $window.height());
- },
- rect: function (htmlElement) {
-
- var $target = $(htmlElement),
- offset = $target.offset();
-
- if (!$target.is(":visible")) {
- return new Rect(0, 0, 0, 0);
- }
- return new Rect(offset.left, offset.top, $target.outerWidth(), $target.outerHeight());
- },
- fracs: function (rect, viewport) {
-
- var intersection, intersectionElementSpace, intersectionViewportSpace, intersectionArea, possibleArea;
-
- rect = rect instanceof HTMLElement ? statics.rect(rect) : rect;
- viewport = viewport || statics.viewport();
- intersection = rect.intersection(viewport);
-
- if (!intersection) {
- return new FracsResult();
- }
-
- intersectionElementSpace = new Rect(intersection.left - rect.left, intersection.top - rect.top, intersection.width, intersection.height);
- intersectionViewportSpace = new Rect(intersection.left - viewport.left, intersection.top - viewport.top, intersection.width, intersection.height);
- intersectionArea = intersection.area();
- possibleArea = Math.min(rect.width, viewport.width) * Math.min(rect.height, viewport.height);
-
- return new FracsResult(
- intersection,
- intersectionElementSpace,
- intersectionViewportSpace,
- intersectionArea / rect.area(),
- intersectionArea / viewport.area(),
- intersectionArea / possibleArea
- );
- },
- round: function (value, decs) {
-
- if (isNaN(decs) || decs <= 0) {
- return Math.round(value);
- }
- return Math.round(value * Math.pow(10, decs)) / Math.pow(10, decs);
- },
- scrollTo: function (left, top, duration) {
-
- duration = isNaN(duration) ? 1000 : duration;
- $htmlBody.stop(true).animate({ scrollLeft: left, scrollTop: top }, duration);
- },
- scroll: function (left, top, duration) {
-
- duration = isNaN(duration) ? 1000 : duration;
- $htmlBody.stop(true).animate({ scrollLeft: $window.scrollLeft() + left, scrollTop: $window.scrollTop() + top }, duration);
- },
- scrollState: function (callback) {
-
- if (callback instanceof Function) {
- scrollStateTracker = scrollStateTracker || new ScrollStateTracker();
- scrollStateTracker.bind(callback);
- } else {
- return new ScrollState();
- }
- }
- },
- methods = {
- bind: function (callback) {
-
- return this.each(function () {
-
- var $this = $(this),
- data = $this.data(dataNs);
-
- if (!data) {
- data = new FracsData(this);
- $this.data(dataNs, data);
- $window.bind("scroll resize", data.check);
- }
- data.bind(callback);
- });
- },
- unbind: function (callback) {
-
- return this.each(function () {
-
- var $this = $(this),
- data = $this.data(dataNs);
-
- if (data) {
- data.unbind(callback);
- if (data.size() === 0) {
- $this.removeData(dataNs);
- $window.unbind("scroll resize", data.check);
- }
- }
- });
- },
- check: function () {
-
- return this.each(function () {
-
- var data = $(this).data(dataNs);
-
- if (data) {
- data.check();
- }
- });
- },
- fracs: function () {
-
- return statics.fracs(statics.rect(this.get(0)), statics.viewport());
- },
- rect: function () {
-
- return statics.rect(this.get(0));
- },
- max: function (property, callback) {
-
- if (callback instanceof Function) {
-
- var data = new FracsGroup(this, property, callback);
-
- $window.bind("scroll resize", data.check);
- data.check();
- return this;
- } else {
- var obj, elements, maxValue;
-
- if ($.inArray(property, [ "possible", "visible", "viewport" ]) >= 0) {
- obj = "fracs";
- } else if ($.inArray(property, [ "width", "height", "left", "right", "top", "bottom" ]) >= 0) {
- obj = "rect";
- } else {
- return this;
- }
-
- this.each(function () {
-
- var fracs = statics[obj](this);
-
- if (!maxValue || fracs[property] > maxValue) {
- elements = [ this ];
- maxValue = fracs[property];
- } else if (fracs[property] === maxValue) {
- elements.push(this);
- }
- });
- return $(elements);
- }
- },
- min: function (property) {
-
- var obj, elements, minValue;
-
- if ($.inArray(property, [ "possible", "visible", "viewport" ]) >= 0) {
- obj = "fracs";
- } else if ($.inArray(property, [ "width", "height", "left", "right", "top", "bottom" ]) >= 0) {
- obj = "rect";
- } else {
- return this;
- }
-
- this.each(function () {
-
- var fracs = statics[obj](this);
-
- if (!minValue || fracs[property] < minValue) {
- elements = [ this ];
- minValue = fracs[property];
- } else if (fracs[property] === minValue) {
- elements.push(this);
- }
- });
- return $(elements);
- },
- envelope: function () {
-
- var envelope, rect;
-
- this.each(function () {
- rect = statics.rect(this);
- envelope = !envelope ? rect : envelope.envelope(rect);
- });
- return envelope;
- },
- scrollTo: function (paddingLeft, paddingTop, duration) {
-
- var rect;
-
- paddingLeft = paddingLeft || 0;
- paddingTop = paddingTop || 0;
- rect = statics.rect(this.get(0));
-
- statics.scrollTo(rect.left - paddingLeft, rect.top - paddingTop, duration);
- return this;
- },
- softLink: function (paddingLeft, paddingTop, duration) {
-
- return this.filter("a[href^=#]").each(function () {
- var $a = $(this),
- href = $a.attr("href");
- $a.click(function () {
- $(href).fracs("scrollTo", paddingLeft, paddingTop, duration);
- });
- });
- }
- },
- defaultStatic = function () {
-
- return "fracs";
- },
- defaultMethod = function () {
-
- if (arguments.length === 0) {
- return "fracs";
- } else if (arguments[0] instanceof Function) {
- return "bind";
- }
- };
-
-
- $.ModPlug.plugin("fracs", {
- statics: statics,
- methods: methods,
- defaultStatic: defaultStatic,
- defaultMethod: defaultMethod
- });
-
-}(jQuery));
-
-/*
- * jQuery.fracs - Outline API
- */
-
-(function ($) {
- "use strict";
-
- /*globals jQuery */
- /*jslint browser: true, vars: true */
-
-
- var Outline = function (canvas, options) {
-
- if (!(canvas instanceof HTMLElement && canvas.nodeName.toLowerCase() === "canvas")) {
- return undefined;
- }
-
-
- var defaults = {
- crop: false,
- duration: 0,
- focusWidth: 0.5,
- focusHeight: 0.5,
- autoFocus: true,
- styles: [ {
- selector: "header,footer,section,article",
- fillStyle: "rgb(230,230,230)"
- }, {
- selector: "h1",
- fillStyle: "rgb(240,140,060)"
- }, {
- selector: "h2",
- fillStyle: "rgb(200,100,100)"
- }, {
- selector: "h3",
- fillStyle: "rgb(100,200,100)"
- }, {
- selector: "h4",
- fillStyle: "rgb(100,100,200)"
- } ],
- viewportStyle: {
- fillStyle: "rgba(228,77,38,0.3)"
- },
- viewportDragStyle: {
- fillStyle: "rgba(228,77,38,0.6)"
- },
- invertViewport: false
- },
- settings = $.extend({}, defaults, options),
- $window = $(window),
- $htmlBody = $("html,body"),
- $canvas = $(canvas),
- width = $canvas.attr("width"),
- height = $canvas.attr("height"),
- context = canvas.getContext("2d"),
- docRect,
- vpRect,
- scale,
- drag = false,
- focusWidth,
- focusHeight,
- scroll = function (event) {
-
- var r, x, y;
-
- r = $canvas.fracs("rect");
- x = event.pageX - r.left;
- y = event.pageY - r.top;
- $.fracs.scrollTo(x / scale - vpRect.width * focusWidth, y / scale - vpRect.height * focusHeight, settings.duration);
- },
- drawRect = function (context, rect, strokeWidth, strokeStyle, fillStyle, invert) {
-
- if (strokeWidth !== undefined && scale) {
- strokeWidth = strokeWidth > 0.2 / scale ? strokeWidth : 0.2 / scale;
- }
-
- if (strokeStyle || fillStyle) {
- if (invert !== true) {
- context.beginPath();
- context.rect(rect.left, rect.top, rect.width, rect.height);
- if (fillStyle) {
- context.fillStyle = fillStyle;
- context.fill();
- }
- if (strokeStyle) {
- context.lineWidth = strokeWidth;
- context.strokeStyle = strokeStyle;
- context.stroke();
- }
- } else {
- if (fillStyle) {
- context.beginPath();
- context.rect(0, 0, docRect.width, rect.top);
- context.rect(0, rect.top, rect.left, rect.height);
- context.rect(rect.right, rect.top, docRect.right - rect.right, rect.height);
- context.rect(0, rect.bottom, docRect.width, docRect.bottom - rect.bottom);
- context.fillStyle = fillStyle;
- context.fill();
- }
- if (strokeStyle) {
- context.beginPath();
- context.rect(rect.left, rect.top, rect.width, rect.height);
- context.lineWidth = strokeWidth;
- context.strokeStyle = strokeStyle;
- context.stroke();
- }
- }
- }
- },
- drawElement = function (context, htmlElement, strokeWidth, strokeStyle, fillStyle) {
-
- var $element = $(htmlElement),
- rect = $element.fracs("rect");
-
- if ($element.css("visibility") === "hidden") {
- return;
- }
-
- strokeWidth = strokeWidth === "auto" ? $element.css("border-top-width") : strokeWidth;
- strokeStyle = strokeStyle === "auto" ? $element.css("border-top-color") : strokeStyle;
- fillStyle = fillStyle === "auto" ? $element.css("background-color") : fillStyle;
- drawRect(context, rect, strokeWidth, strokeStyle, fillStyle);
- },
- drawViewport = function () {
-
- var strokeWidth, strokeStyle, fillStyle;
-
- if (drag && settings.viewportDragStyle) {
- strokeWidth = settings.viewportDragStyle.storkeWidth;
- strokeStyle = settings.viewportDragStyle.strokeStyle;
- fillStyle = settings.viewportDragStyle.fillStyle;
- } else {
- strokeWidth = settings.viewportStyle.storkeWidth;
- strokeStyle = settings.viewportStyle.strokeStyle;
- fillStyle = settings.viewportStyle.fillStyle;
- }
- drawRect(context, vpRect, strokeWidth, strokeStyle, fillStyle, settings.invertViewport);
- },
- applyStyles = function (context) {
-
- $.each(settings.styles, function (idx, style) {
- $(style.selector).each(function () {
- drawElement(context, this, style.strokeWidth, style.strokeStyle, style.fillStyle);
- });
- });
- },
- draw = function () {
-
- /*jslint confusion: true */
-
- var scaleX, scaleY;
-
- docRect = $.fracs.document();
- vpRect = $.fracs.viewport();
- scaleX = width / docRect.width;
- scaleY = height / docRect.height;
- scale = scaleX < scaleY ? scaleX : scaleY;
-
- if (settings.crop) {
- $canvas.attr("width", docRect.width * scale).attr("height", docRect.height * scale);
- }
-
- context.clearRect(0, 0, $canvas.width(), $canvas.height());
-
- context.scale(scale, scale);
- applyStyles(context);
- drawViewport();
- context.scale(1 / scale, 1 / scale);
- },
- init = function () {
-
- $canvas
- .css("cursor", "pointer")
- .mousedown(function (event) {
-
- var r;
-
- event.preventDefault();
- drag = true;
- if (settings.autoFocus) {
- r = $canvas.fracs("rect");
- focusWidth = (((event.pageX - r.left) / scale) - vpRect.left) / vpRect.width;
- focusHeight = (((event.pageY - r.top) / scale) - vpRect.top) / vpRect.height;
- }
- if (!settings.autoFocus || focusWidth < 0 || focusWidth > 1 || focusHeight < 0 || focusHeight > 1) {
- focusWidth = settings.focusWidth;
- focusHeight = settings.focusHeight;
- }
- scroll(event);
- $canvas.css("cursor", "crosshair").addClass("dragOn");
- $htmlBody.css("cursor", "crosshair");
- $window
- .bind("mousemove", scroll)
- .one("mouseup", function (event) {
- event.preventDefault();
- $canvas.css("cursor", "pointer").removeClass("dragOn");
- $htmlBody.css("cursor", "auto");
- $window.unbind("mousemove", scroll);
- drag = false;
- draw();
- });
- });
- canvas.onselectstart = function () {
- return false;
- };
- $window.bind("load resize scroll", draw);
- draw();
- };
-
-
- init();
-
-
- this.draw = draw;
- };
-
-
- var dataNs = "outline",
- methods = {
- outline: function (options) {
-
- return this.each(function () {
-
- var outline;
-
- if (options === "redraw") {
- outline = $(this).data(dataNs);
- if (outline) {
- outline.draw();
- }
- } else {
- outline = new Outline(this, options);
- if (outline) {
- $(this).data(dataNs, outline);
- }
- }
- });
- }
- };
-
-
- $.ModPlug.module("fracs", {
- methods: methods
- });
-
-}(jQuery));
-
diff --git a/src/h5ai/js/inc/jquery.scrollpanel.js b/src/h5ai/js/inc/jquery.scrollpanel.js
deleted file mode 100644
index 3cfaf5f8..00000000
--- a/src/h5ai/js/inc/jquery.scrollpanel.js
+++ /dev/null
@@ -1,147 +0,0 @@
-(function ($) {
-
- var init = function (htmlElement) {
-
- var $element = $(htmlElement),
- $scrollbar, $drag, $wrapper, $content, mouseOffsetY, updateId,
- update, scroll;
-
- if (!$element.css("position") || $element.css("position") === "static") {
- $element.css("position", "relative");
- }
-
- $scrollbar = $("");
- $drag = $("").appendTo($scrollbar);
- $element
- .wrapInner("")
- .append($scrollbar);
- $wrapper = $element.find("> .wrapper");
- $content = $wrapper.find("> .content");
- mouseOffsetY = 0;
-
- update = function (repeat) {
-
- var visibleHeight, contentHeight, scrollTop, scrollTopFrac, visVertFrac;
-
- if (updateId && !repeat) {
- clearInterval(updateId);
- updateId = undefined;
- } else if (!updateId && repeat) {
- updateId = setInterval(function() { update(true); }, 50);
- }
-
- $wrapper.css("height", $element.height());
- visibleHeight = $element.height();
- contentHeight = $content.outerHeight();
- scrollTop = $wrapper.scrollTop();
- scrollTopFrac = scrollTop / contentHeight;
- visVertFrac = Math.min(visibleHeight / contentHeight, 1);
-
- if (visVertFrac < 1) {
- $scrollbar
- .fadeIn(50)
- .css({
- height: $element.innerHeight() + $scrollbar.height() - $scrollbar.outerHeight(true)
- });
- $drag
- .css({
- top: $scrollbar.height() * scrollTopFrac,
- height: $scrollbar.height() * visVertFrac
- });
- } else {
- $scrollbar.fadeOut(50);
- }
- };
-
- scroll = function (event) {
-
- var clickFrac = (event.pageY - $scrollbar.offset().top - mouseOffsetY) / $scrollbar.height();
-
- $wrapper.scrollTop($content.outerHeight() * clickFrac);
- update();
- event.preventDefault();
- };
-
- $element
- .mousewheel(function (event, delta) {
-
- $wrapper.scrollTop($wrapper.scrollTop() - 50 * delta);
- update();
- event.stopPropagation();
- event.preventDefault();
- })
- .scroll(update);
- $element.get(0).updateScrollbar = update;
- $wrapper
- .css({
- "padding-right": $scrollbar.outerWidth(true),
- height: $element.height(),
- overflow: "hidden"
- });
- $scrollbar
- .css({
- position: "absolute",
- top: 0,
- right: 0,
- overflow: "hidden",
- cursor: "pointer"
- })
- .mousedown(function (event) {
-
- mouseOffsetY = $drag.outerHeight() / 2;
- scroll(event);
- $scrollbar.addClass("dragOn");
- $(window)
- .bind("mousemove", scroll)
- .one("mouseup", function (event) {
-
- $scrollbar.removeClass("dragOn");
- $(window).unbind("mousemove", scroll);
- scroll(event);
- event.stopPropagation();
- });
- event.preventDefault();
- })
- .each(function () {
-
- this.onselectstart = function () {
-
- return false;
- };
- });
- $drag
- .css({
- position: "absolute",
- left: 0,
- width: "100%"
- })
- .mousedown(function (event) {
-
- mouseOffsetY = event.pageY - $drag.offset().top;
- scroll(event);
- $scrollbar.addClass("dragOn");
- $(window)
- .bind("mousemove", scroll)
- .one("mouseup", function (event) {
-
- $scrollbar.removeClass("dragOn");
- $(window).unbind("mousemove", scroll);
- scroll(event);
- event.stopPropagation();
- });
- event.stopPropagation();
- });
-
- update();
- };
-
-
- $.fn.scrollpanel = function () {
-
- return this.each(function () {
-
- init(this);
- });
- };
-
-})(jQuery);
diff --git a/src/h5ai/js/inc/jquery.utils.js b/src/h5ai/js/inc/jquery.utils.js
deleted file mode 100644
index db020780..00000000
--- a/src/h5ai/js/inc/jquery.utils.js
+++ /dev/null
@@ -1,29 +0,0 @@
-(function ($) {
- "use strict";
- /*global jQuery, window*/
-
- // 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,
- timer = {
- log: function (label) {
- var now = $.now();
- $.log("timer", label, "+" + (now - last), "=" + (now - start));
- last = now;
- }
- };
-
- return timer;
- }());
-
-})(jQuery);
\ No newline at end of file
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(;edate)?1:(this=start.getTime()&&t<=end.getTime();};Date.prototype.addMilliseconds=function(value){this.setMilliseconds(this.getMilliseconds()+value);return this;};Date.prototype.addSeconds=function(value){return this.addMilliseconds(value*1000);};Date.prototype.addMinutes=function(value){return this.addMilliseconds(value*60000);};Date.prototype.addHours=function(value){return this.addMilliseconds(value*3600000);};Date.prototype.addDays=function(value){return this.addMilliseconds(value*86400000);};Date.prototype.addWeeks=function(value){return this.addMilliseconds(value*604800000);};Date.prototype.addMonths=function(value){var n=this.getDate();this.setDate(1);this.setMonth(this.getMonth()+value);this.setDate(Math.min(n,this.getDaysInMonth()));return this;};Date.prototype.addYears=function(value){return this.addMonths(value*12);};Date.prototype.add=function(config){if(typeof config=="number"){this._orient=config;return this;}
+var x=config;if(x.millisecond||x.milliseconds){this.addMilliseconds(x.millisecond||x.milliseconds);}
+if(x.second||x.seconds){this.addSeconds(x.second||x.seconds);}
+if(x.minute||x.minutes){this.addMinutes(x.minute||x.minutes);}
+if(x.hour||x.hours){this.addHours(x.hour||x.hours);}
+if(x.month||x.months){this.addMonths(x.month||x.months);}
+if(x.year||x.years){this.addYears(x.year||x.years);}
+if(x.day||x.days){this.addDays(x.day||x.days);}
+return this;};Date._validate=function(value,min,max,name){if(typeof value!="number"){throw new TypeError(value+" is not a Number.");}else if(valuemax){throw new RangeError(value+" is not a valid value for "+name+".");}
+return true;};Date.validateMillisecond=function(n){return Date._validate(n,0,999,"milliseconds");};Date.validateSecond=function(n){return Date._validate(n,0,59,"seconds");};Date.validateMinute=function(n){return Date._validate(n,0,59,"minutes");};Date.validateHour=function(n){return Date._validate(n,0,23,"hours");};Date.validateDay=function(n,year,month){return Date._validate(n,1,Date.getDaysInMonth(year,month),"days");};Date.validateMonth=function(n){return Date._validate(n,0,11,"months");};Date.validateYear=function(n){return Date._validate(n,1,9999,"seconds");};Date.prototype.set=function(config){var x=config;if(!x.millisecond&&x.millisecond!==0){x.millisecond=-1;}
+if(!x.second&&x.second!==0){x.second=-1;}
+if(!x.minute&&x.minute!==0){x.minute=-1;}
+if(!x.hour&&x.hour!==0){x.hour=-1;}
+if(!x.day&&x.day!==0){x.day=-1;}
+if(!x.month&&x.month!==0){x.month=-1;}
+if(!x.year&&x.year!==0){x.year=-1;}
+if(x.millisecond!=-1&&Date.validateMillisecond(x.millisecond)){this.addMilliseconds(x.millisecond-this.getMilliseconds());}
+if(x.second!=-1&&Date.validateSecond(x.second)){this.addSeconds(x.second-this.getSeconds());}
+if(x.minute!=-1&&Date.validateMinute(x.minute)){this.addMinutes(x.minute-this.getMinutes());}
+if(x.hour!=-1&&Date.validateHour(x.hour)){this.addHours(x.hour-this.getHours());}
+if(x.month!==-1&&Date.validateMonth(x.month)){this.addMonths(x.month-this.getMonth());}
+if(x.year!=-1&&Date.validateYear(x.year)){this.addYears(x.year-this.getFullYear());}
+if(x.day!=-1&&Date.validateDay(x.day,this.getFullYear(),this.getMonth())){this.addDays(x.day-this.getDate());}
+if(x.timezone){this.setTimezone(x.timezone);}
+if(x.timezoneOffset){this.setTimezoneOffset(x.timezoneOffset);}
+return this;};Date.prototype.clearTime=function(){this.setHours(0);this.setMinutes(0);this.setSeconds(0);this.setMilliseconds(0);return this;};Date.prototype.isLeapYear=function(){var y=this.getFullYear();return(((y%4===0)&&(y%100!==0))||(y%400===0));};Date.prototype.isWeekday=function(){return!(this.is().sat()||this.is().sun());};Date.prototype.getDaysInMonth=function(){return Date.getDaysInMonth(this.getFullYear(),this.getMonth());};Date.prototype.moveToFirstDayOfMonth=function(){return this.set({day:1});};Date.prototype.moveToLastDayOfMonth=function(){return this.set({day:this.getDaysInMonth()});};Date.prototype.moveToDayOfWeek=function(day,orient){var diff=(day-this.getDay()+7*(orient||+1))%7;return this.addDays((diff===0)?diff+=7*(orient||+1):diff);};Date.prototype.moveToMonth=function(month,orient){var diff=(month-this.getMonth()+12*(orient||+1))%12;return this.addMonths((diff===0)?diff+=12*(orient||+1):diff);};Date.prototype.getDayOfYear=function(){return Math.floor((this-new Date(this.getFullYear(),0,1))/86400000);};Date.prototype.getWeekOfYear=function(firstDayOfWeek){var y=this.getFullYear(),m=this.getMonth(),d=this.getDate();var dow=firstDayOfWeek||Date.CultureInfo.firstDayOfWeek;var offset=7+1-new Date(y,0,1).getDay();if(offset==8){offset=1;}
+var daynum=((Date.UTC(y,m,d,0,0,0)-Date.UTC(y,0,1,0,0,0))/86400000)+1;var w=Math.floor((daynum-offset+7)/7);if(w===dow){y--;var prevOffset=7+1-new Date(y,0,1).getDay();if(prevOffset==2||prevOffset==8){w=53;}else{w=52;}}
+return w;};Date.prototype.isDST=function(){console.log('isDST');return this.toString().match(/(E|C|M|P)(S|D)T/)[2]=="D";};Date.prototype.getTimezone=function(){return Date.getTimezoneAbbreviation(this.getUTCOffset,this.isDST());};Date.prototype.setTimezoneOffset=function(s){var here=this.getTimezoneOffset(),there=Number(s)*-6/10;this.addMinutes(there-here);return this;};Date.prototype.setTimezone=function(s){return this.setTimezoneOffset(Date.getTimezoneOffset(s));};Date.prototype.getUTCOffset=function(){var n=this.getTimezoneOffset()*-10/6,r;if(n<0){r=(n-10000).toString();return r[0]+r.substr(2);}else{r=(n+10000).toString();return"+"+r.substr(1);}};Date.prototype.getDayName=function(abbrev){return abbrev?Date.CultureInfo.abbreviatedDayNames[this.getDay()]:Date.CultureInfo.dayNames[this.getDay()];};Date.prototype.getMonthName=function(abbrev){return abbrev?Date.CultureInfo.abbreviatedMonthNames[this.getMonth()]:Date.CultureInfo.monthNames[this.getMonth()];};Date.prototype._toString=Date.prototype.toString;Date.prototype.toString=function(format){var self=this;var p=function p(s){return(s.toString().length==1)?"0"+s:s;};return format?format.replace(/dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?/g,function(format){switch(format){case"hh":return p(self.getHours()<13?self.getHours():(self.getHours()-12));case"h":return self.getHours()<13?self.getHours():(self.getHours()-12);case"HH":return p(self.getHours());case"H":return self.getHours();case"mm":return p(self.getMinutes());case"m":return self.getMinutes();case"ss":return p(self.getSeconds());case"s":return self.getSeconds();case"yyyy":return self.getFullYear();case"yy":return self.getFullYear().toString().substring(2,4);case"dddd":return self.getDayName();case"ddd":return self.getDayName(true);case"dd":return p(self.getDate());case"d":return self.getDate().toString();case"MMMM":return self.getMonthName();case"MMM":return self.getMonthName(true);case"MM":return p((self.getMonth()+1));case"M":return self.getMonth()+1;case"t":return self.getHours()<12?Date.CultureInfo.amDesignator.substring(0,1):Date.CultureInfo.pmDesignator.substring(0,1);case"tt":return self.getHours()<12?Date.CultureInfo.amDesignator:Date.CultureInfo.pmDesignator;case"zzz":case"zz":case"z":return"";}}):this._toString();};
+Date.now=function(){return new Date();};Date.today=function(){return Date.now().clearTime();};Date.prototype._orient=+1;Date.prototype.next=function(){this._orient=+1;return this;};Date.prototype.last=Date.prototype.prev=Date.prototype.previous=function(){this._orient=-1;return this;};Date.prototype._is=false;Date.prototype.is=function(){this._is=true;return this;};Number.prototype._dateElement="day";Number.prototype.fromNow=function(){var c={};c[this._dateElement]=this;return Date.now().add(c);};Number.prototype.ago=function(){var c={};c[this._dateElement]=this*-1;return Date.now().add(c);};(function(){var $D=Date.prototype,$N=Number.prototype;var dx=("sunday monday tuesday wednesday thursday friday saturday").split(/\s/),mx=("january february march april may june july august september october november december").split(/\s/),px=("Millisecond Second Minute Hour Day Week Month Year").split(/\s/),de;var df=function(n){return function(){if(this._is){this._is=false;return this.getDay()==n;}
+return this.moveToDayOfWeek(n,this._orient);};};for(var i=0;i0&&!last){try{q=d.call(this,r[1]);}catch(ex){last=true;}}else{last=true;}
+if(!last&&q[1].length===0){last=true;}
+if(!last){var qx=[];for(var j=0;j0){rx[0]=rx[0].concat(p[0]);rx[1]=p[1];}}
+if(rx[1].length1){args=Array.prototype.slice.call(arguments);}else if(arguments[0]instanceof Array){args=arguments[0];}
+if(args){for(var i=0,px=args.shift();i2)?n:(n+(((n+2000)Date.getDaysInMonth(this.year,this.month)){throw new RangeError(this.day+" is not a valid value for days.");}
+var r=new Date(this.year,this.month,this.day,this.hour,this.minute,this.second);if(this.timezone){r.set({timezone:this.timezone});}else if(this.timezoneOffset){r.set({timezoneOffset:this.timezoneOffset});}
+return r;},finish:function(x){x=(x instanceof Array)?flattenAndCompact(x):[x];if(x.length===0){return null;}
+for(var i=0;i=0&&h>=0?b.Rect(c,e,g,h):undefined},envelope:function(a){var c=Math.min(this.left,a.left),d=Math.max(this.right,a.right),e=Math.min(this.top,a.top),f=Math.max(this.bottom,a.bottom),g=d-c,h=f-e;return b.Rect(c,e,g,h)},fracs:function(){return b.Fractions.ofRect(this)}},ofDocument:function(){return b.Rect(0,0,d.width(),d.height())},ofViewport:function(){return b.Rect(c.scrollLeft(),c.scrollTop(),c.width(),c.height())},ofElement:function(c){var d=a(c),e;return d.is(":visible")?(e=d.offset(),b.Rect(e.left,e.top,d.outerWidth(),d.outerHeight())):b.Rect(0,0,-1,0)}}),b.Fractions=function(a,c,d,e,f,g){if(this instanceof b.Fractions)!a||!c||!d||!e||!f||!g?(this.rects=undefined,this.visible=0,this.viewport=0,this.possible=0):(this.rects={document:a,element:c,viewport:d},this.visible=e,this.viewport=f,this.possible=g);else return new b.Fractions(a,c,d,e,f,g)},a.extend(b.Fractions,{prototype:{equals:function(a){return this.fracsEqual(a)&&this.rectsEqual(a)},fracsEqual:function(a){return this.visible===a.visible&&this.viewport===a.viewport&&this.possible===a.possible},rectsEqual:function(a){return!this.rects||!a.rects?this.rects===a.rects:this.rects.document.equals(a.rects.document)&&this.rects.element.equals(a.rects.element)&&this.rects.viewport.equals(a.rects.viewport)}},ofRect:function(a,c){var d,e,f,g,h;return c=c||b.Rect.ofViewport(),d=a.intersection(c),d?(e=b.Rect(d.left-a.left,d.top-a.top,d.width,d.height),f=b.Rect(d.left-c.left,d.top-c.top,d.width,d.height),g=d.area(),h=Math.min(a.width,c.width)*Math.min(a.height,c.height),b.Fractions(d,e,f,g/a.area(),g/c.area(),g/h)):b.Fractions()},ofElement:function(a,c){return b.Fractions.ofRect(b.Rect.ofElement(a),c)}}),b.Cursor=function(a,c){if(this instanceof b.Mouse)this.distX=a,this.distY=c,this.distMin=Math.min(a,c),this.distMax=Math.max(a,c);else return new b.Mouse(a,c)},a.extend(b.Cursor,{prototype:{equals:function(a){return this.distX===a.distX&&this.distY===a.distY},dist:function(){return Math.sqrt(this.distX*this.distX+this.distY*this.distY)}},ofRect:function(a,c,d){var e=ad.right?a-d.right:0,f=cd.bottom?c-d.bottom:0;return b.Cursor(e,f)},ofElement:function(a,c,d){return b.Cursor.ofRect(a,c,b.Rect.ofElement(d))}}),b.Callbacks=function(){if(this instanceof b.Callbacks)this.callbacks=[];else return new b.Callbacks},b.Callbacks.prototype={size:function(){return this.callbacks.length},bind:function(b){b instanceof Function&&a.inArray(b,this.callbacks)===-1&&this.callbacks.push(b)},unbind:function(b){var c;b instanceof Function?(c=a.inArray(b,this.callbacks),c>=0&&this.callbacks.splice(c,1)):this.callbacks=[]},trigger:function(b,c){a.each(this.callbacks,function(a,d){d.apply(b,c)})}},b.FracsCallbacks=function(c){if(this instanceof b.FracsCallbacks)this.callbacks=[],this.element=c,this.fracs=undefined,this.prevFracs=undefined,this.checkProxy=a.proxy(this.check,this),this.autoCheck();else return new b.FracsCallbacks(c)},b.FracsCallbacks.prototype=a.extend({},b.Callbacks.prototype,{trigger:function(){b.Callbacks.prototype.trigger.call(this,this.element,[this.fracs,this.prevFracs])},check:function(){var a=this.element instanceof b.Rect?this.element:b.Rect.ofElement(this.element),c=b.Fractions.ofRect(a);return!this.fracs||!this.fracs.equals(c)?(this.prevFracs=this.fracs,this.fracs=c,this.trigger(),!0):!1},autoCheck:function(a){var b="resize scroll load",d=a===!1?"unbind":"bind";c[d](b,this.checkProxy)}}),b.ScrollStateCallbacks=function(){if(this instanceof b.ScrollStateCallbacks)this.callbacks=[],this.state=undefined,this.prevState=undefined,this.checkProxy=a.proxy(this.check,this),this.autoCheck();else return new b.ScrollStateCallbacks},b.ScrollStateCallbacks.prototype=a.extend({},b.Callbacks.prototype,{trigger:function(){b.Callbacks.prototype.trigger.call(this,window,[this.state,this.prevState])},check:function(){var a=b.ScrollState();return!this.state||!this.state.equals(a)?(this.prevState=this.state,this.state=a,this.trigger(),!0):!1},autoCheck:function(a){var b="resize scroll load",d=a===!1?"unbind":"bind";c[d](b,this.checkProxy)}}),b.GroupCallbacks=function(c,d,e){if(this instanceof b.GroupCallbacks)this.callbacks=[],this.group=b.Group(c),this.type=d,this.property=e,this.best=undefined,this.prevBest=undefined,this.checkProxy=a.proxy(this.check,this),this.autoCheck();else return new b.GroupCallbacks(c,d,e)},b.GroupCallbacks.prototype=a.extend({},b.Callbacks.prototype,{trigger:function(){b.Callbacks.prototype.trigger.call(this,this.group,[this.best,this.prevBest])},check:function(){var a=this.group[this.type](this.property),b=a.elements.length===0||a.value===0?undefined:a.elements[0];return!this.best||this.best!==b?(this.prevBest=this.best,this.best=b,this.trigger(),!0):!1},autoCheck:function(a){var b="resize scroll load",d=a===!1?"unbind":"bind";c[d](b,this.checkProxy)}}),b.CursorCallbacks=function(c){if(this instanceof b.CursorCallbacks)this.callbacks=[],this.element=c,this.cursor=undefined,this.prevCursor=undefined,this.checkProxy=a.proxy(this.check,this),this.autoCheck();else return new b.CursorCallbacks(c)},b.CursorCallbacks.prototype=a.extend({},b.Callbacks.prototype,{trigger:function(){b.Callbacks.prototype.trigger.call(this,this.element,[this.cursor,this.prevCursor])},check:function(a){var c=b.Cursor.ofElement(a.pageX,a.pageY,this.element);return!this.cursor||!this.cursor.equals(c)?(this.prevCursor=this.cursor,this.cursor=c,this.trigger(),!0):!1},autoCheck:function(a){var b="cursormove",d=a===!1?"unbind":"bind";c[d](b,this.checkProxy)}}),b.ScrollState=function(a,c,d,e,f,g){if(!(this instanceof b.ScrollState))return new b.ScrollState(a,c,d,e,f,g);if(a===undefined||c===undefined||d===undefined||e===undefined||f===undefined||g===undefined){var h=b.Rect.ofDocument(),i=b.Rect.ofViewport(),j=h.width-i.width,k=h.height-i.height;this.width=j<=0?undefined:i.left/j,this.height=k<=0?undefined:i.top/k,this.left=i.left,this.top=i.top,this.right=h.right-i.right,this.bottom=h.bottom-i.bottom}else this.width=a,this.height=c,this.left=d,this.top=e,this.right=f,this.bottom=g},a.extend(b.ScrollState,{prototype:{equals:function(a){return this.width===a.width&&this.height===a.height&&this.left===a.left&&this.top===a.top&&this.right===a.right&&this.bottom===a.bottom}},scrollTo:function(a,b,c){a=a||0,b=b||0,c=isNaN(c)?1e3:c,e.stop(!0).animate({scrollLeft:a,scrollTop:b},c)},scroll:function(a,d,e){a=a||0,d=d||0,b.ScrollState.scrollTo(c.scrollLeft()+a,c.scrollTop()+d,e)},scrollToRect:function(a,c,d,e){c=c||0,d=d||0,b.ScrollState.scrollTo(a.left-c,a.top-d,e)},scrollToElement:function(a,c,d,e){var f=b.Rect.ofElement(a);b.ScrollState.scrollToRect(f,c,d,e)}}),b.Element=function(a){if(this instanceof b.Element)this.element=a,this.fracs=undefined,this.prevFracs=undefined,this.rect=undefined,this.prevRect=undefined,this.update();else return new b.Element(a)},b.Element.prototype={update:function(){var a=b.Fractions.ofElement(this.element),c=b.Rect.ofElement(this.element),d=!1;if(!this.fracs||!this.fracs.equals(a))this.prevFracs=this.fracs,this.fracs=a,d=!0;if(!this.rect||!this.rect.equals(c))this.prevRect=this.rect,this.rect=c,d=!0;return d}},function(a,b){var c=["possible","visible","viewport"],d=["width","height","left","right","top","bottom"],e=function(b){if(a.inArray(b,c)>=0)return"fracs";if(a.inArray(b,d)>=0)return"rect"},f=function(a,b){return a>b},g=function(a,b){return a");
+ $drag = $("").appendTo($scrollbar);
+ $element
+ .wrapInner("")
+ .append($scrollbar);
+ $wrapper = $element.find("> .wrapper");
+ $content = $wrapper.find("> .content");
+ mouseOffsetY = 0;
+
+ update = function (repeat) {
+
+ var visibleHeight, contentHeight, scrollTop, scrollTopFrac, visVertFrac;
+
+ if (updateId && !repeat) {
+ clearInterval(updateId);
+ updateId = undefined;
+ } else if (!updateId && repeat) {
+ updateId = setInterval(function() { update(true); }, 50);
+ }
+
+ $wrapper.css("height", $element.height());
+ visibleHeight = $element.height();
+ contentHeight = $content.outerHeight();
+ scrollTop = $wrapper.scrollTop();
+ scrollTopFrac = scrollTop / contentHeight;
+ visVertFrac = Math.min(visibleHeight / contentHeight, 1);
+
+ if (visVertFrac < 1) {
+ $scrollbar
+ .fadeIn(50)
+ .css({
+ height: $element.innerHeight() + $scrollbar.height() - $scrollbar.outerHeight(true)
+ });
+ $drag
+ .css({
+ top: $scrollbar.height() * scrollTopFrac,
+ height: $scrollbar.height() * visVertFrac
+ });
+ } else {
+ $scrollbar.fadeOut(50);
+ }
+ };
+
+ scroll = function (event) {
+
+ var clickFrac = (event.pageY - $scrollbar.offset().top - mouseOffsetY) / $scrollbar.height();
+
+ $wrapper.scrollTop($content.outerHeight() * clickFrac);
+ update();
+ event.preventDefault();
+ };
+
+ $element
+ .mousewheel(function (event, delta) {
+
+ $wrapper.scrollTop($wrapper.scrollTop() - 50 * delta);
+ update();
+ event.stopPropagation();
+ event.preventDefault();
+ })
+ .scroll(update);
+ $element.get(0).updateScrollbar = update;
+ $wrapper
+ .css({
+ "padding-right": $scrollbar.outerWidth(true),
+ height: $element.height(),
+ overflow: "hidden"
+ });
+ $scrollbar
+ .css({
+ position: "absolute",
+ top: 0,
+ right: 0,
+ overflow: "hidden",
+ cursor: "pointer"
+ })
+ .mousedown(function (event) {
+
+ mouseOffsetY = $drag.outerHeight() / 2;
+ scroll(event);
+ $scrollbar.addClass("dragOn");
+ $(window)
+ .bind("mousemove", scroll)
+ .one("mouseup", function (event) {
+
+ $scrollbar.removeClass("dragOn");
+ $(window).unbind("mousemove", scroll);
+ scroll(event);
+ event.stopPropagation();
+ });
+ event.preventDefault();
+ })
+ .each(function () {
+
+ this.onselectstart = function () {
+
+ return false;
+ };
+ });
+ $drag
+ .css({
+ position: "absolute",
+ left: 0,
+ width: "100%"
+ })
+ .mousedown(function (event) {
+
+ mouseOffsetY = event.pageY - $drag.offset().top;
+ scroll(event);
+ $scrollbar.addClass("dragOn");
+ $(window)
+ .bind("mousemove", scroll)
+ .one("mouseup", function (event) {
+
+ $scrollbar.removeClass("dragOn");
+ $(window).unbind("mousemove", scroll);
+ scroll(event);
+ event.stopPropagation();
+ });
+ event.stopPropagation();
+ });
+
+ update();
+ };
+
+
+ $.fn.scrollpanel = function () {
+
+ return this.each(function () {
+
+ init(this);
+ });
+ };
+
+}(jQuery));
diff --git a/src/h5ai/js/inc/path.js b/src/h5ai/js/inc/path.js
deleted file mode 100644
index 71626a32..00000000
--- a/src/h5ai/js/inc/path.js
+++ /dev/null
@@ -1,404 +0,0 @@
-
-var Path = function (pathCache, folder, tableRow) {
- "use strict";
- /*global $, h5ai, tree*/
-
- var path,
- checkedDecodeUri = function (uri) {
-
- try { return decodeURI(uri); } catch (err) {}
- return uri;
- },
- isEmpty = function () {
-
- return path.content === undefined || $.isEmptyObject(path.content);
- },
- onClick = function (context) {
-
- h5ai.triggerPathClick(path, context);
- },
- updateHtml = function () {
-
- path.updateCrumbHtml();
- path.updateExtendedHtml();
- path.updateTreeHtml();
- },
- updateCrumbHtml = function () {
-
- var $html, $a;
-
- if (path.html.$crumb && path.html.$crumb.data("status") === path.status) {
- return path.html.$crumb;
- }
-
- $html = $("")
- .data("path", path)
- .addClass(path.isFolder ? "folder" : "file");
-
- if (path.status) {
- $html.data("status", path.status);
- }
-
- $a = $("
" + path.label + "")
- .appendTo($html)
- .attr("href", path.absHref)
- .click(function() { onClick("crumb"); });
-
- if (path.isDomain) {
- $html.addClass("domain");
- $a.find("img").attr("src", "/h5ai/images/home.png");
- }
-
- if (path.isCurrentFolder) {
- $html.addClass("current");
- }
-
- if (!isNaN(path.status)) {
- if (path.status === 200) {
- $("
").appendTo($a);
- } else {
- $("(" + path.status + ")").appendTo($a);
- }
- }
-
- if (path.html.$crumb) {
- path.html.$cpathreplaceWith($html);
- }
- path.html.$crumb = $html;
-
- return $html;
- },
- updateExtendedHtml = function () {
-
- var $html, $a, $label;
-
- if (path.html.$extended && path.html.$extended.data("status") === path.status) {
- return path.html.$extended;
- }
-
- $html = $("")
- .data("path", path)
- .addClass(path.isFolder ? "folder" : "file");
-
- if (path.status) {
- $html.data("status", path.status);
- }
-
- $label = $("" + path.label + "");
- $a = $("")
- .attr("href", path.absHref)
- .click(function() { onClick("extended"); })
- .appendTo($html)
- .append($("
"))
- .append($("
"))
- .append($label)
- .append($("" + path.date + ""))
- .append($("" + path.size + ""));
-
- $a.hover(
- function () {
- if ($("#extended").hasClass("icons-view")) {
- var $this = $(this);
- $(".status.default").hide();
- $(".status.dynamic")
- .empty()
- .append($this.find(".label").clone())
- .append($("·"))
- .append($this.find(".date").clone())
- .show();
-
- if (!$this.closest(".entry").hasClass("folder")) {
- $(".status.dynamic")
- .append($("·"))
- .append($this.find(".size").clone());
- }
- }
- },
- function () {
- $(".status.default").show();
- $(".status.dynamic").empty().hide();
- }
- );
-
- if (path.isParentFolder) {
- if (!h5ai.settings.setParentFolderLabels) {
- $label.addClass("l10n-parentDirectory");
- }
- $html.addClass("parentfolder");
- }
-
- if (!isNaN(path.status)) {
- if (path.status === 200) {
- $html.addClass("page");
- $a.find(".icon.small img").attr("src", "/h5ai/icons/16x16/folder-page.png");
- $a.find(".icon.big img").attr("src", "/h5ai/icons/48x48/folder-page.png");
- } else {
- $html.addClass("error");
- $label.append($(" " + path.status + " "));
- }
- }
-
- if (path.html.$extended) {
- path.html.$extended.replaceWith($html);
- }
- path.html.$extended = $html;
-
- return $html;
- },
- updateTreeHtml = function () {
-
- var $html, $blank, $a, $indicator, $ul, idx;
-
- $html = $("")
- .data("path", path)
- .addClass(path.isFolder ? "folder" : "file");
-
- $blank = $("").appendTo($html);
-
- $a = $("")
- .attr("href", path.absHref)
- .click(function() { path.onClick("tree"); })
- .appendTo($html)
- .append($("
"))
- .append($("" + path.label + ""));
-
- if (path.isFolder) {
- // indicator
- if (path.status === undefined || !path.isEmpty()) {
- $indicator = $("
");
- if (path.status === undefined) {
- $indicator.addClass("unknown");
- } else if (path.treeOpen) {
- $indicator.addClass("open");
- }
- $indicator.click(function(event) {
-
- if ($indicator.hasClass("unknown")) {
- tree.fetchStatusAndContent(path.absHref, false, function (status, content) {
-
- path.status = status;
- path.content = content;
- path.treeOpen = true;
- $("#tree").get(0).updateScrollbar(true);
- path.updateTreeHtml(function() {
-
- $("#tree").get(0).updateScrollbar();
- });
- });
- } else if ($indicator.hasClass("open")) {
- path.treeOpen = false;
- $indicator.removeClass("open");
- $("#tree").get(0).updateScrollbar(true);
- $html.find("> ul.content").slideUp(function() {
-
- $("#tree").get(0).updateScrollbar();
- });
- } else {
- path.treeOpen = true;
- $indicator.addClass("open");
- $("#tree").get(0).updateScrollbar(true);
- $html.find("> ul.content").slideDown(function() {
-
- $("#tree").get(0).updateScrollbar();
- });
- }
- });
- $html.addClass("initiatedIndicator");
- $blank.replaceWith($indicator);
- }
-
- // is path the domain?
- if (path.isDomain) {
- $html.addClass("domain");
- $a.find(".icon img").attr("src", "/h5ai/icons/16x16/folder-home.png");
- }
-
- // is path the current folder?
- if (path.isCurrentFolder) {
- $html.addClass("current");
- $a.find(".icon img").attr("src", "/h5ai/icons/16x16/folder-open.png");
- }
-
- // does it have subfolders?
- if (!path.isEmpty()) {
- $ul = $("").appendTo($html);
- for (idx in path.content) {
- $("").append(path.content[idx].updateTreeHtml()).appendTo($ul);
- }
- if (path.status === undefined || !path.treeOpen) {
- $ul.hide();
- }
- }
-
- // reflect folder status
- if (!isNaN(path.status)) {
- if (path.status === 200) {
- $a.find(".icon img").attr("src", "/h5ai/icons/16x16/folder-page.png");
- $a.append($("
"));
- } else {
- $html.addClass("error");
- $a.append($("" + path.status + ""));
- }
- }
- }
-
- if (path.html.$tree) {
- path.html.$tree.replaceWith($html);
- }
- path.html.$tree = $html;
-
- return $html;
- },
- init = function () {
-
- var $tds, $img, $a, splits;
-
- path = {
- // parentFolder: undefined,
- // label: undefined,
- // date: undefined,
- // size: undefined,
- // href: undefined,
- // absHref: undefined,
- // alt: undefined,
- // icon16: undefined,
- // icon48: undefined,
- // isFolder: undefined,
- // isParentFolder: undefined,
- // isCurrentFolder: undefined,
- // isDomain: undefined,
-
- status: undefined, // undefined, "h5ai" or HTTP response code
- content: undefined, // associative array path.absHref -> path
- html: {
- $crumb: undefined,
- $extended: undefined,
- $tree: undefined
- },
- treeOpen: false,
-
- isEmpty: isEmpty,
- onClick: onClick,
- updateHtml: updateHtml,
- updateCrumbHtml: updateCrumbHtml,
- updateExtendedHtml: updateExtendedHtml,
- updateTreeHtml: updateTreeHtml
- };
-
- if (!pathCache.pathEndsWithSlash(folder)) {
- folder += "/";
- }
-
- if (tableRow) {
- $tds = $(tableRow).find("td");
- $img = $tds.eq(0).find("img");
- $a = $tds.eq(1).find("a");
-
- path.parentFolder = folder;
- path.label = $a.text();
- path.date = $tds.eq(2).text();
- path.size = $tds.eq(3).text();
- path.href = $a.attr("href");
- path.alt = $img.attr("alt");
- path.icon16 = $img.attr("src");
- } else {
- splits = pathCache.splitPathname(folder);
-
- path.parentFolder = splits[0];
- path.label = checkedDecodeUri(splits[1]);
- if (path.label === "/") {
- path.label = checkedDecodeUri(document.domain) + "/";
- }
- path.date = "";
- path.size = "";
- path.href = splits[1];
- path.alt = "[DIR]";
- path.icon16 = "/h5ai/icons/16x16/folder.png";
- }
-
- if (pathCache.pathEndsWithSlash(path.label)) {
- path.label = path.label.slice(0, -1);
- }
-
- path.icon48 = path.icon16.replace("16x16", "48x48");
- path.isFolder = (path.alt === "[DIR]");
- path.isParentFolder = (path.isFolder && path.label === "Parent Directory");
- path.absHref = path.isParentFolder ? path.href : path.parentFolder + path.href;
- path.isCurrentFolder = (path.absHref === document.location.pathname);
- path.isDomain = (path.absHref === "/");
-
- if (path.isParentFolder && h5ai.settings.setParentFolderLabels) {
- if (path.isDomain) {
- path.label = checkedDecodeUri(document.domain);
- } else {
- path.label = checkedDecodeUri(pathCache.splitPathname(pathCache.splitPathname(path.parentFolder)[0])[1].slice(0, -1));
- }
- }
- };
-
- init();
-
- return path;
-};
-
-
-var PathCache = function () {
- "use strict";
- /*global $*/
-
- var pathCache,
- cache = {},
- rePathnameSplit = /^(\/(.*\/)*)([^\/]+\/?)$/,
- rePathEndsWithSlash = /\/$/,
- splitPathname = function (pathname) {
-
- var match;
-
- if (pathname === "/") {
- return ["", "/"];
- }
- match = rePathnameSplit.exec(pathname);
- return [match[1], match[3]];
- },
- pathEndsWithSlash = function (pathname) {
-
- return rePathEndsWithSlash.test(pathname);
- },
- getAbsHref = function (folder, tableRow) {
-
- var $a, isParentFolder, href;
-
- if (!pathEndsWithSlash(folder)) {
- folder += "/";
- }
- if (!tableRow) {
- return folder;
- }
- $a = $(tableRow).find("td").eq(1).find("a");
- isParentFolder = ($a.text() === "Parent Directory");
- href = $a.attr("href");
- return isParentFolder ? undefined : folder + href;
- },
- getPath = function (folder, tableRow) {
-
- var absHref = getAbsHref(folder, tableRow),
- path = cache[absHref];
-
- if (!path) {
- path = new Path(pathCache, folder, tableRow);
- if (!path.isParentFolder) {
- cache[path.absHref] = path;
- }
- }
-
- return path;
- };
-
- pathCache = {
- splitPathname: splitPathname,
- pathEndsWithSlash: pathEndsWithSlash,
- getPath: getPath
- };
-
- return pathCache;
-};
diff --git a/src/h5ai/js/lib/modernizr.min.js b/src/h5ai/js/lib/modernizr.min.js
deleted file mode 100644
index 0c17cfdd..00000000
--- a/src/h5ai/js/lib/modernizr.min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Modernizr 2.0.4 (Custom Build) | MIT & BSD
- * Contains: fontface | backgroundsize | borderimage | borderradius | boxshadow | flexbox | hsla | multiplebgs | opacity | rgba | textshadow | cssanimations | csscolumns | generatedcontent | cssgradients | cssreflections | csstransforms | csstransforms3d | csstransitions | applicationcache | canvas | canvastext | draganddrop | hashchange | history | audio | video | indexeddb | input | inputtypes | localstorage | postmessage | sessionstorage | websockets | websqldatabase | webworkers | geolocation | inlinesvg | smil | svg | svgclippaths | touch | webgl | iepp | respond | mq | cssclasses | addtest | prefixed | teststyles | testprop | testallprops | hasevent | prefixes | domprefixes | load
- */
-;window.Modernizr=function(a,b,c){function I(){e.input=function(a){for(var b=0,c=a.length;b",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(++bgetOptions();
+
+
+if ($action === "httpcodes") {
+
+ list($hrefs) = checkKeys(array("hrefs"));
+
+ function getHttpCodes($h5ai, $hrefs) {
+
+ $codes = array();
+ foreach ($hrefs as $href) {
+ $href = trim($href);
+ if (strlen($href) > 0) {
+ $codes[$href] = $h5ai->getHttpCode($href);
+ }
+ }
+ return $codes;
+ }
+
+ $hrefs = preg_split("/;/", $hrefs);
+ $codes = getHttpCodes($h5ai, $hrefs);
+
+ echo count($codes) === 0 ? "{}" : json_encode($codes);
+}
+
+
+else if ($action === "thumb") {
+
+ fail(0, "thumbs are disabled", !$options["showThumbs"]);
+ list($srcAbsHref, $width, $height, $mode) = checkKeys(array("href", "width", "height", "mode"));
+
+ require_once "inc/Thumbnail.php";
+ require_once "inc/Image.php";
+
+ $srcAbsPath = $h5ai->getDocRoot() . rawurldecode($srcAbsHref);
+
+ if (!Thumbnail::isUsable()) {
+ Image::showImage($srcAbsPath);
+ exit;
+ }
+
+ $thumbnail = new Thumbnail($h5ai, $srcAbsHref, $mode, $width, $height);
+ $thumbnail->create(1);
+ if (file_exists($thumbnail->getPath())) {
+ Image::showImage($thumbnail->getPath());
+ } else {
+ $image = new Image();
+ $image->setSource($srcAbsPath);
+ $image->thumb($mode, $width, $height);
+ $image->showDest();
+ }
+}
+
+
+else if ($action === "tree") {
+
+ list($href) = checkKeys(array("href"));
+
+ require_once "inc/Tree.php";
+
+ $absHref = trim($href);
+ $absPath = $h5ai->getAbsPath($absHref);
+
+ $tree = new TreeEntry($h5ai, $absPath, $absHref);
+ $tree->loadContent();
+
+ echo $tree->contentToHtml();
+}
+
+
+else if ($action === "zip") {
+
+ fail(0, "zipped download is disabled", !$options["zippedDownload"]);
+ list($hrefs) = checkKeys(array("hrefs"));
+
+ require_once "inc/ZipIt.php";
+
+ $zipit = new ZipIt($h5ai);
+
+ $hrefs = explode(":", trim($hrefs));
+ $zipFile = $zipit->zip($hrefs);
+
+ if ($zipFile === false) {
+ fail(2, "something went wrong while building the zip");
+ }
+
+ header("Content-Disposition: attachment; filename=\"h5ai-selection.zip\"");
+ header("Content-Type: application/force-download");
+ header("Content-Length: " . filesize($zipFile));
+ header("Connection: close");
+ readfile($zipFile);
+}
+
+
+else {
+ fail(1, "unsupported 'action' specified");
+}
+
+
+?>
\ No newline at end of file
diff --git a/src/h5ai/php/config.php b/src/h5ai/php/config.php
new file mode 100644
index 00000000..dba64056
--- /dev/null
+++ b/src/h5ai/php/config.php
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/src/h5ai/php/httpcode.php b/src/h5ai/php/httpcode.php
deleted file mode 100644
index 73383f53..00000000
--- a/src/h5ai/php/httpcode.php
+++ /dev/null
@@ -1,23 +0,0 @@
- 0) {
- $codes[$href] = $h5ai->getHttpCode($href);
- }
- }
- return $codes;
-}
-
-$h5ai = new H5ai();
-$hrefs = preg_split("/;/", array_key_exists("hrefs", $_REQUEST) ? $_REQUEST[ "hrefs" ] : "");
-$codes = getHttpCodes($h5ai, $hrefs);
-
-echo count($codes) === 0 ? "{}" : json_encode($codes);
-
-?>
\ No newline at end of file
diff --git a/src/h5ai/php/cache.php b/src/h5ai/php/inc/Cache.php
similarity index 100%
rename from src/h5ai/php/cache.php
rename to src/h5ai/php/inc/Cache.php
diff --git a/src/h5ai/php/crumb.php b/src/h5ai/php/inc/Crumb.php
similarity index 88%
rename from src/h5ai/php/crumb.php
rename to src/h5ai/php/inc/Crumb.php
index e96a8f49..fd1fd78c 100644
--- a/src/h5ai/php/crumb.php
+++ b/src/h5ai/php/inc/Crumb.php
@@ -25,7 +25,7 @@ class Crumb {
foreach($this->parts as $href) {
$idx++;
$classes = "crumb folder" . ($idx === 1 ? " domain" : "") . ($idx === count($this->parts) ? " current" : "");
- $image = "/h5ai/images/" . ($idx === 1 ? "home.png" : "crumb.png");
+ $image = $this->h5ai->image($idx === 1 ? "home" : "crumb");
$label = $this->h5ai->getLabel($href);
$hint = "";
@@ -33,7 +33,7 @@ class Crumb {
$classes .= " checkedHttpCode";
if ($code !== "h5ai") {
if ($code === 200) {
- $hint = "
";
+ $hint = "
";
} else {
$hint = "(" . $code . ")";
}
diff --git a/src/h5ai/php/customize.php b/src/h5ai/php/inc/Customize.php
similarity index 65%
rename from src/h5ai/php/customize.php
rename to src/h5ai/php/inc/Customize.php
index 58341b56..f64e6b49 100644
--- a/src/h5ai/php/customize.php
+++ b/src/h5ai/php/inc/Customize.php
@@ -10,12 +10,12 @@ class Customize {
public function getHeader() {
- return $this->getContent($this->h5ai->getAbsPath() . "/" . "h5ai.header.html", "header");
+ return $this->getContent($this->h5ai->getAbsPath() . "/h5ai.header.html", "header");
}
public function getFooter() {
- return $this->getContent($this->h5ai->getAbsPath() . "/" . "h5ai.footer.html", "footer");
+ return $this->getContent($this->h5ai->getAbsPath() . "/h5ai.footer.html", "footer");
}
private function getContent($file, $tag) {
diff --git a/src/h5ai/php/extended.php b/src/h5ai/php/inc/Extended.php
similarity index 90%
rename from src/h5ai/php/extended.php
rename to src/h5ai/php/inc/Extended.php
index daba91eb..67b00b8d 100644
--- a/src/h5ai/php/extended.php
+++ b/src/h5ai/php/inc/Extended.php
@@ -1,6 +1,6 @@
type;
$img = $this->type;
- $smallImg = "/h5ai/icons/16x16/" . $this->type . ".png";
- $bigImg = "/h5ai/icons/48x48/" . $this->type . ".png";
+ $smallImg = $this->h5ai->icon($this->type);
+ $bigImg = $this->h5ai->icon($this->type, true);
$hint = "";
- $dateLabel = date($dateFormat, $this->date);
if ($this->isFolder && $this->type !== "folder-parent") {
$code = $this->h5ai->getHttpCode($this->absHref);
@@ -70,8 +69,8 @@ class Entry {
if ($code !== "h5ai") {
if ($code === 200) {
$img = "folder-page";
- $smallImg = "/h5ai/icons/16x16/folder-page.png";
- $bigImg = "/h5ai/icons/48x48/folder-page.png";
+ $smallImg = $this->h5ai->icon("folder-page");
+ $bigImg = $this->h5ai->icon("folder-page", true);
} else {
$classes .= " error";
$hint = " " . $code . " ";
@@ -80,10 +79,10 @@ class Entry {
}
if ($this->h5ai->showThumbs() && in_array($this->type, $this->thumbTypes)) {
$classes .= " thumb";
- $thumbnail = new Thumbnail($this->absPath, "square", 16, 16);
+ $thumbnail = new Thumbnail($this->h5ai, $this->absHref, "square", 16, 16);
$thumbnail->create();
$smallImg = file_exists($thumbnail->getPath()) ? $thumbnail->getHref() : $thumbnail->getLiveHref();
- $thumbnail = new Thumbnail($this->absPath, "rational", 96, 46);
+ $thumbnail = new Thumbnail($this->h5ai,$this->absHref, "rational", 96, 46);
$thumbnail->create();
$bigImg = file_exists($thumbnail->getPath()) ? $thumbnail->getHref() : $thumbnail->getLiveHref();
}
@@ -93,7 +92,7 @@ class Entry {
$html .= "\t\t\t
\n";
$html .= "\t\t\t
\n";
$html .= "\t\t\t" . $this->label . $hint . "\n";
- $html .= "\t\t\t" . $dateLabel . "\n";
+ $html .= "\t\t\t\n";
$html .= "\t\t\t" . $this->formatSize($this->size) . "\n";
$html .= "\t\t\n";
$html .= "\t\n";
@@ -198,8 +197,8 @@ class Extended {
public function generateHeaders() {
- $asc = "
";
- $desc = "
";
+ $asc = "
";
+ $desc = "
";
$so = $this->h5ai->getSortOrder();
$order = $so["ascending"] ? $asc : $desc;
diff --git a/src/h5ai/php/h5ai.php b/src/h5ai/php/inc/H5ai.php
similarity index 86%
rename from src/h5ai/php/h5ai.php
rename to src/h5ai/php/inc/H5ai.php
index b50ebfbb..4e332956 100644
--- a/src/h5ai/php/h5ai.php
+++ b/src/h5ai/php/inc/H5ai.php
@@ -1,34 +1,37 @@
"name", "ascending" => true);
private static $VIEWMODES = array("details", "icons");
- private $docRoot, $domain, $options, $types, $cache, $absHref, $absPath, $ignore, $ignoreRE, $sortOrder, $dateFormat, $view;
+ private $docRoot, $h5aiRoot, $h5aiAbsHref, $domain, $options, $types, $cache, $absHref, $absPath, $ignore, $ignoreRE, $sortOrder, $dateFormat, $view;
public function __construct() {
- $this->docRoot = getenv("DOCUMENT_ROOT");
- $this->domain = getenv("HTTP_HOST");
+ global $H5AI_CONFIG;
- $this->options = $this->loadOptions($this->docRoot . "/h5ai/options.js");
- $this->types = $this->loadTypes($this->docRoot . "/h5ai/types.txt");
- $this->cache = new Cache($this->docRoot . "/h5ai/cache");
+ $this->docRoot = $H5AI_CONFIG["DOCUMENT_ROOT"];
+ $this->h5aiRoot = $H5AI_CONFIG["H5AI_ROOT"];
+ $this->ignore = $H5AI_CONFIG["IGNORE"];
+ $this->ignoreRE = $H5AI_CONFIG["IGNORE_PATTERNS"];
+
+ $this->options = $this->loadOptions($this->h5aiRoot . "/options.js");
+ $this->types = $this->loadTypes($this->h5aiRoot . "/types.txt");
+ $this->cache = new Cache($this->h5aiRoot . "/cache");
+
+ $this->h5aiAbsHref = $this->options["options"]["h5aiAbsHref"];
+ $this->domain = getenv("HTTP_HOST");
$this->absHref = $this->normalizePath(preg_replace('/\\?.*/', '', getenv("REQUEST_URI")), true);
$this->absPath = $this->normalizePath($this->docRoot . rawurldecode($this->absHref), false);
- $this->ignore = $this->options["options"]["ignore"];
- $this->ignoreRE = $this->options["options"]["ignoreRE"];
-
$defaultSortOrder = $this->options["options"]["sortorder"];
$this->sortOrder = array(
"column" => array_key_exists("col", $_REQUEST) ? $_REQUEST["col"] : $defaultSortOrder["column"],
"ascending" => array_key_exists("asc", $_REQUEST) ? $_REQUEST["asc"] !== "false" : $defaultSortOrder["ascending"]
);
- $this->dateFormat = $this->options["options"]["dateFormat"];
$this->view = array_key_exists("view", $_REQUEST) ? $_REQUEST["view"] : $this->options["options"]["viewmodes"][0];
if (!in_array($this->view, H5ai::$VIEWMODES)) {
$this->view = H5ai::$VIEWMODES[0];
@@ -71,6 +74,16 @@ class H5ai {
return $this->docRoot;
}
+ public function getH5aiRoot() {
+
+ return $this->h5aiRoot;
+ }
+
+ public function getH5aiAbsHref() {
+
+ return $this->h5aiAbsHref;
+ }
+
public function getDomain() {
return $this->domain;
@@ -81,6 +94,21 @@ class H5ai {
return $this->view;
}
+ public function api() {
+
+ return $this->h5aiAbsHref . "/php/api.php";
+ }
+
+ public function image($id) {
+
+ return $this->h5aiAbsHref . "/images/" . $id . ".png";
+ }
+
+ public function icon($id, $big = false) {
+
+ return $this->h5aiAbsHref . "/icons/" . ($big ? "48x48" : "16x16") . "/" . $id . ".png";
+ }
+
public function getOptions() {
return $this->options["options"];
diff --git a/src/h5ai/php/image.php b/src/h5ai/php/inc/Image.php
similarity index 99%
rename from src/h5ai/php/image.php
rename to src/h5ai/php/inc/Image.php
index 09634639..4572fc49 100644
--- a/src/h5ai/php/image.php
+++ b/src/h5ai/php/inc/Image.php
@@ -17,6 +17,14 @@ class Image {
}
+ public static function showImage($filename) {
+
+ $image = file_get_contents($filename);
+ header("content-type: image");
+ echo $image;
+ }
+
+
public function __construct($filename = null) {
$this->sourceFile = null;
@@ -43,8 +51,9 @@ class Image {
$this->releaseSource();
$this->releaseDest();
- if (is_null($filename))
+ if (is_null($filename)) {
return;
+ }
$this->sourceFile = $filename;
@@ -94,14 +103,6 @@ class Image {
}
- public static function showImage($filename) {
-
- $image = file_get_contents($filename);
- header("content-type: image");
- echo $image;
- }
-
-
private function magic($destX, $destY, $srcX, $srcY, $destWidth, $destHeight, $srcWidth, $srcHeight, $canWidth = null, $canHeight = null, $color = null) {
if (!is_null($canWidth) && !is_null($canHeight)) {
diff --git a/src/h5ai/php/inc/Thumbnail.php b/src/h5ai/php/inc/Thumbnail.php
new file mode 100644
index 00000000..153c41b1
--- /dev/null
+++ b/src/h5ai/php/inc/Thumbnail.php
@@ -0,0 +1,59 @@
+h5ai = $h5ai;
+ $this->srcAbsHref = $absHref;
+ $this->srcAbsPath = $this->h5ai->getDocRoot() . urldecode($absHref);
+ $this->width = $width;
+ $this->height = $height;
+ $this->mode = $mode;
+ $this->name = sha1("$this->srcAbsPath-$this->width-$this->height-$this->mode");
+ $this->href = $this->h5ai->getH5aiAbsHref() . "/cache/thumb-" . $this->name . ".jpg";
+ $this->path = $this->h5ai->getDocRoot() . $this->href;
+ $this->liveHref = $this->h5ai->api() . "?action=thumb&href=" . $this->srcAbsHref . "&width=" . $this->width . "&height=" . $this->height . "&mode=" . $this->mode;
+ }
+
+ public function create($force = 0) {
+
+ if (
+ $force === 2
+ || ($force === 1 && !file_exists($this->path))
+ || (file_exists($this->path) && filemtime($this->srcAbsPath) >= filemtime($this->path))
+ ) {
+ $image = new Image();
+ $image->setSource($this->srcAbsPath);
+ $image->thumb($this->mode, $this->width, $this->height);
+ $image->saveDest($this->path);
+ }
+ }
+
+ public function getHref() {
+
+ return $this->href;
+ }
+
+ public function getPath() {
+
+ return $this->path;
+ }
+
+ public function getLiveHref() {
+
+ return $this->liveHref;
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/src/h5ai/php/tree.php b/src/h5ai/php/inc/Tree.php
similarity index 90%
rename from src/h5ai/php/tree.php
rename to src/h5ai/php/inc/Tree.php
index 270e3a9e..659e53e2 100644
--- a/src/h5ai/php/tree.php
+++ b/src/h5ai/php/inc/Tree.php
@@ -57,9 +57,9 @@ class TreeEntry {
public function toHtml() {
$classes = "entry " . $this->type . ($this->absHref === $this->h5ai->getAbsHref() ? " current" : "");
- $img = $this->type;
+ $icon = $this->type;
if ($this->absHref === "/") {
- $img = "folder-home";
+ $icon = "folder-home";
}
$hint = "";
$code = "h5ai";
@@ -69,8 +69,8 @@ class TreeEntry {
$classes .= " checkedHttpCode";
if ($code !== "h5ai") {
if ($code === 200) {
- $img = "folder-page";
- $hint = "
";
+ $icon = "folder-page";
+ $hint = "
";
} else {
$classes .= " error";
$hint = " " . $code . " ";
@@ -83,10 +83,10 @@ class TreeEntry {
$html .= "\n";
} else {
$indicatorState = $this->content === null ? " unknown" : " open";
- $html .= "
\n";
+ $html .= "
\n";
}
$html .= "\n";
- $html .= "
\n";
+ $html .= "
\n";
$html .= "" . $this->label . "" . $hint . "\n";
$html .= "\n";
$html .= $this->contentToHtml();
diff --git a/src/h5ai/php/zipit.php b/src/h5ai/php/inc/ZipIt.php
similarity index 99%
rename from src/h5ai/php/zipit.php
rename to src/h5ai/php/inc/ZipIt.php
index 54cfec38..c4be9ec9 100644
--- a/src/h5ai/php/zipit.php
+++ b/src/h5ai/php/inc/ZipIt.php
@@ -43,7 +43,7 @@ class ZipIt {
}
private function zipDir($zip, $localDir, $dir) {
-
+
if ($this->h5ai->getHttpCode($this->h5ai->getAbsHref($localDir)) === "h5ai") {
$zip->addEmptyDir($dir);
$files = $this->h5ai->readDir($localDir);
diff --git a/src/h5ai/php/main.php b/src/h5ai/php/main.php
index d8a5fdba..a11e837a 100644
--- a/src/h5ai/php/main.php
+++ b/src/h5ai/php/main.php
@@ -1,10 +1,11 @@
create(1);
- if (file_exists($thumbnail->getPath())) {
- Image::showImage($thumbnail->getPath());
- } else {
- $image = new Image();
- $image->setSource($src);
- $image->thumb($mode, $width, $height);
- $image->showDest();
- }
-
-?>
\ No newline at end of file
diff --git a/src/h5ai/php/thumbnail.php b/src/h5ai/php/thumbnail.php
deleted file mode 100644
index b7fbcf96..00000000
--- a/src/h5ai/php/thumbnail.php
+++ /dev/null
@@ -1,56 +0,0 @@
-src = $src;
- $this->width = $width;
- $this->height = $height;
- $this->mode = $mode;
- $this->name = sha1("$this->src-$this->width-$this->height-$this->mode");
- $this->href = "/h5ai/cache/thumb-" . $this->name . ".jpg";
- $this->path = getenv("DOCUMENT_ROOT") . $this->href;
- $this->liveHref = "/h5ai/php/thumb.php?src=" . $this->src . "&width=" . $this->width . "&height=" . $this->height . "&mode=" . $this->mode;
- }
-
- public function create($force = 0) {
-
- if (
- $force === 2
- || ($force === 1 && !file_exists($this->path))
- || (file_exists($this->path) && filemtime($this->src) >= filemtime($this->path))
- ) {
- $image = new Image();
- $image->setSource($this->src);
- $image->thumb($this->mode, $this->width, $this->height);
- $image->saveDest($this->path);
- }
- }
-
- public function getHref() {
-
- return $this->href;
- }
-
- public function getPath() {
-
- return $this->path;
- }
-
- public function getLiveHref() {
-
- return $this->liveHref;
- }
-}
-
-?>
\ No newline at end of file
diff --git a/src/h5ai/php/treecontent.php b/src/h5ai/php/treecontent.php
deleted file mode 100644
index 5a23340a..00000000
--- a/src/h5ai/php/treecontent.php
+++ /dev/null
@@ -1,20 +0,0 @@
-getAbsPath($absHref);
-
-$tree = new TreeEntry($h5ai, $absPath, $absHref);
-$tree->loadContent();
-
-echo $tree->contentToHtml();
-
-?>
\ No newline at end of file
diff --git a/src/h5ai/php/zipcontent.php b/src/h5ai/php/zipcontent.php
deleted file mode 100644
index 76ad5ba4..00000000
--- a/src/h5ai/php/zipcontent.php
+++ /dev/null
@@ -1,28 +0,0 @@
-zip($hrefs);
-
-if ($zipFile !== false) {
- header("Content-Disposition: attachment; filename=\"h5ai-selection.zip\"");
- header("Content-Type: application/force-download");
- header("Content-Length: " . filesize($zipFile));
- header("Connection: close");
- readfile($zipFile);
-} else {
- echo "sorry, something went wrong while building the zip.";
-}
-
-?>
\ No newline at end of file
diff --git a/src/js.htaccess b/src/js.htaccess
index a7a37233..d18f8cff 100644
--- a/src/js.htaccess
+++ b/src/js.htaccess
@@ -1,5 +1,5 @@
################################
-# %BUILD_NAME% %BUILD_VERSION% (js)
+# h5ai %BUILD_VERSION% (js)
# customized .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%
diff --git a/src/php.htaccess b/src/php.htaccess
index 604db3ac..24cd5943 100644
--- a/src/php.htaccess
+++ b/src/php.htaccess
@@ -1,5 +1,5 @@
################################
-# %BUILD_NAME% %BUILD_VERSION% (php)
+# h5ai %BUILD_VERSION% (php)
# customized .htaccess
################################
diff --git a/tools/wepp.ant.xml b/tools/wepp.ant.xml
index 7bbb8d93..2339652e 100644
--- a/tools/wepp.ant.xml
+++ b/tools/wepp.ant.xml
@@ -6,7 +6,7 @@
-
+
@@ -20,7 +20,7 @@
-
+
diff --git a/src/h5ai/header.html b/src/h5ai/header.html
index 21278444..11cd52a7 100644
--- a/src/h5ai/header.html
+++ b/src/h5ai/header.html
@@ -1,16 +1,20 @@
-
+
+
+
+