{"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 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 $.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 }\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,\r\n variants: _sortVariants($container, variantTypeInfo.variants, product),\r\n labels: { select: metadata['selectVariantPrefix'] }\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,\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,\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,\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 var $variantSelectorLabel = $dropDown.find('.js-select-variant-label');\r\n $variantSelectorLabel.text(`${prefix} ${templateData.variantTypeName}...`);\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 if (version == 2) {\r\n _setVariantSelectorLabelPrefix(_getSelected() > 0\r\n ? templateData.labels.changeSelection\r\n : templateData.labels.select);\r\n }\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');\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\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 // Initial calculation - some quantities may be pre-set\r\n _updatePriceTotals();\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 _setGroupingComponentPricesAndStockInfo($componentContainer) {\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 selectedPrice = componentProduct.sellPrice.raw * quantity;\r\n\r\n $productContainer.find('.js-grouping-product-price').html(componentProduct.sellPrice.formatted);\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 nonSelectedPrice = componentProduct.sellPrice.raw * quantity;\r\n const diffPrice = groupingProductComponent.buyMode === BuyMode.SingleProduct ? nonSelectedPrice - selectedPrice : nonSelectedPrice;\r\n\r\n $productContainer.find('.js-grouping-product-price').html(componentProduct.sellPrice.formatted);\r\n _setPriceImpact($productContainer.find('.js-grouping-product-price-impact'), diffPrice);\r\n });\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 _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 _setGroupingComponentPricesAndStockInfo($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 const $groupingComponentContainer = $quantityInput.closest('[data-componentuniqueid]');\r\n _setGroupingComponentPricesAndStockInfo($groupingComponentContainer);\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 _setGroupingComponentPricesAndStockInfo($(groupingComponentContainer))\r\n });\r\n\r\n priceTotals.updatePriceTotals();\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 }\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 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","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","ajax","R","data","a","ItemID","itemId","Dim1","Dim2","Dim3","CanHandleDisallowedBuyDims","ImageWidth","previewImageWidth","ImgMod","previewImageMode","InclVat","sellPrice","inclVat","includeWarehouseStock","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","$sellPriceFormatted","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","updatePriceTotals","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","is","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","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","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","_setGroupingComponentPricesAndStockInfo","$componentContainer","selectedPrice","diffPrice","nonSelectedPrice","buyMode","$stockInfoContainer","$stockQuantity","stockQuantity","_toggleProductSelected","_setAllComponentProductsNotSelected","_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","_$getProductContainerFor","_tryParseNumberOrDefault","rawValue","defaultValue","parsed","trimAndLowerCase","str","str1","str2","parsedResponseBody","responseText","ExceptionMessage","Message","statusText","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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"}