blob: 2e6a436a0a971b4ad3d701b0aa8012590019a027 [file] [log] [blame]
let mouseOverEnabled = true;
function handleImageChange(imageURL, index, factTitle) {
const factImage = document.getElementById("factImage");
if (factImage.src.endsWith(imageURL)) {
return;
};
highlightFact(index);
factImage.classList.add("fade-out");
setTimeout(() => {
factImage.src = imageURL;
factImage.alt = factTitle;
factImage.classList.remove("fade-out");
}, 300);
};
function highlightFact(index) {
const facts = document.querySelectorAll(".facts");
facts.forEach((fact, i) => {
if (i === index) {
fact.classList.add("active-fact");
} else {
fact.classList.remove("active-fact");
};
});
};
function handleMouseover(imageURL, index, factTitle) {
if (!mouseOverEnabled) {
return;
};
handleImageChange(imageURL, index, factTitle);
};
let scrollTimeout;
let mouseoverTimeout;
function delayScroll(func, delay) {
return function (...args) {
clearTimeout(scrollTimeout);
scrollTimeout = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}
function delayMouseoverEnable(delay) {
clearTimeout(mouseoverTimeout);
mouseoverTimeout = setTimeout(() => {
mouseOverEnabled = true;
}, delay);
}
let lastScrollTop = 0;
function getFirstVisibleFact() {
const facts = document.querySelectorAll(".facts");
const factImage = document.getElementById("factImageBox");
const imageBottom = factImage.getBoundingClientRect().bottom;
const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
const isScrollingDown = scrollTop > lastScrollTop;
lastScrollTop = scrollTop;
if (isScrollingDown) {
for (let i = 0; i < facts.length; i++) {
const rect = facts[i].getBoundingClientRect();
if (rect.top < window.innerHeight && rect.top >= imageBottom) {
return i;
};
};
return 7;
} else {
for (let i = 0; i < facts.length; i++) {
const rect = facts[i].getBoundingClientRect();
if (rect.top >= 0 && rect.top >= imageBottom) {
return i;
};
};
};
return 0;
};
document.addEventListener("DOMContentLoaded", function () {
const gridContainer = document.querySelector(".grid-container");
const facts = JSON.parse(gridContainer.dataset.facts);
const handleScroll = () => {
clearTimeout(scrollTimeout);
mouseOverEnabled = false;
scrollTimeout = setTimeout(() => {
const currentSection = getFirstVisibleFact();
handleImageChange(facts[currentSection].params.image, currentSection, facts[currentSection].params.title);
delayMouseoverEnable(800);
}, 300);
};
const checkAddRemoveScrollListener = () => {
if (window.innerWidth <= 768) {
window.addEventListener("scroll", handleScroll);
} else {
window.removeEventListener("scroll", handleScroll);
}
};
checkAddRemoveScrollListener();
window.addEventListener("resize", checkAddRemoveScrollListener);
});