%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/components/bitrix/catalog.element/templates/.default/ |
Current File : /home/bitrix/www/bitrix/components/bitrix/catalog.element/templates/.default/script.js |
(function(window){ 'use strict'; if (window.JCCatalogElement) return; var BasketButton = function(params) { BasketButton.superclass.constructor.apply(this, arguments); this.buttonNode = BX.create('SPAN', { props: {className: 'btn btn-default btn-buy btn-sm', id: this.id}, style: typeof params.style === 'object' ? params.style : {}, text: params.text, events: this.contextEvents }); if (BX.browser.IsIE()) { this.buttonNode.setAttribute('hideFocus', 'hidefocus'); } }; BX.extend(BasketButton, BX.PopupWindowButton); window.JCCatalogElement = function(arParams) { this.productType = 0; this.config = { useCatalog: true, showQuantity: true, showPrice: true, showAbsent: true, showOldPrice: false, showPercent: false, showSkuProps: false, showOfferGroup: false, useCompare: false, useStickers: false, useSubscribe: false, usePopup: false, useMagnifier: false, usePriceRanges: false, basketAction: ['BUY'], showClosePopup: false, templateTheme: '', showSlider: false, sliderInterval: 5000, useEnhancedEcommerce: false, dataLayerName: 'dataLayer', brandProperty: false, alt: '', title: '', magnifierZoomPercent: 200 }; this.checkQuantity = false; this.maxQuantity = 0; this.minQuantity = 0; this.stepQuantity = 1; this.isDblQuantity = false; this.canBuy = true; this.isGift = false; this.canSubscription = true; this.currentIsSet = false; this.updateViewedCount = false; this.currentPriceMode = ''; this.currentPrices = []; this.currentPriceSelected = 0; this.currentQuantityRanges = []; this.currentQuantityRangeSelected = 0; this.precision = 6; this.precisionFactor = Math.pow(10, this.precision); this.visual = {}; this.basketMode = ''; this.product = { checkQuantity: false, maxQuantity: 0, stepQuantity: 1, startQuantity: 1, isDblQuantity: false, canBuy: true, canSubscription: true, name: '', pict: {}, id: 0, addUrl: '', buyUrl: '', slider: {}, sliderCount: 0, useSlider: false, sliderPict: [] }; this.mess = {}; this.basketData = { useProps: false, emptyProps: false, quantity: 'quantity', props: 'prop', basketUrl: '', sku_props: '', sku_props_var: 'basket_props', add_url: '', buy_url: '' }; this.compareData = { compareUrl: '', compareDeleteUrl: '', comparePath: '' }; this.defaultPict = { preview: null, detail: null }; this.offers = []; this.offerNum = 0; this.treeProps = []; this.selectedValues = {}; this.mouseTimer = null; this.isTouchDevice = BX.hasClass(document.documentElement, 'bx-touch'); this.touch = null; this.slider = { interval: null, progress: null, paused: null, controls: [] }; this.quantityDelay = null; this.quantityTimer = null; this.obProduct = null; this.obQuantity = null; this.obQuantityUp = null; this.obQuantityDown = null; this.obPrice = { price: null, full: null, discount: null, percent: null, total: null }; this.obTree = null; this.obPriceRanges = null; this.obBuyBtn = null; this.obAddToBasketBtn = null; this.obBasketActions = null; this.obNotAvail = null; this.obSubscribe = null; this.obSkuProps = null; this.obMainSkuProps = null; this.obBigSlider = null; this.obMeasure = null; this.obQuantityLimit = { all: null, value: null }; this.obCompare = null; this.obTabsPanel = null; this.node = {}; // top panel small card this.smallCardNodes = {}; this.magnify = { enabled: false, obBigImg: null, obBigSlider: null, height: 0, width: 0, timer: 0 }; this.currentImg = { id: 0, src: '', width: 0, height: 0 }; this.viewedCounter = { path: '/bitrix/components/bitrix/catalog.element/ajax.php', params: { AJAX: 'Y', SITE_ID: '', PRODUCT_ID: 0, PARENT_ID: 0 } }; this.obPopupWin = null; this.basketUrl = ''; this.basketParams = {}; this.errorCode = 0; if (typeof arParams === 'object') { this.params = arParams; this.initConfig(); if (this.params.MESS) { this.mess = this.params.MESS; } switch (this.productType) { case 0: // no catalog case 1: // product case 2: // set this.initProductData(); break; case 3: // sku this.initOffersData(); break; default: this.errorCode = -1; } this.initBasketData(); this.initCompareData(); } if (this.errorCode === 0) { BX.ready(BX.delegate(this.init, this)); } this.params = {}; BX.addCustomEvent('onSaleProductIsGift', BX.delegate(this.onSaleProductIsGift, this)); BX.addCustomEvent('onSaleProductIsNotGift', BX.delegate(this.onSaleProductIsNotGift, this)); }; window.JCCatalogElement.prototype = { getEntity: function(parent, entity, additionalFilter) { if (!parent || !entity) return null; additionalFilter = additionalFilter || ''; return parent.querySelector(additionalFilter + '[data-entity="' + entity + '"]'); }, getEntities: function(parent, entity, additionalFilter) { if (!parent || !entity) return {length: 0}; additionalFilter = additionalFilter || ''; return parent.querySelectorAll(additionalFilter + '[data-entity="' + entity + '"]'); }, onSaleProductIsGift: function(productId, offerId) { if (offerId && this.offers && this.offers[this.offerNum].ID == offerId) { this.setGift(); } }, onSaleProductIsNotGift: function(productId, offerId) { if (offerId && this.offers && this.offers[this.offerNum].ID == offerId) { this.restoreSticker(); this.isGift = false; this.setPrice(); } }, reloadGiftInfo: function() { if (this.productType === 3) { this.checkQuantity = true; this.maxQuantity = 1; this.setPrice(); this.redrawSticker({text: BX.message('PRODUCT_GIFT_LABEL')}); } }, setGift: function() { if (this.productType === 3) { // sku this.isGift = true; } if (this.productType === 1 || this.productType === 2) { // simple this.isGift = true; } if (this.productType === 0) { this.isGift = false; } this.reloadGiftInfo(); }, setOffer: function(offerNum) { this.offerNum = parseInt(offerNum); this.setCurrent(); }, init: function() { var i = 0, j = 0, treeItems = null; this.obProduct = BX(this.visual.ID); if (!this.obProduct) { this.errorCode = -1; } this.obBigSlider = BX(this.visual.BIG_SLIDER_ID); this.node.imageContainer = this.getEntity(this.obProduct, 'images-container'); this.node.imageSliderBlock = this.getEntity(this.obProduct, 'images-slider-block'); this.node.sliderProgressBar = this.getEntity(this.obProduct, 'slider-progress-bar'); this.node.sliderControlLeft = this.getEntity(this.obBigSlider, 'slider-control-left'); this.node.sliderControlRight = this.getEntity(this.obBigSlider, 'slider-control-right'); if (!this.obBigSlider || !this.node.imageContainer || !this.node.imageContainer) { this.errorCode = -2; } if (this.config.showPrice) { this.obPrice.price = BX(this.visual.PRICE_ID); if (!this.obPrice.price && this.config.useCatalog) { this.errorCode = -16; } else { this.obPrice.total = BX(this.visual.PRICE_TOTAL); if (this.config.showOldPrice) { this.obPrice.full = BX(this.visual.OLD_PRICE_ID); this.obPrice.discount = BX(this.visual.DISCOUNT_PRICE_ID); if (!this.obPrice.full || !this.obPrice.discount) { this.config.showOldPrice = false; } } if (this.config.showPercent) { this.obPrice.percent = BX(this.visual.DISCOUNT_PERCENT_ID); if (!this.obPrice.percent) { this.config.showPercent = false; } } } this.obBasketActions = BX(this.visual.BASKET_ACTIONS_ID); if (this.obBasketActions) { if (BX.util.in_array('BUY', this.config.basketAction)) { this.obBuyBtn = BX(this.visual.BUY_LINK); } if (BX.util.in_array('ADD', this.config.basketAction)) { this.obAddToBasketBtn = BX(this.visual.ADD_BASKET_LINK); } } this.obNotAvail = BX(this.visual.NOT_AVAILABLE_MESS); } if (this.config.showQuantity) { this.obQuantity = BX(this.visual.QUANTITY_ID); this.node.quantity = this.getEntity(this.obProduct, 'quantity-block'); if (this.visual.QUANTITY_UP_ID) { this.obQuantityUp = BX(this.visual.QUANTITY_UP_ID); } if (this.visual.QUANTITY_DOWN_ID) { this.obQuantityDown = BX(this.visual.QUANTITY_DOWN_ID); } } if (this.productType === 3) { if (this.visual.TREE_ID) { this.obTree = BX(this.visual.TREE_ID); if (!this.obTree) { this.errorCode = -256; } } if (this.visual.QUANTITY_MEASURE) { this.obMeasure = BX(this.visual.QUANTITY_MEASURE); } if (this.visual.QUANTITY_LIMIT && this.config.showMaxQuantity !== 'N') { this.obQuantityLimit.all = BX(this.visual.QUANTITY_LIMIT); if (this.obQuantityLimit.all) { this.obQuantityLimit.value = this.getEntity(this.obQuantityLimit.all, 'quantity-limit-value'); if (!this.obQuantityLimit.value) { this.obQuantityLimit.all = null; } } } if (this.config.usePriceRanges) { this.obPriceRanges = this.getEntity(this.obProduct, 'price-ranges-block'); } } if (this.config.showSkuProps) { this.obSkuProps = BX(this.visual.DISPLAY_PROP_DIV); this.obMainSkuProps = BX(this.visual.DISPLAY_MAIN_PROP_DIV); } if (this.config.useCompare) { this.obCompare = BX(this.visual.COMPARE_LINK); } if (this.config.useSubscribe) { this.obSubscribe = BX(this.visual.SUBSCRIBE_LINK); } this.obTabs = BX(this.visual.TABS_ID); this.obTabContainers = BX(this.visual.TAB_CONTAINERS_ID); this.obTabsPanel = BX(this.visual.TABS_PANEL_ID); this.smallCardNodes.panel = BX(this.visual.SMALL_CARD_PANEL_ID); if (this.smallCardNodes.panel) { this.smallCardNodes.picture = this.getEntity(this.smallCardNodes.panel, 'panel-picture'); this.smallCardNodes.title = this.getEntity(this.smallCardNodes.panel, 'panel-title'); this.smallCardNodes.price = this.getEntity(this.smallCardNodes.panel, 'panel-price'); this.smallCardNodes.sku = this.getEntity(this.smallCardNodes.panel, 'panel-sku-container'); this.smallCardNodes.oldPrice = this.getEntity(this.smallCardNodes.panel, 'panel-old-price'); this.smallCardNodes.buyButton = this.getEntity(this.smallCardNodes.panel, 'panel-buy-button'); this.smallCardNodes.addButton = this.getEntity(this.smallCardNodes.panel, 'panel-add-button'); this.smallCardNodes.notAvailableButton = this.getEntity(this.smallCardNodes.panel, 'panel-not-available-button'); this.smallCardNodes.aligner = this.getEntity(this.obProduct, 'main-button-container'); } this.initPopup(); this.initTabs(); if (this.smallCardNodes.panel) { this.smallCardNodes.picture && BX.bind(this.smallCardNodes.picture.parentNode, 'click', BX.proxy(this.scrollToProduct, this)); this.smallCardNodes.title && BX.bind(this.smallCardNodes.title, 'click', BX.proxy(this.scrollToProduct, this)); this.smallCardNodes.sku && BX.bind(this.smallCardNodes.sku, 'click', BX.proxy(this.scrollToProduct, this)); } if (this.obTabsPanel || this.smallCardNodes.panel) { this.checkTopPanels(); BX.bind(window, 'scroll', BX.proxy(this.checkTopPanels, this)); } if (this.errorCode === 0) { // product slider events if (this.config.showSlider && !this.isTouchDevice) { BX.bind(this.obBigSlider, 'mouseenter', BX.proxy(this.stopSlider, this)); BX.bind(this.obBigSlider, 'mouseleave', BX.proxy(this.cycleSlider, this)); } if (this.isTouchDevice) { BX.bind(this.node.imageContainer, 'touchstart', BX.proxy(this.touchStartEvent, this)); BX.bind(this.node.imageContainer, 'touchend', BX.proxy(this.touchEndEvent, this)); BX.bind(this.node.imageContainer, 'touchcancel', BX.proxy(this.touchEndEvent, this)); } BX.bind(this.node.sliderControlLeft, 'click', BX.proxy(this.slidePrev, this)); BX.bind(this.node.sliderControlRight, 'click', BX.proxy(this.slideNext, this)); if (this.config.showQuantity) { var startEventName = this.isTouchDevice ? 'touchstart' : 'mousedown'; var endEventName = this.isTouchDevice ? 'touchend' : 'mouseup'; if (this.obQuantityUp) { BX.bind(this.obQuantityUp, startEventName, BX.proxy(this.startQuantityInterval, this)); BX.bind(this.obQuantityUp, endEventName, BX.proxy(this.clearQuantityInterval, this)); BX.bind(this.obQuantityUp, 'mouseout', BX.proxy(this.clearQuantityInterval, this)); BX.bind(this.obQuantityUp, 'click', BX.delegate(this.quantityUp, this)); } if (this.obQuantityDown) { BX.bind(this.obQuantityDown, startEventName, BX.proxy(this.startQuantityInterval, this)); BX.bind(this.obQuantityDown, endEventName, BX.proxy(this.clearQuantityInterval, this)); BX.bind(this.obQuantityDown, 'mouseout', BX.proxy(this.clearQuantityInterval, this)); BX.bind(this.obQuantityDown, 'click', BX.delegate(this.quantityDown, this)); } if (this.obQuantity) { BX.bind(this.obQuantity, 'change', BX.delegate(this.quantityChange, this)); } } switch (this.productType) { case 0: // no catalog case 1: // product case 2: // set if (this.product.useSlider) { this.product.slider = { ID: this.visual.SLIDER_CONT_ID, CONT: BX(this.visual.SLIDER_CONT_ID), COUNT: this.product.sliderCount }; this.product.slider.ITEMS = this.getEntities(this.product.slider.CONT, 'slider-control'); for (j = 0; j < this.product.slider.ITEMS.length; j++) { BX.bind(this.product.slider.ITEMS[j], 'mouseenter', BX.delegate(this.onSliderControlHover, this)); BX.bind(this.product.slider.ITEMS[j], 'mouseleave', BX.delegate(this.onSliderControlLeave, this)); BX.bind(this.product.slider.ITEMS[j], 'click', BX.delegate(this.selectSliderImg, this)); } this.setCurrentImg(this.product.sliderPict[0], true, true); this.checkSliderControls(this.product.sliderCount); if (this.product.slider.ITEMS.length > 1) { this.initSlider(); } } this.checkQuantityControls(); this.fixFontCheck(); this.setAnalyticsDataLayer('showDetail'); break; case 3: // sku treeItems = this.obTree.querySelectorAll('li'); for (i = 0; i < treeItems.length; i++) { BX.bind(treeItems[i], 'click', BX.delegate(this.selectOfferProp, this)); } for (i = 0; i < this.offers.length; i++) { this.offers[i].SLIDER_COUNT = parseInt(this.offers[i].SLIDER_COUNT, 10) || 0; if (this.offers[i].SLIDER_COUNT === 0) { this.slider.controls[i] = { ID: '', COUNT: this.offers[i].SLIDER_COUNT, ITEMS: [] }; } else { for (j = 0; j < this.offers[i].SLIDER.length; j++) { this.offers[i].SLIDER[j].WIDTH = parseInt(this.offers[i].SLIDER[j].WIDTH, 10); this.offers[i].SLIDER[j].HEIGHT = parseInt(this.offers[i].SLIDER[j].HEIGHT, 10); } this.slider.controls[i] = { ID: this.visual.SLIDER_CONT_OF_ID + this.offers[i].ID, OFFER_ID: this.offers[i].ID, CONT: BX(this.visual.SLIDER_CONT_OF_ID + this.offers[i].ID), COUNT: this.offers[i].SLIDER_COUNT }; this.slider.controls[i].ITEMS = this.getEntities(this.slider.controls[i].CONT, 'slider-control'); for (j = 0; j < this.slider.controls[i].ITEMS.length; j++) { BX.bind(this.slider.controls[i].ITEMS[j], 'mouseenter', BX.delegate(this.onSliderControlHover, this)); BX.bind(this.slider.controls[i].ITEMS[j], 'mouseleave', BX.delegate(this.onSliderControlLeave, this)); BX.bind(this.slider.controls[i].ITEMS[j], 'click', BX.delegate(this.selectSliderImg, this)); } } } this.setCurrent(); break; } this.obBuyBtn && BX.bind(this.obBuyBtn, 'click', BX.proxy(this.buyBasket, this)); this.smallCardNodes.buyButton && BX.bind(this.smallCardNodes.buyButton, 'click', BX.proxy(this.buyBasket, this)); this.obAddToBasketBtn && BX.bind(this.obAddToBasketBtn, 'click', BX.proxy(this.add2Basket, this)); this.smallCardNodes.addButton && BX.bind(this.smallCardNodes.addButton, 'click', BX.proxy(this.add2Basket, this)); if (this.obCompare) { BX.bind(this.obCompare, 'click', BX.proxy(this.compare, this)); BX.addCustomEvent('onCatalogDeleteCompare', BX.proxy(this.checkDeletedCompare, this)); } } }, initConfig: function() { if (this.params.PRODUCT_TYPE) { this.productType = parseInt(this.params.PRODUCT_TYPE, 10); } if (this.params.CONFIG.USE_CATALOG !== 'undefined' && BX.type.isBoolean(this.params.CONFIG.USE_CATALOG)) { this.config.useCatalog = this.params.CONFIG.USE_CATALOG; } this.config.showQuantity = this.params.CONFIG.SHOW_QUANTITY; this.config.showPrice = this.params.CONFIG.SHOW_PRICE; this.config.showPercent = this.params.CONFIG.SHOW_DISCOUNT_PERCENT; this.config.showOldPrice = this.params.CONFIG.SHOW_OLD_PRICE; this.config.showSkuProps = this.params.CONFIG.SHOW_SKU_PROPS; this.config.showOfferGroup = this.params.CONFIG.OFFER_GROUP; this.config.useCompare = this.params.CONFIG.DISPLAY_COMPARE; this.config.useStickers = this.params.CONFIG.USE_STICKERS; this.config.useSubscribe = this.params.CONFIG.USE_SUBSCRIBE; this.config.showMaxQuantity = this.params.CONFIG.SHOW_MAX_QUANTITY; this.config.relativeQuantityFactor = parseInt(this.params.CONFIG.RELATIVE_QUANTITY_FACTOR); this.config.usePriceRanges = this.params.CONFIG.USE_PRICE_COUNT; if (this.params.CONFIG.MAIN_PICTURE_MODE) { this.config.usePopup = BX.util.in_array('POPUP', this.params.CONFIG.MAIN_PICTURE_MODE); this.config.useMagnifier = BX.util.in_array('MAGNIFIER', this.params.CONFIG.MAIN_PICTURE_MODE); } if (this.params.CONFIG.ADD_TO_BASKET_ACTION) { this.config.basketAction = this.params.CONFIG.ADD_TO_BASKET_ACTION; } this.config.showClosePopup = this.params.CONFIG.SHOW_CLOSE_POPUP; this.config.templateTheme = this.params.CONFIG.TEMPLATE_THEME || ''; this.config.showSlider = this.params.CONFIG.SHOW_SLIDER === 'Y'; if (this.config.showSlider && !this.isTouchDevice) { this.config.sliderInterval = parseInt(this.params.CONFIG.SLIDER_INTERVAL) || 5000; } else { this.config.sliderInterval = false; } this.config.useEnhancedEcommerce = this.params.CONFIG.USE_ENHANCED_ECOMMERCE === 'Y'; this.config.dataLayerName = this.params.CONFIG.DATA_LAYER_NAME; this.config.brandProperty = this.params.CONFIG.BRAND_PROPERTY; this.config.alt = this.params.CONFIG.ALT || ''; this.config.title = this.params.CONFIG.TITLE || ''; this.config.magnifierZoomPercent = parseInt(this.params.CONFIG.MAGNIFIER_ZOOM_PERCENT) || 200; if (!this.params.VISUAL || typeof this.params.VISUAL !== 'object' || !this.params.VISUAL.ID) { this.errorCode = -1; return; } this.visual = this.params.VISUAL; }, initProductData: function() { var j = 0; if (this.params.PRODUCT && typeof this.params.PRODUCT === 'object') { if (this.config.showQuantity) { this.product.checkQuantity = this.params.PRODUCT.CHECK_QUANTITY; this.product.isDblQuantity = this.params.PRODUCT.QUANTITY_FLOAT; if (this.config.showPrice) { this.currentPriceMode = this.params.PRODUCT.ITEM_PRICE_MODE; this.currentPrices = this.params.PRODUCT.ITEM_PRICES; this.currentPriceSelected = this.params.PRODUCT.ITEM_PRICE_SELECTED; this.currentQuantityRanges = this.params.PRODUCT.ITEM_QUANTITY_RANGES; this.currentQuantityRangeSelected = this.params.PRODUCT.ITEM_QUANTITY_RANGE_SELECTED; } if (this.product.checkQuantity) { this.product.maxQuantity = this.product.isDblQuantity ? parseFloat(this.params.PRODUCT.MAX_QUANTITY) : parseInt(this.params.PRODUCT.MAX_QUANTITY, 10); } this.product.stepQuantity = this.product.isDblQuantity ? parseFloat(this.params.PRODUCT.STEP_QUANTITY) : parseInt(this.params.PRODUCT.STEP_QUANTITY, 10); this.checkQuantity = this.product.checkQuantity; this.isDblQuantity = this.product.isDblQuantity; this.stepQuantity = this.product.stepQuantity; this.maxQuantity = this.product.maxQuantity; this.minQuantity = this.currentPriceMode === 'Q' ? parseFloat(this.currentPrices[this.currentPriceSelected].MIN_QUANTITY) : this.stepQuantity; if (this.isDblQuantity) { this.stepQuantity = Math.round(this.stepQuantity * this.precisionFactor) / this.precisionFactor; } } this.product.canBuy = this.params.PRODUCT.CAN_BUY; this.canSubscription = this.product.canSubscription = this.params.PRODUCT.SUBSCRIPTION; this.product.name = this.params.PRODUCT.NAME; this.product.pict = this.params.PRODUCT.PICT; this.product.id = this.params.PRODUCT.ID; this.product.category = this.params.PRODUCT.CATEGORY; if (this.params.PRODUCT.ADD_URL) { this.product.addUrl = this.params.PRODUCT.ADD_URL; } if (this.params.PRODUCT.BUY_URL) { this.product.buyUrl = this.params.PRODUCT.BUY_URL; } if (this.params.PRODUCT.SLIDER_COUNT) { this.product.sliderCount = parseInt(this.params.PRODUCT.SLIDER_COUNT, 10) || 0; if (this.product.sliderCount > 0 && this.params.PRODUCT.SLIDER.length) { for (j = 0; j < this.params.PRODUCT.SLIDER.length; j++) { this.product.useSlider = true; this.params.PRODUCT.SLIDER[j].WIDTH = parseInt(this.params.PRODUCT.SLIDER[j].WIDTH, 10); this.params.PRODUCT.SLIDER[j].HEIGHT = parseInt(this.params.PRODUCT.SLIDER[j].HEIGHT, 10); } this.product.sliderPict = this.params.PRODUCT.SLIDER; this.setCurrentImg(this.product.sliderPict[0], false); } } this.currentIsSet = true; } else { this.errorCode = -1; } }, initOffersData: function() { if (this.params.OFFERS && BX.type.isArray(this.params.OFFERS)) { this.offers = this.params.OFFERS; this.offerNum = 0; if (this.params.OFFER_SELECTED) { this.offerNum = parseInt(this.params.OFFER_SELECTED, 10) || 0; } if (this.params.TREE_PROPS) { this.treeProps = this.params.TREE_PROPS; } if (this.params.DEFAULT_PICTURE) { this.defaultPict.preview = this.params.DEFAULT_PICTURE.PREVIEW_PICTURE; this.defaultPict.detail = this.params.DEFAULT_PICTURE.DETAIL_PICTURE; } if (this.params.PRODUCT && typeof this.params.PRODUCT === 'object') { this.product.id = parseInt(this.params.PRODUCT.ID, 10); this.product.name = this.params.PRODUCT.NAME; this.product.category = this.params.PRODUCT.CATEGORY; } } else { this.errorCode = -1; } }, initBasketData: function() { if (this.params.BASKET && typeof this.params.BASKET === 'object') { if (this.productType === 1 || this.productType === 2) { this.basketData.useProps = this.params.BASKET.ADD_PROPS; this.basketData.emptyProps = this.params.BASKET.EMPTY_PROPS; } if (this.params.BASKET.QUANTITY) { this.basketData.quantity = this.params.BASKET.QUANTITY; } if (this.params.BASKET.PROPS) { this.basketData.props = this.params.BASKET.PROPS; } if (this.params.BASKET.BASKET_URL) { this.basketData.basketUrl = this.params.BASKET.BASKET_URL; } if (this.productType === 3) { if (this.params.BASKET.SKU_PROPS) { this.basketData.sku_props = this.params.BASKET.SKU_PROPS; } } if (this.params.BASKET.ADD_URL_TEMPLATE) { this.basketData.add_url = this.params.BASKET.ADD_URL_TEMPLATE; } if (this.params.BASKET.BUY_URL_TEMPLATE) { this.basketData.buy_url = this.params.BASKET.BUY_URL_TEMPLATE; } if (this.basketData.add_url === '' && this.basketData.buy_url === '') { this.errorCode = -1024; } } }, initCompareData: function() { if (this.config.useCompare) { if (this.params.COMPARE && typeof this.params.COMPARE === 'object') { if (this.params.COMPARE.COMPARE_PATH) { this.compareData.comparePath = this.params.COMPARE.COMPARE_PATH; } if (this.params.COMPARE.COMPARE_URL_TEMPLATE) { this.compareData.compareUrl = this.params.COMPARE.COMPARE_URL_TEMPLATE; } else { this.config.useCompare = false; } if (this.params.COMPARE.COMPARE_DELETE_URL_TEMPLATE) { this.compareData.compareDeleteUrl = this.params.COMPARE.COMPARE_DELETE_URL_TEMPLATE; } else { this.config.useCompare = false; } } else { this.config.useCompare = false; } } }, initSlider: function() { if (this.node.sliderProgressBar) { if (this.slider.progress) { this.resetProgress(); } else { this.slider.progress = new BX.easing({ transition: BX.easing.transitions.linear, step: BX.delegate(function(state){ this.node.sliderProgressBar.style.width = state.width / 10 + '%'; }, this) }); } } this.cycleSlider(); }, setAnalyticsDataLayer: function(action) { if (!this.config.useEnhancedEcommerce || !this.config.dataLayerName) return; var item = {}, info = {}, variants = [], i, k, j, propId, skuId, propValues; switch (this.productType) { case 0: //no catalog case 1: //product case 2: //set item = { 'id': this.product.id, 'name': this.product.name, 'price': this.currentPrices[this.currentPriceSelected] && this.currentPrices[this.currentPriceSelected].PRICE, 'category': this.product.category, 'brand': BX.type.isArray(this.config.brandProperty) ? this.config.brandProperty.join('/') : this.config.brandProperty }; break; case 3: //sku for (i in this.offers[this.offerNum].TREE) { if (this.offers[this.offerNum].TREE.hasOwnProperty(i)) { propId = i.substring(5); skuId = this.offers[this.offerNum].TREE[i]; for (k in this.treeProps) { if (this.treeProps.hasOwnProperty(k) && this.treeProps[k].ID == propId) { for (j in this.treeProps[k].VALUES) { propValues = this.treeProps[k].VALUES[j]; if (propValues.ID == skuId) { variants.push(propValues.NAME); break; } } } } } } item = { 'id': this.offers[this.offerNum].ID, 'name': this.offers[this.offerNum].NAME, 'price': this.currentPrices[this.currentPriceSelected] && this.currentPrices[this.currentPriceSelected].PRICE, 'category': this.product.category, 'brand': BX.type.isArray(this.config.brandProperty) ? this.config.brandProperty.join('/') : this.config.brandProperty, 'variant': variants.join('/') }; break; } switch (action) { case 'showDetail': info = { 'event': 'showDetail', 'ecommerce': { 'currencyCode': this.currentPrices[this.currentPriceSelected] && this.currentPrices[this.currentPriceSelected].CURRENCY || '', 'detail': { 'products': [{ 'name': item.name || '', 'id': item.id || '', 'price': item.price || 0, 'brand': item.brand || '', 'category': item.category || '', 'variant': item.variant || '' }] } } }; break; case 'addToCart': info = { 'event': 'addToCart', 'ecommerce': { 'currencyCode': this.currentPrices[this.currentPriceSelected] && this.currentPrices[this.currentPriceSelected].CURRENCY || '', 'add': { 'products': [{ 'name': item.name || '', 'id': item.id || '', 'price': item.price || 0, 'brand': item.brand || '', 'category': item.category || '', 'variant': item.variant || '', 'quantity': this.config.showQuantity && this.obQuantity ? this.obQuantity.value : 1 }] } } }; break; } window[this.config.dataLayerName] = window[this.config.dataLayerName] || []; window[this.config.dataLayerName].push(info); }, initTabs: function() { var tabs = this.getEntities(this.obTabs, 'tab'), panelTabs = this.getEntities(this.obTabsPanel, 'tab'); var tabValue, targetTab, haveActive = false; if (tabs.length !== panelTabs.length) return; for (var i in tabs) { if (tabs.hasOwnProperty(i) && BX.type.isDomNode(tabs[i])) { tabValue = tabs[i].getAttribute('data-value'); if (tabValue) { targetTab = this.obTabContainers.querySelector('[data-value="' + tabValue + '"]'); if (BX.type.isDomNode(targetTab)) { BX.bind(tabs[i], 'click', BX.proxy(this.changeTab, this)); BX.bind(panelTabs[i], 'click', BX.proxy(this.changeTab, this)); if (!haveActive) { BX.addClass(tabs[i], 'active'); BX.addClass(panelTabs[i], 'active'); BX.show(targetTab); haveActive = true; } else { BX.removeClass(tabs[i], 'active'); BX.removeClass(panelTabs[i], 'active'); BX.hide(targetTab); } } } } } }, checkTouch: function(event) { if (!event || !event.changedTouches) return false; return event.changedTouches[0].identifier === this.touch.identifier; }, touchStartEvent: function(event) { if (event.touches.length != 1) return; this.touch = event.changedTouches[0]; }, touchEndEvent: function(event) { if (!this.checkTouch(event)) return; var deltaX = this.touch.pageX - event.changedTouches[0].pageX, deltaY = this.touch.pageY - event.changedTouches[0].pageY; if (Math.abs(deltaX) >= Math.abs(deltaY) + 10) { if (deltaX > 0) { this.slideNext(); } if (deltaX < 0) { this.slidePrev(); } } }, cycleSlider: function(event) { event || (this.slider.paused = false); this.slider.interval && clearInterval(this.slider.interval); if (this.config.sliderInterval && !this.slider.paused) { if (this.slider.progress) { this.slider.progress.stop(); var width = parseInt(this.node.sliderProgressBar.style.width); this.slider.progress.options.duration = this.config.sliderInterval * (100 - width) / 100; this.slider.progress.options.start = {width: width * 10}; this.slider.progress.options.finish = {width: 1000}; this.slider.progress.options.complete = BX.delegate(function(){ this.slider.interval = true; this.slideNext(); }, this); this.slider.progress.animate(); } else { this.slider.interval = setInterval(BX.proxy(this.slideNext, this), this.config.sliderInterval); } } }, stopSlider: function(event) { event || (this.slider.paused = true); this.slider.interval && (this.slider.interval = clearInterval(this.slider.interval)); if (this.slider.progress) { this.slider.progress.stop(); var width = parseInt(this.node.sliderProgressBar.style.width); this.slider.progress.options.duration = this.config.sliderInterval * width / 200; this.slider.progress.options.start = {width: width * 10}; this.slider.progress.options.finish = {width: 0}; this.slider.progress.options.complete = null; this.slider.progress.animate(); } }, resetProgress: function() { this.slider.progress && this.slider.progress.stop(); this.node.sliderProgressBar.style.width = 0; }, slideNext: function() { return this.slide('next'); }, slidePrev: function() { return this.slide('prev'); }, slide: function(type) { if (!this.product.slider || !this.product.slider.CONT) return; var active = this.getEntity(this.product.slider.CONT, 'slider-control', '.active'), next = this.getItemForDirection(type, active); BX.removeClass(active, 'active'); this.selectSliderImg(next); this.slider.interval && this.cycleSlider(); }, getItemForDirection: function(direction, active) { var activeIndex = this.getItemIndex(active), delta = direction === 'prev' ? -1 : 1, itemIndex = (activeIndex + delta) % this.product.slider.COUNT; return this.eq(this.product.slider.ITEMS, itemIndex); }, getItemIndex: function(item) { return BX.util.array_values(this.product.slider.ITEMS).indexOf(item); }, eq: function(obj, i) { var len = obj.length, j = +i + (i < 0 ? len : 0); return j >= 0 && j < len ? obj[j] : {}; }, scrollToProduct: function() { var scrollTop = BX.GetWindowScrollPos().scrollTop, containerTop = BX.pos(this.obProduct).top - 30; if (scrollTop > containerTop) { new BX.easing({ duration: 500, start: {scroll: scrollTop}, finish: {scroll: containerTop}, transition: BX.easing.makeEaseOut(BX.easing.transitions.quint), step: BX.delegate(function(state){ window.scrollTo(0, state.scroll); }, this) }).animate(); } }, checkTopPanels: function() { var scrollTop = BX.GetWindowScrollPos().scrollTop, targetPos; if (this.smallCardNodes.panel) { targetPos = BX.pos(this.smallCardNodes.aligner).bottom - 50; if (scrollTop > targetPos) { BX.addClass(this.smallCardNodes.panel, 'active'); } else if (BX.hasClass(this.smallCardNodes.panel, 'active')) { BX.removeClass(this.smallCardNodes.panel, 'active'); } } if (this.obTabsPanel) { targetPos = BX.pos(this.obTabs).top; if (scrollTop + 73 > targetPos) { BX.addClass(this.obTabsPanel, 'active'); } else if (BX.hasClass(this.obTabsPanel, 'active')) { BX.removeClass(this.obTabsPanel, 'active'); } } }, changeTab: function(event) { BX.PreventDefault(event); var targetTabValue = BX.proxy_context && BX.proxy_context.getAttribute('data-value'), containers, tabs, panelTabs; if (!BX.hasClass(BX.proxy_context, 'active') && targetTabValue) { containers = this.getEntities(this.obTabContainers, 'tab-container'); for (var i in containers) { if (containers.hasOwnProperty(i) && BX.type.isDomNode(containers[i])) { if (containers[i].getAttribute('data-value') === targetTabValue) { BX.show(containers[i]); } else { BX.hide(containers[i]); } } } tabs = this.getEntities(this.obTabs, 'tab'); panelTabs = this.getEntities(this.obTabsPanel, 'tab'); for (i in tabs) { if (tabs.hasOwnProperty(i) && BX.type.isDomNode(tabs[i])) { if (tabs[i].getAttribute('data-value') === targetTabValue) { BX.addClass(tabs[i], 'active'); BX.addClass(panelTabs[i], 'active'); } else { BX.removeClass(tabs[i], 'active'); BX.removeClass(panelTabs[i], 'active'); } } } } var scrollTop = BX.GetWindowScrollPos().scrollTop, containerTop = BX.pos(this.obTabContainers).top; if (scrollTop + 150 > containerTop) { new BX.easing({ duration: 500, start: {scroll: scrollTop}, finish: {scroll: containerTop - 150}, transition: BX.easing.makeEaseOut(BX.easing.transitions.quint), step: BX.delegate(function(state){ window.scrollTo(0, state.scroll); }, this) }).animate(); } }, initPopup: function() { if (this.config.usePopup) { this.node.imageContainer.style.cursor = 'zoom-in'; BX.bind(this.node.imageContainer, 'click', BX.delegate(this.toggleMainPictPopup, this)); BX.bind(document, 'keyup', BX.proxy(this.closeByEscape, this)); BX.bind( this.getEntity(this.obBigSlider, 'close-popup'), 'click', BX.proxy(this.hideMainPictPopup, this) ); } }, checkSliderControls: function(count) { var display = count > 1 ? '' : 'none'; this.node.sliderControlLeft && (this.node.sliderControlLeft.style.display = display); this.node.sliderControlRight && (this.node.sliderControlRight.style.display = display); }, setCurrentImg: function(img, showImage, showPanelImage) { var images, l; this.currentImg.id = img.ID; this.currentImg.src = img.SRC; this.currentImg.width = img.WIDTH; this.currentImg.height = img.HEIGHT; if (showImage && this.node.imageContainer) { images = this.getEntities(this.node.imageContainer, 'image'); l = images.length; while (l--) { if (images[l].getAttribute('data-id') == img.ID) { if (!BX.hasClass(images[l], 'active')) { this.node.sliderProgressBar && this.resetProgress(); } BX.addClass(images[l], 'active'); } else if (BX.hasClass(images[l], 'active')) { BX.removeClass(images[l], 'active'); } } } if (showPanelImage && this.smallCardNodes.picture) { this.smallCardNodes.picture.setAttribute('src', this.currentImg.src); } if (this.config.useMagnifier && !this.isTouchDevice) { this.setMagnifierParams(); if (showImage) { this.disableMagnifier(true); } } }, setMagnifierParams: function() { var images = this.getEntities(this.node.imageContainer, 'image'), l = images.length, current; while (l--) { // disable image title show current = images[l].querySelector('img'); current.setAttribute('data-title', current.getAttribute('title') || ''); current.removeAttribute('title'); if (images[l].getAttribute('data-id') == this.currentImg.id) { BX.unbind(this.currentImg.node, 'mouseover', BX.proxy(this.enableMagnifier, this)); this.currentImg.node = current; this.currentImg.node.style.backgroundImage = 'url(\'' + this.currentImg.src + '\')'; this.currentImg.node.style.backgroundSize = '100% auto'; BX.bind(this.currentImg.node, 'mouseover', BX.proxy(this.enableMagnifier, this)); } } }, enableMagnifier: function() { BX.bind(document, 'mousemove', BX.proxy(this.moveMagnifierArea, this)); }, disableMagnifier: function(animateSize) { if (!this.magnify.enabled) return; clearTimeout(this.magnify.timer); BX.removeClass(this.obBigSlider, 'magnified'); this.magnify.enabled = false; this.currentImg.node.style.backgroundSize = '100% auto'; if (animateSize) { // set initial size for css animation this.currentImg.node.style.height = this.magnify.height + 'px'; this.currentImg.node.style.width = this.magnify.width + 'px'; this.magnify.timer = setTimeout( BX.delegate(function(){ this.currentImg.node.src = this.currentImg.src; this.currentImg.node.style.height = ''; this.currentImg.node.style.width = ''; }, this), 250 ); } else { this.currentImg.node.src = this.currentImg.src; this.currentImg.node.style.height = ''; this.currentImg.node.style.width = ''; } BX.unbind(document, 'mousemove', BX.proxy(this.moveMagnifierArea, this)); }, moveMagnifierArea: function(e) { var posBigImg = BX.pos(this.currentImg.node), currentPos = this.inRect(e, posBigImg); if (this.inBound(posBigImg, currentPos)) { var posPercentX = (currentPos.X / this.currentImg.node.width) * 100, posPercentY = (currentPos.Y / this.currentImg.node.height) * 100, resolution, sliderWidth, w, h, zoomPercent; this.currentImg.node.style.backgroundPosition = posPercentX + '% ' + posPercentY + '%'; if (!this.magnify.enabled) { clearTimeout(this.magnify.timer); BX.addClass(this.obBigSlider, 'magnified'); // set initial size for css animation this.currentImg.node.style.height = (this.magnify.height = this.currentImg.node.clientHeight) + 'px'; this.currentImg.node.style.width = (this.magnify.width = this.currentImg.node.offsetWidth) + 'px'; resolution = this.currentImg.width / this.currentImg.height; sliderWidth = this.obBigSlider.offsetWidth; if (sliderWidth > this.currentImg.width && !BX.hasClass(this.obBigSlider, 'popup')) { w = sliderWidth; h = w / resolution; zoomPercent = 100; } else { w = this.currentImg.width; h = this.currentImg.height; zoomPercent = this.config.magnifierZoomPercent > 100 ? this.config.magnifierZoomPercent : 100; } // base64 transparent pixel this.currentImg.node.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVQI12P4zwAAAgEBAKrChTYAAAAASUVORK5CYII='; this.currentImg.node.style.backgroundSize = zoomPercent + '% auto'; // set target size this.magnify.timer = setTimeout(BX.delegate(function(){ this.currentImg.node.style.height = h + 'px'; this.currentImg.node.style.width = w + 'px'; }, this), 10 ); } this.magnify.enabled = true; } else { this.disableMagnifier(true); } }, inBound: function(rect, point) { return ( (point.Y >= 0 && rect.height >= point.Y) && (point.X >= 0 && rect.width >= point.X) ); }, inRect: function(e, rect) { var wndSize = BX.GetWindowSize(), currentPos = { X: 0, Y: 0, globalX: 0, globalY: 0 }; currentPos.globalX = e.clientX + wndSize.scrollLeft; if (e.offsetX && e.offsetX < 0) { currentPos.globalX -= e.offsetX; } currentPos.X = currentPos.globalX - rect.left; currentPos.globalY = e.clientY + wndSize.scrollTop; if (e.offsetY && e.offsetY < 0) { currentPos.globalY -= e.offsetY; } currentPos.Y = currentPos.globalY - rect.top; return currentPos; }, setProductMainPict: function(intPict) { var indexPict = -1, i = 0, j = 0, value = ''; if (this.product.sliderCount) { for (j = 0; j < this.product.sliderPict.length; j++) { if (intPict === this.product.sliderPict[j].ID) { indexPict = j; break; } } if (indexPict > -1) { if (this.product.sliderPict[indexPict]) { this.setCurrentImg(this.product.sliderPict[indexPict], true); } for (i = 0; i < this.product.slider.ITEMS.length; i++) { value = this.product.slider.ITEMS[i].getAttribute('data-value'); if (value === intPict) { BX.addClass(this.product.slider.ITEMS[i], 'active'); } else if (BX.hasClass(this.product.slider.ITEMS[i], 'active')) { BX.removeClass(this.product.slider.ITEMS[i], 'active'); } } } } }, onSliderControlHover: function() { var target = BX.proxy_context; this.mouseTimer = setTimeout( BX.delegate(function(){ this.selectSliderImg(target); }, this), 200 ); }, onSliderControlLeave: function() { clearTimeout(this.mouseTimer); this.mouseTimer = null; }, selectSliderImg: function(target) { var strValue = '', arItem = []; target = BX.type.isDomNode(target) ? target : BX.proxy_context; if (target && target.hasAttribute('data-value')) { strValue = target.getAttribute('data-value'); if (strValue.indexOf('_') !== -1) { arItem = strValue.split('_'); this.setMainPict(arItem[0], arItem[1]); } else { this.setProductMainPict(strValue); } } }, setMainPict: function(intSlider, intPict, changePanelPict) { var index = -1, indexPict = -1, i, j, value = '', strValue = ''; for (i = 0; i < this.offers.length; i++) { if (intSlider === this.offers[i].ID) { index = i; break; } } if (index > -1) { if (this.offers[index].SLIDER_COUNT > 0) { for (j = 0; j < this.offers[index].SLIDER.length; j++) { if (intPict === this.offers[index].SLIDER[j].ID) { indexPict = j; break; } } if (indexPict > -1) { if (this.offers[index].SLIDER[indexPict]) { this.setCurrentImg(this.offers[index].SLIDER[indexPict], true, changePanelPict); } strValue = intSlider + '_' + intPict; for (i = 0; i < this.product.slider.ITEMS.length; i++) { value = this.product.slider.ITEMS[i].getAttribute('data-value'); if (value === strValue) { BX.addClass(this.product.slider.ITEMS[i], 'active'); } else if (BX.hasClass(this.product.slider.ITEMS[i], 'active')) { BX.removeClass(this.product.slider.ITEMS[i], 'active'); } } } } } }, setMainPictFromItem: function(index) { if (this.node.imageContainer) { var boolSet = false, obNewPict = {}; if (this.offers[index]) { if (this.offers[index].DETAIL_PICTURE) { obNewPict = this.offers[index].DETAIL_PICTURE; boolSet = true; } else if (this.offers[index].PREVIEW_PICTURE) { obNewPict = this.offers[index].PREVIEW_PICTURE; boolSet = true; } } if (!boolSet) { if (this.defaultPict.detail) { obNewPict = this.defaultPict.detail; boolSet = true; } else if (this.defaultPict.preview) { obNewPict = this.defaultPict.preview; boolSet = true; } } if (boolSet) { this.setCurrentImg(obNewPict, true, true); } } }, toggleMainPictPopup: function() { if (BX.hasClass(this.obBigSlider, 'popup')) { this.hideMainPictPopup(); } else { this.showMainPictPopup(); } }, showMainPictPopup: function() { this.config.useMagnifier && this.disableMagnifier(false); BX.addClass(this.obBigSlider, 'popup'); this.node.imageContainer.style.cursor = ''; // remove double scroll bar document.body.style.overflow = 'hidden'; }, hideMainPictPopup: function() { this.config.useMagnifier && this.disableMagnifier(false); BX.removeClass(this.obBigSlider, 'popup'); this.node.imageContainer.style.cursor = 'zoom-in'; // remove double scroll bar document.body.style.overflow = ''; }, closeByEscape: function(event) { event = event || window.event; if (event.keyCode == 27) { this.hideMainPictPopup(); } }, startQuantityInterval: function() { var target = BX.proxy_context; var func = target.id === this.visual.QUANTITY_DOWN_ID ? BX.proxy(this.quantityDown, this) : BX.proxy(this.quantityUp, this); this.quantityDelay = setTimeout( BX.delegate(function() { this.quantityTimer = setInterval(func, 150); }, this), 300 ); }, clearQuantityInterval: function() { clearTimeout(this.quantityDelay); clearInterval(this.quantityTimer); }, quantityUp: function() { var curValue = 0, boolSet = true; if (this.errorCode === 0 && this.config.showQuantity && this.canBuy && !this.isGift) { curValue = this.isDblQuantity ? parseFloat(this.obQuantity.value) : parseInt(this.obQuantity.value, 10); if (!isNaN(curValue)) { curValue += this.stepQuantity; curValue = this.checkQuantityRange(curValue, 'up'); if (this.checkQuantity && curValue > this.maxQuantity) { boolSet = false; } if (boolSet) { if (this.isDblQuantity) { curValue = Math.round(curValue * this.precisionFactor) / this.precisionFactor; } this.obQuantity.value = curValue; this.setPrice(); } } } }, quantityDown: function() { var curValue = 0, boolSet = true; if (this.errorCode === 0 && this.config.showQuantity && this.canBuy && !this.isGift) { curValue = (this.isDblQuantity ? parseFloat(this.obQuantity.value) : parseInt(this.obQuantity.value, 10)); if (!isNaN(curValue)) { curValue -= this.stepQuantity; curValue = this.checkQuantityRange(curValue, 'down'); if (curValue < this.minQuantity) { boolSet = false; } if (boolSet) { if (this.isDblQuantity) { curValue = Math.round(curValue * this.precisionFactor) / this.precisionFactor; } this.obQuantity.value = curValue; this.setPrice(); } } } }, quantityChange: function() { var curValue = 0, intCount; if (this.errorCode === 0 && this.config.showQuantity) { if (this.canBuy) { curValue = this.isDblQuantity ? parseFloat(this.obQuantity.value) : Math.round(this.obQuantity.value); if (!isNaN(curValue)) { curValue = this.checkQuantityRange(curValue); if (this.checkQuantity) { if (curValue > this.maxQuantity) { curValue = this.maxQuantity; } } this.checkPriceRange(curValue); if (curValue < this.minQuantity) { curValue = this.minQuantity; } else { intCount = Math.round( Math.round(curValue * this.precisionFactor / this.stepQuantity) / this.precisionFactor ) || 1; curValue = (intCount <= 1 ? this.stepQuantity : intCount * this.stepQuantity); curValue = Math.round(curValue * this.precisionFactor) / this.precisionFactor; } this.obQuantity.value = curValue; } else { this.obQuantity.value = this.minQuantity; } } else { this.obQuantity.value = this.minQuantity; } this.setPrice(); } }, quantitySet: function(index) { var strLimit, resetQuantity; var newOffer = this.offers[index], oldOffer = this.offers[this.offerNum]; if (this.errorCode === 0) { this.canBuy = newOffer.CAN_BUY; this.currentPriceMode = newOffer.ITEM_PRICE_MODE; this.currentPrices = newOffer.ITEM_PRICES; this.currentPriceSelected = newOffer.ITEM_PRICE_SELECTED; this.currentQuantityRanges = newOffer.ITEM_QUANTITY_RANGES; this.currentQuantityRangeSelected = newOffer.ITEM_QUANTITY_RANGE_SELECTED; if (this.canBuy) { this.node.quantity && BX.style(this.node.quantity, 'display', ''); this.obBasketActions && BX.style(this.obBasketActions, 'display', ''); this.smallCardNodes.buyButton && BX.style(this.smallCardNodes.buyButton, 'display', ''); this.smallCardNodes.addButton && BX.style(this.smallCardNodes.addButton, 'display', ''); this.obNotAvail && BX.style(this.obNotAvail, 'display', 'none'); this.smallCardNodes.notAvailableButton && BX.style(this.smallCardNodes.notAvailableButton, 'display', 'none'); this.obSubscribe && BX.style(this.obSubscribe, 'display', 'none'); } else { this.node.quantity && BX.style(this.node.quantity, 'display', 'none'); this.obBasketActions && BX.style(this.obBasketActions, 'display', 'none'); this.smallCardNodes.buyButton && BX.style(this.smallCardNodes.buyButton, 'display', 'none'); this.smallCardNodes.addButton && BX.style(this.smallCardNodes.addButton, 'display', 'none'); this.obNotAvail && BX.style(this.obNotAvail, 'display', ''); this.smallCardNodes.notAvailableButton && BX.style(this.smallCardNodes.notAvailableButton, 'display', ''); if (this.obSubscribe) { if (newOffer.CATALOG_SUBSCRIBE === 'Y') { BX.style(this.obSubscribe, 'display', ''); this.obSubscribe.setAttribute('data-item', newOffer.ID); BX(this.visual.SUBSCRIBE_LINK + '_hidden').click(); } else { BX.style(this.obSubscribe, 'display', 'none'); } } } this.isDblQuantity = newOffer.QUANTITY_FLOAT; this.checkQuantity = newOffer.CHECK_QUANTITY; if (this.isDblQuantity) { this.stepQuantity = Math.round(parseFloat(newOffer.STEP_QUANTITY) * this.precisionFactor) / this.precisionFactor; this.maxQuantity = parseFloat(newOffer.MAX_QUANTITY); this.minQuantity = this.currentPriceMode === 'Q' ? parseFloat(this.currentPrices[this.currentPriceSelected].MIN_QUANTITY) : this.stepQuantity; } else { this.stepQuantity = parseInt(newOffer.STEP_QUANTITY, 10); this.maxQuantity = parseInt(newOffer.MAX_QUANTITY, 10); this.minQuantity = this.currentPriceMode === 'Q' ? parseInt(this.currentPrices[this.currentPriceSelected].MIN_QUANTITY) : this.stepQuantity; } if (this.config.showQuantity) { var isDifferentMinQuantity = oldOffer.ITEM_PRICES.length && oldOffer.ITEM_PRICES[oldOffer.ITEM_PRICE_SELECTED] && oldOffer.ITEM_PRICES[oldOffer.ITEM_PRICE_SELECTED].MIN_QUANTITY != this.minQuantity; if (this.isDblQuantity) { resetQuantity = Math.round(parseFloat(oldOffer.STEP_QUANTITY) * this.precisionFactor) / this.precisionFactor !== this.stepQuantity || isDifferentMinQuantity || oldOffer.MEASURE !== newOffer.MEASURE || ( this.checkQuantity && parseFloat(oldOffer.MAX_QUANTITY) > this.maxQuantity && parseFloat(this.obQuantity.value) > this.maxQuantity ); } else { resetQuantity = parseInt(oldOffer.STEP_QUANTITY, 10) !== this.stepQuantity || isDifferentMinQuantity || oldOffer.MEASURE !== newOffer.MEASURE || ( this.checkQuantity && parseInt(oldOffer.MAX_QUANTITY, 10) > this.maxQuantity && parseInt(this.obQuantity.value, 10) > this.maxQuantity ); } this.obQuantity.disabled = !this.canBuy; if (resetQuantity) { this.obQuantity.value = this.minQuantity; } if (this.obMeasure) { if (newOffer.MEASURE) { BX.adjust(this.obMeasure, {html: newOffer.MEASURE}); } else { BX.adjust(this.obMeasure, {html: ''}); } } } if (this.obQuantityLimit.all) { if (!this.checkQuantity || this.maxQuantity == 0) { BX.adjust(this.obQuantityLimit.value, {html: ''}); BX.adjust(this.obQuantityLimit.all, {style: {display: 'none'}}); } else { if (this.config.showMaxQuantity === 'M') { strLimit = (this.maxQuantity / this.stepQuantity >= this.config.relativeQuantityFactor) ? BX.message('RELATIVE_QUANTITY_MANY') : BX.message('RELATIVE_QUANTITY_FEW'); } else { strLimit = this.maxQuantity; if (newOffer.MEASURE) { strLimit += (' ' + newOffer.MEASURE); } } BX.adjust(this.obQuantityLimit.value, {html: strLimit}); BX.adjust(this.obQuantityLimit.all, {style: {display: ''}}); } } if (this.config.usePriceRanges && this.obPriceRanges) { if ( this.currentPriceMode === 'Q' && newOffer.PRICE_RANGES_HTML ) { var rangesBody = this.getEntity(this.obPriceRanges, 'price-ranges-body'), rangesRatioHeader = this.getEntity(this.obPriceRanges, 'price-ranges-ratio-header'); if (rangesBody) { rangesBody.innerHTML = newOffer.PRICE_RANGES_HTML; } if (rangesRatioHeader) { rangesRatioHeader.innerHTML = newOffer.PRICE_RANGES_RATIO_HTML; } this.obPriceRanges.style.display = ''; } else { this.obPriceRanges.style.display = 'none'; } } } }, selectOfferProp: function() { var i = 0, strTreeValue = '', arTreeItem = [], rowItems = null, target = BX.proxy_context, smallCardItem; if (target && target.hasAttribute('data-treevalue')) { if (BX.hasClass(target, 'selected')) return; if (typeof document.activeElement === 'object') { document.activeElement.blur(); } strTreeValue = target.getAttribute('data-treevalue'); arTreeItem = strTreeValue.split('_'); this.searchOfferPropIndex(arTreeItem[0], arTreeItem[1]); rowItems = BX.findChildren(target.parentNode, {tagName: 'li'}, false); if (rowItems && rowItems.length) { for (i = 0; i < rowItems.length; i++) { BX.removeClass(rowItems[i], 'selected'); } } BX.addClass(target, 'selected'); if (this.smallCardNodes.panel) { smallCardItem = this.smallCardNodes.panel.querySelector('[data-treevalue="' + strTreeValue + '"]'); if (smallCardItem) { rowItems = this.smallCardNodes.panel.querySelectorAll('[data-sku-line="' + smallCardItem.getAttribute('data-sku-line') + '"]'); for (i = 0; i < rowItems.length; i++) { rowItems[i].style.display = 'none'; } smallCardItem.style.display = ''; } } } }, searchOfferPropIndex: function(strPropID, strPropValue) { var strName = '', arShowValues = false, arCanBuyValues = [], allValues = [], index = -1, i, j, arFilter = {}, tmpFilter = []; for (i = 0; i < this.treeProps.length; i++) { if (this.treeProps[i].ID === strPropID) { index = i; break; } } if (index > -1) { for (i = 0; i < index; i++) { strName = 'PROP_' + this.treeProps[i].ID; arFilter[strName] = this.selectedValues[strName]; } strName = 'PROP_' + this.treeProps[index].ID; arFilter[strName] = strPropValue; for (i = index + 1; i < this.treeProps.length; i++) { strName = 'PROP_' + this.treeProps[i].ID; arShowValues = this.getRowValues(arFilter, strName); if (!arShowValues) break; allValues = []; if (this.config.showAbsent) { arCanBuyValues = []; tmpFilter = []; tmpFilter = BX.clone(arFilter, true); for (j = 0; j < arShowValues.length; j++) { tmpFilter[strName] = arShowValues[j]; allValues[allValues.length] = arShowValues[j]; if (this.getCanBuy(tmpFilter)) arCanBuyValues[arCanBuyValues.length] = arShowValues[j]; } } else { arCanBuyValues = arShowValues; } if (this.selectedValues[strName] && BX.util.in_array(this.selectedValues[strName], arCanBuyValues)) { arFilter[strName] = this.selectedValues[strName]; } else { if (this.config.showAbsent) { arFilter[strName] = (arCanBuyValues.length ? arCanBuyValues[0] : allValues[0]); } else { arFilter[strName] = arCanBuyValues[0]; } } this.updateRow(i, arFilter[strName], arShowValues, arCanBuyValues); } this.selectedValues = arFilter; this.changeInfo(); } }, updateRow: function(intNumber, activeId, showId, canBuyId) { var i = 0, value = '', isCurrent = false, rowItems = null; var lineContainer = this.getEntities(this.obTree, 'sku-line-block'); if (intNumber > -1 && intNumber < lineContainer.length) { rowItems = lineContainer[intNumber].querySelectorAll('li'); for (i = 0; i < rowItems.length; i++) { value = rowItems[i].getAttribute('data-onevalue'); isCurrent = value === activeId; if (isCurrent) { BX.addClass(rowItems[i], 'selected'); } else { BX.removeClass(rowItems[i], 'selected'); } if (BX.util.in_array(value, canBuyId)) { BX.removeClass(rowItems[i], 'notallowed'); } else { BX.addClass(rowItems[i], 'notallowed'); } rowItems[i].style.display = BX.util.in_array(value, showId) ? '' : 'none'; if (isCurrent) { lineContainer[intNumber].style.display = (value == 0 && canBuyId.length == 1) ? 'none' : ''; } } if (this.smallCardNodes.panel) { rowItems = this.smallCardNodes.panel.querySelectorAll('[data-sku-line="' + intNumber + '"]'); for (i = 0; i < rowItems.length; i++) { value = rowItems[i].getAttribute('data-onevalue'); isCurrent = value === activeId; if (isCurrent) { rowItems[i].style.display = ''; } else { rowItems[i].style.display = 'none'; } if (BX.util.in_array(value, canBuyId)) { BX.removeClass(rowItems[i], 'notallowed'); } else { BX.addClass(rowItems[i], 'notallowed'); } if (isCurrent) { rowItems[i].style.display = (value == 0 && canBuyId.length == 1) ? 'none' : ''; } } } } }, getRowValues: function(arFilter, index) { var arValues = [], i = 0, j = 0, boolSearch = false, boolOneSearch = true; if (arFilter.length === 0) { for (i = 0; i < this.offers.length; i++) { if (!BX.util.in_array(this.offers[i].TREE[index], arValues)) { arValues[arValues.length] = this.offers[i].TREE[index]; } } boolSearch = true; } else { for (i = 0; i < this.offers.length; i++) { boolOneSearch = true; for (j in arFilter) { if (arFilter[j] !== this.offers[i].TREE[j]) { boolOneSearch = false; break; } } if (boolOneSearch) { if (!BX.util.in_array(this.offers[i].TREE[index], arValues)) { arValues[arValues.length] = this.offers[i].TREE[index]; } boolSearch = true; } } } return (boolSearch ? arValues : false); }, getCanBuy: function(arFilter) { var i, j = 0, boolOneSearch = true, boolSearch = false; for (i = 0; i < this.offers.length; i++) { boolOneSearch = true; for (j in arFilter) { if (arFilter[j] !== this.offers[i].TREE[j]) { boolOneSearch = false; break; } } if (boolOneSearch) { if (this.offers[i].CAN_BUY) { boolSearch = true; break; } } } return boolSearch; }, setCurrent: function() { var i, j = 0, strName = '', arShowValues = false, arCanBuyValues = [], arFilter = {}, tmpFilter = [], current = this.offers[this.offerNum].TREE; for (i = 0; i < this.treeProps.length; i++) { strName = 'PROP_' + this.treeProps[i].ID; arShowValues = this.getRowValues(arFilter, strName); if (!arShowValues) break; if (BX.util.in_array(current[strName], arShowValues)) { arFilter[strName] = current[strName]; } else { arFilter[strName] = arShowValues[0]; this.offerNum = 0; } if (this.config.showAbsent) { arCanBuyValues = []; tmpFilter = []; tmpFilter = BX.clone(arFilter, true); for (j = 0; j < arShowValues.length; j++) { tmpFilter[strName] = arShowValues[j]; if (this.getCanBuy(tmpFilter)) { arCanBuyValues[arCanBuyValues.length] = arShowValues[j]; } } } else { arCanBuyValues = arShowValues; } this.updateRow(i, arFilter[strName], arShowValues, arCanBuyValues); } this.selectedValues = arFilter; this.changeInfo(); }, changeInfo: function() { var index = -1, j = 0, boolOneSearch = true, eventData = { currentId: (this.offerNum > -1 ? this.offers[this.offerNum].ID : 0), newId: 0 }; var i, offerGroupNode; for (i = 0; i < this.offers.length; i++) { boolOneSearch = true; for (j in this.selectedValues) { if (this.selectedValues[j] !== this.offers[i].TREE[j]) { boolOneSearch = false; break; } } if (boolOneSearch) { index = i; break; } } if (index > -1) { if (index != this.offerNum) { this.isGift = false; } this.drawImages(this.offers[index].SLIDER); this.checkSliderControls(this.offers[index].SLIDER_COUNT); for (i = 0; i < this.offers.length; i++) { if (this.config.showOfferGroup && this.offers[i].OFFER_GROUP) { if (offerGroupNode = BX(this.visual.OFFER_GROUP + this.offers[i].ID)) { offerGroupNode.style.display = (i == index ? '' : 'none'); } } if (this.slider.controls[i].ID) { if (i === index) { this.product.slider = this.slider.controls[i]; this.slider.controls[i].CONT && BX.show(this.slider.controls[i].CONT); } else { this.slider.controls[i].CONT && BX.hide(this.slider.controls[i].CONT); } } else if (i === index) { this.product.slider = {}; } } if (this.offers[index].SLIDER_COUNT > 0) { this.setMainPict(this.offers[index].ID, this.offers[index].SLIDER[0].ID, true); } else { this.setMainPictFromItem(index); } if (this.offers[index].SLIDER_COUNT > 1) { this.initSlider(); } else { this.stopSlider(); } if (this.config.showSkuProps) { if (this.obSkuProps) { if (!this.offers[index].DISPLAY_PROPERTIES) { BX.adjust(this.obSkuProps, {style: {display: 'none'}, html: ''}); } else { BX.adjust(this.obSkuProps, {style: {display: ''}, html: this.offers[index].DISPLAY_PROPERTIES}); } } if (this.obMainSkuProps) { if (!this.offers[index].DISPLAY_PROPERTIES_MAIN_BLOCK) { BX.adjust(this.obMainSkuProps, {style: {display: 'none'}, html: ''}); } else { BX.adjust(this.obMainSkuProps, {style: {display: ''}, html: this.offers[index].DISPLAY_PROPERTIES_MAIN_BLOCK}); } } } this.quantitySet(index); this.setPrice(); this.setCompared(this.offers[index].COMPARED); this.offerNum = index; this.fixFontCheck(); this.setAnalyticsDataLayer('showDetail'); this.incViewedCounter(); eventData.newId = this.offers[this.offerNum].ID; // only for compatible catalog.store.amount custom templates BX.onCustomEvent('onCatalogStoreProductChange', [this.offers[this.offerNum].ID]); // new event BX.onCustomEvent('onCatalogElementChangeOffer', [eventData]); eventData = null; } }, drawImages: function(images) { if (!this.node.imageContainer) return; var i, img, entities = this.getEntities(this.node.imageContainer, 'image'); for (i in entities) { if (entities.hasOwnProperty(i) && BX.type.isDomNode(entities[i])) { BX.remove(entities[i]); } } for (i = 0; i < images.length; i++) { img = BX.create('IMG', { props: { src: images[i].SRC, alt: this.config.alt, title: this.config.title } }); if (i == 0) { img.setAttribute('itemprop', 'image'); } this.node.imageContainer.appendChild( BX.create('DIV', { attrs: { 'data-entity': 'image', 'data-id': images[i].ID }, props: { className: 'product-item-detail-slider-image' + (i == 0 ? ' active' : '') }, children: [img] }) ); } }, restoreSticker: function() { if (this.previousStickerText) { this.redrawSticker({text: this.previousStickerText}); } else { this.hideSticker(); } }, hideSticker: function() { BX.hide(BX(this.visual.STICKER_ID)); }, redrawSticker: function(stickerData) { stickerData = stickerData || {}; var text = stickerData.text || ''; var sticker = BX(this.visual.STICKER_ID); if (!sticker) return; BX.show(sticker); var previousStickerText = sticker.getAttribute('title'); if (previousStickerText && previousStickerText != text) { this.previousStickerText = previousStickerText; } BX.adjust(sticker, {text: text, attrs: {title: text}}); }, checkQuantityRange: function(quantity, direction) { if (typeof quantity === 'undefined'|| this.currentPriceMode !== 'Q') { return quantity; } quantity = parseFloat(quantity); var nearestQuantity = quantity; var range, diffFrom, absDiffFrom, diffTo, absDiffTo, shortestDiff; for (var i in this.currentQuantityRanges) { if (this.currentQuantityRanges.hasOwnProperty(i)) { range = this.currentQuantityRanges[i]; if ( parseFloat(quantity) >= parseFloat(range.SORT_FROM) && ( range.SORT_TO === 'INF' || parseFloat(quantity) <= parseFloat(range.SORT_TO) ) ) { nearestQuantity = quantity; break; } else { diffFrom = parseFloat(range.SORT_FROM) - quantity; absDiffFrom = Math.abs(diffFrom); diffTo = parseFloat(range.SORT_TO) - quantity; absDiffTo = Math.abs(diffTo); if (shortestDiff === undefined || shortestDiff > absDiffFrom) { if ( direction === undefined || (direction === 'up' && diffFrom > 0) || (direction === 'down' && diffFrom < 0) ) { shortestDiff = absDiffFrom; nearestQuantity = parseFloat(range.SORT_FROM); } } if (shortestDiff === undefined || shortestDiff > absDiffTo) { if ( direction === undefined || (direction === 'up' && diffFrom > 0) || (direction === 'down' && diffFrom < 0) ) { shortestDiff = absDiffTo; nearestQuantity = parseFloat(range.SORT_TO); } } } } } return nearestQuantity; }, checkPriceRange: function(quantity) { if (typeof quantity === 'undefined'|| this.currentPriceMode !== 'Q') { return; } var range, found = false; for (var i in this.currentQuantityRanges) { if (this.currentQuantityRanges.hasOwnProperty(i)) { range = this.currentQuantityRanges[i]; if ( parseFloat(quantity) >= parseFloat(range.SORT_FROM) && ( range.SORT_TO === 'INF' || parseFloat(quantity) <= parseFloat(range.SORT_TO) ) ) { found = true; this.currentQuantityRangeSelected = range.HASH; break; } } } if (!found && (range = this.getMinPriceRange())) { this.currentQuantityRangeSelected = range.HASH; } for (var k in this.currentPrices) { if (this.currentPrices.hasOwnProperty(k)) { if (this.currentPrices[k].QUANTITY_HASH == this.currentQuantityRangeSelected) { this.currentPriceSelected = k; break; } } } }, getMinPriceRange: function() { var range; for (var i in this.currentQuantityRanges) { if (this.currentQuantityRanges.hasOwnProperty(i)) { if ( !range || parseInt(this.currentQuantityRanges[i].SORT_FROM) < parseInt(range.SORT_FROM) ) { range = this.currentQuantityRanges[i]; } } } return range; }, checkQuantityControls: function() { if (!this.obQuantity) return; var reachedTopLimit = this.checkQuantity && parseFloat(this.obQuantity.value) + this.stepQuantity > this.maxQuantity, reachedBottomLimit = parseFloat(this.obQuantity.value) - this.stepQuantity < this.minQuantity; if (reachedTopLimit) { BX.addClass(this.obQuantityUp, 'product-item-amount-field-btn-disabled'); } else if (BX.hasClass(this.obQuantityUp, 'product-item-amount-field-btn-disabled')) { BX.removeClass(this.obQuantityUp, 'product-item-amount-field-btn-disabled'); } if (reachedBottomLimit) { BX.addClass(this.obQuantityDown, 'product-item-amount-field-btn-disabled'); } else if (BX.hasClass(this.obQuantityDown, 'product-item-amount-field-btn-disabled')) { BX.removeClass(this.obQuantityDown, 'product-item-amount-field-btn-disabled'); } if (reachedTopLimit && reachedBottomLimit) { this.obQuantity.setAttribute('disabled', 'disabled'); } else { this.obQuantity.removeAttribute('disabled'); } }, setPrice: function() { var economyInfo = '', price; if (this.obQuantity) { this.checkPriceRange(this.obQuantity.value); } this.checkQuantityControls(); price = this.currentPrices[this.currentPriceSelected]; if (this.isGift) { price.PRICE = 0; price.DISCOUNT = price.BASE_PRICE; price.PERCENT = 100; } if (this.obPrice.price) { if (price) { BX.adjust(this.obPrice.price, {html: BX.Currency.currencyFormat(price.RATIO_PRICE, price.CURRENCY, true)}); this.smallCardNodes.price && BX.adjust(this.smallCardNodes.price, { html: BX.Currency.currencyFormat(price.RATIO_PRICE, price.CURRENCY, true) }); } else { BX.adjust(this.obPrice.price, {html: ''}); this.smallCardNodes.price && BX.adjust(this.smallCardNodes.price, {html: ''}); } if (price && price.RATIO_PRICE !== price.RATIO_BASE_PRICE) { if (this.config.showOldPrice) { this.obPrice.full && BX.adjust(this.obPrice.full, { style: {display: ''}, html: BX.Currency.currencyFormat(price.RATIO_BASE_PRICE, price.CURRENCY, true) }); this.smallCardNodes.oldPrice && BX.adjust(this.smallCardNodes.oldPrice, { style: {display: ''}, html: BX.Currency.currencyFormat(price.RATIO_BASE_PRICE, price.CURRENCY, true) }); if (this.obPrice.discount) { economyInfo = BX.message('ECONOMY_INFO_MESSAGE'); economyInfo = economyInfo.replace('#ECONOMY#', BX.Currency.currencyFormat(price.RATIO_DISCOUNT, price.CURRENCY, true)); BX.adjust(this.obPrice.discount, {style: {display: ''}, html: economyInfo}); } } if (this.config.showPercent) { this.obPrice.percent && BX.adjust(this.obPrice.percent, { style: {display: ''}, html: -price.PERCENT + '%' }); } } else { if (this.config.showOldPrice) { this.obPrice.full && BX.adjust(this.obPrice.full, {style: {display: 'none'}, html: ''}); this.smallCardNodes.oldPrice && BX.adjust(this.smallCardNodes.oldPrice, {style: {display: 'none'}, html: ''}); this.obPrice.discount && BX.adjust(this.obPrice.discount, {style: {display: 'none'}, html: ''}); } if (this.config.showPercent) { this.obPrice.percent && BX.adjust(this.obPrice.percent, {style: {display: 'none'}, html: ''}); } } if (this.obPrice.total) { if (price && this.obQuantity && this.obQuantity.value != this.stepQuantity) { BX.adjust(this.obPrice.total, { html: BX.message('PRICE_TOTAL_PREFIX') + ' <strong>' + BX.Currency.currencyFormat(price.PRICE * this.obQuantity.value, price.CURRENCY, true) + '</strong>', style: {display: ''} }); } else { BX.adjust(this.obPrice.total, { html: '', style: {display: 'none'} }); } } } }, compare: function(event) { var checkbox = this.obCompare.querySelector('[data-entity="compare-checkbox"]'), target = BX.getEventTarget(event), checked = true; if (checkbox) { checked = target === checkbox ? checkbox.checked : !checkbox.checked; } var url = checked ? this.compareData.compareUrl : this.compareData.compareDeleteUrl, compareLink; if (url) { if (target !== checkbox) { BX.PreventDefault(event); this.setCompared(checked); } switch (this.productType) { case 0: // no catalog case 1: // product case 2: // set compareLink = url.replace('#ID#', this.product.id.toString()); break; case 3: // sku compareLink = url.replace('#ID#', this.offers[this.offerNum].ID); break; } BX.ajax({ method: 'POST', dataType: checked ? 'json' : 'html', url: compareLink + (compareLink.indexOf('?') !== -1 ? '&' : '?') + 'ajax_action=Y', onsuccess: checked ? BX.proxy(this.compareResult, this) : BX.proxy(this.compareDeleteResult, this) }); } }, compareResult: function(result) { var popupContent, popupButtons; if (this.obPopupWin) { this.obPopupWin.close(); } if (!BX.type.isPlainObject(result)) return; this.initPopupWindow(); if (this.offers.length > 0) { this.offers[this.offerNum].COMPARED = result.STATUS === 'OK'; } if (result.STATUS === 'OK') { BX.onCustomEvent('OnCompareChange'); popupContent = '<div style="width: 100%; margin: 0; text-align: center;"><p>' + BX.message('COMPARE_MESSAGE_OK') + '</p></div>'; if (this.config.showClosePopup) { popupButtons = [ new BasketButton({ text: BX.message('BTN_MESSAGE_COMPARE_REDIRECT'), events: { click: BX.delegate(this.compareRedirect, this) }, style: {marginRight: '10px'} }), new BasketButton({ text: BX.message('BTN_MESSAGE_CLOSE_POPUP'), events: { click: BX.delegate(this.obPopupWin.close, this.obPopupWin) } }) ]; } else { popupButtons = [ new BasketButton({ text: BX.message('BTN_MESSAGE_COMPARE_REDIRECT'), events: { click: BX.delegate(this.compareRedirect, this) } }) ]; } } else { popupContent = '<div style="width: 100%; margin: 0; text-align: center;"><p>' + (result.MESSAGE ? result.MESSAGE : BX.message('COMPARE_UNKNOWN_ERROR')) + '</p></div>'; popupButtons = [ new BasketButton({ text: BX.message('BTN_MESSAGE_CLOSE'), events: { click: BX.delegate(this.obPopupWin.close, this.obPopupWin) } }) ]; } this.obPopupWin.setTitleBar(BX.message('COMPARE_TITLE')); this.obPopupWin.setContent(popupContent); this.obPopupWin.setButtons(popupButtons); this.obPopupWin.show(); }, compareDeleteResult: function() { BX.onCustomEvent('OnCompareChange'); if (this.offers && this.offers.length) { this.offers[this.offerNum].COMPARED = false; } }, setCompared: function(state) { if (!this.obCompare) return; var checkbox = this.getEntity(this.obCompare, 'compare-checkbox'); if (checkbox) { checkbox.checked = state; } }, setCompareInfo: function(comparedIds) { if (!BX.type.isArray(comparedIds)) return; for (var i in this.offers) { if (this.offers.hasOwnProperty(i)) { this.offers[i].COMPARED = BX.util.in_array(this.offers[i].ID, comparedIds); } } }, compareRedirect: function() { if (this.compareData.comparePath) { location.href = this.compareData.comparePath; } else { this.obPopupWin.close(); } }, checkDeletedCompare: function(id) { switch (this.productType) { case 0: // no catalog case 1: // product case 2: // set if (this.product.id == id) { this.setCompared(false); } break; case 3: // sku var i = this.offers.length; while (i--) { if (this.offers[i].ID == id) { this.offers[i].COMPARED = false; if (this.offerNum == i) { this.setCompared(false); } break; } } } }, initBasketUrl: function() { this.basketUrl = (this.basketMode === 'ADD' ? this.basketData.add_url : this.basketData.buy_url); switch (this.productType) { case 1: // product case 2: // set this.basketUrl = this.basketUrl.replace('#ID#', this.product.id.toString()); break; case 3: // sku this.basketUrl = this.basketUrl.replace('#ID#', this.offers[this.offerNum].ID); break; } this.basketParams = { 'ajax_basket': 'Y' }; if (this.config.showQuantity) { this.basketParams[this.basketData.quantity] = this.obQuantity.value; } if (this.basketData.sku_props) { this.basketParams[this.basketData.sku_props_var] = this.basketData.sku_props; } }, fillBasketProps: function() { if (!this.visual.BASKET_PROP_DIV) return; var i = 0, propCollection = null, foundValues = false, obBasketProps = null; if (this.basketData.useProps && !this.basketData.emptyProps) { if (this.obPopupWin && this.obPopupWin.contentContainer) { obBasketProps = this.obPopupWin.contentContainer; } } else { obBasketProps = BX(this.visual.BASKET_PROP_DIV); } if (obBasketProps) { propCollection = obBasketProps.getElementsByTagName('select'); if (propCollection && propCollection.length) { for (i = 0; i < propCollection.length; i++) { if (!propCollection[i].disabled) { switch (propCollection[i].type.toLowerCase()) { case 'select-one': this.basketParams[propCollection[i].name] = propCollection[i].value; foundValues = true; break; default: break; } } } } propCollection = obBasketProps.getElementsByTagName('input'); if (propCollection && propCollection.length) { for (i = 0; i < propCollection.length; i++) { if (!propCollection[i].disabled) { switch (propCollection[i].type.toLowerCase()) { case 'hidden': this.basketParams[propCollection[i].name] = propCollection[i].value; foundValues = true; break; case 'radio': if (propCollection[i].checked) { this.basketParams[propCollection[i].name] = propCollection[i].value; foundValues = true; } break; default: break; } } } } } if (!foundValues) { this.basketParams[this.basketData.props] = []; this.basketParams[this.basketData.props][0] = 0; } }, sendToBasket: function() { if (!this.canBuy) return; this.initBasketUrl(); this.fillBasketProps(); BX.ajax({ method: 'POST', dataType: 'json', url: this.basketUrl, data: this.basketParams, onsuccess: BX.proxy(this.basketResult, this) }); }, add2Basket: function() { this.basketMode = 'ADD'; this.basket(); }, buyBasket: function() { this.basketMode = 'BUY'; this.basket(); }, basket: function() { var contentBasketProps = ''; if (!this.canBuy) return; switch (this.productType) { case 1: // product case 2: // set if (this.basketData.useProps && !this.basketData.emptyProps) { this.initPopupWindow(); this.obPopupWin.setTitleBar(BX.message('TITLE_BASKET_PROPS')); if (BX(this.visual.BASKET_PROP_DIV)) { contentBasketProps = BX(this.visual.BASKET_PROP_DIV).innerHTML; } this.obPopupWin.setContent(contentBasketProps); this.obPopupWin.setButtons([ new BasketButton({ text: BX.message('BTN_SEND_PROPS'), events: { click: BX.delegate(this.sendToBasket, this) } }) ]); this.obPopupWin.show(); } else { this.sendToBasket(); } break; case 3: // sku this.sendToBasket(); break; } }, basketResult: function(arResult) { var popupContent, popupButtons, productPict; if (this.obPopupWin) { this.obPopupWin.close(); } if (!BX.type.isPlainObject(arResult)) return; if (arResult.STATUS === 'OK') { this.setAnalyticsDataLayer('addToCart'); } if (arResult.STATUS === 'OK' && this.basketMode === 'BUY') { this.basketRedirect(); } else { this.initPopupWindow(); if (arResult.STATUS === 'OK') { BX.onCustomEvent('OnBasketChange'); switch (this.productType) { case 1: // product case 2: // set productPict = this.product.pict.SRC; break; case 3: // sku productPict = this.offers[this.offerNum].PREVIEW_PICTURE ? this.offers[this.offerNum].PREVIEW_PICTURE.SRC : this.defaultPict.pict.SRC; break; } popupContent = '<div style="width: 100%; margin: 0; text-align: center;">' + '<img src="' + productPict + '" height="130" style="max-height:130px"><p>' + this.product.name + '</p></div>'; if (this.config.showClosePopup) { popupButtons = [ new BasketButton({ text: BX.message('BTN_MESSAGE_BASKET_REDIRECT'), events: { click: BX.delegate(this.basketRedirect, this) }, style: {marginRight: '10px'} }), new BasketButton({ text: BX.message('BTN_MESSAGE_CLOSE_POPUP'), events: { click: BX.delegate(this.obPopupWin.close, this.obPopupWin) } }) ]; } else { popupButtons = [ new BasketButton({ text: BX.message('BTN_MESSAGE_BASKET_REDIRECT'), events: { click: BX.delegate(this.basketRedirect, this) } }) ]; } } else { popupContent = '<div style="width: 100%; margin: 0; text-align: center;"><p>' + (arResult.MESSAGE ? arResult.MESSAGE : BX.message('BASKET_UNKNOWN_ERROR')) + '</p></div>'; popupButtons = [ new BasketButton({ text: BX.message('BTN_MESSAGE_CLOSE'), events: { click: BX.delegate(this.obPopupWin.close, this.obPopupWin) } }) ]; } this.obPopupWin.setTitleBar(arResult.STATUS === 'OK' ? BX.message('TITLE_SUCCESSFUL') : BX.message('TITLE_ERROR')); this.obPopupWin.setContent(popupContent); this.obPopupWin.setButtons(popupButtons); this.obPopupWin.show(); } }, basketRedirect: function() { location.href = (this.basketData.basketUrl ? this.basketData.basketUrl : BX.message('BASKET_URL')); }, initPopupWindow: function() { if (this.obPopupWin) return; this.obPopupWin = BX.PopupWindowManager.create('CatalogElementBasket_' + this.visual.ID, null, { autoHide: false, offsetLeft: 0, offsetTop: 0, overlay: true, closeByEsc: true, titleBar: true, closeIcon: true, contentColor: 'white', className: this.config.templateTheme ? 'bx-' + this.config.templateTheme : '' }); }, incViewedCounter: function() { if (this.currentIsSet && !this.updateViewedCount) { switch (this.productType) { case 1: case 2: this.viewedCounter.params.PRODUCT_ID = this.product.id; this.viewedCounter.params.PARENT_ID = this.product.id; break; case 3: this.viewedCounter.params.PARENT_ID = this.product.id; this.viewedCounter.params.PRODUCT_ID = this.offers[this.offerNum].ID; break; default: return; } this.viewedCounter.params.SITE_ID = BX.message('SITE_ID'); this.updateViewedCount = true; BX.ajax.post( this.viewedCounter.path, this.viewedCounter.params, BX.delegate(function() { this.updateViewedCount = false; }, this) ); } }, allowViewedCount: function(update) { this.currentIsSet = true; if (update) { this.incViewedCounter(); } }, fixFontCheck: function() { if (BX.type.isDomNode(this.obPrice.price)) { BX.FixFontSize && BX.FixFontSize.init({ objList: [{ node: this.obPrice.price, maxFontSize: 28, smallestValue: false, scaleBy: this.obPrice.price.parentNode }], onAdaptiveResize: true }); } } } })(window);