%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/components/bitrix/sale.basket.basket/templates/old_version_17/ |
| Current File : //home/bitrix/www/bitrix/components/bitrix/sale.basket.basket/templates/old_version_17/script.js |
BasketPoolQuantity = function()
{
this.processing = false;
this.poolQuantity = {};
this.updateTimer = null;
this.currentQuantity = {};
this.lastStableQuantities = {};
this.updateQuantity();
};
BasketPoolQuantity.prototype.updateQuantity = function()
{
var items = BX('basket_items');
if (basketJSParams['USE_ENHANCED_ECOMMERCE'] === 'Y')
{
checkAnalytics(this.lastStableQuantities, items);
}
if (!!items && items.rows.length > 0)
{
for (var i = 1; items.rows.length > i; i++)
{
var itemId = items.rows[i].id;
this.currentQuantity[itemId] = BX('QUANTITY_' + itemId).value;
}
}
this.lastStableQuantities = BX.clone(this.currentQuantity, true);
};
BasketPoolQuantity.prototype.changeQuantity = function(itemId)
{
var quantity = BX('QUANTITY_' + itemId).value;
var isPoolEmpty = this.isPoolEmpty();
if (this.currentQuantity[itemId] && this.currentQuantity[itemId] != quantity)
{
this.poolQuantity[itemId] = this.currentQuantity[itemId] = quantity;
}
if (!isPoolEmpty)
{
this.enableTimer(true);
}
else
{
this.trySendPool();
}
};
BasketPoolQuantity.prototype.trySendPool = function()
{
if (!this.isPoolEmpty() && !this.isProcessing())
{
this.enableTimer(false);
recalcBasketAjax({});
}
};
BasketPoolQuantity.prototype.isPoolEmpty = function()
{
return ( Object.keys(this.poolQuantity).length == 0 );
};
BasketPoolQuantity.prototype.clearPool = function()
{
this.poolQuantity = {};
};
BasketPoolQuantity.prototype.isProcessing = function()
{
return (this.processing === true);
};
BasketPoolQuantity.prototype.setProcessing = function(value)
{
this.processing = (value === true);
};
BasketPoolQuantity.prototype.enableTimer = function(value)
{
clearTimeout(this.updateTimer);
if (value === false)
return;
this.updateTimer = setTimeout(function(){ basketPoolQuantity.trySendPool(); }, 1500);
};
/**
* @param basketItemId
* @param {{BASKET_ID : string, BASKET_DATA : { GRID : { ROWS : {} }}, COLUMNS: {}, PARAMS: {}, DELETE_ORIGINAL : string }} res
*/
function updateBasketTable(basketItemId, res)
{
var table = BX("basket_items"),
rows,
newBasketItemId,
arItem,
lastRow,
newRow,
arColumns,
bShowDeleteColumn = false,
bShowDelayColumn = false,
bShowPropsColumn = false,
bShowPriceType = false,
bUseFloatQuantity,
origBasketItem,
oCellMargin,
i,
oCellName,
imageURL,
cellNameHTML,
oCellItem,
cellItemHTML,
bSkip,
j,
val,
propId,
arProp,
bIsImageProperty,
countValues,
full,
fullWidth,
itemWidth,
arVal,
valId,
arSkuValue,
selected,
valueId,
k,
arItemProp,
oCellQuantity,
oCellQuantityHTML,
ratio,
isUpdateQuantity,
oldQuantity,
oCellPrice,
fullPrice,
id,
oCellDiscount,
oCellWeight,
oCellCustom,
customColumnVal,
propsMap,
selectedIndex,
counter,
marginLeft,
createNewItem;
if (!table || typeof res !== 'object')
{
return;
}
rows = table.rows;
lastRow = rows[rows.length - 1];
bUseFloatQuantity = (res.PARAMS.QUANTITY_FLOAT === 'Y');
// insert new row instead of original basket item row
if (basketItemId !== null && !!res.BASKET_DATA)
{
origBasketItem = BX(basketItemId);
newBasketItemId = res.BASKET_ID;
createNewItem = BX.type.isPlainObject(res.BASKET_DATA.GRID.ROWS[newBasketItemId]);
if (createNewItem)
{
arItem = res.BASKET_DATA.GRID.ROWS[newBasketItemId];
newRow = document.createElement('tr');
newRow.setAttribute('id', res.BASKET_ID);
newRow.setAttribute('data-item-name', arItem['NAME']);
newRow.setAttribute('data-item-brand', arItem[basketJSParams['BRAND_PROPERTY'] + '_VALUE']);
newRow.setAttribute('data-item-price', arItem['PRICE']);
newRow.setAttribute('data-item-currency', arItem['CURRENCY']);
lastRow.parentNode.insertBefore(newRow, origBasketItem.nextSibling);
}
if (res.DELETE_ORIGINAL === 'Y')
{
origBasketItem.parentNode.removeChild(origBasketItem);
}
if (createNewItem)
{
// fill row with fields' values
oCellMargin = newRow.insertCell(-1);
oCellMargin.setAttribute('class', 'margin');
arColumns = res.COLUMNS.split(',');
for (i = 0; i < arColumns.length; i++)
{
if (arColumns[i] === 'DELETE')
{
bShowDeleteColumn = true;
}
else if (arColumns[i] === 'DELAY')
{
bShowDelayColumn = true;
}
else if (arColumns[i] === 'PROPS')
{
bShowPropsColumn = true;
}
else if (arColumns[i] === 'TYPE')
{
bShowPriceType = true;
}
}
for (i = 0; i < arColumns.length; i++)
{
switch (arColumns[i])
{
case 'PROPS':
case 'DELAY':
case 'DELETE':
case 'TYPE':
break;
case 'NAME':
// first <td> - image and brand
oCellName = newRow.insertCell(-1);
imageURL = '';
cellNameHTML = '';
oCellName.setAttribute('class', 'itemphoto');
if (arItem.PREVIEW_PICTURE_SRC.length > 0)
{
imageURL = arItem.PREVIEW_PICTURE_SRC;
}
else if (arItem.DETAIL_PICTURE_SRC.length > 0)
{
imageURL = arItem.DETAIL_PICTURE_SRC;
}
else
{
imageURL = basketJSParams.TEMPLATE_FOLDER + '/images/no_photo.png';
}
if (arItem.DETAIL_PAGE_URL.length > 0)
{
cellNameHTML = '<div class="bx_ordercart_photo_container">\
<a href="' + arItem.DETAIL_PAGE_URL + '">\
<div class="bx_ordercart_photo" style="background-image:url(\'' + imageURL + '\')"></div>\
</a>\
</div>';
}
else
{
cellNameHTML = '<div class="bx_ordercart_photo_container">\
<div class="bx_ordercart_photo" style="background-image:url(\'' + imageURL + '\')"></div>\
</div>';
}
if (arItem.BRAND && arItem.BRAND.length > 0)
{
cellNameHTML += '<div class="bx_ordercart_brand">\
<img alt="" src="' + arItem.BRAND + '"/>\
</div>';
}
oCellName.innerHTML = cellNameHTML;
// second <td> - name, basket props, sku props
oCellItem = newRow.insertCell(-1);
cellItemHTML = '';
oCellItem.setAttribute('class', 'item');
if (arItem['DETAIL_PAGE_URL'].length > 0)
cellItemHTML += '<h2 class="bx_ordercart_itemtitle"><a href="' + arItem['DETAIL_PAGE_URL'] + '">' + arItem['NAME'] + '</a></h2>';
else
cellItemHTML += '<h2 class="bx_ordercart_itemtitle">' + arItem['NAME'] + '</h2>';
cellItemHTML += '<div class="bx_ordercart_itemart">';
if (bShowPropsColumn)
{
for (j = 0; j < arItem['PROPS'].length; j++)
{
val = arItem['PROPS'][j];
if (arItem.SKU_DATA)
{
bSkip = false;
for (propId in arItem.SKU_DATA)
{
if (arItem.SKU_DATA.hasOwnProperty(propId))
{
arProp = arItem.SKU_DATA[propId];
if (arProp['CODE'] === val['CODE'])
{
bSkip = true;
break;
}
}
}
if (bSkip)
continue;
}
cellItemHTML += BX.util.htmlspecialchars(val['NAME']) + ': <span>' + val['VALUE'] + '</span><br/>';
}
}
cellItemHTML += '</div>';
if (arItem.SKU_DATA)
{
propsMap = {};
for (k = 0; k < arItem['PROPS'].length; k++)
{
arItemProp = arItem['PROPS'][k];
propsMap[arItemProp['CODE']] = (BX.type.isNotEmptyString(arItemProp['~VALUE']) ? arItemProp['~VALUE'] : arItemProp['VALUE']);
}
for (propId in arItem.SKU_DATA)
{
if (arItem.SKU_DATA.hasOwnProperty(propId))
{
selectedIndex = 0;
arProp = arItem.SKU_DATA[propId];
bIsImageProperty = false;
countValues = BX.util.array_keys(arProp['VALUES']).length;
if (countValues > 5)
{
full = 'full';
fullWidth = (countValues*20) + '%';
itemWidth = (100/countValues) + '%';
}
else
{
full = '';
fullWidth = '100%';
itemWidth = '20%';
}
counter = 0;
for (valId in arProp['VALUES'])
{
counter++;
arVal = arProp['VALUES'][valId];
if (BX.type.isNotEmptyString(propsMap[arProp['CODE']]))
{
if (propsMap[arProp['CODE']] == arVal['NAME'] || propsMap[arProp['CODE']] == arVal['XML_ID'])
selectedIndex = counter;
}
if (!!arVal && typeof arVal === 'object' && !!arVal['PICT'])
{
bIsImageProperty = true;
}
}
marginLeft = '0';
if (full !== '' && selectedIndex > 5)
marginLeft = ((5 - selectedIndex) * 20) + '%';
// sku property can contain list of images or values
if (bIsImageProperty)
{
cellItemHTML += '<div class="bx_item_detail_scu_small_noadaptive ' + full + '">';
cellItemHTML += '<span class="bx_item_section_name_gray">' + BX.util.htmlspecialchars(arProp['NAME']) + '</span>';
cellItemHTML += '<div class="bx_scu_scroller_container">';
cellItemHTML += '<div class="bx_scu">';
cellItemHTML += '<ul id="prop_' + arProp['CODE'] + '_' + arItem['ID'] + '" style="width: ' + fullWidth + '; margin-left: ' + marginLeft + ';" class="sku_prop_list">';
counter = 0;
for (valueId in arProp['VALUES'])
{
counter++;
arSkuValue = arProp['VALUES'][valueId];
selected = (selectedIndex == counter ? ' bx_active' : '');
cellItemHTML += '<li style="width: ' + itemWidth + '; padding-top: ' + itemWidth + ';"\
class="sku_prop' + selected + '" \
data-sku-selector="Y" \
data-value-id="' + arSkuValue['XML_ID'] + '" \
data-sku-name="' + BX.util.htmlspecialchars(arSkuValue['NAME']) + '" \
data-element="' + arItem['ID'] + '" \
data-property="' + arProp['CODE'] + '"\
>\
<a href="javascript:void(0)" class="cnt"><span class="cnt_item" style="background-image:url(' + arSkuValue['PICT']['SRC'] + '"></span></a>\
</li>';
}
cellItemHTML += '</ul>';
cellItemHTML += '</div>';
cellItemHTML += '<div class="bx_slide_left" onclick="leftScroll(\'' + arProp['CODE'] + '\', ' + arItem['ID'] + ', ' + BX.util.array_keys(arProp['VALUES']).length + ');"></div>';
cellItemHTML += '<div class="bx_slide_right" onclick="rightScroll(\'' + arProp['CODE'] + '\', ' + arItem['ID'] + ', ' + BX.util.array_keys(arProp['VALUES']).length + ');"></div>';
cellItemHTML += '</div>';
cellItemHTML += '</div>';
}
else // not image
{
cellItemHTML += '<div class="bx_item_detail_size_small_noadaptive ' + full + '">';
cellItemHTML += '<span class="bx_item_section_name_gray">' + BX.util.htmlspecialchars(arProp['NAME']) + '</span>';
cellItemHTML += '<div class="bx_size_scroller_container">';
cellItemHTML += '<div class="bx_size">';
cellItemHTML += '<ul id="prop_' + arProp['CODE'] + '_' + arItem['ID'] + '" style="width: ' + fullWidth + '; margin-left: ' + marginLeft + ';" class="sku_prop_list">';
counter = 0;
for (valueId in arProp['VALUES'])
{
counter++;
arSkuValue = arProp['VALUES'][valueId];
selected = (selectedIndex == counter ? ' bx_active' : '');
cellItemHTML += '<li style="width: ' + itemWidth + ';"\
class="sku_prop ' + selected + '" \
data-sku-selector="Y" \
data-value-id="' + (arProp['TYPE'] === 'S' && arProp['USER_TYPE'] === 'directory' ? arSkuValue['XML_ID'] : BX.util.htmlspecialchars(arSkuValue['NAME'])) + '" \
data-sku-name="' + BX.util.htmlspecialchars(arSkuValue['NAME']) + '" \
data-element="' + arItem['ID'] + '" \
data-property="' + arProp['CODE'] + '" \
>\
<a href="javascript:void(0)" class="cnt">' + BX.util.htmlspecialchars(arSkuValue['NAME']) + '</a>\
</li>';
}
cellItemHTML += '</ul>';
cellItemHTML += '</div>';
cellItemHTML += '<div class="bx_slide_left" onclick="leftScroll(\'' + arProp['CODE'] + '\', ' + arItem['ID'] + ', ' + BX.util.array_keys(arProp['VALUES']).length + ');"></div>';
cellItemHTML += '<div class="bx_slide_right" onclick="rightScroll(\'' + arProp['CODE'] + '\', ' + arItem['ID'] + ', ' + BX.util.array_keys(arProp['VALUES']).length + ');"></div>';
cellItemHTML += '</div>';
cellItemHTML += '</div>';
}
}
}
}
oCellItem.innerHTML = cellItemHTML;
break;
case 'QUANTITY':
oCellQuantity = newRow.insertCell(-1);
oCellQuantityHTML = '';
ratio = (parseFloat(arItem['MEASURE_RATIO']) > 0) ? arItem['MEASURE_RATIO'] : 1;
isUpdateQuantity = false;
if (ratio != 0 && ratio != '')
{
oldQuantity = arItem['QUANTITY'];
arItem['QUANTITY'] = getCorrectRatioQuantity(arItem['QUANTITY'], ratio, bUseFloatQuantity);
if (oldQuantity != arItem['QUANTITY'])
{
isUpdateQuantity = true;
}
}
oCellQuantity.setAttribute('class', 'custom');
oCellQuantityHTML += '<span>' + getColumnName(res, arColumns[i]) + ':</span>';
oCellQuantityHTML += '<div class="centered">';
oCellQuantityHTML += '<table cellspacing="0" cellpadding="0" class="counter">';
oCellQuantityHTML += '<tr>';
oCellQuantityHTML += '<td>';
oCellQuantityHTML += '<input type="text" size="3" id="QUANTITY_INPUT_' + arItem['ID'] + '"\
name="QUANTITY_INPUT_' + arItem['ID'] + '"\
style="max-width: 50px"\
value="' + arItem['QUANTITY'] + '"\
onchange="updateQuantity(\'QUANTITY_INPUT_' + arItem['ID'] + '\',\'' + arItem['ID'] + '\', ' + ratio + ',' + bUseFloatQuantity + ')"\
>';
oCellQuantityHTML += '</td>';
if (ratio != 0
&& ratio != ''
) // if not Set parent, show quantity control
{
oCellQuantityHTML += '<td id="basket_quantity_control">\
<div class="basket_quantity_control">\
<a href="javascript:void(0);" class="plus" onclick="setQuantity(' + arItem['ID'] + ', ' + ratio + ', \'up\', ' + bUseFloatQuantity + ');"></a>\
<a href="javascript:void(0);" class="minus" onclick="setQuantity(' + arItem['ID'] + ', ' + ratio + ', \'down\', ' + bUseFloatQuantity + ');"></a>\
</div>\
</td>';
}
if (arItem.hasOwnProperty('MEASURE_TEXT') && arItem['MEASURE_TEXT'].length > 0)
oCellQuantityHTML += '<td style="text-align: left">' + BX.util.htmlspecialchars(arItem['MEASURE_TEXT']) + '</td>';
oCellQuantityHTML += '</tr>';
oCellQuantityHTML += '</table>';
oCellQuantityHTML += '</div>';
oCellQuantityHTML += '<input type="hidden" id="QUANTITY_' + arItem['ID'] + '" name="QUANTITY_' + arItem['ID'] + '" value="' + arItem['QUANTITY'] + '" />';
oCellQuantity.innerHTML = oCellQuantityHTML;
if (isUpdateQuantity)
{
updateQuantity('QUANTITY_INPUT_' + arItem['ID'], arItem['ID'], ratio, bUseFloatQuantity);
}
break;
case 'PRICE':
oCellPrice = newRow.insertCell(-1);
fullPrice = (arItem['DISCOUNT_PRICE_PERCENT'] > 0) ? arItem['FULL_PRICE_FORMATED'] : '';
oCellPrice.setAttribute('class', 'price');
oCellPrice.innerHTML = '<div class="current_price" id="current_price_' + arItem['ID'] + '">' + arItem['PRICE_FORMATED'] + '</div>' +
'<div class="old_price" id="old_price_' + arItem['ID'] + '">' + fullPrice + '</div>';
if (bShowPriceType && arItem['NOTES'].length > 0)
{
oCellPrice.innerHTML += '<div class="type_price">' + basketJSParams['SALE_TYPE'] + '</div>';
oCellPrice.innerHTML += '<div class="type_price_value">' + arItem['NOTES'] + '</div>';
}
break;
case 'DISCOUNT':
oCellDiscount = newRow.insertCell(-1);
oCellDiscount.setAttribute('class', 'custom');
oCellDiscount.innerHTML = '<span>' + getColumnName(res, arColumns[i]) + ':</span>';
oCellDiscount.innerHTML += '<div id="discount_value_' + arItem['ID'] + '">' + arItem['DISCOUNT_PRICE_PERCENT_FORMATED'] + '</div>';
break;
case 'WEIGHT':
oCellWeight = newRow.insertCell(-1);
oCellWeight.setAttribute('class', 'custom');
oCellWeight.innerHTML = '<span>' + getColumnName(res, arColumns[i]) + ':</span>';
oCellWeight.innerHTML += arItem['WEIGHT_FORMATED'];
break;
default:
oCellCustom = newRow.insertCell(-1);
customColumnVal = '';
oCellCustom.setAttribute('class', 'custom');
oCellCustom.innerHTML = '<span>' + getColumnName(res, arColumns[i]) + ':</span>';
if (arColumns[i] == 'SUM')
customColumnVal += '<div id="sum_' + arItem['ID'] + '">';
if (typeof(arItem[arColumns[i]]) != 'undefined')
{
customColumnVal += arItem[arColumns[i]];
}
if (arColumns[i] == 'SUM')
customColumnVal += '</div>';
oCellCustom.innerHTML += customColumnVal;
break;
}
}
if (bShowDeleteColumn || bShowDelayColumn)
{
var oCellControl = newRow.insertCell(-1);
oCellControl.setAttribute('class', 'control');
if (bShowDeleteColumn)
oCellControl.innerHTML = '<a href="' + basketJSParams['DELETE_URL'].replace('#ID#', arItem['ID']) + '">' + basketJSParams['SALE_DELETE'] + '</a><br />';
if (bShowDelayColumn)
oCellControl.innerHTML += '<a href="' + basketJSParams['DELAY_URL'].replace('#ID#', arItem['ID']) + '">' + basketJSParams['SALE_DELAY'] + '</a>';
}
var oCellMargin2 = newRow.insertCell(-1);
oCellMargin2.setAttribute('class', 'margin');
}
}
// update product params after recalculation
if (!!res.BASKET_DATA)
{
for (id in res.BASKET_DATA.GRID.ROWS)
{
if (res.BASKET_DATA.GRID.ROWS.hasOwnProperty(id))
{
var item = res.BASKET_DATA.GRID.ROWS[id];
if (BX('discount_value_' + id))
BX('discount_value_' + id).innerHTML = item.DISCOUNT_PRICE_PERCENT_FORMATED;
if (BX('current_price_' + id))
BX('current_price_' + id).innerHTML = item.PRICE_FORMATED;
if (BX('old_price_' + id))
BX('old_price_' + id).innerHTML = (item.DISCOUNT_PRICE_PERCENT > 0) ? item.FULL_PRICE_FORMATED : '';
if (BX('sum_' + id))
BX('sum_' + id).innerHTML = item.SUM;
// if the quantity was set by user to 0 or was too much, we need to show corrected quantity value from ajax response
if (BX('QUANTITY_' + id))
{
BX('QUANTITY_INPUT_' + id).value = item.QUANTITY;
BX('QUANTITY_INPUT_' + id).defaultValue = item.QUANTITY;
BX('QUANTITY_' + id).value = item.QUANTITY;
}
}
}
}
// update coupon info
if (!!res.BASKET_DATA)
couponListUpdate(res.BASKET_DATA);
// update warnings if any
if (res.hasOwnProperty('WARNING_MESSAGE'))
{
var warningText = '';
for (i = res['WARNING_MESSAGE'].length - 1; i >= 0; i--)
warningText += res['WARNING_MESSAGE'][i] + '<br/>';
BX('warning_message').innerHTML = warningText;
}
// update total basket values
if (!!res.BASKET_DATA)
{
if (BX('allWeight_FORMATED'))
BX('allWeight_FORMATED').innerHTML = res['BASKET_DATA']['allWeight_FORMATED'].replace(/\s/g, ' ');
if (BX('allSum_wVAT_FORMATED'))
BX('allSum_wVAT_FORMATED').innerHTML = res['BASKET_DATA']['allSum_wVAT_FORMATED'].replace(/\s/g, ' ');
if (BX('allVATSum_FORMATED'))
BX('allVATSum_FORMATED').innerHTML = res['BASKET_DATA']['allVATSum_FORMATED'].replace(/\s/g, ' ');
if (BX('allSum_FORMATED'))
BX('allSum_FORMATED').innerHTML = res['BASKET_DATA']['allSum_FORMATED'].replace(/\s/g, ' ');
if (BX('PRICE_WITHOUT_DISCOUNT'))
{
var showPriceWithoutDiscount = (res['BASKET_DATA']['PRICE_WITHOUT_DISCOUNT'] != res['BASKET_DATA']['allSum_FORMATED']);
BX('PRICE_WITHOUT_DISCOUNT').innerHTML = showPriceWithoutDiscount ? res['BASKET_DATA']['PRICE_WITHOUT_DISCOUNT'].replace(/\s/g, ' ') : '';
BX.style(BX('PRICE_WITHOUT_DISCOUNT').parentNode, 'display', (showPriceWithoutDiscount ? 'table-row' : 'none'));
}
BX.onCustomEvent('OnBasketChange');
}
}
/**
* @param couponBlock
* @param {COUPON: string, JS_STATUS: string} oneCoupon - new coupon.
*/
function couponCreate(couponBlock, oneCoupon)
{
var couponClass = 'disabled';
if (!BX.type.isElementNode(couponBlock))
return;
if (oneCoupon.JS_STATUS === 'BAD')
couponClass = 'bad';
else if (oneCoupon.JS_STATUS === 'APPLYED')
couponClass = 'good';
couponBlock.appendChild(BX.create(
'div',
{
props: {
className: 'bx_ordercart_coupon'
},
children: [
BX.create(
'input',
{
props: {
className: couponClass,
type: 'text',
value: oneCoupon.COUPON,
name: 'OLD_COUPON[]'
},
attrs: {
disabled: true,
readonly: true
}
}
),
BX.create(
'span',
{
props: {
className: couponClass
},
attrs: {
'data-coupon': oneCoupon.COUPON
}
}
),
BX.create(
'div',
{
props: {
className: 'bx_ordercart_coupon_notes'
},
html: oneCoupon.JS_CHECK_CODE
}
)
]
}
));
}
/**
* @param {COUPON_LIST : []} res
*/
function couponListUpdate(res)
{
var couponBlock,
couponClass,
fieldCoupon,
couponsCollection,
couponFound,
i,
j,
key;
if (!!res && typeof res !== 'object')
{
return;
}
couponBlock = BX('coupons_block');
if (!!couponBlock)
{
if (!!res.COUPON_LIST && BX.type.isArray(res.COUPON_LIST))
{
fieldCoupon = BX('coupon');
if (!!fieldCoupon)
{
fieldCoupon.value = '';
}
couponsCollection = BX.findChildren(couponBlock, { tagName: 'input', property: { name: 'OLD_COUPON[]' } }, true);
if (!!couponsCollection)
{
if (BX.type.isElementNode(couponsCollection))
{
couponsCollection = [couponsCollection];
}
for (i = 0; i < res.COUPON_LIST.length; i++)
{
couponFound = false;
key = -1;
for (j = 0; j < couponsCollection.length; j++)
{
if (couponsCollection[j].value === res.COUPON_LIST[i].COUPON)
{
couponFound = true;
key = j;
couponsCollection[j].couponUpdate = true;
break;
}
}
if (couponFound)
{
couponClass = 'disabled';
if (res.COUPON_LIST[i].JS_STATUS === 'BAD')
couponClass = 'bad';
else if (res.COUPON_LIST[i].JS_STATUS === 'APPLYED')
couponClass = 'good';
BX.adjust(couponsCollection[key], {props: {className: couponClass}});
BX.adjust(couponsCollection[key].nextSibling, {props: {className: couponClass}});
BX.adjust(couponsCollection[key].nextSibling.nextSibling, {html: res.COUPON_LIST[i].JS_CHECK_CODE});
}
else
{
couponCreate(couponBlock, res.COUPON_LIST[i]);
}
}
for (j = 0; j < couponsCollection.length; j++)
{
if (typeof (couponsCollection[j].couponUpdate) === 'undefined' || !couponsCollection[j].couponUpdate)
{
BX.remove(couponsCollection[j].parentNode);
couponsCollection[j] = null;
}
else
{
couponsCollection[j].couponUpdate = null;
}
}
}
else
{
for (i = 0; i < res.COUPON_LIST.length; i++)
{
couponCreate(couponBlock, res.COUPON_LIST[i]);
}
}
}
}
couponBlock = null;
}
function skuPropClickHandler()
{
var target = this,
basketItemId,
property,
property_values = {},
postData = {},
action_var,
all_sku_props,
i,
sku_prop_value,
m;
if (!!target && target.hasAttribute('data-value-id'))
{
BX.showWait();
basketItemId = target.getAttribute('data-element');
property = target.getAttribute('data-property');
action_var = BX('action_var').value;
property_values[property] = BX.util.htmlspecialcharsback(target.getAttribute('data-value-id'));
// if already selected element is clicked
if (BX.hasClass(target, 'bx_active'))
{
BX.closeWait();
return;
}
// get other basket item props to get full unique set of props of the new product
all_sku_props = BX.findChildren(BX(basketItemId), {tagName: 'ul', className: 'sku_prop_list'}, true);
if (!!all_sku_props && all_sku_props.length > 0)
{
for (i = 0; all_sku_props.length > i; i++)
{
if (all_sku_props[i].id !== 'prop_' + property + '_' + basketItemId)
{
sku_prop_value = BX.findChildren(BX(all_sku_props[i].id), {tagName: 'li', className: 'bx_active'}, true);
if (!!sku_prop_value && sku_prop_value.length > 0)
{
for (m = 0; sku_prop_value.length > m; m++)
{
if (sku_prop_value[m].hasAttribute('data-value-id'))
{
property_values[sku_prop_value[m].getAttribute('data-property')] = BX.util.htmlspecialcharsback(sku_prop_value[m].getAttribute('data-value-id'));
}
}
}
}
}
}
postData = {
'basketItemId': basketItemId,
'sessid': BX.bitrix_sessid(),
'site_id': BX.message('SITE_ID'),
'props': property_values,
'action_var': action_var,
'select_props': BX('column_headers').value,
'offers_props': BX('offers_props').value,
'quantity_float': BX('quantity_float').value,
'price_vat_show_value': BX('price_vat_show_value').value,
'hide_coupon': BX('hide_coupon').value,
'use_prepayment': BX('use_prepayment').value
};
postData[action_var] = 'select_item';
BX.ajax({
url: '/bitrix/components/bitrix/sale.basket.basket/ajax.php',
method: 'POST',
data: postData,
dataType: 'json',
onsuccess: function(result)
{
BX.closeWait();
updateBasketTable(basketItemId, result);
}
});
}
}
function getColumnName(result, columnCode)
{
if (BX('col_' + columnCode))
{
return BX.util.trim(BX('col_' + columnCode).innerHTML);
}
else
{
return '';
}
}
function leftScroll(prop, id, count)
{
count = parseInt(count, 10);
var el = BX('prop_' + prop + '_' + id);
if (el)
{
var curVal = parseInt(el.style.marginLeft, 10);
if (curVal <= -20)
el.style.marginLeft = curVal + 20 + '%';
}
}
function rightScroll(prop, id, count)
{
count = parseInt(count, 10);
var el = BX('prop_' + prop + '_' + id);
if (el)
{
var curVal = parseInt(el.style.marginLeft, 10);
if (curVal > (5 - count)*20)
el.style.marginLeft = curVal - 20 + '%';
}
}
function checkOut()
{
if (!!BX('coupon'))
BX('coupon').disabled = true;
BX("basket_form").submit();
return true;
}
function updateBasket()
{
recalcBasketAjax({});
}
function enterCoupon()
{
var newCoupon = BX('coupon');
if (!!newCoupon && !!newCoupon.value)
recalcBasketAjax({'coupon' : newCoupon.value});
}
// check if quantity is valid
// and update values of both controls (text input field for PC and mobile quantity select) simultaneously
function updateQuantity(controlId, basketId, ratio, bUseFloatQuantity)
{
var oldVal = BX(controlId).defaultValue,
newVal = parseFloat(BX(controlId).value) || 0,
bIsCorrectQuantityForRatio = false,
autoCalculate = ((BX("auto_calculation") && BX("auto_calculation").value == "Y") || !BX("auto_calculation"));
if (ratio === 0 || ratio == 1)
{
bIsCorrectQuantityForRatio = true;
}
else
{
var newValInt = newVal * 10000,
ratioInt = ratio * 10000,
reminder = newValInt % ratioInt,
newValRound = parseInt(newVal);
if (reminder === 0)
{
bIsCorrectQuantityForRatio = true;
}
}
var bIsQuantityFloat = false;
if (parseInt(newVal) != parseFloat(newVal))
{
bIsQuantityFloat = true;
}
newVal = (bUseFloatQuantity === false && bIsQuantityFloat === false) ? parseInt(newVal) : parseFloat(newVal).toFixed(4);
newVal = correctQuantity(newVal);
if (bIsCorrectQuantityForRatio)
{
BX(controlId).defaultValue = newVal;
BX("QUANTITY_INPUT_" + basketId).value = newVal;
// set hidden real quantity value (will be used in actual calculation)
BX("QUANTITY_" + basketId).value = newVal;
if (autoCalculate)
{
basketPoolQuantity.changeQuantity(basketId);
}
}
else
{
newVal = getCorrectRatioQuantity(newVal, ratio, bUseFloatQuantity);
newVal = correctQuantity(newVal);
if (newVal != oldVal)
{
BX("QUANTITY_INPUT_" + basketId).value = newVal;
BX("QUANTITY_" + basketId).value = newVal;
if (autoCalculate)
{
basketPoolQuantity.changeQuantity(basketId);
}
}else
{
BX(controlId).value = oldVal;
}
}
}
// used when quantity is changed by clicking on arrows
function setQuantity(basketId, ratio, sign, bUseFloatQuantity)
{
var curVal = parseFloat(BX("QUANTITY_INPUT_" + basketId).value),
newVal;
newVal = (sign == 'up') ? curVal + ratio : curVal - ratio;
if (newVal < 0)
newVal = 0;
if (bUseFloatQuantity)
{
newVal = parseFloat(newVal).toFixed(4);
}
newVal = correctQuantity(newVal);
if (ratio > 0 && newVal < ratio)
{
newVal = ratio;
}
if (!bUseFloatQuantity && newVal != newVal.toFixed(4))
{
newVal = parseFloat(newVal).toFixed(4);
}
newVal = getCorrectRatioQuantity(newVal, ratio, bUseFloatQuantity);
newVal = correctQuantity(newVal);
BX("QUANTITY_INPUT_" + basketId).value = newVal;
BX("QUANTITY_INPUT_" + basketId).defaultValue = newVal;
updateQuantity('QUANTITY_INPUT_' + basketId, basketId, ratio, bUseFloatQuantity);
}
function getCorrectRatioQuantity(quantity, ratio, bUseFloatQuantity)
{
var newValInt = quantity * 10000,
ratioInt = ratio * 10000,
reminder = (quantity / ratio - ((quantity / ratio).toFixed(0))).toFixed(6),
result = quantity,
bIsQuantityFloat = false,
i;
ratio = parseFloat(ratio);
if (reminder == 0)
{
return result;
}
if (ratio !== 0 && ratio != 1)
{
for (i = ratio, max = parseFloat(quantity) + parseFloat(ratio); i <= max; i = parseFloat(parseFloat(i) + parseFloat(ratio)).toFixed(4))
{
result = i;
}
}else if (ratio === 1)
{
result = quantity | 0;
}
if (parseInt(result, 10) != parseFloat(result))
{
bIsQuantityFloat = true;
}
result = (bUseFloatQuantity === false && bIsQuantityFloat === false) ? parseInt(result, 10) : parseFloat(result).toFixed(4);
result = correctQuantity(result);
return result;
}
function correctQuantity(quantity)
{
return parseFloat((quantity * 1).toString());
}
/**
*
* @param {} params
*/
function recalcBasketAjax(params)
{
if (basketPoolQuantity.isProcessing())
{
return false;
}
BX.showWait();
var property_values = {},
action_var = BX('action_var').value,
items = BX('basket_items'),
delayedItems = BX('delayed_items'),
postData,
i;
postData = {
'sessid': BX.bitrix_sessid(),
'site_id': BX.message('SITE_ID'),
'props': property_values,
'action_var': action_var,
'select_props': BX('column_headers').value,
'offers_props': BX('offers_props').value,
'quantity_float': BX('quantity_float').value,
'price_vat_show_value': BX('price_vat_show_value').value,
'hide_coupon': BX('hide_coupon').value,
'use_prepayment': BX('use_prepayment').value
};
postData[action_var] = 'recalculate';
if (!!params && typeof params === 'object')
{
for (i in params)
{
if (params.hasOwnProperty(i))
postData[i] = params[i];
}
}
if (!!items && items.rows.length > 0)
{
for (i = 1; items.rows.length > i; i++)
postData['QUANTITY_' + items.rows[i].id] = BX('QUANTITY_' + items.rows[i].id).value;
}
if (!!delayedItems && delayedItems.rows.length > 0)
{
for (i = 1; delayedItems.rows.length > i; i++)
postData['DELAY_' + delayedItems.rows[i].id] = 'Y';
}
basketPoolQuantity.setProcessing(true);
basketPoolQuantity.clearPool();
BX.ajax({
url: '/bitrix/components/bitrix/sale.basket.basket/ajax.php',
method: 'POST',
data: postData,
dataType: 'json',
onsuccess: function(result)
{
BX.closeWait();
basketPoolQuantity.setProcessing(false);
if(params.coupon)
{
//hello, gifts!
if(!!result && !!result.BASKET_DATA && !!result.BASKET_DATA.NEED_TO_RELOAD_FOR_GETTING_GIFTS)
{
BX.reload();
}
}
if (basketPoolQuantity.isPoolEmpty())
{
updateBasketTable(null, result);
basketPoolQuantity.updateQuantity();
}
else
{
basketPoolQuantity.enableTimer(true);
}
}
});
}
function showBasketItemsList(val)
{
BX.removeClass(BX("basket_toolbar_button"), "current");
BX.removeClass(BX("basket_toolbar_button_delayed"), "current");
BX.removeClass(BX("basket_toolbar_button_subscribed"), "current");
BX.removeClass(BX("basket_toolbar_button_not_available"), "current");
BX("normal_count").style.display = 'inline-block';
BX("delay_count").style.display = 'inline-block';
BX("subscribe_count").style.display = 'inline-block';
BX("not_available_count").style.display = 'inline-block';
if (val == 2)
{
if (BX("basket_items_list"))
BX("basket_items_list").style.display = 'none';
if (BX("basket_items_delayed"))
{
BX("basket_items_delayed").style.display = 'block';
BX.addClass(BX("basket_toolbar_button_delayed"), "current");
BX("delay_count").style.display = 'none';
}
if (BX("basket_items_subscribed"))
BX("basket_items_subscribed").style.display = 'none';
if (BX("basket_items_not_available"))
BX("basket_items_not_available").style.display = 'none';
}
else if(val == 3)
{
if (BX("basket_items_list"))
BX("basket_items_list").style.display = 'none';
if (BX("basket_items_delayed"))
BX("basket_items_delayed").style.display = 'none';
if (BX("basket_items_subscribed"))
{
BX("basket_items_subscribed").style.display = 'block';
BX.addClass(BX("basket_toolbar_button_subscribed"), "current");
BX("subscribe_count").style.display = 'none';
}
if (BX("basket_items_not_available"))
BX("basket_items_not_available").style.display = 'none';
}
else if (val == 4)
{
if (BX("basket_items_list"))
BX("basket_items_list").style.display = 'none';
if (BX("basket_items_delayed"))
BX("basket_items_delayed").style.display = 'none';
if (BX("basket_items_subscribed"))
BX("basket_items_subscribed").style.display = 'none';
if (BX("basket_items_not_available"))
{
BX("basket_items_not_available").style.display = 'block';
BX.addClass(BX("basket_toolbar_button_not_available"), "current");
BX("not_available_count").style.display = 'none';
}
}
else
{
if (BX("basket_items_list"))
{
BX("basket_items_list").style.display = 'block';
BX.addClass(BX("basket_toolbar_button"), "current");
BX("normal_count").style.display = 'none';
}
if (BX("basket_items_delayed"))
BX("basket_items_delayed").style.display = 'none';
if (BX("basket_items_subscribed"))
BX("basket_items_subscribed").style.display = 'none';
if (BX("basket_items_not_available"))
BX("basket_items_not_available").style.display = 'none';
}
}
function deleteCoupon()
{
var target = this,
value;
if (BX.type.isElementNode(target) && target.hasAttribute('data-coupon'))
{
value = target.getAttribute('data-coupon');
if (BX.type.isNotEmptyString(value))
{
recalcBasketAjax({'delete_coupon' : value});
}
}
}
function deleteProductRow(target)
{
var targetRow = BX.findParent(target, {tagName: 'TR'}),
quantityNode,
delItem;
if (targetRow)
{
quantityNode = BX('QUANTITY_' + targetRow.id);
if (quantityNode)
{
delItem = getCurrentItemAnalyticsInfo(targetRow, quantityNode.value);
}
}
setAnalyticsDataLayer([], [delItem]);
document.location.href = target.href;
return false;
}
function checkAnalytics(currentQuantity, newItems)
{
if (!currentQuantity || !newItems || BX.util.array_values(currentQuantity).length === 0)
return;
var itemId, diff,
current = {}, addItems = [], delItems = [],
i;
if (!!newItems && newItems.rows.length)
{
for (i = 1; newItems.rows.length > i; i++)
{
itemId = newItems.rows[i].id;
diff = BX('QUANTITY_' + itemId).value - currentQuantity[itemId];
if (diff != 0)
{
current = getCurrentItemAnalyticsInfo(newItems.rows[i], diff);
if (diff > 0)
{
addItems.push(current);
}
else
{
delItems.push(current);
}
}
}
}
if (addItems.length || delItems.length)
{
setAnalyticsDataLayer(addItems, delItems);
}
}
function getCurrentItemAnalyticsInfo(row, diff)
{
if (!row)
return;
var temp, k, variants = [];
var current = {
'name': row.getAttribute('data-item-name') || '',
'id': row.id,
'price': row.getAttribute('data-item-price') || 0,
'brand': (row.getAttribute('data-item-brand') || '').split(', ').join('/'),
'variant': '',
'quantity': Math.abs(diff)
};
temp = row.querySelectorAll('.bx_active[data-sku-name]');
for (k = 0; k < temp.length; k++)
{
variants.push(temp[k].getAttribute('data-sku-name'));
}
current.variant = variants.join('/');
return current;
}
function setAnalyticsDataLayer(addItems, delItems)
{
window[basketJSParams['DATA_LAYER_NAME']] = window[basketJSParams['DATA_LAYER_NAME']] || [];
if (addItems && addItems.length)
{
window[basketJSParams['DATA_LAYER_NAME']].push({
'event': 'addToCart',
'ecommerce': {
'currencyCode': getCurrencyCode(),
'add': {
'products': addItems
}
}
});
}
if (delItems && delItems.length)
{
window[basketJSParams['DATA_LAYER_NAME']].push({
'event': 'removeFromCart',
'ecommerce': {
'currencyCode': getCurrencyCode(),
'remove': {
'products': delItems
}
}
});
}
}
function getCurrencyCode()
{
var root = BX('basket_items'),
node,
currency = '';
if (root)
{
node = root.querySelector('[data-item-currency');
node && (currency = node.getAttribute('data-item-currency'));
}
return currency;
}
BX.ready(function() {
basketPoolQuantity = new BasketPoolQuantity();
var couponBlock = BX('coupons_block'),
basketItems = BX('basket_items');
if (BX.type.isElementNode(couponBlock))
BX.bindDelegate(couponBlock, 'click', { 'attribute': 'data-coupon' }, deleteCoupon);
if (BX.type.isElementNode(basketItems))
BX.bindDelegate(basketItems, 'click', {tagName: 'li', 'attr': { 'data-sku-selector': 'Y' }}, skuPropClickHandler);
if (BX.type.isNotEmptyString(basketJSParams['EVENT_ONCHANGE_ON_START']) && basketJSParams['EVENT_ONCHANGE_ON_START'] == "Y")
BX.onCustomEvent('OnBasketChange');
});