{"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 var $stockText = utils.$getProductContainerElements($container, '.js-stock-text');\r\n if ($stockText.length > 0) {\r\n $stockText.text(product.stockText);\r\n $stockText.css('color', product.stockColor || 'inherit');\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.css('color', newData.StockColor);\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.hide();\r\n } else {\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 componentTemplate.componentProducts.sort((x, y) => x.orderNo - y.orderNo);\r\n return componentTemplate;\r\n }\r\n\r\n function _toLocalFixed(number, fraction) {\r\n return number.toLocaleString(undefined, { minimumFractionDigits: fraction, maximumFractionDigits: fraction });\r\n }\r\n\r\n function _setPriceImpact($productPriceImpact, price) {\r\n $productPriceImpact.html(`${model.currencyCode} ${_toLocalFixed(price, 2)}`);\r\n if (price === 0) {\r\n $productPriceImpact.removeClass('increase');\r\n $productPriceImpact.removeClass('decrease');\r\n $productPriceImpact.addClass('noimpact');\r\n } else if (price > 0) {\r\n $productPriceImpact.addClass('increase');\r\n $productPriceImpact.removeClass('decrease');\r\n $productPriceImpact.removeClass('noimpact');\r\n } else {\r\n $productPriceImpact.removeClass('increase');\r\n $productPriceImpact.addClass('decrease');\r\n $productPriceImpact.removeClass('noimpact');\r\n }\r\n }\r\n\r\n function _setGroupingComponentStockInfo($componentContainer) {\r\n const componentUniqueId = $componentContainer.data('componentuniqueid');\r\n\r\n // stock info\r\n $componentContainer.find('[data-uniqueid]').each((i, groupingComponentProduct) => {\r\n const $productContainer = $(groupingComponentProduct);\r\n const productUniqueId = $productContainer.data('uniqueid');\r\n const componentProduct = _getGroupingComponentProduct(componentUniqueId, productUniqueId);\r\n\r\n const $stockInfoContainer = $productContainer.find('.js-stock-info');\r\n if ($stockInfoContainer) {\r\n const $stockText = $stockInfoContainer.find('.js-stock-text')\r\n if ($stockText) {\r\n $stockText.text(componentProduct.stockText);\r\n $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 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 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","preselectedVariants","$view","quantityDiscounts","quantityDiscountsProcessor","externalTracking","externalTrackingProcessor","priceTotalsProcessor","isProductWithVariants","result","queryString","location","search","slice","re","match","exec","paramKey","decodeURIComponent","toLowerCase","paramValue","replace","_getPreselectedVariantsFromQueryString","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","$priceFromText","IsMainProd","isVariantProductOfProductWithVariants","$replacementProductContainer","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","$stockText","css","formatted","Price","raw","PriceRaw","sellPriceWithVAT","PriceInclVat","$sellPriceWithVatFormatted","sellPriceWithoutVAT","PriceExclVat","$sellPriceWithoutVatFormatted","beforePrice","OriginalPrice","$beforePriceFormatted","$beforePriceElements","add","HasDiscount","show","parent","removeClass","hide","addClass","discountPrice","Discount","$discountPriceFormatted","$discountPriceElements","discountPercent","DiscountPercent","$discountPercentFormatted","$discountPercentElements","discountToDate","DiscountToDate","$discountToDateFormatted","$discountToDateElements","DiscountID","comparablePrice","ComparablePrice","$comparablePriceFormatted","factorPrice","FactorPrice","$factorPriceFormatted","productInFactorPrice","ProductInFactorPrice","$productInFactorPriceFormatted","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","_getPreselectedVariants","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","removeAttr","prepend","replaceEmptyString","productInfo","isOutlet","flagName","$this","flagId","isSelectedOptionAvailable","$selected","prefix","labels","changeSelection","select","tilesVariantController","$tiles","$variants","preventDefault","toggleClass","variant","container","_setSelectedById","$singleAvailableVariant","$unavailable","$variantToSelect","hasClass","isVariantAlreadySelected","currentVariantValue","fancyboxTilesVariantController","$previewImage","$previewName","$selectedVariantImage","$selectVariantBtn","_setPreview","close","_sortVariants","onVariantsSortEvent","sizeMap","startsWithNumberRegEx","productSizeVariantSorting","v","trim","sortBy","enableVariantValuesManualSorting","isNumeric","orderNumber","variantName","normalize","parseFloat","positionInSize","sizesRange","matches","estore","PublicEStore","productsInCartMap","productsToCustomFieldIdsForOrderMap","vippsDialogModule","vippsDialog","_addToCart","addToCartContracts","$handler","when","addToCart","dataContract","setTimeout","status","items","resultItem","itemStatus","statusMessage","componentProduct","groupingComponent","componentProducts","groupingComponentProduct","_getFirstProductModelByProductId","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","let","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","productPrice","priceRaw","currentCartSum","i","linePrice","c","currentCartQuantity","dialogData","cartLink","cartCount","cartSum","module","VippsBuyProductDialog","decision","emptyCart","_addToCartAndResolveDeferred","reject","promise","addToCartResult","resolve","_prepareCartForCheckout","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","_buildStars","$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","groupingProductComponent","_getGroupingComponent","_getGroupingComponentTemplate","groupingProductId","componentTemplate","parse","baseTemplate","mainComponentProduct","groupingProductIndex","inheritedProduct","thisTemplate","preSelectedProd","isPreSelected","sort","orderNo","_setPriceImpact","$productPriceImpact","currencyCode","toLocaleString","minimumFractionDigits","maximumFractionDigits","_setGroupingComponentStockInfo","$componentContainer","$stockInfoContainer","$stockQuantity","stockQuantity","_toggleProductSelected","_setAllComponentProductsNotSelected","buyMode","_setVariantProductValues","prop","_setProductContainerValues","$groupingProductImage","$groupingProductVariantImage","image","currentQuantity","uniqueKey","_generateGroupingProduct","ProductViewType","0","1","VariantViewType","2","3","4","settings","showMoreInfoLink","showMoreInfoLinkForComponents","groupingComponentContainer","$groupingComponentContainer","$groupingComponentProductContainer","_setup","$selectProductInput","isRequired","not","$quantityInput","$infoLink","$moreInfoCont","hasOwnProperty","collapse","productContainer","stopPropagation","preselectedVariantProduct","mainProductUniqueId","$groupingProductTemplateContainer","innerText","_setGroupingComponentPrices","groupingComponentProductPrices","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","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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"}