Files
jasoneugenegarrison.com/site.js
T

105 lines
3.0 KiB
JavaScript

(function () {
const root = document.documentElement;
const toggleButton = document.getElementById("theme-toggle");
const toggleIcon = toggleButton ? toggleButton.querySelector("i") : null;
const storage = {
get(key) {
try {
return window.localStorage.getItem(key);
} catch (error) {
return null;
}
},
set(key, value) {
try {
window.localStorage.setItem(key, value);
} catch (error) {
return false;
}
return true;
}
};
const setTheme = (theme) => {
const isDark = theme === "dark";
if (isDark) {
root.setAttribute("data-theme", "dark");
} else {
root.removeAttribute("data-theme");
}
if (toggleIcon) {
toggleIcon.classList.toggle("fa-sun", isDark);
toggleIcon.classList.toggle("fa-moon", !isDark);
}
if (toggleButton) {
toggleButton.setAttribute("aria-pressed", String(isDark));
toggleButton.title = isDark ? "Switch to light theme" : "Switch to dark theme";
}
};
const savedTheme = storage.get("theme") || "light";
setTheme(savedTheme);
if (toggleButton) {
toggleButton.addEventListener("click", () => {
const nextTheme = root.hasAttribute("data-theme") ? "light" : "dark";
setTheme(nextTheme);
storage.set("theme", nextTheme);
});
}
const printButton = document.getElementById("print-resume");
if (printButton) {
printButton.addEventListener("click", () => window.print());
}
const contactKey = 43;
const contactValues = {
email: [65, 74, 88, 68, 69, 78, 94, 76, 78, 69, 78, 76, 74, 89, 89, 66, 88, 68, 69, 107, 66, 72, 71, 68, 94, 79, 5, 72, 68, 70],
ky: [3, 25, 28, 27, 2, 11, 19, 19, 18, 6, 19, 27, 28, 25],
tn: [3, 19, 29, 30, 2, 11, 18, 19, 30, 6, 26, 29, 31, 26]
};
const revealContact = (contactType) => {
const encoded = contactValues[contactType];
if (!encoded) {
return "";
}
return encoded.map((code) => String.fromCharCode(code ^ contactKey)).join("");
};
const revealButtonContact = (button) => {
const contactType = button.dataset.contact;
const value = revealContact(contactType);
if (!value) {
return;
}
const href = contactType === "email"
? `mailto:${value}`
: `tel:${value.replace(/\D/g, "")}`;
const link = document.createElement("a");
link.href = href;
link.rel = "nofollow";
link.textContent = value;
button.replaceWith(link);
};
document.querySelectorAll("[data-contact]").forEach((button) => {
button.addEventListener("click", () => revealButtonContact(button));
});
window.addEventListener("beforeprint", () => {
document.querySelectorAll("[data-contact]").forEach(revealButtonContact);
});
})();