Advertisement
valeraplusplus

shop2.2.js (ДО) Deligate. Корзина. Доработка валидации поля для ввода города

Apr 3rd, 2023 (edited)
954
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'use strict';
  2.  
  3. (function($) {
  4.  
  5.   var $document = $(document);
  6.   var isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|Opera Mini/i.test(navigator.userAgent);
  7.  
  8.   $.expr[':'].style = function(obj, index, meta) {
  9.     var $obj = $(obj),
  10.       params = meta[3].split(','),
  11.       property,
  12.       value;
  13.  
  14.     params = $.map(params, function(n) {
  15.       return $.trim(n);
  16.     });
  17.  
  18.     property = params[0];
  19.     value = params[1];
  20.  
  21.     if ($obj.css(property) == value) {
  22.       return true;
  23.     }
  24.   };
  25.  
  26.   $.s3throttle = function(name, func, time) {
  27.     var id = $.s3throttle.timeouts[name];
  28.     if (id) {
  29.       clearTimeout(id);
  30.     }
  31.  
  32.     $.s3throttle.timeouts[name] = setTimeout(func, time);
  33.   };
  34.  
  35.   $.s3escape = function(text) {
  36.     return $('<div>').text(text).html();
  37.   };
  38.  
  39.   $.s3throttle.timeouts = {};
  40.  
  41.   $.fn.s3center = function() {
  42.  
  43.     return this.each(function() {
  44.       var $this = $(this),
  45.         isVisible = $this.is(':visible');
  46.  
  47.       if (!isVisible) {
  48.         $this.show();
  49.       }
  50.  
  51.       $this.css({
  52.         marginLeft: -$this.outerWidth() / 2,
  53.         marginTop: -$this.outerHeight() / 2
  54.       });
  55.  
  56.       if (!isVisible) {
  57.         $this.hide();
  58.       }
  59.     });
  60.   };
  61.  
  62.  
  63.   $.fn.s3deserializeArray = function(arr) {
  64.     return this.each(function() {
  65.       var $this = $(this);
  66.       $.each(arr, function() {
  67.         var $el = $this.find('[name="' + this.name + '"]');
  68.         if (!$el.length) {
  69.           return;
  70.         }
  71.         if ($el.is('input[type=radio]')) {
  72.           $el.filter('[value="' + this.value + '"]').trigger('click');
  73.         } else {
  74.           $el.val(this.value).trigger('change');
  75.         }
  76.       });
  77.     });
  78.   };
  79.  
  80.   $.fn.caret = function(begin, end) {
  81.     var range;
  82.  
  83.     if (this.length === 0 || this.is(':hidden')) {
  84.       return;
  85.     }
  86.  
  87.     if ($.type(begin) === 'number') {
  88.       end = ($.type(end) === 'number') ? end : begin;
  89.       return this.each(function() {
  90.         if (this.setSelectionRange) {
  91.           this.setSelectionRange(begin, end);
  92.         } else if (this.createTextRange) {
  93.           range = this.createTextRange();
  94.           range.collapse(true);
  95.           range.moveEnd('character', end);
  96.           range.moveStart('character', begin);
  97.           range.select();
  98.         }
  99.       });
  100.     } else {
  101.       if (this[0].setSelectionRange) {
  102.         begin = this[0].selectionStart;
  103.         end = this[0].selectionEnd;
  104.       } else if (document.selection && document.selection.createRange) {
  105.         range = document.selection.createRange();
  106.         begin = 0 - range.duplicate().moveStart('character', -100000);
  107.         end = begin + range.text.length;
  108.       }
  109.       return {
  110.         begin: begin,
  111.         end: end
  112.       };
  113.     }
  114.   };
  115.  
  116.   $.keys = {};
  117.  
  118.   $.KEYS = {
  119.     Digit: [48, 57],
  120.     Backspace: 8,
  121.     Comma: 44,
  122.     Point: 46
  123.   };
  124.  
  125.   $.each($.KEYS, function(key, value) {
  126.     $.keys['is' + key] = function(code) {
  127.       if ($.isArray(value)) {
  128.         return (value[0] <= code && code <= value[1]);
  129.       } else {
  130.         return value === code;
  131.       }
  132.     };
  133.   });
  134.  
  135.   $.fn.getVal = function() {
  136.     var values = [];
  137.  
  138.     this.each(function() {
  139.       var v = $(this).val();
  140.       v = parseFloat(v);
  141.       if (!v) {
  142.         v = 0;
  143.       }
  144.       values.push(v);
  145.     });
  146.     return values;
  147.   };
  148.  
  149.   $.fn.keyFilter = function(selector, settings) {
  150.     settings = $.extend({
  151.       type: 'int',
  152.       def: '',
  153.       callback: $.noop
  154.     }, settings);
  155.  
  156.     return this.each(function() {
  157.       var $this = $(this);
  158.  
  159.       $this.on('keypress', selector, function(e) {
  160.         var caret, isBackspace, isDigit, isPoint, val, input = $(this);
  161.  
  162.         if (e.shiftKey || e.ctrlKey) {
  163.           return false;
  164.         }
  165.  
  166.         if (e.which === 0) {
  167.           return true;
  168.         }
  169.  
  170.         isDigit = $.keys.isDigit(e.which);
  171.         isPoint = $.keys.isPoint(e.which) || $.keys.isComma(e.which);
  172.         isBackspace = $.keys.isBackspace(e.which);
  173.  
  174.         if (!isDigit && !isPoint && !isBackspace) {
  175.           return false;
  176.         }
  177.  
  178.         if (settings.type === 'int' && isPoint) {
  179.           return false;
  180.         }
  181.  
  182.         val = input.val().replace(/,/g, '.');
  183.         caret = input.caret();
  184.         input.val(val);
  185.         input.caret(caret.begin, caret.end);
  186.  
  187.         if (isPoint && val.indexOf('.') !== -1) {
  188.           return false;
  189.         }
  190.       });
  191.  
  192.       $this.on('keyup', selector, function() {
  193.         var input = $(this);
  194.         settings.callback(input);
  195.       });
  196.  
  197.       $this.on('blur', selector, function() {
  198.         var input = $(this);
  199.         if (input.val() === '') {
  200.           input.val(settings.def);
  201.           settings.callback(input);
  202.         }
  203.       });
  204.     });
  205.   };
  206.  
  207.   $.fn.getHeights = function() {
  208.     var values = [],
  209.       max = 0;
  210.  
  211.     this.each(function() {
  212.       var $this = $(this),
  213.         height;
  214.  
  215.       $this.css('min-height', 0);
  216.  
  217.       height = $this.height();
  218.       values.push(height);
  219.  
  220.       if (height > max) {
  221.         max = height;
  222.       }
  223.     });
  224.  
  225.     return {
  226.       values: values,
  227.       max: max
  228.     };
  229.   };
  230.  
  231.   $.fn.eachRow = function(processing, deleteMarginRight) {
  232.     var elements = this,
  233.       wrap = elements.parent(),
  234.       wrapWidth, elementWidth, inRow, left, right, i = 0,
  235.       len;
  236.  
  237.     if (wrap.get(0) && elements.get(0)) {
  238.       wrapWidth = wrap.width();
  239.       elementWidth = elements.outerWidth(true);
  240.       if (deleteMarginRight) {
  241.         wrapWidth += parseFloat(elements.css('margin-right'));
  242.       }
  243.       inRow = Math.floor(wrapWidth / elementWidth);
  244.       if (inRow > 1) {
  245.         for (len = elements.length; i < len; i += inRow) {
  246.           left = i;
  247.           right = i + inRow;
  248.           if (right > len) {
  249.             right = len;
  250.           }
  251.           processing(elements.slice(left, right), elements.eq(left), elements.eq(right - 1));
  252.         }
  253.       }
  254.     }
  255.     return elements;
  256.   };
  257.  
  258.   $.on = function(selector, obj) {
  259.  
  260.     $.each(obj, function(key, value) {
  261.  
  262.       $document.on(key, selector, value);
  263.  
  264.     });
  265.  
  266.   };
  267.  
  268.   $.fn.s3tooltip = function(settings) {
  269.  
  270.     settings = $.extend({
  271.       data: function() {
  272.         return this.alt || '';
  273.       },
  274.  
  275.       cls: 'tooltip-1',
  276.       slide: true,
  277.       dir: 'bottom'
  278.  
  279.     }, settings);
  280.  
  281.     var tooltip = $('#shop2-tooltip');
  282.  
  283.     if (!tooltip.get(0)) {
  284.       tooltip = $('<div id="shop2-tooltip"></div>');
  285.       $('body').append(tooltip);
  286.     }
  287.  
  288.     var selector = this.selector;
  289.  
  290.     var win = {
  291.         $el: $(window)
  292.       },
  293.       width,
  294.       height;
  295.  
  296.     $.on(selector, {
  297.  
  298.       mouseenter: function(e) {
  299.         var html = settings.data.call(this);
  300.  
  301.         if (!html) {
  302.           return;
  303.         }
  304.  
  305.         win.width = win.$el.width();
  306.         win.height = win.$el.height();
  307.  
  308.         tooltip.html(html);
  309.         tooltip.addClass(settings.cls);
  310.         tooltip.show();
  311.  
  312.         width = tooltip.outerWidth(true);
  313.         height = tooltip.outerHeight(true);
  314.       },
  315.  
  316.       mouseleave: function(e) {
  317.         tooltip.hide();
  318.         tooltip.removeClass(settings.cls);
  319.       },
  320.  
  321.       mousemove: function(e) {
  322.  
  323.         var left = e.pageX,
  324.           top = e.pageY,
  325.           scrollTop = $document.scrollTop();
  326.  
  327.         if (left + width > win.width) {
  328.           left -= width;
  329.         }
  330.        
  331.         if ((isMobile && left<0) && $('#shop2-tooltip').hasClass('shop2_multi_tooltip')) {
  332.             left = 20;
  333.         };
  334.  
  335.         if (settings.dir == 'top') {
  336.           top -= height;
  337.  
  338.           if (top < scrollTop) {
  339.  
  340.             if (settings.slide) {
  341.  
  342.               top = scrollTop;
  343.  
  344.             } else {
  345.  
  346.               top += height;
  347.             }
  348.  
  349.           }
  350.  
  351.         } else {
  352.  
  353.           if (top + height > win.height + scrollTop) {
  354.  
  355.             if (settings.slide) {
  356.  
  357.               top = win.height + scrollTop - height;
  358.  
  359.             } else {
  360.  
  361.               top -= height;
  362.  
  363.             }
  364.  
  365.           }
  366.  
  367.         }
  368.  
  369.         tooltip.css({
  370.           left: left,
  371.           top: top
  372.         });
  373.  
  374.       }
  375.     });
  376.  
  377.   };
  378.  
  379. })(jQuery);
  380.  
  381.  
  382. (function($, self) {
  383.  
  384.   var shop2 = {
  385.     queue: {},
  386.     callbacks: {},
  387.     init: function(settings) {
  388.  
  389.       $.extend(this, settings);
  390.  
  391.       this.my = this.my || {};
  392.  
  393.       $(function() {
  394.         var queue = shop2.queue;
  395.         $.each(queue, function(method) {
  396.           var f = queue[method];
  397.           if ($.isFunction(f)) {
  398.             f();
  399.           }
  400.         });
  401.       });
  402.  
  403.     }
  404.   };
  405.  
  406.   if (document.location.search.indexOf('debug') != -1) {
  407.     shop2.debug = true;
  408.   }
  409.  
  410.   try {
  411.  
  412.     if (window.sessionStorage) {
  413.       var current = sessionStorage.getItem('shop2_current_url');
  414.       var url = location.pathname + location.search;
  415.       if (current != url) {
  416.         sessionStorage.setItem('shop2_back_url', current);
  417.       }
  418.       sessionStorage.setItem('shop2_current_url', url);
  419.     }
  420.  
  421.     shop2.back = function() {
  422.       var url;
  423.       if (window.sessionStorage) {
  424.         url = sessionStorage.getItem('shop2_back_url');
  425.         if (url === 'null') {
  426.           url = '/';
  427.         }
  428.       } else {
  429.         url = document.referrer;
  430.       }
  431.       document.location = url || '/';
  432.       return false;
  433.     };
  434.  
  435.   } catch (e) {
  436.     shop2.back = function() {
  437.       document.location = document.referrer;
  438.     }
  439.   }
  440.  
  441.   shop2.on = function(type, func) {
  442.     var _this = this;
  443.  
  444.     $.each(type.split(','), function(index, type) {
  445.       type = $.trim(type);
  446.  
  447.       if (!_this.callbacks[type]) {
  448.         _this.callbacks[type] = $.Callbacks();
  449.       }
  450.  
  451.       _this.callbacks[type].add(func);
  452.     });
  453.   };
  454.  
  455.   shop2.off = function(type, func) {
  456.     if (this.callbacks[type]) {
  457.       func ? this.callbacks[type].remove(func) : this.callbacks[type].empty();
  458.     }
  459.   };
  460.  
  461.   shop2.trigger = function(type) {
  462.     if (this.callbacks[type]) {
  463.       this.callbacks[type].fireWith(self, [].slice.call(arguments, 1));
  464.     }
  465.   };
  466.  
  467.   shop2.fire = function(type, func) {
  468.     if ($.isFunction(func)) {
  469.       var has = !!(this.callbacks && this.callbacks[type] && this.callbacks[type].has(func));
  470.  
  471.       if (!has) {
  472.         func.apply(self, [].slice.call(arguments, 2));
  473.       }
  474.     }
  475.   };
  476.  
  477.   shop2.filter = {
  478.     _pre_params: '',
  479.     init: function() {
  480.       var search = decodeURIComponent(document.location.search);
  481.       if (search) {
  482.         search = search.slice(1);
  483.       }
  484.       this.str = search;
  485.     },
  486.     escape: function(name) {
  487.       return name.replace(/(\[|\])/g, '\\$1');
  488.     },
  489.     remove: function(name, value) {
  490.       var str = name + '=';
  491.       if (typeof value !== 'undefined') {
  492.         str += value;
  493.       }
  494.       var re = new RegExp('(.*)(' + this.escape(str) + '[^&]*&*)(.*)', 'ig');
  495.       this.str = this.str.replace(re, '$1$3').replace(/&$/, '');
  496.       return this;
  497.     },
  498.     add: function(name, value) {
  499.       this.remove(name, value);
  500.       this.str += (this.str !== '') ? '&' : '';
  501.       this.str += name + '=' + value;
  502.       return this;
  503.     },
  504.     has: function(name, value) {
  505.       var str = name + '=';
  506.       if (typeof value !== 'undefined') {
  507.         str += value;
  508.       }
  509.       if (this.str.indexOf(str) > -1) {
  510.         return true;
  511.       }
  512.       return false;
  513.     },
  514.     get: function(name) {
  515.       var re = new RegExp(this.escape(name) + '=([^&]*)'),
  516.         matches = this.str.match(re);
  517.       if (matches && matches.length == 2) {
  518.         return matches[1];
  519.       }
  520.       return false;
  521.     },
  522.     toggle: function(name, value) {
  523.  
  524.       if (name == 's[amount][min]') {
  525.         if (this.get('s[amount][max]') === '0') {
  526.           this.remove('s[amount][max]');
  527.           this.add('s[amount][min]', 0);
  528.           return this;
  529.         } else if (this.get('s[amount][min]') === '0') {
  530.           this.remove('s[amount][min]');
  531.           this.add('s[amount][max]', 0);
  532.           return this;
  533.         }
  534.       } else if (name == 's[amount][max]') {
  535.         if (this.get('s[amount][min]') === '1') {
  536.           this.remove('s[amount][min]');
  537.           this.add('s[amount][min]', 0);
  538.           return this;
  539.         } else if (this.get('s[amount][min]') === '0') {
  540.           this.remove('s[amount][min]');
  541.           this.add('s[amount][min]', 1);
  542.           return this;
  543.         }
  544.       }
  545.  
  546.       if (this.has(name, value)) {
  547.         this.remove(name, value);
  548.       } else {
  549.         this.add(name, value);
  550.       }
  551.       return this;
  552.     },
  553.     sort: function(name) {
  554.       var re = new RegExp(this.escape('s[sort_by]') + '=([^&]*)'),
  555.         params = this.str.match(re),
  556.         desc = name + ' desc',
  557.         asc = name + ' asc';
  558.  
  559.       params = (params && params.length > 1) ? params[1] : '';
  560.  
  561.       if (params.indexOf(desc) !== -1) {
  562.         params = params.replace(desc, asc);
  563.       } else if (params.indexOf(asc) !== -1) {
  564.         params = params.replace(asc, desc);
  565.       } else if (params !== '') {
  566.         params += ',' + desc;
  567.       } else {
  568.         params = desc;
  569.       }
  570.  
  571.       this.remove('s[sort_by]');
  572.       this.add('s[sort_by]', params);
  573.       return this;
  574.     },
  575.     go: function() {
  576.       var str = '';
  577.       if (this.str) {
  578.         str += (this.str.charAt(0) == '?') ? '' : '?';
  579.         str += this.str;
  580.       }
  581.  
  582.       document.location =
  583.         document.location.pathname.replace(/\/p\/\d*/g, '') +
  584.         str +
  585.         document.location.hash;
  586.       return false;
  587.     },
  588.     count: function(func) {
  589.       var url = '/my/s3/api/shop2/?cmd=getSearchMatches&hash=' +
  590.         shop2.apiHash.getSearchMatches +
  591.         '&ver_id=' + shop2.verId +
  592.         '&' + this.str +
  593.         this._pre_params;
  594.  
  595.       shop2.trigger('beforeGetSearchMatches');
  596.  
  597.       $.get(
  598.         url,
  599.         function(d, status) {
  600.           if (status == 'success') {
  601.             if ($.type(d) === 'string') {
  602.               d = $.parseJSON(d);
  603.             }
  604.           }
  605.  
  606.           if (shop2.facets.enabled) {
  607.             shop2.facets.aggregation(d);
  608.           }
  609.  
  610.           shop2.fire('afterGetSearchMatches', func, d, status);
  611.           shop2.trigger('afterGetSearchMatches', d, status);
  612.         }
  613.       );
  614.  
  615.     }
  616.   };
  617.  
  618.   shop2.search = {
  619.     getParams: function(folder_id, func) {
  620.       var url;
  621.  
  622.       shop2.trigger('beforeGetFolderCustomFields');
  623.  
  624.       if (folder_id > 0) {
  625.         url = '/my/s3/api/shop2/?cmd=getFolderCustomFields' +
  626.           '&hash=' + shop2.apiHash.getFolderCustomFields +
  627.           '&ver_id=' + shop2.verId +
  628.           '&folder_id=' + folder_id +
  629.           '&' + decodeURIComponent(document.location.search).replace(/[^&]*=(&|$)/g, '');
  630.  
  631.         $.getJSON(url, function(d, status) {
  632.           shop2.fire('afterGetFolderCustomFields', func, d, status);
  633.           shop2.trigger('afterGetFolderCustomFields', d, status);
  634.         });
  635.       }
  636.     }
  637.   };
  638.  
  639.   shop2.facets = {
  640.     enabled: false,
  641.     aggs: null,
  642.     _data: {},
  643.     emptyClass: 'empty-val',
  644.  
  645.     mask: '[data-name^="s[field]"][data-value="key"],' +
  646.       '[name="s[parentField][parentKey]"] [value="key"],' +
  647.       '[name="s[field]"] [value="key"],' +
  648.       '[data-name="s[field][index]"],' +
  649.       '[data-name="s[field][key]"],' +
  650.       '[name="s[field][key]"]',
  651.  
  652.     filter: {
  653.       wrapper: '.shop2-filter, #shop2-color-ext-list',
  654.       items: '[data-name], [name], [name] [value]'
  655.     },
  656.  
  657.     search: {
  658.       wrapper: '.shop2-block.search-form form, #shop2-color-ext-select',
  659.       items: '[data-name], [name], [name] [value]'
  660.     },
  661.  
  662.     ignoreClear: function($item) {
  663.       this._data.attrName = $item.attr('name') ? $item.attr('name') : $item.parent().attr('name');
  664.       this._data.isSelect = $item.prop('tagName').toLowerCase() === 'select';
  665.       this._data.val = $item.prop('tagName').toLowerCase() === 'option' && $item.val() === '';
  666.       return /s\[(folder_id|products_per_page)\]/i.test(this._data.attrName) || this._data.isSelect || this._data.val;
  667.     },
  668.  
  669.     set: function(mod /* module filter, search */ ) {
  670.       var module = shop2.facets[mod];
  671.  
  672.       if (!module) {
  673.         return;
  674.       }
  675.  
  676.       var $wrapper = $(module.wrapper);
  677.       var $items = $wrapper.find(module.items);
  678.  
  679.       this._data.$wrapper = $wrapper;
  680.  
  681.       this.clearItems($items);
  682.       this.insertData(this.aggs);
  683.  
  684.       var eventName = 'afterFacets' + mod.charAt(0).toUpperCase() + mod.slice(1);
  685.  
  686.       shop2.trigger(eventName, this.aggs);
  687.     },
  688.  
  689.     searchSetup: function() {
  690.       if (!this.search) {
  691.         return;
  692.       }
  693.  
  694.       var $form = $(this.search.wrapper);
  695.  
  696.       if (!$form.length) {
  697.         return;
  698.       }
  699.  
  700.       var $items = $form.find(this.search.items);
  701.       var self = this;
  702.       var url = '/my/s3/api/shop2/?cmd=getSearchMatches&hash=' +
  703.         shop2.apiHash.getSearchMatches +
  704.         '&ver_id=' + shop2.verId + '&',
  705.         fullUrl = url + $form.serialize();
  706.  
  707.       this.getDataSearch(fullUrl);
  708.  
  709.       $items.on('change', function(e) {
  710.         if (e.target.name == "s[products_per_page]") {
  711.           return;
  712.         }
  713.  
  714.         fullUrl = url + $form.serialize()
  715.  
  716.         self.getDataSearch(fullUrl);
  717.       });
  718.     },
  719.  
  720.     getDataSearch: function(url) {
  721.       $.get(
  722.         url,
  723.         function(d, status) {
  724.           if (status == 'success') {
  725.             if ($.type(d) === 'string') {
  726.               d = $.parseJSON(d);
  727.             }
  728.  
  729.             shop2.facets.aggregation(d);
  730.             shop2.facets.set('search');
  731.           }
  732.         }
  733.       );
  734.     },
  735.  
  736.     clearItems: function($items) {
  737.       var emptyClass = this.emptyClass;
  738.       var self = this;
  739.       var $item, nodeName;
  740.  
  741.       $items.each(function(index, item) {
  742.         $item = $(item);
  743.  
  744.         if (self.ignoreClear($item)) {
  745.           return true;
  746.         }
  747.  
  748.         nodeName = $item.prop('tagName').toLowerCase();
  749.  
  750.         switch (nodeName) {
  751.           case 'select':
  752.             break;
  753.           case 'input':
  754.             $item.attr('placeholder', '');
  755.             break;
  756.           case 'option':
  757.             if ($item.attr('value')) {
  758.               $item.attr('disabled', 'disabled');
  759.             }
  760.             break;
  761.         }
  762.  
  763.         $item.attr('data-param-val', '0');
  764.         $item.addClass(emptyClass);
  765.       });
  766.     },
  767.  
  768.     aggregation: function(d) {
  769.       if (typeof d === 'object' && d.data.aggs) {
  770.         this.aggs = this.dataSetup(d.data.aggs);
  771.       }
  772.  
  773.       return this.aggs;
  774.     },
  775.  
  776.     dataSetup: function(aggs) {
  777.       var cf = aggs.cf;
  778.       var key, field;
  779.  
  780.       for (key in cf) {
  781.         field = cf[key];
  782.  
  783.         if ($.isArray(field) && !field.length) {
  784.           delete cf[key];
  785.         }
  786.       }
  787.  
  788.       return aggs;
  789.     },
  790.  
  791.     insertData: function(aggs, field, parentField) {
  792.       $.each(aggs, $.proxy(function(key, value) {
  793.         if (typeof value === "object") {
  794.           this.insertData(value, key, field);
  795.         } else {
  796.           this._data.$item = this.getItem(field, key, parentField);
  797.  
  798.           if (!this._data.$item.length || (!value && value!=0)) {
  799.             return true;
  800.           }
  801.  
  802.           switch (this._data.$item.prop('tagName').toLowerCase()) {
  803.             case 'input':
  804.               this._data.$item.attr('placeholder', value);
  805.               break;
  806.             case 'option':
  807.               this._data.$item.removeAttr('disabled');
  808.               break;
  809.           }
  810.  
  811.           this._data.$item.attr('data-param-val', value);
  812.           this._data.$item.removeClass(this.emptyClass);
  813.         }
  814.       }, this));
  815.     },
  816.  
  817.     getItem: function(field, key, parentField) {
  818.       if (parentField && parentField !== 'cf') {
  819.         this._data.selector = this.mask.replace(/parentField/g, parentField).replace(/parentKey/g, field).replace(/key/g, key);
  820.       } else {
  821.         this._data.selector = this.mask.replace(/field/g, field).replace(/key/g, key);
  822.       }
  823.  
  824.       return this._data.$wrapper.find(this._data.selector);
  825.     },
  826.  
  827.     setMask: function(mask) {
  828.       this.mask = mask;
  829.     },
  830.  
  831.     setEmptyClass: function(emptyClassName) {
  832.       this.emptyClass = emptyClassName;
  833.     },
  834.  
  835.     setContainers: function(module, obj) {
  836.       this[module] = obj;
  837.     }
  838.   };
  839.  
  840.   shop2.cart = {
  841.     add: function(kind_id, a4, func) {
  842.  
  843.       shop2.trigger('beforeCartAddItem');
  844.  
  845.       $.post(
  846.         '/my/s3/api/shop2/?cmd=cartAddItem', {
  847.           hash: shop2.apiHash.cartAddItem,
  848.           ver_id: shop2.verId,
  849.           kind_id: kind_id,
  850.           amount: a4
  851.         },
  852.         function(d, status) {
  853.           shop2.fire('afterCartAddItem', func, d, status);
  854.           shop2.trigger('afterCartAddItem', d, status);
  855.         },
  856.         'json'
  857.       );
  858.     },
  859.  
  860.     addMultiple: function(params, func) {
  861.  
  862.       shop2.trigger('beforeCartAddMultipleItems');
  863.  
  864.       params = $.extend({
  865.         hash: shop2.apiHash.cartAddItem,
  866.         ver_id: shop2.verId
  867.       }, params);
  868.  
  869.       $.post('/my/s3/api/shop2/?cmd=cartAddItem', params, function(d, status) {
  870.  
  871.         shop2.fire('afterCartAddMultipleItems', func, d, status);
  872.         shop2.trigger('afterCartAddMultipleItems', d, status);
  873.  
  874.       }, 'json');
  875.  
  876.     },
  877.  
  878.     remove: function(kind_id, func) {
  879.       kind_id = kind_id.toString().replace(/\"/g, '\\"').replace(/\'/g, '"');
  880.       kind_id = $.parseJSON(kind_id);
  881.  
  882.       shop2.trigger('beforeCartRemoveItem');
  883.  
  884.       $.getJSON(
  885.         '/my/s3/api/shop2/?cmd=cartRemoveItem', {
  886.           hash: shop2.apiHash.del,
  887.           ver_id: shop2.verId,
  888.           kind_id: kind_id
  889.         },
  890.         function(d, status) {
  891.           shop2.fire('afterCartRemoveItem', func, d, status);
  892.           shop2.trigger('afterCartRemoveItem', d, status);
  893.         }
  894.       );
  895.  
  896.       return false;
  897.     },
  898.  
  899.     clear: function() {
  900.  
  901.       shop2.trigger('beforeCartClear');
  902.       $.get(shop2.uri + '?mode=cart&action=cleanup', function(d, status) {
  903.         shop2.trigger('afterCartClear', d, status);
  904.       });
  905.  
  906.     },
  907.  
  908.     update: function(form, func) {
  909.       var data = form.serialize();
  910.  
  911.       shop2.trigger('beforeCartUpdate');
  912.  
  913.       $.post(
  914.         '/my/s3/api/shop2/?cmd=cartUpdate',
  915.         'ver_id=' + shop2.verId +
  916.         '&hash=' + shop2.apiHash.up +
  917.         '&' + data,
  918.         function(d, status) {
  919.           shop2.fire('afterCartUpdate', func, d, status);
  920.           shop2.trigger('afterCartUpdate', d, status);
  921.         }
  922.       );
  923.  
  924.       return false;
  925.     },
  926.  
  927.     addCoupon: function(coupon, func) {
  928.  
  929.       shop2.trigger('beforeCartAddCoupon');
  930.  
  931.       $.getJSON(
  932.         '/my/s3/api/shop2/?cmd=cartAddCoupon', {
  933.           hash: shop2.apiHash.coupon_add,
  934.           ver_id: shop2.verId,
  935.           coupon: coupon
  936.         },
  937.         function(d, status) {
  938.           shop2.fire('afterCartAddCoupon', func, d, status);
  939.           shop2.trigger('afterCartAddCoupon', d, status);
  940.         }
  941.       );
  942.  
  943.       return false;
  944.     },
  945.  
  946.     removeCoupon: function(coupon, func) {
  947.  
  948.       shop2.trigger('beforeCartRemoveCoupon');
  949.  
  950.       $.getJSON(
  951.         '/my/s3/api/shop2/?cmd=cartRemoveCoupon', {
  952.           hash: shop2.apiHash.coupon_del,
  953.           ver_id: shop2.verId,
  954.           coupon: coupon
  955.         },
  956.         function(d, status) {
  957.           shop2.fire('afterCartRemoveCoupon', func, d, status);
  958.           shop2.trigger('afterCartRemoveCoupon', d, status);
  959.         }
  960.       );
  961.     }
  962.   };
  963.  
  964.   shop2.delivery = {
  965.     deligate: false,
  966.     ymapsMap: null,
  967.     ymapsData: [],
  968.     ymapsIconsData: {
  969.       'default': '/g/shop2v2/default/images/map-pin-grey.svg',
  970.       'spsr': '/g/shop2v2/default/images/map-pin-red.svg',
  971.       'dellin': '/g/shop2v2/default/images/map-pin-purple.svg',
  972.       'edostavka': '/g/shop2v2/default/images/map-pin-green.svg',
  973.       'pickpoint': '/g/shop2v2/default/images/map-pin-grey.svg',
  974.       'boxberry': '/g/shop2v2/default/images/map-pin-boxberry.svg',
  975.       'delica': '/g/shop2v2/default/images/map-pin-grey.svg',
  976.       'selected': '/g/shop2v2/default/images/map-pin-blue.svg',
  977.     },
  978.     calc: function(attach_id, params, func) {
  979.  
  980.       shop2.trigger('beforeDeliveryCalc');
  981.  
  982.       $.getJSON(
  983.         '/my/s3/api/shop2/?cmd=deliveryCalc', {
  984.           hash: shop2.apiHash.calc,
  985.           ver_id: shop2.verId,
  986.           attach_id: attach_id,
  987.           params: params
  988.         },
  989.         function(d, status) {
  990.           shop2.fire('afterDeliveryCalc', func, d, status);
  991.           shop2.trigger('afterDeliveryCalc', d, status);
  992.         }
  993.       );
  994.     },
  995.     YmapsInit: function(service_code) {
  996.       var obj = Object.keys(shop2.delivery.ymapsData).length,
  997.         localize_text_div = $('.baloon-content-localize'),
  998.         localize_text = {
  999.           'point': localize_text_div.data('point-text'),
  1000.           'term': localize_text_div.data('term-text'),
  1001.           'price': localize_text_div.data('price-text'),
  1002.           'address': localize_text_div.data('address-text'),
  1003.           'phone': localize_text_div.data('phone-text'),
  1004.           'worktime': localize_text_div.data('worktime-text'),
  1005.           'url': localize_text_div.data('url-text'),
  1006.           'more': localize_text_div.data('more-text'),
  1007.           'choose': localize_text_div.data('choose-text'),
  1008.         };
  1009.       if (!obj) {
  1010.         $('.shop2-delivery--item__tab.points').addClass('disabled');
  1011.         return false;
  1012.       }
  1013.       var dadataJson = $.parseJSON($('#dadata').val()),
  1014.         coordsCenter = [dadataJson.geo_lat, dadataJson.geo_lon],
  1015.         options = {
  1016.           id: service_code,
  1017.           center: coordsCenter,
  1018.           zoom: 11,
  1019.         };
  1020.  
  1021.       ymaps.ready(function() {
  1022.         shop2.delivery.ymapsMap = new ymaps.Map(options.id, {
  1023.           center: options.center,
  1024.           zoom: options.zoom,
  1025.           controls: ["zoomControl"]
  1026.         });
  1027.         var MyBalloonContentLayoutClass = ymaps.templateLayoutFactory.createClass(
  1028.           '<div class="delivery-baloon-content">' +
  1029.           '<h3>$[properties.address]</h3>' +
  1030.           '<div class="buttons"><button type="button" class="shop2-btn" id="balloon-select">' + localize_text.choose + '</button>[if properties.site]<a target="_blank" class="shop2-btn" href="$[properties.site]">' + localize_text.more + '</a>[endif]</div>' +
  1031.           '<div class="note-block">[if properties.term] <p><span>' + localize_text.term + ':</span><strong class="term">$[properties.term]</strong></p>[endif] <p>$[properties.cost]</p> </div>' +
  1032.           '[if properties.phone]<div class="phone"><span>' + localize_text.phone + ':</span>$[properties.phone]</div>[endif]' +
  1033.           '[if properties.worktime]<div class="worktime"><span>' + localize_text.worktime + ':</span>$[properties.worktime]</div>[endif]' +
  1034.           '[if properties.desc]<div class="desc"><span>' + localize_text.url + ':</span>$[properties.desc]</div>[endif]' +
  1035.           '<form data-attach_id="$[properties.attach_id]"><input type="hidden" name="delivery_type" value="$[properties.delivery_type]"><input class="point-address" type="hidden" name="$[properties.attach_id][0]" value="$[properties.address]"><input type="hidden" name="$[properties.attach_id][deligate][tarif]" class="tariff" value="$[properties.tariff_hash]"><input type="hidden" name="$[properties.attach_id][deligate][terminal]" value="$[properties.id]"></form>' +
  1036.           '</div>', {
  1037.             build: function() {
  1038.               MyBalloonContentLayoutClass.superclass.build.call(this);
  1039.               $('#balloon-select').bind('click', this.onCounterClick);
  1040.             },
  1041.             clear: function() {
  1042.               $('#balloon-select').unbind('click', this.onCounterClick);
  1043.               MyBalloonContentLayoutClass.superclass.clear.call(this);
  1044.             },
  1045.             onCounterClick: function(e) {
  1046.               e.preventDefault();
  1047.               var balloonContent = $(this).parents('.delivery-baloon-content:first'),
  1048.                 form = balloonContent.find('form'),
  1049.                 pointName = balloonContent.find('h3').text(),
  1050.                 pointCostInp = balloonContent.find('label.cost input:checked'),
  1051.                 pointCost = pointCostInp.parent().data('cost'),
  1052.                 pointTerm = balloonContent.find('.term').text(),
  1053.                 attach_id = form.data("attach_id"),
  1054.                 deliveryBlock = $('#shop2-order-delivery'),
  1055.                 options = deliveryBlock.find('.option-label'),
  1056.                 groups = deliveryBlock.find('.option-type'),
  1057.                 details = deliveryBlock.find('.option-details'),
  1058.                 pointTab = deliveryBlock.find('.shop2-delivery--item__tab.points'),
  1059.                 pointFields = $(shop2.delivery.ymapsMap.container._parentElement).next(),
  1060.                 pointAddress = form.find('input.point-address').val(),
  1061.                 option = $(shop2.delivery.ymapsMap.container._parentElement).parents('.option-details:first');
  1062.  
  1063.               $("#delivery_id_deligate").val(attach_id);
  1064.               form.find('input.tariff').val(pointCostInp.val());
  1065.               pointFields.find('.fields').html(form.html());
  1066.               pointFields.find('.point-name').html(pointName);
  1067.               pointFields.find('.point-cost').html(pointCost);
  1068.               pointFields.find('.point-term').html(pointTerm);
  1069.               pointFields.find('.point-address').html(pointAddress);
  1070.               option.addClass('selected');
  1071.               $('html, body').scrollTop(option.parent().offset().top - 60);
  1072.               //pointFields.show();
  1073.               shop2.delivery.ymapsMap.balloon.close();
  1074.             }
  1075.           }
  1076.         );
  1077.  
  1078.         var myCollection = new ymaps.GeoObjectCollection();
  1079.  
  1080.         $.each(shop2.delivery.ymapsData[service_code], function(key, item) {
  1081.           var iconPic = shop2.delivery.ymapsIconsData[service_code] || shop2.delivery.ymapsIconsData['default'];
  1082.           if (item.service_code == service_code) {
  1083.             var placemark = new ymaps.Placemark(
  1084.               item.coords,
  1085.               item, {
  1086.                 balloonContentLayout: MyBalloonContentLayoutClass,
  1087.                 iconLayout: 'default#image',
  1088.                 iconImageHref: iconPic,
  1089.                 iconImageSize: [26, 36], // размеры картинки
  1090.                 iconImageOffset: [-13, -36], // смещение картинки
  1091.                 balloonMaxWidth: 530,
  1092.                 balloonPanelMaxMapArea: 'Infinity',
  1093.                 balloonMinHeight: 330,
  1094.                 balloonshadow: false,
  1095.  
  1096.               }
  1097.             );
  1098.            
  1099.             placemark.events.add('click', function (e) {
  1100.                 for(var i = 0; i < myCollection.getLength(); i++) {
  1101.                     myCollection.get(i).options.set('iconImageHref', shop2.delivery.ymapsIconsData['default']);
  1102.                 }
  1103.                 e.get('target')['options'].set('iconImageHref', shop2.delivery.ymapsIconsData['selected']);
  1104.             });
  1105.          
  1106.             myCollection.add(placemark);
  1107.           }
  1108.         });
  1109.  
  1110.         shop2.delivery.ymapsMap.geoObjects.add(myCollection);
  1111.         shop2.delivery.ymapsMap.container.fitToViewport();
  1112.         shop2.delivery.ymapsMap.behaviors.disable('multiTouch');
  1113.        
  1114.       });
  1115.     },
  1116.     changeDeliveryPoint: function(obj, service_code) {
  1117.       var $this = $(obj),
  1118.         option = $this.parents('.option-details:first');
  1119.  
  1120.       if (shop2.delivery.ymapsMap) {
  1121.         shop2.delivery.ymapsMap.destroy();
  1122.         shop2.delivery.ymapsMap = null;
  1123.       }
  1124.  
  1125.       option.find('.map-select select option:first').prop('selected', true);
  1126.       option.find('.map-select select').trigger('refresh');
  1127.       option.find('.deligate_points_fields .fields').empty();
  1128.       option.removeClass('selected');
  1129.       $('html, body').scrollTop(option.parent().offset().top - 60);
  1130.       shop2.delivery.YmapsInit(service_code);
  1131.       return false;
  1132.     },
  1133.     selectSuggestion: function(value, enter) {
  1134.       var name = value;
  1135.       $.ajax({
  1136.         url: '/my/s3/xapi/public/?method=deligate/suggestAddress',
  1137.         type: 'POST',
  1138.         dataType: 'json',
  1139.         data: JSON.stringify({
  1140.           query: name,
  1141.           count: 1
  1142.         }),
  1143.         success: function(suggestion) {
  1144.           if (suggestion.result.suggestions) {
  1145.             suggestion.result.suggestions[0].data.source = name;
  1146.           }
  1147.           if (enter) {
  1148.             $('#shop2-deligate-calc').trigger('click');
  1149.           } else {
  1150.             $("#dadata").val(JSON.stringify(suggestion.result.suggestions[0].data));
  1151.             $("#address").val(suggestion.result.suggestions[0].value);
  1152.             $('#shop2-deligate-calc').trigger('click');
  1153.           }
  1154.         }
  1155.       });
  1156.     }
  1157.   };
  1158.  
  1159.   shop2.compare = {
  1160.     add: function(kind_id, callback) {
  1161.       this.action('add', kind_id, callback);
  1162.     },
  1163.     remove: function(kind_id, callback) {
  1164.       this.action('del', kind_id, callback);
  1165.     },
  1166.     clear: function(callback) {
  1167.       this.action('clear', null, callback);
  1168.     },
  1169.     action: function(action, kind_id, func) {
  1170.  
  1171.       var eventName = $.camelCase('Compare-' + action);
  1172.  
  1173.       shop2.trigger('before' + eventName);
  1174.  
  1175.       $.post(
  1176.         '/my/s3/api/shop2/?cmd=compare', {
  1177.           hash: shop2.apiHash.compare,
  1178.           ver_id: shop2.verId,
  1179.           kind_id: kind_id,
  1180.           action: action
  1181.         },
  1182.         function(d, status) {
  1183.           shop2.fire('after' + eventName, func, d, status);
  1184.           shop2.trigger('after' + eventName, d, status);
  1185.         }
  1186.       );
  1187.     }
  1188.   };
  1189.  
  1190.   shop2.product = {
  1191.     getProductListItem: function(product_id, kind_id, func, params) {
  1192.       var url = '/my/s3/api/shop2/?cmd=getProductListItem&hash=' + shop2.apiHash.getProductListItem + '&ver_id=' + shop2.verId;
  1193.       shop2.trigger('beforeGetProductListItem');
  1194.       $.post(
  1195.         url, {
  1196.           product_id: product_id,
  1197.           kind_id: kind_id,
  1198.           params: params
  1199.         },
  1200.         function(d, status) {
  1201.           shop2.fire('afterGetProductListItem', func, d, status);
  1202.           shop2.trigger('afterGetProductListItem', d, status);
  1203.         }
  1204.       );
  1205.     },
  1206.  
  1207.     checkMetaItemValue: function(meta, key, value) {
  1208.  
  1209.       var res = meta[key];
  1210.  
  1211.       if (res == "undefined" || res == null) {
  1212.         return false;
  1213.       }
  1214.  
  1215.       if (res == value) {
  1216.         return true;
  1217.       }
  1218.  
  1219.       if (res instanceof Object) {
  1220.         for (var i in res) {
  1221.           if (res[i] == value) {
  1222.             return true;
  1223.           }
  1224.         }
  1225.       }
  1226.  
  1227.       return false;
  1228.  
  1229.     },
  1230.  
  1231.     getMetaItemValue: function(meta, key) {
  1232.       var res = meta[key];
  1233.  
  1234.       if ($.type(res) === 'undefined') {
  1235.         return false;
  1236.       }
  1237.  
  1238.       if ($.type(res) === 'object') {
  1239.  
  1240.         if ($.type(res.v) !== 'undefined') {
  1241.           return res.v;
  1242.         }
  1243.  
  1244.         if ($.type(res.image_id) !== 'undefined') {
  1245.           return res.image_id;
  1246.         }
  1247.  
  1248.       }
  1249.  
  1250.       return res;
  1251.     },
  1252.  
  1253.     findKindId: function(product_id, kinds, paramName, paramValue, meta, keys) {
  1254.       var i;
  1255.       var len;
  1256.       var d;
  1257.       var kind;
  1258.       var matches;
  1259.       var lastMatches = 0;
  1260.       var refs = $.extend(true, {}, shop2.productRefs[product_id]);
  1261.  
  1262.       if (keys) {
  1263.         $.each(refs, function(key) {
  1264.           if (!keys[key]) {
  1265.             delete refs[key];
  1266.           }
  1267.         });
  1268.       }
  1269.  
  1270.       if (kinds.length == 1) {
  1271.         return kinds[0];
  1272.       }
  1273.  
  1274.       if ($.type(meta) !== 'object') {
  1275.         meta = $.parseJSON(meta);
  1276.       }
  1277.  
  1278.       for (i = 0, len = kinds.length; i < len; i += 1) {
  1279.         d = Number(kinds[i]);
  1280.         matches = 0;
  1281.  
  1282.         $.each(refs, function(p, ref) {
  1283.  
  1284.           $.each(ref, function(v) {
  1285.  
  1286.             if (p == paramName) {
  1287.  
  1288.               if (v == paramValue) {
  1289.                 matches += 1;
  1290.               }
  1291.  
  1292.             } else {
  1293.  
  1294.               if (String(refs[p][v]).indexOf(d) === -1) {
  1295.                 return;
  1296.               }
  1297.  
  1298.               matches += 1;
  1299.  
  1300.               if (meta && shop2.product.checkMetaItemValue(meta, p, v)) {
  1301.                 matches += 1;
  1302.               }
  1303.  
  1304.             }
  1305.  
  1306.           });
  1307.  
  1308.         });
  1309.  
  1310.         if (matches > lastMatches) {
  1311.           kind = d;
  1312.           lastMatches = matches;
  1313.         }
  1314.  
  1315.       }
  1316.  
  1317.       return kind;
  1318.     },
  1319.  
  1320.     getNodeData: function(node, key, decode) {
  1321.       var data = false;
  1322.  
  1323.       if (node.tagName == 'SELECT') {
  1324.         data = $(node.options[node.selectedIndex]).data(key);
  1325.       } else if (node.nodeType == 1) {
  1326.         data = $(node).data(key);
  1327.       }
  1328.  
  1329.       if (decode) {
  1330.         data = this.decodeFieldData(data);
  1331.       }
  1332.  
  1333.       return data;
  1334.     },
  1335.  
  1336.     decodeFieldData: function(data) {
  1337.  
  1338.       if ($.type(data) !== 'string') {
  1339.         return [data];
  1340.       }
  1341.  
  1342.       data = data.split(',');
  1343.  
  1344.       return $.map(data, function(n) {
  1345.         return $.trim(n);
  1346.       });
  1347.  
  1348.     },
  1349.  
  1350.     hasKindId: function(data, kinds) {
  1351.       var i, len;
  1352.       if (data) {
  1353.         for (i = 0, len = kinds.length; i < len; i += 1) {
  1354.           if (data.indexOf(kinds[i]) !== -1) {
  1355.             return true;
  1356.           }
  1357.         }
  1358.       }
  1359.       return false;
  1360.     },
  1361.  
  1362.  
  1363.     deleteUploadProduct: function(name, kind_id){
  1364.         var data = new FormData();
  1365.         data.append('kind_id', kind_id);
  1366.         data.append('code', name);
  1367.         $.ajax({
  1368.             url: '/my/s3/xapi/public/?method=shop2/removeUploadFileProduct',
  1369.             type: 'post',
  1370.             dataType: 'json',
  1371.             processData: false,
  1372.             contentType: false,
  1373.             data: data,
  1374.             success: function(result) {
  1375.                 var result = typeof result.result != 'undefined' ? result.result : result
  1376.                 if (result.success) {
  1377.                     document.location.reload(true);
  1378.                   } else {
  1379.                       alert(result.error);
  1380.                   }
  1381.             }
  1382.         });
  1383.     },
  1384.    
  1385.     uploadProduct: function(name, kind_id, image, params){
  1386.      
  1387.         var data = new FormData(),
  1388.             parent = $('#_upload_'+name+kind_id).parent(),
  1389.             file = $('#_upload_'+name+kind_id).get(0).files,
  1390.             button_del = '<span class="delete-upload-file shop2-btn" onclick="shop2.product.deleteUploadProduct(\''+ name +'\',' + kind_id +')">удалить</span>';
  1391.            
  1392.            
  1393.         if (file.length == 0) {
  1394.             alert(_s3Lang.JS_FILES_NOT_SELECTED);
  1395.             return false;
  1396.         }
  1397.  
  1398.         $.each(file, function(key, value){
  1399.             data.append(name, value);
  1400.         });
  1401.         data.append('kind_id', kind_id);
  1402.         data.append('code', name);
  1403.         if (image) {
  1404.             data.append('image', true);
  1405.             if (params) {
  1406.                 data.append('params', JSON.stringify(params));
  1407.             }
  1408.         }
  1409.         $.ajax({
  1410.             url: '/my/s3/xapi/public/?method=shop2/uploadFileProduct',
  1411.             type: 'post',
  1412.             dataType: 'json',
  1413.             processData: false,
  1414.             contentType: false,
  1415.             data: data,
  1416.             success: function(result) {
  1417.                 var result = typeof result.result != 'undefined' ? result.result : result;
  1418.                 if (result.success) {
  1419.                     if (image) {
  1420.                         parent.empty().html('<img src="' + result.data + '">' + button_del);
  1421.                     } else {
  1422.                         parent.empty().html('<a href="/u/' + result.data + '">' + result.data + '</a>' + button_del);
  1423.                     }
  1424.                   } else {
  1425.                       alert(result.error);
  1426.                   }
  1427.             }
  1428.         });
  1429.        
  1430.     },
  1431.    
  1432.     uploadInCart: function(kind_id, pos, name, image, params){
  1433.         var data = new FormData(),
  1434.             parent = $('#_upload_in_cart_'+ kind_id + '_' + pos + '_' + name).parent(),
  1435.             file = $('#_upload_in_cart_'+ kind_id + '_' + pos + '_' + name).get(0).files,
  1436.             button_del = '<span class="delete-upload-file shop2-btn" onclick="shop2.product.deleteUploadInCart('+ kind_id + ', ' + pos + ', ' + '\'' + name + '\')">удалить</span>';
  1437.         if (file.length == 0) {
  1438.             alert(_s3Lang.JS_FILES_NOT_SELECTED);
  1439.             return false;
  1440.         }
  1441.            
  1442.  
  1443.         $.each(file, function(key, value){
  1444.             data.append(name, value);
  1445.         });
  1446.         data.append('kind_id', kind_id);
  1447.         data.append('code', name);
  1448.         data.append('pos', pos);
  1449.         if (image) {
  1450.             data.append('image', true);
  1451.             if (params) {
  1452.                 data.append('params', JSON.stringify(params));
  1453.             }
  1454.         }
  1455.         $.ajax({
  1456.             url: '/my/s3/xapi/public/?method=shop2/uploadFileProductInCart',
  1457.             type: 'post',
  1458.             dataType: 'json',
  1459.             processData: false,
  1460.             contentType: false,
  1461.             data: data,
  1462.             success: function(result) {
  1463.                 var result = typeof result.result != 'undefined' ? result.result : result;
  1464.                 if (result.success) {
  1465.                     if (image) {
  1466.                         parent.empty().html('<img src="' + result.data + '">' + button_del);
  1467.                     } else {
  1468.                         parent.empty().html('<a href="/u/' + result.data + '">' + result.data + '</a>' + button_del);
  1469.                     }
  1470.                   } else {
  1471.                       alert(result.error);
  1472.                   }
  1473.             }
  1474.         });
  1475.     },
  1476.    
  1477.     deleteUploadInCart: function(kind_id, pos, name){
  1478.         var data = new FormData();
  1479.         data.append('kind_id', kind_id);
  1480.         data.append('code', name);
  1481.         data.append('pos', pos);
  1482.         $.ajax({
  1483.             url: '/my/s3/xapi/public/?method=shop2/removeUploadFileProductInCart',
  1484.             type: 'post',
  1485.             dataType: 'json',
  1486.             processData: false,
  1487.             contentType: false,
  1488.             data: data,
  1489.             success: function(result) {
  1490.                 var result = typeof result.result != 'undefined' ? result.result : result
  1491.                
  1492.                 if (result.success) {
  1493.                     document.location.reload(true);
  1494.                   } else {
  1495.                       alert(result.error);
  1496.                   }
  1497.             }
  1498.         });
  1499.     },
  1500.    
  1501.     productDatePicker: function() {
  1502.       $(".shop2-date_interval , .shop2-date").each(function(index, el) {
  1503.         $(this).datepicker({
  1504.               minDate:0,
  1505.               changeMonth: false,
  1506.               numberOfMonths: 1,
  1507.               showOn: "button",
  1508.         buttonImage: "/g/shop2v2/default/images/shop2_calendar.svg",
  1509.         buttonImageOnly: false,
  1510.         buttonText: "Select date"
  1511.           });
  1512.       });
  1513.     }
  1514.   };
  1515.  
  1516.   shop2.options = {
  1517.     amountDefaultValue: 1,
  1518.     amountDefaultInc: 1,
  1519.     amountType: 'float',
  1520.     msgTime: 3000,
  1521.     printCSS: '/g/shop2v2/default/css/print.less.css'
  1522.   };
  1523.  
  1524.   shop2.user = {
  1525.     activate: function(user_id, target) {
  1526.       var $target = $(target);
  1527.      
  1528.       $target.attr('disabled', true);
  1529.  
  1530.       $.post('/my/s3/xapi/public/?method=user/reactivation', {
  1531.         'user_id': user_id,
  1532.       }, function() {
  1533.         var $parent = $target.parent(),
  1534.             $message = $('<div>').addClass('shop2-info').html(window._s3Lang.ACTIVATION_MAIL_SENT);
  1535.      
  1536.         $target.hide();
  1537.         $parent.append($message);
  1538.       });
  1539.     },
  1540.   };
  1541.  
  1542.   //* client-order-cancelling *//
  1543.   shop2.orderCancelling = {
  1544.     alert: function() {
  1545.       var linkButton = $('.order-cancelling'),
  1546.         attrToLinkOrder = linkButton.data('href'),
  1547.         attrLinkTitle = linkButton.data('cancellingTitle'),
  1548.         attrLinkButtonTitle = linkButton.data('cancellingButtonTitle'),
  1549.         attrLinkButtonClose = linkButton.data('cancellingClose'),
  1550.  
  1551.         html = '<div class="order-cancel-title">' + attrLinkTitle + '</div>' +
  1552.         '<div class="order-cancel-buttons">' +
  1553.         '<a class="shop2-btn" href="' + attrToLinkOrder + '">' + attrLinkButtonTitle + '</a>' +
  1554.         '<a class="shop2-alert-close" onclick="shop2.alert.hide(); return false;" href="#">' + attrLinkButtonClose + '</a>' +
  1555.         '</div>';
  1556.  
  1557.       shop2.alert(html, '', 'shop2-alert--warning order-cancel');
  1558.     }
  1559.   };
  1560.   $(document).on('click', '.order-cancelling', function(e) {
  1561.     e.preventDefault();
  1562.     shop2.orderCancelling.alert();
  1563.   });
  1564.  
  1565.   //* client-order-repeat *//
  1566.   shop2.orderRepeat = {
  1567.     alert: function($this) {
  1568.       var linkButton = $this.filter('.order-repeat'),
  1569.         attrToLinkOrder = linkButton.data('href'),
  1570.         attrLinkTitle = linkButton.data('repeatTitle'),
  1571.         attrLinkButtonTitle = linkButton.data('repeatButtonTitle'),
  1572.         attrLinkButtonClose = linkButton.data('repeatClose'),
  1573.  
  1574.         html = '<div class="order-repeat-title">' + attrLinkTitle + '?</div>' +
  1575.         '<div class="order-repeat-buttons">' +
  1576.         '<a class="shop2-btn" href="' + attrToLinkOrder + '">' + attrLinkButtonTitle + '</a>' +
  1577.         //'<a class="shop2-btn" href="#" onclick="location.href=\'' + attrToLinkOrder + '\'">'+ attrLinkButtonTitle +'</a>' +
  1578.         '<a class="shop2-alert-close" onclick="shop2.alert.hide(); return false;" href="#">' + attrLinkButtonClose + '</a>' +
  1579.         '</div>';
  1580.       shop2.alert(html, 'Закрыть', 'shop2-alert--warning order-cancel');
  1581.     }
  1582.   };
  1583.   $(document).on('click', '.order-repeat', function(e) {
  1584.     e.preventDefault();
  1585.     shop2.orderRepeat.alert($(this));
  1586.   });
  1587.  
  1588.   //* client-order-payment-change *//
  1589.   shop2.paymentChange = {
  1590.       alert: function($this) {
  1591.           var linkButton = $this.filter('.order-payment-change'),
  1592.               url = linkButton.data('href'),
  1593.               title = linkButton.data('title'),
  1594.               button_title = linkButton.data('button-title'),
  1595.               button_close = linkButton.data('close');
  1596.  
  1597.           $.ajax({
  1598.               url: url,
  1599.               type: 'POST',
  1600.               dataType: 'json',
  1601.               data: {},
  1602.               success: function(res) {
  1603.                   var html = '<div class="payment-change-title">' + title + '</div><div class="error"></div>' + res.data +
  1604.                       '<div class="payment-change-buttons">' +
  1605.                       '<a class="shop2-btn" onclick="shop2.paymentChange.save(\'' + url.replace('act=list', 'act=save') + '\');" href="#">' + button_title + '</a>' +
  1606.                       '<a class="shop2-alert-close" onclick="shop2.alert.hide(); return false;" href="#">' + button_close + '</a>' +
  1607.                       '</div>';
  1608.                   shop2.alert(html, button_close, 'shop2-alert--warning order-cancel');
  1609.               }
  1610.           });
  1611.       },
  1612.       save: function (url) {
  1613.           var form_data = $('#shop2-alert-body .shop2-payment-options').serialize();
  1614.           $.ajax({
  1615.               url: url + '&' + form_data,
  1616.               type: 'POST',
  1617.               dataType: 'json',
  1618.               data: {},
  1619.               success: function(res) {
  1620.                   if (res.data === "OK") {
  1621.                       document.location.reload();
  1622.                   } else {
  1623.                       $('#shop2-alert-body .error').html(res.data);
  1624.                   }
  1625.               }
  1626.           });
  1627.  
  1628.           return false;
  1629.       }
  1630.   };
  1631.  
  1632.   $(document).on('click', '.order-payment-change', function(e) {
  1633.     e.preventDefault();
  1634.     shop2.paymentChange.alert($(this));
  1635.   });
  1636.  
  1637.   $(document).on('click.getPromoLink', '.get-promo-link', function(e) {
  1638.     e.preventDefault();
  1639.     //shop2.paymentChange.alert($(this));
  1640.     var ver_id = $(this).data('ver-id'),
  1641.         cmd = $(this).data('cmd'),
  1642.         hash = shop2.apiHash.getPromoProducts,
  1643.         is_main = $(this).data('is-main'),
  1644.         kind_id = $(this).data('kind-id'),
  1645.         discount_id = $(this).data('discount-id');
  1646.           $.ajax({
  1647.               url: '/my/s3/api/shop2/?ver_id=' + ver_id + '&cmd=' + cmd + '&hash=' + hash + '&kind_id=' + kind_id + '&discount_id=' + discount_id + '&is_main=' + is_main,
  1648.               type: 'POST',
  1649.               dataType: 'json',
  1650.               data: {},
  1651.               success: function(res) {
  1652.                   shop2.alert(res.data, 'Закрыть', 'promo-products-list');
  1653.               }
  1654.           });    
  1655.   });
  1656.   $(document).on('click.promoPagelist', '.promo-products-list li', function(e) {
  1657.           e.preventDefault();
  1658.           var url = $(this).find('a').attr('href');
  1659.           $.ajax({
  1660.               url: url,
  1661.               type: 'POST',
  1662.               dataType: 'json',
  1663.               data: {},
  1664.               success: function(res) {
  1665.                   shop2.alert(res.data, 'Закрыть', 'promo-products-list');
  1666.               }
  1667.           });            
  1668.   });
  1669.  
  1670.   shop2.msg = function(text, obj) {
  1671.     var selector = '#shop2-msg',
  1672.       msg = $(selector),
  1673.       offset = obj.offset(),
  1674.       width = obj.outerWidth(true),
  1675.       height = obj.outerHeight(true);
  1676.  
  1677.     if (!msg.get(0)) {
  1678.       msg = $('<div id="shop2-msg">');
  1679.       $(document.body).append(msg);
  1680.       msg = $(selector);
  1681.     }
  1682.  
  1683.     msg.html(text).show();
  1684.  
  1685.     var msgWidth = msg.outerWidth();
  1686.     var left = offset.left + width;
  1687.     var top = offset.top + height;
  1688.  
  1689.     if (left + msgWidth > $(window).width()) {
  1690.       left = offset.left - msgWidth;
  1691.     }
  1692.  
  1693.     msg.css({
  1694.       left: left,
  1695.       top: top
  1696.     });
  1697.  
  1698.     $.s3throttle('msg', function() {
  1699.       msg.hide();
  1700.     }, shop2.options.msgTime);
  1701.  
  1702.   };
  1703.  
  1704.   shop2.queue = {
  1705.  
  1706.     cookiesDisabled: function() {
  1707.       if (navigator && navigator.cookieEnabled == false) {
  1708.         $('.shop2-cookies-disabled')
  1709.           .html('<p>Внимание! Для корректной работы у Вас в браузере должна быть включена поддержка cookie. В случае если по каким-либо техническим причинам передача и хранение cookie у Вас не поддерживается оформление заказа невозможно.</p>')
  1710.           .removeClass('hide');
  1711.       }
  1712.     },
  1713.  
  1714.     cartState: function() {
  1715.  
  1716.       try {
  1717.         window.sessionStorage;
  1718.       } catch (e) {
  1719.         return;
  1720.       }
  1721.  
  1722.       if (!window.chrome || !sessionStorage || !shop2.my.save_cart_state) {
  1723.         return;
  1724.       }
  1725.  
  1726.       if (!readCookie('s3s2_cart')) {
  1727.         sessionStorage.removeItem('cart-reload');
  1728.         sessionStorage.removeItem('cart-state');
  1729.       }
  1730.  
  1731.       function getHTML() {
  1732.         return $('<div>').append($('#shop2-cart-preview').clone()).html();
  1733.       }
  1734.  
  1735.       function setHTML(html) {
  1736.         if (html) {
  1737.           $('#shop2-cart-preview').replaceWith(html);
  1738.         }
  1739.       }
  1740.  
  1741.       if (sessionStorage.getItem('cart-reload') == 1) {
  1742.         sessionStorage.removeItem('cart-reload');
  1743.         sessionStorage.setItem('cart-state', getHTML());
  1744.       }
  1745.  
  1746.       shop2.on('afterCartAddItem', function(res, status) {
  1747.         var html = res.data;
  1748.         if (status != 'success') {
  1749.           html = '';
  1750.         }
  1751.         sessionStorage.setItem('cart-state', html);
  1752.       });
  1753.  
  1754.       shop2.on('afterCartRemoveItem, afterCartUpdate', function() {
  1755.         sessionStorage.setItem('cart-reload', 1);
  1756.       });
  1757.  
  1758.       $(window).on('pageshow', function() {
  1759.         setHTML(sessionStorage.getItem('cart-state'));
  1760.       });
  1761.  
  1762.     },
  1763.  
  1764.     keys: function() {
  1765.  
  1766.       $(document).keyFilter('input.shop2-input-int');
  1767.  
  1768.       $(document).keyFilter('input.shop2-input-float', {
  1769.         type: 'float'
  1770.       });
  1771.  
  1772.     },
  1773.  
  1774.     heights: function() {
  1775.  
  1776.       $('.product-list-thumbs').each(function() {
  1777.         var $this = $(this);
  1778.  
  1779.         $this.find('.product-item-thumb').eachRow(function(group) {
  1780.           var heights;
  1781.           var names = group.find('.product-name');
  1782.           var nHeights;
  1783.  
  1784.           names.css('min-height', 0);
  1785.           nHeights = names.getHeights();
  1786.           names.css('min-height', nHeights.max);
  1787.  
  1788.           var $sp = group.find('.product-amount');
  1789.  
  1790.           if ($sp.length) {
  1791.             $sp.css('margin-top', 0);
  1792.             heights = group.getHeights();
  1793.             group.each(function(i) {
  1794.               $(this).find('.product-amount').css('margin-top', heights.max - heights.values[i]);
  1795.             });
  1796.           } else {
  1797.             group.each(function() {
  1798.               var $this = $(this);
  1799.               var $sp = $this.find('.shop2-product-actions');
  1800.               if (!$sp.length) {
  1801.                 $sp = $this.find('.product-bot');
  1802.               }
  1803.               var paddingTop = $sp.data('padding-top');
  1804.               if ($.type(paddingTop) === 'undefined') {
  1805.                 paddingTop = parseInt($this.css('padding-top'));
  1806.                 $sp.data('padding-top', paddingTop);
  1807.               }
  1808.               $sp.css('padding-top', paddingTop);
  1809.             });
  1810.             heights = group.getHeights();
  1811.             group.each(function(i) {
  1812.               var $this = $(this);
  1813.               var $sp = $this.find('.shop2-product-actions');
  1814.               if (!$sp.length) {
  1815.                 $sp = $this.find('.product-bot');
  1816.               }
  1817.               var paddingTop = $sp.data('padding-top');
  1818.               $sp.css('padding-top', heights.max - heights.values[i] + paddingTop);
  1819.             });
  1820.           }
  1821.         });
  1822.       });
  1823.  
  1824.     },
  1825.  
  1826.     resize: function() {
  1827.  
  1828.       $(window).resize(function() {
  1829.         shop2.queue.heights();
  1830.       });
  1831.  
  1832.     },
  1833.  
  1834.     product: function() {
  1835.  
  1836.       shop2.product._reload = function(node) {
  1837.         var $node = $(node);
  1838.         var kinds = shop2.product.getNodeData(node, 'kinds', true);
  1839.         var paramName = shop2.product.getNodeData(node, 'name');
  1840.         var paramValue = shop2.product.getNodeData(node, 'value');
  1841.         var $form = $node.closest('form');
  1842.         var form = $form.get(0);
  1843.         var meta;
  1844.         var kind_id;
  1845.         var product_id;
  1846.         var keys = {};
  1847.         var params = {};
  1848.         var is_param_select = false;
  1849.         if (kinds && $.type(paramName) !== 'undefined' && $.type(paramValue) !== 'undefined' && form) {
  1850.           meta = $form.find('input[name=meta]').val();
  1851.           product_id = $form.find('input[name=product_id]').val();
  1852.           $form.find('[name=submit]').prop('disabled', true);
  1853.           $form.find('select.shop2-cf>option, li.shop2-cf, li.shop2-color-ext-selected, ul.shop2-color-ext-list>li').each(function() {
  1854.             var name = $(this).data('name');
  1855.             if (name) {
  1856.               keys[name] = true;
  1857.             }
  1858.           });
  1859.           kind_id = shop2.product.findKindId(product_id, kinds, paramName, paramValue, meta, keys);
  1860.           if (!kind_id) {
  1861.               kind_id = $form.find('[name=kind_id]').val();
  1862.               is_param_select = true;
  1863.           }
  1864.           // select
  1865.             $form.find('.js-calc-custom-fields.additional-cart-params').each(function() {
  1866.                 var ref_code = $(this).attr('name');
  1867.                 params[ref_code] = $(this).find('option:selected').data('item-id');
  1868.             });
  1869.           // colore ref
  1870.             $form.find('.js-calc-custom-fields.shop2-color-ext-selected').each(function() {
  1871.                 var ref_code = $(this).data('name');
  1872.                 params[ref_code] = $(this).data('item-id');
  1873.             });
  1874.           // Selected params
  1875.           if (is_param_select) {
  1876.               shop2.product.getProductListItem(product_id, kind_id, function (d, status) {
  1877.                   if (status === 'success') {
  1878.                       var body = $.trim(d.data.body);
  1879.                       var product_price = $(".product-price", body).html();
  1880.                       var product_actions = $(".shop2-product-actions", body).html();
  1881.                       $form.find('.product-price').html(product_price);
  1882.                       $form.find('.shop2-product-actions').html(product_actions);
  1883.                       shop2.trigger('afterProductReloaded');
  1884.                       shop2.queue.heights();
  1885.                   }
  1886.               }, params);
  1887.           } else {
  1888.               if (shop2.mode === 'product') {
  1889.                   if (shop2.uri) {
  1890.                       document.location = shop2.uri + '/product/' + kind_id;
  1891.                   } else {
  1892.                       document.location = document.location.href.replace(/\/product\/.+/, '/product/' + kind_id);
  1893.                   }
  1894.               } else {
  1895.                   shop2.product.getProductListItem(product_id, kind_id, function (d, status) {
  1896.                       var cont, newCont, body;
  1897.                       if (status === 'success') {
  1898.                           shop2.trigger('afterProductReloaded');
  1899.                           cont = $node.closest('.shop2-product-item');
  1900.                           cont.hide();
  1901.                           body = $.trim(d.data.body);
  1902.                           newCont = $(body).insertBefore(cont);
  1903.                           cont.remove();
  1904.                           shop2.queue.heights();
  1905.                       }
  1906.                   }, params);
  1907.               }
  1908.           }
  1909.         }
  1910.       };
  1911.  
  1912.       $.on('select.shop2-cf', {
  1913.         change: function() {
  1914.           shop2.product._reload(this);
  1915.         }
  1916.       });
  1917.  
  1918.       $.on('li.shop2-cf:not(.active-color, .active-texture)', {
  1919.         click: function() {
  1920.           shop2.product._reload(this);
  1921.         }
  1922.       });
  1923.  
  1924.       $.on('span.shop2-path-show-folders', {
  1925.         click: function(e) {
  1926.           e.preventDefault();
  1927.           $(this).next().show();
  1928.           $(this).hide();
  1929.         }
  1930.       });
  1931.  
  1932.     },
  1933.  
  1934.     addToCart: function() {
  1935.  
  1936.  
  1937.       $(document).on('click', '.shop2-product-btn:not(.preorder-btn-js)', function(e) {
  1938.  
  1939.         var $this = $(this),
  1940.           $form = $this.closest('form'),
  1941.           form = $form.get(0),
  1942.           adds = $form.find('.additional-cart-params'),
  1943.           len = adds.length,
  1944.           i, el,
  1945.           a4 = form.amount.value,
  1946.           kind_id = form.kind_id.value;
  1947.  
  1948.         e.preventDefault();
  1949.  
  1950.         if (len) {
  1951.           a4 = {
  1952.             amount: a4
  1953.           };
  1954.  
  1955.           for (i = 0; i < len; i += 1) {
  1956.             el = adds[i];
  1957.             if (el.value) {
  1958.               a4[el.name] = el.value;
  1959.             }
  1960.           }
  1961.         }
  1962.  
  1963.         shop2.cart.add(kind_id, a4, function(d) {
  1964.  
  1965.           $('#shop2-cart-preview').replaceWith(d.data);
  1966.  
  1967.           if (d.errstr) {
  1968.             shop2.msg(d.errstr, $this);
  1969.           } else {
  1970.             var $text = window._s3Lang.JS_SHOP2_ADD_CART_WITH_LINK;
  1971.             // window._s3Lang.JS_ADDED - Добавлено
  1972.             shop2.msg($text.replace('%s', shop2.uri + '/cart'), $this);
  1973.           }
  1974.  
  1975.           if (d.panel) {
  1976.             $('#shop2-panel').replaceWith(d.panel);
  1977.           }
  1978.         });
  1979.  
  1980.       });
  1981.  
  1982.     },
  1983.  
  1984.     amount: function() {
  1985.  
  1986.       var $document = $(document);
  1987.      
  1988.       function validate(input) {
  1989.           var kind = input.data('kind'),
  1990.               max = input.data('max'),
  1991.               val = Number(input.val()),
  1992.               amount = 0,
  1993.               available,
  1994.               amount_min = parseFloat(input.data('min')),
  1995.               multiplicity = parseFloat(input.data('multiplicity'));
  1996.  
  1997.           if (kind && max > 0) {
  1998.               amount = Number(input.val());
  1999.  
  2000.               if (amount > max) {
  2001.                   available = max - amount + val;
  2002.                   input.val(available);
  2003.                  
  2004.                   available = available.toFixed(2) - 0;
  2005.                  
  2006.                   shop2.msg(_s3Lang.JS_AVAILABLE_ONLY + ' ' + available, input);
  2007.               }
  2008.           }
  2009.  
  2010.           if (amount_min || multiplicity) {
  2011.  
  2012.               if (multiplicity) {
  2013.                   var x = (val - amount_min) % multiplicity;
  2014.  
  2015.                   if (x < (multiplicity / 2)) {
  2016.                       val -= x;
  2017.                   } else {
  2018.                       val += multiplicity - x;
  2019.                   }
  2020.                  
  2021.                   if (amount_min === 1 && multiplicity > 1) {
  2022.                       val--;
  2023.                   }
  2024.  
  2025.                   val = val.toFixed(2) - 0;
  2026.  
  2027.                   input.val(val);
  2028.               }
  2029.              
  2030.               if (amount_min > 0) {
  2031.               if (amount_min && val <= amount_min) {
  2032.                     input.val(amount_min);
  2033.                 }
  2034.             } else {
  2035.               if (val <= shop2.options.amountDefaultValue) {
  2036.                  input.val(amountDefaultValue);
  2037.               }
  2038.             }
  2039.            
  2040.           }
  2041.          
  2042.          
  2043.       }
  2044.  
  2045.       $document.on('click', '.amount-minus', function() {
  2046.           var $this = $(this),
  2047.               text = $this.siblings('input:text'),
  2048.               value = text.getVal(),
  2049.               amount_min = parseFloat(text.data('min')),
  2050.               multiplicity = parseFloat(text.data('multiplicity'));
  2051.  
  2052.           if (value) {
  2053.               value = value[0];
  2054.           }
  2055.  
  2056.           if (amount_min && value <= amount_min) {
  2057.               return;
  2058.           }
  2059.  
  2060.           value = checkAmount(value, amount_min, multiplicity, -1);
  2061.          
  2062.           if (amount_min > 0) {
  2063.             if (value <= amount_min) {
  2064.                 value = amount_min;
  2065.             }
  2066.           } else {
  2067.             if (value <= shop2.options.amountDefaultValue) {
  2068.                value = shop2.options.amountDefaultValue;
  2069.             }
  2070.           }
  2071.          
  2072.          
  2073.          
  2074.           text.val(value);
  2075.           text.trigger('change');
  2076.       });
  2077.       $document.on('click', '.amount-plus', function() {
  2078.           var $this = $(this),
  2079.               text = $this.siblings('input:text'),
  2080.               value = text.getVal(),
  2081.               amount_min = parseFloat(text.data('min')),
  2082.               multiplicity = parseFloat(text.data('multiplicity'));
  2083.              
  2084.           if (value) {
  2085.               value = value[0];
  2086.           }
  2087.          
  2088.           value = checkAmount(value, amount_min, multiplicity, 1);
  2089.           text.val(value);
  2090.           text.trigger('change');
  2091.       });
  2092.  
  2093.       // Если пользователь сделает некорректный ввод числа, то цифра должна изменяться в числовом окне в соответствии с кратным числом
  2094.       // (система должна автоматически изменить его на ближайшее или на минимальное к указанному),
  2095.  
  2096.       function checkAmount(amount, amount_min, multiplicity, sign) {
  2097.  
  2098.           if (multiplicity > 0) {
  2099.               amount += multiplicity * sign;
  2100.           } else {
  2101.               amount += shop2.options.amountDefaultInc * sign;
  2102.           }
  2103.          
  2104.           amount = amount.toFixed(2) - 0;
  2105.  
  2106.           return amount
  2107.       }
  2108.  
  2109.       $document.on('change', '.shop2-product-amount input:text', function() {
  2110.           var $this = $(this);
  2111.           validate($this);
  2112.       });
  2113.      
  2114.       $document.keyFilter('.shop2-product-amount input:text', {
  2115.           type: shop2.options.amountType
  2116.       });
  2117.  
  2118.     },
  2119.  
  2120.     kindAvailable: function(){
  2121.         var sentAjax_preorder = function(data, callback){
  2122.             $.ajax({
  2123.                 url: '/my/s3/xapi/public/?method=shop2/addKindEmailNotification',
  2124.                 method: 'post',
  2125.                 xhrFields: {
  2126.                     withCredentials: true
  2127.                 },
  2128.                 data: data,
  2129.                 success: function(result) {
  2130.                     callback(result);
  2131.                 }
  2132.             });
  2133.         };
  2134.        
  2135.         var object_preorder = {};
  2136.         $(document).on('click', '.preorder-btn-js', function(e) {
  2137.             e.preventDefault();
  2138.             object_preorder.data = {};
  2139.            
  2140.             object_preorder.jQbtn = $(this);
  2141.             object_preorder.data.kind_id = object_preorder.jQbtn.data('product-kind_id');
  2142.             object_preorder.data.email = object_preorder.jQbtn.data('user-email') || 0;
  2143.            
  2144.             if( object_preorder.data.email ){
  2145.                 var temp_email = `
  2146.                 <div class="preorder-field preorder-email">
  2147.                     <span class="preorder-email_text">
  2148.                         ${shop2.my.preorder_email_text||'Данный email указан при регистрации.'}
  2149.                     </span>
  2150.                     <div class="preorder-email-input">
  2151.                         <div class="preorder-field-title">E-mail: <span class="preorder-mark">*</span></div>
  2152.                         <div class="preorder-field-value">
  2153.                             <input type="text" name="email" required value="${object_preorder.data.email}">
  2154.                         </div>
  2155.                     </div>
  2156.                 </div>
  2157.                 `;
  2158.    
  2159.             }else {
  2160.                 var temp_email = `
  2161.                 <div class="preorder-field preorder-email">
  2162.                     <div class="preorder-email-input">
  2163.                         <div class="preorder-field-title">E-mail: <span class="preorder-mark">*</span></div>
  2164.                         <div class="preorder-field-value">
  2165.                             <input type="text" name="email" required value="">
  2166.                         </div>
  2167.                     </div>
  2168.                 </div>
  2169.                 `;
  2170.             }
  2171.            
  2172.             var temp_html = `
  2173.                         <div class="preorder-form-wrap preorder-popup">
  2174.                             <form class="preorder-popup-body" action="/my/s3/xapi/public/?method=shop2/addKindEmailNotification" method="get">
  2175.                                 <h2 class="preorder-popup-title">
  2176.                                     ${shop2.my.preorder_form_title||'Узнать о поступлении'}
  2177.                                 </h2>
  2178.                                 <div class="preorder-popup-text preorder-field type-html">
  2179.                                     ${shop2.my.preorder_form_text||'Оставьте почту и мы напишем вам, когда товар появится в наличии.'}
  2180.                                 </div>
  2181.                                 ${temp_email}
  2182.                                 <input type="hidden" name="kind_id" value="${object_preorder.data.kind_id}">
  2183.                                
  2184.                                 <div class="preorder-field preorder-field-button preorder_send">
  2185.                                     <button type="submit" class="shop2-btn">${shop2.my.preorder_form_submitt||'Отправить'}</button>
  2186.                                 </div>
  2187.                                
  2188.                             </form>
  2189.                             <div class="block-recaptcha"></div>
  2190.                         </div>
  2191.                         <div class="preorder-form-close"></div>
  2192.                             `;
  2193.            
  2194.             shop2.alert( temp_html, 'close', 'preorder-alert' );
  2195.         });
  2196.        
  2197.         $(document).on('click', '.preorder-form-close', function(e) {
  2198.             $('#shop2-alert-ok').click();
  2199.         });
  2200.        
  2201.         $(document).on('submit', '.block-recaptcha form', function(e) {
  2202.             e.preventDefault();
  2203.            
  2204.             var serializeArray = $(this).serializeArray();
  2205.            
  2206.             for(let i = 0; i < serializeArray.length; i++){
  2207.                 if( serializeArray[i]['name'] == '_sitekey' ){ object_preorder.data['_sitekey'] = serializeArray[i]['value'];}
  2208.                 if( serializeArray[i]['name'] == 'g-recaptcha-response' ){ object_preorder.data['g-recaptcha-response'] = serializeArray[i]['value'];}
  2209.             };
  2210.    
  2211.             sentAjax_preorder( object_preorder.data, (data)=>{
  2212.                 object_preorder.jQbtn.get(0).setAttribute('disabled', 'disabled');
  2213.    
  2214.                 $('.preorder-form-wrap').html(`
  2215.                     <h3 class="preorder-popup-success">
  2216.                         ${shop2.my.preorder_form_success||'Спасибо!'}   
  2217.                     </h3>
  2218.                 `);
  2219.  
  2220.                 if( object_preorder.jQbtn.closest('form').length ){
  2221.                     let $favorite_btn = object_preorder.jQbtn.closest('form').find('.favorite_btn');
  2222.                    
  2223.                     if( $favorite_btn.length && !$favorite_btn.is(":hidden") ){
  2224.                         $favorite_btn.trigger('click')
  2225.                     }
  2226.                 }
  2227.             });
  2228.            
  2229.         });
  2230.        
  2231.         $(document).on('submit', '.preorder-popup-body', function(e) {
  2232.             e.preventDefault();
  2233.             var $form = $(this);
  2234.            
  2235.             object_preorder.data.email = this.email.value;
  2236.             const _regexEmeil = /^[\w-\.]+@[\w-]+\.[a-z]{2,4}$/i;
  2237.            
  2238.             let valid = _regexEmeil.test(object_preorder.data.email);
  2239.            
  2240.             if (valid){
  2241.                 $.get( '/my/s3/xapi/public/?method=shop2/addKindEmailNotification', function( data ) {
  2242.    
  2243.                     const _regexBody = new RegExp(/<body[^>]*>(.*?)<\/body>/ig);
  2244.                    
  2245.                     let body = data.result.html.match( _regexBody );
  2246.                    
  2247.                     $form.parent('.preorder-popup').find('.block-recaptcha').html( body );
  2248.                   });
  2249.             }else {
  2250.                
  2251.                 if( !$form.find('.preorder-email').hasClass('field-error') )
  2252.                     $form
  2253.                         .find('.preorder-email')
  2254.                         .addClass('field-error')
  2255.                         .find('.preorder-email-input .preorder-field-value')
  2256.                         .before(`<div class="error-message">Неверный формат адреса электронной почты</div>`);
  2257.             }
  2258.    
  2259.         });
  2260.     },
  2261.  
  2262.     discounts: function() {
  2263.  
  2264.       $(document).on('click', '.shop2-product-actions dt', function(e) {
  2265.         var $this = $(this),
  2266.           win = $this.next(),
  2267.           left = $this.position().left;
  2268.  
  2269.         e.stopPropagation();
  2270.  
  2271.         if (win.is(':hidden')) {
  2272.           $('.shop2-product-actions dd').hide();
  2273.           win.show();
  2274.           win.css('left', left);
  2275.         } else {
  2276.             //win.hide();
  2277.         }  
  2278.  
  2279.       });
  2280.  
  2281.       $(document).on('click', '.close-desc-action', function(e) {
  2282.         var $this = $(this),
  2283.           win = $this.closest('dd');
  2284.  
  2285.         e.stopPropagation();
  2286.  
  2287.         win.hide();
  2288.       });
  2289.  
  2290.       $(document).on('click', function() {
  2291.         $('.shop2-product-actions dd').hide();
  2292.       });
  2293.  
  2294.     },
  2295.  
  2296.     question: function() {
  2297.       var cls = '.price-old.question, .shop2-cart-total .question';
  2298.  
  2299.       $(document).on('mouseenter', cls, function() {
  2300.         var $this = $(this),
  2301.           win = $this.next().show(),
  2302.           position = $this.position(),
  2303.           height = win.outerHeight(true);
  2304.  
  2305.         win.css({
  2306.           top: position.top - height - 5,
  2307.           left: position.left
  2308.         });
  2309.  
  2310.       }).on('mouseleave', cls, function() {
  2311.  
  2312.         var $this = $(this),
  2313.           win = $this.next();
  2314.  
  2315.         win.hide();
  2316.  
  2317.       });
  2318.  
  2319.     },
  2320.  
  2321.     tabs: function() {
  2322.  
  2323.       var tabs = $('.shop2-product-tabs li'),
  2324.         btns = tabs.find('a'),
  2325.         texts = $('.shop2-product-desc > div');
  2326.  
  2327.       btns.on('click', function(e) {
  2328.         var $this = $(this),
  2329.           href = $this.attr('href');
  2330.  
  2331.         e.preventDefault();
  2332.  
  2333.         tabs.removeClass('active-tab');
  2334.         $this.parent().addClass('active-tab');
  2335.  
  2336.         texts.removeClass('active-area');
  2337.         $(href).addClass('active-area');
  2338.       });
  2339.  
  2340.  
  2341.     },
  2342.  
  2343.     filter: function() {
  2344.  
  2345.       var wrap = $('.shop2-filter'),
  2346.         result = $('.result');
  2347.  
  2348.       shop2.filter.init();
  2349.  
  2350.       shop2.on('afterGetSearchMatches', function(d, status) {
  2351.  
  2352.         if (d.data.total_found === 0) {
  2353.  
  2354.           result.addClass('no-result');
  2355.         } else {
  2356.           result.removeClass('no-result');
  2357.         }
  2358.  
  2359.         if (shop2.facets.enabled) {
  2360.           shop2.facets.set('filter');
  2361.         }
  2362.  
  2363.         $('#filter-result').html(d.data.total_found);
  2364.  
  2365.         result.removeClass('hide');
  2366.       });
  2367.  
  2368.       wrap.find('.param-val').on('click', function(e) {
  2369.         var $this = $(this),
  2370.           name = $this.data('name'),
  2371.           value = $this.data('value');
  2372.  
  2373.         e.preventDefault();
  2374.  
  2375.         $this.toggleClass('active-val');
  2376.         shop2.filter.toggle(name, value);
  2377.         shop2.filter.count();
  2378.       });
  2379.  
  2380.       wrap.find('select').on('change', function() {
  2381.         var $this = $(this),
  2382.           name = this.name,
  2383.           value = $this.val();
  2384.  
  2385.         shop2.filter.add(name, value);
  2386.         shop2.filter.count();
  2387.       });
  2388.  
  2389.       wrap.find('input:text').keyup(function() {
  2390.         var $this = $(this),
  2391.           name = $this.attr('name');
  2392.  
  2393.         $.s3throttle('filter: ' + name, function() {
  2394.           var value = $this.val();
  2395.  
  2396.           shop2.filter.add(name, value);
  2397.           shop2.filter.count();
  2398.         }, 500);
  2399.       });
  2400.  
  2401.       wrap.find('.shop2-filter-go').on('click', function(e) {
  2402.         e.preventDefault();
  2403.         shop2.filter.go();
  2404.       });
  2405.  
  2406.     },
  2407.  
  2408.     sort: function() {
  2409.       var wrap = $('.sorting');
  2410.  
  2411.       wrap.find('.sort-param').on('click', function(e) {
  2412.         var $this = $(this),
  2413.           name = $this.data('name');
  2414.  
  2415.         e.preventDefault();
  2416.         shop2.filter.sort(name);
  2417.         shop2.filter.go();
  2418.       });
  2419.  
  2420.       wrap.find('.sort-reset').on('click', function(e) {
  2421.         e.preventDefault();
  2422.         shop2.filter.remove('s[sort_by]');
  2423.         shop2.filter.go();
  2424.       });
  2425.  
  2426.     },
  2427.  
  2428.     views: function() {
  2429.       $('.view-shop a').on('click', function(e) {
  2430.         var $this = $(this),
  2431.           value = $this.data('value');
  2432.  
  2433.         e.preventDefault();
  2434.         shop2.filter.remove('view');
  2435.         shop2.filter.add('view', value);
  2436.         shop2.filter.go();
  2437.  
  2438.       });
  2439.     },
  2440.  
  2441.     toggle: function() {
  2442.  
  2443.       function tgl(el, wrap, cls, cookie) {
  2444.         $(document).on('click', wrap + ' ' + el, function(e) {
  2445.           var w = $(wrap);
  2446.           e.preventDefault();
  2447.           if (w.hasClass(cls)) {
  2448.             w.removeClass(cls);
  2449.             eraseCookie(cookie);
  2450.           } else {
  2451.             w.addClass(cls);
  2452.             createCookie(cookie, 1, 7);
  2453.           }
  2454.         });
  2455.       }
  2456.  
  2457.       tgl('.block-title', '.cart-preview', 'opened', 'cart_opened');
  2458.       tgl('.block-title', '.search-form', 'opened', 'search_opened');
  2459.       tgl('.block-title', '.login-form ', 'opened', 'login_opened');
  2460.  
  2461.     },
  2462.  
  2463.     search: function() {
  2464.       var custom = $('#shop2_search_custom_fields'),
  2465.         global = $('#shop2_search_global_fields');
  2466.  
  2467.       shop2.on('afterGetFolderCustomFields', function(d, status) {
  2468.         custom.html(d.data);
  2469.         global.find('input, select').prop('disabled', true);
  2470.         global.hide();
  2471.       });
  2472.  
  2473.       $('#s\\[folder_id\\]').on('change', function() {
  2474.         var $this = $(this),
  2475.           folder_id = $this.val();
  2476.  
  2477.         if (folder_id) {
  2478.  
  2479.           shop2.search.getParams(folder_id);
  2480.  
  2481.         } else {
  2482.  
  2483.           custom.html('');
  2484.  
  2485.           global.find('input, select').prop('disabled', false);
  2486.  
  2487.           global.show();
  2488.         }
  2489.       }).trigger('change');
  2490.  
  2491.       if (shop2.facets.enabled && !shop2.my.lazy_search_activation) {
  2492.         shop2.facets.searchSetup();
  2493.       }
  2494.     },
  2495.  
  2496.     cart: function() {
  2497.  
  2498.       var updateBtn = $('.shop2-cart-update'),
  2499.         cartTable = $('.shop2-cart-table'),
  2500.         form = $('#shop2-cart');
  2501.  
  2502.       shop2.on('afterCartRemoveItem, afterCartUpdate', function() {
  2503.         document.location.reload();
  2504.       });
  2505.  
  2506.       function updateBtnShow() {
  2507.         updateBtn.show();
  2508.       }
  2509.  
  2510.       var eventName;
  2511.  
  2512.       ['keypress', 'keyup', 'keydown'].forEach(function(item) {
  2513.         if ('on' + item in document) {
  2514.           eventName = item;
  2515.           return false;
  2516.         }
  2517.       });
  2518.  
  2519.       cartTable.find('input:text').on(eventName, function(e) {
  2520.         if (e.keyCode == 13) {
  2521.           shop2.cart.update(form);
  2522.         } else {
  2523.           updateBtnShow();
  2524.         }
  2525.       });
  2526.  
  2527.       $(document).on('click', 'li.param-value:not(.shop2-color-ext-selected)', function() {
  2528.         updateBtnShow();
  2529.       });
  2530.      
  2531.       $(document).on('change', 'select.param-value', function() {
  2532.         updateBtnShow();
  2533.       });
  2534.  
  2535.       cartTable.find('.amount-minus, .amount-plus').on('click', updateBtnShow);
  2536.  
  2537.       updateBtn.on('click', function(e) {
  2538.         e.preventDefault();
  2539.         shop2.cart.update(form);
  2540.         return false;
  2541.       });
  2542.  
  2543.  
  2544.       $('.cart-delete a').on('click', function(e) {
  2545.         var $this = $(this),
  2546.           id = $this.data('id');
  2547.  
  2548.         e.preventDefault();
  2549.  
  2550.         shop2.cart.remove(id);
  2551.  
  2552.       });
  2553.  
  2554.       $('#shop2-deligate-calc').on('click', function(e) {
  2555.         var data = {},
  2556.           delivery = $('#shop2-order-delivery'),
  2557.           tabs = delivery.find('.shop2-delivery--item__tab');
  2558.  
  2559.         $('#shop2-perfect-form').find('input, textearea, select').each(function() {
  2560.           var $this = $(this);
  2561.           if (this.tagName === 'INPUT' && this.type === 'checkbox') {
  2562.             if (this.checked) {
  2563.               data[this.name] = 'on';
  2564.             }
  2565.           } else {
  2566.             data[this.name] = $(this).val();
  2567.           }
  2568.         });
  2569.  
  2570.         e.preventDefault();
  2571.         tabs.removeClass('active-tab');
  2572.         tabs.removeClass('point');
  2573.         delivery.addClass('preloader');
  2574.         $('#shop2-delivery-wait').show();
  2575.         $('input#address').blur();
  2576.         $('#shop2-deligate-calc').hide();
  2577.         //$('#form_g-anketa .text-right button').prop('disabled', true).addClass('g-button--disabled');
  2578.  
  2579.         $.ajax({
  2580.           url: '/my/s3/xapi/public/?method=deligate/calc&param[get_vars][]',
  2581.           type: 'post',
  2582.           dataType: 'json',
  2583.           data: data,
  2584.           success: function(result) {
  2585.             delivery.removeClass('preloader');
  2586.             $('#shop2-delivery-wait').hide();
  2587.             $('#shop2-order-delivery').html(result.result.html);
  2588.             $('#shop2-order-delivery').append('<div class="preloader"><div class="spinner"></div></div>');
  2589.             $('#shop2-order-delivery').find('.delivery-items').each(function() {
  2590.               var $this = $(this);
  2591.               if ($.trim($this.text()) == "") {
  2592.                 $this.parents('.shop2-delivery--item__tab:first').addClass('disabled');
  2593.               }
  2594.             });
  2595.             if (result.result.error) {
  2596.               shop2.alert(result.result.error);
  2597.             } else {
  2598.  
  2599.               var dadataJson = $.parseJSON($('#dadata').val()),
  2600.                 coordsCenter = [dadataJson.geo_lat, dadataJson.geo_lon];
  2601.  
  2602.               shop2.queue.edost2();
  2603.               $('#shop2-ems-calc, #shop2-edost-calc').on('click', function(e) {
  2604.                 var $this = $(this);
  2605.                 var attach_id = $this.data('attach-id');
  2606.                 var to = $('select[name=' + attach_id + '\\[to\\]]');
  2607.                 var zip = $('input[name=' + attach_id + '\\[zip\\]]');
  2608.                 var order_value = $('input[name=' + attach_id + '\\[order_value\\]]');
  2609.  
  2610.                 if (to.length == 0) {
  2611.                   to = $('#shop2-edost2-to');
  2612.                 }
  2613.  
  2614.                 e.preventDefault();
  2615.  
  2616.                 to = to.get(0) ? to.val() : '';
  2617.                 zip = zip.get(0) ? zip.val() : '';
  2618.                 order_value = order_value.prop("checked") ? 'on' : '';
  2619.  
  2620.                 shop2.delivery.calc(attach_id, 'to=' + to + '&zip=' + zip + '&order_value=' + order_value, function(d) {
  2621.                   if (!d.data && d.errstr) {
  2622.                     shop2.alert(d.errstr);
  2623.                     $('#delivery-' + attach_id + '-cost').html(0);
  2624.                   } else {
  2625.                     $('#delivery-' + attach_id + '-cost').html(d.data.cost);
  2626.  
  2627.                     if (d.data.html) {
  2628.                       $('#delivery-' + attach_id + '-html').html(d.data.html);
  2629.                       shop2.queue.edost();
  2630.                     }
  2631.                   }
  2632.                 });
  2633.  
  2634.               });
  2635.               $('#shop2-deligate-calc').hide();
  2636.             }
  2637.           }
  2638.         });
  2639.       });
  2640.     },
  2641.  
  2642.     coupon: function() {
  2643.  
  2644.       shop2.on('afterCartAddCoupon, afterCartRemoveCoupon', function() {
  2645.         document.location.reload();
  2646.       });
  2647.  
  2648.       $('.coupon-btn').on('click', function(e) {
  2649.         var coupon = $('#coupon'),
  2650.           code = coupon.val();
  2651.  
  2652.         e.preventDefault();
  2653.  
  2654.         if (code) {
  2655.  
  2656.           shop2.cart.addCoupon(code);
  2657.  
  2658.         }
  2659.  
  2660.       });
  2661.  
  2662.  
  2663.       $('.coupon-delete').on('click', function(e) {
  2664.         var $this = $(this),
  2665.           code = $this.data('code');
  2666.  
  2667.         e.preventDefault();
  2668.  
  2669.         if (code) {
  2670.  
  2671.           shop2.cart.removeCoupon(code);
  2672.  
  2673.         }
  2674.  
  2675.       });
  2676.  
  2677.     },
  2678.  
  2679.     delivery: function() {
  2680.       $('#shop2-order-delivery').find('.delivery-items').each(function() {
  2681.         var $this = $(this);
  2682.         if ($.trim($this.text()) == "") {
  2683.           $this.parents('.shop2-delivery--item__tab:first').addClass('disabled');
  2684.         }
  2685.       });
  2686.       $(document).on('change', '.map-select select', function() {
  2687.         var $this = $(this),
  2688.           index = $this.find('option:selected').index(),
  2689.           pos = $this.find('option:selected').text(),
  2690.           id = $this.val();
  2691.  
  2692.         if (index == 0) {
  2693.           shop2.delivery.ymapsMap.balloon.close();
  2694.           return;
  2695.         }
  2696.      
  2697.         var it = shop2.delivery.ymapsMap.geoObjects.getIterator(),
  2698.           ss;
  2699.         while (ss = it.getNext()) {
  2700.           for (var i = 0, len = ss.getLength(); i < len; i++) {
  2701.             var placemark = ss.get(i);
  2702.             if (placemark.properties.get('id') === id) {
  2703.                 placemark.options.set('iconImageHref', shop2.delivery.ymapsIconsData['selected']);
  2704.               if (placemark.balloon.isOpen()) {
  2705.                 placemark.balloon.close();
  2706.               } else {
  2707.                 placemark.balloon.open();
  2708.               }
  2709.               //return;
  2710.             } else {
  2711.                 placemark.options.set('iconImageHref', shop2.delivery.ymapsIconsData['default']);
  2712.             }
  2713.           }
  2714.           return;
  2715.         }
  2716.  
  2717.       });
  2718.      
  2719.       $(".shop2-payment-options .option-type").each(function(){
  2720.            
  2721.             if($(this).hasClass("option-payment-systems") && $(this).hasClass("active-type")){
  2722.                 var payment_btn = $('.shop2-payment-options .shop2-payment-btn');
  2723.                 var continue_text = $('.shop2-payment-options .shop2-payment-btn').attr('data-continue-text');
  2724.                 var pay_text = $('.shop2-payment-options .shop2-payment-btn').attr('data-pay-text');
  2725.                
  2726.                 payment_btn.text(pay_text);
  2727.             }
  2728.         });
  2729.      
  2730.       $(document).on('click', '.option-label', function(e) {
  2731.         var options = $(document).find('.option-label'),
  2732.           groups = $(document).find('.option-type'),
  2733.           details = options.next();
  2734.  
  2735.         var $this = $(this),
  2736.           index = $this.parent().index();
  2737.  
  2738.         if (e.target.nodeName != 'INPUT' && shop2.delivery.deligate) {
  2739.           e.preventDefault();
  2740.         }
  2741.  
  2742.         if (shop2.delivery.ymapsMap) {
  2743.           shop2.delivery.ymapsMap.destroy();
  2744.           shop2.delivery.ymapsMap = null;
  2745.         }
  2746.  
  2747.         groups.removeClass('active-type');
  2748.         $this.parent().addClass('active-type');
  2749.         details.find('input, textarea, select').prop('disabled', true);
  2750.         $this.next().find('input, textarea, select').prop('disabled', false);
  2751.         if (shop2.delivery.deligate) {
  2752.           $this.find('input:first').prop('checked', true);
  2753.         }
  2754.  
  2755.         if ($this.hasClass('ymap')) {
  2756.           shop2.delivery.YmapsInit($this.data('service-code'));
  2757.         }
  2758.        
  2759.         if($(".shop2-payment-options .shop2-btn").hasClass("shop2-payment-btn")){
  2760.        
  2761.             var payment_btn = $('.shop2-payment-options .shop2-payment-btn');
  2762.             var continue_text = $('.shop2-payment-options .shop2-payment-btn').attr('data-continue-text');
  2763.             var pay_text = $('.shop2-payment-options .shop2-payment-btn').attr('data-pay-text');
  2764.            
  2765.            
  2766.             if($this.parent().hasClass('option-payment-systems')){      
  2767.               payment_btn.text(pay_text);        
  2768.             } else{
  2769.               payment_btn.text(continue_text);
  2770.             }
  2771.         }
  2772.  
  2773.       });
  2774.       $(document).on('click', '.shop2-delivery--item__tab .tab-label', function() {
  2775.         var groups = $(document).find('.shop2-delivery--item__tab'),
  2776.           $this = $(this),
  2777.           parent = $this.parents('.shop2-delivery--item__tab:first'),
  2778.           index = parent.index();
  2779.  
  2780.         if (parent.hasClass('disabled')) return false;
  2781.         if (parent.hasClass('active-tab')) {
  2782.           parent.removeClass('active-tab');
  2783.           return;
  2784.         }
  2785.  
  2786.         groups.removeClass('active-tab').eq(index).addClass('active-tab');
  2787.        
  2788.         var activeTabOffsetTop = $('.active-tab .tab-label').offset().top - 10;
  2789.         $('html, body').animate({
  2790.       scrollTop: activeTabOffsetTop
  2791.     }, 800);
  2792.       });
  2793.  
  2794.       $(document).on("click", ".option-label", function() {
  2795.         var $this = $(this),
  2796.           attach_id = $this.data("attach_id"),
  2797.           siblings = $this.parent().siblings(".option-type"),
  2798.           tabsSib = $this.parents('.shop2-delivery--item__tab:first').siblings();
  2799.         $("#delivery_id_deligate").val(attach_id);
  2800.         $("#deligate_points_fields .fields").empty();
  2801.         $("#deligate_points_fields").hide();
  2802.         tabsSib.find('.option-type input').prop('checked', false);
  2803.         tabsSib.removeClass('point');
  2804.         siblings.find('input').prop('checked', false);
  2805.       });
  2806.  
  2807.       $('#shop2-ems-calc, #shop2-edost-calc').on('click', function(e) {
  2808.         var $this = $(this);
  2809.         var attach_id = $this.data('attach-id');
  2810.         var to = $('select[name=' + attach_id + '\\[to\\]]');
  2811.         var zip = $('input[name=' + attach_id + '\\[zip\\]]');
  2812.         var order_value = $('input[name=' + attach_id + '\\[order_value\\]]');
  2813.  
  2814.         if (to.length == 0) {
  2815.           to = $('#shop2-edost2-to');
  2816.         }
  2817.  
  2818.         e.preventDefault();
  2819.  
  2820.         to = to.get(0) ? to.val() : '';
  2821.         zip = zip.get(0) ? zip.val() : '';
  2822.         order_value = order_value.prop("checked") ? 'on' : '';
  2823.  
  2824.         shop2.delivery.calc(attach_id, 'to=' + to + '&zip=' + zip + '&order_value=' + order_value, function(d) {
  2825.           if (!d.data && d.errstr) {
  2826.             shop2.alert(d.errstr);
  2827.             $('#delivery-' + attach_id + '-cost').html(0);
  2828.           } else {
  2829.             $('#delivery-' + attach_id + '-cost').html(d.data.cost);
  2830.  
  2831.             if (d.data.html) {
  2832.               $('#delivery-' + attach_id + '-html').html(d.data.html);
  2833.               shop2.queue.edost();
  2834.             }
  2835.           }
  2836.         });
  2837.  
  2838.       });
  2839.     },
  2840.  
  2841.     edost: function() {
  2842.       // см delivery
  2843.  
  2844.       function find(name) {
  2845.         var selector = '[name=' + name.replace(/([\[\]])/g, '\\$1') + ']';
  2846.         return $(selector);
  2847.       }
  2848.  
  2849.       var btn = $('#shop2-edost-calc'),
  2850.         attach_id = btn.data('attach-id'),
  2851.         address = find(attach_id + '[address]');
  2852.  
  2853.       function setAddress(office) {
  2854.         var text = $.trim(office.text()).replace(/\s*\n\s*/g, '\n').split('\n').splice(1).join('\n');
  2855.         address.val(text).prop('readonly', true);
  2856.       }
  2857.  
  2858.       find(attach_id + '[edost][office]').on('click', function() {
  2859.         var $this = $(this),
  2860.           wrap = $this.closest('.shop2-edost-office');
  2861.  
  2862.         setAddress(wrap);
  2863.         $this.prop('checked', true);
  2864.       });
  2865.  
  2866.       find(attach_id + '[edost][tarif]').on('click', function() {
  2867.         var $this = $(this),
  2868.           wrap = $this.closest('.shop2-edost-variant'),
  2869.           siblings = wrap.siblings(),
  2870.           office = wrap.find('.shop2-edost-office'),
  2871.           checked;
  2872.  
  2873.         siblings.find('.shop2-edost-office input, .shop2-edost-pickpointmap input').prop({
  2874.           disabled: true,
  2875.           checked: false
  2876.         });
  2877.  
  2878.         var radio = wrap.find('.shop2-edost-office input, .shop2-edost-pickpointmap input').prop({
  2879.           disabled: false
  2880.         }).filter(':radio');
  2881.  
  2882.         checked = radio.filter(':checked');
  2883.  
  2884.         if (radio.get(0)) {
  2885.  
  2886.           if (checked.get(0)) {
  2887.             checked.trigger('click');
  2888.           } else {
  2889.             radio.eq(0).trigger('click');
  2890.           }
  2891.  
  2892.         } else {
  2893.  
  2894.           if (office.length == 1) {
  2895.             setAddress(office);
  2896.           } else if (address.prop('readonly')) {
  2897.             address.prop('readonly', false).val('');
  2898.           }
  2899.  
  2900.         }
  2901.         shop2.trigger('afterEdostSet');
  2902.  
  2903.       }).filter(':checked').trigger('click');
  2904.  
  2905.  
  2906.       $('.shop2-edost-pickpointmap a').on('click', function() {
  2907.         var $this = $(this),
  2908.           span = $this.children(),
  2909.           city = $this.data('city');
  2910.  
  2911.         $this.closest('.shop2-edost-variant').find('> label input').trigger('click');
  2912.  
  2913.         function cb(data) {
  2914.           var res = {};
  2915.           $.each(['name', 'address', 'id'], function(i, k) {
  2916.             res[k] = data[k];
  2917.           });
  2918.           $this.next().val(JSON.stringify(res));
  2919.           span.html(': ' + res.name);
  2920.           address.val(res.name + ',\n' + res.address).prop('readonly', true);
  2921.         }
  2922.  
  2923.         PickPoint.open(cb, {
  2924.           city: city,
  2925.           ids: null
  2926.         });
  2927.  
  2928.         return false;
  2929.       });
  2930.  
  2931.       // if (address.prop('readonly')) {
  2932.       //  address.prop('readonly', false).val('');
  2933.       // }
  2934.  
  2935.     },
  2936.  
  2937.     edost2: function() {
  2938.  
  2939.       if (!window.shop2EdostRegions) {
  2940.         return;
  2941.       }
  2942.  
  2943.       var $country = $('#shop2-edost2-country');
  2944.       var countryDef = $country.html();
  2945.       var $region = $('#shop2-edost2-region');
  2946.       var regionDef = $region.html();
  2947.       var $city = $('#shop2-edost2-city');
  2948.       var cityDef = $city.html();
  2949.       var $to = $('#shop2-edost2-to');
  2950.       var list;
  2951.  
  2952.  
  2953.       if ($country.length) {
  2954.         list = $.grep(shop2EdostRegions, function(item) {
  2955.           return item.is_country;
  2956.         });
  2957.         $country.html(countryDef + makeHTML(list));
  2958.         hide($region);
  2959.         hide($city);
  2960.  
  2961.         $country.on('change', function() {
  2962.           var country = $(this).val();
  2963.           if ($region.length) {
  2964.             list = $.grep(shop2EdostRegions, function(item) {
  2965.               return item.is_region && item.country == country;
  2966.             });
  2967.             $region.html(regionDef + makeHTML(list));
  2968.             if (list.length == 0) {
  2969.               hide($region);
  2970.               hide($city);
  2971.               $to.val(country);
  2972.             } else {
  2973.               show($region);
  2974.               $to.val('');
  2975.             }
  2976.           } else if ($city.length) {
  2977.             list = $.grep(shop2EdostRegions, function(item) {
  2978.               return item.is_city && item.country == country;
  2979.             });
  2980.             $city.html(cityDef + makeHTML(list));
  2981.             if (list.length == 0) {
  2982.               hide($city);
  2983.               $to.val(country);
  2984.             } else {
  2985.               show($city);
  2986.               $to.val('');
  2987.             }
  2988.           } else {
  2989.             $to.val(country);
  2990.           }
  2991.         });
  2992.       }
  2993.  
  2994.       if ($region.length) {
  2995.         if (!$country.length) {
  2996.           list = $.grep(shop2EdostRegions, function(item) {
  2997.             return item.is_region;
  2998.           });
  2999.           $region.html(regionDef + makeHTML(list));
  3000.           hide($city);
  3001.         }
  3002.  
  3003.         $region.on('change', function() {
  3004.           var region = $(this).val();
  3005.           list = $.grep(shop2EdostRegions, function(item) {
  3006.             return item.is_city && item.region == region;
  3007.           });
  3008.           $city.html(cityDef + makeHTML(list));
  3009.           if (list.length == 0) {
  3010.             hide($city);
  3011.             $to.val(region);
  3012.           } else {
  3013.             show($city);
  3014.             $to.val(region);
  3015.           }
  3016.         });
  3017.       }
  3018.  
  3019.       if (!$country.length && !$region.length) {
  3020.         list = $.grep(shop2EdostRegions, function(item) {
  3021.           return item.is_city;
  3022.         });
  3023.         $city.html(regionDef + makeHTML(list));
  3024.       }
  3025.  
  3026.       $city.on('change', function() {
  3027.         var val = $(this).val();
  3028.         if (val === 'default') {
  3029.           if ($region.length) {
  3030.             $to.val($region.val());
  3031.           }
  3032.         } else if (val) {
  3033.           $to.val(val);
  3034.         }
  3035.       });
  3036.  
  3037.       var countryValue = $country.data('value');
  3038.       var regionValue = $region.data('value');
  3039.       var cityValue = $city.data('value');
  3040.  
  3041.       if (countryValue) {
  3042.         $country.val(countryValue);
  3043.       }
  3044.  
  3045.       $country.trigger('change');
  3046.  
  3047.       if (regionValue) {
  3048.         $region.val(regionValue);
  3049.       }
  3050.  
  3051.       $region.trigger('change');
  3052.  
  3053.       if (cityValue) {
  3054.         $city.val(cityValue);
  3055.       }
  3056.  
  3057.       $city.trigger('change');
  3058.  
  3059.       function makeHTML(arr) {
  3060.         var html = $.map(arr, function(item) {
  3061.           return '<option value="' + item.id + '">' + item.name + '</option>';
  3062.         });
  3063.         return html.join('');
  3064.       }
  3065.  
  3066.       function hide($el) {
  3067.         $el.html('').closest('.option-item').addClass('hide');
  3068.       }
  3069.  
  3070.       function show($el) {
  3071.         $el.closest('.option-item').removeClass('hide');
  3072.       }
  3073.  
  3074.     },
  3075.  
  3076.     print: function() {
  3077.  
  3078.       $('#order-print').on('click', function() {
  3079.  
  3080.         s3.printMe('shop2-order', {
  3081.           stylesheet: shop2.options.printCSS
  3082.         });
  3083.  
  3084.         return false;
  3085.       });
  3086.  
  3087.     },
  3088.  
  3089.     hs: function() {
  3090.  
  3091.       $('.shop2-compare-product-image a img, .shop2-compare-data a img, .shop2-product .product-image a img, .shop2-product .product-thumbnails li a img, .cart-product-image a img, .cart-product-param a img').closest('a').on('click', function() {
  3092.         hs.expand(this);
  3093.         return false;
  3094.       }).addClass('highslide');
  3095.  
  3096.       $(document).on('click', '.shop2-edost-office-address a', function() {
  3097.         hs.htmlExpand(this, {
  3098.           objectType: 'iframe',
  3099.           wrapperClassName: 'draggable-header',
  3100.           outlineType: 'rounded-white',
  3101.           width: 900,
  3102.           height: 600,
  3103.           align: 'center'
  3104.         });
  3105.         return false;
  3106.       });
  3107.  
  3108.  
  3109.     },
  3110.  
  3111.     vendors: function() {
  3112.  
  3113.       $('.shop2-vendor').eachRow(function(group) {
  3114.         var heights = group.getHeights();
  3115.  
  3116.         group.each(function(i) {
  3117.           var $this = $(this),
  3118.             delta = heights.max - heights.values[i],
  3119.             name = $this.find('.vendor-name'),
  3120.             height = name.height();
  3121.  
  3122.           name.css('min-height', height + delta);
  3123.  
  3124.         });
  3125.       });
  3126.  
  3127.     },
  3128.  
  3129.     toggleFields: function() {
  3130.  
  3131.       var fields = $('.shop2-filter-fields'),
  3132.         cookieName = 'filter_opened',
  3133.         opened = readCookie(cookieName),
  3134.         btn = $('.shop2-toggle-fields');
  3135.  
  3136.       btn.on('click', function() {
  3137.         var $this = $(this),
  3138.           alt = $this.data('alt'),
  3139.           text = $this.html();
  3140.  
  3141.         if (fields.hasClass('hide')) {
  3142.           createCookie(cookieName, 1, 7);
  3143.         } else {
  3144.           eraseCookie(cookieName);
  3145.         }
  3146.  
  3147.         fields.toggleClass('hide');
  3148.         $this.html(alt);
  3149.         $this.data('alt', text);
  3150.  
  3151.         return false;
  3152.       });
  3153.  
  3154.       if (!opened) {
  3155.         btn.trigger('click');
  3156.       }
  3157.  
  3158.     },
  3159.  
  3160.     lazyLoad: function () {
  3161.         var $document = $(document),
  3162.           $window = $(window),
  3163.           blocked = false,
  3164.           products = $('.product-list'),
  3165.           pagesCount = 1000000,
  3166.           page_num = 1;
  3167.    
  3168.         if (shop2.my.lazy_load_subpages && products.get(0)) {
  3169.           $document.scroll(function () {
  3170.             var pagelist = $('.shop2-pagelist:last');
  3171.             var productList = $('.product-list:last');
  3172.             var offsetTop = productList.offset().top + productList.height();
  3173.            
  3174.              if (typeof shop2.page == 'undefined') {
  3175.                   shop2.page = 1;
  3176.                 }
  3177.    
  3178.             if ($document.scrollTop() + $window.height() >= offsetTop && !blocked && shop2.page < pagesCount) {
  3179.               blocked = true;
  3180.              
  3181.               var lazyLoadUrl = '/my/s3/xapi/public/?method=shop2/lazyLoad',
  3182.                 params = {
  3183.                   param: {
  3184.                     page_num: shop2.page,
  3185.                     url: window.location.pathname,
  3186.                   }
  3187.                 };
  3188.    
  3189.               if (window.location.search) {
  3190.                 lazyLoadUrl += "&" + window.location.search.substring(1);
  3191.               }
  3192.               if (pagelist.length && $('.custom-shop2-pagelist').length<1) {
  3193.                   $.ajax({
  3194.                     url: lazyLoadUrl,
  3195.                     type: 'GET',
  3196.                     dataType: 'json',
  3197.                     data: params,
  3198.                     success: function (response) {
  3199.                       productList.after('<hr />' + response.result.data.html);
  3200.                       shop2.page = parseInt(shop2.page) + 1;
  3201.                       shop2.productRefs = Object.assign(shop2.productRefs, response.result.data.product_refs);
  3202.                       pagesCount = response.result.data.pages;
  3203.                       pagelist.hide();
  3204.                       shop2.queue.heights();
  3205.                       blocked = false;
  3206.                      
  3207.                       shop2.trigger('afterProductsLazyLoaded');
  3208.                     }
  3209.                   });
  3210.               };
  3211.             }
  3212.           });
  3213.         }
  3214.       },
  3215.  
  3216.     compare: function() {
  3217.  
  3218.       var $document = $(document);
  3219.  
  3220.       function update(el, res) {
  3221.  
  3222.         // el.closest('.product-compare').replaceWith(res.data);
  3223.         $('input[type=checkbox][value=' + el.val() + ']').closest('.product-compare').replaceWith(res.data);
  3224.  
  3225.         $('.product-compare-added a span').html('(' + res.count + ')');
  3226.  
  3227.         if (res.panel) {
  3228.           $('#shop2-panel').replaceWith(res.panel);
  3229.         }
  3230.  
  3231.       }
  3232.  
  3233.       $document.on('click', '.product-compare input:checkbox', function() {
  3234.         var $this = $(this),
  3235.           action = $this.attr('checked') ? 'del' : 'add';
  3236.  
  3237.         shop2.compare.action(action, $this.val(), function(res, status) {
  3238.           if (status == 'success') {
  3239.  
  3240.             if (res.errstr) {
  3241.               shop2.alert(res.errstr);
  3242.               $this.prop('checked', false);
  3243.             } else {
  3244.               update($this, res);
  3245.             }
  3246.           }
  3247.         });
  3248.       });
  3249.  
  3250.     },
  3251.  
  3252.     compareTable: function() {
  3253.  
  3254.       $('.shop2-compare-table').each(function() {
  3255.         var $this = $(this),
  3256.           relay = $this.find('.shop2-compare-switch a'),
  3257.           options = $this.find('.shop2-compare-data');
  3258.  
  3259.         $this.find('.shop2-compare-delete').on('click', function() {
  3260.           var $this = $(this),
  3261.             kind_id = $this.data().id;
  3262.  
  3263.           shop2.compare.remove(kind_id, function() {
  3264.             document.location.reload();
  3265.           });
  3266.  
  3267.           return false;
  3268.         });
  3269.  
  3270.         function compareTd(tr) {
  3271.           var td = tr.find('td'),
  3272.             val = td.eq(1).html(),
  3273.             differ = false,
  3274.             i = 2,
  3275.             len = td.length;
  3276.  
  3277.           if (len <= 2) {
  3278.             return false;
  3279.           }
  3280.  
  3281.           for (; i < len; i += 1) {
  3282.             if (val != td.eq(i).html()) {
  3283.               differ = true;
  3284.               break;
  3285.             }
  3286.             val = td.eq(i).html();
  3287.           }
  3288.  
  3289.           return differ;
  3290.         }
  3291.  
  3292.         relay.on('click', function() {
  3293.  
  3294.           var $this = $(this);
  3295.  
  3296.           relay.removeClass('shop2-compare-switch-active');
  3297.           $this.addClass('shop2-compare-switch-active');
  3298.  
  3299.           if ($this.index() === 0) {
  3300.             options.show();
  3301.           } else {
  3302.             options.each(function() {
  3303.               var $this = $(this),
  3304.                 differ = compareTd($this);
  3305.  
  3306.               if (differ) {
  3307.                 $this.show();
  3308.               } else {
  3309.                 $this.hide();
  3310.               }
  3311.             });
  3312.           }
  3313.  
  3314.           return false;
  3315.  
  3316.         }).eq(1).trigger('click');
  3317.  
  3318.  
  3319.       });
  3320.     },
  3321.    
  3322.     favorite: function() {
  3323.  
  3324.         function popupDeleteFavorite($kind_id) {
  3325.             var popupWr = '<div class="shop2-popup_favorite"><div class="popup_inner"><div class="text">Удалить товар из избранного?</div><div class="btns"><div class="shop2-btn delete_fovorite" data-kind_id="' + $kind_id + '">Удалить</div><div class="shop2-btn-close close_favorite">Закрыть</div></div></div></div>';
  3326.             $(popupWr).appendTo('body');
  3327.         }
  3328.        
  3329.         function popupClearFavorite() {
  3330.             var popupWr = '<div class="shop2-popup_favorite"><div class="popup_inner"><div class="text">Удалить все товары из избранного?</div><div class="btns"><div class="shop2-btn clear_fovorite">Удалить</div><div class="shop2-btn-close close_favorite">Закрыть</div></div></div></div>';
  3331.             $(popupWr).appendTo('body');
  3332.         }
  3333.         $(document).on('click', '.favorite_btn', function() {
  3334.             var $this = $(this),
  3335.                 kind_id = $this.parents('form').find('input[name="kind_id"]').val(),
  3336.                 active = $this.parents('.favorite_btn_wrapper').find('.favorite_btn_active');
  3337.             $.ajax({
  3338.                 url: '/my/s3/xapi/public/?method=shop2/addFavoriteProduct&param[kind_id]=' + kind_id,
  3339.                 type: 'post',
  3340.                 dataType: 'json',
  3341.                 data: kind_id,
  3342.                 success: function(data) {
  3343.                     var res = data.result.count;
  3344.                     var $text = /*window._s3Lang.JS_ADD_FOVARITE;*/ "Добавлено в <a href='%s'>избранное</a>";
  3345.                     $('.favorite_btn_active a > span').text(res);
  3346.                     $('.shop2_favorite_cart_link span').text(res);
  3347.                     $('.favorite_panel').removeClass('not-null');
  3348.                     shop2.msg($text.replace('%s', shop2.uri + '/favorites'), $this);
  3349.                     $this.hide();
  3350.                     active.show();
  3351.                 }
  3352.             });
  3353.         });
  3354.         $(document).on('click', '.favorite_btn_active .icon', function() {
  3355.             var kind_id = $(this).parents('form').find('input[name="kind_id"]').val();
  3356.             popupDeleteFavorite(kind_id);
  3357.         });
  3358.         $(document).on('click', '.delete_fovorite', function() {
  3359.             var kind_id = $(this).data('kind_id'),
  3360.                 product = $('body').find('form input[value="' + kind_id + '"]').closest('form'),
  3361.                 active = product.find('.favorite_btn'),
  3362.                 noActive = product.find('.favorite_btn_active');
  3363.             $.ajax({
  3364.                 url: '/my/s3/xapi/public/?method=shop2/removeFavoriteProduct&param[kind_id]=' + kind_id,
  3365.                 type: 'post',
  3366.                 dataType: 'json',
  3367.                 data: kind_id,
  3368.                 success: function(data) {
  3369.                     var res = data.result.count;
  3370.                     $('.favorite_btn_active a > span').text(res);
  3371.                     $('.shop2_favorite_cart_link span').text(res);
  3372.                     if (res == 0) {
  3373.                         $('.favorite_panel').addClass('not-null');
  3374.                     }
  3375.                     noActive.hide();
  3376.                     active.show();
  3377.                 }
  3378.             });
  3379.             $('.shop2-popup_favorite').remove();
  3380.         });
  3381.         $(document).on('click', '.close_favorite', function() {
  3382.             $('.shop2-popup_favorite').remove();
  3383.         });
  3384.         $(document).on('click', '.shop2-btn_popup_favorite', function(e) {
  3385.             popupClearFavorite();
  3386.             e.preventDefault();
  3387.         });
  3388.         $(document).on('click', '.clear_fovorite', function(e) {
  3389.             $.ajax({
  3390.                 url: '/my/s3/xapi/public/?method=shop2/clearFavoriteProducts',
  3391.                 type: 'post',
  3392.                 dataType: 'json',
  3393.                 success: function(data) {}
  3394.             });
  3395.             location.reload()
  3396.         });
  3397.  
  3398.     },
  3399.    
  3400. buyOneClick: function() {
  3401.     if(!$('.buy-one-click-js').length){
  3402.         return;
  3403.     }
  3404.     var current_obj = {};
  3405.     current_obj.status_modal = false;
  3406.  
  3407.     if( $('[data-remodal-id="buy-in-one-click"]').length ){
  3408.         var modal = $('[data-remodal-id="buy-in-one-click"]').remodal();
  3409.         modal.str_block = '[data-remodal-id="buy-in-one-click"]';
  3410.         modal.str_btn = '.buy-one-click-js';
  3411.         modal.settings.hashTracking = false;
  3412.  
  3413.         modal.open_modal = function(data){
  3414.             $( this.str_block ).find('.shop2-buy-one-click-block').html(data);
  3415.             this.open();
  3416.         };
  3417.  
  3418.         modal.up_scroll = function(){
  3419.             this.$wrapper.scrollTop(0);
  3420.         }
  3421.        
  3422.     } else {
  3423.         var modal = {
  3424.             str_block: '.buy-one-click-container',
  3425.             str_btn: '.buy-one-click-js',
  3426.             open_modal: function(data){
  3427.                 current_obj.opening( `
  3428.                 <div class="${this.str_block.replace('.','')}">
  3429.                     <div class="preorder-form-close"></div>
  3430.                     <div class="shop2-buy-one-click-block">${data}</div>
  3431.                 </div>
  3432.                 `);
  3433.             },
  3434.             up_scroll: function(){
  3435.                 $(this.str_block).parent().parent().scrollTop(0)
  3436.             }
  3437.         };
  3438.         $(document).on('keyup.esc_keyup', function(keyUp){
  3439.             if (keyUp.keyCode == 27 && current_obj.status_modal) {
  3440.                 modal_close.apply(current_obj);
  3441.                 return false;
  3442.             }else {
  3443.                 return false;
  3444.             }
  3445.         });
  3446.         $(document).on('click', function(e){
  3447.                 e.stopPropagation();
  3448.                 let target =  $(e.target);
  3449.                 if( target.is('.buy-one-click-container .preorder-form-close') || target.is('.shop2-buy-one-click-popup') ){
  3450.                     modal_close.apply(current_obj);
  3451.                 }
  3452.             }
  3453.         );
  3454.         function modal_close(){
  3455.             $('html').removeClass('oveflowHidden');
  3456.             this.current_modal.removeClass('opened');
  3457.             this.status_modal = false;
  3458.         };
  3459.         function modal_open(){
  3460.             $('html').addClass('oveflowHidden');
  3461.             this.current_modal.addClass('opened');
  3462.             this.status_modal = true;
  3463.         };
  3464.         (function modal_create(){
  3465.             window.$popup = $(
  3466.                 `<div class="shop2-buy-one-click-popup">
  3467.                     <div class="shop2-buy-one-click-popup__inner">
  3468.                     </div>
  3469.                 </div>`
  3470.             );
  3471.    
  3472.             $('body').append( $popup );
  3473.    
  3474.             current_obj.current_modal = $popup;
  3475.             current_obj.opening = function(data){
  3476.                 this.current_modal.find('.shop2-buy-one-click-popup__inner').html(data);
  3477.                
  3478.                 modal_open.apply(this);
  3479.             }
  3480.         })();
  3481.     };
  3482.  
  3483.  
  3484.     function modal_amountInit(){
  3485.         if( typeof shop2_gr == 'undefined') {
  3486.             return;
  3487.         } else {
  3488.             if( typeof shop2_gr.methods.amountInit == 'undefined') {
  3489.                 return;
  3490.             }else{
  3491.                 shop2_gr.methods.amountInit();
  3492.             }
  3493.         }
  3494.     };
  3495.     function modal_grFormDatePicker(){
  3496.         if( typeof grFormDatePicker != 'undefined' ){
  3497.             grFormDatePicker.init();
  3498.         }else {
  3499.             $( ".datepickerInit" ).each(function(index, el) {
  3500.                 $(this).datepicker({
  3501.                     minDate:0,
  3502.                     changeMonth: false,
  3503.                     numberOfMonths: 1
  3504.                 });
  3505.             });
  3506.         }
  3507.     };
  3508.  
  3509.     function sumTotal(_this){
  3510.         var
  3511.         inProduct     = _this.closest('.shop2-buy-one-click__product-right'),
  3512.         currentPrice  = +String(inProduct.find('.shop2-buy-one-click__total').data('price')).replace(/\u00A0/g, ''),
  3513.         amountMin     = +inProduct.find('.shop2-product-amount input').data('min'),
  3514.         amountVal     = +inProduct.find('.shop2-product-amount input').val(),
  3515.         grandTotal    = currentPrice * amountVal;
  3516.        
  3517.        
  3518.         inProduct.find('.shop2-buy-one-click__total .price-current strong').text(Math.floor(grandTotal));
  3519.     };
  3520.     function validateEmail(email) {
  3521.         var re = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
  3522.         return re.test(String(email).toLowerCase());
  3523.     }
  3524.  
  3525.     $(document).on('click', modal.str_block + ' .order_one_click_amount_js', function(e){
  3526.         var $elem = $(e.target);
  3527.        
  3528.         if( $elem.hasClass('amount-plus') || $elem.hasClass('amount-minus') ){
  3529.             sumTotal($elem);
  3530.         }
  3531.     });
  3532.  
  3533.     $(document).on('change', '.order_one_click_amount_js input', function() {
  3534.         var $this = $(this);
  3535.         setTimeout(function(){
  3536.             sumTotal($this);
  3537.         }, 100);
  3538.     });
  3539.  
  3540.     $(document).on('click', modal.str_btn, function(e){
  3541.         e.preventDefault();
  3542.         current_obj._this = this;
  3543.         current_obj.kind_id = +$( current_obj._this ).data('product-kind_id');
  3544.         current_obj.form = $( current_obj._this ).closest('form');
  3545.  
  3546.         getForm({
  3547.             requestType:"get",
  3548.             callback: function(response){
  3549.                 let data = $.trim(response.result.html).replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
  3550.  
  3551.                 modal.open_modal(data);
  3552.                 modal_grFormDatePicker();
  3553.                
  3554.                 $('.order_one_click_amount_js input')
  3555.                     .val( current_obj.form[0].amount.value )
  3556.                     .trigger('change');
  3557.                 modal_amountInit();
  3558.             }
  3559.         });
  3560.     });
  3561.  
  3562.     $(document).on('submit', modal.str_block + ' form', function(e){
  3563.         e.preventDefault();
  3564.         var serialize_data = $(this).serializeArray();
  3565.         var $input_email = $(modal.str_block + ' .order_field_email');
  3566.         var emailFlag = true;
  3567.        
  3568.         $input_email.each(function(){
  3569.             if (!validateEmail($(this).val())) {
  3570.                 $(this).closest('.tpl-field').addClass('field-error').find('.error-message').removeClass('hide');
  3571.                 return emailFlag = false
  3572.             }
  3573.         });
  3574.        
  3575.         if (emailFlag) {
  3576.             getForm({
  3577.                 requestType:"post",
  3578.                 serializeData: serialize_data
  3579.             });
  3580.         };
  3581.     });
  3582.  
  3583.     function getForm(obj) {
  3584.         let req = obj.requestType || 'post';
  3585.  
  3586.         if (req == 'get') {
  3587.             let url = '/my/s3/xapi/public/?method=shop2/buyOneClick&param[kind_id]=' + current_obj.kind_id;
  3588.             let gr_images_size = $(modal.str_btn).data('images-size');
  3589.             let gr_images_view = $(modal.str_btn).data("images-view");
  3590.    
  3591.             if (gr_images_view){
  3592.                 url += "&gr_images_view=" + gr_images_view;
  3593.             };
  3594.            
  3595.             if (gr_images_size){
  3596.                 url += "&gr_images_size=" + gr_images_size;
  3597.             };
  3598.  
  3599.             $.ajax({
  3600.                 url: url,
  3601.                 type: req,
  3602.                 cache: false,
  3603.                 dataType: 'json'
  3604.             }).done(function(response) {
  3605.                 if (obj.callback) {
  3606.                     obj.callback(response);
  3607.                 };
  3608.             });
  3609.         } else {
  3610.             let url = '/my/s3/xapi/public/?method=shop2/buyOneClick';
  3611.             let ser = obj.serializeData;
  3612.             let gr_images_size = $(modal.str_btn).data('images-size');
  3613.             let gr_images_view = $(modal.str_btn).data("images-view");
  3614.    
  3615.             if (gr_images_view){
  3616.                 url += "&gr_images_view=" + gr_images_view;
  3617.             };
  3618.            
  3619.             if (gr_images_size){
  3620.                 url += "&gr_images_size=" + gr_images_size;
  3621.             };
  3622.  
  3623.             $.ajax({
  3624.                 url: url,
  3625.                 data: ser,
  3626.                 type: req,
  3627.                 cache: false,
  3628.                 dataType: 'json'
  3629.             }).done(function(response) {
  3630.                 if(response.result.error) {
  3631.                     $(modal.str_block + ' .shop2-warning').remove();
  3632.                     $(modal.str_block + ' .shop2-buy-one-click__result').prepend('<div class="shop2-warning">'+response.result.error+'</div>');
  3633.                     modal.up_scroll();
  3634.                     return false;
  3635.                 };
  3636.                 let data = $.trim(response.result.html).replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
  3637.                 $(modal.str_block).find('.shop2-buy-one-click-block').html(data);
  3638.                 modal_grFormDatePicker();
  3639.                
  3640.                 $('.order_one_click_amount_js input').trigger('change');
  3641.                 modal_amountInit();
  3642.  
  3643.                 if (obj.callback) {
  3644.                     obj.callback(response);
  3645.                 };
  3646.             });
  3647.         };
  3648.     };
  3649. },
  3650.  
  3651.     alert: function() {
  3652.  
  3653.       var tpl = [
  3654.           '<div id="shop2-alert">',
  3655.           '<div id="shop2-alert-body"></div>',
  3656.           '<a href="#" id="shop2-alert-ok" class="shop2-btn"></a>',
  3657.           '</div>',
  3658.           '<div id="shop2-alert-overlay"></div>'
  3659.         ].join('\n'),
  3660.  
  3661.         win,
  3662.         overlay,
  3663.         body,
  3664.         ok,
  3665.         cls;
  3666.  
  3667.       $(document.body).append(tpl);
  3668.  
  3669.       win = $('#shop2-alert');
  3670.       overlay = $('#shop2-alert-overlay');
  3671.       body = $('#shop2-alert-body');
  3672.       ok = $('#shop2-alert-ok');
  3673.  
  3674.       function hide() {
  3675.         overlay.hide();
  3676.         win.hide();
  3677.         win.removeAttr('class');
  3678.         cls = '';
  3679.         shop2.trigger('alertHide', win);
  3680.         return false;
  3681.       }
  3682.  
  3683.       function show() {
  3684.         overlay.show();
  3685.         win.attr('class', cls);
  3686.         win.show().s3center();
  3687.         shop2.trigger('alertShow', win);
  3688.       }
  3689.  
  3690.       overlay.on('click', hide);
  3691.       ok.on('click', hide);
  3692.  
  3693.       shop2.alert = function(msg, btn, c) {
  3694.         ok.html(btn || 'Ok');
  3695.         body.html(msg);
  3696.         cls = c || 'shop2-alert--warning';
  3697.         show();
  3698.       };
  3699.  
  3700.       shop2.alert.hide = hide;
  3701.  
  3702.     },
  3703.  
  3704.     tooltip: function() {
  3705.  
  3706.       $('.shop2-tooltip').s3tooltip({
  3707.         cls: 'shop2-color-ext-tooltip',
  3708.         dir: 'top',
  3709.         data: function() {
  3710.           return $(this).data('tooltip');
  3711.         }
  3712.       });
  3713.  
  3714.     },
  3715.  
  3716.     colorTooltip: function() {
  3717.  
  3718.       $('.shop2-color-ext-list li').s3tooltip({
  3719.  
  3720.         cls: 'shop2-color-ext-tooltip',
  3721.         dir: 'top',
  3722.         data: function() {
  3723.           return $(this).children('div').html();
  3724.         }
  3725.  
  3726.       });
  3727.  
  3728.       $('.shop2-color-ext-multi').s3tooltip({
  3729.  
  3730.         cls: 'shop2-color-ext-tooltip shop2_multi_tooltip',
  3731.         dir: 'top',
  3732.         data: function() {
  3733.           var ul = this.getElementsByTagName('ul');
  3734.           if (ul.length) {
  3735.             return ul[0].outerHTML;
  3736.           }
  3737.         }
  3738.  
  3739.       });
  3740.  
  3741.     },
  3742.  
  3743.     colorPopup: function() {
  3744.  
  3745.       var popup = $('<div id="shop2-color-ext-popup"></div>');
  3746.       var close = $('<div id="shop2-color-ext-close"></div>');
  3747.       var list = $('<ul id="shop2-color-ext-list" class="shop2-color-ext-list"></ul>');
  3748.       var colors = null;
  3749.  
  3750.       popup.append(close);
  3751.       popup.append(list);
  3752.       $(document.body).append(popup);
  3753.  
  3754.       $.on('.shop2-color-ext-caption', {
  3755.  
  3756.         click: function() {
  3757.           var caption = $(this);
  3758.           var wrap = caption.closest('.shop2-color-ext-popup');
  3759.           var ul = wrap.find('.shop2-color-ext-list');
  3760.           var offset = caption.offset();
  3761.  
  3762.           colors = ul.children('li');
  3763.           list.html(ul.html());
  3764.  
  3765.           popup.css(offset).show();
  3766.  
  3767.           return false;
  3768.         }
  3769.  
  3770.       });
  3771.  
  3772.  
  3773.       $(document).on('click', '.shop2-color-ext-list li', function() {
  3774.         var $this = $(this);
  3775.         var data = $this.data();
  3776.         var input = $this.parent().find('input.additional-cart-params');
  3777.         var isSelected = $this.is('.shop2-color-ext-selected');
  3778.  
  3779.         if (typeof data.kinds !== 'undefined' || input.length) {
  3780.  
  3781.           $this.addClass('shop2-color-ext-selected').siblings().removeClass('shop2-color-ext-selected');
  3782.  
  3783.           if (input.length) {
  3784.             input.val(data.value);
  3785.           } else {
  3786.             if (!isSelected) {
  3787.               shop2.product._reload(this);
  3788.             }
  3789.           }
  3790.  
  3791.         } else {
  3792.  
  3793.           var index = $this.index();
  3794.           var isPopup = !!$this.closest('#shop2-color-ext-popup').length;
  3795.           if (isPopup) {
  3796.             $this.toggleClass('shop2-color-ext-selected');
  3797.             colors.eq(index).toggleClass('shop2-color-ext-selected');
  3798.             shop2.filter.toggle(data.name, data.value);
  3799.             shop2.filter.count();
  3800.           }
  3801.         }
  3802.       });
  3803.  
  3804.       $(document).on('click', function(e) {
  3805.         var target = $(e.target);
  3806.         var wrap = target.closest('#shop2-color-ext-popup');
  3807.  
  3808.         if (!wrap.get(0) || e.target == close.get(0)) {
  3809.           popup.hide();
  3810.         }
  3811.       });
  3812.  
  3813.     },
  3814.  
  3815.     colorSelect: function() {
  3816.  
  3817.       var select = $('<div id="shop2-color-ext-select"><ins></ins></div>');
  3818.       var colors = null;
  3819.       var input = null;
  3820.       $(document.body).append(select);
  3821.  
  3822.       function hide() {
  3823.         if (select.is(':visible')) {
  3824.           select.hide();
  3825.           return true;
  3826.         }
  3827.       }
  3828.  
  3829.       $(document).on('click', hide);
  3830.  
  3831.       $.on('.shop2-color-ext-select', {
  3832.  
  3833.         click: function() {
  3834.  
  3835.           if (hide()) {
  3836.             return;
  3837.           }
  3838.  
  3839.           var wrap = $(this);
  3840.           var ul = wrap.find('.shop2-color-ext-options');
  3841.           var offset = wrap.offset();
  3842.  
  3843.           var html =
  3844.             '<div class="baron-wrapper">' +
  3845.             ' <div class="baron-scroller">' +
  3846.             '   <div class="baron-container">' +
  3847.             '     <div class="shop2-color-ext-options">' +
  3848.             ul.html() +
  3849.             '     </div>' +
  3850.             '   </div>' +
  3851.             '   <div class="baron-scroller-bar"></div>' +
  3852.             ' </div>' +
  3853.             '</div>';
  3854.  
  3855.           colors = ul.children('li');
  3856.           input = wrap.find('input');
  3857.  
  3858.           select.html(html)
  3859.           select.show();
  3860.  
  3861.           var wrapWidth = wrap.width();
  3862.           var selectWidth = select.data('width') || (function() {
  3863.             var width = select.width();
  3864.             select.data('width', width);
  3865.             return width;
  3866.           })();
  3867.  
  3868.           if (wrapWidth > selectWidth) {
  3869.             select.css('width', wrapWidth);
  3870.           } else {
  3871.             select.css('width', selectWidth);
  3872.           }
  3873.  
  3874.           baron(select, {
  3875.             scroller: '.baron-scroller',
  3876.             container: '.baron-container',
  3877.             bar: '.baron-scroller-bar'
  3878.           });
  3879.  
  3880.           select.css(offset);
  3881.  
  3882.           return false;
  3883.  
  3884.         }
  3885.  
  3886.       });
  3887.  
  3888.       $.on('#shop2-color-ext-select li:not(.shop2-color-ext-selected)', {
  3889.         click: function() {
  3890.           var $this = $(this);
  3891.           var index = $this.index();
  3892.           var data = $this.data();
  3893.           $this.addClass('shop2-color-ext-selected').siblings().removeClass('shop2-color-ext-selected');
  3894.           colors.removeClass('shop2-color-ext-selected');
  3895.           colors.eq(index).addClass('shop2-color-ext-selected');
  3896.           if (data.kinds) {
  3897.               shop2.product._reload(colors.get(index));
  3898.           } else {
  3899.             input.val(data.value);
  3900.            
  3901.             if(!$(input).closest('.search-form').length) {
  3902.                if( shop2.cf_margin_price_enabled ){
  3903.                     shop2.margin_price.price_change(input, 'form');
  3904.                };
  3905.             }
  3906.             if ($this.hasClass('js-calc-custom-fields')) {
  3907.                 shop2.product._reload(colors.get(index));
  3908.             }
  3909.           }
  3910.         }
  3911.       });
  3912.          $.on('.js-calc-custom-fields', {
  3913.             change: function() {
  3914.                 var $this = $(this);
  3915.                 shop2.product._reload($this.find(':selected').parent());
  3916.             }
  3917.         });
  3918.         $.on('.shop2-color-ext-list .js-calc-custom-fields:not(select)', {
  3919.             click: function() {
  3920.                 var $this = $(this);
  3921.                 shop2.product._reload($this.parent());
  3922.             }
  3923.         });
  3924.  
  3925.     },
  3926.  
  3927.     coordinates: function() {
  3928.  
  3929.       $(document).on('click', '.shop2-map-link', function(e) {
  3930.         e.preventDefault();
  3931.         var $this = $(this);
  3932.         var data = $this.data();
  3933.         var map = data.map;
  3934.         if (!map.title) {
  3935.           map.title = $this.text();
  3936.         }
  3937.         shop2.maps.alert(data.mapType, map);
  3938.       });
  3939.     },
  3940.  
  3941.     /*restoreOrderForms: function() {
  3942.  
  3943.      var key = 'shop2-order-in-one-page-form';
  3944.      var $form = $('.shop2-order-in-one-page-form');
  3945.  
  3946.      if (!window.sessionStorage || $form.length === 0) {
  3947.      return;
  3948.      }
  3949.  
  3950.      function getValues() {
  3951.      return JSON.parse(sessionStorage.getItem(key));
  3952.      }
  3953.  
  3954.      function setValues() {
  3955.      var values = $form.serializeArray();
  3956.      var filled = [];
  3957.      $.each(values, function() {
  3958.      if (this.value) {
  3959.      filled.push(this);
  3960.      }
  3961.      });
  3962.      sessionStorage.setItem(key, JSON.stringify(filled));
  3963.      }
  3964.  
  3965.      $form.on('change', ':input', setValues);
  3966.  
  3967.      var values = getValues();
  3968.  
  3969.      if (!values) {
  3970.      return;
  3971.      }
  3972.  
  3973.      var hash = {};
  3974.      $.each(values, function() {
  3975.      hash[this.name] = this.value;
  3976.      });
  3977.  
  3978.      if (values) {
  3979.      $form.s3deserializeArray(values);
  3980.      //sessionStorage.removeItem(key);
  3981.      }
  3982.  
  3983.  
  3984.      function afterDeliveryCalc() {
  3985.      var name;
  3986.      var $tarif;
  3987.      name = hash.delivery_id + '[edost][tarif]';
  3988.  
  3989.      if (hash[name]) {
  3990.      $tarif = $form.find('[name="' + name + '"][value="' + hash[name] + '"]').trigger('click').trigger('change');
  3991.      }
  3992.  
  3993.      name = hash.delivery_id + '[edost][office]';
  3994.      if (hash[name] && $tarif) {
  3995.      $tarif.closest('.shop2-edost-variant').find('[name="' + name + '"][value="' + hash[name] + '"]').trigger('click').trigger('change');
  3996.      }
  3997.      }
  3998.  
  3999.      var $edostBtn = $('#shop2-edost-calc');
  4000.      var $edostTo = $('#shop2-edost2-to');
  4001.      var edostToValue = $edostTo.val();
  4002.  
  4003.      if (hash.delivery_id && $edostBtn.is(':visible') && edostToValue && edostToValue != 'default') {
  4004.      shop2.on('afterDeliveryCalc', function() {
  4005.      afterDeliveryCalc();
  4006.      afterDeliveryCalc = $.noop;
  4007.      });
  4008.  
  4009.      $edostBtn.trigger('click');
  4010.      }
  4011.  
  4012.  
  4013.  
  4014.      setValues();
  4015.  
  4016.      },*/
  4017.  
  4018.  
  4019.     fixDoubleOrders: function() {
  4020.  
  4021.       var $form = $('.shop2-order-form, .shop2-order-in-one-page-form');
  4022.       var $submit = $form.find('[type=submit]');
  4023.  
  4024.       $form.on('submit', function() {
  4025.         $submit.prop('disabled', true);
  4026.         setTimeout(function() {
  4027.           $submit.prop('disabled', false);
  4028.         }, 1000);
  4029.       });
  4030.  
  4031.     },
  4032.  
  4033.     paymentMethods: function() {
  4034.  
  4035.       var $types = $('.shop2-payment-type input');
  4036.       var $methods = $('.shop2-payment-methods input');
  4037.  
  4038.  
  4039.       $types.on('change', function() {
  4040.         var $this = $(this);
  4041.         var $method = $this.closest('.shop2-payment-type').next('.shop2-payment-methods').find('input:first');
  4042.         $methods.prop('checked', false);
  4043.         $method.prop('checked', true);
  4044.       });
  4045.  
  4046.       $methods.on('change', function() {
  4047.         var $this = $(this);
  4048.         var $type = $this.closest('.shop2-payment-methods').prev('.shop2-payment-type').find('input:first');
  4049.         $types.prop('checked', false);
  4050.         $type.prop('checked', true);
  4051.       });
  4052.  
  4053.     },
  4054.  
  4055.     auth: function() {
  4056.  
  4057.       $(document).on('click', '.js-shop2-cart-auth__expand', function(e) {
  4058.         e.preventDefault();
  4059.         $('.js-shop2-cart-auth__form').toggle();
  4060.       });
  4061.  
  4062.     }
  4063.  
  4064.   };
  4065.  
  4066.   shop2.cart.applyBonusPoint = function(bonus_points, func) {
  4067.  
  4068.     shop2.trigger('beforeCartApplyBonus');
  4069.  
  4070.     $.getJSON(
  4071.         '/my/s3/xapi/public/?method=cart/applyBonusPoints', {
  4072.             param: {
  4073.                 hash: shop2.hash.cart,
  4074.                 bonus_points: bonus_points
  4075.             }
  4076.         },
  4077.         function(d, status) {
  4078.             shop2.fire('afterCartApplyBonusPoints', func, d, status);
  4079.             shop2.trigger('afterCartApplyBonusPoints', d, status);
  4080.         }
  4081.     );
  4082.  
  4083.     return false;
  4084.   };
  4085.  
  4086.   shop2.cart.removeBonusPoint = function(func) {
  4087.  
  4088.     shop2.trigger('beforeCartRemoveCartBonusPoints');
  4089.  
  4090.     $.getJSON(
  4091.         '/my/s3/xapi/public/?method=cart/RemoveBonusPoints', {
  4092.             param: {
  4093.                 hash: shop2.hash.cart
  4094.             }
  4095.         },
  4096.         function(d, status) {
  4097.             shop2.fire('afterCartRemoveCartBonusPoints', func, d, status);
  4098.             shop2.trigger('afterCartRemoveCartBonusPoints', d, status);
  4099.         }
  4100.     );
  4101.   };
  4102.  
  4103.   shop2.margin_price = {
  4104.       price_change: function(j_this, selector_parent){
  4105.        
  4106.         if( shop2.mode == 'cart' ){
  4107.             form = $('#shop2-cart');
  4108.             shop2.cart.update(form);
  4109.          
  4110.           return;
  4111.         }
  4112.        
  4113.           var
  4114.           $form = $(j_this).closest(selector_parent),
  4115.           form = $form.get(0),
  4116.           kind_id = form.kind_id.value,
  4117.                  
  4118.           adds = $form.find('.additional-cart-params'),
  4119.           len = adds.length,
  4120.           el;
  4121.          
  4122.  
  4123.           var param = {
  4124.               'kind_id': form.kind_id.value,
  4125.               'params': {}
  4126.           }
  4127.          
  4128.           if (len) {
  4129.      
  4130.               for (var i = 0; i < len; i += 1) {
  4131.                   el = adds[i];
  4132.                   if (el.value) {
  4133.                       param.params[el.name] = el.value;
  4134.                   }
  4135.               }
  4136.           }
  4137.           $.ajax({
  4138.             url: '/my/s3/xapi/public/?method=shop2/getPrice',
  4139.         type: "get",
  4140.         data: {"param": param},
  4141.         dataType: "json",
  4142.         success: function(data){
  4143.          
  4144.           $form.find('.price-current').replaceWith( data.result.data.html.price );
  4145.           $form.find('.price-old ').replaceWith( data.result.data.html.price_old );
  4146.         }
  4147.        
  4148.           });
  4149.       },
  4150.       select_change: function(){
  4151.       if( !shop2.cf_margin_price_enabled ){
  4152.           return;
  4153.       }else{
  4154.         $(document).on('click', '.shop2-color-ext-list li', function() {
  4155.           var $this = $(this);
  4156.          
  4157.           setTimeout(function(){
  4158.                   shop2.margin_price.price_change($this, 'form');
  4159.           }, 10)
  4160.         })
  4161.         var additional_cart_params = $('select.additional-cart-params');
  4162.        
  4163.         if( additional_cart_params.length ){
  4164.           $.on('select.additional-cart-params', {
  4165.             change: function(e) {
  4166.               shop2.margin_price.price_change( $( e.target ), 'form');
  4167.             }
  4168.           });
  4169.         }else {
  4170.           return;  
  4171.         }
  4172.       }
  4173.      
  4174.       }
  4175.   };
  4176.   shop2.queue.margin_price = function() {
  4177.     /*
  4178.     if( shop2.mode == 'cart' ){
  4179.       $('.shop2-order-in-one-page-form .shop2-delivery .options-list .option-type').eq( +localStorage.getItem('delivery_item_active') ).find('.option-label').trigger('click').addClass( '.active-type' );
  4180.      
  4181.       $('.shop2-order-in-one-page-form .shop2-delivery .options-list .option-type .option-label').on('click', function(){
  4182.        
  4183.           localStorage.setItem('delivery_item_active',  $('.shop2-order-in-one-page-form .shop2-delivery .options-list .active-type').index() );
  4184.       });
  4185.     }
  4186.     */
  4187.     shop2.margin_price.select_change();
  4188.   };
  4189.  
  4190.   shop2.queue.bonus = function() {
  4191.  
  4192.     shop2.on('afterCartApplyBonusPoints, afterCartRemoveCartBonusPoints', function() {
  4193.         document.location.reload();
  4194.     });
  4195.  
  4196.     $('.bonus-apply').on('click', function(e) {
  4197.         var bonus = $('#bonus-points'),
  4198.             points = Number(bonus.val()),
  4199.             bonus_user = Number($('.bonus-amount').html());
  4200.            
  4201.     switch (true) {
  4202.           case points == "" || points > bonus_user:
  4203.            
  4204.             e.preventDefault();
  4205.            
  4206.           break;  
  4207.           case bonus_user >= points:
  4208.            
  4209.             shop2.cart.applyBonusPoint(points);
  4210.            
  4211.           break;
  4212.         };
  4213.     });
  4214.  
  4215.     $('.bonus-delete').on('click', function(e) {
  4216.         shop2.cart.removeBonusPoint();
  4217.     });
  4218.  
  4219.   $.fn.inputFilter = function(inputFilter) {
  4220.       return this.on("input keydown keyup mousedown mouseup select contextmenu drop", function() {
  4221.         if (inputFilter(this.value)) {
  4222.             this.oldValue = this.value;
  4223.             this.oldSelectionStart = this.selectionStart;
  4224.             this.oldSelectionEnd = this.selectionEnd;
  4225.         } else if (this.hasOwnProperty("oldValue")) {
  4226.             this.value = this.oldValue;
  4227.             this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
  4228.         }
  4229.       });
  4230.     };
  4231.    
  4232.     $("#bonus-points").inputFilter(function(value) {
  4233.       return /^\d*$/.test(value);
  4234.     });
  4235.   };
  4236.  
  4237.   var maps = shop2.maps = {};
  4238.  
  4239.   maps.alert = function(type, params) {
  4240.     shop2.alert('<div id="shop2-alert-map"></div>', 'Закрыть', 'shop2-alert--map');
  4241.     maps[type].ready(function() {
  4242.       maps[type].draw('shop2-alert-map', params);
  4243.     });
  4244.   };
  4245.  
  4246.   maps.getCenter = function(arr) {
  4247.     var x = 0;
  4248.     var y = 0;
  4249.     $.each(arr, function() {
  4250.       x += this.x;
  4251.       y += this.y;
  4252.     });
  4253.  
  4254.   };
  4255.  
  4256.  
  4257.   maps.yandex = {
  4258.     ymaps: window.ymaps,
  4259.     _loading: $.Deferred(),
  4260.     _loading_init: false,
  4261.     _loading_callback: function(ymaps) {
  4262.       this.ymaps = ymaps;
  4263.       this._loading.resolve(ymaps);
  4264.     },
  4265.     ready: function(callback) {
  4266.       this._loading.done(callback);
  4267.       if (this.ymaps) {
  4268.         this._loading.resolve(this.ymaps);
  4269.         return;
  4270.       }
  4271.       if (!this._loading_init) {
  4272.         $('head').append('<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&onload=shop2.maps.yandex._loading_callback&apikey=' + shop2.maps_yandex_key +'" type="text/javascript">');
  4273.         this._loading_init = true;
  4274.       }
  4275.     },
  4276.     draw: function(id, point) {
  4277.       point = $.extend({}, point);
  4278.       point.title = $.s3escape(point.title);
  4279.       point.text = $.s3escape(point.text);
  4280.  
  4281.       var map = new this.ymaps.Map(id, {
  4282.         zoom: point.z,
  4283.         center: [point.x, point.y],
  4284.         behaviors: ['drag', 'rightMouseButtonMagnifier', 'scrollZoom']
  4285.       });
  4286.  
  4287.       var MyBalloonContentLayoutClass = this.ymaps.templateLayoutFactory.createClass(
  4288.         '<div class="shop2-map-baloon-content">' +
  4289.         '<h3>$[properties.title]</h3>' +
  4290.         '$[properties.text]' +
  4291.         '</div>'
  4292.       );
  4293.       var placemark = new self.ymaps.Placemark([point.x, point.y], point, {
  4294.         balloonContentLayout: MyBalloonContentLayoutClass
  4295.       });
  4296.        
  4297.       map.geoObjects.add(placemark);
  4298.     }
  4299.   };
  4300.  
  4301.  
  4302.   maps.google = {
  4303.     gmaps: window.google && window.google.maps ? window.google.maps : false,
  4304.     _loading: $.Deferred(),
  4305.     _loading_init: false,
  4306.     _loading_callback: function() {
  4307.       try {
  4308.         this.gmaps = window.google.maps;
  4309.         this._loading.resolve(this.gmaps);
  4310.       } catch (e) {
  4311.         console.log(e);
  4312.       }
  4313.     },
  4314.     ready: function(callback) {
  4315.       this._loading.done(callback);
  4316.       if (this.gmaps) {
  4317.         this._loading.resolve(this.gmaps);
  4318.         return;
  4319.       }
  4320.       if (!this._loading_init) {
  4321.       $('head').append('<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&callback=shop2.maps.google._loading_callback&key=' + shop2.maps_google_key + '" type="text/javascript">');
  4322.         this._loading_init = true;
  4323.       }
  4324.     },
  4325.     draw: function(id, point) {
  4326.       var map = new this.gmaps.Map(document.getElementById(id), {
  4327.         zoom: Number(point.z),
  4328.         center: new google.maps.LatLng(point.x, point.y)
  4329.       });
  4330.       var marker = new google.maps.Marker({
  4331.         position: new google.maps.LatLng(point.x, point.y),
  4332.         map: map,
  4333.         title: point.title
  4334.       });
  4335.       var infowindow = new google.maps.InfoWindow({
  4336.         content: '<div class="shop2-map-baloon-content">' +
  4337.           '<h3>' + $.s3escape(point.title) + '</h3>' +
  4338.           $.s3escape(point.text) +
  4339.           '</div>'
  4340.       });
  4341.       this.gmaps.event.addListener(marker, 'click', function() {
  4342.         infowindow.open(map, marker);
  4343.       });
  4344.     }
  4345.   };
  4346.  
  4347.  
  4348.   $(window).on('load', function() {
  4349.     shop2.queue.heights();
  4350.     shop2.product.productDatePicker();
  4351.   });
  4352.  
  4353.   self.shop2 = shop2;
  4354.  
  4355.   $(function() {
  4356.     var isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|Opera Mini/i.test(navigator.userAgent),
  4357.       clickStart = (isMobile) ? 'touchend.respons' : 'click.respons';
  4358.  
  4359.  
  4360.     $('.personal-html-btn, .close-btn').on(clickStart, function(e) {
  4361.       e.preventDefault();
  4362.       $('.personal-html-content').toggleClass('active');
  4363.     });
  4364.    
  4365.    
  4366.     $(document).on('click','.btn_payment_rest', function(){
  4367.       $('.shop2-order-options-wrapper').slideToggle();
  4368.     });
  4369.    
  4370.  
  4371.     $(document).on(clickStart, function(event) {
  4372.       if ($(event.target).closest('.personal-html-content-in, .personal-html-btn').length) return;
  4373.       $('.personal-html-content').removeClass('active');
  4374.     });
  4375.     $(this).keydown(function(eventObject) {
  4376.       if (eventObject.which == 27) {
  4377.         $('.personal-html-content').removeClass('active');
  4378.       }
  4379.     });
  4380.    
  4381.    
  4382.     $(document).on('click', '#shop2-color-ext-select li', function(){
  4383.         if (shop2.facets.enabled) {
  4384.             setTimeout(function(){
  4385.                 var url = '/my/s3/api/shop2/?cmd=getSearchMatches&hash=' +
  4386.                     shop2.apiHash.getSearchMatches +
  4387.                     '&ver_id=' + shop2.verId + '&',
  4388.                     fullUrl = url + $(shop2.facets.search.wrapper).serialize();
  4389.                
  4390.                 shop2.facets.getDataSearch(fullUrl);
  4391.             }, 100);
  4392.         };
  4393.     });
  4394.    
  4395.     $(document.body).on('change','.shop2-block.search-form #shop2_search_custom_fields select, .shop2-block.search-form #shop2_search_custom_fields input',function(){
  4396.         if (shop2.facets.enabled) {
  4397.             setTimeout(function(){
  4398.                 var url = '/my/s3/api/shop2/?cmd=getSearchMatches&hash=' +
  4399.                     shop2.apiHash.getSearchMatches +
  4400.                     '&ver_id=' + shop2.verId + '&',
  4401.                     fullUrl = url + $(shop2.facets.search.wrapper).serialize();
  4402.                
  4403.                 shop2.facets.getDataSearch(fullUrl);
  4404.             }, 100);
  4405.         };
  4406.     });
  4407.    
  4408.   });
  4409.  
  4410. })(jQuery, window);
Tags: shop2.2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement