This commit introduces functionality to display the store's open/closed status based on a schedule, with an override mechanism for holidays or emergencies. Changes include: - : Added IDs to hours paragraphs for easier manipulation. - : Refactored to be more robust and moved its logic to to prevent race conditions. Removed for status updates from . Fixed lightbox navigation. - : Added (boolean) and (string) fields to allow overriding the default status. - : Consolidated all status logic. It now acts as a gatekeeper: - If in is , it displays and ensures hours are visible. - If is , it runs the scheduled open/closed logic (originally from ) and updates the status every minute, ensuring hours are always visible. - : Reverted accidental changes and ensured only necessary status-related styles were added. This ensures: - The store's current open/closed status is always displayed. - An override message can be shown for special closures. - Store hours are always visible.
214 lines
7.5 KiB
JavaScript
214 lines
7.5 KiB
JavaScript
let statusInterval;
|
|
|
|
// Mobile NavBar
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
|
|
// Get all "navbar-burger" elements
|
|
const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);
|
|
|
|
// Add a click event on each of them
|
|
$navbarBurgers.forEach( el => {
|
|
el.addEventListener('click', () => {
|
|
|
|
// Get the target from the "data-target" attribute
|
|
const target = el.dataset.target;
|
|
const $target = document.getElementById(target);
|
|
|
|
// Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
|
|
el.classList.toggle('is-active');
|
|
$target.classList.toggle('is-active');
|
|
|
|
});
|
|
});
|
|
|
|
});
|
|
|
|
// Footer copyright date
|
|
const copyDate = ( () => {
|
|
let date = new Date();
|
|
document.getElementById("year").innerHTML = " " + date.getFullYear() + " ";
|
|
} );
|
|
copyDate();
|
|
document.addEventListener("load", function () {
|
|
// Your code goes here
|
|
document.querySelectorAll("formFooter").style.display = "none";
|
|
});
|
|
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
// Close lightbox when clicking outside the image
|
|
document.querySelectorAll(".lightbox").forEach(function (lightbox) {
|
|
lightbox.addEventListener("click", function (event) {
|
|
if (event.target === lightbox) {
|
|
window.location.hash = ""; // Close lightbox
|
|
}
|
|
});
|
|
});
|
|
|
|
// Close lightbox when pressing Escape key
|
|
document.addEventListener("keydown", function (event) {
|
|
if (event.key === "Escape") {
|
|
window.location.hash = ""; // Close lightbox
|
|
}
|
|
});
|
|
});
|
|
|
|
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
let images = Array.from(document.querySelectorAll(".gallery-item a"));
|
|
let lightboxImages = images.map(img => img.getAttribute("href"));
|
|
let currentIndex = 0;
|
|
|
|
function openLightbox(index) {
|
|
currentIndex = index;
|
|
let lightbox = document.getElementById("lightbox");
|
|
if (!lightbox) {
|
|
lightbox = document.createElement("div");
|
|
lightbox.id = "lightbox";
|
|
lightbox.className = "lightbox";
|
|
lightbox.innerHTML = `
|
|
<a href="#" class="close">×</a>
|
|
<a href="#" class="prev">‹</a>
|
|
<a href="#" class="next">›</a>
|
|
<img id="lightbox-img" src="" alt="">
|
|
<p id="lightbox-caption" class="caption" style="color: white; text-align: center; margin-top: 10px;"></p>
|
|
`;
|
|
document.body.appendChild(lightbox);
|
|
}
|
|
|
|
// Ensure the close button listener is always attached when lightbox is opened
|
|
document.querySelector(".lightbox .close").addEventListener("click", function(event) {
|
|
event.preventDefault();
|
|
document.getElementById("lightbox").style.display = "none";
|
|
});
|
|
|
|
let lightboxImg = document.getElementById("lightbox-img");
|
|
let lightboxCaption = document.getElementById("lightbox-caption");
|
|
let caption = images[currentIndex].parentElement.querySelector(".caption").textContent;
|
|
|
|
lightboxImg.src = images[currentIndex].querySelector("img").src;
|
|
lightboxCaption.textContent = caption;
|
|
lightbox.style.display = "flex";
|
|
|
|
document.querySelector(".lightbox .prev").onclick = () => navigateLightbox(-1);
|
|
document.querySelector(".lightbox .next").onclick = () => navigateLightbox(1);
|
|
}
|
|
|
|
function navigateLightbox(direction) {
|
|
currentIndex += direction;
|
|
if (currentIndex < 0) currentIndex = images.length - 1;
|
|
if (currentIndex >= images.length) currentIndex = 0;
|
|
|
|
let lightboxImg = document.getElementById("lightbox-img");
|
|
let lightboxCaption = document.getElementById("lightbox-caption");
|
|
|
|
lightboxImg.src = images[currentIndex].querySelector("img").src;
|
|
lightboxCaption.textContent = images[currentIndex].parentElement.querySelector(".caption").textContent;
|
|
}
|
|
|
|
// Open lightbox when clicking a thumbnail
|
|
images.forEach((img, index) => {
|
|
img.addEventListener("click", (event) => {
|
|
event.preventDefault();
|
|
openLightbox(index);
|
|
});
|
|
});
|
|
|
|
// Close lightbox when clicking outside the image
|
|
document.addEventListener("click", (event) => {
|
|
if (event.target.classList.contains("lightbox")) {
|
|
document.getElementById("lightbox").style.display = "none";
|
|
}
|
|
});
|
|
|
|
// Close lightbox with Escape key, navigate with Left/Right arrows
|
|
document.addEventListener("keydown", (event) => {
|
|
if (event.key === "Escape") {
|
|
document.getElementById("lightbox").style.display = "none";
|
|
} else if (event.key === "ArrowRight") {
|
|
navigateLightbox(1);
|
|
} else if (event.key === "ArrowLeft") {
|
|
navigateLightbox(-1);
|
|
}
|
|
});
|
|
|
|
document.querySelector(".lightbox .close").addEventListener("click", function(event) {
|
|
event.preventDefault();
|
|
document.querySelector(".lightbox").style.display = "none";
|
|
});
|
|
|
|
|
|
// Swipe gestures for mobile
|
|
let touchStartX = 0;
|
|
let touchEndX = 0;
|
|
|
|
document.addEventListener("touchstart", (event) => {
|
|
touchStartX = event.changedTouches[0].screenX;
|
|
});
|
|
|
|
document.addEventListener("touchend", (event) => {
|
|
touchEndX = event.changedTouches[0].screenX;
|
|
handleSwipe();
|
|
});
|
|
|
|
function handleSwipe() {
|
|
let swipeDistance = touchStartX - touchEndX;
|
|
if (swipeDistance > 50) {
|
|
navigateLightbox(1); // Swipe left → Next image
|
|
} else if (swipeDistance < -50) {
|
|
navigateLightbox(-1); // Swipe right → Previous image
|
|
}
|
|
}
|
|
});
|
|
|
|
|
|
// Get the button:
|
|
let mybutton = document.getElementById("top");
|
|
|
|
// When the user scrolls down 20px from the top of the document, show the button
|
|
window.onscroll = function() {scrollFunction()};
|
|
|
|
function scrollFunction() {
|
|
if (document.body.scrollTop > 130 || document.documentElement.scrollTop > 130) {
|
|
mybutton.style.display = "block";
|
|
} else {
|
|
mybutton.style.display = "none";
|
|
}
|
|
}
|
|
|
|
// When the user clicks on the button, scroll to the top of the document
|
|
function topFunction() {
|
|
document.body.scrollTop = 0; // For Safari
|
|
document.documentElement.scrollTop = 0; // For Chrome, Firefox, IE, and Opera
|
|
}
|
|
|
|
// The open/closed sign function is now in update.js
|
|
|
|
function injectPlausibleScript() {
|
|
const plausibleDomain = "beachpartyballoons.com";
|
|
const scriptUrl = "https://metrics.beachpartyballoons.com/js/script.hash.outbound-links.js";
|
|
|
|
// Create the main script element
|
|
const script = document.createElement('script');
|
|
script.setAttribute('defer', '');
|
|
script.setAttribute('data-domain', plausibleDomain);
|
|
script.setAttribute('src', scriptUrl);
|
|
|
|
// Create the global plausible function snippet
|
|
const functionScript = document.createElement('script');
|
|
const functionContent = `
|
|
window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments) };
|
|
`;
|
|
functionScript.textContent = functionContent;
|
|
|
|
// Append both scripts to the document's <head>
|
|
document.head.appendChild(script);
|
|
document.head.appendChild(functionScript);
|
|
|
|
console.log('Plausible script and function have been injected into the head.');
|
|
}
|
|
|
|
// Run the function when the DOM is ready.
|
|
document.addEventListener('DOMContentLoaded', injectPlausibleScript);
|