{"version":3,"sources":["src/js/ui/image-zoom-pan.js","src/js/product/drop-shipping.js","src/js/ui/date-countdown.js","src/js/product/product-page.js","src/js/util/helpers.js","src/js/product/click-and-collect.js","src/js/product/product-card.js","src/js/api/users.js","src/js/api/shops.js","src/js/product/session.js","src/js/product/product-list.js","src/js/vendor/slick-lightbox.js"],"names":["ImageZoomPan","img","options","arguments","length","undefined","_classCallCheck","_options$initialScale","initialScale","_options$minScale","minScale","_options$maxScale","maxScale","parentElement","this","container","createElementsAndStyles","scale","lastScale","imgHeight","height","imgWidth","width","viewportHeight","offsetHeight","viewportWidth","offsetWidth","curHeight","curWidth","x","y","lastX","lastY","pinchCenter","addEvents","initHammer","translate","_createClass","key","value","document","createElement","classList","add","appendChild","style","transformOrigin","addEventListener","e","preventDefault","_this","mc","Hammer","get","set","enable","on","calculateSizes","type","deltaX","deltaY","updateLastPos","pinch","updateLastScale","clearPinchCenter","zoomCenter","restrictRawPos","Math","min","posX","ceil","posY","transform","concat","event","pinchCenterOffset","rawCenter","newScale","restrictScale","zoomAround","scaleBy","rawZoomX","rawZoomY","doNotUpdateLasts","zoom","rawCenterX","rawCenterY","triggerCustomEvent","previousZoom","currentZoom","zoomX","zoomY","pos","getBoundingClientRect","center","left","top","viewportDim","imgDim","name","detail","window","CustomEvent","createEvent","initCustomEvent","dispatchEvent","$window","$","$document","$html","$productForm","$dropShipping","template","html","templateData","inquiry","product","errors","loaders","stores","shopsLoaded","isActived","closeDropShipping","$el","toggleDropShipping","scrollTop","data","updateProductData","$product","$price","$color","find","$size","color","colorCode","val","ean","closest","category","sapTitlenumber","size","price","image","attr","replace","setLoader","state","toggleClass","Object","keys","addInquiryFormMessage","msg","isError","clearInquiryFormMessages","class","text","appendTo","removeClass","remove","removeInquiryFormLoader","show","one","utils","transitionDone","addClass","renderData","shopPromise","Promise","resolve","getShops","then","res","push","storeId","_i","_Object$entries","entries","shops","_Object$entries$_i","_slicedToArray","id","store","_objectSpread","all","Mustache","render","$this","is","$form","$token","$submit","formErrorMessage","prop","append","ajax","extend","serializeObject","dataType","method","timeout","url","done","response","result","reason","formErrors","_step","_iterator","_createForOfIteratorHelper","s","n","err","f","showInquiryFormErrors","fail","xhr","always","$fields","getToken","trigger","updateFormToken","processInquiryForm","hasClass","target","storeScrollPosition","history","pushState","openDropShipping","initialized","cleanTimeValue","substr","initCountowns","selector","map","date","$counter","dateobj","Date","isNaN","console","warn","_ref","_ref$selector","_ref$doneCallback","doneCallback","countdowns","log","tick","forEach","counter","dd","max","getTime","time","floor","join","setInterval","_ref$skipSizeUpdate","skipSizeUpdate","_ref$hideGallery","hideGallery","loop54Connector","Loop54Connector","$body","$images","$thumbs","$productForms","hasTouchSupport","updateProductSizes","extraSaleProduct","iceHockeyStickProduct","$container","addFormLoader","productId","productSizesElem","isExtraSaleProduct","$selectedColor","selectedColorValue","selectedSizeName","tabs","$newSelectedSize","isOneSize","oldExtraClass","extraClass","customProductName","removeFormLoader","productImages","slickOptions","arrows","dots","fade","infinite","asNavFor","lazyLoad","prevArrow","next","nextArrow","responsive","breakpoint","settings","speed","slick","init","currentSlide","nextSlide","customPagination","reInit","slidesCount","$slides","siblings","afterChange","slickLightbox","background","imageMaxHeight","itemSelector","useHistoryApi","lazy","layouts","closeButton","slidesToScroll","src","element","setPosition","setImagesSlideHeight","beforeChange","setActiveThumbClass","imageElement","querySelector","navigator","userAgent","indexOf","$slickLightbox","$slickLightboxSlick","slideCount","each","$img","slickEnabled","originalEvent","accessibility","draggable","swipe","touchMove","centerMode","focusOnSelect","slidesToShow","swipeToSlide","variableWidth","index","debounce","resetImagesAndThumbs","isSingleColumn","imageSrc","$currentSlide","previewImage","Image","onload","filter","css","backgroundImage","setTimeout","productFormEvents","$selectedColorSizes","$selectedSize","clearFormMessages","colorName","ccButton","productThumb","pushProductDetailViewToDatalayer","_$this$data","availableInWeb","availableInStores","availableForPreorder","isLastOfSize","iceHockeyFlex","$addToCartBtn","$preorderBtn","$clickAndCollectBtn","$preorderInfo","showFormMessage","checked","selected","amount","preorder","additional","eans","el","cart","headerCart","updateHeaderCart","itemId","_$form$data","productName","brandName","sports","targetgroup","saleProduct","productType","carousel","searchWords","colorValue","parseFloat","GoogleTagManager","addToCart","extraSaleAddToCart","messages","message","catch","error","finally","selectedSize","contentId","$formAlertContainer","setThumbsWidth","addObjectFitPolyfill","thumbsTotalWidth","outerWidth","imageHeights","apply","i","eq","accordion","$collapses","not","offset","outerHeight","stop","animate","isElementInViewport","rect","bottom","right","innerWidth","documentElement","clientWidth","innerHeight","clientHeight","addCampaignClasses","mapping","campaignClass","$item","ids","String","split","addRecentlyViewedProductsCarousel","userProducts","trackPages","getPage","products","$carousel","productCarousel","productListItems","addRelatedEntitiesCarousel","_JSON$parse$sapId","JSON","parse","decodeURIComponent","sapId","breadcrumbs","userId","getId","checkedColor","params","addComplementaryEntitiesCarousel","productDetail","productDetailDataObject","productDetailCopy","cloneDeep","objectPath","dim16","isEnabled","productDetailView","dataLayerEvents","scrollTimer","isGaEnabled","isGaAvailable","$elem","dataLayer","eventLabel","targetLocation","isRelatedEntitiesCarousel","parents","isComplementaryEntitiesCarousel","location","entity","identifier","clearTimeout","off","productClickAndCollect","productDropShipping","dateCountdown","openingToNewTab","tab","ctrlKey","metaKey","renderNow","_window$user","$clickAndCollect","reservation","geoLocation","cities","hasStores","selectFirstOption","disableCc","disableCcTitle","disableCcText","formatPrice","appendEuro","formattedPrice","toFixed","loggedIn","shipmentTypes","posti","default","club","kotiintoimitus","special","nouto","customShipmentTypes","isValidDateObject","isValidSaleCampaignProduct","saleCampaignIds","productCampaignIds","toString","some","productCampaign","includes","isAdmin","href","isLoggedIn","user","productData","ccShipmentTypes","Array","isArray","shipmentType","now","currentClickAndCollectSale","campaignType","start","end","saleBannerText","salePercentage","saleCategoryTypes","saleCategories","saleSubCategories","isValid","validTime","validCategoryType","categoryType","validCategory","validSubCategory","subcategory","validSaleCampaign","campaignIds","saleBrands","validBrand","bannerText","sale","hasActiveClickAndCollectSale","campaignDisabledForCc","clubSale","plussaSale","brandSale","campaignSaleMultiplier","showLoggedInSaleInfo","showPlussaSaleInfo","plussaSalePercentage","showBrandSaleInfo","_$productForm$data","sellingStarts","sellingEnabled","campaignBanner","vmChainCampaign","ccDisableStart","ccDisableEnd","vmProduct","vmEnableCp","enableCCforSpecialDelivery","sellingDisabled","disableCampaignCc","jqXHR","userInfo","storeBalances","shippingFee","active","setCampaignSale","setOnlinePayment","paymentMethod","order","shipping","parseInt","originalPrice","items","salePrice","priceText","$plussaInput","cardNumber","plussaPrefix","brand","setRequiredFields","isRequired","$requiredFields","$label","labelText","closeClickAndCollect","enabled","resetErrors","getgeoLocation","selectedCity","updateStoresData","reservationData","updateReservationData","storePrice","toggleReservationForm","getStoreBalances","onlinePayment","clearReservationFormMessages","removeReservationFormLoader","addReservationFormLoader","kplussa_number","prototype","hasOwnProperty","call","storeName","trim","checkout","submit","addReservationFormMessage","processReservationForm","$paymentInput","first","setShipping","deliveryFee","shipmentFee","clickAndCollectEvents","toggleClickAndCollect","userPromise","getUser","updateUserInfo","openClickAndCollect","paymentHtml","injectPayment","shopId","markup","restoreScrollPosition","updateDataAndRender","colorBalances","getTimestamp","timestamp","abort","cache","sap_titlenumber","status","shop","storeData","sort","a","b","city","handleStoreBalanceErrors","disableCC","when","statusText","responseJSON","colorVisible","sizeVisible","flex","hand","canShip","specialDelivery","isIceHockeyStick","setError","uniqueCities","storeBalance","balances","balanceItem","balance","hasOnlinePayment","prepayment","lowBalanceThreshold","hasLowBalance","item","balanceData","forceEnableCc","foundInStores","foundInStoresText","dfd","Deferred","geolocation","getCurrentPosition","reject","enableHighAccuracy","maximumAge","position","lat","coords","latitude","lon","longitude","handleGeoLocationErrors","promise","hide","isValidReservation","charAt","substring","extranet_users_uuid","online_payment","termsLink","dataProtectionLink","usersPlussaNumber","plussaWithoutPrefix","slice","serializeArray","field","showForm","$scrollArea","token","post","showPaymentForm","hasCustomShipmentTypes","hasCustomDelivery","customDelivery","shipment","currentPrice","activated","priceClub","priceDefault","_step2","cheapestDeliveryFee","_iterator2","level","_step3","_iterator3","cityStores","cityItem","filterStoresbyCity","distance","round","calculateDistance","Number","long","orderStoresByLocation","$reservationForm","inputFilteringEvents","$toggleLink","$linkContainer","parent","lat1","lon1","lat2","lon2","toRad","PI","dLat","dLon","sin","cos","atan2","sqrt","getProductDataLayerData","productItem","_productItem$querySel","_productItem$querySel2","_priceContainer$query","getAttribute","productCards","getElementsByClassName","setAttribute","updateProductPositions","link","identifierParts","dataset","_identifierParts","toUpperCase","urlObject","URL","urlColor","searchParams","urlSapId","pathname","pop","endsWith","_urlSapId$split","list","textContent","productBrand","priceContainer","priceSelector","contains","categoryPath","breadcrumb","fullCategoryPath","dimension16","sendBenefitSms","benefitId","getJSON","preferences","_preferences","STORAGE_KEY","forceRefresh","sessionStorage","getItem","setItem","stringify","transferSessionStorage","storageKeys","newValue","pick","localStorage","removeItem","updateNavigationLinks","filters","$links","isMobile","grep","$link","isLeftNavLink","getVisibleLinks","pageIds","uniq","links","pageId","setItemHeights","$items","templates","activeFilters","_productsCount","$grid","$activeFilters","$toolbar","$pageHeading","$filters","submitHandler","handleFormSubmit","reload","systemEvent","urlParams","buildUrlParams","queryString","urlencoded","param","getQueryString","preparedData","prepareData","_shouldReload","replaceState","renderActiveFilters","isUpdateFilters","_lastFilterData","updateOnChange","prevData","hash","prevHash","prev","cur","intersection","shouldUpdateFilters","updateFiltersPromise","updateFilters","_xhr","$loading","ajaxUrl","updateProductsCount","productsCount","pageTitle","updateTitle","pageTitleShort","toggleNextDayButton","toggleSelectedDay","selectedDay","_loadMoreCounter","filterProducts","producsCount","inpackagebuilder","filteredData","copy","omit","values","paramsArray","normalizeArray","getInput","filterInactiveParams","pickColorImages","defaultOrder","additionalFields","additionalField","mapAdditionalFields","paramFields","_totalProductsCount","search","reduce","paramSplit","_filterPreset","_chainCampaigns","chainCampaigns","_initialData","serialize","toggleFilterTab","$tab","$menu","$clone","clone","newHeight","producGridItemDatalayerClick","elem","newTab","stopPropagation","$productItem","dataLayerData","clickProduct","nextDay","$nextDayClone","showAllDiscounts","selectedDayText","setPreference","preset","lockedFilters","lockedFilterGroups","session","genders","selectedTab","activeTabs","input","open","isActive","preserved","assign","extraFilters","categories","$input","getCategoriesByType","pullAll","pathParams","fields","pathData","filterPath","buildFilterPath","selectColor","click","count","title","short","fieldData","newKey","isEmpty","additional_fields","prepareAdditionalFields","normalizedColor","parsed","parseSalePercentage","sizeType","day","chain","campaigns","campaignId","noProducts","Boolean","unsetActiveFilter","triggerChange","change","fieldMask","without","getInputLabel","getActiveFilters","totalProductsCount","filterMap","productCountElement","currentCount","activeFiltersCount","firstInput","label","ev","bind","doStuff","system","cancel","categoryLabel","filterLabel","clickFilter","children","$parentFilter","$button","page","nextPage","number","currentTarget","$buttons","buttonsCount","$selectedFilterLabel","code","detach","insertAfter","$productSort","$mobileSort","$desktopSort","$campaignFilter","insertBefore","$target","_JSON$parse","selectedNavigation","navigation","$genderFilters","preSelectGenderSelection","initFilters","button","markupStorageKey","yPositionStorageKey","scrollYPosition","scrollTo","scrollPosition","pageYOffset","backButtonHack","scroll","throttle","readyState","buttonOffset","$children","wrapAll","$parent","slideToggle","productImpressions","showImage","$listItem","parentsUntil","$itemLinks","toLowerCase","forceGenderSelect","$genderFilter","genderPreference","genderMapping","invert","availableGenders","mappedGenders","gender","forceSelect","$select","getSelectedGenders","kids","newGenders","fallback","genderFallback","SlickLightbox","defaults","options1","$element","didInit","$clickedItem","blur","shouldOpen","filterOutSlickClones","detectIE","createModal","bindEvents","initSlick","createModalItems","createItem","images","caption","info","getElementCaption","getElementSrc","isIE","captionPosition","$modalElement","$parts","initialSlide","writeHistory","getTransitionDuration","close","destroy","resizeSlides","h","closeOnEscape","navigateByKeyboard","keyCode","which","slideSlick","closeOnBackdropClick","direction","test","RegExp","$1","unbindEvents","unbindAnchors","destroyTimeout","destroyPrevious","duration","transitionDuration","fn","unslickLightbox"],"mappings":"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","file":"hashed/16.36f68475.chunk.js","sourcesContent":["'use strict'\n\nimport Hammer from 'hammerjs';\n\n/**\n * ImageZoomPan\n */\nexport default class ImageZoomPan {\n\t/**\n\t * constructor\n\t *\n\t * @param {Element} img\n\t * @param {Object} [options]\n\t * {Number} [options.initialScale]\n\t * {Number} [options.minScale]\n\t * {Number} [options.maxScale]\n\t */\n\tconstructor(img, options = {}) {\n\t\tconst {\n\t\t\tinitialScale = 1,\n\t\t\tminScale = 1,\n\t\t\tmaxScale = 8\n\t\t} = options;\n\n\t\tif (img && img.parentElement) {\n\t\t\tthis.img = img;\n\t\t\tthis.container;\n\n\t\t\tthis.createElementsAndStyles();\n\n\t\t\tthis.scale = initialScale;\n\t\t\tthis.minScale = minScale;\n\t\t\tthis.maxScale = maxScale;\n\t\t\tthis.lastScale = this.scale;\n\n\t\t\tthis.imgHeight = this.img.height;\n\t\t\tthis.imgWidth = this.img.width;\n\n\t\t\tthis.viewportHeight = this.container.offsetHeight;\n\t\t\tthis.viewportWidth = this.container.offsetWidth;\n\n\t\t\tthis.curHeight = this.imgHeight * this.scale;\n\t\t\tthis.curWidth = this.imgWidth * this.scale;\n\n\t\t\tthis.x = 0;\n\t\t\tthis.y = 0;\n\t\t\tthis.lastX = 0;\n\t\t\tthis.lastY = 0;\n\t\t\tthis.pinchCenter = null;\n\n\t\t\tthis.addEvents();\n\t\t\tthis.initHammer();\n\n\t\t\tthis.translate(0, 0);\n\n\t\t\tthis.img.ImageZoomPan = this;\n\t\t}\n\t}\n\n\t/**\n\t * createElementsAndStyles\n\t */\n\tcreateElementsAndStyles() {\n\t\tthis.container = document.createElement('div');\n\t\tthis.container.classList.add('image-zoom-pan-container');\n\n\t\tthis.img.parentElement.appendChild(this.container);\n\n\t\tthis.container.appendChild(this.img);\n\n\t\tthis.img.classList.add('image-zoom-pan-image');\n\t\tthis.img.style.transformOrigin = '0 0 0';\n\t}\n\n\t/**\n\t * addEvents\n\t */\n\taddEvents() {\n\t\tthis.container.addEventListener('touchstart', function(e) {\n\t\t\te.preventDefault();\n\t\t}, false)\n\n\t\tthis.container.addEventListener('touchmove', function(e) {\n\t\t\te.preventDefault();\n\t\t}, false)\n\t}\n\n\t/**\n\t * initHammer\n\t */\n\tinitHammer() {\n\t\tconst mc = new Hammer(this.container);\n\n\n\t\tmc.get('pinch').set({ enable: true });\n\n\t\tmc.on('pan panend pinch pinchend doubletap', e => {\n\t\t\tthis.calculateSizes();\n\t\t\tswitch (e.type) {\n\t\t\tcase 'pan':\n\t\t\t\tthis.translate(e.deltaX, e.deltaY);\n\t\t\t\tbreak;\n\n\t\t\tcase 'panend':\n\t\t\t\tthis.updateLastPos();\n\t\t\t\tbreak;\n\n\t\t\tcase 'pinch':\n\t\t\t\tthis.pinch(e);\n\t\t\t\tbreak;\n\n\t\t\tcase 'pinchend':\n\t\t\t\tthis.updateLastScale();\n\t\t\t\tthis.updateLastPos();\n\t\t\t\tthis.clearPinchCenter();\n\t\t\t\tbreak;\n\n\t\t\tcase 'doubletap':\n\t\t\t\tthis.zoomCenter(this.scale > this.minScale ? 0 : 2);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Update viewport and image sizes.\n\t */\n\tcalculateSizes() {\n\n\t\tthis.imgHeight = this.img.height;\n\t\tthis.imgWidth = this.img.width;\n\n\t\tthis.viewportHeight = this.container.offsetHeight;\n\t\tthis.viewportWidth = this.container.offsetWidth;\n\n\t\tthis.curHeight = this.imgHeight * this.scale;\n\t\tthis.curWidth = this.imgWidth * this.scale;\n\n\t}\n\n\t/**\n\t * translate\n\t *\n\t * @param {Number} deltaX\n\t * @param {Number} deltaY\n\t */\n\ttranslate(deltaX, deltaY) {\n\t\t// We restrict to the min of the viewport width/height or current width/height\n\t\t// as the current width/height may be smaller than the viewport width/height\n\t\tthis.x = this.scale > this.minScale ? this.restrictRawPos(this.lastX + deltaX / this.scale, Math.min(this.viewportWidth, this.curWidth), this.imgWidth): 0;\n\t\tthis.y = this.scale > this.minScale ? this.restrictRawPos(this.lastY + deltaY / this.scale, Math.min(this.viewportHeight, this.curHeight), this.imgHeight): 0;\n\n\t\tconst posX = Math.ceil(this.x * this.scale);\n\t\tconst posY = Math.ceil(this.y * this.scale);\n\n\t\tthis.img.style.transform = `translate3d(${posX}px, ${posY}px, 0) scale3d(${this.scale}, ${this.scale}, 1)`;\n\t}\n\n\t/**\n\t * pinch\n\t *\n\t * @param {Object} event\n\t */\n\tpinch(event) {\n\t\t// We only calculate the pinch center on the first pinch event\n\t\t// as we want the center to stay consistent during the entire pinch\n\t\tconst pinchCenterOffset = { x: 0, y: 0 };\n\n\t\tif (this.pinchCenter === null) {\n\t\t\tthis.pinchCenter = this.rawCenter(event);\n\n\t\t\tpinchCenterOffset.x = this.pinchCenter.x * this.scale - (-this.x * this.scale + Math.min(this.viewportWidth, this.curWidth) / 2);\n\t\t\tpinchCenterOffset.y = this.pinchCenter.y * this.scale - (-this.y * this.scale + Math.min(this.viewportHeight, this.curHeight) / 2);\n\t\t}\n\n\t\t// When the user pinch zooms, user expects the pinch center to remain in the same\n\t\t// relative location of the screen. To achieve this, the raw zoom center is calculated by\n\t\t// first storing the pinch center and the scaled offset to the current center of the image.\n\t\t// The new scale is then used to calculate the zoom center. This has the effect of\n\t\t// actually translating the zoom center on each pinch zoom event.\n\t\tconst newScale = this.restrictScale(this.scale * event.scale);\n\t\tconst zoomX = this.pinchCenter.x * newScale - pinchCenterOffset.x;\n\t\tconst zoomY = this.pinchCenter.y * newScale - pinchCenterOffset.y;\n\t\tconst zoomCenter = {\n\t\t\tx: zoomX / newScale,\n\t\t\ty: zoomY / newScale\n\t\t};\n\n\t\tthis.zoomAround(event.scale, zoomCenter.x, zoomCenter.y, true);\n\t}\n\n\t/**\n\t * zoomAround\n\t *\n\t * @param {Number} scaleBy\n\t * @param {Number} rawZoomX\n\t * @param {Number} rawZoomY\n\t * @param {Boolean} [doNotUpdateLasts]\n\t */\n\tzoomAround(scaleBy, rawZoomX, rawZoomY, doNotUpdateLasts) {\n\t\t// Zoom\n\t\tthis.zoom(scaleBy);\n\n\t\t// New raw center of viewport\n\t\tconst rawCenterX = -this.x + Math.min(this.viewportWidth, this.curWidth) / 2 / this.scale;\n\t\tconst rawCenterY = -this.y + Math.min(this.viewportHeight, this.curHeight) / 2 / this.scale;\n\n\t\t// Delta\n\t\tconst deltaX = (rawCenterX - rawZoomX) * this.scale;\n\t\tconst deltaY = (rawCenterY - rawZoomY) * this.scale;\n\n\t\t// Translate back to zoom center\n\t\tthis.translate(deltaX, deltaY);\n\n\t\tif (!doNotUpdateLasts) {\n\t\t\tthis.updateLastScale();\n\t\t\tthis.updateLastPos();\n\t\t}\n\t}\n\n\t/**\n\t * zoom\n\t *\n\t * @param {Number} scaleBy\n\t *\n\t * @return {ImageZoomPan} - this\n\t */\n\tzoom(scaleBy) {\n\t\tthis.scale = this.restrictScale(this.lastScale * scaleBy);\n\n\t\tthis.triggerCustomEvent('zoomChange', {\n\t\t\tpreviousZoom: this.lastScale,\n\t\t\tcurrentZoom: this.scale\n\t\t});\n\n\t\tthis.curWidth = this.imgWidth * this.scale;\n\t\tthis.curHeight = this.imgHeight * this.scale;\n\n\t\t// Adjust margins to make sure that we aren't out of bounds\n\t\tthis.translate(0, 0);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * zoomCenter\n\t *\n\t * @param {Number} scaleBy\n\t *\n\t * @return {ImageZoomPan} - this\n\t */\n\tzoomCenter(scaleBy) {\n\t\t// Center of viewport\n\t\tconst zoomX = -this.x + Math.min(this.viewportWidth, this.curWidth) / 2 / this.scale;\n\t\tconst zoomY = -this.y + Math.min(this.viewportHeight, this.curHeight) / 2 / this.scale;\n\n\t\tthis.zoomAround(scaleBy, zoomX, zoomY);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * zoomIn\n\t *\n\t * @return {ImageZoomPan} - this\n\t */\n\tzoomIn() {\n\t\tthis.zoomCenter(2);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * zoomOut\n\t *\n\t * @return {ImageZoomPan} - this\n\t */\n\tzoomOut() {\n\t\tthis.zoomCenter(1 / 2);\n\n\t\treturn this;\n\t}\n\n\t/**\n\t * rawCenter\n\t *\n\t * @param {Object} event\n\t *\n\t * @return {Object}\n\t */\n\trawCenter(event) {\n\t\tconst pos = this.container.getBoundingClientRect();\n\t\tconst zoomX = -this.x + (event.center.x - pos.left) / this.scale;\n\t\tconst zoomY = -this.y + (event.center.y - pos.top) / this.scale;\n\n\t\treturn { x: zoomX, y: zoomY };\n\t}\n\n\t/**\n\t * restrictRawPos\n\t *\n\t * @param {Number} pos\n\t * @param {Number} viewportDim\n\t * @param {Number} imgDim\n\t *\n\t * @return {Number}\n\t */\n\trestrictRawPos(pos, viewportDim, imgDim) {\n\t\tif (pos < viewportDim / this.scale - imgDim) { // too far left/up?\n\t\t\tpos = viewportDim / this.scale - imgDim;\n\t\t} else if (pos > 0) { // too far right/down?\n\t\t\tpos = 0;\n\t\t}\n\n\t\treturn pos;\n\t}\n\n\t/**\n\t * restrictScale\n\t *\n\t * @param {Number} scale\n\t *\n\t * @return {Number}\n\t */\n\trestrictScale(scale) {\n\t\tif (scale < this.minScale) {\n\t\t\tscale = this.minScale;\n\t\t} else if (scale > this.maxScale) {\n\t\t\tscale = this.maxScale;\n\t\t}\n\n\t\treturn scale;\n\t}\n\n\t/**\n\t * updateLastPos\n\t */\n\tupdateLastPos() {\n\t\tthis.lastX = this.x;\n\t\tthis.lastY = this.y;\n\t}\n\n\t/**\n\t * updateLastScale\n\t */\n\tupdateLastScale() {\n\t\tthis.lastScale = this.scale;\n\t}\n\n\t/**\n\t * clearPinchCenter\n\t */\n\tclearPinchCenter() {\n\t\tthis.pinchCenter = null;\n\t}\n\n\t/**\n\t * triggerCustomEvent\n\t *\n\t * @param {String} name\n\t * @param {Object|String} [detail]\n\t */\n\ttriggerCustomEvent(name, detail = null) {\n\t\tlet event;\n\n\t\tif (typeof window.CustomEvent === 'function') {\n\t\t\tevent = new CustomEvent(name, { detail: detail });\n\t\t} else {\n\t\t\tevent = document.createEvent('CustomEvent');\n\t\t\tevent.initCustomEvent(name, false, false, detail);\n\t\t}\n\n\t\tthis.img.dispatchEvent(event);\n\t}\n}","'use strict';\n\nimport $ from 'jquery';\nimport Mustache from 'mustache';\nimport utils from '../util';\nimport getToken from '../api/token';\nimport {getShops} from '../api/shops';\n//import {getUser} from '../api/users';\nimport Promise from 'bluebird';\n\nexport default function() {\n\tconst $window = $(window);\n\tconst $document = $(document);\n\tconst $html = $('html');\n\tconst $productForm = $('.v4-product-card form');\n\tconst $dropShipping = $('.v4-product-drop-shipping');\n\tconst template = $('#template-drop-shipping').html();\n\n\tconst templateData = {\n\t\tinquiry: {},\n\t\tproduct: {},\n\t\terrors: {},\n\t\tloaders: {},\n\t\tstores: []\n\t};\n\n\tlet shopsLoaded = false;\n\tlet isActived = false;\n\n\tif ($dropShipping.length) {\n\t\tdropShippingEvents();\n\t\tproductFormEvents();\n\n\t\t$(window).on('popstate', e => {\n\t\t\tcloseDropShipping();\n\t\t});\n\t}\n\n\t/**\n * dropShippingEvents\n */\n\tfunction dropShippingEvents() {\n\t\t$dropShipping.appendTo('#intersport-page');\n\n\t\t$dropShipping\n\t\t\t.on('click', '.product-drop-shipping-close', closeDropShipping)\n\t\t\t.on('keyup invalid', '.drop-shipping-inquiry-form input', function() {\n\t\t\t\tconst $this = $(this);\n\t\t\t\t$this.toggleClass('invalid', $this.is(':invalid'));\n\t\t\t})\n\t\t\t.on('submit', '.drop-shipping-inquiry-form', function(e) {\n\t\t\t\tprocessInquiryForm(e);\n\t\t\t});\n\n\t\t// Close drop shipping by clicking outside it or outside the product form\n\t\t$document.on('click', function(e) {\n\t\t\tif ($dropShipping.hasClass('transition-done') && !$(e.target).closest('.v4-product-drop-shipping, .product-colors, .product-sizes').length) {\n\t\t\t\tcloseDropShipping();\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction openDropShipping() {\n\t\tif ($productForm.find('[name=\"ean\"]:checked').length) {\n\t\t\tstoreScrollPosition($window);\n\t\t\ttoggleDropShipping(true);\n\t\t\tif (!isActived) {\n\t\t\t\tisActived = true;\n\t\t\t\t$productForm.find('[name=\"ean\"]:checked').trigger('change');\n\t\t\t\tsetLoader('form', true);\n\t\t\t\trenderData();\n\t\t\t}\n\t\t\tif (typeof history !== 'undefined') {\n\t\t\t\t// push empty history entry to allow back button to close the panel\n\t\t\t\thistory.pushState(null, '', '');\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction closeDropShipping() {\n\t\ttoggleDropShipping(false);\n\t\trestoreScrollPosition($window);\n\t}\n\n\t/**\n\t * productFormEvents\n\t */\n\tfunction productFormEvents() {\n\t\t$productForm\n\t\t\t.on('click', '.drop-shipping-button:not(.disabled)', function() {\n\t\t\t\tif ($productForm.find('[name=\"ean\"]:checked').length) {\n\t\t\t\t\topenDropShipping();\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('change', '[name=\"color\"]', function() {\n\t\t\t\tif (isActived) {\n\t\t\t\t\tupdateProductData();\n\t\t\t\t\trenderData();\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('change', '[name=\"ean\"]', function() {\n\t\t\t\tif (isActived) {\n\t\t\t\t\tupdateProductData();\n\t\t\t\t\trenderData();\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('click', '[data-toggle=\"modal\"]', function() {\n\t\t\t\ttoggleDropShipping(false);\n\t\t\t});\n\t}\n\n\t/**\n\t * updateProductData\n\t */\n\tfunction updateProductData() {\n\t\tconst $product = $('.v4-product');\n\t\tconst $price = $('.v4-product-card .product-price-current');\n\t\tconst $color = $productForm.find('[name=\"color\"]:checked');\n\t\tconst $size = $productForm.find('[name=\"ean\"]:checked');\n\n\t\ttemplateData.product = {\n\t\t\tcolor: $color.data('name'),\n\t\t\tcolorCode: $color.val(),\n\t\t\tean: $size.closest('.product-sizes-list[data-color=\"' + $color.val() + '\"]').length ? $size.val() : '',\n\t\t\tname: $productForm.data('brandName') + ' ' + $product.data('product-name'),\n\t\t\tcategory: $product.data('category'),\n\t\t\tsapTitlenumber: $productForm.data('sapTitlenumber'),\n\t\t\tsize: $size.data('name'),\n\t\t\tprice: $price.html(),\n\t\t\timage: $color.closest('.product-colors-list-item').find('img').attr('src').replace('c=system_150', 'c=system_1024x')\n\t\t};\n\n\t}\n\n\t/**\n\t * processReservationForm\n\t *\n\t * @param {Object} e\n\t */\n\tfunction processInquiryForm(e) {\n\t\te.preventDefault();\n\n\t\tconst $form = $dropShipping.find('.drop-shipping-inquiry-form');\n\n\t\tconst $token = $form.find('input[name$=\"token\"]');\n\t\tconst $submit = $form.find('button[type=\"submit\"]');\n\t\tconst formErrorMessage = $form.data('formErrorText');\n\n\t\t$submit.prop('disabled', true);\n\n\t\tclearInquiryFormMessages();\n\t\taddInquiryFormLoader();\n\n\t\tif ($token.val()) {\n\t\t\t$.ajax({\n\t\t\t\tdata: $.extend({ product: templateData.product }, $form.serializeObject()),\n\t\t\t\tdataType: 'json',\n\t\t\t\tmethod: 'POST',\n\t\t\t\ttimeout: 30000,\n\t\t\t\turl: '/stage-ajax/dropShipping/'\n\t\t\t}).done(function(response) {\n\t\t\t\tif (response && response.result === 1) {\n\t\t\t\t\ttemplateData.inquiry.done = true;\n\n\t\t\t\t\trenderData();\n\n\t\t\t\t} else if (response && response.reason) {\n\t\t\t\t\taddInquiryFormMessage(response.reason, true);\n\t\t\t\t} else {\n\t\t\t\t\taddInquiryFormMessage(formErrorMessage, true);\n\t\t\t\t}\n\t\t\t\tif (response && response.formErrors) {\n\t\t\t\t\tshowInquiryFormErrors(response.formErrors)\n\t\t\t\t}\n\t\t\t}).fail(function(xhr) {\n\t\t\t\taddInquiryFormMessage(formErrorMessage, true);\n\n\t\t\t}).always(function(response) {\n\t\t\t\tremoveInquiryFormLoader();\n\t\t\t\t$form.find('input[name$=\"token\"]').val('');\n\t\t\t\t$submit.prop('disabled', false);\n\t\t\t});\n\t\t} else {\n\t\t\tupdateFormToken($form);\n\t\t}\n\t}\n\n\t/**\n\t * setLoader\n\t *\n\t * @param {String} name\n\t * @param {Boolean} state\n\t */\n\tfunction setLoader(name, state) {\n\t\tif (name && typeof state !== 'undefined') {\n\t\t\tif (state) {\n\t\t\t\ttemplateData.loaders[name] = true;\n\t\t\t} else{\n\t\t\t\tdelete templateData.loaders[name];\n\t\t\t}\n\n\t\t\t$dropShipping.toggleClass('is-loading', !!Object.keys(templateData.loaders).length);\n\t\t}\n\t}\n\n\t/**\n\t * addFormMessage\n\t *\n\t * @param {String} msg\n\t * @param {Boolean} isError\n\t */\n\tfunction addInquiryFormMessage(msg, isError) {\n\t\tclearInquiryFormMessages();\n\n\t\t$('
', { class: 'drop-shipping-info-block' + (isError ? ' is-error' : ''), text: msg }).appendTo($dropShipping.find('#drop-shipping-inquiry-form-alert-container'));\n\t}\n\n\tfunction showInquiryFormErrors(errors) {\n\t\tfor (let id of errors) {\n\t\t\tid = '#drop-shipping-'+id;\n\t\t\t$dropShipping.find('.drop-shipping-inquiry-form '+id).addClass('has-error');\n\t\t}\n\t}\n\n\t/**\n\t * clearInquiryFormMessages\n\t */\n\tfunction clearInquiryFormMessages() {\n\t\t$dropShipping.find('.drop-shipping-inquiry-form .has-error').removeClass('has-error');\n\t\t$dropShipping.find('#drop-shipping-inquiry-form-alert-container').find('.drop-shipping-info-block').remove();\n\t}\n\n\t/**\n\t * Add spinner loader to the page\n\t */\n\tfunction addInquiryFormLoader() {\n\t\tremoveInquiryFormLoader();\n\n\t\t$('
', { class: 'drop-shipping-loader' })\n\t\t\t.append($('
', { class: 'spinner-loader-circle' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle2' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle3' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle4' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle5' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle6' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle7' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle8' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle9' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle10' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle11' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle12' }))\n\t\t\t.appendTo($dropShipping.find('#drop-shipping-inquiry-form-alert-container'));\n\t}\n\n\t/**\n\t * Add Remove loader to the page\n\t */\n\tfunction removeInquiryFormLoader() {\n\t\t$dropShipping.find('#drop-shipping-inquiry-form-alert-container').find('.drop-shipping-loader').remove();\n\t}\n\n\t/**\n\t * toggleClickAndCollect\n\t *\n\t * @param {Boolean} show\n\t */\n\tfunction toggleDropShipping(show = true) {\n\t\tif (show) {\n\t\t\t$dropShipping.one(utils.transitionDone(), function() {\n\t\t\t\t$dropShipping.addClass('transition-done');\n\t\t\t})\n\t\t} else {\n\t\t\t$dropShipping.removeClass('transition-done');\n\t\t}\n\n\t\t$html.toggleClass('v4-product-drop-shipping-open', show);\n\t}\n\n\t/**\n\t * renderData\n\t */\n\tfunction renderData() {\n\t\tconst shopPromise = !shopsLoaded ? getShops().then(res => {\n\t\t\ttemplateData.stores.push({ storeId: '', name: 'Valitse'});\n\n\t\t\tfor (let [id, store] of Object.entries(res.shops)) {\n\t\t\t\ttemplateData.stores.push({ storeId: id, ...store });\n\t\t\t}\n\n\t\t\tshopsLoaded = true;\n\t\t}) : Promise.resolve();\n\n\t\tPromise.all([shopPromise]).then(() => {\n\t\t\tsetLoader('form', false);\n\t\t\t$('#drop-shipping-content').html(Mustache.render(template, templateData));\n\t\t});\n\t}\n\n\t/**\n\t * storeScrollPosition\n\t *\n\t * @param {jQuery} $el\n\t * @param {Number} [pos]\n\t */\n\tfunction storeScrollPosition($el, pos = $el.scrollTop()) {\n\t\t$el.data('scrollPosition', pos);\n\t}\n\n\t/**\n\t * restoreScrollPosition\n\t *\n\t * @param {jQuery} $el\n\t */\n\tfunction restoreScrollPosition($el) {\n\t\t$el.scrollTop($el.data('scrollPosition'));\n\n\t\t$el.data('scrollPosition', 0);\n\t}\n\n\t/**\n\t * Fetch new token for the form and auto submit it\n\t *\n\t * @param {jQuery} $form\n\t */\n\tfunction updateFormToken($form) {\n\t\tconst $fields = $('input[name$=\"token\"]').val('');\n\n\t\treturn getToken().then(function(response) {\n\t\t\t$fields.val(response);\n\t\t\t$('input[name=\"stage_token\"]').val(response);\n\t\t\tif ($form) {\n\t\t\t\t$form.trigger('submit');\n\t\t\t}\n\t\t});\n\t}\n\n}\n","'use strict';\nimport $ from 'jquery';\n\nlet initialized = false;\n\nconst isValidDate = date => date instanceof Date && !isNaN(date);\n\nconst cleanTimeValue = value => value.substr(value.length - 2);\n\nconst initCountowns = (selector) => {\n\treturn $(selector).map(function() {\n\t\tconst $counter = $(this);\n\t\tconst dateobj = new Date($counter.data('dateobj'));\n\t\tif (!isValidDate(dateobj)) {\n\t\t\tconsole.warn('Invalid date found: ' + dateobj);\n\t\t\treturn;\n\t\t}\n\t\treturn {\n\t\t\ttarget: dateobj,\n\t\t\t$el: $counter\n\t\t}\n\t}).get();\n}\n\nexport default ({\n\tselector = '.date-countdown',\n\tdoneCallback = () => {}\n} = {}) => {\n\tif (initialized) return;\n\tconst countdowns = initCountowns(selector);\n\n\tconsole.log(countdowns);\n\n\tconst tick = () => {\n\t\tcountdowns.forEach(counter => {\n\t\t\tconst $counter = counter.$el;\n\t\t\tconst dd = Math.max(0, counter.target.getTime() - new Date().getTime());\n\t\t\tif (dd <= 0) {\n\t\t\t\t// countdown done\n\t\t\t\tdoneCallback($counter);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst dhour = '0' + Math.floor(dd / (60 * 60 * 1000) * 1);\n\t\t\tconst dmin = '0' + Math.floor(((dd % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) / (60 * 1000) * 1);\n\t\t\tconst dsec = '0' + Math.floor((((dd % (60 * 60 * 1000 * 24)) % (60 * 60 * 1000)) % (60 * 1000)) / 1000 * 1);\n\t\t\tconst time = [dhour, dmin, dsec].map(cleanTimeValue).join(':');\n\t\t\t$counter.text(time);\n\t\t\treturn true;\n\t\t});\n\t}\n\n\ttick();\n\tsetInterval(tick, 1000);\n\tinitialized = true;\n}\n","/* global GoogleTagManager */\n\n'use strict'\n\nimport $ from 'jquery';\nimport debounce from 'lodash/debounce';\nimport objectPath from 'object-path';\nimport cloneDeep from 'lodash/cloneDeep';\nimport utils, { getCurrentVariant } from '../util';\nimport * as cart from '../api/cart';\nimport headerCart from '../checkout/header-cart';\nimport slickLightbox from '../vendor/slick-lightbox';\nimport '../vendor/slick-carousel';\n//import dynamicContentModal from '../ui/dynamic-content-modal';\n//import videoModal from '../ui/video-modal';\nimport ImageZoomPan from '../ui/image-zoom-pan';\nimport productClickAndCollect from './click-and-collect';\nimport productDropShipping from './drop-shipping';\nimport trackPages from '../util/track-pages';\nimport { productListItems } from '../product/product-list';\nimport { productCarousel, customPagination } from '../product/product-carousel';\nimport dateCountdown from '../ui/date-countdown';\nimport tabs from '../ui/tabs';\nimport Loop54Connector from '../search/loop54-connector';\n\nexport default function(selector, {\n\tskipSizeUpdate = false,\n\thideGallery = false\n} = {}) {\n\tconst loop54Connector = new Loop54Connector();\n\tconst $product = $(selector);\n\n\tconst $window = $(window);\n\tconst $document = $(document);\n\tconst $body = $('body');\n\n\t//const $product = $('.v4-product-card');\n\tconst $images = $product.find('.product-images');\n\tconst $thumbs = $product.find('.product-thumbs');\n\tconst $productForms = $product.find('.product-form');\n\n\t// Detect if there's a touch support\n\tlet hasTouchSupport = false;\n\t$window.on('touchstart', function() { hasTouchSupport = true; });\n\n\tslickLightbox();\n\t//dynamicContentModal();\n\t//videoModal();\n\tif (!skipSizeUpdate) {\n\t\t$productForms.each(function(){\n\t\t\tupdateProductSizes($(this));\n\t\t});\n\t}\n\tproductImages();\n\t$productForms.each(function(){\n\t\tproductFormEvents($(this));\n\t});\n\taccordion();\n\n\tif(!$body.hasClass('page-tilaus')) {\n\t\tproductClickAndCollect();\n\t}\n\n\tproductDropShipping();\n\taddCampaignClasses($('.product-carousel'));\n\tdataLayerEvents();\n\tdateCountdown();\n\t// Get carousel after everything else has been loaded\n\n\t$window.on('load', function() {\n\t\taddRecentlyViewedProductsCarousel();\n\t\taddRelatedEntitiesCarousel();\n\t\taddComplementaryEntitiesCarousel();\n\n\t});\n\tresetImagesAndThumbs();\n\n\t/**\n\t * updateProductSizes\n\t */\n\tfunction updateProductSizes($form) {\n\t\tconst sapTitlenumber = $form.data('sapTitlenumber');\n\t\tconst extraSaleProduct = $form.hasClass('extra-sale-product') ? 'extraSaleProduct' : 'default';\n\t\tconst iceHockeyStickProduct = $form.hasClass('ice-hockey-stick-product') ? 'iceHockeyStickProduct' : 'default';\n\t\tconst $container = $form.find('.product-sizes-list-container');\n\n\t\taddFormLoader($form);\n\n\t\t$.ajax({\n\t\t\tdata: {\n\t\t\t\tproductId: sapTitlenumber,\n\t\t\t\textraSaleProduct,\n\t\t\t\ticeHockeyStickProduct\n\t\t\t},\n\t\t\tdataType: 'json',\n\t\t\tmethod: 'GET',\n\t\t\ttimeout: 30000,\n\t\t\turl: '/stage-ajax/productSizesListById/'\n\t\t}).done(function(response) {\n\t\t\tif (response && response.html) {\n\t\t\t\tconst productSizesElem = $form.find('.product-sizes');\n\t\t\t\tconst isExtraSaleProduct = $form.hasClass('extra-sale-product');\n\n\t\t\t\tconst $selectedColor = isExtraSaleProduct ? $form.find('[name*=\"color\"]') : $form.find('[name*=\"color\"]:checked');\n\n\t\t\t\tconst selectedColorValue = $selectedColor.val();\n\t\t\t\tconst selectedSizeName = $form.find('[name*=\"ean\"]:checked').data('name');\n\n\t\t\t\t$container.html(response.html);\n\t\t\t\ttabs(); // Re initialize tabs for ice hockey sticks\n\n\t\t\t\tconst $newSelectedSize = $form.find('.product-sizes-list[data-color=\"' + selectedColorValue + '\"]').find('[name*=\"ean\"][data-name=\"' + selectedSizeName + '\"]');\n\n\t\t\t\tif ($newSelectedSize.length) {\n\t\t\t\t\t$newSelectedSize.prop('checked', true);\n\t\t\t\t}\n\n\t\t\t\t$selectedColor.trigger('productColorChange');\n\n\t\t\t\tproductSizesElem.toggleClass('hidden', response.isOneSize);\n\n\t\t\t\t// Update extra product sizes class if exists\n\t\t\t\tconst oldExtraClass = productSizesElem.data('extraclass');\n\t\t\t\tif (oldExtraClass) {\n\t\t\t\t\t// Remove old\n\t\t\t\t\tproductSizesElem.removeClass(oldExtraClass);\n\t\t\t\t}\n\n\t\t\t\tif (response.extraClass) {\n\t\t\t\t\t// Add new\n\t\t\t\t\tproductSizesElem.addClass(response.extraClass);\n\t\t\t\t}\n\n\t\t\t\t// Update product name if changes based on variation\n\t\t\t\tif (response.customProductName) {\n\t\t\t\t\t$('.js-product-name').text(response.customProductName);\n\t\t\t\t}\n\n\t\t\t\tif (isExtraSaleProduct && response.isOneSize) {\n\t\t\t\t\t$form.find('.product-sizes-list').addClass('one-size');\n\t\t\t\t}\n\t\t\t}\n\t\t}).fail(function(xhr) {\n\t\t\t// if (xhr && xhr.statusText !== 'abort') {\n\t\t\t// \t$container.append($('

', { text: 'Tuotekokojen latauksessa tapahtui virhe!' }));\n\t\t\t// }\n\t\t}).always(function(xhr) {\n\t\t\tremoveFormLoader($form);\n\t\t});\n\t}\n\n\t/**\n\t * productImages\n\t */\n\tfunction productImages() {\n\t\tconst slickOptions = {\n\t\t\tarrows: false,\n\t\t\tdots: false,\n\t\t\tfade: true,\n\t\t\tinfinite: false,\n\t\t\tasNavFor: '.product-thumbs',\n\t\t\tlazyLoad: 'ondemand',\n\t\t\tprevArrow: $images.next().find('.prev'),\n\t\t\tnextArrow: $images.next().find('.next'),\n\t\t\tresponsive: [\n\t\t\t\t{\n\t\t\t\t\tbreakpoint: 1024,\n\t\t\t\t\tsettings: {\n\t\t\t\t\t\tasNavFor: false,\n\t\t\t\t\t\tfade: false,\n\t\t\t\t\t\tarrows: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\t\t\tspeed: 200\n\t\t};\n\n\t\t$images.slick(slickOptions).on({\n\t\t\tinit: function(event, slick, currentSlide, nextSlide) {\n\t\t\t\tcustomPagination(event, slick, currentSlide, nextSlide, $images);\n\t\t\t},\n\t\t\treInit: function(event, slick, currentSlide, nextSlide) {\n\t\t\t\tif (!hideGallery) {\n\t\t\t\t\t// Hide thumbs/dots when only one image (and no video)\n\t\t\t\t\tlet slidesCount = slick.$slides.length\n\t\t\t\t\tif ($('.product-thumbs-video-button').length) {\n\t\t\t\t\t\tslidesCount++;\n\t\t\t\t\t}\n\t\t\t\t\t$images.siblings('.custom-pagination').toggleClass('hidden', slidesCount <= 1);\n\t\t\t\t\t$thumbs.toggleClass('hide-slick-thumbs', slidesCount <= 1);\n\t\t\t\t}\n\t\t\t\tcustomPagination(event, slick, currentSlide, nextSlide, $images);\n\t\t\t},\n\t\t\tafterChange: function(event, slick, currentSlide, nextSlide){\n\t\t\t\tcustomPagination(event, slick, currentSlide, nextSlide, $images);\n\t\t\t}\n\t\t});\n\n\t\t$images.slickLightbox({\n\t\t\tbackground: '#fff',\n\t\t\timageMaxHeight: 1,\n\t\t\titemSelector: 'picture.product-images-slide',\n\t\t\tuseHistoryApi: true,\n\t\t\tlazy: true,\n\t\t\tlayouts: {\n\t\t\t\tcloseButton: ''\n\t\t\t},\n\t\t\tslick: {\n\t\t\t\tarrows: true,\n\t\t\t\tasNavFor: '.product-images, .product-thumbs',\n\t\t\t\tdots: false,\n\t\t\t\tfade: true,\n\t\t\t\tinfinite: false,\n\t\t\t\tslidesToScroll: 1,\n\t\t\t\tlazyLoad: 'ondemand',\n\t\t\t\tprevArrow: '.slick-lightbox-inner .custom-pagination .prev',\n\t\t\t\tnextArrow: '.slick-lightbox-inner .custom-pagination .next',\n\t\t\t\tresponsive: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbreakpoint: 1024,\n\t\t\t\t\t\tsettings: {\n\t\t\t\t\t\t\tarrows: false,\n\t\t\t\t\t\t\tfade: false,\n\t\t\t\t\t\t\tslidesToScroll: 1,\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tspeed: 200\n\t\t\t},\n\t\t\tsrc: function(element) {\n\t\t\t\treturn $(element).find('img').data('lightbox-image');\n\t\t\t}\n\t\t})\n\t\t\t.on({\n\t\t\t\tsetPosition: function() {\n\t\t\t\t\tsetImagesSlideHeight();\n\t\t\t\t},\n\t\t\t\tbeforeChange: function(event, slick, currentSlide, nextSlide) {\n\t\t\t\t\tsetActiveThumbClass(nextSlide);\n\t\t\t\t},\n\t\t\t\t'show.slickLightbox': function() {\n\t\t\t\t\t$body.addClass('slick-lightbox-open');\n\t\t\t\t\t$('.slick-lightbox').addClass('v4-typography');\n\n\t\t\t\t\t/* add class '.slick-lightbox-slick-img' to safari browser to fix issue with images */\n\t\t\t\t\tconst imageElement = document.querySelector('.slick-lightbox-slick-img');\n\t\t\t\t\tconst isSafari = (navigator.userAgent.indexOf('Safari') > -1) && !(navigator.userAgent.indexOf('Chrome') > -1);\n\n\t\t\t\t\tif (isSafari) {\n\t\t\t\t\t\timageElement?.classList.add('slick-lightbox-image-safari');\n\t\t\t\t\t}\n\n\n\t\t\t\t\tconst $slickLightbox = $images[0].slickLightbox.slick;\n\t\t\t\t\tconst $slickLightboxSlick = $slickLightbox[0].slick;\n\t\t\t\t\t$slickLightbox.siblings('.custom-pagination').toggleClass('hidden', $slickLightboxSlick.slideCount <= 1)\n\n\t\t\t\t\t$slickLightbox.find('.slick-lightbox-slick-item').each(function() {\n\t\t\t\t\t\tconst $img = $(this).find('img');\n\t\t\t\t\t\tnew ImageZoomPan($img[0]);\n\n\t\t\t\t\t\t$img.on('zoomChange', function(e) {\n\t\t\t\t\t\t\tconst currentZoom = e.originalEvent.detail.currentZoom;\n\t\t\t\t\t\t\tconst slickEnabled = currentZoom > 1 ? false : true;\n\n\t\t\t\t\t\t\tif ($slickLightboxSlick.slideCount > 1) {\n\t\t\t\t\t\t\t\t$slickLightbox.siblings('.custom-pagination').toggleClass('hidden', !slickEnabled)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t$slickLightbox.slick('slickSetOption', {\n\t\t\t\t\t\t\t\taccessibility: slickEnabled,\n\t\t\t\t\t\t\t\tdraggable: slickEnabled,\n\t\t\t\t\t\t\t\tswipe: slickEnabled,\n\t\t\t\t\t\t\t\ttouchMove: slickEnabled\n\t\t\t\t\t\t\t}, false);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\t$slickLightbox.on('init reInit afterChange', (event, slick, currentSlide, nextSlide) => {\n\t\t\t\t\t\tcustomPagination(event, slick, currentSlide, nextSlide, $slickLightbox);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\t'shown.slickLightbox': function(event, nextSlide) {\n\t\t\t\t\tconst $slickLightbox = $images[0].slickLightbox.slick\n\t\t\t\t\tconst $slickLightboxSlick = $slickLightbox[0].slick\n\t\t\t\t\tcustomPagination(event, $slickLightboxSlick, $slickLightboxSlick.currentSlide, nextSlide, $slickLightbox);\n\t\t\t\t},\n\t\t\t\t'hide.slickLightbox': function() {\n\t\t\t\t\t$body.removeClass('slick-lightbox-open');\n\t\t\t\t},\n\t\t\t});\n\n\t\t$thumbs.slick({\n\t\t\tarrows: true,\n\t\t\tcenterMode: false,\n\t\t\tdots: false,\n\t\t\tfocusOnSelect: false,\n\t\t\tinfinite: false,\n\t\t\tlazyLoad: 'ondemand',\n\t\t\tnextArrow: '

',\n\t\t\tprevArrow: '
',\n\t\t\tslidesToScroll: 1,\n\t\t\tslidesToShow: 7,\n\t\t\tswipeToSlide: false,\n\t\t\tvariableWidth: true\n\t\t})\n\t\t\t.on('click', '.product-thumbs-slide', function() {\n\t\t\t\t$images.slick('slickGoTo', $(this).index());\n\t\t\t});\n\n\t\t$window.on('resize', debounce(function() {\n\t\t\tresetImagesAndThumbs();\n\t\t}, 500));\n\n\t\t$product.find('.product-colors-list-item').on('mouseenter', function() {\n\t\t\tif (!isSingleColumn() && !hasTouchSupport) {\n\t\t\t\tvar $this = $(this);\n\n\t\t\t\tif ($this.find('input:not(:checked)').length) {\n\t\t\t\t\tconst imageSrc = $this.data('imageBig');\n\n\t\t\t\t\tif (imageSrc) {\n\t\t\t\t\t\tconst $currentSlide = $images.find('.product-images-slide.slick-current');\n\n\t\t\t\t\t\tif (!$currentSlide.find('.product-images-preview-overlay').length) {\n\t\t\t\t\t\t\t$('
', { class: 'product-images-preview-overlay' }).appendTo($currentSlide);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst previewImage = new Image();\n\n\t\t\t\t\t\tpreviewImage.onload = function() {\n\t\t\t\t\t\t\tif ($this.filter(':hover').length) {\n\t\t\t\t\t\t\t\t$currentSlide.find('.product-images-preview-overlay').css({ backgroundImage: `url(${imageSrc})` });\n\t\t\t\t\t\t\t\t$images.addClass('show-preview-overlay');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpreviewImage.src = imageSrc;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}).on('mouseleave', function() {\n\t\t\t$images.removeClass('show-preview-overlay');\n\t\t}).on('touchend', function() {\n\t\t\t// Some touch devices may trigger mouseenter event but not mouseleave, so here we have a fix for that\n\t\t\tsetTimeout(function() {\n\t\t\t\t$images.removeClass('show-preview-overlay');\n\t\t\t}, 100);\n\t\t});\n\n\t\t$thumbs.addClass('thumbs-loaded');\n\t}\n\n\t/**\n\t * productForm\n\t */\n\tfunction productFormEvents($form) {\n\t\t$form.on('change productColorChange', '[name*=\"color\"]', function(e) {\n\t\t\tconst extraSaleProduct = $form.hasClass('extra-sale-product');\n\t\t\tconst $selectedColorSizes = $form.find('.product-sizes-list[data-color=\"' + $(this).val() + '\"]');\n\t\t\tconst $selectedSize = extraSaleProduct ? $form.find('[name*=\"ean\"] option:selected') : $form.find('[name*=\"ean\"]:checked');\n\t\t\tconst $newSelectedSize = $selectedColorSizes.find('[name*=\"ean\"][data-name=\"' + $selectedSize.data('name') + '\"]');\n\n\t\t\tclearFormMessages($form);\n\n\t\t\t$form.find('.product-sizes-list').addClass('hidden');\n\t\t\t$selectedColorSizes.removeClass('hidden');\n\n\t\t\tconst colorName = $(this).data('name');\n\t\t\t$form.find('.product-colors-current-color').text(colorName);\n\n\t\t\t$product.trigger('selectColor', [ colorName ]);\n\n\t\t\tif ($selectedSize.length && $newSelectedSize.length) {\n\t\t\t\t$selectedSize.prop('checked', false);\n\t\t\t\t$newSelectedSize.prop('checked', true).trigger('change');\n\n\t\t\t\t// DISABLED:\n\t\t\t\t// updateImagesOverylayText($newSelectedSize.closest('.product-sizes-list-item').find('.product-form-tooltip').text());\n\t\t\t} else {\n\t\t\t\t$form.find('.add-to-cart-button').toggleClass('disabled', false);\n\n\t\t\t\tconst ccButton = $form.find('.click-and-collect-button');\n\t\t\t\tif (ccButton) {\n\t\t\t\t\tconst sellingEnabled = ccButton.data('selling-enabled') === '1';\n\t\t\t\t\tif (sellingEnabled) {\n\t\t\t\t\t\tccButton.toggleClass('disabled', false);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// DISABLED:\n\t\t\t\t// updateImagesOverylayText($this.closest('.product-colors-list-item').find('.product-form-tooltip').text());\n\t\t\t}\n\n\t\t\tif (extraSaleProduct) {\n\t\t\t\tconst productThumb = ($form.find('[name*=\"color\"] option:selected').data('thumb'));\n\t\t\t\t$form.find('.product-image img').attr('src', productThumb);\n\t\t\t}\n\n\t\t\tif (e.type === 'change') {\n\t\t\t\tresetImagesAndThumbs();\n\t\t\t}\n\n\t\t});\n\n\t\tif ($form.hasClass('extra-sale-product')) {\n\t\t\t$form.find('[name*=\"color\"]').trigger('change');\n\t\t} else {\n\t\t\t$form.find('[name*=\"color\"]:checked').trigger('change');\n\t\t}\n\n\t\t// user changes color\n\t\t$form.on('change', '.product-colors [name=\"color\"]', function(e) {\n\t\t\tpushProductDetailViewToDatalayer($form);\n\t\t});\n\n\t\t$form.on('change', '[name*=\"ean\"]', function() {\n\t\t\tconst $this = $(this);\n\n\t\t\tconst {\n\t\t\t\tavailableInWeb,\n\t\t\t\tavailableInStores,\n\t\t\t\tavailableForPreorder,\n\t\t\t\tisLastOfSize,\n\t\t\t\ticeHockeyFlex,\n\t\t\t\tprice\n\t\t\t} = $this.data();\n\n\t\t\tconst selectedColorValue = $form.find('[name*=\"color\"]:checked').val();\n\t\t\tconst $addToCartBtn = $form.find('.buy-button');\n\t\t\tconst $preorderBtn = $form.find('.preorder-button');\n\t\t\tconst $clickAndCollectBtn = $form.find('.click-and-collect-button');\n\t\t\tconst $preorderInfo = $form.find('#product-preorder-info-container');\n\n\t\t\tclearFormMessages($form);\n\n\t\t\t$product.trigger('selectSize', [{\n\t\t\t\tsize: $this.data('name'),\n\t\t\t\tean: $this.val()\n\t\t\t}]);\n\n\t\t\tif ($this.closest('.product-sizes-list[data-color=\"' + selectedColorValue + '\"]').length) {\n\t\t\t\t$addToCartBtn.toggleClass('disabled', !availableInWeb);\n\t\t\t\t$addToCartBtn.toggleClass('hidden', availableForPreorder);\n\t\t\t\t$preorderBtn.toggleClass('hidden', !availableForPreorder);\n\t\t\t\t$preorderInfo.toggleClass('hidden', !availableForPreorder);\n\n\t\t\t\t$form.find('input[name=\"preorder\"]').val(+availableForPreorder);\n\t\t\t\t$clickAndCollectBtn.toggleClass('disabled', !availableInStores);\n\n\t\t\t\tif (!availableInWeb && !availableForPreorder && $addToCartBtn.length) {\n\t\t\t\t\tshowFormMessage($addToCartBtn.data('disabledInfoText'), true, $form);\n\t\t\t\t} else if (isLastOfSize) {\n\t\t\t\t\tshowFormMessage($form.data('lastOfSizeText'), true, $form);\n\t\t\t\t} else if (!availableInStores && $clickAndCollectBtn.length) {\n\t\t\t\t\t// DISABLED:\n\t\t\t\t\t// showFormMessage($clickAndCollectBtn.data('disabledInfoText'), true);\n\t\t\t\t}\n\n\t\t\t\t// DISABLED:\n\t\t\t\t// updateImagesOverylayText($this.closest('.product-sizes-list-item').find('.product-form-tooltip').text());\n\n\t\t\t\t// Update info based on variation if available\n\t\t\t\tif (typeof iceHockeyFlex !== 'undefined' && iceHockeyFlex) {\n\t\t\t\t\t$('.additional-field-value--jaykkyys-flex').text(iceHockeyFlex);\n\t\t\t\t}\n\t\t\t\t// Update price based on variation if available\n\t\t\t\tif (typeof price !== 'undefined' && price) {\n\t\t\t\t\t$product.find('.js-product-price').text(price + ' €');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$addToCartBtn.toggleClass('disabled', false);\n\t\t\t\t$clickAndCollectBtn.toggleClass('disabled', false);\n\n\t\t\t\t// DISABLED:\n\t\t\t\t// updateImagesOverylayText('');\n\t\t\t}\n\t\t});\n\n\t\t$form.on('click', '.add-to-cart-button, .click-and-collect-button, .drop-shipping-button', function(e) {\n\t\t\tconst $this = $(this);\n\t\t\tlet selectedColorValue;\n\t\t\tlet checked;\n\t\t\tlet selected;\n\n\t\t\tif ($form.hasClass('extra-sale-product')) {\n\t\t\t\tselectedColorValue = $form.find('.product-colors-list').val();\n\t\t\t\tselected = $form.find('[name*=\"ean\"]:visible').val();\n\t\t\t} else {\n\t\t\t\tselectedColorValue = $form.find('[name*=\"color\"]:checked').val();\n\t\t\t\tchecked = $form.find('[name*=\"ean\"]:checked').closest('.product-sizes-list[data-color=\"' + selectedColorValue + '\"]').length;\n\t\t\t}\n\n\t\t\tif (checked > 0 || selected) {\n\t\t\t\tif ($this.hasClass('disabled')) {\n\t\t\t\t\tshowFormMessage($this.data('disabledInfoText'), true, $form);\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tshowFormMessage($form.data('sizeInfoText'), true, $form);\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t});\n\n\t\t$form.on('submit', function(e) {\n\t\t\tconst $submit = $form.find('button[type=\"submit\"]');\n\t\t\tconst amount = $form.find('input[name=\"amount\"]').val();\n\t\t\tconst ean = $form.hasClass('extra-sale-product') ? $form.find('select[name=\"ean\"]:visible').val() : $form.find('input[name=\"ean\"]:checked').val();\n\t\t\tconst preorder = $form.find('input[name=\"preorder\"]').val() || false;\n\t\t\tconst formErrorMessage = $form.data('formErrorText');\n\n\t\t\t$submit.prop('disabled', true);\n\t\t\tclearFormMessages($form);\n\t\t\taddFormLoader($form);\n\n\t\t\tconst additional = {};\n\t\t\tconst eans = [ean];\n\t\t\t$form.find('input[name=\"question[]\"]').each((index, el) => {\n\t\t\t\tconst $el = $(el);\n\t\t\t\tswitch ($el.data('type')) {\n\t\t\t\tcase 'number':\n\t\t\t\t\tadditional[$el.data('label')] = el.value + ' ' + $el.data('unit');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'boolean':\n\t\t\t\t\tadditional[$el.data('label')] = el.checked ? 'kyllä' : 'ei';\n\t\t\t\t\tif (el.checked && $el.data('ean')) {\n\t\t\t\t\t\teans.push($el.data('ean'));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tadditional[$el.data('label')] = el.value;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tcart.addItem(eans, amount, '', additional, preorder).then(function(response) {\n\t\t\t\tif (response && response.result === 1) {\n\t\t\t\t\theaderCart.updateHeaderCart(true, response.cart, false, response.itemId);\n\t\t\t\t\t/*showFormMessage(formSuccessMessage, null, $form); Removed because there is no need for the message (we have already popup of items added to cart */\n\n\t\t\t\t\tconst {\n\t\t\t\t\t\tsapTitlenumber,\n\t\t\t\t\t\tproductName,\n\t\t\t\t\t\tbrandName,\n\t\t\t\t\t\tsports,\n\t\t\t\t\t\ttargetgroup,\n\t\t\t\t\t\tsaleProduct,\n\t\t\t\t\t\tproductType,\n\t\t\t\t\t\tcarousel,\n\t\t\t\t\t\tsearchWords\n\t\t\t\t\t} = $form.data();\n\n\t\t\t\t\tconst $selectedColor = $form.find('input[name=\"color\"]:checked');\n\t\t\t\t\tconst colorName = $selectedColor.data('name');\n\t\t\t\t\tconst colorValue = $selectedColor.val();\n\t\t\t\t\tconst price = parseFloat($product.find('.product-price-current').text());\n\n\t\t\t\t\tGoogleTagManager.addToCart(\n\t\t\t\t\t\tsapTitlenumber,\n\t\t\t\t\t\tean,\n\t\t\t\t\t\tamount,\n\t\t\t\t\t\tcolorName,\n\t\t\t\t\t\tcolorValue,\n\t\t\t\t\t\tproductName,\n\t\t\t\t\t\tbrandName,\n\t\t\t\t\t\t$form.data('category-path'),\n\t\t\t\t\t\tsports,\n\t\t\t\t\t\ttargetgroup,\n\t\t\t\t\t\t$form.data('full-category-path'),\n\t\t\t\t\t\tprice,\n\t\t\t\t\t\tsaleProduct,\n\t\t\t\t\t\tproductType,\n\t\t\t\t\t\tcarousel,\n\t\t\t\t\t\tsearchWords\n\t\t\t\t\t);\n\n\t\t\t\t\tif ($form.hasClass('extra-sale-product')) {\n\t\t\t\t\t\tGoogleTagManager.extraSaleAddToCart(productName);\n\t\t\t\t\t}\n\n\t\t\t\t\treturn true;\n\t\t\t\t} else if (response && response.messages && response.messages.length) {\n\t\t\t\t\tshowFormMessage(response.messages[0].message, true, $form);\n\t\t\t\t} else {\n\t\t\t\t\tshowFormMessage(formErrorMessage, true, $form);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}).catch(function(error) {\n\t\t\t\treturn showFormMessage(formErrorMessage, true, $form);\n\t\t\t}).finally(function() {\n\t\t\t\tremoveFormLoader($form);\n\t\t\t\t$submit.prop('disabled', false);\n\t\t\t});\n\n\t\t\te.preventDefault();\n\t\t});\n\n\t\t// Unselect radio when changing tabs\n\t\t$form[0].addEventListener('tab.open', function(e) {\n\t\t\tconst selectedSize = $form.find('[name*=\"ean\"]:checked');\n\t\t\tif (selectedSize.length) {\n\t\t\t\tconst sizeParent = selectedSize.closest('#' + e.detail.contentId);\n\t\t\t\tif (!sizeParent.length) {\n\t\t\t\t\tselectedSize.prop('checked', false);\n\n\t\t\t\t\t// Clear form messages\n\t\t\t\t\tclearFormMessages($form);\n\n\t\t\t\t\t// Reset button styles\n\t\t\t\t\tconst $addToCartBtn = $form.find('.buy-button');\n\t\t\t\t\tconst $clickAndCollectBtn = $form.find('.click-and-collect-button');\n\n\t\t\t\t\t$addToCartBtn.toggleClass('disabled', false);\n\t\t\t\t\t$clickAndCollectBtn.toggleClass('disabled', false);\n\t\t\t\t}\n\t\t\t}\n\t\t}, false);\n\n\t}\n\n\t/**\n\t * addFormLoader\n\t */\n\tfunction addFormLoader($form) {\n\t\tconst $formAlertContainer = $form.find('.product-alert-container');\n\n\t\tremoveFormLoader($form);\n\n\t\t$('
', { class: 'product-form-loader' })\n\t\t\t.append($('
', { class: 'spinner-loader-circle' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle2' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle3' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle4' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle5' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle6' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle7' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle8' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle9' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle10' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle11' }))\n\t\t\t.append($('
', { class: 'spinner-loader-circle spinner-loader-circle12' }))\n\t\t\t.appendTo($formAlertContainer);\n\t}\n\n\t/**\n\t * removeFormLoader\n\t */\n\tfunction removeFormLoader($form) {\n\t\tconst $formAlertContainer = $form.find('.product-alert-container');\n\t\t$formAlertContainer.find('.product-form-loader').remove();\n\t}\n\n\t/**\n\t * showFormMessage\n\t *\n\t * @param {String} msg\n\t * @param {Boolean} isError\n\t */\n\tfunction showFormMessage(msg, isError, $form) {\n\t\tconst $formAlertContainer = $form.find('.product-alert-container');\n\n\t\tclearFormMessages($form);\n\t\t$('
', { class: 'product-form-alert' + (isError ? ' is-error' : ''), text: msg }).appendTo($formAlertContainer);\n\t}\n\n\t/**\n\t * showFormMessage\n\t */\n\tfunction clearFormMessages($form) {\n\t\tconst $formAlertContainer = $form.find('.product-alert-container');\n\t\t$formAlertContainer.find('.product-form-alert').remove();\n\t}\n\n\t/**\n\t * resetImagesAndThumbs\n\t *\n\t * @param {Number} pos\n\t */\n\tfunction resetImagesAndThumbs(pos = 0) {\n\t\tconst color = $productForms.find('[name*=\"color\"]:checked').val();\n\n\t\t$images.removeClass('show-preview-overlay');\n\n\t\t$images.add($thumbs).slick('slickUnfilter');\n\t\t$images.add($thumbs).slick('slickFilter', `[data-color${color ? `=\"${color}\"` : '' }]`);\n\n\t\tsetThumbsWidth();\n\t\tsetActiveThumbClass(pos);\n\n\t\t$images.removeClass('show-preview-overlay');\n\t\t$images.slick('slickGoTo', pos, true);\n\t\tsetImagesSlideHeight();\n\n\t\tutils.addObjectFitPolyfill();\n\t}\n\n\t/**\n\t * setThumbsWidth\n\t */\n\tfunction setThumbsWidth() {\n\t\tif (!isSingleColumn()) {\n\t\t\tlet thumbsTotalWidth = 0;\n\t\t\tlet slidesToShow;\n\n\t\t\t$thumbs[0].slick.$slides.each(function() {\n\t\t\t\tthumbsTotalWidth += $(this).outerWidth(true);\n\t\t\t});\n\n\t\t\t$thumbs.width('');\n\n\t\t\tif (thumbsTotalWidth < $thumbs.width()) {\n\t\t\t\tslidesToShow = 10;\n\t\t\t\t$thumbs.width(thumbsTotalWidth);\n\t\t\t} else {\n\t\t\t\tslidesToShow = 7;\n\t\t\t}\n\n\t\t\t$thumbs.slick('slickSetOption', 'slidesToShow', slidesToShow, true);\n\t\t}\n\t}\n\n\t/**\n\t * setImagesSlideHeight\n\t */\n\tfunction setImagesSlideHeight() {\n\t\tconst $slides = $images.find('.product-images-slide').css('height', '');\n\n\t\t// For mobile: get the height from the tallest image (but no more than the width of the image)\n\t\t// For desktop: set height the same as the image width\n\t\tif (isSingleColumn()) {\n\t\t\tconst imageHeights = $slides.map(function() {\n\t\t\t\treturn $(this).find('img').height();\n\t\t\t}).get();\n\n\t\t\t$slides.height(Math.min($slides.width(), Math.max.apply(null, imageHeights)));\n\t\t} else {\n\t\t\t$slides.each(function() {\n\t\t\t\tvar $this = $(this);\n\t\t\t\t$this.height($this.find('img').width());\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * setActiveThumbClass\n\t *\n\t * @param {Number} i\n\t */\n\tfunction setActiveThumbClass(i = 0) {\n\t\tif (!isSingleColumn()) {\n\t\t\t$thumbs.find('.product-thumbs-slide').removeClass('slick-real-active').eq(i).addClass('slick-real-active');\n\t\t}\n\t}\n\n\t/**\n\t * accordion\n\t */\n\tfunction accordion() {\n\t\tconst $collapses = $product.find('.v4-product-collapse .collapse-wrapper');\n\n\t\t$collapses\n\t\t\t.on('show.bs.collapse', function() {\n\t\t\t\t$collapses.not(this).each(function() {\n\t\t\t\t\t$('.collapse-trigger[data-target=\"#' + $(this).attr('id') + '\"]:not(.collapsed)').trigger('click');\n\t\t\t\t});\n\t\t\t})\n\t\t\t.on('shown.bs.collapse', function() {\n\t\t\t\tconst pos = $('.collapse-trigger[data-target=\"#' + $(this).attr('id') + '\"]').offset().top - $('.header-content-mobile').outerHeight();\n\n\t\t\t\tif ($window.scrollTop() > pos) {\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t$('html, body').stop(true).animate({\n\t\t\t\t\t\t\tscrollTop: pos\n\t\t\t\t\t\t}, 300);\n\t\t\t\t\t}, 50);\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t/**\n\t * isSingleColumn\n\t *\n\t * @return {Boolean}\n\t */\n\tfunction isSingleColumn() {\n\t\treturn $window.width() < 1024;\n\t}\n\n\t/**\n * Check if element is fully visible in the viewport\n *\n * @param {Element} el\n *\n * @return {Boolean}\n */\n\tfunction isElementInViewport(el) {\n\t\tconst rect = el.getBoundingClientRect();\n\n\t\treturn rect.bottom >= 0\n && rect.right >= 0\n && rect.left <= ((window.innerWidth || document.documentElement.clientWidth) && rect.width)\n && rect.top <= ((window.innerHeight || document.documentElement.clientHeight) && rect.height);\n\t}\n\n\t/**\n * Add product list items campaign classes.\n * Uses global campaignClassMapping and item data-campaigns attribute\n *\n * @param {jQuery} $container\n */\n\tfunction addCampaignClasses($container) {\n\t\tif (!window.mapping || !window.mapping.campaignClass || !$container.length) {\n\t\t\treturn;\n\t\t}\n\n\t\t$container.find('[data-campaigns]:not(.cclass-added)').each(function () {\n\t\t\tconst $item = $(this);\n\t\t\tconst ids = String($item.data('campaigns')).split(',');\n\t\t\tfor (let n = 0; n < ids.length; n++) {\n\t\t\t\t$item.addClass('cclass-added ' + window.mapping.campaignClass[ids[n]]);\n\t\t\t}\n\t\t\t//$item.find('.list-badges').append('
');\n\t\t});\n\t}\n\n\t/**\n * Fetch user's recently viewed products carousel via AJAX and place it to the page\n */\n\tfunction addRecentlyViewedProductsCarousel() {\n\t\tconst $container = $('#recently-viewed-products');\n\t\tconst userProducts = trackPages.getPage('product');\n\n\t\tif (userProducts && userProducts.length) {\n\t\t\t$.ajax({\n\t\t\t\tdata: {\n\t\t\t\t\ttype: 'recentlyViewed',\n\t\t\t\t\tproducts: userProducts,\n\t\t\t\t\tproduct: $productForms.data('sapTitlenumber')\n\t\t\t\t},\n\t\t\t\tdataType: 'text',\n\t\t\t\tmethod: 'GET',\n\t\t\t\ttimeout: 30000,\n\t\t\t\turl: '/stage-ajax/getProductCarousel/'\n\t\t\t}).done(function(response) {\n\t\t\t\tif (response) {\n\t\t\t\t\t$container.html(response);\n\t\t\t\t\tconst $carousel = $container.find('.product-carousel');\n\t\t\t\t\tproductCarousel($carousel);\n\t\t\t\t\tproductListItems($carousel);\n\n\t\t\t\t\tconst carouselProductAmount = $carousel.find('.product-list-item').length;\n\t\t\t\t\tif(carouselProductAmount <= 2) {\n\t\t\t\t\t\t$carousel.find('.slick-track').css('margin', 'auto');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}).fail(function(xhr) {\n\t\t\t}).always(function(xhr) {\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n * Fetch similar products carousel via AJAX and place it to the page. DEPRECATED!\n\t * Replaced with loop54 related entities carousel.\n */\n\tfunction addCrossSellProductCarousel() {\n\t\tconst $container = $('#popular-products');\n\t\tlet params;\n\t\ttry {\n\t\t\tparams = JSON.parse(decodeURIComponent($productForms.data('product-metadata')));\n\t\t} catch(e) {\n\t\t\tconsole.log(e);\n\t\t}\n\n\t\tif (params) {\n\t\t\tparams.type = 'crossSell';\n\t\t\t$.ajax({\n\t\t\t\tdata: { sapId: params.sapId, length: 4},\n\t\t\t\tdataType: 'text',\n\t\t\t\turl: '/stage-ajax/getProductBreadcrumb/'\n\t\t\t}).then(res => {\n\t\t\t\tconst breadcrumbs = res?.length ? res : [];\n\t\t\t\tparams.breadcrumbs = breadcrumbs;\n\n\t\t\t\t$.ajax({\n\t\t\t\t\tdata: params,\n\t\t\t\t\tdataType: 'text',\n\t\t\t\t\turl: '/stage-ajax/getProductCarousel/'\n\t\t\t\t}).done(res => {\n\t\t\t\t\tif (res) {\n\t\t\t\t\t\t$container.html(res);\n\t\t\t\t\t\tconst $carousel = $container.find('.product-carousel');\n\t\t\t\t\t\tproductCarousel($carousel);\n\t\t\t\t\t\tproductListItems($carousel);\n\t\t\t\t\t}\n\t\t\t\t}).fail(xhr => {});\n\t\t\t})\n\t\t}\n\t}\n\n\t/**\n\t * Fetch related entities (loop54) products carousel via AJAX and place it to the page.\n\t */\n\tfunction addRelatedEntitiesCarousel() {\n\t\ttry {\n\t\t\tconst { sapId = '' } = JSON.parse(decodeURIComponent($productForms.data('product-metadata')));\n\t\t\tconst $container = $('#related-entities-carousel');\n\n\t\t\t$.ajax({\n\t\t\t\tdata: { sapId, length: 4},\n\t\t\t\tdataType: 'text',\n\t\t\t\turl: '/stage-ajax/getProductBreadcrumb/'\n\t\t\t}).then(res => {\n\t\t\t\tconst breadcrumbs = res?.length ? res : [];\n\t\t\t\tconst userId = loop54Connector.getId();\n\t\t\t\tconst checkedColor = $('.product-colors-list input:checked').val();\n\t\t\t\tconst params = {\n\t\t\t\t\tuserId,\n\t\t\t\t\tproduct: { sapId, color: checkedColor },\n\t\t\t\t\tbreadcrumbs,\n\t\t\t\t\ttype: 'relatedEntities'\n\t\t\t\t};\n\n\t\t\t\tif (params.userId) {\n\t\t\t\t\t$.ajax({\n\t\t\t\t\t\tdata: params,\n\t\t\t\t\t\tdataType: 'text',\n\t\t\t\t\t\turl: '/stage-ajax/getProductCarousel/'\n\t\t\t\t\t}).done(res => {\n\t\t\t\t\t\tif (res) {\n\t\t\t\t\t\t\t$container.html(res);\n\t\t\t\t\t\t\tconst $carousel = $container.find('.product-carousel');\n\t\t\t\t\t\t\tproductCarousel($carousel);\n\t\t\t\t\t\t\tproductListItems($carousel);\n\t\t\t\t\t\t}\n\t\t\t\t\t}).fail(xhr => {});\n\t\t\t\t}\n\t\t\t})\n\t\t} catch(e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n\n\t/**\n\t * Fetch complementary entities (loop54) products carousel via AJAX and place it to the page.\n\t */\n\tfunction addComplementaryEntitiesCarousel() {\n\t\tconst $container = $('#complementary-entities-carousel');\n\t\tconst params = {};\n\t\ttry {\n\t\t\tconst userId = loop54Connector.getId();\n\t\t\tparams.userId = userId;\n\t\t\tconst { sapId } = JSON.parse(decodeURIComponent($productForms.data('product-metadata')));\n\t\t\tconst checkedColor = $('.product-colors-list input:checked').val();\n\t\t\tparams.product = { sapId, color: checkedColor }\n\t\t} catch(e) {\n\t\t\tconsole.log(e);\n\t\t}\n\n\t\tif (params.userId) {\n\t\t\tparams.type = 'complementaryEntities';\n\t\t\t$.ajax({\n\t\t\t\tdata: params,\n\t\t\t\tdataType: 'text',\n\t\t\t\turl: '/stage-ajax/getProductCarousel/'\n\t\t\t}).done(res => {\n\t\t\t\tif (res) {\n\t\t\t\t\t$container.html(res);\n\t\t\t\t\tconst $carousel = $container.find('.product-carousel');\n\t\t\t\t\tproductCarousel($carousel);\n\t\t\t\t\tproductListItems($carousel);\n\t\t\t\t}\n\t\t\t}).fail(xhr => {});\n\t\t}\n\t}\n\n\t/**\n\t * Push new product detail view to dataLayer when user\n\t * changes color in product page.\n\t */\n\tfunction pushProductDetailViewToDatalayer($form) {\n\t\tconst productDetail = window.productDetailDataObject;\n\t\tif (productDetail) {\n\t\t\tconst productDetailCopy = cloneDeep(productDetail);\n\t\t\tconst sapId = objectPath.get(productDetailCopy, 'ecommerce.detail.products.0.id');\n\t\t\tconst selectedColorValue = $form.find('.product-colors [name=\"color\"]:checked').val();\n\t\t\tconst dim16 = `${sapId ? sapId : ''}_${selectedColorValue}`\n\t\t\tobjectPath.set(productDetailCopy, 'ecommerce.detail.products.0.dimension16', dim16);\n\n\t\t\tif (window.GoogleTagManager.isEnabled()) {\n\t\t\t\twindow.GoogleTagManager.productDetailView(productDetailCopy);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n * Datalayer events\n */\n\tfunction dataLayerEvents() {\n\t\tconst isGaEnabled = utils.isGaAvailable();\n\t\tlet scrollTimer;\n\n\t\t$document\n\t\t\t.on('click', '.carousel-filter', function() {\n\t\t\t\tconst $elem = $(this);\n\n\t\t\t\tif ($elem.closest('#popular-products').length) {\n\t\t\t\t\twindow.dataLayer.push({\n\t\t\t\t\t\t'event': 'GAEvent',\n\t\t\t\t\t\t'eventCategory': 'Carousel',\n\t\t\t\t\t\t'eventAction': 'Select target group',\n\t\t\t\t\t\t'eventLabel': $elem.text()\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('click', '.product-list-item.slick-slide', function(e) {\n\t\t\t\tconst $elem = $(this);\n\t\t\t\tconst eventLabel = `${$elem.find('.product-name .brand').text()} ${$elem.find('.product-name .name').text()}`\n\t\t\t\tconst targetLocation = $elem.find('.product-link').attr('href');\n\t\t\t\tconst isRelatedEntitiesCarousel = $elem.parents('#related-entities-carousel').length > 0;\n\t\t\t\tconst isComplementaryEntitiesCarousel = $elem.parents('#complementary-entities-carousel').length > 0;\n\t\t\t\tconst isStageCarousel = $elem.parents('#popular-products').length > 0;\n\n\t\t\t\tif (isStageCarousel) {\n\t\t\t\t\twindow.dataLayer.push({\n\t\t\t\t\t\t'event': 'GAEvent',\n\t\t\t\t\t\t'eventCategory': 'Carousel',\n\t\t\t\t\t\t'eventAction': 'Open product',\n\t\t\t\t\t\t'eventLabel': eventLabel,\n\t\t\t\t\t\t'eventCallback': () => document.location = targetLocation,\n\t\t\t\t\t\t'eventTimeout': 2000\n\t\t\t\t\t});\n\n\t\t\t\t\tif (isGaEnabled) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t} else if (isRelatedEntitiesCarousel || isComplementaryEntitiesCarousel) {\n\t\t\t\t\tconst $productListItem = $elem.closest('.product-list-item');\n\t\t\t\t\tconst { identifier } = $productListItem.data()\n\t\t\t\t\tconst entity = { type: 'Product', id: identifier };\n\n\t\t\t\t\tloop54Connector.createEvent('click', entity, () => {\n\t\t\t\t\t\tif (isRelatedEntitiesCarousel) {\n\t\t\t\t\t\t\twindow.dataLayer.push({\n\t\t\t\t\t\t\t\t'event': 'GAEvent',\n\t\t\t\t\t\t\t\t'eventCategory': 'Carousel',\n\t\t\t\t\t\t\t\t'eventAction': 'Open product',\n\t\t\t\t\t\t\t\t'eventLabel': eventLabel,\n\t\t\t\t\t\t\t\t'eventCallback': () => document.location = targetLocation,\n\t\t\t\t\t\t\t\t'eventTimeout': 2000\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// skip GA event for complementary entities carousel for better AB test results, remove \"else\" after AB test\n\t\t\t\t\t\t\tdocument.location = targetLocation\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tif (isGaEnabled) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('click', '.slick-arrow', function() {\n\t\t\t\tconst $elem = $(this);\n\n\t\t\t\tif ($elem.closest('#popular-products').length) {\n\t\t\t\t\twindow.dataLayer.push({\n\t\t\t\t\t\t'event': 'GAEvent',\n\t\t\t\t\t\t'eventCategory': 'Carousel',\n\t\t\t\t\t\t'eventAction': 'Browse products',\n\t\t\t\t\t\t'eventLabel': '-'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('swipe', '.product-carousel', function() {\n\t\t\t\tconst $elem = $(this);\n\n\t\t\t\tif ($elem.closest('#popular-products').length) {\n\t\t\t\t\twindow.dataLayer.push({\n\t\t\t\t\t\t'event': 'GAEvent',\n\t\t\t\t\t\t'eventCategory': 'Carousel',\n\t\t\t\t\t\t'eventAction': 'Browse products',\n\t\t\t\t\t\t'eventLabel': '-'\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('scroll.popularProducts', function() {\n\t\t\t\tif (scrollTimer)\n\t\t\t\t\tclearTimeout(scrollTimer);\n\n\t\t\t\tscrollTimer = setTimeout(function() {\n\t\t\t\t\tif ($('#popular-products').length && isElementInViewport($('#popular-products')[0])) {\n\t\t\t\t\t\t$(document).off('scroll.popularProducts');\n\n\t\t\t\t\t\twindow.dataLayer.push({\n\t\t\t\t\t\t\t'event': 'GAEvent',\n\t\t\t\t\t\t\t'eventCategory': 'Carousel',\n\t\t\t\t\t\t\t'eventAction': 'Show carousel',\n\t\t\t\t\t\t\t'eventLabel': 'Popular products'\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, 100);\n\t\t\t})\n\t\t\t.on('click', '.product-breadcrumb-link', function() {\n\t\t\t\twindow.dataLayer.push({\n\t\t\t\t\t'event': 'GAEvent',\n\t\t\t\t\t'eventCategory': 'Product Page',\n\t\t\t\t\t'eventAction': 'Click Breadcrumb',\n\t\t\t\t\t'eventLabel': $(this).text()\n\t\t\t\t});\n\t\t\t});\n\t}\n}\n","/* General simple helpers */\n\n// Is user opening the page into a new tab?\n// This does not include opening from context menu (right click menu)\nfunction openingToNewTab(e) {\n\tlet tab = false;\n\tif (e.type === 'auxclick') {\n\t\ttab = true;\n\t} else if (e.type === 'click') {\n\t\tif (e.ctrlKey || e.metaKey) {\n\t\t\ttab = true;\n\t\t}\n\t}\n\n\treturn tab;\n}\n\nfunction removeURLParameter(url, parameter) {\n\t//prefer to use l.search if you have a location/link object\n\tvar urlparts = url.split('?');\n\tif (urlparts.length >= 2) {\n\n\t\tvar prefix = encodeURIComponent(parameter) + '=';\n\t\tvar pars = urlparts[1].split(/[&;]/g);\n\n\t\t//reverse iteration as may be destructive\n\t\tfor (var i = pars.length; i-- > 0;) {\n\t\t\t//idiom for string.startsWith\n\t\t\tif (pars[i].lastIndexOf(prefix, 0) !== -1) {\n\t\t\t\tpars.splice(i, 1);\n\t\t\t}\n\t\t}\n\n\t\treturn urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : '');\n\t}\n\n\treturn url;\n}\n\nexport { openingToNewTab, removeURLParameter };\n","'use strict';\n\nimport $ from 'jquery';\nimport Mustache from 'mustache';\nimport utils from '../util';\nimport getToken from '../api/token';\nimport { getShops } from '../api/shops';\nimport { getUser } from '../api/users';\nimport Promise from 'bluebird';\nimport { inputFilteringEvents } from '../util/form';\n\nexport default function (renderNow) {\n\tconst $window = $(window);\n\tconst $document = $(document);\n\tconst $html = $('html');\n\tconst $productForm = $('.v4-product-card form');\n\tconst $clickAndCollect = $('.v4-product-click-and-collect');\n\tconst template = $('#template-click-and-collect').html();\n\n\tconst templateData = {\n\t\treservation: {},\n\t\tproduct: {},\n\t\terrors: {},\n\t\tgeoLocation: {},\n\t\tloaders: {},\n\t\tstores: [],\n\t\tcities: [],\n\t\thasStores: false,\n\t\tselectFirstOption: false,\n\t\tdisableCc: false,\n\t\tdisableCcTitle: '',\n\t\tdisableCcText: '',\n\t\tformatPrice: function () {\n\t\t\treturn function (text, render) {\n\t\t\t\treturn formatPrice(render(text));\n\t\t\t};\n\t\t},\n\t};\n\n\tlet loggedIn = 0;\n\n\tconst shipmentTypes = {\n\t\tposti: {\n\t\t\tdefault: 7.9,\n\t\t\tclub: 5.9,\n\t\t},\n\t\tkotiintoimitus: {\n\t\t\tdefault: 9.9,\n\t\t\tclub: 7.9,\n\t\t},\n\t\tspecial: {\n\t\t\tdefault: 49.9,\n\t\t\tclub: 24.9,\n\t\t},\n\t\tnouto: {\n\t\t\tdefault: 0,\n\t\t\tclub: 0,\n\t\t},\n\t};\n\n\tconst customShipmentTypes = [];\n\n\tfunction isValidDateObject(date) {\n\t\treturn date instanceof Date && !isNaN(date)\n\t}\n\n\tfunction isValidSaleCampaignProduct(saleCampaignIds, productCampaignIds) {\n\t\tconst productsCampaigns = productCampaignIds?.toString().split(',') || [];\n\t\treturn productsCampaigns.some(productCampaign => saleCampaignIds.includes(productCampaign))\n\t}\n\n\tconst isAdmin = window.location.href.includes('admin') || window.location.href.includes('vcap.me');\n\tconst isLoggedIn = window.user?.loggedIn === true;\n\tconst productData = $productForm.data();\n\n\t// Overrides default C&P shipment types. If these are not set, defaults will be used.\n\t// Currently only used for SUP boards - they use slightly different \"kotiintoimitus\" style shipment type and the price is different.\n\t// I.e. it's a \"semi-special\" shipment type.\n\tif (window.ccShipmentTypes && (window.ccShipmentTypes !== 'false')) {\n\t\ttry {\n\t\t\tconst ccShipmentTypes = window.ccShipmentTypes;\n\t\t\tif (Array.isArray(ccShipmentTypes)) {\n\t\t\t\tfor (const shipmentType of ccShipmentTypes) {\n\t\t\t\t\tcustomShipmentTypes.push(shipmentType);\n\t\t\t\t\tshipmentTypes[shipmentType.id] = {\n\t\t\t\t\t\tdefault: shipmentType.default,\n\t\t\t\t\t\tclub: shipmentType.club,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Could not parse shipment types, will use defaults.\n\t\t}\n\n\t}\n\n\tconst now = new Date();\n\n\t// Different campaigns (plussa, club/loggedIn, and brand) can be scheduled but only one campaign can be active at once.\n\t// Edit this data for new campaigns\n\tconst campaignSaleData = [\n\t\t{\n\t\t\tcampaignType: 'plussa', // plussa sale\n\t\t\tstart: new Date('2023-09-28 00:01:00'),\n\t\t\tend: new Date('2023-10-02 23:59:00'),\n\t\t\tsaleBannerText: 'Syöttämällä Plussa-korttisi numeron saat 20% alennuksen tästä tuotteesta.',\n\t\t\tsalePercentage: 0.2,\n\t\t\tsaleCategoryTypes: ['clothing'],\n\t\t\tsaleCategories: ['Takit'],\n\t\t\tsaleSubCategories: [],\n\t\t\tsaleCampaignIds: [],\n\t\t\tisValid() {\n\t\t\t\tconst validTime = isValidDateObject(this.start) && now > this.start && isValidDateObject(this.end) && now < this.end;\n\t\t\t\tconst validCategoryType = this.saleCategoryTypes.length ? this.saleCategoryTypes.includes(productData.categoryType) : true;\n\t\t\t\tconst validCategory = this.saleCategories.length ? this.saleCategories.includes(productData.category) : true;\n\t\t\t\tconst validSubCategory = this.saleSubCategories.length ? this.saleSubCategories.includes(productData.subcategory) : true;\n\t\t\t\tconst validSaleCampaign = this.saleCampaignIds.length ? isValidSaleCampaignProduct(this.saleCampaignIds, productData.campaignIds) : true;\n\t\t\t\treturn validTime && validCategoryType && validCategory && validSubCategory && validSaleCampaign;\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tcampaignType: 'club', //club sale / logged in sale\n\t\t\tstart: new Date('2023-09-18 00:01:00'),\n\t\t\tend: new Date('2023-09-27 23:59:00'),\n\t\t\tsalePercentage: 0.25,\n\t\t\tsaleCategoryTypes: ['clothing'],\n\t\t\tsaleCategories: [],\n\t\t\tsaleSubCategories: [],\n\t\t\tsaleCampaignIds: [],\n\t\t\tisValid() {\n\t\t\t\tconst validTime = isAdmin || (isValidDateObject(this.start) && now > this.start && isValidDateObject(this.end) && now < this.end);\n\t\t\t\tconst validCategoryType = this.saleCategoryTypes.length ? this.saleCategoryTypes.includes(productData.categoryType) : true;\n\t\t\t\tconst validCategory = this.saleCategories.length ? this.saleCategories.includes(productData.category) : true;\n\t\t\t\tconst validSubCategory = this.saleSubCategories.length ? this.saleSubCategories.includes(productData.subcategory) : true;\n\t\t\t\tconst validSaleCampaign = this.saleCampaignIds.length ? isValidSaleCampaignProduct(this.saleCampaignIds, productData.campaignIds) : true;\n\t\t\t\treturn validTime && validCategoryType && validCategory && validSubCategory && validSaleCampaign;\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tcampaignType: 'brand', // brand sale\n\t\t\tstart: new Date('2023-09-23 00:01:00'),\n\t\t\tend: new Date('2023-09-24 23:59:00'),\n\t\t\tsaleBannerText: 'Hyödynnä -20% etu kaikista Salomon-kengistä.',\n\t\t\tsalePercentage: 0.2,\n\t\t\tsaleCategoryTypes: ['shoe'],\n\t\t\tsaleCategories: [],\n\t\t\tsaleSubCategories: [],\n\t\t\tsaleCampaignIds: [],\n\t\t\tsaleBrands: ['Salomon'],\n\t\t\tisValid() {\n\t\t\t\tconst validTime = isAdmin || (isValidDateObject(this.start) && now > this.start && isValidDateObject(this.end) && now < this.end);\n\t\t\t\tconst validCategoryType = this.saleCategoryTypes.length ? this.saleCategoryTypes.includes(productData.categoryType) : true;\n\t\t\t\tconst validCategory = this.saleCategories.length ? this.saleCategories.includes(productData.category) : true;\n\t\t\t\tconst validSubCategory = this.saleSubCategories.length ? this.saleSubCategories.includes(productData.subcategory) : true;\n\t\t\t\tconst validSaleCampaign = this.saleCampaignIds.length ? isValidSaleCampaignProduct(this.saleCampaignIds, productData.campaignIds) : true;\n\t\t\t\tconst validBrand = this.saleBrands.includes(productData.brandName)\n\n\t\t\t\treturn validTime && validCategoryType && validCategory && validSubCategory && validSaleCampaign && validBrand;\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tcampaignType: 'plussa', // plussa sale (with campaignId)\n\t\t\tstart: new Date('2023-2-13 00:01:00'),\n\t\t\tend: new Date('2023-2-26 23:59:00'),\n\t\t\tbannerText: 'Saat tästä tuotteesta 30% lisäalennuksen kun syötät Plussa-korttisi numeron.',\n\t\t\tsalePercentage: 0.30,\n\t\t\tsaleCategoryTypes: [],\n\t\t\tsaleCategories: [],\n\t\t\tsaleSubCategories: [],\n\t\t\tsaleCampaignIds: ['0340'],\n\t\t\tisValid() {\n\t\t\t\tconst validTime = isValidDateObject(this.start) && now > this.start && isValidDateObject(this.end) && now < this.end;\n\t\t\t\tconst validCategoryType = this.saleCategoryTypes.length ? this.saleCategoryTypes.includes(productData.categoryType) : true;\n\t\t\t\tconst validCategory = this.saleCategories.length ? this.saleCategories.includes(productData.category) : true;\n\t\t\t\tconst validSubCategory = this.saleSubCategories.length ? this.saleSubCategories.includes(productData.subcategory) : true;\n\t\t\t\tconst validSaleCampaign = this.saleCampaignIds.length ? isValidSaleCampaignProduct(this.saleCampaignIds, productData.campaignIds) : true;\n\t\t\t\treturn validTime && validCategoryType && validCategory && validSubCategory && validSaleCampaign;\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tcampaignType: 'club', // club sale (with campaignId)\n\t\t\tstart: null,\n\t\t\tend: null,\n\t\t\tsalePercentage: 0.75,\n\t\t\tsaleCategoryTypes: [],\n\t\t\tsaleCategories: [],\n\t\t\tsaleSubCategories: [],\n\t\t\tsaleCampaignIds: ['8291'],\n\t\t\tisValid() {\n\t\t\t\tconst validTime = isValidDateObject(this.start) && now > this.start && isValidDateObject(this.end) && now < this.end;\n\t\t\t\tconst validCategoryType = this.saleCategoryTypes.length ? this.saleCategoryTypes.includes(productData.categoryType) : true;\n\t\t\t\tconst validCategory = this.saleCategories.length ? this.saleCategories.includes(productData.category) : true;\n\t\t\t\tconst validSubCategory = this.saleSubCategories.length ? this.saleSubCategories.includes(productData.subcategory) : true;\n\t\t\t\tconst validSaleCampaign = this.saleCampaignIds.length ? isValidSaleCampaignProduct(this.saleCampaignIds, productData.campaignIds) : true;\n\t\t\t\treturn validTime && validCategoryType && validCategory && validSubCategory && validSaleCampaign;\n\t\t\t}\n\t\t}\n\t]\n\n\tconst currentClickAndCollectSale = campaignSaleData.find(sale => sale.isValid());\n\n\tconst hasActiveClickAndCollectSale = !!currentClickAndCollectSale && !productData.campaignDisabledForCc;\n\tconst clubSale = currentClickAndCollectSale?.campaignType === 'club';\n\tconst plussaSale = currentClickAndCollectSale?.campaignType === 'plussa';\n\tconst brandSale = currentClickAndCollectSale?.campaignType === 'brand';\n\tconst campaignSaleMultiplier = 1.0 - currentClickAndCollectSale?.salePercentage;\n\n\ttemplateData.isLoggedIn = isLoggedIn;\n\ttemplateData.showLoggedInSaleInfo = hasActiveClickAndCollectSale && clubSale ;\n\n\ttemplateData.showPlussaSaleInfo = hasActiveClickAndCollectSale && plussaSale;\n\ttemplateData.saleBannerText = currentClickAndCollectSale?.saleBannerText || '';\n\ttemplateData.plussaSalePercentage = plussaSale ? (currentClickAndCollectSale?.salePercentage * 100).toFixed(0) : ''\n\n\ttemplateData.showBrandSaleInfo = hasActiveClickAndCollectSale && brandSale;\n\n\n\tif ($productForm.length) {\n\t\tconst {\n\t\t\tdisableCc,\n\t\t\tsellingStarts,\n\t\t\tsellingEnabled,\n\t\t\tcampaignBanner,\n\t\t\tvmChainCampaign,\n\t\t} = $productForm.data();\n\t\tif (sellingStarts) {\n\t\t\ttemplateData.sellingStarts = $productForm.data('selling-starts');\n\t\t}\n\t\tif (disableCc) {\n\t\t\ttemplateData.disableCc = true;\n\t\t\tif (campaignBanner) {\n\t\t\t\ttemplateData.campaignBanner = campaignBanner;\n\t\t\t}\n\t\t}\n\n\t\tconst ccDisableStart = new Date('2023/03/27 07:00:00');\n\t\tconst ccDisableEnd = new Date('2023/04/04 02:59:59');\n\n\t\tif (ccDisableStart < new Date() && ccDisableEnd > new Date()) {\n\t\t\ttemplateData.vmProduct = $('.v4-product').hasClass('vm-product');\n\t\t\ttemplateData.vmEnableCp = $('.v4-product').hasClass('vm-product') && $productForm.data('sellingEnabled') === true;\n\t\t\t//const campaignIds = $productForm.not('.extra-sale-product').data('campaign-ids')+'' || null;\n\t\t\t//templateData.vmProduct = campaignIds ? (campaignIds.indexOf('0373') !== -1 || campaignIds.indexOf('0374') !== -1) : false;\n\t\t}\n\n\t\tif ($productForm.data('enable-cp-for-special-delivery')) {\n\t\t\ttemplateData.enableCCforSpecialDelivery = true;\n\t\t}\n\n\t\ttemplateData.vmChainCampaign = vmChainCampaign;\n\n\t\tif (!sellingEnabled) {\n\t\t\ttemplateData.sellingDisabled = true;\n\t\t}\n\t\tif (templateData.disableCampaignCc && !templateData.sellingDisabled) {\n\t\t\ttemplateData.sale = true;\n\t\t}\n\n\t\t[\n\t\t\t'campaignName',\n\t\t\t'sellingStarts',\n\t\t\t'campaignPrice',\n\t\t\t'campaignDay',\n\t\t\t'disableCcTitle',\n\t\t\t'disableCcText',\n\t\t\t'disableCc',\n\t\t].forEach((prop) => {\n\t\t\tif (productData[prop]) {\n\t\t\t\ttemplateData[prop] = productData[prop];\n\t\t\t}\n\t\t});\n\t\t/*\n if (campaignName) {\n templateData.campaignName = campaignName;\n }\n if (sellingStarts) {\n templateData.sellingStarts = sellingStarts;\n }\n if (campaignPrice) {\n templateData.campaignPrice = campaignPrice;\n }\n if (campaignDay) {\n templateData.campaignDay = campaignDay;\n }*/\n\t}\n\n\tlet shopsLoaded = false;\n\tlet userInfo = null;\n\tlet shops = {};\n\n\t//const shops = $clickAndCollect.data('shops') || {};\n\tconst storeBalances = {};\n\n\tlet isActived = false;\n\tlet jqXHR;\n\n\tclickAndCollectEvents();\n\tproductFormEvents();\n\n\tif (renderNow) {\n\t\ttemplateData.selectFirstOption = true;\n\t\ttoggleReservationForm(false);\n\t\tupdateProductData();\n\t\tresetErrors();\n\t\tgetStoreBalances(true);\n\t}\n\n\t$(window).on('popstate', (e) => {\n\t\tif ($clickAndCollect.hasClass('reservation-form-visible')) {\n\t\t\ttoggleReservationForm(false);\n\t\t} else {\n\t\t\tcloseClickAndCollect();\n\t\t}\n\t});\n\n\t/**\n\t * clickAndCollectEvents\n\t */\n\tfunction clickAndCollectEvents() {\n\t\tif (!renderNow) {\n\t\t\t$clickAndCollect.appendTo('#intersport-page');\n\t\t}\n\n\t\t$clickAndCollect\n\t\t\t.on('click', '.product-click-and-collect-close', closeClickAndCollect)\n\t\t\t.on(\n\t\t\t\t'click',\n\t\t\t\t'.click-and-collect-stores-order-by-location-button',\n\t\t\t\tfunction () {\n\t\t\t\t\tif (templateData.geoLocation.enabled) {\n\t\t\t\t\t\ttemplateData.geoLocation.enabled = false;\n\n\t\t\t\t\t\trenderData();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresetErrors();\n\n\t\t\t\t\t\tgetgeoLocation().always(function () {\n\t\t\t\t\t\t\trenderData();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t)\n\t\t\t.on('change', '#click-and-collect-cities', function () {\n\t\t\t\ttemplateData.selectedCity = $(this).val();\n\n\t\t\t\tresetErrors();\n\t\t\t\tupdateStoresData();\n\t\t\t\trenderData();\n\t\t\t})\n\t\t\t.on('click', '.reserve-product-button', function () {\n\t\t\t\tconst reservationData = $(this)\n\t\t\t\t\t.closest('.click-and-collect-stores-list-item')\n\t\t\t\t\t.data();\n\t\t\t\tconst reservationDataUpdated = updateReservationData(\n\t\t\t\t\treservationData.storeId,\n\t\t\t\t\treservationData.storePrice,\n\t\t\t\t\t'collect'\n\t\t\t\t);\n\t\t\t\tif (reservationDataUpdated) {\n\t\t\t\t\trenderData();\n\t\t\t\t\ttoggleReservationForm(true);\n\t\t\t\t} else {\n\t\t\t\t\tgetStoreBalances(true);\n\t\t\t\t}\n\t\t\t\tshippingFee(false);\n\t\t\t})\n\t\t\t.on('click', '.order-product-button', function () {\n\t\t\t\tconst reservationData = $(this)\n\t\t\t\t\t.closest('.click-and-collect-stores-list-item')\n\t\t\t\t\t.data();\n\t\t\t\tconst reservationDataUpdated = updateReservationData(\n\t\t\t\t\treservationData.storeId,\n\t\t\t\t\treservationData.storePrice,\n\t\t\t\t\t'order'\n\t\t\t\t);\n\n\t\t\t\tif (reservationDataUpdated) {\n\t\t\t\t\trenderData();\n\t\t\t\t\ttoggleReservationForm(true, true);\n\t\t\t\t} else {\n\t\t\t\t\tgetStoreBalances(true);\n\t\t\t\t}\n\t\t\t\tshippingFee(true);\n\t\t\t})\n\t\t\t.on('click', '.click-and-collect-reservation-close', function () {\n\t\t\t\ttoggleReservationForm(false);\n\t\t\t})\n\t\t\t.on(\n\t\t\t\t'keyup invalid',\n\t\t\t\t'.click-and-collect-reservation-form input',\n\t\t\t\tfunction () {\n\t\t\t\t\tconst $this = $(this);\n\t\t\t\t\t$this.toggleClass('invalid', $this.is(':invalid'));\n\t\t\t\t}\n\t\t\t)\n\t\t\t.on('submit', '.click-and-collect-reservation-form', function (e) {\n\t\t\t\tprocessReservationForm(e);\n\n\t\t\t})\n\t\t\t.on(\n\t\t\t\t'change',\n\t\t\t\t'.click-and-collect-reservation-form input[name=\"shipping\"]',\n\t\t\t\tfunction () {\n\t\t\t\t\tsetOnlinePayment();\n\t\t\t\t\tif (parseInt($(this).val()) === 1) {\n\t\t\t\t\t\tsetShipping();\n\t\t\t\t\t\t$('.shipping-fee').removeClass('hidden');\n\t\t\t\t\t\tif (hasActiveClickAndCollectSale) {\n\t\t\t\t\t\t\t$('.plussa-campaign-info').removeClass('hidden');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$('.shipping-fee').addClass('hidden');\n\t\t\t\t\t\tsetCollecting();\n\t\t\t\t\t\tif (hasActiveClickAndCollectSale) {\n\t\t\t\t\t\t\t$('.plussa-campaign-info').addClass('hidden');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (hasActiveClickAndCollectSale) {\n\t\t\t\t\t\tsetCampaignSale();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t)\n\t\t\t.on(\n\t\t\t\t'change',\n\t\t\t\t'.click-and-collect-reservation-form input[name=\"shipment_type\"]',\n\t\t\t\tfunction () {\n\t\t\t\t\tdeliveryFee();\n\t\t\t\t\tconst shipmentType = $('input[name=\"shipment_type\"]:checked').val();\n\t\t\t\t\tconst price =\n\t\t\t\t\t\tshipmentType !== 'nouto'\n\t\t\t\t\t\t\t? parseFloat(\n\t\t\t\t\t\t\t\ttemplateData.reservation.shipmentFee[shipmentType]\n\t\t\t\t\t\t\t ).toFixed(2)\n\t\t\t\t\t\t\t: 0;\n\n\t\t\t\t\t$('dd.shipping-fee').text(`${price}€`);\n\t\t\t\t}\n\t\t\t)\n\t\t\t.on(\n\t\t\t\t'change',\n\t\t\t\t'.click-and-collect-reservation-form input[name=\"online_payment\"]',\n\t\t\t\tsetOnlinePayment\n\t\t\t)\n\t\t\t.on('change', '.click-and-collect-reservation-form input[name=\"kplussa_number\"]', function(){\n\t\t\t\tif (hasActiveClickAndCollectSale && plussaSale) {\n\t\t\t\t\tsetCampaignSale();\n\t\t\t\t}\n\t\t\t});\n\n\t\t/*.on('change', '.click-and-collect-reservation-form input[name=\"shipping\"]', function() {\n setOnlinePayment();\n if ($(this).val() == 1) {\n setShipping();\n } else {\n setCollecting();\n }\n if (hasActiveClickAndCollectSale) {\n setCampaignSale();\n }\n });*/\n\n\t\t// Close c&c by clicking outside it or outside the product form\n\t\t$document.on('click', function (e) {\n\t\t\tif (\n\t\t\t\t$clickAndCollect.hasClass('transition-done') &&\n\t\t\t\t!$(e.target).closest(\n\t\t\t\t\t'.v4-product-click-and-collect, .click-and-collect-stores-order-by-location-button, .reserve-product-button, .order-product-button, .product-colors, .product-sizes, .text-show-more'\n\t\t\t\t).length &&\n\t\t\t\t!renderNow\n\t\t\t) {\n\t\t\t\tcloseClickAndCollect();\n\t\t\t}\n\t\t});\n\n\t}\n\n\tfunction shippingFee(active = false) {\n\t\tif (active) {\n\t\t\t$('.shipping-fee').removeClass('hidden');\n\t\t\tif (hasActiveClickAndCollectSale) {\n\t\t\t\t$('.plussa-campaign-info').removeClass('hidden');\n\t\t\t}\n\t\t} else {\n\t\t\t$('.shipping-fee').addClass('hidden');\n\t\t\tif (hasActiveClickAndCollectSale) {\n\t\t\t\t$('.plussa-campaign-info').addClass('hidden');\n\t\t\t}\n\t\t}\n\t\tif (hasActiveClickAndCollectSale) {\n\t\t\tsetCampaignSale();\n\t\t}\n\t}\n\n\tfunction setShipping() {\n\t\tsetRequiredFields(true);\n\t\t$('.click-and-collect-reservation-title').text('Vahvista tilaus');\n\t\t$('.shipping-disclaimer').removeClass('hidden');\n\t\t$('.click-and-collect-reservation-form .form-submit button').text('Tilaa');\n\t\t$(\n\t\t\t'.click-and-collect-reservation-form *[name=\"accepted_privacy_policy]'\n\t\t).prop('required', true);\n\t\tconst $paymentInput = $('.click-and-collect-payment-method')\n\t\t\t.removeClass('hidden')\n\t\t\t.find('input[name=\"online_payment\"]');\n\t\tif (!$paymentInput.is(':checked')) {\n\t\t\t$paymentInput.first().prop('checked', true);\n\t\t}\n\t\tsetOnlinePayment();\n\t}\n\n\tfunction setOnlinePayment() {\n\t\tconst paymentMethod = $('input[name=online_payment]:checked').val();\n\t\tif (templateData.reservation.order && paymentMethod) {\n\t\t\t$('input[name=stage-payment-provider]').prop('checked', false);\n\t\t\t$(`.payment-method-${paymentMethod}`).find('input').prop('checked', true);\n\t\t}\n\t}\n\n\tfunction setCampaignSale() {\n\t\tconst $form = $('.click-and-collect-reservation-form');\n\t\tconst shipping = $form.find('input[name=\"shipping\"]').val();\n\n\t\t//Used for campaign where if you are logged in you get a sale\n\t\tif (clubSale) {\n\t\t\tif (userInfo && shipping && parseInt(shipping) === 1) {\n\t\t\t\tconst originalPrice = templateData.reservation.items[0].price;\n\t\t\t\tconst salePrice = parseFloat(originalPrice * campaignSaleMultiplier).toFixed(2);\n\t\t\t\tconst priceText = `${originalPrice} € ${salePrice} €`;\n\t\t\t\t$('.click-and-collect-reservation dl dt:contains(\"Hinta\") + dd').html(priceText);\n\t\t\t\ttemplateData.plussaSale = true;\n\t\t\t\t$('.cc-info-box.sale-login').addClass('hidden');\n\t\t\t} else if (shipping && parseInt(shipping) === 1) {\n\t\t\t\tconst price = parseFloat(templateData.reservation.items[0].price).toFixed(\n\t\t\t\t\t2\n\t\t\t\t);\n\t\t\t\t$('.click-and-collect-reservation dl dt:contains(\"Hinta\") + dd').html(price + ' €');\n\t\t\t\t$('.cc-info-box.sale-login').removeClass('hidden');\n\t\t\t} else {\n\t\t\t\tconst price = parseFloat(templateData.reservation.items[0].price).toFixed(\n\t\t\t\t\t2\n\t\t\t\t);\n\t\t\t\t$('.click-and-collect-reservation dl dt:contains(\"Hinta\") + dd').html(price + ' €');\n\t\t\t\t$('.cc-info-box.sale-login').addClass('hidden');\n\t\t\t}\n\t\t//Used for plussa weekend sale\n\t\t} else if (plussaSale) {\n\t\t\tconst url = '/stage-ajax/ccPlussaSale';\n\t\t\tconst $plussaInput = $form.find('input[name=\"kplussa_number\"]');\n\t\t\tlet cardNumber = $plussaInput.val();\n\t\t\tconst plussaPrefix = String($plussaInput.data('plussa-prefix'));\n\n\t\t\t// add plussa prefix to card number if it's not there already\n\t\t\tif (plussaPrefix && cardNumber && cardNumber.indexOf(plussaPrefix) !== 0) {\n\t\t\t\tcardNumber = plussaPrefix + cardNumber;\n\t\t\t}\n\n\t\t\tif (shipping && parseInt(shipping) === 1 && cardNumber && cardNumber !== '') {\n\t\t\t\t$.ajax({\n\t\t\t\t\turl: url,\n\t\t\t\t\tdata: {cardNumber},\n\t\t\t\t\tmethod: 'POST'\n\t\t\t\t}).done(function(data) {\n\t\t\t\t\tif (parseInt(data.result) === 1) {\n\t\t\t\t\t\tconst originalPrice = templateData.reservation.items[0].price;\n\t\t\t\t\t\tconst salePrice = parseFloat(originalPrice * campaignSaleMultiplier).toFixed(2);\n\t\t\t\t\t\tconst priceText = `${originalPrice} € ${salePrice} €`;\n\t\t\t\t\t\t$('.click-and-collect-reservation dl dt:contains(\"Hinta\") + dd').html(priceText);\n\t\t\t\t\t\t$('.plussa-card-validated').removeClass('hidden')\n\t\t\t\t\t\t$('.plussa-card-validated .price-info').html(`Tuotteen hinta: ${priceText}`);\n\t\t\t\t\t\ttemplateData.plussaSale = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst price = parseFloat(templateData.reservation.items[0].price).toFixed(2);\n\t\t\t\t$('.click-and-collect-reservation dl dt:contains(\"Hinta\") + dd').html(price + ' €');\n\t\t\t\t$('.plussa-card-validated').addClass('hidden');\n\t\t\t}\n\n\t\t// used for brand sale\n\t\t} else if (brandSale) {\n\t\t\tif (shipping && parseInt(shipping) === 1) {\n\t\t\t\tconst originalPrice = templateData.reservation.items[0].price;\n\t\t\t\tconst salePrice = parseFloat(originalPrice * campaignSaleMultiplier).toFixed(2);\n\t\t\t\tconst priceText = `${originalPrice} € ${salePrice} €`;\n\t\t\t\t$('.click-and-collect-reservation dl dt:contains(\"Hinta\") + dd').html(priceText);\n\t\t\t\ttemplateData.brandSale = true;\n\t\t\t\ttemplateData.reservation.items[0].brand = productData.brandName;\n\t\t\t} else {\n\t\t\t\tconst price = parseFloat(templateData.reservation.items[0].price).toFixed(\n\t\t\t\t\t2\n\t\t\t\t);\n\t\t\t\t$('.click-and-collect-reservation dl dd:nth-child(8)').html(price + ' €');\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction setCollecting() {\n\t\tsetRequiredFields(false);\n\t\t$('.click-and-collect-reservation-title').text('Vahvista varaus');\n\t\t$('.click-and-collect-reservation-form .form-submit button').text('Varaa');\n\t\t$(\n\t\t\t'.click-and-collect-reservation-form *[name=\"accepted_privacy_policy]'\n\t\t).prop('required', false);\n\t\t$('.shipping-disclaimer').addClass('hidden');\n\t\t$('.click-and-collect-payment-method').addClass('hidden');\n\t}\n\n\tfunction setRequiredFields(isRequired) {\n\t\tconst $requiredFields = $('.click-and-collect-reservation-form').find(\n\t\t\t'.required-for-shipping'\n\t\t);\n\t\t$requiredFields.prop('required', isRequired);\n\t\t$requiredFields.each(function () {\n\t\t\tconst $label = $(this).closest('.form-input').find('label');\n\t\t\tconst labelText = isRequired\n\t\t\t\t? $label.text().replace(' *', '') + ' *'\n\t\t\t\t: $label.text().replace(' *', '');\n\t\t\t$label.text(labelText);\n\t\t});\n\t}\n\n\tconst paymentHtml = {};\n\n\tfunction showPaymentForm(shopId) {\n\t\tif (!paymentHtml[shopId]) {\n\t\t\tlet url = '/stage-ajax/getPaymentForm';\n\t\t\tif (shopId) {\n\t\t\t\turl += '?merchantId=' + shopId;\n\t\t\t}\n\t\t\tgetToken()\n\t\t\t\t.then((token) => Promise.resolve($.post(url, { token })))\n\t\t\t\t.then((markup) => injectPayment(shopId, markup));\n\t\t} else {\n\t\t\tinjectPayment(shopId);\n\t\t}\n\t}\n\n\tfunction injectPayment(shopId, markup) {\n\t\tif (markup !== undefined) {\n\t\t\tpaymentHtml[shopId] = markup;\n\t\t}\n\t\t$('.click-and-collect-payment-form').remove();\n\t\tif (paymentHtml[shopId]) {\n\t\t\t$('.click-and-collect-payment-method')\n\t\t\t\t.append(paymentHtml[shopId])\n\t\t\t\t.find('input[name=\"stage-payment-provider\"]')\n\t\t\t\t.first()\n\t\t\t\t.prop('checked', true);\n\t\t\t$('.click-and-collect-payment-form').addClass('hidden');\n\t\t}\n\t}\n\n\tfunction openClickAndCollect() {\n\t\tif ($productForm.find('[name=\"ean\"]:checked').length) {\n\t\t\tstoreScrollPosition($window);\n\t\t\ttoggleClickAndCollect(true);\n\t\t\tif (!isActived) {\n\t\t\t\tisActived = true;\n\t\t\t\t$productForm.find('[name=\"ean\"]:checked').trigger('change');\n\t\t\t\tgetgeoLocation().always(function () {\n\t\t\t\t\trenderData();\n\t\t\t\t});\n\t\t\t} else if (window.user && window.user.loggedIn && !userInfo) {\n\t\t\t\t// User has logged in via ajax, get full user info\n\t\t\t\tconst userPromise =\n\t\t\t\t\tuserInfo === null\n\t\t\t\t\t\t? getUser('me').then((res) => {\n\t\t\t\t\t\t\tif (res.user) {\n\t\t\t\t\t\t\t\tuserInfo = res.user;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t })\n\t\t\t\t\t\t: Promise.resolve();\n\n\t\t\t\tPromise.all([userPromise]).then(() => {\n\t\t\t\t\tif (userInfo) {\n\t\t\t\t\t\trenderData();\n\n\t\t\t\t\t\t// Update user info for form\n\t\t\t\t\t\tconst $form = $clickAndCollect.find(\n\t\t\t\t\t\t\t'.click-and-collect-reservation-form'\n\t\t\t\t\t\t);\n\t\t\t\t\t\tupdateUserInfo($form);\n\n\t\t\t\t\t\t// Show shipping fee\n\t\t\t\t\t\tshippingFee(true);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (typeof history !== 'undefined') {\n\t\t\t\t// push empty history entry to allow back button to close the panel\n\t\t\t\thistory.pushState(null, '', '');\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction closeClickAndCollect() {\n\t\ttoggleClickAndCollect(false);\n\t\trestoreScrollPosition($window);\n\t}\n\n\t/**\n\t * productFormEvents\n\t */\n\tfunction productFormEvents() {\n\t\t$productForm\n\t\t\t.on('click', '.click-and-collect-button:not(.disabled)', function (e) {\n\t\t\t\te.preventDefault();\n\t\t\t\tif ($productForm.find('[name=\"ean\"]:checked').length) {\n\t\t\t\t\t//window.location.hash = 'saatavuus';\n\t\t\t\t\topenClickAndCollect();\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('change', '[name=\"color\"]', function () {\n\t\t\t\tif (isActived) {\n\t\t\t\t\ttoggleReservationForm(false);\n\t\t\t\t\tupdateProductData();\n\t\t\t\t\tgetStoreBalances(true);\n\t\t\t\t\tresetErrors();\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('change', '[name=\"ean\"]', function () {\n\t\t\t\tif (isActived) {\n\t\t\t\t\ttoggleReservationForm(false);\n\t\t\t\t\tupdateProductData();\n\t\t\t\t\tgetStoreBalances(true);\n\t\t\t\t\tresetErrors();\n\t\t\t\t} else {\n\t\t\t\t\t//updateProductData();\n\t\t\t\t\t//getStoreBalances(true);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('click', '[data-toggle=\"modal\"]', function () {\n\t\t\t\ttoggleClickAndCollect(false);\n\t\t\t});\n\t}\n\n\tfunction infoTextAccordion() {\n\t\tconst $showMore = $('.text-show-more');\n\t\t$showMore.on('click', 'a', (e) => {\n\t\t\te.preventDefault();\n\t\t\tconst $toggleLink = $(e.target);\n\t\t\tconst $linkContainer = $toggleLink.parent();\n\t\t\tconst show = $toggleLink.hasClass('show-text');\n\n\t\t\tif (show) {\n\t\t\t\t$linkContainer.find('p').show();\n\t\t\t\t$linkContainer.find('.show-text').hide();\n\t\t\t\t$linkContainer.find('.close-text').show();\n\t\t\t} else {\n\t\t\t\t$linkContainer.find('p').hide();\n\t\t\t\t$linkContainer.find('.show-text').show();\n\t\t\t\t$linkContainer.find('.close-text').hide();\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * getStoreBalances\n\t *\n\t * @param {Boolean} updateDataAndRender\n\t *\n\t * @return {Promise}\n\t */\n\tfunction getStoreBalances(updateDataAndRender) {\n\t\tconst ttl = 60;\n\t\tlet colorBalances = storeBalances[templateData.product.sapTitlenumber]\n\t\t\t? storeBalances[templateData.product.sapTitlenumber][\n\t\t\t\ttemplateData.product.colorCode\n\t\t\t ]\n\t\t\t: null;\n\n\t\tif (\n\t\t\t!colorBalances ||\n\t\t\t(colorBalances.stores && !colorBalances.stores.length) ||\n\t\t\tgetTimestamp() - colorBalances.timestamp > ttl\n\t\t) {\n\t\t\tif (getLoader('stores') && isActived) {\n\t\t\t\tjqXHR.abort();\n\t\t\t}\n\n\t\t\tsetLoader('stores', true);\n\n\t\t\tconst shopPromise = !shopsLoaded\n\t\t\t\t? getShops().then((res) => {\n\t\t\t\t\tshops = res.shops;\n\t\t\t\t\tshopsLoaded = true;\n\t\t\t\t })\n\t\t\t\t: Promise.resolve();\n\n\t\t\tconst userPromise =\n\t\t\t\tuserInfo === null\n\t\t\t\t\t? getUser('me').then((res) => {\n\t\t\t\t\t\tif (res.user) {\n\t\t\t\t\t\t\tuserInfo = res.user;\n\t\t\t\t\t\t}\n\t\t\t\t\t })\n\t\t\t\t\t: Promise.resolve();\n\n\t\t\tPromise.all([shopPromise, userPromise]).then(() => {\n\t\t\t\tjqXHR = $.ajax({\n\t\t\t\t\tcache: true,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tcolor: templateData.product.colorCode,\n\t\t\t\t\t\tsap_titlenumber: templateData.product.sapTitlenumber,\n\t\t\t\t\t},\n\t\t\t\t\tdataType: 'json',\n\t\t\t\t\tmethod: 'get',\n\t\t\t\t\ttimeout: 30000,\n\t\t\t\t\turl: '/stage-ajax/storeBalances/',\n\t\t\t\t})\n\t\t\t\t\t.done(function (response, status, xhr) {\n\t\t\t\t\t\tif (response.items) {\n\t\t\t\t\t\t\tprocessStoreBalances(\n\t\t\t\t\t\t\t\tresponse.items,\n\t\t\t\t\t\t\t\tresponse.colorCode,\n\t\t\t\t\t\t\t\tresponse.sapTitlenumber\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thandleStoreBalanceErrors(xhr);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (response.disableCC) {\n\t\t\t\t\t\t\t//templateData.disableCC = true;\n\t\t\t\t\t\t\t//templateData.disableCCTitle = response.disableCCTitle;\n\t\t\t\t\t\t\t//templateData.disableCCText = response.disableCCText;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (updateDataAndRender) {\n\t\t\t\t\t\t\tupdateStoresData();\n\t\t\t\t\t\t\trenderData();\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.fail(handleStoreBalanceErrors)\n\t\t\t\t\t.always(function () {\n\t\t\t\t\t\tsetLoader('stores', false);\n\t\t\t\t\t});\n\t\t\t});\n\t\t\tcolorBalances = jqXHR;\n\t\t} else if (updateDataAndRender) {\n\t\t\tupdateStoresData();\n\t\t\trenderData();\n\t\t}\n\n\t\treturn $.when(colorBalances);\n\t}\n\n\t/**\n\t * processStoreBalances\n\t *\n\t * @param {Array} stores\n\t * @param {String} colorCode\n\t */\n\tfunction processStoreBalances(stores, colorCode, sapTitlenumber) {\n\t\tstoreBalances[sapTitlenumber] = {};\n\t\tstoreBalances[sapTitlenumber][colorCode] = {\n\t\t\ttimestamp: getTimestamp(),\n\t\t};\n\n\t\tstoreBalances[sapTitlenumber][colorCode].stores = $.map(\n\t\t\tstores,\n\t\t\tfunction (store) {\n\t\t\t\tif (shops[store.shop]) {\n\t\t\t\t\tif (typeof store.storeData === 'undefined') {\n\t\t\t\t\t\tstore.id = store.shop;\n\t\t\t\t\t\tdelete store.shop;\n\t\t\t\t\t\tstore.storeData = shops[store.id] || {};\n\t\t\t\t\t}\n\t\t\t\t\treturn store;\n\t\t\t\t}\n\t\t\t}\n\t\t).sort(function (a, b) {\n\t\t\tif (a.storeData.city === b.storeData.city) {\n\t\t\t\treturn a.storeData.name < b.storeData.name\n\t\t\t\t\t? -1\n\t\t\t\t\t: a.storeData.name > b.storeData.name\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: 0;\n\t\t\t}\n\t\t\treturn a.storeData.city < b.storeData.city\n\t\t\t\t? -1\n\t\t\t\t: a.storeData.city > b.storeData.city\n\t\t\t\t\t? 1\n\t\t\t\t\t: 0;\n\t\t});\n\t}\n\n\t/**\n\t * handleStoreBalanceErrors\n\t *\n\t * @param {Object} xhr\n\t */\n\tfunction handleStoreBalanceErrors(xhr) {\n\t\tconst response =\n\t\t\txhr && xhr.statusText !== 'abort' ? xhr.responseJSON : false;\n\n\t\tif (response) {\n\t\t\tstoreBalances[response.sapTitlenumber] = {};\n\t\t\tstoreBalances[response.sapTitlenumber][response.colorCode] = {\n\t\t\t\terror: response.error,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * updateProductData\n\t */\n\tfunction updateProductData() {\n\t\tconst colorVisible = $productForm.find('.product-colors').data('visible');\n\t\tconst $color = $productForm.find('[name=\"color\"]:checked');\n\t\tconst sizeVisible = $productForm.find('.product-sizes').data('visible');\n\t\tconst $size = $productForm.find('[name=\"ean\"]:checked');\n\t\tconst sapTitlenumber =\n\t\t\t$size.data('sap-titlenumber') || $productForm.data('sapTitlenumber');\n\t\tconst flex = $size.data('ice-hockey-flex') || null;\n\t\tconst hand = $size.data('hand') || null;\n\n\t\ttemplateData.product = {\n\t\t\tcolor: parseInt(colorVisible) === 1 ? $color.data('name') : '',\n\t\t\tcolorCode: $color.val(),\n\t\t\tean: $size.closest(\n\t\t\t\t'.product-sizes-list[data-color=\"' + $color.val() + '\"]'\n\t\t\t).length\n\t\t\t\t? $size.val()\n\t\t\t\t: '',\n\t\t\tname:\n\t\t\t\t$productForm.data('brandName') + ' ' + $productForm.data('productName'),\n\t\t\tsapTitlenumber: sapTitlenumber,\n\t\t\tsize: parseInt(sizeVisible) === 1 ? $size.data('name') : '',\n\t\t\timage: $color\n\t\t\t\t.closest('.product-colors-list-item')\n\t\t\t\t.find('img')\n\t\t\t\t.attr('src')\n\t\t\t\t.replace('c=system_150', 'c=system_1024x'),\n\t\t\tcanShip: !$productForm.data('specialDelivery') || customShipmentTypes.length,\n\t\t\tspecialDelivery: $productForm.data('enable-cp-for-special-delivery'), //enable-cp-for-special-delivery\n\t\t\tisIceHockeyStick: !!flex,\n\t\t\tflex: flex,\n\t\t\thand: hand,\n\t\t};\n\n\t\ttemplateData.stores = [];\n\t\ttemplateData.cities = [];\n\t\ttemplateData.hasStores = false;\n\t}\n\n\t/**\n\t * updateStoresData\n\t */\n\tfunction updateStoresData() {\n\t\tconst colorBalances = storeBalances[templateData.product.sapTitlenumber]\n\t\t\t? storeBalances[templateData.product.sapTitlenumber][\n\t\t\t\ttemplateData.product.colorCode\n\t\t\t ]\n\t\t\t: null;\n\n\t\tif (colorBalances) {\n\t\t\tif (!colorBalances.error) {\n\t\t\t\tconst uniqueCities = [];\n\n\t\t\t\ttemplateData.cities = [];\n\n\t\t\t\ttemplateData.stores = $.map(colorBalances.stores, function (store) {\n\t\t\t\t\tconst storeBalance = store.balances.filter(function (balanceItem) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\ttemplateData.product &&\n\t\t\t\t\t\t\ttemplateData.product.ean === balanceItem.ean &&\n\t\t\t\t\t\t\tbalanceItem.balance > 0\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tstore.canShip =\n\t\t\t\t\t\t(store.hasOnlinePayment || store.storeData.prepayment) &&\n\t\t\t\t\t\t(templateData.product.canShip ||\n\t\t\t\t\t\t\ttemplateData.product\n\t\t\t\t\t\t\t\t.specialDelivery) /*&& parseFloat(store.price) >= 50*/;\n\t\t\t\t\tstore.specialDelivery = templateData.product.specialDelivery;\n\n\t\t\t\t\tif (storeBalance.length) {\n\t\t\t\t\t\tif (uniqueCities.indexOf(store.storeData.city) === -1) {\n\t\t\t\t\t\t\tuniqueCities.push(store.storeData.city);\n\t\t\t\t\t\t\ttemplateData.cities.push({ name: store.storeData.city });\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst lowBalanceThreshold = templateData.disableCampaignCc ? 3 : 2;\n\t\t\t\t\t\tstoreBalance[0].hasLowBalance =\n\t\t\t\t\t\t\tstoreBalance[0].balance <= lowBalanceThreshold;\n\t\t\t\t\t\tconst item = $.extend({}, store, {\n\t\t\t\t\t\t\tbalanceData: storeBalance[0],\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (item.balanceData.forceEnableCc) {\n\t\t\t\t\t\t\tdelete item.disableCc;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn item;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Select first of the options\n\t\t\t\tif (templateData.selectFirstOption && templateData.cities.length > 0) {\n\t\t\t\t\ttemplateData.selectedCity = templateData.cities[0].name;\n\t\t\t\t\ttemplateData.selectFirstOption = false;\n\t\t\t\t}\n\n\t\t\t\tconst foundInStores = templateData.stores.length;\n\t\t\t\tconst foundInStoresText = `Tuote on saatavilla ${foundInStores} kaupassa. Katso kauppasaatavuus nähdäksesi tarkemmat tiedot.`;\n\t\t\t\t$('.product-available-in-stores').find('span').html(foundInStoresText);\n\n\t\t\t\ttemplateData.hasStores = !!templateData.stores.length;\n\t\t\t} else {\n\t\t\t\tsetError('stores', colorBalances.error);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * filterStoresbyCity\n\t *\n\t * @param {String} [city]\n\t */\n\tfunction filterStoresbyCity(city = templateData.selectedCity) {\n\t\tif (city) {\n\t\t\tconst cityStores = templateData.stores.filter(function (store) {\n\t\t\t\treturn !city || city === store.storeData.city;\n\t\t\t});\n\n\t\t\t$.each(templateData.cities, function (i, cityItem) {\n\t\t\t\tif (city === cityItem.name) {\n\t\t\t\t\tcityItem.selected = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (cityStores.length) {\n\t\t\t\ttemplateData.stores = cityStores;\n\t\t\t\tsetError('cities', false);\n\t\t\t} else {\n\t\t\t\tsetError('cities', true);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * getgeoLocation\n\t *\n\t * @return {Promise}\n\t */\n\tfunction getgeoLocation() {\n\t\tconst dfd = $.Deferred();\n\n\t\tsetLoader('geoLocation', true);\n\n\t\tnavigator.geolocation.getCurrentPosition(dfd.resolve, dfd.reject, {\n\t\t\tenableHighAccuracy: true,\n\t\t\ttimeout: 5000,\n\t\t\tmaximumAge: 60000,\n\t\t});\n\n\t\tdfd\n\t\t\t.done(function (position) {\n\t\t\t\tif (position) {\n\t\t\t\t\ttemplateData.geoLocation.enabled = true;\n\t\t\t\t\ttemplateData.geoLocation.lat = position.coords.latitude;\n\t\t\t\t\ttemplateData.geoLocation.lon = position.coords.longitude;\n\t\t\t\t} else {\n\t\t\t\t\thandleGeoLocationErrors(position);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.fail(handleGeoLocationErrors)\n\t\t\t.always(function () {\n\t\t\t\tsetLoader('geoLocation', false);\n\t\t\t});\n\n\t\treturn dfd.promise();\n\t}\n\n\t/**\n\t * handleGeoLocationErrors\n\t *\n\t * @param {Object} error\n\t */\n\tfunction handleGeoLocationErrors(error) {\n\t\t$('.click-and-collect-stores-order-by-location-button')\n\t\t\t.addClass('hidden')\n\t\t\t.hide();\n\t\t/*if (error.code === 1) {\n\t\t\tsetError('geoLocationBlockedByUser', true);\n\t\t} else {\n\t\t\tsetError('geoLocation', true);\n\t\t}*/\n\t}\n\n\t/**\n\t * orderStoresByLocation\n\t *\n\t * @param {Number} [lat]\n\t * @param {Number} [lon]\n\t */\n\tfunction orderStoresByLocation(\n\t\tlat = templateData.geoLocation.lat,\n\t\tlon = templateData.geoLocation.lon\n\t) {\n\t\tif (templateData.geoLocation.enabled) {\n\t\t\t$.each(templateData.stores, function (i, store) {\n\t\t\t\tstore.distance = Math.round(\n\t\t\t\t\tcalculateDistance(\n\t\t\t\t\t\tlat,\n\t\t\t\t\t\tlon,\n\t\t\t\t\t\tNumber(store.storeData.lat),\n\t\t\t\t\t\tNumber(store.storeData.long)\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t});\n\n\t\t\ttemplateData.stores = templateData.stores.sort(function (a, b) {\n\t\t\t\treturn a.distance < b.distance ? -1 : a.distance > b.distance ? 1 : 0;\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * updateReservationData\n\t *\n\t * @param {String} storeId\n\t * @param {Number} price\n\t *\n\t * @return {Boolean} allowReservation\n\t */\n\tfunction updateReservationData(storeId, price, type) {\n\t\tconst isValidReservation = templateData.stores.some(function (store) {\n\t\t\treturn store.id === storeId && price > 0 && (!store.disableCc || templateData.vmEnableCp);\n\t\t});\n\n\t\tconst store = templateData.stores.find((store) => store.id === storeId);\n\n\t\tif (isValidReservation) {\n\t\t\ttemplateData.reservation = {\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tamount: 1,\n\t\t\t\t\t\tprice: price,\n\t\t\t\t\t\tean: templateData.product.ean,\n\t\t\t\t\t\tname: templateData.product.name,\n\t\t\t\t\t\tcolor: templateData.product.color,\n\t\t\t\t\t\tsize: templateData.product.size,\n\t\t\t\t\t\timage: templateData.product.image,\n\t\t\t\t\t\tisIceHockeyStick: templateData.product.isIceHockeyStick,\n\t\t\t\t\t\tflex: templateData.product.flex,\n\t\t\t\t\t\thand: templateData.product.hand,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tstore: storeId && shops[storeId] ? shops[storeId].name : '',\n\t\t\t\tstoreId: storeId.charAt(0) === 't' ? storeId.substring(1) : storeId,\n\t\t\t\textranet_users_uuid: '',\n\t\t\t\tshop: store.storeData,\n\t\t\t\thasOnlinePayment:\n\t\t\t\t\tstore && store.hasOnlinePayment && store.storeData.online_payment,\n\t\t\t\tcanShip: store.canShip,\n\t\t\t\tspecialDelivery: store.specialDelivery,\n\t\t\t};\n\n\t\t\tif (typeof type !== 'undefined') {\n\t\t\t\ttemplateData.reservation.shop.termsLink =\n\t\t\t\t\ttemplateData.reservation.shop.termsLink.indexOf('?type') === -1\n\t\t\t\t\t\t? `${templateData.reservation.shop.termsLink}?type=${type}`\n\t\t\t\t\t\t: templateData.reservation.shop.termsLink.replace(\n\t\t\t\t\t\t\t/type=(.*)/g,\n\t\t\t\t\t\t\t`type=${type}`\n\t\t\t\t\t\t );\n\t\t\t\ttemplateData.reservation.shop.dataProtectionLink =\n\t\t\t\t\ttemplateData.reservation.shop.dataProtectionLink.indexOf('?type') ===\n\t\t\t\t\t-1\n\t\t\t\t\t\t? `${templateData.reservation.shop.dataProtectionLink}?type=${type}`\n\t\t\t\t\t\t: templateData.reservation.shop.dataProtectionLink.replace(\n\t\t\t\t\t\t\t/type=(.*)/g,\n\t\t\t\t\t\t\t`type=${type}`\n\t\t\t\t\t\t );\n\t\t\t\ttemplateData.reservation[type] = true;\n\t\t\t}\n\t\t}\n\n\t\treturn isValidReservation;\n\t}\n\n\tfunction updateUserInfo($form) {\n\t\tif (userInfo) {\n\t\t\tconst plussaPrefix = String($form.find('input[name=\"kplussa_number\"]').data('plussa-prefix'));\n\t\t\tconst usersPlussaNumber = userInfo.kplussa_number;\n\n\t\t\t// if userInfo contains kplussa_number remove plussaPrefix from the beginning if it's included\n\t\t\tif (usersPlussaNumber && plussaPrefix && usersPlussaNumber.indexOf(plussaPrefix) === 0) {\n\t\t\t\t// remove plussaPrefix from the beginning\n\t\t\t\tconst plussaWithoutPrefix = usersPlussaNumber.slice(plussaPrefix.length, usersPlussaNumber.length)\n\t\t\t\tuserInfo.kplussa_number = plussaWithoutPrefix;\n\t\t\t}\n\n\t\t\t$form.serializeArray().forEach((field) => {\n\t\t\t\tlet { name } = field;\n\t\t\t\tif (name === 'extranet_users_uuid') {\n\t\t\t\t\tname = 'uuid';\n\t\t\t\t}\n\t\t\t\tif (userInfo[field.name]) {\n\t\t\t\t\t$form.find(`*[name=\"${field.name}\"]`).val(userInfo[name]);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * toggleReservationForm\n\t * @param {Boolean} showForm\n\t */\n\tfunction toggleReservationForm(showForm, shipping) {\n\t\tif (typeof showForm !== 'undefined') {\n\t\t\tconst $scrollArea = $clickAndCollect.find(\n\t\t\t\t'.click-and-collect-scroll-area'\n\t\t\t);\n\n\t\t\tif (showForm) {\n\t\t\t\tstoreScrollPosition($scrollArea);\n\t\t\t\t$clickAndCollect.addClass('reservation-form-visible');\n\n\t\t\t\tconst $form = $clickAndCollect.find(\n\t\t\t\t\t'.click-and-collect-reservation-form'\n\t\t\t\t);\n\t\t\t\tupdateUserInfo($form);\n\n\t\t\t\tif (templateData.reservation.hasOnlinePayment) {\n\t\t\t\t\tshowPaymentForm(templateData.reservation.storeId);\n\t\t\t\t} else {\n\t\t\t\t\t$('.click-and-collect-payment-form').remove();\n\t\t\t\t}\n\n\t\t\t\t$scrollArea.scrollTop(0);\n\t\t\t\tif (typeof history !== 'undefined') {\n\t\t\t\t\thistory.pushState(null, '', '');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t$clickAndCollect.removeClass('reservation-form-visible');\n\t\t\t\trestoreScrollPosition($scrollArea);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * processReservationForm\n\t *\n\t * @param {Object} e\n\t */\n\tfunction processReservationForm(e) {\n\t\tconst $form = $clickAndCollect.find('.click-and-collect-reservation-form');\n\t\tconst onlinePayment =\n\t\t\tparseInt($form.find('input[name=\"stage_payment\"]').val()) === 1;\n\t\tconst $plussaInput = $form.find('input[name=\"kplussa_number\"]');\n\t\tconst plussaPrefix = String($plussaInput.data('plussa-prefix'));\n\n\t\tif (!onlinePayment) {\n\t\t\te.preventDefault();\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tconst $token = $form.find('input[name$=\"token\"]');\n\t\tconst $submit = $form.find('button[type=\"submit\"]');\n\t\tconst formErrorMessage = $form.data('formErrorText');\n\n\t\t$submit.prop('disabled', true);\n\n\t\tclearReservationFormMessages();\n\t\taddReservationFormLoader();\n\n\t\tif ($token.val()) {\n\t\t\tloggedIn = userInfo ? 1 : 0;\n\t\t\tconst data = $.extend(\n\t\t\t\t{ items: templateData.reservation.items, loggedIn },\n\t\t\t\t$form.serializeObject()\n\t\t\t);\n\n\t\t\t// if data containes kplussa_number add plussaPrefix to the beginning if it's missing\n\t\t\tif (data.kplussa_number && data.kplussa_number.indexOf(plussaPrefix) !== 0) {\n\t\t\t\tdata.kplussa_number = plussaPrefix + data.kplussa_number;\n\t\t\t}\n\n\t\t\t$.ajax({\n\t\t\t\tdata,\n\t\t\t\tdataType: 'json',\n\t\t\t\tmethod: 'POST',\n\t\t\t\ttimeout: 30000,\n\t\t\t\turl: '/stage-ajax/clickAndCollect/',\n\t\t\t})\n\t\t\t\t.done(function (response) {\n\t\t\t\t\tif (response && response.result === 1) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tObject.prototype.hasOwnProperty.call(\n\t\t\t\t\t\t\t\ttemplateData.reservation,\n\t\t\t\t\t\t\t\t'store'\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tlet storeName = templateData.reservation.store.trim();\n\t\t\t\t\t\t\twindow.dataLayer.push({\n\t\t\t\t\t\t\t\tevent: 'cncOrder',\n\t\t\t\t\t\t\t\tstore: storeName,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (response.checkout) {\n\t\t\t\t\t\t\t$form.attr('action', response.checkout);\n\t\t\t\t\t\t\t$form.find('input[name=\"stage_payment\"]').val('1');\n\t\t\t\t\t\t\tupdateFormToken().then(() => $form.submit());\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttemplateData.reservation.done = true;\n\t\t\t\t\t\t\tif (response.shipping) {\n\t\t\t\t\t\t\t\ttemplateData.reservation.shipping = true;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//Plussa weekend or brand sale\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t(typeof templateData.plussaSale !== 'undefined' &&\n\t\t\t\t\t\t\t\ttemplateData.plussaSale && plussaSale) || brandSale\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\ttemplateData.reservation.items[0].price = (templateData.reservation.items[0].price * campaignSaleMultiplier).toFixed(2);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//Logged in sale\n\t\t\t\t\t\t\tif (userInfo) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\ttypeof templateData.plussaSale !== 'undefined' &&\n\t\t\t\t\t\t\t\t\ttemplateData.plussaSale && clubSale\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\ttemplateData.reservation.items[0].price = (\n\t\t\t\t\t\t\t\t\t\ttemplateData.reservation.items[0].price * campaignSaleMultiplier\n\t\t\t\t\t\t\t\t\t).toFixed(2);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\trenderData();\n\t\t\t\t\t\t\ttoggleReservationForm(true);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (response && response.reason) {\n\t\t\t\t\t\taddReservationFormMessage(response.reason, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\taddReservationFormMessage(formErrorMessage, true);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.fail(function (xhr) {\n\t\t\t\t\taddReservationFormMessage(formErrorMessage, true);\n\t\t\t\t})\n\t\t\t\t.always(function (response) {\n\t\t\t\t\tif (!response.checkout) {\n\t\t\t\t\t\tremoveReservationFormLoader();\n\t\t\t\t\t\t$form.find('input[name$=\"token\"]').val('');\n\t\t\t\t\t\t$submit.prop('disabled', false);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t} else {\n\t\t\tupdateFormToken($form);\n\t\t}\n\t}\n\n\t/**\n\t * setLoader\n\t *\n\t * @param {String} name\n\t * @param {Boolean} state\n\t */\n\tfunction setLoader(name, state) {\n\t\tif (name && typeof state !== 'undefined') {\n\t\t\tif (state) {\n\t\t\t\ttemplateData.loaders[name] = true;\n\t\t\t} else {\n\t\t\t\tdelete templateData.loaders[name];\n\t\t\t}\n\n\t\t\t$clickAndCollect.toggleClass(\n\t\t\t\t'is-loading',\n\t\t\t\t!!Object.keys(templateData.loaders).length\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * getLoader\n\t *\n\t * @param {String} name\n\t *\n\t * @return {Boolean}\n\t */\n\tfunction getLoader(name) {\n\t\treturn templateData.loaders[name] || false;\n\t}\n\n\t/**\n\t * addFormMessage\n\t *\n\t * @param {String} msg\n\t * @param {Boolean} isError\n\t */\n\tfunction addReservationFormMessage(msg, isError) {\n\t\tclearReservationFormMessages();\n\n\t\t$('
', {\n\t\t\tclass: 'click-and-collect-info-block' + (isError ? ' is-error' : ''),\n\t\t\ttext: msg,\n\t\t}).appendTo(\n\t\t\t$clickAndCollect.find(\n\t\t\t\t'#click-and-collect-reservation-form-alert-container'\n\t\t\t)\n\t\t);\n\t}\n\n\t/**\n\t * clearReservationFormMessages\n\t */\n\tfunction clearReservationFormMessages() {\n\t\t$clickAndCollect\n\t\t\t.find('#click-and-collect-reservation-form-alert-container')\n\t\t\t.find('.click-and-collect-info-block')\n\t\t\t.remove();\n\t}\n\n\t/**\n\t * Add spinner loader to the page\n\t */\n\tfunction addReservationFormLoader() {\n\t\tremoveReservationFormLoader();\n\n\t\t$('
', { class: 'click-and-collect-loader' })\n\t\t\t.append($('
', { class: 'spinner-loader-circle' }))\n\t\t\t.append(\n\t\t\t\t$('
', { class: 'spinner-loader-circle spinner-loader-circle2' })\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$('
', { class: 'spinner-loader-circle spinner-loader-circle3' })\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$('
', { class: 'spinner-loader-circle spinner-loader-circle4' })\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$('
', { class: 'spinner-loader-circle spinner-loader-circle5' })\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$('
', { class: 'spinner-loader-circle spinner-loader-circle6' })\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$('
', { class: 'spinner-loader-circle spinner-loader-circle7' })\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$('
', { class: 'spinner-loader-circle spinner-loader-circle8' })\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$('
', { class: 'spinner-loader-circle spinner-loader-circle9' })\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$('
', { class: 'spinner-loader-circle spinner-loader-circle10' })\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$('
', { class: 'spinner-loader-circle spinner-loader-circle11' })\n\t\t\t)\n\t\t\t.append(\n\t\t\t\t$('
', { class: 'spinner-loader-circle spinner-loader-circle12' })\n\t\t\t)\n\t\t\t.appendTo(\n\t\t\t\t$clickAndCollect.find(\n\t\t\t\t\t'#click-and-collect-reservation-form-alert-container'\n\t\t\t\t)\n\t\t\t);\n\t}\n\n\t/**\n\t * Add Remove loader to the page\n\t */\n\tfunction removeReservationFormLoader() {\n\t\t$clickAndCollect\n\t\t\t.find('#click-and-collect-reservation-form-alert-container')\n\t\t\t.find('.click-and-collect-loader')\n\t\t\t.remove();\n\t}\n\n\t/**\n\t * setError\n\t *\n\t * @param {String} name\n\t * @param {Boolean} state\n\t */\n\tfunction setError(name, state) {\n\t\tif (name && typeof state !== 'undefined') {\n\t\t\ttemplateData.errors[name] = state;\n\t\t}\n\t}\n\n\t/**\n\t * resetErrors\n\t */\n\tfunction resetErrors() {\n\t\ttemplateData.errors = {};\n\t\trenderData();\n\t}\n\n\t/**\n\t * toggleClickAndCollect\n\t *\n\t * @param {Boolean} show\n\t */\n\tfunction toggleClickAndCollect(show = true) {\n\t\tif (show) {\n\t\t\t$clickAndCollect.one(utils.transitionDone(), function () {\n\t\t\t\t$clickAndCollect.addClass('transition-done');\n\t\t\t});\n\t\t} else {\n\t\t\t$clickAndCollect.removeClass('transition-done');\n\t\t}\n\n\t\t$html.toggleClass('v4-product-click-and-collect-open', show);\n\t}\n\n\tfunction deliveryFee() {\n\t\tconst hasCustomShipmentTypes = customShipmentTypes.length ? true : false;\n\n\t\ttemplateData.reservation.hasCustomDelivery = hasCustomShipmentTypes;\n\t\ttemplateData.reservation.customDelivery = false;\n\t\tif (hasCustomShipmentTypes) {\n\t\t\ttemplateData.reservation.customDelivery = customShipmentTypes.map(\n\t\t\t\t(shipment) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: shipment.id,\n\t\t\t\t\t\tname: shipment.name,\n\t\t\t\t\t\tcurrentPrice: (userInfo && parseInt(userInfo.activated) === 1) ? parseFloat(shipment.club).toFixed(2) : parseFloat(shipment.default).toFixed(2),\n\t\t\t\t\t\tpriceClub: parseFloat(shipment.club).toFixed(2),\n\t\t\t\t\t\tpriceDefault: parseFloat(shipment.default).toFixed(2)\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t}\n\n\n\t\tif (userInfo && parseInt(userInfo.activated) === 1) {\n\t\t\ttemplateData.reservation.deliveryFee = templateData.reservation\n\t\t\t\t.specialDelivery\n\t\t\t\t? '24.9'\n\t\t\t\t: '4.90';\n\t\t\ttemplateData.reservation.shipmentFee = {\n\t\t\t\tposti: parseFloat(shipmentTypes.posti.club).toFixed(2),\n\t\t\t\tkotiintoimitus: parseFloat(shipmentTypes.kotiintoimitus.club).toFixed(\n\t\t\t\t\t2\n\t\t\t\t),\n\t\t\t\tspecial: parseFloat(shipmentTypes.special.club).toFixed(2),\n\t\t\t};\n\n\t\t\tif (hasCustomShipmentTypes) {\n\t\t\t\tlet cheapestDeliveryFee = false;\n\t\t\t\tfor (const shipment of customShipmentTypes) {\n\t\t\t\t\ttemplateData.reservation.shipmentFee[shipment.id] = parseFloat(shipment.club).toFixed(2);\n\t\t\t\t\tif (!cheapestDeliveryFee || (shipment.club < cheapestDeliveryFee)) {\n\t\t\t\t\t\tcheapestDeliveryFee = shipment.club;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (cheapestDeliveryFee) {\n\t\t\t\t\ttemplateData.reservation.deliveryFee = cheapestDeliveryFee;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for free delivery\n\t\t\tif (templateData.reservation && templateData.reservation.items) {\n\t\t\t\tif (\n\t\t\t\t\ttemplateData.reservation.items[0].price > 50 &&\n\t\t\t\t\tuserInfo.level &&\n\t\t\t\t\tuserInfo.level === 'gold'\n\t\t\t\t\t&& !hasCustomShipmentTypes\n\t\t\t\t) {\n\t\t\t\t\tif (!templateData.reservation.specialDelivery) {\n\t\t\t\t\t\ttemplateData.reservation.deliveryFee = '0.00';\n\t\t\t\t\t}\n\t\t\t\t\ttemplateData.reservation.shipmentFee.posti = parseFloat(0).toFixed(2);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\ttemplateData.reservation.deliveryFee = templateData.reservation\n\t\t\t\t.specialDelivery\n\t\t\t\t? '49.9'\n\t\t\t\t: '7.90';\n\t\t\ttemplateData.reservation.shipmentFee = {\n\t\t\t\tposti: parseFloat(shipmentTypes.posti.default).toFixed(2),\n\t\t\t\tkotiintoimitus: parseFloat(\n\t\t\t\t\tshipmentTypes.kotiintoimitus.default\n\t\t\t\t).toFixed(2),\n\t\t\t\tspecial: parseFloat(shipmentTypes.special.default).toFixed(2),\n\t\t\t};\n\n\t\t\tif (hasCustomShipmentTypes) {\n\t\t\t\tlet cheapestDeliveryFee = false;\n\n\t\t\t\tfor (const shipment of customShipmentTypes) {\n\t\t\t\t\ttemplateData.reservation.shipmentFee[shipment.id] = parseFloat(shipment.default).toFixed(2);\n\t\t\t\t\tif (!cheapestDeliveryFee || (shipment.default < cheapestDeliveryFee)) {\n\t\t\t\t\t\tcheapestDeliveryFee = shipment.default;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (cheapestDeliveryFee) {\n\t\t\t\t\ttemplateData.reservation.deliveryFee = cheapestDeliveryFee;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * renderData\n\t */\n\tfunction renderData() {\n\t\tfilterStoresbyCity();\n\t\torderStoresByLocation();\n\t\tdeliveryFee();\n\n\t\t$('#click-and-collect-content').html(\n\t\t\tMustache.render(template, templateData)\n\t\t);\n\t\tconst $reservationForm = $('.click-and-collect-reservation-form');\n\t\tif ($reservationForm.length) {\n\t\t\tinputFilteringEvents($reservationForm);\n\t\t}\n\t\t$('.prepayment-description').on('click', (e) => {\n\t\t\te.preventDefault();\n\t\t\t$('#prepayment-description').toggleClass('hidden');\n\t\t});\n\n\t\tif (!userInfo) {\n\t\t\tif (hasActiveClickAndCollectSale) {\n\t\t\t\t$('.cc-info-box.sale-login').removeClass('hidden');\n\t\t\t} else {\n\t\t\t\t$('.cc-info-box.club-login').removeClass('hidden');\n\t\t\t}\n\t\t} else {\n\t\t\t$('.show-for-online-payment').removeClass('hidden');\n\t\t}\n\n\t\tinfoTextAccordion();\n\t}\n\n\t/**\n\t * storeScrollPosition\n\t *\n\t * @param {jQuery} $el\n\t * @param {Number} [pos]\n\t */\n\tfunction storeScrollPosition($el, pos = $el.scrollTop()) {\n\t\t$el.data('scrollPosition', pos);\n\t}\n\n\t/**\n\t * restoreScrollPosition\n\t *\n\t * @param {jQuery} $el\n\t */\n\tfunction restoreScrollPosition($el) {\n\t\t$el.scrollTop($el.data('scrollPosition'));\n\n\t\t$el.data('scrollPosition', 0);\n\t}\n\n\t/**\n\t * Fetch new token for the form and auto submit it\n\t *\n\t * @param {jQuery} $form\n\t */\n\tfunction updateFormToken($form) {\n\t\tconst $fields = $('input[name$=\"token\"]').val('');\n\n\t\treturn getToken().then(function (response) {\n\t\t\t$fields.val(response);\n\t\t\t$('input[name=\"stage_token\"]').val(response);\n\t\t\tif ($form) {\n\t\t\t\t$form.trigger('submit');\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * getTimestamp\n\t *\n\t * @return {Number}\n\t */\n\tfunction getTimestamp() {\n\t\treturn Math.floor(Date.now() / 1000);\n\t}\n\n\t/**\n\t * calculateDistance\n\t *\n\t * @param {Number} lat1\n\t * @param {Number} lon1\n\t * @param {Number} lat2\n\t * @param {Number} lon2\n\t *\n\t * @return {Number}\n\t */\n\tfunction calculateDistance(lat1, lon1, lat2, lon2) {\n\t\tconst toRad = (val) => {\n\t\t\treturn val * Math.PI / 180;\n\t\t};\n\t\tconst R = 6371; // km\n\t\tconst dLat = toRad(lat2 - lat1);\n\t\tconst dLon = toRad(lon2 - lon1);\n\n\t\tlat1 = toRad(lat1);\n\t\tlat2 = toRad(lat2);\n\n\t\tconst a =\n\t\t\tMath.sin(dLat / 2) * Math.sin(dLat / 2) +\n\t\t\tMath.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);\n\t\tconst c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n\t\tconst d = R * c; //calculate distance between lat/lon\n\t\treturn d;\n\t}\n\n\t/**\n\t * formatPrice\n\t *\n\t * @param {Number|String} price\n\t * @param {Boolean} [appendEuro]\n\t *\n\t * @return {String}\n\t */\n\tfunction formatPrice(price, appendEuro = true) {\n\t\tlet formattedPrice = '';\n\n\t\ttry {\n\t\t\tformattedPrice =\n\t\t\t\tparseFloat(price)\n\t\t\t\t\t.toFixed(2)\n\t\t\t\t\t.replace('.', ',')\n\t\t\t\t\t.replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1 ') + (appendEuro ? ' €' : '');\n\t\t} catch (e) {\n\t\t\tformattedPrice = price;\n\t\t}\n\n\t\treturn formattedPrice;\n\t}\n}\n","/* Product card specifc */\n\nfunction updateProductPositions() {\n\tconst productCards = document.getElementsByClassName('product-list-item');\n\tfor (let i = 0; i < productCards.length; i++) {\n\t\tif (!productCards[i].getAttribute('data-position')) {\n\t\t\tproductCards[i].setAttribute('data-position', i + 1);\n\t\t}\n\t}\n}\n\n/**\n * Creates an object to use in datalayer from product-list-item\n *\n * @param {object} productItem - product-list-item dom node (not jquery)\n *\n * @return {object} datalayer params - Product info for datalayer\n */\nfunction getProductDataLayerData (productItem) {\n\tlet position = productItem.getAttribute('data-position');\n\tif (!position) {\n\t\tupdateProductPositions();\n\t\tposition = productItem.getAttribute('data-position');\n\t}\n\n\tconst link = productItem.querySelector('a.product-link');\n\tconst url = link.getAttribute('href');\n\n\tlet sapId = '';\n\tlet color = '';\n\n\tconst identifierParts = String(productItem.dataset.identifier).split('_');\n\n\tif (identifierParts.length === 2) {\n\t\t[sapId, color] = identifierParts;\n\t\tcolor = color.toUpperCase();\n\t}\n\n\tif (!(sapId && color)) {\n\n\t\ttry {\n\t\t\tconst urlObject = link?.href ? new URL(link.href) : null;\n\n\t\t\tif (urlObject) {\n\n\t\t\t\tconst urlColor = String(urlObject.searchParams.get('color') || '').toUpperCase();\n\t\t\t\tlet urlSapId = String(urlObject.pathname.split('-').pop() || '');\n\t\t\t\tif (urlSapId.endsWith('/')) {\n\t\t\t\t\t[urlSapId] = urlSapId.split('/');\n\t\t\t\t}\n\n\t\t\t\tif (urlSapId && urlColor) {\n\t\t\t\t\tsapId = urlSapId;\n\t\t\t\t\tcolor = urlColor;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} catch (error) {\n\t\t\t// Url parsing error\n\t\t}\n\n\t}\n\n\tconst list = productItem.closest('.product-carousel') ? 'Karuselli' : productItem.closest('#search-page') ? 'Sivustohaku' : 'Tuotelistaus';\n\n\tconst productName = String(productItem.querySelector('.product-name .name')?.textContent || '').trim();\n\tconst productBrand = String(productItem.querySelector('.product-name .brand')?.textContent || '').trim();\n\tconst productData = productItem.dataset;\n\n\tconst priceContainer = productItem.querySelector('.product-price');\n\tconst priceSelector = priceContainer.classList.contains('sale') ? '.discount' : '.normal';\n\tconst price = parseFloat(priceContainer?.querySelector(priceSelector)?.textContent || 0);\n\n\treturn {\n\t\tid: sapId,\n\t\tprice,\n\t\tlist,\n\t\tlink: url,\n\t\tname: productName,\n\t\tbrand: productBrand,\n\t\tcategory: productData.categoryPath,\n\t\tsports: productData.sports,\n\t\ttargetgroup: productData.targetgroup,\n\t\tbreadcrumb: productData.fullCategoryPath,\n\t\tposition: parseInt(position),\n\t\tdimension16: sapId + '_' + color\n\t};\n}\n\nexport { getProductDataLayerData };\n","'use strict';\nimport Promise from 'bluebird';\nimport $ from 'jquery';\nimport getToken from './token';\n\nconst BASE_URL = '/fi/api/v1/users/';\n\nexport const sendBenefitSms = (userId, benefitId) => {\n\treturn getToken().then(token => {\n\t\tconst url = `${BASE_URL}${userId}/benefits/${benefitId}/sms`;\n\t\treturn Promise\n\t\t\t.resolve($.post(url, {token}))\n\t\t\t.then(res => res && res.result === true ? res : Promise.reject())\n\t});\n}\n\nexport const getUser = userId =>\n\tPromise.resolve($.getJSON(`${BASE_URL}${userId}`));\n","'use strict';\nimport Promise from 'bluebird';\nimport $ from 'jquery';\nconst API_URL = '/fi/api/v1/shops/';\n\nexport const getShops = () => Promise.resolve($.get(API_URL));\n","'use strict';\nimport $ from 'jquery';\nimport uniq from 'lodash/uniq';\nimport pick from 'lodash/pick';\n\n/**\n * Simple setter and getter for user filter preferences (gender select).\n * Save choice to session storage.\n *\n * @var {Object}\n */\nexport const preferences = (() => {\n\tlet _preferences = null;\n\tconst STORAGE_KEY = 'filterPreferences';\n\n\treturn {\n\t\tSTORAGE_KEY,\n\n\t\tget(forceRefresh = false) {\n\t\t\tif (window.sessionStorage && (!_preferences || forceRefresh)) {\n\t\t\t\ttry {\n\t\t\t\t\t_preferences = JSON.parse(sessionStorage.getItem(STORAGE_KEY) || '{}');\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.log(e);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn _preferences;\n\t\t},\n\t\tset(data) {\n\t\t\tif (window.sessionStorage) {\n\t\t\t\t_preferences = data;\n\t\t\t\ttry {\n\t\t\t\t\tsessionStorage.setItem(STORAGE_KEY, JSON.stringify(data));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.log(e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n})();\n\nexport function init(mapping) {\n\tif (window.localStorage && window.sessionStorage) {\n\t\ttry {\n\t\t\t$(window).bind('storage', transferSessionStorage);\n\t\t\t$(window).bind('receiveStorage', e => setTimeout(doStuff, 10));\n\n\t\t\tif (!sessionStorage.getItem(preferences.STORAGE_KEY)) {\n\t\t\t\t// Ask other tabs for session storage (this is only to trigger event)\n\t\t\t\tlocalStorage.setItem('getSessionStorage', Date.now());\n\t\t\t} else {\n\t\t\t\tdoStuff();\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.log(e);\n\t\t}\n\t}\n\n\tfunction doStuff() {\n\t\tconst filters = preferences.get();\n\t\tif (filters.genders && filters.genders.length) {\n\t\t\tupdateNavigationLinks();\n\t\t}\n\t}\n}\n\n/**\n * Transfer sessionStorage from one tab to another.\n */\nfunction transferSessionStorage(e, storageKeys) {\n\tif (!e) e = window.event; // ie\n\tif (!e.newValue && e.originalEvent) e = e.originalEvent;\n\tif (!e.newValue) return; // do nothing if no value to work with\n\n\t// transfer only specific keys\n\tconst keys = storageKeys || [preferences.STORAGE_KEY];\n\n\tif (e.key === 'getSessionStorage') {\n\t\t// Another tab asked for the sessionStorage -> send it\n\t\tconst data = pick(sessionStorage, keys);\n\t\tif (data) {\n\t\t\tlocalStorage.setItem('sessionStorage', JSON.stringify(data));\n\t\t\t// The other tab should now have it, so we're done with it.\n\t\t\tlocalStorage.removeItem('sessionStorage');\n\t\t}\n\t}\n\telse if (e.key === 'sessionStorage') {\n\t\t// Another tab sent data <- get it\n\t\tconst data = JSON.parse(e.newValue);\n\t\t$.each(data, (key, val) => sessionStorage.setItem(key, val));\n\t\t$(window).trigger('receiveStorage');\n\t}\n}\n\n/**\n * Update navigation link URLs to reflect users's currently selected filters.\n *\n * @return {Promise}\n */\nexport function updateNavigationLinks() {\n\tconst filters = preferences.get();\n\tconst $links = getVisibleLinks($('a.static-category'));\n\tconst pageIds = $.map($links, item => $(item).data('page-id'));\n\tconst pageIdsString = uniq(pageIds).join(',');\n\tconst data = {filters, pageIds: pageIdsString};\n\n\tif (pageIds.length > 200) {\n\t\treturn;\n\t}\n\n\treturn $.getJSON('/stage-ajax/staticCategoryLinks', data)\n\t\t.then(res => {\n\t\t\tif (res && res.links) {\n\t\t\t\t$.each(res.links, (pageId, href) => {\n\t\t\t\t\t$(`a.static-category[data-page-id=\"${pageId}\"]`).attr('href', href);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n}\n\n/**\n * Filter a collection of navigation links to include currently visible links.\n *\n * @param {jQuery} $links\n * @return {jQuery}\n */\nfunction getVisibleLinks($links) {\n\tconst isMobile = $(window).width() <= 768;\n\n\treturn $.grep($links, (link) => {\n\t\tconst $link = $(link);\n\t\tif (!$link.data('page-id')) return false;\n\n\t\tconst isMobileLink = $link.closest('.mobile-nav').length > 0;\n\t\tif (isMobileLink && !isMobile) return false;\n\n\t\tconst isLeftNavLink = $link.closest('.navigation-left').length > 0;\n\t\tif (isLeftNavLink && isMobile) return false;\n\n\t\tif (isLeftNavLink) {\n\t\t\tif ($link.closest('ul').hasClass('level-1')) return true; // top level link\n\t\t\tif (!$link.closest('.selected').length) return false;\n\t\t}\n\t\treturn true;\n\t});\n}\n\n","'use strict'\nimport * as session from './session';\nimport $ from 'jquery';\nimport Mustache from 'mustache';\nimport utils from '../util';\nimport pick from 'lodash/pick';\nimport omit from 'lodash/omit';\nimport without from 'lodash/without';\nimport keys from 'lodash/keys';\nimport debounce from 'lodash/debounce';\nimport throttle from 'lodash/throttle';\nimport assign from 'lodash/assign';\nimport isArray from 'lodash/isArray';\nimport intersection from 'lodash/intersection';\nimport uniq from 'lodash/uniq';\nimport invert from 'lodash/invert';\nimport isEmpty from 'lodash/isEmpty';\nimport serialize from 'form-serialize';\nimport pullAll from 'lodash/pullAll';\nimport { openingToNewTab } from '../util/helpers';\nimport { getProductDataLayerData } from '../product/product-card';\nimport { addCampaignClasses } from '../product/product-carousel';\n\n/* global mapping, lockedFilterGroups */\n\nconst setItemHeights = ($container) => {\n\tconst $items = ($container || $('.product-list')).find('.product-list-item');\n\tconst $item = $items.not('.lift-item').first();\n\t$items.css('height', '');\n\t$items.css('height', $item.outerHeight()).addClass('set-height');\n}\n\nlet mapping = {};\n\nexport default function() {\n\n\tconst templates = {\n\t\tlist: $('#template-product-list').html(),\n\t\titem: $('#template-product-list-item').html(),\n\t\tfilters: $('#template-product-list-filters').html(),\n\t\tactiveFilters: $('#template-product-list-active-filters').html(),\n\t};\n\n\t//productCarousel('.product-carousel');\n\tproductListItems();\n\tproductListFilters();\n\treadMoreToggle();\n\tproductImpressions();\n\n\t/**\n\t * Tracks product impressions everywhere\n\t */\n\tfunction productImpressions() {\n\t\tlet productImpressions = [];\n\t\tlet timeout = null;\n\n\t\tdocument.addEventListener('lazyloaded', function(e) {\n\t\t\tconst $productItem = $(e.target).closest('.product-list-item');\n\t\t\tif ($productItem.length) {\n\t\t\t\tlet dataLayerData = getProductDataLayerData($productItem.get(0));\n\n\t\t\t\tproductImpressions.push(dataLayerData);\n\n\t\t\t\tif (timeout) {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t}\n\n\t\t\t\ttimeout = setTimeout(() => {\n\t\t\t\t\tif (window.GoogleTagManager.isEnabled()) {\n\t\t\t\t\t\twindow.GoogleTagManager.productImpressions(productImpressions);\n\t\t\t\t\t\tproductImpressions = [];\n\t\t\t\t\t}\n\t\t\t\t}, 5000);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction productListFilters() {\n\n\t\t$('.static-category-listing').each(function () {\n\n\t\t\tconst $container = $(this);\n\t\t\tconst $form = $container.find('form.product-filters');\n\t\t\t//if (!$container.length) return;\n\n\t\t\tmapping = $form.data('mapping') || window.mapping || {};\n\n\t\t\tconst $grid = $container.find('.product-grid');\n\t\t\tconst $activeFilters = $container.find('.active-filters');\n\t\t\tconst $toolbar = $container.find('.toolbar-mobile');\n\t\t\tconst $pageHeading = $container.find('.o-page__heading');\n\t\t\tconst $filters = $container.find('.product-category-additional-filters');\n\n\t\t\tconst submitHandler = debounce(handleFormSubmit, 500);\n\t\t\tconst defaultOrder = $form.data('default-order') || 'new';\n\t\t\tconst additionalFields = mapAdditionalFields();\n\n\t\t\t// input names that are used as URL parameters\n\t\t\tconst paramFields = ['category', 'sport', 'brands', 'color', 'size','genders',\n\t\t\t\t'order', 'campaigns', 'night', 'categoryType', 'subcategory', 'day', 'salePercentage', 'chain', 'shops'].concat(additionalFields);\n\n\t\t\tlet _shouldReload = false;\n\t\t\tlet _lastFilterData = null;\n\t\t\tlet _xhr = null;\n\t\t\tlet _loadMoreCounter = 0;\n\t\t\tlet _productsCount;\n\n\t\t\tconst _totalProductsCount = $activeFilters.data('total-products');\n\t\t\tconst urlParams = parseParams(window.location.search.substring(1));\n\t\t\tconst _filterPreset = $form.data('preset');\n\t\t\tconst _chainCampaigns = typeof _filterPreset !== 'undefined' && _filterPreset ? _filterPreset.chainCampaigns : [];\n\t\t\tconst _initialData = prepareData(serialize($form.get(0), { hash: true }), urlParams);\n\n\t\t\t// Event for updating filter presets, used by package builders\n\t\t\t$form.on('filter-preset-update', function (ev, data) {\n\t\t\t\tfor (let key in data) {\n\t\t\t\t\tif (Object.prototype.hasOwnProperty.call(data, key)) {\n\t\t\t\t\t\t_filterPreset[key] = data[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger custom event after update\n\t\t\t\t$(this).trigger('filter-preset-update-done', [ _filterPreset ]);\n\t\t\t});\n\n\t\t\tif ($form.length) {\n\t\t\t\tif ($form.closest('.search-results').length) {\n\t\t\t\t\tupdateFilters(_initialData, urlParams).then((res) => {\n\t\t\t\t\t\t_lastFilterData = prepareData(serialize($form.get(0), { hash: true }), urlParams);\n\t\t\t\t\t\treturn renderActiveFilters(res.activeFilters || [], res.productsCount);\n\t\t\t\t\t});\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t_lastFilterData = _initialData;\n\t\t\t\t\tsession.init(mapping);\n\t\t\t\t}\n\n\t\t\t\t$form.on('change', 'input, select', (e, system) => {\n\t\t\t\t\tconst $input = $(e.target);\n\t\t\t\t\tsubmitHandler.cancel();\n\n\t\t\t\t\tif ($('#package-builder').length === 0) {\n\t\t\t\t\t\t//For filter google analytics\n\t\t\t\t\t\tlet categoryLabel = $('.filter-select.active').data('name');\n\t\t\t\t\t\tlet filterLabel = $input.closest('.filter-toggle').find('.name').text();\n\n\t\t\t\t\t\tif ($input.attr('name').indexOf('gender') !== -1) {\n\t\t\t\t\t\t\tcategoryLabel = 'Kohderyhmä';\n\t\t\t\t\t\t\tfilterLabel = $input.parent().find('label').text();\n\t\t\t\t\t\t} else if($input.attr('name').indexOf('order') !== -1) {\n\t\t\t\t\t\t\tcategoryLabel = 'Järjestä';\n\t\t\t\t\t\t} else if ($input.attr('value').indexOf('brands') !== -1) {\n\t\t\t\t\t\t\tcategoryLabel = 'Merkki';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!filterLabel || filterLabel === '') {\n\t\t\t\t\t\t\tfilterLabel = $input.val();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (window.GoogleTagManager.isEnabled()) {\n\t\t\t\t\t\t\twindow.GoogleTagManager.clickFilter(categoryLabel, filterLabel);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ($input.is('.group-filter:not(.hidden-input)')) {\n\t\t\t\t\t\t$input\n\t\t\t\t\t\t\t.closest('fieldset')\n\t\t\t\t\t\t\t.children('ul')\n\t\t\t\t\t\t\t.find('input')\n\t\t\t\t\t\t\t.prop('checked', $input.is(':checked'));\n\t\t\t\t\t} else if ($input.closest('.filter-groups').length) {\n\t\t\t\t\t\tconst $parentFilter = $input\n\t\t\t\t\t\t\t.closest('fieldset')\n\t\t\t\t\t\t\t.find('.group-filter');\n\t\t\t\t\t\tif (!$input.is(':checked')) {\n\t\t\t\t\t\t\t$parentFilter.prop('checked', false);\n\t\t\t\t\t\t\tconst $siblings = $input\n\t\t\t\t\t\t\t\t.closest('fieldset')\n\t\t\t\t\t\t\t\t.children('ul')\n\t\t\t\t\t\t\t\t.find('input');\n\t\t\t\t\t\t\tif (!$siblings.find('input:checked').length) {\n\t\t\t\t\t\t\t\t$parentFilter.prop('checked', false);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if ($parentFilter.hasClass('hidden-input')) {\n\t\t\t\t\t\t\t$parentFilter.prop('checked', true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t$form.trigger('submit', [system]);\n\t\t\t\t});\n\n\t\t\t\t// filter products\n\t\t\t\t$form.submit((e, system) => {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tsubmitHandler.cancel();\n\t\t\t\t\tconst data = serialize($form.get(0), {hash: true});\n\t\t\t\t\t//console.log(data);\n\t\t\t\t\treturn submitHandler.call(null, data, false, system);\n\t\t\t\t});\n\n\t\t\t\t// load more button\n\t\t\t\t$grid.on('click', '.load-more', handleLoadMore);\n\n\t\t\t\t// reset single filter value\n\t\t\t\t$activeFilters.on('click', '.btn-tag', e => unsetActiveFilter($(e.currentTarget)));\n\n\t\t\t\t// reset all filters button\n\t\t\t\t$container.on('click', '.reset-filters', resetFilters);\n\n\t\t\t\t$container.on('click', '.show-next-day .lift-cta', e => {\n\t\t\t\t\tconst $this = $(e.currentTarget);\n\t\t\t\t\tconst nextDay = $this.data('day');\n\t\t\t\t\tif (nextDay) {\n\t\t\t\t\t\t$('.campaigns-filter input[name=\"day[]\"]:checked').prop('checked', false);\n\t\t\t\t\t\tconst $input = getInput('day', nextDay);\n\t\t\t\t\t\t$input.prop('checked', true).change();\n\t\t\t\t\t\t$('html, body').animate({\n\t\t\t\t\t\t\tscrollTop: $('.static-category-listing').offset().top\n\t\t\t\t\t\t}, 700);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$('.campaigns-filter input[name=\"day[]\"]:checked').prop('checked', false).change();\n\t\t\t\t\t\t$('html, body').animate({\n\t\t\t\t\t\t\tscrollTop: $('.static-category-listing').offset().top\n\t\t\t\t\t\t}, 700);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tinitFilters();\n\t\t\t}\n\n\t\t\tinitDataLayer();\n\t\t\tbackButtonHack();\n\t\t\tpickColorImages();\n\n\t\t\t// Add campaign classes to $grid markup\n\t\t\taddCampaignClasses($grid);\n\n\t\t\t$(window).scroll(throttle(handleScroll, 200));\n\n\n\t\t\tfunction initFilters() {\n\t\t\t\t// open and close filter tabs\n\t\t\t\t$form.on('click', '.filter-label', (e) => {\n\t\t\t\t\tconst $tab = $(e.target).closest('li');\n\t\t\t\t\t$tab.toggleClass('selected active').siblings().removeClass('selected active').find('.filter-dropdown').addClass('collapsed');\n\t\t\t\t\ttoggleFilterTab($tab);\n\t\t\t\t});\n\n\t\t\t\t// close filter tabs also by clicking outside the filters\n\t\t\t\t$(document).on('click', function(e) {\n\t\t\t\t\tconst $selectedFilterLabel = $filters.find('.filter-select.selected .filter-label');\n\t\t\t\t\tif ($selectedFilterLabel.length && !$(e.target).closest('.filter-select').length && !$(e.target).parents('.product-list-item .thumbnails').length > 0) {\n\t\t\t\t\t\t$selectedFilterLabel.trigger('click');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Add accessibility support for keyboard users\n\t\t\t\t$form.on('keydown', '.filter-label', (e) => {\n\t\t\t\t\tconst $tab = $(e.target).closest('li');\n\t\t\t\t\tif (e.code === 'Space' || e.code === 'Enter') {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t$tab.toggleClass('selected active').siblings().removeClass('selected active').find('.filter-dropdown').addClass('collapsed');\n\t\t\t\t\t\ttoggleFilterTab($tab);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\n\t\t\t\tif ($pageHeading.length) {\n\t\t\t\t\t$toolbar.detach().insertAfter($pageHeading).addClass('attached');\n\t\t\t\t} else {\n\t\t\t\t\t$toolbar.addClass('attached');\n\t\t\t\t}\n\n\t\t\t\t$toolbar.add($activeFilters).on('click', '.show-filters', () => {\n\t\t\t\t\t$form.addClass('fullheight open');\n\t\t\t\t\t$('body').addClass('filters-open');\n\t\t\t\t\tsetTimeout(() => $('.filter-actions').addClass('visible'), 250);\n\t\t\t\t});\n\n\t\t\t\t$container.on('click', '.show-products', () => {\n\t\t\t\t\t$('body').removeClass('filters-open');\n\t\t\t\t\t$('.filter-select').removeClass('selected');\n\t\t\t\t\t$('.filter-actions').removeClass('visible')\n\t\t\t\t\t$('.product-filters').removeClass('open').one(utils.transitionDone(), () => {\n\t\t\t\t\t\t$form.removeClass('fullheight');\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tconst $productSort = $form.find('#products-sort');\n\t\t\t\tconst $mobileSort = $toolbar.find('#products-sort-mobile');\n\t\t\t\tconst $desktopSort = $container.find('#desktop-products-sort');\n\n\t\t\t\t$mobileSort.val($productSort.val())\n\t\t\t\t\t.on('change', (e) => {\n\t\t\t\t\t\tconst newValue = $(e.target).val();\n\t\t\t\t\t\t$desktopSort.val(newValue);\n\t\t\t\t\t\t$productSort.val(newValue).trigger('change');\n\t\t\t\t\t});\n\n\t\t\t\t$desktopSort.val($productSort.val())\n\t\t\t\t\t.on('change', (e) => {\n\t\t\t\t\t\tconst newValue = $(e.target).val();\n\t\t\t\t\t\t$mobileSort.val(newValue);\n\t\t\t\t\t\t$productSort.val(newValue).trigger('change');\n\t\t\t\t\t});\n\n\n\t\t\t\tconst $campaignFilter = $form.find('.campaigns-selector').clone().insertBefore($toolbar).addClass('mobile is-mobile is-hidden-desktop');\n\t\t\t\t$campaignFilter.find('input').each((i, el) => $(el).attr('id', $(el).attr('id') + '-mobile'));\n\t\t\t\t$campaignFilter.find('label').each((i, el) => $(el).attr('for', $(el).attr('for') + '-mobile'));\n\n\t\t\t\t$campaignFilter.find('input').change(e => {\n\t\t\t\t\tconst $target = $(e.currentTarget);\n\t\t\t\t\tconst $input = $form.find(`.campaigns-filter input[value=\"${$target.attr('value')}\"]`);\n\t\t\t\t\t$input.prop('checked', $target.is(':checked')).change();\n\t\t\t\t});\n\n\t\t\t\tpreSelectGenderSelection();\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Preselects gender filter selection based on selected\n\t\t\t * navigation (e.g. naiset, miehet, lapset)\n\t\t\t */\n\t\t\tfunction preSelectGenderSelection() {\n\t\t\t\tconst selectedNavigation = JSON.parse(localStorage.getItem('navigationState'))?.navigation;\n\t\t\t\tconst $genderFilters = $('.genders-filter');\n\n\t\t\t\tif (!selectedNavigation) {\n\t\t\t\t\treturn;\n\t\t\t\t} else if (selectedNavigation === 'women') {\n\t\t\t\t\t$genderFilters.find('#genders-naisten').trigger('click');\n\t\t\t\t} else if (selectedNavigation === 'men') {\n\t\t\t\t\t$genderFilters.find('#genders-miesten').trigger('click');\n\t\t\t\t} else if (selectedNavigation === 'children') {\n\t\t\t\t\t$genderFilters.find('#genders-lasten').trigger('click');\n\t\t\t\t\t$genderFilters.find('#genders-nuorten').trigger('click');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n * Handle scroll event, lazyload products\n */\n\t\t\tfunction handleScroll(e) {\n\t\t\t\tconst $button = $('.load-more');\n\n\t\t\t\tif (!isLoading() && $button && $button.length) {\n\t\t\t\t\tconst buttonOffset = $button.offset().top;\n\t\t\t\t\tconst scrollTop = $(window).scrollTop() + $(window).height();\n\t\t\t\t\tif (scrollTop > buttonOffset && _loadMoreCounter > 0) {\n\t\t\t\t\t\t$button.click();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n * Return true if ajax is in progress.\n *\n * @return {Boolean}\n */\n\t\t\tfunction isLoading() {\n\t\t\t\treturn !!_xhr && _xhr.readyState === 1;\n\t\t\t}\n\n\t\t\t/**\n * Toggle tab visibility on mobile.\n *\n * @param {jQuery} $tab\n */\n\t\t\tfunction toggleFilterTab($tab) {\n\t\t\t\tconst $menu = $tab.find('.filter-dropdown');\n\t\t\t\tconst $clone = $menu.clone();\n\n\t\t\t\tif ($tab.hasClass('active')) {\n\t\t\t\t\tconst newHeight = $clone.appendTo($tab)\n\t\t\t\t\t\t.css('height', '')\n\t\t\t\t\t\t.removeClass('collapsed')\n\t\t\t\t\t\t.outerHeight();\n\n\t\t\t\t\t$clone.remove();\n\t\t\t\t\t$menu.css('height', newHeight).removeClass('collapsed');\n\n\t\t\t\t\t//$form.find('.filter-select.selected').not($tab).each((i, el) => toggleFilterTab($(el)));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t$menu.css('height', $menu.outerHeight());\n\t\t\t\t\t$menu.css('height');\n\t\t\t\t\t$menu.addClass('collapsed');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n * Hack to revert the procuct list to same position when coming\n * with the back button. This is done by saving the product list markup and vertical scroll position on\n * session storage and setting a hash parameter telling that markup can be\n * loaded from storage.\n\n */\n\t\t\tfunction backButtonHack() {\n\t\t\t\tconst markupStorageKey = 'v4_' + location.pathname;\n\t\t\t\tconst yPositionStorageKey = 'v4_yPosition_' + location.pathname;\n\t\t\t\tif (window.sessionStorage) {\n\t\t\t\t\tif (location.hash.indexOf('|_s') > -1) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst markup = sessionStorage.getItem(markupStorageKey);\n\t\t\t\t\t\t\tconst scrollYPosition = sessionStorage.getItem(yPositionStorageKey);\n\t\t\t\t\t\t\tif (markup) {\n\t\t\t\t\t\t\t\t$grid.html(markup);\n\t\t\t\t\t\t\t\tsessionStorage.removeItem(markupStorageKey);\n\t\t\t\t\t\t\t\thistory.replaceState(null, '', location.pathname + location.search); // remove hash\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (scrollYPosition) {\n\t\t\t\t\t\t\t\twindow.scrollTo(0, scrollYPosition);\n\t\t\t\t\t\t\t\tsessionStorage.removeItem(yPositionStorageKey);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.log(e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t$('.product-grid').on('click', '.product-list-item a', function(e) {\n\t\t\t\t\t\tconst markup = $(this).closest('.product-grid').html();\n\t\t\t\t\t\tconst scrollPosition = window.pageYOffset;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tsessionStorage.setItem(markupStorageKey, markup);\n\t\t\t\t\t\t\tsessionStorage.setItem(yPositionStorageKey, scrollPosition);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.log(e);\n\t\t\t\t\t\t}\n\t\t\t\t\t\thistory.replaceState(null, '', '#|_s');\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction producGridItemDatalayerClick(e, elem) {\n\t\t\t\tif ($(elem).closest('.product-grid').length) {\n\t\t\t\t\t// Create google ecommerce click event\n\n\t\t\t\t\tif (window.GoogleTagManager.isEnabled()) {\n\t\t\t\t\t\tconst newTab = openingToNewTab(e);\n\t\t\t\t\t\tif (!newTab) {\n\t\t\t\t\t\t\t// Prevent actual click event if not opening to new tab (so that datalayer has the time to receive the event)\n\t\t\t\t\t\t\t// Opening to new tab is allowed, because tag manager event will not be interrubted\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst $productItem = $(elem).closest('.product-list-item');\n\t\t\t\t\t\tconst dataLayerData = getProductDataLayerData($productItem.get(0));\n\n\t\t\t\t\t\twindow.GoogleTagManager.clickProduct(dataLayerData, newTab);\n\t\t\t\t\t}\n\n\t\t\t\t\t// EOF: create google ecommerce click event\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction initDataLayer() {\n\t\t\t\t$('.product-grid').on('click', '.product-list-item a', function(e) {\n\t\t\t\t\tproducGridItemDatalayerClick(e, this);\n\t\t\t\t});\n\t\t\t\t$('.product-grid').on('auxclick', '.product-list-item a', function(e) {\n\t\t\t\t\tif (e.button && e.button === 1) {\n\t\t\t\t\t\tproducGridItemDatalayerClick(e, this);\n\t\t\t\t\t} else if (e.button && e.button === 2) {\n\t\t\t\t\t\t// This is opening the context menu\n\t\t\t\t\t\t// Not so simple to detect a click here\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\t/**\n * @return {Array}\n */\n\t\t\tfunction mapAdditionalFields() {\n\t\t\t\tlet additionalFields = [];\n\t\t\t\tif (typeof mapping.additionalField === 'object' && mapping.additionalField) {\n\t\t\t\t\tadditionalFields = keys(mapping.additionalField);//.map(slug => slug + '[]');\n\t\t\t\t}\n\t\t\t\treturn additionalFields;\n\t\t\t}\n\n\t\t\tfunction buildFilterPath(fields, data) {\n\t\t\t\tconst pathData = pick(data, fields);\n\t\t\t\tconst filterPath = [];\n\t\t\t\tfields.forEach(function(field) {\n\t\t\t\t\tif (pathData[field]) {\n\t\t\t\t\t\tfilterPath.push(pathData[field].replace(/,/g, '-'));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn filterPath.join('-');\n\t\t\t}\n\n\t\t\t/**\n * Create a URL-encoded query string from parameters object.\n *\n * @param {Object} params\n * @return {String}\n */\n\t\t\tfunction getQueryString(params) {\n\t\t\t\tconst urlencoded = decodeURIComponent($.param(params));\n\t\t\t\tif (urlencoded.length) {\n\t\t\t\t\treturn '?' + urlencoded;\n\t\t\t\t}\n\t\t\t\treturn window.location.href.split('?')[0];\n\t\t\t}\n\n\n\t\t\t/**\n * Apply filters and load products. Update filters if needed.\n *\n * @param {Object} data form data\n * @return {Promise}\n */\n\t\t\tfunction handleFormSubmit(data, reload, systemEvent) {\n\t\t\t\tconst urlParams = buildUrlParams(data);\n\t\t\t\tconst queryString = getQueryString(urlParams);\n\t\t\t\tconst preparedData = prepareData(data, urlParams);\n\n\t\t\t\t_shouldReload = false; // reset reload flag\n\n\t\t\t\thistory.replaceState({urlParams}, '', queryString);\n\n\t\t\t\trenderActiveFilters(data, _productsCount);\n\n\t\t\t\tconst isUpdateFilters = !reload && shouldUpdateFilters(preparedData);\n\n\t\t\t\tconst updateFiltersPromise = isUpdateFilters\n\t\t\t\t\t? updateFilters(preparedData, urlParams, !systemEvent)\n\t\t\t\t\t: $.Deferred().resolve();\n\n\t\t\t\treturn $.when(filterProducts(preparedData, urlParams), updateFiltersPromise)\n\t\t\t\t\t.then((producsCount, filters) => {\n\t\t\t\t\t\tif (isUpdateFilters && !data.inpackagebuilder) {\n\t\t\t\t\t\t\tconst filteredData = filterInactiveParams(data);\n\t\t\t\t\t\t\tif (_shouldReload) {\n\t\t\t\t\t\t\t\treturn handleFormSubmit(filteredData, true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\trenderActiveFilters(data, _productsCount);\n\t\t\t\t\t\tupdateProductsCount(_productsCount);\n\t\t\t\t\t\taddCampaignClasses($grid);\n\t\t\t\t\t\tpickColorImages(data);\n\t\t\t\t\t\t_lastFilterData = preparedData;\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\t/**\n * Filter form data to include only values that are currently active in the form.\n * Set a flag to reload products if needed.\n *\n * @param {Object} data\n * @return {Object}\n */\n\t\t\tfunction filterInactiveParams(data) {\n\t\t\t\tconst copy = $.extend({}, data);\n\t\t\t\t$.each(omit(data, 'order', 'pageId', 'chain', 'vm'), function(key, values) {\n\t\t\t\t\tconst paramsArray = normalizeArray(values).filter(val => {\n\t\t\t\t\t\tif (!getInput(key, val)) {\n\t\t\t\t\t\t\t// filter value isn't available anymore due to updated filters\n\t\t\t\t\t\t\t_shouldReload = true;\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t});\n\t\t\t\t\tif (!paramsArray.length) {\n\t\t\t\t\t\tdelete copy[key];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcopy[key] = paramsArray;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn copy;\n\t\t\t}\n\n\t\t\t/**\n * @param {Object} data\n * @return {Promise}\n */\n\t\t\tfunction filterProducts(data) {\n\t\t\t\tif (_xhr) _xhr.abort();\n\t\t\t\tconst $loading = $grid.add($form.find('.cta'));\n\t\t\t\tconst ajaxUrl = $form.data('ajax');\n\n\t\t\t\t$loading.addClass('loading');\n\n\t\t\t\t_xhr = $.getJSON(ajaxUrl, data);\n\n\t\t\t\treturn _xhr.then(res => {\n\t\t\t\t\tif (typeof res === 'object' && res) {\n\t\t\t\t\t\tconst markup = Mustache.render(templates.list, res, {item: templates.item});\n\t\t\t\t\t\t$grid.html(markup);\n\t\t\t\t\t\taddCampaignClasses($grid);\n\t\t\t\t\t\t_productsCount = res.productsCount;\n\n\t\t\t\t\t\tupdateProductsCount(_productsCount);\n\n\t\t\t\t\t\tif (res.pageTitle) {\n\t\t\t\t\t\t\tupdateTitle(res.pageTitle);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (res.pageTitleShort) {\n\t\t\t\t\t\t\tupdateTitle(res.pageTitleShort, true);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttoggleNextDayButton(res);\n\t\t\t\t\t\tsetItemHeights($grid);\n\t\t\t\t\t\ttoggleSelectedDay(res.selectedDay);\n\t\t\t\t\t\tcheckNightBadge();\n\n\t\t\t\t\t\t$grid.trigger('filterProducts', [ res ]);\n\t\t\t\t\t\t_loadMoreCounter = 0;\n\t\t\t\t\t\treturn _productsCount;\n\t\t\t\t\t}\n\t\t\t\t\treturn $.Deferred().reject() ;\n\t\t\t\t})\n\t\t\t\t\t.always(() => $loading.removeClass('loading'));\n\t\t\t}\n\n\t\t\tfunction parseParams(str) {\n\t\t\t\treturn str.split('&').reduce(function (params, param) {\n\t\t\t\t\tvar paramSplit = param.split('=').map(function (value) {\n\t\t\t\t\t\treturn decodeURIComponent(value.replace('+', ' '));\n\t\t\t\t\t});\n\t\t\t\t\tparams[paramSplit[0]] = paramSplit[1];\n\t\t\t\t\treturn params;\n\t\t\t\t}, {});\n\t\t\t}\n\n\t\t\tfunction toggleNextDayButton(res) {\n\n\t\t\t\tif (res.nextDay) {\n\t\t\t\t\tconst $nextDayClone = $('.product-list > .show-next-day').clone(true);\n\t\t\t\t\t$nextDayClone.removeClass('hidden');\n\t\t\t\t\t$nextDayClone.find('.lift-cta').data('day', res.nextDay);\n\t\t\t\t\t$nextDayClone.find('.lift-cta h4').html('Katso seuraavan päivän tarjoukset');\n\t\t\t\t\t$nextDayClone.appendTo('.vm-campaign .product-grid .products'); //Siirrä \"Näytä seuraavien päivien tarjotukset\"-nappi tuotelistaan\n\n\t\t\t\t} else if(res.showAllDiscounts) {\n\t\t\t\t\tconst $nextDayClone = $('.product-list > .show-next-day').clone(true);\n\t\t\t\t\t$nextDayClone.removeClass('hidden');\n\t\t\t\t\t$nextDayClone.find('.lift-cta').data('day', '');\n\t\t\t\t\t$nextDayClone.find('.lift-cta h4').html('Katso kaikki viheltäen menee -tarjoukset');\n\t\t\t\t\t$nextDayClone.appendTo('.vm-campaign .product-grid .products'); //Siirrä \"Näytä seuraavien päivien tarjotukset\"-nappi tuotelistaan\n\t\t\t\t} else {\n\t\t\t\t\t$('.products > .show-next-day').remove();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction checkNightBadge() {\n\t\t\t\tif (!$('.night-badge:visible').length) {\n\t\t\t\t\t$('.product-grid').addClass('no-night-badges');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction toggleSelectedDay(selectedDayText) {\n\t\t\t\tif (selectedDayText) {\n\t\t\t\t\t$container.find('.selected-day').removeClass('invisible').find('h2').html(selectedDayText);\n\t\t\t\t} else {\n\t\t\t\t\t$container.find('.selected-day').addClass('invisible');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n * Update available filters q\n * @param {Object} data\n * @param {Object} urlParams\n * @return {Promise}\n */\n\t\t\tfunction updateFilters(data, urlParams, setPreference) {\n\t\t\t\tconst copy = $.extend({}, data);\n\t\t\t\t//const copy = pick(data, 'pageId', 'genders[]', 'campaigns[]', 'vm', 'packagebuildergroup', 'category[]', 'subcategory[]', 'categoryType[]');\n\n\t\t\t\tif ($form.hasClass('dynamic')) {\n\t\t\t\t\tcopy.preset = _filterPreset;\n\t\t\t\t}\n\n\t\t\t\tcopy.params = $.extend({}, urlParams);\n\n\t\t\t\tcopy.lockedFilters = window.lockedFilterGroups || [];\n\n\t\t\t\tif (setPreference) {\n\t\t\t\t\tsession.preferences.set({ genders: copy['genders[]'] || [] });\n\t\t\t\t\tsession.updateNavigationLinks();\n\t\t\t\t}\n\n\t\t\t\t$form.addClass('loading');\n\t\t\t\treturn $.getJSON($filters.data('ajax'), copy)\n\t\t\t\t\t.then((res) => {\n\t\t\t\t\t\tif (res && res.filters) {\n\t\t\t\t\t\t\tconst selectedTab = $('.filter-select.selected').data('filter');\n\t\t\t\t\t\t\tconst activeTabs = $.map($('.filter-select.active'), val => $(val).data('filter'));\n\t\t\t\t\t\t\tif (selectedTab) {\n\t\t\t\t\t\t\t\tres.filters.forEach(filter => {\n\t\t\t\t\t\t\t\t\tif (filter.input === selectedTab) {\n\t\t\t\t\t\t\t\t\t\tfilter.open = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (activeTabs.indexOf(filter.input) > -1) {\n\t\t\t\t\t\t\t\t\t\tfilter.isActive = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (res.mapping) {\n\n\t\t\t\t\t\t\t\tconst preserved = pick(mapping, ['day', 'campaignClass']);\n\t\t\t\t\t\t\t\tmapping = res.mapping;\n\t\t\t\t\t\t\t\tassign(mapping, preserved);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst markup = Mustache.render(templates.filters, $.extend(res, {\n\t\t\t\t\t\t\t\tproductsCount: _productsCount,\n\t\t\t\t\t\t\t\textraFilters: res.extraFilters || []//$form.data('extra-filters')\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t$filters.html(markup);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn res;\n\t\t\t\t\t})\n\t\t\t\t\t.always(() => $form.removeClass('loading'));\n\t\t\t}\n\n\t\t\t/**\n * @param {Object} data\n * @return {Boolean}\n */\n\t\t\tfunction shouldUpdateFilters(data) {\n\t\t\t\tif ($form.data('should-update')) {\n\t\t\t\t\t$form.data('should-update', false);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (!_lastFilterData) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tconst updateOnChange = ['genders', 'campaigns', 'categoryType', 'category'];\n\t\t\t\tconst prevData = _lastFilterData || {};\n\t\t\t\tconst hash = pick(data, updateOnChange);\n\t\t\t\tconst prevHash = pick(prevData, updateOnChange);\n\t\t\t\tconst shouldUpdate = updateOnChange.filter(key => {\n\t\t\t\t\tconst prev = prevHash[key] || [];\n\t\t\t\t\tconst cur = hash[key] || [];\n\t\t\t\t\tif (prev.length !== cur.length) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn intersection(cur, prev).length !== prev.length;\n\t\t\t\t});\n\n\t\t\t\treturn !!shouldUpdate.length;\n\t\t\t}\n\n\t\t\t/**\n * Load next page of products.\n * @param {Event} e\n */\n\t\t\tfunction handleLoadMore(e) {\n\t\t\t\tif (_xhr) _xhr.abort();\n\n\t\t\t\te.preventDefault();\n\t\t\t\tconst $button = $(e.target);\n\t\t\t\tconst page = $button.attr('data-nextpage');\n\t\t\t\tconst $loading = $grid.find('.next-page');\n\n\t\t\t\tconst data = serialize($form.get(0), { hash: true });\n\t\t\t\tdata.page = page;\n\n\t\t\t\thistory.replaceState('', '', location.pathname + location.search);\n\n\t\t\t\t$loading.addClass('loading');\n\n\t\t\t\t_xhr = $.getJSON($form.data('ajax'), prepareData(data, buildUrlParams(data)));\n\n\t\t\t\treturn _xhr.done((res) => {\n\t\t\t\t\tif (res.nextPage) {\n\t\t\t\t\t\tif (res.nextPage.number) {\n\t\t\t\t\t\t\t$button.attr('data-nextpage', res.nextPage.number);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (res.nextPage.href) {\n\t\t\t\t\t\t\t$button.attr('href', res.nextPage.href);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$button.remove();\n\t\t\t\t\t}\n\n\t\t\t\t\ttoggleSelectedDay(res.selectedDay);\n\n\t\t\t\t\tif (res.products && res.products.length) {\n\n\t\t\t\t\t\tconst markup = Mustache.render(\n\t\t\t\t\t\t\t'{{#products}}{{>item}}{{/products}}',\n\t\t\t\t\t\t\t{products: res.products},\n\t\t\t\t\t\t\t{item: templates.item}\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t$grid.find('.products').append(markup);\n\t\t\t\t\t\taddCampaignClasses($grid);\n\t\t\t\t\t\tpickColorImages(data);\n\t\t\t\t\t\tsetItemHeights($grid);\n\n\t\t\t\t\t\t_loadMoreCounter++;\n\t\t\t\t\t\tif (_loadMoreCounter > 3) {\n\t\t\t\t\t\t\t_loadMoreCounter = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttoggleNextDayButton(res);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t\t.always(() => $loading.removeClass('loading'));\n\t\t\t}\n\n\t\t\tfunction getCategoriesByType(type) {\n\t\t\t\tconst $input = getInput('categoryType', type);\n\t\t\t\tif (!$input) return [];\n\t\t\t\treturn $input.closest('fieldset')\n\t\t\t\t\t.find('input[name=\"category[]\"]')\n\t\t\t\t\t.map((i, el) => $(el).val())\n\t\t\t\t\t.get();\n\t\t\t}\n\n\t\t\t/**\n * Extract url parameters from form data.\n *\n * @param {Object} data\n * @return {Object}\n */\n\t\t\tfunction buildUrlParams(data) {\n\t\t\t\tlet params = {};\n\n\t\t\t\tif (data.categoryType && data.category) {\n\t\t\t\t\tdata.categoryType.forEach(type => {\n\t\t\t\t\t\tconst categories = getCategoriesByType(type);\n\t\t\t\t\t\tpullAll(data.category, categories);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t$.each(pick(data, paramFields), (key, value) => {\n\t\t\t\t\tif (key === 'order' && value === defaultOrder) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\t\tvalue = value.join(',');\n\t\t\t\t\t}\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\tparams[key] = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst pathParams = ['genders', 'color', 'brands'];\n\t\t\t\tconst id = buildFilterPath(pathParams, params);\n\n\t\t\t\tpathParams.forEach(param => delete params[param]);\n\n\t\t\t\tif (id) {\n\t\t\t\t\tparams = $.extend({id}, params);\n\t\t\t\t}\n\t\t\t\treturn params;\n\t\t\t}\n\n\t\t\t/**\n * Select the correct preview images in product listing based on selected\n * color filter.\n *\n * @param {Object} data form data\n */\n\t\t\tfunction pickColorImages(data = serialize($form.get(0), { hash: true })) {\n\t\t\t\tconst color = data['color'];\n\t\t\t\tconst selectColor = color => {\n\t\t\t\t\treturn setTimeout(() => $grid.find(`.img[data-color*=\"${color}\"]`).click(), 10);\n\t\t\t\t}\n\n\t\t\t\tif (color) {\n\t\t\t\t\tif (isArray(color)) {\n\t\t\t\t\t\tcolor.forEach(selectColor);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselectColor(color);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n * @param {Number} count\n */\n\t\t\tfunction updateProductsCount(count) {\n\t\t\t\treturn $container.find('.products-count').html(count);\n\t\t\t}\n\n\t\t\tfunction updateTitle(title, short) {\n\t\t\t\t//$('title').html(title + ' netistä | Intersport');\n\n\t\t\t\tif (typeof short === 'undefined' || !short) {\n\t\t\t\t\t$container.find('.breadcrumb-title').html(title);\n\t\t\t\t\t$form.find('.filter-title').html(title);\n\t\t\t\t} else {\n\t\t\t\t\t$form.find('.filter-title-short').html(title);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/**\n * Reset all active filters.\n */\n\t\t\tfunction resetFilters() {\n\t\t\t\tconst $buttons = $activeFilters.find('.btn-tag');\n\t\t\t\tconst buttonsCount = $buttons.length;\n\t\t\t\t$buttons.each((i, el) => {\n\t\t\t\t\tconst submit = i === buttonsCount - 1 || $(el).data('filter') === 'categoryType';\n\t\t\t\t\tunsetActiveFilter($(el), submit);\n\t\t\t\t});\n\t\t\t\t$('.filter-select').removeClass('selected');\n\t\t\t}\n\n\t\t\t/**\n * Prepare form data for ajax request. Map parameters to normalized\n * values.\n *\n * @param {Oject} data\n * @return {Object}\n */\n\t\t\tfunction prepareData(data, urlParams) {\n\t\t\t\tlet copy = prepareAdditionalFields(data);\n\n\t\t\t\t// filter out empty values. for example,