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.