diff --git a/README.md b/README.md
index 31eb9d22..7b344991 100644
--- a/README.md
+++ b/README.md
@@ -42,6 +42,7 @@ h5ai is provided under the terms of the [MIT License](http://github.com/lrsjng/h
* fixes path problems on servers running on Windows in PHP version
* fixes broken links in custom headers/footers while zipped download enabled
* fixes problems with thumbnails for files with single or double quotes in filename
+* improves url hashes
* updates year in `LICENSE.TXT`
* updates es translation
* adds zh-tw translation by [Yao Wei](http://github.com/medicalwei)
diff --git a/src/_h5ai/js/inc/Core.js b/src/_h5ai/js/inc/Core.js
index ad48cda2..a692fc3b 100644
--- a/src/_h5ai/js/inc/Core.js
+++ b/src/_h5ai/js/inc/Core.js
@@ -44,6 +44,35 @@
});
return map;
}(config.types)),
+ hash = function (obj) {
+
+ if ($.isPlainObject(obj)) {
+ var hashStr = '';
+ $.each($.extend({}, hash(), obj), function (key, value) {
+ if (value) {
+ hashStr += '/' + key + '=' + value;
+ }
+ });
+ hashStr = '#!' + hashStr;
+ window.location.hash = hashStr;
+ return hashStr;
+ } else {
+ var result = {},
+ parts = document.location.hash.split('/');
+
+ if (parts.length >= 2 || parts[0] === '#!') {
+ parts.shift();
+ $.each(parts, function (idx, part) {
+
+ var match = /^([^=]*)=(.*?)$/.exec(part);
+ if (match) {
+ result[match[1]] = match[2];
+ }
+ });
+ }
+ return typeof obj === 'string' ? result[obj] : result;
+ }
+ },
api = function () {
return settings.h5aiAbsHref + "php/api.php";
@@ -68,6 +97,7 @@
viewmode = amplify.store(settings.store.viewmode);
}
viewmode = $.inArray(viewmode, settings.viewmodes) >= 0 ? viewmode : settings.viewmodes[0];
+ H5AI.core.hash({view: viewmode});
$viewDetails.add($viewIcons).removeClass("current");
if (viewmode === "details") {
@@ -123,13 +153,19 @@
if ($.inArray("icons", settings.viewmodes) >= 0) {
$("
icons")
.find("img").attr("src", image("view-icons")).end()
- .click(function () { viewmode("icons"); })
+ .find("a").click(function (event) {
+ viewmode("icons");
+ event.preventDefault();
+ }).end()
.appendTo($navbar);
}
if ($.inArray("details", settings.viewmodes) >= 0) {
$("
details")
.find("img").attr("src", image("view-details")).end()
- .click(function () { viewmode("details"); })
+ .find("a").click(function (event) {
+ viewmode("details");
+ event.preventDefault();
+ }).end()
.appendTo($navbar);
}
}
@@ -257,6 +293,7 @@
$(".lang").text(lang);
$(".langOption").removeClass("current");
$(".langOption." + lang).addClass("current");
+ H5AI.core.hash({lang: lang});
}
formatDates(selected.dateFormat || settings.dateFormat);
@@ -386,6 +423,7 @@
return {
settings: settings,
+ hash: hash,
api: api,
image: image,
icon: icon,
diff --git a/src/_h5ai/js/inc/Finder.js b/src/_h5ai/js/inc/Finder.js
index 62ea0107..060fc2e6 100644
--- a/src/_h5ai/js/inc/Finder.js
+++ b/src/_h5ai/js/inc/Finder.js
@@ -45,6 +45,7 @@
} else {
$filter.removeClass('current');
}
+ H5AI.core.hash({filter: val});
},
parseFilterSequence = function (sequence) {
@@ -91,6 +92,12 @@
})
.end()
.appendTo($("#navbar"));
+
+ var initialFilter = H5AI.core.hash('filter');
+ if (initialFilter) {
+ $('#filter input').val(initialFilter);
+ checkState(false);
+ }
}
};
diff --git a/src/_h5ai/js/inc/Sort.js b/src/_h5ai/js/inc/Sort.js
index 0954298d..074ccf0b 100644
--- a/src/_h5ai/js/inc/Sort.js
+++ b/src/_h5ai/js/inc/Sort.js
@@ -78,14 +78,15 @@
var order = orders[id];
$all.removeClass("ascending").removeClass("descending");
- order.head.addClass(order.clas).attr("href", "#!/sort=" + id);
+ order.head.addClass(order.clas);
sort(order.fn);
+ H5AI.core.hash({sort: id});
},
init = function () {
var $ascending = $("
"),
$descending = $("
"),
- initialOrder = /^.*#!.*\/sort=(.*?)(?:\/.*)?$/.exec(document.location),
+ initialOrder = H5AI.core.hash('sort'),
$header = $("#extended li.header"),
$label = $header.find("a.label"),
$date = $header.find("a.date"),
@@ -125,27 +126,27 @@
}
};
- sortBy(initialOrder ? initialOrder[1] : H5AI.core.settings.sortorder);
+ sortBy(initialOrder ? initialOrder : H5AI.core.settings.sortorder);
$label
- .attr("href", "#!/sort=na")
.append($ascending.clone()).append($descending.clone())
- .click(function () {
+ .click(function (event) {
sortBy("n" + ($label.hasClass("ascending") ? "d" : "a"));
+ event.preventDefault();
});
$date
- .attr("href", "#!/sort=da")
.prepend($ascending.clone()).prepend($descending.clone())
- .click(function () {
+ .click(function (event) {
sortBy("d" + ($date.hasClass("ascending") ? "d" : "a"));
+ event.preventDefault();
});
$size
- .attr("href", "#!/sort=sa")
.prepend($ascending.clone()).prepend($descending.clone())
- .click(function () {
+ .click(function (event) {
sortBy("s" + ($size.hasClass("ascending") ? "d" : "a"));
+ event.preventDefault();
});
};