{"version":3,"file":"ProductView.min.js","sources":["ProductView.js"],"sourcesContent":["(function ($, _, root, undefined) {\r\n 'use strict';\r\n\r\n var assetId = 'uc209-productview';\r\n\r\n // Main product controller\r\n function productViewController($viewContainer, productViewModel) {\r\n var model = productViewModel;\r\n var pubsub = root.PubSub;\r\n var utils = new util();\r\n var say = new notificator(pubsub, utils);\r\n var variantProcessorsMap = {};\r\n var flags = null;\r\n var cart = null;\r\n var rating = null;\r\n var gallery = null;\r\n var priceTotals = null;\r\n var packageComponents = null;\r\n var groupingProduct = null;\r\n\r\n if (model.discountID) {\r\n console.info(model.title + ' - Discount ID: ' + model.discountID);\r\n }\r\n\r\n return {\r\n init: function () {\r\n // Not optimal, but the call stack is complex with many dependecies and not async.\r\n // These causes problems if do load variant-selector-provider only in the initVariantsProcessor\r\n // Will be solved when ProductView.js will be rewritten in modules and web-components\r\n importShim('/components/archive/product/variant-selector-provider/variant-selector-provider.js').then(async function(){\r\n var quantityDiscounts = new quantityDiscountsProcessor($viewContainer, model);\r\n var externalTracking = new externalTrackingProcessor();\r\n\r\n priceTotals = new priceTotalsProcessor($viewContainer, utils, model);\r\n priceTotals.init();\r\n\r\n if (model.isProductWithVariants) {\r\n var preselectedVariants = _getPreselectedVariantsFromQueryString();\r\n const options = {\r\n $productContainer: $viewContainer,\r\n productModel: model,\r\n priceTotals: priceTotals,\r\n quantityDiscountsProcessorInstance: quantityDiscounts,\r\n externalTrackingProcessorInstance: externalTracking,\r\n preselectedVariants: preselectedVariants,\r\n enableHistoryState: true,\r\n metadata: model.metadata,\r\n say: say,\r\n pubsub: pubsub,\r\n utils: utils,\r\n };\r\n initVariantsProcessor(options, variantProcessorsMap);\r\n }\r\n\r\n if (!model.isVariantProductOfProductWithVariants) {\r\n quantityDiscounts.renderQuantityDiscounts();\r\n }\r\n\r\n if (model.packageComponentProducts) {\r\n _.each(model.packageComponentProducts, function (packageComponent) {\r\n if (packageComponent.isMainProductOfProductWithVariants) {\r\n const $componentProductContainer = $viewContainer.find('.js-component-products-list .js-component-product[data-uniqueid=\"' + packageComponent.uniqueId + '\"]');\r\n packageComponent.variantRelImageMatchRegExp = model.variantRelImageMatchRegExp;\r\n const options = {\r\n $productContainer: $componentProductContainer,\r\n productModel: packageComponent,\r\n priceTotals: priceTotals,\r\n metadata: model.metadata,\r\n say: say,\r\n pubsub: pubsub,\r\n utils: utils,\r\n };\r\n initVariantsProcessor(options, variantProcessorsMap);\r\n }\r\n });\r\n packageComponents = new packageComponentProcessor($viewContainer, model, utils);\r\n }\r\n\r\n if (model.groupingComponents) {\r\n groupingProduct = new groupingProductProcessor($viewContainer, model, utils, say, pubsub, priceTotals, variantProcessorsMap);\r\n await groupingProduct.init();\r\n } else if (model.showCalculateShippingTool) {\r\n $viewContainer.find('shipping-details').on('click', function (evt) {\r\n const quantity = $viewContainer.find('.js-quantity').val() || 1;\r\n document.querySelector('shipping-details').shippingProducts = [{productId: model.productId, quantity: quantity}];\r\n });\r\n }\r\n\r\n if (model.additionalProducts) {\r\n _.each(model.additionalProducts, function (additionalProduct) {\r\n if (additionalProduct.isProductWithVariants) {\r\n const $additionalProductContainer = $viewContainer.find('.js-additional-product[data-uniqueid=\"' + additionalProduct.uniqueId + '\"]');\r\n additionalProduct.variantRelImageMatchRegExp = model.variantRelImageMatchRegExp;\r\n const options = {\r\n $productContainer: $additionalProductContainer,\r\n productModel: additionalProduct,\r\n priceTotals: priceTotals,\r\n metadata: model.metadata,\r\n say: say,\r\n pubsub: pubsub,\r\n utils: utils,\r\n };\r\n initVariantsProcessor(options, variantProcessorsMap);\r\n }\r\n });\r\n }\r\n\r\n // Initial calculation - some quantities may be pre-set\r\n priceTotals.updatePriceTotals();\r\n\r\n cart = new cartProcessor($viewContainer, model, say, pubsub, variantProcessorsMap, utils, priceTotals);\r\n cart.init();\r\n\r\n flags = new flagsProcessor($viewContainer, model);\r\n flags.init();\r\n\r\n rating = new ratingProcessor($viewContainer, model, pubsub);\r\n rating.init();\r\n\r\n var shoppingListHandler = new shoppingListProcessor($viewContainer, model, say, utils, variantProcessorsMap);\r\n shoppingListHandler.init();\r\n\r\n if (model.isPrintEnabled) {\r\n var printHanlder = new printProcessor($viewContainer, model);\r\n printHanlder.init();\r\n }\r\n\r\n var pdfHadnler = new pdfProcessor($viewContainer, model);\r\n pdfHadnler.init();\r\n\r\n if (model.isPriceRequestEnabled) {\r\n var priceRequestHandler = priceRequestProcessor($viewContainer);\r\n priceRequestHandler.init();\r\n }\r\n\r\n gallery = new galleryProcessor($viewContainer, model);\r\n gallery.init();\r\n\r\n externalTracking.reportProductsView($viewContainer, model);\r\n\r\n var enableRelationExtensionDataProcessing = model.isProductRelationsExtensionEnabled && model.isProductWithVariants && model.additionalProducts && model.additionalProducts.length;\r\n if (enableRelationExtensionDataProcessing) {\r\n var relExtDataProcessor = new relationExtensionDataProcessor($viewContainer, model, variantProcessorsMap, priceTotals, pubsub);\r\n relExtDataProcessor.init();\r\n }\r\n\r\n const similarProductsSelect = $viewContainer.find('select.js-similar-products-selector');\r\n if (similarProductsSelect.length) {\r\n similarProductsSelect.on('change', (e) => window.location = e.target.selectedOptions[0].dataset.url);\r\n }\r\n\r\n if (model.showWarehouseStockInfo) {\r\n const warehouseStocks = $viewContainer.find('stock-info-list').get(0);\r\n if (warehouseStocks) {\r\n warehouseStocks.setData(model.warehouseStocks);\r\n }\r\n }\r\n\r\n setStockStatusTooltip($viewContainer, model, utils);\r\n });\r\n }\r\n };\r\n\r\n function _getPreselectedVariantsFromQueryString() {\r\n var result = {}, queryString = location.search.slice(1), re = /sel(?:\\:|%3a){1}([^&=]+)=([^&]*)/gi, match;\r\n\r\n while ((match = re.exec(queryString))) {\r\n var paramKey = decodeURIComponent(match[1]).toLowerCase();\r\n var paramValue = decodeURIComponent(match[2].replace(/\\+/g, ' ')).toLowerCase();\r\n result[paramKey] = paramValue;\r\n }\r\n\r\n return result;\r\n }\r\n }\r\n\r\n root.productViewController = productViewController;\r\n\r\n $(function () {\r\n if (root.umwAssets && root.umwAssets[assetId]) {\r\n root.umwAssets[assetId].forEach(function (ctx) {\r\n if (ctx) {\r\n var mainPanelId = ctx.uniqueId;\r\n var $mainPanel = $(`#${mainPanelId}`);\r\n\r\n if ($mainPanel.length === 1) {\r\n var controller = new productViewController($mainPanel, ctx);\r\n controller.init();\r\n } else if ($mainPanel.length === 0) {\r\n console.warn(assetId + ': product view main panel element was not found by id#' + mainPanelId);\r\n } else {\r\n console.warn(assetId + ': found >1 product view main panel elements with id#' + mainPanelId);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n // Notifications processor\r\n function notificator(pubsub, utils) {\r\n function _notify(message, notificationType, timeout) {\r\n if (typeof message === 'object' && message !== null) {\r\n message = utils.extractErrorMessageFromResponse(message);\r\n }\r\n\r\n if (pubsub) {\r\n message = message.replace(/\\n/g, \"
\");\r\n pubsub.publish('notification.' + notificationType, { text: message, timeout: timeout, maxVisible: 3});\r\n } else {\r\n var notificationTypeMap = {\r\n 'error': 'error',\r\n 'alert': 'log',\r\n 'success': 'log',\r\n 'warning': 'warn'\r\n };\r\n\r\n root.console[notificationTypeMap[notificationType]].apply(this, [message]);\r\n }\r\n }\r\n\r\n return {\r\n warning: function (message, timeout) {\r\n _notify(message, 'warning', timeout || false);\r\n },\r\n error: function (message, timeout) {\r\n _notify(message, 'error', timeout || false);\r\n },\r\n success: function (message, timeout) {\r\n _notify(message, 'success', timeout || 30000);\r\n }\r\n };\r\n }\r\n\r\n // Variants processor\r\n function variantsProcessor($productContainer, product, metadata, preselectedVariants, say, pubsub, priceTotalsController, quantityDiscounts, externalTracking, utils, enableHistoryState) {\r\n var $container = $productContainer;\r\n var $declaredVariantSelectors = utils.$getProductContainerElements($container, '.js-variant-selector');\r\n\r\n var variantControllers = {};\r\n var isVariantProductShown = false;\r\n var suppressVariantProductDetailsLoading = false;\r\n\r\n var variantsState = { controlId: product.uniqueId, selectedVariantProd: null };\r\n var suppressVariantChangedEvent = false;\r\n\r\n var currentlyUnavailableVariantsMap = {};\r\n\r\n function _onVariantSelectionChanged(changedVariantType, newVariantValue) {\r\n var changedVariantController = _getVariantControllerById(changedVariantType.id);\r\n var prevVariantValue = changedVariantController.selectedValue;\r\n changedVariantController.selectedValue = newVariantValue || 0;\r\n\r\n var selectedVariantValues = _getSelectedVariants();\r\n var selectedVariantProduct = _getSelectedVariantProduct(selectedVariantValues);\r\n\r\n if (!suppressVariantProductDetailsLoading) {\r\n if (selectedVariantProduct) {\r\n const selectedVariant = changedVariantType.variants.find(x => x.id === newVariantValue);\r\n _loadVariantProductDetails(selectedVariantProduct, selectedVariant);\r\n } else if (isVariantProductShown) {\r\n // De-selection, or unavailable dimensions combination - load main product and show\r\n _loadVariantProductDetails();\r\n }\r\n }\r\n\r\n if (quantityDiscounts) {\r\n quantityDiscounts.renderQuantityDiscounts(selectedVariantValues);\r\n }\r\n\r\n pubsub.publish('variantprocessor.variant.changed', [newVariantValue, prevVariantValue, changedVariantController]);\r\n }\r\n\r\n function _filterUnavailableVariants(newVariantValue) {\r\n var selectedVariantValues = [];\r\n Object.values(variantControllers).forEach(variantController => {\r\n if (variantController.selectedValue > 0) {\r\n selectedVariantValues.push(variantController.selectedValue);\r\n }\r\n });\r\n\r\n if (newVariantValue) {\r\n selectedVariantValues = [newVariantValue];\r\n } else if (newVariantValue == 0) {\r\n currentlyUnavailableVariantsMap = {};\r\n }\r\n\r\n const isAnyVariantSelected = selectedVariantValues.length > 0;\r\n // set unavailable first\r\n product.variantProducts.forEach(variantProduct => {\r\n var isProductForCurrentSelection = selectedVariantValues.every(selectedVariantOption => variantProduct.variants.find(x => x === selectedVariantOption));\r\n if (!isAnyVariantSelected || isProductForCurrentSelection) {\r\n variantProduct.variants.forEach(variantId => {\r\n currentlyUnavailableVariantsMap[variantId] = { message: variantProduct.availabilityMessage, disabled: variantProduct.disableSelection, exists: variantProduct.exists };\r\n });\r\n }\r\n });\r\n // set available for selected variant values\r\n product.variantProducts.forEach(variantProduct => {\r\n var isProductForCurrentSelection = selectedVariantValues.every(selectedVariantOption => variantProduct.variants.find(x => x === selectedVariantOption));\r\n if ((!isAnyVariantSelected || isProductForCurrentSelection) && (variantProduct.isAvailable || product.isPriceRequestEnabled && variantProduct.exists)) {\r\n variantProduct.variants.forEach(variantId => {\r\n delete currentlyUnavailableVariantsMap[variantId];\r\n });\r\n }\r\n });\r\n\r\n _.each(variantControllers, function (variantController) {\r\n var preselectSingleAvailable = (_.isEmpty(preselectedVariants) || !preselectedVariants[variantController.variantType.name.toLowerCase()]) && variantController.variantType.variants.length === 1;\r\n variantController.selector.filterVariants(currentlyUnavailableVariantsMap, preselectSingleAvailable);\r\n });\r\n }\r\n\r\n function _processVariants() {\r\n var variantTypeToProductInfoMap = {};\r\n\r\n var selectedVariantTypes = [];\r\n var selectedVariantOptions = [];\r\n _.each(variantControllers, variantController => {\r\n if (variantController.selectedValue > 0) {\r\n selectedVariantTypes.push(variantController.variantType.id);\r\n selectedVariantOptions.push(variantController.selectedValue);\r\n }\r\n });\r\n\r\n const isAnyVariantSelected = selectedVariantOptions.length > 0;\r\n\r\n product.variantProducts.forEach(variantProduct => {\r\n var isProductForCurrentSelection = selectedVariantOptions.every(selectedVariantOption => variantProduct.variants.find(x => x === selectedVariantOption));\r\n if (!isAnyVariantSelected || isProductForCurrentSelection) {\r\n variantProduct.variants.forEach(variantId => {\r\n if (variantProduct.discountInfo) {\r\n variantTypeToProductInfoMap[variantId] = {\r\n discountInfo: variantProduct.discountInfo\r\n };\r\n }\r\n });\r\n }\r\n });\r\n\r\n _.each(variantControllers, function (variantController) {\r\n variantController.selector.processVariants(variantTypeToProductInfoMap);\r\n });\r\n }\r\n\r\n function _loadVariantProductDetails(variantProduct, selectedVariant) {\r\n var beforeLoadEvent = $.Event('variantsprocessor:beforeloadvariantproduct');\r\n $container.trigger(beforeLoadEvent, [variantProduct, selectedVariant]);\r\n\r\n if (beforeLoadEvent.isDefaultPrevented()) {\r\n isVariantProductShown = !!variantProduct;\r\n return;\r\n }\r\n\r\n $.blockUI({ message: '' });\r\n\r\n var selectedVariants = variantProduct ? variantProduct.variants : [];\r\n var $sellPriceFormatted = utils.$getProductContainerElements($container, '.js-sellprice-formatted');\r\n const isSellPriceVisible = product.showPrice && $sellPriceFormatted.length > 0 && $sellPriceFormatted.is(':visible');\r\n\r\n $.ajax({\r\n url: root.R + 'handlers/public/productdata.ashx',\r\n type: 'GET',\r\n data: {\r\n a: 'GetDimDetails',\r\n ItemID: product.itemId,\r\n Dim1: selectedVariants[0] !== undefined ? selectedVariants[0] : 0,\r\n Dim2: selectedVariants[1] !== undefined ? selectedVariants[1] : 0,\r\n Dim3: selectedVariants[2] !== undefined ? selectedVariants[2] : 0,\r\n CanHandleDisallowedBuyDims: true,\r\n ImageWidth: product.previewImageWidth,\r\n ImgMod: product.previewImageMode,\r\n InclVat: product.sellPrice ? product.sellPrice.inclVat : null,\r\n includeWarehouseStock: product.showWarehouseStockInfo,\r\n priceVisible: isSellPriceVisible\r\n }\r\n })\r\n .always($.unblockUI)\r\n .done(function (variantProductDetails) {\r\n _updateViewProductWithNewData(variantProductDetails);\r\n\r\n if (enableHistoryState === true) {\r\n _updateHistory(variantProductDetails);\r\n }\r\n\r\n pubsub.publish('variantprocessor.variantproduct.updated', { variantProductDetails, product });\r\n })\r\n .fail(function (errorResponse) {\r\n say.error(errorResponse);\r\n });\r\n\r\n function _updateViewProductWithNewData(newData) {\r\n // Note: all raw prices, discount percent, price2, price3, ean, measurements, weight and all other dimension-specific possible values are not supported at the moment (20.09.2018)\r\n product.isMainProductOfProductWithVariants = newData.IsMainProd;\r\n product.isVariantProductOfProductWithVariants = isVariantProductShown = !newData.IsMainProd;\r\n var $priceFromText = utils.$getProductContainerElements($container, '.js-price-fromtext');\r\n if ($priceFromText.length > 0) {\r\n $priceFromText.toggle(product.isMainProductOfProductWithVariants);\r\n }\r\n\r\n product.productId = newData.ProductID;\r\n $container.data('productid', product.productId);\r\n\r\n product.prodno = newData.ProdNo;\r\n utils.$getProductContainerElements($container, '.js-product-number').text(product.prodno);\r\n\r\n product.title = newData.FullTitle;\r\n utils.$getProductContainerElements($container, '.js-product-title').text(product.title);\r\n\r\n if (externalTracking) {\r\n externalTracking.reportProductDetailsView(product.productId);\r\n }\r\n\r\n if (newData.ImageURL) {\r\n product.mainImage = {\r\n id: newData.ImageID,\r\n title: newData.ImageText,\r\n description: newData.ImageText,\r\n actualWidth: newData.ImageActualWidth,\r\n actualHeight: newData.ImageActualHeight,\r\n thumbnailUrl: newData.ImageRelURL,\r\n previewUrl: newData.ImageURL,\r\n fullSizeUrl: newData.ImageLBURL,\r\n displayWidth: newData.ImagePreviewDisplayWidth,\r\n displayHeight: newData.ImagePreviewDisplayHeight\r\n };\r\n\r\n var $mainImage = utils.$getProductContainerElements($container, '.js-product-mainimage');\r\n if ($mainImage.length > 0) {\r\n $mainImage.attr('src', product.mainImage.previewUrl);\r\n $mainImage.attr('alt', product.mainImage.title);\r\n\r\n $mainImage.attr('data-imageid', product.mainImage.id);\r\n $mainImage.data('imageid', product.mainImage.id);\r\n\r\n if (product.mainImage.displayWidth && product.mainImage.displayHeight) {\r\n $mainImage.attr('width', product.mainImage.displayWidth);\r\n $mainImage.attr('height', product.mainImage.displayHeight);\r\n }\r\n\r\n if (product.galleryId) {\r\n var $mainImageGalleryLink = $mainImage.closest('[data-fancybox=\"' + product.galleryId + '\"]');\r\n if ($mainImageGalleryLink.length === 1) {\r\n $mainImageGalleryLink.attr('href', product.mainImage.fullSizeUrl);\r\n\r\n $mainImageGalleryLink.attr('data-caption', product.mainImage.description);\r\n $mainImageGalleryLink.data('caption', product.mainImage.description);\r\n\r\n $mainImageGalleryLink.attr('data-width', product.mainImage.actualWidth);\r\n $mainImageGalleryLink.data('width', product.mainImage.actualWidth);\r\n\r\n $mainImageGalleryLink.attr('data-height', product.mainImage.actualHeight);\r\n $mainImageGalleryLink.data('height', product.mainImage.actualHeight);\r\n }\r\n }\r\n }\r\n }\r\n\r\n product.stockText = newData.StockText;\r\n product.stockColor = newData.StockColor;\r\n\r\n var oldStockCssClass = product.stockCssClass;\r\n product.stockCssClass = newData.StockCssClass;\r\n\r\n var $stockText = utils.$getProductContainerElements($container, '.js-stock-text');\r\n\r\n if ($container.hasClass(oldStockCssClass)) $container.removeClass(oldStockCssClass);\r\n if ($stockText.hasClass(oldStockCssClass)) $stockText.removeClass(oldStockCssClass);\r\n\r\n if (product.stockCssClass) {\r\n $container.addClass(product.stockCssClass);\r\n $stockText.addClass(product.stockCssClass);\r\n }\r\n\r\n var hasDiscountCssClass = \"has-discount\";\r\n if (newData.HasDiscount && !$container.hasClass(hasDiscountCssClass)) {\r\n if(product.dontShowDiscountForMainProduct && product.isMainProductOfProductWithVariants){\r\n $container.removeClass(hasDiscountCssClass);\r\n } else {\r\n $container.addClass(hasDiscountCssClass);\r\n }\r\n } else if (!newData.HasDiscount && $container.hasClass(hasDiscountCssClass)) {\r\n $container.removeClass(hasDiscountCssClass);\r\n } else if (newData.HasDiscount && $container.hasClass(hasDiscountCssClass) && product.dontShowDiscountForMainProduct && product.isMainProductOfProductWithVariants) {\r\n $container.removeClass(hasDiscountCssClass);\r\n }\r\n\r\n var $vippsHurtigkasseButton = utils.$getProductContainerElements($container, '.js-vipps-hurtigkasse-button');\r\n\r\n const $addProductToCartButton = utils.$getProductContainerElements($container, '.js-batch-buy-button, .js-buy-button');\r\n\r\n if (newData.AllowBuy) {\r\n $vippsHurtigkasseButton.show();\r\n\r\n if($addProductToCartButton.prop(\"disabled\") === true) {\r\n $addProductToCartButton.prop(\"disabled\", false);\r\n }\r\n } else {\r\n $vippsHurtigkasseButton.hide();\r\n\r\n if ($addProductToCartButton.prop(\"disabled\") === false) {\r\n $addProductToCartButton.prop(\"disabled\", true);\r\n }\r\n }\r\n\r\n var stockDataColorVariable = $stockText.data('style-color-variable');\r\n\r\n if ($stockText.length > 0) {\r\n $stockText.text(product.stockText);\r\n if ($stockText.data('update-style-color') !== false) { // for backwards compatibility\r\n $stockText.css('color', product.stockColor || 'inherit');\r\n }\r\n if (stockDataColorVariable) {\r\n if(product.stockColor && product.stockColor.length > 0){\r\n $stockText[0].style.setProperty(stockDataColorVariable, product.stockColor);\r\n } else {\r\n $stockText.removeAttr('style');\r\n }\r\n }\r\n }\r\n\r\n if (product.sellPrice) {\r\n product.sellPrice.formatted = newData.Price;\r\n product.sellPrice.raw = newData.PriceRaw; // not available in the incoming data set\r\n\r\n var $sellPriceFormatted = utils.$getProductContainerElements($container, '.js-sellprice-formatted');\r\n if ($sellPriceFormatted.length > 0) {\r\n if(product.dontShowDiscountForMainProduct && product.isMainProductOfProductWithVariants) {\r\n $sellPriceFormatted.text(product.beforePrice.formatted);\r\n } else {\r\n $sellPriceFormatted.text(product.sellPrice.formatted);\r\n }\r\n }\r\n }\r\n\r\n if (product.sellPriceWithVAT) {\r\n product.sellPriceWithVAT.formatted = newData.PriceInclVat;\r\n delete product.sellPriceWithVAT.raw; // not available in the incoming data set\r\n\r\n var $sellPriceWithVatFormatted = utils.$getProductContainerElements($container, '.js-sellprice-withvat-formatted');\r\n if ($sellPriceWithVatFormatted.length > 0) {\r\n $sellPriceWithVatFormatted.text(product.sellPriceWithVAT.formatted);\r\n }\r\n }\r\n\r\n if (product.sellPriceWithoutVAT) {\r\n product.sellPriceWithoutVAT.formatted = newData.PriceExclVat;\r\n delete product.sellPriceWithoutVAT.raw; // not available in the incoming data set\r\n\r\n var $sellPriceWithoutVatFormatted = utils.$getProductContainerElements($container, '.js-sellprice-withoutvat-formatted');\r\n if ($sellPriceWithoutVatFormatted.length > 0) {\r\n $sellPriceWithoutVatFormatted.text(product.sellPriceWithoutVAT.formatted);\r\n }\r\n }\r\n\r\n if (product.beforePrice) {\r\n product.beforePrice.formatted = newData.OriginalPrice;\r\n delete product.beforePrice.raw; // not available in the incoming data set\r\n\r\n var $beforePriceFormatted = utils.$getProductContainerElements($container, '.js-beforeprice-formatted');\r\n if ($beforePriceFormatted.length > 0) {\r\n var $beforePriceElements = utils.$getProductContainerElements($container, '.js-beforeprice-value, .js-beforeprice-label').add($beforePriceFormatted);\r\n if (newData.HasDiscount) {\r\n if(product.dontShowDiscountForMainProduct && product.isMainProductOfProductWithVariants){\r\n $beforePriceElements.hide();\r\n $beforePriceElements.parent().addClass('no-beforeprice-value');\r\n } else {\r\n $beforePriceFormatted.text(product.beforePrice.formatted);\r\n $beforePriceElements.show();\r\n $beforePriceElements.parent().removeClass('no-beforeprice-value');\r\n }\r\n } else {\r\n $beforePriceElements.hide();\r\n $beforePriceElements.parent().addClass('no-beforeprice-value');\r\n }\r\n }\r\n }\r\n\r\n if (product.discountPrice) {\r\n product.discountPrice.formatted = newData.Discount;\r\n delete product.discountPrice.raw; // not available in the incoming data\r\n\r\n var $discountPriceFormatted = utils.$getProductContainerElements($container, '.js-discountprice-formatted');\r\n if ($discountPriceFormatted.length > 0) {\r\n var $discountPriceElements = utils.$getProductContainerElements($container, '.js-discountprice-value, .js-discountprice-label').add($discountPriceFormatted);\r\n\r\n if (newData.HasDiscount && product.discountPrice.formatted) {\r\n $discountPriceFormatted.text(product.discountPrice.formatted);\r\n\r\n $discountPriceElements.show();\r\n } else {\r\n $discountPriceElements.hide();\r\n }\r\n }\r\n }\r\n\r\n if (product.discountPercent) {\r\n product.discountPercent.formatted = newData.DiscountPercent;\r\n delete product.discountPercent.raw; // not available in the incoming data\r\n\r\n var $discountPercentFormatted = utils.$getProductContainerElements($container, '.js-discountpercent-formatted');\r\n if ($discountPercentFormatted.length > 0) {\r\n var $discountPercentElements = utils.$getProductContainerElements($container, '.js-discountpercent-value, .js-discountpercent-label').add($discountPercentFormatted);\r\n\r\n if (newData.HasDiscount && product.discountPercent.formatted) {\r\n if(product.dontShowDiscountForMainProduct && product.isMainProductOfProductWithVariants){\r\n $discountPercentElements.hide();\r\n } else {\r\n $discountPercentFormatted.text('-' + product.discountPercent.formatted + '%');\r\n $discountPercentElements.show();\r\n }\r\n } else {\r\n $discountPercentElements.hide();\r\n }\r\n }\r\n }\r\n\r\n if (product.discountToDate) {\r\n product.discountToDate.formatted = newData.DiscountToDate;\r\n delete product.discountToDate.raw; // not available in the incoming data\r\n\r\n var $discountToDateFormatted = utils.$getProductContainerElements($container, '.js-discounttodate-formatted');\r\n if ($discountToDateFormatted.length > 0) {\r\n var $discountToDateElements = utils.$getProductContainerElements($container, '.js-discounttodate-value, .js-discounttodate-label, .js-discounttodate').add($discountToDateFormatted);\r\n\r\n if (newData.HasDiscount && product.discountToDate.formatted) {\r\n $discountToDateFormatted.text(product.discountToDate.formatted);\r\n\r\n $discountToDateElements.show();\r\n } else {\r\n $discountToDateElements.hide();\r\n }\r\n }\r\n }\r\n\r\n if (newData.DiscountID) {\r\n console.info(newData.FullTitle + ' - Discount ID: ' + newData.DiscountID);\r\n }\r\n\r\n if (product.comparablePrice) {\r\n product.comparablePrice.formatted = newData.ComparablePrice;\r\n delete product.comparablePrice.raw; // not available in the incoming data set\r\n\r\n var $comparablePriceFormatted = utils.$getProductContainerElements($container, '.js-comparableprice-formatted');\r\n if ($comparablePriceFormatted.length > 0) {\r\n $comparablePriceFormatted.text(product.comparablePrice.formatted);\r\n }\r\n }\r\n\r\n if (product.factorPrice) {\r\n product.factorPrice.formatted = newData.FactorPrice;\r\n delete product.factorPrice.raw; // not available in the incoming data set\r\n\r\n var $factorPriceFormatted = utils.$getProductContainerElements($container, '.js-factor-price-formatted');\r\n if ($factorPriceFormatted.length > 0) {\r\n $factorPriceFormatted.text(product.factorPrice.formatted);\r\n }\r\n }\r\n\r\n if (product.productInFactorPrice) {\r\n product.productInFactorPrice.formatted = newData.ProductInFactorPrice;\r\n delete product.productInFactorPrice.raw; // not available in the incoming data set\r\n\r\n var $productInFactorPriceFormatted = utils.$getProductContainerElements($container, '.js-product-in-factor-price-formatted');\r\n if ($productInFactorPriceFormatted.length > 0) {\r\n $productInFactorPriceFormatted.text(product.productInFactorPrice.formatted);\r\n }\r\n }\r\n\r\n var $replacementProductContainer = utils.$getProductContainerElements($container, '.js-replacement-product-container');\r\n if ($replacementProductContainer.length > 0) {\r\n if (newData.ReplacementProductInfo) {\r\n $replacementProductContainer.empty().html(newData.ReplacementProductInfo).show();\r\n } else {\r\n $replacementProductContainer.empty().hide();\r\n }\r\n }\r\n\r\n priceTotalsController.updatePriceTotals();\r\n\r\n // Supplier order info\r\n setStockStatusTooltip($container, newData, utils);\r\n\r\n // Warehouse stock infos\r\n const warehouseStocks = utils.$getProductContainerElements($container, 'stock-info-list').get(0);\r\n if (warehouseStocks) {\r\n warehouseStocks.setData(newData.warehouseStocks);\r\n }\r\n\r\n // QR code\r\n const qrCode = utils.$getProductContainerElements($container, 'product-qr-print-button').get(0);\r\n if (qrCode) {\r\n qrCode.productIds = [newData.ProductID];\r\n }\r\n }\r\n\r\n function _updateHistory(variantProductDetails) {\r\n if (root.history && typeof (root.history.pushState) !== 'undefined') {\r\n var urlParts = location.href.split('#', 2);\r\n var resultUrl = variantProductDetails.IsMainProd ? $.removeQueryStringParam(urlParts[0], 'dpid') : $.setQueryStringParam(urlParts[0], 'dpid', variantProductDetails.ProductID);\r\n resultUrl = urlParts.length === 1 ? resultUrl : resultUrl + '#' + urlParts[1];\r\n\r\n if (resultUrl !== location.href) {\r\n variantsState.selectedVariantProd = variantProduct;\r\n root.history.pushState(variantsState, null, resultUrl);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function _selectVariantControllersValues(variants, isFromHistory) {\r\n _.each(variantControllers, function (x) {\r\n var preselectVariantTypeValue = _.find(x.variantType.variants, function (y) { return _.indexOf(variants, y.id) !== -1; });\r\n if (preselectVariantTypeValue && preselectVariantTypeValue.id > 0) {\r\n x.selectedValue = preselectVariantTypeValue.id;\r\n x.selector.setSelected(preselectVariantTypeValue.id, isFromHistory);\r\n } else {\r\n say.error('Variant type \"' + x.variantType.name + '\" has no corresponding variant value for the shown variant product. Please check variants configuration for the product.');\r\n }\r\n });\r\n }\r\n\r\n function _onHistoryPopState(evt) {\r\n var state = evt.originalEvent.state;\r\n if (state && state.controlId === product.uniqueId) {\r\n variantsState = state;\r\n suppressVariantChangedEvent = true;\r\n\r\n if (state.selectedVariantProd) {\r\n _selectVariantControllersValues(state.selectedVariantProd.variants, true);\r\n } else {\r\n _.each(variantControllers, function (x) {\r\n x.selectedValue = 0;\r\n x.selector.setSelected(0, true);\r\n });\r\n }\r\n\r\n suppressVariantChangedEvent = false;\r\n _loadVariantProductDetails(variantsState.selectedVariantProd);\r\n _filterUnavailableVariants();\r\n }\r\n }\r\n\r\n function _getVariantControllerById(variantTypeId) {\r\n return variantControllers['vt' + variantTypeId];\r\n }\r\n\r\n function _getVariantControllerByTypeName(variantTypeName) {\r\n var foundController = _.find(variantControllers, function (controller) {\r\n return utils.caseInsensetiveEquals(controller.variantType.name, variantTypeName);\r\n });\r\n\r\n return foundController;\r\n }\r\n\r\n function _selectVariantByName(variantTypeName, variantValueName) {\r\n if (variantTypeName && variantValueName) {\r\n var variantController = _getVariantControllerByTypeName(variantTypeName);\r\n if (variantController) {\r\n variantController.selector.setSelectedByName(variantValueName);\r\n }\r\n }\r\n }\r\n\r\n function _selectVariantByProductId(variantProductId) {\r\n const selectedVariants = _getPreselectedVariants(variantProductId);\r\n _.each(selectedVariants, function (preselectedVariantValue, preselectedVariantType) {\r\n _selectVariantByName(preselectedVariantType, preselectedVariantValue);\r\n });\r\n }\r\n\r\n function _getSelectedVariantProduct(selectedVariantValues) {\r\n var selectedVariantProduct = null;\r\n var isSelectionComplete = _.every(selectedVariantValues, function (x) { return x > 0; });\r\n if (isSelectionComplete) {\r\n var variantProductsForSelection = _getProductsForCurrentSelection();\r\n\r\n if (variantProductsForSelection.length === 0) {\r\n say.warning(metadata['noAvailableVariantProducts']);\r\n } else if (variantProductsForSelection.length === 1) {\r\n selectedVariantProduct = variantProductsForSelection[0];\r\n } else if (variantProductsForSelection.length > 1) {\r\n say.warning(metadata['invalidVariantsConfiguration'] + ' ' + metadata['multipleAvailableVariantProducts']);\r\n }\r\n }\r\n return selectedVariantProduct;\r\n\r\n function _getProductsForCurrentSelection() {\r\n var availableProducts = _.filter(product.variantProducts, function (x) {\r\n return _.every(selectedVariantValues, function (y) { return _.indexOf(x.variants, y) !== -1; });\r\n });\r\n\r\n return availableProducts;\r\n }\r\n }\r\n\r\n function _getSelectedVariants() {\r\n return _.map(variantControllers, function (currentController) {\r\n return currentController.selectedValue || 0;\r\n });\r\n }\r\n\r\n function _getNotSelectedVariants() {\r\n return _.filter(variantControllers, function (x) { return !(x.selectedValue > 0); });\r\n }\r\n\r\n function _isVariantsSelectionValid(prodTitle) {\r\n var notSelectedVariants = _getNotSelectedVariants();\r\n var isSelectionValid = notSelectedVariants.length === 0;\r\n\r\n if (!isSelectionValid) {\r\n var notSelectedVariantNames;\r\n _.each(notSelectedVariants, function (x, idx) {\r\n var name = '' + x.variantType.name + '';\r\n if (idx === 0) {\r\n notSelectedVariantNames = name;\r\n } else if (idx === notSelectedVariants.length - 1) {\r\n notSelectedVariantNames += (' ' + metadata['and'] + ' ' + name);\r\n } else {\r\n notSelectedVariantNames += (', ' + name);\r\n }\r\n });\r\n\r\n say.warning(prodTitle + ' - ' + metadata['pleaseSelect'] + ' ' + notSelectedVariantNames, 10000);\r\n }\r\n\r\n return isSelectionValid;\r\n }\r\n\r\n function _getPreselectedVariants(variantProductId) {\r\n if (variantProductId) {\r\n var variantProduct = _.find(product.variantProducts, function (x) { return x.productId === variantProductId });\r\n if (variantProduct) {\r\n const result = {};\r\n _.each(product.variantTypes, function (x) {\r\n var selectVariantValue = _.find(x.variants, function (y) { return _.indexOf(variantProduct.variants, y.id) !== -1; });\r\n if (selectVariantValue && selectVariantValue.id > 0) {\r\n result[x.name] = selectVariantValue.name;\r\n }\r\n });\r\n return result;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n return {\r\n init: async function () {\r\n const showPricesInclVat = product.sellPrice ? product.sellPrice.inclVat : null;\r\n var promises = [];\r\n\r\n $declaredVariantSelectors.each(function () {\r\n const $selector = $(this);\r\n const viewBuilderName = $selector.data('viewbuilder') || '';\r\n const variantTypeId = $selector.data('varianttypeid');\r\n const loadAdditionalInfoDataAttrValue = $selector.data('loadadditionalinfo');\r\n let loadAdditionalInfo = null;\r\n if (typeof (loadAdditionalInfoDataAttrValue) == 'boolean') {\r\n loadAdditionalInfo = loadAdditionalInfoDataAttrValue;\r\n } else if (typeof (loadAdditionalInfoDataAttrValue) == 'string') {\r\n loadAdditionalInfo = loadAdditionalInfoDataAttrValue === 'true';\r\n } else {\r\n loadAdditionalInfo = product.groupingComponents ? false : true;\r\n }\r\n\r\n promises.push(root.createVariantSelector(viewBuilderName, this, product, variantTypeId, new Map(Object.entries(metadata)), showPricesInclVat, loadAdditionalInfo));\r\n\r\n const variantType = _.find(product.variantTypes, function (x) { return x.id === variantTypeId; });\r\n const variantController = {\r\n variantType: variantType,\r\n selectedValue: 0,\r\n selector: null,\r\n $elem: $selector\r\n };\r\n\r\n const variantControllerKey = 'vt' + variantTypeId;\r\n variantControllers[variantControllerKey] = variantController;\r\n });\r\n\r\n await Promise.all(promises).then(function (selectors) {\r\n _.each(selectors, function (selector) {\r\n if (typeof selector !== 'undefined') {\r\n selector.render();\r\n\r\n const variantTypeId = selector.variantType.id;\r\n const variantControllerKey = 'vt' + variantTypeId;\r\n variantControllers[variantControllerKey].selector = selector;\r\n }\r\n });\r\n\r\n variantControllers = Object.keys(variantControllers)\r\n .filter(key => variantControllers[key].selector !== null)\r\n .reduce((newObj, key) => {\r\n newObj[key] = variantControllers[key];\r\n return newObj;\r\n }, {});\r\n\r\n $declaredVariantSelectors.on('variantselector:changed', function (evt, changedVariantType, newVariantValue) {\r\n if (!suppressVariantChangedEvent) {\r\n _onVariantSelectionChanged(changedVariantType, newVariantValue);\r\n\r\n // If the single available variant is changing itself, then it is nothing to filter.\r\n if (_.keys(variantControllers).length > 1) {\r\n _filterUnavailableVariants(newVariantValue);\r\n }\r\n }\r\n });\r\n\r\n _filterUnavailableVariants(); // Initial filtering of variants that have no available products at all\r\n _processVariants();\r\n\r\n var initialVariantProduct = _.find(product.variantProducts, function (x) { return x.productId === product.productId; });\r\n if (initialVariantProduct) {\r\n variantsState.selectedVariantProd = initialVariantProduct;\r\n // Pre-select if variant product is shown initially\r\n suppressVariantProductDetailsLoading = true; // Suppress variant product loading while preselecting variants for already loaded variant products\r\n\r\n _selectVariantControllersValues(initialVariantProduct.variants, false);\r\n\r\n isVariantProductShown = true;\r\n\r\n suppressVariantProductDetailsLoading = false; // Restore variant product loading on variants change\r\n } else if (!_.isEmpty(preselectedVariants)) {\r\n _.each(preselectedVariants, function (preselectedVariantValue, preselectedVariantType) { _selectVariantByName(preselectedVariantType, preselectedVariantValue); });\r\n }\r\n\r\n if (enableHistoryState === true) {\r\n if (root.history && typeof (root.history.replaceState) !== 'undefined') {\r\n root.history.replaceState(variantsState, null, null);\r\n }\r\n\r\n $(root).on('popstate', _onHistoryPopState);\r\n }\r\n }).catch((error) => { console.error(error); });\r\n },\r\n $selectors: $declaredVariantSelectors,\r\n getSelectedVariantProduct: function () {\r\n var selectedVariantValues = _getSelectedVariants();\r\n return _getSelectedVariantProduct(selectedVariantValues);\r\n },\r\n getNotSelectedVariants: _getNotSelectedVariants,\r\n selectVariantByName: _selectVariantByName,\r\n selectVariantByProductId: _selectVariantByProductId,\r\n isVariantsSelectionValid: _isVariantsSelectionValid,\r\n };\r\n }\r\n\r\n async function initVariantsProcessor(options, variantProcessorsMap) {\r\n var processor = new variantsProcessor(options.$productContainer, options.productModel, options.metadata, options.preselectedVariants, options.say, options.pubsub, options.priceTotals,\r\n options.quantityDiscountsProcessorInstance, options.externalTrackingProcessorInstance, options.utils, options.enableHistoryState);\r\n\r\n variantProcessorsMap[options.productModel.uniqueId] = processor;\r\n await processor.init();\r\n }\r\n\r\n function setStockStatusTooltip($container, model, utils) {\r\n const stockStatusTooltip = utils.$getProductContainerElements($container, 'cms-tooltip').get(0);\r\n if (stockStatusTooltip) {\r\n let supplierOrderInfo = stockStatusTooltip.shadowRoot.querySelector('supplier-order-info');\r\n let stockTextTooltip = stockStatusTooltip.shadowRoot.querySelector('.js-stock-text-tooltip');\r\n let $stockTextInfoIcon = utils.$getProductContainerElements($container, '.js-stock-text-info');\r\n let showStockStatusTooltip = model.stockStatusTooltipInfo?.length > 0 || (supplierOrderInfo && (model.inSupplierOrder || model.InSupplierOrder));\r\n stockStatusTooltip.visible = showStockStatusTooltip;\r\n\r\n if (!showStockStatusTooltip) {\r\n $stockTextInfoIcon.hide();\r\n return;\r\n }\r\n\r\n let tooltipText = model.stockStatusTooltipInfo.replace(/\\n/g, \"
\");\r\n stockTextTooltip.innerHTML = tooltipText;\r\n\r\n if (model.inSupplierOrder || model.InSupplierOrder) {\r\n supplierOrderInfo.update(model.ProductID).then(() => {\r\n if (stockTextTooltip && supplierOrderInfo?.hasSupplierOrderInfo && model.stockStatusTooltipInfo?.length > 0) {\r\n stockTextTooltip.innerHTML = tooltipText;\r\n }\r\n });\r\n }\r\n\r\n $stockTextInfoIcon.show();\r\n }\r\n }\r\n\r\n // Cart processor\r\n function cartProcessor($view, model, say, pubsub, variantProcessorsMap, utils, priceTotals) {\r\n var estore = root.PublicEStore;\r\n var productsInCartMap = {};\r\n var productsToCustomFieldIdsForOrderMap = {};\r\n var vippsDialogModule = null;\r\n var vippsDialog = null;\r\n var shouldResetOnDecisionCallback = false;\r\n function _addToCart(addToCartContracts, $handler) {\r\n $view.addClass('buying');\r\n $.when(estore.addToCart(addToCartContracts))\r\n .always(function () { $view.removeClass('buying'); })\r\n .done(function (dataContract) {\r\n pubsub.publish('frontend.productview.product.isbought');\r\n $handler.addClass('is-bought');\r\n setTimeout(function () {\r\n $handler.removeClass('is-bought');\r\n }, 2000);\r\n\r\n if (dataContract.status.toLowerCase() !== 'ok') {\r\n if (dataContract.result.items && dataContract.result.items.length) {\r\n _.each(dataContract.result.items, function (resultItem) {\r\n var itemStatus = resultItem.status.toLowerCase();\r\n var productModel = _getFirstProductModelByProductId(resultItem.productID);\r\n var statusMessage = [productModel.title, resultItem.message].join(' - ');\r\n switch (itemStatus) {\r\n case 'error':\r\n say.error(statusMessage);\r\n break;\r\n case 'warning':\r\n say.warning(statusMessage);\r\n break;\r\n }\r\n });\r\n } else {\r\n _showPublicEStoreError(dataContract);\r\n }\r\n } else {\r\n if (model.tempOrderLineId > 0) {\r\n root.location.href = model.cartUrl;\r\n }\r\n }\r\n })\r\n .fail(_showPublicEStoreError);\r\n }\r\n\r\n function _showPublicEStoreError(pefContract) {\r\n var exractedMessage;\r\n\r\n if (typeof pefContract === 'string') {\r\n exractedMessage = pefContract;\r\n } else {\r\n exractedMessage = pefContract.result && pefContract.result.items[0] ? pefContract.result.items[0].message : pefContract.message;\r\n }\r\n\r\n say.error(exractedMessage);\r\n }\r\n\r\n function _getCustomFieldsContract($container, customFieldIdsForOrder) {\r\n var customFields = {};\r\n var $customFieldControls = utils.$getProductContainerElements($container, '.js-custom-field');\r\n\r\n $customFieldControls.each(function () {\r\n var $customFieldControl = $(this);\r\n var customFieldId = $customFieldControl.data('customfieldid');\r\n var customFieldValue = $customFieldControl.is(':checkbox') ? $customFieldControl.is(':checked').toString() : $customFieldControl.val();\r\n\r\n if (_.indexOf(customFieldIdsForOrder, customFieldId) !== -1 && typeof customFieldValue !== 'undefined') {\r\n customFields[customFieldId] = customFieldValue;\r\n }\r\n });\r\n\r\n return customFields;\r\n }\r\n\r\n function _isFormValid($container, prodTitle) {\r\n var isFormValid = true;\r\n\r\n // Trigger jquery form validation\r\n var validator = $container.validate({ ignore: [] });\r\n var $requiredFields = utils.$getProductContainerElements($container, '[data-rule-required]');\r\n $requiredFields.each(function () {\r\n var $requiredField = $(this);\r\n isFormValid &= validator.element($requiredField);\r\n });\r\n\r\n if (!isFormValid) {\r\n say.warning(prodTitle + ' - ' + model.metadata['formIsInvalid']);\r\n }\r\n\r\n return isFormValid;\r\n }\r\n\r\n function _isQuantityValid(minQuantity, quantity, prodTitle) {\r\n\r\n var isQuantityValid = true;\r\n\r\n if (minQuantity && quantity < minQuantity) {\r\n say.warning(prodTitle + ' - ' + model.metadata['minQuantityIs'] + ' ' + minQuantity);\r\n isQuantityValid = false;\r\n }\r\n\r\n return isQuantityValid;\r\n }\r\n\r\n function _toggleCartIndicator(animate) {\r\n // Works for the general product only, not for additionals.\r\n var variantProductIds = model.variantProducts != null ? $.map(model.variantProducts, function (variant) { return variant.productId; }) : null;\r\n var displayedProductId = model.productId;\r\n var isMainProductDisplayed = model.isMainProductOfProductWithVariants;\r\n\r\n // Find if displayed product is in cart and collect its quantity-in-cart value.\r\n // If the displayed product is main product of a product with variants then sum up quantity-in-carts of all its variant products.\r\n var numberQuantityInCart = _.reduce(productsInCartMap, function (memo, qtyInCart, productId) {\r\n productId = parseInt(productId);\r\n\r\n var includeQtyInCart = productId === displayedProductId || isMainProductDisplayed && _.indexOf(variantProductIds, productId) > -1;\r\n\r\n return memo + (includeQtyInCart ? qtyInCart : 0);\r\n }, 0);\r\n\r\n var isProductInCart = numberQuantityInCart > 0;\r\n\r\n var $cartQuantity = utils.$getProductContainerElements($view, '.js-cart-quantity');\r\n var $cartIndicator = utils.$getProductContainerElements($view, '.js-cart-indicator');\r\n\r\n $cartQuantity.text(numberQuantityInCart);\r\n $cartQuantity.toggle(isProductInCart);\r\n\r\n if (isProductInCart) {\r\n if ($cartIndicator.length > 0) {\r\n $cartIndicator.show();\r\n if (animate) {\r\n $view.effect('transfer', { to: $cartIndicator }, 500, function () { $cartIndicator.effect('bounce', null, 500); });\r\n }\r\n }\r\n } else {\r\n $cartIndicator.hide();\r\n }\r\n }\r\n\r\n function _addToCartHandler(topic, dataContract) {\r\n var currentProduct = _findCurrentProductInTheContract(dataContract);\r\n if (currentProduct) {\r\n productsInCartMap[currentProduct.productID] = currentProduct.totalQuantityInTempOrderLine;\r\n _toggleCartIndicator(true);\r\n }\r\n }\r\n\r\n function _removeFromCartHandler(topic, dataContract) {\r\n _.each(dataContract.result.items, function (x) {\r\n if (x.status.toLowerCase() === 'ok') {\r\n var deletedProductId = x.productID;\r\n delete productsInCartMap[deletedProductId];\r\n\r\n var isVariantProductOfDisplayedMainProductDeleted = model.isMainProductOfProductWithVariants && _.some(model.variantProducts, function (variantProd) {\r\n return variantProd.productId === deletedProductId;\r\n });\r\n if (deletedProductId === model.productId || isVariantProductOfDisplayedMainProductDeleted) {\r\n _toggleCartIndicator();\r\n }\r\n }\r\n });\r\n }\r\n\r\n function _emptyCartHandler(topic, dataContract) {\r\n if (dataContract.status.toLowerCase() === 'ok') {\r\n productsInCartMap = {};\r\n\r\n _toggleCartIndicator();\r\n }\r\n }\r\n\r\n function _getCartInfoHandler(topic, dataContract) {\r\n var cartInfo = dataContract.result.detailedCartInfo;\r\n\r\n if (dataContract.status.toLowerCase() === 'ok') {\r\n productsInCartMap = {};\r\n\r\n if (cartInfo.products && cartInfo.products.length > 0) {\r\n _.each(cartInfo.products, function (x) {\r\n productsInCartMap[x.productID] = (productsInCartMap[x.productID] || 0) + x.quantity;\r\n });\r\n }\r\n\r\n _toggleCartIndicator();\r\n }\r\n }\r\n\r\n function _findCurrentProductInTheContract(contract) {\r\n var currentProduct = _.find(contract.result.items, function (x) {\r\n return x && x.status.toLowerCase() === 'ok' && (x.productID === model.productId || model.additionalProducts && model.additionalProducts.filter(function (value) { return value.productId === x.productID; }).length > 0);\r\n });\r\n\r\n return currentProduct;\r\n }\r\n\r\n function _getProductModelByUniqueId(uniqueId) {\r\n var productModel = null;\r\n\r\n if (uniqueId) {\r\n if (model.uniqueId === uniqueId) {\r\n // General product ᕦ(ò_óˇ)ᕤ\r\n productModel = model;\r\n } else {\r\n // Try find the product in additionals\r\n if (!productModel && model.additionalProducts) {\r\n productModel = model.additionalProducts.find(function (additionalProduct) { return additionalProduct.uniqueId === uniqueId; });\r\n }\r\n\r\n if (!productModel && model.packageComponentProducts) {\r\n productModel = model.packageComponentProducts.find(function (componentProduct) { return componentProduct.uniqueId === uniqueId; });\r\n }\r\n\r\n if (!productModel && model.groupingComponents) {\r\n model.groupingComponents.every(groupingComponent => {\r\n if (productModel) {\r\n return false;\r\n }\r\n productModel = groupingComponent.componentProducts.find(groupingComponentProduct => groupingComponentProduct.uniqueId === uniqueId);\r\n return true;\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (!productModel) {\r\n console.warn(`Product model was not found by unique id ${uniqueId}`);\r\n }\r\n return productModel;\r\n }\r\n\r\n function _getFirstProductModelByProductId(productId) {\r\n var productModel = null;\r\n\r\n productId = parseInt(productId);\r\n\r\n if (productId) {\r\n if (model.productId === productId) {\r\n // General product ᕦ(ò_óˇ)ᕤ\r\n productModel = model;\r\n }\r\n\r\n if (!productModel && model.additionalProducts) {\r\n // Try find the product in additionals\r\n productModel = model.additionalProducts.find(function (additionalProduct) { return additionalProduct.productId === productId; });\r\n }\r\n\r\n if (!productModel && model.packageComponentProducts) {\r\n productModel = model.packageComponentProducts.find(function (componentProduct) { return componentProduct.productId === productId; });\r\n }\r\n\r\n if (!productModel && model.groupingComponents) {\r\n model.groupingComponents.every(groupingComponent => {\r\n if (productModel) {\r\n return false;\r\n }\r\n productModel = groupingComponent.componentProducts.find(groupingComponentProduct => groupingComponentProduct.productId === productId);\r\n return true;\r\n });\r\n }\r\n }\r\n\r\n if (!productModel) {\r\n console.warn(`First product model was not found by product id ${productId}`);\r\n }\r\n return productModel;\r\n }\r\n\r\n function _getAddToCartContractFromContainer($productContainer, buyType, parentProductId, parentProductUniqueId, packageQuantity) {\r\n var addToCartContracts = null;\r\n\r\n const productUniqueId = $productContainer.data('uniqueid');\r\n const productKey = $productContainer.data('uniquekey');\r\n const productType = $productContainer.data('producttype') || 'Product';\r\n var productModel = _getProductModelByUniqueId(productUniqueId);\r\n\r\n var customFieldIdsForOrder = productsToCustomFieldIdsForOrderMap[productModel.productId] ? productsToCustomFieldIdsForOrderMap[productModel.productId] : [];\r\n if (!customFieldIdsForOrder.length) {\r\n _.each(productModel.customFields, function (x) {\r\n if ((x.displayType === 'editable' || x.displayType === 'hidden') && x.includeInOrder) {\r\n customFieldIdsForOrder.push(x.id);\r\n }\r\n });\r\n productsToCustomFieldIdsForOrderMap[productModel.productId] = customFieldIdsForOrder;\r\n }\r\n\r\n var quantity = 0;\r\n var fraction = 0;\r\n\r\n switch ((buyType || '').toLowerCase()) {\r\n case 'fraction':\r\n fraction = utils.tryParseNumberOrDefault($productContainer.find('.js-fraction').val());\r\n break;\r\n case 'factor':\r\n quantity = $productContainer.find('.js-quantity').val() || 1;\r\n break;\r\n case 'package':\r\n var packageSize = productModel.packageSize || 1;\r\n var packageQty = $productContainer.find('.js-package-quantity').val() || 1;\r\n quantity = packageQty * packageSize;\r\n break;\r\n case 'package_component':\r\n quantity = productModel.initialQuantity.raw * packageQuantity;\r\n break;\r\n case 'grouping_product_component':\r\n quantity = utils.tryParseNumberOrDefault($productContainer.find('.js-quantity').val(), 1) * packageQuantity;\r\n break;\r\n default:\r\n quantity = utils.tryParseNumberOrDefault($productContainer.find('.js-quantity').val(), 1);\r\n fraction = utils.tryParseNumberOrDefault($productContainer.find('.js-fraction').val());\r\n break;\r\n }\r\n\r\n var minQuantity = productModel.minQuantity ? productModel.minQuantity.raw : undefined;\r\n\r\n if (_isFormValid($productContainer, productModel.title) && _isQuantityValid(minQuantity, quantity, productModel.title)) {\r\n var productVariantsProcessor = variantProcessorsMap[productModel.uniqueId];\r\n if (!productVariantsProcessor || productVariantsProcessor.isVariantsSelectionValid(productModel.title)) {\r\n\r\n var packageComponents = null, groupingComponentProducts = null, hasError = false;\r\n\r\n if (productModel.packageComponentProducts) {\r\n packageComponents = [];\r\n var $packageComponentsContainer = utils.$getProductContainerElements($productContainer, '.js-component-products-list');\r\n _.each(productModel.packageComponentProducts, function (packageComponent) {\r\n var $componentProductContainer = $packageComponentsContainer.find('.js-component-product[data-uniqueid=\"' + packageComponent.uniqueId + '\"]');\r\n var componentContracts = _getAddToCartContractFromContainer($componentProductContainer, 'package_component', productModel.productId, productModel.uniqueId, quantity);\r\n if (componentContracts) {\r\n packageComponents = packageComponents.concat(componentContracts);\r\n } else {\r\n hasError = true;\r\n }\r\n });\r\n }\r\n\r\n if (productModel.groupingComponents) {\r\n groupingComponentProducts = [];\r\n var $groupingProductContainer = utils.$getProductContainerElements($productContainer, '.js-grouping-product-container');\r\n productModel.groupingComponents.forEach(groupingComponent => {\r\n groupingComponent.componentProducts.forEach(groupingComponentProduct => {\r\n const $groupingProductProductContainer = $groupingProductContainer.find('.js-grouping-product[data-uniqueid=\"' + groupingComponentProduct.uniqueId + '\"]');\r\n let isSelected = $groupingProductProductContainer.data('isselected');\r\n isSelected = typeof (isSelected) === 'boolean' ? isSelected : false;\r\n if (isSelected) {\r\n var groupingProductContracts = _getAddToCartContractFromContainer($groupingProductProductContainer, 'grouping_product_component', productModel.productId, productModel.uniqueId, quantity);\r\n if (groupingProductContracts) {\r\n groupingComponentProducts = groupingComponentProducts.concat(groupingProductContracts);\r\n } else {\r\n hasError = true;\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n if (!hasError) {\r\n var addToCartContract = {\r\n productKey: productKey,\r\n productId: productModel.productId,\r\n productType: productType,\r\n parentProductId: parentProductId,\r\n quantity: quantity,\r\n fraction: fraction,\r\n customFields: _getCustomFieldsContract($productContainer, customFieldIdsForOrder),\r\n tempOrderLineId: productModel.tempOrderLineId,\r\n imageId: productModel.mainImage ? productModel.mainImage.id : undefined,\r\n componentOfPackageProductID: buyType === 'package_component' ? parentProductUniqueId : null,\r\n };\r\n\r\n addToCartContracts = [addToCartContract];\r\n\r\n if (packageComponents) {\r\n addToCartContract.packageProductID = productModel.uniqueId;\r\n addToCartContracts = addToCartContracts.concat(packageComponents);\r\n }\r\n\r\n if (groupingComponentProducts) {\r\n addToCartContracts = addToCartContracts.concat(groupingComponentProducts);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return addToCartContracts;\r\n }\r\n\r\n function _processVippsHurtigkasseCheckout(vippsHurtigkasseComponent) {\r\n $.when(_prepareCartForCheckout()).then(function (proceedToCheckout) {\r\n if (proceedToCheckout) {\r\n vippsHurtigkasseComponent.startCheckout(true);\r\n }\r\n }, _showPublicEStoreError);\r\n\r\n function _prepareCartForCheckout() {\r\n const deferred = $.Deferred();\r\n\r\n $.when(estore.getTempOrderLines(null, true)).then(function (tempOrderLinesResult) {\r\n\r\n if (tempOrderLinesResult.status.toLowerCase() === 'ok') {\r\n const areOtherProductsInCart = tempOrderLinesResult.result.items.length > 0;\r\n if (areOtherProductsInCart) {\r\n\r\n var $productContainer = utils.$getProductContainerFor(vippsHurtigkasseComponent);\r\n var addToCartContract = _getAddToCartContractFromContainer($productContainer);\r\n\r\n if (addToCartContract) {\r\n const lines = tempOrderLinesResult && tempOrderLinesResult.result ? tempOrderLinesResult.result.items : null;\r\n\r\n const currentGroupPrices = priceTotals.getCurrentTotals();\r\n const mainPriceGroup = currentGroupPrices && currentGroupPrices.length ? currentGroupPrices.find((g) => !g.group) : null;\r\n\r\n let productPrice = null;\r\n\r\n if (mainPriceGroup) {\r\n productPrice = mainPriceGroup.priceRaw;\r\n } else {\r\n const quantity = utils.tryParseNumberOrDefault($view.find('.js-quantity').val(), 1);\r\n productPrice = model.sellPrice.raw * quantity;\r\n }\r\n\r\n const currentCartSum = lines ? lines.map((i) => i.linePrice).reduce((a, c) => a + c, 0) : 0;\r\n const currentCartQuantity = lines ? lines.map((i) => i.quantity).reduce((a, c) => a + c, 0) : 0;\r\n\r\n const dialogData = {\r\n cartLink: model.cartUrl,\r\n cartCount: currentCartQuantity,\r\n cartSum: currentCartSum + productPrice,\r\n productPrice: productPrice\r\n };\r\n\r\n if (vippsDialog) {\r\n if (shouldResetOnDecisionCallback) {\r\n vippsDialog.setOnDecision(_onDecision);\r\n shouldResetOnDecisionCallback = false;\r\n }\r\n vippsDialog.show(dialogData);\r\n } else {\r\n vippsDialogModule.then((module) => {\r\n vippsDialog = new module.VippsBuyProductDialog(_onDecision);\r\n\r\n $view.append(vippsDialog);\r\n\r\n vippsDialog.show(dialogData);\r\n });\r\n }\r\n }\r\n } else {\r\n _addToCartAndResolveDeferred();\r\n }\r\n } else {\r\n deferred.reject(dataContract);\r\n }\r\n }, deferred.reject);\r\n\r\n return deferred.promise();\r\n\r\n function _onDecision(decision) {\r\n if (decision === 'only-product') {\r\n $.when(estore.emptyCart()).then(function () {\r\n _addToCartAndResolveDeferred();\r\n }, deferred.reject);\r\n } else if (decision === 'whole-cart') {\r\n _addToCartAndResolveDeferred();\r\n } else {\r\n console.warn('Unsupported decision from Vipps dialog: ' + decision);\r\n }\r\n\r\n }\r\n\r\n function _addToCartAndResolveDeferred() {\r\n var $productContainer = utils.$getProductContainerFor(vippsHurtigkasseComponent);\r\n var addToCartContract = _getAddToCartContractFromContainer($productContainer);\r\n\r\n if (addToCartContract) {\r\n $.when(estore.addToCart(addToCartContract, null, true)).then(function (addToCartResult) {\r\n if (addToCartResult.status.toLowerCase() === 'ok') {\r\n deferred.resolve(true);\r\n } else {\r\n deferred.reject(addToCartResult);\r\n }\r\n }, deferred.reject);\r\n } else {\r\n deferred.reject();\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n init: function () {\r\n estore.subscribe('estore.callback.shopcart.addtocart', _addToCartHandler);\r\n estore.subscribe('estore.callback.shopcart.removefromcart', _removeFromCartHandler);\r\n estore.subscribe('estore.callback.shopcart.emptycart', _emptyCartHandler);\r\n estore.subscribe('estore.callback.shopcart.getdetailedcartinfo', _getCartInfoHandler);\r\n\r\n $.when(estore.getDetailedCartInfo());\r\n\r\n var mainProductVariants = variantProcessorsMap[model.uniqueId];\r\n if (mainProductVariants) {\r\n pubsub.subscribe('variantprocessor.variantproduct.updated', function () { _toggleCartIndicator(); });\r\n }\r\n\r\n $view.find('.js-buy-button,.js-buy-additional-product-button').on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n var $buyButton = $(this);\r\n\r\n var $productContainer = utils.$getProductContainerFor(this);\r\n var buyType = $buyButton.data('buy-type');\r\n\r\n var addToCartContract = _getAddToCartContractFromContainer($productContainer, buyType);\r\n if (addToCartContract) {\r\n _addToCart(addToCartContract, $buyButton);\r\n }\r\n });\r\n\r\n $view.find('.js-batch-buy-button').on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n // Collect all products with quantity > 0\r\n var addToCartContracts = [];\r\n var allContractsAreValid = true;\r\n $view.find('.js-quantity').each(function () {\r\n var $quantity = $(this);\r\n var quantity = utils.tryParseNumberOrDefault($quantity.val());\r\n\r\n var contracts = null;\r\n if (quantity > 0) {\r\n var $prodContainer = utils.$getProductContainerFor($quantity);\r\n contracts = _getAddToCartContractFromContainer($prodContainer);\r\n if (contracts) {\r\n addToCartContracts = addToCartContracts.concat(contracts);\r\n } else {\r\n allContractsAreValid = false;\r\n }\r\n }\r\n });\r\n\r\n if (addToCartContracts.length) {\r\n if (allContractsAreValid) {\r\n _addToCart(addToCartContracts, $(this));\r\n }\r\n } else if (allContractsAreValid) {\r\n say.warning(model.metadata['nothingToBuy']);\r\n }\r\n });\r\n\r\n var vippsHurtigkasse = $view.find('vipps-hurtigkasse');\r\n\r\n if (vippsHurtigkasse && vippsHurtigkasse.length) {\r\n importShim('/components/checkout/vipps/cms-vipps-hurtigkasse.js');\r\n vippsDialogModule = importShim('/components/checkout/vipps/vipps-buy-product-dialog.js');\r\n\r\n vippsHurtigkasse.on('onbeforestart', function (evt) {\r\n evt.preventDefault();\r\n\r\n _processVippsHurtigkasseCheckout(evt.target);\r\n });\r\n\r\n window.addEventListener(\"pagehide\", (evt) => {\r\n if (evt.persisted) {\r\n jQuery.unblockUI();\r\n shouldResetOnDecisionCallback = true;\r\n }\r\n })\r\n }\r\n\r\n utils.initQuantityModifyButtons($view, '.js-quantity-modify-btn'); // deprecated from product view v2.7.0, left for backwards compatibility\r\n utils.initQuantityModifyButtons2($view, '.js-plus-minus-container');\r\n }\r\n };\r\n }\r\n\r\n // Flags processor\r\n function flagsProcessor($view, model) {\r\n var flagsHandlerUrl = root.R + 'startup/api/v1/acrhive/flags/connections/visible';\r\n var itemId = model.itemId;\r\n\r\n function _getFlags() {\r\n $.get(flagsHandlerUrl, { itemIds: [itemId], archiveType: 20, })\r\n .done(function (data) {\r\n if (!_.isEmpty(data)) {\r\n var flags = data[itemId];\r\n\r\n var $flagsTarget = $view.find('.js-flags-target');\r\n _.each(flags, function (flagDetails) {\r\n var $flag = $('',\r\n {\r\n 'class': 'flag flag-' + flagDetails.FlagID,\r\n text: flagDetails.Name,\r\n data: flagDetails\r\n });\r\n\r\n $flag.appendTo($flagsTarget);\r\n\r\n var replaceEmptyString = flagDetails.Name.replace(/\\s+/g, \"-\").toLowerCase();\r\n $('.uc-product-view').addClass(replaceEmptyString + ' flag-' + flagDetails.FlagID + '-' + replaceEmptyString);\r\n });\r\n }\r\n });\r\n }\r\n\r\n return {\r\n init: function () {\r\n _getFlags();\r\n }\r\n }\r\n }\r\n\r\n // Rating processor\r\n function ratingProcessor($view, model, pubsub) {\r\n var itemId = model.itemId;\r\n\r\n function _updateRating() {\r\n $.ajax({\r\n url: root.R + 'handlers/public/productdata.ashx?a=getrating&itemid=' + itemId,\r\n type: 'GET'\r\n })\r\n .done(function (ratingData) {\r\n // Update data model\r\n model.rating = ratingData.rating;\r\n model.commentsCount = ratingData.commentsCount;\r\n model.ratingsCount = ratingData.ratingsCount;\r\n model.hasUserPostedReview = ratingData.hasUserPostedReview;\r\n\r\n // Update UI\r\n _buildRatingView();\r\n\r\n $view.find('.js-add-review').toggle(!model.hasUserPostedReview);\r\n\r\n $view.find('.js-rating-comments-count').text(ratingData.commentsCount);\r\n $view.find('.js-rating-ratings-count').text(ratingData.commentsCount);\r\n });\r\n }\r\n\r\n function _buildRatingView() {\r\n var ratingTemplate = '<% _.each(stars, function(star){ %>\" aria-hidden=\"true\"><% }); %>';\r\n var ratingModel = { stars: _buildStars() };\r\n\r\n var $ratingHtml = _.template(ratingTemplate, ratingModel);\r\n\r\n $view.find('.js-rating-container').empty().append($ratingHtml);\r\n\r\n function _buildStars() {\r\n var starsCount = 5;\r\n var starredRatingValue = model.rating * starsCount;\r\n\r\n var stars = [];\r\n\r\n for (var wholeStar = 1; wholeStar <= starredRatingValue; wholeStar++) {\r\n stars.push('whole');\r\n }\r\n\r\n var incompleteStarValue = starredRatingValue - stars.length;\r\n if (incompleteStarValue > 0) {\r\n stars.push(incompleteStarValue > 0.5 ? 'whole' : 'half');\r\n }\r\n\r\n var emptyStars = starsCount - stars.length;\r\n for (var emptyStar = 0; emptyStar < emptyStars; emptyStar++) {\r\n stars.push('empty');\r\n }\r\n\r\n return stars;\r\n }\r\n }\r\n\r\n return {\r\n init: function () {\r\n $(function () {\r\n _buildRatingView();\r\n\r\n pubsub.subscribe('reviewscontrol.reviewaction', function (topic, itemId) {\r\n if (itemId === model.itemId) {\r\n _updateRating();\r\n }\r\n });\r\n\r\n $view.find('.js-add-review').click(function (evt) {\r\n evt.preventDefault();\r\n\r\n pubsub.publish('reviewscontrol.focus', model.itemId);\r\n });\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Print processor\r\n function printProcessor($view, model) {\r\n return {\r\n init: function () {\r\n $view.find('.js-print-button').on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n if (model.printPath) {\r\n var printUrl = root.R + model.printPath + '?ItemID=' + model.itemId + '&ProductID=' + model.productId;\r\n root.open(printUrl, 'remote', 'resizable=yes,status=0,menubar=0,scrollbars=1,left=0,top=0,width=780,height=950,location=0');\r\n } else {\r\n console.error('Print handler is not configured on the website');\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n // PDF processor\r\n function pdfProcessor($view, model) {\r\n return {\r\n init: function () {\r\n $view.find('.js-downloadpdf-button').on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n var pdfUrl = root.R + 'RenderToPdf.aspx?ProductID=' + model.productId;\r\n if (model.pdfTemplateId > 0) {\r\n pdfUrl += '&TemplateID=' + model.pdfTemplateId;\r\n }\r\n\r\n root.open(pdfUrl, '_blank');\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Gallery processor\r\n function galleryProcessor($view, model) {\r\n var fancyboxInstance;\r\n var fancyboxOptions = {\r\n selector: '[data-fancybox=\"' + model.galleryId + '\"]',\r\n loop: true,\r\n hash: false\r\n };\r\n\r\n return {\r\n init: function () {\r\n fancyboxInstance = $view.fancybox(fancyboxOptions);\r\n }\r\n }\r\n }\r\n\r\n // Shopping list & wish list processor\r\n function shoppingListProcessor($view, model, say, utils, variantProcessorsMap) {\r\n function _isVariantsSelectionValid(productVariantsProcessor) {\r\n var isSelectionValid;\r\n\r\n if (typeof productVariantsProcessor !== 'undefined' && productVariantsProcessor !== null) {\r\n var notSelectedVariants = productVariantsProcessor.getNotSelectedVariants();\r\n isSelectionValid = notSelectedVariants.length === 0;\r\n\r\n if (!isSelectionValid) {\r\n var notSelectedVariantNames;\r\n _.each(notSelectedVariants, function (x, idx) {\r\n var name = '' + x.variantType.name + '';\r\n if (idx === 0) {\r\n notSelectedVariantNames = name;\r\n } else if (idx === notSelectedVariants.length - 1) {\r\n notSelectedVariantNames += (' ' + model.metadata['and'] + ' ' + name);\r\n } else {\r\n notSelectedVariantNames += (', ' + name);\r\n }\r\n });\r\n\r\n say.warning(model.metadata['pleaseSelect'] + ' ' + notSelectedVariantNames + ' ' + model.metadata['toAddToShoppingList']);\r\n }\r\n } else {\r\n isSelectionValid = true;\r\n }\r\n\r\n return isSelectionValid;\r\n }\r\n\r\n return {\r\n init: function () {\r\n $view.find('.js-add-to-shopping-list-btn').click(function (evt) {\r\n evt.preventDefault();\r\n\r\n var $productContainer = utils.$getProductContainerFor(this);\r\n var productUniqueId = $productContainer.data('uniqueid');\r\n var productVariantsProcessor = variantProcessorsMap[productUniqueId];\r\n\r\n if (_isVariantsSelectionValid(productVariantsProcessor)) {\r\n var addType = $(this).data('add-type');\r\n\r\n var quantity = 0;\r\n var fraction = 0;\r\n\r\n switch ((addType || '').toLowerCase()) {\r\n case 'fraction':\r\n fraction = utils.tryParseNumberOrDefault($productContainer.find('.js-fraction').val());\r\n break;\r\n case 'factor':\r\n quantity = $productContainer.find('.js-quantity').val() || 1;\r\n break;\r\n default:\r\n quantity = utils.tryParseNumberOrDefault($productContainer.find('.js-quantity').val(), 1);\r\n fraction = utils.tryParseNumberOrDefault($productContainer.find('.js-fraction').val());\r\n break;\r\n }\r\n\r\n var contractForShoppingList = [\r\n {\r\n productId: model.productId,\r\n imageId: model.mainImage.id,\r\n quantity: quantity,\r\n fraction: fraction,\r\n customFields: model.customFields\r\n }\r\n ];\r\n root.showAddToCollectionPopup(contractForShoppingList);\r\n }\r\n });\r\n\r\n $view.find('.js-add-additional-product-to-shopping-list-btn').click(function (evt) {\r\n evt.preventDefault();\r\n\r\n var additionalProductId = $(this).data(\"additional-product-id\");\r\n var additionalProductModel = model.additionalProducts.filter(function (value) {\r\n return value.productId === additionalProductId;\r\n })[0];\r\n\r\n var quantity = utils.tryParseNumberOrDefault($view.find(\".js-additional-product-quantity[data-additional-product-id='\" + additionalProductId + \"']\").val(), 1);\r\n var fraction = utils.tryParseNumberOrDefault($view.find(\".js-additional-product-fraction[data-additional-product-id='\" + additionalProductId + \"']\").val());\r\n\r\n var contractForShoppingList = [\r\n {\r\n productId: additionalProductModel.productId,\r\n imageId: additionalProductModel.mainImage.id,\r\n quantity: quantity,\r\n fraction: fraction,\r\n }\r\n ];\r\n root.showAddToCollectionPopup(contractForShoppingList);\r\n });\r\n\r\n $view.find('.js-add-to-wish-list-btn').click(function (evt) {\r\n evt.preventDefault();\r\n var $wishListControl = $(this);\r\n\r\n var isAddToWishListAction = $wishListControl.hasClass('c-wish-list-btn_add');\r\n\r\n\r\n if (model.isAvailableToBuy && !model.isMainProductOfProductWithVariants) {\r\n root.updateWishList(model.productId, isAddToWishListAction ? 'add' : 'remove', wishListCallback);\r\n }\r\n else\r\n {\r\n var $productContainer = utils.$getProductContainerFor($wishListControl);\r\n var productUniqueId = $productContainer.data('uniqueid');\r\n var productVariantsProcessor = variantProcessorsMap[productUniqueId];\r\n var notSelectedVariants = productVariantsProcessor.getNotSelectedVariants();\r\n var notSelectedVariantNames;\r\n _.each(notSelectedVariants, function (x, idx) {\r\n var name = '' + x.variantType.name + '';\r\n if (idx === 0) {\r\n notSelectedVariantNames = name;\r\n } else if (idx === notSelectedVariants.length - 1) {\r\n notSelectedVariantNames += (' ' + model.metadata['and'] + ' ' + name);\r\n } else {\r\n notSelectedVariantNames += (', ' + name);\r\n }\r\n });\r\n\r\n say.warning(model.metadata['pleaseSelect'] + ' ' + notSelectedVariantNames + ' ' + model.metadata['toAddToWishList']);\r\n }\r\n\r\n function wishListCallback(dataContract) {\r\n if (dataContract.status.toLowerCase() === 'ok') {\r\n _.each(dataContract.result.items,\r\n function (prod) {\r\n if (prod.status.toLowerCase() === 'ok') {\r\n say.success(model.metadata['wishListUpdated']);\r\n\r\n $wishListControl.toggleClass('c-wish-list-btn_add', !isAddToWishListAction);\r\n $wishListControl.toggleClass('c-wish-list-btn_remove',\r\n isAddToWishListAction);\r\n } else {\r\n say.error(prod.message);\r\n }\r\n });\r\n } else {\r\n say.error(dataContract.message);\r\n }\r\n }\r\n\r\n });\r\n }\r\n }\r\n }\r\n\r\n function quantityDiscountsProcessor($view, model) {\r\n var $quantityDiscountsContainer = $view.find('.js-quantity-discounts');\r\n var $quantityDiscountsInfo = $view.find('.js-quantity-discounts-info');\r\n\r\n function renderQuantityDiscounts(selectedVariants) {\r\n $.ajax({\r\n url: root.R + 'handlers/public/estoredata.ashx',\r\n type: 'GET',\r\n data: {\r\n a: 'GetQuantityDiscounts',\r\n itemId: model.itemId,\r\n dim1: selectedVariants !== undefined && selectedVariants[0] !== undefined ? selectedVariants[0] : 0,\r\n dim2: selectedVariants !== undefined && selectedVariants[1] !== undefined ? selectedVariants[1] : 0,\r\n dim3: selectedVariants !== undefined && selectedVariants[2] !== undefined ? selectedVariants[2] : 0,\r\n showPrice: model.quantityDiscountVisibility === 'Price',\r\n format: 'html'\r\n }\r\n })\r\n .done(function (result) {\r\n if (result && result.length > 0) {\r\n $quantityDiscountsContainer.show();\r\n $quantityDiscountsInfo.html(result);\r\n } else {\r\n $quantityDiscountsContainer.hide();\r\n }\r\n })\r\n .fail(function () {\r\n $quantityDiscountsContainer.hide();\r\n });\r\n }\r\n\r\n return {\r\n renderQuantityDiscounts: function (selectedVariants) {\r\n if ($quantityDiscountsContainer.length > 0) {\r\n renderQuantityDiscounts(selectedVariants);\r\n }\r\n }\r\n }\r\n }\r\n\r\n function priceRequestProcessor($view) {\r\n return {\r\n init: function () {\r\n\r\n var $feedbackControlContainer = $('.js-feedback-control');\r\n var $feedbackControlContainer2 = $('.js-feedback-control2');\r\n var $priceRequestContainerBtn = $view.find('.js-price-request-btn');\r\n\r\n $feedbackControlContainer = $feedbackControlContainer2.length > 0 ? $feedbackControlContainer2 : $feedbackControlContainer;\r\n\r\n if ($feedbackControlContainer.length > 0) {\r\n $priceRequestContainerBtn.on('click', function () {\r\n $.fancybox.open({\r\n parentEl: \"form:first\",\r\n src: $feedbackControlContainer,\r\n type: 'inline'\r\n });\r\n });\r\n }\r\n\r\n }\r\n }\r\n }\r\n\r\n function externalTrackingProcessor() {\r\n function _reportAdditionalProductsView($viewContainer, model) {\r\n var viewProductName = $.trim(model.title || document.title);\r\n\r\n var $additionalProductsContainer = $viewContainer.find('.js-additional-product-list');\r\n var $additionalProducts = $additionalProductsContainer.find('.js-additional-product');\r\n\r\n if ($additionalProducts.length > 0) {\r\n var listName = viewProductName + ' > ' + ($additionalProductsContainer.data('listname') || model.metadata['additionalProductsTab']);\r\n var additionalProductIdsWithLinks = $additionalProducts.map(function () {\r\n var $prod = $(this);\r\n var productId = $prod.data('productid');\r\n var $links = $prod.find('.js-product-link');\r\n\r\n return { productId: productId, $links: $links };\r\n }).get();\r\n\r\n root.reportProductListView(root.productListType.relatedProducts, listName, additionalProductIdsWithLinks);\r\n }\r\n }\r\n\r\n return {\r\n reportProductsView: function ($viewContainer, model) {\r\n root.reportProductDetailsView(model.productId);\r\n\r\n _reportAdditionalProductsView($viewContainer, model);\r\n },\r\n reportProductDetailsView: function (productId) {\r\n root.reportProductDetailsView(productId);\r\n },\r\n };\r\n }\r\n\r\n function relationExtensionDataProcessor($viewContainer, model, variantProcessorsMap, priceTotalsController, pubsub) {\r\n var relationExtData = null;\r\n\r\n var additionalProdMap = {}; // { relID1: { prodID1: { product1 }}}\r\n _.each(model.additionalProducts, function (prod) {\r\n if (prod.group && prod.group.groupType === 'Relation') {\r\n var relationId = prod.group.groupId;\r\n if (!additionalProdMap[relationId]) {\r\n additionalProdMap[relationId] = {};\r\n }\r\n\r\n additionalProdMap[relationId][prod.productId] = prod;\r\n }\r\n });\r\n\r\n function _applyExtensionData(variantTypeName, variantValueName) {\r\n if (variantTypeName && variantValueName) {\r\n variantTypeName = variantTypeName.toLowerCase();\r\n variantValueName = variantValueName.toLowerCase();\r\n\r\n var extData = relationExtData[variantTypeName] ? relationExtData[variantTypeName][variantValueName] : null;\r\n if (extData) {\r\n var isAnyQuantityAffected = false;\r\n\r\n _.each(extData, function (extDataItem) {\r\n var productId = extDataItem.productID;\r\n if (productId === null) {\r\n // Regular non-variant products do not store their productID in relation data. Therefore, need to resolve productID first.\r\n productId = _getSingleProductIdByItemId(extDataItem.itemID);\r\n }\r\n\r\n var additionalProduct = _getAdditionalProduct(extDataItem.relationID, productId);\r\n if (additionalProduct) {\r\n var uniqueId = additionalProduct.uniqueId;\r\n if (uniqueId) {\r\n if (typeof (extDataItem.quantityInRelation) !== 'undefined') {\r\n $viewContainer.find('[data-uniqueid=\"' + uniqueId + '\"] .js-quantity').val(extDataItem.quantityInRelation);\r\n isAnyQuantityAffected = true;\r\n }\r\n\r\n if (typeof (extDataItem.variants) !== 'undefined') {\r\n var variantsProc = variantProcessorsMap[uniqueId];\r\n if (variantsProc) {\r\n _.each(extDataItem.variants, function (variantValue, variantType) { variantsProc.selectVariantByName(variantType, variantValue); });\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n if (isAnyQuantityAffected) {\r\n priceTotalsController.updatePriceTotals();\r\n }\r\n }\r\n }\r\n }\r\n\r\n function _getSelectedVariantTypeToValueNamePairs(product) {\r\n var namePairs = {};\r\n\r\n var variantProduct = _.find(product.variantProducts, function (x) { return x.productId === product.productId });\r\n if (variantProduct) {\r\n _.each(product.variantTypes, function (x) {\r\n var selectVariantValue = _.find(x.variants, function (y) { return _.indexOf(variantProduct.variants, y.id) !== -1; });\r\n if (selectVariantValue && selectVariantValue.id > 0) {\r\n namePairs[x.name] = selectVariantValue.name;\r\n }\r\n });\r\n }\r\n\r\n return namePairs;\r\n }\r\n\r\n function _renderExtensionDataGrids($extDataGridsContainer) {\r\n if (_.isEmpty(relationExtData) || _.isEmpty(additionalProdMap)) {\r\n $extDataGridsContainer.remove();\r\n } else {\r\n var extensionDataGridTemplateCompiled = _.template('<\\% _.each(columns, function(column) { %><\\% }); %><\\% _.each(_.sortBy(rows, \\'position\\'), function(prod) { %>\\'><\\% _.each(columns, function(column) { %><\\% }); %><\\% }); %>
<\\%= column %>
<\\%= prod.title %><\\%= prod.extDataMap[column] ? prod.extDataMap[column].quantityInRelation : \\'-\\' %>
');\r\n\r\n // Render a separate grid for every general product's variant type with extension data.\r\n // Join extension data with existing additional products and ignore extension data for not available additional products.\r\n // Remember that there can be same products in different relations having their own relation extension data. So the key to the product should be productId + relationId.\r\n // Try follow the visible positions of the additional products shown.\r\n var visiblePositionMap = {};\r\n $viewContainer.find('.js-additional-product[data-uniqueid]').each(function (idx, elem) {\r\n var uniqueId = $(elem).data('uniqueid');\r\n if (uniqueId) {\r\n visiblePositionMap[uniqueId] = idx;\r\n }\r\n });\r\n\r\n _.each(relationExtData, function (variantTypeExtData, variantTypeName) {\r\n var gridModel = { gridTitle: variantTypeName, columns: [], rows: {} };\r\n\r\n _.each(variantTypeExtData, function (relProdExtDataArray, variantValueName) {\r\n gridModel.columns.push(variantValueName);\r\n\r\n _.each(relProdExtDataArray, function (relProdExtData) {\r\n var rowId = relProdExtData.relationID + '_' + relProdExtData.productID;\r\n // If the correpsonding product is found in additionals then add it to rows.\r\n // If the product is not found then add null value so we do not check it once more.\r\n if (typeof (gridModel.rows[rowId]) === 'undefined') {\r\n var additionalProduct = _getAdditionalProduct(relProdExtData.relationID, relProdExtData.productID);\r\n if (additionalProduct) {\r\n var visiblePosition = visiblePositionMap[additionalProduct.uniqueId];\r\n gridModel.rows[rowId] = {\r\n uniqueId: additionalProduct.uniqueId,\r\n group: additionalProduct.group.groupName,\r\n title: additionalProduct.title,\r\n position: visiblePosition > -1 ? visiblePosition : undefined,\r\n extDataMap: {}\r\n }\r\n } else {\r\n gridModel.rows[rowId] = null;\r\n }\r\n }\r\n\r\n if (gridModel.rows[rowId] !== null) {\r\n gridModel.rows[rowId].extDataMap[variantValueName] = relProdExtData;\r\n }\r\n });\r\n });\r\n\r\n //filter rows with null value before template compilation\r\n gridModel.rows = _.filter(gridModel.rows, function (row) {\r\n return row !== null;\r\n });\r\n var gridHtml = extensionDataGridTemplateCompiled(gridModel);\r\n\r\n $extDataGridsContainer.append(gridHtml);\r\n });\r\n }\r\n }\r\n\r\n function _getAdditionalProduct(relationId, productId) {\r\n return additionalProdMap[relationId] ? additionalProdMap[relationId][productId] : undefined;\r\n }\r\n\r\n function _getSingleProductIdByItemId(itemId) {\r\n var singleProduct = _.find(model.additionalProducts, function (additionalProd) { return !additionalProd.isProductWithVariants && additionalProd.itemId === itemId });\r\n\r\n return singleProduct ? singleProduct.productId : null;\r\n }\r\n\r\n function _oneTimeVariantProdUpdateHandler(topic, data) {\r\n pubsub.unsubscribe(_oneTimeVariantProdUpdateHandler);\r\n\r\n if (!data.variantProductDetails.IsMainProd) {\r\n var preselectedVariants = _getSelectedVariantTypeToValueNamePairs(model);\r\n _.each(preselectedVariants, function (valueName, typeName) { _applyExtensionData(typeName, valueName); });\r\n }\r\n }\r\n\r\n return {\r\n init: function () {\r\n var mainProductVariantsProcessor = variantProcessorsMap[model.uniqueId];\r\n\r\n if (mainProductVariantsProcessor) {\r\n $.ajax({\r\n url: root.R + 'api/archive/relation/foritem/' + model.itemId + '/variant/ext-data',\r\n type: 'GET',\r\n data: {\r\n relationIds: _.keys(additionalProdMap)\r\n }\r\n })\r\n .done(function (relationExtensionData) {\r\n relationExtData = relationExtensionData;\r\n\r\n if (relationExtData) {\r\n if (model.isVariantProductOfProductWithVariants) {\r\n // Apply extension data immediately if variant product is shown initially\r\n var preselectedVariants = _getSelectedVariantTypeToValueNamePairs(model);\r\n _.each(preselectedVariants, function (valueName, typeName) { _applyExtensionData(typeName, valueName); });\r\n } else {\r\n pubsub.subscribe('variantprocessor.variantproduct.updated', _oneTimeVariantProdUpdateHandler);\r\n }\r\n\r\n mainProductVariantsProcessor.$selectors.on('variantselector:changed', function (evt, changedVariantType, newVariantValue) {\r\n if (newVariantValue > 0) {\r\n var mainVariantValueDetails = _.find(changedVariantType.variants, function (variant) { return variant.id === newVariantValue; });\r\n\r\n _applyExtensionData(changedVariantType.name, mainVariantValueDetails.name);\r\n }\r\n });\r\n }\r\n\r\n var $extDataGridsContainer = $viewContainer.find('.js-relation-extension-data-scheme');\r\n if ($extDataGridsContainer.length > 0) {\r\n _renderExtensionDataGrids($extDataGridsContainer);\r\n }\r\n })\r\n .fail(function (errorResponse) {\r\n console.error('[UMW]: Failed to get relation extension data', errorResponse);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n function priceTotalsProcessor($view, utils, model) {\r\n var additionalsGroup = 'additionals';\r\n var defaultGroup = 'default';\r\n var defaultEmptyText = '0';\r\n var valueLoadingText = '...';\r\n var updateTimer = null;\r\n var _currentTotals = null;\r\n\r\n var $priceTotalsElements;\r\n\r\n var cache = { empty: [] };\r\n\r\n function _buildCacheKey(products) {\r\n var cacheKey = products && products.length > 0 ? JSON.stringify(products) : 'empty';\r\n\r\n return cacheKey;\r\n }\r\n\r\n function _setResults(groupedTotals) {\r\n var totalsMap = {};\r\n _.each(groupedTotals, function (g) {\r\n g.hasDiscount = g.origPrice !== g.price;\r\n\r\n totalsMap[g.group || defaultGroup] = g;\r\n });\r\n\r\n $priceTotalsElements.each(function () {\r\n var $elem = $(this);\r\n var $elemContainer = $elem.closest('.js-price-totals-container');\r\n\r\n var group = $elem.data('price-totals-group') || defaultGroup;\r\n\r\n var totals = totalsMap[group] || {};\r\n var totalsType = $elem.data('price-totals') || 'sellprice';\r\n\r\n var totalsValue;\r\n switch (totalsType.toLowerCase()) {\r\n case 'quantity':\r\n totalsValue = totals.quantity || defaultEmptyText;\r\n break;\r\n case 'price':\r\n case 'sellprice':\r\n totalsValue = totals.price || defaultEmptyText;\r\n break;\r\n case 'originalprice':\r\n case 'beforeprice':\r\n case 'before':\r\n totalsValue = totals.hasDiscount ? totals.origPrice : null;\r\n break;\r\n case 'discount':\r\n case 'discountprice':\r\n totalsValue = totals.hasDiscount ? totals.discPrice : null;\r\n break;\r\n default:\r\n totalsValue = null;\r\n break;\r\n }\r\n\r\n if (totalsValue !== null) {\r\n $elem.text(totalsValue).show();\r\n $elemContainer.show();\r\n } else {\r\n $elem.hide();\r\n $elemContainer.hide();\r\n }\r\n });\r\n\r\n const onTotalsUpdatedEvent = $.Event('priceTotalsProcessor:ontotalsupdated');\r\n $view.trigger(onTotalsUpdatedEvent, [groupedTotals]);\r\n }\r\n\r\n function _getProductsWithPositiveQuantities() {\r\n return $view.find('.js-quantity').map(function () {\r\n var $quantity = $(this);\r\n var quantity = utils.tryParseNumberOrDefault($quantity.val());\r\n\r\n var productContract = null;\r\n\r\n if (quantity > 0) {\r\n const $productContainer = utils.$getProductContainerFor($quantity);\r\n let isSelected = $productContainer.data('isselected');\r\n isSelected = typeof (isSelected) === 'boolean' ? isSelected : true;\r\n\r\n if (isSelected) {\r\n const productkey = $productContainer.data('uniquekey');\r\n const productId = $productContainer.data('productid');\r\n let groupName = $quantity.data('price-totals-group') || $productContainer.data('price-totals-group');\r\n if (!groupName) {\r\n // Auto-detect group name\r\n groupName = $productContainer.hasClass('js-additional-product') ? additionalsGroup : null;\r\n }\r\n\r\n productContract = {\r\n productkey: productkey,\r\n prodId: productId,\r\n parentProductId: model.productId !== productId ? model.productId : 0,\r\n itemId: model.itemId,\r\n quantity: quantity,\r\n productType: $productContainer.data('producttype') || 'Product',\r\n group: groupName,\r\n };\r\n }\r\n }\r\n\r\n return productContract;\r\n }).get();\r\n };\r\n\r\n function _updatePriceTotals() {\r\n var products = _getProductsWithPositiveQuantities();\r\n\r\n if (model.showCalculateShippingTool && !model.groupingComponents) {\r\n let selectedProducts = products.map(p => ( { productId: p.prodId, quantity: p.quantity }));\r\n if (model.groupingComponents) {\r\n selectedProducts.splice(selectedProducts.findIndex(p => p.productId == model.productId), 1);\r\n }\r\n\r\n let shippingDetails = document.querySelector('shipping-details');\r\n if(shippingDetails) {\r\n shippingDetails.shippingProducts = selectedProducts;\r\n }\r\n }\r\n\r\n var cacheKey = _buildCacheKey(products);\r\n\r\n if (cache[cacheKey]) {\r\n _currentTotals = cache[cacheKey];\r\n _setResults(cache[cacheKey]);\r\n } else {\r\n $priceTotalsElements.text(valueLoadingText);\r\n\r\n $.ajax({\r\n async: false,\r\n url: root.R + 'handlers/public/productdata.ashx',\r\n type: 'POST',\r\n data: {\r\n a: 'GetProductListQuantityPrice',\r\n params: JSON.stringify({ products: products })\r\n }\r\n })\r\n .done(function (result) {\r\n cache[cacheKey] = result;\r\n _currentTotals = result;\r\n _setResults(result);\r\n })\r\n .fail(function (errResp) {\r\n var errorMessage = utils.extractErrorMessageFromResponse(errResp);\r\n console.error('Failed to calculate price totals. ', errorMessage);\r\n });\r\n }\r\n }\r\n\r\n return {\r\n init: function () {\r\n $priceTotalsElements = $view.find('[data-price-totals]');\r\n var isAnyElementFound = $priceTotalsElements.length > 0;\r\n\r\n if (isAnyElementFound) {\r\n $view.find('.js-quantity').on('change', function () {\r\n if (updateTimer) {\r\n root.clearTimeout(updateTimer);\r\n updateTimer = null;\r\n }\r\n\r\n updateTimer = root.setTimeout(_updatePriceTotals, 500);\r\n });\r\n }\r\n },\r\n updatePriceTotals: function () {\r\n if (updateTimer) {\r\n root.clearTimeout(updateTimer);\r\n updateTimer = null;\r\n }\r\n\r\n var isAnyElementFound = $priceTotalsElements.length > 0;\r\n\r\n if (isAnyElementFound) {\r\n _updatePriceTotals();\r\n }\r\n },\r\n getCurrentTotals() { return _currentTotals; }\r\n }\r\n }\r\n\r\n function packageComponentProcessor($view, model, utils) {\r\n var $packageComponentsContainer = utils.$getProductContainerElements($view, '.js-component-products-list');\r\n if (!model.packageComponentProducts || !$packageComponentsContainer.length) {\r\n return;\r\n }\r\n\r\n var $generalProdQty = utils.$getProductContainerElements($view, '.js-quantity');\r\n $generalProdQty.on('change', function () {\r\n var quantity = utils.tryParseNumberOrDefault($(this).val());\r\n _.each(model.packageComponentProducts, function (packageComponent) {\r\n var $componentProductContainer = $packageComponentsContainer.find('.js-component-product[data-uniqueid=\"' + packageComponent.uniqueId + '\"]');\r\n $componentProductContainer.find('.js-component-quantity').text(packageComponent.initialQuantity.raw * quantity);\r\n });\r\n\r\n });\r\n }\r\n\r\n function groupingProductProcessor($view, model, utils, say, pubsub, priceTotals, variantProcessorsMap) {\r\n const ComponentBuyMode = { \"SingleProduct\": 0, \"MultipleProducts\": 1, \"AllProducts\": 2, \"OneOrMoreProducts\": 3 }\r\n const TemplateMarkup = { \"GroupingProductDefault\": 0, \"GroupingProductV2\": 1 };\r\n var $groupingProductContainer;\r\n var groupingProductMarkup;\r\n var isInitializing = true;\r\n var groupingProductTemplate;\r\n var docContentMap = {};\r\n\r\n function _getGroupingComponentProduct(componentUniqueId, productUniqueId) {\r\n const groupingProductComponent = _getGroupingComponent(componentUniqueId);\r\n const groupingComponentProduct = groupingProductComponent.componentProducts.find(x => x.uniqueId === productUniqueId);\r\n if (!groupingComponentProduct) {\r\n console.error(`Grouping product component product was not found by id = ${productUniqueId}`);\r\n }\r\n\r\n return groupingComponentProduct;\r\n }\r\n\r\n function _getGroupingComponent(componentUniqueId) {\r\n const groupingComponent = model.groupingComponents.find(x => x.uniqueId === componentUniqueId);\r\n if (!groupingComponent) {\r\n console.error(`Grouping component was not found by id = ${componentUniqueId}`);\r\n }\r\n return groupingComponent;\r\n }\r\n\r\n function _getGroupingComponentTemplate(groupingComponent, groupingProductId) {\r\n const componentTemplate = JSON.parse(JSON.stringify(groupingComponent))\r\n componentTemplate.componentProducts = groupingComponent.componentProducts.filter(x => x.groupingProductId == groupingProductId);\r\n componentTemplate.componentProducts.sort((x, y) => x.orderNo - y.orderNo);\r\n return componentTemplate;\r\n }\r\n\r\n function _toLocalFixed(number, fraction) {\r\n return number.toLocaleString(undefined, { minimumFractionDigits: fraction, maximumFractionDigits: fraction });\r\n }\r\n\r\n function _setPriceImpact($productPriceImpact, price) {\r\n $productPriceImpact.html(`${model.currencyCode} ${_toLocalFixed(price, 2)}`);\r\n if (price === 0) {\r\n $productPriceImpact.removeClass('increase');\r\n $productPriceImpact.removeClass('decrease');\r\n $productPriceImpact.addClass('noimpact');\r\n } else if (price > 0) {\r\n $productPriceImpact.addClass('increase');\r\n $productPriceImpact.removeClass('decrease');\r\n $productPriceImpact.removeClass('noimpact');\r\n } else {\r\n $productPriceImpact.removeClass('increase');\r\n $productPriceImpact.addClass('decrease');\r\n $productPriceImpact.removeClass('noimpact');\r\n }\r\n }\r\n\r\n function _setGroupingComponentStockInfo($componentContainer) {\r\n const componentUniqueId = $componentContainer.data('componentuniqueid');\r\n\r\n // stock info\r\n $componentContainer.find('[data-uniqueid]').each((i, groupingComponentProduct) => {\r\n const $productContainer = $(groupingComponentProduct);\r\n const productUniqueId = $productContainer.data('uniqueid');\r\n const componentProduct = _getGroupingComponentProduct(componentUniqueId, productUniqueId);\r\n\r\n const $stockInfoContainer = $productContainer.find('.js-stock-info');\r\n if ($stockInfoContainer) {\r\n const $stockText = $stockInfoContainer.find('.js-stock-text')\r\n if ($stockText) {\r\n $stockText.text(componentProduct.stockText);\r\n if (!$stockText.hasClass(componentProduct.stockCssClass)) {\r\n $stockText.addClass(componentProduct.stockCssClass);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function _setGroupingComponentPrices(groupedTotals) {\r\n // prices are always expected to be found; just in case it's missing due to a bug - will update prices with empty values so it is visible\r\n const groupingComponentProductPrices = groupedTotals ? groupedTotals.find(x => x.groupingComponentProductPrices)?.groupingComponentProductPrices : null;\r\n\r\n $groupingProductContainer.find('[data-componentuniqueid]').each((i, groupingComponentContainer) => {\r\n const $componentContainer = $(groupingComponentContainer);\r\n const componentUniqueId = $componentContainer.data('componentuniqueid');\r\n const groupingProductComponent = _getGroupingComponent(componentUniqueId);\r\n\r\n let selectedPrice = 0;\r\n // first: find and set prices for selected product\r\n $componentContainer.find('[data-uniqueid]').each((i, groupingComponentProduct) => {\r\n const $productContainer = $(groupingComponentProduct);\r\n const isSelected = $productContainer.data('isselected');\r\n if (!isSelected) {\r\n return;\r\n }\r\n\r\n const productUniqueId = $productContainer.data('uniqueid');\r\n const quantity = $productContainer.find('.js-quantity').val();\r\n const componentProduct = _getGroupingComponentProduct(componentUniqueId, productUniqueId);\r\n const sellPrice = groupingComponentProductPrices ? groupingComponentProductPrices[componentProduct.uniqueKey] : null;\r\n let sellPriceFormatted = '';\r\n if (sellPrice) {\r\n sellPriceFormatted = sellPrice.formatted;\r\n selectedPrice = sellPrice.raw * quantity;\r\n }\r\n\r\n $productContainer.find('.js-grouping-product-price').html(sellPriceFormatted);\r\n _setPriceImpact($productContainer.find('.js-grouping-product-price-impact'), 0);\r\n });\r\n\r\n // second: set prices for not selected product\r\n $componentContainer.find('[data-uniqueid]').each((i, groupingComponentProduct) => {\r\n const $productContainer = $(groupingComponentProduct);\r\n const isSelected = $productContainer.data('isselected');\r\n if (isSelected) {\r\n return;\r\n }\r\n\r\n const productUniqueId = $productContainer.data('uniqueid');\r\n const quantity = $productContainer.find('.js-quantity').val();\r\n const componentProduct = _getGroupingComponentProduct(componentUniqueId, productUniqueId);\r\n const sellPrice = groupingComponentProductPrices ? groupingComponentProductPrices[componentProduct.uniqueKey] : null;\r\n let sellPriceFormatted = '', diffPrice = 0;\r\n if (sellPrice) {\r\n sellPriceFormatted = sellPrice.formatted;\r\n const nonSelectedPrice = sellPrice.raw * quantity;\r\n diffPrice = groupingProductComponent.buyMode === ComponentBuyMode.SingleProduct ? nonSelectedPrice - selectedPrice : nonSelectedPrice;\r\n }\r\n\r\n $productContainer.find('.js-grouping-product-price').html(sellPriceFormatted);\r\n _setPriceImpact($productContainer.find('.js-grouping-product-price-impact'), diffPrice);\r\n });\r\n });\r\n }\r\n\r\n function _setAllComponentProductsNotSelected($componentContainer) {\r\n const groupingProductComponent = _getGroupingComponent($componentContainer.data('componentuniqueid'));\r\n if (groupingProductComponent.buyMode === ComponentBuyMode.SingleProduct) {\r\n const $productContainer = $componentContainer.find('[data-uniqueid]');\r\n $productContainer.data('isselected', false);\r\n $productContainer.removeClass('selected');\r\n }\r\n }\r\n\r\n function _toggleProductSelected($componentContainer, $productContainer, isSelected) {\r\n _setAllComponentProductsNotSelected($componentContainer);\r\n\r\n $productContainer.data('isselected', isSelected);\r\n if (isSelected) {\r\n $productContainer.addClass('selected');\r\n $productContainer.attr('data-isselected', isSelected);\r\n } else {\r\n $productContainer.removeClass('selected');\r\n $productContainer.attr('data-isselected', isSelected);\r\n }\r\n\r\n _setGroupingComponentStockInfo($componentContainer);\r\n }\r\n\r\n function _isComponentRequiredToBuy(buyMode) {\r\n return buyMode === ComponentBuyMode.SingleProduct || buyMode === ComponentBuyMode.AllProducts || buyMode === ComponentBuyMode.OneOrMoreProducts;\r\n }\r\n\r\n function _toggleQuantityValueInComponent($quantity){\r\n const $componentContainer = $quantity.closest('[data-componentuniqueid]');\r\n const componentUniqueId = $componentContainer.data('componentuniqueid');\r\n const groupingComponent = _getGroupingComponent(componentUniqueId);\r\n const minQuantity = $quantity.data('min-quantity');\r\n\r\n\r\n if (groupingProductMarkup === TemplateMarkup.GroupingProductV2){\r\n if (groupingComponent.buyMode === ComponentBuyMode.SingleProduct && $quantity.val() > 0) {\r\n const $allExceptEditedInput = $componentContainer.find('.js-quantity').not($quantity);\r\n $allExceptEditedInput.val(0);\r\n $allExceptEditedInput.closest('.js-plus-minus-container-grouping-product').find('button[data-action=\"decrease\"]').attr('disabled', 'disabled');\r\n }\r\n if (groupingComponent.buyMode === ComponentBuyMode.OneOrMoreProducts) {\r\n var $positiveQuantityInputs = $componentContainer.find('.js-quantity').filter((i, element) => $(element).val() > 0);\r\n if ($positiveQuantityInputs.length === 1 && $quantity.val() <= minQuantity) {\r\n $positiveQuantityInputs.closest('.js-plus-minus-container-grouping-product').find('button[data-action=\"decrease\"]').attr('disabled', 'disabled');\r\n } else if ($positiveQuantityInputs.length > 1 ) {\r\n $positiveQuantityInputs.closest('.js-plus-minus-container-grouping-product').find('button[data-action=\"decrease\"]').removeAttr('disabled');\r\n }\r\n }\r\n }\r\n }\r\n\r\n function _setupControlElements() {\r\n switch(groupingProductMarkup){\r\n case TemplateMarkup.GroupingProductDefault: //Going to be deprecated. Use v2 instead.\r\n utils.initQuantityModifyButtons($groupingProductContainer, '.js-gp-quantity-modify-btn');\r\n break;\r\n case TemplateMarkup.GroupingProductV2:\r\n utils.initQuantityModifyButtons2($view, '.js-plus-minus-container-grouping-product');\r\n break;\r\n }\r\n\r\n $groupingProductContainer.find('.js-select-product').each((i, element) => {\r\n $(element).on('change', function (evt) {\r\n const $selectProductInput = $(this);\r\n const $componentContainer = $selectProductInput.closest('[data-componentuniqueid]');\r\n const $productContainer = utils.$getProductContainerFor($selectProductInput);\r\n const isSelected = $selectProductInput.is(':checked');\r\n const componentUniqueId = $componentContainer.data('componentuniqueid');\r\n const groupingComponent = _getGroupingComponent(componentUniqueId);\r\n\r\n // prevent uncheck if component is required and no more checked products\r\n if (!isSelected && _isComponentRequiredToBuy(groupingComponent.buyMode) && !$componentContainer.find('input[name=\"' + this.name + '\"]:checked').not(this).length) {\r\n $(this).prop('checked', true);\r\n return;\r\n }\r\n\r\n if (groupingComponent.buyMode === ComponentBuyMode.SingleProduct) {\r\n const $allExceptCheckedComponentSelectors = $componentContainer.find('input[name=\"' + this.name + '\"]').not(this);\r\n $allExceptCheckedComponentSelectors.prop('checked', false);\r\n }\r\n\r\n\t\t\t\t\tif (groupingProductMarkup === TemplateMarkup.GroupingProductDefault && groupingComponent.buyMode === ComponentBuyMode.OneOrMoreProducts){\r\n if(isSelected) {\r\n $componentContainer.find('input[name=\"' + this.name + '\"]:checked').next('.js-grouping-product-link').find('.grouping-product-remove-btn').css('display', 'flex');\r\n $selectProductInput.next('.js-grouping-product-link').find('.grouping-product-remove-btn').css('display', 'flex');\r\n } else {\r\n $componentContainer.find('input[name=\"' + this.name + '\"]').next('.js-grouping-product-link').find('.grouping-product-remove-btn').css('display', 'none');\r\n }\r\n\t\t\t\t\t}\r\n\r\n _toggleProductSelected($componentContainer, $productContainer, isSelected);\r\n\r\n priceTotals.updatePriceTotals();\r\n });\r\n });\r\n\r\n $('#root').on('click', function(event) {\r\n if (!$(event.target).closest($groupingProductContainer).length){\r\n $('.js-grouping-product').removeClass('active');\r\n }\r\n });\r\n\r\n $('.js-grouping-product').on('click', function() {\r\n const $this = $(this),\r\n groupingComponent = $this.closest('.grouping-component'),\r\n imageItem = $this.find('.js-grouping-product-image'),\r\n imageItemSelected = groupingComponent.find('.js-grouping-component-image-selected'),\r\n imageLinkItemSelected = groupingComponent.find('.js-grouping-component-image-link-selected'),\r\n productContainer = $this.closest('.js-grouping-product-container');\r\n\r\n productContainer.find('.js-grouping-product').not($this).removeClass('active');\r\n $this.addClass('active');\r\n\r\n imageLinkItemSelected.attr({\r\n 'href': imageItem.data('src'),\r\n 'data-width': imageItem.data('width'),\r\n 'data-height': imageItem.data('height')\r\n }).removeClass('grouping-component-img-link-opacity');\r\n\r\n imageItemSelected.attr('src', imageItem.attr('src'));\r\n });\r\n\r\n $groupingProductContainer.find('.js-quantity').each((i, element) => {\r\n const $quantityInput = $(element);\r\n _toggleQuantityValueInComponent($quantityInput);\r\n $quantityInput.on('change', () => {\r\n const minQuantity = $quantityInput.data('min-quantity');\r\n if(minQuantity){\r\n const quantityValue = $quantityInput.val();\r\n const $selectProduct = $quantityInput.closest('.js-grouping-product').find('.js-select-product');\r\n quantityValue < minQuantity ? $selectProduct.prop('checked', false) : $selectProduct.prop('checked', true);\r\n _toggleQuantityValueInComponent($quantityInput);\r\n }\r\n if(groupingProductMarkup === TemplateMarkup.GroupingProductV2){\r\n const $componentContainer = $quantityInput.closest('[data-componentuniqueid]');\r\n const $productContainer = $quantityInput.closest('.js-grouping-product');\r\n const isSelected = $productContainer.find('.js-select-product').is(':checked');\r\n _toggleProductSelected($componentContainer, $productContainer, isSelected);\r\n }\r\n priceTotals.updatePriceTotals();\r\n });\r\n });\r\n\r\n $groupingProductContainer.find('.js-more-info').each((i, element) => {\r\n const $infoLink = $(element);\r\n $infoLink.on('click', (evt) => {\r\n evt.preventDefault();\r\n const $productContainer = utils.$getProductContainerFor($infoLink);\r\n const $moreInfoCont = $productContainer.find('.js-more-info-cont');\r\n const $moreInfoContTeaser = $productContainer.find('.js-more-info-cont-teaser');\r\n const $moreInfoContContent = $productContainer.find('.js-more-info-cont-content');\r\n\r\n if ($moreInfoCont.length) {\r\n const $componentContainer = $infoLink.closest('[data-componentuniqueid]');\r\n const componentUniqueId = $componentContainer.data('componentuniqueid');\r\n const prodUniqueId = $productContainer.data('uniqueid');\r\n const componentProduct = _getGroupingComponentProduct(componentUniqueId, prodUniqueId);\r\n\r\n if (docContentMap.hasOwnProperty(componentProduct.itemId)) {\r\n $moreInfoCont.collapse('toggle');\r\n } else {\r\n $.ajax({\r\n url: root.R + 'api/document/getDocumentTeaserAndContent',\r\n type: 'GET',\r\n data: { itemId: componentProduct.itemId }\r\n })\r\n .done(function (result) {\r\n docContentMap[componentProduct.itemId] = result;\r\n $moreInfoContTeaser.html(result.teaser);\r\n $moreInfoContContent.html(result.content);\r\n $moreInfoCont.collapse('show');\r\n })\r\n .fail(function (errResp) {\r\n var errorMessage = utils.extractErrorMessageFromResponse(errResp);\r\n console.error('Failed to get document content', errorMessage);\r\n });\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n function _setProductContainerValues($productContainer, groupingComponentProduct, selectedVariant) {\r\n $productContainer.find('.js-grouping-product-link').attr({\r\n 'href': groupingComponentProduct.url,\r\n 'title': groupingComponentProduct.title\r\n });\r\n $productContainer.find('.js-grouping-product-title').html(groupingComponentProduct.title);\r\n const $groupingProductImage = $productContainer.find('.js-grouping-product-image');\r\n\r\n if ($groupingProductImage) {\r\n if (groupingComponentProduct.mainImage) {\r\n $groupingProductImage.attr('src', groupingComponentProduct.mainImage.previewUrl || '');\r\n $groupingProductImage.attr('alt', groupingComponentProduct.mainImage.title || '');\r\n } else {\r\n $groupingProductImage.attr('src', '');\r\n $groupingProductImage.attr('alt', '');\r\n }\r\n }\r\n\r\n const $groupingProductVariantImage = $productContainer.find('.js-grouping-product-variant-image');\r\n if ($groupingProductVariantImage) {\r\n if (selectedVariant && selectedVariant.image) {\r\n $groupingProductVariantImage.attr('src', selectedVariant.image.thumbnailUrl);\r\n $groupingProductVariantImage.attr('alt', selectedVariant.name);\r\n } else {\r\n $groupingProductVariantImage.attr('src', '');\r\n $groupingProductVariantImage.attr('alt', '');\r\n }\r\n }\r\n\r\n const $quantity = $productContainer.find('.js-quantity');\r\n const currentQuantity = utils.tryParseNumberOrDefault($quantity.val(), 1);\r\n const $componentContainer = $quantity.closest('[data-componentuniqueid]');\r\n const componentUniqueId = $componentContainer.data('componentuniqueid');\r\n const groupingComponent = _getGroupingComponent(componentUniqueId);\r\n\r\n if (groupingComponentProduct.initialQuantity.raw > currentQuantity) {\r\n $quantity.val(groupingComponentProduct.initialQuantity.formatted);\r\n if (groupingProductMarkup === TemplateMarkup.GroupingProductV2 &&\r\n groupingComponent.buyMode === ComponentBuyMode.MultipleProducts &&\r\n groupingComponentProduct.initialQuantity.raw >= groupingComponentProduct.minQuantity.raw)\r\n {\r\n $quantity.closest('.js-plus-minus-container-grouping-product').find('button[data-action=\"decrease\"]').removeAttr('disabled');\r\n }\r\n }\r\n\r\n _toggleQuantityValueInComponent($quantity)\r\n\r\n $productContainer.data({\r\n 'uniqueid': groupingComponentProduct.uniqueId,\r\n 'uniquekey': groupingComponentProduct.uniqueKey,\r\n 'productid': groupingComponentProduct.productId\r\n });\r\n }\r\n\r\n function _setVariantProductValues($productContainer, productId, groupingProductId, groupingProductIndex, selectedVariant) {\r\n const $componentContainer = $productContainer.closest('[data-componentuniqueid]');\r\n const componentUniqueId = $componentContainer.data('componentuniqueid');\r\n const groupingComponent = _getGroupingComponent(componentUniqueId);\r\n const componentTemplate = _getGroupingComponentTemplate(groupingComponent, groupingProductId)\r\n\r\n let componentProduct;\r\n if (productId) {\r\n componentProduct = componentTemplate.componentProducts.find(x => x.groupingProductId === groupingProductId && x.groupingProductIndex === groupingProductIndex && x.productId === productId);\r\n $productContainer.find('.js-select-product').prop('checked', true);\r\n } else {\r\n const productUniqueId = $productContainer.data('uniqueid');\r\n componentProduct = componentTemplate.componentProducts.find(x => x.uniqueId === productUniqueId);\r\n // find parent\r\n componentProduct = componentTemplate.componentProducts.find(x => x.groupingProductId === groupingProductId && x.groupingProductIndex === groupingProductIndex && x.productId === componentProduct.parentProductId);\r\n }\r\n\r\n if (componentProduct) {\r\n _setProductContainerValues($productContainer, componentProduct, selectedVariant);\r\n if (productId) {\r\n _toggleProductSelected($componentContainer, $productContainer, true);\r\n }\r\n } else {\r\n console.error(`Component product not found by id = ${productId}`);\r\n }\r\n }\r\n\r\n function _setupVariants(groupingProductId) {\r\n $groupingProductContainer.find('[data-uniqueid]').each((i, productContainer) => {\r\n const $productContainer = $(productContainer);\r\n const componentUniqueId = $productContainer.closest('[data-componentuniqueid]').data('componentuniqueid');\r\n const productUniqueId = $productContainer.data('uniqueid');\r\n const groupingProductIndex = $productContainer.data('groupingproductindex');\r\n\r\n const componentTemplate = _getGroupingComponentTemplate(_getGroupingComponent(componentUniqueId), groupingProductId)\r\n const componentProduct = _getGroupingComponentProduct(componentUniqueId, productUniqueId);\r\n\r\n if (componentProduct.isMainProductOfProductWithVariants) {\r\n $productContainer.on('variantsprocessor:beforeloadvariantproduct', (e, variantProduct, selectedVariant) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n _setVariantProductValues($productContainer, variantProduct ? variantProduct.productId : null, groupingProductId, groupingProductIndex, selectedVariant);\r\n\r\n if (!isInitializing) {\r\n priceTotals.updatePriceTotals();\r\n }\r\n });\r\n\r\n const productVariantsProcessor = variantProcessorsMap[productUniqueId];\r\n const preselectedVariantProduct = componentTemplate.componentProducts.find(x => x.parentProductId === componentProduct.productId && x.groupingProductIndex === componentProduct.groupingProductIndex && x.isPreSelected);\r\n if (preselectedVariantProduct) {\r\n productVariantsProcessor.selectVariantByProductId(preselectedVariantProduct.productId);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function _setupGroupingProductVariants() {\r\n $view.on('variantsprocessor:beforeloadvariantproduct', async function onbeforeloadvariantproduct(e, variantProduct) {\r\n const groupingProductId = !!variantProduct ? variantProduct.productId : model.groupingProductId;\r\n await _generateGroupingProduct(groupingProductId);\r\n _setup(groupingProductId);\r\n });\r\n }\r\n\r\n async function _generateGroupingProduct(groupingProductId, completeCallback) {\r\n\r\n $groupingProductContainer.empty();\r\n\r\n var promises = [];\r\n\r\n model.groupingComponents.sort((x, y) => x.orderNo - y.orderNo).forEach(groupingComponent => {\r\n const componentTemplate = _getGroupingComponentTemplate(groupingComponent, groupingProductId)\r\n\r\n const templateData = {\r\n groupingComponent: componentTemplate,\r\n BuyMode: { \"SingleProduct\": 0, \"MultipleProducts\": 1, \"AllProducts\": 2, \"OneOrMoreProducts\": 3 },\r\n VariantViewType: { 0: \"dropdownvariant\", 1: \"tilesvariant\", 2: \"relimgtilesvariant\", 3: \"fancyboxrelimgtilesvariant\", 4: \"dropdownvariant2\", 5: \"dropdownvariant4\", 6: \"relimgtilesvariant2-outlet\", 7: \"tilesvariant2-outlet\", 8: \"relimgtilesvariant3-outlet\" },\r\n ComponentViewType: { \"Collapsed\": 0, \"Expanded\": 1 },\r\n settings: { showMoreInfoLink: model.showMoreInfoLinkForComponents },\r\n metadata: model.metadata\r\n };\r\n const groupingComponentContainer = _.template(groupingProductTemplate, templateData);\r\n const $groupingComponentContainer = $(groupingComponentContainer);\r\n $groupingProductContainer.append($groupingComponentContainer);\r\n groupingProductMarkup = $groupingProductContainer.find('[data-componentuniqueid]').data('markup') ?? TemplateMarkup.GroupingProductDefault;\r\n\r\n const $collapseExpandComponent = $groupingComponentContainer.find('.js-collapse-expand');\r\n const $collapseExpandCont = $groupingComponentContainer.find('.js-collapse-expand-cont');\r\n\r\n $collapseExpandComponent.on('click', (evt) => {\r\n evt.preventDefault();\r\n\r\n if ($collapseExpandCont.length) {\r\n $collapseExpandCont.collapse('toggle');\r\n }\r\n });\r\n\r\n componentTemplate.componentProducts.forEach(groupingComponentProduct => {\r\n if (groupingComponentProduct.groupingProductId === groupingProductId) {\r\n if (groupingComponentProduct.isMainProductOfProductWithVariants) {\r\n const $groupingComponentProductContainer = $groupingComponentContainer.find(`.js-grouping-product[data-uniqueid=\"${groupingComponentProduct.uniqueId}\"]`);\r\n groupingComponentProduct.variantRelImageMatchRegExp = model.variantRelImageMatchRegExp;\r\n const options = {\r\n $productContainer: $groupingComponentProductContainer,\r\n productModel: groupingComponentProduct,\r\n priceTotals: priceTotals,\r\n metadata: model.metadata,\r\n say: say,\r\n pubsub: pubsub,\r\n utils: utils,\r\n };\r\n promises.push(initVariantsProcessor(options, variantProcessorsMap));\r\n }\r\n }\r\n });\r\n });\r\n\r\n // Waiting untill all variant processors are initialized\r\n await Promise.all(promises);\r\n }\r\n\r\n function _setup(groupingProductId) {\r\n isInitializing = true;\r\n\r\n _setupControlElements();\r\n _setupVariants(groupingProductId);\r\n\r\n $groupingProductContainer.find('[data-componentuniqueid]').each((i, groupingComponentContainer) => {\r\n _setGroupingComponentStockInfo($(groupingComponentContainer))\r\n });\r\n\r\n isInitializing = false;\r\n }\r\n\r\n return {\r\n init: async function () {\r\n $groupingProductContainer = utils.$getProductContainerElements($view, '.js-grouping-product-container');\r\n if (!$groupingProductContainer) {\r\n console.error('Grouping product container was not found.')\r\n return;\r\n }\r\n\r\n var $groupingProductTemplateContainer = $('#uc209-grouping-product-template');\r\n if ($groupingProductTemplateContainer.length == 0 || !$groupingProductTemplateContainer[0].innerText) {\r\n console.error('Product is configured as package product but the package product template is not found.')\r\n new notificator(pubsub, utils).error('Produktet er konfigurert som pakkeprodukt, men pakkeproduktmalen ble ikke funnet.');\r\n return;\r\n }\r\n\r\n let groupingProductId = model.groupingProductId;\r\n\r\n const mainProductUniqueId = $view.data('uniqueid');\r\n const mainProductVariantsProcessor = variantProcessorsMap[mainProductUniqueId];\r\n if (mainProductVariantsProcessor) {\r\n const selectedVariantProduct = mainProductVariantsProcessor.getSelectedVariantProduct();\r\n if (selectedVariantProduct && selectedVariantProduct.productId) {\r\n groupingProductId = selectedVariantProduct.productId;\r\n }\r\n }\r\n\r\n groupingProductTemplate = $groupingProductTemplateContainer[0].innerText;\r\n\r\n _setupGroupingProductVariants();\r\n\r\n await _generateGroupingProduct(groupingProductId);\r\n\r\n _setup(groupingProductId);\r\n\r\n $view.on('priceTotalsProcessor:ontotalsupdated', (_, groupedTotals) => _setGroupingComponentPrices(groupedTotals));\r\n },\r\n }\r\n }\r\n\r\n function util() {\r\n function _$getProductContainerFor(elem) {\r\n // It is the requirement that every product container should have data-uniqueid attirbute\r\n return $(elem).closest('[data-uniqueid]');\r\n }\r\n function _tryParseNumberOrDefault(rawValue, defaultValue) {\r\n var parsed;\r\n\r\n if (typeof rawValue === 'string') {\r\n parsed = parseFloat(rawValue.replace(',', '.'));\r\n } else {\r\n parsed = rawValue;\r\n }\r\n\r\n return parsed === 0 ? parsed : parsed || defaultValue || 0;\r\n }\r\n\r\n return {\r\n tryParseNumberOrDefault: _tryParseNumberOrDefault,\r\n $getProductContainerFor: _$getProductContainerFor,\r\n $getProductContainerElements: function ($container, selector) {\r\n // There might be situations when there are multiple product containers with the similar elements from differen products inside another product container.\r\n // An example: additional products that are rendered inside the general product's container.\r\n // In addition, there can be situations when the same product is rendered multiple times as additional or both as additional and as general product.\r\n // So, if we will try to find elements by selector, e.g. $view.find('.js-variant-selector') then jQuery will find variant selectors of the current product container and also all variant selectors of all nested product containers.\r\n // Therefore, we need to know for sure what elements belong to the current product container.\r\n // We can rely on the closest container with the data-uniqueid attribute (since it is a requirement to have it) and then compare the found element with the container from arguments.\r\n return $container.find(selector).filter(function () { return _$getProductContainerFor(this).is($container); });\r\n },\r\n trimAndLowerCase: function (str) {\r\n return (str || '').trim().toLowerCase();\r\n },\r\n caseInsensetiveEquals: function (str1, str2) {\r\n return typeof str1 === 'string' && typeof str2 === 'string'\r\n ? str1.trim().toLowerCase() === str2.trim().toLowerCase()\r\n : str1 === str2;\r\n },\r\n extractErrorMessageFromResponse: function (errorResponse) {\r\n var message;\r\n if (typeof errorResponse === 'object' && errorResponse !== null) {\r\n // Extract error message\r\n try {\r\n var parsedResponseBody = JSON.parse(errorResponse.responseText);\r\n message = parsedResponseBody.ExceptionMessage ? parsedResponseBody.ExceptionMessage : (parsedResponseBody.Message ? parsedResponseBody.Message : errorResponse.statusText);\r\n } catch (e) {\r\n message = errorResponse.statusText;\r\n }\r\n } else {\r\n message = errorResponse;\r\n }\r\n\r\n return message;\r\n },\r\n initQuantityModifyButtons2: function ($container, selector) {\r\n $container.find(selector).each(function(i, element){\r\n let $this = {\r\n \"quantity\": $(element).find('input'),\r\n \"button\": $(element).find('button'),\r\n \"label\": $(element).find('label'),\r\n \"labelQuantityText\": $(element).find('.js-quantity-text')\r\n }\r\n const _allowMinBreak = $(element).data('allow-min-break');\r\n const _stepAttr = _tryParseNumberOrDefault($this.quantity.attr('step'), 1);\r\n const _minAttrAllowedQuantity = _tryParseNumberOrDefault($this.quantity.attr('min'), 0);\r\n const _minDataAttrAllowedQuantity = _tryParseNumberOrDefault($this.quantity.data('min-quantity'), 0); //Has higher priority over minAllowedQuantity\r\n const _minAllowedQuantity = Math.max(_minAttrAllowedQuantity, _minDataAttrAllowedQuantity);\r\n\r\n let _quantity = _tryParseNumberOrDefault($this.quantity.val());\r\n\r\n $this.quantity.on('change', function () {\r\n const userTypedQuantity = _tryParseNumberOrDefault($this.quantity.val());\r\n\r\n if (_allowMinBreak === true) {\r\n _quantity = userTypedQuantity < _minAllowedQuantity ? 0 : userTypedQuantity;\r\n _quantity == 0 || _quantity < _minAllowedQuantity ? _disableDecreaseButton() : _enableDecreaseButton();\r\n } else{\r\n _quantity = Math.max(_minAllowedQuantity, userTypedQuantity);\r\n _quantity <= _minAllowedQuantity ? _disableDecreaseButton() : _enableDecreaseButton();\r\n }\r\n\r\n _updateView(_quantity, true);\r\n });\r\n\r\n $this.button.on('click', function () {\r\n const newQuantityValue = _tryParseNumberOrDefault($this.quantity.val()); //Protects in case it was set progrematically by other cotnrols\r\n switch ($(this).data('action')) {\r\n case 'decrease':\r\n if(_validateDecreaseAction(newQuantityValue)){\r\n _quantity = _getDecreasedQuantity(_quantity);\r\n _updateView(_quantity, true);\r\n _triggerQuantityInput();\r\n }\r\n break;\r\n case 'increase':\r\n _quantity = _getIncreasedQuantity(newQuantityValue);\r\n _updateView(_quantity, true);\r\n _triggerQuantityInput();\r\n break;\r\n }\r\n });\r\n\r\n const _triggerQuantityInput = () => {\r\n $this.quantity.trigger('change');\r\n $this.quantity.trigger('focusout'); // focusout triggers min/max validation check\r\n }\r\n\r\n const _enableDecreaseButton = () => {\r\n $($this.button[0]).removeAttr('disabled');\r\n };\r\n\r\n const _disableDecreaseButton = () => {\r\n $($this.button[0]).attr('disabled', 'disabled');\r\n };\r\n\r\n const _updateView = (value, formatValueFlag) => {\r\n const quantityFormated = formatValueFlag ? _formatQuantity(value) : value;\r\n $this.labelQuantityText.text(quantityFormated);\r\n $this.quantity.val(quantityFormated);\r\n _quantity = value;\r\n };\r\n\r\n const _formatQuantity = (value) => {\r\n const quantityHasDot = $this.quantity.val().indexOf('.') > 0;\r\n return quantityHasDot ? value.toFixed(1) : value.toFixed(0)\r\n }\r\n\r\n const _validateDecreaseAction = (quantity) => {\r\n return _getDecreasedQuantity(quantity) >= (_allowMinBreak === true ? 0 : _minAllowedQuantity);\r\n }\r\n\r\n const _getDecreasedQuantity = (quantity) => {\r\n return _allowMinBreak === true\r\n ? quantity - _stepAttr < _minAllowedQuantity ? 0 : quantity - _stepAttr\r\n : quantity - _stepAttr <= _minAllowedQuantity ? _minAllowedQuantity : quantity - _stepAttr;\r\n };\r\n\r\n const _getIncreasedQuantity = (quantity) => {\r\n return quantity + _stepAttr < _minAllowedQuantity ? _minAllowedQuantity : quantity + _stepAttr;\r\n };\r\n })\r\n },\r\n initQuantityModifyButtons: function ($container, selector) {\r\n $container.find(selector).on('click', function () {\r\n const $this = $(this);\r\n const dataAttributes = {\r\n actionType: $this.data('action'),\r\n quantityTxbId: $this.data('target'),\r\n };\r\n\r\n const $quantityInput = $('#' + dataAttributes.quantityTxbId);\r\n const quantityMin = $quantityInput.attr('min') || 0;\r\n const quantityMax = $quantityInput.attr('max');\r\n let quantity = _tryParseNumberOrDefault($quantityInput.val());\r\n\r\n switch (dataAttributes.actionType) {\r\n case 'decrease':\r\n quantity = --quantity;\r\n if (quantity <= quantityMin) {\r\n quantity = quantityMin;\r\n $this.attr('disabled', 'disabled');\r\n } else {\r\n $this.parent().find('[data-action=\"increase\"]').removeAttr('disabled');\r\n }\r\n break;\r\n case 'increase':\r\n quantity = ++quantity;\r\n if (quantityMax && quantity >= quantityMax) {\r\n quantity = quantityMax;\r\n $this.attr('disabled', 'disabled');\r\n } else {\r\n $this.parent().find('[data-action=\"decrease\"]').removeAttr('disabled');\r\n }\r\n break;\r\n }\r\n\r\n if (quantity < 0) {\r\n $quantityInput.val(0);\r\n } else {\r\n quantity = Math.round(quantity * 10) / 10;\r\n $quantityInput.val(quantity);\r\n }\r\n $quantityInput.trigger('change');\r\n $quantityInput.trigger('focusout'); // focusout triggers min/max validation check\r\n });\r\n }\r\n }\r\n }\r\n})(jQuery, _, window);"],"names":["$","_","root","undefined","assetId","productViewController","$viewContainer","productViewModel","model","pubsub","PubSub","utils","util","say","notificator","variantProcessorsMap","priceTotals","discountID","console","info","title","init","importShim","then","async","$view","quantityDiscounts","quantityDiscountsProcessor","externalTracking","externalTrackingProcessor","priceTotalsProcessor","isProductWithVariants","preselectedVariants","result","queryString","location","search","slice","re","match","exec","paramKey","decodeURIComponent","toLowerCase","paramValue","replace","initVariantsProcessor","$productContainer","productModel","quantityDiscountsProcessorInstance","externalTrackingProcessorInstance","enableHistoryState","metadata","isVariantProductOfProductWithVariants","renderQuantityDiscounts","packageComponentProducts","each","packageComponent","$componentProductContainer","isMainProductOfProductWithVariants","find","uniqueId","variantRelImageMatchRegExp","packageComponentProcessor","groupingComponents","await","groupingProductProcessor","showCalculateShippingTool","on","evt","quantity","val","document","querySelector","shippingProducts","productId","additionalProducts","additionalProduct","$additionalProductContainer","updatePriceTotals","cartProcessor","flagsProcessor","ratingProcessor","shoppingListProcessor","isPrintEnabled","printProcessor","pdfProcessor","isPriceRequestEnabled","$feedbackControlContainer","$feedbackControlContainer2","$priceRequestContainerBtn","length","fancybox","open","parentEl","src","type","galleryProcessor","reportProductsView","isProductRelationsExtensionEnabled","relationExtensionDataProcessor","similarProductsSelect","window","e","target","selectedOptions","dataset","url","showWarehouseStockInfo","warehouseStocks","get","setData","setStockStatusTooltip","_notify","message","notificationType","timeout","extractErrorMessageFromResponse","publish","text","maxVisible","error","alert","success","warning","apply","this","variantsProcessor","product","priceTotalsController","$container","$declaredVariantSelectors","$getProductContainerElements","variantControllers","isVariantProductShown","suppressVariantProductDetailsLoading","variantsState","controlId","selectedVariantProd","suppressVariantChangedEvent","currentlyUnavailableVariantsMap","_onVariantSelectionChanged","changedVariantType","newVariantValue","variantTypeId","id","changedVariantController","prevVariantValue","selectedValue","selectedVariantValues","_getSelectedVariants","selectedVariantProduct","_getSelectedVariantProduct","_loadVariantProductDetails","variants","x","_filterUnavailableVariants","Object","values","forEach","variantController","push","isAnyVariantSelected","variantProducts","variantProduct","isProductForCurrentSelection","every","selectedVariantOption","variantId","availabilityMessage","disabled","disableSelection","exists","isAvailable","preselectSingleAvailable","isEmpty","variantType","name","selector","filterVariants","selectedVariant","beforeLoadEvent","Event","trigger","isDefaultPrevented","blockUI","selectedVariants","$sellPriceFormatted","isSellPriceVisible","showPrice","is","ajax","R","data","a","ItemID","itemId","Dim1","Dim2","Dim3","CanHandleDisallowedBuyDims","ImageWidth","previewImageWidth","ImgMod","previewImageMode","InclVat","sellPrice","inclVat","includeWarehouseStock","priceVisible","always","unblockUI","done","variantProductDetails","_updateViewProductWithNewData","newData","oldStockCssClass","IsMainProd","$priceFromText","toggle","ProductID","prodno","ProdNo","FullTitle","reportProductDetailsView","ImageURL","mainImage","ImageID","ImageText","description","actualWidth","ImageActualWidth","actualHeight","ImageActualHeight","thumbnailUrl","ImageRelURL","previewUrl","fullSizeUrl","ImageLBURL","displayWidth","ImagePreviewDisplayWidth","displayHeight","ImagePreviewDisplayHeight","$mainImage","attr","galleryId","$mainImageGalleryLink","closest","stockText","StockText","stockColor","StockColor","stockCssClass","$stockText","StockCssClass","$addProductToCartButton","hasClass","removeClass","addClass","hasDiscountCssClass","HasDiscount","dontShowDiscountForMainProduct","$vippsHurtigkasseButton","AllowBuy","show","prop","hide","stockDataColorVariable","css","style","setProperty","removeAttr","formatted","Price","raw","PriceRaw","beforePrice","sellPriceWithVAT","PriceInclVat","$sellPriceWithVatFormatted","sellPriceWithoutVAT","PriceExclVat","$sellPriceWithoutVatFormatted","OriginalPrice","$beforePriceFormatted","$beforePriceElements","add","parent","discountPrice","Discount","$discountPriceFormatted","$discountPriceElements","discountPercent","DiscountPercent","$discountPercentFormatted","$discountPercentElements","discountToDate","DiscountToDate","$discountToDateFormatted","$discountToDateElements","DiscountID","comparablePrice","ComparablePrice","$comparablePriceFormatted","factorPrice","FactorPrice","$factorPriceFormatted","productInFactorPrice","ProductInFactorPrice","$productInFactorPriceFormatted","$replacementProductContainer","ReplacementProductInfo","empty","html","qrCode","productIds","history","urlParts","href","split","resultUrl","removeQueryStringParam","setQueryStringParam","pushState","fail","errorResponse","_selectVariantControllersValues","isFromHistory","preselectVariantTypeValue","y","indexOf","setSelected","_onHistoryPopState","state","originalEvent","_selectVariantByName","variantTypeName","variantValueName","controller","caseInsensetiveEquals","setSelectedByName","variantProductsForSelection","filter","map","currentController","_getNotSelectedVariants","showPricesInclVat","promises","$selector","viewBuilderName","loadAdditionalInfoDataAttrValue","let","loadAdditionalInfo","createVariantSelector","Map","entries","variantTypes","variantControllerKey","$elem","Promise","all","selectors","render","keys","key","reduce","newObj","_processVariants","variantTypeToProductInfoMap","selectedVariantTypes","selectedVariantOptions","discountInfo","processVariants","initialVariantProduct","preselectedVariantValue","preselectedVariantType","replaceState","catch","$selectors","getSelectedVariantProduct","getNotSelectedVariants","selectVariantByName","selectVariantByProductId","variantProductId","selectVariantValue","isVariantsSelectionValid","prodTitle","notSelectedVariantNames","notSelectedVariants","isSelectionValid","idx","options","processor","stockStatusTooltip","supplierOrderInfo","shadowRoot","stockTextTooltip","$stockTextInfoIcon","showStockStatusTooltip","stockStatusTooltipInfo","inSupplierOrder","InSupplierOrder","visible","tooltipText","innerHTML","update","hasSupplierOrderInfo","estore","PublicEStore","productsInCartMap","productsToCustomFieldIdsForOrderMap","vippsDialogModule","vippsDialog","shouldResetOnDecisionCallback","_addToCart","addToCartContracts","$handler","when","addToCart","dataContract","setTimeout","status","items","resultItem","itemStatus","statusMessage","parseInt","componentProduct","groupingComponent","componentProducts","groupingComponentProduct","warn","productID","join","_showPublicEStoreError","tempOrderLineId","cartUrl","pefContract","exractedMessage","_toggleCartIndicator","animate","variantProductIds","variant","displayedProductId","isMainProductDisplayed","numberQuantityInCart","memo","qtyInCart","isProductInCart","$cartQuantity","$cartIndicator","effect","to","_addToCartHandler","topic","currentProduct","value","totalQuantityInTempOrderLine","_removeFromCartHandler","deletedProductId","isVariantProductOfDisplayedMainProductDeleted","some","variantProd","_emptyCartHandler","_getCartInfoHandler","cartInfo","detailedCartInfo","products","_getAddToCartContractFromContainer","buyType","parentProductId","parentProductUniqueId","packageQuantity","productUniqueId","productKey","productType","customFieldIdsForOrder","customFields","displayType","includeInOrder","fraction","tryParseNumberOrDefault","packageSize","initialQuantity","hasError","packageComponents","$packageComponentsContainer","groupingComponentProducts","$groupingProductContainer","isQuantityValid","isFormValid","validator","minQuantity","validate","ignore","$requiredField","element","productVariantsProcessor","componentContracts","concat","$groupingProductProductContainer","isSelected","groupingProductContracts","addToCartContract","$customFieldControl","customFieldId","customFieldValue","toString","imageId","componentOfPackageProductID","packageProductID","_processVippsHurtigkasseCheckout","vippsHurtigkasseComponent","deferred","Deferred","getTempOrderLines","tempOrderLinesResult","areOtherProductsInCart","$getProductContainerFor","lines","currentGroupPrices","getCurrentTotals","mainPriceGroup","g","group","productPrice","priceRaw","currentCartSum","i","linePrice","c","currentCartQuantity","dialogData","cartLink","cartCount","cartSum","setOnDecision","_onDecision","module","VippsBuyProductDialog","append","_addToCartAndResolveDeferred","reject","promise","decision","emptyCart","addToCartResult","resolve","proceedToCheckout","startCheckout","subscribe","getDetailedCartInfo","preventDefault","$buyButton","allContractsAreValid","$quantity","contracts","vippsHurtigkasse","addEventListener","persisted","jQuery","initQuantityModifyButtons","initQuantityModifyButtons2","flagsHandlerUrl","itemIds","archiveType","$flagsTarget","flags","flagDetails","class","FlagID","Name","appendTo","replaceEmptyString","_buildRatingView","ratingModel","stars","starredRatingValue","rating","wholeStar","incompleteStarValue","emptyStars","emptyStar","$ratingHtml","template","ratingData","commentsCount","ratingsCount","hasUserPostedReview","click","printPath","printUrl","pdfUrl","pdfTemplateId","fancyboxOptions","loop","hash","contractForShoppingList","showAddToCollectionPopup","additionalProductId","additionalProductModel","$wishListControl","isAddToWishListAction","isAvailableToBuy","updateWishList","prod","toggleClass","$quantityDiscountsContainer","$quantityDiscountsInfo","dim1","dim2","dim3","quantityDiscountVisibility","format","viewProductName","$additionalProducts","trim","$additionalProductsContainer","listName","additionalProductIdsWithLinks","$prod","$links","reportProductListView","productListType","relatedProducts","relationExtData","additionalProdMap","_applyExtensionData","isAnyQuantityAffected","extData","extDataItem","variantsProc","itemID","singleProduct","additionalProd","_getAdditionalProduct","relationID","quantityInRelation","variantValue","_getSelectedVariantTypeToValueNamePairs","namePairs","relationId","_oneTimeVariantProdUpdateHandler","unsubscribe","valueName","typeName","groupType","groupId","mainProductVariantsProcessor","relationIds","relationExtensionData","mainVariantValueDetails","$extDataGridsContainer","extensionDataGridTemplateCompiled","visiblePositionMap","remove","elem","variantTypeExtData","gridModel","gridTitle","columns","rows","gridHtml","relProdExtDataArray","relProdExtData","visiblePosition","rowId","groupName","position","extDataMap","row","$priceTotalsElements","additionalsGroup","defaultGroup","defaultEmptyText","updateTimer","_currentTotals","cache","_setResults","groupedTotals","totalsMap","onTotalsUpdatedEvent","hasDiscount","origPrice","price","totalsValue","$elemContainer","totals","discPrice","_updatePriceTotals","selectedProducts","productContract","productkey","prodId","cacheKey","p","splice","findIndex","shippingDetails","JSON","stringify","params","errResp","errorMessage","clearTimeout","ComponentBuyMode","SingleProduct","MultipleProducts","AllProducts","OneOrMoreProducts","TemplateMarkup","GroupingProductDefault","GroupingProductV2","groupingProductMarkup","groupingProductTemplate","isInitializing","docContentMap","_getGroupingComponentProduct","componentUniqueId","_getGroupingComponent","_getGroupingComponentTemplate","groupingProductId","componentTemplate","parse","sort","orderNo","_setPriceImpact","$productPriceImpact","currencyCode","toLocaleString","minimumFractionDigits","maximumFractionDigits","_setGroupingComponentStockInfo","$componentContainer","$stockInfoContainer","_toggleProductSelected","buyMode","_toggleQuantityValueInComponent","$positiveQuantityInputs","$allExceptEditedInput","not","_setupControlElements","$selectProductInput","next","event","$this","imageItem","imageItemSelected","imageLinkItemSelected","data-width","data-height","$quantityInput","quantityValue","$selectProduct","$infoLink","$moreInfoCont","$moreInfoContTeaser","$moreInfoContContent","hasOwnProperty","collapse","teaser","content","_setVariantProductValues","groupingProductIndex","currentQuantity","$groupingProductImage","$groupingProductVariantImage","image","uniqueid","uniquekey","uniqueKey","productid","_generateGroupingProduct","templateData","BuyMode","VariantViewType","0","1","2","3","4","5","6","7","8","ComponentViewType","Collapsed","Expanded","settings","showMoreInfoLink","showMoreInfoLinkForComponents","groupingComponentContainer","$groupingComponentContainer","$collapseExpandComponent","$collapseExpandCont","$groupingComponentProductContainer","_setup","productContainer","stopPropagation","preselectedVariantProduct","isPreSelected","$groupingProductTemplateContainer","innerText","mainProductUniqueId","_setGroupingComponentPrices","groupingComponentProductPrices","groupingProductComponent","selectedPrice","sellPriceFormatted","diffPrice","nonSelectedPrice","_$getProductContainerFor","_tryParseNumberOrDefault","rawValue","defaultValue","parsed","parseFloat","trimAndLowerCase","str","str1","str2","parsedResponseBody","responseText","ExceptionMessage","Message","statusText","button","label","labelQuantityText","_allowMinBreak","_stepAttr","_minAttrAllowedQuantity","_minDataAttrAllowedQuantity","_minAllowedQuantity","Math","max","_quantity","_triggerQuantityInput","userTypedQuantity","_disableDecreaseButton","_enableDecreaseButton","_updateView","newQuantityValue","_validateDecreaseAction","_getDecreasedQuantity","_getIncreasedQuantity","formatValueFlag","quantityFormated","_formatQuantity","toFixed","dataAttributes","quantityMin","quantityMax","round","umwAssets","ctx","mainPanelId","$mainPanel"],"mappings":"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"}