PageSourceSearch

https://tv-01.ru/design/main.js?design=conditer&lc=1764602888

js tv-01.ru collected 2026-10-08 14:14:59 UTC 146,423 bytes, 3,264 lines download raw bytes

1// Lazy loads elements with default selector as '.lozad'
2$(function(){
3  lozad().observe();
4})
5// Fancybox default
6$.fancybox.defaults.lang = "ru";
7$.fancybox.defaults.i18n = {
8    ru: {
9        CLOSE: "Закрыть",
10        NEXT: "Вперёд",
11        PREV: "Назад",
12        ERROR: "Контент не может быть загружен. <br/> Пожалуйтста попробуйте ещё раз.",
13        DOWNLOAD: "Скачать",
14        SHARE: "Поделиться",
15        ZOOM: "Увеличить"
16    }
17};
18$.fancybox.defaults.wheel = false;
19$.fancybox.defaults.smallBtn = true;
20$.fancybox.defaults.animationEffect = 'fade';
21$.fancybox.defaults.transitionEffect = false;
22$.fancybox.defaults.hideScrollbar = true;
23$.fancybox.defaults.toolbar = false;
24$.fancybox.defaults.infobar = false;
25$.fancybox.defaults.touch = false;
26$.fancybox.defaults.buttons = [
27    "close"
28]
29// Noty default
30Noty.overrideDefaults({
31  layout: "bottomCenter",
32  theme: 'sunset',
33  timeout: "3000",
34  killer: true,
35  progressBar: true,
36  animation: {
37    open: 'animated slideInUp', 
38    close: 'animated slideOutDownNew'
39  }
40});
41// jQuery Validation Plugin
42$(function(){
43  $.validator.setDefaults({
44    errorPlacement: function(error, element) {
45      error.insertAfter(element);
46    }
47  });
48})
49// Owl carousel default
50var OWL_DEFAULT = {
51    autoWidth: true,
52    smartSpeed: 500,
53    loop: false,
54    lazyLoad: true,
55    margin: 12,
56    dots: false,
57    nav: false,
58    navText: ['<span class="owl-icon-wrap"><svg class="owl-icon owl-prev-icon icon"><use xlink:href="/design/sprite.svg#arrow"></use></svg></span>', '<span class="owl-icon-wrap"><svg class="owl-icon owl-next-icon icon"><use xlink:href="/design/sprite.svg#arrow"></use></svg></span>'],
59    mouseDrag: true,
60    touchDrag: true,
61    pullDrag: true,
62}
63// Возвращает правильное окончание для слова
64function genWordEnd(num, e, m, mm) {
65  // Если забыли указать окончания
66  if(typeof (e) == "undefined") { e = ''; }
67  if(typeof (m) == "undefined") { e = 'а'; }
68  if(typeof (mm) == "undefined"){ e = 'oв'; }
69  // Если передали пустую строку, вместо цифры
70  if(0 == num.length) { num = 0; }
71  // Превращаем цифру в правильный INT
72  num = GetSum(num).toString();
73  // Получаем последний символ цифры
74  ch1 = num.substring(num.length-1);
75  // Получаем последний символ цифры
76  ch2 = num.length == 1 ? 0 : num.substring(num.length-2, num.length-1);
77  // Если последняя цифра - 1, вернем единственное число
78  if(ch2!=1 && ch1==1)               {return e;}
79  // Если последняя цифра - от 2 до 4х , вернем множественное чило из массива с индексом 2
80  else if(ch2!=1 && ch1>1 && ch1<=4) {return m;}
81  // Если последняя цифра - от 5 до 0 , вернем множественное чило из массива с индексом 3
82  else if(ch2==1 || ch1>4 || ch1==0) {return mm;}
83}
84
85// Считает сумму  33 599,65 + 2000 - 1910-41,6
86function GetSum(val,precision) {
87  if(typeof (precision) == "undefined" || precision < 0) { precision = 0; }
88  // Возводим в степень точности 10 для округления
89  var p = Math.pow(10,precision);  
90  try {return Math.round(parseFloat(eval(val.toString().replace(/\s/gi, "").replace(/,/gi, ".")))*p)/p;} catch (e) {return 0;}
91}
92
93// Форматирует цену
94function number_format(n,e,t,r){var i=n,a=e,o=function(n,e){var t=Math.pow(10,e);return(Math.round(n*t)/t).toString()};i=isFinite(+i)?+i:0,a=isFinite(+a)?Math.abs(a):0;var u,d,f="undefined"==typeof r?",":r,h="undefined"==typeof t?".":t,l=a>0?o(i,a):o(Math.round(i),a),s=o(Math.abs(i),a);s>=1e3?(u=s.split(/\D/),d=u[0].length%3||3,u[0]=l.slice(0,d+(0>i))+u[0].slice(d).replace(/(\d{3})/g,f+"$1"),l=u.join(h)):l=l.replace(".",h);var c=l.indexOf(h);return a>=1&&-1!==c&&l.length-c-1<a?l+=new Array(a-(l.length-c-1)).join(0)+"0":a>=1&&-1===c&&(l+=h+new Array(a).join(0)+"0"),l}
95// Добавляет пробел 1000 -> 1 000  /  10000 -> 10 000 
96function addSpaces(nStr){
97  if(typeof nStr == 'number'){
98	  nStr = String(nStr);
99  }
100
101  return nStr.replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ')
102} 
103// Проверка вводимых значений в количестве товара
104function keyPress(oToCheckField, oKeyEvent) {
105  return oKeyEvent.charCode === 0 || /\d/.test(String.fromCharCode(oKeyEvent.charCode));
106}
107
108// Функция определения ширины экрана пользователя
109function getClientWidth() {return document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientWidth:document.body.clientWidth;}
110
111// Работа с cookie файлами. 
112// Получение переменной из cookie
113function getCookie(name) {
114  var matches = document.cookie.match(new RegExp(
115    "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
116  ));
117  return matches ? decodeURIComponent(matches[1]) : undefined;
118}
119
120// Установка переменной в cookie
121function setCookie(name, value, options) {
122  options = options || {};
123  var expires = options.expires;
124  if (typeof expires == "number" && expires) {
125    var d = new Date();
126    d.setTime(d.getTime() + expires*1000);
127    expires = options.expires = d;
128  }
129  if (expires && expires.toUTCString) { 
130    options.expires = expires.toUTCString();
131  }
132  value = encodeURIComponent(value);
133  var updatedCookie = name + "=" + value;
134  for(var propName in options) {
135    updatedCookie += "; " + propName;
136    var propValue = options[propName];    
137    if (propValue !== true) {
138      updatedCookie += "=" + propValue;
139    }
140  }
141  document.cookie = updatedCookie;
142}
143
144// Удаление переменной из cookie
145function deleteCookie(name, options ) {
146  options = options || {};
147  options.expires = -1;
148  setCookie(name, "", options)
149}
150
151// Отправляет ошибку на сервер, для того чтобы служба тех поддержки могла разобраться в проблеме как можно быстрее.
152function sendError (desc, page, line) {
153  var img=document.createElement('img');
154  img.src = 'https://storeland.ru/error/js?desc='+encodeURIComponent(desc)+'&page='+encodeURIComponent(window.location)+'&line=0';
155  img.style.position = 'absolute';
156  img.style.top = '-9999px';
157  try { document.getElementsByTagName('head').appendChild(img) } catch (e){}
158  return false;
159}
160
161// Превращает поле пароля в текстовое поле и обратно
162// @LinkObject - ссылка по которой кликнули
163// @InputObject - объект у которого нужно изменить тип поля
164function ChangePasswordFieldType (LinkObject, InputObject) {
165  var 
166    // Ссылка по которой кликнули
167    LObject = $(LinkObject),
168    // Объект у которого изменяем тип с password на text
169    IObject = $(InputObject),
170    // Старый текст ссылки
171    txtOld = LObject.html(),
172    // Новый текст ссылки
173    txtNew = LObject.attr('rel');
174  // Если объекты не получены, завершим работу функции
175  if( LObject.length==0 || IObject.length==0 ) {
176    return false;
177  }
178  // Изменяем у ссылки текст со старого на новый
179  LObject.html(txtNew);
180  // Старый текст ссылки сохраняем в атрибуте rel 
181  LObject.attr('rel', txtOld);
182  // Изменяем тип input поля
183  if(IObject[0].type == 'text') {
184    IObject[0].type = 'password';
185  } else {
186    IObject[0].type = 'text';
187  }
188}
189
190// Крутит изображение при обновлении картинки защиты от роботов
191function RefreshImageAction(img,num,cnt) {
192  if(cnt>13) { return false; }
193  $(img).attr('src', $(img).attr('rel') + 'icon/refresh/' + num + '.gif');
194  num = (num==6)?0:num;
195  setTimeout(function(){RefreshImageAction(img, num+1, cnt+1);}, 50);
196}
197
198// Добавление в сравнение и избранное
199function addTo() {
200  // Добавление/удаление товара на сравнение/избранное через ajax
201  $('.add-compare').off('click').on('click',function(){
202    // Объект ссылки, по которой кликнули
203    var 
204      a = $(this)
205      ,addUrl = a.attr('data-action-add-url')
206      ,delUrl = a.attr('data-action-delete-url')
207      ,addTitle = a.attr('data-action-add-title')
208      ,delTitle = a.attr('data-action-delete-title')
209      ,isAdd = a.attr('data-action-is-add')
210      ,pName = a.attr('data-prodname')
211      ,pImage = a.attr('data-prodimage')
212      ,pPrice = a.attr('data-mod-id-price')
213      ,pUrl = a.attr('data-produrl')
214      ,pDataid = a.attr('data-id')
215      ,pDataprice = a.attr('data-mod-id')
216      ,pDataGoodsid = a.attr('data-goodsid')
217      ,defText = a.attr('data-default-text')
218      ,addText = a.attr('data-add-text')
219      ,addTooltip = a.attr('data-add-tooltip')
220      ,delTooltip = a.attr('data-del-tooltip')
221      requestUrl = a.attr('href')
222    ;
223    var flag = 0;
224    $('#compare-items li.item').each(function(){   
225      if($(this).attr('data-id') == pDataid){  
226      flag = 1;
227      }
228      if(flag == 1){
229        $(this).remove();
230        return false;
231      }
232      return flag;
233    });
234    $('.compare #compare-items .empty').hide();
235    $('.compare #compare-items .actions').show();
236    
237    // Если в ссылке присутствует идентификатор, который мы можем узнать только вытащив его с текущей страницы
238    if( /GET_GOODS_MOD_ID_FROM_PAGE/.test(requestUrl)) {
239      requestUrl = requestUrl.replace(new RegExp('GET_GOODS_MOD_ID_FROM_PAGE'), $('.goodsDataMainModificationId').val());
240    }
241    
242    // Если есть информация о том какие URL адреса будут изменены, то можено не перегружать страницу и сделать запрос через ajax
243    if(addUrl && delUrl) {
244      $.ajax({
245        type : "POST",
246        dataType: 'json',
247        cache : false,
248        url : requestUrl,
249        data : {
250          'ajax_q': 1
251        },
252        success: function(data) {
253          if(flag == 0){   
254            $('#compare-items .compare-items-list').prepend(
255                "<li class=\"item\" data-id=\"" + pDataid +  "\">" +
256                    "<a data-href=\"" + delUrl + "?id=" + pDataprice + "\" data-goods-mod-id=\"" + pDataprice + "\" class=\"remove item-remove\" title=\"Убрать товар из списка сравнения\" onclick=\"removeFromCompare($(this))\"></a>" +
257                    "<a href=\"" + pUrl + "\" title=\"" + pName + "\" class=\"product-image\">" + 
258                      "<img src=\"" + pImage + "\" alt=\"" + pName + "\" class=\"goods-image-icon\">" +
259                    "</a>" + 
260                    "<div class=\"product-details\">" + 
261                      "<p class=\"product-name\">" + 
262                        "<a href=\"" + pUrl + "\" title=\"" + pName + "\">" + pName + "</a>" +
263                      "</p>" + 
264                      "<span class=\"price RUB\" data-price=\"" + pPrice + "\"><span><span class=\"num\">" + addSpaces(String(pPrice)) + "&nbsp;</span></span></span>"+
265                    "</div>"+
266                "</li>"
267              );
268          }
269          if('ok' == data.status) {
270            if(isAdd == 1) {
271              var 
272                from = addUrl
273                ,to = delUrl
274                ,newIsAddStatus = 0
275                ,newTitle = delTitle ? delTitle : ''
276                ,newTooltip = delTooltip ? delTooltip : ''
277              ;
278              a.addClass('_added');
279              a.find('span').text(addText)
280            } else {
281              var 
282                from = delUrl
283                ,to = addUrl
284                ,newIsAddStatus = 1
285                ,newTitle = addTitle ? addTitle : ''
286                ,newTooltip = addTooltip ? addTooltip : ''
287              ;
288              a.removeClass('_added');
289              a.find('span').text(defText)
290            }
291            
292            // Если указано, что изменилось число товаров на сравнении
293            if(typeof(data.compare_goods_count) != 'undefined') {
294              // Блок информации о том, что есть товары на сравнении
295              var sidecount = $('.compare-header .compare-header__counter .num');
296              // Если на сравнении больше нет товаров
297              // Указываем информацию о новом количестве товаров на сравнении
298              // Блок обновления списка сравнения в каталога
299              sidecount.animate({opacity: 0,display: "none"},500,function(){
300              sidecount.text(data.compare_goods_count);                 
301                if(data.compare_goods_count > 0){
302                  $('.compare').addClass('have-items');
303                  $('.compare #compare-items .empty').hide();
304                  $('.compare #compare-items .actions').show();              
305                }else{
306                  $('.compare').removeClass('have-items');
307                  $('.compare #compare-items .empty').show();
308                  $('.compare #compare-items .actions').hide();               
309                }
310              }).animate({display: "inline",opacity: 1} , 500 );
311            }
312            
313            // Обновляем ссылку, на которую будет уходить запрос и информацию о ней
314            a.attr('href', a.attr('href').replace(new RegExp(from), to))
315             .attr('title', newTitle)
316             .attr('data-tooltip', newTooltip)
317             .attr('data-action-is-add', newIsAddStatus);
318          }
319          
320          var msgType = ('ok' == data.status) ? 'success' : 'error';
321          var message = ('ok' == data.status) ? data.message.replace('сравнения', '<a href="/compare" class="underline">сравнения</a>') : data.message;
322          // Если есть функция, которая отображает сообщения пользователю
323          if(typeof(Noty) == "function") {
324            new Noty({
325              text: message,
326              type: msgType,
327              timeout: "2000"             
328            }).show();                
329          }
330
331        }
332      });
333      return false;
334    }
335  });
336
337  // Добавление/удаление товара на сравнение/избранное через ajax
338  $('.add-wishlist').off('click').on('click',function(){
339    // Объект ссылки, по которой кликнули
340    var 
341      a = $(this)
342      ,addUrl = a.attr('data-action-add-url')
343      ,delUrl = a.attr('data-action-delete-url')
344      ,addTitle = a.attr('data-action-add-title')
345      ,delTitle = a.attr('data-action-delete-title')
346      ,isAdd = a.attr('data-action-is-add')
347      ,aText = a.parent().find('.add-wishlist')
348      ,pName = a.attr('data-prodname')
349      ,pImage = a.attr('data-prodimage')
350      ,pUrl = a.attr('data-produrl')
351      ,pDataid = a.attr('data-id')
352      ,pDataprice = a.attr('data-mod-id')
353      ,pPrice = a.attr('data-mod-id-price')
354      ,pDataGoodsid = a.attr('data-goodsid')
355      ,defText = a.attr('data-default-text')
356      ,addText = a.attr('data-add-text')      
357      ,addTooltip = a.attr('data-add-tooltip')
358      ,delTooltip = a.attr('data-del-tooltip')
359      requestUrl = a.attr('href')
360    ;
361    var flag = 0;
362    $('#favorites-items li').each(function(){       
363      if($(this).attr('data-id') == pDataid){  
364      flag = 1;
365      }
366      if(flag == 1){
367        $(this).remove();
368        return false;
369      }
370      return flag;
371    });
372
373    
374    // Если в ссылке присутствует идентификатор, который мы можем узнать только вытащив его с текущей страницы
375    if( /GET_GOODS_MOD_ID_FROM_PAGE/.test(requestUrl)) {
376      requestUrl = requestUrl.replace(new RegExp('GET_GOODS_MOD_ID_FROM_PAGE'), $('.goodsDataMainModificationId').val());
377    }
378    
379    // Если есть информация о том какие URL адреса будут изменены, то можено не перегружать страницу и сделать запрос через ajax
380    if(addUrl && delUrl) {
381      $.ajax({
382        type : "POST",
383        dataType: 'json',
384        cache : false,
385        url : requestUrl,
386        data : {
387          'ajax_q': 1
388        },
389        success: function(data) {
390          if(data.status != 'error'){
391            $('.favorites #favorites-items .empty').hide();
392            $('.favorites #compare-items .actions').show();            
393          }
394          
395          if(flag == 0 && data.status != 'error'){   
396            $('#favorites-items .favorites-items-list').prepend(
397              "<li class=\"item\" data-id=\"" + pDataid +  "\">" + 
398                "<a data-href=\"" + delUrl + "?id=" + pDataprice + "\" data-goods-mod-id=\"" + pDataprice + "\" class=\"remove item-remove\" title=\"Убрать товар из списка сравнения\" onclick=\"removeFromFavorites($(this))\"></a>"+
399                "<a href=\"" + pUrl + "\" title=\"" + pName + "\" class=\"product-image\">"+
400                  "<img src=\"" + pImage + "\" alt=\"" + pName + "\" class=\"goods-image-icon\">"+
401                "</a>"+
402                "<div class=\"product-details\">"+
403                  "<p class=\"product-name\">"+
404                    "<a href=\"" + pUrl + "\" title=\"" + pName + "\">" + pName + "</a>"+
405                  "</p>"+
406                  "<span class=\"price RUB\" data-price=\"" + pPrice + "\"><span><span class=\"num\">" + addSpaces(String(pPrice)) + "&nbsp;</span></span></span>"+
407                "</div>"+
408              "</li>"
409            );
410          }
411          if('ok' == data.status) {
412            if(isAdd == 1) {
413              var 
414                from = addUrl
415                ,to = delUrl
416                ,newIsAddStatus = 0
417                ,newTitle = delTitle ? delTitle : ''
418                ,newTooltip = delTooltip ? delTooltip : ''
419              ;
420              a.addClass('_added');
421              a.find('span').text(addText)
422            } else {
423              var 
424                from = delUrl
425                ,to = addUrl
426                ,newIsAddStatus = 1
427                ,newTitle = addTitle ? addTitle : ''
428                ,newTooltip = addTooltip ? addTooltip : ''
429              ;
430              a.removeClass('_added');
431              a.find('span').text(defText)
432            }
433            
434            // Если указано, что изменилось число товаров на сравнении
435            if(typeof(data.favorites_goods_count) != 'undefined') {
436              // Блок информации о том, что есть товары на сравнении
437              var sidecount = $('.favorites-header .favorites-header__counter .num');
438              // Если на сравнении больше нет товаров
439              // Указываем информацию о новом количестве товаров на сравнении
440              // Блок обновления списка сравнения в каталога
441              sidecount.animate({opacity: 0,display: "none"},500,function(){
442              sidecount.text(data.favorites_goods_count);                 
443                if(data.favorites_goods_count > 0){
444                  $('.favorites').addClass('have-items');
445                  $('.favorites #favorites-items .empty').hide();
446                  $('.favorites #favorites-items .actions').show();                     
447                }else{
448                  $('.favorites').removeClass('have-items');
449                  $('.favorites #favorites-items .empty').show();
450                  $('.favorites #favorites-items .actions').hide();                   
451                }
452              }).animate({display: "inline",opacity: 1} , 500 );
453            }
454            
455            // Обновляем ссылку, на которую будет уходить запрос и информацию о ней
456            a.attr('href', a.attr('href').replace(new RegExp(from), to))
457             .attr('title', newTitle)
458             .attr('data-tooltip', newTooltip)
459             .attr('data-action-is-add', newIsAddStatus);
460          }
461          
462          var msgType = ('ok' == data.status) ? 'success' : 'error';
463          var message = ('ok' == data.status) ? data.message.replace('избранное', '<a href="/user/favorites" class="underline">избранное</a>') : data.message;
464          // Если есть функция, которая отображает сообщения пользователю
465          if(typeof(Noty) == "function") {
466            new Noty({
467              text: message,
468              type: msgType,
469              timeout: "2000"             
470            }).show();                
471          }
472          
473        }
474      });
475      return false;
476    }
477  });
478}
479// Сравнение товаров
480function comparePage(){
481  // Сравнение товаров. Инвертирование свойств для сравнения товара
482  $('.CompareCheckbox.invert').on('click',function(){
483    var checked = true,
484    checkboxes = $('.CompareCheckbox:not(.invert)');
485    checkboxes.each(function(){
486      if($(this).attr('checked')) {
487        checked = false;
488        return false;
489      }
490    });
491    checkboxes.each(function(){
492      $(this).attr('checked', checked);
493    });
494    $(this).attr('checked', checked);
495  });
496  
497  // Сравнение товаров. Скрытие характеристик товара, которые выделил пользователь
498  $('.CompareGoodsHideSelected').on('click',function(){
499    $('.CompareGoodsTableTbodyComparisonLine').each(function(){
500      var CheckedCheckbox = $(this).find('.CompareCheckbox:checked:not(.invert)');
501      if(CheckedCheckbox.length>0) {
502        $(this).hide();
503      }
504    });
505    // отменяем выделение характеристик товаров
506    $('.CompareCheckbox').attr('checked',false);
507    return false;
508  });
509  
510  // Сравнение товаров. Скрытие характеристик товара, которые выделил пользователь
511  $('.CompareGoodsHideSelected').on('click',function(){
512    $('.CompareGoodsShowAll').show();
513    $('.CompareGoodsTableTbodyComparisonLine').each(function(){
514      var CheckedCheckbox = $(this).find('.CompareCheckbox:checked:not(.invert)');
515      if(CheckedCheckbox.length>0) {
516        $(this).hide();
517      }
518    });
519    // отменяем выделение характеристик товаров
520    $('.CompareCheckbox').attr('checked',false);
521    return false;
522  });
523  
524  // Сравнение товаров. Отображение скрытых характеристик товара
525  $('.CompareGoodsShowAll').on('click',function(){
526    $(this).hide();
527    $('.CompareGoodsTableTbodyComparisonLine:hidden').show();
528    return false;
529  });
530  
531  // Сравнение товаров. Верхняя навигация изменение фильтра на отображение всех характеристик товаров
532  $('.CompareGoodsTableFilterShowAll').on('click',function(){
533    $('.CompareGoodsTableFilterSelected').removeClass('CompareGoodsTableFilterSelected');
534    $('.CompareGoodsTableTbodyComparisonLine:hidden').show();
535    $(this).addClass('CompareGoodsTableFilterSelected');
536    return false;
537  });
538
539  // Сравнение товаров. Фильтр в верхней навигации. Отображение только различающихся характеристик товара
540  $('.CompareGoodsTableFilterShowOnlyDifferent').on('click',function(){
541    $('.CompareGoodsTableFilterSelected').removeClass('CompareGoodsTableFilterSelected');
542    $('.CompareGoodsTableTbodyComparisonLine:not(.same)').show();
543    $('.CompareGoodsTableTbodyComparisonLine.same').hide();
544    $(this).addClass('CompareGoodsTableFilterSelected');
545    return false;
546  });
547  
548  // При клике по строке выделяем свойство
549  $('.CompareGoodsTableTbodyComparisonLine td:not(.cell)').on('click',function(){
550    var CompareCheckbox = $(this).parent().find('.CompareCheckbox');
551    if(CompareCheckbox.attr('checked')) {
552      CompareCheckbox.attr('checked', false);
553    } else {
554      CompareCheckbox.attr('checked', true);
555    }
556  });
557  
558  function compareGetVars () {
559    return new Array(
560      $('.CompareGoodsTableTbody tr:first td').length - 1,
561      parseInt($('.CompareGoodsTableTbody tr:first td:visible:not(.cell)').attr('class').replace(new RegExp('compare\-td compare\-td\-'), '')),
562      parseInt($('.CompareGoodsTableTbody tr:first td:visible:last').attr('class').replace(new RegExp('compare\-td compare\-td\-'), ''))
563    );
564  }
565  
566  // Прокрутка списка сравнения вправо
567  $('.CompareGoodsTableNext').on('click',function(){
568    // Определяем используемые поля
569    var data = compareGetVars(); 
570    // Изменяем их если это возможно.
571    if(data[0] > data[2]) {
572      $('.compare-td-' + data[1]).hide();
573      $('.compare-td-' + (data[2] + 1)).show();
574      if((data[2] + 1) >= data[0]) {
575        $(this).addClass('disable');
576      }
577      if(data[1] + 1 != 1) {
578        $('.CompareGoodsTablePrev').removeClass('disable');
579      }
580    }
581    return false;
582  });
583  
584  // Прокрутка списка сравнения влево
585  $('.CompareGoodsTablePrev').on('click',function(){
586    // Определяем используемые поля
587    var data = compareGetVars(); 
588    // Изменяем их если это возможно.
589    if(1 < data[1]) {
590      $('.compare-td-' + (data[1] - 1)).show();
591      $('.compare-td-' + data[2]).hide();
592      if((data[1] - 1) <= 1) {
593        $(this).addClass('disable');
594      }
595      if(data[2] - 1 != data[0]) {
596        $('.CompareGoodsTableNext').removeClass('disable');
597      }
598    }
599    return false;
600  });
601}
602
603// Показать/скрыть пароль
604$(function(){
605  $('.show-password').on('click', function(){
606    ChangePasswordFieldType(this, $('#sites_client_pass'));
607    return false;
608  });   
609});
610
611// Основные функции
612function mainFunctions() {
613  // Вызов функции быстрого заказа в корзине
614  $('#startOrder, #startOrderTab').on('click', function() {
615    startOrder();
616    return false;
617  });
618  // Валидация формы на странице оформления заказа, а так же формы на страницы связи с администрацией
619  $("#order-stage-form, .feedback-form, .subscribe-footer__form, .clientForm, .form").validate();  
620  $('.subscribe .subscribe__form').validate()
621  $('.callback-form').validate()
622  $('.offer-form').validate()
623  // Возврашаем пользователя на страницу с которой был сделан обратный звонок
624  $('.callbackredirect').val(document.location.href);
625  // Прокрутка до обратного звонка
626  $('.callback-link').on('click',function(e){
627     e.preventDefault();
628     
629     $scrollBlock = $('#offer');
630     
631     if($scrollBlock.length){
632      var offsetTop = $scrollBlock.offset().top
633      
634      $('html, body').animate({scrollTop: offsetTop}, 500, function () {
635        setTimeout(function() {
636          $('#offerForm_person').focus();
637        }, 0)
638      })
639     }
640  })
641  // AJAX обратные звонки
642  $('.subscribe .subscribe__form, .callback-form, .offer-form, .subscribe-footer .subscribe-footer__form').on('submit', function(e){
643    e.preventDefault();
644    
645    var $form = $(this);
646    var url = $form.prop('action');
647    var formData = $form.serializeArray();
648    formData.push({name: 'ajax_q', value: 1});
649    formData.push({name: 'only_body', value: 1});
650    
651    if($form.valid()){
652      $.getJSON(url, formData, function(d){
653        var notyText = (d.status == 'ok') ? d.message : 'Произошла ошибка, попробуйте ещё раз';
654        var notyType = (d.status == 'ok') ? 'success' : 'error';
655        
656        new Noty({
657          text: '<div class="noty_content">'+ notyText +'</div>',
658          type: notyType
659        }).show()
660        
661        if(d.status == 'ok'){
662          $form[0].reset();
663        }
664      })
665    }
666    
667  })
668  // Добавление товара в корзину
669  $(document).on('click', '.button._add-cart:not(.quickview)', function() {
670    var $btn  = $(this);
671    $btn.addClass('_loading')
672    if($btn.hasClass('_cart-page')) {
673      return true;
674    }
675    if(!$btn.hasClass('_quick') || $btn.hasClass('_product-view-quick')) {
676      $btn.find('span').html('<span class="lds-ellipsis"><span></span><span></span><span></span><span></span></span>')
677    }
678    if($btn.closest('._min-card').length){
679      $btn.addClass('_animated')
680    }
681    var form = $(this).closest('form');
682    if ($(this).hasClass('_quick')) {
683      form.attr('rel', 'quick');
684    } else {
685      var rel = form.attr('rel');
686      if (rel) {
687        form.attr('rel', rel.replace('quick', ''));
688      }
689    }
690    form.trigger('submit');
691    return (false);
692  })
693  
694  // Отправка формы по Ctrl+Enter
695  $('form').bind('keypress', function(e){
696    if((e.ctrlKey) && ((e.which==10)||(e.which==13))) {$(this).submit();}
697  // Отправка данных формы по нажатию на Enter в случае если курсор находится в input полях (В некоторых браузерах при нажатии по enter срабатывает клик по первому submit полю, которое является кнопкой назад. Для этого написан этот фикс)
698  }).find('input').bind('keypress', function(e){
699    if(((e.which==10)||(e.which==13))) { try{$(this.form).submit();} catch(e){} return false; }
700  });
701  // Кнопки открывающие меню
702  $('.header .header-mobile__button, .catalog-button').on('click',function(e){
703    e.preventDefault();
704    $('.header-content').addClass('_active');
705    // $('body').addClass('modal-open');
706
707    var id = $(this).data('target');
708    if (id){      
709      $('#' + id).addClass('_visible');
710      $('.header-content__button[data-target="' + id +'"]').addClass('_active')
711    }
712  })
713// Кнопки закрывающие меню
714  $('.header .header-content__button-close, .header-content .header-content__overlay').on('click',function(e){
715    e.preventDefault();
716    $('.header-content').removeClass('_active');
717    // $('body').removeClass('modal-open');
718    $('.header-content__item').removeClass('_visible');
719    $('.header-content__button').removeClass('_active');
720  })
721  $('.header-content__nav').on('click', '.header-content__button', function(){
722    var $btn = $(this);
723    var id = $btn.data('target');
724    
725    if($btn.hasClass('_active')){
726      return;
727    }
728    $btn
729      .toggleClass('_active')
730      .siblings('.header-content__button')
731      .removeClass('_active');
732      
733    $btn.closest('.header-content')
734      .find('.header-content__item')
735      .removeClass('_visible')
736      .filter('[id="'+ id +'"]')
737      .addClass('_visible')
738  })
739  // Дополнительные пункты меню в шапке
740  function headerMenu(){
741    var overMenuExist = $('.overflowMenu li').length;
742    if(overMenuExist){
743     $('.overflowMenu li').removeClass('mainnav__replaced');
744     $('.mainnav .mainnav__more').remove();
745     $('.overflowMenu li').each(function(){
746       $('.mainnav .header-nav__list').append($(this));
747     })
748    }
749    $('.header-nav').addClass('mainnav')
750    menuWidth = $('.mainnav').width();
751    menuCount = $('.header-nav .header-nav__item').length + 0;
752    var nextCheck = 0;
753    var CurrentWidthCounter = 0;
754    for(var i=1; i < menuCount;  i++){
755      currentWidth = parseInt(Math.ceil($('.header-nav .header-nav__item:nth-child('+i+')').width())) + 16;
756      nextCheck += currentWidth;
757      if(nextCheck > menuWidth){
758        var a = i;
759        for(a;a < menuCount;a++){
760          $('.header-nav .header-nav__item:nth-child('+ a +')').addClass('mainnav__replaced');
761        }
762        $('.mainnav .header-nav__list').append('<li class="header-nav__item mainnav__more dropdown _more-menu"><a class="header-nav__link">Еще...</a></li>');
763        $('.mainnav__more').append($('<ul>').addClass('overflowMenu dropdown__body'))
764        $('.mainnav .mainnav__replaced').each(function(){
765          $('.overflowMenu').append($(this));
766        });
767        menuMorePosition = parseInt($('.mainnav__more').position().left);
768        $('.mainnav .mainnav__more').on('click',function(){
769          $(this).hasClass('active') ? $(this).removeClass('active') : $(this).addClass('active');
770          $('.overflowMenu').hasClass('active') ? $('.overflowMenu').removeClass('active') : $('.overflowMenu').addClass('active');
771          $('.mainnav .header-nav__list').hasClass('active') ? $('.mainnav .header-nav__list').removeClass('active') : $('.mainnav .header-nav__list').addClass('active');
772        });
773        $(function($){
774          $(document).on('mouseup', function (e){ 
775            var div = $(".overflowMenu.active"); 
776            var btn = $(".mainnav .mainnav__more");
777            if (!div.is(e.target) && div.has(e.target).length === 0 && !btn.is(e.target)) {
778              div.removeClass('active');
779              btn.removeClass('active');
780              $('.mainnav .header-nav__list').removeClass('active');
781            }
782          });
783        });
784        return false;
785      }
786    }
787  }     
788  if(getClientWidth() >= 1200){
789    headerMenu();
790  }  
791  // Основной каталог в шапке
792  function headerCatalog() {
793    var e,
794        $headerCatalog = $(".header-catalog"),
795        $catalogBtn = $(".header-catalogBtn"),
796        $catalogMenu = $(".header-catalog .header-catalogMenu"),
797        $headerSubcatalog = $(".header-subcatalog"),
798        $headerOverlay = $(".header-overlay");                          
799        $headerCloseBtn = $('.header-closeBtn');
800        
801        
802        $catalogItem = $(".header-sectionsItem.parent");
803
804      var $catalogMenu = $(".header-catalog .header-catalog__menu");
805      $catalogMenu.on('click', '.header-catalog__icon', function(evt){        
806          evt.preventDefault()
807          
808          var $arrow = $(this);
809          var $link = $arrow.parent();
810          
811          if($arrow.hasClass('_active')){
812            $arrow.removeClass('_active')
813            $link.removeClass('_active').next('.sub').slideUp();
814          } else {
815            $arrow.addClass('_active')
816            $link.addClass('_active').next('.sub').slideDown();
817          }
818                           
819      });
820  }
821  headerCatalog();
822  
823  function removeActiveLinks(){
824    if (getClientWidth() > 992) {
825      var $headerCatalog = $('.header-catalogMenu');
826      
827      $headerCatalog.find('.header-catalogLink, .header-subcatalogTitle, .header-catalogMenu').removeClass('active');
828      $headerCatalog.find('.header-subcatalog-third, .sub').show();
829    }
830  }
831  $(window).on('resize', $.debounce(300, removeActiveLinks))      
832  // Аккордеон в подвале
833  $('.footer-collapse').on('click', '.footer-collapse__title', function(){
834    if(getClientWidth() <= 576){
835      $(this).toggleClass('_active').next('.footer-collapse__list').slideToggle();
836    }
837  })
838}
839
840// Функции для каталога
841function catalogFunctions() {
842  // Кастом селект
843  $(function(){
844    $('.select').styler();
845  })
846
847  $('.filters .filters__btn').on('click', function(e){
848    $(this).parent().toggleClass('_active')
849  })
850  // Фильтр по ценам
851  var
852    // Минимальное значение цены для фильтра
853    priceFilterMinAvailable = parseInt($('.goodsFilterPriceRangePointers .min').text())
854    // Максимальное значение цены для фильтра
855    ,priceFilterMaxAvailable = parseInt($('.goodsFilterPriceRangePointers .max').text())
856    // Максимальное значение цены для фильтра
857    ,priceSliderBlock = $('#goods-filter-price-slider')[0]
858    // Поле ввода текущего значения цены "От"
859    ,priceInputMin = $( "#goods-filter-min-price" )
860    // Поле ввода текущего значения цены "До"
861    ,priceInputMax = $( "#goods-filter-max-price" )
862    // Блок с кнопкой, которую есть смысл нажимать только тогда, когда изменялся диапазон цен.
863    ,priceSubmitButtonBlock = $( ".goodsFilterPriceSubmit" );
864    
865  // Изменяет размер ячеек с ценой, т.к. у них нет рамок, есть смысл менять размеры полей ввода, чтобы они выглядили как текст
866  function priceInputsChangeWidthByChars() {
867    // Если есть блок указания минимальной цены
868    if(priceInputMin.length) {
869      priceInputMin.css('width', (priceInputMin.val().length*7 + 60) + 'px');
870      priceInputMax.css('width', (priceInputMax.val().length*7 + 60) + 'px');
871    }
872  }
873  // Обновить размеры полей ввода диапазона цен
874  priceInputsChangeWidthByChars();
875
876  // Слайдер, который используется для удобства выбора цены
877  if(priceSliderBlock){
878    noUiSlider.create(priceSliderBlock, {
879        start: [parseInt($('#goods-filter-min-price').val()), parseInt($('#goods-filter-max-price').val())],
880        connect: true,
881        range: {
882            'min': priceFilterMinAvailable,
883            'max': priceFilterMaxAvailable
884        }
885    });
886    priceSliderBlock.noUiSlider.on('slide', function (values, handle) {
887      var newVal = parseInt(values[handle]);
888  
889      /*
890      * 0 - left handle
891      * 1 - right handle
892      */ 
893      if (handle) {
894          priceInputMax.val( newVal );    
895      } else {
896          priceInputMin.val( newVal );
897      }
898      
899      priceInputsChangeWidthByChars();
900    });
901    
902    priceSliderBlock.noUiSlider.on('end', function (values, handle) {
903      onFiltersChange()
904    })
905    
906    // При изменении минимального значения цены
907    priceInputMin.keyup(function(){
908      var newVal = parseInt($(this).val());
909      if(newVal < priceFilterMinAvailable) {
910        newVal = priceFilterMinAvailable;
911      }
912      priceSliderBlock.noUiSlider.set([newVal, null]);
913      priceInputsChangeWidthByChars();
914    });
915    
916    // При изменении максимального значения цены
917    priceInputMax.keyup(function(){
918      var newVal = parseInt($(this).val());
919      if(newVal > priceFilterMaxAvailable) {
920        newVal = priceFilterMaxAvailable;
921      }
922      priceSliderBlock.noUiSlider.set([null, newVal]);
923      priceInputsChangeWidthByChars();
924    });
925  }
926  
927  function onFiltersChange(){
928    // Получаем данные формы, которые будем отправлять на сервер
929    var $formData = $('#filters-form').serializeArray();
930    // Сообщаем серверу, что мы пришли через ajax запрос
931    $formData.push({name: 'ajax_q', value: 1});
932    $formData.push({name: 'only_body', value: 1});
933
934    // Аяксом добавляем товар в корзину и вызываем форму быстрого заказа товара
935    $.ajax({
936      type: "POST",
937      cache: false,
938      data: $formData,
939      success: function(data) {
940        var $resultsInput = $(data).find('#goods-filters-results');
941        // Если есть результаты
942        if($resultsInput.length){
943          var value = $resultsInput.val();
944
945          $('.filters .filters__results').show();
946          $('.filters .filters__results-input').val(value)
947        } else {
948          $('.filters .filters__results').hide();
949        }
950      }
951    })
952  }
953  // Фильтры по товарам. При нажании на какую либо характеристику или свойство товара происходит фильтрация товаров
954  $('.filters-inner__item .filters__input').on('change', function(e){
955    $(this).attr('checked', $(this).is(':checked') ? 'checked' : false);
956    e.preventDefault();
957    onFiltersChange();
958  });
959
960  // Показать/скрыть категорию фильтра
961  $('.filters').on('click', '.filters__title', function(){
962    var $title = $(this);
963    
964    if($title.hasClass('_active')){
965      $title.removeClass('_active')
966      $title.next('.filters__inner').slideDown();
967    } else {
968      $title.addClass('_active')
969      $title.next('.filters__inner').slideUp();
970    }
971    
972  });
973  
974  $('.block.filters, .block.viewed').on('click', '.title', function(){
975    if( getClientWidth() <= 991) {
976      var $title = $(this);
977      
978      $title.next('.content').addClass('_active');
979      $('.overlay').addClass('_active');        
980    }
981  })
982  
983  $('.overlay, .content-close-btn').off('click').on('click', function(){
984    $('.overlay').removeClass('_active');
985    $('.filters .content, .viewed  .content').removeClass('_active');
986  })
987  
988  // Показать все/скрыть
989  $('.block.filters').on('click', '.filter-more', function(){
990    var $btn = $(this);
991    var offsetTop = $btn.siblings('.title').offset().top
992
993    $btn.prev('.filter-inner').toggleClass('crop');
994    
995    if($btn.hasClass('active')){
996      $btn.removeClass('active').find('.filter-moreText').text('Показать все');
997      
998      if(getClientWidth() > 992){
999        $('html, body').animate({scrollTop: offsetTop})
1000      }
1001      
1002    } else {
1003      $btn.addClass('active').find('.filter-moreText').text('Скрыть');
1004    }
1005  }); 
1006  
1007  // Ajax вывод товаров списком/таблицей без обновления страницы
1008  $('.toolbar').on('click', '.view-mode > a', function(){
1009    var href = document.location.href;
1010    var dataHref = $(this).data('href').slice(1);
1011    var browser = null;
1012    var qwe = navigator.userAgent;
1013    var separator = (href.indexOf('?') + 1) ? '&' : '?';
1014    
1015    if (qwe.search(/MSIE/) != -1) {browser = 'IE'};
1016    if (href.indexOf('#page-title') != -1) { href = href.replace('#page-title', '')}
1017    
1018    var url = (browser === 'IE') ? encodeURI(href + separator + dataHref) : (href + separator + dataHref);
1019
1020    $('.products-ajax').css('opacity', '.5');
1021    // $('.products-container').prepend('<span class="content-loading"></span>');
1022    $.ajax({
1023      url: url,
1024      cache: false,
1025      beforeSend: function(){
1026        $('.products-container').find('.lds-ellipsis').remove();
1027        $('.products-container').prepend('<span class="lds-ellipsis pink"><span></span><span></span><span></span><span></span></span>');
1028      },
1029      success: function(d){
1030        $('.products-ajax').parent().html($(d).find('.products-ajax').parent().html());
1031        lozad().observe();
1032        $('.view-mode').html($(d).find('.view-mode').html());
1033        addTo();
1034        addCart();
1035        quickView();
1036        quantity();
1037        $('.products-ajax').css('opacity', '1');
1038      }
1039    });
1040  }); 
1041
1042  // Боковое меню сохранение открытой вложенности
1043  $('.catalog__item._parent .catalog__icon').on('click', function(evt){
1044      evt.preventDefault()
1045      
1046      var $arrow = $(this);
1047      var $link = $arrow.parent();
1048      
1049      if($arrow.hasClass('_active')){
1050        $arrow.removeClass('_active')
1051        $link.removeClass('_active').next('.sub').slideUp();
1052      } else {
1053        $arrow.addClass('_active')
1054        $link.addClass('_active').next('.sub').slideDown();
1055      }
1056  });
1057  // Вы смотрели
1058  $('.recently-viewed .products-grid').owlCarousel({
1059    items:1,
1060    lazyLoad: true,
1061    margin: 15
1062  })
1063  // Карусель Избранное / Сравнение
1064  $('.favorites-goods .products-grid, .compare-goods .products-grid').owlCarousel(
1065    $.extend(OWL_DEFAULT,  {
1066      items:6,
1067      margin: 9, 
1068      lazyLoad: true,
1069      responsive: {
1070        0:{items:1},
1071        320:{items:2},
1072        480:{items:3},
1073        540:{items:3},
1074        768:{items:5},
1075        992:{items:5},
1076        1200:{items:6, nav: true,margin: 15, autoWidth: false}
1077      }            
1078    })
1079  )
1080}
1081
1082// Добавление товара в корзину
1083function addCart() {
1084  $('.product-view__form, .product__form, .goodsToCartFromCompareForm, .goodsListForm').off('submit').on('submit', function() {
1085    // Выносим функции из шаблонов
1086    if ($(this).attr('rel') === 'quick') {
1087      quickOrder(this);
1088      return (false);
1089    }
1090    if($(this).hasClass('_in-cart')){
1091      return (true)
1092    }
1093    // Находим форму, которую отправляем на сервер, для добавления товара в корзину
1094    var formBlock = $($(this).get(0));
1095    
1096    // Проверка на существование формы отправки запроса на добавление товара в корзину
1097    if (1 > formBlock.length || formBlock.get(0).tagName != 'FORM') {
1098      alert('Не удалось найти форму добавления товара в корзину');
1099      return false;
1100    }
1101    
1102    // Получаем данные формы, которые будем отправлять на сервер
1103    var formData = formBlock.serializeArray();
1104    // Сообщаем серверу, что мы пришли через ajax запрос
1105    formData.push({name: 'ajax_q', value: 1});
1106    // Так же сообщим ему, что нужно сразу отобразить форму быстрого заказа
1107    //formData.push({name: 'fast_order', value: 1});
1108    // Аяксом добавляем товар в корзину и вызываем форму быстрого заказа товара
1109    $.ajax({
1110      type: "POST",
1111      cache: false,
1112      url: formBlock.attr('action'),
1113      data: formData,
1114      success: function(data) {
1115          var $btn = $('.button._add-cart._loading').removeClass('_loading _animated');
1116          
1117          var $cartMessage = $(data).filter('#cart-message');
1118          var type = $cartMessage.data('message-type');
1119          
1120          // Если товар добавлен
1121          if(type === 'success'){
1122            // $btn.addClass('_added').find('span').html('<i class="fal fa-check-circle"></i>');
1123            
1124            $.fancybox.close()
1125            // Включить выключить показ окна по кнопке "В корзину"
1126            var fancyboxOn = true;
1127
1128            if(fancyboxOn){
1129              $.fancybox.open(data,{
1130                afterShow: function(){
1131                  addTo();
1132                  ajaxCartQty();
1133                  quantity();
1134                }
1135              })
1136            } else {
1137              new Noty({
1138                timeout: "3000",
1139                text: $cartMessage.html(),
1140                type: type,
1141                animation: {
1142                  open: null, 
1143                  close: null
1144                }            
1145              }).show();
1146            }
1147            $('.header .cart-header .cart-header__counter .num').html($(data).filter('#newCartCount').html());
1148            $('.header .cart-header .cart-header__cart-sum').html($(data).filter('#newCartSum').html());            
1149          } else {
1150            new Noty({
1151              timeout: "3000",
1152              layout: 'center',
1153              text: $cartMessage.html(),
1154              type: type,
1155              animation: {
1156                open: null, 
1157                close: null
1158              }            
1159            }).show();
1160            
1161            // $btn.addClass('_added').find('span').html('<i class="fal fa-times-circle"></i>');            
1162          }
1163          
1164          $btn.removeClass('_added').find('span').html('В корзину')
1165      }
1166    });
1167    return false;
1168  });
1169}
1170// Функция оформления заказа в корзине
1171function startOrder(){
1172  var globalOrder = $('#globalOrder'); //объект блока куда будет выводиться форма быстрого заказа
1173  var closeOrder = $('#closeOrder'); // объект кнопки отмены заказа
1174  var cartClear = $('#cart-clear'); // объект кнопки отмены заказа
1175  var cartTable = $('#cart-content'); // объект корзины
1176  var confirmOrder = $('#confirmOrder'); // объект блока оформления заказа
1177  var cartFast = $('.cart._fast');
1178  
1179  // Если форма уже открыта то ничего не делаем.
1180  if (globalOrder.css('display') != 'none') {
1181    // Если блок с формой заказа не скрыт то выходим из функции
1182    return false;
1183  }
1184  // объект кнопки "Заказать"
1185  var buttonStartOrder = $('#startOrder');  
1186  // Скрываем кнопку "Очистить корзину"
1187  cartClear.hide();  
1188  // Скрываем кнопку "Заказать"
1189  buttonStartOrder.hide();
1190  // Скрываем элементы в корзине
1191  cartTable.hide();
1192  // Переключаем табы
1193  $('.cart-tabs .cart-tab').toggleClass('_disabled').toggleClass('_active');
1194  // Отключаем возможность клика по неактивной кнопке
1195  $('.cart-tab._disabled').prop('disabled', true)
1196
1197  $.ajax({
1198    type: "POST",
1199    cache: false,
1200    url: '/cart/add',
1201    data: [
1202      {name: 'ajax_q', value: 1},
1203      {name: 'fast_order', value: 1}
1204    ],
1205    beforeSend: function(){
1206      // Открываем общий, глобальный блок
1207      globalOrder.show()
1208      // показываем прелоадер
1209      globalOrder.css('position', 'relative')
1210      globalOrder.css('minHeight', '30px')
1211      globalOrder.html('<div class="preloader"><span class="content-loading"></span></div>')
1212    },
1213    success: function(data) {
1214      // Вставляем форму быстрого заказа
1215      globalOrder.html($(data).filter('#order-template').html());
1216      $('html, body').delay(400).animate({scrollTop : jQuery('#globalOrder').offset().top - 100}, 800);
1217      $('.coupon-hidden-input').val($('#quick_form_coupon_code').val())
1218      cartFast.find('.cart__sum-row.cart__sum--delivery-sum').show();
1219      cartFast.find('.cart__sum-row.cart__sum--order-sum').show();
1220      confirmOrder.show();
1221      closeOrder.show();
1222      $('.pdt-cart-related-goods').hide();
1223      // Включаем возможность клика по неактивной кнопке
1224      $('.cart-tab._disabled').prop('disabled', false)
1225			cartAjaxQty()
1226			quantity()
1227			coupons();
1228			preloadHide()
1229      $('#closeOrder, #closeOrderTab').off('click').on('click', function() {
1230        // Если таб уже активен выходим
1231        if($(this).hasClass('cart-tab') && !$(this).hasClass('_disabled')){ 
1232          return;
1233        }
1234        cartFast.find('.cart__sum-row.cart__sum--order-sum').hide(); // Скрываем пункт "Сумма заказа"
1235        //cartFast.find('.cart__sum-row.cart__sum--delivery-sum').hide(); // Скрываем пункт "Стоимость доставки"
1236        confirmOrder.hide(); // Скрываем блок "Оформить заказ"
1237        globalOrder.hide(); // Скрываем блок оформления заказа
1238        closeOrder.hide(); // Скрываем кнопку "Отменить"
1239        $('.pdt-cart-related-goods').show();
1240        $('.cart-tab').toggleClass('_disabled').toggleClass('_active');
1241        buttonStartOrder.show(); // Возвращаем кнопку "Заказать"
1242        cartClear.show();
1243        // Показываем блок корзины
1244        cartTable.show();
1245        
1246        return false;
1247      });			
1248    }
1249  });
1250  return false;
1251}
1252// Быстрый заказ
1253function quickOrder(formSelector) {
1254  // Находим форму, которую отправляем на сервер, для добавления товара в корзину
1255  var formBlock = $($(formSelector).get(0));
1256  // Проверка на существование формы отправки запроса на добавление товара в корзину
1257  if(1 > formBlock.length || formBlock.get(0).tagName != 'FORM') {
1258    alert('Не удалось найти форму добавления товара в корзину');
1259    return false;
1260  }
1261  // Получаем данные формы, которые будем отправлять на сервер
1262  var formData = formBlock.serializeArray();
1263  // Сообщаем серверу, что мы пришли через ajax запрос
1264  formData.push({name: 'ajax_q', value: 1});
1265  // Так же сообщим ему, что нужно сразу отобразить форму быстрого заказа 
1266  formData.push({name: 'fast_order', value: 1});
1267  // Аяксом добавляем товар в корзину и вызываем форму быстрого заказа товара
1268  $.ajax({
1269    type    : "POST",
1270    cache	  : false,
1271    url		  : formBlock.attr('action'),
1272    data		: formData,
1273    success: function(data) {
1274      $.fancybox.close();
1275      
1276      var $fancyContent = $('<div>')
1277      $fancyContent
1278        .append($(data).filter('#order-template'))
1279        .append($(data).filter('#cartFast'))
1280
1281      $.fancybox.open($fancyContent ,{
1282        baseClass: "quickOrder",
1283        afterShow: function(){
1284          var $btn = $('.button._add-cart._loading').removeClass('_loading');
1285          $btn.removeClass('_added')
1286          if($btn.hasClass('_product-view-quick')){
1287            $btn.find('span').html('Купить в 1 клик');
1288          }
1289          else if(!$btn.closest('.product._list')){
1290            $btn.find('span').html('Купить <br> в 1 клик');
1291          }
1292          // Показываем блок итоговой суммы
1293          $('#cartFast').show();
1294          // Купон
1295          coupons();
1296          // Обновляем счётчики
1297          $('.header .cart-header .cart-header__counter .num').html($(data).filter('#newCartCount').html());
1298          $('.header .cart-header .cart-header__cart-sum').html($(data).filter('#newCartSum').html());             
1299        }
1300      });
1301    }
1302  });    
1303
1304  return false;
1305}
1306// Cкрипты для быстрого заказа
1307function orderScripts(){
1308  // Кастом селект  
1309  if($.fn.styler){
1310    $('#quickDeliveryCountry').styler();
1311    $('.quickform .quickform__select-convenient').styler();
1312  }
1313  // Выбор диапазона времени доставки
1314  // Чтобы изменять диапазон со стороны используйте $('.quickform .quickform__select-convenient._period').val('0-2').trigger('refresh')
1315  $('.quickform select.quickform__select-convenient._period').on('change', function(){
1316    var convenientArr = $(this).val().split('-')
1317    
1318    if(convenientArr.length){
1319      $('input[name="form[delivery][convenient_time_from]"]').val(convenientArr[0])
1320      $('input[name="form[delivery][convenient_time_to]"]').val(convenientArr[1])
1321    }
1322  })
1323  // Форма регистрации нового пользователя, при оформлении заказа
1324  $('.show-password').on('click', function(){
1325    ChangePasswordFieldType(this, $('#contactPassWord'));
1326  });
1327  // При оформлении заказа дадим возможность зарегистрироваться пользователю
1328  $('#contactWantRegister').on('change', function(){
1329    if($(this).prop("checked")) {
1330      $('.quickform__item._password, .contactRegisterNeedElement').show();
1331      $('#contactEmail, #contactPassWord').addClass('required');
1332    } else {
1333      $('.quickform__item._password, .contactRegisterNeedElement').hide();
1334      $('#contactEmail, #contactPassWord').removeClass('required');
1335    }
1336  });
1337  
1338  // Выбор даты доставки
1339  // Документация к плагину //t1m0n.name/air-datepicker/docs/index-ru.html
1340  $("#deliveryConvenientDate").datepicker({
1341    // Если true, то при активации даты, календарь закроется.
1342    autoClose: true,
1343    // Можно выбрать только даты, идущие за сегодняшним днем, включая сегодня
1344    minDate: new Date()
1345  })
1346
1347  // Разделение поле адрес на Улица, Дом, Квартира
1348  $(function () {
1349    $('#quickform .button, #confirmOrder .button').off('click').on('click', function(){
1350      var $quickDeliveryAddress = $('#quickDeliveryAddress'),
1351          quickDeliveryAddressStreetValue = $('#quickDeliveryAddressStreet').val(),
1352          quickDeliveryAddressHomeValue = $('#quickDeliveryAddressHome').val(),
1353          quickDeliveryAddressFlatValue = $('#quickDeliveryAddressFlat').val();
1354      
1355      if($quickDeliveryAddress.length && (quickDeliveryAddressStreetValue !='' || quickDeliveryAddressHomeValue !='' || quickDeliveryAddressFlatValue !='')){
1356        $quickDeliveryAddress.val('Улица: ' + quickDeliveryAddressStreetValue + ', Дом/Корпус: ' + quickDeliveryAddressHomeValue + ', Квартира: ' + quickDeliveryAddressFlatValue);
1357      }
1358      $('#quickform').submit()
1359      return false;
1360    });    
1361  })
1362  // Валидация формы на странице оформления заказа
1363  $("#quickform").on('submit', function(){
1364    // Если форма невалидна не отправляем её на сервер
1365    if(!$(this).valid()) {
1366      return false;
1367    }
1368    // Получаем данные формы, которые будем отправлять на сервер
1369    var formData = $(this).serializeArray();
1370    // Сообщаем серверу, что мы пришли через ajax запрос
1371    formData.push({name: 'ajax_q', value: 1});
1372    var $orderBtns = $("#confirmOrder .button")
1373    //  Аяксом оформляем заказ
1374    $.ajax({
1375      type    : "POST",
1376      dataType: 'json',
1377      cache    : false,
1378      url  	  : $(this).attr('action'),
1379      data		: formData,
1380      timeout: 10000,
1381      beforeSend: function () {        
1382        preloadButton($('#confirmOrder .button'));
1383        $orderBtns.addClass('_disabled')
1384      }, 
1385      success: function(data) {
1386        // Если заказ был успешно создан
1387        if( data.status == 'ok' ) {
1388          window.location = data.location;
1389        } else if( data.status == 'error' ) {
1390          new Noty({
1391            timeout: "7000",
1392            text: data.message,
1393            type: "error",
1394            animation: {
1395              open: null, 
1396              close: null
1397            }            
1398          }).show()  
1399          $orderBtns.removeClass('_disabled').html('Оформить заказ');
1400        } else {
1401          alert('Во время оформления заказа возникла неизвестная ошибка. Пожалуйста, обратитесь в службу технической поддержки.');
1402          $orderBtns.removeClass('_disabled').html('Оформить заказ');
1403        }
1404        
1405      },
1406      error: function(){
1407        $orderBtns.removeClass('_disabled').html('Оформить заказ')
1408      }         
1409    });
1410    return false;      
1411  }).validate();
1412}
1413
1414// Расчёт доставки и суммы заказа
1415(function() {
1416  var CURRENT_DELIVERY;
1417
1418  function init(ORDER_DELIVERY, DELIVERY_TYPE) {
1419    if (typeof ORDER_DELIVERY == "undefined") {
1420        console.error('Не передан массив доставок');
1421        
1422        return;
1423    }
1424    CURRENT_DELIVERY = ORDER_DELIVERY[0];
1425    
1426    changeCartSum();
1427    
1428    if(DELIVERY_TYPE === 'select') {
1429      $('.delivery-select').on('change', function() {
1430        var deliveryId = $(this).val();
1431        
1432        CURRENT_DELIVERY = getCurrentDelivery(deliveryId);
1433  
1434        // Если есть варианты оплаты для текущей доставки
1435        if (CURRENT_DELIVERY.availablePaymentList.length) {
1436          renderPaymentSelect();
1437        } else {
1438          renderPaymentSelect(true);
1439        }
1440        // Если нет зон у текущего варианта доставки
1441        if (CURRENT_DELIVERY.zoneListEmpty) {
1442            renderDeliveryZone(true)
1443        } else {
1444            renderDeliveryZone()
1445        }
1446  
1447        changeCartSum();
1448      });
1449      $('.delivery-zone-select').on('change',function() {
1450        var deliveryId = $(this).data('delivery-id');
1451        var zoneId = $(this).val();
1452        
1453        CURRENT_DELIVERY = getCurrentDelivery(deliveryId);
1454  
1455        changeCartSum();
1456      })
1457      $('.payment-select').on('change',function() {
1458        var deliveryId = $(this).data('delivery-id');
1459        var paymentId = $(this).val();
1460        CURRENT_DELIVERY = getCurrentDelivery(deliveryId);
1461  
1462        if (CURRENT_DELIVERY.availablePaymentList.length) {
1463          changePaymentSelect(paymentId);
1464        }
1465      });
1466    }
1467    if(DELIVERY_TYPE === 'radio'){
1468      function hideDeliveryBlock(name) {
1469        var deliveryName = name;
1470        // Настройка Самовывоза
1471        if(deliveryName === 'Самовывоз' || deliveryName.indexOf('Самовывоз') != -1){
1472          $('.quickform__row.-adress').hide();
1473        } else {
1474          $('.quickform__row.-adress').show();
1475        }
1476      }
1477      $('.delivery-radio').on('change',function(){
1478        
1479        var deliveryId = $(this).val();
1480        var deliveryName = $(this).data('name');
1481
1482if(deliveryName === 'Самовывоз') {
1483  console.log($(".-delivery .input option[selected='selected']").text());
1484  $(".-adress").hide();
1485  $("#quickDeliveryCity").val("no");
1486  $("#quickDeliveryZipCode").val("no");
1487  $("quickDeliveryAddress").val("no");
1488  $("#quickDeliveryRegion").val("no");
1489  $("#quickDeliveryAddressStreet").val("no");
1490  $("#quickDeliveryAddressHome").val("no");
1491  $("#quickDeliveryAddressFlat").val("no");
1492  $("#deliveryConvenientDate").val("none......");
1493      $(".buttons.quickInputsBlock").hide();
1494  } else {
1495$(".-adress").show();
1496  $("#quickDeliveryCity").val("");
1497  $("#quickDeliveryAddressStreet").val("");
1498  $("#quickDeliveryAddressHome").val("");
1499  $("#quickDeliveryZipCode").val("");
1500  $("quickDeliveryAddress").val("");
1501  $("#quickDeliveryAddressFlat").val("");
1502  $("#deliveryConvenientDate").val("");
1503  $("#quickDeliveryComment").val("");
1504    $(".buttons.quickInputsBlock").show();
1505  }
1506
1507        CURRENT_DELIVERY = getCurrentDelivery(deliveryId);
1508        
1509        // Если нет зон у текущего варианта доставки
1510        if (CURRENT_DELIVERY.zoneListEmpty) {
1511          $(this).closest('.quickform-delivery__item').siblings().find('.delivery-zone-radio').prop('checked', false);
1512        } else {
1513          $(this).closest('.quickform-delivery__item').find('.delivery-zone-radio:first').prop('checked', true).trigger('change')
1514        }
1515        
1516        // Если есть варианты оплаты для текущей доставки
1517        if (CURRENT_DELIVERY.availablePaymentList.length) {
1518          changePaymentRadio(deliveryId);
1519        } else {
1520          changePaymentRadio();
1521        }
1522        hideDeliveryBlock(deliveryName);
1523        changeCartSum();
1524      })
1525      $('.delivery-zone-radio').on('change',function(){
1526        var deliveryId = $(this).data('delivery-id');
1527        var deliveryParentName = $(this).data('parent-name');
1528        hideDeliveryBlock(deliveryParentName);
1529        CURRENT_DELIVERY = getCurrentDelivery(deliveryId);
1530        $(this).closest('.quickform-delivery__item').siblings().find('.delivery-radio').prop('checked', false)
1531        $(this).closest('.quickform-delivery__item').find('.delivery-radio').prop('checked', true)
1532        $(this).closest('.quickform-delivery__item').find('.quickform-delivery__price-default .num').text(addSpaces(getCurrentDeliveryPrice()))
1533        $(this).closest('.quickform-delivery__item').find('.quickform-delivery__price-zone .num').text(addSpaces(getCurrentDeliveryPrice()))
1534        changePaymentRadio(deliveryId);
1535        changeCartSum();
1536      })
1537    }
1538
1539    function getCurrentDelivery(id) {
1540      var currentDelivery;
1541
1542      $.each(ORDER_DELIVERY, function(i, item) {
1543        if (String(id) === item.id) {
1544          currentDelivery = item;
1545        }
1546      })
1547      return currentDelivery;
1548    }
1549
1550    function renderDeliveryZone(clearTemplate) {
1551      var $deliveryZoneSelect = $('.delivery-zone-select');
1552      var $deliveryZoneWrap = $deliveryZoneSelect.parent();
1553
1554      $deliveryZoneSelect.data('delivery-id', CURRENT_DELIVERY.id);
1555      $deliveryZoneSelect.show().html('');
1556
1557      if (clearTemplate) {
1558        $deliveryZoneSelect.hide();
1559        
1560        return;
1561      } else {
1562        $deliveryZoneSelect.show();
1563      }
1564
1565      $.each(CURRENT_DELIVERY.zoneList, function(i, item) {
1566        var $option = $('<option>').val(item.zoneId).text(item.name);
1567        $deliveryZoneSelect.append($option);
1568      })
1569    }
1570
1571    function renderPaymentSelect(clearTemplate) {
1572      var $paymentSelect = $('.payment-select');
1573      var $paymentDescr = $('.payment__desc');
1574
1575      $paymentSelect.data('delivery-id', CURRENT_DELIVERY.id);
1576      $paymentSelect.html('');
1577
1578      if (clearTemplate) {
1579        var $option = $('<option>').val('').text('Не задан метод оплаты');
1580        $paymentSelect.append($option);
1581        $paymentSelect.prop('disabled', true)
1582        $paymentDescr.hide();
1583      } else {
1584        $paymentSelect.prop('disabled', false)
1585        $paymentDescr.show();
1586      }
1587
1588      if (CURRENT_DELIVERY.availablePaymentList.length) {
1589        $.each(CURRENT_DELIVERY.availablePaymentList, function(i, item) {
1590          var $option = $('<option>').val(item.id).text(item.name);
1591
1592          $paymentSelect.append($option);
1593
1594          if (i == 0) {
1595            $paymentDescr.html(item.message);
1596          }
1597        });
1598      }
1599    }
1600
1601    function changePaymentSelect(paymentId) {
1602      var $paymentDescrBlock = $('.payment__desc');
1603      var currentPayment = $.grep(CURRENT_DELIVERY.availablePaymentList, function(item, i) {
1604        return item.id === String(paymentId)
1605      })[0]
1606
1607      $paymentDescrBlock.html(currentPayment.message);
1608    }
1609    function changePaymentRadio(deliveryId) {
1610      if(deliveryId){
1611        var $currentPaymentBlock = $('.quickform-payment').filter('[data-delivery-id="'+ deliveryId +'"]');
1612        
1613        $currentPaymentBlock.show().siblings('.quickform-payment').hide();
1614        $currentPaymentBlock.find('[name="form[payment][id]"]:first').prop('checked', true)        
1615      } else {
1616        $('.quickform-payment').hide().find('[name="form[payment][id]"]').prop('checked', false)
1617      }
1618    }
1619  }
1620
1621  function changeCartSum() {
1622    var currentPriceWithoutChange = Number($('.cart__sum .total-sum').data('total-sum'));
1623    var deliveryPrice = Number(getCurrentDeliveryPrice());
1624    var discountPrice = Number($('.cart__sum .cart__sum--discount .cart__sum-text-price').data('discount-value'));
1625    // console.log(currentPriceWithoutChange,deliveryPrice,discountPrice)
1626    // Заполняем стоимость доставки
1627    $('.cart__sum .cart__sum--delivery-sum .num').text(addSpaces(deliveryPrice));
1628    $('.delivery__descr .delivery__price .num').text(addSpaces(deliveryPrice));
1629    // Описание доставки
1630    if (CURRENT_DELIVERY) {
1631        $('.delivery__descr .delivery__text').text(CURRENT_DELIVERY.desc);
1632    }
1633
1634    var priceNow = (currentPriceWithoutChange + deliveryPrice) - discountPrice;
1635    if (priceNow < 0) {
1636        priceNow = 0;
1637    }
1638    $('.cart__sum .total-sum').find('.num').text(addSpaces(Math.ceil(priceNow)));
1639  }
1640
1641  function getCurrentDeliveryPrice() {
1642    function getPriceFromArray(array) {
1643      var cartSumNow = Number($('.cart__sum .total-sum').data('total-sum'))
1644      var deliveryPrice = null;
1645      var maxMorePrice = 0;
1646  
1647      $.each(array, function(i, el) {
1648        // Если сумма заказа сейчас >= чем задана в правиле && текущее правило больше по цене, чем предыдущее
1649        if (Number(cartSumNow) >= Number(el.sumMorePrice) && Number(maxMorePrice) <= Number(el.sumMorePrice)) {
1650          deliveryPrice = el.price
1651          maxMorePrice = el.sumMorePrice
1652        }
1653      })
1654  
1655      return deliveryPrice;
1656    }
1657    // console.log(CURRENT_DELIVERY)
1658    if (typeof CURRENT_DELIVERY == "undefined") {
1659      return '0';
1660    }
1661    // Если нет зон у текущего варианта доставки
1662    if (CURRENT_DELIVERY.zoneListEmpty) {
1663      // Если нет правил расчета стоимости для текущего варианта доставки
1664      if (CURRENT_DELIVERY.rulesListEmpty) {
1665        return Math.ceil(CURRENT_DELIVERY.price)
1666      } else {
1667        var priceFromArray = getPriceFromArray(CURRENT_DELIVERY.rulesList);
1668        var deliveryPrice = (priceFromArray !== null) ? priceFromArray : Math.ceil(CURRENT_DELIVERY.price);
1669
1670        return deliveryPrice;
1671      }
1672    } else {
1673      var zoneId;
1674      
1675      if($('.delivery-zone-select').length) {
1676        zoneId = $('.delivery-zone-select').val();
1677      }
1678      if($('.delivery-zone-radio:checked').length){
1679        zoneId = $('.delivery-zone-radio:checked').val();
1680      }
1681      //console.log(CURRENT_DELIVERY.zoneList)
1682      var zoneList = $.grep(CURRENT_DELIVERY.zoneList, function(item, i) {
1683        return item.zoneId == zoneId
1684      })[0];
1685      
1686      // console.log(zoneList)
1687      // Если у этой зоны нет правил
1688      if (zoneList.zoneRuleListEmpty) {
1689        return zoneList.price
1690      } else {
1691        // Берём подходящую стоимость из массива правил иначе стандартную цену для зоны
1692        var priceFromArray = getPriceFromArray(zoneList.zoneRuleList);
1693        var deliveryPrice = (priceFromArray !== null) ? priceFromArray : zoneList.price;
1694          // console.log('deliveryPrice',deliveryPrice)
1695        return deliveryPrice;
1696      }
1697    }
1698  }
1699
1700  window.DeliveryModule = {
1701      init: init,
1702      changeCartSum: changeCartSum,
1703      getCurrentDelivery: function() {
1704          return CURRENT_DELIVERY;
1705      }
1706  }
1707})();
1708
1709// Мини корзина в окне AJAX добавления товара
1710function ajaxCartQty(){
1711  $(function(){
1712    $('.cart-ajax-input-qty').off('change').on('change',
1713      $.debounce(300, function(){
1714        var $qtyInput = $(this);
1715        var id = $qtyInput.data('goods-mod-id');
1716        var qtyInputVal = $qtyInput.val();
1717        
1718        if(qtyInputVal < 1) {
1719          $qtyInput.val(1)
1720        }
1721        var formData = $('#cart-ajax-form').serializeArray();
1722        formData.push({name: 'only_body', value: 1});
1723    
1724        $.ajax({
1725          url: '/cart',
1726          data: formData,
1727          cache: false,
1728          beforeSend: function(){
1729            preloadShow($('.cart-ajax__product .preloader'))
1730          },
1731          success: function(data) {
1732            var $data = $(data);
1733            var newQtyInputVal = $data.find('[data-id="' + id + '"] .qty__input').val();
1734            
1735            if(qtyInputVal > newQtyInputVal){
1736              var newQtyInputVal = $data.find('[data-id="' + id + '"] .qty__input').val();    
1737              $qtyInput.val(newQtyInputVal)
1738
1739              var $cartMessage = $data.filter('#cart-message');
1740              var type = $cartMessage.data('message-type');
1741
1742              new Noty({
1743                  timeout: "3000",
1744                  layout: 'center',
1745                  text: $cartMessage.html(),
1746                  type: type,
1747                  animation: {
1748                    open: null, 
1749                    close: null
1750                  }   
1751              }).show()
1752  
1753              return;
1754            }
1755            /* Обновляем счётчики */
1756            $('.header .cart-header .cart-header__counter .num').html($data.filter('#newCartCount').html());
1757            $('.header .cart-header .cart-header__cart-sum').html($data.filter('#newCartSum').html());               
1758            /**/
1759            var newPrice = $data.find('[data-id="' + id + '"]').find('.cart__product-ajax-price').html();
1760            $('#cart-ajax-form').find('.cart-ajax__product-price').html(newPrice);
1761            /**/
1762            preloadHide($('.cart-ajax__product .preloader'))
1763          }
1764        })
1765      })
1766    );
1767  })
1768}
1769
1770// С этим товаром покупают
1771function cartRelatedGoods() {
1772  $(function () {
1773    $(".pdt-cart-related-goods .products-grid").owlCarousel(
1774      $.extend(OWL_DEFAULT,
1775      {
1776        items: 4,
1777        responsive: {
1778          0:{items:1},
1779          320:{items:1},
1780          480:{items:1},
1781          540:{items:2},
1782          768:{items:3},
1783          992:{items:4},
1784          1200:{items:4, nav: true, margin: 15, autoWidth: false}
1785        }
1786      }
1787      ));    
1788  })
1789}
1790// Корзина
1791function cartAjaxQty(){
1792  $(function(){
1793    $('.qty__input').off('change').on('change',
1794      $.debounce(300, function(){
1795        var $qtyInput = $(this);
1796        var id = $qtyInput.closest('.cart__table-row').data('id');
1797        var qtyInputVal = $qtyInput.val();
1798        
1799        if(qtyInputVal < 1) {
1800          $qtyInput.val(1)
1801        }
1802        var formData = $('#cart-content').serializeArray();
1803        formData.push({name: 'only_body', value: 1});
1804    
1805        $.ajax({
1806          url: '/cart',
1807          data: formData,
1808          cache: false,
1809          beforeSend: function(){
1810            preloadShow($('#cart-content .preloader'))
1811          },
1812          success: function(data){
1813            // var $data = $(data).find('#cart-content');
1814            var $data = $(data);
1815            var count = 0;
1816            $data.find('.qty__input').each(function(){
1817              count += Number($(this).val())
1818            })  
1819            $('.cart-header .cart-header__counter .num').html(count);
1820            
1821            var newQtyInputVal = $data.find('[data-id="' + id + '"] .qty__input').val();
1822    
1823            $qtyInput.val(newQtyInputVal)
1824            
1825            var $tableRow = $('[data-id="' + id + '"]');
1826            var newItemPrice = $data.find('[data-id="' + id + '"] .cart__product-ajax-price').html();
1827            $tableRow.find('.cart__product-ajax-price').html(newItemPrice); 
1828            
1829            $('.cart__sum').html($data.find('.cart__sum').html());
1830            $('.cart-list').html($data.find('.cart-list').html());
1831
1832            var cartSum = $data.find('.total-sum').data('total-sum') || "0";
1833            $('.cart-header .cart-header__cart-sum .num').text(addSpaces(cartSum));
1834
1835            if ($('#quick_form_coupon_code').val()){
1836              $('#quick_form_coupon_code, .coupon-hidden-input').trigger('change')
1837            }
1838            
1839            DeliveryModule.changeCartSum();
1840
1841            var $deliveryPriceBlock = $('.cart__sum-row.cart__sum--delivery-sum');
1842            var deliveryPrice = Number($deliveryPriceBlock.find('.num').text());
1843            
1844            if (deliveryPrice != 0){
1845              $('.cart__sum-row.cart__sum--delivery-sum').show();
1846            }
1847            
1848            var newQtyInputVal = $data.find('[data-id="' + id + '"] .qty__input').val();
1849            if(Number(qtyInputVal) > Number(newQtyInputVal)){
1850              var $cartMessage = $data.filter('#cart-message');
1851              var type = $cartMessage.data('message-type');
1852
1853              new Noty({
1854                  timeout: "3000",
1855                  layout: 'center',
1856                  text: $cartMessage.html(),
1857                  type: type,
1858                  animation: {
1859                    open: null, 
1860                    close: null
1861                  }   
1862              }).show()
1863            }
1864            preloadHide($('#cart-content .preloader'), true)
1865          }
1866        })
1867      })
1868    )
1869  })
1870}
1871
1872// Очистить корзину
1873function cartClear() {
1874 $(function(){
1875	$('#cart-clear').on('click',function(e){
1876	  e.preventDefault();
1877    preloadShow($('#cart-content .preloader'));
1878	  
1879	  $.post('/cart/truncate/', function() {
1880	    $('.header .cart-header .cart-header__cart-sum .num').text("0");
1881	    $('.header .cart-header .cart-header__counter .num').text("0");
1882	    
1883      $('.quick-order,.cart-info .cart-info__wrap').hide();
1884      $('.pdt-cart-related-goods').hide();
1885      $('#empty-cart').show();  			    
1886	  });
1887	})   
1888 })  
1889}
1890// Удаление товара из корзины
1891function cartDeleteItem(){
1892  $(function(){
1893    $('.cart__delete').off('click').on('click', function(e){
1894    e.preventDefault();
1895    
1896    var $cartDeleteLink = $(this);
1897    var url = $cartDeleteLink.attr('href');
1898    
1899    $.ajax({
1900      url: url,
1901      cache: false,
1902      beforeSend: function(){
1903        $cartDeleteLink.closest('.cart__table-row').append($('<div class="preloader _opacity"><span class="content-loading"></span></div>'))
1904      },
1905      success: function(data){
1906        var $data = $(data);
1907        var count = 0;
1908        
1909        $data.find('.qty__input').each(function(){
1910          count += Number($(this).val())
1911        })
1912        // Если корзина пуста
1913        if(!count){
1914          $('.quick-order,.cart-info .cart-info__wrap').hide();
1915          $('#empty-cart').show();  
1916        }
1917        $cartDeleteLink.closest('.cart__table-row').remove();
1918        $('.header .cart-header .cart-header__counter .num').html(count);
1919        
1920        $('.cart__sum').html($data.find('.cart__sum').html());
1921        $('.cart-list').html($data.find('.cart-list').html());
1922        
1923        var cartSum = $data.find('.total-sum').data('total-sum') || "0";
1924        $('.cart-header .cart-header__cart-sum .num').text(addSpaces(cartSum));
1925        if($('#quick_form_coupon_code').val()){
1926          $('#quick_form_coupon_code, .coupon-hidden-input').trigger('change')
1927        }
1928        
1929        DeliveryModule.changeCartSum();
1930        preloadHide($('#cart-content .preloader'), true)      
1931       }      
1932    })
1933  })
1934  })
1935}
1936
1937// Отправка купона при оформлении заказа
1938function coupons() {
1939  var $submitBtn = $('.coupon .coupon__btn');
1940  var $cuponInput = $('#quick_form_coupon_code');
1941  var $resetBtn = $('.coupon .coupon__clear');
1942
1943  $submitBtn.on('click',function(){
1944    var val = $cuponInput.val();
1945    if(!val){
1946      return;
1947    }
1948    
1949    ajaxCouponCheck();
1950  });
1951  
1952  function ajaxCouponCheck(isResetBtn){
1953    var val = $cuponInput.val();
1954
1955    var orderSumDefault = Number($('.cart__sum .total-sum').data('total-sum'));
1956    
1957    // Получаем данные формы, которые будем отправлять на сервер
1958    var formData = $('#order-stage-form').serializeArray();
1959    formData.push({name: 'ajax_q', value: 1});
1960    formData.push({name: 'only_body', value: 1});
1961    formData.push({name: 'form[coupon_code]', value: val});
1962    
1963    $.ajax({
1964      type: "POST",
1965      cache: false,
1966      url: '/order/stage/confirm',
1967      data: formData,
1968      beforeSend: function(){
1969        $submitBtn.find('.coupon__btn-icon').remove();
1970        $submitBtn.addClass('_loading').append('<span class="coupon__btn-icon"><i class="fal fa-circle-notch fa-spin"></i></span>');
1971        $cuponInput.attr("placeholder", "")
1972      },
1973      success: function(data) {
1974        var $discountBlock = $(data).closest('#order-stage-form').find('tr.discount');
1975        var discountName = $discountBlock.find('td.name').text();
1976        var discountPercent = $discountBlock.find('td.percent').html();
1977        var discountType = $discountBlock.data('discount-type')
1978        // console.log('discountType', discountType)
1979        
1980        function getDiscountType(type){
1981          switch (type) {
1982            case 'sum':
1983              return 'по сумме заказа';
1984              break;
1985            case 'cumulative':
1986              return 'накопительная';
1987              break;
1988            case 'coupon':
1989              return 'по купону';
1990              break;
1991            default:
1992              return '';
1993          }
1994        }
1995        if(!discountPercent){
1996          discountPercent = '0'
1997        }
1998        // Записываем название и размер скидки по купону
1999        // $('.cart__sum-row.cart__sum--discount .cart__sum-label').html(discountName);
2000        $('.cart__sum-row.cart__sum--discount .cart__sum-text-price').html(discountPercent);
2001        $('.cart__sum-row.cart__sum--discount .discount-type').html(getDiscountType(discountType));
2002        
2003        // Получаем новую итоговую стоимость заказа
2004        var $totalBlock = $(data).closest('#order-stage-form').find('tr.total');
2005
2006        var discount = $totalBlock.find('td.total-sum').data('discount');
2007        
2008        // Считаем размер скидки
2009        var discountRub = String(Math.floor(orderSumDefault) - Math.floor(discount));
2010        
2011        $('.cart__sum-row.cart__sum--discount .cart__sum-text-price').data('discount-value', discountRub);
2012        
2013        if(discountRub > 0) {
2014          $('.cart__sum-row.cart__sum--discount').show();
2015          if(discountType === 'coupon'){
2016            $submitBtn.addClass('_added').find('.coupon__btn-icon').html('<i class="fal fa-check-circle"></i>');
2017            $cuponInput.removeClass('error')
2018          } else {
2019            // Это не клик по кнопке reset
2020            if(!isResetBtn){
2021              $submitBtn.addClass('_not-add').find('.coupon__btn-icon').html('<i class="fal fa-times-circle"></i>');
2022              $cuponInput.addClass('error');
2023
2024              return;
2025            }
2026            notAddBtn();
2027          }
2028          $cuponInput.parent().addClass('_active')
2029          $submitBtn.removeClass('_loading')
2030        } else {
2031          $('.cart__sum-row.cart__sum--discount').hide();
2032          // Это не клик по кнопке reset
2033          if(!isResetBtn){
2034            $submitBtn.addClass('_not-add').find('.coupon__btn-icon').html('<i class="fal fa-times-circle"></i>');
2035            $cuponInput.addClass('error');
2036
2037            return;
2038          }          
2039          notAddBtn();
2040        }
2041        function notAddBtn(){
2042          $submitBtn.removeClass('_loading _added');
2043          $submitBtn.find('.coupon__btn-icon').remove();
2044          $cuponInput.parent().removeClass('_active');
2045          $cuponInput.attr("placeholder", "Купон очищен");
2046          $cuponInput.removeClass('error')
2047        }
2048        // Пересчитываем итоговую сумму заказа
2049        DeliveryModule.changeCartSum();
2050      },
2051      error: function(){
2052        console.log("Возникла ошибка: Невозможно отправить форму купона.");
2053      }
2054    });
2055  }
2056  
2057  $cuponInput.on('change', function(){
2058      var $input = $(this);
2059      $('.coupon-hidden-input').val($input.val())
2060      
2061      if($input.val()) {
2062        $input.next('.coupon__clear').addClass('_active')
2063      } else {
2064        $input.next('.coupon__clear').removeClass('_active')
2065      }
2066      
2067      ajaxCouponCheck()
2068    }
2069  )
2070  $resetBtn.on('click', function(){
2071    $(this).toggleClass('_active')
2072    $cuponInput.parent().removeClass('_active');
2073    $cuponInput.val('')
2074    $('.coupon-hidden-input').val('')
2075    ajaxCouponCheck(true)
2076  })
2077}
2078
2079// Получение центральной разметки страницы (для быстрого просмотра)
2080$.fn.getColumnContent = function() {
2081  var $block = ($(this).length && $(this).hasClass('product-wrap') ? $(this).filter('.product-wrap') : $('div.product-wrap:eq(0)'));
2082  $block.find('.fancybox-close-small').show();
2083  return $block;
2084}
2085// Функция Быстрого просмотра товара
2086function quickView() {
2087
2088// Быстрый просмотр товара
2089$(function(){
2090  // При наведении на блок товара загружаем контент этого товара, который будет использоваться для быстрого просмотра, чтобы загрузка происходила быстрее.
2091  $('.products-grid .product').mouseover(function() {
2092    // Если в блоке нет ссылки на быстрый просмотр, то не подгружаем никаких данных
2093    var link = $(this).find('a.quickview');
2094    if(link.length < 1) {
2095      return true;
2096    }
2097    // Если массив с подгруженными заранее карточками товара для быстрого просмотра ещё не создан - создадим его.
2098    if(typeof(document.quickviewPreload) == 'undefined') {
2099      document.quickviewPreload = [];
2100    }
2101    var href = link.attr('href');
2102    href += (false !== href.indexOf('?') ? '&' : '?') + 'only_body=1';
2103    // Если контент по данной ссылке ещё не загружен
2104    if(typeof(document.quickviewPreload[href]) == 'undefined') {
2105      // Ставим отметку о том, что мы начали загрузку страницы товара
2106      document.quickviewPreload[href] = 1;
2107      // Делаем запрос на загрузку страницы товара
2108      $.get(href, function(content) {
2109        // Сохраняем контент, необходимый для быстрого просмотра в специально созданный для этого массив
2110        document.quickviewPreload[href] = $(content).getColumnContent();
2111      })
2112      // Если загрузить страницу не удалось, удаляем отметку о том, что мы подгрузили эту страницу
2113      .fail(function() {
2114        delete document.quickviewPreload[href];
2115      });
2116    }
2117  });
2118});
2119}
2120// Действие при нажатии на кнопку быстрого просмотра.  
2121$(function(){
2122  $(document).on('click', 'a.quickview', function() {
2123    var $link = $(this);
2124    $link.find('span').html('<span class="lds-ellipsis"><span></span><span></span><span></span><span></span></span>')
2125    var href = $(this).attr('href');    
2126    href += (false !== href.indexOf('?') ? '&' : '?') + 'only_body=1';
2127    
2128    quickViewShow(href, $link);
2129    return false;
2130  });
2131});
2132// Быстрый просмотр товара
2133function quickViewShow(href, $link) {
2134    $.get(href, function(content) {
2135      $.fancybox.close();
2136      fancyboxShow($(content).getColumnContent())
2137    })
2138    .fail(function() {
2139      alert("Не удалось загрузить быстрый просмотр");
2140    })
2141    .always(function(){
2142      $link.find('span').html('Быстрый просмотр')
2143    })
2144    function fancyboxShow(content){
2145        $.fancybox.open(content, {
2146          baseClass: 'quickView',
2147          beforeShow: function(){
2148            goodsImage()          
2149          },
2150          afterShow: function() {
2151            goodsImage();
2152            goodsMods(true);
2153            addCart();
2154            quantity();
2155            initTabs();
2156            goodspage();
2157            addTo();
2158            lozad().observe();
2159          }        
2160        })    
2161    }
2162}
2163// Функция Быстрого просмотра товара c модификацией
2164function quickViewMod() {
2165  // Действие при нажатии на кнопку в корзину товара c модификацией
2166  $(document).ready(function() {
2167    $(document).on('click', 'a._quickviewmod', function() {
2168      if ($(this).closest('.product._min-card').length){
2169        $(this).addClass('_animated')
2170      }
2171      $(this).find('span').html('<span class="lds-ellipsis"><span></span><span></span><span></span><span></span></span>')      
2172      var href = $(this).attr('href');
2173      href += (false !== href.indexOf('?') ? '&' : '?') + 'only_body=1';
2174      quickViewShowMod(href, $(this));
2175      return false;
2176    });
2177  });
2178}
2179// Быстрый просмотр товара с модификацией
2180function quickViewShowMod(href,  $el) {
2181  $.get(href, function(content) {
2182    $.fancybox.close();
2183    fancyboxShow($(content).find('.product-view__order-wrap'))
2184  })
2185  .fail(function() {
2186    alert("Не удалось загрузить выбор модификаций");
2187  })
2188  .always(function(){
2189    $el.removeClass('_animated').find('span').html('В корзину')
2190  })
2191  function fancyboxShow(content){
2192      $.fancybox.open(content, {
2193        baseClass: 'quickViewMod product-view',
2194        beforeShow: function(){
2195          $('.product-modifications select[id^="select-mod"]').hide();  
2196        },
2197        afterShow: function() {
2198          $('.quickViewMod').addClass('_showed')
2199          if ($el.hasClass('_cart-page')) {
2200            $('.product-view__form').addClass('_in-cart')            
2201          }
2202          goodspage();      
2203          goodsMods(true);
2204          addCart();
2205          quantity();
2206        }        
2207      })    
2208  }
2209}
2210
2211// Функция + - для товаров
2212function quantity() {
2213  $('.qty__btn.qty__btn--plus').off('click').on('click',function(){
2214    var 
2215      quantity = $(this).parent().find('.qty__input'),
2216      currentVal = parseInt(quantity.val());
2217    if (!isNaN(currentVal)){
2218      quantity.val(currentVal + 1);
2219      quantity.trigger('change');
2220    }
2221    return false;
2222  });
2223  $('.qty__btn.qty__btn--minus').off('click').on('click',function(){
2224    var 
2225      quantity = $(this).parent().find('.qty__input'),
2226      currentVal = parseInt(quantity.val());
2227    if (!isNaN(currentVal) && !(currentVal <= 1) ){
2228      quantity.val(currentVal - 1);
2229      quantity.trigger('change');
2230    }
2231    return false;
2232  });
2233  // Если вводят 0 то заменяем на 1
2234  $('.qty .qty__input').off('change').on('change',function(){
2235    if($(this).val() < 1){
2236      $(this).val(1); 
2237    }
2238  });
2239}
2240
2241// Cчётчик скидки(в карточке товара) старой и новой цены
2242function calcDiscount(){
2243  function getDiscountObj (priceNow, priceOld){
2244    if(priceOld) {
2245      return {
2246        price: Math.ceil(priceOld - priceNow),
2247        percent: Math.ceil((priceNow * 100) / priceOld)
2248      }
2249    }
2250  }
2251  var $discountBlock = $('.discount-block');
2252  var priceNow = $discountBlock.data('now-price');
2253  var priceOld = $discountBlock.data('old-price');
2254  var discountObj = getDiscountObj(priceNow, priceOld);
2255  
2256  if(discountObj){
2257    $discountBlock.find('.discount-block__percent-num').text(discountObj.percent);
2258    $discountBlock.find('.discount-block__price-num').text(discountObj.price);
2259    $discountBlock.fadeIn();
2260  } else {
2261    $discountBlock.fadeOut();
2262    $discountBlock.find('.discount-block__percent-num').text(0);
2263    $discountBlock.find('.discount-block__price-num').text(0);    
2264  }
2265}
2266/* Скрипты для карточки товара */
2267function goodspage() {
2268  // Модификация селектов  
2269  $('.product-modifications select[id^="select-mod"]').styler({
2270    onFormStyled: function () {      
2271      $('.product-modifications select[id^="select-mod"]').addClass('_visible')
2272    }
2273  });  
2274  // Валидация отзывов
2275  $('.goods-opinion-form').validate();
2276
2277  // Добавление отзыва о товаре. Рейтинг
2278  if(typeof($('.goods-opinion-form__rating').rating) == "function" ) {
2279    $('.goods-opinion-form__rating input').rating({
2280      split: 2,
2281      required: true
2282    });
2283  }
2284
2285  // Иконка для обновления изображение капчи
2286  $('.goods-opinion-form__captcha-refresh-button').on('click',function(){
2287    RefreshImageAction(this,1,1);
2288    $('.goods-opinion-form__captcha-img').attr('src',$('.goods-opinion-form__captcha-img').attr('src') + '&rand' + Math.random(0,10000));
2289    return false;
2290  });
2291
2292  // AJAX отправка отзыва
2293  $('.goods-opinion-form__submit-button').on('click',function(){
2294    var $btn = $(this);
2295    // Находим форму, которую отправляем на сервер, для добавления товара в корзину
2296    var $form =  $('.goods-opinion-form');
2297    // return;
2298    if($form.valid()){
2299      // Получаем данные формы, которые будем отправлять на сервер
2300      var formData = $form.serializeArray();
2301      // Сообщаем серверу, что мы пришли через ajax запрос
2302      formData.push({name: 'ajax_q', value: 1});
2303      
2304      $.ajax({
2305        type: "POST",
2306        cache: false,
2307        url: $form.attr('action'),
2308        data: formData,
2309        beforeSend: function(){
2310          $btn.addClass('_loading').html('<span class="lds-ellipsis pink"><span></span><span></span><span></span><span></span></span>'); 
2311        },
2312        success: function(data) {
2313          var REVIEWS_INDEX = 5;
2314          var $noticeBlock = $(data).find('#goods-opinion-notice');
2315          
2316          if($noticeBlock.data('opinion-type') === 'success') {
2317            $('.goods-opinion .goods-opinion__body').show()
2318            $('.product-view__rating').html($(data).find('.product-view__rating').html())
2319            $('.goods-opinion-counter').html($(data).find('.goods-opinion-counter').html())
2320            $('.goods-opinion-list').html($(data).find('.goods-opinion-list').html())
2321            var opinionsCount = $('.goods-opinion-list').find('.opinion-item').length;
2322            if(opinionsCount > REVIEWS_INDEX){
2323              $('#goods-opinion__more-button').show();
2324            }
2325            
2326            $form.trigger('reset')
2327          } else {
2328            $('.goods-opinion-form__captcha-refresh-button').trigger('click');
2329          }
2330          new Noty({
2331            timeout: "7000",
2332            text: '<div class="noty_content">' + $noticeBlock.text() +'</div>',
2333            type: $noticeBlock.data('opinion-type')
2334          }).show()
2335          
2336          $btn.removeClass('_loading').html($btn.data('default-text'));
2337        }
2338      });
2339    
2340      return false
2341    }
2342  })
2343  // Показать больше отзывов
2344  $('#goods-opinion__more-button').on('click',function(){
2345    var REVIEWS_INDEX = 5;
2346    var opinionsCount = $('.opinion-item').length;
2347    $('.opinion-item').not(':visible').slice(0, REVIEWS_INDEX).show();
2348    var opinionVisibleCountNow = $('.opinion-item').not(':visible').length;
2349    
2350    if(!opinionVisibleCountNow) {
2351      $(this).hide()
2352    }
2353    return false;
2354  })
2355  // Доставка кнопка "Подробнее"
2356  $('.goods-delivery .goods-delivery__title').on('click',function(){
2357    var $btn = $(this).find('.goods-delivery__more-btn');
2358    
2359    $(this).parent().find('.goods-delivery__content').toggle();
2360    
2361    if($btn.hasClass('_active')){
2362      $btn.html('<svg class="icon"><use xlink:href="/design/sprite.svg#plus-icon"></use></svg>').removeClass('_active');
2363      return;
2364    }
2365    
2366    $btn.addClass('_active').html('<svg class="icon"><use xlink:href="/design/sprite.svg#minus-icon"></use></svg>')
2367  })
2368  
2369  // Сопутствующие | С этим товаром смотрят
2370  $(".pdt-related-views .products-grid,  .pdt-related .products-grid").owlCarousel(
2371  $.extend(OWL_DEFAULT,
2372  {
2373    items: 4,
2374    responsive: {
2375      0:{items:1},
2376      320:{items:1},
2377      480:{items:1},
2378      540:{items:2},
2379      768:{items:3},
2380      992:{items:4},
2381      1200:{items:4, nav: true, margin: 15, autoWidth: false}
2382    }
2383  }
2384  ));  
2385}
2386
2387// Скрипты модификации товара
2388function goodsMods(inFancybox){
2389  // Функция собирает свойства в строку, для определения модификации товара
2390  function getSlugFromGoodsDataFormModificationsProperties(obj) {
2391    var properties = new Array();
2392    $(obj).each(function(i){
2393      properties[i] = parseInt($(this).val());
2394    });
2395    return properties.sort(function(a,b){return a - b}).join('_');
2396  }
2397   
2398  var 
2399    // Запоминаем поля выбора свойств, для ускорения работы со значениями свойств
2400    goodsDataProperties = (inFancybox) ? $('.fancybox-content form.product-view__form select[name="form[properties][]"]') : $('form.product-view__form select[name="form[properties][]"]'),
2401    // Запоминаем блоки с информацией по модификациям, для ускорения работы
2402    goodsDataModifications = (inFancybox) ? $('.fancybox-content div.product-modifications__list') : $('div.product-modifications__list');
2403    
2404  // Обновляет возможность выбора свойств модификации, для отключения возможности выбора по характеристикам модификации которой не существует.
2405  function updateVisibility (y) {
2406    // Проверяем в каждом соседнем поле выбора модификаций, возможно ли подобрать модификацию для указанных свойств
2407    goodsDataProperties.each(function(j){
2408      // Если мы сравниваем значения свойства не с самим собой, а с другим списком значений свойств
2409      if( j != y ) {
2410        // Проходим по всем значениям текущего свойства модификации товара
2411        $(this).find('option').each(function(){
2412          // Записываем временный массив свойств, которые будем использовать для проверки существования модификации
2413          var checkProperties = new Array();
2414          $(goodsDataProperties).each(function(i){
2415            checkProperties[i] = parseInt($(this).val());
2416          });
2417          // Пытаемся найти модификацию соответствующую выбранным значениям свойств
2418          checkProperties[j] = parseInt($(this).attr('value'));
2419          // Собираем хэш определяющий модификацию по свойствам
2420          slug = checkProperties.sort(function(a,b){return a - b}).join('_');
2421          // Ищем модификацию по всем выбранным значениям свойств товара. Если модификации нет в возможном выборе, отмечаем потенциальное значение выбора как не доступное для выбора, т.к. такой модификации нет.
2422          if(!goodsDataModifications.filter('[rel="'+slug+'"]').length) {
2423           $(this).attr('disabled', true);
2424          // Если выбрав данное значение свойства товара можно подобрать модификацию, то выделяем вариант выбора как доступный.
2425          } else {
2426            $(this).attr('disabled', false);
2427          }
2428        });
2429      }
2430    });
2431  }
2432  // Обновляем возможность выбора модификации товара по свойствам. Для тех свойств, выбор по которым не возможен, отключаем такую возможность.
2433  // Проверяем возможность выбора на всех полях кроме первого, чтобы отключить во всех остальных варианты, которые не возможно выбрать
2434  updateVisibility (0);
2435  // Проверяем возможность выбора на всех полях кроме второго, чтобы в первом поле так же отключилась возможность выбора не существующих модификаций
2436  updateVisibility (1);
2437
2438  // Изменение цены товара при изменении у товара свойства для модификации
2439  goodsDataProperties.each(function(){
2440    $(this).on('change', function(){
2441      var slug = getSlugFromGoodsDataFormModificationsProperties(goodsDataProperties),
2442        modificationBlock             = $('.product-modifications__list[rel="'+slug+'"]'),
2443        modificationId                = parseInt(modificationBlock.find('[name="id"]').val()),
2444        modificationArtNumber         = modificationBlock.find('[name="art_number"]').val(),
2445        modificationPriceNow          = parseInt(modificationBlock.find('[name="price_now"]').val()),
2446        modificationPriceNowFormated  = modificationBlock.find('.price_now_formated').html(),
2447        modificationPriceOld          = parseInt(modificationBlock.find('[name="price_old"]').val()),
2448        modificationPriceOldFormated  = modificationBlock.find('.price_old_formated').html(),
2449        modificationRestValue         = parseFloat(modificationBlock.find('[name="rest_value"]').val()),
2450        modificationDescription       = modificationBlock.find('.description').html(),
2451        modificationMeasureId         = parseInt(modificationBlock.find('[name="measure_id"]').val()),
2452        modificationMeasureName       = modificationBlock.find('[name="measure_name"]').val(),
2453        modificationMeasureDesc       = modificationBlock.find('[name="measure_desc"]').val(),
2454        modificationMeasurePrecision  = modificationBlock.find('[name="measure_precision"]').val(),
2455        modificationIsHasInCompareList= modificationBlock.find('[name="is_has_in_compare_list"]').val(),
2456        modificationGoodsModImageId   = modificationBlock.find('[name="goods_mod_image_id"]').val(),
2457        goodsModificationId           = $('.goodsDataMainModificationId'),
2458        goodsPriceNow                 = $('.goodsDataMainModificationPriceNow'),
2459        goodsPriceOld                 = $('.goodsDataMainModificationPriceOld'),
2460        goodsAvailable                = $('.product-view__available'),
2461        goodsAvailableTrue            = goodsAvailable.find('.product-view__available-item').filter('._available'),
2462        goodsAvailableFalse           = goodsAvailable.find('.product-view__available-item').filter('._not-available'),
2463        goodsAvailableAddCart         = $('.product-view__actions._add-to-form .product-view__add-buttons'),
2464        goodsArtNumberBlock           = $('.product-view__art-number'),
2465        goodsArtNumber                = goodsArtNumberBlock.find('span'),
2466        goodsCompareAddButton         = $('.goodsDataCompareButton.add'),
2467        goodsCompareDeleteButton      = $('.goodsDataCompareButton.delete'),
2468        goodsModDescriptionBlock      = $('.product-modifications__description'),
2469        goodsModEmpty      = $('.product-view__mod-empty');
2470       
2471      // Изменяем данные товара для выбранных параметров. Если нашлась выбранная модификация
2472      if(modificationBlock.length) {
2473        // Цена товара
2474        goodsPriceNow.html(modificationPriceNowFormated);
2475        $('.discount-block').data('now-price', modificationPriceNow);
2476        // Старая цена товара
2477        if(modificationPriceOld > modificationPriceNow) {
2478          goodsPriceOld.show().html(modificationPriceOldFormated);
2479          $('.discount-block').data('old-price', modificationPriceOld);
2480        } else {
2481          goodsPriceOld.hide().html('');
2482          $('.discount-block').data('old-price', 0);
2483        }
2484        // Считаем скидку в блоке
2485        calcDiscount();
2486        // Есть ли товар есть в наличии
2487        if(modificationRestValue>0) {
2488          goodsAvailableTrue.show();
2489          goodsAvailableFalse.hide();
2490          goodsAvailableAddCart.show();
2491          goodsModEmpty.hide();
2492        // Если товара нет в наличии
2493        } else {
2494          goodsAvailableTrue.hide();
2495          goodsAvailableFalse.show();
2496          goodsAvailableAddCart.hide();
2497          goodsModEmpty.show();
2498        }
2499        // Если товар есть в списке сравнения
2500        if(modificationIsHasInCompareList>0) {
2501          goodsCompareAddButton.hide();
2502          goodsCompareDeleteButton.show();
2503        // Если товара нет в списке сравнения
2504        } else {
2505          goodsCompareAddButton.show();
2506          goodsCompareDeleteButton.hide();
2507        }
2508        // Покажем артикул модификации товара, если он указан
2509        if(modificationArtNumber.length>0) {
2510          goodsArtNumberBlock.show();
2511          goodsArtNumber.html(modificationArtNumber);
2512        // Скроем артикул модификации товара, если он не указан
2513        } else {
2514          goodsArtNumberBlock.hide();
2515          goodsArtNumber.html('');
2516        }
2517        // Описание модификации товара. Покажем если оно есть, спрячем если его у модификации нет
2518        if(modificationDescription.length > 0) {
2519          goodsModDescriptionBlock.show().html('<div>' + modificationDescription + '</div>');
2520        } else {
2521          goodsModDescriptionBlock.hide().html();
2522        }
2523        // Идентификатор товарной модификации
2524        goodsModificationId.val(modificationId);
2525        // Меняет главное изображение товара на изображение с идентификатором goods_mod_image_id
2526        function changePrimaryGoodsImage(goods_mod_image_id) {
2527          // Если не указан идентификатор модификации товара, значит ничего менять не нужно.
2528          if(1 > goods_mod_image_id) {
2529            return true;
2530          }
2531          var 
2532            // Блок с изображением выбранной модификации товара
2533            goodsModImageBlock = $('.image-list [data-id="' + parseInt(goods_mod_image_id) + '"'),
2534            // Блок, в котором находится главное изображение товара
2535            MainImageBlock = $('.product-view__main-image'),
2536            // Изображение модификации товара, на которое нужно будет изменить главное изображение товара.
2537            MediumImageUrl = goodsModImageBlock.find('a').attr('href'),
2538            // Главное изображение, в которое будем вставлять новое изображение
2539            MainImage = MainImageBlock.find('img'),
2540            // В этом объекте хранится идентификатор картинки главного изображения для коректной работы галереи изображений
2541            MainImageIdObject = MainImageBlock.attr('data-id')
2542          ;
2543          
2544          // Если изображение модификации товара найдено - изменяем главное изображение
2545          MainImage.attr('src', MediumImageUrl);
2546          MainImageBlock.find('a').attr('href', MediumImageUrl);
2547          // Изменяем идентификатор главного изображения
2548          MainImageBlock.attr("data-id", parseInt(goods_mod_image_id));
2549          return true;
2550        }
2551        // Обновляем изображние модификации товара, если оно указано
2552        changePrimaryGoodsImage(modificationGoodsModImageId);        
2553      } else {
2554        // Отправим запись об ошибке на сервер
2555        sendError('no modification by slug '+slug);
2556        alert('К сожалению сейчас не получается подобрать модификацию соответствующую выбранным параметрам.');
2557      }
2558    });
2559  });  
2560}
2561// Скрипты для изображения товара
2562function goodsImage() {
2563  // Изображения товара
2564  $(function(){
2565    $('.image-list').not('.slick-initialized').slick({
2566      slidesToShow: 3,
2567      slidesToScroll: 3,
2568      dots: false,
2569      arrows: false,
2570      vertical: true,
2571      verticalSwiping: true,
2572      // centerMode: false,
2573      focusOnSelect: true,
2574      infinite: false
2575    });
2576  })
2577}
2578// Инициализация табов на странице товара
2579function initTabs() {
2580  // Блок в котором находятся табы
2581  var tabBlock = $('.product-tabs');
2582  if(!tabBlock.length) {
2583    return false;
2584  }
2585  // По умолчанию делаем отметку о том что активного таба не найдено
2586  var isFind = 0;
2587  tabBlock.find('.tabs-list__item-link').each(function(i){
2588    // Если нашёлся активный там
2589    if($(this).hasClass('_active')) {
2590      // Инициализируем найденный таб
2591      $(this).click();
2592      // Ставим отметку, о том что не нужно инициализировать первый таб на странице
2593      isFind = 1;
2594    }
2595  });
2596  
2597  // Если не найдено ни одного таба с отметкой о том что он активен
2598  if(!isFind) {
2599    // Ставим активным первый таб на странице.
2600    var tab = $('.tabs-list .tabs-list__item .tabs-list__item-link').attr('id').slice(-1);
2601    tabSwitch(tab, true);
2602  }
2603  // Проверяет хэш и если по нему была открыта вкладка, то эта функция автоматически откроет её.
2604  checkTabHash();  
2605  // Биндим изменение хэша - проверка какой таб нужно открыть.
2606  $(window).bind('hashchange', function() { checkTabHash(); });  
2607}
2608
2609// Проверяет хэш, переданый пользователем и открывает соответствующий раздел
2610function checkTabHash() {
2611  // Определяем текущий хэш страницы
2612  var hash = window.location.hash.substr(1);
2613  if(hash == 'goodsDataOpinionAdd') {
2614    hash = 'show_tab_4';
2615  }
2616  if(!hash.length || hash.indexOf('show_tab_') == -1) {
2617    return false;
2618  }
2619  // Открываем тот таб, который был указан в hash-е
2620  tabSwitch(hash.replace("show_tab_", ''))
2621}
2622
2623// Выбор вкладки на странице товара
2624function tabSwitch(nb, noScroll) {
2625  var tabBlock = $('.product-tabs');
2626  tabBlock.find('.tabs-list__item-link').removeClass('_active');
2627  tabBlock.find('.tabs-content__item').hide();
2628  $('#tab_' + nb).addClass('_active');
2629  $('#content_' + nb).show();
2630  if('#goodsDataOpinionAdd' != document.location.hash && !noScroll) {
2631    // Записываем в хэш информацию о том какой таб сейчас открыт, для возможности скопировать и передать ссылку с открытым нужным табом
2632    document.location.hash = "#show_tab_" + nb;  
2633  }  
2634}
2635/* END карточка товара */
2636
2637// Функции для главной страницы
2638function indexPage() {
2639  // Слайдер на главной
2640  var $slideshow = $('#slideshow .slideshow__container');
2641  
2642  $slideshow.owlCarousel({
2643    items: 1,
2644    smartSpeed: 500,
2645    autoplay: true,
2646    loop:true,
2647    lazyLoad: true,
2648    dots: true,
2649    mouseDrag: true,
2650    touchDrag: true,
2651    pullDrag: true,
2652    animateOut: 'fadeOut',
2653  });
2654  // Слайдер категорий на главной
2655  var $categories = $('.categories-list');
2656  
2657  $categories.owlCarousel(
2658  $.extend(OWL_DEFAULT,  
2659  {
2660    animateOut: 'fadeOut',
2661    onInitialized: function(event){
2662      var colorsArray = ['#e2d4c4','#e2d4c4','#e2d4c4','#e2d4c4','#e2d4c4','#e2d4c4']
2663      var element = event.target; 
2664      var items = event.item.count;
2665
2666      for(var i = 0; i <= items; i++ ){
2667        var currentColor = (i >= colorsArray.length) ? colorsArray[Math.abs(colorsArray.length - i)] : colorsArray[i];
2668        
2669        $(element).find('.owl-item').eq(i).find('.categories-list__item').css('background', currentColor)
2670      }
2671    },
2672    responsive: {
2673      0:{items:1},
2674      320:{items:2},
2675      480:{items:3},
2676      540:{items:3},
2677      768:{items:5},
2678      992:{items:5},
2679      1200:{items:6, nav: true,margin: 15, autoWidth: false}
2680    }    
2681  }));
2682  
2683  
2684  // Товары на главной | Хиты | Новинки |Распродажа
2685  $(".pdt-index .products-grid, .pdt-favorites .products-grid, .pdt-new .products-grid, .pdt-sale .products-grid").owlCarousel(
2686  $.extend(OWL_DEFAULT,
2687  {
2688    items: 4,
2689    responsive: {
2690      0:{items:1},
2691      320:{items:1},
2692      480:{items:1},
2693      540:{items:2},
2694      768:{items:3},
2695      992:{items:4},
2696      1200:{items:4, nav: true, margin: 15, autoWidth: false}
2697    }
2698  }
2699  ));
2700  // Баннеры на главной
2701  $(function(){
2702    var $bannersMobile = $('.banners-mobile');
2703    $('#banners').find('.banner').each(function(i, el){
2704      var $banner = $(el).clone().addClass('_mobile');
2705
2706      if(i % 2 === 0){
2707        var $row = $('<div>').addClass('banners-mobile__row')
2708        $bannersMobile.append($row)
2709      }
2710      $bannersMobile.find('.banners-mobile__row:last').append($banner);
2711      $bannersMobile.find('.banner').each(function(){
2712        var $bannerLink = $(this).find('a');
2713        $bannerLink.attr('data-background-image', $bannerLink.attr('data-mobile-bg'))
2714      })
2715      lozad().observe();
2716    })
2717    
2718    function bannersSlider() {
2719      if(getClientWidth() <= 375){
2720        $bannersMobile.addClass('owl-carousel').owlCarousel({
2721          items: 1,
2722          margin: 15
2723        })
2724      } else {
2725        $bannersMobile.trigger('destroy.owl.carousel')
2726      }
2727    }
2728    bannersSlider();
2729    
2730    $(window).resize(function(){
2731        bannersSlider();
2732    })
2733  })
2734
2735  // Преимущества
2736  $(".our-features-list").owlCarousel(
2737  $.extend(OWL_DEFAULT,
2738      {
2739    items: 4,
2740    animateOut: 'fadeOut',
2741    onInitialized: function(event){
2742      var colorsArray = ['#f5f7f7','#f5f7f7','#f5f7f7','#f5f7f7']
2743      var element = event.target; 
2744      var items = event.item.count;
2745
2746      for(var i = 0; i <= items; i++ ){
2747        var currentColor = (i >= colorsArray.length) ? colorsArray[Math.abs(colorsArray.length - i)] : colorsArray[i];
2748        
2749        $(element).find('.owl-item').eq(i).find('.our-features-list__item').css('background', currentColor)
2750      }
2751    },
2752    responsive: {
2753      0:{items:1},
2754      320:{items:1},
2755      480:{items:1},
2756      540:{items:2},
2757      768:{items:4},
2758      992:{items:4},
2759      1200:{items:4, nav: true, margin: 15, autoWidth: false}
2760    }
2761  }
2762  ));  
2763  
2764  // Слайдер новостей (все новости без группировки)
2765  $(".news .news__list").owlCarousel(
2766    $.extend(OWL_DEFAULT,
2767    {
2768    items: 2,
2769    onInitialized: function(event){
2770      var colorsArray = ['#ef7b4f', '#ef7b4f']
2771      var element = event.target; 
2772      var items = event.item.count;
2773
2774      for(var i = 0; i <= items; i++ ){
2775        var currentColor = (i >= colorsArray.length) ? colorsArray[Math.abs(colorsArray.length - i)] : colorsArray[i];
2776        
2777        $(element).find('.owl-item').eq(i).find('.news__item').css('border-color', currentColor)
2778      }
2779    },    
2780    responsive:{
2781      0:{items:1},
2782      576:{items:2},
2783      992:{items:2},
2784      1199:{items:2, nav: true,margin: 15, autoWidth: false}
2785    }
2786  }));
2787  // Счётчик даты в акциях
2788  $(function(){counterDate()})  
2789}
2790
2791// Предзагрузчик
2792function preloadHide(currentPreloader, nodelay) {
2793  var $preloader = currentPreloader || $('.preloader'),
2794  $spinner = $preloader.find('.content-loading');
2795  $spinner.fadeOut();
2796  $preloader.delay(nodelay || 500).fadeOut('slow');
2797}
2798
2799function preloadShow(currentPreloader) {
2800  var $preloader = currentPreloader || $('.preloader'),
2801  $spinner = $preloader.find('.content-loading');
2802  $spinner.show();
2803  $preloader.show();
2804}
2805function preloadButton($button) {
2806  $button.html('<span class="lds-ellipsis"><span></span><span></span><span></span><span></span></span>')
2807}
2808
2809// Загрузка основных функций шаблона
2810$(function(){
2811  mainFunctions();
2812  addCart();
2813  quantity();
2814  quickView();
2815  quickViewMod();
2816  // Запуск Избранное & Сравнение
2817  addTo();
2818});
2819
2820// Запуск основных функций для разных разрешений экрана
2821$(function(){
2822  if(getClientWidth() > 767){
2823    
2824  }
2825  // Запуск функций при изменении экрана
2826  $(window).resize(function(){
2827    if(getClientWidth() > 767){
2828
2829    }
2830  });
2831});
2832
2833// Наверх
2834$(function(){
2835	// fade in #back-top
2836	var $topBtn = $('#back-top');
2837	
2838	$(window).scroll(function () {
2839		if ($(this).scrollTop() > 100) {
2840			$topBtn.addClass('_active');
2841		} else {
2842			$topBtn.removeClass('_active');
2843		}		
2844  });
2845  
2846	$topBtn.on('click',function () {
2847		$('body, html').animate({
2848			scrollTop: 0
2849		}, 800);
2850		return false;
2851	});
2852});
2853// Модальное окно
2854$(function(){
2855  function modal() {
2856    if(!$.cookie('modal')){
2857      // Если cookie не установлено появится окно с задержкой 3 секунды
2858      var delay = 3000;
2859      var data = $("#fancybox-popup").html();
2860      setTimeout(function(){
2861        $.fancybox.open(data,{
2862          autoSize: true,
2863          maxWidth: 700,
2864          padding: 15,
2865          content: data
2866        });       
2867      }, delay)
2868      
2869     // Запоминаем в куках, что посетитель уже заходил
2870     $.cookie('modal', true, {
2871      // Время хранения cookie в днях
2872       expires: 1,
2873       path: '/'
2874     });    
2875    }
2876  }  
2877  // Уберите комментарии // со строчек ниже для запуска
2878  // modal();
2879})
2880
2881// Отсчет даты до окончания акции
2882function counterDate() {
2883  // Устанавливаем дату обратного отсчета ММ-ДД-ГГ
2884  $('.ico._sale-counter').each(function(i, el){
2885    var end = $(el).attr('end');
2886    var countDownDate = new Date(end).getTime();
2887    // Обновление счетчика каждую секунду
2888    var x = setInterval(function() {
2889      var now = new Date().getTime();
2890      var distance = countDownDate - now;
2891      var days = Math.floor(distance / (1000 * 60 * 60 * 24));
2892      var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
2893      var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
2894      var seconds = Math.floor((distance % (1000 * 60)) / 1000);
2895      // Вывод
2896      $(el).find('.days span').text(days);
2897      $(el).find('.hours span').text(hours);
2898      $(el).find('.minutes span').text(minutes);
2899      $(el).find('.seconds span').text(seconds);
2900      // Счетчик завершен
2901      if (distance < 0) {
2902        clearInterval(x);
2903        $(el).find('span').text("0");
2904      }
2905    }, 1000);
2906  })
2907}
2908// Форма поиска ( Сразу же помечаем объект поиска, как инициализированный, чтобы случайно не инициализировать его дважды.)
2909function SearchFieldInit(obj) {
2910    // Блок в котором лежит поле поиска
2911    obj.f_search = obj.find('.search__form');
2912    // Если поля поиска не нашлось, завершаем работу, ничего страшного.
2913    if(0 == obj.f_search.length) {
2914      return false;
2915    }
2916    // Поле поиска товара
2917    obj.s_search = obj.f_search.find('.search__input');
2918    // Обнуление данных в форме поиска
2919    obj.s_reset  = obj.f_search.find('.search__form-reset-btn');
2920    // Проверка на существование функции проверки поля и действий с ним
2921    if(typeof(obj.SearchFieldCheck) != 'function') {
2922      console.log('function SearchFieldCheck is not found in object for SearchFieldInit', {status: 'error'});
2923      return false;
2924    // Проверка, сколько полей поиска нам подсунули за раз на инициализацию
2925    } else if(1 < obj.f_search.length) {
2926      console.log('function SearchFieldInit must have only one search object', {status: 'error'});
2927      return false;
2928    }
2929    // Создаём функцию которая будет отвечать за основные действия с полем поиска
2930    obj.__SearchFieldCheck = function (isAfter) {
2931      // Если в поле текста есть вбитые данные
2932      if(obj.s_search.val().length) {
2933        obj.f_search.addClass('search__filled');
2934        $('.catalog-button').addClass('search__filled');
2935      } else {
2936        obj.f_search.removeClass('search__filled');
2937        $('.catalog-button').removeClass('search__filled');
2938      }
2939      // При нажатии клавиши данных внутри поля ещё нет, так что проверки вернут информацию что менять поле не нужно, хотя как только операция будет завершена данные в поле появятся. Поэтому произведём вторую проверку спустя 2 сотых секунды.
2940      if(typeof( isAfter ) == "undefined" || !isAfter) {
2941        setTimeout(function() { obj.__SearchFieldCheck(1); },20);
2942      }else{
2943        return obj.SearchFieldCheck();
2944      }
2945    }
2946    // Действия с инпут полем поиска
2947    obj.s_search.click(function(){
2948      obj.__SearchFieldCheck();
2949    }).focus(function(){
2950      obj.f_search.addClass('search__focused');
2951      obj.__SearchFieldCheck();
2952    }).blur(function(){
2953      obj.f_search.removeClass('search__focused');
2954      obj.__SearchFieldCheck();
2955    }).keyup(function(I){
2956  		switch(I.keyCode) {
2957  			// игнорируем нажатия на эти клавишы
2958  			case 13:  // enter
2959  			case 27:  // escape
2960  			case 38:  // стрелка вверх
2961  			case 40:  // стрелка вниз
2962  			break;
2963  
2964  			default:
2965          obj.f_search.removeClass('search__focused');
2966          obj.__SearchFieldCheck();
2967  		  break;
2968		  }			
2969    }).bind('paste', function(e){
2970      obj.__SearchFieldCheck();
2971      setTimeout(function() { obj.__SearchFieldCheck(); },20);
2972    }).bind('cut', function(e){
2973      $('#search-result').hide();
2974      $('#search-result .search__result-inner .result-item').remove();
2975      obj.__SearchFieldCheck();
2976    });
2977  	//Считываем нажатие клавиш, уже после вывода подсказки
2978	  var suggestCount;
2979	  var suggestSelected = 0;
2980	  
2981    function keyActivate(n){
2982      var $links = $('#search-result .result-item a');
2983    	$links.eq(suggestSelected-1).removeClass('_active');
2984    
2985    	if(n == 1 && suggestSelected < suggestCount){
2986    		suggestSelected++;
2987    	}else if(n == -1 && suggestSelected > 0){
2988    		suggestSelected--;
2989    	}
2990    	if( suggestSelected > 0){
2991    		$links.eq(suggestSelected-1).addClass('_active');
2992    	}
2993    }
2994  	obj.s_search.keydown(function(I){
2995  		switch(I.keyCode) {
2996  			// По нажатию клавиш прячем подсказку
2997  			case 27: // escape
2998  				$('#search-result').hide();
2999  				return false;
3000  			break;
3001  			// Нажатие enter при выделенном пункте из поиска
3002  			case 13: // enter
3003  			  if(suggestSelected){
3004    			  var $link = $('#search-result .result-item').eq(suggestSelected - 1).find('a');
3005    			  var href = $link.attr('href');
3006    			  if(href){
3007    			    document.location = href
3008    			  } else {
3009    			    $link.trigger('click')
3010    			  }
3011    			  return false;
3012  			  }
3013  			break;
3014  			// делаем переход по подсказке стрелочками клавиатуры
3015  			case 38: // стрелка вверх
3016  			case 40: // стрелка вниз
3017  				I.preventDefault();
3018  				suggestCount = $('#search-result .result-item').length
3019  				if(suggestCount){
3020  					//делаем выделение пунктов в слое, переход по стрелочкам
3021  					keyActivate(I.keyCode-39);
3022  				}
3023  			break;
3024  			default:
3025  			suggestSelected = 0;
3026  			break;
3027  		}
3028  	});
3029  	
3030    // Кнопка обнуления данных в форме поиска
3031    obj.s_reset.click(function(){
3032      obj.s_search.val('').focus();
3033      $('#search-result').hide();
3034      $('#search-result .search__result-inner .result-item').remove();
3035    })
3036    // Проверка данных в форме после инициализации функционала. Возможно браузер вставил туда какой-либо текст, нужно обработать и такой вариант
3037    obj.__SearchFieldCheck();
3038  }
3039// Аналог php функции.
3040function htmlspecialchars(text) {
3041  return text
3042    .replace(/&/g, "&amp;")
3043    .replace(/</g, "&lt;")
3044    .replace(/>/g, "&gt;")
3045    .replace(/"/g, "&quot;")
3046    .replace(/'/g, "&#039;");
3047}
3048function substr(str,start,len){str+='';var end=str.length;if(start<0){start+=end;}end=typeof len==='undefined'?end:(len<0?len+end:len+start);return start>=str.length||start<0||start>end?!1:str.slice(start,end);}
3049function md5(str){var xl;var rotateLeft=function(lValue,iShiftBits){return(lValue<<iShiftBits)|(lValue>>>(32-iShiftBits));};var addUnsigned=function(lX,lY){var lX4,lY4,lX8,lY8,lResult;lX8=(lX&0x80000000);lY8=(lY&0x80000000);lX4=(lX&0x40000000);lY4=(lY&0x40000000);lResult=(lX&0x3FFFFFFF)+(lY&0x3FFFFFFF);if(lX4&lY4){return(lResult^0x80000000^lX8^lY8);}
3050if(lX4|lY4){if(lResult&0x40000000){return(lResult^0xC0000000^lX8^lY8);}else{return(lResult^0x40000000^lX8^lY8);}}else{return(lResult^lX8^lY8);}};var _F=function(x,y,z){return(x&y)|((~x)&z);};var _G=function(x,y,z){return(x&z)|(y&(~z));};var _H=function(x,y,z){return(x^y^z);};var _I=function(x,y,z){return(y^(x|(~z)));};var _FF=function(a,b,c,d,x,s,ac){a=addUnsigned(a,addUnsigned(addUnsigned(_F(b,c,d),x),ac));return addUnsigned(rotateLeft(a,s),b);};var _GG=function(a,b,c,d,x,s,ac){a=addUnsigned(a,addUnsigned(addUnsigned(_G(b,c,d),x),ac));return addUnsigned(rotateLeft(a,s),b);};var _HH=function(a,b,c,d,x,s,ac){a=addUnsigned(a,addUnsigned(addUnsigned(_H(b,c,d),x),ac));return addUnsigned(rotateLeft(a,s),b);};var _II=function(a,b,c,d,x,s,ac){a=addUnsigned(a,addUnsigned(addUnsigned(_I(b,c,d),x),ac));return addUnsigned(rotateLeft(a,s),b);};var convertToWordArray=function(str){var lWordCount;var lMessageLength=str.length;var lNumberOfWords_temp1=lMessageLength+8;var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1%64))/64;var lNumberOfWords=(lNumberOfWords_temp2+1)*16;var lWordArray=new Array(lNumberOfWords-1);var lBytePosition=0;var lByteCount=0;while(lByteCount<lMessageLength){lWordCount=(lByteCount-(lByteCount%4))/4;lBytePosition=(lByteCount%4)*8;lWordArray[lWordCount]=(lWordArray[lWordCount]|(str.charCodeAt(lByteCount)<<lBytePosition));lByteCount++;}
3051lWordCount=(lByteCount-(lByteCount%4))/4;lBytePosition=(lByteCount%4)*8;lWordArray[lWordCount]=lWordArray[lWordCount]|(0x80<<lBytePosition);lWordArray[lNumberOfWords-2]=lMessageLength<<3;lWordArray[lNumberOfWords-1]=lMessageLength>>>29;return lWordArray;};var wordToHex=function(lValue){var wordToHexValue="",wordToHexValue_temp="",lByte,lCount;for(lCount=0;lCount<=3;lCount++){lByte=(lValue>>>(lCount*8))&255;wordToHexValue_temp="0"+lByte.toString(16);wordToHexValue=wordToHexValue+wordToHexValue_temp.substr(wordToHexValue_temp.length-2,2);}
3052return wordToHexValue;};var x=[],k,AA,BB,CC,DD,a,b,c,d,S11=7,S12=12,S13=17,S14=22,S21=5,S22=9,S23=14,S24=20,S31=4,S32=11,S33=16,S34=23,S41=6,S42=10,S43=15,S44=21;str=this.utf8_encode(str);x=convertToWordArray(str);a=0x67452301;b=0xEFCDAB89;c=0x98BADCFE;d=0x10325476;xl=x.length;for(k=0;k<xl;k+=16){AA=a;BB=b;CC=c;DD=d;a=_FF(a,b,c,d,x[k+0],S11,0xD76AA478);d=_FF(d,a,b,c,x[k+1],S12,0xE8C7B756);c=_FF(c,d,a,b,x[k+2],S13,0x242070DB);b=_FF(b,c,d,a,x[k+3],S14,0xC1BDCEEE);a=_FF(a,b,c,d,x[k+4],S11,0xF57C0FAF);d=_FF(d,a,b,c,x[k+5],S12,0x4787C62A);c=_FF(c,d,a,b,x[k+6],S13,0xA8304613);b=_FF(b,c,d,a,x[k+7],S14,0xFD469501);a=_FF(a,b,c,d,x[k+8],S11,0x698098D8);d=_FF(d,a,b,c,x[k+9],S12,0x8B44F7AF);c=_FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);b=_FF(b,c,d,a,x[k+11],S14,0x895CD7BE);a=_FF(a,b,c,d,x[k+12],S11,0x6B901122);d=_FF(d,a,b,c,x[k+13],S12,0xFD987193);c=_FF(c,d,a,b,x[k+14],S13,0xA679438E);b=_FF(b,c,d,a,x[k+15],S14,0x49B40821);a=_GG(a,b,c,d,x[k+1],S21,0xF61E2562);d=_GG(d,a,b,c,x[k+6],S22,0xC040B340);c=_GG(c,d,a,b,x[k+11],S23,0x265E5A51);b=_GG(b,c,d,a,x[k+0],S24,0xE9B6C7AA);a=_GG(a,b,c,d,x[k+5],S21,0xD62F105D);d=_GG(d,a,b,c,x[k+10],S22,0x2441453);c=_GG(c,d,a,b,x[k+15],S23,0xD8A1E681);b=_GG(b,c,d,a,x[k+4],S24,0xE7D3FBC8);a=_GG(a,b,c,d,x[k+9],S21,0x21E1CDE6);d=_GG(d,a,b,c,x[k+14],S22,0xC33707D6);c=_GG(c,d,a,b,x[k+3],S23,0xF4D50D87);b=_GG(b,c,d,a,x[k+8],S24,0x455A14ED);a=_GG(a,b,c,d,x[k+13],S21,0xA9E3E905);d=_GG(d,a,b,c,x[k+2],S22,0xFCEFA3F8);c=_GG(c,d,a,b,x[k+7],S23,0x676F02D9);b=_GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);a=_HH(a,b,c,d,x[k+5],S31,0xFFFA3942);d=_HH(d,a,b,c,x[k+8],S32,0x8771F681);c=_HH(c,d,a,b,x[k+11],S33,0x6D9D6122);b=_HH(b,c,d,a,x[k+14],S34,0xFDE5380C);a=_HH(a,b,c,d,x[k+1],S31,0xA4BEEA44);d=_HH(d,a,b,c,x[k+4],S32,0x4BDECFA9);c=_HH(c,d,a,b,x[k+7],S33,0xF6BB4B60);b=_HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);a=_HH(a,b,c,d,x[k+13],S31,0x289B7EC6);d=_HH(d,a,b,c,x[k+0],S32,0xEAA127FA);c=_HH(c,d,a,b,x[k+3],S33,0xD4EF3085);b=_HH(b,c,d,a,x[k+6],S34,0x4881D05);a=_HH(a,b,c,d,x[k+9],S31,0xD9D4D039);d=_HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);c=_HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);b=_HH(b,c,d,a,x[k+2],S34,0xC4AC5665);a=_II(a,b,c,d,x[k+0],S41,0xF4292244);d=_II(d,a,b,c,x[k+7],S42,0x432AFF97);c=_II(c,d,a,b,x[k+14],S43,0xAB9423A7);b=_II(b,c,d,a,x[k+5],S44,0xFC93A039);a=_II(a,b,c,d,x[k+12],S41,0x655B59C3);d=_II(d,a,b,c,x[k+3],S42,0x8F0CCC92);c=_II(c,d,a,b,x[k+10],S43,0xFFEFF47D);b=_II(b,c,d,a,x[k+1],S44,0x85845DD1);a=_II(a,b,c,d,x[k+8],S41,0x6FA87E4F);d=_II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);c=_II(c,d,a,b,x[k+6],S43,0xA3014314);b=_II(b,c,d,a,x[k+13],S44,0x4E0811A1);a=_II(a,b,c,d,x[k+4],S41,0xF7537E82);d=_II(d,a,b,c,x[k+11],S42,0xBD3AF235);c=_II(c,d,a,b,x[k+2],S43,0x2AD7D2BB);b=_II(b,c,d,a,x[k+9],S44,0xEB86D391);a=addUnsigned(a,AA);b=addUnsigned(b,BB);c=addUnsigned(c,CC);d=addUnsigned(d,DD);}
3053var temp=wordToHex(a)+wordToHex(b)+wordToHex(c)+wordToHex(d);return temp.toLowerCase();}
3054function utf8_encode(argString){var string=(argString+'');var utftext="";var start,end;var stringl=0;start=end=0;stringl=string.length;for(var n=0;n<stringl;n++){var c1=string.charCodeAt(n);var enc=null;if(c1<128){end++;}else if(c1>127&&c1<2048){enc=String.fromCharCode((c1>>6)|192)+String.fromCharCode((c1&63)|128);}else{enc=String.fromCharCode((c1>>12)|224)+String.fromCharCode(((c1>>6)&63)|128)+String.fromCharCode((c1&63)|128);}
3055if(enc!==null){if(end>
3055start){utftext+=string.substring(start,end);}
3056utftext+=enc;start=end=n+1;}}
3057if(end>start){utftext+=string.substring(start,string.length);}
3058return utftext;}
3059function rand(min,max){var argc=arguments.length;if(argc===0){min=0;max=2147483647;}else if(argc===1){throw new Error('Warning: rand() expects exactly 2 parameters, 1 given');}return Math.floor(Math.random()*(max-min+1))+min;}
3060// Получить md5 хэш
3061function GenMd5Hash () {
3062  return substr(md5(parseInt(new Date().getTime() / 1000, 10)),rand(0,24),8);
3063}
3064// Живой поиск
3065$(function() {
3066  // Навигационная таблица над таблицей с данными
3067  var searchBlock = $('.search');
3068  var options = {
3069    target:                 'form.store_ajax_catalog',
3070    url:                    '/admin/store_catalog',
3071    items_target:           '#goods',
3072    last_search_query:      '',
3073  };
3074  // По этому хэшу будем обращаться к объекту извне
3075  var randHash = GenMd5Hash();
3076  // Если объекта со списком ajax функций не существует, создаём её
3077  if(typeof(document.SearchInCatalogAjaxQuerySender) == 'undefined') {
3078    document.SearchInCatalogAjaxQuerySender = {};
3079  }
3080  // Поле поиска обновилось, внутри него можно выполнять любые действия
3081  searchBlock.SearchFieldCheck = function () {
3082    // Отменяем выполнение последнего запущенного через таймаут скрипта, если таковой был.
3083    if(typeof(document.lastTimeoutId) != 'undefined') {
3084      clearTimeout(document.lastTimeoutId);
3085    }
3086    document.lastTimeoutId = setTimeout("document.SearchInCatalogAjaxQuerySender['" + randHash + "']('" + htmlspecialchars(searchBlock.s_search.val()) + "');", 300);
3087  }
3088  // Отправляет запрос к серверу с задачей поиска товаров
3089  document.SearchInCatalogAjaxQuerySender[randHash] = function (old_val) {
3090    var last_search_query_array = [];
3091    
3092    // sessionStorage is available
3093    if (typeof sessionStorage !== 'undefined') {
3094        try {
3095          if(sessionStorage.getItem('lastSearchQueryArray')){
3096            last_search_query_array = JSON.parse(sessionStorage.getItem('lastSearchQueryArray'));
3097            
3098            // Находим соответствие текущего запроса с sessionStorage
3099            var currentSearch = $.grep(last_search_query_array, function (item){
3100              return item.search_query == old_val
3101            })[0]
3102            
3103            if(currentSearch){
3104              showDropdownSearch(JSON.parse(currentSearch.content));
3105              
3106              return;
3107            }
3108          } else {
3109            sessionStorage.setItem('lastSearchQueryArray', '[]')
3110          }
3111        } catch(e) {
3112            // sessionStorage is disabled
3113        }
3114    }
3115    
3116    // Если текущее значение не изменилось спустя 300 сотых секунды и это значение не то по которому мы искали товары при последнем запросе
3117    if(htmlspecialchars(searchBlock.s_search.val()) == old_val && searchBlock.s_search.val().length > 1) {
3118      // Запоминаем этот запрос, который мы ищем, чтобы не произвводить повторного поиска
3119      options['last_search_query'] = old_val;
3120      // Добавляем нашей форме поиска поле загрузки
3121      searchBlock.f_search.addClass('search__loading');
3122      // Собираем параметры для Ajax запроса
3123      var
3124        params = {
3125          'ajax_q'                : 1,
3126          'goods_search_field_id' : 0,
3127          'q'                     : options['last_search_query'],
3128        },
3129        // Объект со значением которого будем в последствии проверять полученные от сервера данные
3130        search_field_obj = searchBlock.s_search;
3131      // Аяксом отправляем запрос на поиск нужных товаров и категорий
3132      $.ajax({
3133        type: "POST",
3134        cache: false,
3135        url: searchBlock.f_search.attr('action'),
3136        data: params,
3137        dataType: 'json',
3138        beforeSend: function(){
3139          searchBlock.find('.search-submit .header-searchIcon').html('<i class="fal fa-circle-notch fa-spin"></i>')
3140        },
3141        success: function(data) {
3142          // Если набранный запрос не соответствует полученным данным, видимо запрос пришёл не вовремя, отменяем его.
3143          if(search_field_obj.val() != old_val) {
3144            return false;
3145          }
3146          
3147          // Записываем в sessionStorage
3148          if (typeof sessionStorage !== 'undefined') {
3149              try {
3150                sessionStorage.setItem('lastSearchQueryArray', JSON.stringify(last_search_query_array))
3151                
3152                // Находим соответствие текущего запроса с sessionStorage
3153                var currentSearch = $.grep(last_search_query_array, function (item){
3154                  return item.search_query == old_val
3155                })[0]
3156                //Если такого запроса ещё не было запишем его в sessionStorage
3157                if(typeof currentSearch == 'undefined'){
3158                  // Добавляем в массив последних запросов данные по текущему запросу
3159                  last_search_query_array.push({
3160                    search_query: old_val,
3161                    content: JSON.stringify(data)
3162                  })
3163                  sessionStorage.setItem('lastSearchQueryArray', JSON.stringify(last_search_query_array))
3164                }        
3165              } catch(e) {
3166                  // sessionStorage is disabled
3167              }
3168          }         
3169          // Показываем результаты на основе пришедших данных
3170          showDropdownSearch(data);
3171          
3172          // Убираем информацию о том что запрос грузится.
3173          searchBlock.f_search.removeClass("search__loading");
3174          searchBlock.find('.search-submit .header-searchIcon').html('<i class="fal fa-search"></i>')
3175          // console.log('andAJAX')
3176        }
3177      });
3178    }else{
3179      $("#search-result").removeClass('_active').hide();
3180    }
3181    
3182    function showDropdownSearch(data){
3183      // Отображение категорий в поиске
3184      if(data.category.length!=undefined && data.category.length>0){
3185        $(".result-category .result-item").remove();
3186        $("#search-result").removeClass('_active').hide();
3187        $("#search-result .search__result-inner .result-category").find('.result__title').remove();
3188        $("#search-result .search__result-inner .result-category").append('<h3 class="result__title">Категории</h3>');
3189        
3190        for(с=0; с < data.category.length; с++){
3191          // Проверка наличия изображения
3192          if (data.category[с].image_icon == null) {
3193            data.category[с].image_icon = '/design/no-photo-icon.png'
3194          } else {
3195            data.category[с].image_icon = data.category[с].image_icon;
3196          }
3197          // Отображаем результат поиска
3198         $("#search-result").addClass('_active').show();
3199          $("#search-result .search__result-inner .result-category").append('<div class="result-item" data-id="'+ data.category[с].goods_cat_id +'"><a href="'+ data.category[с].url +'"><img src="'+ data.category[с].image_icon +'" class="goods-image-icon" /><span>'+ data.category[с].goods_cat_name +'</span></a></div>');
3200        }
3201      }else{
3202        $(".result-category .result-item").remove();
3203        $("#search-result").removeClass('_active').hide();
3204      }
3205      // Отображение товаров в поиске
3206      if(data.goods.length!=undefined && data.goods.length>0){
3207        $(".result-goods .result-item").remove();
3208        $("#search-result").removeClass('_active').hide();
3209        
3210        $("#search-result .search__result-inner .result-goods").find('.result__title').remove();
3211        $("#search-result .search__result-inner .result-goods").append('<h3 class="result__title">Товары</h3>');
3212        
3213        for(i=0; i < data.goods.length; i++){
3214          // Проверка наличия изображения
3215          if (data.goods[i].image_icon == null) {
3216            data.goods[i].image_icon = '/design/no-photo-icon.png'
3217          } else {
3218            data.goods[i].image_icon = data.goods[i].image_icon;
3219          }
3220          // Отображаем результат поиска
3221         $("#search-result").addClass('_active').show();
3222         if(i <= 4 ){
3223          $("#search-result .search__result-inner .result-goods").append('<div class="result-item" data-id="'+ data.goods[i].goods_id +'"><a href="'+ data.goods[i].url +'"><img src="'+ data.goods[i].image_icon +'" class="goods-image-icon" /><span>'+ data.goods[i].goods_name +'</span></a></div>');
3224         }
3225         
3226        // Если последняя итерация цикла вставим кнопку "показать все"
3227         if(i == data.goods.length - 1){
3228          $("#search-result .search__result-inner #show-wrap").remove();
3229          
3230          var $showAllBtn = $('<a>').text('Все результаты').addClass('show-all').on('click', function(){$('.
3230search__form').submit();})
3231          var $showAllWrap = $('<div>').attr('id', 'show-wrap').addClass('result-item').append($showAllBtn)
3232          
3233          $("#search-result .search__result-inner .result-goods").append($showAllWrap)
3234         }
3235        }
3236      }else{
3237        $(".result-goods .result-item").remove();
3238        $("#search-result").removeClass('_active').hide();
3239      }
3240      // Скрываем результаты поиска если ничего не найдено
3241      if((data.category.length + data.goods.length) > 0){
3242       $("#search-result").addClass('_active').show();
3243      //   console.log("show");
3244      }else{
3245        $("#search-result").removeClass('_active').hide();
3246      //   console.log("hide");
3247      }
3248      
3249      if((data.category.length) > 0){
3250        $(".result-category").show().addClass('_visible');
3251      }else{
3252        $(".result-category").hide().removeClass('_visible');
3253      }
3254      
3255      if((data.goods.length) > 0){
3256        $(".result-goods").show();
3257      }else{
3258        $(".result-goods").hide();
3259      }         
3260    }
3261  }
3262  SearchFieldInit(searchBlock);
3263 
3264});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.