{"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);\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 };\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 });\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() {\r\n var selectedVariantTypes = [];\r\n var selectedVariantOptions = [];\r\n _.each(variantControllers, variantController => {\r\n if (variantController.selectedValue > 0) {\r\n selectedVariantTypes.push(variantController.variantType.id);\r\n selectedVariantOptions.push(variantController.selectedValue);\r\n }\r\n });\r\n\r\n const isAnyVariantSelected = selectedVariantOptions.length > 0;\r\n // assuming that all variants unavailable\r\n product.variantProducts.forEach(variantProduct => {\r\n var isProductForCurrentSelection = selectedVariantOptions.every(selectedVariantOption => variantProduct.variants.find(x => x === selectedVariantOption));\r\n if (!isAnyVariantSelected || isProductForCurrentSelection) {\r\n variantProduct.variants.forEach(variantId => {\r\n currentlyUnavailableVariantsMap[variantId] = currentlyUnavailableVariantsMap[variantId] = { message: variantProduct.availabilityMessage || metadata['notAvailableProduct'], disabled: !variantProduct.exists };\r\n });\r\n }\r\n });\r\n // set available\r\n product.variantProducts.forEach(variantProduct => {\r\n var isProductForCurrentSelection = selectedVariantOptions.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 }\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 delete product.sellPrice.raw; // 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 }\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();\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 (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\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);\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);\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);\r\n };\r\n\r\n function fancyboxTilesVariantController($container, variantTypeInfo, templateData) {\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 (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\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) {\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 (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\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 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) {\r\n var estore = root.PublicEStore;\r\n var productsInCartMap = {};\r\n var productsToCustomFieldIdsForOrderMap = {};\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 if (tempOrderLinesResult.status.toLowerCase() === 'ok') {\r\n const areOtherProductsInCart = tempOrderLinesResult.result.items.length > 0;\r\n if (areOtherProductsInCart) {\r\n const dialogHtml = _.template(model.metadata.vippsHurtigkasseBuyDlgTemplate, { productCount: tempOrderLinesResult.result.items.length, cartUrl: model.cartUrl });\r\n $(dialogHtml).dialog({\r\n resizable: false,\r\n draggable: false,\r\n modal: true,\r\n autoOpen: true,\r\n width: 400,\r\n closeOnEscape: false,\r\n title: model.metadata.payWithVippsHurtigkasse,\r\n buttons: [\r\n {\r\n 'class': 'btn btn-default',\r\n text: model.metadata.buyOnlyCurrentProduct,\r\n click: function () {\r\n $(this).dialog('close');\r\n\r\n $.when(estore.emptyCart()).then(function () {\r\n _addToCartAndResolveDeferred();\r\n }, deferred.reject);\r\n }\r\n }\r\n ],\r\n open: function (event, ui) {\r\n $('.ui-dialog-titlebar-close', ui.dialog | ui).click(function () {\r\n deferred.resolve(false);\r\n });\r\n\r\n $('.js-buy-entire-cart', ui.dialog | ui).click(function (evt) {\r\n evt.preventDefault();\r\n\r\n _addToCartAndResolveDeferred();\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 $.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 }\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 $view.find('vipps-hurtigkasse').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 // 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\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 _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\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 }\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","$productContainer","productModel","quantityDiscountsProcessorInstance","externalTrackingProcessorInstance","enableHistoryState","processor","variantsProcessor","metadata","_notify","message","notificationType","timeout","extractErrorMessageFromResponse","publish","text","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","selectedVariantTypes","selectedVariantOptions","variantController","push","variantType","isAnyVariantSelected","forEach","variantProduct","isProductForCurrentSelection","selectedVariantOption","variantId","availabilityMessage","disabled","exists","isAvailable","preselectSingleAvailable","isEmpty","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","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","$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","get","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","addClass","$variantToSelect","hasClass","isVariantAlreadySelected","currentVariantValue","isSelectedOptionAvailable","$selected","is","tilesVariantController","templateContent","_sortVariants","onVariantsSortEvent","sizeMap","startsWithNumberRegEx","sortBy","enableVariantValuesManualSorting","isNumeric","orderNumber","parseInt","variantName","normalize","parseFloat","positionInSize","matches","estore","PublicEStore","productsInCartMap","productsToCustomFieldIdsForOrderMap","_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","dialogHtml","vippsHurtigkasseBuyDlgTemplate","productCount","dialog","resizable","draggable","modal","autoOpen","width","closeOnEscape","payWithVippsHurtigkasse","buttons","class","buyOnlyCurrentProduct","click","emptyCart","_addToCartAndResolveDeferred","reject","event","ui","resolve","promise","$getProductContainerFor","addToCartResult","_prepareCartForCheckout","proceedToCheckout","startCheckout","subscribe","getDetailedCartInfo","$buyButton","allContractsAreValid","$quantity","contracts","dataAttributes","$quantityInput","Math","round","flagsHandlerUrl","itemIds","archiveType","$flagsTarget","flags","flagDetails","FlagID","Name","appendTo","replaceEmptyString","_buildRatingView","ratingModel","stars","starredRatingValue","rating","wholeStar","incompleteStarValue","emptyStars","emptyStar","_buildStars","$ratingHtml","ratingData","commentsCount","ratingsCount","hasUserPostedReview","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","trim","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","group","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","cache","_setResults","groupedTotals","totalsMap","g","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","height","relatedImages","variantNameRegex","RegExp","relatedImage","relImg","imageName","test","image","variantUniqueId","jQuery"],"mappings":"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"}