/** * Work Samples — cinematic Vimeo lightbox (Bootstrap modal, Portal 9). */ (function () { "use strict"; function normalizeSrc(src) { if (!src) { return ""; } return src.replace(/([?&])autoplay=1(&|$)/, "$1").replace(/[?&]$/, ""); } function init() { var modalEl = document.getElementById("workSamplesVideoModal"); if (!modalEl || typeof bootstrap === "undefined") { return; } if (modalEl.parentElement !== document.body) { document.body.appendChild(modalEl); } var modal = bootstrap.Modal.getOrCreateInstance(modalEl, { backdrop: true, keyboard: true, focus: true, }); var frameEl = document.getElementById("workSamplesVideoFrame"); var titleEl = document.getElementById("workSamplesVideoModalLabel"); var activeSrc = ""; function withAutoplay(src) { if (!src) { return ""; } if (src.indexOf("autoplay=1") !== -1) { return src; } return src + (src.indexOf("?") === -1 ? "?" : "&") + "autoplay=1"; } function readTrigger(trigger) { return { src: trigger.getAttribute("data-video-src") || "", title: trigger.getAttribute("data-video-title") || "Commercial video", }; } function loadVideo(data) { activeSrc = normalizeSrc(data.src); if (titleEl) { titleEl.textContent = data.title; } if (frameEl) { frameEl.src = withAutoplay(data.src); frameEl.title = data.title; } } function clearVideo() { activeSrc = ""; if (frameEl) { frameEl.removeAttribute("src"); } } function cleanupModalState() { document.body.classList.remove("modal-open"); document.body.style.removeProperty("overflow"); document.body.style.removeProperty("padding-right"); document.querySelectorAll(".modal-backdrop").forEach(function (backdrop) { backdrop.remove(); }); clearVideo(); } modalEl.addEventListener("show.bs.modal", function (event) { var trigger = event.relatedTarget; if (!trigger || !trigger.hasAttribute("data-video-src")) { return; } loadVideo(readTrigger(trigger)); }); modalEl.addEventListener("hidden.bs.modal", cleanupModalState); document.querySelectorAll(".work-samples-video-trigger").forEach(function (trigger) { trigger.addEventListener("click", function (event) { var nextSrc = normalizeSrc(trigger.getAttribute("data-video-src") || ""); if (!nextSrc) { return; } if (modalEl.classList.contains("show") && activeSrc && activeSrc === nextSrc) { event.preventDefault(); event.stopImmediatePropagation(); modal.hide(); } }); }); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); } })();