vendor: 978 bytes, line 1
1!function(n){var e={};function t(a){if(e[a])return e[a].exports;var s=e[a]={i:a,l:!1,exports:{}};return n[a].call(s.exports,s,s.exports,t),s.l=!0,s.exports}t.m=n,t.c=e,t.d=function(n,e,a){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:a})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var a=Object.create(null);if(t.r(a),Object.defineProperty(a,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var s in n)t.d(a,s,function(e){return n[e]}.bind(null,s));return a},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s="./cartridges/int_app/cartridge/client/default/js/productDetail.js")}({
1"../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/criteoTracking.js": 2/*!************************************************************************************************!*\ 3 !*** ../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/criteoTracking.js ***! 4 \************************************************************************************************/ 5/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval("\n\nfunction trackBeacon(url) {\n if (url) {\n fetch(url).catch(e => {\n console.log(e);\n });\n }\n}\n\nmodule.exports = {\n trackBeacon: trackBeacon\n}\n\n//# sourceURL=webpack:///../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/criteoTracking.js?")},
5"../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/chargerFeaturesModal.js": 6/*!**************************************************************************************************************!*\ 7 !*** ../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/chargerFeaturesModal.js ***! 8 \**************************************************************************************************************/ 9/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval("\n\nconst Swal = __webpack_require__(/*! sweetalert2 */ \"../euronics/node_modules/sweetalert2/dist/sweetalert2.all.js\");\n\n/**\n * @param {JQuery} $trigger - Element with .charger-modal-trigger inside .charger-included-block\n */\nfunction openChargerFeaturesModal($trigger) {\n var $block = $trigger.closest('.charger-included-block');\n if (!$block.length) {\n $block = $trigger.closest('.charger-pdp-block').find('.charger-included-block');\n }\n var $source = $block.find('.charger-features-modal-source');\n var html = $source.length ? $source.html() : '';\n if (!html || !String(html).trim()) {\n return;\n }\n Swal.fire({\n customClass: {\n container: 'sa2emodal charger-features-modal'\n },\n showClass: {\n popup: 'animate__animated animate__fadeIn'\n },\n closeButtonHtml: '<i class=\"icon-cancel\"></i>',\n html: html,\n width: 879,\n heightAuto: true,\n background: '#ffffff',\n showCloseButton: true,\n showConfirmButton: fal
9se,\n showCancelButton: false\n });\n}\n\n$(document).on('click', '.charger-modal-trigger', function (e) {\n e.preventDefault();\n openChargerFeaturesModal($(this));\n});\n\n$(document).on('keydown', '.charger-modal-trigger', function (e) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openChargerFeaturesModal($(this));\n }\n});\n\n\n//# sourceURL=webpack:///../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/chargerFeaturesModal.js?")},
9"../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/detail.js": 10/*!************************************************************************************************!*\ 11 !*** ../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/detail.js ***! 12 \************************************************************************************************/ 13/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval("\nconst Swal = __webpack_require__(/*! sweetalert2 */ \"../euronics/node_modules/sweetalert2/dist/sweetalert2.all.js\");\n__webpack_require__(/*! shave/dist/jquery.shave */ \"../euronics/node_modules/shave/dist/jquery.shave.js\");\nvar scrollToElement = __webpack_require__(/*! scroll-to-element */ \"../euronics/node_modules/scroll-to-element/index.js\");\nwindow.scrollToElement = scrollToElement;\nvar base = __webpack_require__(/*! base/product/detail */ \"../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/detail.js\");\nvar productTotalPrice = 0;\nvar criteoTracking = __webpack_require__(/*! ../criteoTracking */ \"../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/criteoTracking.js\");\n\nvar services = __webpack_require__(/*! ./services */ \"../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/services.js\");\nconst stickybits = __webpack_require__(/*! stickybits */ \"../euronics/node_modules/stickybits/dist/stickybits.es.js\").default;\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n if (url) {\n $.ajax({\n url: url,\n method: 'GET',\n success: function () {\n // reporting urls hit on the server\n },\n error: function () {\n // no reporting urls hit on the server\n }\n });\n }\n}\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').text();\n } else {\n pid = $($el).attr(\"data-pid\") ? $($el).attr(\"data-pid\") : $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n}\n\nfunction getAddToCartUrl() {\n return $('.add-to-cart-url').val();\n}\n\n$.addToCartSwogo = function (products, actionType) {\n var addToCartUrl = $('.add-to-cart-url').val();\n var pids = [];\n var hasProducts = products || \"\";\n var isOrderNow = false;\n if (actionType == \"orderNow\") {\n isOrderNow = true;\n }\n\n if (hasProducts) {\n if (hasProducts.length > 0) {\n\n $('body').trigger('product:beforeAddToCart', this);\n\n hasProducts = JSON.parse(hasProducts);\n for (var i = 0; i < hasProducts.length; i++) {\n var obj = {\n pid: hasProducts[i],\n qty: 1\n };\n pids.push(obj);\n }\n\n var form = {\n pidsObj: JSON.stringify(pids),\n pid: undefined,\n childProducts: \"\",\n quantity: \"1\"\n };\n\n if (isOrderNow) {\n form.rurl = \"showCart\";\n }\n\n $('body').trigger('updateAddToCartFormData', form);\n\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\
13n handlePostCartAdd(data);\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n if (isOrderNow) {\n window.location.href = data.redirectURL;\n } else {\n miniCartReportingUrl(data.reportingURL);\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n }\n }\n\n};\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\n\nfunction handlePostCartAdd(response) {\n $('.minicart').trigger('count:update', response);\n var messageType = response.error ? 'alert-danger' : 'alert-success';\n // show add to cart toast\n if (response.newBonusDiscountLineItem &&\n Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else {\n\n var device = window.getComputedStyle(\n document.querySelector('body'), ':after'\n ).getPropertyValue('content').replace(/[^a-zA-Z ]/g, \"\");\n\n if (device === 'mobile') {\n Swal.fire({\n title: \"<span class='body-small font-bold' style='margin-bottom:0px;color:white;'><i class='icon-correct body-small mr-2'></i> Aggiunto al carrello</span>\",\n position: \"center\",\n width: 199,\n padding: '15px',\n background: '#1d428a',\n showCancelButton: fal
13se,\n showCloseButton: false,\n customClass: {\n container: 'addToCartSwal',\n header: 'addToCartSwalHeader'\n },\n showConfirmButton: false,\n timer: 3000,\n })\n } else {\n $(\".minicart\").trigger(\"mouseenter\");\n setTimeout(() => {\n if ($(\".minicart:hover\").length == 0) {\n $(\".minicart\").trigger(\"mouseleave\")\n }\n }, 3000);\n }\n\n }\n}\n\nfunction loadToastMessageAddToCart() {\n $('.addToCartModalFeedback').removeClass('d-none');\n setTimeout(() => {\n $('.addToCartModalFeedback').addClass('d-none');\n }, 2000);\n}\n\nbase.addToCart = function () {\n\n function openServiceModal({\n startStep = 1,\n clickBtnAddToCart = false,\n removeChangeStep = false,\n } = {}) {\n const html = $('#modalServices').html();\n Swal.fire({\n customClass: {\n container: 'sa2emodal services-modal'\n },\n showClass: {\n popup: 'animate__animated animate__fadeIn'\n },\n closeButtonHtml: '<i class=\"icon-cancel\"></i>',\n html: html,\n width: 879,\n heightAuto: false,\n showCloseButton: true,\n showConfirmButton: fal
13se,\n showCancelButton: false,\n willOpen: () => {\n if (clickBtnAddToCart) {\n $('.services-modal button.swal2-close').addClass('closeAddToCart');\n $('.services-modal button.addToCartServices').attr('data-from', 'addToCart');\n $('.services-modal .close-modal').text('');\n $('.services-modal .infomessage-add-to-cart').text('');\n } else {\n $('.services-modal button.addToCartServices').addClass('d-none');\n $('.services-modal button.addToCartServices').attr('data-from', 'banner');\n }\n\n // Attiva il giusto step\n if (startStep === 1) {\n services.updateModalWithOneStep(2, removeChangeStep);\n\n } else if (startStep === 2) {\n services.updateModalWithOneStep(1, removeChangeStep);\n\n }\n\n const einsteinSliders = document.querySelectorAll('.services-product-slider');\n servicesProductSlider(einsteinSliders);\n }\n });\n }\n\n // Clic su \"Aggiungi un servizio\" â Step 1\n $(document).on('click', '.open-service-modal-step-2', function (e) {\n e.preventDefault();\n openServiceModal({\n startStep: 1\n });\n });\n\n // Clic su \"Seleziona un piano\" â Step 2\n $(document).on('click', '.open-service-modal-step-1', function (e) {\n e.preventDefault();\n openServiceModal({\n startStep: 2\n });\n });\n\n let isAddToCartInProgress = false;\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function (e, data) {\n if (isAddToCartInProgress) {\n console.warn('Blocked double execution');\n return;\n }\n\n var dataModelId = '';\n\n if($(this).hasClass('add-to-cart')) {\n if ($(this).attr('data-triggered') === 'true') {\n dataModelId = window.localStorage.getItem('tradeInModelId');\n } else {\n window.localStorage.removeItem('tradeInModelId');\n window.localStorage.removeItem('bonus2025Enabled');\n dataModelId = '';\n }\n }\n\n var button = $(this);\n\n isAddToCartInProgress = true;\n setTimeout(() => {\n isAddToCartInProgress = false;\n }, 500); // evitare doppio click mouse\n\n if (button.hasClass('productHasServices') && $('.pdp-sticky-modal').is(\":visible\") || button.hasClass('productHasServices') && !Swal.isVisible()) {\n if(button.hasClass('open-step-1')) {\n openServiceModal({\n startStep: 1,\n clickBtnAddToCart: true,\n removeChangeStep: true,\n });\n };\n\n if(button.hasClass('open-step-2')) {\n openServiceModal({\n startStep: 2,\n clickBtnAddToCart: true,\n removeChangeStep: false,\n });\n };\n\n } else {\n var addToCartUrl;\n var pid;\n var $this = $(this);\n\n $('body').trigger('product:beforeAddToCart', this);\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');
13\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n //var selectedServices = $('.services-' + pid).attr(\"data-selected\");\n\n if ($(this).parents('.tile-hover-show').length == 0) {\n var selectedServices = services.getAdditionalServicesPopup();\n }\n\n var redirect = data && data.redirect ? data.redirect : null;\n //gestione aggiunta a carrello da content slot services\n var isServiceTile = $(this).parents('.modal-services-wrapper .slot-suggestions').length > 0;\n\n addToCartUrl = getAddToCartUrl();\n var isSponsored = $(this).attr(\"data-sponsored\");\n var criteoPageUid = $(\"input[name=criteoPageUid]\").val();\n var pageFrom = window.pageType || '';\n var token = $($(this)).attr(\"data-token\") ? $($(this)).attr(\"data-token\") : null;\n\n var form = {\n pageFrom: pageFrom,\n pid: pid,\n token: token,\n pageuid: criteoPageUid,\n isSponsored: isSponsored,\n pidsObj: undefined,\n childProducts: JSON.stringify(selectedServices),\n quantity: \"1\",\n modelId: dataModelId,\n bonusEnabled: window.localStorage.getItem('bonus2025Enabled'),\n };\n\n button.removeAttr('data-triggered');\n\n if (!$('.bundle-item').length) {\n form.options = \"\";\n }\n\n var basketUrl = $(this).data(\"basketurl\");\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\
13n\n if (!redirect && !isServiceTile) {\n Swal.close();\n handlePostCartAdd(data);\n }\n\n if ($this.parents('.tns-item').length > 0) {\n var url = $this.parents('.tns-item').attr('data-onbasketbeacon') ? $this.parents('.tns-item').attr('data-onbasketbeacon') : $this.parents('.tns-item').attr('data-onbasket');\n criteoTracking.trackBeacon(url);\n } else if ($this.parents('.sponsor').length > 0) {\n criteoTracking.trackBeacon($this.parents('.sponsor').attr('data-onbasket'));\n }\n\n //JS INTERFACE PER APP\n\n try {\n if (data.appMobile) {\n data.appMobile === 'app-mobile-android' ?\n window.euronicsInterface.updateCartBadge() :\n window.webkit.messageHandlers.updateCartBadge.postMessage({});\n }\n } catch (error) {\n console.log(\"JS INTERFACE APP\");\n }\n\n\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n //GTM Object\n GTM_TrackingAddToCart(basketUrl, pid);\n miniCartReportingUrl(data.reportingURL);\n var serbviceobj = [];\n $(\".sticky-container .services-total-price .icon-correct\").each(function (e, i) {\n serbviceobj = $(i).data(\"serviceinfo\");\n GTM_addToCartService(serbviceobj, 'product page');\n });\n\n if (redirect) {\n location.href = redirect;\n } else if (data.redirectUrl) {\n location.href = data.redirectUrl;\n }\n\n if (isServiceTile) {\n loadToastMessageAddToCart();\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n }\n });\n //Add To Cart for the Offer Section on PDP\n\n $(document).on(\"click\", 'button.add-to-cart-offer', function () {\n var addToCartUrl;\n var pids = [];\n var isOrderNow = $(this).hasClass(\"orderNowProductBundle\");\n\n $('body').trigger('product:beforeAddToCart', this);\n\n var bundle = this.closest(\".bundle\");\n var dataId = $(bundle).find(\".product-tile-pd[data-pid]\");\n\n for (var i = 0; i < dataId.length; i++) {\n var obj = {\n pid: $(dataId[i]).attr(\"data-pid\"),\n qty: 1\n };\n pids.push(obj);\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pidsObj: JSON.stringify(pids),\n pid: undefined,\n childProducts: \"\",\n quantity: \"1\"\n };\n\n if (isOrderNow) {\n form.rurl = \"showCart\";\n }\n\n if (!$('.bundle-item').length) {\n form.options = \"\";\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\
13n\n handlePostCartAdd(data);\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n GTM_addToCardBundle(isOrderNow);\n if (isOrderNow) {\n window.location.href = data.redirectURL;\n } else {\n miniCartReportingUrl(data.reportingURL);\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n })\n}\n\n//START=data-component=\"imageCarouselPdp\"//\n$('.carousel-item').each(function () {\n if ($('.carousel-item').length > 1) {\n $('.carousel-control').show();\n } else {\n $('.carousel-control').hide();\n }\n});\n//FINISH=data-component=\"imageCarouselPdp\"//\n\n$(\".iconProduct .selection > i.icon-share\").on(\"click\", function () {\n $(this).prev('.tool-tip').addClass('active');\n});\n\n$('.iconProduct .selection > .tool-tip > .iconToolTip > i.icon-cancel').on(\"click\", function () {\n $('.tool-tip').removeClass('active');\n});\n\n//Scroll to configuration\nvar heightGap = $(document).width() > 767 ? 180 : 100;\n$(document).on(\"click\", \".mpf-list>.mpf-item>.features\", function () {\n var tabName = $(this).data(\"section\") || '';\n GTM_trackPDPTabs(tabName);\n\n scrollToElement(\".technicalSpecificationsDescription\", {\n offset: -(heightGap),\n duration: 900\n });\n\n if (heightGap == 100) {\n $(\".technicalSpecificationsDescription .collapsed\").trigger('click')\n }\n return false;\n});\n$(document).on(\"click\", \".mpf-list>.mpf-item>.description\", function () {\n var tabName = $(this).data(\"section\") || '';\n GTM_trackPDPTabs(tabName);\n var el = $(\".technicalSpecificationsDescription\").length > 1 ? document.getElementsByClassName('technicalSpecificationsDescription')[1] : document.getElementsByClassName('technicalSpecificationsDescription')[0];\n scrollToElement(el, {\n offset: -(heightGap),\n duration: 900\n });\n if (heightGap == 100) {\n $(el).find('.collapsed').trigger('click')\n }\n return false;\n});\n$(document).on(\"click\", \".mpf-list>.mpf-item>.technicalInfo\", function () {\n var tabName = $(this).data(\"section\") || '';\n GTM_trackPDPTabs(tabName);\n\n scrollToElement(\".technicalSpecificationsRow\", {\n offset: -(heightGap),\n duration: 900\n });\n if (heightGap == 100) {\n $(\".technicalSpecificationsRow .collapsed\").trigger('click')\n }\n return false;\n});\n/* $(document).on(\"click\",\".mpf-list>.mpf-item>.reviews\",function () {\n var tabName = $(this).data(\"section\") || '';\n GTM_trackPDPTabs(tabName);\n\n var el = document.getElementsByClassName('technicalSpecificationsDescription')[2];\n\n scrollToElement(el, {\n offset: -(heightGap),\n duration: 900\n });\n return false;\n});\n */\n\n\n// function cutTechnicalSpec() {\n// const $container = $('.newProductDetailContainer .techSpeContainer .techSpeItem');\n// const $titles = $('.newProductDetailContainer .techSpeContainer .techSpeItem .h6');\n// const $lists = $('.newProductDetailContainer .techSpeContainer .techSpeItem ul');\n\n// if ($container.length === 0 || $titles.length < 2 || $lists.length < 2) {\n// $('.technicalSpecificationsRow .showMoreSpec').addClass('d-none');\n// return;\n// }\n\n// const firstSpec = $container[0] && $container[0].offsetHeight || 0;\n// const secSpecTitle = $titles[1] && $titles[1].offsetHeight || 0;\n// const secSpecChildren = $lists[1] && $lists[1].offsetHeight || 0;\n// const secSpecChildrenCount = $lists[1] && $lists[1].childElementCount || 1;\n\n// const multiply = secSpecChildrenCount < 2 ? 1 : 2;\n\n// const cut = firstSpec + secSpecTitle + (secSpecChildren / secSpecChildrenCount) * multiply + 81;\n\n// $('.newProductDetailContainer #body-technicalSpecifications').css({\n// height: cut,\n// overflow: 'hidden'\n// });\n\n// if ($titles.length < 2 || !$titles[2]) {\n// $('.technicalSpecificationsRow .showMoreSpec').addClass('d-none');\n// }\n// }\n\nfunction cutTechnicalSpec() {\n\n const $container = $('.newProductDetailContainer .techSpeContainer .techSpeItem');\n if ($container.length === 0) {\n console.warn('No techSpeItem container found');\n $('.technicalSpecificationsRow .showMoreSpec').addClass('d-none');\n return;\n }\n\n let liCount = 0;
13\n let cutHeight = 0;\n let stop = false;\n\n $container.each(function (index, item) {\n const $title = $(item).find('.techSpeItemTitle');\n const $lis = $(item).find('ul.techSpeBack > li');\n\n let liConsumedInThisBlock = 0;\n\n if ($title.length && !stop) {\n const h = $title.eq(0).outerHeight(true);\n cutHeight += h;\n }\n\n for (let i = 0; i < $lis.length && !stop; i++) {\n const li = $lis[i];\n const h = $(li).outerHeight(true);\n cutHeight += h;\n liCount += 1;\n liConsumedInThisBlock += 1;\n\n if (liCount >= 5) {\n stop = true;\n }\n }\n\n // Aggiungiamo il margin-bottom SOLO se abbiamo consumato **tutti** i li di questo blocco\n if (!stop && liConsumedInThisBlock === $lis.length) {\n cutHeight += 25;\n }\n\n if (stop) return false; // break\n });\n\n // Extra margine\n const extra = 48; //mt5 sezione\n cutHeight += extra;\n\n // Applica altezza e overflow\n $('.newProductDetailContainer #body-technicalSpecifications').css({\n height: cutHeight,\n overflow: 'hidden'\n });\n\n // Mostra il \"Mostra tutte le specifiche\" solo se ci sono più di 5 li\n const totalLi = $('.newProductDetailContainer .techSpeContainer .techSpeRow').length;\n if (totalLi > 5) {\n $('.technicalSpecificationsRow .showMoreSpec').removeClass('d-none');\n } else {\n $('.technicalSpecificationsRow .showMoreSpec').addClass('d-none');\n }\n}\n\n\n// $('.technicalSpecificationsRow .input-wrapper input').on('keypress', function () {\n// // if ($('.technicalSpecificationsRow .input-wrapper input')[0].value.length == 0) {\n// // $('.technicalSpecificationsRow .input-wrapper .submit-button, .technicalSpecificationsRow .input-wrapper, .technicalSpecificationsRow .input-wrapper input').removeClass('keypress');\n// // $('.technicalSpecificationsRow .input-wrapper .submit-button').text('');\n// // } else {\n// $('.technicalSpecificationsRow .input-wrapper .submit-button').removeClass('ongoing');\n// $('.technicalSpecificationsRow .input-wrapper .submit-button').attr('data-position', '0');\n// $('.technicalSpecificationsRow .input-wrapper .submit-button, .technicalSpecificationsRow .input-wrapper, .technicalSpecificationsRow .input-wrapper input').addClass('keypress');\n// var searchFocus = $('.technicalSpecificationsRow .input-wrapper .submit-button').data('search-focus');\n// $('.technicalSpecificationsRow .input-wrapper .submit-button').text(searchFocus);\n// // }\n// })\n\n$('.technicalSpecificationsRow .input-wrapper input').on('focus', function () {\n $('.technicalSpecificationsRow .input-wrapper .submit-button').removeClass('ongoing');\n $('.technicalSpecificationsRow .input-wrapper .submit-button').attr('data-position', '0');\n $('.technicalSpecificationsRow .input-wrapper .submit-button, .technicalSpecificationsRow .input-wrapper, .technicalSpecificationsRow .input-wrapper input').addClass('keypress');\n\n var searchFocus = $('.technicalSpecificationsRow .input-wrapper .submit-button').data('search-focus');\n $('.technicalSpecificationsRow .input-wrapper .submit-button').text(searchFocus);\n});\n\n$('.technicalSpecificationsRow .showMoreSpec').on('click', function () {\n $(this).toggleClass('show');\n var showText = $(this).data('show');\n var hideText = $(this).data('hide');\n\n if ($(this).hasClass('show')) {\n cutTechnicalSpec();\n $(this).text(showText);\n let position = $('#body-technicalSpecifications')[0].getBoundingClientRect();\n window.scrollTo(position.left, position.top + window.scrollY - 150);\n } else {\n $('.newProductDetailContainer #body-technicalSpecifications').css(\"height\", 'auto');\n $('.newProductDetailContainer #body-technicalSpecifications').css(\"overflow\", 'unset');\n $(this).text(hideText);\n }\n});\n\n$(document).on('input', '.technicalSpecificationsRow .input-wrapper .tech-search-field', function () {\n const $this = $(this);\n const value = $.trim($this.val());\n\n // se câè almeno 1 carattere e non ho già sparato lâevento\n if (value.length >= 1 && !$this.data('gtm-fired')) {\n const $parent = $this.closest('.newProductDetailContainer');\n var data = {\n productCategory: $parent.data('productcategory') || '',\n productName: $parent.data('productname') || '',\n productId: $parent.data('pid') || ''\n };\n\n GTM_techSearchField(data);\n\n // per evitare più push dallo stesso campo\n $this.data('gtm-fired', true);\n }\n});\n\n// gestione Enter: submit simulato\n$(document).on('keydown', '.technicalSpecificationsRow .input-wrapper .tech-search-field', function (e) {\n if (e.key === 'Enter') {\n e.preventDefault();\n $(this).siblings('.submit-button').trigger('click');\n }\n});\n\n$(document).on('click', '.technicalSpecificationsRow .input-wrapper .submit-button', function () {\n const $button = $(this);\n const $input = $('.technicalSpecificationsRow .tech-search-field');\n const inputVal = $input.val().trim();\n const lastSearch = $button.attr('data-last-search') || '';\n\n if (inputVal !== '') {\n // Se il testo dell'input è cambiato, resetto la ricerca\n if (inputVal !== lastSearch) {\n $button.removeClass('ongoing').attr('data-position', '0');\n $('.techSpeContainer .active').removeClass('active');\n }\n\n if (!$button.hasClass('ongoing')) {\n $button.attr('data-last-search', inputVal); // salvo la nuova ricerca\n const list = $('.techSpeItem').children();\n const text = inputVal.toUpperCase();\n\n list.each(function () {\n const $item = $(this);\n const itemText = $item.text().toUpperCase();\n\n if (itemText.includes(text)) {\n if ($('.technicalSpecificationsRow .showMoreSpec').hasClass('show')) {\n $('.technicalSpecificationsRow .showMoreSpec').trigger('click');\n }\n\n if ($item.children().length === 0) {\n $item.addClass('active');\n } else {\n $item.children().each(function () {\n if ($(this).text().toUpperCase().includes(text)) {\n $(this).addClass('active');\n }\n });\n }\n }\n });\n\n const $results = $('.techSpeContainer .active');\n if ($results.length > 0) {\n $('.technicalSpecificationsRow .input-wrapper .error-noresult').addClass('d-none');\n $results[0].scrollIntoView({\n behavior: 'smooth',\n block: \"start\",\n inline: \"center\"\n });\n } else {\n $('.technicalSpecificationsRow .input-wrapper .error-noresult').removeClass('d-none');\n }\n\n $button.addClass('ongoing');\n\n } else {\n // Scroll tra i risultati trovati\n let i = parseInt($button.attr('data-position') || '0', 10);\n const $results = $('.techSpeContainer .active');\n const next = (i + 1) % $results.length;\n\n $results[next].scrollIntoView({\n behavior: 'smooth',\n block: \"start\",\n inline: \"center\"\n });\n\n $button.attr('data-position', next);\n }\n } else {\n $('.techSpeContainer .active').removeClass('active');\n $button.removeClass('ongoing').attr('data-position', '0').removeAttr('data-last-search');\n }\n});
13\n\n\n\nfunction cutTextDescription() {\n $('.newProductDetailContainer #body-textDescription').css(\"height\", '777px');\n $('.newProductDetailContainer #body-textDescription').css(\"overflow\", \"hidden\");\n}\n\nfunction showTextDescription() {\n $('.newProductDetailContainer #body-textDescription').css(\"height\", 'auto');\n $('.newProductDetailContainer #body-textDescription').css(\"overflow\", 'unset');\n}\n\n$('.showMoreDescription').on('click', function () {\n $(this).toggleClass('show');\n $('.box-shadow').toggleClass('show');\n var showText = $(this).data('show');\n var hideText = $(this).data('hide');\n\n if ($(this).hasClass('show')) {\n cutTextDescription();\n $(this).text(showText);\n let position = $('.newProductDetailContainer #body-textDescription')[0].getBoundingClientRect();\n window.scrollTo(position.left, position.top + window.scrollY - 150);\n } else {\n showTextDescription();\n $(this).text(hideText);\n }\n\n const $container = $('#body-textDescription');\n\n if ($container.hasClass('expanded')) {\n // Nasconde tutto\n $container.removeClass('expanded');\n cutTextDescription(); // Richiama la funzione per tagliare\n $(this).text($(this).data('show'));\n } else {\n // Mostra tutto\n $container.addClass('expanded');\n $container.css({\n height: 'auto',\n overflow: 'unset'\n });\n $(this).text($(this).data('hide'));\n }\n});\n\nconst descriptionSelectors = [\n \"#ContainerIcecat\",\n \"#ccs-explore-product\",\n \"#flix-inpage\",\n \"#target\",\n \".loadbeeTabContent\",\n];\n\nfunction hasVisibleContent($el) {\n if (!$el || $el.length === 0) return false;\n\n const children = $el\n .children()\n .not(\"script, style, link, noscript\")\n .filter(function () {\n const $child = $(this);\n\n // Escludi iframe con display: none\n if ($child.is(\"iframe\") && $child.css(\"display\") === \"none\") {\n return false;\n }\n\n return true;\n });\n\n // Se ha più di 1 figlio significativo, è valido\n if (children.length > 1) return true;\n\n // Se ha solo uno ed è diverso da .body-textDescription, è valido\n if (children.length === 1 && !children.is(\".body-textDescription\"))\n return true;\n\n // Se ha solo .body-textDescription, controlla se almeno câè un testo sensato\n if (children.length === 1 && children.is(\".body-textDescription\")) {\n return children.text().trim().length > 50;\n }\n\n return false;\n}\n\nfunction anyContentPresent() {\n return descriptionSelectors.some((selector) => {\n const $el = $(selector);\n const result = hasVisibleContent($el);\n return result;\n });\n}\n\n$(window).on(\"load\", function () {\n // Product security link - append to technical info section\n if ($(\".productSecurityContainer\").length > 0) {\n var content = $(\".productSecurityContainer\").html();\n $(\"#body-technicalSpecifications .techSpeContainer\").append(content);\n // $(content).insertAfter($('#body-technicalSpecifications .techSpeContainer'));\n }\n\n cutTechnicalSpec();\n cutCompareTable();\n selectCompareDifferences();\n\n if (!anyContentPresent()) {\n $(\".showMoreDescription\").addClass(\"d-none\");\n showTextDescription();\n return; // Esce subito se non c'è nessun contenuto\n }\n\n for (let selector of descriptionSelectors) {\n const $el = $(selector);\n if (hasVisibleContent($el)) {\n $(\".showMoreDescription\").addClass(\"d-none\");\n cutTextDescription();\n break;\n }\n }\n});\n\n$(window).on(\"scroll\", function () {\n if (!anyContentPresent()) return;\n\n const $description = $(\"#body-textDescription\");\n\n // â Se è già stato espanso, non fare nulla\n if ($description.hasClass(\"expanded\")) return;\n\n for (let selector of descriptionSelectors) {\n const $el = $(selector);\n if (hasVisibleContent($el)) {\n $(\".showMoreDescription\").removeClass(\"d-none\");\n cutTextDescription();\n break;\n }\n }\n});\n\n$(window).on(\"scroll\", function () {\n if (window.device == \"desktop\") {\n var $stickyBar = $(\"#pdpStickyBar\");\n var $featuresName = $(\".newProductDetailContainer .productFeaturesName\");\n if ($stickyBar.length && $featuresName.length) {\n if (!$featuresName.isInViewport()) {\n $stickyBar.find(\".left-content .name\").removeClass(\"d-none\");\n $stickyBar.find(\".right-content\").removeClass(\"d-md-none\");\n } else {\n $stickyBar.find(\".left-content .name\").addClass(\"d-none\");\n $stickyBar.find(\".right-content\").addClass(\"d-md-none\");\n }\n }\n }\n});
13\n\n// function cutCompareTable() {\n// var $table = $('.compare-table');\n// var $section0Header = $('.compare-table .section-header.section-0')[0];\n// var $section1Header = $('.compare-table .section-header.section-1')[0];\n\n// if ($table.length === 0 || !$section0Header || !$section1Header) {\n// $('.compare.showMoreSpec').addClass('d-none');\n// return;\n// }\n\n// var firstComparisonTitle = $section0Header.offsetHeight;\n// var firstComparisonRows = $('.compare-table .tech-info-row.section-0');\n// var secondComparisonRows = $('.compare-table .tech-info-row.section-1');\n\n// var firstComparisonHeight = 0;\n// var secondComparisonHeight = 0;\n\n// var secondComparisonRowChild = (secondComparisonRows.length > 0 && secondComparisonRows[0])\n// ? secondComparisonRows[0].childElementCount\n// : 0;\n\n// var secondComparisonTitle = $section1Header.offsetHeight;\n\n// var tableToggleEl = $('.table-toggle')[0];\n// var productInfoEl = $('.table-product-info')[0];\n// var reviewInfoEl = $('.table-review-info')[0];\n// var shippingInfoEl = $('.table-shipping-info')[0];\n\n// var tableToggle = tableToggleEl ? tableToggleEl.offsetHeight : 0;\n// var productInfo = productInfoEl ? productInfoEl.offsetHeight : 0;\n// var reviewInfo = reviewInfoEl ? reviewInfoEl.offsetHeight : 0;\n// var shippingInfo = shippingInfoEl ? shippingInfoEl.offsetHeight : 0;\n\n// for (var i = 0; i < firstComparisonRows.length; i++) {\n// firstComparisonHeight += firstComparisonRows[i] ? firstComparisonRows[i].offsetHeight : 0;\n// }\n\n// for (var j = 0; j < 2 && j < secondComparisonRows.length; j++) {\n// secondComparisonHeight += secondComparisonRows[j] ? secondComparisonRows[j].offsetHeight : 0;\n// }\n\n// var multiply = secondComparisonRowChild < 2 ? 1 : 2;\n\n// var cut = productInfo + reviewInfo + shippingInfo + tableToggle +\n// firstComparisonTitle + firstComparisonHeight +\n// secondComparisonTitle + secondComparisonHeight;\n\n// $('.newProductDetailContainer .compare-table-container').css({\n// height: cut,\n// 'overflow-y': 'hidden'\n// });\n\n// var allHeaders = $('.compare-table .section-header');\n// if (allHeaders.length < 2 || !allHeaders[2]) {\n// $('.compare.showMoreSpec').addClass('d-none');\n// }\n// }\n\nfunction cutCompareTable() {\n $(\".compare-table-container .product-header .product-name\").shave(90);\n\n const $table = $(\".compare-table\");\n const $rows = $(\".compare-table tr.tech-info-row\");\n\n if ($table.length === 0 || $rows.length === 0) {\n $(\".compare.showMoreSpec\").addClass(\"d-none\");\n console.warn(\"â Nessuna riga di confronto trovata\");\n return;\n }\n\n let cutHeight = 0;\n let rowCount = 0;\n let techRowIndexes = [];\n\n // Somma le altezze delle prime 5 righe .tech-info-row\n $rows.each(function (i, row) {\n if (rowCount >= 5) return false;\n const h = $(row).outerHeight(true);\n cutHeight += h;\n rowCount++;\n techRowIndexes.push($(row).index());\n });\n\n // Includi solo section-header che si trovano prima o nello stesso gruppo delle prime 5 tech-info-row\n $(\".compare-table tr.section-header\").each(function () {\n const headerIndex = $(this).index();\n if (headerIndex < Math.max(...techRowIndexes)) {\n const h = $(this).outerHeight(true);\n cutHeight += h;\n }\n });\n\n // Aggiunge le altre sezioni (se presenti)\n const blocks = [\n \".table-product-info\",\n \".table-review-info\",\n \".table-shipping-info\",\n \".table-toggle\",\n ];\n\n blocks.forEach((sel) => {\n const el = $(sel)[0];\n if (el) {\n const h = el.offsetHeight;\n cutHeight += h;\n }\n });\n\n // Applica altezza e overflow\n $(\".compare-table-container\").css({\n height: cutHeight + \"px\",\n \"overflow-y\": \"hidden\",\n });\n\n // Mostra o nasconde il pulsante\n if ($rows.length > 5) {\n $(\".compare.showMoreSpec\").removeClass(\"d-none\");\n } else {\n $(\".compare.showMoreSpec\").addClass(\"d-none\");\n }\n}\n\n$(\".compare.showMoreSpec\").on(\"click\", function () {\n $(this).toggleClass(\"show\");\n var showText = $(this).data(\"show\");\n var hideText = $(this).data(\"hide\");\n\n if ($(this).hasClass(\"show\")) {\n cutCompareTable();\n $(this).text(showText);\n let position = $(\"#confronta\")[0].getBoundingClientRect();\n window.scrollTo(position.left, position.top + window.scrollY - 150);\n } else {\n $(\".newProductDetailContainer .compare-table-container\").css(\n \"height\",\n \"auto\",\n );\n $(\".newProductDetailContainer .compare-table-container\").css(\n \"overflow-y\",\n \"unset\",\n );\n $(this).text(hideText);\n }\n});\n\nfunction selectCompareDifferences() {\n $(\".compare-table tr.tech-info-row\").each(function () {\n const $row = $(this);\n const $cells = $row.find(\"td\");\n\n if ($cells.length === 0) return;\n\n // Estrai il testo della prima .tab\n const firstValue = $cells.first().find(\".tab\").text().trim();\n\n // Verifica se tutti i td hanno lo stesso valore nella .tab\n const allSame = $cells.toArray().every((td) =>
13 {\n const cellValue = $(td).find(\".tab\").text().trim();\n return cellValue === firstValue;\n });\n\n if (allSame) {\n $cells.addClass(\"same\");\n $row.find(\"th\").addClass(\"same\");\n $row.addClass(\"same-row\");\n }\n });\n}\n\n$(document).on(\"ready\", function () {\n cutTechnicalSpec();\n cutCompareTable();\n selectCompareDifferences();\n});\n\n$(document).ready(function () {\n const $checkboxMobile = $(\"#flagDiffMobile\");\n const $checkboxDesktop = $(\"#flagDiffDesktop\");\n\n function updateUI(checked) {\n // Mostra/nasconde righe same-row\n $(\"tr.same-row\").toggle(!checked);\n\n // Sincronizza entrambi i checkbox\n $checkboxMobile.prop(\"checked\", checked);\n $checkboxDesktop.prop(\"checked\", checked);\n\n // Reset altezza tabella\n $(\".newProductDetailContainer .compare-table-container\").css({\n height: \"auto\",\n \"overflow-y\": \"unset\",\n });\n\n // Aggiorna testo bottone showMoreSpec\n const hideText = $(\".compare.showMoreSpec\").data(\"hide\");\n if (hideText) $(\".compare.showMoreSpec\").text(hideText);\n\n // Aggiorna riga finale visibile\n $(\".tech-info-row\").removeClass(\"last-visible-row\");\n const $visibleRows = $(\".tech-info-row:visible\");\n if ($visibleRows.length > 0) {\n $visibleRows.last().addClass(\"last-visible-row\");\n }\n }\n\n // Ascolta cambiamenti su entrambi\n $checkboxMobile.on(\"change\", function () {\n updateUI($(this).is(\":checked\"));\n });\n\n $checkboxDesktop.on(\"change\", function () {\n updateUI($(this).is(\":checked\"));\n });\n\n // Permetti il toggle anche cliccando sul contenitore\n $(\".differences-toggle\").on(\"click\", function (e) {\n if ($(e.target).is(\"input\") || $(e.target).is(\"label\")) return;\n const isChecked = $(this).find('input[type=\"checkbox\"]').prop(\"checked\");\n updateUI(!isChecked);\n });\n});\n\n$(document).ready(function () {\n $(\"input#flagDiff\").on(\"change\", function () {\n if ($(this).is(\":checked\")) {\n $(\"tr.same-row\").hide();\n } else {\n $(\"tr.same-row\").show();\n }\n });\n});\n\n$(document).ready(function () {\n var viewSize = $(window).width();\n if (viewSize > 768) {\n $(\".line-item-name\").shave(69);\n }\n\n //scroll to the ratings\n if ($(\"#body-reviews\").length > 0) {\n $(document).on(\"click\", \".gotoratings\", function () {\n if (device == \"mobile\") {\n window.topscroll = -150;\n if ($('[data-target=\"#body-reviews\"]').hasClass(\"collapsed\")) {\n $('[data-target=\"#body-reviews\"]').trigger(\"click\");\n }\n } else {\n window.topscroll = -250;\n if (\n !$('[data-target=\"#body-technicalSpecifications\"]').hasClass(\n \"collapsed\",\n )\n ) {\n $('[data-target=\"#body-technicalSpecifications\"]').trigger(\"click\");\n }\n if (!$('[data-target=\"#body-textDescription\"]').hasClass(\"collapsed\")) {\n $('[data-target=\"#body-textDescription\"]').trigger(\"click\");\n }\n }\n setTimeout(() => {\n scrollToElement(\"#body-reviews\", {\n offset: window.topscroll,\n duration: 900,\n });\n }, 400);\n });\n } else {\n $(\".gotoratings\").hide();\n }\n\n // Impedisci la chiusura accidentale se si clicca ovunque nella modale (tranne la X)\n $(document).on(\"click\", \"#productModal\", function (e) {\n const $target = $(e.target);\n\n // Se si è cliccato sul backdrop (fuori dalla .modal-dialog), blocca la chiusura\n const clickedOnDialog = $target.closest(\".modal-dialog\").length > 0;\n const clickedOnClose = $target.closest(\".close\").length > 0;\n\n // Solo se NON si è cliccato sul dialog o sulla X\n if (!clickedOnDialog && !clickedOnClose) {\n e.stopImmediatePropagation();\n e.preventDefault();\n }\n });\n\n $(document).on(\"show.bs.modal\", \"#productModal\", function (e) {\n const modalInstance = $(this).data(\"bs.modal\");\n if (modalInstance) {\n modalInstance._config.backdrop = \"static\";\n modalInstance._config.keyboard = false;\n }\n\n var triggerElement = $(e.relatedTarget);\n if (triggerElement.length) {\n $(\"#productModal #images-tab\").tab(\"show\"); // Forza la tab attiva\n } else {\n $(\"#productModal #videos-tab\").tab(\"show\");\n }\n\n if (stickyInstance) {\n stickyInstance.cleanup();\n stickyInstance = null;\n }\n });\n\n $(document).on(\"hide.bs.modal\", \"#productModal\", function () {\n initStickyIfNeeded();\n\n var video = $(\".video-item>iframe\");\n if (video.length) {\n var url = video.attr(\"src\");\n video.attr(\"src\", \"\");\n setTimeout(() =>
13 {\n video.attr(\"src\", url);\n }, 250);\n }\n });\n\n for (let i = 0; i < $(\".carousel-indicators-slider\").length; i++) {\n const sliderList = document.querySelectorAll(\".scrollable-carousel-\" + i);\n let isDown = false;\n let startX;\n let scrollLeft;\n\n sliderList.forEach(function (slider) {\n $(\".scrollable-carousel-\" + i).bind(\"touchstart\", (e) => {\n isDown = true;\n startX = e.changedTouches[0].pageX - slider.offsetLeft;\n scrollLeft = slider.scrollLeft;\n });\n\n $(\".scrollable-carousel-\" + i).bind(\"touchend\", (e) => {\n isDown = false;\n $(\".scrollable-carousel-\" + i).removeClass(\"active\");\n });\n\n $(\".scrollable-carousel-\" + i).on(\"touchmove\", (e) => {\n $(\".scrollable-carousel-\" + i).addClass(\"active\");\n const x = e.changedTouches[0].pageX - slider.offsetLeft;\n const walk = (x - startX) * 2; //scroll-fast\n $(slider).scrollLeft(scrollLeft - walk);\n });\n });\n }\n\n //Switch Video function\n\n // if ($('.carousel-indicators-slider').eq(0).children(\".list-inline-item\").length > 2) {\n // var video = $('.carousel-indicators-slider').eq(0).find('.video-item');\n // if (video.length) {\n // $('.carousel-indicators-slider').eq(0).children(\".list-inline-item\").eq(2).before(video);\n // $('.carousel-indicators-slider').eq(0).children(\".list-inline-item\").each(function (i, e) {\n // if (i > 2) {\n // $(e).find(\"a\").attr(\"data-slide-to\", i - 1);\n // }\n // })\n // }\n\n // var videoModal = $('.carousel-indicators-slider').eq(1).find('.video-item');\n // if (videoModal.length) {\n // $('.carousel-indicators-slider').eq(1).children(\".list-inline-item\").eq(2).before(videoModal);\n // $('.carousel-indicators-slider').eq(1).children(\".list-inline-item\").each(function (i, e) {\n // if (i > 2) {\n // $(e).find(\"a\").attr(\"data-slide-to\", i - 1);\n // }\n // })\n // }\n // }\n\n // Disable sticky sidebar if Younited enabled or desktop < 1920px (fix view on small desktop)\n // if ($('.younited-container').length > 0 || viewSize < 1920) {\n // $('.first-view').addClass('nosticky');\n // if (viewSize > 1024) {\n // var sidebarHeight = $('[data-component=productCartSettings]').outerHeight();\n // $('.first-view.nosticky .product-section').css('min-height', sidebarHeight);\n // } else {\n // $('.first-view.nosticky .product-section').removeAttr('style');\n // }\n // }\n\n // Promo price banner sticky mobile\n if ($(\".promo-price-banner\").length > 0) {\n if (viewSize < 768) {\n var stickybarHeight = $(\"[data-component=cartOnMobile]\").outerHeight();\n $(\".promo-price-banner\").css(\"bottom\", stickybarHeight);\n }\n\n $(\".promo-price-banner\").on(\"click\", \"[data-href]\", function () {\n var url = $(this).data(\"href\");\n location.href = url;\n });\n }\n\n let stickyInstance;\n\n function initStickyIfNeeded() {\n if (window.innerWidth > 1024 && !stickyInstance) {\n stickyInstance = stickybits(\".leftStickyColumn\", {\n stickyBitStickyOffset: 150,\n });\n } else if (window.innerWidth <= 1024 && stickyInstance) {\n stickyInstance.cleanup(); // distrugge lo sticky\n stickyInstance = null;\n }\n }\n\n // Init on load\n initStickyIfNeeded();\n\n function stickyMobileTop() {\n const stickyElement = document.getElementById(\"pdpStickyTop\");\n if (!stickyElement) {\n return;\n }\n const container = document.querySelector(\".newProductDetailContainer\");\n\n function handleSticky() {\n const stickyTopOffset = stickyElement.offsetTop;\n const scrollTop = window.scrollY || window.pageYOffset;\n const containerTop = container.offsetTop;\n const containerBottom = containerTop + container.offsetHeight;\n const stickyHeight = stickyElement.offsetHeight;\n\n const stickyTriggerPoint = stickyTopOffset;\n\n if (\n scrollTop >= stickyTriggerPoint &&\n scrollTop + stickyHeight < containerBottom\n ) {\n stickyElement.classList.add(\"sticky-fixed\");\n } else if (scrollTop < stickyTriggerPoint) {\n stickyElement.classList.remove(\"sticky-fixed\");\n }\n }\n\n window.addEventListener(\"scroll\", handleSticky);\n window.addEventListener(\"resize\", handleSticky);\n }\n\n stickyMobileTop();\n\n // Re-init on resize\n window.addEventListener(\"resize\", function () {\n initStickyIfNeeded();\n });\n\n $(\".dimension-tab-wrapper.has-tab .tab\").on(\"click\", function () {\n const $wrapper = $(this).closest(\".dimension-tab-wrapper\");\n\n $wrapper.find(\".tab\").removeClass(\"active\");\n $(this).addClass(\"active\");\n\n const isIncasso = $(this).hasClass(\"tab-incasso\");\n\n $wrapper.find(\".dimension-image\").removeClass(\"active\");\n $wrapper\n .find(isIncasso ? \".image-incasso\" : \".image-freestanding\")\n .addClass(\"active\");\n });\n\n $(\".js-toggle-tooltip\").on(\"click\", function (e) {\n $(\".custom-tooltip\").toggleClass(\"d-none\");\n });\n\n $(document).on(\"click\", function (e) {\n if (!$(e.target).closest(\".js-toggle-tooltip, .custom-tooltip\").length) {\n $(\".custom-tooltip\").addClass(\"d-none\");\n }\n });\n});\n\n$(document).on(\"click\", \".video-item\", function (e) {\n e.preventDefault();\n // Apro la modale\n $('#productModal').modal('show');\n});\n\n$('a[data-toggle=\"tab\"][href=\"#images\"]').on('shown.bs.tab', function (e) {\n // Quando torni sul tab immagini resetta lo slider\n // $('#custCarouselModal').carousel(0); // Torna alla prima immagine\n // $('#custCarouselModal .carousel-inner .carousel-item').removeClass('active');\n // $('#custCarouselModal .carousel-inner .carousel-item').first().addClass('active');\n\n // $('.thumbnail-modal .list-inline-item').removeClass('active');\n // $('.thumbnail-modal .list-inline-item').first().addClass('active');\n});
13\n\n$(document).on('click', '.pdpStickyOptions', function() {\n var html = $('#modalPdpSticky').html();\n Swal.fire({\n customClass: {\n container: 'sa2emodal pdp-sticky-modal'\n },\n showClass: {\n popup: 'animate__animated animate__fadeIn'\n },\n closeButtonHtml: '<i class=\"icon-cancel\"></i>',\n html: html,\n padding: '15px',\n background: '#ffffff',\n heightAuto: false,\n showCloseButton: true,\n showConfirmButton: false,\n showCancelButton: false\n });\n});\n\n\n$(window).on('load', function () {\n //schemaDataProduct\n\n var bvData = $(\"#bv-jsonld-aggregate-rating-data\")\n var bvDataReview = $(\"#bv-jsonld-reviews-data\")\n\n var sfccData = $(\"#sfcc-product-data\")\n\n if (sfccData && sfccData.length > 0) {\n var itemReviewedData = JSON.parse(sfccData.html());\n\n if (bvData && bvData.length > 0) {\n var bvDataInner = JSON.parse(bvData.html())\n bvDataInner.aggregateRating.itemReviewed = itemReviewedData;\n\n var entireDataString = JSON.stringify(bvDataInner);\n sfccData.html(entireDataString)\n $(\"#bv-jsonld-aggregate-rating-data\").remove();\n }\n if (bvDataReview && bvDataReview.length > 0) {\n var sfccDataInner = JSON.parse(sfccData.html())\n var bvDataInner = JSON.parse(bvDataReview.html())\n for (var review of bvDataInner.review) {\n review.itemReviewed = itemReviewedData;\n }\n var entireData = $.extend(bvDataInner, sfccDataInner);\n\n var entireDataString = JSON.stringify(entireData);\n sfccData.html(entireDataString)\n $(\"#bv-jsonld-reviews-data\").remove();\n }\n }\n\n // Gestione scroll verso #offerteCombinate dopo caricamento componenti asincroni (Swogo)\n // Lo script in page.isml head ha già : rimosso hash dall'URL, bloccato scrollTo/scrollIntoView\n if (window._pendingAnchorScroll === '#offerteCombinate') {\n var anchorTarget = document.getElementById('offerteCombinate');\n var swogoContainer = document.getElementById('swogo-bundle-1');\n\n if (swogoContainer && anchorTarget) {\n // ResizeObserver: aspetta che Swogo finisca di renderizzare (dimensioni stabili)\n var resizeDebounce = null;\n var pdpResizeObserver;\n var fallbackTimer = setTimeout(function () {\n try {\n if (pdpResizeObserver) pdpResizeObserver.disconnect();\n } catch (e) {}\n if (window._restoreAndScroll) window._restoreAndScroll(anchorTarget);\n }, 3000);\n\n pdpResizeObserver = new ResizeObserver(function () {\n clearTimeout(resizeDebounce);\n resizeDebounce = setTimeout(function () {\n try {\n pdpResizeObserver.disconnect();\n } catch (e) {}\n clearTimeout(fallbackTimer);\n if (window._restoreAndScroll)\n window._restoreAndScroll(anchorTarget);\n }, 200);\n });\n pdpResizeObserver.observe(swogoContainer);\n } else {\n // Swogo non presente: ripristina e scrolla subito\n if (window._restoreAndScroll) window._restoreAndScroll(anchorTarget);\n }\n }\n});\n\nmodule.exports = base;\n\n\n//# sourceURL=webpack:///../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/detail.js?")},
13"../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/services.js": 14/*!**************************************************************************************************!*\ 15 !*** ../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/services.js ***! 16 \**************************************************************************************************/ 17/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval("\n \nfunction enableOtherServicesButton() {\n if ($('.services-modal .stepTwo').hasClass('d-none')) {\n $('.services-modal .other-services').removeClass('d-none');\n } else {\n $('.services-modal .other-services').addClass('d-none');\n }\n}\n \nfunction updateServices(id, name, type, mode, remove) {\n var selectedServices = $('.services-modal .modal-services-wrapper .footer-services').attr('data-services');\n selectedServices = JSON.parse(selectedServices);\n \n if (remove) {\n $('.services-modal .selected-services-list .services-list #' + type).remove();\n delete selectedServices[type];\n } else {\n if (type) {\n selectedServices[type] = id;\n \n if ($('.services-modal .selected-services-list .services-list #' + type).length > 0) {\n $('.services-modal .selected-services-list .services-list #' + type).text(name);\n } else {\n $('.services-modal .selected-services-list .services-list').append('<li id=\"' + type + '\">' + name + '</li>');\n }\n } else {\n switch (mode) {\n case 'add':\n selectedServices[id] = id;\n $('.services-modal .selected-services-list .services-list').append('<li id=\"' + id + '\">' + name + '</li>');\n break;\n case 'remove':\n $('.services-modal .selected-services-list .services-list #' + id).remove();\n delete selectedServices[id];\n \n default:\n break;\n }\n }\n }\n \n var selectedServicesN = Object.keys(selectedServices).length;\n \n if (selectedServicesN > 0) {\n $('.services-modal .footer-services .selected-services').removeClass('invisible');\n $('.services-modal .selctedServicesCount').text(selectedServicesN);\n \n $('.services-modal button.addToCartServices').removeClass('d-none');\n $('.services-modal .infomessage-add-to-cart').removeClass('d-none');\n $('.services-modal .close-modal').addClass('d-none');\n \n if (selectedServicesN == 1) {\n $('.services-modal .singleService').removeClass('d-none');\n $('.services-modal .multipleServices').addClass('d-none');\n } else {\n $('.services-modal .multipleServices').removeClass('d-none');\n $('.services-modal .singleService').addClass('d-none');\n }\n \n $('.services-modal .reset-services').removeClass('d-none');\n $('.services-modal .other-services').addClass('d-none');\n \n } else {\n $('.services-modal .footer-services .selected-services').addClass('invisible');\n \n $('.services-modal .reset-services').addClass('d-none');\n \n enableOtherServicesButton();\n \n if ($('.services-modal button.addToCartServices').attr('data-from') == 'banner') {\n $('.services-modal button.addToCartServices').addClass('d-none');\n $('.services-modal .infomessage-add-to-cart').addClass('d-none');\n }\n }\n \n $('.services-modal .modal-services-wrapper .footer-services').attr('data-services', JSON.stringify(selectedServices));\n}\n \nfunction clearServices() {\n $('.modal-services-wrapper .footer-services').attr('data-services', '{}');\n $('.selected-services-list .services-list').empty();\n \n $('.selected-services-list').removeClass('open');\n $('.footer-services .selected-services').addClass('invisible');\n}\n \nfunction choiceSelection() {\n $(document).on('click', '.choice-selector', function (e, data) {\n var $target = $(this).attr('data-target') || $(this).find('input').attr('data-target');\n \n if($(this).data('pdf')) {\n var tieteamPdf = $(this).data('pdf');\n $(this).parent().parent().find('.icon-pdf').attr('href', tieteamPdf)\n }\n \n if ($(this).attr('data-target')) {\n $(this).prop('checked', true);\n } else {\n $(this).find('input').prop('checked', true);\n }\n \n $(this).parents('.service-card').removeClass('selected');\n \n $(this).parents('.service-card').find('.description-wrapper .descr').addClass('d-none');\n \n if (data && data.init) {\n $($target).removeClass('d-none');\n } else {\n $('.services-modal ' + $target).removeClass('d-none');\n if ($('.services-modal ' + $target).find('.choice-selection .btn').hasClass('selected')) {\n // $(this).parents('.service-card').addClass('selected');\n }\n }\n });\n \n $(document).on('click', '.choice-selection .btn', function (e) {\n var textAdd = $(this).attr('data-add');\n $(this).parents('.service-card').find('.choice-selection .btn').removeClass('selected').html('').text(textAdd);\n var obj = $('.services-modal .modal-services-wrapper .footer-services').attr('data-services', JSON.stringify(obj));\n var $inputChecked = $(this).parents('.service-card').find('input
17:checked');\n var name = $inputChecked.attr('name');\n var id = $inputChecked.attr('data-id');\n\n if (obj[0].dataset.services.indexOf(id) < 0) {\n var textAdd = $(this).attr('data-add');\n var textAdded = $(this).attr('data-added');\n \n $(this).parents('.service-card').removeClass('selected');\n $(this).removeClass('selected').html('').text(textAdd);\n $(this).addClass('selected').html(textAdded);\n $(this).parents('.service-card').addClass('selected');\n \n $('.reset-services').removeClass('d-none');\n $('.services-modal .other-services').addClass('d-none');\n var $inputChecked = $(this).parents('.service-card').find('input:checked');\n updateServices($inputChecked.attr('data-id'), $inputChecked.attr('data-name'), $inputChecked.attr('name'), null, false);\n } else {\n var textAdd = $(this).attr('data-add');\n var textAdded= $(this).attr('data-added');\n $(this).parents('.service-card').addClass('selected');\n $(this).addClass('selected').html('').text(textAdded);\n $(this).removeClass('selected').html(textAdd);\n $(this).parents('.service-card').removeClass('selected');\n \n $('.services-modal .other-services').addClass('d-none');\n \n var $input = $(this).parents('.service-card').find('input');\n updateServices($input.attr('data-id'), $input.attr('data-name'), $input.attr('name'), null, true);\n }\n\n if (obj[0].dataset.services.indexOf(name) < 0) {\n $(this).parents('.service-card').find('.choice-selection .btn').removeClass('selected').html('').text(textAdd);\n }\n}\n \n );\n \n $(document).on('change', '.additionalServiceOption', function (e) {\n var mode = null;\n var $parentElement = $(this).parents('.accordion-element');\n \n if ($(this).is(':checked')) {\n $parentElement.addClass('selected');\n mode = 'add';\n } else {\n $parentElement.removeClass('selected');\n mode = 'remove';\n }\n \n updateServices($(this).attr('value'), $(this).attr('name'), null, mode, false);\n });\n}\n \nfunction resetServices() {\n $(document).on('click', '.reset-services', function (e) {\n $(this).addClass('d-none');\n \n if ($('.services-modal .stepTwo').hasClass('d-none')) {\n $('.services-modal .other-services').removeClass('d-none');\n $('.services-modal .close-modal').addClass('d-none');\n }\n \n $('.services-modal .choice-selection .btn, .service-card').removeClass('selected');\n \n $('.services-modal .additionalServiceOption').prop('checked', false);\n $('.services-modal .accordion-element').removeClass('selected');\n \n var textAdd = $('.services-modal .choice-selection .btn').attr('data-add');\n $('.services-modal .choice-selection .btn').text(textAdd);\n \n clearServices();\n });\n}\n \nfunction handleSteps() {\n $(document).on('click', '.other-services', function (e) {\n nextStep();\n });\n \n $(document).on('click', '.view-stepOne', function (e) {\n $('.services-modal .stepOne, .tab-section').removeClass('d-none');\n $('.services-modal .stepTwo').addClass('d-none');\n $('.services-modal .close-modal').addClass('d-none');\n $('.selected-services-list').removeClass('open');\n $('.selected-services-list').removeClass('w-40');\n $('.selected-services-toggler').removeClass('open');\n \n $(this).addClass('d-none');\n \n $('.services-modal .stepTwoTitle').addClass('d-none');\n $('.services-modal .stepOneTitle').removeClass('d-none');\n \n if ($('.services-modal .reset-services').hasClass('d-none')) {\n $('.services-modal .other-services').removeClass('d-none');\n }\n });\n \n $(document).on('click', '.addToCartServices', function (e) {\n e.preventDefault(); \n const $modal = $(this).closest('.services-modal'); \n $modal.find('.selected-services-list').removeClass('open');\n $modal.find('.selected-services-toggler').removeClass('open');\n \n const $stepTwo = $modal.find('.stepTwo');\n \n if ($stepTwo.length > 0 && $stepTwo.hasClass('d-none')) {\n nextStep();\n } else {\n const redirect = $(this).attr('data-redirect');\n $('.product-cart-settings').find('.add-cart-container button.add-to-cart').trigger('click', { redirect });\n Swal.showLoading();\n }\n });\n \n $(document).on('click', '.swal2-close.closeAddToCart', function (e) {\n e.preventDefault(); \n clearServices();\n \n $('.product-cart-settings').find('.add-cart-container button.add-to-cart').trigger('click');\n });\n \n $(document).on('click', '.close-modal', function (e) {\n e.preventDefault();
17\n Swal.fire({\n showConfirmButton: false\n }).close();\n });\n}\n \nfunction nextStep() {\n $('.services-modal .stepOne, .tab-section').addClass('d-none');\n $('.services-modal .stepTwo').removeClass('d-none');\n \n $('.services-modal .stepOneTitle').addClass('d-none');\n $('.services-modal .stepTwoTitle').removeClass('d-none');\n \n if ($('.services-modal .addToCartServices').hasClass('d-none')) {\n $('.services-modal .close-modal').removeClass('d-none');\n }\n \n $('.services-modal .view-stepOne').removeClass('d-none');\n \n $('.services-modal .other-services').addClass('d-none');\n}\n \nfunction viewServicesRecap() {\n $(document).on('click', '.selected-services-toggler', function (e) {\n $('.services-modal .selected-services-toggler').toggleClass('open');\n $('.services-modal .selected-services-list').toggleClass('open');\n });\n \n $(document).on('click', '.selected-services-toggler', function (e) {\n \n if ($('.services-modal .selected-services-list').hasClass('open')) {\n if ($('.stepOne').hasClass('d-none') || $('.stepOne').length == 0) {\n $('.services-modal .selected-services-list').addClass('w-40');\n }\n } else {\n $('.services-modal .selected-services-list').removeClass('w-40');\n }\n \n });\n}\n \nfunction getAdditionalServicesPopup() {\n var result = [];\n \n var additionalServices = $('.services-modal .modal-services-wrapper .footer-services').attr('data-services');\n \n if (additionalServices) {\n additionalServices = JSON.parse(additionalServices);\n \n if (Object.keys(additionalServices).length > 0) {\n Object.keys(additionalServices).map(function (key) {\n result.push({\n \"id\": additionalServices[key],\n \"quantity\": 1\n })\n });\n }\n }\n \n return result;\n}\n \nfunction updateModalWithOneStep(stepNumber, removeChangeStep) {\n console.log('REMOVE', removeChangeStep);\n if (!stepNumber) return;\n\n if (stepNumber === 1) {\n // Mostra solo lo stepOne\n $('.stepOne').removeClass('d-none');\n $('.stepTwo').addClass('d-none');\n\n $('.services-modal .stepOneTitle').removeClass('d-none');\n $('.services-modal .stepTwoTitle').addClass('d-none');\n\n // Rimuove elementi non necessari per visuale semplificata\n $('.view-stepOne').addClass('d-none');\n $('.other-services').removeClass('d-none');\n $('.close-modal').addClass('d-none');\n\n } else if (stepNumber === 2) {\n // Mostra solo lo stepTwo\n $('.stepOne').addClass('d-none');\n $('.stepTwo').removeClass('d-none');\n\n $('.services-modal .stepOneTitle').addClass('d-none');\n $('.services-modal .stepTwoTitle').removeClass('d-none');\n\n $('.view-stepOne').removeClass('d-none');\n $('.other-services').addClass('d-none');\n $('.tab-section').addClass('d-none');\n $('.close-modal').removeClass('d-none');\n }\n\n if(removeChangeStep) {\n $('.view-stepOne').addClass('d-none');\n }\n}\n\nfunction openUrl(url) {\n if (url) {\n window.open(url, '_blank');\n }\n}\n \nfunction contentSlotTileClick() {\n $(document).on('click', '.modal-services-wrapper .link-pdp, .modal-services-wrapper .tile-name', function (e) {\n e.preventDefault();\n \n var url = $(this).closest('.link-pdp').attr('href');\n openUrl(url)\n });\n \n $(document).on('click', '.modal-services-wrapper .pdp-link', function (e) {\n e.preventDefault();\n \n var url = $(this).find('a').attr('href');\n openUrl(url)\n });\n}\n \nfunction scrollToSpecialServices() {\n $(document).on('click', '.tab-section .tab-service', function (e) {\n var $target = $(this).attr('data-scroll-to');\n var $element = $('.services-modal ' + $target)[0];\n \n $element.scrollIntoView({\n behavior: 'smooth'\n });\n });\n}\n \nfunction preselectSpecialServices() {\n $(document).ready(function (e) {\n $('.selection-wrapper').each((e, selection) =>
17 {\n if ($(selection).find('.choice-selector input:checked').length == 0) {\n $(selection).find('.choice-selector input').last().attr('checked', true);\n }\n \n $(selection).find('.choice-selector input:checked').trigger('click', {\n init: true\n });\n });\n })\n}\n \nmodule.exports = {\n choiceSelection: choiceSelection,\n resetServices: resetServices,\n handleSteps: handleSteps,\n viewServicesRecap: viewServicesRecap,\n getAdditionalServicesPopup: getAdditionalServicesPopup,\n updateModalWithOneStep: updateModalWithOneStep,\n contentSlotTileClick: contentSlotTileClick,\n scrollToSpecialServices: scrollToSpecialServices,\n preselectSpecialServices: preselectSpecialServices\n}\n \n\n//# sourceURL=webpack:///../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/services.js?")},
17"../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/wishlist.js": 18/*!**************************************************************************************************!*\ 19 !*** ../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/wishlist.js ***! 20 \**************************************************************************************************/ 21/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval("\nconst Swal = __webpack_require__(/*! sweetalert2 */ \"../euronics/node_modules/sweetalert2/dist/sweetalert2.all.js\");\nvar baseWishlist = __webpack_require__(/*! wishlist/product/wishlist */ \"../plugin_wishlists/cartridges/plugin_wishlists/cartridge/client/default/js/product/wishlist.js\");\nvar criteoTracking = __webpack_require__(/*! ../criteoTracking */ \"../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/criteoTracking.js\");\n\nbaseWishlist.addToWishlist = function () {\n\t$(document).on('click', '.add-to-wish-list', function (e) {\n\t\te.preventDefault();\n\t\tvar $this = $(this);\n\t\tvar urlAdd = $(this).data('href');\n\t\tvar urlRemove = $(this).data('href-remove');\n\t\tvar button = $(this);\n\t\tvar pid = $(this).closest('.product-detail').attr('data-pid');\n\t\tvar aftermsg = button.find(\"[data-aftermsg]\").attr(\"data-aftermsg\") || \"\";\n\t\tvar thisDetails = $(this).closest('[data-productinfo]').attr('data-productinfo') || $(this).closest('[data-obj]').attr('data-obj');\n\t\tvar isActive = button.hasClass(\"active\");\n\t\tvar data = {};\n\t\tvar type = 'get';\n\t\tvar url;\n\t\tif (!isActive) {\n\t\t\tdata = {\n\t\t\t\tpid: pid\n\t\t\t}\n\t\t\ttype = 'post';\n\t\t\turl = urlAdd;\n\t\t} else {\n\t\t\turl = urlRemove;\n\t\t}\n\n\t\tif (!url || !pid) {\n\t\t\treturn;\n\t\t}\n\n\n\n\t\t$.spinner().start();\n\t\t$.ajax({\n\t\t\turl: url,\n\t\t\ttype: type,\n\t\t\tdataType: 'json',\n\t\t\tdata: data,\n\t\t\tsuccess: function (data) {\
21n\t\t\t\tif (data.error) {\n\t\t\t\t\tif (data.msg) {\n\t\t\t\t\t\tvar errorHtml = '<div class=\"alert alert-info alert-dismissible valid-cart-error fade show\" role=\"alert\">' +\n\t\t\t\t\t\t\t'<button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\">' +\n\t\t\t\t\t\t\t'<span aria-hidden=\"true\">×</span>' +\n\t\t\t\t\t\t\t'</button>' + data.msg + '</div>';\n\t\t\t\t\t\t$('.error-messaging').append(errorHtml);\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t$('.error-messaging').html(\"\");\n\t\t\t\t\t\t}, 5000);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (data.msg) {\n\t\t\t\t\t\tif (!isActive) {\n\t\t\t\t\t\t\tGTM_addToWishlist(thisDetails);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tSwal.fire({\n\t\t\t\t\t\t\ttitle: \"<h5 style='margin-bottom:0px;color:white'>\" + data.msg + \"</h5>\",\n\t\t\t\t\t\t\tposition: \"center\",\n\t\t\t\t\t\t\twidth: 300,\n\t\t\t\t\t\t\tpadding: '1em',\n\t\t\t\t\t\t\tbackground: '#1d428a',\n\t\t\t\t\t\t\tshowCancelButton: false,\n\t\t\t\t\t\t\tshowCloseButton: false,\n\t\t\t\t\t\t\tshowConfirmButton: fal
21se,\n\t\t\t\t\t\t\ttimer: 3000,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif (aftermsg) {\n\t\t\t\t\t\tbutton.find(\"[data-aftermsg]\").text(aftermsg);\n\t\t\t\t\t}\n\n\t\t\t\t\t$('.add-to-wish-list').each(function () {\n\t\t\t\t\t\tvar $btn = $(this);\n\t\t\t\t\t\tvar $btnPid = $btn.closest('.product-detail').attr('data-pid');\n\t\t\t\t\t\tif ($btnPid === pid) {\n\t\t\t\t\t\t\tif (isActive) {\n\t\t\t\t\t\t\t\t$btn.removeClass(\"active\");\n\t\t\t\t\t\t\t\t$btn.closest('.product-detail').removeClass(\"active\");\n\t\t\t\t\t\t\t\t$btn.find(\"[data-aftermsg]\").text($btn.attr(\"data-beforemsg\") || \"Aggiungi ai preferiti\");\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t$btn.addClass(\"active\");\n\t\t\t\t\t\t\t\t$btn.closest('.product-detail').addClass(\"active\");\n\t\t\t\t\t\t\t\tif (aftermsg) {\n\t\t\t\t\t\t\t\t\t$btn.find(\"[data-aftermsg]\").text(aftermsg);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t$.spinner().stop();\n\n\t\t\t\t// tracciamenti\n\t\t\t\tif ($this.parents('.tns-item').length > 0) {\n\t\t\t\t\tcriteoTracking.trackBeacon($this.parents('.tns-item').attr('data-onwishlistbeacon'));\n\t\t\t\t} else if ($this.parents('.sponsor').length > 0) {\n\t\t\t\t\tcriteoTracking.trackBeacon($this.parents('.sponsor').attr('data-onwishlist'));\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: function (err) {\n\t\t\t\tvar errorHtml = '<div class=\"alert alert-danger alert-dismissible valid-cart-error fade show\" role=\"alert\">' +\n\t\t\t\t\t'<button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-label=\"Close\">' +\n\t\t\t\t\t'<span aria-hidden=\"true\">×</span>' +\n\t\t\t\t\t'</button>' + err + '</div>';\n\t\t\t\t$('.error-messaging').append(errorHtml);\n\t\t\t\t$.spinner().stop();\n\t\t\t}\n\t\t});\n\t});\n}\n\n\nmodule.exports = baseWishlist;\n\n//# sourceURL=webpack:///../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/wishlist.js?")},
vendor: 1,781 bytes, lines 21-25
21"../euronics/node_modules/performance-now/lib/performance-now.js": 22/*!***********************************************************************!*\ 23 !*** ../euronics/node_modules/performance-now/lib/performance-now.js ***! 24 \***********************************************************************/ 25/*! no static exports found */function(module,exports,__webpack_require__){eval('/* WEBPACK VAR INJECTION */(function(process) {// Generated by CoffeeScript 1.12.2\n(function() {\n var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;\n\n if ((typeof performance !== "undefined" && performance !== null) && performance.now) {\n module.exports = function() {\n return performance.now();\n };\n } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) {\n module.exports = function() {\n return (getNanoSeconds() - nodeLoadTime) / 1e6;\n };\n hrtime = process.hrtime;\n getNanoSeconds = function() {\n var hr;\n hr = hrtime();\n return hr[0] * 1e9 + hr[1];\n };\n moduleLoadTime = getNanoSeconds();\n upTime = process.uptime() * 1e9;\n nodeLoadTime = moduleLoadTime - upTime;\n } else if (Date.now) {\n module.exports = function() {\n return Date.now() - loadTime;\n };\n loadTime = Date.now();\n } else {\n module.exports = function() {\n return new Date().getTime() - loadTime;\n };\n loadTime = new Date().getTime();\n }\n\n}).call(this);\n\n//# sourceMappingURL=performance-now.js.map\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../link_app/node_modules/process/browser.js */ "./node_modules/process/browser.js")))\n\n//# sourceURL=webpack:///../euronics/node_modules/performance-now/lib/performance-now.js?')},
vendor: 2,659 bytes, lines 25-29
25"../euronics/node_modules/raf/index.js": 26/*!*********************************************!*\ 27 !*** ../euronics/node_modules/raf/index.js ***! 28 \*********************************************/ 29/*! no static exports found */function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(global) {var now = __webpack_require__(/*! performance-now */ \"../euronics/node_modules/performance-now/lib/performance-now.js\")\n , root = typeof window === 'undefined' ? global : window\n , vendors = ['moz', 'webkit']\n , suffix = 'AnimationFrame'\n , raf = root['request' + suffix]\n , caf = root['cancel' + suffix] || root['cancelRequest' + suffix]\n\nfor(var i = 0; !raf && i < vendors.length; i++) {\n raf = root[vendors[i] + 'Request' + suffix]\n caf = root[vendors[i] + 'Cancel' + suffix]\n || root[vendors[i] + 'CancelRequest' + suffix]\n}\n\n// Some versions of FF have rAF but not cAF\nif(!raf || !caf) {\n var last = 0\n , id = 0\n , queue = []\n , frameDuration = 1000 / 60\n\n raf = function(callback) {\n if(queue.length === 0) {\n var _now = now()\n , next = Math.max(0, frameDuration - (_now - last))\n last = next + _now\n setTimeout(function() {\n var cp = queue.slice(0)\n // Clear queue here to prevent\n // callbacks from appending listeners\n // to the current frame's queue\n queue.length = 0\n for(var i = 0; i < cp.length; i++) {\n if(!cp[i].cancelled) {\n try{\n cp[i].callback(last)\n } catch(e) {\n setTimeout(function() { throw e }, 0)\n }\n }\n }\n }, Math.round(next))\n }\n queue.push({\n handle: ++id,\n callback: callback,\n cancelled: false\n })\n return id\n }\n\n caf = function(handle) {\n for(var i = 0; i < queue.length; i++) {\n if(queue[i].handle === handle) {\n queue[i].cancelled = true\n }\n }\n }\n}\n\nmodule.exports = function(fn) {\n // Wrap in a new function to prevent\n // `cancel` potentially being assigned\n // to the native rAF function\n return raf.call(root, fn)\n}\nmodule.exports.cancel = function() {\n caf.apply(root, arguments)\n}\nmodule.exports.polyfill = function(object) {\n if (!object) {\n object = root;\n }\n object.requestAnimationFrame = raf\n object.cancelAnimationFrame = caf\n}\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../link_app/node_modules/webpack/buildin/global.js */ \"./node_modules/webpack/buildin/global.js\")))\n\n//# sourceURL=webpack:///../euronics/node_modules/raf/index.js?")},
vendor: 5,804 bytes, lines 29-33
29"../euronics/node_modules/scroll-to-element/ease.js": 30/*!**********************************************************!*\ 31 !*** ../euronics/node_modules/scroll-to-element/ease.js ***! 32 \**********************************************************/ 33/*! no static exports found */function(module,exports){eval("// easing functions from \"Tween.js\"\nexports.linear = function(n){\n return n;\n};\n\nexports.inQuad = function(n){\n return n * n;\n};\n\nexports.outQuad = function(n){\n return n * (2 - n);\n};\n\nexports.inOutQuad = function(n){\n n *= 2;\n if (n < 1) return 0.5 * n * n;\n return - 0.5 * (--n * (n - 2) - 1);\n};\n\nexports.inCube = function(n){\n return n * n * n;\n};\n\nexports.outCube = function(n){\n return --n * n * n + 1;\n};\n\nexports.inOutCube = function(n){\n n *= 2;\n if (n < 1) return 0.5 * n * n * n;\n return 0.5 * ((n -= 2 ) * n * n + 2);\n};\n\nexports.inQuart = function(n){\n return n * n * n * n;\n};\n\nexports.outQuart = function(n){\n return 1 - (--n * n * n * n);\n};\n\nexports.inOutQuart = function(n){\n n *= 2;\n if (n < 1) return 0.5 * n * n * n * n;\n return -0.5 * ((n -= 2) * n * n * n - 2);\n};\n\nexports.inQuint = function(n){\n return n * n * n * n * n;\n}\n\nexports.outQuint = function(n){\n return --n * n * n * n * n + 1;\n}\n\nexports.inOutQuint = function(n){\n n *= 2;\n if (n < 1) return 0.5 * n * n * n * n * n;\n return 0.5 * ((n -= 2) * n * n * n * n + 2);\n};\n\nexports.inSine = function(n){\n return 1 - Math.cos(n * Math.PI / 2 );\n};\n\nexports.outSine = function(n){\n return Math.sin(n * Math.PI / 2);\n};\n\nexports.inOutSine = function(n){\n return .5 * (1 - Math.cos(Math.PI * n));\n};\n\nexports.inExpo = function(n){\n return 0 == n ? 0 : Math.pow(1024, n - 1);\n};\n\nexports.outExpo = function(n){\n return 1 == n ? n : 1 - Math.pow(2, -10 * n);\n};\n\nexports.inOutExpo = function(n){\n if (0 == n) return 0;\n if (1 == n) return 1;\n if ((n *= 2) < 1) return .5 * Math.pow(1024, n - 1);\n return .5 * (-Math.pow(2, -10 * (n - 1)) + 2);\n};\n\nexports.inCirc = function(n){\n return 1 - Math.sqrt(1 - n * n);\n};\n\nexports.outCirc = function(n){\n return Math.sqrt(1 - (--n * n));\n};\n\nexports.inOutCirc = function(n){\n n *= 2\n if (n < 1) return -0.5 * (Math.sqrt(1 - n * n) - 1);\n return 0.5 * (Math.sqrt(1 - (n -= 2) * n) + 1);\n};\n\nexports.inBack = function(n){\n var s = 1.70158;\n return n * n * (( s + 1 ) * n - s);\n};\n\nexports.outBack = function(n){\n var s = 1.70158;\n return --n * n * ((s + 1) * n + s) + 1;\n};\n\nexports.inOutBack = function(n){\n var s = 1.70158 * 1.525;\n if ( ( n *= 2 ) < 1 ) return 0.5 * ( n * n * ( ( s + 1 ) * n - s ) );\n return 0.5 * ( ( n -= 2 ) * n * ( ( s + 1 ) * n + s ) + 2 );\n};\n\nexports.inBounce = function(n){\n return 1 - exports.outBounce(1 - n);\n};\n\nexports.outBounce = function(n){\n if ( n < ( 1 / 2.75 ) ) {\n return 7.5625 * n * n;\n } else if ( n < ( 2 / 2.75 ) ) {\n return 7.5625 * ( n -= ( 1.5 / 2.75 ) ) * n + 0.75;\n } else if ( n < ( 2.5 / 2.75 ) ) {\n return 7.5625 * ( n -= ( 2.25 / 2.75 ) ) * n + 0.9375;\n } else {\n return 7.5625 * ( n -= ( 2.625 / 2.75 ) ) * n + 0.984375;\n }\n};\n\nexports.inOutBounce = function(n){\n if (n < .5) return exports.inBounce(n * 2) * .5;\n return exports.outBounce(n * 2 - 1) * .5 + .5;\n};\n\nexports.inElastic = function(n){\n var s, a = 0.1, p = 0.4;\n if ( n === 0 ) return 0;\n if ( n === 1 ) return 1;\n if ( !a || a < 1 ) { a = 1; s = p / 4; }\n else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n return - ( a * Math.pow( 2, 10 * ( n -= 1 ) ) * Math.sin( ( n - s ) * ( 2 * Math.PI ) / p ) );\n};\n\nexports.outElastic = function(n){\n var s, a = 0.1, p = 0.4;\n if ( n === 0 ) return 0;\n if ( n === 1 ) return 1;\n if ( !a || a < 1 ) { a = 1; s = p / 4; }\n else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n return ( a * Math.pow( 2, - 10 * n) * Math.sin( ( n - s ) * ( 2 * Math.PI ) / p ) + 1 );\n};\n\nexports.inOutElastic = function(n){\n var s, a = 0.1, p = 0.4;\n if ( n === 0 ) return 0;\n if ( n === 1 ) return 1;\n if ( !a || a < 1 ) { a = 1; s = p / 4; }\n else s = p * Math.asin( 1 / a ) / ( 2 * Math.PI );\n if ( ( n *= 2 ) < 1 ) return - 0.5 * ( a * Math.pow( 2, 10 * ( n -= 1 ) ) * Math.sin( ( n - s ) * ( 2 * Math.PI ) / p ) );\n return a * Math.pow( 2, -10 * ( n -= 1 ) ) * Math.sin( ( n - s ) * ( 2 * Math.PI ) / p ) * 0.5 + 1;\n};\n\n// aliases\nexports['in-quad'] = exports.inQuad;\nexports['out-quad'] = exports.outQuad;\nexports['in-out-quad'] = exports.inOutQuad;\nexports['in-cube'] = exports.inCube;\nexports['out-cube'] = exports.outCube;\nexports['in-out-cube'] = exports.inOutCube;\nexports['in-quart'] = exports.inQuart;\nexports['out-quart'] = exports.outQuart;\nexports['in-out-quart'] = exports.inOutQuart;\nexports['in-quint'] = exports.inQuint;\nexports['out-quint'] = exports.outQuint;\nexports['in-out-quint'] = exports.inOutQuint;\nexports['in-sine'] = exports.inSine;\nexports['out-sine'] = exports.outSine;\nexports['in-out-sine'] = exports.inOutSine;\nexports['in-expo'] = exports.inExpo;\nexports['out-expo'] = exports.outExpo;\nexports['in-out-expo'] = exports.inOutExpo;\nexports['in-circ'] = exports.inCirc;\nexports['out-circ'] = exports.outCirc;\nexports['in-out-circ'] = exports.inOutCirc;\nexports['in-back'] = exports.inBack;\nexports['out-back'] = exports.outBack;\nexports['in-out-back'] = exports.inOutBack;\nexports['in-bounce'] = exports.inBounce;\nexports['out-bounce'] = exports.outBounce;\nexports['in-out-bounce'] = exports.inOutBounce;\nexports['in-elastic'] = exports.inElastic;\nexports['out-elastic'] = exports.outElastic;\nexports['in-out-elastic'] = exports.inOutElastic;\n\n\n//# sourceURL=webpack:///../euronics/node_modules/scroll-to-element/ease.js?")},
vendor: 2,659 bytes, lines 33-37
33"../euronics/node_modules/scroll-to-element/emitter.js": 34/*!*************************************************************!*\ 35 !*** ../euronics/node_modules/scroll-to-element/emitter.js ***! 36 \*************************************************************/ 37/*! no static exports found */function(module,exports,__webpack_require__){eval("function Emitter(obj) {\n if (obj) return mixin(obj);\n};\n\nfunction mixin(obj) {\n for (var key in Emitter.prototype) {\n obj[key] = Emitter.prototype[key];\n }\n return obj;\n}\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n .push(fn);\n return this;\n};\n\nEmitter.prototype.once = function(event, fn){\n function on() {\n this.off(event, on);\n fn.apply(this, arguments);\n }\n\n on.fn = fn;\n this.on(event, on);\n return this;\n};\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n\n // all\n if (0 == arguments.length) {\n this._callbacks = {};\n return this;\n }\n\n // specific event\n var callbacks = this._callbacks['$' + event];\n if (!callbacks) return this;\n\n // remove all handlers\n if (1 == arguments.length) {\n delete this._callbacks['$' + event];\n return this;\n }\n\n // remove specific handler\n var cb;\n for (var i = 0; i < callbacks.length; i++) {\n cb = callbacks[i];\n if (cb === fn || cb.fn === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n\n // Remove event specific arrays for event types that no\n // one is subscribed for to avoid memory leak.\n if (callbacks.length === 0) {\n delete this._callbacks['$' + event];\n }\n\n return this;\n};\n\nEmitter.prototype.emit = function(event){\n this._callbacks = this._callbacks || {};\n var args = [].slice.call(arguments, 1)\n , callbacks = this._callbacks['$' + event];\n\n if (callbacks) {\n callbacks = callbacks.slice(0);\n for (var i = 0, len = callbacks.length; i < len; ++i) {\n callbacks[i].apply(this, args);\n }\n }\n\n return this;\n};\n\nEmitter.prototype.listeners = function(event){\n this._callbacks = this._callbacks || {};\n return this._callbacks['$' + event] || [];\n};\n\nEmitter.prototype.hasListeners = function(event){\n return !! this.listeners(event).length;\n};\n\nif (true) {\n module.exports = Emitter;\n}\n\n\n//# sourceURL=webpack:///../euronics/node_modules/scroll-to-element/emitter.js?")},
vendor: 1,703 bytes, lines 37-41
37"../euronics/node_modules/scroll-to-element/index.js": 38/*!***********************************************************!*\ 39 !*** ../euronics/node_modules/scroll-to-element/index.js ***! 40 \***********************************************************/ 41/*! no static exports found */function(module,exports,__webpack_require__){eval("var scroll = __webpack_require__(/*! ./scroll-to */ \"../euronics/node_modules/scroll-to-element/scroll-to.js\");\n\nfunction calculateScrollOffset(elem, additionalOffset, alignment) {\n var body = document.body,\n html = document.documentElement;\n\n var elemRect = elem.getBoundingClientRect();\n var clientHeight = html.clientHeight;\n var documentHeight = Math.max( body.scrollHeight, body.offsetHeight,\n html.clientHeight, html.scrollHeight, html.offsetHeight );\n\n additionalOffset = additionalOffset || 0;\n\n var scrollPosition;\n if (alignment === 'bottom') {\n scrollPosition = elemRect.bottom - clientHeight;\n } else if (alignment === 'middle') {\n scrollPosition = elemRect.bottom - clientHeight / 2 - elemRect.height / 2;\n } else { // top and default\n scrollPosition = elemRect.top;\n }\n\n var maxScrollPosition = documentHeight - clientHeight;\n return Math.min(scrollPosition + additionalOffset + window.pageYOffset,\n maxScrollPosition);\n}\n\nmodule.exports = function (elem, options) {\n options = options || {};\n if (typeof elem === 'string') elem = document.querySelector(elem);\n if (elem) return scroll(0, calculateScrollOffset(elem, options.offset, options.align), options);\n};\n\n\n//# sourceURL=webpack:///../euronics/node_modules/scroll-to-element/index.js?")},
vendor: 1,431 bytes, lines 41-45
41"../euronics/node_modules/scroll-to-element/scroll-to.js": 42/*!***************************************************************!*\ 43 !*** ../euronics/node_modules/scroll-to-element/scroll-to.js ***! 44 \***************************************************************/ 45/*! no static exports found */function(module,exports,__webpack_require__){eval("var Tween = __webpack_require__(/*! ./tween */ \"../euronics/node_modules/scroll-to-element/tween.js\");\nvar raf = __webpack_require__(/*! raf */ \"../euronics/node_modules/raf/index.js\");\n\nfunction scroll() {\n var y = window.pageYOffset || document.documentElement.scrollTop;\n var x = window.pageXOffset || document.documentElement.scrollLeft;\n return { top: y, left: x };\n}\n\nfunction scrollTo(x, y, options) {\n options = options || {};\n\n // start position\n var start = scroll();\n\n // setup tween\n var tween = Tween(start)\n .ease(options.ease || 'out-circ')\n .to({ top: y, left: x })\n .duration(options.duration || 1000);\n\n // scroll\n tween.update(function(o){\n window.scrollTo(o.left | 0, o.top | 0);\n });\n\n // handle end\n tween.on('end', function(){\n animate = function(){};\n });\n\n // animate\n function animate() {\n raf(animate);\n tween.update();\n }\n\n animate();\n\n return tween;\n}\n\nmodule.exports = scrollTo;\n\n\n//# sourceURL=webpack:///../euronics/node_modules/scroll-to-element/scroll-to.js?")},
vendor: 2,660 bytes, lines 45-49
45"../euronics/node_modules/scroll-to-element/tween.js": 46/*!***********************************************************!*\ 47 !*** ../euronics/node_modules/scroll-to-element/tween.js ***! 48 \***********************************************************/ 49/*! no static exports found */function(module,exports,__webpack_require__){eval("var ease = __webpack_require__(/*! ./ease */ \"../euronics/node_modules/scroll-to-element/ease.js\");\nvar Emitter = __webpack_require__(/*! ./emitter */ \"../euronics/node_modules/scroll-to-element/emitter.js\");\n\nfunction extend(obj, src) {\n for (var key in src) {\n if (src.hasOwnProperty(key)) obj[key] = src[key];\n }\n return obj;\n}\n\nfunction Tween(obj) {\n if (!(this instanceof Tween)) return new Tween(obj);\n this._from = obj;\n this.ease('linear');\n this.duration(500);\n}\n\nEmitter(Tween.prototype);\n\nTween.prototype.reset = function(){\n this.isArray = Object.prototype.toString.call(this._from) === '[object Array]';\n this._curr = extend({}, this._from);\n this._done = false;\n this._start = Date.now();\n return this;\n};\n\nTween.prototype.to = function(obj){\n this.reset();\n this._to = obj;\n return this;\n};\n\nTween.prototype.duration = function(ms){\n this._duration = ms;\n return this;\n};\n\nTween.prototype.ease = function(fn){\n fn = 'function' == typeof fn ? fn : ease[fn];\n if (!fn) throw new TypeError('invalid easing function');\n this._ease = fn;\n return this;\n};\n\nTween.prototype.stop = function(){\n this.stopped = true;\n this._done = true;\n this.emit('stop');\n this.emit('end');\n return this;\n};\n\nTween.prototype.step = function(){\n if (this._done) return;\n\n var duration = this._duration;\n var now = Date.now();\n var delta = now - this._start;\n var done = delta >= duration;\n\n if (done) {\n this._from = this._to;\n this._update(this._to);\n this._done = true;\n this.emit('end');\n return this;\n }\n\n var from = this._from;\n var to = this._to;\n var curr = this._curr;\n var fn = this._ease;\n var p = (now - this._start) / duration;\n var n = fn(p);\n\n if (this.isArray) {\n for (var i = 0; i < from.length; ++i) {\n curr[i] = from[i] + (to[i] - from[i]) * n;\n }\n\n this._update(curr);\n return this;\n }\n\n for (var k in from) {\n curr[k] = from[k] + (to[k] - from[k]) * n;\n }\n\n this._update(curr);\n return this;\n};\n\nTween.prototype.update = function(fn){\n if (0 == arguments.length) return this.step();\n this._update = fn;\n return this;\n};\n\nmodule.exports = Tween;\n\n\n//# sourceURL=webpack:///../euronics/node_modules/scroll-to-element/tween.js?")},
vendor: 4,506 bytes, lines 49-53
49"../euronics/node_modules/shave/dist/jquery.shave.js": 50/*!***********************************************************!*\ 51 !*** ../euronics/node_modules/shave/dist/jquery.shave.js ***! 52 \***********************************************************/ 53/*! no static exports found */function(module,exports,__webpack_require__){eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n shave - Shave is a javascript plugin that truncates multi-line text within a html element based on set max height\n @version v2.5.10\n @link https://github.com/yowainwright/shave#readme\n @author Jeff Wainwright <[email protected]> (jeffry.in)\n @license MIT\n**/\n(function (factory) {\n true ? !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) :\n undefined;\n}((function () { 'use strict';\n\n function shave(target, maxHeight) {\n var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n if (typeof maxHeight === 'undefined' || isNaN(maxHeight)) throw Error('maxHeight is required');\n var els = typeof target === 'string' ? document.querySelectorAll(target) : target;\n if (!els) return;\n var character = opts.character || '…';\n var classname = opts.classname || 'js-shave';\n var spaces = typeof opts.spaces === 'boolean' ? opts.spaces : true;\n var charclassname = opts.charclassname || 'js-shave-char';\n var charHtml = \"<span class=\\\"\".concat(charclassname, \"\\\">\").concat(character, \"</span>\");\n if (!('length' in els)) els = [els];\n\n for (var i = 0; i < els.length; i += 1) {\n var el = els[i];\n var styles = el.style;\n var span = el.querySelector(\".\".concat(classname));\n var textProp = el.textContent === undefined ? 'innerText' : 'textContent'; // If element text has already been shaved\n\n if (span) {\n // Remove the ellipsis to recapture the original text\n el.removeChild(el.querySelector(\".\".concat(charclassname)));\n el[textProp] = el[textProp]; // eslint-disable-line\n // nuke span, recombine text\n }\n\n var fullText = el[textProp];\n var words = spaces ? fullText.split(' ') : fullText; // If 0 or 1 words, we're done\n\n if (words.length < 2) continue; // Temporarily remove any CSS height for text height calculation\n\n var heightStyle = styles.height;\n styles.height = 'auto';\n var maxHeightStyle = styles.maxHeight;\n styles.maxHeight = 'none'; // If already short enough, we're done\n\n if (el.offsetHeight <= maxHeight) {\n styles.height = heightStyle;\n styles.maxHeight = maxHeightStyle;\n continue;\n } // Binary search for number of words which can fit in allotted height\n\n\n var max = words.length - 1;\n var min = 0;\n var pivot = void 0;\n\n while (min < max) {\n pivot = min + max + 1 >> 1; // eslint-disable-line no-bitwise\n\n el[textProp] = spaces ? words.slice(0, pivot).join(' ') : words.slice(0, pivot);\n el.insertAdjacentHTML('beforeend', charHtml);\n if (el.offsetHeight > maxHeight) max = pivot - 1;else min = pivot;\n }\n\n el[textProp] = spaces ? words.slice(0, max).join(' ') : words.slice(0, max);\n el.insertAdjacentHTML('beforeend', charHtml);\n var diff = spaces ? \" \".concat(words.slice(max).join(' ')) : words.slice(max);\n var shavedText = document.createTextNode(diff);\n var elWithShavedText = document.createElement('span');\n elWithShavedText.classList.add(classname);\n elWithShavedText.style.display = 'none';\n elWithShavedText.appendChild(shavedText);\n el.insertAdjacentElement('beforeend', elWithShavedText);\n styles.height = heightStyle;\n styles.maxHeight = maxHeightStyle;\n }\n }\n\n if (typeof window !== 'undefined') {\n var plugin = window.$ || window.jQuery || window.Zepto;\n\n if (plugin) {\n plugin.fn.shave = function shavePlugin(maxHeight, opts) {\n shave(this, maxHeight, opts);\n return this;\n };\n }\n }\n\n})));\n\n\n//# sourceURL=webpack:///../euronics/node_modules/shave/dist/jquery.shave.js?")},
vendor: 16,978 bytes, lines 53-57
53"../euronics/node_modules/stickybits/dist/stickybits.es.js": 54/*!*****************************************************************!*\ 55 !*** ../euronics/node_modules/stickybits/dist/stickybits.es.js ***! 56 \*****************************************************************/ 57/*! exports provided: default */function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/**\n stickybits - Stickybits is a lightweight alternative to `position: sticky` polyfills\n @version v3.7.11\n @link https://github.com/yowainwright/stickybits#readme\n @author Jeff Wainwright <[email protected]> (https://jeffry.in)\n @license MIT\n**/\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n return _extends.apply(this, arguments);\n}\n\n/*\n STICKYBITS ð\n --------\n > a lightweight alternative to `position: sticky` polyfills ð¬\n --------\n - each method is documented above it our view the readme\n - Stickybits does not manage polymorphic functionality (position like properties)\n * polymorphic functionality: (in the context of describing Stickybits)\n means making things like `position: sticky` be loosely supported with position fixed.\n It also means that features like `useStickyClasses` takes on styles like `position: fixed`.\n --------\n defaults ð\n --------\n - version = `package.json` version\n - userAgent = viewer browser agent\n - target = DOM element selector\n - noStyles = boolean\n - offset = number\n - parentClass = 'string'\n - scrollEl = window || DOM element selector || DOM element\n - stickyClass = 'string'\n - stuckClass = 'string'\n - useStickyClasses = boolean\n - useFixed = boolean\n - useGetBoundingClientRect = boolean\n - verticalPosition = 'string'\n - applyStyle = function\n --------\n propsð\n --------\n - p = props {object}\n --------\n instance note\n --------\n - stickybits parent methods return this\n - stickybits instance methods return an instance item\n --------\n nomenclature\n --------\n - target => el => e\n - props => o || p\n - instance => item => it\n --------\n methods\n --------\n - .definePosition = defines sticky or fixed\n - .addInstance = an array of objects for each Stickybits Target\n - .getClosestParent = gets the parent for non-window scroll\n - .getTopPosition = gets the element top pixel position from the viewport\n - .computeScrollOffsets = computes scroll position\n - .toggleClasses = older browser toggler\n - .manageState = manages sticky state\n - .removeInstance = removes an instance\n - .cleanup = removes all Stickybits instances and cleans up dom from stickybits\n*/\nvar Stickybits = /*#__PURE__*/function () {\n function Stickybits(target, obj) {\n var _this = this;\n\n var o = typeof obj !== 'undefined' ? obj : {};\n this.version = '3.7.11';\n this.userAgent = window.navigator.userAgent || 'no `userAgent` provided by the browser';\n this.props = {\n customStickyChangeNumber: o.customStickyChangeNumber || null,\n noStyles: o.noStyles || false,\n stickyBitStickyOffset: o.stickyBitStickyOffset || 0,\n parentClass: o.parentClass || 'js-stickybit-parent',\n scrollEl: typeof o.scrollEl === 'string' ? document.querySelector(o.scrollEl) : o.scrollEl || window,\n stickyClass: o.stickyClass || 'js-is-sticky',\n stuckClass: o.stuckClass || 'js-is-stuck',\n stickyChangeClass: o.stickyChangeClass || 'js-is-sticky--change',\n useStickyClasses: o.useStickyClasses || false,\n useFixed: o.useFixed || false,\n useGetBoundingClientRect: o.useGetBoundingClientRect || false,\n verticalPosition: o.verticalPosition || 'top',\n applyStyle: o.applyStyle || function (item, style) {\n return _this.applyStyle(item, style);\n }\n };\n /*\n define positionVal after the setting of props, because definePosition looks at the props.useFixed\n ----\n - uses a computed (`.definePosition()`)\n - defined the position\n */\n\n this.props.positionVal = this.definePosition() || 'fixed';\n this.instances = [];\n var _this$props = this.props,\n positionVal = _this$props.positionVal,\n verticalPosition = _this$props.verticalPosition,\n noStyles = _this$props.noStyles,\n stickyBitStickyOffset = _this$props.stickyBitStickyOffset;\n var verticalPositionStyle = verticalPosition === 'top' && !noStyles ? stickyBitStickyOffset + \"px\" : '';\n var positionStyle = positionVal !== 'fixed' ? positionVal : '';\n this.els = typeof target === 'string' ? document.querySelectorAll(target) : target;\n if (!('length' in this.els)) this.els = [this.els];\n\n for (var i = 0; i < this.els.length; i++) {\n var _styles;\n\n var el = this.els[i];\n var instance = this.addInstance(el, this.props); // set vertical position\n\n this.props.applyStyle({\n styles: (_styles = {}, _styles[verticalPosition] = verticalPositionStyle, _styles.position = positionStyle, _styles),\n classes: {}\n }, instance);\n this.manageState(instance); // instances are an array of objects\n\n this.instances.push(instance);\n }\n }\n /*\n setStickyPosition âï¸\n --------\n â most basic thing stickybits does\n => checks to see if position sticky is supported\n => defined the position to be used\n => stickybits works accordingly\n */\n\n\n var _proto = Stickybits.prototype;\n\n _proto.definePosition = function definePosition() {\n var stickyProp;\n\n if (this.props.useFixed) {\n stickyProp = 'fixed';\n } else {\n var prefix = ['', '-o-', '-webkit-', '-moz-', '-ms-'];\n var test = document.head.style;\n\n for (var i = 0; i < prefix.length; i += 1) {\n test.position = prefix[i] + \"sticky\";\n }\n\n stickyProp = test.position ? test.position : 'fixed';\n test.position = '';\n }\n\n return stickyProp;\n }\n /*\n addInstance âï¸\n --------\n â manages instances of items\n - takes in an el and props\n - returns an item object\n ---\n - target = el\n - o = {object} = props\n - scrollEl = 'string' | object\n - verticalPosition = number\n - off = boolean\n - parentClass = 'string'\n - stickyClass = 'string'\n - stuckClass = 'string'\n ---\n - defined later\n - parent = dom element\n - state = 'string'\n - offset = number\n - stickyStart = number\n - stickyStop = number\n - returns an instance object\n */\n ;\n\n _proto.addInstance = function addInstance(el, props) {\n var _this2 = this;\n\n var item = {\n el: el,\n parent: el.parentNode,\n props: props\n };\n\n if (props.positionVal === 'fixed' || props.useStickyClasses) {\n this.isWin = this.props.scrollEl === window;\n var se = this.isWin ? window : this.getClosestParent(item.el, item.props.scrollEl);\n this.computeScrollOffsets(item);\n this.toggleClasses(item.parent, '', props.parentClass);\n item.state = 'default';\n item.stateChange = 'default';\n\n item.stateContainer = function () {\n return _this2.manageState(item);\n };\n\n se.addEventListener('scroll', item.stateContainer);\n }\n\n return item;\n }\n /*\n --------\n getParent ð¨â\n --------\n - a helper function that gets the target element's parent selected el\n - only used for non `window` scroll elements\n - supports older browsers\n */\n ;\n\n _proto.getClosestParent = function getClosestParent(el, match) {\n // p = parent element\n var p = match;\n var e = el;\n if (e.parentElement === p) return p; // traverse up the dom tree until we get to the parent\n\n while (e.parentElement !== p) {\n e = e.parentElement;\n } // return parent element\n\n\n return p;\n }\n /*\n --------\n getTopPosition\n --------\n - a helper function that gets the topPosition of a Stickybit element\n - from the top level of the DOM\n */\n ;\n\n _proto.getTopPosition = function getTopPosition(el) {\n if (this.props.useGetBoundingClientRect) {\n return el.getBoundingClientRect().top + (this.props.scrollEl.pageYOffset || document.documentElement.scrollTop);\n }\n\n var topPosition = 0;\n\n do {\n topPosition = el.offsetTop + topPosition;\n } while (el = el.offsetParent);\n\n return topPosition;\n }\n /*\n computeScrollOffsets ð\n ---\n computeScrollOffsets for Stickybits\n - defines\n - offset\n - start\n - stop\n */\n ;\n\n _proto.computeScrollOffsets = function computeScrollOffsets(item) {\n var it = item;\n var p = it.props;\n var el = it.el;\n var parent = it.parent;\n var isCustom = !this.isWin && p.positionVal === 'fixed';\n var isTop = p.verticalPosition !== 'bottom';\n var scrollElOffset = isCustom ? this.getTopPosition(p.scrollEl) : 0;\n var stickyStart = isCustom ? this.getTopPosition(parent) - scrollElOffset : this.getTopPosition(parent);\n var stickyChangeOffset = p.customStickyChangeNumber !== null ? p.customStickyChangeNumber : el.offsetHeight;\n var parentBottom = stickyStart + parent.offsetHeight;\n it.offset = !isCustom ? scrollElOffset + p.stickyBitStickyOffset : 0;\n it.stickyStart = isTop ? stickyStart - it.offset : 0;\n it.stickyChange = it.stickyStart + stickyChangeOffset;\n it.stickyStop = isTop ? parentBottom - (el.offsetHeight + it.offset) : parentBottom - window.innerHeight;\n }\n /*\n toggleClasses âï¸\n ---\n toggles classes (for older browser support)\n r = removed class\n a = added class\n */\n ;\n\n _proto.toggleClasses = function toggleClasses(el, r, a) {\n var e = el;\n var cArray = e.className.split(' ');\n if (a && cArray.indexOf(a) === -1) cArray.push(a);\n var rItem = cArray.indexOf(r);\n if (rItem !== -1) cArray.splice(rItem, 1);\n e.className = cArray.join(' ');\n }\n /*\n manageState ð\n ---\n - defines the state\n - normal\n - sticky\n - stuck\n */\n ;\n\n _proto.manageState = function manageState(item) {\n var _this3 = this;\n\n // cache object\n var it = item;\n var p = it.props;\n var state = it.state;\n var stateChange = it.stateChange;\n var start = it.stickyStart;\n var change = it.stickyChange;\n var stop = it.stickyStop; // cache props\n\n var pv = p.positionVal;\n var se = p.scrollEl;\n var sticky = p.stickyClass;\n var stickyChange = p.stickyChangeClass;\n var stuck = p.stuckClass;\n var vp = p.verticalPosition;\n var isTop = vp !== 'bottom';\n var aS = p.applyStyle;\n var ns = p.noStyles;\n /*\n requestAnimationFrame\n ---\n - use rAF\n - or stub rAF\n */\n\n var rAFStub = function rAFDummy(f) {\n f();\n };\n\n var rAF = !this.isWin ? rAFStub : window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || rAFStub;\n /*\n define scroll vars\n ---\n - scroll\n - notSticky\n - isSticky\n - isStuck\n */\n\n var scroll = this.isWin ? window.scrollY || window.pageYOffset : se.scrollTop;\n var notSticky = scroll > start && scroll < stop && (state === 'default' || state === 'stuck');\n var isSticky = isTop && scroll <= start && (state === 'sticky' || state === 'stuck');\n var isStuck = scroll >= stop && state === 'sticky';\n /*\n Unnamed arrow functions within this block\n ---\n - help wanted or discussion\n - view test.stickybits.js\n - `stickybits .manageState `position: fixed` interface` for more awareness ð\n */\n\n if (notSticky) {\n it.state = 'sticky';\n } else if (isSticky) {\n it.state = 'default';\n } else if (isStuck) {\n it.state = 'stuck';\n }\n\n var isStickyChange = scroll >= change && scroll <= stop;\n var isNotStickyChange = scroll < change / 2 || scroll > stop;\n\n if (isNotStickyChange) {\n it.stateChange = 'default';\n } else if (isStickyChange) {\n it.stateChange = 'sticky';\n } // Only apply new styles if the state has changed\n\n\n if (state === it.state && stateChange === it.stateChange) return;\n rAF(function () {\n var _styles2, _classes, _styles3, _extends2, _classes2, _style$classes;\n\n var stateStyles = {\n sticky: {\n styles: (_styles2 = {\n position: pv,\n top: '',\n bottom: ''\n }, _styles2[vp] = p.stickyBitStickyOffset + \"px\", _styles2),\n classes: (_classes = {}, _classes[sticky] = true, _classes)\n },\n default: {\n styles: (_styles3 = {}, _styles3[vp] = '', _styles3),\n classes: {}\n },\n stuck: {\n styles: _extends((_extends2 = {}, _extends2[vp] = '', _extends2), pv === 'fixed' && !ns || !_this3.isWin ? {\n position: 'absolute',\n top: '',\n bottom: '0'\n } : {}),\n classes: (_classes2 = {}, _classes2[stuck] = true, _classes2)\n }\n };\n\n if (pv === 'fixed') {\n stateStyles.default.styles.position = '';\n }\n\n var style = stateStyles[it.state];\n style.classes = (_style$classes = {}, _style$classes[stuck] = !!style.classes[stuck], _style$classes[sticky] = !!style.classes[sticky], _style$classes[stickyChange] = isStickyChange, _style$classes);\n aS(style, item);\n });\n }\n /*\n applyStyle\n ---\n - apply the given styles and classes to the element\n */\n ;\n\n _proto.applyStyle = function applyStyle(_ref, item) {\n var styles = _ref.styles,\n classes = _ref.classes;\n // cache object\n var it = item;\n var e = it.el;\n var p = it.props;\n var stl = e.style; // cache props\n\n var ns = p.noStyles;\n var cArray = e.className.split(' '); // Disable due to bug with old versions of eslint-scope and for ... in\n // https://github.com/eslint/eslint/issues/12117\n // eslint-disable-next-line no-unused-vars\n\n for (var cls in classes) {\n var addClass = classes[cls];\n\n if (addClass) {\n if (cArray.indexOf(cls) === -1) cArray.push(cls);\n } else {\n var idx = cArray.indexOf(cls);\n if (idx !== -1) cArray.splice(idx, 1);\n }\n }\n\n e.className = cArray.join(' ');\n\n if (styles['position']) {\n stl['position'] = styles['position'];\n }\n\n if (ns) return; // eslint-disable-next-line no-unused-vars\n\n for (var key in styles) {\n stl[key] = styles[key];\n }\n };\n\n _proto.update = function update(updatedProps) {\n var _this4 = this;\n\n if (updatedProps === void 0) {\n updatedProps = null;\n }\n\n this.instances.forEach(function (instance) {\n _this4.computeScrollOffsets(instance);\n\n if (updatedProps) {\n // eslint-disable-next-line no-unused-vars\n for (var updatedProp in updatedProps) {\n instance.props[updatedProp] = updatedProps[updatedProp];\n }\n }\n });\n return this;\n }\n /*\n removes an instance ð\n --------\n - cleanup instance\n */\n ;\n\n _proto.removeInstance = function removeInstance(instance) {\n var _styles4, _classes3;\n\n var e = instance.el;\n var p = instance.props;\n this.applyStyle({\n styles: (_styles4 = {\n position: ''\n }, _styles4[p.verticalPosition] = '', _styles4),\n classes: (_classes3 = {}, _classes3[p.stickyClass] = '', _classes3[p.stuckClass] = '', _classes3)\n }, instance);\n this.toggleClasses(e.parentNode, p.parentClass);\n }\n /*\n cleanup ð\n --------\n - cleans up each instance\n - clears instance\n */\n ;\n\n _proto.cleanup = function cleanup() {\n for (var i = 0; i < this.instances.length; i += 1) {\n var instance = this.instances[i];\n\n if (instance.stateContainer) {\n instance.props.scrollEl.removeEventListener('scroll', instance.stateContainer);\n }\n\n this.removeInstance(instance);\n }\n\n this.manageState = false;\n this.instances = [];\n };\n\n return Stickybits;\n}();\n/*\n export\n --------\n exports StickBits to be used ð\n*/\n\n\nfunction stickybits(target, o) {\n return new Stickybits(target, o);\n}\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (stickybits);\n\n\n//# sourceURL=webpack:///../euronics/node_modules/stickybits/dist/stickybits.es.js?")},
vendor: 148,373 bytes, lines 57-61
57"../euronics/node_modules/sweetalert2/dist/sweetalert2.all.js": 58/*!********************************************************************!*\ 59 !*** ../euronics/node_modules/sweetalert2/dist/sweetalert2.all.js ***! 60 \********************************************************************/ 61/*! no static exports found */function(module,exports,__webpack_require__){eval("/*!\n* sweetalert2 v10.16.11\n* Released under the MIT License.\n*/\n(function (global, factory) {\n true ? module.exports = factory() :\n undefined;\n}(this, function () { 'use strict';\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf(subClass, superClass);\n }\n\n function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n }\n\n function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n }\n\n function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n }\n\n function _construct(Parent, args, Class) {\n if (_isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) _setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n }\n\n function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n }\n\n function _possibleConstructorReturn(self, call) {\n if (call && (typeof call === \"object\" || typeof call === \"function\")) {\n return call;\n }\n\n return _assertThisInitialized(self);\n }\n\n function _createSuper(Derived) {\n var hasNativeReflectConstruct = _isNativeReflectConstruct();\n\n return function _createSuperInternal() {\n var Super = _getPrototypeOf(Derived),\n result;\n\n if (hasNativeReflectConstruct) {\n var NewTarget = _getPrototypeOf(this).constructor;\n\n result = Reflect.construct(Super, arguments, NewTarget);\n } else {\n result = Super.apply(this, arguments);\n }\n\n return _possibleConstructorReturn(this, result);\n };\n }\n\n function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = _getPrototypeOf(object);\n if (object === null) break;\n }\n\n return object;\n }\n\n function _get(target, property, receiver) {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get;\n } else {\n _get = function _get(target, property, receiver) {\n var base = _superPropBase(target, property);\n\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n\n if (desc.get) {\n return desc.get.call(receiver);\n }\n\n return desc.value;\n };\n }\n\n return _get(target, property, receiver || target);\n }\n\n var consolePrefix = 'SweetAlert2:';\n /**\n * Filter the unique values into a new array\n * @param arr\n */\n\n var uniqueArray = function uniqueArray(arr) {\n var result = [];\n\n for (var i = 0; i < arr.length; i++) {\n if (result.indexOf(arr[i]) === -1) {\n result.push(arr[i]);\n }\n }\n\n return result;\n };\n /**\n * Capitalize the first letter of a string\n * @param str\n */\n\n var capitalizeFirstLetter = function capitalizeFirstLetter(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n };\n /**\n * Returns the array of object values (Object.values isn't supported in IE11)\n * @param obj\n */\n\n var objectValues = function objectValues(obj) {\n return Object.keys(obj).map(function (key) {\n return obj[key];\n });\n };\n /**\n * Convert NodeList to Array\n * @param nodeList\n */\n\n var toArray = function toArray(nodeList) {\n return Array.prototype.slice.call(nodeList);\n };\n /**\n * Standardise console warnings\n * @param message\n */\n\n var warn = function warn(message) {\n console.warn(\"\".concat(consolePrefix, \" \").concat(_typeof(message) === 'object' ? message.join(' ') : message));\n };\n /**\n * Standardise console errors\n * @param message\n */\n\n var error = function error(message) {\n console.error(\"\".concat(consolePrefix, \" \").concat(message));\n };\n /**\n * Private global state for `warnOnce`\n * @type {Array}\n * @private\n */\n\n var previousWarnOnceMessages = [];\n /**\n * Show a console warning, but only if it hasn't already been shown\n * @param message\n */\n\n var warnOnce = function warnOnce(message) {\n if (!(previousWarnOnceMessages.indexOf(message) !== -1)) {\n previousWarnOnceMessages.push(message);\n warn(message);\n }\n };\n /**\n * Show a one-time console warning about deprecated params/methods\n */\n\n var warnAboutDeprecation = function warnAboutDeprecation(deprecatedParam, useInstead) {\n warnOnce(\"\\\"\".concat(deprecatedParam, \"\\\" is deprecated and will be removed in the next major release. Please use \\\"\").concat(useInstead, \"\\\" instead.\"));\n };\n /**\n * If `arg` is a function, call it (with no arguments or context) and return the result.\n * Otherwise, just pass the value through\n * @param arg\n */\n\n var callIfFunction = function callIfFunction(arg) {\n return typeof arg === 'function' ? arg() : arg;\n };\n var hasToPromiseFn = function hasToPromiseFn(arg) {\n return arg && typeof arg.toPromise === 'function';\n };\n var asPromise = function asPromise(arg) {\n return hasToPromiseFn(arg) ? arg.toPromise() : Promise.resolve(arg);\n };\n var isPromise = function isPromise(arg) {\n return arg && Promise.resolve(arg) === arg;\n };\n\n var DismissReason = Object.freeze({\n cancel: 'cancel',\n backdrop: 'backdrop',\n close: 'close',\n esc: 'esc',\n timer: 'timer'\n });\n\n var isJqueryElement = function isJqueryElement(elem) {\n return _typeof(elem) === 'object' && elem.jquery;\n };\n\n var isElement = function isElement(elem) {\n return elem instanceof Element || isJqueryElement(elem);\n };\n\n var argsToParams = function argsToParams(args) {\n var params = {};\n\n if (_typeof(args[0]) === 'object' && !isElement(args[0])) {\n _extends(params, args[0]);\n } else {\n ['title', 'html', 'icon'].forEach(function (name, index) {\n var arg = args[index];\n\n if (typeof arg === 'string' || isElement(arg)) {\n params[name] = arg;\n } else if (arg !== undefined) {\n error(\"Unexpected type of \".concat(name, \"! Expected \\\"string\\\" or \\\"Element\\\", got \").concat(_typeof(arg)));\n }\n });\n }\n\n return params;\n };\n\n var swalPrefix = 'swal2-';\n var prefix = function prefix(items) {\n var result = {};\n\n for (var i in items) {\n result[items[i]] = swalPrefix + items[i];\n }\n\n return result;\n };\n var swalClasses = prefix(['container', 'shown', 'height-auto', 'iosfix', 'popup', 'modal', 'no-backdrop', 'no-transition', 'toast', 'toast-shown', 'show', 'hide', 'close', 'title', 'header', 'content', 'html-container', 'actions', 'confirm', 'deny', 'cancel', 'footer', 'icon', 'icon-content', 'image', 'input', 'file', 'range', 'select', 'radio', 'checkbox', 'label', 'textarea', 'inputerror', 'input-label', 'validation-message', 'progress-steps', 'active-progress-step', 'progress-step', 'progress-step-line', 'loader', 'loading', 'styled', 'top', 'top-start', 'top-end', 'top-left', 'top-right', 'center', 'center-start', 'center-end', 'center-left', 'center-right', 'bottom', 'bottom-start', 'bottom-end', 'bottom-left', 'bottom-right', 'grow-row', 'grow-column', 'grow-fullscreen', 'rtl', 'timer-progress-bar', 'timer-progress-bar-container', 'scrollbar-measure', 'icon-success', 'icon-warning', 'icon-info', 'icon-question', 'icon-error']);\n var iconTypes = prefix(['success', 'warning', 'info', 'question', 'error']);\n\n var getContainer = function getContainer() {\n return document.body.querySelector(\".\".concat(swalClasses.container));\n };\n var elementBySelector = function elementBySelector(selectorString) {\n var container = getContainer();\n return container ? container.querySelector(selectorString) : null;\n };\n\n var elementByClass = function elementByClass(className) {\n return elementBySelector(\".\".concat(className));\n };\n\n var getPopup = function getPopup() {\n return elementByClass(swalClasses.popup);\n };\n var getIcon = function getIcon() {\n return elementByClass(swalClasses.icon);\n };\n var getTitle = function getTitle() {\n return elementByClass(swalClasses.title);\n };\n var getContent = function getContent() {\n return elementByClass(swalClasses.content);\n };\n var getHtmlContainer = function getHtmlContainer() {\n return elementByClass(swalClasses['html-container']);\n };\n var getImage = function getImage() {\n return elementByClass(swalClasses.image);\n };\n var getProgressSteps = function getProgressSteps() {\n return elementByClass(swalClasses['progress-steps']);\n };\n var getValidationMessage = function getValidationMessage() {\n return elementByClass(swalClasses['validation-message']);\n };\n var getConfirmButton = function getConfirmButton() {\n return elementBySelector(\".\".concat(swalClasses.actions, \" .\").concat(swalClasses.confirm));\n };\n var getDenyButton = function getDenyButton() {\n return elementBySelector(\".\".concat(swalClasses.actions, \" .\").concat(swalClasses.deny));\n };\n var getInputLabel = function getInputLabel() {\n return elementByClass(swalClasses['input-label']);\n };\n var getLoader = function getLoader() {\n return elementBySelector(\".\".concat(swalClasses.loader));\n };\n var getCancelButton = function getCancelButton() {\n return elementBySelector(\".\".concat(swalClasses.actions, \" .\").concat(swalClasses.cancel));\n };\n var getActions = function getActions() {\n return elementByClass(swalClasses.actions);\n };\n var getHeader = function getHeader() {\n return elementByClass(swalClasses.header);\n };\n var getFooter = function getFooter() {\n return elementByClass(swalClasses.footer);\n };\n var getTimerProgressBar = function getTimerProgressBar() {\n return elementByClass(swalClasses['timer-progress-bar']);\n };\n var getCloseButton = function getCloseButton() {\n return elementByClass(swalClasses.close);\n }; // https://github.com/jkup/focusable/blob/master/index.js\n\n var focusable = \"\\n a[href],\\n area[href],\\n input:not([disabled]),\\n select:not([disabled]),\\n textarea:not([disabled]),\\n button:not([disabled]),\\n iframe,\\n object,\\n embed,\\n [tabindex=\\\"0\\\"],\\n [contenteditable],\\n audio[controls],\\n video[controls],\\n summary\\n\";\n var getFocusableElements = function getFocusableElements() {\n var focusableElementsWithTabindex = toArray(getPopup().querySelectorAll('[tabindex]:not([tabindex=\"-1\"]):not([tabindex=\"0\"])')) // sort according to tabindex\n .sort(function (a, b) {\n a = parseInt(a.getAttribute('tabindex'));\n b = parseInt(b.getAttribute('tabindex'));\n\n if (a > b) {\n return 1;\n } else if (a < b) {\n return -1;\n }\n\n return 0;\n });\n var otherFocusableElements = toArray(getPopup().querySelectorAll(focusable)).filter(function (el) {\n return el.getAttribute('tabindex') !== '-1';\n });\n return uniqueArray(focusableElementsWithTabindex.concat(otherFocusableElements)).filter(function (el) {\n return isVisible(el);\n });\n };\n var isModal = function isModal() {\n return !isToast() && !document.body.classList.contains(swalClasses['no-backdrop']);\n };\n var isToast = function isToast() {\n return document.body.classList.contains(swalClasses['toast-shown']);\n };\n var isLoading = function isLoading() {\n return getPopup().hasAttribute('data-loading');\n };\n\n var states = {\n previousBodyPadding: null\n };\n var setInnerHtml = function setInnerHtml(elem, html) {\n // #1926\n elem.textContent = '';\n\n if (html) {\n var parser = new DOMParser();\n var parsed = parser.parseFromString(html, \"text/html\");\n toArray(parsed.querySelector('head').childNodes).forEach(function (child) {\n elem.appendChild(child);\n });\n toArray(parsed.querySelector('body').childNodes).forEach(function (child) {\n elem.appendChild(child);\n });\n }\n };\n var hasClass = function hasClass(elem, className) {\n if (!className) {\n return false;\n }\n\n var classList = className.split(/\\s+/);\n\n for (var i = 0; i < classList.length; i++) {\n if (!elem.classList.contains(classList[i])) {\n return false;\n }\n }\n\n return true;\n };\n\n var removeCustomClasses = function removeCustomClasses(elem, params) {\n toArray(elem.classList).forEach(function (className) {\n if (!(objectValues(swalClasses).indexOf(className) !== -1) && !(objectValues(iconTypes).indexOf(className) !== -1) && !(objectValues(params.showClass).indexOf(className) !== -1)) {\n elem.classList.remove(className);\n }\n });\n };\n\n var applyCustomClass = function applyCustomClass(elem, params, className) {\n removeCustomClasses(elem, params);\n\n if (params.customClass && params.customClass[className]) {\n if (typeof params.customClass[className] !== 'string' && !params.customClass[className].forEach) {\n return warn(\"Invalid type of customClass.\".concat(className, \"! Expected string or iterable object, got \\\"\").concat(_typeof(params.customClass[className]), \"\\\"\"));\n }\n\n addClass(elem, params.customClass[className]);\n }\n };\n function getInput(content, inputType) {\n if (!inputType) {\n return null;\n }\n\n switch (inputType) {\n case 'select':\n case 'textarea':\n case 'file':\n return getChildByClass(content, swalClasses[inputType]);\n\n case 'checkbox':\n return content.querySelector(\".\".concat(swalClasses.checkbox, \" input\"));\n\n case 'radio':\n return content.querySelector(\".\".concat(swalClasses.radio, \" input:checked\")) || content.querySelector(\".\".concat(swalClasses.radio, \" input:first-child\"));\n\n case 'range':\n return content.querySelector(\".\".concat(swalClasses.range, \" input\"));\n\n default:\n return getChildByClass(content, swalClasses.input);\n }\n }\n var focusInput = function focusInput(input) {\n input.focus(); // place cursor at end of text in text input\n\n if (input.type !== 'file') {\n // http://stackoverflow.com/a/2345915\n var val = input.value;\n input.value = '';\n input.value = val;\n }\n };\n var toggleClass = function toggleClass(target, classList, condition) {\n if (!target || !classList) {\n return;\n }\n\n if (typeof classList === 'string') {\n classList = classList.split(/\\s+/).filter(Boolean);\n }\n\n classList.forEach(function (className) {\n if (target.forEach) {\n target.forEach(function (elem) {\n condition ? elem.classList.add(className) : elem.classList.remove(className);\n });\n } else {\n condition ? target.classList.add(className) : target.classList.remove(className);\n }\n });\n };\n var addClass = function addClass(target, classList) {\n toggleClass(target, classList, true);\n };\n var removeClass = function removeClass(target, classList) {\n toggleClass(target, classList, false);\n };\n var getChildByClass = function getChildByClass(elem, className) {\n for (var i = 0; i < elem.childNodes.length; i++) {\n if (hasClass(elem.childNodes[i], className)) {\n return elem.childNodes[i];\n }\n }\n };\n var applyNumericalStyle = function applyNumericalStyle(elem, property, value) {\n if (value === \"\".concat(parseInt(value))) {\n value = parseInt(value);\n }\n\n if (value || parseInt(value) === 0) {\n elem.style[property] = typeof value === 'number' ? \"\".concat(value, \"px\") : value;\n } else {\n elem.style.removeProperty(property);\n }\n };\n var show = function show(elem) {\n var display = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'flex';\n elem.style.display = display;\n };\n var hide = function hide(elem) {\n elem.style.display = 'none';\n };\n var setStyle = function setStyle(parent, selector, property, value) {\n var el = parent.querySelector(selector);\n\n if (el) {\n el.style[property] = value;\n }\n };\n var toggle = function toggle(elem, condition, display) {\n condition ? show(elem, display) : hide(elem);\n }; // borrowed from jquery $(elem).is(':visible') implementation\n\n var isVisible = function isVisible(elem) {\n return !!(elem && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length));\n };\n var allButtonsAreHidden = function allButtonsAreHidden() {\n return !isVisible(getConfirmButton()) && !isVisible(getDenyButton()) && !isVisible(getCancelButton());\n };\n var isScrollable = function isScrollable(elem) {\n return !!(elem.scrollHeight > elem.clientHeight);\n }; // borrowed from https://stackoverflow.com/a/46352119\n\n var hasCssAnimation = function hasCssAnimation(elem) {\n var style = window.getComputedStyle(elem);\n var animDuration = parseFloat(style.getPropertyValue('animation-duration') || '0');\n var transDuration = parseFloat(style.getPropertyValue('transition-duration') || '0');\n return animDuration > 0 || transDuration > 0;\n };\n var contains = function contains(haystack, needle) {\n if (typeof haystack.contains === 'function') {\n return haystack.contains(needle);\n }\n };\n var animateTimerProgressBar = function animateTimerProgressBar(timer) {\n var reset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var timerProgressBar = getTimerProgressBar();\n\n if (isVisible(timerProgressBar)) {\n if (reset) {\n timerProgressBar.style.transition = 'none';\n timerProgressBar.style.width = '100%';\n }\n\n setTimeout(function () {\n timerProgressBar.style.transition = \"width \".concat(timer / 1000, \"s linear\");\n timerProgressBar.style.width = '0%';\n }, 10);\n }\n };\n var stopTimerProgressBar = function stopTimerProgressBar() {\n var timerProgressBar = getTimerProgressBar();\n var timerProgressBarWidth = parseInt(window.getComputedStyle(timerProgressBar).width);\n timerProgressBar.style.removeProperty('transition');\n timerProgressBar.style.width = '100%';\n var timerProgressBarFullWidth = parseInt(window.getComputedStyle(timerProgressBar).width);\n var timerProgressBarPercent = parseInt(timerProgressBarWidth / timerProgressBarFullWidth * 100);\n timerProgressBar.style.removeProperty('transition');\n timerProgressBar.style.width = \"\".concat(timerProgressBarPercent, \"%\");\n };\n\n // Detect Node env\n var isNodeEnv = function isNodeEnv() {\n return typeof window === 'undefined' || typeof document === 'undefined';\n };\n\n var sweetHTML = \"\\n <div aria-labelledby=\\\"\".concat(swalClasses.title, \"\\\" aria-describedby=\\\"\").concat(swalClasses.content, \"\\\" class=\\\"\").concat(swalClasses.popup, \"\\\" tabindex=\\\"-1\\\">\\n <div class=\\\"\").concat(swalClasses.header, \"\\\">\\n <ul class=\\\"\").concat(swalClasses['progress-steps'], \"\\\"></ul>\\n <div class=\\\"\").concat(swalClasses.icon, \"\\\"></div>\\n <img class=\\\"\").concat(swalClasses.image, \"\\\" />\\n <h2 class=\\\"\").concat(swalClasses.title, \"\\\" id=\\\"\").concat(swalClasses.title, \"\\\"></h2>\\n <button type=\\\"button\\\" class=\\\"\").concat(swalClasses.close, \"\\\"></button>\\n </div>\\n <div class=\\\"\").concat(swalClasses.content, \"\\\">\\n <div id=\\\"\").concat(swalClasses.content, \"\\\" class=\\\"\").concat(swalClasses['html-container'], \"\\\"></div>\\n <input class=\\\"\").concat(swalClasses.input, \"\\\" />\\n <input type=\\\"file\\\" class=\\\"\").concat(swalClasses.file, \"\\\" />\\n <div class=\\\"\").concat(swalClasses.range, \"\\\">\\n <input type=\\\"range\\\" />\\n <output></output>\\n </div>\\n <select class=\\\"\").concat(swalClasses.select, \"\\\"></select>\\n <div class=\\\"\").concat(swalClasses.radio, \"\\\"></div>\\n <label for=\\\"\").concat(swalClasses.checkbox, \"\\\" class=\\\"\").concat(swalClasses.checkbox, \"\\\">\\n <input type=\\\"checkbox\\\" />\\n <span class=\\\"\").concat(swalClasses.label, \"\\\"></span>\\n </label>\\n <textarea class=\\\"\").concat(swalClasses.textarea, \"\\\"></textarea>\\n <div class=\\\"\").concat(swalClasses['validation-message'], \"\\\" id=\\\"\").concat(swalClasses['validation-message'], \"\\\"></div>\\n </div>\\n <div class=\\\"\").concat(swalClasses.actions, \"\\\">\\n <div class=\\\"\").concat(swalClasses.loader, \"\\\"></div>\\n <button type=\\\"button\\\" class=\\\"\").concat(swalClasses.confirm, \"\\\"></button>\\n <button type=\\\"button\\\" class=\\\"\").concat(swalClasses.deny, \"\\\"></button>\\n <button type=\\\"button\\\" class=\\\"\").concat(swalClasses.cancel, \"\\\"></button>\\n </div>\\n <div class=\\\"\").concat(swalClasses.footer, \"\\\"></div>\\n <div class=\\\"\").concat(swalClasses['timer-progress-bar-container'], \"\\\">\\n <div class=\\\"\").concat(swalClasses['timer-progress-bar'], \"\\\"></div>\\n </div>\\n </div>\\n\").replace(/(^|\\n)\\s*/g, '');\n\n var resetOldContainer = function resetOldContainer() {\n var oldContainer = getContainer();\n\n if (!oldContainer) {\n return false;\n }\n\n oldContainer.parentNode.removeChild(oldContainer);\n removeClass([document.documentElement, document.body], [swalClasses['no-backdrop'], swalClasses['toast-shown'], swalClasses['has-column']]);\n return true;\n };\n\n var oldInputVal; // IE11 workaround, see #1109 for details\n\n var resetValidationMessage = function resetValidationMessage(e) {\n if (Swal.isVisible() && oldInputVal !== e.target.value) {\n Swal.resetValidationMessage();\n }\n\n oldInputVal = e.target.value;\n };\n\n var addInputChangeListeners = function addInputChangeListeners() {\n var content = getContent();\n var input = getChildByClass(content, swalClasses.input);\n var file = getChildByClass(content, swalClasses.file);\n var range = content.querySelector(\".\".concat(swalClasses.range, \" input\"));\n var rangeOutput = content.querySelector(\".\".concat(swalClasses.range, \" output\"));\n var select = getChildByClass(content, swalClasses.select);\n var checkbox = content.querySelector(\".\".concat(swalClasses.checkbox, \" input\"));\n var textarea = getChildByClass(content, swalClasses.textarea);\n input.oninput = resetValidationMessage;\n file.onchange = resetValidationMessage;\n select.onchange = resetValidationMessage;\n checkbox.onchange = resetValidationMessage;\n textarea.oninput = resetValidationMessage;\n\n range.oninput = function (e) {\n resetValidationMessage(e);\n rangeOutput.value = range.value;\n };\n\n range.onchange = function (e) {\n resetValidationMessage(e);\n range.nextSibling.value = range.value;\n };\n };\n\n var getTarget = function getTarget(target) {\n return typeof target === 'string' ? document.querySelector(target) : target;\n };\n\n var setupAccessibility = function setupAccessibility(params) {\n var popup = getPopup();\n popup.setAttribute('role', params.toast ? 'alert' : 'dialog');\n popup.setAttribute('aria-live', params.toast ? 'polite' : 'assertive');\n\n if (!params.toast) {\n popup.setAttribute('aria-modal', 'true');\n }\n };\n\n var setupRTL = function setupRTL(targetElement) {\n if (window.getComputedStyle(targetElement).direction === 'rtl') {\n addClass(getContainer(), swalClasses.rtl);\n }\n };\n /*\n * Add modal + backdrop to DOM\n */\n\n\n var init = function init(params) {\n // Clean up the old popup container if it exists\n var oldContainerExisted = resetOldContainer();\n /* istanbul ignore if */\n\n if (isNodeEnv()) {\n error('SweetAlert2 requires document to initialize');\n return;\n }\n\n var container = document.createElement('div');\n container.className = swalClasses.container;\n\n if (oldContainerExisted) {\n addClass(container, swalClasses['no-transition']);\n }\n\n setInnerHtml(container, sweetHTML);\n var targetElement = getTarget(params.target);\n targetElement.appendChild(container);\n setupAccessibility(params);\n setupRTL(targetElement);\n addInputChangeListeners();\n };\n\n var parseHtmlToContainer = function parseHtmlToContainer(param, target) {\n // DOM element\n if (param instanceof HTMLElement) {\n target.appendChild(param); // Object\n } else if (_typeof(param) === 'object') {\n handleObject(param, target); // Plain string\n } else if (param) {\n setInnerHtml(target, param);\n }\n };\n\n var handleObject = function handleObject(param, target) {\n // JQuery element(s)\n if (param.jquery) {\n handleJqueryElem(target, param); // For other objects use their string representation\n } else {\n setInnerHtml(target, param.toString());\n }\n };\n\n var handleJqueryElem = function handleJqueryElem(target, elem) {\n target.textContent = '';\n\n if (0 in elem) {\n for (var i = 0; (i in elem); i++) {\n target.appendChild(elem[i].cloneNode(true));\n }\n } else {\n target.appendChild(elem.cloneNode(true));\n }\n };\n\n var animationEndEvent = function () {\n // Prevent run in Node env\n\n /* istanbul ignore if */\n if (isNodeEnv()) {\n return false;\n }\n\n var testEl = document.createElement('div');\n var transEndEventNames = {\n WebkitAnimation: 'webkitAnimationEnd',\n OAnimation: 'oAnimationEnd oanimationend',\n animation: 'animationend'\n };\n\n for (var i in transEndEventNames) {\n if (Object.prototype.hasOwnProperty.call(transEndEventNames, i) && typeof testEl.style[i] !== 'undefined') {\n return transEndEventNames[i];\n }\n }\n\n return false;\n }();\n\n // https://github.com/twbs/bootstrap/blob/master/js/src/modal.js\n\n var measureScrollbar = function measureScrollbar() {\n var scrollDiv = document.createElement('div');\n scrollDiv.className = swalClasses['scrollbar-measure'];\n document.body.appendChild(scrollDiv);\n var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n document.body.removeChild(scrollDiv);\n return scrollbarWidth;\n };\n\n var renderActions = function renderActions(instance, params) {\n var actions = getActions();\n var loader = getLoader();\n var confirmButton = getConfirmButton();\n var denyButton = getDenyButton();\n var cancelButton = getCancelButton(); // Actions (buttons) wrapper\n\n if (!params.showConfirmButton && !params.showDenyButton && !params.showCancelButton) {\n hide(actions);\n } // Custom class\n\n\n applyCustomClass(actions, params, 'actions'); // Render buttons\n\n renderButton(confirmButton, 'confirm', params);\n renderButton(denyButton, 'deny', params);\n renderButton(cancelButton, 'cancel', params);\n handleButtonsStyling(confirmButton, denyButton, cancelButton, params);\n\n if (params.reverseButtons) {\n actions.insertBefore(cancelButton, loader);\n actions.insertBefore(denyButton, loader);\n actions.insertBefore(confirmButton, loader);\n } // Loader\n\n\n setInnerHtml(loader, params.loaderHtml);\n applyCustomClass(loader, params, 'loader');\n };\n\n function handleButtonsStyling(confirmButton, denyButton, cancelButton, params) {\n if (!params.buttonsStyling) {\n return removeClass([confirmButton, denyButton, cancelButton], swalClasses.styled);\n }\n\n addClass([confirmButton, denyButton, cancelButton], swalClasses.styled); // Buttons background colors\n\n if (params.confirmButtonColor) {\n confirmButton.style.backgroundColor = params.confirmButtonColor;\n }\n\n if (params.denyButtonColor) {\n denyButton.style.backgroundColor = params.denyButtonColor;\n }\n\n if (params.cancelButtonColor) {\n cancelButton.style.backgroundColor = params.cancelButtonColor;\n }\n }\n\n function renderButton(button, buttonType, params) {\n toggle(button, params[\"show\".concat(capitalizeFirstLetter(buttonType), \"Button\")], 'inline-block');\n setInnerHtml(button, params[\"\".concat(buttonType, \"ButtonText\")]); // Set caption text\n\n button.setAttribute('aria-label', params[\"\".concat(buttonType, \"ButtonAriaLabel\")]); // ARIA label\n // Add buttons custom classes\n\n button.className = swalClasses[buttonType];\n applyCustomClass(button, params, \"\".concat(buttonType, \"Button\"));\n addClass(button, params[\"\".concat(buttonType, \"ButtonClass\")]);\n }\n\n function handleBackdropParam(container, backdrop) {\n if (typeof backdrop === 'string') {\n container.style.background = backdrop;\n } else if (!backdrop) {\n addClass([document.documentElement, document.body], swalClasses['no-backdrop']);\n }\n }\n\n function handlePositionParam(container, position) {\n if (position in swalClasses) {\n addClass(container, swalClasses[position]);\n } else {\n warn('The \"position\" parameter is not valid, defaulting to \"center\"');\n addClass(container, swalClasses.center);\n }\n }\n\n function handleGrowParam(container, grow) {\n if (grow && typeof grow === 'string') {\n var growClass = \"grow-\".concat(grow);\n\n if (growClass in swalClasses) {\n addClass(container, swalClasses[growClass]);\n }\n }\n }\n\n var renderContainer = function renderContainer(instance, params) {\n var container = getContainer();\n\n if (!container) {\n return;\n }\n\n handleBackdropParam(container, params.backdrop);\n\n if (!params.backdrop && params.allowOutsideClick) {\n warn('\"allowOutsideClick\" parameter requires `backdrop` parameter to be set to `true`');\n }\n\n handlePositionParam(container, params.position);\n handleGrowParam(container, params.grow); // Custom class\n\n applyCustomClass(container, params, 'container'); // Set queue step attribute for getQueueStep() method\n\n var queueStep = document.body.getAttribute('data-swal2-queue-step');\n\n if (queueStep) {\n container.setAttribute('data-queue-step', queueStep);\n document.body.removeAttribute('data-swal2-queue-step');\n }\n };\n\n /**\n * This module containts `WeakMap`s for each effectively-\"private property\" that a `Swal` has.\n * For example, to set the private property \"foo\" of `this` to \"bar\", you can `privateProps.foo.set(this, 'bar')`\n * This is the approach that Babel will probably take to implement private methods/fields\n * https://github.com/tc39/proposal-private-methods\n * https://github.com/babel/babel/pull/7555\n * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module*\n * then we can use that language feature.\n */\n var privateProps = {\n promise: new WeakMap(),\n innerParams: new WeakMap(),\n domCache: new WeakMap()\n };\n\n var inputTypes = ['input', 'file', 'range', 'select', 'radio', 'checkbox', 'textarea'];\n var renderInput = function renderInput(instance, params) {\n var content = getContent();\n var innerParams = privateProps.innerParams.get(instance);\n var rerender = !innerParams || params.input !== innerParams.input;\n inputTypes.forEach(function (inputType) {\n var inputClass = swalClasses[inputType];\n var inputContainer = getChildByClass(content, inputClass); // set attributes\n\n setAttributes(inputType, params.inputAttributes); // set class\n\n inputContainer.className = inputClass;\n\n if (rerender) {\n hide(inputContainer);\n }\n });\n\n if (params.input) {\n if (rerender) {\n showInput(params);\n } // set custom class\n\n\n setCustomClass(params);\n }\n };\n\n var showInput = function showInput(params) {\n if (!renderInputType[params.input]) {\n return error(\"Unexpected type of input! Expected \\\"text\\\", \\\"email\\\", \\\"password\\\", \\\"number\\\", \\\"tel\\\", \\\"select\\\", \\\"radio\\\", \\\"checkbox\\\", \\\"textarea\\\", \\\"file\\\" or \\\"url\\\", got \\\"\".concat(params.input, \"\\\"\"));\n }\n\n var inputContainer = getInputContainer(params.input);\n var input = renderInputType[params.input](inputContainer, params);\n show(input); // input autofocus\n\n setTimeout(function () {\n focusInput(input);\n });\n };\n\n var removeAttributes = function removeAttributes(input) {\n for (var i = 0; i < input.attributes.length; i++) {\n var attrName = input.attributes[i].name;\n\n if (!(['type', 'value', 'style'].indexOf(attrName) !== -1)) {\n input.removeAttribute(attrName);\n }\n }\n };\n\n var setAttributes = function setAttributes(inputType, inputAttributes) {\n var input = getInput(getContent(), inputType);\n\n if (!input) {\n return;\n }\n\n removeAttributes(input);\n\n for (var attr in inputAttributes) {\n // Do not set a placeholder for <input type=\"range\">\n // it'll crash Edge, #1298\n if (inputType === 'range' && attr === 'placeholder') {\n continue;\n }\n\n input.setAttribute(attr, inputAttributes[attr]);\n }\n };\n\n var setCustomClass = function setCustomClass(params) {\n var inputContainer = getInputContainer(params.input);\n\n if (params.customClass) {\n addClass(inputContainer, params.customClass.input);\n }\n };\n\n var setInputPlaceholder = function setInputPlaceholder(input, params) {\n if (!input.placeholder || params.inputPlaceholder) {\n input.placeholder = params.inputPlaceholder;\n }\n };\n\n var setInputLabel = function setInputLabel(input, prependTo, params) {\n if (params.inputLabel) {\n input.id = swalClasses.input;\n var label = document.createElement('label');\n var labelClass = swalClasses['input-label'];\n label.setAttribute('for', input.id);\n label.className = labelClass;\n addClass(label, params.customClass.inputLabel);\n label.innerText = params.inputLabel;\n prependTo.insertAdjacentElement('beforebegin', label);\n }\n };\n\n var getInputContainer = function getInputContainer(inputType) {\n var inputClass = swalClasses[inputType] ? swalClasses[inputType] : swalClasses.input;\n return getChildByClass(getContent(), inputClass);\n };\n\n var renderInputType = {};\n\n renderInputType.text = renderInputType.email = renderInputType.password = renderInputType.number = renderInputType.tel = renderInputType.url = function (input, params) {\n if (typeof params.inputValue === 'string' || typeof params.inputValue === 'number') {\n input.value = params.inputValue;\n } else if (!isPromise(params.inputValue)) {\n warn(\"Unexpected type of inputValue! Expected \\\"string\\\", \\\"number\\\" or \\\"Promise\\\", got \\\"\".concat(_typeof(params.inputValue), \"\\\"\"));\n }\n\n setInputLabel(input, input, params);\n setInputPlaceholder(input, params);\n input.type = params.input;\n return input;\n };\n\n renderInputType.file = function (input, params) {\n setInputLabel(input, input, params);\n setInputPlaceholder(input, params);\n return input;\n };\n\n renderInputType.range = function (range, params) {\n var rangeInput = range.querySelector('input');\n var rangeOutput = range.querySelector('output');\n rangeInput.value = params.inputValue;\n rangeInput.type = params.input;\n rangeOutput.value = params.inputValue;\n setInputLabel(rangeInput, range, params);\n return range;\n };\n\n renderInputType.select = function (select, params) {\n select.textContent = '';\n\n if (params.inputPlaceholder) {\n var placeholder = document.createElement('option');\n setInnerHtml(placeholder, params.inputPlaceholder);\n placeholder.value = '';\n placeholder.disabled = true;\n placeholder.selected = true;\n select.appendChild(placeholder);\n }\n\n setInputLabel(select, select, params);\n return select;\n };\n\n renderInputType.radio = function (radio) {\n radio.textContent = '';\n return radio;\n };\n\n renderInputType.checkbox = function (checkboxContainer, params) {\n var checkbox = getInput(getContent(), 'checkbox');\n checkbox.value = 1;\n checkbox.id = swalClasses.checkbox;\n checkbox.checked = Boolean(params.inputValue);\n var label = checkboxContainer.querySelector('span');\n setInnerHtml(label, params.inputPlaceholder);\n return checkboxContainer;\n };\n\n renderInputType.textarea = function (textarea, params) {\n textarea.value = params.inputValue;\n setInputPlaceholder(textarea, params);\n setInputLabel(textarea, textarea, params);\n\n var getPadding = function getPadding(el) {\n return parseInt(window.getComputedStyle(el).paddingLeft) + parseInt(window.getComputedStyle(el).paddingRight);\n };\n\n if ('MutationObserver' in window) {\n // #1699\n var initialPopupWidth = parseInt(window.getComputedStyle(getPopup()).width);\n\n var outputsize = function outputsize() {\n var contentWidth = textarea.offsetWidth + getPadding(getPopup()) + getPadding(getContent());\n\n if (contentWidth > initialPopupWidth) {\n getPopup().style.width = \"\".concat(contentWidth, \"px\");\n } else {\n getPopup().style.width = null;\n }\n };\n\n new MutationObserver(outputsize).observe(textarea, {\n attributes: true,\n attributeFilter: ['style']\n });\n }\n\n return textarea;\n };\n\n var renderContent = function renderContent(instance, params) {\n var htmlContainer = getHtmlContainer();\n applyCustomClass(htmlContainer, params, 'htmlContainer'); // Content as HTML\n\n if (params.html) {\n parseHtmlToContainer(params.html, htmlContainer);\n show(htmlContainer, 'block'); // Content as plain text\n } else if (params.text) {\n htmlContainer.textContent = params.text;\n show(htmlContainer, 'block'); // No content\n } else {\n hide(htmlContainer);\n }\n\n renderInput(instance, params); // Custom class\n\n applyCustomClass(getContent(), params, 'content');\n };\n\n var renderFooter = function renderFooter(instance, params) {\n var footer = getFooter();\n toggle(footer, params.footer);\n\n if (params.footer) {\n parseHtmlToContainer(params.footer, footer);\n } // Custom class\n\n\n applyCustomClass(footer, params, 'footer');\n };\n\n var renderCloseButton = function renderCloseButton(instance, params) {\n var closeButton = getCloseButton();\n setInnerHtml(closeButton, params.closeButtonHtml); // Custom class\n\n applyCustomClass(closeButton, params, 'closeButton');\n toggle(closeButton, params.showCloseButton);\n closeButton.setAttribute('aria-label', params.closeButtonAriaLabel);\n };\n\n var renderIcon = function renderIcon(instance, params) {\n var innerParams = privateProps.innerParams.get(instance);\n var icon = getIcon(); // if the given icon already rendered, apply the styling without re-rendering the icon\n\n if (innerParams && params.icon === innerParams.icon) {\n // Custom or default content\n setContent(icon, params);\n applyStyles(icon, params);\n return;\n }\n\n if (!params.icon && !params.iconHtml) {\n return hide(icon);\n }\n\n if (params.icon && Object.keys(iconTypes).indexOf(params.icon) === -1) {\n error(\"Unknown icon! Expected \\\"success\\\", \\\"error\\\", \\\"warning\\\", \\\"info\\\" or \\\"question\\\", got \\\"\".concat(params.icon, \"\\\"\"));\n return hide(icon);\n }\n\n show(icon); // Custom or default content\n\n setContent(icon, params);\n applyStyles(icon, params); // Animate icon\n\n addClass(icon, params.showClass.icon);\n };\n\n var applyStyles = function applyStyles(icon, params) {\n for (var iconType in iconTypes) {\n if (params.icon !== iconType) {\n removeClass(icon, iconTypes[iconType]);\n }\n }\n\n addClass(icon, iconTypes[params.icon]); // Icon color\n\n setColor(icon, params); // Success icon background color\n\n adjustSuccessIconBackgoundColor(); // Custom class\n\n applyCustomClass(icon, params, 'icon');\n }; // Adjust success icon background color to match the popup background color\n\n\n var adjustSuccessIconBackgoundColor = function adjustSuccessIconBackgoundColor() {\n var popup = getPopup();\n var popupBackgroundColor = window.getComputedStyle(popup).getPropertyValue('background-color');\n var successIconParts = popup.querySelectorAll('[class^=swal2-success-circular-line], .swal2-success-fix');\n\n for (var i = 0; i < successIconParts.length; i++) {\n successIconParts[i].style.backgroundColor = popupBackgroundColor;\n }\n };\n\n var setContent = function setContent(icon, params) {\n icon.textContent = '';\n\n if (params.iconHtml) {\n setInnerHtml(icon, iconContent(params.iconHtml));\n } else if (params.icon === 'success') {\n setInnerHtml(icon, \"\\n <div class=\\\"swal2-success-circular-line-left\\\"></div>\\n <span class=\\\"swal2-success-line-tip\\\"></span> <span class=\\\"swal2-success-line-long\\\"></span>\\n <div class=\\\"swal2-success-ring\\\"></div> <div class=\\\"swal2-success-fix\\\"></div>\\n <div class=\\\"swal2-success-circular-line-right\\\"></div>\\n \");\n } else if (params.icon === 'error') {\n setInnerHtml(icon, \"\\n <span class=\\\"swal2-x-mark\\\">\\n <span class=\\\"swal2-x-mark-line-left\\\"></span>\\n <span class=\\\"swal2-x-mark-line-right\\\"></span>\\n </span>\\n \");\n } else {\n var defaultIconHtml = {\n question: '?',\n warning: '!',\n info: 'i'\n };\n setInnerHtml(icon, iconContent(defaultIconHtml[params.icon]));\n }\n };\n\n var setColor = function setColor(icon, params) {\n if (!params.iconColor) {\n return;\n }\n\n icon.style.color = params.iconColor;\n icon.style.borderColor = params.iconColor;\n\n for (var _i = 0, _arr = ['.swal2-success-line-tip', '.swal2-success-line-long', '.swal2-x-mark-line-left', '.swal2-x-mark-line-right']; _i < _arr.length; _i++) {\n var sel = _arr[_i];\n setStyle(icon, sel, 'backgroundColor', params.iconColor);\n }\n\n setStyle(icon, '.swal2-success-ring', 'borderColor', params.iconColor);\n };\n\n var iconContent = function iconContent(content) {\n return \"<div class=\\\"\".concat(swalClasses['icon-content'], \"\\\">\").concat(content, \"</div>\");\n };\n\n var renderImage = function renderImage(instance, params) {\n var image = getImage();\n\n if (!params.imageUrl) {\n return hide(image);\n }\n\n show(image, ''); // Src, alt\n\n image.setAttribute('src', params.imageUrl);\n image.setAttribute('alt', params.imageAlt); // Width, height\n\n applyNumericalStyle(image, 'width', params.imageWidth);\n applyNumericalStyle(image, 'height', params.imageHeight); // Class\n\n image.className = swalClasses.image;\n applyCustomClass(image, params, 'image');\n };\n\n var currentSteps = [];\n /*\n * Global function for chaining sweetAlert popups\n */\n\n var queue = function queue(steps) {\n warnAboutDeprecation('Swal.queue()', \"async/await\");\n var Swal = this;\n currentSteps = steps;\n\n var resetAndResolve = function resetAndResolve(resolve, value) {\n currentSteps = [];\n resolve(value);\n };\n\n var queueResult = [];\n return new Promise(function (resolve) {\n (function step(i, callback) {\n if (i < currentSteps.length) {\n document.body.setAttribute('data-swal2-queue-step', i);\n Swal.fire(currentSteps[i]).then(function (result) {\n if (typeof result.value !== 'undefined') {\n queueResult.push(result.value);\n step(i + 1, callback);\n } else {\n resetAndResolve(resolve, {\n dismiss: result.dismiss\n });\n }\n });\n } else {\n resetAndResolve(resolve, {\n value: queueResult\n });\n }\n })(0);\n });\n };\n /*\n * Global function for getting the index of current popup in queue\n */\n\n var getQueueStep = function getQueueStep() {\n return getContainer() && getContainer().getAttribute('data-queue-step');\n };\n /*\n * Global function for inserting a popup to the queue\n */\n\n var insertQueueStep = function insertQueueStep(step, index) {\n if (index && index < currentSteps.length) {\n return currentSteps.splice(index, 0, step);\n }\n\n return currentSteps.push(step);\n };\n /*\n * Global function for deleting a popup from the queue\n */\n\n var deleteQueueStep = function deleteQueueStep(index) {\n if (typeof currentSteps[index] !== 'undefined') {\n currentSteps.splice(index, 1);\n }\n };\n\n var createStepElement = function createStepElement(step) {\n var stepEl = document.createElement('li');\n addClass(stepEl, swalClasses['progress-step']);\n setInnerHtml(stepEl, step);\n return stepEl;\n };\n\n var createLineElement = function createLineElement(params) {\n var lineEl = document.createElement('li');\n addClass(lineEl, swalClasses['progress-step-line']);\n\n if (params.progressStepsDistance) {\n lineEl.style.width = params.progressStepsDistance;\n }\n\n return lineEl;\n };\n\n var renderProgressSteps = function renderProgressSteps(instance, params) {\n var progressStepsContainer = getProgressSteps();\n\n if (!params.progressSteps || params.progressSteps.length === 0) {\n return hide(progressStepsContainer);\n }\n\n show(progressStepsContainer);\n progressStepsContainer.textContent = '';\n var currentProgressStep = parseInt(params.currentProgressStep === undefined ? getQueueStep() : params.currentProgressStep);\n\n if (currentProgressStep >= params.progressSteps.length) {\n warn('Invalid currentProgressStep parameter, it should be less than progressSteps.length ' + '(currentProgressStep like JS arrays starts from 0)');\n }\n\n params.progressSteps.forEach(function (step, index) {\n var stepEl = createStepElement(step);\n progressStepsContainer.appendChild(stepEl);\n\n if (index === currentProgressStep) {\n addClass(stepEl, swalClasses['active-progress-step']);\n }\n\n if (index !== params.progressSteps.length - 1) {\n var lineEl = createLineElement(params);\n progressStepsContainer.appendChild(lineEl);\n }\n });\n };\n\n var renderTitle = function renderTitle(instance, params) {\n var title = getTitle();\n toggle(title, params.title || params.titleText, 'block');\n\n if (params.title) {\n parseHtmlToContainer(params.title, title);\n }\n\n if (params.titleText) {\n title.innerText = params.titleText;\n } // Custom class\n\n\n applyCustomClass(title, params, 'title');\n };\n\n var renderHeader = function renderHeader(instance, params) {\n var header = getHeader(); // Custom class\n\n applyCustomClass(header, params, 'header'); // Progress steps\n\n renderProgressSteps(instance, params); // Icon\n\n renderIcon(instance, params); // Image\n\n renderImage(instance, params); // Title\n\n renderTitle(instance, params); // Close button\n\n renderCloseButton(instance, params);\n };\n\n var renderPopup = function renderPopup(instance, params) {\n var container = getContainer();\n var popup = getPopup(); // Width\n\n if (params.toast) {\n // #2170\n applyNumericalStyle(container, 'width', params.width);\n popup.style.width = '100%';\n } else {\n applyNumericalStyle(popup, 'width', params.width);\n } // Padding\n\n\n applyNumericalStyle(popup, 'padding', params.padding); // Background\n\n if (params.background) {\n popup.style.background = params.background;\n }\n\n hide(getValidationMessage()); // Classes\n\n addClasses(popup, params);\n };\n\n var addClasses = function addClasses(popup, params) {\n // Default Class + showClass when updating Swal.update({})\n popup.className = \"\".concat(swalClasses.popup, \" \").concat(isVisible(popup) ? params.showClass.popup : '');\n\n if (params.toast) {\n addClass([document.documentElement, document.body], swalClasses['toast-shown']);\n addClass(popup, swalClasses.toast);\n } else {\n addClass(popup, swalClasses.modal);\n } // Custom class\n\n\n applyCustomClass(popup, params, 'popup');\n\n if (typeof params.customClass === 'string') {\n addClass(popup, params.customClass);\n } // Icon class (#1842)\n\n\n if (params.icon) {\n addClass(popup, swalClasses[\"icon-\".concat(params.icon)]);\n }\n };\n\n var render = function render(instance, params) {\n renderPopup(instance, params);\n renderContainer(instance, params);\n renderHeader(instance, params);\n renderContent(instance, params);\n renderActions(instance, params);\n renderFooter(instance, params);\n\n if (typeof params.didRender === 'function') {\n params.didRender(getPopup());\n } else if (typeof params.onRender === 'function') {\n params.onRender(getPopup()); // @deprecated\n }\n };\n\n /*\n * Global function to determine if SweetAlert2 popup is shown\n */\n\n var isVisible$1 = function isVisible$$1() {\n return isVisible(getPopup());\n };\n /*\n * Global function to click 'Confirm' button\n */\n\n var clickConfirm = function clickConfirm() {\n return getConfirmButton() && getConfirmButton().click();\n };\n /*\n * Global function to click 'Deny' button\n */\n\n var clickDeny = function clickDeny() {\n return getDenyButton() && getDenyButton().click();\n };\n /*\n * Global function to click 'Cancel' button\n */\n\n var clickCancel = function clickCancel() {\n return getCancelButton() && getCancelButton().click();\n };\n\n function fire() {\n var Swal = this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _construct(Swal, args);\n }\n\n /**\n * Returns an extended version of `Swal` containing `params` as defaults.\n * Useful for reusing Swal configuration.\n *\n * For example:\n *\n * Before:\n * const textPromptOptions = { input: 'text', showCancelButton: true }\n * const {value: firstName} = await Swal.fire({ ...textPromptOptions, title: 'What is your first name?' })\n * const {value: lastName} = await Swal.fire({ ...textPromptOptions, title: 'What is your last name?' })\n *\n * After:\n * const TextPrompt = Swal.mixin({ input: 'text', showCancelButton: true })\n * const {value: firstName} = await TextPrompt('What is your first name?')\n * const {value: lastName} = await TextPrompt('What is your last name?')\n *\n * @param mixinParams\n */\n function mixin(mixinParams) {\n var MixinSwal = /*#__PURE__*/function (_this) {\n _inherits(MixinSwal, _this);\n\n var _super = _createSuper(MixinSwal);\n\n function MixinSwal() {\n _classCallCheck(this, MixinSwal);\n\n return _super.apply(this, arguments);\n }\n\n _createClass(MixinSwal, [{\n key: \"_main\",\n value: function _main(params, priorityMixinParams) {\n return _get(_getPrototypeOf(MixinSwal.prototype), \"_main\", this).call(this, params, _extends({}, mixinParams, priorityMixinParams));\n }\n }]);\n\n return MixinSwal;\n }(this);\n\n return MixinSwal;\n }\n\n /**\n * Shows loader (spinner), this is useful with AJAX requests.\n * By default the loader be shown instead of the \"Confirm\" button.\n */\n\n var showLoading = function showLoading(buttonToReplace) {\n var popup = getPopup();\n\n if (!popup) {\n Swal.fire();\n }\n\n popup = getPopup();\n var actions = getActions();\n var loader = getLoader();\n\n if (!buttonToReplace && isVisible(getConfirmButton())) {\n buttonToReplace = getConfirmButton();\n }\n\n show(actions);\n\n if (buttonToReplace) {\n hide(buttonToReplace);\n loader.setAttribute('data-button-to-replace', buttonToReplace.className);\n }\n\n loader.parentNode.insertBefore(loader, buttonToReplace);\n addClass([popup, actions], swalClasses.loading);\n show(loader);\n popup.setAttribute('data-loading', true);\n popup.setAttribute('aria-busy', true);\n popup.focus();\n };\n\n var RESTORE_FOCUS_TIMEOUT = 100;\n\n var globalState = {};\n\n var focusPreviousActiveElement = function focusPreviousActiveElement() {\n if (globalState.previousActiveElement && globalState.previousActiveElement.focus) {\n globalState.previousActiveElement.focus();\n globalState.previousActiveElement = null;\n } else if (document.body) {\n document.body.focus();\n }\n }; // Restore previous active (focused) element\n\n\n var restoreActiveElement = function restoreActiveElement(returnFocus) {\n return new Promise(function (resolve) {\n if (!returnFocus) {\n return resolve();\n }\n\n var x = window.scrollX;\n var y = window.scrollY;\n globalState.restoreFocusTimeout = setTimeout(function () {\n focusPreviousActiveElement();\n resolve();\n }, RESTORE_FOCUS_TIMEOUT); // issues/900\n\n if (typeof x !== 'undefined' && typeof y !== 'undefined') {\n // IE doesn't have scrollX/scrollY support\n window.scrollTo(x, y);\n }\n });\n };\n\n /**\n * If `timer` parameter is set, returns number of milliseconds of timer remained.\n * Otherwise, returns undefined.\n */\n\n var getTimerLeft = function getTimerLeft() {\n return globalState.timeout && globalState.timeout.getTimerLeft();\n };\n /**\n * Stop timer. Returns number of milliseconds of timer remained.\n * If `timer` parameter isn't set, returns undefined.\n */\n\n var stopTimer = function stopTimer() {\n if (globalState.timeout) {\n stopTimerProgressBar();\n return globalState.timeout.stop();\n }\n };\n /**\n * Resume timer. Returns number of milliseconds of timer remained.\n * If `timer` parameter isn't set, returns undefined.\n */\n\n var resumeTimer = function resumeTimer() {\n if (globalState.timeout) {\n var remaining = globalState.timeout.start();\n animateTimerProgressBar(remaining);\n return remaining;\n }\n };\n /**\n * Resume timer. Returns number of milliseconds of timer remained.\n * If `timer` parameter isn't set, returns undefined.\n */\n\n var toggleTimer = function toggleTimer() {\n var timer = globalState.timeout;\n return timer && (timer.running ? stopTimer() : resumeTimer());\n };\n /**\n * Increase timer. Returns number of milliseconds of an updated timer.\n * If `timer` parameter isn't set, returns undefined.\n */\n\n var increaseTimer = function increaseTimer(n) {\n if (globalState.timeout) {\n var remaining = globalState.timeout.increase(n);\n animateTimerProgressBar(remaining, true);\n return remaining;\n }\n };\n /**\n * Check if timer is running. Returns true if timer is running\n * or false if timer is paused or stopped.\n * If `timer` parameter isn't set, returns undefined\n */\n\n var isTimerRunning = function isTimerRunning() {\n return globalState.timeout && globalState.timeout.isRunning();\n };\n\n var bodyClickListenerAdded = false;\n var clickHandlers = {};\n function bindClickHandler() {\n var attr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'data-swal-template';\n clickHandlers[attr] = this;\n\n if (!bodyClickListenerAdded) {\n document.body.addEventListener('click', bodyClickListener);\n bodyClickListenerAdded = true;\n }\n }\n\n var bodyClickListener = function bodyClickListener(event) {\n // 1. using .parentNode instead of event.path because of better support by old browsers https://stackoverflow.com/a/39245638\n // 2. using .parentNode instead of .parentElement because of IE11 + SVG https://stackoverflow.com/a/36270354\n for (var el = event.target; el && el !== document; el = el.parentNode) {\n for (var attr in clickHandlers) {\n var template = el.getAttribute(attr);\n\n if (template) {\n clickHandlers[attr].fire({\n template: template\n });\n return;\n }\n }\n }\n };\n\n var defaultParams = {\n title: '',\n titleText: '',\n text: '',\n html: '',\n footer: '',\n icon: undefined,\n iconColor: undefined,\n iconHtml: undefined,\n template: undefined,\n toast: false,\n animation: true,\n showClass: {\n popup: 'swal2-show',\n backdrop: 'swal2-backdrop-show',\n icon: 'swal2-icon-show'\n },\n hideClass: {\n popup: 'swal2-hide',\n backdrop: 'swal2-backdrop-hide',\n icon: 'swal2-icon-hide'\n },\n customClass: {},\n target: 'body',\n backdrop: true,\n heightAuto: true,\n allowOutsideClick: true,\n allowEscapeKey: true,\n allowEnterKey: true,\n stopKeydownPropagation: true,\n keydownListenerCapture: false,\n showConfirmButton: true,\n showDenyButton: false,\n showCancelButton: false,\n preConfirm: undefined,\n preDeny: undefined,\n confirmButtonText: 'OK',\n confirmButtonAriaLabel: '',\n confirmButtonColor: undefined,\n denyButtonText: 'No',\n denyButtonAriaLabel: '',\n denyButtonColor: undefined,\n cancelButtonText: 'Cancel',\n cancelButtonAriaLabel: '',\n cancelButtonColor: undefined,\n buttonsStyling: true,\n reverseButtons: false,\n focusConfirm: true,\n focusDeny: false,\n focusCancel: false,\n returnFocus: true,\n showCloseButton: false,\n closeButtonHtml: '×',\n closeButtonAriaLabel: 'Close this dialog',\n loaderHtml: '',\n showLoaderOnConfirm: false,\n showLoaderOnDeny: false,\n imageUrl: undefined,\n imageWidth: undefined,\n imageHeight: undefined,\n imageAlt: '',\n timer: undefined,\n timerProgressBar: false,\n width: undefined,\n padding: undefined,\n background: undefined,\n input: undefined,\n inputPlaceholder: '',\n inputLabel: '',\n inputValue: '',\n inputOptions: {},\n inputAutoTrim: true,\n inputAttributes: {},\n inputValidator: undefined,\n returnInputValueOnDeny: false,\n validationMessage: undefined,\n grow: false,\n position: 'center',\n progressSteps: [],\n currentProgressStep: undefined,\n progressStepsDistance: undefined,\n onBeforeOpen: undefined,\n onOpen: undefined,\n willOpen: undefined,\n didOpen: undefined,\n onRender: undefined,\n didRender: undefined,\n onClose: undefined,\n onAfterClose: undefined,\n willClose: undefined,\n didClose: undefined,\n onDestroy: undefined,\n didDestroy: undefined,\n scrollbarPadding: true\n };\n var updatableParams = ['allowEscapeKey', 'allowOutsideClick', 'background', 'buttonsStyling', 'cancelButtonAriaLabel', 'cancelButtonColor', 'cancelButtonText', 'closeButtonAriaLabel', 'closeButtonHtml', 'confirmButtonAriaLabel', 'confirmButtonColor', 'confirmButtonText', 'currentProgressStep', 'customClass', 'denyButtonAriaLabel', 'denyButtonColor', 'denyButtonText', 'didClose', 'didDestroy', 'footer', 'hideClass', 'html', 'icon', 'iconColor', 'iconHtml', 'imageAlt', 'imageHeight', 'imageUrl', 'imageWidth', 'onAfterClose', 'onClose', 'onDestroy', 'progressSteps', 'returnFocus', 'reverseButtons', 'showCancelButton', 'showCloseButton', 'showConfirmButton', 'showDenyButton', 'text', 'title', 'titleText', 'willClose'];\n var deprecatedParams = {\n animation: 'showClass\" and \"hideClass',\n onBeforeOpen: 'willOpen',\n onOpen: 'didOpen',\n onRender: 'didRender',\n onClose: 'willClose',\n onAfterClose: 'didClose',\n onDestroy: 'didDestroy'\n };\n var toastIncompatibleParams = ['allowOutsideClick', 'allowEnterKey', 'backdrop', 'focusConfirm', 'focusDeny', 'focusCancel', 'returnFocus', 'heightAuto', 'keydownListenerCapture'];\n /**\n * Is valid parameter\n * @param {String} paramName\n */\n\n var isValidParameter = function isValidParameter(paramName) {\n return Object.prototype.hasOwnProperty.call(defaultParams, paramName);\n };\n /**\n * Is valid parameter for Swal.update() method\n * @param {String} paramName\n */\n\n var isUpdatableParameter = function isUpdatableParameter(paramName) {\n return updatableParams.indexOf(paramName) !== -1;\n };\n /**\n * Is deprecated parameter\n * @param {String} paramName\n */\n\n var isDeprecatedParameter = function isDeprecatedParameter(paramName) {\n return deprecatedParams[paramName];\n };\n\n var checkIfParamIsValid = function checkIfParamIsValid(param) {\n if (!isValidParameter(param)) {\n warn(\"Unknown parameter \\\"\".concat(param, \"\\\"\"));\n }\n };\n\n var checkIfToastParamIsValid = function checkIfToastParamIsValid(param) {\n if (toastIncompatibleParams.indexOf(param) !== -1) {\n warn(\"The parameter \\\"\".concat(param, \"\\\" is incompatible with toasts\"));\n }\n };\n\n var checkIfParamIsDeprecated = function checkIfParamIsDeprecated(param) {\n if (isDeprecatedParameter(param)) {\n warnAboutDeprecation(param, isDeprecatedParameter(param));\n }\n };\n /**\n * Show relevant warnings for given params\n *\n * @param params\n */\n\n\n var showWarningsForParams = function showWarningsForParams(params) {\n for (var param in params) {\n checkIfParamIsValid(param);\n\n if (params.toast) {\n checkIfToastParamIsValid(param);\n }\n\n checkIfParamIsDeprecated(param);\n }\n };\n\n\n\n var staticMethods = /*#__PURE__*/Object.freeze({\n isValidParameter: isValidParameter,\n isUpdatableParameter: isUpdatableParameter,\n isDeprecatedParameter: isDeprecatedParameter,\n argsToParams: argsToParams,\n isVisible: isVisible$1,\n clickConfirm: clickConfirm,\n clickDeny: clickDeny,\n clickCancel: clickCancel,\n getContainer: getContainer,\n getPopup: getPopup,\n getTitle: getTitle,\n getContent: getContent,\n getHtmlContainer: getHtmlContainer,\n getImage: getImage,\n getIcon: getIcon,\n getInputLabel: getInputLabel,\n getCloseButton: getCloseButton,\n getActions: getActions,\n getConfirmButton: getConfirmButton,\n getDenyButton: getDenyButton,\n getCancelButton: getCancelButton,\n getLoader: getLoader,\n getHeader: getHeader,\n getFooter: getFooter,\n getTimerProgressBar: getTimerProgressBar,\n getFocusableElements: getFocusableElements,\n getValidationMessage: getValidationMessage,\n isLoading: isLoading,\n fire: fire,\n mixin: mixin,\n queue: queue,\n getQueueStep: getQueueStep,\n insertQueueStep: insertQueueStep,\n deleteQueueStep: deleteQueueStep,\n showLoading: showLoading,\n enableLoading: showLoading,\n getTimerLeft: getTimerLeft,\n stopTimer: stopTimer,\n resumeTimer: resumeTimer,\n toggleTimer: toggleTimer,\n increaseTimer: increaseTimer,\n isTimerRunning: isTimerRunning,\n bindClickHandler: bindClickHandler\n });\n\n /**\n * Hides loader and shows back the button which was hidden by .showLoading()\n */\n\n function hideLoading() {\n // do nothing if popup is closed\n var innerParams = privateProps.innerParams.get(this);\n\n if (!innerParams) {\n return;\n }\n\n var domCache = privateProps.domCache.get(this);\n hide(domCache.loader);\n var buttonToReplace = domCache.popup.getElementsByClassName(domCache.loader.getAttribute('data-button-to-replace'));\n\n if (buttonToReplace.length) {\n show(buttonToReplace[0], 'inline-block');\n } else if (allButtonsAreHidden()) {\n hide(domCache.actions);\n }\n\n removeClass([domCache.popup, domCache.actions], swalClasses.loading);\n domCache.popup.removeAttribute('aria-busy');\n domCache.popup.removeAttribute('data-loading');\n domCache.confirmButton.disabled = false;\n domCache.denyButton.disabled = false;\n domCache.cancelButton.disabled = false;\n }\n\n function getInput$1(instance) {\n var innerParams = privateProps.innerParams.get(instance || this);\n var domCache = privateProps.domCache.get(instance || this);\n\n if (!domCache) {\n return null;\n }\n\n return getInput(domCache.content, innerParams.input);\n }\n\n var fixScrollbar = function fixScrollbar() {\n // for queues, do not do this more than once\n if (states.previousBodyPadding !== null) {\n return;\n } // if the body has overflow\n\n\n if (document.body.scrollHeight > window.innerHeight) {\n // add padding so the content doesn't shift after removal of scrollbar\n states.previousBodyPadding = parseInt(window.getComputedStyle(document.body).getPropertyValue('padding-right'));\n document.body.style.paddingRight = \"\".concat(states.previousBodyPadding + measureScrollbar(), \"px\");\n }\n };\n var undoScrollbar = function undoScrollbar() {\n if (states.previousBodyPadding !== null) {\n document.body.style.paddingRight = \"\".concat(states.previousBodyPadding, \"px\");\n states.previousBodyPadding = null;\n }\n };\n\n /* istanbul ignore file */\n\n var iOSfix = function iOSfix() {\n var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream || navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n\n if (iOS && !hasClass(document.body, swalClasses.iosfix)) {\n var offset = document.body.scrollTop;\n document.body.style.top = \"\".concat(offset * -1, \"px\");\n addClass(document.body, swalClasses.iosfix);\n lockBodyScroll();\n addBottomPaddingForTallPopups(); // #1948\n }\n };\n\n var addBottomPaddingForTallPopups = function addBottomPaddingForTallPopups() {\n var safari = !navigator.userAgent.match(/(CriOS|FxiOS|EdgiOS|YaBrowser|UCBrowser)/i);\n\n if (safari) {\n var bottomPanelHeight = 44;\n\n if (getPopup().scrollHeight > window.innerHeight - bottomPanelHeight) {\n getContainer().style.paddingBottom = \"\".concat(bottomPanelHeight, \"px\");\n }\n }\n };\n\n var lockBodyScroll = function lockBodyScroll() {\n // #1246\n var container = getContainer();\n var preventTouchMove;\n\n container.ontouchstart = function (e) {\n preventTouchMove = shouldPreventTouchMove(e);\n };\n\n container.ontouchmove = function (e) {\n if (preventTouchMove) {\n e.preventDefault();\n e.stopPropagation();\n }\n };\n };\n\n var shouldPreventTouchMove = function shouldPreventTouchMove(event) {\n var target = event.target;\n var container = getContainer();\n\n if (isStylys(event) || isZoom(event)) {\n return false;\n }\n\n if (target === container) {\n return true;\n }\n\n if (!isScrollable(container) && target.tagName !== 'INPUT' && // #1603\n !(isScrollable(getContent()) && // #1944\n getContent().contains(target))) {\n return true;\n }\n\n return false;\n };\n\n var isStylys = function isStylys(event) {\n // #1786\n return event.touches && event.touches.length && event.touches[0].touchType === 'stylus';\n };\n\n var isZoom = function isZoom(event) {\n // #1891\n return event.touches && event.touches.length > 1;\n };\n\n var undoIOSfix = function undoIOSfix() {\n if (hasClass(document.body, swalClasses.iosfix)) {\n var offset = parseInt(document.body.style.top, 10);\n removeClass(document.body, swalClasses.iosfix);\n document.body.style.top = '';\n document.body.scrollTop = offset * -1;\n }\n };\n\n /* istanbul ignore file */\n\n var isIE11 = function isIE11() {\n return !!window.MSInputMethodContext && !!document.documentMode;\n }; // Fix IE11 centering sweetalert2/issues/933\n\n\n var fixVerticalPositionIE = function fixVerticalPositionIE() {\n var container = getContainer();\n var popup = getPopup();\n container.style.removeProperty('align-items');\n\n if (popup.offsetTop < 0) {\n container.style.alignItems = 'flex-start';\n }\n };\n\n var IEfix = function IEfix() {\n if (typeof window !== 'undefined' && isIE11()) {\n fixVerticalPositionIE();\n window.addEventListener('resize', fixVerticalPositionIE);\n }\n };\n var undoIEfix = function undoIEfix() {\n if (typeof window !== 'undefined' && isIE11()) {\n window.removeEventListener('resize', fixVerticalPositionIE);\n }\n };\n\n // Adding aria-hidden=\"true\" to elements outside of the active modal dialog ensures that\n // elements not within the active modal dialog will not be surfaced if a user opens a screen\n // readerâs list of elements (headings, form controls, landmarks, etc.) in the document.\n\n var setAriaHidden = function setAriaHidden() {\n var bodyChildren = toArray(document.body.children);\n bodyChildren.forEach(function (el) {\n if (el === getContainer() || contains(el, getContainer())) {\n return;\n }\n\n if (el.hasAttribute('aria-hidden')) {\n el.setAttribute('data-previous-aria-hidden', el.getAttribute('aria-hidden'));\n }\n\n el.setAttribute('aria-hidden', 'true');\n });\n };\n var unsetAriaHidden = function unsetAriaHidden() {\n var bodyChildren = toArray(document.body.children);\n bodyChildren.forEach(function (el) {\n if (el.hasAttribute('data-previous-aria-hidden')) {\n el.setAttribute('aria-hidden', el.getAttribute('data-previous-aria-hidden'));\n el.removeAttribute('data-previous-aria-hidden');\n } else {\n el.removeAttribute('aria-hidden');\n }\n });\n };\n\n /**\n * This module containts `WeakMap`s for each effectively-\"private property\" that a `Swal` has.\n * For example, to set the private property \"foo\" of `this` to \"bar\", you can `privateProps.foo.set(this, 'bar')`\n * This is the approach that Babel will probably take to implement private methods/fields\n * https://github.com/tc39/proposal-private-methods\n * https://github.com/babel/babel/pull/7555\n * Once we have the changes from that PR in Babel, and our core class fits reasonable in *one module*\n * then we can use that language feature.\n */\n var privateMethods = {\n swalPromiseResolve: new WeakMap()\n };\n\n /*\n * Instance method to close sweetAlert\n */\n\n function removePopupAndResetState(instance, container, returnFocus, didClose) {\n if (isToast()) {\n triggerDidCloseAndDispose(instance, didClose);\n } else {\n restoreActiveElement(returnFocus).then(function () {\n return triggerDidCloseAndDispose(instance, didClose);\n });\n globalState.keydownTarget.removeEventListener('keydown', globalState.keydownHandler, {\n capture: globalState.keydownListenerCapture\n });\n globalState.keydownHandlerAdded = false;\n }\n\n if (container.parentNode && !document.body.getAttribute('data-swal2-queue-step')) {\n container.parentNode.removeChild(container);\n }\n\n if (isModal()) {\n undoScrollbar();\n undoIOSfix();\n undoIEfix();\n unsetAriaHidden();\n }\n\n removeBodyClasses();\n }\n\n function removeBodyClasses() {\n removeClass([document.documentElement, document.body], [swalClasses.shown, swalClasses['height-auto'], swalClasses['no-backdrop'], swalClasses['toast-shown']]);\n }\n\n function close(resolveValue) {\n var popup = getPopup();\n\n if (!popup) {\n return;\n }\n\n resolveValue = prepareResolveValue(resolveValue);\n var innerParams = privateProps.innerParams.get(this);\n\n if (!innerParams || hasClass(popup, innerParams.hideClass.popup)) {\n return;\n }\n\n var swalPromiseResolve = privateMethods.swalPromiseResolve.get(this);\n removeClass(popup, innerParams.showClass.popup);\n addClass(popup, innerParams.hideClass.popup);\n var backdrop = getContainer();\n removeClass(backdrop, innerParams.showClass.backdrop);\n addClass(backdrop, innerParams.hideClass.backdrop);\n handlePopupAnimation(this, popup, innerParams); // Resolve Swal promise\n\n swalPromiseResolve(resolveValue);\n }\n\n var prepareResolveValue = function prepareResolveValue(resolveValue) {\n // When user calls Swal.close()\n if (typeof resolveValue === 'undefined') {\n return {\n isConfirmed: false,\n isDenied: false,\n isDismissed: true\n };\n }\n\n return _extends({\n isConfirmed: false,\n isDenied: false,\n isDismissed: false\n }, resolveValue);\n };\n\n var handlePopupAnimation = function handlePopupAnimation(instance, popup, innerParams) {\n var container = getContainer(); // If animation is supported, animate\n\n var animationIsSupported = animationEndEvent && hasCssAnimation(popup);\n var onClose = innerParams.onClose,\n onAfterClose = innerParams.onAfterClose,\n willClose = innerParams.willClose,\n didClose = innerParams.didClose;\n runDidClose(popup, willClose, onClose);\n\n if (animationIsSupported) {\n animatePopup(instance, popup, container, innerParams.returnFocus, didClose || onAfterClose);\n } else {\n // Otherwise, remove immediately\n removePopupAndResetState(instance, container, innerParams.returnFocus, didClose || onAfterClose);\n }\n };\n\n var runDidClose = function runDidClose(popup, willClose, onClose) {\n if (willClose !== null && typeof willClose === 'function') {\n willClose(popup);\n } else if (onClose !== null && typeof onClose === 'function') {\n onClose(popup); // @deprecated\n }\n };\n\n var animatePopup = function animatePopup(instance, popup, container, returnFocus, didClose) {\n globalState.swalCloseEventFinishedCallback = removePopupAndResetState.bind(null, instance, container, returnFocus, didClose);\n popup.addEventListener(animationEndEvent, function (e) {\n if (e.target === popup) {\n globalState.swalCloseEventFinishedCallback();\n delete globalState.swalCloseEventFinishedCallback;\n }\n });\n };\n\n var triggerDidCloseAndDispose = function triggerDidCloseAndDispose(instance, didClose) {\n setTimeout(function () {\n if (typeof didClose === 'function') {\n didClose();\n }\n\n instance._destroy();\n });\n };\n\n function setButtonsDisabled(instance, buttons, disabled) {\n var domCache = privateProps.domCache.get(instance);\n buttons.forEach(function (button) {\n domCache[button].disabled = disabled;\n });\n }\n\n function setInputDisabled(input, disabled) {\n if (!input) {\n return false;\n }\n\n if (input.type === 'radio') {\n var radiosContainer = input.parentNode.parentNode;\n var radios = radiosContainer.querySelectorAll('input');\n\n for (var i = 0; i < radios.length; i++) {\n radios[i].disabled = disabled;\n }\n } else {\n input.disabled = disabled;\n }\n }\n\n function enableButtons() {\n setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], false);\n }\n function disableButtons() {\n setButtonsDisabled(this, ['confirmButton', 'denyButton', 'cancelButton'], true);\n }\n function enableInput() {\n return setInputDisabled(this.getInput(), false);\n }\n function disableInput() {\n return setInputDisabled(this.getInput(), true);\n }\n\n function showValidationMessage(error) {\n var domCache = privateProps.domCache.get(this);\n var params = privateProps.innerParams.get(this);\n setInnerHtml(domCache.validationMessage, error);\n domCache.validationMessage.className = swalClasses['validation-message'];\n\n if (params.customClass && params.customClass.validationMessage) {\n addClass(domCache.validationMessage, params.customClass.validationMessage);\n }\n\n show(domCache.validationMessage);\n var input = this.getInput();\n\n if (input) {\n input.setAttribute('aria-invalid', true);\n input.setAttribute('aria-describedBy', swalClasses['validation-message']);\n focusInput(input);\n addClass(input, swalClasses.inputerror);\n }\n } // Hide block with validation message\n\n function resetValidationMessage$1() {\n var domCache = privateProps.domCache.get(this);\n\n if (domCache.validationMessage) {\n hide(domCache.validationMessage);\n }\n\n var input = this.getInput();\n\n if (input) {\n input.removeAttribute('aria-invalid');\n input.removeAttribute('aria-describedBy');\n removeClass(input, swalClasses.inputerror);\n }\n }\n\n function getProgressSteps$1() {\n var domCache = privateProps.domCache.get(this);\n return domCache.progressSteps;\n }\n\n var Timer = /*#__PURE__*/function () {\n function Timer(callback, delay) {\n _classCallCheck(this, Timer);\n\n this.callback = callback;\n this.remaining = delay;\n this.running = false;\n this.start();\n }\n\n _createClass(Timer, [{\n key: \"start\",\n value: function start() {\n if (!this.running) {\n this.running = true;\n this.started = new Date();\n this.id = setTimeout(this.callback, this.remaining);\n }\n\n return this.remaining;\n }\n }, {\n key: \"stop\",\n value: function stop() {\n if (this.running) {\n this.running = false;\n clearTimeout(this.id);\n this.remaining -= new Date() - this.started;\n }\n\n return this.remaining;\n }\n }, {\n key: \"increase\",\n value: function increase(n) {\n var running = this.running;\n\n if (running) {\n this.stop();\n }\n\n this.remaining += n;\n\n if (running) {\n this.start();\n }\n\n return this.remaining;\n }\n }, {\n key: \"getTimerLeft\",\n value: function getTimerLeft() {\n if (this.running) {\n this.stop();\n this.start();\n }\n\n return this.remaining;\n }\n }, {\n key: \"isRunning\",\n value: function isRunning() {\n return this.running;\n }\n }]);\n\n return Timer;\n }();\n\n var defaultInputValidators = {\n email: function email(string, validationMessage) {\n return /^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z0-9-]{2,24}$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid email address');\n },\n url: function url(string, validationMessage) {\n // taken from https://stackoverflow.com/a/3809435 with a small change from #1306 and #2013\n return /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-z]{2,63}\\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(string) ? Promise.resolve() : Promise.resolve(validationMessage || 'Invalid URL');\n }\n };\n\n function setDefaultInputValidators(params) {\n // Use default `inputValidator` for supported input types if not provided\n if (!params.inputValidator) {\n Object.keys(defaultInputValidators).forEach(function (key) {\n if (params.input === key) {\n params.inputValidator = defaultInputValidators[key];\n }\n });\n }\n }\n\n function validateCustomTargetElement(params) {\n // Determine if the custom target element is valid\n if (!params.target || typeof params.target === 'string' && !document.querySelector(params.target) || typeof params.target !== 'string' && !params.target.appendChild) {\n warn('Target parameter is not valid, defaulting to \"body\"');\n params.target = 'body';\n }\n }\n /**\n * Set type, text and actions on popup\n *\n * @param params\n * @returns {boolean}\n */\n\n\n function setParameters(params) {\n setDefaultInputValidators(params); // showLoaderOnConfirm && preConfirm\n\n if (params.showLoaderOnConfirm && !params.preConfirm) {\n warn('showLoaderOnConfirm is set to true, but preConfirm is not defined.\\n' + 'showLoaderOnConfirm should be used together with preConfirm, see usage example:\\n' + 'https://sweetalert2.github.io/#ajax-request');\n } // params.animation will be actually used in renderPopup.js\n // but in case when params.animation is a function, we need to call that function\n // before popup (re)initialization, so it'll be possible to check Swal.isVisible()\n // inside the params.animation function\n\n\n params.animation = callIfFunction(params.animation);\n validateCustomTargetElement(params); // Replace newlines with <br> in title\n\n if (typeof params.title === 'string') {\n params.title = params.title.split('\\n').join('<br />');\n }\n\n init(params);\n }\n\n var swalStringParams = ['swal-title', 'swal-html', 'swal-footer'];\n var getTemplateParams = function getTemplateParams(params) {\n var template = typeof params.template === 'string' ? document.querySelector(params.template) : params.template;\n\n if (!template) {\n return {};\n }\n\n var templateContent = template.content || template; // IE11\n\n showWarningsForElements(templateContent);\n\n var result = _extends(getSwalParams(templateContent), getSwalButtons(templateContent), getSwalImage(templateContent), getSwalIcon(templateContent), getSwalInput(templateContent), getSwalStringParams(templateContent, swalStringParams));\n\n return result;\n };\n\n var getSwalParams = function getSwalParams(templateContent) {\n var result = {};\n toArray(templateContent.querySelectorAll('swal-param')).forEach(function (param) {\n showWarningsForAttributes(param, ['name', 'value']);\n var paramName = param.getAttribute('name');\n var value = param.getAttribute('value');\n\n if (typeof defaultParams[paramName] === 'boolean' && value === 'false') {\n value = false;\n }\n\n if (_typeof(defaultParams[paramName]) === 'object') {\n value = JSON.parse(value);\n }\n\n result[paramName] = value;\n });\n return result;\n };\n\n var getSwalButtons = function getSwalButtons(templateContent) {\n var result = {};\n toArray(templateContent.querySelectorAll('swal-button')).forEach(function (button) {\n showWarningsForAttributes(button, ['type', 'color', 'aria-label']);\n var type = button.getAttribute('type');\n result[\"\".concat(type, \"ButtonText\")] = button.innerHTML;\n result[\"show\".concat(capitalizeFirstLetter(type), \"Button\")] = true;\n\n if (button.hasAttribute('color')) {\n result[\"\".concat(type, \"ButtonColor\")] = button.getAttribute('color');\n }\n\n if (button.hasAttribute('aria-label')) {\n result[\"\".concat(type, \"ButtonAriaLabel\")] = button.getAttribute('aria-label');\n }\n });\n return result;\n };\n\n var getSwalImage = function getSwalImage(templateContent) {\n var result = {};\n var image = templateContent.querySelector('swal-image');\n\n if (image) {\n showWarningsForAttributes(image, ['src', 'width', 'height', 'alt']);\n\n if (image.hasAttribute('src')) {\n result.imageUrl = image.getAttribute('src');\n }\n\n if (image.hasAttribute('width')) {\n result.imageWidth = image.getAttribute('width');\n }\n\n if (image.hasAttribute('height')) {\n result.imageHeight = image.getAttribute('height');\n }\n\n if (image.hasAttribute('alt')) {\n result.imageAlt = image.getAttribute('alt');\n }\n }\n\n return result;\n };\n\n var getSwalIcon = function getSwalIcon(templateContent) {\n var result = {};\n var icon = templateContent.querySelector('swal-icon');\n\n if (icon) {\n showWarningsForAttributes(icon, ['type', 'color']);\n\n if (icon.hasAttribute('type')) {\n result.icon = icon.getAttribute('type');\n }\n\n if (icon.hasAttribute('color')) {\n result.iconColor = icon.getAttribute('color');\n }\n\n result.iconHtml = icon.innerHTML;\n }\n\n return result;\n };\n\n var getSwalInput = function getSwalInput(templateContent) {\n var result = {};\n var input = templateContent.querySelector('swal-input');\n\n if (input) {\n showWarningsForAttributes(input, ['type', 'label', 'placeholder', 'value']);\n result.input = input.getAttribute('type') || 'text';\n\n if (input.hasAttribute('label')) {\n result.inputLabel = input.getAttribute('label');\n }\n\n if (input.hasAttribute('placeholder')) {\n result.inputPlaceholder = input.getAttribute('placeholder');\n }\n\n if (input.hasAttribute('value')) {\n result.inputValue = input.getAttribute('value');\n }\n }\n\n var inputOptions = templateContent.querySelectorAll('swal-input-option');\n\n if (inputOptions.length) {\n result.inputOptions = {};\n toArray(inputOptions).forEach(function (option) {\n showWarningsForAttributes(option, ['value']);\n var optionValue = option.getAttribute('value');\n var optionName = option.innerHTML;\n result.inputOptions[optionValue] = optionName;\n });\n }\n\n return result;\n };\n\n var getSwalStringParams = function getSwalStringParams(templateContent, paramNames) {\n var result = {};\n\n for (var i in paramNames) {\n var paramName = paramNames[i];\n var tag = templateContent.querySelector(paramName);\n\n if (tag) {\n showWarningsForAttributes(tag, []);\n result[paramName.replace(/^swal-/, '')] = tag.innerHTML.trim();\n }\n }\n\n return result;\n };\n\n var showWarningsForElements = function showWarningsForElements(template) {\n var allowedElements = swalStringParams.concat(['swal-param', 'swal-button', 'swal-image', 'swal-icon', 'swal-input', 'swal-input-option']);\n toArray(template.querySelectorAll('*')).forEach(function (el) {\n if (el.parentNode !== template) {\n // can't use template.children because of IE11\n return;\n }\n\n var tagName = el.tagName.toLowerCase();\n\n if (allowedElements.indexOf(tagName) === -1) {\n warn(\"Unrecognized element <\".concat(tagName, \">\"));\n }\n });\n };\n\n var showWarningsForAttributes = function showWarningsForAttributes(el, allowedAttributes) {\n toArray(el.attributes).forEach(function (attribute) {\n if (allowedAttributes.indexOf(attribute.name) === -1) {\n warn([\"Unrecognized attribute \\\"\".concat(attribute.name, \"\\\" on <\").concat(el.tagName.toLowerCase(), \">.\"), \"\".concat(allowedAttributes.length ? \"Allowed attributes are: \".concat(allowedAttributes.join(', ')) : 'To set the value, use HTML within the element.')]);\n }\n });\n };\n\n var SHOW_CLASS_TIMEOUT = 10;\n /**\n * Open popup, add necessary classes and styles, fix scrollbar\n *\n * @param params\n */\n\n var openPopup = function openPopup(params) {\n var container = getContainer();\n var popup = getPopup();\n\n if (typeof params.willOpen === 'function') {\n params.willOpen(popup);\n } else if (typeof params.onBeforeOpen === 'function') {\n params.onBeforeOpen(popup); // @deprecated\n }\n\n var bodyStyles = window.getComputedStyle(document.body);\n var initialBodyOverflow = bodyStyles.overflowY;\n addClasses$1(container, popup, params); // scrolling is 'hidden' until animation is done, after that 'auto'\n\n setTimeout(function () {\n setScrollingVisibility(container, popup);\n }, SHOW_CLASS_TIMEOUT);\n\n if (isModal()) {\n fixScrollContainer(container, params.scrollbarPadding, initialBodyOverflow);\n setAriaHidden();\n }\n\n if (!isToast() && !globalState.previousActiveElement) {\n globalState.previousActiveElement = document.activeElement;\n }\n\n runDidOpen(popup, params);\n removeClass(container, swalClasses['no-transition']);\n };\n\n var runDidOpen = function runDidOpen(popup, params) {\n if (typeof params.didOpen === 'function') {\n setTimeout(function () {\n return params.didOpen(popup);\n });\n } else if (typeof params.onOpen === 'function') {\n setTimeout(function () {\n return params.onOpen(popup);\n }); // @deprecated\n }\n };\n\n var swalOpenAnimationFinished = function swalOpenAnimationFinished(event) {\n var popup = getPopup();\n\n if (event.target !== popup) {\n return;\n }\n\n var container = getContainer();\n popup.removeEventListener(animationEndEvent, swalOpenAnimationFinished);\n container.style.overflowY = 'auto';\n };\n\n var setScrollingVisibility = function setScrollingVisibility(container, popup) {\n if (animationEndEvent && hasCssAnimation(popup)) {\n container.style.overflowY = 'hidden';\n popup.addEventListener(animationEndEvent, swalOpenAnimationFinished);\n } else {\n container.style.overflowY = 'auto';\n }\n };\n\n var fixScrollContainer = function fixScrollContainer(container, scrollbarPadding, initialBodyOverflow) {\n iOSfix();\n IEfix();\n\n if (scrollbarPadding && initialBodyOverflow !== 'hidden') {\n fixScrollbar();\n } // sweetalert2/issues/1247\n\n\n setTimeout(function () {\n container.scrollTop = 0;\n });\n };\n\n var addClasses$1 = function addClasses(container, popup, params) {\n addClass(container, params.showClass.backdrop); // the workaround with setting/unsetting opacity is needed for #2019 and 2059\n\n popup.style.setProperty('opacity', '0', 'important');\n show(popup);\n setTimeout(function () {\n // Animate popup right after showing it\n addClass(popup, params.showClass.popup); // and remove the opacity workaround\n\n popup.style.removeProperty('opacity');\n }, SHOW_CLASS_TIMEOUT); // 10ms in order to fix #2062\n\n addClass([document.documentElement, document.body], swalClasses.shown);\n\n if (params.heightAuto && params.backdrop && !params.toast) {\n addClass([document.documentElement, document.body], swalClasses['height-auto']);\n }\n };\n\n var handleInputOptionsAndValue = function handleInputOptionsAndValue(instance, params) {\n if (params.input === 'select' || params.input === 'radio') {\n handleInputOptions(instance, params);\n } else if (['text', 'email', 'number', 'tel', 'textarea'].indexOf(params.input) !== -1 && (hasToPromiseFn(params.inputValue) || isPromise(params.inputValue))) {\n handleInputValue(instance, params);\n }\n };\n var getInputValue = function getInputValue(instance, innerParams) {\n var input = instance.getInput();\n\n if (!input) {\n return null;\n }\n\n switch (innerParams.input) {\n case 'checkbox':\n return getCheckboxValue(input);\n\n case 'radio':\n return getRadioValue(input);\n\n case 'file':\n return getFileValue(input);\n\n default:\n return innerParams.inputAutoTrim ? input.value.trim() : input.value;\n }\n };\n\n var getCheckboxValue = function getCheckboxValue(input) {\n return input.checked ? 1 : 0;\n };\n\n var getRadioValue = function getRadioValue(input) {\n return input.checked ? input.value : null;\n };\n\n var getFileValue = function getFileValue(input) {\n return input.files.length ? input.getAttribute('multiple') !== null ? input.files : input.files[0] : null;\n };\n\n var handleInputOptions = function handleInputOptions(instance, params) {\n var content = getContent();\n\n var processInputOptions = function processInputOptions(inputOptions) {\n return populateInputOptions[params.input](content, formatInputOptions(inputOptions), params);\n };\n\n if (hasToPromiseFn(params.inputOptions) || isPromise(params.inputOptions)) {\n showLoading(getConfirmButton());\n asPromise(params.inputOptions).then(function (inputOptions) {\n instance.hideLoading();\n processInputOptions(inputOptions);\n });\n } else if (_typeof(params.inputOptions) === 'object') {\n processInputOptions(params.inputOptions);\n } else {\n error(\"Unexpected type of inputOptions! Expected object, Map or Promise, got \".concat(_typeof(params.inputOptions)));\n }\n };\n\n var handleInputValue = function handleInputValue(instance, params) {\n var input = instance.getInput();\n hide(input);\n asPromise(params.inputValue).then(function (inputValue) {\n input.value = params.input === 'number' ? parseFloat(inputValue) || 0 : \"\".concat(inputValue);\n show(input);\n input.focus();\n instance.hideLoading();\n })[\"catch\"](function (err) {\n error(\"Error in inputValue promise: \".concat(err));\n input.value = '';\n show(input);\n input.focus();\n instance.hideLoading();\n });\n };\n\n var populateInputOptions = {\n select: function select(content, inputOptions, params) {\n var select = getChildByClass(content, swalClasses.select);\n\n var renderOption = function renderOption(parent, optionLabel, optionValue) {\n var option = document.createElement('option');\n option.value = optionValue;\n setInnerHtml(option, optionLabel);\n option.selected = isSelected(optionValue, params.inputValue);\n parent.appendChild(option);\n };\n\n inputOptions.forEach(function (inputOption) {\n var optionValue = inputOption[0];\n var optionLabel = inputOption[1]; // <optgroup> spec:\n // https://www.w3.org/TR/html401/interact/forms.html#h-17.6\n // \"...all OPTGROUP elements must be specified directly within a SELECT element (i.e., groups may not be nested)...\"\n // check whether this is a <optgroup>\n\n if (Array.isArray(optionLabel)) {\n // if it is an array, then it is an <optgroup>\n var optgroup = document.createElement('optgroup');\n optgroup.label = optionValue;\n optgroup.disabled = false; // not configurable for now\n\n select.appendChild(optgroup);\n optionLabel.forEach(function (o) {\n return renderOption(optgroup, o[1], o[0]);\n });\n } else {\n // case of <option>\n renderOption(select, optionLabel, optionValue);\n }\n });\n select.focus();\n },\n radio: function radio(content, inputOptions, params) {\n var radio = getChildByClass(content, swalClasses.radio);\n inputOptions.forEach(function (inputOption) {\n var radioValue = inputOption[0];\n var radioLabel = inputOption[1];\n var radioInput = document.createElement('input');\n var radioLabelElement = document.createElement('label');\n radioInput.type = 'radio';\n radioInput.name = swalClasses.radio;\n radioInput.value = radioValue;\n\n if (isSelected(radioValue, params.inputValue)) {\n radioInput.checked = true;\n }\n\n var label = document.createElement('span');\n setInnerHtml(label, radioLabel);\n label.className = swalClasses.label;\n radioLabelElement.appendChild(radioInput);\n radioLabelElement.appendChild(label);\n radio.appendChild(radioLabelElement);\n });\n var radios = radio.querySelectorAll('input');\n\n if (radios.length) {\n radios[0].focus();\n }\n }\n };\n /**\n * Converts `inputOptions` into an array of `[value, label]`s\n * @param inputOptions\n */\n\n var formatInputOptions = function formatInputOptions(inputOptions) {\n var result = [];\n\n if (typeof Map !== 'undefined' && inputOptions instanceof Map) {\n inputOptions.forEach(function (value, key) {\n var valueFormatted = value;\n\n if (_typeof(valueFormatted) === 'object') {\n // case of <optgroup>\n valueFormatted = formatInputOptions(valueFormatted);\n }\n\n result.push([key, valueFormatted]);\n });\n } else {\n Object.keys(inputOptions).forEach(function (key) {\n var valueFormatted = inputOptions[key];\n\n if (_typeof(valueFormatted) === 'object') {\n // case of <optgroup>\n valueFormatted = formatInputOptions(valueFormatted);\n }\n\n result.push([key, valueFormatted]);\n });\n }\n\n return result;\n };\n\n var isSelected = function isSelected(optionValue, inputValue) {\n return inputValue && inputValue.toString() === optionValue.toString();\n };\n\n var handleConfirmButtonClick = function handleConfirmButtonClick(instance, innerParams) {\n instance.disableButtons();\n\n if (innerParams.input) {\n handleConfirmOrDenyWithInput(instance, innerParams, 'confirm');\n } else {\n confirm(instance, innerParams, true);\n }\n };\n var handleDenyButtonClick = function handleDenyButtonClick(instance, innerParams) {\n instance.disableButtons();\n\n if (innerParams.returnInputValueOnDeny) {\n handleConfirmOrDenyWithInput(instance, innerParams, 'deny');\n } else {\n deny(instance, innerParams, false);\n }\n };\n var handleCancelButtonClick = function handleCancelButtonClick(instance, dismissWith) {\n instance.disableButtons();\n dismissWith(DismissReason.cancel);\n };\n\n var handleConfirmOrDenyWithInput = function handleConfirmOrDenyWithInput(instance, innerParams, type\n /* type is either 'confirm' or 'deny' */\n ) {\n var inputValue = getInputValue(instance, innerParams);\n\n if (innerParams.inputValidator) {\n handleInputValidator(instance, innerParams, inputValue);\n } else if (!instance.getInput().checkValidity()) {\n instance.enableButtons();\n instance.showValidationMessage(innerParams.validationMessage);\n } else if (type === 'deny') {\n deny(instance, innerParams, inputValue);\n } else {\n confirm(instance, innerParams, inputValue);\n }\n };\n\n var handleInputValidator = function handleInputValidator(instance, innerParams, inputValue) {\n instance.disableInput();\n var validationPromise = Promise.resolve().then(function () {\n return asPromise(innerParams.inputValidator(inputValue, innerParams.validationMessage));\n });\n validationPromise.then(function (validationMessage) {\n instance.enableButtons();\n instance.enableInput();\n\n if (validationMessage) {\n instance.showValidationMessage(validationMessage);\n } else {\n confirm(instance, innerParams, inputValue);\n }\n });\n };\n\n var deny = function deny(instance, innerParams, value) {\n if (innerParams.showLoaderOnDeny) {\n showLoading(getDenyButton());\n }\n\n if (innerParams.preDeny) {\n var preDenyPromise = Promise.resolve().then(function () {\n return asPromise(innerParams.preDeny(value, innerParams.validationMessage));\n });\n preDenyPromise.then(function (preDenyValue) {\n if (preDenyValue === false) {\n instance.hideLoading();\n } else {\n instance.closePopup({\n isDenied: true,\n value: typeof preDenyValue === 'undefined' ? value : preDenyValue\n });\n }\n });\n } else {\n instance.closePopup({\n isDenied: true,\n value: value\n });\n }\n };\n\n var succeedWith = function succeedWith(instance, value) {\n instance.closePopup({\n isConfirmed: true,\n value: value\n });\n };\n\n var confirm = function confirm(instance, innerParams, value) {\n if (innerParams.showLoaderOnConfirm) {\n showLoading(); // TODO: make showLoading an *instance* method\n }\n\n if (innerParams.preConfirm) {\n instance.resetValidationMessage();\n var preConfirmPromise = Promise.resolve().then(function () {\n return asPromise(innerParams.preConfirm(value, innerParams.validationMessage));\n });\n preConfirmPromise.then(function (preConfirmValue) {\n if (isVisible(getValidationMessage()) || preConfirmValue === false) {\n instance.hideLoading();\n } else {\n succeedWith(instance, typeof preConfirmValue === 'undefined' ? value : preConfirmValue);\n }\n });\n } else {\n succeedWith(instance, value);\n }\n };\n\n var addKeydownHandler = function addKeydownHandler(instance, globalState, innerParams, dismissWith) {\n if (globalState.keydownTarget && globalState.keydownHandlerAdded) {\n globalState.keydownTarget.removeEventListener('keydown', globalState.keydownHandler, {\n capture: globalState.keydownListenerCapture\n });\n globalState.keydownHandlerAdded = false;\n }\n\n if (!innerParams.toast) {\n globalState.keydownHandler = function (e) {\n return keydownHandler(instance, e, dismissWith);\n };\n\n globalState.keydownTarget = innerParams.keydownListenerCapture ? window : getPopup();\n globalState.keydownListenerCapture = innerParams.keydownListenerCapture;\n globalState.keydownTarget.addEventListener('keydown', globalState.keydownHandler, {\n capture: globalState.keydownListenerCapture\n });\n globalState.keydownHandlerAdded = true;\n }\n }; // Focus handling\n\n var setFocus = function setFocus(innerParams, index, increment) {\n var focusableElements = getFocusableElements(); // search for visible elements and select the next possible match\n\n if (focusableElements.length) {\n index = index + increment; // rollover to first item\n\n if (index === focusableElements.length) {\n index = 0; // go to last item\n } else if (index === -1) {\n index = focusableElements.length - 1;\n }\n\n return focusableElements[index].focus();\n } // no visible focusable elements, focus the popup\n\n\n getPopup().focus();\n };\n var arrowKeysNextButton = ['ArrowRight', 'ArrowDown', 'Right', 'Down' // IE11\n ];\n var arrowKeysPreviousButton = ['ArrowLeft', 'ArrowUp', 'Left', 'Up' // IE11\n ];\n var escKeys = ['Escape', 'Esc' // IE11\n ];\n\n var keydownHandler = function keydownHandler(instance, e, dismissWith) {\n var innerParams = privateProps.innerParams.get(instance);\n\n if (!innerParams) {\n return; // This instance has already been destroyed\n }\n\n if (innerParams.stopKeydownPropagation) {\n e.stopPropagation();\n } // ENTER\n\n\n if (e.key === 'Enter') {\n handleEnter(instance, e, innerParams); // TAB\n } else if (e.key === 'Tab') {\n handleTab(e, innerParams); // ARROWS - switch focus between buttons\n } else if ([].concat(arrowKeysNextButton, arrowKeysPreviousButton).indexOf(e.key) !== -1) {\n handleArrows(e.key); // ESC\n } else if (escKeys.indexOf(e.key) !== -1) {\n handleEsc(e, innerParams, dismissWith);\n }\n };\n\n var handleEnter = function handleEnter(instance, e, innerParams) {\n // #720 #721\n if (e.isComposing) {\n return;\n }\n\n if (e.target && instance.getInput() && e.target.outerHTML === instance.getInput().outerHTML) {\n if (['textarea', 'file'].indexOf(innerParams.input) !== -1) {\n return; // do not submit\n }\n\n clickConfirm();\n e.preventDefault();\n }\n };\n\n var handleTab = function handleTab(e, innerParams) {\n var targetElement = e.target;\n var focusableElements = getFocusableElements();\n var btnIndex = -1;\n\n for (var i = 0; i < focusableElements.length; i++) {\n if (targetElement === focusableElements[i]) {\n btnIndex = i;\n break;\n }\n }\n\n if (!e.shiftKey) {\n // Cycle to the next button\n setFocus(innerParams, btnIndex, 1);\n } else {\n // Cycle to the prev button\n setFocus(innerParams, btnIndex, -1);\n }\n\n e.stopPropagation();\n e.preventDefault();\n };\n\n var handleArrows = function handleArrows(key) {\n var confirmButton = getConfirmButton();\n var denyButton = getDenyButton();\n var cancelButton = getCancelButton();\n\n if (!([confirmButton, denyButton, cancelButton].indexOf(document.activeElement) !== -1)) {\n return;\n }\n\n var sibling = arrowKeysNextButton.indexOf(key) !== -1 ? 'nextElementSibling' : 'previousElementSibling';\n var buttonToFocus = document.activeElement[sibling];\n\n if (buttonToFocus) {\n buttonToFocus.focus();\n }\n };\n\n var handleEsc = function handleEsc(e, innerParams, dismissWith) {\n if (callIfFunction(innerParams.allowEscapeKey)) {\n e.preventDefault();\n dismissWith(DismissReason.esc);\n }\n };\n\n var handlePopupClick = function handlePopupClick(instance, domCache, dismissWith) {\n var innerParams = privateProps.innerParams.get(instance);\n\n if (innerParams.toast) {\n handleToastClick(instance, domCache, dismissWith);\n } else {\n // Ignore click events that had mousedown on the popup but mouseup on the container\n // This can happen when the user drags a slider\n handleModalMousedown(domCache); // Ignore click events that had mousedown on the container but mouseup on the popup\n\n handleContainerMousedown(domCache);\n handleModalClick(instance, domCache, dismissWith);\n }\n };\n\n var handleToastClick = function handleToastClick(instance, domCache, dismissWith) {\n // Closing toast by internal click\n domCache.popup.onclick = function () {\n var innerParams = privateProps.innerParams.get(instance);\n\n if (innerParams.showConfirmButton || innerParams.showDenyButton || innerParams.showCancelButton || innerParams.showCloseButton || innerParams.timer || innerParams.input) {\n return;\n }\n\n dismissWith(DismissReason.close);\n };\n };\n\n var ignoreOutsideClick = false;\n\n var handleModalMousedown = function handleModalMousedown(domCache) {\n domCache.popup.onmousedown = function () {\n domCache.container.onmouseup = function (e) {\n domCache.container.onmouseup = undefined; // We only check if the mouseup target is the container because usually it doesn't\n // have any other direct children aside of the popup\n\n if (e.target === domCache.container) {\n ignoreOutsideClick = true;\n }\n };\n };\n };\n\n var handleContainerMousedown = function handleContainerMousedown(domCache) {\n domCache.container.onmousedown = function () {\n domCache.popup.onmouseup = function (e) {\n domCache.popup.onmouseup = undefined; // We also need to check if the mouseup target is a child of the popup\n\n if (e.target === domCache.popup || domCache.popup.contains(e.target)) {\n ignoreOutsideClick = true;\n }\n };\n };\n };\n\n var handleModalClick = function handleModalClick(instance, domCache, dismissWith) {\n domCache.container.onclick = function (e) {\n var innerParams = privateProps.innerParams.get(instance);\n\n if (ignoreOutsideClick) {\n ignoreOutsideClick = false;\n return;\n }\n\n if (e.target === domCache.container && callIfFunction(innerParams.allowOutsideClick)) {\n dismissWith(DismissReason.backdrop);\n }\n };\n };\n\n function _main(userParams) {\n var mixinParams = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n showWarningsForParams(_extends({}, mixinParams, userParams));\n\n if (globalState.currentInstance) {\n globalState.currentInstance._destroy();\n }\n\n globalState.currentInstance = this;\n var innerParams = prepareParams(userParams, mixinParams);\n setParameters(innerParams);\n Object.freeze(innerParams); // clear the previous timer\n\n if (globalState.timeout) {\n globalState.timeout.stop();\n delete globalState.timeout;\n } // clear the restore focus timeout\n\n\n clearTimeout(globalState.restoreFocusTimeout);\n var domCache = populateDomCache(this);\n render(this, innerParams);\n privateProps.innerParams.set(this, innerParams);\n return swalPromise(this, domCache, innerParams);\n }\n\n var prepareParams = function prepareParams(userParams, mixinParams) {\n var templateParams = getTemplateParams(userParams);\n\n var params = _extends({}, defaultParams, mixinParams, templateParams, userParams); // precedence is described in #2131\n\n\n params.showClass = _extends({}, defaultParams.showClass, params.showClass);\n params.hideClass = _extends({}, defaultParams.hideClass, params.hideClass); // @deprecated\n\n if (userParams.animation === false) {\n params.showClass = {\n popup: 'swal2-noanimation',\n backdrop: 'swal2-noanimation'\n };\n params.hideClass = {};\n }\n\n return params;\n };\n\n var swalPromise = function swalPromise(instance, domCache, innerParams) {\n return new Promise(function (resolve) {\n // functions to handle all closings/dismissals\n var dismissWith = function dismissWith(dismiss) {\n instance.closePopup({\n isDismissed: true,\n dismiss: dismiss\n });\n };\n\n privateMethods.swalPromiseResolve.set(instance, resolve);\n\n domCache.confirmButton.onclick = function () {\n return handleConfirmButtonClick(instance, innerParams);\n };\n\n domCache.denyButton.onclick = function () {\n return handleDenyButtonClick(instance, innerParams);\n };\n\n domCache.cancelButton.onclick = function () {\n return handleCancelButtonClick(instance, dismissWith);\n };\n\n domCache.closeButton.onclick = function () {\n return dismissWith(DismissReason.close);\n };\n\n handlePopupClick(instance, domCache, dismissWith);\n addKeydownHandler(instance, globalState, innerParams, dismissWith);\n handleInputOptionsAndValue(instance, innerParams);\n openPopup(innerParams);\n setupTimer(globalState, innerParams, dismissWith);\n initFocus(domCache, innerParams); // Scroll container to top on open (#1247, #1946)\n\n setTimeout(function () {\n domCache.container.scrollTop = 0;\n });\n });\n };\n\n var populateDomCache = function populateDomCache(instance) {\n var domCache = {\n popup: getPopup(),\n container: getContainer(),\n content: getContent(),\n actions: getActions(),\n confirmButton: getConfirmButton(),\n denyButton: getDenyButton(),\n cancelButton: getCancelButton(),\n loader: getLoader(),\n closeButton: getCloseButton(),\n validationMessage: getValidationMessage(),\n progressSteps: getProgressSteps()\n };\n privateProps.domCache.set(instance, domCache);\n return domCache;\n };\n\n var setupTimer = function setupTimer(globalState$$1, innerParams, dismissWith) {\n var timerProgressBar = getTimerProgressBar();\n hide(timerProgressBar);\n\n if (innerParams.timer) {\n globalState$$1.timeout = new Timer(function () {\n dismissWith('timer');\n delete globalState$$1.timeout;\n }, innerParams.timer);\n\n if (innerParams.timerProgressBar) {\n show(timerProgressBar);\n setTimeout(function () {\n if (globalState$$1.timeout && globalState$$1.timeout.running) {\n // timer can be already stopped or unset at this point\n animateTimerProgressBar(innerParams.timer);\n }\n });\n }\n }\n };\n\n var initFocus = function initFocus(domCache, innerParams) {\n if (innerParams.toast) {\n return;\n }\n\n if (!callIfFunction(innerParams.allowEnterKey)) {\n return blurActiveElement();\n }\n\n if (!focusButton(domCache, innerParams)) {\n setFocus(innerParams, -1, 1);\n }\n };\n\n var focusButton = function focusButton(domCache, innerParams) {\n if (innerParams.focusDeny && isVisible(domCache.denyButton)) {\n domCache.denyButton.focus();\n return true;\n }\n\n if (innerParams.focusCancel && isVisible(domCache.cancelButton)) {\n domCache.cancelButton.focus();\n return true;\n }\n\n if (innerParams.focusConfirm && isVisible(domCache.confirmButton)) {\n domCache.confirmButton.focus();\n return true;\n }\n\n return false;\n };\n\n var blurActiveElement = function blurActiveElement() {\n if (document.activeElement && typeof document.activeElement.blur === 'function') {\n document.activeElement.blur();\n }\n };\n\n /**\n * Updates popup parameters.\n */\n\n function update(params) {\n var popup = getPopup();\n var innerParams = privateProps.innerParams.get(this);\n\n if (!popup || hasClass(popup, innerParams.hideClass.popup)) {\n return warn(\"You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.\");\n }\n\n var validUpdatableParams = {}; // assign valid params from `params` to `defaults`\n\n Object.keys(params).forEach(function (param) {\n if (Swal.isUpdatableParameter(param)) {\n validUpdatableParams[param] = params[param];\n } else {\n warn(\"Invalid parameter to update: \\\"\".concat(param, \"\\\". Updatable params are listed here: https://github.com/sweetalert2/sweetalert2/blob/master/src/utils/params.js\\n\\nIf you think this parameter should be updatable, request it here: https://github.com/sweetalert2/sweetalert2/issues/new?template=02_feature_request.md\"));\n }\n });\n\n var updatedParams = _extends({}, innerParams, validUpdatableParams);\n\n render(this, updatedParams);\n privateProps.innerParams.set(this, updatedParams);\n Object.defineProperties(this, {\n params: {\n value: _extends({}, this.params, params),\n writable: false,\n enumerable: true\n }\n });\n }\n\n function _destroy() {\n var domCache = privateProps.domCache.get(this);\n var innerParams = privateProps.innerParams.get(this);\n\n if (!innerParams) {\n return; // This instance has already been destroyed\n } // Check if there is another Swal closing\n\n\n if (domCache.popup && globalState.swalCloseEventFinishedCallback) {\n globalState.swalCloseEventFinishedCallback();\n delete globalState.swalCloseEventFinishedCallback;\n } // Check if there is a swal disposal defer timer\n\n\n if (globalState.deferDisposalTimer) {\n clearTimeout(globalState.deferDisposalTimer);\n delete globalState.deferDisposalTimer;\n }\n\n runDidDestroy(innerParams);\n disposeSwal(this);\n }\n\n var runDidDestroy = function runDidDestroy(innerParams) {\n if (typeof innerParams.didDestroy === 'function') {\n innerParams.didDestroy();\n } else if (typeof innerParams.onDestroy === 'function') {\n innerParams.onDestroy(); // @deprecated\n }\n };\n\n var disposeSwal = function disposeSwal(instance) {\n // Unset this.params so GC will dispose it (#1569)\n delete instance.params; // Unset globalState props so GC will dispose globalState (#1569)\n\n delete globalState.keydownHandler;\n delete globalState.keydownTarget; // Unset WeakMaps so GC will be able to dispose them (#1569)\n\n unsetWeakMaps(privateProps);\n unsetWeakMaps(privateMethods);\n };\n\n var unsetWeakMaps = function unsetWeakMaps(obj) {\n for (var i in obj) {\n obj[i] = new WeakMap();\n }\n };\n\n\n\n var instanceMethods = /*#__PURE__*/Object.freeze({\n hideLoading: hideLoading,\n disableLoading: hideLoading,\n getInput: getInput$1,\n close: close,\n closePopup: close,\n closeModal: close,\n closeToast: close,\n enableButtons: enableButtons,\n disableButtons: disableButtons,\n enableInput: enableInput,\n disableInput: disableInput,\n showValidationMessage: showValidationMessage,\n resetValidationMessage: resetValidationMessage$1,\n getProgressSteps: getProgressSteps$1,\n _main: _main,\n update: update,\n _destroy: _destroy\n });\n\n var currentInstance;\n\n var SweetAlert = /*#__PURE__*/function () {\n function SweetAlert() {\n _classCallCheck(this, SweetAlert);\n\n // Prevent run in Node env\n if (typeof window === 'undefined') {\n return;\n } // Check for the existence of Promise\n\n\n if (typeof Promise === 'undefined') {\n error('This package requires a Promise library, please include a shim to enable it in this browser (See: https://github.com/sweetalert2/sweetalert2/wiki/Migration-from-SweetAlert-to-SweetAlert2#1-ie-support)');\n }\n\n currentInstance = this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var outerParams = Object.freeze(this.constructor.argsToParams(args));\n Object.defineProperties(this, {\n params: {\n value: outerParams,\n writable: false,\n enumerable: true,\n configurable: true\n }\n });\n\n var promise = this._main(this.params);\n\n privateProps.promise.set(this, promise);\n } // `catch` cannot be the name of a module export, so we define our thenable methods here instead\n\n\n _createClass(SweetAlert, [{\n key: \"then\",\n value: function then(onFulfilled) {\n var promise = privateProps.promise.get(this);\n return promise.then(onFulfilled);\n }\n }, {\n key: \"finally\",\n value: function _finally(onFinally) {\n var promise = privateProps.promise.get(this);\n return promise[\"finally\"](onFinally);\n }\n }]);\n\n return SweetAlert;\n }(); // Dear russian users visiting russian sites. Let's have fun.\n\n\n if (typeof window !== 'undefined' && /^ru\\b/.test(navigator.language) && location.host.match(/\\.(ru|su|xn--p1ai)$/)) {\n var now = new Date();\n var initiationDate = localStorage.getItem('swal-initiation');\n\n if (!initiationDate) {\n localStorage.setItem('swal-initiation', \"\".concat(now));\n } else if ((now.getTime() - Date.parse(initiationDate)) / (1000 * 60 * 60 * 24) > 3) {\n setTimeout(function () {\n document.body.style.pointerEvents = 'none';\n var ukrainianAnthem = document.createElement('audio');\n ukrainianAnthem.src = 'https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3';\n ukrainianAnthem.loop = true;\n document.body.appendChild(ukrainianAnthem);\n setTimeout(function () {\n ukrainianAnthem.play()[\"catch\"](function () {// ignore\n });\n }, 2500);\n }, 500);\n }\n } // Assign instance methods from src/instanceMethods/*.js to prototype\n\n\n _extends(SweetAlert.prototype, instanceMethods); // Assign static methods from src/staticMethods/*.js to constructor\n\n\n _extends(SweetAlert, staticMethods); // Proxy to instance methods to constructor, for now, for backwards compatibility\n\n\n Object.keys(instanceMethods).forEach(function (key) {\n SweetAlert[key] = function () {\n if (currentInstance) {\n var _currentInstance;\n\n return (_currentInstance = currentInstance)[key].apply(_currentInstance, arguments);\n }\n };\n });\n SweetAlert.DismissReason = DismissReason;\n SweetAlert.version = '10.16.7';\n\n var Swal = SweetAlert;\n Swal[\"default\"] = Swal;\n\n return Swal;\n\n}));\nif (typeof this !== 'undefined' && this.Sweetalert2){ this.swal = this.sweetAlert = this.Swal = this.SweetAlert = this.Sweetalert2}\n\n\"undefined\"!=typeof document&&function(e,t){var n=e.createElement(\"style\");if(e.getElementsByTagName(\"head\")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=t);else try{n.innerHTML=t}catch(e){n.innerText=t}}(document,\".swal2-popup.swal2-toast{flex-direction:column;align-items:stretch;width:auto;padding:1.25em;overflow-y:hidden;background:#fff;box-shadow:0 0 .625em #d9d9d9}.swal2-popup.swal2-toast .swal2-header{flex-direction:row;padding:0}.swal2-popup.swal2-toast .swal2-title{flex-grow:1;justify-content:flex-start;margin:0 .625em;font-size:1em}.swal2-popup.swal2-toast .swal2-loading{justify-content:center}.swal2-popup.swal2-toast .swal2-input{height:2em;margin:.3125em auto;font-size:1em}.swal2-popup.swal2-toast .swal2-validation-message{font-size:1em}.swal2-popup.swal2-toast .swal2-footer{margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-popup.swal2-toast .swal2-close{position:static;width:.8em;height:.8em;line-height:.8}.swal2-popup.swal2-toast .swal2-content{justify-content:flex-start;margin:0 .625em;padding:0;font-size:1em;text-align:initial}.swal2-popup.swal2-toast .swal2-html-container{padding:.625em 0 0}.swal2-popup.swal2-toast .swal2-html-container:empty{padding:0}.swal2-popup.swal2-toast .swal2-icon{width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:700}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-popup.swal2-toast .swal2-icon .swal2-icon-content{font-size:.25em}}.swal2-popup.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-popup.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-popup.swal2-toast .swal2-actions{flex:1;flex-basis:auto!important;align-self:stretch;width:auto;height:2.2em;height:auto;margin:0 .3125em;margin-top:.3125em;padding:0}.swal2-popup.swal2-toast .swal2-styled{margin:.125em .3125em;padding:.3125em .625em;font-size:1em}.swal2-popup.swal2-toast .swal2-styled:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(100,150,200,.5)}.swal2-popup.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;transform:rotate(45deg);border-radius:50%}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.8em;left:-.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-popup.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-popup.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-popup.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{-webkit-animation:swal2-toast-animate-success-line-tip .75s;animation:swal2-toast-animate-success-line-tip .75s}.swal2-popup.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{-webkit-animation:swal2-toast-animate-success-line-long .75s;animation:swal2-toast-animate-success-line-long .75s}.swal2-popup.swal2-toast.swal2-show{-webkit-animation:swal2-toast-show .5s;animation:swal2-toast-show .5s}.swal2-popup.swal2-toast.swal2-hide{-webkit-animation:swal2-toast-hide .1s forwards;animation:swal2-toast-hide .1s forwards}.swal2-container{display:flex;position:fixed;z-index:1060;top:0;right:0;bottom:0;left:0;flex-direction:row;align-items:center;justify-content:center;padding:.625em;overflow-x:hidden;transition:background-color .1s;-webkit-overflow-scrolling:touch}.swal2-container.swal2-backdrop-show,.swal2-container.swal2-noanimation{background:rgba(0,0,0,.4)}.swal2-container.swal2-backdrop-hide{background:0 0!important}.swal2-container.swal2-top{align-items:flex-start}.swal2-container.swal2-top-left,.swal2-container.swal2-top-start{align-items:flex-start;justify-content:flex-start}.swal2-container.swal2-top-end,.swal2-container.swal2-top-right{align-items:flex-start;justify-content:flex-end}.swal2-container.swal2-center{align-items:center}.swal2-container.swal2-center-left,.swal2-container.swal2-center-start{align-items:center;justify-content:flex-start}.swal2-container.swal2-center-end,.swal2-container.swal2-center-right{align-items:center;justify-content:flex-end}.swal2-container.swal2-bottom{align-items:flex-end}.swal2-container.swal2-bottom-left,.swal2-container.swal2-bottom-start{align-items:flex-end;justify-content:flex-start}.swal2-container.swal2-bottom-end,.swal2-container.swal2-bottom-right{align-items:flex-end;justify-content:flex-end}.swal2-container.swal2-bottom-end>:first-child,.swal2-container.swal2-bottom-left>:first-child,.swal2-container.swal2-bottom-right>:first-child,.swal2-container.swal2-bottom-start>:first-child,.swal2-container.swal2-bottom>:first-child{margin-top:auto}.swal2-container.swal2-grow-fullscreen>.swal2-modal{display:flex!important;flex:1;align-self:stretch;justify-content:center}.swal2-container.swal2-grow-row>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-grow-column{flex:1;flex-direction:column}.swal2-container.swal2-grow-column.swal2-bottom,.swal2-container.swal2-grow-column.swal2-center,.swal2-container.swal2-grow-column.swal2-top{align-items:center}.swal2-container.swal2-grow-column.swal2-bottom-left,.swal2-container.swal2-grow-column.swal2-bottom-start,.swal2-container.swal2-grow-column.swal2-center-left,.swal2-container.swal2-grow-column.swal2-center-start,.swal2-container.swal2-grow-column.swal2-top-left,.swal2-container.swal2-grow-column.swal2-top-start{align-items:flex-start}.swal2-container.swal2-grow-column.swal2-bottom-end,.swal2-container.swal2-grow-column.swal2-bottom-right,.swal2-container.swal2-grow-column.swal2-center-end,.swal2-container.swal2-grow-column.swal2-center-right,.swal2-container.swal2-grow-column.swal2-top-end,.swal2-container.swal2-grow-column.swal2-top-right{align-items:flex-end}.swal2-container.swal2-grow-column>.swal2-modal{display:flex!important;flex:1;align-content:center;justify-content:center}.swal2-container.swal2-no-transition{transition:none!important}.swal2-container:not(.swal2-top):not(.swal2-top-start):not(.swal2-top-end):not(.swal2-top-left):not(.swal2-top-right):not(.swal2-center-start):not(.swal2-center-end):not(.swal2-center-left):not(.swal2-center-right):not(.swal2-bottom):not(.swal2-bottom-start):not(.swal2-bottom-end):not(.swal2-bottom-left):not(.swal2-bottom-right):not(.swal2-grow-fullscreen)>.swal2-modal{margin:auto}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-container .swal2-modal{margin:0!important}}.swal2-popup{display:none;position:relative;box-sizing:border-box;flex-direction:column;justify-content:center;width:32em;max-width:100%;padding:1.25em;border:none;border-radius:5px;background:#fff;font-family:inherit;font-size:1rem}.swal2-popup:focus{outline:0}.swal2-popup.swal2-loading{overflow-y:hidden}.swal2-header{display:flex;flex-direction:column;align-items:center;padding:0 1.8em}.swal2-title{position:relative;max-width:100%;margin:0 0 .4em;padding:0;color:#595959;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;word-wrap:break-word}.swal2-actions{display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:center;width:100%;margin:1.25em auto 0;padding:0}.swal2-actions:not(.swal2-loading) .swal2-styled[disabled]{opacity:.4}.swal2-actions:not(.swal2-loading) .swal2-styled:hover{background-image:linear-gradient(rgba(0,0,0,.1),rgba(0,0,0,.1))}.swal2-actions:not(.swal2-loading) .swal2-styled:active{background-image:linear-gradient(rgba(0,0,0,.2),rgba(0,0,0,.2))}.swal2-loader{display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;-webkit-animation:swal2-rotate-loading 1.5s linear 0s infinite normal;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 transparent #2778c4 transparent}.swal2-styled{margin:.3125em;padding:.625em 1.1em;box-shadow:none;font-weight:500}.swal2-styled:not([disabled]){cursor:pointer}.swal2-styled.swal2-confirm{border:0;border-radius:.25em;background:initial;background-color:#2778c4;color:#fff;font-size:1em}.swal2-styled.swal2-deny{border:0;border-radius:.25em;background:initial;background-color:#d14529;color:#fff;font-size:1em}.swal2-styled.swal2-cancel{border:0;border-radius:.25em;background:initial;background-color:#757575;color:#fff;font-size:1em}.swal2-styled:focus{outline:0;box-shadow:0 0 0 3px rgba(100,150,200,.5)}.swal2-styled::-moz-focus-inner{border:0}.swal2-footer{justify-content:center;margin:1.25em 0 0;padding:1em 0 0;border-top:1px solid #eee;color:#545454;font-size:1em}.swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;height:.25em;overflow:hidden;border-bottom-right-radius:5px;border-bottom-left-radius:5px}.swal2-timer-progress-bar{width:100%;height:.25em;background:rgba(0,0,0,.2)}.swal2-image{max-width:100%;margin:1.25em auto}.swal2-close{position:absolute;z-index:2;top:0;right:0;align-items:center;justify-content:center;width:1.2em;height:1.2em;padding:0;overflow:hidden;transition:color .1s ease-out;border:none;border-radius:5px;background:0 0;color:#ccc;font-family:serif;font-size:2.5em;line-height:1.2;cursor:pointer}.swal2-close:hover{transform:none;background:0 0;color:#f27474}.swal2-close:focus{outline:0;box-shadow:inset 0 0 0 3px rgba(100,150,200,.5)}.swal2-close::-moz-focus-inner{border:0}.swal2-content{z-index:1;justify-content:center;margin:0;padding:0 1.6em;color:#545454;font-size:1.125em;font-weight:400;line-height:normal;text-align:center;word-wrap:break-word}.swal2-checkbox,.swal2-file,.swal2-input,.swal2-radio,.swal2-select,.swal2-textarea{margin:1em auto}.swal2-file,.swal2-input,.swal2-textarea{box-sizing:border-box;width:100%;transition:border-color .3s,box-shadow .3s;border:1px solid #d9d9d9;border-radius:.1875em;background:inherit;box-shadow:inset 0 1px 1px rgba(0,0,0,.06);color:inherit;font-size:1.125em}.swal2-file.swal2-inputerror,.swal2-input.swal2-inputerror,.swal2-textarea.swal2-inputerror{border-color:#f27474!important;box-shadow:0 0 2px #f27474!important}.swal2-file:focus,.swal2-input:focus,.swal2-textarea:focus{border:1px solid #b4dbed;outline:0;box-shadow:0 0 0 3px rgba(100,150,200,.5)}.swal2-file::-moz-placeholder,.swal2-input::-moz-placeholder,.swal2-textarea::-moz-placeholder{color:#ccc}.swal2-file:-ms-input-placeholder,.swal2-input:-ms-input-placeholder,.swal2-textarea:-ms-input-placeholder{color:#ccc}.swal2-file::placeholder,.swal2-input::placeholder,.swal2-textarea::placeholder{color:#ccc}.swal2-range{margin:1em auto;background:#fff}.swal2-range input{width:80%}.swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}.swal2-range input,.swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}.swal2-input{height:2.625em;padding:0 .75em}.swal2-input[type=number]{max-width:10em}.swal2-file{background:inherit;font-size:1.125em}.swal2-textarea{height:6.75em;padding:.75em}.swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:inherit;color:inherit;font-size:1.125em}.swal2-checkbox,.swal2-radio{align-items:center;justify-content:center;background:#fff;color:inherit}.swal2-checkbox label,.swal2-radio label{margin:0 .6em;font-size:1.125em}.swal2-checkbox input,.swal2-radio input{flex-shrink:0;margin:0 .4em}.swal2-input-label{display:flex;justify-content:center;margin:1em auto}.swal2-validation-message{align-items:center;justify-content:center;margin:0 -2.7em;padding:.625em;overflow:hidden;background:#f0f0f0;color:#666;font-size:1em;font-weight:300}.swal2-validation-message::before{content:\\\"!\\\";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}.swal2-icon{position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:1.25em auto 1.875em;border:.25em solid transparent;border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}.swal2-icon.swal2-error{border-color:#f27474;color:#f27474}.swal2-icon.swal2-error .swal2-x-mark{position:relative;flex-grow:1}.swal2-icon.swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}.swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}.swal2-icon.swal2-error.swal2-icon-show{-webkit-animation:swal2-animate-error-icon .5s;animation:swal2-animate-error-icon .5s}.swal2-icon.swal2-error.swal2-icon-show .swal2-x-mark{-webkit-animation:swal2-animate-error-x-mark .5s;animation:swal2-animate-error-x-mark .5s}.swal2-icon.swal2-warning{border-color:#facea8;color:#f8bb86}.swal2-icon.swal2-info{border-color:#9de0f6;color:#3fc3ee}.swal2-icon.swal2-question{border-color:#c9dae1;color:#87adbd}.swal2-icon.swal2-success{border-color:#a5dc86;color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;transform:rotate(45deg);border-radius:50%}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=left]{top:-.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}.swal2-icon.swal2-success [class^=swal2-success-circular-line][class$=right]{top:-.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}.swal2-icon.swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-.25em;left:-.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}.swal2-icon.swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}.swal2-icon.swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}.swal2-icon.swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}.swal2-icon.swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-tip{-webkit-animation:swal2-animate-success-line-tip .75s;animation:swal2-animate-success-line-tip .75s}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-line-long{-webkit-animation:swal2-animate-success-line-long .75s;animation:swal2-animate-success-line-long .75s}.swal2-icon.swal2-success.swal2-icon-show .swal2-success-circular-line-right{-webkit-animation:swal2-rotate-success-circular-line 4.25s ease-in;animation:swal2-rotate-success-circular-line 4.25s ease-in}.swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:0 0 1.25em;padding:0;background:inherit;font-weight:600}.swal2-progress-steps li{display:inline-block;position:relative}.swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:#add8e6;color:#fff}.swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:#add8e6}.swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}[class^=swal2]{-webkit-tap-highlight-color:transparent}.swal2-show{-webkit-animation:swal2-show .3s;animation:swal2-show .3s}.swal2-hide{-webkit-animation:swal2-hide .15s forwards;animation:swal2-hide .15s forwards}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{right:auto;left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}@supports (-ms-accelerator:true){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active){.swal2-range input{width:100%!important}.swal2-range output{display:none}}@-webkit-keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@keyframes swal2-toast-show{0%{transform:translateY(-.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0)}}@-webkit-keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@-webkit-keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@-webkit-keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}@-webkit-keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@keyframes swal2-show{0%{transform:scale(.7)}45%{transform:scale(1.05)}80%{transform:scale(.95)}100%{transform:scale(1)}}@-webkit-keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@keyframes swal2-hide{0%{transform:scale(1);opacity:1}100%{transform:scale(.5);opacity:0}}@-webkit-keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@-webkit-keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@-webkit-keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@-webkit-keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(.4);opacity:0}50%{margin-top:1.625em;transform:scale(.4);opacity:0}80%{margin-top:-.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@-webkit-keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0);opacity:1}}@-webkit-keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes swal2-rotate-loading{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto!important}body.swal2-no-backdrop .swal2-container{top:auto;right:auto;bottom:auto;left:auto;max-width:calc(100% - .625em * 2);background-color:transparent!important}body.swal2-no-backdrop .swal2-container>.swal2-modal{box-shadow:0 0 10px rgba(0,0,0,.4)}body.swal2-no-backdrop .swal2-container.swal2-top{top:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-container.swal2-top-left,body.swal2-no-backdrop .swal2-container.swal2-top-start{top:0;left:0}body.swal2-no-backdrop .swal2-container.swal2-top-end,body.swal2-no-backdrop .swal2-container.swal2-top-right{top:0;right:0}body.swal2-no-backdrop .swal2-container.swal2-center{top:50%;left:50%;transform:translate(-50%,-50%)}body.swal2-no-backdrop .swal2-container.swal2-center-left,body.swal2-no-backdrop .swal2-container.swal2-center-start{top:50%;left:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-container.swal2-center-end,body.swal2-no-backdrop .swal2-container.swal2-center-right{top:50%;right:0;transform:translateY(-50%)}body.swal2-no-backdrop .swal2-container.swal2-bottom{bottom:0;left:50%;transform:translateX(-50%)}body.swal2-no-backdrop .swal2-container.swal2-bottom-left,body.swal2-no-backdrop .swal2-container.swal2-bottom-start{bottom:0;left:0}body.swal2-no-backdrop .swal2-container.swal2-bottom-end,body.swal2-no-backdrop .swal2-container.swal2-bottom-right{right:0;bottom:0}@media print{body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown){overflow-y:scroll!important}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop):not(.swal2-toast-shown) .swal2-container{position:static!important}}body.swal2-toast-shown .swal2-container{background-color:transparent}body.swal2-toast-shown .swal2-container.swal2-top{top:0;right:auto;bottom:auto;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{top:0;right:0;bottom:auto;left:auto}body.swal2-toast-shown .swal2-container.swal2-top-left,body.swal2-toast-shown .swal2-container.swal2-top-start{top:0;right:auto;bottom:auto;left:0}body.swal2-toast-shown .swal2-container.swal2-center-left,body.swal2-toast-shown .swal2-container.swal2-center-start{top:50%;right:auto;bottom:auto;left:0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{top:50%;right:auto;bottom:auto;left:50%;transform:translate(-50%,-50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{top:50%;right:0;bottom:auto;left:auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-left,body.swal2-toast-shown .swal2-container.swal2-bottom-start{top:auto;right:auto;bottom:0;left:0}body.swal2-toast-shown .swal2-container.swal2-bottom{top:auto;right:auto;bottom:0;left:50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{top:auto;right:0;bottom:0;left:auto}\");\n\n//# sourceURL=webpack:///../euronics/node_modules/sweetalert2/dist/sweetalert2.all.js?")},
61"../plugin_wishlists/cartridges/plugin_wishlists/cartridge/client/default/js/product/wishlist.js": 62/*!*******************************************************************************************************!*\ 63 !*** ../plugin_wishlists/cartridges/plugin_wishlists/cartridge/client/default/js/product/wishlist.js ***! 64 \*******************************************************************************************************/ 65/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval("\n\n\n/**\n * appends params to a url\n * @param {string} data - data returned from the server's ajax call\n * @param {Object} button - button that was clicked to add a product to the wishlist\n */\nfunction displayMessage(data, button) {\n $.spinner().stop();\n var status;\n if (data.success) {\n status = 'alert-success';\n } else {\n status = 'alert-danger';\n }\n\n if ($('.add-to-wishlist-messages').length === 0) {\n $('body').append(\n '<div class=\"add-to-wishlist-messages \"></div>'\n );\n }\n $('.add-to-wishlist-messages')\n .append('<div class=\"add-to-wishlist-alert text-center ' + status + '\">' + data.msg + '</div>');\n\n setTimeout(function () {\n $('.add-to-wishlist-messages').remove();\n button.removeAttr('disabled');\n }, 5000);\n}\n\nmodule.exports = {\n addToWishlist: function () {\n $('.add-to-wish-list').on('click', function (e) {\n e.preventDefault();\n var url = $(this).data('href');\n var button = $(this);\n var pid = $(this).closest('.product-detail').find('.product-id').html();\n var optionId = $(this).closest('.product-detail').find('.product-option').attr('data-option-id');\n var optionVal = $(this).closest('.product-detail').find('.options-select option:selected').attr('data-value-id');\n optionId = optionId || null;\n optionVal = optionVal || null;\n if (!url || !pid) {\n return;\n }\n\n $.spinner().start();\n $(this).attr('disabled', true);\n $.ajax({\n url: url,\n type: 'post',\n dataType: 'json',\n data: {\n pid: pid,\n optionId: optionId,\n optionVal: optionVal\n }
65,\n success: function (data) {\n displayMessage(data, button);\n },\n error: function (err) {\n displayMessage(err, button);\n }\n });\n });\n }\n};\n\n\n//# sourceURL=webpack:///../plugin_wishlists/cartridges/plugin_wishlists/cartridge/client/default/js/product/wishlist.js?")},
65"../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js": 66/*!***************************************************************************************************************************!*\ 67 !*** ../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js ***! 68 \***************************************************************************************************************************/ 69/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval("\n\nmodule.exports = {\n setTabNextFocus: function (focusParams) {\n var KEYCODE_TAB = 9;\n var isTabPressed = (focusParams.event.key === 'Tab' || focusParams.event.keyCode === KEYCODE_TAB);\n\n if (!isTabPressed) {\n return;\n }\n\n var firstFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.firstElementSelector);\n var lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.lastElementSelector);\n\n if ($(focusParams.containerSelector + ' ' + focusParams.lastElementSelector).is(':disabled')) {\n lastFocusableEl = $(focusParams.containerSelector + ' ' + focusParams.nextToLastElementSelector);\n if ($('.product-quickview.product-set').length > 0) {\n var linkElements = $(focusParams.containerSelector + ' a#fa-link.share-icons');\n lastFocusableEl = linkElements[linkElements.length - 1];\n }\n }\n\n if (focusParams.event.shiftKey) /* shift + tab */ {\n if ($(':focus').is(firstFocusableEl)) {\n lastFocusableEl.focu
69s();\n focusParams.event.preventDefault();\n }\n } else /* tab */ {\n if ($(':focus').is(lastFocusableEl)) { // eslint-disable-line\n firstFocusableEl.focus();\n focusParams.event.preventDefault();\n }\n }\n }\n};\n\n\n//# sourceURL=webpack:///../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js?")},
69"../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/base.js": 70/*!***********************************************************************************************************************!*\ 71 !*** ../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/base.js ***! 72 \***********************************************************************************************************************/ 73/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval("\nvar focusHelper = __webpack_require__(/*! ../components/focus */ \"../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/components/focus.js\");\n\n/**\n * Retrieves the relevant pid value\n * @param {jquery} $el - DOM container for a given add to cart button\n * @return {string} - value to be used when adding product to cart\n */\nfunction getPidValue($el) {\n var pid;\n\n if ($('#quickViewModal').hasClass('show') && !$('.product-set').length) {\n pid = $($el).closest('.modal-content').find('.product-quickview').data('pid');\n } else if ($('.product-set-detail').length || $('.product-set').length) {\n pid = $($el).closest('.product-detail').find('.product-id').text();\n } else {\n pid = $('.product-detail:not(\".bundle-item\")').data('pid');\n }\n\n return pid;\n}\n\n/**\n * Retrieve contextual quantity selector\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {jquery} - quantity selector DOM container\n */\nfunction getQuantitySelector($el) {\n var quantitySelected;\n if ($el && $('.set-items').length) {\n quantitySelected = $($el).closest('.product-detail').find('.quantity-select');\n } else if ($el && $('.product-bundle').length) {\n var quantitySelectedModal = $($el).closest('.modal-footer').find('.quantity-select');\n var quantitySelectedPDP = $($el).closest('.bundle-footer').find('.quantity-select');\n if (quantitySelectedModal.val() === undefined) {\n quantitySelected = quantitySelectedPDP;\n } else {\n quantitySelected = quantitySelectedModal;\n }\n } else {\n quantitySelected = $('.quantity-select');\n }\n return quantitySelected;\n}\n\n/**\n * Retrieves the value associated with the Quantity pull-down menu\n * @param {jquery} $el - DOM container for the relevant quantity\n * @return {string} - value found in the quantity input\n */\nfunction getQuantitySelected($el) {\n return getQuantitySelector($el).val();\n}\n\n/**\n * Process the attribute values for an attribute that has image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string} attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction processSwatchValues(attr, $productContainer, msgs) {\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer.find('[data-attr=\"' + attr.id + '\"] [data-attr-value=\"' +\n attrValue.value + '\"]');\n var $swatchButton = $attrValue.parent();\n\n if (attrValue.selected) {\n $attrValue.addClass('selected');\n $attrValue.siblings('.selected-assistive-text').text(msgs.assistiveSelectedText);\n } else {\n $attrValue.removeClass('selected');\n $attrValue.siblings('.selected-assistive-text').empty();\n }\n\n if (attrValue.url) {\n $swatchButton.attr('data-url', attrValue.url);\n } else {\n $swatchButton.removeAttr('data-url');\n }\n\n // Disable if not selectable\n $attrValue.removeClass('selectable unselectable');\n\n $attrValue.addClass(attrValue.selectable ? 'selectable' : 'unselectable');\n });\n}\n\n/**\n * Process attribute values associated with an attribute that does not have image swatches\n *\n * @param {Object} attr - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {Object[]} attr.values - Array of attribute value objects\n * @param {string}
73 attr.values.value - Attribute coded value\n * @param {string} attr.values.url - URL to de/select an attribute value of the product\n * @param {boolean} attr.values.isSelectable - Flag as to whether an attribute value can be\n * selected. If there is no variant that corresponds to a specific combination of attribute\n * values, an attribute may be disabled in the Product Detail Page\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction processNonSwatchValues(attr, $productContainer) {\n var $attr = '[data-attr=\"' + attr.id + '\"]';\n var $defaultOption = $productContainer.find($attr + ' .select-' + attr.id + ' option:first');\n $defaultOption.attr('value', attr.resetUrl);\n\n attr.values.forEach(function (attrValue) {\n var $attrValue = $productContainer\n .find($attr + ' [data-attr-value=\"' + attrValue.value + '\"]');\n $attrValue.attr('value', attrValue.url)\n .removeAttr('disabled');\n\n if (!attrValue.selectable) {\n $attrValue.attr('disabled', true);\n }\n });\n}\n\n/**\n * Routes the handling of attribute processing depending on whether the attribute has image\n * swatches or not\n *\n * @param {Object} attrs - Attribute\n * @param {string} attr.id - Attribute ID\n * @param {jQuery} $productContainer - DOM element for a given product\n * @param {Object} msgs - object containing resource messages\n */\nfunction updateAttrs(attrs, $productContainer, msgs) {\n // Currently, the only attribute type that has image swatches is Color.\n var attrsWithSwatches = ['color'];\n\n attrs.forEach(function (attr) {\n if (attrsWithSwatches.indexOf(attr.id) > -1) {\n processSwatchValues(attr, $productContainer, msgs);\n } else {\n processNonSwatchValues(attr, $productContainer);\n }\n });\n}\n\n/**\n * Updates the availability status in the Product Detail Page\n *\n * @param {Object} response - Ajax response object after an\n * attribute value has been [de]selected\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction updateAvailability(response, $productContainer) {\n var availabilityValue = '';\n var availabilityMessages = response.product.availability.messages;\n if (!response.product.readyToOrder) {\n availabilityValue = '<li><div>' + response.resources.info_selectforstock + '</div></li>';\n } else {\n availabilityMessages.forEach(function (message) {\n availabilityValue += '<li><div>' + message + '</div></li>';\n });\n }\n\n $($productContainer).trigger('product:updateAvailability', {\n product: response.product,\n $productContainer: $productContainer,\n message: availabilityValue,\n resources: response.resources\n });\n}\n\n/**\n * Generates html for product attributes section\n *\n * @param {array} attributes - list of attributes\n * @return {string} - Compiled HTML\n */\nfunction getAttributesHtml(attributes) {\n if (!attributes) {\n return '';\n }\n\n var html = '';\n\n attributes.forEach(function (attributeGroup) {\n if (attributeGroup.ID === 'mainAttributes') {\n attributeGroup.attributes.forEach(function (attribute) {\n html += '<div class=\"attribute-values\">' + attribute.label + ': '\n + attribute.value + '</div>';\n });\n }\n });\n\n return html;\n}\n\n/**\n * @typedef UpdatedOptionValue\n * @type Object\n * @property {string} id - Option value ID for look up\n * @property {string} url - Updated option value selection URL\n */\n\n/**\n * @typedef OptionSelectionResponse\n * @type Object\n * @property {string} priceHtml - Updated price HTML code\n * @property {Object} options - Updated Options\n * @property {string} options.id - Option ID\n * @property {UpdatedOptionValue[]} options.values - Option values\n */\n\n/**\n * Updates DOM using post-option selection Ajax response\n *\n * @param {OptionSelectionResponse} optionsHtml - Ajax response optionsHtml from selecting a product option\n * @param {jQuery}
73 $productContainer - DOM element for current product\n */\nfunction updateOptions(optionsHtml, $productContainer) {\n\t// Update options\n $productContainer.find('.product-options').empty().html(optionsHtml);\n}\n\n/**\n * Dynamically creates Bootstrap carousel from response containing images\n * @param {Object[]} imgs - Array of large product images,along with related information\n * @param {jQuery} $productContainer - DOM element for a given product\n */\nfunction createCarousel(imgs, $productContainer) {\n var carousel = $productContainer.find('.carousel');\n $(carousel).carousel('dispose');\n var carouselId = $(carousel).attr('id');\n $(carousel).empty().append('<ol class=\"carousel-indicators\"></ol><div class=\"carousel-inner\" role=\"listbox\"></div><a class=\"carousel-control-prev\" href=\"#' + carouselId + '\" role=\"button\" data-slide=\"prev\"><span class=\"fa icon-prev\" aria-hidden=\"true\"></span><span class=\"sr-only\">' + $(carousel).data('prev') + '</span></a><a class=\"carousel-control-next\" href=\"#' + carouselId + '\" role=\"button\" data-slide=\"next\"><span class=\"fa icon-next\" aria-hidden=\"true\"></span><span class=\"sr-only\">' + $(carousel).data('next') + '</span></a>');\n for (var i = 0; i < imgs.length; i++) {\n $('<div class=\"carousel-item\"><img src=\"' + imgs[i].url + '\" class=\"d-block img-fluid\" alt=\"' + imgs[i].alt + ' image number ' + parseInt(imgs[i].index, 10) + '\" title=\"' + imgs[i].title + '\" itemprop=\"image\" /></div>').appendTo($(carousel).find('.carousel-inner'));\n $('<li data-target=\"#' + carouselId + '\" data-slide-to=\"' + i + '\" class=\"\"></li>').appendTo($(carousel).find('.carousel-indicators'));\n }\n $($(carousel).find('.carousel-item')).first().addClass('active');\n $($(carousel).find('.carousel-indicators > li')).first().addClass('active');\n if (imgs.length === 1) {\n $($(carousel).find('.carousel-indicators, a[class^=\"carousel-control-\"]')).detach();\n }\n $(carousel).carousel();\n $($(carousel).find('.carousel-indicators')).attr('aria-hidden', true);\n}\n\n/**\n * Parses JSON from Ajax call made whenever an attribute value is [de]selected\n * @param {Object} response - response from Ajax call\n * @param {Object} response.product - Product object\n * @param {string} response.product.id - Product ID\n * @param {Object[]} response.product.variationAttributes - Product attributes\n * @param {Object[]} response.product.images - Product images\n * @param {boolean} response.product.hasRequiredAttrsSelected - Flag as to whether all required\n * attributes have been selected. Used partially to\n * determine whether the Add to Cart button can be enabled\n * @param {jQuery} $productContainer - DOM element for a given product.\n */\nfunction handleVariantResponse(response, $productContainer) {\n var isChoiceOfBonusProducts =\n $productContainer.parents('.choose-bonus-product-dialog').length > 0;\n var isVaraint;\n if (response.product.variationAttributes) {\n updateAttrs(response.product.variationAttributes, $productContainer, response.resources);\n isVaraint = response.product.productType === 'variant';\n if (isChoiceOfBonusProducts && isVaraint) {\n $productContainer.parent('.bonus-product-item')\n .data('pid', response.product.id);\n\n $productContainer.parent('.bonus-product-item')\n .data('ready-to-order', response.product.readyToOrder);\n }\n }\n\n // Update primary images\n var primaryImageUrls = response.product.images.large;\n createCarousel(primaryImageUrls, $productContainer);\n\n // Update pricing\n if (!isChoiceOfBonusProducts) {\n var $priceSelector = $('.prices .price', $productContainer).length\n ? $('.prices .price', $productContainer)\n : $('.prices .price');\n $priceSelector.replaceWith(response.product.price.html);\n }\n\n // Update promotions\n $productContainer.find('.promotions').empty().html(response.product.promotionsHtml);
73\n\n updateAvailability(response, $productContainer);\n\n if (isChoiceOfBonusProducts) {\n var $selectButton = $productContainer.find('.select-bonus-product');\n $selectButton.trigger('bonusproduct:updateSelectButton', {\n product: response.product, $productContainer: $productContainer\n });\n } else {\n // Enable \"Add to Cart\" button if all required attributes have been selected\n $('button.add-to-cart, button.add-to-cart-global, button.update-cart-product-global').trigger('product:updateAddToCart', {\n product: response.product, $productContainer: $productContainer\n }).trigger('product:statusUpdate', response.product);\n }\n\n // Update attributes\n $productContainer.find('.main-attributes').empty()\n .html(getAttributesHtml(response.product.attributes));\n}\n\n/**\n * @typespec UpdatedQuantity\n * @type Object\n * @property {boolean} selected - Whether the quantity has been selected\n * @property {string} value - The number of products to purchase\n * @property {string} url - Compiled URL that specifies variation attributes, product ID, options,\n * etc.\n */\n\n/**\n * Updates the quantity DOM elements post Ajax call\n * @param {UpdatedQuantity[]} quantities -\n * @param {jQuery} $productContainer - DOM container for a given product\n */\nfunction updateQuantities(quantities, $productContainer) {\n if ($productContainer.parent('.bonus-product-item').length <= 0) {\n var optionsHtml = quantities.map(function (quantity) {\n var selected = quantity.selected ? ' selected ' : '';\n return '<option value=\"' + quantity.value + '\" data-url=\"' + quantity.url + '\"' +\n selected + '>' + quantity.value + '</option>';\n }).join('');\n getQuantitySelector($productContainer).empty().html(optionsHtml);\n }\n}\n\n/**\n * updates the product view when a product attribute is selected or deselected or when\n * changing quantity\n * @param {string} selectedValueUrl - the Url for the selected variation value\n * @param {jQuery} $productContainer - DOM element for current product\n */\nfunction attributeSelect(selectedValueUrl, $productContainer) {\n if (selectedValueUrl) {\n $('body').trigger('product:beforeAttributeSelect',\n { url: selectedValueUrl, container: $productContainer });\n\n $.ajax({\n url: selectedValueUrl,\n method: 'GET',\n success: function (data) {\
73n handleVariantResponse(data, $productContainer);\n updateOptions(data.product.optionsHtml, $productContainer);\n updateQuantities(data.product.quantities, $productContainer);\n $('body').trigger('product:afterAttributeSelect',\n { data: data, container: $productContainer });\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @return {string} - The provided URL to use when adding a product to the cart\n */\nfunction getAddToCartUrl() {\n return $('.add-to-cart-url').val();\n}\n\n/**\n * Parses the html for a modal window\n * @param {string} html - representing the body and footer of the modal window\n *\n * @return {Object} - Object with properties body and footer.\n */\nfunction parseHtml(html) {\n var $html = $('<div>').append($.parseHTML(html));\n\n var body = $html.find('.choice-of-bonus-product');\n var footer = $html.find('.modal-footer').children();\n\n return { body: body, footer: footer };\n}\n\n/**\n * Retrieves url to use when adding a product to the cart\n *\n * @param {Object} data - data object used to fill in dynamic portions of the html\n */\nfunction chooseBonusProducts(data) {\n $('.modal-body').spinner().start();\n\n if ($('#chooseBonusProductModal').length !== 0) {\n $('#chooseBonusProductModal').remove();\n }\n var bonusUrl;\n if (data.bonusChoiceRuleBased) {\n bonusUrl = data.showProductsUrlRuleBased;\n } else {\n bonusUrl = data.showProductsUrlListBased;\n }\n\n var htmlString = '\x3c!-- Modal --\x3e'\n + '<div class=\"modal fade\" id=\"chooseBonusProductModal\" tabindex=\"-1\" role=\"dialog\">'\n + '<span class=\"enter-message sr-only\" ></span>'\n + '<div class=\"modal-dialog choose-bonus-product-dialog\" '\n + 'data-total-qty=\"' + data.maxBonusItems + '\"'\n + 'data-UUID=\"' + data.uuid + '\"'\n + 'data-pliUUID=\"' + data.pliUUID + '\"'\n + 'data-addToCartUrl=\"' + data.addToCartUrl + '\"'\n + 'data-pageStart=\"0\"'\n + 'data-pageSize=\"' + data.pageSize + '\"'\n + 'data-moreURL=\"' + data.showProductsUrlRuleBased + '\"'\n + 'data-bonusChoiceRuleBased=\"' + data.bonusChoiceRuleBased + '\">'\n + '\x3c!-- Modal content--\x3e'\n + '<div class=\"modal-content\">'\n + '<div class=\"modal-header\">'\n + ' <span class=\"\">' + data.labels.selectprods + '</span>'\n + ' <button type=\"button\" class=\"close pull-right\" data-dismiss=\"modal\">'\n + ' <span aria-hidden=\"true\">×</span>'\n + ' <span class=\"sr-only\"> </span>'\n + ' </button>'\n + '</div>'\n + '<div class=\"modal-body\"></div>'\n + '<div class=\"modal-footer\"></div>'\n + '</div>'\n + '</div>'\n + '</div>';\n $('body').append(htmlString);\n $('.modal-body').spinner().start();\n\n $.ajax({\n url: bonusUrl,\n method: 'GET',\n dataType: 'json',\n success: function (response) {\n var parsedHtml = parseHtml(response.renderedTemplate);\n $('#chooseBonusProductModal .modal-body').empty();\n $('#chooseBonusProductModal .enter-message').text(response.enterDialogMessage);\n $('#chooseBonusProductModal .modal-header .close .sr-only').text(response.closeButtonText);\n $('#chooseBonusProductModal .modal-body').html(parsedHtml.body);\n $('#chooseBonusProductModal .modal-footer').html(parsedHtml.footer);\n $('#chooseBonusProductModal').modal('show');\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n}\n\n/**\n * Updates the Mini-Cart quantity value after the customer has pressed the \"Add to Cart\" button\n * @param {string} response - ajax response from clicking the add to cart button\n */\nfunction handlePostCartAdd(response) {\n $('.minicart').trigger('count:update', response);\n var messageType = response.error ? 'alert-danger' : 'alert-success';\n // show add to cart toast\n if (response.newBonusDiscountLineItem\n && Object.keys(response.newBonusDiscountLineItem).length !== 0) {\n chooseBonusProducts(response.newBonusDiscountLineItem);\n } else {\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append(\n '<div class=\"add-to-cart-messages\"></div>'\n );\n }\n\n $('.add-to-cart-messages').append(\n '<div class=\"alert ' + messageType + ' add-to-basket-alert text-center\" role=\"alert\">'\n + response.message\n + '</div>'\n );\n\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 5000);\n }\n}\n\n/**\n * Retrieves the bundle product item ID's for the Controller to replace bundle master product\n * items with their selected variants\n *\n * @return {string[]} - List of selected bundle product item ID's\n */\nfunction getChildProducts() {\n var childProducts = [];\n $('.bundle-item').each(function () {\n childProducts.push({\n pid: $(this).find('.product-id').text(),\n quantity: parseInt($(this).find('label.quantity').data('quantity'), 10)\n });\n });\n\n return childProducts.length ? JSON.stringify(childProducts) : [];\n}\n\n/**\n * Retrieve product options\n *\n * @param {jQuery}
73 $productContainer - DOM element for current product\n * @return {string} - Product options and their selected values\n */\nfunction getOptions($productContainer) {\n var options = $productContainer\n .find('.product-option')\n .map(function () {\n var $elOption = $(this).find('.options-select');\n var urlValue = $elOption.val();\n var selectedValueId = $elOption.find('option[value=\"' + urlValue + '\"]')\n .data('value-id');\n return {\n optionId: $(this).data('option-id'),\n selectedValueId: selectedValueId\n };\n }).toArray();\n\n return JSON.stringify(options);\n}\n\n/**\n * Makes a call to the server to report the event of adding an item to the cart\n *\n * @param {string | boolean} url - a string representing the end point to hit so that the event can be recorded, or false\n */\nfunction miniCartReportingUrl(url) {\n if (url) {\n $.ajax({\n url: url,\n method: 'GET',\n success: function () {\n // reporting urls hit on the server\n },\n error: function () {\n // no reporting urls hit on the server\n }\n });\n }\n}\n\nmodule.exports = {\n attributeSelect: attributeSelect,\n methods: {\n editBonusProducts: function (data) {\
73n chooseBonusProducts(data);\n }\n },\n\n focusChooseBonusProductModal: function () {\n $('body').on('shown.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'true');\n $('#chooseBonusProductModal .close').focus();\n });\n },\n\n onClosingChooseBonusProductModal: function () {\n $('body').on('hidden.bs.modal', '#chooseBonusProductModal', function () {\n $('#chooseBonusProductModal').siblings().attr('aria-hidden', 'false');\n });\n },\n\n trapChooseBonusProductModalFocus: function () {\n $('body').on('keydown', '#chooseBonusProductModal', function (e) {\n var focusParams = {\n event: e,\n containerSelector: '#chooseBonusProductModal',\n firstElementSelector: '.close',\n lastElementSelector: '.add-bonus-products'\n };\n focusHelper.setTabNextFocus(focusParams);\n });\n },\n\n colorAttribute: function () {\n $(document).on('click', '[data-attr=\"color\"] button', function (e) {\n e.preventDefault();\n\n if ($(this).attr('disabled')) {\n return;\n }\n var $productContainer = $(this).closest('.set-item');
73\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n\n attributeSelect($(this).attr('data-url'), $productContainer);\n });\n },\n\n selectAttribute: function () {\n $(document).on('change', 'select[class*=\"select-\"], .options-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.set-item');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.product-detail');\n }\n attributeSelect(e.currentTarget.value, $productContainer);\n });\n },\n\n availability: function () {\n $(document).on('change', '.quantity-select', function (e) {\n e.preventDefault();\n\n var $productContainer = $(this).closest('.product-detail');\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.modal-content').find('.product-quickview');\n }\n\n if ($('.bundle-items', $productContainer).length === 0) {\n attributeSelect($(e.currentTarget).find('option:selected').data('url'),\n $productContainer);\n }\n });\n },\n\n addToCart: function () {\n $(document).on('click', 'button.add-to-cart, button.add-to-cart-global', function () {\n var addToCartUrl;\n var pid;\n var pidsObj;\n var setPids;\n\n $('body').trigger('product:beforeAddToCart', this);\n\n if ($('.set-items').length && $(this).hasClass('add-to-cart-global')) {\n setPids = [];\n\n $('.product-detail').each(function () {\n if (!$(this).hasClass('product-set-detail')) {\n setPids.push({\n pid: $(this).find('.product-id').text(),\n qty: $(this).find('.quantity-select').val(),\n options: getOptions($(this))\n });\n }\n });\n pidsObj = JSON.stringify(setPids);\n }\n\n pid = getPidValue($(this));\n\n var $productContainer = $(this).closest('.product-detail');
73\n if (!$productContainer.length) {\n $productContainer = $(this).closest('.quick-view-dialog').find('.product-detail');\n }\n\n addToCartUrl = getAddToCartUrl();\n\n var form = {\n pid: pid,\n pidsObj: pidsObj,\n childProducts: getChildProducts(),\n quantity: getQuantitySelected($(this))\n };\n\n if (!$('.bundle-item').length) {\n form.options = getOptions($productContainer);\n }\n\n $(this).trigger('updateAddToCartFormData', form);\n if (addToCartUrl) {\n $.ajax({\n url: addToCartUrl,\n method: 'POST',\n data: form,\n success: function (data) {\n handlePostCartAdd(data);\n $('body').trigger('product:afterAddToCart', data);\n $.spinner().stop();\n miniCartReportingUrl(data.reportingURL);\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n });\n },\n selectBonusProduct: function () {\n $(document).on('click', '.select-bonus-product', function () {\n var $choiceOfBonusProduct = $(this).parents('.choice-of-bonus-product');\n var pid = $(this).data('pid');\n var maxPids = $('.choose-bonus-product-dialog').data('total-qty');\n var submittedQty = parseInt($choiceOfBonusProduct.find('.bonus-quantity-select').val(), 10);\n var totalQty = 0;\n $.each($('#chooseBonusProductModal .selected-bonus-products .selected-pid'), function () {\n totalQty += $(this).data('qty');\n });\n totalQty += submittedQty;\n var optionID = $choiceOfBonusProduct.find('.product-option').data('option-id');\n var valueId = $choiceOfBonusProduct.find('.options-select option:selected').data('valueId');\n if (totalQty <= maxPids) {\n var selectedBonusProductHtml = ''\n + '<div class=\"selected-pid row\" '\n + 'data-pid=\"' + pid + '\"'\n + 'data-qty=\"' + submittedQty + '\"'\n + 'data-optionID=\"' + (optionID || '') + '\"'\n + 'data-option-selected-value=\"' + (valueId || '') + '\"'\n + '>'\n + '<div class=\"col-sm-11 col-9 bonus-product-name\" >'\n + $choiceOfBonusProduct.find('.product-name').html()\n + '</div>'\n + '<div class=\"col-1\"><i class=\"fa fa-times\" aria-hidden=\"true\"></i></div>'\n + '</div>'\n ;\n $('#chooseBonusProductModal .selected-bonus-products').append(selectedBonusProductHtml);\n $('.pre-cart-products').html(totalQty);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n } else {\n $('.selected-bonus-products .bonus-summary').addClass('alert-danger');\n }\n });\n },\n removeBonusProduct: function () {\n $(document).on('click', '.selected-pid', function () {\n $(this).remove();\n var $selected = $('#chooseBonusProductModal .selected-bonus-products .selected-pid');\n var count = 0;\n if ($selected.length) {\n $selected.each(function () {\n count += parseInt($(this).data('qty'), 10);\n });\n }\n\n $('.pre-cart-products').html(count);\n $('.selected-bonus-products .bonus-summary').removeClass('alert-danger');\n });\n },\n enableBonusProductSelection: function () {\n $('body').on('bonusproduct:updateSelectButton', function (e, response) {\n $('button.select-bonus-product', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n var pid = response.product.id;\n $('button.select-bonus-product', response.$productC
73ontainer).data('pid', pid);\n });\n },\n showMoreBonusProducts: function () {\n $(document).on('click', '.show-more-bonus-products', function () {\n var url = $(this).data('url');\n $('.modal-content').spinner().start();\n $.ajax({\n url: url,\n method: 'GET',\n success: function (html) {\n var parsedHtml = parseHtml(html);\n $('.modal-body').append(parsedHtml.body);\n $('.show-more-bonus-products:first').remove();\n $('.modal-content').spinner().stop();\n },\n error: function () {\n $('.modal-content').spinner().stop();\n }\n });\n });\n },\n addBonusProductsToCart: function () {\n $(document).on('click', '.add-bonus-products', function () {\n var $readyToOrderBonusProducts = $('.choose-bonus-product-dialog .selected-pid');\n var queryString = '?pids=';\n var url = $('.choose-bonus-product-dialog').data('addtocarturl');\n var pidsObject = {\n bonusProducts: []\n };\n\n $.each($readyToOrderBonusProducts, function () {\n var qtyOption =\n parseInt($(this)\n .data('qty'), 10);\n\n var option = null;\n if (qtyOption > 0) {\n if ($(this).data('optionid') && $(this).data('option-selected-value')) {\n option = {};\n option.optionId = $(this).data('optionid');\n option.productId = $(this).data('pid');\n option.selectedValueId = $(this).data('option-selected-value');\n }\n pidsObject.bonusProducts.push({\n pid: $(this).data('pid'),\n qty: qtyOption,\n options: [option]\n });\n pidsObject.totalQty = parseInt($('.pre-cart-products').html(), 10);\n }\n });\n queryString += JSON.stringify(pidsObject);\n queryString = queryString + '&uuid=' + $('.choose-bonus-product-dialog').data('uuid');\n queryString = queryString + '&pliuuid=' + $('.choose-bonus-product-dialog').data('pliuuid');\n $.spinner().start();\n $.ajax({\n url: url + queryString,\n method: 'POST',\n success: function (data) {\
73n $.spinner().stop();\n if (data.error) {\n $('#chooseBonusProductModal').modal('hide');\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('<div class=\"add-to-cart-messages\"></div>');\n }\n $('.add-to-cart-messages').append(\n '<div class=\"alert alert-danger add-to-basket-alert text-center\"'\n + ' role=\"alert\">'\n + data.errorMessage + '</div>'\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n }, 3000);\n } else {\n $('.configure-bonus-product-attributes').html(data);\n $('.bonus-products-step2').removeClass('hidden-xl-down');\n $('#chooseBonusProductModal').modal('hide');\n\n if ($('.add-to-cart-messages').length === 0) {\n $('body').append('<div class=\"add-to-cart-messages\"></div>');\n }\n $('.minicart-quantity').html(data.totalQty);\n $('.add-to-cart-messages').append(\n '<div class=\"alert alert-success add-to-basket-alert text-center\"'\n + ' role=\"alert\">'\n + data.msgSuccess + '</div>'\n );\n setTimeout(function () {\n $('.add-to-basket-alert').remove();\n if ($('.cart-page').length) {\n location.reload();\n }\n }, 1500);\n }\n },\n error: function () {\n $.spinner().stop();\n }\n });\n });\n },\n\n getPidValue: getPidValue,\n getQuantitySelected: getQuantitySelected,\n miniCartReportingUrl: miniCartReportingUrl\n};\n\n\n//# sourceURL=webpack:///../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/base.js?")},
73"../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/detail.js": 74/*!*************************************************************************************************************************!*\ 75 !*** ../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/detail.js ***! 76 \*************************************************************************************************************************/ 77/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval("\nvar base = __webpack_require__(/*! ./base */ \"../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/base.js\");\n\n/**\n * Enable/disable UI elements\n * @param {boolean} enableOrDisable - true or false\n */\nfunction updateAddToCartEnableDisableOtherElements(enableOrDisable) {\n $('button.add-to-cart-global').attr('disabled', enableOrDisable);\n}\n\nmodule.exports = {\n methods: {\n updateAddToCartEnableDisableOtherElements: updateAddToCartEnableDisableOtherElements\n },\n\n availability: base.availability,\n\n addToCart: base.addToCart,\n\n updateAttributesAndDetails: function () {\n $('body').on('product:statusUpdate', function (e, data) {\n var $productContainer = $('.product-detail[data-pid=\"' + data.id + '\"]');\n\n $productContainer.find('.description-and-detail .product-attributes')\n .empty()\n .html(data.attributesHtml);\n\n if (data.shortDescription) {\n $productContainer.find('.description-and-detail .description')\n .removeClass('hidden-xl-down');\n $productContainer.find('.description-and-detail .description .content')\n .empty()\n .html(data.shortDescription);\n } else {\n $productContainer.find('.description-and-detail .description')\n .addClass('hidden-xl-down');\n }\n\n if (data.longDescription) {\n $productContainer.find('.description-and-detail .details')\n .removeClass('hidden-xl-down');\n $productContainer.find('.description-and-detail .details .content')\n .empty()\n .html(data.longDescription);\n } else {\n $productContainer.find('.description-and-detail .details')\n .addClass('hidden-xl-down');\n }\n });\n },\n\n showSpinner: function () {\n $('body').on('product:beforeAddToCart product:beforeAttributeSelect', function () {\n $.spinner().start();\n });\n },\n updateAttribute: function () {\n $('body').on('product:afterAttributeSelect', function (e, response) {\n if ($('.product-detail>.bundle-items').length) {\n response.container.data('pid', response.data.product.id);\n response.container.find('.product-id').text(response.data.product.id);\n } else if ($('.product-set-detail').eq(0)) {\n response.container.data('pid', response.data.product.id);\n response.container.find('.product-id').text(response.data.product.id);\n } else {\n $('.product-id').text(response.data.product.id);\n $('.product-detail:not(\".bundle-item\")').data('pid', response.data.product.id);\n }\n });\n },\n updateAddToCart: function () {\n $('body').on('product:updateAddToCart', function (e, response) {\n // update local add to cart (for sets)\n $('button.add-to-cart', response.$productContainer).attr('disabled',\n (!response.product.readyToOrder || !response.product.available));\n\n var enable = $('.product-availability').toArray().every(function (item) {\n return $(item).data('available') && $(item).data('ready-to-order');\n });\n module.exports.methods.updateAddToCartEnableDisableOtherElements(!enable);\n });\n },\n updateAvailability: function () {\n $('body').on('product:updateAvailability', function (e, response) {\n $('div.availability', response.$productC
77ontainer)\n .data('ready-to-order', response.product.readyToOrder)\n .data('available', response.product.available);\n\n $('.availability-msg', response.$productContainer)\n .empty().html(response.message);\n\n if ($('.global-availability').length) {\n var allAvailable = $('.product-availability').toArray()\n .every(function (item) { return $(item).data('available'); });\n\n var allReady = $('.product-availability').toArray()\n .every(function (item) { return $(item).data('ready-to-order'); });\n\n $('.global-availability')\n .data('ready-to-order', allReady)\n .data('available', allAvailable);\n\n $('.global-availability .availability-msg').empty()\n .html(allReady ? response.message : response.resources.info_selectforstock);\n }\n });\n },\n sizeChart: function () {\n $('.size-chart a').on('click', function (e) {\n e.preventDefault();\n var url = $(this).attr('href');\n var $prodSizeChart = $(this).closest('.size-chart').find('.size-chart-collapsible');\n if ($prodSizeChart.is(':empty')) {\n $.ajax({\n url: url,\n type: 'get',\n dataType: 'json',\n success: function (data) {\
77n $prodSizeChart.append(data.content);\n }\n });\n }\n $prodSizeChart.toggleClass('active');\n });\n\n var $sizeChart = $('.size-chart-collapsible');\n $('body').on('click touchstart', function (e) {\n if ($('.size-chart').has(e.target).length <= 0) {\n $sizeChart.removeClass('active');\n }\n });\n },\n copyProductLink: function () {\n $('body').on('click', '#fa-link', function () {\n event.preventDefault();\n var $temp = $('<input>');\n $('body').append($temp);\n $temp.val($('#shareUrl').val()).select();\n document.execCommand('copy');\n $temp.remove();\n $('.copy-link-message').attr('role', 'alert');\n $('.copy-link-message').removeClass('d-none');\n setTimeout(function () {\n $('.copy-link-message').addClass('d-none');\n }, 3000);\n });\n },\n\n focusChooseBonusProductModal: base.focusChooseBonusProductModal()\n};\n\n\n//# sourceURL=webpack:///../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/product/detail.js?")},
77"../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/util.js": 78/*!***************************************************************************************************************!*\ 79 !*** ../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/util.js ***! 80 \***************************************************************************************************************/ 81/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval("\n\nmodule.exports = function (include) {\n if (typeof include === 'function') {\n include();\n } else if (typeof include === 'object') {\n Object.keys(include).forEach(function (key) {\n if (typeof include[key] === 'function') {\n include[key]();\n }\n });\n }\n};\n\n\n//# sourceURL=webpack:///../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/util.js?")},
81"./cartridges/int_app/cartridge/client/default/js/product/detail.js": 82/*!**************************************************************************!*\ 83 !*** ./cartridges/int_app/cartridge/client/default/js/product/detail.js ***! 84 \**************************************************************************/ 85/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval("\n\nvar base = __webpack_require__(/*! euronics/product/detail */ \"../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/detail.js\");\nvar appHelpers = __webpack_require__(/*! ../utils/appHelpers */ \"./cartridges/int_app/cartridge/client/default/js/utils/appHelpers.js\");\n\n$(document).on('click', '.btn-continue-shopping', function () {\n appHelpers.callToApp(this, 'showHome');\n});\n\nmodule.exports = base;\n\n//# sourceURL=webpack:///./cartridges/int_app/cartridge/client/default/js/product/detail.js?")},
85"./cartridges/int_app/cartridge/client/default/js/productDetail.js": 86/*!*************************************************************************!*\ 87 !*** ./cartridges/int_app/cartridge/client/default/js/productDetail.js ***! 88 \*************************************************************************/ 89/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval('\n\nvar processInclude = __webpack_require__(/*! base/util */ "../storefront-reference-architecture/cartridges/app_storefront_base/cartridge/client/default/js/util.js");\n\n$(document).ready(function () {\n processInclude(__webpack_require__(/*! ./product/detail */ "./cartridges/int_app/cartridge/client/default/js/product/detail.js"));\n processInclude(__webpack_require__(/*! euronics/product/wishlist */ "../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/wishlist.js"));\n processInclude(__webpack_require__(/*! euronics/product/services */ "../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/services.js"));\n processInclude(__webpack_require__(/*! euronics/product/chargerFeaturesModal */ "../euronics/cartridges/app_custom_euronics/cartridge/client/default/js/product/chargerFeaturesModal.js"));\n});\n\n//# sourceURL=webpack:///./cartridges/int_app/cartridge/client/default/js/productDetail.js?')},
89"./cartridges/int_app/cartridge/client/default/js/utils/appHelpers.js": 90/*!****************************************************************************!*\ 91 !*** ./cartridges/int_app/cartridge/client/default/js/utils/appHelpers.js ***! 92 \****************************************************************************/ 93/*! no static exports found */function(module,exports,__webpack_require__){"use strict";eval("\n\nfunction callToApp(link, name) {\n const url = new URL(window.location.href);\n let app = '';\n\n if (url.searchParams.size > 0) {\n app = url.searchParams.get('app');\n } else {\n app = $('#app').attr('data-user-agent');\n }\n\n if (app && (app === 'app-mobile-ios' || app === 'app-mobile-android')) {\n app === 'app-mobile-ios' ?\n window.webkit.messageHandlers[name].postMessage({}) :\n window.euronicsInterface[name]();\n } else if ($(link).data('href')) {\n window.location.href = $(link).data('href');\n }\n}\n\nmodule.exports = {\n callToApp: callToApp\n};\n\n//# sourceURL=webpack:///./cartridges/int_app/cartridge/client/default/js/utils/appHelpers.js?")},
vendor: 5,907 bytes, lines 93-97
93"./node_modules/process/browser.js": 94/*!*****************************************!*\ 95 !*** ./node_modules/process/browser.js ***! 96 \*****************************************/ 97/*! no static exports found */function(module,exports){eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n//# sourceURL=webpack:///./node_modules/process/browser.js?")},
vendor: 785 bytes, lines 97-101
97"./node_modules/webpack/buildin/global.js": 98/*!***********************************!*\ 99 !*** (webpack)/buildin/global.js ***! 100 \***********************************/ 101/*! no static exports found */function(module,exports){eval('var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function("return this")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === "object") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it\'s\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n//# sourceURL=webpack:///(webpack)/buildin/global.js?')}
vendor: 3 bytes, line 101
101});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.