;(function($){ 'use strict'; var _options = { shopProductId: null, priceSelector: '.main-price', availableValuesUrl: '/shop-product/available-values', calculatePriceAndImageUrl: '/shop-product/calculate-price-and-image', compareUrl: '/compare/index', comparePutUrl: '/compare/put', orderCheckoutUrl: '/order/check', fastOrderDialogSelector: '' }; var ajaxUpdatePriceAndImage; var ajaxUpdateConnectedParameterValues; $.shopProductCard = function(options) { _options = $.extend(_options, options); }; function getParameterValues(lastParameterId) { var $collectionParametersWraps; var $lastParameterWrap; var index; var $parametersWrap; var $parameterWrap; var $modularWrap; var isParameterDropdown; if (lastParameterId) { $collectionParametersWraps = $('[data-is-in-collection=1]'); $lastParameterWrap = $('[data-is-in-collection=1][data-parameter-id=' + lastParameterId + ']'); index = $collectionParametersWraps.index($lastParameterWrap); $parametersWrap = $collectionParametersWraps.slice(0, index); } else { $parametersWrap = $('[data-parameter-id]'); $modularWrap = $('.shop-product-modules'); } var result = []; $parametersWrap.each(function(){ $parameterWrap = $(this); if ($parameterWrap.is('[data-is-fabric=1]')) { return true; } isParameterDropdown = $parameterWrap.is('.spc-parameter-dropdown'); if (isParameterDropdown) { var selectedValue = $parameterWrap.find('select').val(); if (selectedValue) { result.push({ id: selectedValue, count: 1 }); } } else { $parametersWrap.find('.spc-parameter-value-wrap.is-selected').each(function(){ result.push({ id: $(this).data('parameter-value-id'), count: $(this).find('.spc-parameter-value-count').val() }); }); $modularWrap.find('.shop-product-module.added').each(function() { result.push({ id: $(this).data('module-id'), count: Math.max(1, parseInt($('input.count', this).val())) }); }); } }); return result; } function getFabricValues() { var result = []; $('[data-parameter-id][data-is-fabric=1]').each(function(){ var parameterId = $(this).data('parameter-id'); $(this).find('.spc-parameter-value-wrap.is-selected').each(function(){ result.push({ parameter_id: parameterId, fabric_id: $(this).data('fabric-id') }); }); }); return result; } function updateConnectedParameterValues(parameterId, prevParameterValueId) { if (!prevParameterValueId) return; var $paramaterWrap = $('[data-is-in-collection=1][data-parameter-id=' + parameterId + ']'); var isParameterRequired = $paramaterWrap.is('[data-is-required=1]'); var isParameterDropdown = $paramaterWrap.is('.spc-parameter-dropdown'); var selectedValuesIds = []; if (isParameterDropdown) { var selectedValue = $paramaterWrap.find('option:selected').val(); if (selectedValue) { selectedValuesIds.push(parseInt(selectedValue)); } } else { $paramaterWrap.find('.spc-parameter-value-wrap.is-selected').each(function(){ selectedValuesIds.push(parseInt($(this).data('parameter-value-id'))); }); } ajaxUpdateConnectedParameterValues = $.ajax({ method: 'GET', dataType: 'json', url: _options['availableValuesUrl'], data: { 'shopProductId': _options['shopProductId'], 'prevParametersValues': Array.isArray(prevParameterValueId) ? prevParameterValueId : [prevParameterValueId], 'parameterId': parameterId }, success: function(data) { if (!data.length) { updatePriceAndImage(); return; } if (isParameterDropdown) { $paramaterWrap.find('select').html(''); } else { $paramaterWrap.find('.spc-parameter-value-wrap').hide().removeClass('is-selected'); } var hasSelectedValue = false; $.each(data, function(i, val){ if (isParameterDropdown) { $paramaterWrap.find('select').append(''); if ($.inArray(val['id'], selectedValuesIds) != -1) { $paramaterWrap.find('select').val(val['id']); hasSelectedValue = true; } } else { var $valueWrap = $paramaterWrap.find('.spc-parameter-value-wrap[data-parameter-value-id="' + val['id'] + '"]'); $valueWrap.show(); if ($.inArray(val['id'], selectedValuesIds) != -1) { $valueWrap.addClass('is-selected'); hasSelectedValue = true; } } }); if (isParameterRequired && !hasSelectedValue) { if (isParameterDropdown) { $paramaterWrap.find('select').val($paramaterWrap.find('option:first').val()).change(); } else { var $parameterToSelect = $paramaterWrap.find('.spc-parameter-value-wrap:visible:has(.spc-parameter-value-price._empty)'); if (!$parameterToSelect) $parameterToSelect = $paramaterWrap.find('.spc-parameter-value-wrap:visible'); $parameterToSelect.first().find('.spc-parameter-value-button').click(); } } else { updatePriceAndImage(); } } }); } function updatePriceAndImage() { if (ajaxUpdatePriceAndImage) { ajaxUpdatePriceAndImage.abort(); } ajaxUpdatePriceAndImage = $.ajax({ method: 'POST', dataType: 'json', url: _options['calculatePriceAndImageUrl'], data: { 'shopProductId': _options['shopProductId'], 'parameterValues': getParameterValues(), 'fabricValues': getFabricValues() }, success: function(data) { $(_options['priceSelector']).text(data['price']); $('.spc-parameter-value-wrap .spc-parameter-value-price').text(''); if ('parameterValues' in data) { $.each(data['parameterValues'], function(i, val) { $('.spc-parameter-value-wrap[data-parameter-value-id=' + i + '] .spc-parameter-value-price').text(val); }); } } }); } $('.spc-parameter-value-wrap, .spc-parameter-value-button').click(function(e){ e.preventDefault(); if ('target' in e && $(e.target).is('img')) { return; } e.stopPropagation(); var $paramaterWrap = $(this).closest('.spc-parameter'); var $paramaterValueWrap = $(this).is('.spc-parameter-value-wrap') ? $(this) : $(this).closest('.spc-parameter-value-wrap'); var wasSelected = $paramaterValueWrap.is('.is-selected'); var isParameterRequired = $paramaterWrap.is('[data-is-required=1]'); var isParameterMultiple = $paramaterWrap.is('[data-is-multiple=1]'); if (isParameterMultiple) { $paramaterValueWrap.toggleClass('is-selected'); } else { if (!isParameterRequired) { $paramaterWrap.find('.is-selected').removeClass('is-selected'); $paramaterValueWrap.toggleClass('is-selected', !wasSelected); } else { if (!wasSelected) { $paramaterWrap.find('.is-selected').removeClass('is-selected'); $paramaterValueWrap.addClass('is-selected'); } } } if ($paramaterWrap.is('[data-is-in-collection=1]')) { var $nextConnectedParameterWrap = $paramaterWrap.next('[data-is-in-collection=1]'); if ($nextConnectedParameterWrap.length > 0) { updateConnectedParameterValues($nextConnectedParameterWrap.data('parameter-id'), $paramaterWrap.find('.is-selected:first').data('parameter-value-id')); return; } } updatePriceAndImage(); }); $('.spc-parameter-dropdown select').change(function(){ updatePriceAndImage(); var prevParameterValueId = $(this).val(); if ($(this).closest('.spc-parameter-dropdown').is('[data-is-in-collection=1]')) { $('.spc-parameter[data-is-in-collection=1]').each(function() { updateConnectedParameterValues($(this).data('parameter-id'), prevParameterValueId); }); } }); $('.description-tabs .tab-header').click(function(){ var tab = $(this); if (tab.hasClass('active')) { return; } var container = tab.closest('.description-tabs'); container.find('.tab-header').removeClass('active'); $(this).addClass('active'); container.find('.tab-body').removeClass('active'); container.find('.tab-body[id=' + tab.data('tab') + ']').addClass('active'); }); $('.description-tabs .tabs-headers-prev').click(function(e){ e.preventDefault(); $('.description-tabs .tab-header.active').prev('.tab-header').click(); }); $('.description-tabs .tabs-headers-next').click(function(e){ e.preventDefault(); $('.description-tabs .tab-header.active').next('.tab-header').click(); }); $('.add-to-compare').click(function(e){ e.preventDefault(); var btn = $(this); if (!btn.hasClass('in-compare')) { $.post(_options['comparePutUrl'], {productId: btn.data('product-id')}, function(data) { if (data['success']) { $('.compare-count').text('count' in data ? data['count'] : 0); btn.toggleClass('in-compare'); btn.text('В сравнении'); } }, 'json'); } else { window.location.href = _options['compareUrl']; } }); $('.add-to-cart').click(function(e){ e.preventDefault(); var btn = $(this); if (!btn.hasClass('is-in-cart')) { yii.analytics.push({ event: 'DETAIL_PAGE_ADDTOCART_CLICK', product_id: btn.data('product-id') }); $.cart('put', { productId: btn.data('product-id'), parameterValues: getParameterValues(), fabricValues: getFabricValues(), callback: function(){ btn.addClass('is-in-cart'); btn.text('В корзине'); window.location.href = _options['orderCheckoutUrl']; } }); } else { window.location.href = _options['orderCheckoutUrl']; } }); $('.fast-order-btn').click(function(e){ e.preventDefault(); e.stopPropagation(); yii.analytics.push({event: 'FAST_BUY_CLICK'}); $('.fast-order .price').html($(_options['priceSelector']).html()); $('.fast-order input[name=QuickOrderForm\\[parameterValuesJson\\]]').val(JSON.stringify(getParameterValues())); $('.fast-order input[name=QuickOrderForm\\[fabricValuesJson\\]]').val(JSON.stringify(getFabricValues())); $(_options['fastOrderDialogSelector']).modal('show'); }); $('.minus, .plus').click(function(e){ e.preventDefault(); e.stopPropagation(); var input = $(this).closest('.spc-parameter-value-count-wrap').find('input'); var quantity = parseInt(input.val()); if ($(this).hasClass('minus')) { quantity = quantity > 1 ? quantity - 1 : 1; } else { quantity += 1; } input.val(quantity).change(); }); $('.spc-parameter-value-count') .click(function(e){ e.preventDefault(); e.stopPropagation(); }) .change(function(){ var quantity = parseInt($(this).val()); quantity = quantity >= 1 ? quantity : 1; $(this).val(quantity); if ($(this).closest('.spc-parameter-value-wrap').is('.is-selected')) { updatePriceAndImage(); } }); var modular = { //option_block: ' .product-brief-card-modile', option_item: ' .product-brief-card-module-wrap', //option_item_swith: ' .dop-product-item .checkbox input', option_counter_minus: ' .js-count-minus', option_counter_plus: ' .js-count-plus', option_counter_amount: ' .count' }; $(modular.option_item + modular.option_counter_plus).click(function () { var amount = $(this).siblings(modular.option_counter_amount); var added = $(this).closest(modular.option_item).hasClass('added'); if (!isNaN(Number(amount.val()))) { amount.val(Math.min(Number(amount.val()) + 1, amount.data('max-quantity') ? Number(amount.data('max-quantity')) : 100)); } else { amount.val(1); } if (added) { if(amount.val()<1) { $(this).closest(modular.option_item).removeClass('added'); } updatePriceAndImage(); } }); $(modular.option_item + modular.option_counter_minus).click(function () { var amount = $(this).siblings(modular.option_counter_amount); var added = $(this).closest(modular.option_item).hasClass('added'); if (!isNaN(Number(amount.val())) && Number(amount.val()) > 0) { amount.val(Math.max(Number(amount.val()) - 1, amount.data('min-quantity') ? Number(amount.data('min-quantity')) : 0)); } else { amount.val(Math.max(amount.data('min-quantity'), 0)); } if (added) { if (amount.val()<1) { $(this).closest(modular.option_item).removeClass('added'); } updatePriceAndImage(); } }); $('.btn-add-module').click(function () { $(this).closest(modular.option_item).addClass('added'); updatePriceAndImage(); }); $('.btn-remove-module').click(function () { $(this).closest(modular.option_item).removeClass('added').find(modular.option_counter_amount).val(0); updatePriceAndImage(); }); if ($('.spc-parameter-dropdown[data-is-in-collection]:first').length) { $('.spc-parameter-dropdown[data-is-in-collection]:first').find('input:first').change(); } else { $('.spc-parameter[data-is-in-collection]:first').each(function() { var $paramaterWrap = $(this); var $nextConnectedParameterWrap = $paramaterWrap.next('[data-is-in-collection=1]'); if ($nextConnectedParameterWrap.length) { if(!_options['shopProductId']) { _options['shopProductId'] = $('.add-to-cart[data-product-id]:first').data('product-id'); } updateConnectedParameterValues($nextConnectedParameterWrap.data('parameter-id'), $paramaterWrap.find('.is-selected:first').data('parameter-value-id')); return; } }); } $(window).load(function() { $('.spc-parameter-dropdown select').first().each(function(){ var prevParameterValueId = $(this).val(); if ($(this).closest('.spc-parameter-dropdown').is('[data-is-in-collection=1]')) { $('.spc-parameter[data-is-in-collection=1]').each(function() { updateConnectedParameterValues($(this).data('parameter-id'), prevParameterValueId); }); } }); $('#configuration .spc-parameter-value-wrap.is-selected:visible').each(function(){ if($(this).closest('.spc-parameter').data('is-in-collection')) { $(this).find('.spc-parameter-value-button').click(); } }); }); })(jQuery);