mirror of
https://github.com/lrsjng/h5ai.git
synced 2025-04-05 13:14:23 +02:00
Merge branch 'develop'
This commit is contained in:
commit
74d967a27a
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,10 +1,8 @@
|
||||
|
||||
# Build folders to ignore
|
||||
bin
|
||||
build
|
||||
target
|
||||
|
||||
build.local.*
|
||||
release
|
||||
|
||||
|
||||
# Eclipse
|
||||
|
26
README.md
26
README.md
@ -2,13 +2,37 @@
|
||||
|
||||
* Website with download, docs and demo: <http://larsjung.de/h5ai>
|
||||
* Sources: <http://github.com/lrsjng/h5ai>
|
||||
* Q&A group: <http://groups.google.com/group/h5ai>
|
||||
|
||||
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*
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
@ -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);
|
||||
}
|
||||
|
@ -27,7 +27,7 @@
|
||||
</span>
|
||||
</span>
|
||||
</footer>
|
||||
<script src="/h5ai/js/lib/jquery.min.js"></script>
|
||||
<script src="/h5ai/js/libs.js"></script>
|
||||
<script src="/h5ai/options.js"></script>
|
||||
<script src="/h5ai/js/main-js.js"></script>
|
||||
</body>
|
||||
|
@ -1,16 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="no-js">
|
||||
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title>Directory index · styled with h5ai</title>
|
||||
<meta name="h5ai-version" content="h5ai %BUILD_VERSION% (js)">
|
||||
<meta name="description" content="Directory index styled with h5ai (http://larsjung.de/h5ai)">
|
||||
<meta name="keywords" content="directory, index, autoindex, h5ai">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="shortcut icon" type="image/png" href="/h5ai/images/h5ai-16x16.png">
|
||||
<link rel="apple-touch-icon" type="image/png" href="/h5ai/images/h5ai-48x48.png">
|
||||
<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Ubuntu:regular,italic,bold">
|
||||
<link rel="stylesheet" type="text/css" href="/h5ai/css/main-js.css">
|
||||
<script src="/h5ai/js/lib/modernizr.min.js"></script>
|
||||
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Ubuntu:regular,italic,bold">
|
||||
<link rel="stylesheet" href="/h5ai/css/main-js.css">
|
||||
<script src="/h5ai/js/modernizr.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="selection-rect"></div>
|
||||
|
@ -1,17 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="no-js">
|
||||
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<?php include "php/main.php"; ?>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<title><?php echo $h5ai->getTitle(); ?></title>
|
||||
<meta name="h5ai-version" content="h5ai %BUILD_VERSION% (php)">
|
||||
<meta name="description" content="Directory index styled with h5ai (http://larsjung.de/h5ai)">
|
||||
<meta name="keywords" content="directory, index, autoindex, h5ai">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="shortcut icon" type="image/png" href="/h5ai/images/h5ai-16x16.png">
|
||||
<link rel="apple-touch-icon" type="image/png" href="/h5ai/images/h5ai-48x48.png">
|
||||
<link rel="stylesheet" type="text/css" href="http://fonts.googleapis.com/css?family=Ubuntu:regular,italic,bold">
|
||||
<link rel="stylesheet" type="text/css" href="/h5ai/css/main-php.css">
|
||||
<script src="/h5ai/js/lib/modernizr.min.js"></script>
|
||||
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Ubuntu:regular,italic,bold">
|
||||
<link rel="stylesheet" href="/h5ai/css/main-php.css">
|
||||
<script src="/h5ai/js/modernizr.min.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="selection-rect"></div>
|
||||
@ -56,7 +60,7 @@
|
||||
</span>
|
||||
</span>
|
||||
</footer>
|
||||
<script src="/h5ai/js/lib/jquery.min.js"></script>
|
||||
<script src="/h5ai/js/libs.js"></script>
|
||||
<script src="/h5ai/options.js"></script>
|
||||
<script src="/h5ai/js/main-php.js"></script>
|
||||
<section id="table">
|
||||
|
@ -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
|
||||
};
|
||||
};
|
@ -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 = $("<ul/>");
|
||||
$li = $("<li class='header' />")
|
||||
.appendTo($ul)
|
||||
.append($("<a class='icon'></a>"))
|
||||
.append($("<a class='label' href='" + $label.attr("href") + "'><span class='l10n-name'>" + $label.text() + "</span></a>"))
|
||||
.append($("<a class='date' href='" + $date.attr("href") + "'><span class='l10n-lastModified'>" + $date.text() + "</span></a>"))
|
||||
.append($("<a class='size' href='" + $size.attr("href") + "'><span class='l10n-size'>" + $size.text() + "</span></a>"));
|
||||
.appendTo($ul)
|
||||
.append($("<a class='icon'></a>"))
|
||||
.append($("<a class='label' href='" + $label.attr("href") + "'><span class='l10n-name'>" + $label.text() + "</span></a>"))
|
||||
.append($("<a class='date' href='" + $date.attr("href") + "'><span class='l10n-lastModified'>" + $date.text() + "</span></a>"))
|
||||
.append($("<a class='size' href='" + $size.attr("href") + "'><span class='l10n-size'>" + $size.text() + "</span></a>"));
|
||||
|
||||
// header sort icons
|
||||
if (order.ascending) {
|
||||
$icon = $("<img src='/h5ai/images/ascending.png' class='sort' alt='ascending' />");
|
||||
$icon = $("<img src='" + H5aiJs.h5ai.image("ascending") + "' class='sort' alt='ascending' />");
|
||||
} else {
|
||||
$icon = $("<img src='/h5ai/images/descending.png' class='sort' alt='descending' />");
|
||||
$icon = $("<img src='" + H5aiJs.h5ai.image("descending") + "' class='sort' alt='descending' />");
|
||||
}
|
||||
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();
|
||||
};
|
||||
};
|
@ -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 = $("<ul />");
|
||||
for (idx in sortedLangsKeys) {
|
||||
(function (lang) {
|
||||
$("<li class='langOption' />")
|
||||
.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) {
|
||||
$("<li class='langOption' />")
|
||||
.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($("<span class='blank' />"));
|
||||
} 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($("<span class='blank' />"));
|
||||
} 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
|
||||
};
|
||||
};
|
260
src/h5ai/js/inc/Html.js
Normal file
260
src/h5ai/js/inc/Html.js
Normal file
@ -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 = $("<li class='crumb' />")
|
||||
.data("path", path)
|
||||
.addClass(path.isFolder ? "folder" : "file");
|
||||
|
||||
if (path.status) {
|
||||
$html.data("status", path.status);
|
||||
}
|
||||
|
||||
$a = $("<a><img src='" + H5aiJs.h5ai.image("crumb") + "' alt='>' />" + path.label + "</a>")
|
||||
.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) {
|
||||
$("<img class='hint' src='" + H5aiJs.h5ai.image("page") + "' alt='not listable' />").appendTo($a);
|
||||
} else {
|
||||
$("<span class='hint'>(" + path.status + ")</span>").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 = $("<li class='entry' />")
|
||||
.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 = $("<span class='label'>" + path.label + "</span>");
|
||||
$a = $("<a />")
|
||||
.attr("href", path.absHref)
|
||||
.click(function() { onClick(path, "extended"); })
|
||||
.appendTo($html)
|
||||
.append($("<span class='icon small'><img src='" + icon16 + "' alt='" + path.alt + "' /></span>"))
|
||||
.append($("<span class='icon big'><img src='" + icon48 + "' alt='" + path.alt + "' /></span>"))
|
||||
.append($label)
|
||||
.append($("<span class='date' data-time='" + path.time + "'></span>"))
|
||||
.append($("<span class='size'>" + path.size + "</span>"));
|
||||
|
||||
$a.hover(
|
||||
function () {
|
||||
if ($("#extended").hasClass("icons-view")) {
|
||||
var $this = $(this);
|
||||
$(".status.default").hide();
|
||||
$(".status.dynamic")
|
||||
.empty()
|
||||
.append($this.find(".label").clone())
|
||||
.append($("<span class='sep'>·</span>"))
|
||||
.append($this.find(".date").clone())
|
||||
.show();
|
||||
|
||||
if (!$this.closest(".entry").hasClass("folder")) {
|
||||
$(".status.dynamic")
|
||||
.append($("<span class='sep'>·</span>"))
|
||||
.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($("<span class='hint'> " + path.status + " </span>"));
|
||||
}
|
||||
}
|
||||
|
||||
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 = $("<div class='entry' />")
|
||||
.data("path", path)
|
||||
.addClass(path.isFolder ? "folder" : "file");
|
||||
|
||||
$blank = $("<span class='blank' />").appendTo($html);
|
||||
|
||||
$a = $("<a />")
|
||||
.attr("href", path.absHref)
|
||||
.click(function() { path.onClick(path, "tree"); })
|
||||
.appendTo($html)
|
||||
.append($("<span class='icon'><img src='" + path.icon16 + "' /></span>"))
|
||||
.append($("<span class='label'>" + path.label + "</span>"));
|
||||
|
||||
if (path.isFolder) {
|
||||
// indicator
|
||||
if (path.status === undefined || !path.isEmpty()) {
|
||||
$indicator = $("<span class='indicator initiated'><img src='" + H5aiJs.h5ai.image("tree") + "' /></span>")
|
||||
.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 = $("<ul class='content' />").appendTo($html);
|
||||
$.each(path.content, function (idx, entry) {
|
||||
$("<li />").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($("<span class='hint'><img src='" + H5aiJs.h5ai.image("page") + "' /></span>"));
|
||||
} else {
|
||||
$html.addClass("error");
|
||||
$a.append($("<span class='hint'>" + path.status + "</span>"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
};
|
||||
};
|
102
src/h5ai/js/inc/Path.js
Normal file
102
src/h5ai/js/inc/Path.js
Normal file
@ -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);
|
||||
}
|
||||
};
|
56
src/h5ai/js/inc/PathCache.js
Normal file
56
src/h5ai/js/inc/PathCache.js
Normal file
@ -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;
|
||||
};
|
@ -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));
|
||||
|
@ -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 = $("<div class='scrollbar' />");
|
||||
$drag = $("<div class='drag' />").appendTo($scrollbar);
|
||||
$element
|
||||
.wrapInner("<div class='wrapper'><div class='content' /></div>")
|
||||
.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);
|
@ -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);
|
10
src/h5ai/js/inc/lib/amplify.min.js
vendored
Normal file
10
src/h5ai/js/inc/lib/amplify.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
104
src/h5ai/js/inc/lib/date.js
Normal file
104
src/h5ai/js/inc/lib/date.js
Normal file
@ -0,0 +1,104 @@
|
||||
/**
|
||||
* Version: 1.0 Alpha-1
|
||||
* Build Date: 13-Nov-2007
|
||||
* Copyright (c) 2006-2007, Coolite Inc. (http://www.coolite.com/). All rights reserved.
|
||||
* License: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/.
|
||||
* Website: http://www.datejs.com/ or http://www.coolite.com/datejs/
|
||||
*/
|
||||
Date.CultureInfo={name:"en-US",englishName:"English (United States)",nativeName:"English (United States)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"M/d/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\+|after|from)/i,subtract:/^(\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\.?m?\.?|p\.?m?\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\s*(\+|\-)\s*\d\d\d\d?)|gmt)/i,ordinalSuffix:/^\s*(st|nd|rd|th)/i,timeContext:/^\s*(\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}};
|
||||
Date.getMonthNumberFromName=function(name){var n=Date.CultureInfo.monthNames,m=Date.CultureInfo.abbreviatedMonthNames,s=name.toLowerCase();for(var i=0;i<n.length;i++){if(n[i].toLowerCase()==s||m[i].toLowerCase()==s){return i;}}
|
||||
return-1;};Date.getDayNumberFromName=function(name){var n=Date.CultureInfo.dayNames,m=Date.CultureInfo.abbreviatedDayNames,o=Date.CultureInfo.shortestDayNames,s=name.toLowerCase();for(var i=0;i<n.length;i++){if(n[i].toLowerCase()==s||m[i].toLowerCase()==s){return i;}}
|
||||
return-1;};Date.isLeapYear=function(year){return(((year%4===0)&&(year%100!==0))||(year%400===0));};Date.getDaysInMonth=function(year,month){return[31,(Date.isLeapYear(year)?29:28),31,30,31,30,31,31,30,31,30,31][month];};Date.getTimezoneOffset=function(s,dst){return(dst||false)?Date.CultureInfo.abbreviatedTimeZoneDST[s.toUpperCase()]:Date.CultureInfo.abbreviatedTimeZoneStandard[s.toUpperCase()];};Date.getTimezoneAbbreviation=function(offset,dst){var n=(dst||false)?Date.CultureInfo.abbreviatedTimeZoneDST:Date.CultureInfo.abbreviatedTimeZoneStandard,p;for(p in n){if(n[p]===offset){return p;}}
|
||||
return null;};Date.prototype.clone=function(){return new Date(this.getTime());};Date.prototype.compareTo=function(date){if(isNaN(this)){throw new Error(this);}
|
||||
if(date instanceof Date&&!isNaN(date)){return(this>date)?1:(this<date)?-1:0;}else{throw new TypeError(date);}};Date.prototype.equals=function(date){return(this.compareTo(date)===0);};Date.prototype.between=function(start,end){var t=this.getTime();return t>=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(value<min||value>max){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;i<dx.length;i++){$D[dx[i]]=$D[dx[i].substring(0,3)]=df(i);}
|
||||
var mf=function(n){return function(){if(this._is){this._is=false;return this.getMonth()===n;}
|
||||
return this.moveToMonth(n,this._orient);};};for(var j=0;j<mx.length;j++){$D[mx[j]]=$D[mx[j].substring(0,3)]=mf(j);}
|
||||
var ef=function(j){return function(){if(j.substring(j.length-1)!="s"){j+="s";}
|
||||
return this["add"+j](this._orient);};};var nf=function(n){return function(){this._dateElement=n;return this;};};for(var k=0;k<px.length;k++){de=px[k].toLowerCase();$D[de]=$D[de+"s"]=ef(px[k]);$N[de]=$N[de+"s"]=nf(de);}}());Date.prototype.toJSONString=function(){return this.toString("yyyy-MM-ddThh:mm:ssZ");};Date.prototype.toShortDateString=function(){return this.toString(Date.CultureInfo.formatPatterns.shortDatePattern);};Date.prototype.toLongDateString=function(){return this.toString(Date.CultureInfo.formatPatterns.longDatePattern);};Date.prototype.toShortTimeString=function(){return this.toString(Date.CultureInfo.formatPatterns.shortTimePattern);};Date.prototype.toLongTimeString=function(){return this.toString(Date.CultureInfo.formatPatterns.longTimePattern);};Date.prototype.getOrdinal=function(){switch(this.getDate()){case 1:case 21:case 31:return"st";case 2:case 22:return"nd";case 3:case 23:return"rd";default:return"th";}};
|
||||
(function(){Date.Parsing={Exception:function(s){this.message="Parse error at '"+s.substring(0,10)+" ...'";}};var $P=Date.Parsing;var _=$P.Operators={rtoken:function(r){return function(s){var mx=s.match(r);if(mx){return([mx[0],s.substring(mx[0].length)]);}else{throw new $P.Exception(s);}};},token:function(s){return function(s){return _.rtoken(new RegExp("^\s*"+s+"\s*"))(s);};},stoken:function(s){return _.rtoken(new RegExp("^"+s));},until:function(p){return function(s){var qx=[],rx=null;while(s.length){try{rx=p.call(this,s);}catch(e){qx.push(rx[0]);s=rx[1];continue;}
|
||||
break;}
|
||||
return[qx,s];};},many:function(p){return function(s){var rx=[],r=null;while(s.length){try{r=p.call(this,s);}catch(e){return[rx,s];}
|
||||
rx.push(r[0]);s=r[1];}
|
||||
return[rx,s];};},optional:function(p){return function(s){var r=null;try{r=p.call(this,s);}catch(e){return[null,s];}
|
||||
return[r[0],r[1]];};},not:function(p){return function(s){try{p.call(this,s);}catch(e){return[null,s];}
|
||||
throw new $P.Exception(s);};},ignore:function(p){return p?function(s){var r=null;r=p.call(this,s);return[null,r[1]];}:null;},product:function(){var px=arguments[0],qx=Array.prototype.slice.call(arguments,1),rx=[];for(var i=0;i<px.length;i++){rx.push(_.each(px[i],qx));}
|
||||
return rx;},cache:function(rule){var cache={},r=null;return function(s){try{r=cache[s]=(cache[s]||rule.call(this,s));}catch(e){r=cache[s]=e;}
|
||||
if(r instanceof $P.Exception){throw r;}else{return r;}};},any:function(){var px=arguments;return function(s){var r=null;for(var i=0;i<px.length;i++){if(px[i]==null){continue;}
|
||||
try{r=(px[i].call(this,s));}catch(e){r=null;}
|
||||
if(r){return r;}}
|
||||
throw new $P.Exception(s);};},each:function(){var px=arguments;return function(s){var rx=[],r=null;for(var i=0;i<px.length;i++){if(px[i]==null){continue;}
|
||||
try{r=(px[i].call(this,s));}catch(e){throw new $P.Exception(s);}
|
||||
rx.push(r[0]);s=r[1];}
|
||||
return[rx,s];};},all:function(){var px=arguments,_=_;return _.each(_.optional(px));},sequence:function(px,d,c){d=d||_.rtoken(/^\s*/);c=c||null;if(px.length==1){return px[0];}
|
||||
return function(s){var r=null,q=null;var rx=[];for(var i=0;i<px.length;i++){try{r=px[i].call(this,s);}catch(e){break;}
|
||||
rx.push(r[0]);try{q=d.call(this,r[1]);}catch(ex){q=null;break;}
|
||||
s=q[1];}
|
||||
if(!r){throw new $P.Exception(s);}
|
||||
if(q){throw new $P.Exception(q[1]);}
|
||||
if(c){try{r=c.call(this,r[1]);}catch(ey){throw new $P.Exception(r[1]);}}
|
||||
return[rx,(r?r[1]:s)];};},between:function(d1,p,d2){d2=d2||d1;var _fn=_.each(_.ignore(d1),p,_.ignore(d2));return function(s){var rx=_fn.call(this,s);return[[rx[0][0],r[0][2]],rx[1]];};},list:function(p,d,c){d=d||_.rtoken(/^\s*/);c=c||null;return(p instanceof Array?_.each(_.product(p.slice(0,-1),_.ignore(d)),p.slice(-1),_.ignore(c)):_.each(_.many(_.each(p,_.ignore(d))),px,_.ignore(c)));},set:function(px,d,c){d=d||_.rtoken(/^\s*/);c=c||null;return function(s){var r=null,p=null,q=null,rx=null,best=[[],s],last=false;for(var i=0;i<px.length;i++){q=null;p=null;r=null;last=(px.length==1);try{r=px[i].call(this,s);}catch(e){continue;}
|
||||
rx=[[r[0]],r[1]];if(r[1].length>0&&!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;j<px.length;j++){if(i!=j){qx.push(px[j]);}}
|
||||
p=_.set(qx,d).call(this,q[1]);if(p[0].length>0){rx[0]=rx[0].concat(p[0]);rx[1]=p[1];}}
|
||||
if(rx[1].length<best[1].length){best=rx;}
|
||||
if(best[1].length===0){break;}}
|
||||
if(best[0].length===0){return best;}
|
||||
if(c){try{q=c.call(this,best[1]);}catch(ey){throw new $P.Exception(best[1]);}
|
||||
best[1]=q[1];}
|
||||
return best;};},forward:function(gr,fname){return function(s){return gr[fname].call(this,s);};},replace:function(rule,repl){return function(s){var r=rule.call(this,s);return[repl,r[1]];};},process:function(rule,fn){return function(s){var r=rule.call(this,s);return[fn.call(this,r[0]),r[1]];};},min:function(min,rule){return function(s){var rx=rule.call(this,s);if(rx[0].length<min){throw new $P.Exception(s);}
|
||||
return rx;};}};var _generator=function(op){return function(){var args=null,rx=[];if(arguments.length>1){args=Array.prototype.slice.call(arguments);}else if(arguments[0]instanceof Array){args=arguments[0];}
|
||||
if(args){for(var i=0,px=args.shift();i<px.length;i++){args.unshift(px[i]);rx.push(op.apply(null,args));args.shift();return rx;}}else{return op.apply(null,arguments);}};};var gx="optional not ignore cache".split(/\s/);for(var i=0;i<gx.length;i++){_[gx[i]]=_generator(_[gx[i]]);}
|
||||
var _vector=function(op){return function(){if(arguments[0]instanceof Array){return op.apply(null,arguments[0]);}else{return op.apply(null,arguments);}};};var vx="each any all".split(/\s/);for(var j=0;j<vx.length;j++){_[vx[j]]=_vector(_[vx[j]]);}}());(function(){var flattenAndCompact=function(ax){var rx=[];for(var i=0;i<ax.length;i++){if(ax[i]instanceof Array){rx=rx.concat(flattenAndCompact(ax[i]));}else{if(ax[i]){rx.push(ax[i]);}}}
|
||||
return rx;};Date.Grammar={};Date.Translator={hour:function(s){return function(){this.hour=Number(s);};},minute:function(s){return function(){this.minute=Number(s);};},second:function(s){return function(){this.second=Number(s);};},meridian:function(s){return function(){this.meridian=s.slice(0,1).toLowerCase();};},timezone:function(s){return function(){var n=s.replace(/[^\d\+\-]/g,"");if(n.length){this.timezoneOffset=Number(n);}else{this.timezone=s.toLowerCase();}};},day:function(x){var s=x[0];return function(){this.day=Number(s.match(/\d+/)[0]);};},month:function(s){return function(){this.month=((s.length==3)?Date.getMonthNumberFromName(s):(Number(s)-1));};},year:function(s){return function(){var n=Number(s);this.year=((s.length>2)?n:(n+(((n+2000)<Date.CultureInfo.twoDigitYearMax)?2000:1900)));};},rday:function(s){return function(){switch(s){case"yesterday":this.days=-1;break;case"tomorrow":this.days=1;break;case"today":this.days=0;break;case"now":this.days=0;this.now=true;break;}};},finishExact:function(x){x=(x instanceof Array)?x:[x];var now=new Date();this.year=now.getFullYear();this.month=now.getMonth();this.day=1;this.hour=0;this.minute=0;this.second=0;for(var i=0;i<x.length;i++){if(x[i]){x[i].call(this);}}
|
||||
this.hour=(this.meridian=="p"&&this.hour<13)?this.hour+12:this.hour;if(this.day>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<x.length;i++){if(typeof x[i]=="function"){x[i].call(this);}}
|
||||
if(this.now){return new Date();}
|
||||
var today=Date.today();var method=null;var expression=!!(this.days!=null||this.orient||this.operator);if(expression){var gap,mod,orient;orient=((this.orient=="past"||this.operator=="subtract")?-1:1);if(this.weekday){this.unit="day";gap=(Date.getDayNumberFromName(this.weekday)-today.getDay());mod=7;this.days=gap?((gap+(orient*mod))%mod):(orient*mod);}
|
||||
if(this.month){this.unit="month";gap=(this.month-today.getMonth());mod=12;this.months=gap?((gap+(orient*mod))%mod):(orient*mod);this.month=null;}
|
||||
if(!this.unit){this.unit="day";}
|
||||
if(this[this.unit+"s"]==null||this.operator!=null){if(!this.value){this.value=1;}
|
||||
if(this.unit=="week"){this.unit="day";this.value=this.value*7;}
|
||||
this[this.unit+"s"]=this.value*orient;}
|
||||
return today.add(this);}else{if(this.meridian&&this.hour){this.hour=(this.hour<13&&this.meridian=="p")?this.hour+12:this.hour;}
|
||||
if(this.weekday&&!this.day){this.day=(today.addDays((Date.getDayNumberFromName(this.weekday)-today.getDay()))).getDate();}
|
||||
if(this.month&&!this.day){this.day=1;}
|
||||
return today.set(this);}}};var _=Date.Parsing.Operators,g=Date.Grammar,t=Date.Translator,_fn;g.datePartDelimiter=_.rtoken(/^([\s\-\.\,\/\x27]+)/);g.timePartDelimiter=_.stoken(":");g.whiteSpace=_.rtoken(/^\s*/);g.generalDelimiter=_.rtoken(/^(([\s\,]|at|on)+)/);var _C={};g.ctoken=function(keys){var fn=_C[keys];if(!fn){var c=Date.CultureInfo.regexPatterns;var kx=keys.split(/\s+/),px=[];for(var i=0;i<kx.length;i++){px.push(_.replace(_.rtoken(c[kx[i]]),kx[i]));}
|
||||
fn=_C[keys]=_.any.apply(null,px);}
|
||||
return fn;};g.ctoken2=function(key){return _.rtoken(Date.CultureInfo.regexPatterns[key]);};g.h=_.cache(_.process(_.rtoken(/^(0[0-9]|1[0-2]|[1-9])/),t.hour));g.hh=_.cache(_.process(_.rtoken(/^(0[0-9]|1[0-2])/),t.hour));g.H=_.cache(_.process(_.rtoken(/^([0-1][0-9]|2[0-3]|[0-9])/),t.hour));g.HH=_.cache(_.process(_.rtoken(/^([0-1][0-9]|2[0-3])/),t.hour));g.m=_.cache(_.process(_.rtoken(/^([0-5][0-9]|[0-9])/),t.minute));g.mm=_.cache(_.process(_.rtoken(/^[0-5][0-9]/),t.minute));g.s=_.cache(_.process(_.rtoken(/^([0-5][0-9]|[0-9])/),t.second));g.ss=_.cache(_.process(_.rtoken(/^[0-5][0-9]/),t.second));g.hms=_.cache(_.sequence([g.H,g.mm,g.ss],g.timePartDelimiter));g.t=_.cache(_.process(g.ctoken2("shortMeridian"),t.meridian));g.tt=_.cache(_.process(g.ctoken2("longMeridian"),t.meridian));g.z=_.cache(_.process(_.rtoken(/^(\+|\-)?\s*\d\d\d\d?/),t.timezone));g.zz=_.cache(_.process(_.rtoken(/^(\+|\-)\s*\d\d\d\d/),t.timezone));g.zzz=_.cache(_.process(g.ctoken2("timezone"),t.timezone));g.timeSuffix=_.each(_.ignore(g.whiteSpace),_.set([g.tt,g.zzz]));g.time=_.each(_.optional(_.ignore(_.stoken("T"))),g.hms,g.timeSuffix);g.d=_.cache(_.process(_.each(_.rtoken(/^([0-2]\d|3[0-1]|\d)/),_.optional(g.ctoken2("ordinalSuffix"))),t.day));g.dd=_.cache(_.process(_.each(_.rtoken(/^([0-2]\d|3[0-1])/),_.optional(g.ctoken2("ordinalSuffix"))),t.day));g.ddd=g.dddd=_.cache(_.process(g.ctoken("sun mon tue wed thu fri sat"),function(s){return function(){this.weekday=s;};}));g.M=_.cache(_.process(_.rtoken(/^(1[0-2]|0\d|\d)/),t.month));g.MM=_.cache(_.process(_.rtoken(/^(1[0-2]|0\d)/),t.month));g.MMM=g.MMMM=_.cache(_.process(g.ctoken("jan feb mar apr may jun jul aug sep oct nov dec"),t.month));g.y=_.cache(_.process(_.rtoken(/^(\d\d?)/),t.year));g.yy=_.cache(_.process(_.rtoken(/^(\d\d)/),t.year));g.yyy=_.cache(_.process(_.rtoken(/^(\d\d?\d?\d?)/),t.year));g.yyyy=_.cache(_.process(_.rtoken(/^(\d\d\d\d)/),t.year));_fn=function(){return _.each(_.any.apply(null,arguments),_.not(g.ctoken2("timeContext")));};g.day=_fn(g.d,g.dd);g.month=_fn(g.M,g.MMM);g.year=_fn(g.yyyy,g.yy);g.orientation=_.process(g.ctoken("past future"),function(s){return function(){this.orient=s;};});g.operator=_.process(g.ctoken("add subtract"),function(s){return function(){this.operator=s;};});g.rday=_.process(g.ctoken("yesterday tomorrow today now"),t.rday);g.unit=_.process(g.ctoken("minute hour day week month year"),function(s){return function(){this.unit=s;};});g.value=_.process(_.rtoken(/^\d\d?(st|nd|rd|th)?/),function(s){return function(){this.value=s.replace(/\D/g,"");};});g.expression=_.set([g.rday,g.operator,g.value,g.unit,g.orientation,g.ddd,g.MMM]);_fn=function(){return _.set(arguments,g.datePartDelimiter);};g.mdy=_fn(g.ddd,g.month,g.day,g.year);g.ymd=_fn(g.ddd,g.year,g.month,g.day);g.dmy=_fn(g.ddd,g.day,g.month,g.year);g.date=function(s){return((g[Date.CultureInfo.dateElementOrder]||g.mdy).call(this,s));};g.format=_.process(_.many(_.any(_.process(_.rtoken(/^(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?)/),function(fmt){if(g[fmt]){return g[fmt];}else{throw Date.Parsing.Exception(fmt);}}),_.process(_.rtoken(/^[^dMyhHmstz]+/),function(s){return _.ignore(_.stoken(s));}))),function(rules){return _.process(_.each.apply(null,rules),t.finishExact);});var _F={};var _get=function(f){return _F[f]=(_F[f]||g.format(f)[0]);};g.formats=function(fx){if(fx instanceof Array){var rx=[];for(var i=0;i<fx.length;i++){rx.push(_get(fx[i]));}
|
||||
return _.any.apply(null,rx);}else{return _get(fx);}};g._formats=g.formats(["yyyy-MM-ddTHH:mm:ss","ddd, MMM dd, yyyy H:mm:ss tt","ddd MMM d yyyy HH:mm:ss zzz","d"]);g._start=_.process(_.set([g.date,g.time,g.expression],g.generalDelimiter,g.whiteSpace),t.finish);g.start=function(s){try{var r=g._formats.call({},s);if(r[1].length===0){return r;}}catch(e){}
|
||||
return g._start.call({},s);};}());Date._parse=Date.parse;Date.parse=function(s){var r=null;if(!s){return null;}
|
||||
try{r=Date.Grammar.start.call({},s);}catch(e){return null;}
|
||||
return((r[1].length===0)?r[0]:null);};Date.getParseFunction=function(fx){var fn=Date.Grammar.formats(fx);return function(s){var r=null;try{r=fn.call({},s);}catch(e){return null;}
|
||||
return((r[1].length===0)?r[0]:null);};};Date.parseExact=function(s,fx){return Date.getParseFunction(fx)(s);};
|
7
src/h5ai/js/inc/lib/jquery.fracs-core.min.js
vendored
Normal file
7
src/h5ai/js/inc/lib/jquery.fracs-core.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
150
src/h5ai/js/inc/lib/jquery.scrollpanel.js
Normal file
150
src/h5ai/js/inc/lib/jquery.scrollpanel.js
Normal file
@ -0,0 +1,150 @@
|
||||
|
||||
(function ($) {
|
||||
"use strict";
|
||||
/*global window, jQuery */
|
||||
|
||||
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 = $("<div class='scrollbar' />");
|
||||
$drag = $("<div class='drag' />").appendTo($scrollbar);
|
||||
$element
|
||||
.wrapInner("<div class='wrapper'><div class='content' /></div>")
|
||||
.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));
|
@ -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 = $("<li class='crumb' />")
|
||||
.data("path", path)
|
||||
.addClass(path.isFolder ? "folder" : "file");
|
||||
|
||||
if (path.status) {
|
||||
$html.data("status", path.status);
|
||||
}
|
||||
|
||||
$a = $("<a><img src='/h5ai/images/crumb.png' alt='>' />" + path.label + "</a>")
|
||||
.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) {
|
||||
$("<img class='hint' src='/h5ai/images/page.png' alt='not listable' />").appendTo($a);
|
||||
} else {
|
||||
$("<span class='hint'>(" + path.status + ")</span>").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 = $("<li class='entry' />")
|
||||
.data("path", path)
|
||||
.addClass(path.isFolder ? "folder" : "file");
|
||||
|
||||
if (path.status) {
|
||||
$html.data("status", path.status);
|
||||
}
|
||||
|
||||
$label = $("<span class='label'>" + path.label + "</span>");
|
||||
$a = $("<a />")
|
||||
.attr("href", path.absHref)
|
||||
.click(function() { onClick("extended"); })
|
||||
.appendTo($html)
|
||||
.append($("<span class='icon small'><img src='" + path.icon16 + "' alt='" + path.alt + "' /></span>"))
|
||||
.append($("<span class='icon big'><img src='" + path.icon48 + "' alt='" + path.alt + "' /></span>"))
|
||||
.append($label)
|
||||
.append($("<span class='date'>" + path.date + "</span>"))
|
||||
.append($("<span class='size'>" + path.size + "</span>"));
|
||||
|
||||
$a.hover(
|
||||
function () {
|
||||
if ($("#extended").hasClass("icons-view")) {
|
||||
var $this = $(this);
|
||||
$(".status.default").hide();
|
||||
$(".status.dynamic")
|
||||
.empty()
|
||||
.append($this.find(".label").clone())
|
||||
.append($("<span class='sep'>·</span>"))
|
||||
.append($this.find(".date").clone())
|
||||
.show();
|
||||
|
||||
if (!$this.closest(".entry").hasClass("folder")) {
|
||||
$(".status.dynamic")
|
||||
.append($("<span class='sep'>·</span>"))
|
||||
.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($("<span class='hint'> " + path.status + " </span>"));
|
||||
}
|
||||
}
|
||||
|
||||
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 = $("<div class='entry' />")
|
||||
.data("path", path)
|
||||
.addClass(path.isFolder ? "folder" : "file");
|
||||
|
||||
$blank = $("<span class='blank' />").appendTo($html);
|
||||
|
||||
$a = $("<a />")
|
||||
.attr("href", path.absHref)
|
||||
.click(function() { path.onClick("tree"); })
|
||||
.appendTo($html)
|
||||
.append($("<span class='icon'><img src='" + path.icon16 + "' /></span>"))
|
||||
.append($("<span class='label'>" + path.label + "</span>"));
|
||||
|
||||
if (path.isFolder) {
|
||||
// indicator
|
||||
if (path.status === undefined || !path.isEmpty()) {
|
||||
$indicator = $("<span class='indicator'><img src='/h5ai/images/tree.png' /></span>");
|
||||
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 = $("<ul class='content' />").appendTo($html);
|
||||
for (idx in path.content) {
|
||||
$("<li />").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($("<span class='hint'><img src='/h5ai/images/page.png' /></span>"));
|
||||
} else {
|
||||
$html.addClass("error");
|
||||
$a.append($("<span class='hint'>" + path.status + "</span>"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
};
|
4
src/h5ai/js/lib/modernizr.min.js
vendored
4
src/h5ai/js/lib/modernizr.min.js
vendored
File diff suppressed because one or more lines are too long
8
src/h5ai/js/libs.js
Normal file
8
src/h5ai/js/libs.js
Normal file
@ -0,0 +1,8 @@
|
||||
|
||||
// @include "inc/lib/jquery.min.js"
|
||||
// @include "inc/lib/jquery.mousewheel.min.js"
|
||||
// @include "inc/lib/jquery.fracs-core.min.js"
|
||||
// @include "inc/lib/jquery.scrollpanel.js"
|
||||
|
||||
// @include "inc/lib/amplify.min.js"
|
||||
// @include "inc/lib/date.js"
|
@ -1,30 +1,37 @@
|
||||
|
||||
(function($) {
|
||||
"use strict";
|
||||
/*global jQuery, h5aiOptions, h5aiLangs*/
|
||||
|
||||
// @include "inc/jquery.mousewheel.min.js"
|
||||
// @include "inc/jquery.scrollpanel.js"
|
||||
// @include "inc/jquery.utils.js"
|
||||
// @include "inc/jquery.fracs.js"
|
||||
// @include "inc/path.js"
|
||||
// @include "inc/h5ai.js"
|
||||
// @include "inc/extended.js"
|
||||
// @include "inc/tree.js"
|
||||
var H5aiJs = {
|
||||
factory: {},
|
||||
init: function () {
|
||||
|
||||
var pathCache = new PathCache(),
|
||||
h5ai = new H5ai(h5aiOptions, h5aiLangs),
|
||||
extended = new Extended(pathCache, h5ai),
|
||||
tree = new Tree(pathCache, h5ai);
|
||||
this.h5ai = new this.factory.H5ai(h5aiOptions, h5aiLangs);
|
||||
this.pathCache = new this.factory.PathCache();
|
||||
this.connector = new this.factory.Connector();
|
||||
this.html = new this.factory.Html();
|
||||
this.extended = new this.factory.Extended();
|
||||
|
||||
$.h5ai = {
|
||||
click: $.proxy(h5ai.pathClick, h5ai)
|
||||
};
|
||||
this.extended.init();
|
||||
this.connector.init();
|
||||
this.h5ai.init();
|
||||
|
||||
$.h5ai = {
|
||||
click: $.proxy(this.h5ai.pathClick, this.h5ai)
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// @include "inc/H5ai.js"
|
||||
// @include "inc/Path.js"
|
||||
// @include "inc/PathCache.js"
|
||||
// @include "inc/Connector.js"
|
||||
// @include "inc/Html.js"
|
||||
// @include "inc/Extended.js"
|
||||
|
||||
$(function () {
|
||||
|
||||
extended.init();
|
||||
tree.init();
|
||||
h5ai.init();
|
||||
H5aiJs.init();
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
}(jQuery));
|
||||
|
@ -1,24 +1,28 @@
|
||||
|
||||
(function($) {
|
||||
"use strict";
|
||||
/*global jQuery, h5aiOptions, h5aiLangs*/
|
||||
|
||||
// @include "inc/jquery.mousewheel.min.js"
|
||||
// @include "inc/jquery.scrollpanel.js"
|
||||
// @include "inc/jquery.utils.js"
|
||||
// @include "inc/jquery.fracs.js"
|
||||
// @include "inc/h5ai.js"
|
||||
var H5aiJs = {
|
||||
factory: {},
|
||||
init: function () {
|
||||
|
||||
var h5ai = new H5ai(h5aiOptions, h5aiLangs);
|
||||
this.h5ai = new this.factory.H5ai(h5aiOptions, h5aiLangs);
|
||||
|
||||
$.h5ai = {
|
||||
click: $.proxy(h5ai.pathClick, h5ai)
|
||||
};
|
||||
this.h5ai.init();
|
||||
$("#tree").scrollpanel();
|
||||
this.h5ai.shiftTree(false, true);
|
||||
|
||||
$.h5ai = {
|
||||
click: $.proxy(this.h5ai.pathClick, this.h5ai)
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// @include "inc/H5ai.js"
|
||||
|
||||
$(function () {
|
||||
|
||||
h5ai.init();
|
||||
$("#tree").scrollpanel();
|
||||
h5ai.shiftTree(false, true);
|
||||
H5aiJs.init();
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
}(jQuery));
|
||||
|
4
src/h5ai/js/modernizr.min.js
vendored
Normal file
4
src/h5ai/js/modernizr.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -5,6 +5,12 @@
|
||||
|
||||
h5aiOptions = {
|
||||
|
||||
/*
|
||||
* The absolute link to h5ai.
|
||||
* Don't change this unless you know what you are doing.
|
||||
*/
|
||||
"h5aiAbsHref": "/h5ai",
|
||||
|
||||
/*
|
||||
* An array of view modes the user may choose from. Currently there
|
||||
* are two possible values: "details" and "icons". The first value
|
||||
@ -57,7 +63,7 @@ h5aiOptions = {
|
||||
* possible values. Adjust it to your needs. If lang is not found in
|
||||
* h5aiLangs it defaults to "en".
|
||||
*/
|
||||
"lang": null,
|
||||
"lang": "en",
|
||||
|
||||
/*
|
||||
* Try to use browser language, falls back to previous specified lang.
|
||||
@ -75,35 +81,23 @@ h5aiOptions = {
|
||||
"linkHoverStates": true,
|
||||
|
||||
/*
|
||||
* Only used in PHP implementation.
|
||||
* Date format in PHP syntax, for example: "Y-m-d H:i:s"
|
||||
* http://www.php.net/manual/en/function.date.php
|
||||
* Date format in detailed view, for example: "yyyy-MM-dd HH:mm:ss"
|
||||
* Syntax as specified by date.js
|
||||
* http://code.google.com/p/datejs/wiki/FormatSpecifiers
|
||||
*/
|
||||
"dateFormat": "Y-m-d H:i",
|
||||
"dateFormat": "yyyy-MM-dd HH:mm",
|
||||
|
||||
/*
|
||||
* IMPORTANT: PHP implementation doesn't care about Apache's
|
||||
* ignores, so you have to specify this here.
|
||||
*
|
||||
* Only used in PHP implementation.
|
||||
* Files/folders that should never be listed. Specified
|
||||
* by the complete filename or by a regular expression.
|
||||
* http://www.php.net/manual/en/function.preg-match.php
|
||||
* Requieres PHP on the server.
|
||||
* Show thumbnails in icons view.
|
||||
*/
|
||||
"ignore": ["h5ai", "h5ai.header.html", "h5ai.footer.html"],
|
||||
"ignoreRE": ["/^\\./"],
|
||||
"showThumbs": false,
|
||||
|
||||
/*
|
||||
* Only used in PHP implementation.
|
||||
* Show thumbnails in Icons view.
|
||||
* Requieres PHP on the server.
|
||||
* Enable zipped download of selected entries.
|
||||
*/
|
||||
"showThumbs": true,
|
||||
|
||||
/*
|
||||
* Enable zipped download of selected entries. Requieres
|
||||
* PHP on the server.
|
||||
*/
|
||||
"zippedDownload": true
|
||||
"zippedDownload": false
|
||||
};
|
||||
|
||||
|
||||
@ -127,59 +121,17 @@ h5aiLangs = {
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"de": {
|
||||
"lang": "deutsch",
|
||||
"details": "Details",
|
||||
"icons": "Icons",
|
||||
"name": "Name",
|
||||
"lastModified": "Geändert",
|
||||
"size": "Größe",
|
||||
"parentDirectory": "Übergeordnetes Verzeichnis",
|
||||
"empty": "leer",
|
||||
"folders": "Ordner",
|
||||
"files": "Dateien",
|
||||
"download": "Download"
|
||||
},
|
||||
|
||||
"fr": {
|
||||
"lang": "français",
|
||||
"details": "détails",
|
||||
"icons": "icônes",
|
||||
"name": "Nom",
|
||||
"lastModified": "Dernière modification",
|
||||
"size": "Taille",
|
||||
"parentDirectory": "Dossier parent",
|
||||
"empty": "vide",
|
||||
"folders": "Répertoires",
|
||||
"files": "Fichiers",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"nl": {
|
||||
"lang": "nederlands",
|
||||
"details": "details",
|
||||
"icons": "iconen",
|
||||
"name": "Naam",
|
||||
"lastModified": "Laatste wijziging",
|
||||
"size": "Grootte",
|
||||
"parentDirectory": "Bovenliggende map",
|
||||
"empty": "lege",
|
||||
"folders": "folders",
|
||||
"files": "files",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"sv": {
|
||||
"lang": "svenska",
|
||||
"details": "detaljerad",
|
||||
"icons": "ikoner",
|
||||
"name": "Filnamn",
|
||||
"lastModified": "Senast ändrad",
|
||||
"size": "Filstorlek",
|
||||
"parentDirectory": "Till överordnad mapp",
|
||||
"empty": "tom",
|
||||
"folders": "folders",
|
||||
"files": "files",
|
||||
"bg": {
|
||||
"lang": "български",
|
||||
"details": "детайли",
|
||||
"icons": "икони",
|
||||
"name": "Име",
|
||||
"lastModified": "Последна промяна",
|
||||
"size": "Размер",
|
||||
"parentDirectory": "Предходна директория",
|
||||
"empty": "празно",
|
||||
"folders": "папки",
|
||||
"files": "файлове",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
@ -197,6 +149,132 @@ h5aiLangs = {
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"de": {
|
||||
"lang": "deutsch",
|
||||
"details": "Details",
|
||||
"icons": "Icons",
|
||||
"name": "Name",
|
||||
"lastModified": "Geändert",
|
||||
"size": "Größe",
|
||||
"parentDirectory": "Übergeordnetes Verzeichnis",
|
||||
"empty": "leer",
|
||||
"folders": "Ordner",
|
||||
"files": "Dateien",
|
||||
"download": "Download"
|
||||
},
|
||||
|
||||
"es": {
|
||||
"lang": "español",
|
||||
"details": "Detalles",
|
||||
"icons": "Íconos",
|
||||
"name": "Nombre",
|
||||
"lastModified": "Última modificación",
|
||||
"size": "Tamaño",
|
||||
"parentDirectory": "Directorio superior",
|
||||
"empty": "vacío",
|
||||
"folders": "folders",
|
||||
"files": "files",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"fr": {
|
||||
"lang": "français",
|
||||
"details": "détails",
|
||||
"icons": "icônes",
|
||||
"name": "Nom",
|
||||
"lastModified": "Dernière modification",
|
||||
"size": "Taille",
|
||||
"parentDirectory": "Dossier parent",
|
||||
"empty": "vide",
|
||||
"folders": "Répertoires",
|
||||
"files": "Fichiers",
|
||||
"download": "télécharger"
|
||||
},
|
||||
|
||||
"it": {
|
||||
"lang": "italiano",
|
||||
"details": "dettagli",
|
||||
"icons": "icone",
|
||||
"name": "Nome",
|
||||
"lastModified": "Ultima modifica",
|
||||
"size": "Dimensione",
|
||||
"parentDirectory": "Cartella Superiore",
|
||||
"empty": "vuota",
|
||||
"folders": "cartelle",
|
||||
"files": "file",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"lv": {
|
||||
"lang": "latviešu",
|
||||
"details": "detaļas",
|
||||
"icons": "ikonas",
|
||||
"name": "Nosaukums",
|
||||
"lastModified": "Pēdējoreiz modificēts",
|
||||
"size": "Izmērs",
|
||||
"parentDirectory": "Vecākdirektorijs",
|
||||
"empty": "tukšs",
|
||||
"folders": "mapes",
|
||||
"files": "faili",
|
||||
"download": "lejupielādēt"
|
||||
},
|
||||
|
||||
"nl": {
|
||||
"lang": "nederlands",
|
||||
"details": "details",
|
||||
"icons": "iconen",
|
||||
"name": "Naam",
|
||||
"lastModified": "Laatste wijziging",
|
||||
"size": "Grootte",
|
||||
"parentDirectory": "Bovenliggende map",
|
||||
"empty": "lege",
|
||||
"folders": "folders",
|
||||
"files": "files",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"pl": {
|
||||
"lang": "polski",
|
||||
"details": "szczegóły",
|
||||
"icons": "ikony",
|
||||
"name": "Nazwa",
|
||||
"lastModified": "Ostatnia modyfikacja",
|
||||
"size": "Rozmiar",
|
||||
"parentDirectory": "Katalog nadrzędny",
|
||||
"empty": "pusty",
|
||||
"folders": "foldery",
|
||||
"files": "pliki",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"pt": {
|
||||
"lang": "português",
|
||||
"details": "detalhes",
|
||||
"icons": "ícones",
|
||||
"name": "Nome",
|
||||
"lastModified": "Última modificação",
|
||||
"size": "Tamanho",
|
||||
"parentDirectory": "Diretório superior",
|
||||
"empty": "vazio",
|
||||
"folders": "pastas",
|
||||
"files": "arquivos",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"ru": {
|
||||
"lang": "русский",
|
||||
"details": "детали",
|
||||
"icons": "иконки",
|
||||
"name": "Имя",
|
||||
"lastModified": "Последние изменения",
|
||||
"size": "Размер",
|
||||
"parentDirectory": "Главная директория",
|
||||
"empty": "пусто",
|
||||
"folders": "папки",
|
||||
"files": "файлы",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"sk": {
|
||||
"lang": "slovenčina",
|
||||
"details": "podrobnosti",
|
||||
@ -211,15 +289,15 @@ h5aiLangs = {
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"es": {
|
||||
"lang": "español",
|
||||
"details": "Detalles",
|
||||
"icons": "Íconos",
|
||||
"name": "Nombre",
|
||||
"lastModified": "Última modificación",
|
||||
"size": "Tamaño",
|
||||
"parentDirectory": "Directorio superior",
|
||||
"empty": "vacío",
|
||||
"sv": {
|
||||
"lang": "svenska",
|
||||
"details": "detaljerad",
|
||||
"icons": "ikoner",
|
||||
"name": "Filnamn",
|
||||
"lastModified": "Senast ändrad",
|
||||
"size": "Filstorlek",
|
||||
"parentDirectory": "Till överordnad mapp",
|
||||
"empty": "tom",
|
||||
"folders": "folders",
|
||||
"files": "files",
|
||||
"download": "download"
|
||||
@ -239,48 +317,6 @@ h5aiLangs = {
|
||||
"download": "indir"
|
||||
},
|
||||
|
||||
"pt": {
|
||||
"lang": "português",
|
||||
"details": "detalhes",
|
||||
"icons": "ícones",
|
||||
"name": "Nome",
|
||||
"lastModified": "Última modificação",
|
||||
"size": "Tamanho",
|
||||
"parentDirectory": "Diretório superior",
|
||||
"empty": "vazio",
|
||||
"folders": "pastas",
|
||||
"files": "arquivos",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"bg": {
|
||||
"lang": "български",
|
||||
"details": "детайли",
|
||||
"icons": "икони",
|
||||
"name": "Име",
|
||||
"lastModified": "Последна промяна",
|
||||
"size": "Размер",
|
||||
"parentDirectory": "Предходна директория",
|
||||
"empty": "празно",
|
||||
"folders": "папки",
|
||||
"files": "файлове",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"lv": {
|
||||
"lang": "latviešu",
|
||||
"details": "detaļas",
|
||||
"icons": "ikonas",
|
||||
"name": "Nosaukums",
|
||||
"lastModified": "Pēdējoreiz modificēts",
|
||||
"size": "Izmērs",
|
||||
"parentDirectory": "Vecākdirektorijs",
|
||||
"empty": "tukšs",
|
||||
"folders": "mapes",
|
||||
"files": "faili",
|
||||
"download": "lejupielādēt"
|
||||
},
|
||||
|
||||
"zh-cn": {
|
||||
"lang": "简体中文",
|
||||
"details": "详情",
|
||||
@ -293,47 +329,5 @@ h5aiLangs = {
|
||||
"folders": "文件夹",
|
||||
"files": "文件",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"pl": {
|
||||
"lang": "polski",
|
||||
"details": "szczegóły",
|
||||
"icons": "ikony",
|
||||
"name": "Nazwa",
|
||||
"lastModified": "Ostatnia modyfikacja",
|
||||
"size": "Rozmiar",
|
||||
"parentDirectory": "Katalog nadrzędny",
|
||||
"empty": "pusty",
|
||||
"folders": "foldery",
|
||||
"files": "pliki",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"ru": {
|
||||
"lang": "русский",
|
||||
"details": "детали",
|
||||
"icons": "иконки",
|
||||
"name": "Имя",
|
||||
"lastModified": "Последние изменения",
|
||||
"size": "Размер",
|
||||
"parentDirectory": "Главная директория",
|
||||
"empty": "пусто",
|
||||
"folders": "папки",
|
||||
"files": "файлы",
|
||||
"download": "download"
|
||||
},
|
||||
|
||||
"it": {
|
||||
"lang": "italiano",
|
||||
"details": "dettagli",
|
||||
"icons": "icone",
|
||||
"name": "Nome",
|
||||
"lastModified": "Ultima modifica",
|
||||
"size": "Dimensione",
|
||||
"parentDirectory": "Cartella Superiore",
|
||||
"empty": "vuota",
|
||||
"folders": "cartelle",
|
||||
"files": "file",
|
||||
"download": "download"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
126
src/h5ai/php/api.php
Normal file
126
src/h5ai/php/api.php
Normal file
@ -0,0 +1,126 @@
|
||||
<?php
|
||||
|
||||
|
||||
function fail($code, $msg, $cond = true) {
|
||||
if ($cond) {
|
||||
echo "$code: $msg";
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
function checkKeys($keys) {
|
||||
$values = array();
|
||||
foreach ($keys as $key) {
|
||||
fail(1, "parameter '$key' is missing", !array_key_exists($key, $_REQUEST));
|
||||
$values[] = $_REQUEST[$key];
|
||||
}
|
||||
return $values;
|
||||
}
|
||||
|
||||
|
||||
list($action) = checkKeys(array("action"));
|
||||
|
||||
|
||||
require_once "config.php";
|
||||
require_once "inc/H5ai.php";
|
||||
$h5ai = new H5ai();
|
||||
$options = $h5ai->getOptions();
|
||||
|
||||
|
||||
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");
|
||||
}
|
||||
|
||||
|
||||
?>
|
15
src/h5ai/php/config.php
Normal file
15
src/h5ai/php/config.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
global $H5AI_CONFIG;
|
||||
$H5AI_CONFIG = array();
|
||||
|
||||
$H5AI_CONFIG["DOCUMENT_ROOT"] = getenv("DOCUMENT_ROOT");
|
||||
$H5AI_CONFIG["H5AI_ROOT"] = getenv("DOCUMENT_ROOT") . "/h5ai";
|
||||
|
||||
# Files/folders that should never be listed. Specified
|
||||
# by the complete filename or by a regular expression.
|
||||
# http://www.php.net/manual/en/function.preg-match.php
|
||||
$H5AI_CONFIG["IGNORE"] = array("h5ai", "h5ai.header.html", "h5ai.footer.html");
|
||||
$H5AI_CONFIG["IGNORE_PATTERNS"] = array("/^\\./");
|
||||
|
||||
?>
|
@ -1,23 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once "h5ai.php";
|
||||
|
||||
function getHttpCodes($h5ai, $hrefs) {
|
||||
|
||||
$codes = array();
|
||||
foreach ($hrefs as $href) {
|
||||
$href = trim($href);
|
||||
if (strlen($href) > 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);
|
||||
|
||||
?>
|
@ -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 = "<img class='hint' src='/h5ai/images/page.png' alt='page' />";
|
||||
$hint = "<img class='hint' src='" . $this->h5ai->image("page") . "' alt='page' />";
|
||||
} else {
|
||||
$hint = "<span class='hint'>(" . $code . ")</span>";
|
||||
}
|
@ -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) {
|
@ -1,6 +1,6 @@
|
||||
<?php
|
||||
|
||||
require_once "thumbnail.php";
|
||||
require_once "Thumbnail.php";
|
||||
|
||||
|
||||
class Entry {
|
||||
@ -59,10 +59,9 @@ class Entry {
|
||||
|
||||
$classes = "entry " . $this->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 = "<span class='hint'> " . $code . " </span>";
|
||||
@ -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<span class='icon small'><img src='" . $smallImg . "' alt='" . $img . "' /></span>\n";
|
||||
$html .= "\t\t\t<span class='icon big'><img src='" . $bigImg . "' alt='" . $img . "' /></span>\n";
|
||||
$html .= "\t\t\t<span class='label'>" . $this->label . $hint . "</span>\n";
|
||||
$html .= "\t\t\t<span class='date'>" . $dateLabel . "</span>\n";
|
||||
$html .= "\t\t\t<span class='date' data-time='" . $this->date . "000'></span>\n";
|
||||
$html .= "\t\t\t<span class='size'>" . $this->formatSize($this->size) . "</span>\n";
|
||||
$html .= "\t\t</a>\n";
|
||||
$html .= "\t</li>\n";
|
||||
@ -198,8 +197,8 @@ class Extended {
|
||||
|
||||
public function generateHeaders() {
|
||||
|
||||
$asc = "<img src='/h5ai/images/ascending.png' class='sort' alt='ascending' />";
|
||||
$desc = "<img src='/h5ai/images/descending.png' class='sort' alt='descending' />";
|
||||
$asc = "<img src='" . $this->h5ai->image("ascending") . "' class='sort' alt='ascending' />";
|
||||
$desc = "<img src='" . $this->h5ai->image("descending") . "' class='sort' alt='descending' />";
|
||||
|
||||
$so = $this->h5ai->getSortOrder();
|
||||
$order = $so["ascending"] ? $asc : $desc;
|
@ -1,34 +1,37 @@
|
||||
<?php
|
||||
|
||||
require_once "cache.php";
|
||||
require_once "Cache.php";
|
||||
|
||||
class H5ai {
|
||||
private static $SORT_ORDER = array("column" => "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"];
|
@ -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)) {
|
59
src/h5ai/php/inc/Thumbnail.php
Normal file
59
src/h5ai/php/inc/Thumbnail.php
Normal file
@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
require_once "Image.php";
|
||||
|
||||
|
||||
class Thumbnail {
|
||||
|
||||
private $srcAbsHref, $srcAbsPath, $width, $height, $name, $href, $path;
|
||||
|
||||
public static function isUsable() {
|
||||
|
||||
return Image::isUsable();
|
||||
}
|
||||
|
||||
public function __construct($h5ai, $absHref, $mode, $width, $height) {
|
||||
|
||||
$this->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;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -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 = "<span class='hint'><img src='/h5ai/images/page.png' alt='page' /></span>";
|
||||
$icon = "folder-page";
|
||||
$hint = "<span class='hint'><img src='" . $this->h5ai->image("page") . "' alt='page' /></span>";
|
||||
} else {
|
||||
$classes .= " error";
|
||||
$hint = "<span class='hint'> " . $code . " </span>";
|
||||
@ -83,10 +83,10 @@ class TreeEntry {
|
||||
$html .= "<span class='blank'></span>\n";
|
||||
} else {
|
||||
$indicatorState = $this->content === null ? " unknown" : " open";
|
||||
$html .= "<span class='indicator" . $indicatorState . "'><img src='/h5ai/images/tree.png' alt='>' /></span>\n";
|
||||
$html .= "<span class='indicator" . $indicatorState . "'><img src='" . $this->h5ai->image("tree") . "' alt='>' /></span>\n";
|
||||
}
|
||||
$html .= "<a href='" . $this->absHref . "'>\n";
|
||||
$html .= "<span class='icon'><img src='/h5ai/icons/16x16/" . $img . ".png' alt='" . $img . "' /></span>\n";
|
||||
$html .= "<span class='icon'><img src='" . $this->h5ai->icon($icon) . "' alt='" . $icon . "' /></span>\n";
|
||||
$html .= "<span class='label'>" . $this->label . "</span>" . $hint . "\n";
|
||||
$html .= "</a>\n";
|
||||
$html .= $this->contentToHtml();
|
@ -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);
|
@ -1,10 +1,11 @@
|
||||
<?php
|
||||
|
||||
require_once "h5ai.php";
|
||||
require_once "crumb.php";
|
||||
require_once "customize.php";
|
||||
require_once "extended.php";
|
||||
require_once "tree.php";
|
||||
require_once "config.php";
|
||||
require_once "inc/H5ai.php";
|
||||
require_once "inc/Crumb.php";
|
||||
require_once "inc/Customize.php";
|
||||
require_once "inc/Extended.php";
|
||||
require_once "inc/Tree.php";
|
||||
|
||||
$h5ai = new H5ai();
|
||||
$crumb = new Crumb($h5ai);
|
||||
|
@ -1,26 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once "thumbnail.php";
|
||||
|
||||
$src = $_REQUEST["src"];
|
||||
$width = $_REQUEST["width"];
|
||||
$height = $_REQUEST["height"];
|
||||
$mode = $_REQUEST["mode"];
|
||||
|
||||
if (!Thumbnail::isUsable()) {
|
||||
Image::showImage($src);
|
||||
exit;
|
||||
}
|
||||
|
||||
$thumbnail = new Thumbnail($src, $mode, $width, $height);
|
||||
$thumbnail->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();
|
||||
}
|
||||
|
||||
?>
|
@ -1,56 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once "image.php";
|
||||
|
||||
class Thumbnail {
|
||||
|
||||
private $src, $width, $height, $name, $href, $path;
|
||||
|
||||
public static function isUsable() {
|
||||
|
||||
return Image::isUsable();
|
||||
}
|
||||
|
||||
public function __construct($src, $mode, $width, $height) {
|
||||
|
||||
$this->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;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -1,20 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!array_key_exists("href", $_REQUEST)) {
|
||||
exit;
|
||||
}
|
||||
|
||||
require_once "h5ai.php";
|
||||
require_once "tree.php";
|
||||
|
||||
$h5ai = new H5ai();
|
||||
|
||||
$absHref = trim($_REQUEST[ "href" ]);
|
||||
$absPath = $h5ai->getAbsPath($absHref);
|
||||
|
||||
$tree = new TreeEntry($h5ai, $absPath, $absHref);
|
||||
$tree->loadContent();
|
||||
|
||||
echo $tree->contentToHtml();
|
||||
|
||||
?>
|
@ -1,28 +0,0 @@
|
||||
<?php
|
||||
|
||||
if (!array_key_exists("hrefs", $_REQUEST)) {
|
||||
echo "failed";
|
||||
exit;
|
||||
}
|
||||
|
||||
require_once "h5ai.php";
|
||||
require_once "zipit.php";
|
||||
|
||||
$h5ai = new H5ai();
|
||||
$zipit = new ZipIt($h5ai);
|
||||
|
||||
$hrefs = explode(":", trim($_REQUEST["hrefs"]));
|
||||
|
||||
$zipFile = $zipit->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.";
|
||||
}
|
||||
|
||||
?>
|
@ -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%
|
||||
|
@ -1,5 +1,5 @@
|
||||
################################
|
||||
# %BUILD_NAME% %BUILD_VERSION% (php)
|
||||
# h5ai %BUILD_VERSION% (php)
|
||||
# customized .htaccess
|
||||
################################
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
<attribute name="toFile" />
|
||||
<attribute name="args" default="" />
|
||||
<sequential>
|
||||
<exec executable="${wepp}">
|
||||
<exec executable="${tool.wepp}">
|
||||
<arg line="@{args}" />
|
||||
<arg value="--in" />
|
||||
<arg value="@{file}" />
|
||||
@ -20,7 +20,7 @@
|
||||
<attribute name="dir" />
|
||||
<attribute name="args" default="" />
|
||||
<sequential>
|
||||
<exec executable="${wepp}">
|
||||
<exec executable="${tool.wepp}">
|
||||
<arg line="@{args}" />
|
||||
<arg value="--inDir" />
|
||||
<arg value="@{dir}" />
|
||||
|
Loading…
x
Reference in New Issue
Block a user