summaryrefslogtreecommitdiff
path: root/static/js/menu.js
diff options
context:
space:
mode:
authoruser@node5.net <user@node5.net>2026-04-14 22:17:33 +0200
committeruser@node5.net <user@node5.net>2026-04-14 22:17:33 +0200
commit7fe279ada3c9a23d78e882b76bd95ef774b43a8e (patch)
treeff46b0e7ce56db3abb98e6c32578c7bb26a45886 /static/js/menu.js
parent029671f77da344a1326e413e93939574eae4f891 (diff)
parent9b01d51a610a26141ef0f21d1b61c681d46d2426 (diff)
merge upstream main 2026-04-14 onto map libremaplibre
some functionalities still broken
Diffstat (limited to 'static/js/menu.js')
-rw-r--r--static/js/menu.js157
1 files changed, 157 insertions, 0 deletions
diff --git a/static/js/menu.js b/static/js/menu.js
new file mode 100644
index 0000000..7e8b29a
--- /dev/null
+++ b/static/js/menu.js
@@ -0,0 +1,157 @@
+/*function toggleNav() {
+ var x = document.getElementById("navlinks");
+ if (x.style.display === "block") {
+ x.style.display = "none";
+ } else {
+ x.style.display = "block";
+ }
+}*/
+
+function toggleNav() {
+ const menu = document.getElementById("navlinks");
+ menu.classList.toggle("open");
+}
+
+function removeDiacritics(str) {
+ return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
+}
+
+function searchList() {
+ var input, filter, ul, li, a, i, txtValue;
+ input = document.getElementById("search");
+ input.focus({ preventScroll: true });
+ filter = input.value.toUpperCase();
+ filter = removeDiacritics(input.value.toUpperCase());
+ ul = document.getElementById("links");
+ li = ul.getElementsByTagName("li")
+ for (i = 0; i < li.length; i++) {
+ a = li[i].getElementsByTagName("a")[0];
+ txtValue = a.textContent || a.innerText;
+ if (txtValue.toUpperCase().indexOf(filter) > -1) {
+ li[i].style.display = "";
+ } else {
+ li[i].style.display = "none";
+ }
+ }
+}
+
+function scrollSearch() {
+ var input;
+ input = document.getElementById("search");
+ input.addEventListener("click", () => {
+ document.getElementById("search").scrollIntoView({
+ behavior: "smooth",
+ block: "start"
+ });
+ });
+}
+
+function handleFocus() {
+ var input;
+ input = document.getElementById("search");
+ setTimeout(() => {
+ input.scrollIntoView({
+ behavior: "smooth",
+ block: "start"
+ });
+ }, 300);
+}
+
+function sortByName() {
+ const ul = document.getElementById("links");
+ const items = Array.from(ul.querySelectorAll("li"));
+
+ items.sort((a, b) => {
+ const textA = a.textContent.toLowerCase();
+ const textB = b.textContent.toLowerCase();
+ return textA.localeCompare(textB);
+ });
+
+ items.forEach(li => ul.appendChild(li));
+}
+
+function sortByDate() {
+ const ul = document.getElementById("links");
+ const items = Array.from(ul.querySelectorAll("li"));
+
+ items.sort((a, b) => {
+ const dateA = new Date(a.dataset.date);
+ const dateB = new Date(b.dataset.date);
+ return dateB - dateA; // newest first
+ });
+
+ items.forEach(li => ul.appendChild(li));
+}
+
+function sortList() {
+ const ul = document.getElementById("links");
+ const items = Array.from(ul.querySelectorAll("li"));
+ const sortType = document.getElementById("sortSelect").value;
+
+ items.sort((a, b) => {
+ const nameA = a.textContent.trim().toLowerCase();
+ const nameB = b.textContent.trim().toLowerCase();
+
+ const dateA = new Date(a.dataset.date);
+ const dateB = new Date(b.dataset.date);
+
+ switch (sortType) {
+
+ case "az":
+ return compareDanish(nameA, nameB);
+
+ case "za":
+ return compareDanish(nameB, nameA);
+
+ case "newest":
+ return dateB - dateA;
+
+ case "oldest":
+ return dateA - dateB;
+
+ default:
+ return 0;
+ }
+ });
+
+ items.forEach(li => ul.appendChild(li));
+}
+
+function normalizeDanish(str) {
+ return str
+ .toLowerCase()
+ .replace(/aa/g, "az"); // push "aa" BEFORE æ/ø/å
+}
+
+function customSortKey(str) {
+ return str
+ .toLowerCase()
+ .replace(/æ/g, "{")
+ .replace(/ø/g, "|")
+ .replace(/å/g, "}");
+}
+
+function compareDanish(a, b) {
+ const keyA = customSortKey(a);
+ const keyB = customSortKey(b);
+
+ if (keyA < keyB) return -1;
+ if (keyA > keyB) return 1;
+ return 0;
+}
+
+function formatRelativeDate(dateString) {
+ const inputDate = new Date(dateString);
+ const now = new Date();
+
+ const diffMs = now - inputDate;
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
+
+ if (diffDays === 0) return "Today";
+ if (diffDays === 1) return "Yesterday";
+ if (diffDays < 7) return `${diffDays} days ago`;
+ if (diffDays < 30) return `${Math.floor(diffDays / 7)} weeks ago`;
+ if (diffDays < 365) return `${Math.floor(diffDays / 30)} months ago`;
+
+ return `${Math.floor(diffDays / 365)} years ago`;
+}