%PDF- %PDF-
| Direktori : /proc/self/root/home/bitrix/www/bitrix/components/bitrix/catalog.item/templates/.default/ |
| Current File : //proc/self/root/home/bitrix/www/bitrix/components/bitrix/catalog.item/templates/.default/script.js |
(function (window){
'use strict';
if (window.JCCatalogItem)
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.JCCatalogItem = function (arParams)
{
this.productType = 0;
this.showQuantity = true;
this.showAbsent = true;
this.secondPict = false;
this.showOldPrice = false;
this.showMaxQuantity = 'N';
this.relativeQuantityFactor = 5;
this.showPercent = false;
this.showSkuProps = false;
this.basketAction = 'ADD';
this.showClosePopup = false;
this.useCompare = false;
this.showSubscription = false;
this.visual = {
ID: '',
PICT_ID: '',
SECOND_PICT_ID: '',
PICT_SLIDER_ID: '',
QUANTITY_ID: '',
QUANTITY_UP_ID: '',
QUANTITY_DOWN_ID: '',
PRICE_ID: '',
PRICE_OLD_ID: '',
DSC_PERC: '',
SECOND_DSC_PERC: '',
DISPLAY_PROP_DIV: '',
BASKET_PROP_DIV: '',
SUBSCRIBE_ID: ''
};
this.product = {
checkQuantity: false,
maxQuantity: 0,
stepQuantity: 1,
isDblQuantity: false,
canBuy: true,
name: '',
pict: {},
id: 0,
addUrl: '',
buyUrl: ''
};
this.basketMode = '';
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 = {
pict: null,
secondPict: null
};
this.defaultSliderOptions = {
interval: 3000,
wrap: true
};
this.slider = {
options: {},
items: [],
active: null,
sliding: null,
paused: null,
interval: null,
progress: null
};
this.touch = null;
this.quantityDelay = null;
this.quantityTimer = null;
this.checkQuantity = false;
this.maxQuantity = 0;
this.minQuantity = 0;
this.stepQuantity = 1;
this.isDblQuantity = false;
this.canBuy = true;
this.precision = 6;
this.precisionFactor = Math.pow(10, this.precision);
this.bigData = false;
this.fullDisplayMode = false;
this.viewMode = '';
this.templateTheme = '';
this.currentPriceMode = '';
this.currentPrices = [];
this.currentPriceSelected = 0;
this.currentQuantityRanges = [];
this.currentQuantityRangeSelected = 0;
this.offers = [];
this.offerNum = 0;
this.treeProps = [];
this.selectedValues = {};
this.obProduct = null;
this.blockNodes = {};
this.obQuantity = null;
this.obQuantityUp = null;
this.obQuantityDown = null;
this.obQuantityLimit = {};
this.obPict = null;
this.obSecondPict = null;
this.obPictSlider = null;
this.obPictSliderIndicator = null;
this.obPrice = null;
this.obTree = null;
this.obBuyBtn = null;
this.obBasketActions = null;
this.obNotAvail = null;
this.obSubscribe = null;
this.obDscPerc = null;
this.obSecondDscPerc = null;
this.obSkuProps = null;
this.obMeasure = null;
this.obCompare = null;
this.obPopupWin = null;
this.basketUrl = '';
this.basketParams = {};
this.isTouchDevice = BX.hasClass(document.documentElement, 'bx-touch');
this.hoverTimer = null;
this.hoverStateChangeForbidden = false;
this.mouseX = null;
this.mouseY = null;
this.useEnhancedEcommerce = false;
this.dataLayerName = 'dataLayer';
this.brandProperty = false;
this.errorCode = 0;
if (typeof arParams === 'object')
{
if (arParams.PRODUCT_TYPE)
{
this.productType = parseInt(arParams.PRODUCT_TYPE, 10);
}
this.showQuantity = arParams.SHOW_QUANTITY;
this.showAbsent = arParams.SHOW_ABSENT;
this.secondPict = arParams.SECOND_PICT;
this.showOldPrice = arParams.SHOW_OLD_PRICE;
this.showMaxQuantity = arParams.SHOW_MAX_QUANTITY;
this.relativeQuantityFactor = parseInt(arParams.RELATIVE_QUANTITY_FACTOR);
this.showPercent = arParams.SHOW_DISCOUNT_PERCENT;
this.showSkuProps = arParams.SHOW_SKU_PROPS;
this.showSubscription = arParams.USE_SUBSCRIBE;
if (arParams.ADD_TO_BASKET_ACTION)
{
this.basketAction = arParams.ADD_TO_BASKET_ACTION;
}
this.showClosePopup = arParams.SHOW_CLOSE_POPUP;
this.useCompare = arParams.DISPLAY_COMPARE;
this.fullDisplayMode = arParams.PRODUCT_DISPLAY_MODE === 'Y';
this.bigData = arParams.BIG_DATA;
this.viewMode = arParams.VIEW_MODE || '';
this.templateTheme = arParams.TEMPLATE_THEME || '';
this.useEnhancedEcommerce = arParams.USE_ENHANCED_ECOMMERCE === 'Y';
this.dataLayerName = arParams.DATA_LAYER_NAME;
this.brandProperty = arParams.BRAND_PROPERTY;
this.visual = arParams.VISUAL;
switch (this.productType)
{
case 0: // no catalog
case 1: // product
case 2: // set
if (arParams.PRODUCT && typeof arParams.PRODUCT === 'object')
{
this.currentPriceMode = arParams.PRODUCT.ITEM_PRICE_MODE;
this.currentPrices = arParams.PRODUCT.ITEM_PRICES;
this.currentPriceSelected = arParams.PRODUCT.ITEM_PRICE_SELECTED;
this.currentQuantityRanges = arParams.PRODUCT.ITEM_QUANTITY_RANGES;
this.currentQuantityRangeSelected = arParams.PRODUCT.ITEM_QUANTITY_RANGE_SELECTED;
if (this.showQuantity)
{
this.product.checkQuantity = arParams.PRODUCT.CHECK_QUANTITY;
this.product.isDblQuantity = arParams.PRODUCT.QUANTITY_FLOAT;
if (this.product.checkQuantity)
{
this.product.maxQuantity = (this.product.isDblQuantity ? parseFloat(arParams.PRODUCT.MAX_QUANTITY) : parseInt(arParams.PRODUCT.MAX_QUANTITY, 10));
}
this.product.stepQuantity = (this.product.isDblQuantity ? parseFloat(arParams.PRODUCT.STEP_QUANTITY) : parseInt(arParams.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 = arParams.PRODUCT.CAN_BUY;
if (arParams.PRODUCT.MORE_PHOTO_COUNT)
{
this.product.morePhotoCount = arParams.PRODUCT.MORE_PHOTO_COUNT;
this.product.morePhoto = arParams.PRODUCT.MORE_PHOTO;
}
if (arParams.PRODUCT.RCM_ID)
{
this.product.rcmId = arParams.PRODUCT.RCM_ID;
}
this.canBuy = this.product.canBuy;
this.product.name = arParams.PRODUCT.NAME;
this.product.pict = arParams.PRODUCT.PICT;
this.product.id = arParams.PRODUCT.ID;
this.product.DETAIL_PAGE_URL = arParams.PRODUCT.DETAIL_PAGE_URL;
if (arParams.PRODUCT.ADD_URL)
{
this.product.addUrl = arParams.PRODUCT.ADD_URL;
}
if (arParams.PRODUCT.BUY_URL)
{
this.product.buyUrl = arParams.PRODUCT.BUY_URL;
}
if (arParams.BASKET && typeof arParams.BASKET === 'object')
{
this.basketData.useProps = arParams.BASKET.ADD_PROPS;
this.basketData.emptyProps = arParams.BASKET.EMPTY_PROPS;
}
}
else
{
this.errorCode = -1;
}
break;
case 3: // sku
if (arParams.PRODUCT && typeof arParams.PRODUCT === 'object')
{
this.product.name = arParams.PRODUCT.NAME;
this.product.id = arParams.PRODUCT.ID;
this.product.DETAIL_PAGE_URL = arParams.PRODUCT.DETAIL_PAGE_URL;
this.product.morePhotoCount = arParams.PRODUCT.MORE_PHOTO_COUNT;
this.product.morePhoto = arParams.PRODUCT.MORE_PHOTO;
if (arParams.PRODUCT.RCM_ID)
{
this.product.rcmId = arParams.PRODUCT.RCM_ID;
}
}
if (arParams.OFFERS && BX.type.isArray(arParams.OFFERS))
{
this.offers = arParams.OFFERS;
this.offerNum = 0;
if (arParams.OFFER_SELECTED)
{
this.offerNum = parseInt(arParams.OFFER_SELECTED, 10);
}
if (isNaN(this.offerNum))
{
this.offerNum = 0;
}
if (arParams.TREE_PROPS)
{
this.treeProps = arParams.TREE_PROPS;
}
if (arParams.DEFAULT_PICTURE)
{
this.defaultPict.pict = arParams.DEFAULT_PICTURE.PICTURE;
this.defaultPict.secondPict = arParams.DEFAULT_PICTURE.PICTURE_SECOND;
}
}
break;
default:
this.errorCode = -1;
}
if (arParams.BASKET && typeof arParams.BASKET === 'object')
{
if (arParams.BASKET.QUANTITY)
{
this.basketData.quantity = arParams.BASKET.QUANTITY;
}
if (arParams.BASKET.PROPS)
{
this.basketData.props = arParams.BASKET.PROPS;
}
if (arParams.BASKET.BASKET_URL)
{
this.basketData.basketUrl = arParams.BASKET.BASKET_URL;
}
if (3 === this.productType)
{
if (arParams.BASKET.SKU_PROPS)
{
this.basketData.sku_props = arParams.BASKET.SKU_PROPS;
}
}
if (arParams.BASKET.ADD_URL_TEMPLATE)
{
this.basketData.add_url = arParams.BASKET.ADD_URL_TEMPLATE;
}
if (arParams.BASKET.BUY_URL_TEMPLATE)
{
this.basketData.buy_url = arParams.BASKET.BUY_URL_TEMPLATE;
}
if (this.basketData.add_url === '' && this.basketData.buy_url === '')
{
this.errorCode = -1024;
}
}
if (this.useCompare)
{
if (arParams.COMPARE && typeof arParams.COMPARE === 'object')
{
if (arParams.COMPARE.COMPARE_PATH)
{
this.compareData.comparePath = arParams.COMPARE.COMPARE_PATH;
}
if (arParams.COMPARE.COMPARE_URL_TEMPLATE)
{
this.compareData.compareUrl = arParams.COMPARE.COMPARE_URL_TEMPLATE;
}
else
{
this.useCompare = false;
}
if (arParams.COMPARE.COMPARE_DELETE_URL_TEMPLATE)
{
this.compareData.compareDeleteUrl = arParams.COMPARE.COMPARE_DELETE_URL_TEMPLATE;
}
else
{
this.useCompare = false;
}
}
else
{
this.useCompare = false;
}
}
}
if (this.errorCode === 0)
{
BX.ready(BX.delegate(this.init,this));
}
};
window.JCCatalogItem.prototype = {
init: function()
{
var i = 0,
treeItems = null;
this.obProduct = BX(this.visual.ID);
if (!this.obProduct)
{
this.errorCode = -1;
}
this.obPict = BX(this.visual.PICT_ID);
if (!this.obPict)
{
this.errorCode = -2;
}
if (this.secondPict && this.visual.SECOND_PICT_ID)
{
this.obSecondPict = BX(this.visual.SECOND_PICT_ID);
}
this.obPictSlider = BX(this.visual.PICT_SLIDER_ID);
this.obPictSliderIndicator = BX(this.visual.PICT_SLIDER_ID + '_indicator');
this.obPictSliderProgressBar = BX(this.visual.PICT_SLIDER_ID + '_progress_bar');
if (!this.obPictSlider)
{
this.errorCode = -4;
}
this.obPrice = BX(this.visual.PRICE_ID);
this.obPriceOld = BX(this.visual.PRICE_OLD_ID);
this.obPriceTotal = BX(this.visual.PRICE_TOTAL_ID);
if (!this.obPrice)
{
this.errorCode = -16;
}
if (this.showQuantity && this.visual.QUANTITY_ID)
{
this.obQuantity = BX(this.visual.QUANTITY_ID);
this.blockNodes.quantity = this.obProduct.querySelector('[data-entity="quantity-block"]');
if (!this.isTouchDevice)
{
BX.bind(this.obQuantity, 'focus', BX.proxy(this.onFocus, this));
BX.bind(this.obQuantity, 'blur', BX.proxy(this.onBlur, this));
}
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.visual.QUANTITY_LIMIT && this.showMaxQuantity !== 'N')
{
this.obQuantityLimit.all = BX(this.visual.QUANTITY_LIMIT);
if (this.obQuantityLimit.all)
{
this.obQuantityLimit.value = this.obQuantityLimit.all.querySelector('[data-entity="quantity-limit-value"]');
if (!this.obQuantityLimit.value)
{
this.obQuantityLimit.all = null;
}
}
}
if (this.productType === 3 && this.fullDisplayMode)
{
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);
}
}
this.obBasketActions = BX(this.visual.BASKET_ACTIONS_ID);
if (this.obBasketActions)
{
if (this.visual.BUY_ID)
{
this.obBuyBtn = BX(this.visual.BUY_ID);
}
}
this.obNotAvail = BX(this.visual.NOT_AVAILABLE_MESS);
if (this.showSubscription)
{
this.obSubscribe = BX(this.visual.SUBSCRIBE_ID);
}
if (this.showPercent)
{
if (this.visual.DSC_PERC)
{
this.obDscPerc = BX(this.visual.DSC_PERC);
}
if (this.secondPict && this.visual.SECOND_DSC_PERC)
{
this.obSecondDscPerc = BX(this.visual.SECOND_DSC_PERC);
}
}
if (this.showSkuProps)
{
if (this.visual.DISPLAY_PROP_DIV)
{
this.obSkuProps = BX(this.visual.DISPLAY_PROP_DIV);
}
}
if (this.errorCode === 0)
{
// product slider events
if (this.isTouchDevice)
{
BX.bind(this.obPictSlider, 'touchstart', BX.proxy(this.touchStartEvent, this));
BX.bind(this.obPictSlider, 'touchend', BX.proxy(this.touchEndEvent, this));
BX.bind(this.obPictSlider, 'touchcancel', BX.proxy(this.touchEndEvent, this));
}
else
{
if (this.viewMode === 'CARD')
{
// product hover events
BX.bind(this.obProduct, 'mouseenter', BX.proxy(this.hoverOn, this));
BX.bind(this.obProduct, 'mouseleave', BX.proxy(this.hoverOff, this));
}
// product slider events
BX.bind(this.obProduct, 'mouseenter', BX.proxy(this.cycleSlider, this));
BX.bind(this.obProduct, 'mouseleave', BX.proxy(this.stopSlider, this));
}
if (this.bigData)
{
var links = BX.findChildren(this.obProduct, {tag:'a'}, true);
if (links)
{
for (i in links)
{
if (links.hasOwnProperty(i))
{
if (links[i].getAttribute('href') == this.product.DETAIL_PAGE_URL)
{
BX.bind(links[i], 'click', BX.proxy(this.rememberProductRecommendation, this));
}
}
}
}
}
if (this.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 (parseInt(this.product.morePhotoCount) > 1 && this.obPictSlider)
{
this.initializeSlider();
}
this.checkQuantityControls();
break;
case 3: // sku
if (this.offers.length > 0)
{
treeItems = BX.findChildren(this.obTree, {tagName: 'li'}, true);
if (treeItems && treeItems.length)
{
for (i = 0; i < treeItems.length; i++)
{
BX.bind(treeItems[i], 'click', BX.delegate(this.selectOfferProp, this));
}
}
this.setCurrent();
}
else if (parseInt(this.product.morePhotoCount) > 1 && this.obPictSlider)
{
this.initializeSlider();
}
break;
}
if (this.obBuyBtn)
{
if (this.basketAction === 'ADD')
{
BX.bind(this.obBuyBtn, 'click', BX.proxy(this.add2Basket, this));
}
else
{
BX.bind(this.obBuyBtn, 'click', BX.proxy(this.buyBasket, this));
}
}
if (this.useCompare)
{
this.obCompare = BX(this.visual.COMPARE_LINK_ID);
if (this.obCompare)
{
BX.bind(this.obCompare, 'click', BX.proxy(this.compare, this));
}
BX.addCustomEvent('onCatalogDeleteCompare', BX.proxy(this.checkDeletedCompare, this));
}
}
},
setAnalyticsDataLayer: function(action)
{
if (!this.useEnhancedEcommerce || !this.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,
'brand': BX.type.isArray(this.brandProperty) ? this.brandProperty.join('/') : this.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,
'brand': BX.type.isArray(this.brandProperty) ? this.brandProperty.join('/') : this.brandProperty,
'variant': variants.join('/')
};
break;
}
switch (action)
{
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.showQuantity && this.obQuantity ? this.obQuantity.value : 1
}]
}
}
};
break;
}
window[this.dataLayerName] = window[this.dataLayerName] || [];
window[this.dataLayerName].push(info);
},
hoverOn: function(event)
{
clearTimeout(this.hoverTimer);
this.obProduct.style.height = getComputedStyle(this.obProduct).height;
BX.addClass(this.obProduct, 'hover');
BX.PreventDefault(event);
},
hoverOff: function(event)
{
if (this.hoverStateChangeForbidden)
return;
BX.removeClass(this.obProduct, 'hover');
this.hoverTimer = setTimeout(
BX.delegate(function(){
this.obProduct.style.height = 'auto';
}, this),
300
);
BX.PreventDefault(event);
},
onFocus: function()
{
this.hoverStateChangeForbidden = true;
BX.bind(document, 'mousemove', BX.proxy(this.captureMousePosition, this));
},
onBlur: function()
{
this.hoverStateChangeForbidden = false;
BX.unbind(document, 'mousemove', BX.proxy(this.captureMousePosition, this));
var cursorElement = document.elementFromPoint(this.mouseX, this.mouseY);
if (!cursorElement || !this.obProduct.contains(cursorElement))
{
this.hoverOff();
}
},
captureMousePosition: function(event)
{
this.mouseX = event.clientX;
this.mouseY = event.clientY;
},
getCookie: function(name)
{
var matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
));
return matches ? decodeURIComponent(matches[1]) : null;
},
rememberProductRecommendation: function()
{
// save to RCM_PRODUCT_LOG
var cookieName = BX.cookie_prefix + '_RCM_PRODUCT_LOG',
cookie = this.getCookie(cookieName),
itemFound = false;
var cItems = [],
cItem;
if (cookie)
{
cItems = cookie.split('.');
}
var i = cItems.length;
while (i--)
{
cItem = cItems[i].split('-');
if (cItem[0] == this.product.id)
{
// it's already in recommendations, update the date
cItem = cItems[i].split('-');
// update rcmId and date
cItem[1] = this.product.rcmId;
cItem[2] = BX.current_server_time;
cItems[i] = cItem.join('-');
itemFound = true;
}
else
{
if ((BX.current_server_time - cItem[2]) > 3600 * 24 * 30)
{
cItems.splice(i, 1);
}
}
}
if (!itemFound)
{
// add recommendation
cItems.push([this.product.id, this.product.rcmId, BX.current_server_time].join('-'));
}
// serialize
var plNewCookie = cItems.join('.'),
cookieDate = new Date(new Date().getTime() + 1000 * 3600 * 24 * 365 * 10).toUTCString();
document.cookie = cookieName + "=" + plNewCookie + "; path=/; expires=" + cookieDate + "; domain=" + BX.cookie_domain;
},
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.showQuantity && this.canBuy)
{
curValue = (this.isDblQuantity ? parseFloat(this.obQuantity.value) : parseInt(this.obQuantity.value, 10));
if (!isNaN(curValue))
{
curValue += this.stepQuantity;
if (this.checkQuantity)
{
if (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.showQuantity && this.canBuy)
{
curValue = (this.isDblQuantity ? parseFloat(this.obQuantity.value) : parseInt(this.obQuantity.value, 10));
if (!isNaN(curValue))
{
curValue -= this.stepQuantity;
this.checkPriceRange(curValue);
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.showQuantity)
{
if (this.canBuy)
{
curValue = this.isDblQuantity ? parseFloat(this.obQuantity.value) : Math.round(this.obQuantity.value);
if (!isNaN(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 resetQuantity, strLimit;
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)
{
if (this.blockNodes.quantity)
{
BX.style(this.blockNodes.quantity, 'display', '');
}
if (this.obBasketActions)
{
BX.style(this.obBasketActions, 'display', '');
}
if (this.obNotAvail)
{
BX.style(this.obNotAvail, 'display', 'none');
}
if (this.obSubscribe)
{
BX.style(this.obSubscribe, 'display', 'none');
}
}
else
{
if (this.blockNodes.quantity)
{
BX.style(this.blockNodes.quantity, 'display', 'none');
}
if (this.obBasketActions)
{
BX.style(this.obBasketActions, 'display', 'none');
}
if (this.obNotAvail)
{
BX.style(this.obNotAvail, '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_ID + '_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.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.showMaxQuantity === 'M')
{
strLimit = (this.maxQuantity / this.stepQuantity >= this.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: ''}});
}
}
}
},
initializeSlider: function()
{
var wrap = this.obPictSlider.getAttribute('data-slider-wrap');
if (wrap)
{
this.slider.options.wrap = wrap === 'true';
}
else
{
this.slider.options.wrap = this.defaultSliderOptions.wrap;
}
if (this.isTouchDevice)
{
this.slider.options.interval = false;
}
else
{
this.slider.options.interval = parseInt(this.obPictSlider.getAttribute('data-slider-interval')) || this.defaultSliderOptions.interval;
// slider interval must be more than 700ms because of css transitions
if (this.slider.options.interval < 700)
{
this.slider.options.interval = 700;
}
if (this.obPictSliderIndicator)
{
var controls = this.obPictSliderIndicator.querySelectorAll('[data-go-to]');
for (var i in controls)
{
if (controls.hasOwnProperty(i))
{
BX.bind(controls[i], 'click', BX.proxy(this.sliderClickHandler, this));
}
}
}
if (this.obPictSliderProgressBar)
{
if (this.slider.progress)
{
this.resetProgress();
this.cycleSlider();
}
else
{
this.slider.progress = new BX.easing({
transition: BX.easing.transitions.linear,
step: BX.delegate(function(state){
this.obPictSliderProgressBar.style.width = state.width / 10 + '%';
}, this)
});
}
}
}
},
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();
}
}
},
sliderClickHandler: function(event)
{
var target = BX.getEventTarget(event),
slideIndex = target.getAttribute('data-go-to');
if (slideIndex)
{
this.slideTo(slideIndex)
}
BX.PreventDefault(event);
},
slideNext: function()
{
if (this.slider.sliding)
return;
return this.slide('next');
},
slidePrev: function()
{
if (this.slider.sliding)
return;
return this.slide('prev');
},
slideTo: function(pos)
{
this.slider.active = BX.findChild(this.obPictSlider, {className: 'item active'}, true, false);
this.slider.progress && (this.slider.interval = true);
var activeIndex = this.getItemIndex(this.slider.active);
if (pos > (this.slider.items.length - 1) || pos < 0)
return;
if (this.slider.sliding)
return false;
if (activeIndex == pos)
{
this.stopSlider();
this.cycleSlider();
return;
}
return this.slide(pos > activeIndex ? 'next' : 'prev', this.eq(this.slider.items, pos));
},
slide: function(type, next)
{
var active = BX.findChild(this.obPictSlider, {className: 'item active'}, true, false),
isCycling = this.slider.interval,
direction = type === 'next' ? 'left' : 'right';
next = next || this.getItemForDirection(type, active);
if (BX.hasClass(next, 'active'))
{
return (this.slider.sliding = false);
}
this.slider.sliding = true;
isCycling && this.stopSlider();
if (this.obPictSliderIndicator)
{
BX.removeClass(this.obPictSliderIndicator.querySelector('.active'), 'active');
var nextIndicator = this.obPictSliderIndicator.querySelectorAll('[data-go-to]')[this.getItemIndex(next)];
nextIndicator && BX.addClass(nextIndicator, 'active');
}
if (BX.hasClass(this.obPictSlider, 'slide') && !BX.browser.IsIE())
{
var self = this;
BX.addClass(next, type);
next.offsetWidth; // force reflow
BX.addClass(active, direction);
BX.addClass(next, direction);
setTimeout(function() {
BX.addClass(next, 'active');
BX.removeClass(active, 'active');
BX.removeClass(active, direction);
BX.removeClass(next, type);
BX.removeClass(next, direction);
self.slider.sliding = false;
}, 700);
}
else
{
BX.addClass(next, 'active');
this.slider.sliding = false;
}
this.obPictSliderProgressBar && this.resetProgress();
isCycling && this.cycleSlider();
},
stopSlider: function(event)
{
event || (this.slider.paused = true);
this.slider.interval && clearInterval(this.slider.interval);
if (this.slider.progress)
{
this.slider.progress.stop();
var width = parseInt(this.obPictSliderProgressBar.style.width);
this.slider.progress.options.duration = this.slider.options.interval * 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();
}
},
cycleSlider: function(event)
{
event || (this.slider.paused = false);
this.slider.interval && clearInterval(this.slider.interval);
if (this.slider.options.interval && !this.slider.paused)
{
if (this.slider.progress)
{
this.slider.progress.stop();
var width = parseInt(this.obPictSliderProgressBar.style.width);
this.slider.progress.options.duration = this.slider.options.interval * (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.slider.options.interval);
}
}
},
resetProgress: function()
{
this.slider.progress && this.slider.progress.stop();
this.obPictSliderProgressBar.style.width = 0;
},
getItemForDirection: function(direction, active)
{
var activeIndex = this.getItemIndex(active),
willWrap = direction === 'prev' && activeIndex === 0
|| direction === 'next' && activeIndex == (this.slider.items.length - 1);
if (willWrap && !this.slider.options.wrap)
return active;
var delta = direction === 'prev' ? -1 : 1,
itemIndex = (activeIndex + delta) % this.slider.items.length;
return this.eq(this.slider.items, itemIndex);
},
getItemIndex: function(item)
{
this.slider.items = BX.findChildren(item.parentNode, {className: 'item'}, true);
return this.slider.items.indexOf(item || this.slider.active);
},
eq: function(obj, i)
{
var len = obj.length,
j = +i + (i < 0 ? len : 0);
return j >= 0 && j < len ? obj[j] : {};
},
selectOfferProp: function()
{
var i = 0,
value = '',
strTreeValue = '',
arTreeItem = [],
rowItems = null,
target = BX.proxy_context;
if (target && target.hasAttribute('data-treevalue'))
{
if (BX.hasClass(target, 'selected'))
return;
strTreeValue = target.getAttribute('data-treevalue');
arTreeItem = strTreeValue.split('_');
if (this.searchOfferPropIndex(arTreeItem[0], arTreeItem[1]))
{
rowItems = BX.findChildren(target.parentNode, {tagName: 'li'}, false);
if (rowItems && 0 < rowItems.length)
{
for (i = 0; i < rowItems.length; i++)
{
value = rowItems[i].getAttribute('data-onevalue');
if (value === arTreeItem[1])
{
BX.addClass(rowItems[i], 'selected');
}
else
{
BX.removeClass(rowItems[i], 'selected');
}
}
}
}
}
},
searchOfferPropIndex: function(strPropID, strPropValue)
{
var strName = '',
arShowValues = false,
i, j,
arCanBuyValues = [],
allValues = [],
index = -1,
arFilter = {},
tmpFilter = [];
for (i = 0; i < this.treeProps.length; i++)
{
if (this.treeProps[i].ID === strPropID)
{
index = i;
break;
}
}
if (-1 < index)
{
for (i = 0; i < index; i++)
{
strName = 'PROP_'+this.treeProps[i].ID;
arFilter[strName] = this.selectedValues[strName];
}
strName = 'PROP_'+this.treeProps[index].ID;
arShowValues = this.getRowValues(arFilter, strName);
if (!arShowValues)
{
return false;
}
if (!BX.util.in_array(strPropValue, arShowValues))
{
return false;
}
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)
{
return false;
}
allValues = [];
if (this.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.showAbsent)
arFilter[strName] = (arCanBuyValues.length > 0 ? arCanBuyValues[0] : allValues[0]);
else
arFilter[strName] = arCanBuyValues[0];
}
this.updateRow(i, arFilter[strName], arShowValues, arCanBuyValues);
}
this.selectedValues = arFilter;
this.changeInfo();
}
return true;
},
updateRow: function(intNumber, activeID, showID, canBuyID)
{
var i = 0,
value = '',
isCurrent = false,
rowItems = null;
var lineContainer = this.obTree.querySelectorAll('[data-entity="sku-line-block"]'),
listContainer;
if (intNumber > -1 && intNumber < lineContainer.length)
{
listContainer = lineContainer[intNumber].querySelector('ul');
rowItems = BX.findChildren(listContainer, {tagName: 'li'}, false);
if (rowItems && 0 < rowItems.length)
{
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' : '';
}
}
}
}
},
getRowValues: function(arFilter, index)
{
var i = 0,
j,
arValues = [],
boolSearch = false,
boolOneSearch = true;
if (0 === arFilter.length)
{
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,
boolSearch = false,
boolOneSearch = true;
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,
arCanBuyValues = [],
strName = '',
arShowValues = false,
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.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 i, j,
index = -1,
boolOneSearch = true,
quantityChanged;
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 (parseInt(this.offers[index].MORE_PHOTO_COUNT) > 1 && this.obPictSlider)
{
// hide pict and second_pict containers
if (this.obPict)
{
this.obPict.style.display = 'none';
}
if (this.obSecondPict)
{
this.obSecondPict.style.display = 'none';
}
// clear slider container
BX.cleanNode(this.obPictSlider);
// fill slider container with slides
for (i in this.offers[index].MORE_PHOTO)
{
if (this.offers[index].MORE_PHOTO.hasOwnProperty(i))
{
this.obPictSlider.appendChild(
BX.create('SPAN', {
props: {className: 'product-item-image-slide item' + (i == 0 ? ' active' : '')},
style: {backgroundImage: 'url(\'' + this.offers[index].MORE_PHOTO[i].SRC + '\')'}
})
);
}
}
// fill slider indicator if exists
if (this.obPictSliderIndicator)
{
BX.cleanNode(this.obPictSliderIndicator);
for (i in this.offers[index].MORE_PHOTO)
{
if (this.offers[index].MORE_PHOTO.hasOwnProperty(i))
{
this.obPictSliderIndicator.appendChild(
BX.create('DIV', {
attrs: {'data-go-to': i},
props: {className: 'product-item-image-slider-control' + (i == 0 ? ' active' : '')}
})
);
this.obPictSliderIndicator.appendChild(document.createTextNode(' '));
}
}
this.obPictSliderIndicator.style.display = '';
}
if (this.obPictSliderProgressBar)
{
this.obPictSliderProgressBar.style.display = '';
}
// show slider container
this.obPictSlider.style.display = '';
this.initializeSlider();
}
else
{
// hide slider container
if (this.obPictSlider)
{
this.obPictSlider.style.display = 'none';
}
if (this.obPictSliderIndicator)
{
this.obPictSliderIndicator.style.display = 'none';
}
if (this.obPictSliderProgressBar)
{
this.obPictSliderProgressBar.style.display = 'none';
}
// show pict and pict_second containers
if (this.obPict)
{
if (this.offers[index].PREVIEW_PICTURE)
{
BX.adjust(this.obPict, {style: {backgroundImage: 'url(\'' + this.offers[index].PREVIEW_PICTURE.SRC + '\')'}});
}
else
{
BX.adjust(this.obPict, {style: {backgroundImage: 'url(\'' + this.defaultPict.pict.SRC + '\')'}});
}
this.obPict.style.display = '';
}
if (this.secondPict && this.obSecondPict)
{
if (this.offers[index].PREVIEW_PICTURE_SECOND)
{
BX.adjust(this.obSecondPict, {style: {backgroundImage: 'url(\'' + this.offers[index].PREVIEW_PICTURE_SECOND.SRC + '\')'}});
}
else if (this.offers[index].PREVIEW_PICTURE.SRC)
{
BX.adjust(this.obSecondPict, {style: {backgroundImage: 'url(\'' + this.offers[index].PREVIEW_PICTURE.SRC + '\')'}});
}
else if (this.defaultPict.secondPict)
{
BX.adjust(this.obSecondPict, {style: {backgroundImage: 'url(\'' + this.defaultPict.secondPict.SRC + '\')'}});
}
else
{
BX.adjust(this.obSecondPict, {style: {backgroundImage: 'url(\'' + this.defaultPict.pict.SRC + '\')'}});
}
this.obSecondPict.style.display = '';
}
}
if (this.showSkuProps && this.obSkuProps)
{
if (this.offers[index].DISPLAY_PROPERTIES.length)
{
BX.adjust(this.obSkuProps, {style: {display: ''}, html: this.offers[index].DISPLAY_PROPERTIES});
}
else
{
BX.adjust(this.obSkuProps, {style: {display: 'none'}, html: ''});
}
}
this.quantitySet(index);
this.setPrice();
this.setCompared(this.offers[index].COMPARED);
this.offerNum = index;
}
},
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 (
parseInt(quantity) >= parseInt(range.SORT_FROM)
&& (
range.SORT_TO == 'INF'
|| parseInt(quantity) <= parseInt(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 obData, price;
if (this.obQuantity)
{
this.checkPriceRange(this.obQuantity.value);
}
this.checkQuantityControls();
price = this.currentPrices[this.currentPriceSelected];
if (this.obPrice)
{
if (price)
{
BX.adjust(this.obPrice, {html: BX.Currency.currencyFormat(price.RATIO_PRICE, price.CURRENCY, true)});
}
else
{
BX.adjust(this.obPrice, {html: ''});
}
if (this.showOldPrice && this.obPriceOld)
{
if (price && price.RATIO_PRICE !== price.RATIO_BASE_PRICE)
{
BX.adjust(this.obPriceOld, {
style: {display: ''},
html: BX.Currency.currencyFormat(price.RATIO_BASE_PRICE, price.CURRENCY, true)
});
}
else
{
BX.adjust(this.obPriceOld, {
style: {display: 'none'},
html: ''
});
}
}
if (this.obPriceTotal)
{
if (price && this.obQuantity && this.obQuantity.value != this.stepQuantity)
{
BX.adjust(this.obPriceTotal, {
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.obPriceTotal, {
html: '',
style: {display: 'none'}
});
}
}
if (this.showPercent)
{
if (price && parseInt(price.DISCOUNT) > 0)
{
obData = {style: {display: ''}, html: -price.PERCENT + '%'};
}
else
{
obData = {style: {display: 'none'}, html: ''};
}
if (this.obDscPerc)
{
BX.adjust(this.obDscPerc, obData);
}
if (this.obSecondDscPerc)
{
BX.adjust(this.obSecondDscPerc, obData);
}
}
}
},
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.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.obCompare.querySelector('[data-entity="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.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;
}
},
add2Basket: function()
{
this.basketMode = 'ADD';
this.basket();
},
buyBasket: function()
{
this.basketMode = 'BUY';
this.basket();
},
sendToBasket: function()
{
if (!this.canBuy)
{
return;
}
// check recommendation
if (this.product && this.product.id && this.bigData)
{
this.rememberProductRecommendation();
}
this.initBasketUrl();
this.fillBasketProps();
BX.ajax({
method: 'POST',
dataType: 'json',
url: this.basketUrl,
data: this.basketParams,
onsuccess: BX.proxy(this.basketResult, this)
});
},
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_MESSAGE_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 strContent = '',
strPict = '',
successful,
buttons = [];
if (this.obPopupWin)
this.obPopupWin.close();
if (!BX.type.isPlainObject(arResult))
return;
successful = arResult.STATUS === 'OK';
if (successful)
{
this.setAnalyticsDataLayer('addToCart');
}
if (successful && this.basketAction === 'BUY')
{
this.basketRedirect();
}
else
{
this.initPopupWindow();
if (successful)
{
BX.onCustomEvent('OnBasketChange');
if (BX.findParent(this.obProduct, {className: 'bx_sale_gift_main_products'}, 10))
{
BX.onCustomEvent('onAddToBasketMainProduct', [this]);
}
switch (this.productType)
{
case 1: // product
case 2: // set
strPict = this.product.pict.SRC;
break;
case 3: // sku
strPict = (this.offers[this.offerNum].PREVIEW_PICTURE ?
this.offers[this.offerNum].PREVIEW_PICTURE.SRC :
this.defaultPict.pict.SRC
);
break;
}
strContent = '<div style="width: 100%; margin: 0; text-align: center;"><img src="'
+ strPict + '" height="130" style="max-height:130px"><p>' + this.product.name + '</p></div>';
if (this.showClosePopup)
{
buttons = [
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
{
buttons = [
new BasketButton({
text: BX.message("BTN_MESSAGE_BASKET_REDIRECT"),
events: {
click: BX.delegate(this.basketRedirect, this)
}
})
];
}
}
else
{
strContent = '<div style="width: 100%; margin: 0; text-align: center;"><p>'
+ (arResult.MESSAGE ? arResult.MESSAGE : BX.message('BASKET_UNKNOWN_ERROR'))
+ '</p></div>';
buttons = [
new BasketButton({
text: BX.message('BTN_MESSAGE_CLOSE'),
events: {
click: BX.delegate(this.obPopupWin.close, this.obPopupWin)
}
})
];
}
this.obPopupWin.setTitleBar(successful ? BX.message('TITLE_SUCCESSFUL') : BX.message('TITLE_ERROR'));
this.obPopupWin.setContent(strContent);
this.obPopupWin.setButtons(buttons);
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('CatalogSectionBasket_' + this.visual.ID, null, {
autoHide: true,
offsetLeft: 0,
offsetTop: 0,
overlay : true,
closeByEsc: true,
titleBar: true,
closeIcon: true,
contentColor: 'white',
className: this.templateTheme ? 'bx-' + this.templateTheme : ''
});
}
};
})(window);