valeraplusplus

shop2.2.js Наценка на доп поля

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