function countDownIni(countdown) {
$(countdown).each(function () {
var countdown2 = $(this), promoperiod;
countdown2.attr("data-promoperiod") ? promoperiod = new Date().getTime() + parseInt(countdown2.attr("data-promoperiod"), 10) : countdown2.attr("data-countdown") && (promoperiod = countdown2.attr("data-countdown")), Date.parse(promoperiod) - Date.parse(new Date) > 0 && ($(this).addClass("countdown-block"), $(this).countdown(promoperiod, function (event) {
countdown2.html(event.strftime('%DDays%HHour%MMin%SSec'))
}))
})
}
countDownIni(".flip-countdown,.js-flip-countdown");
function offerclockIni(countdown) {
$(countdown).each(function () {
var countdown2 = $(this), promoperiod;
countdown2.attr("data-promoperiod") ? promoperiod = new Date().getTime() + parseInt(countdown2.attr("data-promoperiod"), 10) : countdown2.attr("data-countdown") && (promoperiod = countdown2.attr("data-countdown")), Date.parse(promoperiod) - Date.parse(new Date) > 0 && ($(this).addClass("offerclock-block"), $(this).countdown(promoperiod, function (event) {
countdown2.html(event.strftime('%DDays%HHour%MMin%SSec'))
}))
})
}
offerclockIni(".offerclock,.js-offerclock"), $(document).ready(function () {
$(".btn-group").each(function () {
var active, content, links = $(this).find("a");
active = links.first().addClass("active"), content = $(active.attr("href")), links.not(":first").each(function () {
$($(this).attr("href")).hide()
}), $(this).find("a").click(function (e) {
return active.removeClass("active"), content.hide(), active = $(this), content = $($(this).attr("href")), active.addClass("active"), content.show(), !1
})
})
}), $(document).ready(function () {
$("#col_1").click(function (event) {
event.preventDefault(), $("#product-grid .grid__item").removeClass(""), $("#product-grid .grid__item").addClass("list-group-item")
}), $("#col_2").click(function (event) {
event.preventDefault(), $("#product-grid .grid__item").removeClass("list-group-item"), $("#product-grid .grid__item").addClass("")
})
}), $(".ttloader").addClass("hide-loader"), $(window).scroll(function () {
$(this).scrollTop() > 500 ? $(".top_button").fadeIn(500) : $(".top_button").fadeOut(500)
}), $(".top_button").click(function (event) {
event.preventDefault(), $("html, body").animate({scrollTop: 0}, 800)
});
function getFocusableElements(container) {
return Array.from(container.querySelectorAll("summary, a[href], button:enabled, [tabindex]:not([tabindex^='-']), [draggable], area, input:not([type=hidden]):enabled, select:enabled, textarea:enabled, object, iframe"))
}
document.querySelectorAll('[id^="Details-"] summary').forEach(summary => {
summary.setAttribute("role", "button"), summary.setAttribute("aria-expanded", summary.parentNode.hasAttribute("open")), summary.nextElementSibling.getAttribute("id") && summary.setAttribute("aria-controls", summary.nextElementSibling.id), summary.addEventListener("click", event => {
event.currentTarget.setAttribute("aria-expanded", !event.currentTarget.closest("details").hasAttribute("open"))
}), !summary.closest("header-drawer") && summary.parentElement.addEventListener("keyup", onKeyUpEscape)
});
const trapFocusHandlers = {};
function trapFocus(container, elementToFocus = container) {
var elements = getFocusableElements(container), first = elements[0], last = elements[elements.length - 1];
removeTrapFocus(), trapFocusHandlers.focusin = event => {
event.target !== container && event.target !== last && event.target !== first || document.addEventListener("keydown", trapFocusHandlers.keydown)
}, trapFocusHandlers.focusout = function () {
document.removeEventListener("keydown", trapFocusHandlers.keydown)
}, trapFocusHandlers.keydown = function (event) {
event.code.toUpperCase() === "TAB" && (event.target === last && !event.shiftKey && (event.preventDefault(), first.focus()), (event.target === container || event.target === first) && event.shiftKey && (event.preventDefault(), last.focus()))
}, document.addEventListener("focusout", trapFocusHandlers.focusout), document.addEventListener("focusin", trapFocusHandlers.focusin), elementToFocus.focus(), elementToFocus.tagName === "INPUT" && ["search", "text", "email", "url"].includes(elementToFocus.type) && elementToFocus.value && elementToFocus.setSelectionRange(0, elementToFocus.value.length)
}
try {
document.querySelector(":focus-visible")
} catch {
focusVisiblePolyfill()
}
function focusVisiblePolyfill() {
const navKeys = ["ARROWUP", "ARROWDOWN", "ARROWLEFT", "ARROWRIGHT", "TAB", "ENTER", "SPACE", "ESCAPE", "HOME", "END", "PAGEUP", "PAGEDOWN"];
let currentFocusedElement = null, mouseClick = null;
window.addEventListener("keydown", event => {
navKeys.includes(event.code.toUpperCase()) && (mouseClick = !1)
}), window.addEventListener("mousedown", event => {
mouseClick = !0
}), window.addEventListener("focus", () => {
currentFocusedElement && currentFocusedElement.classList.remove("focused"), !mouseClick && (currentFocusedElement = document.activeElement, currentFocusedElement.classList.add("focused"))
}, !0)
}
function pauseAllMedia() {
document.querySelectorAll(".js-youtube").forEach(video => {
video.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}', "*")
}), document.querySelectorAll(".js-vimeo").forEach(video => {
video.contentWindow.postMessage('{"method":"pause"}', "*")
}), document.querySelectorAll("video").forEach(video => video.pause()), document.querySelectorAll("product-model").forEach(model => {
model.modelViewerUI && model.modelViewerUI.pause()
})
}
function removeTrapFocus(elementToFocus = null) {
document.removeEventListener("focusin", trapFocusHandlers.focusin), document.removeEventListener("focusout", trapFocusHandlers.focusout), document.removeEventListener("keydown", trapFocusHandlers.keydown), elementToFocus && elementToFocus.focus()
}
function onKeyUpEscape(event) {
if (event.code.toUpperCase() !== "ESCAPE") return;
const openDetailsElement = event.target.closest("details[open]");
if (!openDetailsElement) return;
const summaryElement = openDetailsElement.querySelector("summary");
openDetailsElement.removeAttribute("open"), summaryElement.setAttribute("aria-expanded", !1), summaryElement.focus()
}
class QuantityInput extends HTMLElement {
constructor() {
super(), this.input = this.querySelector("input"), this.changeEvent = new Event("change", {bubbles: !0}), this.input.addEventListener("change", this.onInputChange.bind(this)), this.querySelectorAll("button").forEach(button => button.addEventListener("click", this.onButtonClick.bind(this)))
}
quantityUpdateUnsubscriber = void 0;
connectedCallback() {
this.validateQtyRules(), this.quantityUpdateUnsubscriber = subscribe(PUB_SUB_EVENTS.quantityUpdate, this.validateQtyRules.bind(this))
}
disconnectedCallback() {
this.quantityUpdateUnsubscriber && this.quantityUpdateUnsubscriber()
}
onInputChange(event) {
this.validateQtyRules()
}
onButtonClick(event) {
event.preventDefault();
const previousValue = this.input.value;
event.target.name === "plus" ? this.input.stepUp() : this.input.stepDown(), previousValue !== this.input.value && this.input.dispatchEvent(this.changeEvent)
}
validateQtyRules() {
const value = parseInt(this.input.value);
if (this.input.min) {
const min = parseInt(this.input.min);
this.querySelector(".quantity__button[name='minus']").classList.toggle("disabled", value <= min)
}
if (this.input.max) {
const max = parseInt(this.input.max);
this.querySelector(".quantity__button[name='plus']").classList.toggle("disabled", value >= max)
}
}
}
customElements.define("quantity-input", QuantityInput);
function debounce(fn, wait) {
let t;
return (...args) => {
clearTimeout(t), t = setTimeout(() => fn.apply(this, args), wait)
}
}
function fetchConfig(type = "json") {
return {method: "POST", headers: {"Content-Type": "application/json", Accept: `application/${type}`}}
}
typeof window.Shopify > "u" && (window.Shopify = {}), Shopify.bind = function (fn, scope) {
return function () {
return fn.apply(scope, arguments)
}
}, Shopify.setSelectorByValue = function (selector, value) {
for (var i = 0, count = selector.options.length; i < count; i++) {
var option = selector.options[i];
if (value == option.value || value == option.innerHTML) return selector.selectedIndex = i, i
}
}, Shopify.addListener = function (target, eventName, callback) {
target.addEventListener ? target.addEventListener(eventName, callback, !1) : target.attachEvent("on" + eventName, callback)
}, Shopify.postLink = function (path, options) {
options = options || {};
var method = options.method || "post", params = options.parameters || {}, form = document.createElement("form");
form.setAttribute("method", method), form.setAttribute("action", path);
for (var key in params) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden"), hiddenField.setAttribute("name", key), hiddenField.setAttribute("value", params[key]), form.appendChild(hiddenField)
}
document.body.appendChild(form), form.submit(), document.body.removeChild(form)
}, Shopify.CountryProvinceSelector = function (country_domid, province_domid, options) {
this.countryEl = document.getElementById(country_domid), this.provinceEl = document.getElementById(province_domid), this.provinceContainer = document.getElementById(options.hideElement || province_domid), Shopify.addListener(this.countryEl, "change", Shopify.bind(this.countryHandler, this)), this.initCountry(), this.initProvince()
}, Shopify.CountryProvinceSelector.prototype = {
initCountry: function () {
var value = this.countryEl.getAttribute("data-default");
Shopify.setSelectorByValue(this.countryEl, value), this.countryHandler()
}, initProvince: function () {
var value = this.provinceEl.getAttribute("data-default");
value && this.provinceEl.options.length > 0 && Shopify.setSelectorByValue(this.provinceEl, value)
}, countryHandler: function (e) {
var opt = this.countryEl.options[this.countryEl.selectedIndex], raw = opt.getAttribute("data-provinces"),
provinces = JSON.parse(raw);
if (this.clearOptions(this.provinceEl), provinces && provinces.length == 0) this.provinceContainer.style.display = "none"; else {
for (var i = 0; i < provinces.length; i++) {
var opt = document.createElement("option");
opt.value = provinces[i][0], opt.innerHTML = provinces[i][1], this.provinceEl.appendChild(opt)
}
this.provinceContainer.style.display = ""
}
}, clearOptions: function (selector) {
for (; selector.firstChild;) selector.removeChild(selector.firstChild)
}, setOptions: function (selector, values) {
for (var i = 0, count = values.length; i < values.length; i++) {
var opt = document.createElement("option");
opt.value = values[i], opt.innerHTML = values[i], selector.appendChild(opt)
}
}
};
class MenuDrawer extends HTMLElement {
constructor() {
super(), this.mainDetailsToggle = this.querySelector("details"), this.addEventListener("keyup", this.onKeyUp.bind(this)), this.addEventListener("focusout", this.onFocusOut.bind(this)), this.bindEvents()
}
bindEvents() {
this.querySelectorAll("summary").forEach(summary => summary.addEventListener("click", this.onSummaryClick.bind(this))), this.querySelectorAll("button:not(.localization-selector)").forEach(button => button.addEventListener("click", this.onCloseButtonClick.bind(this)))
}
onKeyUp(event) {
if (event.code.toUpperCase() !== "ESCAPE") return;
const openDetailsElement = event.target.closest("details[open]");
openDetailsElement && (openDetailsElement === this.mainDetailsToggle ? this.closeMenuDrawer(event, this.mainDetailsToggle.querySelector("summary")) : this.closeSubmenu(openDetailsElement))
}
onSummaryClick(event) {
const summaryElement = event.currentTarget, detailsElement = summaryElement.parentNode,
parentMenuElement = detailsElement.closest(".has-submenu"), isOpen = detailsElement.hasAttribute("open"),
reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)");
function addTrapFocus() {
trapFocus(summaryElement.nextElementSibling, detailsElement.querySelector("button")), summaryElement.nextElementSibling.removeEventListener("transitionend", addTrapFocus)
}
detailsElement === this.mainDetailsToggle ? (isOpen && event.preventDefault(), isOpen ? this.closeMenuDrawer(event, summaryElement) : this.openMenuDrawer(summaryElement), window.matchMedia("(max-width: 990px)") && document.documentElement.style.setProperty("--viewport-height", `${window.innerHeight}px`)) : setTimeout(() => {
detailsElement.classList.add("menu-opening"), summaryElement.setAttribute("aria-expanded", !0), parentMenuElement && parentMenuElement.classList.add("submenu-open"), !reducedMotion || reducedMotion.matches ? addTrapFocus() : summaryElement.nextElementSibling.addEventListener("transitionend", addTrapFocus)
}, 100)
}
openMenuDrawer(summaryElement) {
setTimeout(() => {
this.mainDetailsToggle.classList.add("menu-opening")
}), summaryElement.setAttribute("aria-expanded", !0), trapFocus(this.mainDetailsToggle, summaryElement), document.body.classList.add(`overflow-hidden-${this.dataset.breakpoint}`)
}
closeMenuDrawer(event, elementToFocus = !1) {
event !== void 0 && (this.mainDetailsToggle.classList.remove("menu-opening"), this.mainDetailsToggle.querySelectorAll("details").forEach(details => {
details.removeAttribute("open"), details.classList.remove("menu-opening")
}), this.mainDetailsToggle.querySelectorAll(".submenu-open").forEach(submenu => {
submenu.classList.remove("submenu-open")
}), document.body.classList.remove(`overflow-hidden-${this.dataset.breakpoint}`), removeTrapFocus(elementToFocus), this.closeAnimation(this.mainDetailsToggle))
}
onFocusOut() {
setTimeout(() => {
this.mainDetailsToggle.hasAttribute("open") && !this.mainDetailsToggle.contains(document.activeElement) && this.closeMenuDrawer()
})
}
onCloseButtonClick(event) {
const detailsElement = event.currentTarget.closest("details");
this.closeSubmenu(detailsElement)
}
closeSubmenu(detailsElement) {
const parentMenuElement = detailsElement.closest(".submenu-open");
parentMenuElement && parentMenuElement.classList.remove("submenu-open"), detailsElement.classList.remove("menu-opening"), detailsElement.querySelector("summary").setAttribute("aria-expanded", !1), removeTrapFocus(detailsElement.querySelector("summary")), this.closeAnimation(detailsElement)
}
closeAnimation(detailsElement) {
let animationStart;
const handleAnimation = time => {
animationStart === void 0 && (animationStart = time), time - animationStart < 400 ? window.requestAnimationFrame(handleAnimation) : (detailsElement.removeAttribute("open"), detailsElement.closest("details[open]") && trapFocus(detailsElement.closest("details[open]"), detailsElement.querySelector("summary")))
};
window.requestAnimationFrame(handleAnimation)
}
}
customElements.define("menu-drawer", MenuDrawer);
class HeaderDrawer extends MenuDrawer {
constructor() {
super()
}
openMenuDrawer(summaryElement) {
this.header = this.header || document.querySelector(".section-header"), this.borderOffset = this.borderOffset || this.closest(".header-wrapper").classList.contains("header-wrapper--border-bottom") ? 1 : 0, document.documentElement.style.setProperty("--header-bottom-position", `${parseInt(this.header.getBoundingClientRect().bottom - this.borderOffset)}px`), this.header.classList.add("menu-open"), setTimeout(() => {
this.mainDetailsToggle.classList.add("menu-opening")
}), summaryElement.setAttribute("aria-expanded", !0), window.addEventListener("resize", this.onResize), trapFocus(this.mainDetailsToggle, summaryElement), document.body.classList.add(`overflow-hidden-${this.dataset.breakpoint}`)
}
closeMenuDrawer(event, elementToFocus) {
elementToFocus && (super.closeMenuDrawer(event, elementToFocus), this.header.classList.remove("menu-open"), window.removeEventListener("resize", this.onResize))
}
onResize = () => {
this.header && document.documentElement.style.setProperty("--header-bottom-position", `${parseInt(this.header.getBoundingClientRect().bottom - this.borderOffset)}px`), document.documentElement.style.setProperty("--viewport-height", `${window.innerHeight}px`)
}
}
customElements.define("header-drawer", HeaderDrawer);
class ModalDialog extends HTMLElement {
constructor() {
super(), this.querySelector('[id^="ModalClose-"]').addEventListener("click", this.hide.bind(this, !1)), this.addEventListener("keyup", event => {
event.code.toUpperCase() === "ESCAPE" && this.hide()
}), this.classList.contains("media-modal") ? this.addEventListener("pointerup", event => {
event.pointerType === "mouse" && !event.target.closest("deferred-media, product-model") && this.hide()
}) : this.addEventListener("click", event => {
event.target === this && this.hide()
})
}
connectedCallback() {
this.moved || (this.moved = !0, document.body.appendChild(this))
}
show(opener) {
this.openedBy = opener;
const popup = this.querySelector(".template-popup");
document.body.classList.add("overflow-hidden"), this.setAttribute("open", ""), popup && popup.loadContent(), trapFocus(this, this.querySelector('[role="dialog"]')), window.pauseAllMedia()
}
hide() {
document.body.classList.remove("overflow-hidden"), document.body.dispatchEvent(new CustomEvent("modalClosed")), this.removeAttribute("open"), removeTrapFocus(this.openedBy), window.pauseAllMedia()
}
}
customElements.define("modal-dialog", ModalDialog);
class ModalOpener extends HTMLElement {
constructor() {
super();
const button = this.querySelector("button");
button && button.addEventListener("click", () => {
const modal = document.querySelector(this.getAttribute("data-modal"));
modal && modal.show(button)
})
}
}
customElements.define("modal-opener", ModalOpener);
class DeferredMedia extends HTMLElement {
constructor() {
super();
const poster = this.querySelector('[id^="Deferred-Poster-"]');
poster && poster.addEventListener("click", this.loadContent.bind(this))
}
loadContent(focus = !0) {
if (window.pauseAllMedia(), !this.getAttribute("loaded")) {
const content = document.createElement("div");
content.appendChild(this.querySelector("template").content.firstElementChild.cloneNode(!0)), this.setAttribute("loaded", !0);
const deferredElement = this.appendChild(content.querySelector("video, model-viewer, iframe"));
focus && deferredElement.focus(), deferredElement.nodeName == "VIDEO" && deferredElement.getAttribute("autoplay") && deferredElement.play()
}
}
}
customElements.define("deferred-media", DeferredMedia);
class SliderComponent extends HTMLElement {
constructor() {
if (super(), this.slider = this.querySelector('[id^="Slider-"]'), this.sliderItems = this.querySelectorAll('[id^="Slide-"]'), this.enableSliderLooping = !1, this.currentPageElement = this.querySelector(".slider-counter--current"), this.pageTotalElement = this.querySelector(".slider-counter--total"), this.prevButton = this.querySelector('button[name="previous"]'), this.nextButton = this.querySelector('button[name="next"]'), !this.slider || !this.nextButton) return;
this.initPages(), new ResizeObserver(entries => this.initPages()).observe(this.slider), this.slider.addEventListener("scroll", this.update.bind(this)), this.prevButton.addEventListener("click", this.onButtonClick.bind(this)), this.nextButton.addEventListener("click", this.onButtonClick.bind(this))
}
initPages() {
this.sliderItemsToShow = Array.from(this.sliderItems).filter(element => element.clientWidth > 0), !(this.sliderItemsToShow.length < 2) && (this.sliderItemOffset = this.sliderItemsToShow[1].offsetLeft - this.sliderItemsToShow[0].offsetLeft, this.slidesPerPage = Math.floor((this.slider.clientWidth - this.sliderItemsToShow[0].offsetLeft) / this.sliderItemOffset), this.totalPages = this.sliderItemsToShow.length - this.slidesPerPage + 1, this.update())
}
resetPages() {
this.sliderItems = this.querySelectorAll('[id^="Slide-"]'), this.initPages()
}
update() {
if (!this.slider || !this.nextButton) return;
const previousPage = this.currentPage;
this.currentPage = Math.round(this.slider.scrollLeft / this.sliderItemOffset) + 1, this.currentPageElement && this.pageTotalElement && (this.currentPageElement.textContent = this.currentPage, this.pageTotalElement.textContent = this.totalPages), this.currentPage != previousPage && this.dispatchEvent(new CustomEvent("slideChanged", {
detail: {
currentPage: this.currentPage,
currentElement: this.sliderItemsToShow[this.currentPage - 1]
}
})), !this.enableSliderLooping && (this.isSlideVisible(this.sliderItemsToShow[0]) && this.slider.scrollLeft === 0 ? this.prevButton.setAttribute("disabled", "disabled") : this.prevButton.removeAttribute("disabled"), this.isSlideVisible(this.sliderItemsToShow[this.sliderItemsToShow.length - 1]) ? this.nextButton.setAttribute("disabled", "disabled") : this.nextButton.removeAttribute("disabled"))
}
isSlideVisible(element, offset = 0) {
const lastVisibleSlide = this.slider.clientWidth + this.slider.scrollLeft - offset;
return element.offsetLeft + element.clientWidth <= lastVisibleSlide && element.offsetLeft >= this.slider.scrollLeft
}
onButtonClick(event) {
event.preventDefault();
const step = event.currentTarget.dataset.step || 1;
this.slideScrollPosition = event.currentTarget.name === "next" ? this.slider.scrollLeft + step * this.sliderItemOffset : this.slider.scrollLeft - step * this.sliderItemOffset, this.slider.scrollTo({left: this.slideScrollPosition})
}
}
customElements.define("slider-component", SliderComponent);
class SlideshowComponent extends SliderComponent {
constructor() {
super(), this.sliderControlWrapper = this.querySelector(".slider-buttons"), this.enableSliderLooping = !0, this.sliderControlWrapper && (this.sliderFirstItemNode = this.slider.querySelector(".slideshow__slide"), this.sliderItemsToShow.length > 0 && (this.currentPage = 1), this.sliderControlLinksArray = Array.from(this.sliderControlWrapper.querySelectorAll(".slider-counter__link")), this.sliderControlLinksArray.forEach(link => link.addEventListener("click", this.linkToSlide.bind(this))), this.slider.addEventListener("scroll", this.setSlideVisibility.bind(this)), this.setSlideVisibility(), this.slider.getAttribute("data-autoplay") === "true" && this.setAutoPlay())
}
setAutoPlay() {
this.sliderAutoplayButton = this.querySelector(".slideshow__autoplay"), this.autoplaySpeed = this.slider.dataset.speed * 1e3, this.sliderAutoplayButton.addEventListener("click", this.autoPlayToggle.bind(this)), this.addEventListener("mouseover", this.focusInHandling.bind(this)), this.addEventListener("mouseleave", this.focusOutHandling.bind(this)), this.addEventListener("focusin", this.focusInHandling.bind(this)), this.addEventListener("focusout", this.focusOutHandling.bind(this)), this.play(), this.autoplayButtonIsSetToPlay = !0
}
onButtonClick(event) {
super.onButtonClick(event);
const isFirstSlide = this.currentPage === 1, isLastSlide = this.currentPage === this.sliderItemsToShow.length;
!isFirstSlide && !isLastSlide || (isFirstSlide && event.currentTarget.name === "previous" ? this.slideScrollPosition = this.slider.scrollLeft + this.sliderFirstItemNode.clientWidth * this.sliderItemsToShow.length : isLastSlide && event.currentTarget.name === "next" && (this.slideScrollPosition = 0), this.slider.scrollTo({left: this.slideScrollPosition}))
}
update() {
super.update(), this.sliderControlButtons = this.querySelectorAll(".slider-counter__link"), this.prevButton.removeAttribute("disabled"), this.sliderControlButtons.length && (this.sliderControlButtons.forEach(link => {
link.classList.remove("slider-counter__link--active"), link.removeAttribute("aria-current")
}), this.sliderControlButtons[this.currentPage - 1].classList.add("slider-counter__link--active"), this.sliderControlButtons[this.currentPage - 1].setAttribute("aria-current", !0))
}
autoPlayToggle() {
this.togglePlayButtonState(this.autoplayButtonIsSetToPlay), this.autoplayButtonIsSetToPlay ? this.pause() : this.play(), this.autoplayButtonIsSetToPlay = !this.autoplayButtonIsSetToPlay
}
focusOutHandling(event) {
const focusedOnAutoplayButton = event.target === this.sliderAutoplayButton || this.sliderAutoplayButton.contains(event.target);
!this.autoplayButtonIsSetToPlay || focusedOnAutoplayButton || this.play()
}
focusInHandling(event) {
(event.target === this.sliderAutoplayButton || this.sliderAutoplayButton.contains(event.target)) && this.autoplayButtonIsSetToPlay ? this.play() : this.autoplayButtonIsSetToPlay && this.pause()
}
play() {
this.slider.setAttribute("aria-live", "off"), clearInterval(this.autoplay), this.autoplay = setInterval(this.autoRotateSlides.bind(this), this.autoplaySpeed)
}
pause() {
this.slider.setAttribute("aria-live", "polite"), clearInterval(this.autoplay)
}
togglePlayButtonState(pauseAutoplay) {
pauseAutoplay ? (this.sliderAutoplayButton.classList.add("slideshow__autoplay--paused"), this.sliderAutoplayButton.setAttribute("aria-label", window.accessibilityStrings.playSlideshow)) : (this.sliderAutoplayButton.classList.remove("slideshow__autoplay--paused"), this.sliderAutoplayButton.setAttribute("aria-label", window.accessibilityStrings.pauseSlideshow))
}
autoRotateSlides() {
const slideScrollPosition = this.currentPage === this.sliderItems.length ? 0 : this.slider.scrollLeft + this.slider.querySelector(".slideshow__slide").clientWidth;
this.slider.scrollTo({left: slideScrollPosition})
}
setSlideVisibility() {
this.sliderItemsToShow.forEach((item, index) => {
const linkElements = item.querySelectorAll("a");
index === this.currentPage - 1 ? (linkElements.length && linkElements.forEach(button => {
button.removeAttribute("tabindex")
}), item.setAttribute("aria-hidden", "false"), item.removeAttribute("tabindex")) : (linkElements.length && linkElements.forEach(button => {
button.setAttribute("tabindex", "-1")
}), item.setAttribute("aria-hidden", "true"), item.setAttribute("tabindex", "-1"))
})
}
linkToSlide(event) {
event.preventDefault();
const slideScrollPosition = this.slider.scrollLeft + this.sliderFirstItemNode.clientWidth * (this.sliderControlLinksArray.indexOf(event.currentTarget) + 1 - this.currentPage);
this.slider.scrollTo({left: slideScrollPosition})
}
}
customElements.define("slideshow-component", SlideshowComponent);
class VariantSelects extends HTMLElement {
constructor() {
super(), this.addEventListener("change", this.onVariantChange)
}
onVariantChange() {
this.updateOptions(), this.updateMasterId(), this.toggleAddButton(!0, "", !1), this.updatePickupAvailability(), this.updateSKU(), this.removeErrorMessage(), this.updateVariantStatuses(), this.currentVariant ? (this.updateMedia(), this.updateURL(), this.updateVariantInput(), this.renderProductInfo(), this.updateShareUrl()) : (this.toggleAddButton(!0, "", !0), this.setUnavailable())
}
updateOptions() {
this.options = Array.from(this.querySelectorAll("select"), select => select.value)
}
updateMasterId() {
this.currentVariant = this.getVariantData().find(variant => !variant.options.map((option, index) => this.options[index] === option).includes(!1))
}
updateMedia() {
if (!this.currentVariant || !this.currentVariant.featured_media) return;
document.querySelectorAll(`[id^="MediaGallery-${this.dataset.section}"]`).forEach(mediaGallery => mediaGallery.setActiveMedia(`${this.dataset.section}-${this.currentVariant.featured_media.id}`, !0));
const modalContent = document.querySelector(`#ProductModal-${this.dataset.section} .product-media-modal__content`);
if (!modalContent) return;
const newMediaModal = modalContent.querySelector(`[data-media-id="${this.currentVariant.featured_media.id}"]`);
modalContent.prepend(newMediaModal)
}
updateURL() {
!this.currentVariant || this.dataset.updateUrl === "false" || window.history.replaceState({}, "", `${this.dataset.url}?variant=${this.currentVariant.id}`)
}
updateShareUrl() {
const shareButton = document.getElementById(`Share-${this.dataset.section}`);
!shareButton || !shareButton.updateUrl || shareButton.updateUrl(`${window.shopUrl}${this.dataset.url}?variant=${this.currentVariant.id}`)
}
updateVariantInput() {
document.querySelectorAll(`#product-form-${this.dataset.section}, #product-form-installment-${this.dataset.section}`).forEach(productForm => {
const input = productForm.querySelector('input[name="id"]');
input.value = this.currentVariant.id, input.dispatchEvent(new Event("change", {bubbles: !0}))
})
}
updateVariantStatuses() {
const selectedOptionOneVariants = this.variantData.filter(variant => this.querySelector(":checked").value === variant.option1),
inputWrappers = [...this.querySelectorAll(".product-form__input")];
inputWrappers.forEach((option, index) => {
if (index === 0) return;
const optionInputs = [...option.querySelectorAll('input[type="radio"], option')],
previousOptionSelected = inputWrappers[index - 1].querySelector(":checked").value,
availableOptionInputsValue = selectedOptionOneVariants.filter(variant => variant.available && variant[`option${index}`] === previousOptionSelected).map(variantOption => variantOption[`option${index + 1}`]);
this.setInputAvailability(optionInputs, availableOptionInputsValue)
})
}
setInputAvailability(listOfOptions, listOfAvailableOptions) {
listOfOptions.forEach(input => {
listOfAvailableOptions.includes(input.getAttribute("value")) ? input.innerText = input.getAttribute("value") : input.innerText = window.variantStrings.unavailable_with_option.replace("[value]", input.getAttribute("value"))
})
}
updatePickupAvailability() {
const pickUpAvailability = document.querySelector("pickup-availability");
pickUpAvailability && (this.currentVariant && this.currentVariant.available ? pickUpAvailability.fetchAvailability(this.currentVariant.id) : (pickUpAvailability.removeAttribute("available"), pickUpAvailability.innerHTML = ""))
}
updateSKU() {
this.currentVariant.sku ? $(".js-variant-sku").html(this.currentVariant.sku) : $(".js-variant-sku").html("N/A")
}
removeErrorMessage() {
const section = this.closest("section");
if (!section) return;
const productForm = section.querySelector("product-form");
productForm && productForm.handleErrorMessage()
}
renderProductInfo() {
const requestedVariantId = this.currentVariant.id,
sectionId = this.dataset.originalSection ? this.dataset.originalSection : this.dataset.section;
fetch(`${this.dataset.url}?variant=${requestedVariantId}§ion_id=${this.dataset.originalSection ? this.dataset.originalSection : this.dataset.section}`).then(response => response.text()).then(responseText => {
if (this.currentVariant.id !== requestedVariantId) return;
const html = new DOMParser().parseFromString(responseText, "text/html"),
destination = document.getElementById(`price-${this.dataset.section}`),
source = html.getElementById(`price-${this.dataset.originalSection ? this.dataset.originalSection : this.dataset.section}`),
skuSource = html.getElementById(`Sku-${this.dataset.originalSection ? this.dataset.originalSection : this.dataset.section}`),
skuDestination = document.getElementById(`Sku-${this.dataset.section}`),
inventorySource = html.getElementById(`Inventory-${this.dataset.originalSection ? this.dataset.originalSection : this.dataset.section}`),
inventoryDestination = document.getElementById(`Inventory-${this.dataset.section}`);
source && destination && (destination.innerHTML = source.innerHTML), inventorySource && inventoryDestination && (inventoryDestination.innerHTML = inventorySource.innerHTML), skuSource && skuDestination && (skuDestination.innerHTML = skuSource.innerHTML, skuDestination.classList.toggle("visibility-hidden", skuSource.classList.contains("visibility-hidden")));
const price = document.getElementById(`price-${this.dataset.section}`);
price && price.classList.remove("visibility-hidden"), inventoryDestination && inventoryDestination.classList.toggle("visibility-hidden", inventorySource.innerText === "");
const addButtonUpdated = html.getElementById(`ProductSubmitButton-${sectionId}`);
this.toggleAddButton(addButtonUpdated ? addButtonUpdated.hasAttribute("disabled") : !0, window.variantStrings.soldOut), publish(PUB_SUB_EVENTS.variantChange, {
data: {
sectionId,
html,
variant: this.currentVariant
}
})
})
}
toggleAddButton(disable = !0, text, modifyClass = !0) {
const productForm = document.getElementById(`product-form-${this.dataset.section}`);
if (!productForm) return;
const addButton = productForm.querySelector('[name="add"]'),
addButtonText = productForm.querySelector('[name="add"] > span');
addButton && (disable ? (addButton.setAttribute("disabled", "disabled"), text && (addButtonText.textContent = text)) : (addButton.removeAttribute("disabled"), addButtonText.textContent = window.variantStrings.addToCart))
}
setUnavailable() {
const button = document.getElementById(`product-form-${this.dataset.section}`),
addButton = button.querySelector('[name="add"]'),
addButtonText = button.querySelector('[name="add"] > span'),
price = document.getElementById(`price-${this.dataset.section}`),
inventory = document.getElementById(`Inventory-${this.dataset.section}`),
sku = document.getElementById(`Sku-${this.dataset.section}`);
addButton && (addButtonText.textContent = window.variantStrings.unavailable, price && price.classList.add("visibility-hidden"), inventory && inventory.classList.add("visibility-hidden"), sku && sku.classList.add("visibility-hidden"))
}
getVariantData() {
return this.variantData = this.variantData || JSON.parse(this.querySelector('[type="application/json"]').textContent), this.variantData
}
}
customElements.define("variant-selects", VariantSelects);
class VariantRadios extends VariantSelects {
constructor() {
super()
}
setInputAvailability(listOfOptions, listOfAvailableOptions) {
listOfOptions.forEach(input => {
listOfAvailableOptions.includes(input.getAttribute("value")) ? input.classList.remove("disabled") : input.classList.add("disabled")
})
}
updateOptions() {
const fieldsets = Array.from(this.querySelectorAll("fieldset"));
this.options = fieldsets.map(fieldset => Array.from(fieldset.querySelectorAll("input")).find(radio => radio.checked).value)
}
}
customElements.define("variant-radios", VariantRadios);
class ProductRecommendations extends HTMLElement {
constructor() {
super()
}
connectedCallback() {
const handleIntersection = (entries, observer) => {
entries[0].isIntersecting && (observer.unobserve(this), fetch(this.dataset.url).then(response => response.text()).then(text => {
const html = document.createElement("div");
html.innerHTML = text;
const recommendations = html.querySelector("product-recommendations");
recommendations && recommendations.innerHTML.trim().length && (this.innerHTML = recommendations.innerHTML), !this.querySelector("slideshow-component") && this.classList.contains("complementary-products") && this.remove(), html.querySelector(".grid__item") && (this.classList.add("product-recommendations--loaded"), initButtons(), initButtonsCompare())
}).catch(e => {
console.error(e)
}))
};
new IntersectionObserver(handleIntersection.bind(this), {rootMargin: "0px 0px 4000px 0px"}).observe(this)
}
}
customElements.define("product-recommendations", ProductRecommendations);
//# sourceMappingURL=/cdn/shop/t/2/assets/global.js.map?v=78230033759645527351738045481