PageSourceSearch

https://bavaria-astana.kz/static/js/bmw/scripts.js?v=1784089791

js bavaria-astana.kz collected 2026-10-08 15:15:26 UTC 29,211 bytes, 961 lines download raw bytes

1
2
3$(function(){
4
5	$('.showPopupForm').click(function() {
6		var title = $(document).prop('title');
7		var url = window.location.href;
8		var subj = $(this).attr('id');
9		var promoId = $(this).data('promo');
10		var formTitle = $(this).data('title');
11		var note = $(this).data('note');
12		var action = $(this).data('action');
13    var dealer_id = $(this).data('dealer_id');
14
15    $(this).prop('disabled',true).addClass('loading');
16
17		$.ajax({
18			url: '/bmw/form/getPopupForm/',
19			type: 'post',
20			data: {
21				'title': title,
22				'url': url,
23				'promoId': promoId,
24				'subj': subj,
25				'formTitle': formTitle,
26				'note': note,
27				'action': action,
28				'dealer_id': dealer_id
29			},
30			success: function(data) {
31				if (!$('#request').length) {
32					$('body').append(data);
33					$('#request').fadeIn(200);
34				}
35     
36        var fancybox = function () {
37   
38          $.fancybox.open({
39            src:'#request',
40            touch: false,
41            backFocus: false,
42            beforeClose : function () {
43              $('.showPopupForm').prop('disabled',false).removeClass('loading');
44              
45            },
46            afterClose: function () {
47              $('#request, #fancyboxId, #phoneMaskId').remove();
48            }
49          });
50          
51        }
52        loadScript("/static/libs/jquery.fancybox.min.js", fancybox, id="fancyboxId");
53
54        var phoneMask = function () {
55          var listCountries = $.masksSort($.masksLoad("/static/libs/data/phone-codes.json"), ['#'], /[0-9]|#/, "mask");
56          var maskOpts = {
57            inputmask: {
58              definitions: {
59                '#': {
60                  validator: "[0-9]",
61                  cardinality: 1
62                }
63              },
64              showMaskOnHover: false,
65              autoUnmask: true,
66              clearMaskOnLostFocus: false
67            },
68            match: /[0-9]/,
69            replace: '#',
70            listKey: "mask"
71          };
72          var maskChangeWorld = function(maskObj, determined) {
73            if (determined) {
74              var hint = maskObj.name_ru;
75              if (maskObj.desc_ru && maskObj.desc_ru != "") {
76                hint += " (" + maskObj.desc_ru + ")";
77              }
78              $("#country").html(hint);
79            } else {
80              $("#country").html("Страна");
81            }
82          }
83          $('.phone-mask').keyup( function () {
84            $(this).inputmasks($.extend(true, {}, maskOpts, {
85              list: listCountries
86            }));
87          });
88        }
89        loadScript("/static/libs/multi-phoneMask.js", phoneMask, id="phoneMaskId");
90
91			}
92		});
93  
94		return false;
95	});
96	
97});
98
99
100
101$(document).ready(function () {	
102
103  $('.notice .btn-close').click(function () {
104    $(this).parent().parent().hide();
105  })
106
107	var host = window.location.hostname;
108
109	$('a[href^="http"]').not('[href^="https://'+host+'"]').not('.target-link').attr('target', '_blank');  
110
111  var slider = $('.slider');
112	
113  slider.each(function () {
114    var mainSlider = new Swiper(this, {
115      speed: 750,
116			type:'mousemove',
117      loop: true,
118      slidesPerView: 1,
119      navigation: {
120        nextEl: $(this).find('.swiper-button-next'),
121        prevEl: $(this).find('.swiper-button-prev'),
122      },
123      pagination: {
124        el: $(this).parent().find('.swiper-pagination'),
125        type: 'bullets',
126				clickable: true
127      },
128      scrollbar: {
129        el: ".swiper-scrollbar",
130      },
131      spaceBetween: 0,
132      resistanceRatio: 0,
133      parallax: true,
134      lazy: {
135        loadPrevNext: true,
136      },
137    });
138  });
139
140
141  if ($(window).width() > 1000) {
142    if (!$('.banner, .banner-sm').length > 0) {
143      $('.header').removeClass('header-inverse');
144      $('main').addClass('no-fixed')
145    }
146
147    var lastScrollTop = 0;
148    var host = window.location.href;
149    $(window).scroll(function() {
150        var st = $(this).scrollTop();
151        if (st > lastScrollTop) {
152            $('.header').removeClass('header-inverse')
153        }
154        if (st == 0 && $('.banner, .banner-sm').length > 0) {
155          $('.header').addClass('header-inverse')
156          $('.nav__menu .item, .main-nav, .bg-overlay, .close-menu').removeClass('active')
157          $('.site__header').show()
158        } else {
159          $('.header').removeClass('header-inverse')
160        }
161
162        lastScrollTop = st;
163    });
164
165    $(document).mouseup(function (e) {
166      var container = $(".nav__body");
167
168      if (!container.is(e.target) && container.has(e.target).length === 0) {
169        $('.main-nav,.bg-overlay, .nav__menu .item,.close-menu').removeClass('active');
170        container.parent().removeClass('active');
171        $('.main-icon').removeClass('toggle');
172        $('.site__header').show()
173        // $('body').css({ paddingRight: '0'}).removeClass('overflow-hidden')
174      }
175    });
176
177    $('.main-nav .nav__icon:not(.main-icon)').click(function () {
178      $('.main-nav, .bg-overlay, .close-menu').addClass('active');
179      $('.header').removeClass('header-inverse')
180      $(this).parent().toggleClass('active');
181      $('.site__header').hide()
182    });
183    $('.close-menu').click(function () {
184      $('.site__header').show()
185      $(this).removeClass('active')
186    })
187  }
188
189  if ($(window).width() < 768) {
190
191$(document).on('click', '.phonecall', function (e) {
192  e.stopPropagation();
193
194  const $dealer = $(this).closest('.dealer__info');
195  const $phones = $dealer.find('.phone-group');
196
197  // закрываем остальные
198  $('.phone-group').not($phones).removeClass('active');
199
200  // переключаем текущее
201  $phones.toggleClass('active');
202});
203
204$(document).on('click', '.phone-close', function (e) {
205  e.stopPropagation();
206  $(this).closest('.phone-group').removeClass('active');
207});
208
209$(document).on('click', function () {
210  $('.phone-group').removeClass('active');
211});
212
213$(document).on('click', '.phone-group', function (e) {
214  e.stopPropagation();
215});
216    $('.header').removeClass('header-inverse');
217    $('.more-link span').text('Все');
218    $('.footer__nav h4').click(function () {
219      $(this).toggleClass('active')
220    });
221
222    $('.main-icon').click(function () {
223      $('.nav__menu').toggleClass('active');
224      $(this).toggleClass('toggle');
225      $('.nav__menu .item').removeClass('active');
226      $('html').toggleClass('overflow-hidden')
227    });
228
229    $('.nav__menu .nav__icon:not(.main-icon)').click(function () {
230      // $('.nav__menu .item').removeClass('active');
231      $(this).parent().toggleClass('active').siblings('.item').removeClass('active');
232    });
233
234    $('.tab-nav .tab').click(function(){
235      $(this).toggleClass('active');
236      $('.tab-nav .tab').toggle();
237      // if($(this).hasClass('active')){
238        // $(this).siblings().toggle();
239      // }
240			$(this).show().addClass('active');
241    });
242    $('#forms .tab').click(function() {
243      var offsetLeft = $(this).offset().left;
244      $(this).parent().scrollLeft(offsetLeft)
245
246    });
247    $('#stock .col:first-child .btn').appendTo($('.stock-slider').parent());
248  };
249  $('.filter-btn').on('click', function () {
250    $('#stock-list .sidebar').addClass('active')
251  });
252  $('.filter-close').on('click',function () {
253    $('#stock-list .sidebar').removeClass('active')
254  });
255
256  $('.tabs').find('.tab').click(function (e) {
257    var tab = $(this).attr('data-filter');
258    $(this).parent().find('.tab').removeClass('active');
259    $(e.target).addClass('active');
260    $(this).parent().parent().parent().find('.tab-content').removeClass('active');
261    $(this).parent().parent().parent().find('.' + tab).addClass('active');
262    $(this).parent().parent().parent().find('#' + tab).addClass('active')
263  });
264
265  if ($('.page__car').length > 0) {
266    (function ($) {
267
268      $.fn.scrollNav = function (options) {
269
270        var settings = $.extend({
271            activeClass: 'active',
272            wrapper: '',
273            speed: 500,
274            navStop: 100,
275            navStart: 200,
276          }, options),
277          $that = $(this);
278
279        $(this).on('click', clickScroll);
280
281        if (settings.wrapper) {
282          $(window).on('scroll', function () {
283            var sectionTop = [],
284              windowTop = $(window).scrollTop();
285
286            $that.each(function (e) {
287              var hash = $(this).attr('href'),
288                hashOffset = $(hash).offset();
289              if (typeof hashOffset !== 'undefined') {
290                sectionTop.push(hashOffset.top);
291              };
292            });
293
294            $.each(sectionTop, function (index) {
295              if (windowTop > sectionTop[index] - settings.navStart) {
296                $that.removeClass(settings.activeClass)
297                  .eq(index).addClass(settings.activeClass);
298              }
299            });
300            underlineAnim();
301          });
302        };
303
304        function clickScroll(event) {
305          event.preventDefault();
306
307          var hash = $(this).attr('href'),
308            hashOffset = $(hash).offset(),
309            hashTop = hashOffset.top;
310
311          $('html, body').animate({
312            scrollTop: hashTop - settings.navStop
313          }, 0);
314        }
315
316      };
317
318    }(jQuery));
319
320    $('.scroll').scrollNav({
321      wrapper: '.car__nav .navbar'
322    });
323
324    
325    // underline animation
326    function underlineAnim() {
327      var to = $(".navbar .link.active");
328      var n = to.position().left;
329      var m = to.width();
330      $(".link-underline").stop().fadeIn().css({
331        left: n,
332        width: m
333      });
334    };
335  }
336
337  $('.anchor-link').on('click', function (e) {
338    e.preventDefault();
339
340    const targetId = this.getAttribute('href').substring(1);
341    const targetElement = $('#' + targetId);
342
343    if (targetElement.length) {
344        const headerHeight = $('header').outerHeight();
345        const offset = targetElement.offset().top - headerHeight - 100;
346
347        $('html, body').animate({
348            scrollTop: offset
349        }, 1);
350    }
351});
352
353  var stockSl = $('.stock-slider');
354  stockSl.each(function () {
355    var slides = new Swiper(this, {
356      speed: 650,
357      loop: false,
358      slidesPerView: 4,
359      spaceBetween: 20,
360      resistanceRatio: 0,
361      navigation: {
362        nextEl: $('.stock-slider').find('.swiper-button-next'),
363        prevEl: $('.stock-slider').find('.swiper-button-prev'),
364      },
365      pagination: {
366        el: $(this).parent().find('.swiper-pagination'),
367        type: 'bullets',
368        dynamicBullets: true
369      },
370      breakpoints: {
371        1680: {
372          slidesPerView: 4.25,
373          slidesPerGroup: 4.25
374        },
375        1280: {
376          slidesPerView: 3.25,
377          slidesPerGroup: 3.25
378        },
379        1000: {
380          slidesPerView: 2.5,
381          slidesPerGroup: 2.5
382        },
383        320: {
384          slidesPerView: 1.25,
385          slidesPerGroup: 1.25
386        }
387      }
388    });
389  });
390  var carousel = $('.carousel');
391  carousel.each(function () {
392    var slides = new Swiper(this, {
393      speed: 650,
394      loop: false,
395      slidesPerView: 2,
396      slidesPerColumn: 2,
397      slidesPerColumnFill: 'row',
398      spaceBetween: 20,
399      resistanceRatio: 0,
400      breakpoints: {
401        1000: {
402          spaceBetween: 20,
403        },
404        320: {
405          slidesPerView: 2,
406          slidesPerColumn: 2,
407          slidesPerColumnFill: 'row',
408          spaceBetween: 0,
409        }
410      },
411      navigation: {
412        nextEl: $('#gallery').find('.swiper-button-next'),
413        prevEl: $('#gallery').find('.swiper-button-prev'),
414      },
415      pagination: {
416        el: $(this).parent().find('.swiper-pagination'),
417        type: 'bullets',
418      },
419    });
420  });
421
422
423
424  $('.accordion__title').click(function () {
425    $(this).parent().toggleClass('active');
426  });
427
428  $('#dealerSearch').keyup(function () {
429    var input, filter, cards, cardContainer, title, i;
430    input = document.getElementById("dealerSearch");
431    filter = input.value.toUpperCase();
432    cardContainer = document.getElementById("dealers");
433    cards = cardContainer.getElementsByClassName("dealer__item");
434    msg = document.getElementById("search-result");
435    for (i = 0; i < cards.length; i++) {
436      title = cards[i].querySelector(".dealer__name");
437      if (title.innerText.toUpperCase().indexOf(filter) > -1) {
438        cards[i].style.display = "block";
439      } else {
440        cards[i].style.display = "none";
441      }
442    }
443    $('.dealer__item').find(':visible').length === 0 ?
444      $("#search-result").show() : $("#search-result").hide();
445  });
446
447
448
449
450
451  if ($('#image-compare').length > 0) {
452    const element = document.getElementById("image-compare");
453    const options = {
454      smoothingAmount: 0,
455      hoverStart: false,
456      verticalMode: false,
457      startingPoint: 50,
458      fluidMode: false,
459      controlColor: "#FFFFFF",
460      controlShadow: false,
461      addCircle: true,
462      addCircleBlur: false,
463    };
464    const viewer = new ImageCompare(element, options).mount();
465  }
466  if ($(document).find('.phone-mask')) {
467    var phoneMask = function () {
468      var listCountries = $.masksSort($.masksLoad("/static/libs/data/phone-codes.json"), ['#'], /[0-9]|#/, "mask");
469			var maskOpts = {
470				inputmask: {
471					definitions: {
472						'#': {
473							validator: "[0-9]",
474							cardinality: 1
475						}
476					},
477					showMaskOnHover: false,
478					autoUnmask: true,
479					clearMaskOnLostFocus: false
480				},
481				match: /[0-9]/,
482				replace: '#',
483				listKey: "mask"
484			};
485      $('.phone-mask').keyup( function () {
486        $(this).inputmasks($.extend(true, {}, maskOpts, {
487          list: listCountries
488        }));
489      });
490    }
491    loadScript("/static/libs/multi-phoneMask.js", phoneMask, id="uploadedMask");
492  }
493});
494
495function loadScript(url, callback, id) {
496  var body = document.getElementsByTagName('body')[0];
497  var script = document.createElement('script');
498  script.type = 'text/javascript';
499  script.src = url;
500  script.id = id,
501  script.onreadystatechange = callback;
502  script.onload = callback;
503  body.appendChild(script);
504}
505
506function prettify(num) {
507  var n = num.toString();
508  var separator = " ";
509  return n.replace(/(\d{1,3}(?=(?:\d\d\d)+(?!\d)))/g, "$1" + separator);
510}
511
512let imagesToLoad = document.querySelectorAll('.img-load img[data-src]');
513const loadImages = (image) => {
514  image.setAttribute('src', image.getAttribute('data-src'));
515  image.onload = () => {
516    image.removeAttribute('data-src');
517  };
518};
519
520imagesToLoad.forEach((img) => {
521  loadImages(img);
522});
523
524
525function sendCallTouchData(form)
526{
527  var host = location.hostname;
528	var almaty = 'bavaria-almaty.kz', 
529      kuldzhinka = 'bavaria-kuldzhinka.kz',
530      astana = 'bavaria-astana.kz';
531  if(host == astana) {
532    var ct_site_id = '56036';
533    var mod_id = 'xzzb1pmd';
534  } else
535	if(host == almaty) {
536		var ct_site_id = '51082';
537		var mod_id = '1ps9mh2g';
538	}	else
539  if (host == kuldzhinka) {
540    var ct_site_id = '57672';
541    var mod_id = 'irhf8kig';
542  }
543  
544  if (typeof ct_site_id !== 'undefined' && typeof mod_id !== 'undefined') {
545    try {
546        var sessionId = window.ct('calltracking_params', mod_id).sessionId;
547        
548        var ct_data = { 
549            fio: $(form).find('#Form_name').val(),
550            phoneNumber: $(form).find('#Form_phone').val(),
551            email: $(form).find('#Form_email').val(),
552            subject: document.title,
553            comment: $(form).find('#Form_text').val(),
554            requestUrl: location.href,
555            sessionId: sessionId
556        };
557
558        $.ajax({ 
559            url: 'https://api.calltouch.ru/calls-service/RestAPI/requests/' + ct_site_id + '/register/', 
560            dataType: 'json', 
561            type: 'POST', 
562            data: ct_data,
563            async: false,
564            success: function (response) {
565            
566                // console.log(response);
567            },
568            error: function (xhr, status, error) {
569              
570                console.error(xhr.responseText);
571            }
572        });
573    } catch (error) {
574        console.error("Error getting sessionId:", error.message);
575    }
576  }
577}
578
579
580// --- НАЧАЛО ИНТЕГРАЦИИ FORM_START ---
581var BMWModels = ['BMW iX', 'BMW iX3', 'BMW XM', 'BMW M5', 'BMW X7', 'BMW X6', 'BMW X6 M', 'BMW X5', 'BMW X5 M','BMW X3','BMW X2','BMW X1','BMW 5 Series','BMW M4','BMW 3 Series','BMW M3'];
582
583(function() {
584
585  var startedForms = {};
586
587  function triggerFormStart($form, formSource) {
588    var formMarker = $form.attr('data-gtm-marker') || $form.attr('id') || 'index_' + $('.form').index($form);
589   
590    if (startedForms[formMarker] === true) {
591      return;
592    }
593
594    startedForms[formMarker] = true;
595
596    if (typeof(dataLayer) === 'undefined' || dataLayer === null) return;
597
598    var pageData = dataLayer.find(function(item) { return item && item.brand !== undefined; }) || {};
599    var gtmFormType = $form.attr('data-form-type') || $form.find('[name="subj"]').val() || $('.showPopupForm').data('action') || 'not_selected';
600    var typeMapping = {
601      'callback': 'callback',
602      'getcredit': 'credit',
603      'getoffer': 'order',
604      'service': 'service',
605      'promo': 'promo',
606      'test_drive': 'test_drive',
607      'trade_in': 'trade_in',
608      '': 'not_selected'
609    };
610
611    gtmFormType = typeMapping[gtmFormType] || gtmFormType;
612
613    var carFieldVal = $form.find('[name*="Form[car]"]').val();
614    
615    if (!carFieldVal || carFieldVal.trim() === '' || carFieldVal.trim() === '- не выбрано -') {
616      carFieldVal = null;
617    }
618
619    if(!carFieldVal) {
620      var currentUrl = window.location.href.toLowerCase();
621      for(var i=0;i<BMWModels.length;i++) {
622        if (currentUrl.indexOf(BMWModels[i].toLowerCase()) !== -1) {
623          carFieldVal = BMWModels[i];
624          $form.find('[name*="Form[car]"]').val(carFieldVal);
625          break;
626        }
627      }
628    }
629
630    var carModel = carFieldVal || pageData.model || 'not_selected';
631    
632    var gtmData = {
633      'event':           'form_start',
634      'form_type':       gtmFormType,
635      'form_source':     formSource,
636      'model':           carModel,
637      'lang':            pageData.lang || 'ru',
638      'site_type':       pageData.site_type || 'dealer',
639      'brand':           pageData.brand || 'BMW',
640      'holding':         pageData.holding || 'not_selected',
641      'dealership_name': pageData.dealership_name || 'not_selected',
642      'engine_type':     pageData.engine_type || 'not_selected',
643      'body_type':       pageData.body_type || 'not_selected',
644      'price_category':  pageData.price_category || 'not_selected',
645    };
646
647    console.groupCollapsed(
648      '%c GTM dataLayer: Событие form_start зафиксировано для формы', 
649      'background: #222; color: #bada55; font-weight: bold; padding: 3px;'
650    );
651    console.log('Параметры, отправленные в dataLayer.push():');
652    console.table(gtmData); 
653    console.groupEnd();
654
655    dataLayer.push(gtmData);
656  }
657
658
659  function resolveFormSource($form) {
660    return $form.closest('#codus-group-panel').length > 0 ? 'widget' : 'site';
661  }
662
663  $(document).on('focus', '.form input:not([type="hidden"]), .form select, .form textarea', function() {
664    var $form = $(this).closest('.form');
665    if ($form.closest('#codus__popup').length > 0) return;
666    triggerFormStart($form, resolveFormSource($form));
667  });
668
669  window._gtmStartedForms = startedForms;
670  window.triggerFormStart = triggerFormStart; 
671})();
672// --- КОНЕЦ ИНТЕГРАЦИИ FORM_START ---
673
674// --- НАЧАЛО ИНТЕГРАЦИИ FORM_SUBMIT ---
675function trackFormSubmit(formElement) {
676  if (typeof(dataLayer) !== 'undefined' && dataLayer !== null) {
677    var $form = $(formElement);
678    var formMarker = $form.attr('id') || 'index_' + $('.form').index($form);
679
680    if ($form.data('submitted') === true) {
681      return; 
682    }
683    $form.data('submitted', true);
684
685    if (window._gtmStartedForms) {
686      window._gtmStartedForms[formMarker] = true;
687    }
688    
689    var pageData = {};
690    for (var i = 0; i < window.dataLayer.length; i++) {
691      if (window.dataLayer[i] && window.dataLayer[i].brand === 'BMW' && !window.dataLayer[i].event) {
692        pageData = window.dataLayer[i];
693        break;
694      }
695    }
696
697    var gtmFormType = $form.attr('data-form-type') || $form.find('[name="subj"]').val() || 'not_selected';
698    var typeMapping = {
699      'callback': 'callback',
700      'getcredit': 'credit',
701      'getoffer': 'order',
702      'service': 'service',
703      'promo': 'promo',
704      'test_drive': 'test_drive',
705      'trade_in': 'trade_in',
706      '': 'not_selected'
707    };
708    gtmFormType = typeMapping[gtmFormType] || gtmFormType;
709
710    var $dealerSelect = $form.find('[name*="Form[city]"]');
711    var dealerFieldVal = null;
712
713    if ($dealerSelect.length > 0) {
714      var selectedText = $dealerSelect.find('option:selected').text();
715      if (selectedText && selectedText.trim() !== '' && selectedText.indexOf('- Выберите дилера -') === -1) {
716        dealerFieldVal = selectedText;
717      }
718    }
719
720    var $carField = $form.find('[name*="Form[car]"]');
721    var carModel = 'not_selected';
722
723    if ($carField.length > 0) {
724      var rawValue = $carField.val();
725      if (rawValue && rawValue.trim() !== '' && rawValue.trim() !== '- не выбрано -') {
726        carModel = rawValue.trim();
727      } else if ($carField.is('select')) {
728        var $firstRealCar = $carField.find('option').filter(function() {
729          var val = $(this).val();
730          return val && val.trim() !== '' && val.trim() !== '- не выбрано -';
731        }).first();
732
733        if ($firstRealCar.length > 0) {
734          carModel = $firstRealCar.val().trim();
735        }
736      }
737    }
738
739    if (carModel === 'not_selected') {
740      carModel = pageData.model || 'not_selected';
741    }
742
743    var gtmSubmitData = {
744      'event':           'form_submit',
745      'form_type':       gtmFormType,
746      'form_source':     resolveFormSource($form),
747      'model':           carModel,
748      'lang':            pageData.lang || 'ru',
749      'site_type':       pageData.site_type || 'dealer',
750      'brand':           pageData.brand || 'BMW',
751      'holding':         pageData.holding || 'not_selected',
752      'dealership_name': dealerFieldVal || pageData.dealership_name || 'not_selected',
753      'engine_type':     pageData.engine_type || 'not_selected',
754      'body_type':       pageData.body_type || 'not_selected',
755      'price_category':  pageData.price_category || 'not_selected',
756    };
757
758    console.groupCollapsed(
759      '%c GTM dataLayer: Успешная отправка формы (form_submit) ', 
760      'background: #002c5f; color: #fff; font-weight: bold; padding: 3px;'
761    );
762    console.table(gtmSubmitData);
763    console.groupEnd();
764
765    dataLayer.push(gtmSubmitData);
766    setTimeout(function() {
767      $form.data('submitted', false);
768    }, 2000);
769  }
770}
771
772function resolveFormSource($form) {
773  return $form.closest('#codus-group-panel').length > 0 ? 'widget' : 'site';
774}
775// --- КОНЕЦ ИНТЕГРАЦИИ FORM_SUBMIT ---
776
777// --- НАЧАЛО ИНТЕГРАЦИИ FILE_DOWNLOAD ---
778$(document).on('click', 'a', function(e) {
779  var href = $(this).attr('href');
780  if (!href) return;
781  var currentUrlLower = window.location.href.toLowerCase();
782  var fileExtensionMatch = href.match(/\.(pdf|doc|docx|xls|xlsx)(\?.*)?$/i);
783
784  if (fileExtensionMatch) {
785    var fileExtension = fileExtensionMatch[1].toLowerCase();
786    var hrefLower = href.toLowerCase();
787    var gtmFileType = $(this).attr('data-file-type') || '';
788
789    if (!gtmFileType) {
790      if (currentUrlLower.indexOf('price-configuration') !== -1 && $(this).closest('table').length > 0) {
791        gtmFileType = 'price_list';
792      } else if (hrefLower.indexOf('brochure') !== -1) {
793        gtmFileType = 'brochure';
794      } else if (hrefLower.indexOf('catalog') !== -1) {
795        gtmFileType = 'catalog';
796      } else if (hrefLower.indexOf('manual') !== -1) {
797        gtmFileType = 'manual';
798      } else if (currentUrlLower.indexOf('service-map') !== -1) {
799        gtmFileType = 'service';
800      } else {
801        gtmFileType = 'not_selected';
802      }
803    }
804
805    if (typeof(dataLayer) !== 'undefined' && dataLayer !== null) {
806      var pageData = dataLayer.find(function(item) { return item.brand !== undefined; }) || {};
807
808      var gtmFileData = {
809        'event':           'file_download',
810        'file_type':       gtmFileType,
811        'model':           pageData.model || 'not_selected',
812        'lang':            pageData.lang || 'ru',
813        'site_type':       pageData.site_type || 'dealer',
814        'brand':           pageData.brand || 'BMW',
815        'holding':         pageData.holding || 'not_selected',
816        'dealership_name': pageData.dealership_name || 'not_selected',
817        'engine_type':     pageData.engine_type || 'not_selected',
818        'body_type':       pageData.body_type || 'not_selected',
819        'price_category':  pageData.price_category || 'not_selected',
820      };
821
822      console.groupCollapsed(
823        '%c GTM dataLayer: Скачивание файла зафиксировано (' + fileExtension.toUpperCase() + ') ', 
824        'background: #1e4620; color: #bada55; font-weight: bold; padding: 3px;'
825      );
826      console.log('Параметры, отправленные в dataLayer.push():');
827      console.table(gtmFileData);
828      console.groupEnd();
829
830      dataLayer.push(gtmFileData);
831    }
832  }
833});
834// --- КОНЕЦ ИНТЕГРАЦИИ FILE_DOWNLOAD ---
835
836// --- НАЧАЛО ИНТЕГРАЦИИ WIDGET GTM ---
837(function () {
838
839  var widgetSubmitted = false;
840  var startedWidget = false;
841  var savedCarModel;
842
843  $(document).on('click', '#codus__popup_form_submit_btn', function () {
844    var carEl = document.getElementById('codus__popup_form_car_field');
845    if (carEl && carEl.value && carEl.value.trim() !== '') {
846      savedCarModel = carEl.value.trim();
847    } else {
848      savedCarModel = 'not_selected';
849    }
850  });
851
852  function getWidgetFormType() {
853    var formEl = document.getElementById('codus__popup_form');
854    var rawType = formEl ? (formEl.getAttribute('data-form-type') || 'order') : 'order';
855
856    var typeMapping = {
857      'callback':   'callback',
858      'getcredit':  'credit',
859      'getoffer':   'order',
860      'order':      'order',
861      'service':    'service',
862      'promo':      'promo',
863      'test_drive': 'test_drive',
864      'trade_in':   'trade_in',
865      '':           'order'
866    };
867
868    return typeMapping[rawType] || rawType;
869  }
870
871  function pushWidgetFormSubmit() {
872    if (typeof dataLayer === 'undefined' || dataLayer === null) return;
873
874    var pageData = dataLayer.find(function (item) {
875      return item && item.brand !== undefined && !item.event;
876    }) || {};
877
878    var gtmSubmitData = {
879      'event':           'form_submit',
880      'form_type':       getWidgetFormType(),
881      'form_source':     'widget',
882      'model':           savedCarModel,
883      'lang':            pageData.lang || 'ru',
884      'site_type':       pageData.site_type || 'dealer',
885      'brand':           pageData.brand || 'BMW',
886      'holding':         pageData.holding || 'not_selected',
887      'dealership_name': pageData.dealership_name || 'not_selected'
888    };
889
890    console.groupCollapsed(
891      '%c GTM dataLayer: form_submit (widget)',
892      'background: #002c5f; color: #fff; font-weight: bold; padding: 3px;'
893    );
894    console.table(gtmSubmitData);
895    console.groupEnd();
896
897    dataLayer.push(gtmSubmitData);
898  }
899
900  function waitForWidget(callback) {
901    var popup = document.getElementById('codus__popup');
902    if (popup) {
903      callback(popup);
904      return;
905    }
906
907    var bodyObserver = new MutationObserver(function () {
908      var popup = document.getElementById('codus__popup');
909      if (popup) {
910        bodyObserver.disconnect();
911        callback(popup);
912      }
913    });
914
915    bodyObserver.observe(document.body, { childList: true, subtree: true });
916  }
917
918  function observeWidgetSuccess(popup) {
919    var popupObserver = new MutationObserver(function (mutations) {
920      mutations.forEach(function (mutation) {
921        if (mutation.attributeName !== 'class') return;
922
923        // form_start — когда попап открылся
924        if (popup.classList.contains('active') && !startedWidget) {
925          startedWidget = true;
926          var $form = $('#codus__popup_form');
927          if (typeof window.triggerFormStart === 'function') {
928            window.triggerFormStart($form, 'widget');
929          }
930        }
931
932        // form_submit — когда форма отправлена
933        if (popup.classList.contains('show_result') && !widgetSubmitted) {
934          widgetSubmitted = true;
935          pushWidgetFormSubmit();
936          setTimeout(function () { widgetSubmitted = false; }, 2000);
937        }
938
939        // сбрасываем флаги когда попап закрылся
940        if (!popup.classList.contains('active')) {
941          startedWidget = false;
942          if (window._gtmStartedForms) {
943            delete window._gtmStartedForms['codus__popup_form'];
944          }
945        }
946      });
947    });
948
949    popupObserver.observe(popup, { attributes: true });
950  }
951
952  if (document.readyState === 'loading') {
953    document.addEventListener('DOMContentLoaded', function () {
954      waitForWidget(observeWidgetSuccess);
955    });
956  } else {
957    waitForWidget(observeWidgetSuccess);
958  }
959
960})();
961// --- КОНЕЦ ИНТЕГРАЦИИ WIDGET GTM ---

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.