{"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 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 else {\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 groupingProduct.init();\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 };\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 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 || metadata['notAvailableProduct'], disabled: !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) {\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 = $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);\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 var stockDataColorVariable = $stockText.data('style-color-variable');\r\n\r\n if($stockText.hasClass(oldStockCssClass)) $stockText.removeClass(oldStockCssClass);\r\n if(product.stockCssClass) $stockText.addClass(product.stockCssClass);\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 $sellPriceFormatted.text(product.sellPrice.formatted);\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 $beforePriceFormatted.text(product.beforePrice.formatted);\r\n $beforePriceElements.show();\r\n $beforePriceElements.parent().removeClass('no-beforeprice-value');\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 $discountPercentFormatted.text('-' + product.discountPercent.formatted + '%');\r\n\r\n $discountPercentElements.show();\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').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 const supplierOrderInfoTooltip = utils.$getProductContainerElements($container, 'cms-tooltip').get(0);\r\n\r\n if (supplierOrderInfoTooltip) {\r\n const supplierOrderInfo = supplierOrderInfoTooltip.shadowRoot.querySelector('supplier-order-info');\r\n const $stockTextInfoIcon = utils.$getProductContainerElements($container, '.js-stock-text-info');\r\n\r\n if (supplierOrderInfo) {\r\n if (newData.InSupplierOrder === true) {\r\n supplierOrderInfoTooltip.visible = true;\r\n supplierOrderInfo.update(newData.ProductID);\r\n $stockTextInfoIcon.show();\r\n } else {\r\n supplierOrderInfoTooltip.visible = false;\r\n $stockTextInfoIcon.hide();\r\n }\r\n } else {\r\n console.warn('Supplier order info element not found.');\r\n }\r\n } else {\r\n console.warn('Supplier order info tooltip element not found.');\r\n }\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\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) {\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);\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);\r\n } else {\r\n _.each(variantControllers, function (x) {\r\n x.selectedValue = 0;\r\n x.selector.setSelected(0);\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: function () {\r\n $declaredVariantSelectors.each(function () {\r\n var $selector = $(this);\r\n\r\n var viewBuilderName = $selector.data('viewbuilder') || '';\r\n var viewBuilder = root.variantViewBuilders ? root.variantViewBuilders[viewBuilderName] : null;\r\n if (typeof viewBuilder === 'function') {\r\n var variantTypeId = $selector.data('varianttypeid');\r\n\r\n var variantType = _.find(product.variantTypes, function (x) { return x.id === variantTypeId; });\r\n if (variantType) {\r\n var variantSelector = new viewBuilder($selector, variantType, metadata, product);\r\n var key = 'vt' + variantTypeId;\r\n var variantController = {\r\n variantType: variantType,\r\n selectedValue: 0,\r\n selector: variantSelector,\r\n $elem: $selector\r\n };\r\n\r\n variantControllers[key] = variantController;\r\n }\r\n } else {\r\n say.error('Unknown variant selector type: ' + viewBuilderName);\r\n }\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);\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 },\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 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 processor.init();\r\n variantProcessorsMap[options.productModel.uniqueId] = processor;\r\n }\r\n\r\n // Variant view builders\r\n (function (pubsub) {\r\n if (typeof root.variantViewBuilders === 'undefined') {\r\n root.variantViewBuilders = {};\r\n }\r\n root.variantViewBuilders['dropdownvariant'] = function ($container, variantTypeInfo, metadata, product) {\r\n var templateContent = '
'\r\n + ''\r\n + '
'\r\n + '
'\r\n + ''\r\n + '
';\r\n var templateData = {\r\n id: new Date().valueOf() + '_vt' + variantTypeInfo.id,\r\n variantTypeName: variantTypeInfo.name.toLowerCase(),\r\n variants: _sortVariants($container, variantTypeInfo.variants, product),\r\n labels: { select: metadata['selectVariantPrefix'], changeSelection: metadata['changeSelectionVariantPrefix'] }\r\n };\r\n\r\n return new dropdownVariantController($container, variantTypeInfo, templateData, templateContent, product)\r\n };\r\n\r\n root.variantViewBuilders['dropdownvariant2'] = function ($container, variantTypeInfo, metadata, product) {\r\n var templateContent = '
'\r\n + ''\r\n + '
';\r\n var templateData = {\r\n id: new Date().valueOf() + '_vt' + variantTypeInfo.id,\r\n variantTypeName: variantTypeInfo.name.toLowerCase(),\r\n variants: _sortVariants($container, variantTypeInfo.variants, product),\r\n labels: { select: metadata['selectVariantPrefix'], changeSelection: metadata['changeSelectionVariantPrefix'] }\r\n };\r\n\r\n return new dropdownVariantController($container, variantTypeInfo, templateData, templateContent, product, 2)\r\n };\r\n\r\n root.variantViewBuilders['tilesvariant'] = function ($container, variantTypeInfo, metadata, product) {\r\n var templateContent = '
'\r\n + '
'\r\n + '
'\r\n + '<% _.each(variants, function(item, idx){%>'\r\n + ''\r\n + '<%});%>'\r\n + '
';\r\n var templateData = {\r\n variantTypeName: variantTypeInfo.name.toLowerCase(),\r\n variants: _sortVariants($container, variantTypeInfo.variants, product),\r\n labels: { select: metadata['selectVariantPrefix'], changeSelection: metadata['changeSelectionVariantPrefix'] }\r\n };\r\n return new tilesVariantController($container, variantTypeInfo, templateData, templateContent, product);\r\n };\r\n\r\n root.variantViewBuilders['relimgtilesvariant'] = function ($container, variantTypeInfo, metadata, product) {\r\n var templateContent = '
'\r\n + '
'\r\n + '
'\r\n + '<% _.each(variants, function(item, idx){%>'\r\n + ''\r\n + '<%});%>'\r\n + '
';\r\n var templateData = {\r\n variantTypeName: variantTypeInfo.name.toLowerCase(),\r\n variants: _sortVariants($container, variantTypeInfo.variants, product),\r\n labels: { select: metadata['selectVariantPrefix'], changeSelection: metadata['changeSelectionVariantPrefix'] },\r\n defaultArchiveImage: '\\\\viewimage.aspx?imageid=0&width=' + product.thumbnailImageWidth + '&' + product.thumbnailImageMode,\r\n thumbnailImage: {\r\n width: product.thumbnailImageWidth,\r\n height: product.thumbnailImageWidth\r\n }\r\n };\r\n\r\n if (product.relatedImages && product.relatedImages.length > 0) {\r\n _.each(templateData.variants, function (variant) {\r\n const variantName = typeof (variant.name.normalize) === 'function' ? variant.name.normalize() : variant.name;\r\n const variantNameRegex = RegExp(product.variantRelImageMatchRegExp.replace('VARIANTNAME', variantName), 'gi');\r\n\r\n var relatedImage = _.find(product.relatedImages, function (relImg) {\r\n var imageName = typeof (relImg.title.normalize) === 'function' ? relImg.title.normalize() : relImg.title;\r\n return variantNameRegex.test(imageName);\r\n });\r\n\r\n if (relatedImage) {\r\n variant.image = relatedImage;\r\n }\r\n });\r\n }\r\n return new tilesVariantController($container, variantTypeInfo, templateData, templateContent, product);\r\n };\r\n\r\n root.variantViewBuilders['fancyboxrelimgtilesvariant'] = function ($container, variantTypeInfo, metadata, product) {\r\n var templateData = {\r\n variantTypeName: variantTypeInfo.name,\r\n variants: _sortVariants($container, variantTypeInfo.variants, product),\r\n labels: { select: metadata['selectVariantPrefix'], changeSelection: metadata['changeSelectionVariantPrefix'] },\r\n variantUniqueId: product.uniqueId + '_' + variantTypeInfo.id\r\n };\r\n\r\n if (product.relatedImages && product.relatedImages.length > 0) {\r\n _.each(templateData.variants, function (variant) {\r\n const variantName = typeof (variant.name.normalize) === 'function' ? variant.name.normalize() : variant.name;\r\n const variantNameRegex = RegExp(product.variantRelImageMatchRegExp.replace('VARIANTNAME', variantName), 'gi');\r\n\r\n var relatedImage = _.find(product.relatedImages, function (relImg) {\r\n var imageName = typeof (relImg.title.normalize) === 'function' ? relImg.title.normalize() : relImg.title;\r\n return variantNameRegex.test(imageName);\r\n });\r\n\r\n if (relatedImage) {\r\n variant.image = relatedImage;\r\n }\r\n });\r\n }\r\n\r\n return new fancyboxTilesVariantController($container, variantTypeInfo, templateData, product);\r\n };\r\n\r\n function dropdownVariantController($container, variantTypeInfo, templateData, templateContent, product, version) {\r\n var viewHtml = _buildViewHtml();\r\n var $dropDownContainer = $(viewHtml);\r\n var $dropDown = $dropDownContainer.find('select');\r\n\r\n $dropDown.on('change', function (evt) {\r\n var newVariantValue = parseInt(evt.target.value) || 0;\r\n\r\n _triggerSelectorChangedEvent(newVariantValue);\r\n });\r\n\r\n $container.append($dropDownContainer);\r\n\r\n return {\r\n setSelected: _setSelected,\r\n setSelectedByName: _setSelectedByName,\r\n getSelected: _getSelected,\r\n filterVariants: function (unavailableVariants, preselectSingleAvailable) {\r\n var $singleAvailableOption;\r\n\r\n var $options = $dropDown.find('option');\r\n $options.each(function () {\r\n var $option = $(this);\r\n var variantId = $option.val();\r\n if (variantId <= 0) {\r\n return; // Default option\r\n }\r\n\r\n var cleanOptionName = $option.data('cleanname');\r\n if (typeof (cleanOptionName) === 'undefined') {\r\n cleanOptionName = $option.text();\r\n\r\n $option.data('cleanname', cleanOptionName);\r\n }\r\n\r\n const unavailableVariant = unavailableVariants[variantId];\r\n if (product.showUnavailableVariants) {\r\n if (unavailableVariant) {\r\n $option.text(cleanOptionName + ' (' + unavailableVariant.message + ')');\r\n $option.addClass('disabled');\r\n\r\n if (unavailableVariant.disabled) {\r\n $option.attr('disabled', 'disabled');\r\n }\r\n } else {\r\n $option.text(cleanOptionName);\r\n\r\n $option.removeClass('disabled');\r\n $option.removeAttr('disabled');\r\n\r\n $singleAvailableOption = typeof ($singleAvailableOption) === 'undefined' ? $option : null;\r\n }\r\n }\r\n else {\r\n if (unavailableVariant) {\r\n $option.attr('disabled', 'disabled');\r\n $option.hide();\r\n } else {\r\n $option.removeAttr('disabled');\r\n $option.show();\r\n }\r\n }\r\n });\r\n\r\n if ($singleAvailableOption && preselectSingleAvailable) {\r\n _setSelected($singleAvailableOption.val());\r\n\r\n if ($options.length === 2 && $dropDown.is(':visible')) {\r\n $dropDown.parent().prepend('' + $singleAvailableOption.text() + '');\r\n $dropDown.css('display', 'none');\r\n }\r\n }\r\n },\r\n processVariants: function (variantTypeToProductInfoMap) {\r\n var $options = $dropDown.find('option');\r\n $options.each(function () {\r\n var $option = $(this);\r\n var variantId = $option.val();\r\n if (variantId <= 0) {\r\n return; // Default option\r\n }\r\n\r\n var productInfo = variantTypeToProductInfoMap[variantId];\r\n if (productInfo && productInfo.discountInfo.isOutlet) {\r\n var replaceEmptyString = productInfo.discountInfo.flagName.replace(/\\s+/g, \"-\").toLowerCase();\r\n $this.addClass(replaceEmptyString + ' flag-' + productInfo.discountInfo.flagId + '-' + replaceEmptyString);\r\n }\r\n });\r\n }\r\n };\r\n\r\n function _buildViewHtml() {\r\n var beforeVariantRenderEvent = $.Event('variantselector:beforevariantrender');\r\n $container.trigger(beforeVariantRenderEvent, [templateData, 'dropdownvariant']);\r\n\r\n return _.template(templateContent, templateData);\r\n }\r\n\r\n function _setSelected(variantId) {\r\n var newVariantValue = parseInt(variantId) || 0;\r\n var currentVariantValue = _getSelected();\r\n var isVariantAlreadySelected = newVariantValue === currentVariantValue;\r\n\r\n if (!isVariantAlreadySelected) {\r\n $dropDown.val(newVariantValue);\r\n\r\n _triggerSelectorChangedEvent(newVariantValue);\r\n }\r\n }\r\n\r\n function _setSelectedByName(variantValueName) {\r\n if (variantValueName) {\r\n var utils = new util();\r\n var foundVariantValue = _.find(variantTypeInfo.variants, function (currentVariant) {\r\n return utils.caseInsensetiveEquals(currentVariant.name, variantValueName);\r\n });\r\n\r\n if (foundVariantValue) {\r\n _setSelected(foundVariantValue.id);\r\n }\r\n }\r\n }\r\n\r\n function _getSelected() {\r\n return parseInt($dropDown.val() || 0);\r\n }\r\n\r\n function _isSelectedAvailable() {\r\n var $selected = $dropDown.find('option:selected');\r\n\r\n // Default option (or unselected state) should be marked as available. Otherwise, unavailable variants filtering will not happen on deselection.\r\n return $selected.length === 0 || $selected.is(':not(.disabled)');\r\n }\r\n\r\n function _setVariantSelectorLabelPrefix(prefix) {\r\n if (version == 2) {\r\n var $variantSelectorLabel = $dropDown.find('.js-select-variant-label');\r\n $variantSelectorLabel.text(`${prefix} ${templateData.variantTypeName}...`);\r\n } else {\r\n var $variantSelectorLabel = $container.find('.js-select-variant-label');\r\n $variantSelectorLabel.text(`${prefix} ${templateData.variantTypeName}`);\r\n }\r\n }\r\n\r\n function _triggerSelectorChangedEvent(newVariantValue) {\r\n var isSelectedOptionAvailable = _isSelectedAvailable();\r\n $container.trigger('variantselector:changed', [variantTypeInfo, newVariantValue, isSelectedOptionAvailable]);\r\n\r\n _setVariantSelectorLabelPrefix(_getSelected() > 0\r\n ? templateData.labels.changeSelection\r\n : templateData.labels.select);\r\n }\r\n }\r\n\r\n function tilesVariantController($container, variantTypeInfo, templateData, templateContent, product) {\r\n var beforeVariantRenderEvent = $.Event('variantselector:beforevariantrender');\r\n $container.trigger(beforeVariantRenderEvent, [templateData, 'tilesvariant']);\r\n\r\n var viewHtml = _.template(templateContent, templateData);\r\n\r\n var $tiles = $(viewHtml);\r\n $tiles.on('click', function (evt) {\r\n evt.preventDefault();\r\n $(this).toggleClass(\"active\");\r\n });\r\n\r\n var $variants = $tiles.find('.js-variant');\r\n $variants.on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n var $variantToSelect = $(this);\r\n _setSelected($variantToSelect);\r\n });\r\n\r\n $container.append($tiles);\r\n pubsub.publish('variantprocessor.variant.render', { variant: templateData, container: $container });\r\n\r\n return {\r\n setSelected: _setSelectedById,\r\n setSelectedByName: _setSelectedByName,\r\n getSelected: _getSelected,\r\n filterVariants: function (unavailableVariants, preselectSingleAvailable) {\r\n var $singleAvailableVariant;\r\n\r\n $variants.each(function () {\r\n var $this = $(this);\r\n var $unavailable = $this.find('.js-unavailable-text');\r\n var variantId = $this.data('variantid');\r\n\r\n if (variantId <= 0) {\r\n return; // Default option\r\n }\r\n\r\n const unavailableVariant = unavailableVariants[variantId];\r\n\r\n if (product.showUnavailableVariants) {\r\n if (unavailableVariant) {\r\n $this.addClass('disabled');\r\n\r\n if (unavailableVariant.disabled) {\r\n $this.attr('disabled', 'disabled');\r\n }\r\n\r\n $unavailable.html(unavailableVariant.message);\r\n $unavailable.closest('.js-unavailable-text-container').show();\r\n $this.attr('title', unavailableVariant.message);\r\n } else {\r\n $this.removeClass('disabled');\r\n $this.removeAttr('disabled');\r\n\r\n $unavailable.html('');\r\n $unavailable.closest('.js-unavailable-text-container').hide();\r\n $this.removeAttr('title');\r\n\r\n $singleAvailableVariant = typeof ($singleAvailableVariant) === 'undefined' ? $this : null;\r\n }\r\n }\r\n else {\r\n if (unavailableVariant) {\r\n $this.hide();\r\n } else {\r\n $this.show();\r\n }\r\n }\r\n });\r\n\r\n // ReSharper disable once CoercedEqualsUsing\r\n if ($singleAvailableVariant && preselectSingleAvailable) {\r\n var currentValue = _getSelected();\r\n var newValue = $singleAvailableVariant.data('variantid');\r\n if (currentValue != newValue) {\r\n _setSelected($singleAvailableVariant);\r\n }\r\n }\r\n },\r\n processVariants: function (variantTypeToProductInfoMap) {\r\n $variants.each(function () {\r\n var $this = $(this);\r\n var variantId = $this.data('variantid');\r\n\r\n if (variantId <= 0) {\r\n return; // Default option\r\n }\r\n\r\n var productInfo = variantTypeToProductInfoMap[variantId];\r\n if (productInfo && productInfo.discountInfo.isOutlet) {\r\n var replaceEmptyString = productInfo.discountInfo.flagName.replace(/\\s+/g, \"-\").toLowerCase();\r\n $this.addClass(replaceEmptyString + ' flag-' + productInfo.discountInfo.flagId + '-' + replaceEmptyString);\r\n }\r\n });\r\n }\r\n };\r\n\r\n function _setSelectedById(variantId) {\r\n var $variantToSelect = $variants.filter('[data-variantid=\"' + variantId + '\"]');\r\n var isVariantAlreadySelected = $variantToSelect.hasClass('selected');\r\n\r\n if (!isVariantAlreadySelected && $variantToSelect.length === 1) {\r\n _setSelected($variantToSelect);\r\n }\r\n }\r\n\r\n function _setSelectedByName(variantValueName) {\r\n if (variantValueName) {\r\n var utils = new util();\r\n var foundVariantValue = _.find(variantTypeInfo.variants, function (currentVariant) {\r\n return utils.caseInsensetiveEquals(currentVariant.name, variantValueName);\r\n });\r\n\r\n if (foundVariantValue) {\r\n _setSelectedById(foundVariantValue.id);\r\n }\r\n }\r\n }\r\n\r\n function _setSelected($variantToSelect) {\r\n var isVariantAlreadySelected = $variantToSelect.hasClass('selected');\r\n\r\n $variants.removeClass('selected');\r\n\r\n var currentVariantValue = null;\r\n if (!isVariantAlreadySelected) {\r\n $variantToSelect.addClass('selected');\r\n currentVariantValue = $variantToSelect.data('variantid');\r\n }\r\n\r\n var isSelectedOptionAvailable = _isSelectedAvailable();\r\n $container.trigger('variantselector:changed', [variantTypeInfo, currentVariantValue || 0, isSelectedOptionAvailable]);\r\n\r\n _setVariantSelectorLabelPrefix(_getSelected() > 0\r\n ? templateData.labels.changeSelection\r\n : templateData.labels.select);\r\n }\r\n\r\n function _getSelected() {\r\n var $selected = $variants.filter('.selected');\r\n return $selected.data('variantid') || 0;\r\n }\r\n\r\n function _isSelectedAvailable() {\r\n var $selected = $variants.filter('.selected');\r\n\r\n // Default option (or unselected state) should be marked as available. Otherwise, unavailable variants filtering will not happen on deselection.\r\n return $selected.length === 0 || $selected.is(':not(.disabled)');\r\n }\r\n\r\n function _setVariantSelectorLabelPrefix(prefix) {\r\n var $variantSelectorLabel = $container.find('.js-select-variant-label');\r\n $variantSelectorLabel.text(`${prefix} ${templateData.variantTypeName}`);\r\n }\r\n\r\n }\r\n\r\n function fancyboxTilesVariantController($container, variantTypeInfo, templateData, product) {\r\n var templateContent = '
'\r\n + ''\r\n + '
'\r\n + '
\">'\r\n + '
'\r\n + '
'\r\n + '<% _.each(variants, function(item, idx){%>'\r\n + ' '\r\n + '<%});%>'\r\n + '
'\r\n + '
'\r\n + '
'\r\n + '
'\r\n + '
'\r\n + ''\r\n + '
'\r\n + '
'\r\n + '
'\r\n + '
';\r\n\r\n var beforeVariantRenderEvent = $.Event('variantselector:beforevariantrender');\r\n $container.trigger(beforeVariantRenderEvent, [templateData, 'tilesvariant']);\r\n\r\n var viewHtml = _.template(templateContent, templateData);\r\n\r\n var $tiles = $(viewHtml);\r\n var $variants = $tiles.find('.js-variant');\r\n var $previewImage = $tiles.find('.js-variant-preview-image');\r\n var $previewName = $tiles.find('.js-variant-preview-name');\r\n var $selectedVariantImage = $tiles.find('.js-selected-variant-image');\r\n var $selectVariantBtn = $tiles.find('.js-select-variant-btn');\r\n\r\n $variants.on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n var $variantToSelect = $(this);\r\n _setPreview($variantToSelect);\r\n });\r\n $selectVariantBtn.on('click', function (evt) {\r\n evt.preventDefault();\r\n\r\n var $variantToSelect = $variants.filter('.selected').removeClass('selected');\r\n _setSelected($variantToSelect);\r\n\r\n $.fancybox.close();\r\n });\r\n\r\n $container.append($tiles);\r\n pubsub.publish('variantprocessor.variant.render', { variant: templateData, container: $container });\r\n\r\n return {\r\n setSelected: _setSelectedById,\r\n setSelectedByName: _setSelectedByName,\r\n getSelected: _getSelected,\r\n filterVariants: function (unavailableVariants, preselectSingleAvailable) {\r\n var $singleAvailableVariant;\r\n\r\n $variants.each(function () {\r\n var $this = $(this);\r\n var $unavailable = $this.find('.js-unavailable-text');\r\n var variantId = $this.data('variantid');\r\n\r\n if (variantId <= 0) {\r\n return; // Default option\r\n }\r\n\r\n const unavailableVariant = unavailableVariants[variantId];\r\n\r\n if (product.showUnavailableVariants) {\r\n if (unavailableVariant) {\r\n $this.addClass('disabled');\r\n\r\n if (unavailableVariant.disabled) {\r\n $this.attr('disabled', 'disabled');\r\n }\r\n\r\n $unavailable.html(unavailableVariant.message);\r\n $unavailable.closest('.js-unavailable-text-container').show();\r\n } else {\r\n $this.removeClass('disabled');\r\n $this.removeAttr('disabled');\r\n\r\n $unavailable.html('');\r\n $unavailable.closest('.js-unavailable-text-container').hide();\r\n\r\n $singleAvailableVariant = typeof ($singleAvailableVariant) === 'undefined' ? $this : null;\r\n }\r\n }\r\n else {\r\n if (unavailableVariant) {\r\n $this.hide();\r\n } else {\r\n $this.show();\r\n }\r\n }\r\n });\r\n\r\n // ReSharper disable once CoercedEqualsUsing\r\n if ($singleAvailableVariant && preselectSingleAvailable) {\r\n var currentValue = _getSelected();\r\n var newValue = $singleAvailableVariant.data('variantid');\r\n if (currentValue != newValue) {\r\n _setSelected($singleAvailableVariant);\r\n }\r\n }\r\n },\r\n processVariants: function (variantTypeToProductInfoMap) {\r\n $variants.each(function () {\r\n var $this = $(this);\r\n var variantId = $this.data('variantid');\r\n\r\n if (variantId <= 0) {\r\n return; // Default option\r\n }\r\n\r\n var productInfo = variantTypeToProductInfoMap[variantId];\r\n if (productInfo && productInfo.discountInfo.isOutlet) {\r\n var replaceEmptyString = productInfo.discountInfo.flagName.replace(/\\s+/g, \"-\").toLowerCase();\r\n $this.addClass(replaceEmptyString + ' flag-' + productInfo.discountInfo.flagId + '-' + replaceEmptyString);\r\n }\r\n });\r\n }\r\n };\r\n\r\n function _setSelectedById(variantId) {\r\n var $variantToSelect = $variants.filter('[data-variantid=\"' + variantId + '\"]');\r\n var isVariantAlreadySelected = $variantToSelect.hasClass('selected');\r\n\r\n if (!isVariantAlreadySelected && $variantToSelect.length === 1) {\r\n _setSelected($variantToSelect);\r\n }\r\n }\r\n\r\n function _setSelectedByName(variantValueName) {\r\n if (variantValueName) {\r\n var utils = new util();\r\n var foundVariantValue = _.find(variantTypeInfo.variants, function (currentVariant) {\r\n return utils.caseInsensetiveEquals(currentVariant.name, variantValueName);\r\n });\r\n\r\n if (foundVariantValue) {\r\n _setSelectedById(foundVariantValue.id);\r\n }\r\n }\r\n }\r\n\r\n function _setPreview($variantToSelect) {\r\n var isVariantAlreadySelected = $variantToSelect.hasClass('selected');\r\n\r\n $variants.removeClass('selected');\r\n $previewImage.removeAttr('style');\r\n $previewName.empty();\r\n\r\n if (!isVariantAlreadySelected) {\r\n $variantToSelect.addClass('selected');\r\n $previewImage.attr('style', $variantToSelect.find('.js-variant-image').attr('style'));\r\n $previewName.append($variantToSelect.find('.js-variant-name').text());\r\n }\r\n }\r\n\r\n function _setSelected($variantToSelect) {\r\n var isVariantAlreadySelected = $variantToSelect.hasClass('selected');\r\n $selectedVariantImage.removeAttr('style').hide();\r\n\r\n var currentVariantValue = null;\r\n if (!isVariantAlreadySelected) {\r\n currentVariantValue = $variantToSelect.data('variantid');\r\n if (currentVariantValue > 0 && $variantToSelect.find('.js-variant-image').css('background-image') !== 'none') {\r\n $selectedVariantImage.attr('style', $variantToSelect.find('.js-variant-image').attr('style')).show();\r\n }\r\n }\r\n\r\n _setPreview($variantToSelect);\r\n\r\n var isSelectedOptionAvailable = _isSelectedAvailable();\r\n $container.trigger('variantselector:changed', [variantTypeInfo, currentVariantValue || 0, isSelectedOptionAvailable]);\r\n\r\n _setVariantSelectorLabelPrefix(_getSelected() > 0\r\n ? templateData.labels.changeSelection\r\n : templateData.labels.select);\r\n }\r\n\r\n function _getSelected() {\r\n var $selected = $variants.filter('.selected');\r\n return $selected.data('variantid') || 0;\r\n }\r\n\r\n function _isSelectedAvailable() {\r\n var $selected = $variants.filter('.selected');\r\n\r\n // Default option (or unselected state) should be marked as available. Otherwise, unavailable variants filtering will not happen on deselection.\r\n return $selected.length === 0 || $selected.is(':not(.disabled)');\r\n }\r\n\r\n function _setVariantSelectorLabelPrefix(prefix) {\r\n var $variantSelectorLabel = $container.find('.js-select-variant-label');\r\n $variantSelectorLabel.text(`${prefix} ${templateData.variantTypeName}`);\r\n }\r\n }\r\n\r\n function _sortVariants($container, variants, product) {\r\n var onVariantsSortEvent = $.Event('variantselector:onsort');\r\n $container.trigger(onVariantsSortEvent, [variants]);\r\n\r\n if (onVariantsSortEvent.isDefaultPrevented()) {\r\n return onVariantsSortEvent.result;\r\n }\r\n\r\n var sizeMap = ['xxs', '2xs', 'xx-small', 'xs', 'x-small', 's', 'small', 'm', 'medium', 'l', 'large', 'xl', 'x-large', 'xxl', '2xl', 'xx-large', 'xxxl', '3xl', 'xxx-large', '4xl', '5xl', '6xl', '7xl', '8xl', '9xl', '10xl'];\r\n\r\n if (product.productSizeVariantSorting && product.productSizeVariantSorting.length) {\r\n sizeMap = product.productSizeVariantSorting.split(';').map(v => v && v.trim().toLowerCase()).filter(v => v && v.length);\r\n }\r\n\r\n var startsWithNumberRegEx = /^\\d+/g;\r\n\r\n return _.sortBy(variants, function (variant) {\r\n\r\n if (product.enableVariantValuesManualSorting && $.isNumeric(variant.orderNumber)) {\r\n return parseInt(variant.orderNumber);\r\n }\r\n\r\n var variantName = (typeof (variant.name.normalize) === 'function' ? variant.name.normalize() : variant.name).replace(/[\\s,]/g, '').toLowerCase();\r\n\r\n if ($.isNumeric(variantName)) {\r\n return parseFloat(variantName);\r\n }\r\n\r\n var positionInSize = _.indexOf(sizeMap, variantName);\r\n if (positionInSize !== -1) {\r\n return positionInSize;\r\n }\r\n\r\n var sizesRange = variantName.split('-', 1);\r\n if (sizesRange.length) {\r\n positionInSize = _.indexOf(sizeMap, sizesRange[0].trim());\r\n if (positionInSize !== -1) {\r\n return positionInSize;\r\n }\r\n }\r\n\r\n var matches = variantName.match(startsWithNumberRegEx);\r\n if (matches && matches.length && $.isNumeric(matches[0])) {\r\n return parseFloat(matches[0]);\r\n }\r\n\r\n return undefined;\r\n });\r\n }\r\n })(root.PubSub);\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\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 vippsDialog.show(dialogData);\r\n } else {\r\n vippsDialogModule.then((module) => {\r\n vippsDialog = new module.VippsBuyProductDialog((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 $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 _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 vippsDialogModule = import('/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\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 if (model.isAvailableToBuy) {\r\n\r\n root.updateWishList(model.productId, isAddToWishListAction ? 'add' : 'remove', wishListCallback);\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 $priceRequestContainerBtn = $view.find('.js-price-request-btn');\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, variantProductDetails) {\r\n pubsub.unsubscribe(_oneTimeVariantProdUpdateHandler);\r\n\r\n if (!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 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 BuyMode = { \"SingleProduct\": 0, \"MultipleProducts\": 1, \"AllProducts\": 2 }\r\n var $groupingProductContainer;\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\r\n // making inheritance\r\n if (groupingProductId !== model.groupingProductId) {\r\n const baseTemplate = groupingComponent.componentProducts.filter(x => x.groupingProductId === model.groupingProductId);\r\n baseTemplate.forEach(mainComponentProduct => {\r\n const componentProduct = componentTemplate.componentProducts.find(x => x.productId === mainComponentProduct.productId && x.groupingProductIndex === mainComponentProduct.groupingProductIndex);\r\n if (!componentProduct) {\r\n const inheritedProduct = JSON.parse(JSON.stringify(mainComponentProduct));\r\n inheritedProduct.groupingProductId = groupingProductId;\r\n const thisTemplate = inheritedProduct.parentProductId > 0 ? groupingComponent.componentProducts.find(x => x.groupingProductId === groupingProductId && x.groupingProductIndex === inheritedProduct.groupingProductIndex && x.productId === inheritedProduct.parentProductId) : null;\r\n if (thisTemplate) {\r\n inheritedProduct.initialQuantity = inheritedProduct.minQuantity = thisTemplate.minQuantity;\r\n }\r\n const preSelectedProd = groupingComponent.componentProducts.find(x => x.groupingProductId === groupingProductId && x.groupingProductIndex === inheritedProduct.groupingProductIndex && x.isPreSelected);\r\n if (preSelectedProd && inheritedProduct.productId !== preSelectedProd.productId) {\r\n inheritedProduct.isPreSelected = false;\r\n }\r\n componentTemplate.componentProducts.push(inheritedProduct);\r\n }\r\n });\r\n }\r\n\r\n componentTemplate.componentProducts.sort((x, y) => x.orderNo - y.orderNo);\r\n\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 $stockText.css('color', componentProduct.stockColor || 'inherit');\r\n }\r\n const $stockQuantity = $stockInfoContainer.find('.js-stock-quantity')\r\n if ($stockQuantity) {\r\n $stockQuantity.text(componentProduct.stockQuantity?.formatted);\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 ? _.find(groupedTotals, 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 === BuyMode.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 === BuyMode.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 } else {\r\n $productContainer.removeClass('selected');\r\n }\r\n\r\n _setGroupingComponentStockInfo($componentContainer);\r\n }\r\n\r\n function _setupControlElements() {\r\n $groupingProductContainer.find('.js-select-product').each((i, element) => {\r\n const $selectProductInput = $(element);\r\n $selectProductInput.on('change', function (evt) {\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 && groupingComponent.isRequired && !!$componentContainer.find('input[name=\"input_name\"]:checked').not(this)) {\r\n $(this).prop('checked', true);\r\n return;\r\n }\r\n\r\n if (groupingComponent.buyMode === BuyMode.SingleProduct) {\r\n $componentContainer.find('input[name=\"' + this.name + '\"]').not(this).prop('checked', false);\r\n }\r\n\r\n _toggleProductSelected($componentContainer, $productContainer, isSelected);\r\n\r\n priceTotals.updatePriceTotals();\r\n });\r\n });\r\n\r\n $groupingProductContainer.find('.js-quantity').each((i, element) => {\r\n const $quantityInput = $(element);\r\n $quantityInput.on('change', () => {\r\n priceTotals.updatePriceTotals();\r\n });\r\n });\r\n\r\n utils.initQuantityModifyButtons($groupingProductContainer, '.js-gp-quantity-modify-btn');\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\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/getDocumentContent',\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 $moreInfoCont.html(result);\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('href', groupingComponentProduct.url);\r\n $productContainer.find('.js-grouping-product-link').attr('title', groupingComponentProduct.title);\r\n $productContainer.find('.js-grouping-product-title').html(groupingComponentProduct.title);\r\n\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 $quantity.attr('min', groupingComponentProduct.minQuantity.formatted);\r\n if (groupingComponentProduct.initialQuantity.raw > currentQuantity) {\r\n $quantity.val(groupingComponentProduct.initialQuantity.formatted);\r\n }\r\n\r\n $productContainer.data('uniqueid', groupingComponentProduct.uniqueId);\r\n $productContainer.data('uniquekey', groupingComponentProduct.uniqueKey);\r\n $productContainer.data('productid', groupingComponentProduct.productId);\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', (e, variantProduct) => {\r\n const groupingProductId = !!variantProduct ? variantProduct.productId : model.groupingProductId;\r\n _generateGroupingProduct(groupingProductId);\r\n _setup(groupingProductId);\r\n });\r\n }\r\n\r\n function _generateGroupingProduct(groupingProductId) {\r\n\r\n $groupingProductContainer.empty();\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 },\r\n ProductViewType: { 0: \"fulldata\", 1: \"buttons\" },\r\n VariantViewType: { 0: \"dropdownvariant\", 1: \"tilesvariant\", 2: \"relimgtilesvariant\", 3: \"fancyboxrelimgtilesvariant\", 4: \"dropdownvariant2\" },\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\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 initVariantsProcessor(options, variantProcessorsMap);\r\n }\r\n }\r\n });\r\n });\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: 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 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 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 groupingProductTemplate = $groupingProductTemplateContainer[0].innerText;\r\n\r\n _setupGroupingProductVariants();\r\n\r\n _generateGroupingProduct(groupingProductId);\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 var $this = {\r\n \"quanity\": $(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\r\n const quantityMinAttr = _tryParseNumberOrDefault($this.quanity.attr('min'), 0);\r\n const stepAttr = _tryParseNumberOrDefault($this.quanity.attr('step'), 1);\r\n let quantity = _tryParseNumberOrDefault($this.quanity.val());\r\n const quantityHasDot = $this.quanity.val().indexOf('.') > 0;\r\n\r\n $this.quanity.on('change', function () {\r\n const changedQuantity = _tryParseNumberOrDefault($this.quanity.val());\r\n const changedQuantityFormated = quantityHasDot ? changedQuantity.toFixed(1) : changedQuantity.toFixed(0);\r\n\r\n if (changedQuantity < 0 ){\r\n $this.labelQuantityText.text(0);\r\n $this.quanity.val(0);\r\n quantity = 0;\r\n $($this.button[0]).attr('disabled', 'disabled');\r\n } else{\r\n $this.labelQuantityText.text(changedQuantityFormated);\r\n $this.quanity.val(changedQuantityFormated);\r\n quantity = changedQuantity;\r\n }\r\n })\r\n\r\n $this.button.on('click', function () {\r\n switch ($(this).data('action')) {\r\n case 'decrease':\r\n quantity = quantity - stepAttr;\r\n if (quantity <= quantityMinAttr) {\r\n quantity = quantityMinAttr;\r\n $(this).attr('disabled', 'disabled');\r\n }\r\n break;\r\n case 'increase':\r\n quantity = quantity + stepAttr;\r\n $($this.button[0]).removeAttr('disabled');\r\n break;\r\n }\r\n\r\n if (quantity < 0) {\r\n $this.quanity.val(0);\r\n } else {\r\n $this.quanity.val(function()\r\n {\r\n return quantityHasDot ? quantity.toFixed(1) : quantity;\r\n }\r\n );\r\n }\r\n\r\n $this.quanity.trigger('change');\r\n $this.quanity.trigger('focusout'); // focusout triggers min/max validation check\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","pubsub","assetId","productViewController","$viewContainer","productViewModel","model","PubSub","utils","util","say","notificator","variantProcessorsMap","priceTotals","discountID","console","info","title","init","$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","renderQuantityDiscounts","packageComponentProducts","each","packageComponent","$componentProductContainer","isMainProductOfProductWithVariants","find","uniqueId","variantRelImageMatchRegExp","packageComponentProcessor","groupingComponents","groupingProductProcessor","additionalProducts","additionalProduct","$additionalProductContainer","updatePriceTotals","cartProcessor","flagsProcessor","ratingProcessor","shoppingListProcessor","isPrintEnabled","printProcessor","pdfProcessor","isPriceRequestEnabled","$feedbackControlContainer","$priceRequestContainerBtn","length","on","fancybox","open","parentEl","src","type","galleryProcessor","reportProductsView","isProductRelationsExtensionEnabled","relationExtensionDataProcessor","similarProductsSelect","window","e","target","selectedOptions","dataset","url","showWarehouseStockInfo","warehouseStocks","get","setData","_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","exists","isAvailable","preselectSingleAvailable","isEmpty","variantType","name","selector","filterVariants","selectedVariant","beforeLoadEvent","Event","trigger","isDefaultPrevented","blockUI","selectedVariants","isSellPriceVisible","$sellPriceFormatted","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","IsMainProd","isVariantProductOfProductWithVariants","$priceFromText","toggle","productId","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","oldStockCssClass","stockCssClass","$stockText","StockCssClass","stockDataColorVariable","hasClass","removeClass","addClass","css","style","setProperty","removeAttr","formatted","Price","raw","PriceRaw","sellPriceWithVAT","PriceInclVat","$sellPriceWithVatFormatted","sellPriceWithoutVAT","PriceExclVat","$sellPriceWithoutVatFormatted","beforePrice","OriginalPrice","$beforePriceFormatted","$beforePriceElements","add","HasDiscount","show","parent","hide","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","supplierOrderInfoTooltip","supplierOrderInfo","shadowRoot","querySelector","$stockTextInfoIcon","InSupplierOrder","visible","update","warn","history","urlParts","href","split","resultUrl","removeQueryStringParam","setQueryStringParam","pushState","fail","errorResponse","_selectVariantControllersValues","preselectVariantTypeValue","y","indexOf","setSelected","_onHistoryPopState","evt","state","originalEvent","_selectVariantByName","variantTypeName","variantValueName","controller","caseInsensetiveEquals","setSelectedByName","variantProductsForSelection","filter","map","currentController","_getNotSelectedVariants","$selector","viewBuilderName","viewBuilder","variantViewBuilders","variantTypes","variantSelector","$elem","keys","_processVariants","variantTypeToProductInfoMap","selectedVariantTypes","selectedVariantOptions","discountInfo","processVariants","initialVariantProduct","preselectedVariantValue","preselectedVariantType","replaceState","$selectors","getSelectedVariantProduct","getNotSelectedVariants","selectVariantByName","selectVariantByProductId","variantProductId","selectVariantValue","isVariantsSelectionValid","prodTitle","notSelectedVariantNames","notSelectedVariants","isSelectionValid","idx","options","processor","dropdownVariantController","variantTypeInfo","templateData","templateContent","version","beforeVariantRenderEvent","viewHtml","template","$dropDownContainer","$dropDown","_triggerSelectorChangedEvent","parseInt","value","append","_setSelected","foundVariantValue","currentVariant","getSelected","_getSelected","unavailableVariants","$singleAvailableOption","$options","cleanOptionName","$option","val","unavailableVariant","showUnavailableVariants","prepend","replaceEmptyString","productInfo","isOutlet","flagName","$this","flagId","isSelectedOptionAvailable","$selected","prefix","labels","changeSelection","select","tilesVariantController","$tiles","$variants","preventDefault","toggleClass","variant","container","_setSelectedById","$singleAvailableVariant","$unavailable","$variantToSelect","isVariantAlreadySelected","currentVariantValue","fancyboxTilesVariantController","$previewImage","$previewName","$selectedVariantImage","$selectVariantBtn","_setPreview","close","_sortVariants","sizeMap","startsWithNumberRegEx","onVariantsSortEvent","productSizeVariantSorting","v","trim","sortBy","positionInSize","matches","enableVariantValuesManualSorting","isNumeric","orderNumber","variantName","normalize","parseFloat","sizesRange","estore","PublicEStore","productsInCartMap","productsToCustomFieldIdsForOrderMap","vippsDialogModule","vippsDialog","_addToCart","addToCartContracts","$handler","when","addToCart","dataContract","setTimeout","status","items","resultItem","itemStatus","statusMessage","componentProduct","groupingComponent","componentProducts","groupingComponentProduct","productID","join","_showPublicEStoreError","tempOrderLineId","cartUrl","pefContract","exractedMessage","_toggleCartIndicator","animate","variantProductIds","displayedProductId","isMainProductDisplayed","numberQuantityInCart","reduce","memo","qtyInCart","isProductInCart","$cartQuantity","$cartIndicator","effect","to","_addToCartHandler","topic","currentProduct","totalQuantityInTempOrderLine","_removeFromCartHandler","deletedProductId","isVariantProductOfDisplayedMainProductDeleted","some","variantProd","_emptyCartHandler","_getCartInfoHandler","cartInfo","detailedCartInfo","products","quantity","_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","then","tempOrderLinesResult","areOtherProductsInCart","$getProductContainerFor","lines","currentGroupPrices","getCurrentTotals","mainPriceGroup","g","group","let","productPrice","priceRaw","currentCartSum","i","linePrice","c","currentCartQuantity","dialogData","cartLink","cartCount","cartSum","module","VippsBuyProductDialog","decision","emptyCart","_addToCartAndResolveDeferred","reject","promise","addToCartResult","resolve","proceedToCheckout","startCheckout","subscribe","getDetailedCartInfo","$buyButton","allContractsAreValid","$quantity","contracts","vippsHurtigkasse","import","initQuantityModifyButtons","initQuantityModifyButtons2","flagsHandlerUrl","itemIds","archiveType","$flagsTarget","flags","flagDetails","class","FlagID","Name","appendTo","_buildRatingView","ratingModel","stars","starredRatingValue","rating","wholeStar","incompleteStarValue","emptyStars","emptyStar","$ratingHtml","ratingData","commentsCount","ratingsCount","hasUserPostedReview","click","printPath","printUrl","pdfUrl","pdfTemplateId","fancyboxOptions","loop","hash","contractForShoppingList","showAddToCollectionPopup","additionalProductId","additionalProductModel","$wishListControl","isAddToWishListAction","isAvailableToBuy","updateWishList","prod","$quantityDiscountsContainer","$quantityDiscountsInfo","dim1","dim2","dim3","showPrice","quantityDiscountVisibility","format","viewProductName","$additionalProducts","document","$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","productContract","productkey","prodId","cacheKey","JSON","stringify","async","params","errResp","errorMessage","clearTimeout","BuyMode","SingleProduct","MultipleProducts","AllProducts","groupingProductTemplate","isInitializing","docContentMap","_getGroupingComponentProduct","componentUniqueId","_getGroupingComponent","_getGroupingComponentTemplate","groupingProductId","componentTemplate","parse","mainComponentProduct","groupingProductIndex","inheritedProduct","thisTemplate","preSelectedProd","isPreSelected","sort","orderNo","_setPriceImpact","$productPriceImpact","currencyCode","toLocaleString","minimumFractionDigits","maximumFractionDigits","_setGroupingComponentStockInfo","$componentContainer","$stockQuantity","$stockInfoContainer","stockQuantity","_toggleProductSelected","buyMode","_setVariantProductValues","currentQuantity","prop","$groupingProductImage","$groupingProductVariantImage","image","uniqueKey","_generateGroupingProduct","ProductViewType","0","1","VariantViewType","2","3","4","ComponentViewType","Collapsed","Expanded","settings","showMoreInfoLink","showMoreInfoLinkForComponents","groupingComponentContainer","$groupingComponentContainer","$collapseExpandComponent","$collapseExpandCont","collapse","$groupingComponentProductContainer","_setup","$selectProductInput","isRequired","not","$infoLink","$moreInfoCont","hasOwnProperty","productContainer","stopPropagation","preselectedVariantProduct","mainProductUniqueId","$groupingProductTemplateContainer","innerText","_setGroupingComponentPrices","groupingComponentProductPrices","groupingProductComponent","selectedPrice","sellPriceFormatted","diffPrice","nonSelectedPrice","_$getProductContainerFor","_tryParseNumberOrDefault","rawValue","defaultValue","parsed","trimAndLowerCase","str","str1","str2","parsedResponseBody","responseText","ExceptionMessage","Message","statusText","quanity","button","label","labelQuantityText","quantityMinAttr","stepAttr","quantityHasDot","changedQuantity","changedQuantityFormated","toFixed","dataAttributes","$quantityInput","quantityMin","quantityMax","Math","round","umwAssets","ctx","mainPanelId","$mainPanel","Date","valueOf","defaultArchiveImage","thumbnailImageWidth","thumbnailImageMode","thumbnailImage","width","height","relatedImages","variantNameRegex","RegExp","relatedImage","relImg","imageName","test","variantUniqueId","jQuery"],"mappings":"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"}