/* * Absolute Web Intellectual Property * * @copyright Copyright (c) 1999-2021 Absolute Web, Inc. (http://www.absoluteweb.com) * @author Absolute Web * @license http://www.absoluteweb.com/license-agreement/ Single domain license * @terms of use http://www.absoluteweb.com/terms-of-use/ */ define([ 'swiper-lib', 'aw-lazyload' ], (Swiper, lazyLoad) => { return (config, element) => { function observerCallback(entries, observer) { entries.forEach(entry => { if (entry.isIntersecting) { if (config.hasOwnProperty('productThumbs')) { const initProductThumbs = () => { return new Swiper(document.querySelector(config.productThumbs.element), config.productThumbs.config); }, productThumbs = initProductThumbs(); config.thumbs = { swiper: productThumbs }; } if (config.hasOwnProperty('virtual')) { let isVirtualSlidesEnd = false; const getBreakpoint = () => { const windowWidth = window.innerWidth, breakpoints = config.breakpoints; let closestValue = Object.keys(breakpoints) .reduce((a, b) => breakpoints[a] > breakpoints[b] ? a : b); for (const breakpoint in breakpoints) { if (config.breakpoints.hasOwnProperty(breakpoint)) { if (Math.abs(windowWidth - breakpoint) >= Math.abs(windowWidth - closestValue)) break; closestValue = breakpoint; } } return closestValue; }, generateRandomString = (chars, length) => { let result = ''; length = length > 0 ? length : 1; while (length--) { result += chars[Math.round(Math.random() * (chars.length - 1))]; } return result; }, changeFormKey = (formKey) => { let timeout; clearInterval(timeout); setTimeout(() => { if (!window.cookieStorage) { changeFormKey(formKey); } else { window.cookieStorage.setItem('form_key', formKey); } }, 150); }, updateFormkey = (elements) => { if (elements.length) { let formKey; if (window.cookieStorage && window.cookieStorage.hasOwnProperty('getItem')) { formKey = window.cookieStorage.getItem('form_key'); } if (!formKey) { formKey = generateRandomString( '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 16 ); changeFormKey(formKey); } elements.forEach((el, i) => { const input = el.querySelector('input[name="form_key"]'); if (input.value !== formKey) { input.value = formKey; } }); } }, productHtmlFormSelector = '[data-role=tocart-form]', contentUpdateEvent = document.createEvent('Events'); contentUpdateEvent.initEvent('contentUpdated', true, false); config.on = { init: () => { updateFormkey(element.querySelectorAll(productHtmlFormSelector)); element.dispatchEvent(contentUpdateEvent); if (window.StampedFn) { window.StampedFn.reloadUGC(); } }, slideChange: () => { if (!isVirtualSlidesEnd) { updateFormkey(element.querySelectorAll(productHtmlFormSelector)); element.dispatchEvent(contentUpdateEvent); if (window.StampedFn) { window.StampedFn.reloadUGC(); } if (element.swiper.isEnd) isVirtualSlidesEnd = true; } } }; if (config.lazy) { config.on = { init: () => { updateFormkey(element.querySelectorAll(productHtmlFormSelector)); element.dispatchEvent(contentUpdateEvent); lazyLoad(); if (window.StampedFn) { window.StampedFn.reloadUGC(); } }, slideChange: () => { if (!isVirtualSlidesEnd) { updateFormkey(element.querySelectorAll(productHtmlFormSelector)); element.dispatchEvent(contentUpdateEvent); if (window.StampedFn) { window.StampedFn.reloadUGC(); } if (element.querySelector('.lazy:not([data-was-processed])')) lazyLoad(); if (element.swiper.isEnd) isVirtualSlidesEnd = true; } } }; } config.slidesPerView = config.breakpoints[getBreakpoint()].slidesPerView; let timeout; window.addEventListener('resize', () => { clearTimeout(timeout); timeout = setTimeout(() => { if (element.swiper) { element.swiper.originalParams.slidesPerView = config.breakpoints[getBreakpoint()].slidesPerView; element.swiper.update(); if (config.lazy) lazyLoad(); } }, 250); }); } new Swiper(element, config); observer.unobserve(entry.target); } }); } // Init swiper only if it's in viewport new IntersectionObserver(observerCallback, {}).observe(element); }; });