{"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\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);\r\n priceTotals.init();\r\n \r\n if (model.isProductWithVariants) {\r\n var preselectedVariants = _getPreselectedVariantsFromQueryString();\r\n _initVariantsProcessor($viewContainer, model, priceTotals, quantityDiscounts, externalTracking, preselectedVariants, true);\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 var $componentProductContainer = $viewContainer.find('.js-component-products-list .js-component-product[data-uniqueid=\"' + packageComponent.uniqueId + '\"]');\r\n packageComponent.variantRelImageMatchRegExp = model.variantRelImageMatchRegExp;\r\n _initVariantsProcessor($componentProductContainer, packageComponent, priceTotals);\r\n }\r\n });\r\n packageComponents = new PackageComponentProcessor($viewContainer, model, utils);\r\n }\r\n\r\n if (model.additionalProducts) {\r\n _.each(model.additionalProducts, function (additionalProduct) {\r\n if (additionalProduct.isProductWithVariants) {\r\n var $additionalProductContainer = $viewContainer.find('.js-additional-product[data-uniqueid=\"' + additionalProduct.uniqueId + '\"]');\r\n additionalProduct.variantRelImageMatchRegExp = model.variantRelImageMatchRegExp;\r\n _initVariantsProcessor($additionalProductContainer, additionalProduct, priceTotals);\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 _initVariantsProcessor($productContainer, productModel, priceTotals, quantityDiscountsProcessorInstance, externalTrackingProcessorInstance, preselectedVariants, enableHistoryState) {\r\n var processor = new variantsProcessor($productContainer, productModel, model.metadata, preselectedVariants, say, pubsub, priceTotals, quantityDiscountsProcessorInstance, externalTrackingProcessorInstance, utils, enableHistoryState);\r\n processor.init();\r\n\r\n variantProcessorsMap[productModel.uniqueId] = processor;\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) {\r\n _notify(message, 'warning', false);\r\n },\r\n error: function (message) {\r\n _notify(message, 'error', false);\r\n },\r\n success: function (message) {\r\n _notify(message, 'success', 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 selectedVariants = _getSelectedVariants();\r\n\r\n var selectedVariantProduct = null;\r\n\r\n var isSelectionComplete = _.every(selectedVariants, 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\r\n if (!suppressVariantProductDetailsLoading) {\r\n if (selectedVariantProduct) {\r\n _loadVariantProductDetails(selectedVariantProduct);\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(selectedVariants);\r\n }\r\n\r\n pubsub.publish('variantprocessor.variant.changed', [newVariantValue, prevVariantValue, changedVariantController]);\r\n\r\n function _getProductsForCurrentSelection() {\r\n var availableProducts = _.filter(product.variantProducts, function (x) {\r\n return _.every(selectedVariants, function (y) { return _.indexOf(x.variants, y) !== -1; });\r\n });\r\n\r\n return availableProducts;\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\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 _loadVariantProductDetails(variantProduct) {\r\n var beforeLoadEvent = $.Event('variantsprocessor:beforeloadvariantproduct');\r\n $container.trigger(beforeLoadEvent, [variantProduct]);\r\n\r\n if (beforeLoadEvent.isDefaultPrevented()) {\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.ImageMaxWidth,\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.removeAttr('data-height');\r\n $mainImageGalleryLink.removeData('height');\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 } else {\r\n $beforePriceElements.hide();\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 (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 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\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 getNotSelectedVariants: function () {\r\n var notSelectedVariantControllers = _.filter(variantControllers, function (x) { return !(x.selectedValue > 0); });\r\n\r\n return notSelectedVariantControllers;\r\n },\r\n selectVariantByName: _selectVariantByName,\r\n $selectors: $declaredVariantSelectors\r\n };\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 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 };\r\n\r\n function _buildViewHtml() {\r\n var templateContent = '
';\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 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 _triggerSelectorChangedEvent(newVariantValue) {\r\n var isSelectedOptionAvailable = _isSelectedAvailable();\r\n $container.trigger('variantselector:changed', [variantTypeInfo, newVariantValue, isSelectedOptionAvailable]);\r\n }\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'] }\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'] },\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'] },\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 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\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 // 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 };\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\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\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 var $variants = $tiles.find('.js-variant');\r\n\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 // 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 };\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\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\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 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 _isVariantsSelectionValid(productVariantsProcessor, prodTitle) {\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(prodTitle + ' - ' + model.metadata['pleaseSelect'] + ' ' + notSelectedVariantNames);\r\n }\r\n } else {\r\n isSelectionValid = true;\r\n }\r\n\r\n return isSelectionValid;\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 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 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 }\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 } else {\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\r\n return productModel;\r\n }\r\n\r\n function _getAddToCartContractFromContainer($productContainer, buyType, packageId, packageQuantity) {\r\n var addToCartContracts = null;\r\n\r\n var productUniqueId = $productContainer.data('uniqueid');\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 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 var productVariantsProcessor = variantProcessorsMap[productModel.uniqueId];\r\n if (_isFormValid($productContainer, productModel.title) && _isVariantsSelectionValid(productVariantsProcessor, productModel.title) && _isQuantityValid(minQuantity, quantity, productModel.title)) {\r\n var packageComponents = null, hasPackageComponentsError = 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.uniqueId, quantity);\r\n if (componentContracts) {\r\n packageComponents = packageComponents.concat(componentContracts);\r\n } else {\r\n hasPackageComponentsError = true;\r\n }\r\n });\r\n }\r\n\r\n if (!hasPackageComponentsError) {\r\n var addToCartContract = {\r\n productId: productModel.productId,\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: packageId,\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 }\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 $view.find('.js-quantity-modify-btn').on('click', function () {\r\n var dataAttributes = {\r\n actionType: $(this).data('action'),\r\n quantityTxbId: $(this).data('target')\r\n };\r\n\r\n var $quantityInput = $('#' + dataAttributes.quantityTxbId);\r\n var quantity = utils.tryParseNumberOrDefault($quantityInput.val());\r\n\r\n switch (dataAttributes.actionType) {\r\n case 'decrease':\r\n quantity = --quantity;\r\n break;\r\n case 'increase':\r\n quantity = ++quantity;\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 });\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 };\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) {\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 var $productContainer = utils.$getProductContainerFor($quantity);\r\n var productId = $productContainer.data('productid');\r\n\r\n var 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 group: groupName,\r\n prodId: productId,\r\n quantity: quantity\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 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 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 return {\r\n tryParseNumberOrDefault: function (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 $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 }\r\n }\r\n})(jQuery, _, window);"],"names":["$","_","root","undefined","pubsub","assetId","productViewController","$viewContainer","productViewModel","model","PubSub","utils","util","say","notificator","variantProcessorsMap","priceTotals","init","preselectedVariants","$view","quantityDiscounts","quantityDiscountsProcessor","externalTracking","externalTrackingProcessor","priceTotalsProcessor","isProductWithVariants","result","queryString","location","search","slice","re","match","exec","paramKey","decodeURIComponent","toLowerCase","paramValue","replace","_getPreselectedVariantsFromQueryString","_initVariantsProcessor","renderQuantityDiscounts","packageComponentProducts","each","packageComponent","$componentProductContainer","isMainProductOfProductWithVariants","find","uniqueId","variantRelImageMatchRegExp","PackageComponentProcessor","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","$productContainer","productModel","quantityDiscountsProcessorInstance","externalTrackingProcessorInstance","enableHistoryState","processor","variantsProcessor","metadata","_notify","message","notificationType","timeout","extractErrorMessageFromResponse","publish","text","maxVisible","console","error","alert","success","warning","apply","this","product","priceTotalsController","$container","$declaredVariantSelectors","$getProductContainerElements","variantControllers","isVariantProductShown","suppressVariantProductDetailsLoading","variantsState","controlId","selectedVariantProd","suppressVariantChangedEvent","currentlyUnavailableVariantsMap","_onVariantSelectionChanged","changedVariantType","newVariantValue","variantTypeId","id","variantProductsForSelection","changedVariantController","prevVariantValue","selectedValue","selectedVariants","map","currentController","selectedVariantProduct","every","x","filter","variantProducts","y","indexOf","variants","_loadVariantProductDetails","_filterUnavailableVariants","selectedVariantValues","Object","values","forEach","variantController","push","isAnyVariantSelected","variantProduct","isProductForCurrentSelection","selectedVariantOption","variantId","availabilityMessage","disabled","exists","isAvailable","preselectSingleAvailable","isEmpty","variantType","name","selector","filterVariants","beforeLoadEvent","Event","trigger","isDefaultPrevented","blockUI","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","title","FullTitle","reportProductDetailsView","ImageURL","mainImage","ImageID","ImageText","description","actualWidth","ImageMaxWidth","thumbnailUrl","ImageRelURL","previewUrl","fullSizeUrl","ImageLBURL","displayWidth","ImagePreviewDisplayWidth","displayHeight","ImagePreviewDisplayHeight","$mainImage","attr","galleryId","$mainImageGalleryLink","closest","removeAttr","removeData","stockText","StockText","stockColor","StockColor","$stockText","css","formatted","Price","raw","PriceRaw","$sellPriceFormatted","sellPriceWithVAT","PriceInclVat","$sellPriceWithVatFormatted","sellPriceWithoutVAT","PriceExclVat","$sellPriceWithoutVatFormatted","beforePrice","OriginalPrice","$beforePriceFormatted","$beforePriceElements","add","HasDiscount","show","hide","discountPrice","Discount","$discountPriceFormatted","$discountPriceElements","discountPercent","DiscountPercent","$discountPercentFormatted","$discountPercentElements","discountToDate","DiscountToDate","$discountToDateFormatted","$discountToDateElements","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","setSelected","_onHistoryPopState","evt","state","originalEvent","_selectVariantByName","variantTypeName","variantValueName","controller","caseInsensetiveEquals","setSelectedByName","$selector","viewBuilderName","viewBuilder","variantViewBuilders","variantTypes","variantSelector","$elem","keys","initialVariantProduct","preselectedVariantValue","preselectedVariantType","replaceState","getNotSelectedVariants","selectVariantByName","$selectors","fancyboxTilesVariantController","variantTypeInfo","templateData","beforeVariantRenderEvent","viewHtml","template","$tiles","$variants","$previewImage","$previewName","$selectedVariantImage","$selectVariantBtn","preventDefault","_setPreview","_setSelected","removeClass","close","append","variant","container","_setSelectedById","foundVariantValue","currentVariant","getSelected","_getSelected","unavailableVariants","$singleAvailableVariant","$this","$unavailable","unavailableVariant","showUnavailableVariants","addClass","$variantToSelect","hasClass","isVariantAlreadySelected","currentVariantValue","isSelectedOptionAvailable","$selected","is","tilesVariantController","templateContent","_sortVariants","onVariantsSortEvent","sizeMap","startsWithNumberRegEx","sortBy","enableVariantValuesManualSorting","isNumeric","orderNumber","parseInt","variantName","normalize","parseFloat","positionInSize","sizesRange","trim","matches","estore","PublicEStore","productsInCartMap","productsToCustomFieldIdsForOrderMap","vippsDialogModule","vippsDialog","_addToCart","addToCartContracts","$handler","when","addToCart","dataContract","setTimeout","status","items","resultItem","itemStatus","statusMessage","_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","value","totalQuantityInTempOrderLine","_removeFromCartHandler","deletedProductId","isVariantProductOfDisplayedMainProductDeleted","some","variantProd","_emptyCartHandler","_getCartInfoHandler","cartInfo","detailedCartInfo","products","quantity","_getAddToCartContractFromContainer","buyType","packageId","packageQuantity","productUniqueId","componentProduct","customFieldIdsForOrder","customFields","displayType","includeInOrder","fraction","tryParseNumberOrDefault","val","packageSize","initialQuantity","hasPackageComponentsError","packageComponents","$packageComponentsContainer","notSelectedVariants","notSelectedVariantNames","isSelectionValid","prodTitle","isFormValid","validator","minQuantity","productVariantsProcessor","validate","ignore","$requiredField","element","idx","isQuantityValid","componentContracts","concat","addToCartContract","$customFieldControl","customFieldId","customFieldValue","toString","imageId","componentOfPackageProductID","packageProductID","_processVippsHurtigkasseCheckout","vippsHurtigkasseComponent","deferred","Deferred","getTempOrderLines","then","tempOrderLinesResult","areOtherProductsInCart","$getProductContainerFor","lines","currentGroupPrices","getCurrentTotals","mainPriceGroup","g","group","let","productPrice","priceRaw","currentCartSum","i","linePrice","c","currentCartQuantity","dialogData","cartLink","cartCount","cartSum","module","VippsBuyProductDialog","decision","emptyCart","_addToCartAndResolveDeferred","reject","promise","addToCartResult","resolve","_prepareCartForCheckout","proceedToCheckout","startCheckout","subscribe","getDetailedCartInfo","$buyButton","allContractsAreValid","$quantity","contracts","dataAttributes","$quantityInput","Math","round","vippsHurtigkasse","import","flagsHandlerUrl","itemIds","archiveType","$flagsTarget","flags","flagDetails","class","FlagID","Name","appendTo","replaceEmptyString","_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","toggleClass","$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","selectVariantValue","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","prodId","cacheKey","JSON","stringify","params","errResp","errorMessage","clearTimeout","_$getProductContainerFor","rawValue","defaultValue","parsed","trimAndLowerCase","str","str1","str2","parsedResponseBody","parse","responseText","ExceptionMessage","Message","statusText","umwAssets","ctx","mainPanelId","$mainPanel","Date","valueOf","labels","select","$dropDownContainer","$dropDown","_triggerSelectorChangedEvent","$singleAvailableOption","$options","cleanOptionName","$option","parent","prepend","defaultArchiveImage","thumbnailImageWidth","thumbnailImageMode","thumbnailImage","width","height","relatedImages","variantNameRegex","RegExp","relatedImage","relImg","imageName","test","image","variantUniqueId","jQuery"],"mappings":"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"}