1function fix100vh() { 2 let vh = window.innerHeight * 0.01; 3 document.documentElement.style.setProperty('--vh', `${vh}px`); 4} 5 6function get_cookie(name){ 7 return document.cookie.split(';').some(c => { 8 return c.trim().startsWith(name + '='); 9 }); 10} 11 12function delete_cookie(name) { 13 if (get_cookie(name)) { 14 document.cookie = name + "=true;expires=Thu, 01 Jan 1970 00:00:01 GMT"; 15 } 16} 17/* 18$(document).ready(function(){ 19 $('#form_filter').submit(function(evt) { 20 evt.preventDefault(); 21 let arr = []; 22 arr = $('#form_filter').serializeArray(); 23 console.log(arr); 24 console.log(arr['name']); 25 26 var length = arr.length, 27 element = null; 28 for (var i = 0; i < length; i++) { 29 element = arr[i]; 30 } 31 }); 32});*/ 33 34let filterSliders = document.querySelectorAll(".filter-slider") 35 36filterSliders.forEach(slider => { 37const rangeSlider = slider.querySelector(`.range-slider`) 38const rangeSlider_ormode = slider.querySelector(`.range-slider.or_mode`) 39const rangeInput0 = slider.querySelector(`.range-slider__input1`) 40const rangeInput1 = slider.querySelector(`.range-slider__input2`) 41const rangeInputs = [rangeInput0, rangeInput1] 42 43let startValue1 = +slider.getAttribute("data-start") 44let startValue2 = +slider.getAttribute("data-start2") 45let min = +slider.getAttribute("data-min") 46let max = +slider.getAttribute("data-max") 47 48if (rangeSlider) { 49 noUiSlider.create(rangeSlider, { 50 start: [startValue1, startValue2], 51 connect: true, 52 step: 1, 53 range: { 54 'min': min, 55 'max': max 56 } 57 }); 58} 59if (rangeSlider) { 60 rangeSlider.noUiSlider.on('update', function(values, handle) { 61 rangeInputs[handle].value = Math.round(values[handle]) 62 }) 63 rangeSlider.noUiSlider.on('slide', function(values, handle) { 64 all_inputs = $('.filter-slider__inputs').find('input').not(rangeInputs) 65 all_inputs.each(function () { 66 $(this).val(''); 67 }) 68 }) 69 rangeInputs.forEach((el, index) => { 70 el.addEventListener('change', (e) => { 71 setRangeSlider(index, e.currentTarget.value) 72 }) 73 }) 74 $('.or_mode').find('.filter-slider__inputs').find('input').each(function(){ 75 //console.log($(this)) 76 //$(this).val(10000); 77 }) 78} 79const setRangeSlider = (i, value) => { 80 let array = [null, null]; 81 array[i] = value; 82 83 rangeSlider.noUiSlider.set(array); 84 }; 85}) 86 87 88document.addEventListener("DOMContentLoaded", function () { 89 fix100vh(); 90 window.addEventListener('resize', () => { 91 fix100vh(); 92 }) 93// ÐаÑÑив даннÑÑ (пÑимеÑ) 94 console.log(arrayDealers) 95 let destinations = arrayDealers; 96 let arrcities = arrayCities; 97 let arrspecs = []; 98 if(typeof arraySpecs !== "undefined") { arrspecs = arraySpecs; } 99//console.log(arrspecs); 100 101//delete_cookie('cookie-modal', '') 102//delete_cookie('max-modal', '') 103 $('.cookie-modal__btn').click(function () { 104 $('.cookie-modal').removeClass('_active'); 105 document.cookie = "cookie-modal=true; path=/; max-age=2592000"; 106 return false; 107 }); 108 109 $('.maxmodal-wrapper__close-wrapper').click(function () { 110 $('.maxmodal-container').removeClass('maxmodal-container_opened'); 111 document.cookie = "max-modal=true; path=/; max-age=2592000"; 112 return false; 113 }); 114 115 116 $('.filter_zapchasti').change(function() { 117 parentDiv = $(this).closest('.filter__list-row'); 118 parentData = parentDiv.find('.filter_zapchasti_data'); 119 // СоздаÑм маÑÑив Ñо знаÑениÑми вÑбÑаннÑÑ ÑекбокÑов 120 var allFilterBoxes = $('.filter_zapchasti-row'); 121 var arr = []; 122 var filterItems = []; 123 var filterRows = []; 124 var tmpArr = []; 125 var ucode = parentData.data('code'); 126 var ufields = parentData.data('fields'); 127 var pfields = parentData.data('parentfields'); 128 129 allFilterBoxes.each(function () { 130 var code = $(this).find('.filter_zapchasti_data').data('code'); 131 arr = $(this).find('.filter_zapchasti:checked').map((_, el) => el.value).get(); 132 if(arr.length > 0) { 133 filterRows.push(code); 134 filterItems.push(arr) 135 } 136 tmpArr = [filterRows, filterItems]; 137 }); 138 139 if($(this).prop('checked')) { //ÐÑли галоÑка бÑла нажаÑа (дÑÑгие ÑобÑÑÐ¸Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑÑ, когда она ÑнимаеÑÑÑ 140 var pushedCheck = $(this).val(); 141 var objs = { 142 fields: ufields, 143 parentfields: pfields, 144 code: ucode, 145 value: pushedCheck}; 146 tmpArr.push(objs); 147 148 $.ajax({ 149 url: "/local/ajax/zapchasti_filter.php", 150 method: "POST", 151 data: JSON.stringify(tmpArr), 152 success: function (result) { 153 if (result.STATUS == "ERROR") { 154 alert('ÐÑибка! ÐопÑобÑйÑе Ñнова'); 155 } else if(result.length > 0) { 156 var obj = jQuery.parseJSON(result); 157 158 var items = obj['items']; 159 console.log(items) 160 $.each(items, function(key,value) { 161 var field_name = key; 162 var subarr = value; 163 var parent_box = $('.set_'+field_name); 164 var field_checkboxes = parent_box.find('input[type=checkbox]'); 165 field_checkboxes.prop('disabled', true); 166 field_checkboxes.closest('.filter__list-item-checkbox').addClass('filter_checkbox_disabled'); 167 //console.log(subarr); 168 $.each(subarr, function(k,val) {
169 var valid_checkbox = parent_box.find('input[type=checkbox][value="'+val+'"]'); 170 valid_checkbox.prop('disabled', false); 171 valid_checkbox.closest('.filter__list-item-checkbox').removeClass('filter_checkbox_disabled'); 172 }) 173 }) 174 } 175 } 176 }) 177 } else { //ÐалоÑка ÑнÑлаÑÑ, надо Ð´Ð»Ñ ÑÑого ÑлеменÑа оÑклÑÑиÑÑ Ð²Ñе доÑеÑние дÑÑгим ÑкÑипÑом 178 var removedCheck = $(this).val(); 179 objs = { 180 fields: ufields, 181 parentfields: pfields, 182 code: ucode, 183 value: removedCheck, 184 status: 'unchecked', 185 }; 186 arr=[objs, tmpArr]; 187 $.ajax({ 188 url: "/local/ajax/zapchasti_filter.php", 189 method: "POST", 190 data: JSON.stringify(arr), 191 success: function (result) { 192 if (result.STATUS == "ERROR") { 193 alert('ÐÑибка! ÐопÑобÑйÑе Ñнова'); 194 } else if (result.length > 0) { 195 var items = jQuery.parseJSON(result); 196 var field = parentData.data('fields').split('|');//ÐеÑем ÑолÑко пеÑвÑÑ Ð·Ð°Ð²Ð¸ÑимÑÑ Ð³ÑÑÐ¿Ð¿Ñ ÑекбокÑов. ÐÑÑалÑнÑе ÑекÑÑÑивно подейÑÑвÑÑÑ Ð¿Ñи имиÑаÑии оÑжаÑÐ¸Ñ ÑекбокÑа 197 if(field.length > 1) field = field[0]; 198 console.log(items); 199 $.each(items, function(key,value) { 200 var checkbox = $('.set_'+field).find('input[type=checkbox][value="'+value+'"]'); 201 checkbox.closest('.filter__list-item-checkbox').addClass('filter_checkbox_disabled'); 202 checkbox.prop('disabled', true); 203 checkbox.prop('checked', false); 204 }) 205 } 206 } 207 }) 208 } 209 }) 210 211 212 $('.zapchasti_filtered').each(function () { 213 $(this).closest('.filter__list-item-checkbox').removeClass('filter_checkbox_disabled'); 214 $(this).prop('disabled', false); 215 $(this).trigger('click'); 216 }); 217 218 headerInit(); 219 navInit(); 220 coverInit(); 221 filterInit(); 222 newsInit(); 223 mapInit(); 224 presentationInit(); 225 videoInit(); 226 productInit(); 227 carouselInit(); 228 accordionInit(); 229 historyInit(); 230 textInit(); 231 dealerNetworkInit(); 232 footerInit(); 233 specsDealersInit() 234}); 235 236function accordionInit() { 237 const accordion = document.querySelectorAll(".accordion"); 238 239 if (accordion) { 240 const accordionItems = document.querySelectorAll(".accordion__list-item"); 241 242 /* 243 * ÐÑи клике на ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð°ÐºÐºÐ¾Ñдеона пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿ÐµÑеклÑÑение клаÑÑа "accordion__list-item--active" Ñ ÑÑого ÑлеменÑа. 244 * Таким обÑазом, пÑи клике на ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð°ÐºÐºÐ¾Ñдеона, он бÑÐ´ÐµÑ Ð¾ÑкÑÑваÑÑÑÑ Ð¸Ð»Ð¸ закÑÑваÑÑÑÑ 245 */ 246 accordionItems.forEach((item) => { 247 item.addEventListener("click", () => { 248 item.classList.toggle("accordion__list-item--active"); 249 }); 250 }); 251 } 252} 253 254 255function dealerNetworkInit() { 256 const dealerNetwork = document.querySelector(".dealer-network"); 257 258 if (dealerNetwork) { 259 260 261 // ÐбÑабоÑка адÑеÑов 262 listOfDealers.forEach((dealer) => { 263 let address = dealer.address.trim(); 264 let lastTab = address.lastIndexOf("\t"); // ÐайÑи поÑледнее ÑоÑеÑание Ñимволов "\t" 265 let spaceIndex = address.indexOf(" ", lastTab); // ÐайÑи пеÑвÑй пÑобел поÑле поÑледнего "\t" 266 address = address 267 .substring(spaceIndex) 268 .replace(/[\s\n\t]+/g, " ") 269 .trim(); 270 271 // Ðамена "city" на "гоÑод" и "Сity" на "ÐоÑод" 272 address = address.replace(/city/g, "гоÑод").replace(/Сity/g, "ÐоÑод"); 273 274 dealer.address = address; 275 }); 276 277 // ÐбÑабоÑка конÑакÑов 278 const phoneRegex = /^(\s*)?(\+)?([- _():=+]?\d[- _():=+]?){10,14}(\s*)?$/; 279
280 listOfDealers.forEach((dealer) => { 281 let contacts = dealer.contacts.trim(); 282 let phones = []; 283 let emails = []; 284 285 // Разделение на номеÑа ÑелеÑонов и email 286 contacts.split("\n").forEach((contact) => { 287 if (phoneRegex.test(contact)) { 288 let phone = contact 289 .trim() 290 .replace(/^8/, "+7") 291 .replace( 292 /([\d]{1})([\d]{3})([\d]{3})([\d]{2})([\d]{2})/, 293 "+7 ($2) $3-$4-$5" 294 ); 295 phones.push(phone); 296 } else { 297 emails.push(contact.trim()); 298 } 299 }); 300 301 // Создаем новÑе Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ð½Ð¾Ð¼ÐµÑов ÑелеÑонов 302 phones.forEach((phone, index) => { 303 dealer[`phone${index + 1}`] = phone; 304 }); 305 306 // Создаем новÑе Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ email адÑеÑов 307 emails.forEach((email, index) => { 308 dealer[`email${index + 1}`] = email; 309 }); 310 311 // Удаление Ð¿Ð¾Ð»Ñ "contacts" 312 delete dealer.contacts; 313 }); 314 315 // ÐолÑÑение кооÑÐ´Ð¸Ð½Ð°Ñ 316 listOfDealers.forEach((dealer) => { 317 let address = dealer.address.trim(); 318 let city = dealer.city.trim(); 319 let lastTab = address.lastIndexOf("\t"); 320 let spaceIndex = address.indexOf(" ", lastTab); 321 let lowerCorner; 322 // let coords = []; 323 address = address 324 .substring(spaceIndex) 325 .replace(/[\s\n\t]+/g, " ") 326 .trim(); 327 dealer.address = address; 328 329 330 // ymaps.geocode(address).then((res) => { 331 // let firstGeoObject = res.geoObjects.get(0); 332 // let coords = firstGeoObject.geometry.getCoordinates(); 333 // dealer.coords = coords; 334 // }); 335 // const url = 336 // "https://geocode-maps.yandex.ru/1.x/?apikey=4ba8f8f6-4a7e-4835-b801-917a745db72f&geocode=бÑлÑваÑ+ÐÑÑ Ð°Ð¼Ð¼ÐµÐ´+Ðин+РаÑид+1&format=json"; 337 const url = 338 "https://geocode-maps.yandex.ru/1.x/?apikey=4ba8f8f6-4a7e-4835-b801-917a745db72f&geocode=" + 339 city + 340 ", " + 341 address + 342 "+1&format=json"; 343 // alert(city + address); 344 fetch(url) 345 .then((response) => { 346 if (!response.ok) { 347 throw new Error("Network response was not ok"); 348 } 349 return response.json(); 350 }) 351 .then((data) => { 352 // ÐоÑÑÑп к знаÑÐµÐ½Ð¸Ñ lowerCorner 353 lowerCorner = 354 data.response.GeoObjectCollection.featureMember[0].GeoObject 355 .boundedBy.Envelope.lowerCorner; 356 357 // Создаем новÑе Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ email адÑеÑов 358 // coords.forEach((coord, index) => { 359 // dealer[`coord${index + 1}`] = lowerCorner; 360 // }); 361 // console.log(lowerCorner); 362 }) 363 .catch((error) => { 364 console.error( 365 "There has been a problem with your fetch operation:", 366 error, 367 address 368 ); 369 }); 370 // dealer.coords = lowerCorner; 371 // dealer.push({coords.lowerCorner}); 372 dealer.push({ coords: lowerCorner }); 373 }); 374 375 } 376} 377 378function carouselInit() { 379 const carousel = document.querySelector(".carousel"); 380 381 if (carousel) { 382 let dotsStatus = $(".carousel__slider .carousel__item").length > 1; 383 384 /* 385 * ÐниÑиализиÑÑем каÑÑÑелÑ, иÑполÑзÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ Slick Carousel, Ð·Ð°Ð´Ð°Ð²Ð°Ñ Ð¾Ð¿Ñии Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñлайдов, 386 * ÑкоÑоÑÑи пÑолиÑÑÑваниÑ, налиÑÐ¸Ñ ÑÑÑелок Ð´Ð»Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñии, налиÑÐ¸Ñ ÑоÑек Ð´Ð»Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñии, 387 * авÑомаÑиÑеÑкого пÑоигÑÑÐ²Ð°Ð½Ð¸Ñ Ð¸ дÑÑÐ³Ð¸Ñ Ð¿Ð°ÑамеÑÑов. 388 * https://kenwheeler.github.io/slick/ 389 */ 390 $(".carousel__slider--simple").slick({ 391 slidesToShow: 1, 392 slidesToScroll: 1, 393 arrows: false, 394 fade: false, 395 dots: dotsStatus, 396 autoplay: false, 397 speed: 800, 398 }); 399 400 /* 401 * ÐниÑиализиÑÑем оÑновной ÑÐ»Ð°Ð¹Ð´ÐµÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки Slick Carousel. 402 * https://kenwheeler.github.io/slick/ 403 */ 404 // fade slider 405 $(".carousel__slider--with-thumbs").slick({ 406 slidesToShow: 1, 407 slidesToScroll: 1,
408 arrows: false, 409 fade: false, 410 dots: false, 411 autoplay: false, 412 speed: 500, 413 asNavFor: ".carousel__nav", 414 // responsive: [ 415 // { 416 // breakpoint: 768, 417 // settings: { 418 // dots: true, 419 // }, 420 // }, 421 // // You can unslick at a given breakpoint now by adding: 422 // // settings: "unslick" 423 // // instead of a settings object 424 // ], 425 }); 426 /* 427 * ÐниÑиализиÑÑем навигаÑионнÑй ÑлайдеÑ, коÑоÑÑй ÑлÑÐ¶Ð¸Ñ Ð´Ð»Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñии по ÑлеменÑам оÑновного ÑлайдеÑа. 428 * https://kenwheeler.github.io/slick/ 429 */ 430 // navigation slider 431 $(".carousel__nav").slick({ 432 slidesToShow: 4, 433 slidesToScroll: 1, 434 asNavFor: ".carousel__slider--with-thumbs", 435 dots: false, 436 arrows: false, 437 vertical: false, 438 centerMode: false, 439 focusOnSelect: true, 440 speed: 500, 441 }); 442 443 const link = document.querySelector(".carousel__item"); 444 445 if (link) { 446 let gallery = document.querySelector(".carousel__slider"); 447 /* 448 * ÐниÑиализиÑÑем галеÑÐµÑ Ð¸Ð·Ð¾Ð±Ñажений Ð´Ð»Ñ ÐºÐ°ÑÑÑели, иÑполÑзÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ LightGallery. 449 * ÐдеÑÑ Ð¼Ñ Ð½Ð°ÑÑÑаиваем опÑии галеÑеи, Ñакие как оÑклÑÑение кнопки ÑкаÑиваниÑ, 450 * наÑÑÑойка ÑÑвÑÑвиÑелÑноÑÑи Ñвайпа, ÑелекÑÐ¾Ñ Ð¸Ð·Ð¾Ð±Ñажений и дÑÑгие паÑамеÑÑÑ. 451 * https://www.lightgalleryjs.com 452 */ 453 lightGallery(gallery, { 454 download: false, // оÑклÑÑение кнопки ÑкаÑÐ¸Ð²Ð°Ð½Ð¸Ñ 455 swipeThreshold: 50, // наÑÑÑойка ÑÑвÑÑвиÑелÑноÑÑи Ñвайпа, 456 selector: "a.carousel__item", 457 counter: false, 458 }); 459 } 460 } 461} 462 463function coverInit() { 464 const cover = document.querySelector(".cover"); 465 466 if (cover) { 467 /* 468 * ÐниÑиализиÑÑем оÑновной ÑÐ»Ð°Ð¹Ð´ÐµÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки Slick Carousel. 469 * ÐÐ»Ñ Ð¾Ñновного ÑлайдеÑа Ð·Ð°Ð´Ð°Ð½Ñ Ð¾Ð¿Ñии, Ñакие как оÑобÑажение одного Ñлайда за Ñаз, 470 * пÑокÑÑÑка одного Ñлайда, ÑкÑÑÑие ÑÑÑелок навигаÑии, иÑполÑзование ÑÑÑекÑа заÑÑÑ Ð°Ð½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ñлайдами, 471 * ÑвÑзÑвание Ñ Ð½Ð°Ð²Ð¸Ð³Ð°ÑионнÑм ÑлайдеÑом и дÑÑгие паÑамеÑÑÑ. 472 * https://kenwheeler.github.io/slick/ 473 */ 474 // fade slider 475 $(".cover__slider").slick({ 476 slidesToShow: 1, 477 slidesToScroll: 1, 478 arrows: false, 479 fade: true, 480 asNavFor: ".cover__nav", 481 autoplay: true, 482 autoplaySpeed: 20000, 483 speed: 3000, 484 responsive: [ 485 { 486 breakpoint: 768, 487 settings: { 488 dots: true, 489 }, 490 }, 491 // You can unslick at a given breakpoint now by adding: 492 // settings: "unslick" 493 // instead of a settings object 494 ], 495 }); 496 497 var filtered = false; 498 if ($(window).width() < 768) { 499 if (filtered === false) { 500 $('.cover__slider').slick('slickFilter',':not(.hide-on-mobile)'); 501 filtered = true; 502 } 503 }; 504 /* 505 * ÐниÑиализиÑÑем навигаÑионнÑй ÑлайдеÑ, коÑоÑÑй ÑлÑÐ¶Ð¸Ñ Ð´Ð»Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñии по ÑлеменÑам оÑновного ÑлайдеÑа. 506 * ÐавигаÑионнÑй ÑÐ»Ð°Ð¹Ð´ÐµÑ Ñакже ÑоздаеÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñеки Slick Carousel и наÑÑÑоен на показ ÑеÑÑÑÐµÑ Ñлайдов, 507 * пÑокÑÑÑÐºÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñлайда, веÑÑикалÑное оÑобÑажение, вÑделение ÑекÑÑего ÑлеменÑа и дÑÑгие опÑии. 508 * https://kenwheeler.github.io/slick/ 509 */ 510 // navigation slider 511 $(".cover__nav").slick({ 512 slidesToShow: 4, 513 slidesToScroll: 1, 514 asNavFor: ".cover__slider", 515 dots: false,
516 arrows: false, 517 vertical: true, 518 centerMode: false, 519 focusOnSelect: true, 520 speed: 3000, 521 }); 522 } 523} 524 525function filterInit() { 526 const filter = document.querySelector(".filter"); 527 528 if (filter) { 529 const navFilterBtn = document.querySelector(".filter__nav-btn"); 530 const navFilterList = document.querySelector(".filter__list"); 531 532 navFilterBtn.addEventListener("click", (event) => { 533 event.preventDefault(); 534 navFilterList.classList.toggle("filter__list--active"); 535 }); 536 } 537} 538 539function headerInit() { 540 const header = document.querySelector(".header"); 541 542 if (header) { 543 /* 544 ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ вÑе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе ÑлеменÑÑ Ð²Ð½ÑÑÑи .header: ÐºÐ½Ð¾Ð¿ÐºÑ Ð¿Ð¾Ð¸Ñка, иконки поиÑка и закÑÑÑиÑ, 545 а Ñакже ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ ÐºÐ»Ð°ÑÑом ".search". 546 */ 547 const headerBtnSearch = document.querySelector(".header__btn--search"); 548 const headerIconSearch = document.querySelector(".header__icon--search"); 549 const headerIconClose = document.querySelector(".header__icon--close"); 550 const search = document.querySelector(".search"); 551 552 /* 553 ÐобавлÑем обÑабоÑÑик ÑобÑÑÐ¸Ñ 'click' Ð´Ð»Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ ".header__btn--search". 554 ÐÑи клике на нее пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿ÐµÑеклÑÑение клаÑÑа "header__icon--hidden" Ð´Ð»Ñ Ð¸ÐºÐ¾Ð½Ð¾Ðº поиÑка и закÑÑÑиÑ, 555 а Ñакже пеÑеклÑÑение клаÑÑа "search--active" Ð´Ð»Ñ ÑлеменÑа ".search". 556 */ 557 headerBtnSearch.addEventListener("click", (event) => { 558 event.preventDefault(); 559 if (headerIconSearch.classList.contains("header__icon--hidden")) { 560 headerIconSearch.classList.remove("header__icon--hidden"); 561 headerIconClose.classList.add("header__icon--hidden"); 562 } else { 563 headerIconSearch.classList.add("header__icon--hidden"); 564 headerIconClose.classList.remove("header__icon--hidden"); 565 } 566 567 search.classList.toggle("search--active"); 568 }); 569 570 /* 571 ÐобавлÑем обÑабоÑÑик ÑобÑÑÐ¸Ñ 'click' на докÑменÑ. ÐÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ ".search" Ð¸Ð¼ÐµÐµÑ ÐºÐ»Ð°ÑÑ "search--active" 572 и бÑл пÑоизведен клик вне ÑÑого ÑлеменÑа и вне ".header", Ñо клаÑÑ "search--active" ÑдалÑеÑÑÑ, 573 и иконки поиÑка и закÑÑÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаÑÑÑÑ Ð² иÑÑ Ð¾Ð´Ð½Ð¾Ðµ ÑоÑÑоÑние. 574 */ 575 document.addEventListener("click", (event) => { 576 if ( 577 search.classList.contains("search--active") && 578 !header.contains(event.target) && 579 !search.contains(event.target) 580 ) { 581 search.classList.remove("search--active"); 582 headerIconSearch.classList.remove("header__icon--hidden"); 583 headerIconClose.classList.add("header__icon--hidden"); 584 } 585 }); 586 587 // ÐолÑÑаем нÑжнÑе ÑлеменÑÑ Ð¸Ð· DOM 588 const secondaryNavItems = document.querySelectorAll( 589 ".header__nav-item--nav-secondary" 590 ); 591 const navMenus = document.querySelectorAll(".nav"); 592 const tabControls = document.querySelectorAll(".nav__tabs-controls-item"); 593 const tabContents = document.querySelectorAll(".nav__tabs-content-item"); 594 595 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°/ÑкÑÑÑÐ¸Ñ Ð²ÑоÑоÑÑепенного Ð¼ÐµÐ½Ñ 596 secondaryNavItems.forEach((item) => { 597 item.addEventListener("click", function () { 598 const navNumber = this.getAttribute("data-nav"); 599 const targetNav = document.querySelector( 600 '.nav[data-nav="' + navNumber + '"]' 601 ); 602 603 if (targetNav.classList.contains("nav--active")) { 604 targetNav.classList.remove("nav--active"); 605 this.classList.remove("nav__tabs-content-item--active"); 606 } else { 607 // ÐакÑÑваем вÑе вÑоÑоÑÑепеннÑе Ð¼ÐµÐ½Ñ 608 navMenus.forEach((menu) => { 609 menu.classList.remove("nav--active"); 610 }); 611 612 // УдалÑем акÑивнÑй клаÑÑ Ñ Ð²ÑÐµÑ .header__nav-item--nav-secondary
613 secondaryNavItems.forEach((item) => { 614 item.classList.remove("nav__tabs-content-item--active"); 615 }); 616 617 targetNav.classList.add("nav--active"); 618 this.classList.add("nav__tabs-content-item--active"); 619 } 620 }); 621 }); 622 623 // ÐакÑÑÑие Ð¼ÐµÐ½Ñ Ð¿Ñи клике вне ÑлеменÑа .header или его доÑеÑÐ½Ð¸Ñ ÑлеменÑов 624 document.addEventListener("click", function (event) { 625 const isClickInsideHeader = document 626 .querySelector(".header") 627 .contains(event.target); 628 if (!isClickInsideHeader) { 629 navMenus.forEach((menu) => { 630 menu.classList.remove("nav--active"); 631 }); 632 secondaryNavItems.forEach((item) => { 633 item.classList.remove("nav__tabs-content-item--active"); 634 }); 635 } 636 }); 637 tabControls.forEach((control) => { 638 control.addEventListener("click", function () { 639 const tabValue = control.getAttribute("data-tab"); 640 641 // ÐайÑи акÑивнÑй .nav, коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð´Ð°Ð½Ð½Ñй Ñаб 642 const activeNav = document.querySelector(".nav.nav--active[data-nav]"); 643 644 if (activeNav) { 645 // УбиÑаем акÑивнÑй клаÑÑ Ñ Ð²ÑÐµÑ ÐºÐ¾Ð½ÑÑолов в ÑекÑÑем акÑивном .nav 646 activeNav 647 .querySelectorAll(".nav__tabs-controls-item") 648 .forEach((c) => { 649 c.classList.remove("nav__tabs-controls-item--active"); 650 }); 651 652 // ÐазнаÑаем акÑивнÑй клаÑÑ ÐºÐ»Ð¸ÐºÐ½ÑÑÐ¾Ð¼Ñ ÐºÐ¾Ð½ÑÑÐ¾Ð»Ñ 653 control.classList.add("nav__tabs-controls-item--active"); 654 655 // УбиÑаем акÑивнÑй клаÑÑ Ñ Ð²ÑÐµÑ ÐºÐ¾Ð½ÑенÑов в ÑекÑÑем акÑивном .nav 656 activeNav.querySelectorAll(".nav__tabs-content-item").forEach((c) => { 657 c.classList.remove("nav__tabs-content-item--active"); 658 }); 659 660 // ÐазнаÑаем акÑивнÑй клаÑÑ ÐºÐ¾Ð½ÑенÑÑ Ñ ÑооÑвеÑÑÑвÑÑÑим data-tab знаÑением 661 const selectedContent = activeNav.querySelector( 662 '.nav__tabs-content-item[data-tab="' + tabValue + '"]' 663 ); 664 665 if (selectedContent) { 666 /* 667 * ÐлаÑÑ "nav__tabs-content-item--active" добавлÑеÑÑÑ Ðº вÑбÑÐ°Ð½Ð½Ð¾Ð¼Ñ ÐºÐ¾Ð½ÑенÑÑ, 668 * ÑÑÐ¾Ð±Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑиÑÑ ÐµÐ³Ð¾ акÑивнÑм ÑоÑÑоÑнием. 669 */ 670 selectedContent.classList.add("nav__tabs-content-item--active"); 671 672 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑелÑÑкий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²ÑбÑанного конÑенÑа (parentContent) 673 const parentContent = selectedContent.parentNode; 674 675 /* 676 * ÐÑовеÑÑем, ÑодеÑÐ¶Ð¸Ñ Ð»Ð¸ вÑбÑаннÑй конÑÐµÐ½Ñ ÐºÐ»Ð°ÑÑ "nav__tabs-content-item--single-img". 677 * ÐÑли ÑодеÑжиÑ, Ñо добавлÑем клаÑÑ "nav__tabs-content--remove-padding" к ÑодиÑелÑÑÐºÐ¾Ð¼Ñ ÐºÐ¾Ð½ÑенÑÑ, 678 * в пÑоÑивном ÑлÑÑае ÑдалÑем ÑÑÐ¾Ñ ÐºÐ»Ð°ÑÑ. 679 */ 680 if ( 681 selectedContent.classList.contains( 682 "nav__tabs-content-item--single-img" 683 ) 684 ) { 685 parentContent.classList.add("nav__tabs-content--remove-padding"); 686 } else { 687 parentContent.classList.remove( 688 "nav__tabs-content--remove-padding" 689 ); 690 } 691 692 // ÐÑем внÑÑÑи вÑбÑанного конÑенÑа ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ ÐºÐ»Ð°ÑÑом "nav__secondary" (вÑоÑиÑное менÑ). 693 const secondaryMenu = 694 selectedContent.querySelector(".nav__secondary"); 695 if (secondaryMenu) { 696 /* 697 * ÐÑли вÑоÑиÑное Ð¼ÐµÐ½Ñ Ð½Ð°Ð¹Ð´ÐµÐ½Ð¾, Ð¼Ñ Ð²ÑÑиÑлÑем Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð²ÑÑоÑÑ paddingTop 698 * Ð´Ð»Ñ Ð¿Ð¾Ð·Ð¸ÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ веÑÑикали. 699 */ 700 const paddingTop = parseInt( 701 window.getComputedStyle(selectedContent).paddingTop 702 ); 703 /* 704 * ÐÑÑиÑлÑем offsetTop Ð´Ð»Ñ Ð¿Ð¾Ð·Ð¸ÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²ÑоÑиÑного Ð¼ÐµÐ½Ñ Ð¾ÑноÑиÑелÑно некоÑоÑÑÑ Ð¿Ð°ÑамеÑÑов 705 * вÑбÑанного конÑенÑа и control 706 */ 707 const offsetTop = 708 control.offsetTop + 709 control.offsetHeight - 710 control.clientHeight -
711 paddingTop - 712 45 - 713 2; 714 /* 715 * УÑÑанавливаем top Ð´Ð»Ñ Ð²ÑоÑиÑного менÑ, ÑÑÐ¾Ð±Ñ Ð¿ÑавилÑно позиÑиониÑоваÑÑ ÐµÐ³Ð¾ 716 * оÑноÑиÑелÑно вÑбÑанного конÑенÑа. 717 */ 718 secondaryMenu.style.top = offsetTop + "px"; 719 } 720 } 721 } 722 }); 723 }); 724 725 // ÐоказаÑÑ/ÑкÑÑÑÑ Ð½Ð°Ð²Ð¸Ð³Ð°ÑÐ¸Ñ Ð½Ð° мобилÑнÑÑ 726 const headerBtnNav = document.querySelector(".header__link-menu"); 727 const nav = document.querySelector(".nav--mobile"); 728 const body = document.querySelector("body"); 729 const headerPhone = document.querySelector(".header__phone"); 730 731 // ÐобавлÑем обÑабоÑÑик ÑобÑÑÐ¸Ñ ÐºÐ»Ð¸ÐºÐ° на .header__btn-nav 732 headerBtnNav.addEventListener("click", () => { 733 // ÐобавлÑем клаÑÑ nav--active к .nav 734 nav.classList.toggle("nav--active"); 735 // ÐобавлÑем клаÑÑ hidden-scroll к body 736 body.classList.toggle("hidden-scroll"); 737 headerPhone.classList.toggle("header__phone--hidden"); 738 }); 739 } 740} 741 742function footerInit() { 743 let footer = document.querySelector(".footer"); 744 if (footer) { 745 /* 746 * ÐеÑÑ Ð½Ð¸Ð¶ÐµÐ¿ÑиведеннÑй код не более Ñем ÐºÐ¾Ð¿Ð¸Ñ Ð¸Ð· blocks/map/map.js 747 * 1) ÐÐ°Ð¼ÐµÐ½ÐµÐ½Ñ Ð¸Ð¼ÐµÐ½Ð° клаÑÑов Ð´Ð»Ñ .footer__form, .footer__form-input-wrapper, 748 * .footer__form-input-close, .footer__form-input-text, .footer__form-list, .footer__form-btn 749 * 2) ÐÑÑезан ÑÑнкÑионал ÑилÑÑÑаÑии по каÑегоÑии 750 */ 751 752 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ вÑе ÑлеменÑÑ ÑоÑÐ¼Ñ Ð²Ð²Ð¾Ð´Ð° ÑекÑÑа на ÑÑÑаниÑе 753 let textInputs = document.querySelectorAll(".footer__form-input-text"); 754 // ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ð¾Ð³Ð¾ ÑекÑÑа 755 let inputText = ""; 756 757 // УÑÑанавливаем обÑабоÑÑик ÑобÑÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° ÑекÑÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа ÑоÑÐ¼Ñ 758 textInputs.forEach((textInput) => { 759 textInput.addEventListener("input", function () { 760 // Ð¡Ð¾Ñ ÑанÑем введеннÑй ÑекÑÑ Ð² нижнем ÑегиÑÑÑе 761 inputText = this.value.toLowerCase(); 762 763 btn = this.closest(".footer__form").querySelector(".footer__form-btn"); 764 765 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑÐµÐ»Ñ ÑлеменÑа ".footer__form-input-wrapper" 766 let parentWrapper = this.closest(".footer__form-input-wrapper"); 767 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑÐ»ÐµÐ¼ÐµÐ½Ñ ".footer__form-input-close" внÑÑÑи ÑодиÑÐµÐ»Ñ 768 let inputClose = parentWrapper.querySelector( 769 ".footer__form-input-close" 770 ); 771 772 // ÐобавлÑем клаÑÑ "footer__form-input-close--active" ÑлеменÑÑ Ð¿Ñи вводе ÑекÑÑа 773 if (inputText !== "") { 774 inputClose.classList.add("footer__form-input-close--active"); 775 } else { 776 // УдалÑем клаÑÑ "footer__form-input-close--active" еÑли в инпÑÑе Ð½ÐµÑ Ñимволов 777 inputClose.classList.remove("footer__form-input-close--active"); 778 } 779 780 // ФилÑÑÑÑем гоÑода на оÑнове введенного ÑекÑÑа и каÑегоÑии 781 let filteredCities = getFilteredCities(inputText); 782 783 784 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ вÑе ÑлеменÑÑ Ñ ÐºÐ»Ð°ÑÑом .footer__form-list 785 const filterLists = document.querySelectorAll(".footer__form-list"); 786 787 // ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ найденного ÑлеменÑа добавлÑем обÑабоÑÑик ÑобÑÑÐ¸Ñ Ð½Ð° клик 788 filterLists.forEach((filterList) => { 789 filterList.addEventListener("click", function (event) { 790 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑÐµÐ»Ñ ÑлеменÑа Ñ ÐºÐ»Ð°ÑÑом .footer__form 791 const formItem = event.target.closest(".footer__form"); 792 793 // ÐÑли ÑодиÑÐµÐ»Ñ Ð±Ñл найден, иÑем доÑеÑний ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ ÐºÐ»Ð°ÑÑом .footer__form-input-text 794 if (formItem) { 795 const textInput = formItem.querySelector( 796 ".footer__form-input-text" 797 ); 798 799 // ÐÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð°Ð¹Ð´ÐµÐ½, вÑводим его знаÑение 800 if (textInput) { 801 setTimeout(function () { 802 // Создадим Ñлаг, коÑоÑÑй показÑваеÑ, бÑло ли Ñ Ð¾ÑÑ Ð¾Ð´Ð½Ð¾ Ñовпадение 803 let cityMatched = false;
804 // ÐÑойдем по ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑлеменÑÑ Ð² filteredCities 805 filteredCities.forEach((obj) => { 806 // ÐÑовеÑим, еÑÑÑ Ð»Ð¸ Ñ ÑекÑÑего обÑекÑа поле city 807 if (obj) { 808 let city = obj.toLowerCase(); 809 810 // СÑавним знаÑение Ð¿Ð¾Ð»Ñ city Ñ textInput.value 811 812 if (city === textInput.value.toLowerCase()) { 813 // ÐÑли Ñ Ð¾ÑÑ Ð¾Ð´Ð½Ð¾ знаÑение ÑовпадаеÑ, ÑÑÑановим Ñлаг в true 814 cityMatched = true; 815 } 816 } 817 }); 818 819 820 // ÐоÑле пÑÐ¾Ñ Ð¾Ð´Ð° по вÑем знаÑениÑм, пÑовеÑим Ñлаг и вклÑÑим/вÑклÑÑим ÐºÐ½Ð¾Ð¿ÐºÑ "ÐайÑи" 821 if (cityMatched) { 822 btn.classList.remove("footer__form-btn--disabled"); 823 } else { 824 btn.classList.add("footer__form-btn--disabled"); 825 } 826 }, 350); 827 } 828 } 829 }); 830 }); 831 832 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑпиÑок подÑказок Ð´Ð»Ñ ÑекÑÑего ÑлеменÑа ввода 833 let suggestionsList = this.nextElementSibling; 834 835 // ÐÑиÑаем ÑпиÑок подÑказок 836 suggestionsList.innerHTML = ""; 837 // ÐÑли еÑÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие гоÑода и введен ÑекÑÑ 838 if (filteredCities.length > 0 && inputText !== "") { 839 // ÐоказÑваем ÑпиÑок подÑказок 840 suggestionsList.classList.add("footer__form-list--active"); 841 // ÐобавлÑем Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие гоÑода в ÑпиÑок подÑказок 842 filteredCities.forEach(function (destination) { 843 suggestionsList.innerHTML += 844 "<li class='footer__form-list-item'>" + 845 destination + 846 "</li>"; 847 }); 848 const items = suggestionsList.querySelectorAll( 849 ".footer__form-list-item" 850 ); // ÐайÑи вÑе ÑлеменÑÑ ÑпиÑка 851 852 if (items.length > 7) { 853 const totalItems = Math.min(items.length, 7); // ÐодÑÑиÑÑваем не более 7 ÑлеменÑов 854 855 let totalHeight = 0; 856 for (let i = 0; i < totalItems; i++) { 857 totalHeight += items[i].clientHeight; 858 } 859 860 suggestionsList.style.height = totalHeight + "px"; // ÐÑименÑем ÑÑÐ¼Ð¼Ñ Ð²ÑÑÐ¾Ñ Ðº suggestionsList 861 } 862 } else { 863 // СкÑÑваем ÑпиÑок подÑказок, еÑли Ð½ÐµÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÐ¸Ñ Ð³Ð¾Ñодов 864 suggestionsList.classList.remove("footer__form-list--active"); 865 } 866 }); 867 }); 868 869 // УÑÑанавливаем обÑабоÑÑик ÑобÑÑÐ¸Ñ ÐºÐ»Ð¸ÐºÐ° на ÑлеменÑÐ°Ñ ".footer__form-input-close" 870 document.querySelectorAll(".footer__form").forEach((item) => { 871 item.addEventListener("click", function (event) { 872 if (event.target.classList.contains("footer__form-input-close")) { 873 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑÐµÐ»Ñ ÑлеменÑа ".footer__form-input-close" 874 let parentWrapper = event.target.closest( 875 ".footer__form-input-wrapper" 876 ); 877 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑÐµÐ»Ñ ÑлеменÑа ".footer__form" 878 let form = event.target.closest(".footer__form"); 879 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÐºÐ½Ð¾Ð¿ÐºÑ 880 let btn = form.querySelector(".footer__form-btn"); 881 // ÐÑклÑÑаем ÐºÐ½Ð¾Ð¿ÐºÑ "ÐайÑи" 882 btn.disabled = true; 883 884 // ÐÑиÑаем инпÑÑ 885 parentWrapper.querySelector(".footer__form-input-text").value = ""; 886 887 // УдалÑем пÑнкÑÑ ÑпиÑка 888 parentWrapper.querySelector(".footer__form-list").innerHTML = ""; 889 890 // СкÑÑваем ÑпиÑок, Ñдалив акÑивнÑй клаÑÑ 891 parentWrapper 892 .querySelector(".footer__form-list") 893 .classList.remove("footer__form-list--active"); 894 895 // УдалÑем клаÑÑ "footer__form-input-close--active" пÑи ÑбÑоÑе знаÑÐµÐ½Ð¸Ñ 896 event.target.classList.remove("footer__form-input-close--active"); 897 } 898 }); 899 }); 900 901 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ ÑилÑÑÑаÑии гоÑодов на оÑнове введенного ÑекÑÑа 902 function getFilteredCities(input) { 903 904 let cities = $('#citiesdata').val().split(','); 905 console.log(cities); 906 907 return cities.filter(function (city) { 908 let destinationText = city.toLowerCase(); 909 let matched = true; 910 911 // ÐÑовеÑÑем каждÑй Ñимвол во введенном ÑекÑÑе на ÑооÑвеÑÑÑвие 912 for (let i = 0; i < input.length; i++) { 913 if (destinationText[i] !== input[i]) { 914 matched = false;
915 break; 916 } 917 } 918 // ÐозвÑаÑаем ÑолÑко ÑовпадаÑÑие гоÑода Ñ Ð²ÑбÑанной 919 return matched; 920 }); 921 } 922 923 // УÑÑанавливаем обÑабоÑÑик ÑобÑÑÐ¸Ñ ÐºÐ»Ð¸ÐºÐ° на ÑлеменÑÐ°Ñ ÑпиÑка подÑказок 924 document.querySelectorAll(".footer__form").forEach((item) => { 925 item.addEventListener("click", function (event) { 926 if (event.target.classList.contains("footer__form-list-item")) { 927 // ÐолÑÑаем вÑбÑаннÑй гоÑод 928 let selectedCity = event.target.textContent; 929 930 // ÐаполнÑем ÑекÑÑовое поле вÑбÑаннÑм гоÑодом 931 event.target 932 .closest(".footer__form") 933 .querySelector(".footer__form-input-text").value = selectedCity; 934 935 // СкÑÑваем ÑпиÑок подÑказок и оÑиÑаем его 936 event.target 937 .closest(".footer__form-list") 938 .classList.remove("footer__form-list--active"); 939 event.target.closest(".footer__form-list").innerHTML = ""; 940 } 941 }); 942 }); 943 944 // Ðлик на "ÐайÑи" 945 document 946 .querySelector(".footer__form-btn") 947 .addEventListener("click", function (event) { 948 // ÐолÑÑаем знаÑение введенного гоÑода 949 const selectedCity = document.querySelector("#input-find-city").value; 950 951 // ФоÑмиÑÑем URL-адÑÐµÑ Ñ ÑÑеÑом пÑавил API ЯндекÑа 952 const yandexMapsURL = 953 "/dilerskaya-set/?city=" + 954 encodeURIComponent(selectedCity); 955 // ÐеÑенапÑавлÑем полÑзоваÑÐµÐ»Ñ Ð½Ð° ÑÑÑаниÑÑ ÐºÐ°ÑÑÑ Ð¯Ð½Ð´ÐµÐºÑа Ñ Ð·Ð°Ð¿ÑоÑом Ð´Ð»Ñ Ð²ÑбÑанного гоÑода 956 window.location.href = yandexMapsURL; 957 }); 958 } 959} 960 961function mapInit(arrcities) { 962 let mapContainer = document.querySelector(".map"); 963 964 if (mapContainer) { 965 let map; 966 967 // ÐаÑÑив даннÑÑ (пÑимеÑ) 968 let destinations = []; 969 if(arrayDealers) destinations = arrayDealers; 970 let destinations_services = arrayServices; 971 972 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ вÑе ÑлеменÑÑ ÑоÑÐ¼Ñ Ð²Ð²Ð¾Ð´Ð° ÑекÑÑа на ÑÑÑаниÑе 973 let textInputs = document.querySelectorAll(".map__filters-item-text-input"); 974 // ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ð¾Ð³Ð¾ ÑекÑÑа 975 let inputText = ""; 976 // ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð²ÑбÑанной каÑегоÑии 977 let category = ""; 978 979 // УÑÑанавливаем обÑабоÑÑик ÑобÑÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° ÑекÑÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа ÑоÑÐ¼Ñ 980 textInputs.forEach((textInput) => { 981 textInput.addEventListener("input", function () { 982 // Ð¡Ð¾Ñ ÑанÑем введеннÑй ÑекÑÑ Ð² нижнем ÑегиÑÑÑе 983 inputText = this.value.toLowerCase(); 984 985 // ÐолÑÑаем каÑегоÑÐ¸Ñ Ð¸Ð· ближайÑего ÑодиÑелÑÑкого ÑлеменÑа 986 category = this.closest(".map__filters-item-form").dataset.category; 987 988 btn = this.closest(".map__filters-item-form").querySelector( 989 ".map__filters-item-btn" 990 ); 991 992 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑÐµÐ»Ñ ÑлеменÑа ".map__filters-item-text-input-wrapper" 993 let parentWrapper = this.closest( 994 ".map__filters-item-text-input-wrapper" 995 ); 996 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑÐ»ÐµÐ¼ÐµÐ½Ñ ".map__filters-item-text-input-close" внÑÑÑи ÑодиÑÐµÐ»Ñ 997 let inputClose = parentWrapper.querySelector( 998 ".map__filters-item-text-input-close" 999 ); 1000 1001 // ÐобавлÑем клаÑÑ "map__filters-item-text-input-close--active" ÑлеменÑÑ Ð¿Ñи вводе ÑекÑÑа 1002 if (inputText !== "") { 1003 inputClose.classList.add( 1004 "map__filters-item-text-input-close--active" 1005 ); 1006 } else { 1007 // УдалÑем клаÑÑ "map__filters-item-text-input-close--active" еÑли в инпÑÑе Ð½ÐµÑ Ñимволов 1008 inputClose.classList.remove( 1009 "map__filters-item-text-input-close--active" 1010 ); 1011 } 1012 1013 // ФилÑÑÑÑем гоÑода на оÑнове введенного ÑекÑÑа и каÑегоÑии 1014 let filteredCities = getFilteredCities2(inputText, category); 1015 1016 1017 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ вÑе ÑлеменÑÑ Ñ ÐºÐ»Ð°ÑÑом .map__filters-list 1018 const filterLists = document.querySelectorAll(".map__filters-list"); 1019 1020 // ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ найденного ÑлеменÑа добавлÑем обÑабоÑÑик ÑобÑÑÐ¸Ñ Ð½Ð° клик
1021 filterLists.forEach((filterList) => { 1022 filterList.addEventListener("click", function (event) { 1023 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑÐµÐ»Ñ ÑлеменÑа Ñ ÐºÐ»Ð°ÑÑом .map__filters-item-form 1024 const formItem = event.target.closest(".map__filters-item-form"); 1025 1026 // ÐÑли ÑодиÑÐµÐ»Ñ Ð±Ñл найден, иÑем доÑеÑний ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ ÐºÐ»Ð°ÑÑом .map__filters-item-text-input 1027 if (formItem) { 1028 const textInput = formItem.querySelector( 1029 ".map__filters-item-text-input" 1030 ); 1031 1032 // ÐÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð°Ð¹Ð´ÐµÐ½, вÑводим его знаÑение 1033 if (textInput) { 1034 1035 setTimeout(function () { 1036 // Создадим Ñлаг, коÑоÑÑй показÑваеÑ, бÑло ли Ñ Ð¾ÑÑ Ð¾Ð´Ð½Ð¾ Ñовпадение 1037 let cityMatched = false; 1038 1039 // ÐÑойдем по ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑлеменÑÑ Ð² filteredCities 1040 filteredCities.forEach((obj) => { 1041 // ÐÑовеÑим, еÑÑÑ Ð»Ð¸ Ñ ÑекÑÑего обÑекÑа поле city 1042 if (obj) { 1043 let city = obj.toLowerCase(); 1044 if (city === textInput.value.toLowerCase()) { 1045 // ÐÑли Ñ Ð¾ÑÑ Ð¾Ð´Ð½Ð¾ знаÑение ÑовпадаеÑ, ÑÑÑановим Ñлаг в true 1046 cityMatched = true; 1047 } 1048 } 1049 }); 1050 // ÐоÑле пÑÐ¾Ñ Ð¾Ð´Ð° по вÑем знаÑениÑм, пÑовеÑим Ñлаг и вклÑÑим/вÑклÑÑим ÐºÐ½Ð¾Ð¿ÐºÑ "ÐайÑи" 1051 if (cityMatched) { 1052 btn.disabled = false; 1053 } else { 1054 btn.disabled = true; 1055 } 1056 }, 350); 1057 } 1058 } 1059 }); 1060 }); 1061 1062 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑпиÑок подÑказок Ð´Ð»Ñ ÑекÑÑего ÑлеменÑа ввода 1063 let suggestionsList = this.nextElementSibling; 1064 1065 // ÐÑиÑаем ÑпиÑок подÑказок 1066 suggestionsList.innerHTML = ""; 1067 1068 // ÐÑли еÑÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие гоÑода и введен ÑекÑÑ 1069 if (filteredCities.length > 0 && inputText !== "") { 1070 // ÐоказÑваем ÑпиÑок подÑказок 1071 suggestionsList.classList.add("map__filters-list--active"); 1072 // ÐобавлÑем Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие гоÑода в ÑпиÑок подÑказок 1073 filteredCities.forEach(function (city) { 1074 suggestionsList.innerHTML += 1075 "<li class='map__filters-list-item'>" + 1076 city + 1077 "</li>"; 1078 }); 1079 const items = suggestionsList.querySelectorAll( 1080 ".map__filters-list-item" 1081 ); // ÐайÑи вÑе ÑлеменÑÑ ÑпиÑка 1082 1083 if (items.length > 7) { 1084 const totalItems = Math.min(items.length, 7); // ÐодÑÑиÑÑваем не более 7 ÑлеменÑов 1085 1086 let totalHeight = 0; 1087 for (let i = 0; i < totalItems; i++) { 1088 totalHeight += items[i].clientHeight; 1089 } 1090 1091 suggestionsList.style.height = totalHeight + "px"; // ÐÑименÑем ÑÑÐ¼Ð¼Ñ Ð²ÑÑÐ¾Ñ Ðº suggestionsList 1092 } 1093 } else { 1094 // СкÑÑваем ÑпиÑок подÑказок, еÑли Ð½ÐµÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÐ¸Ñ Ð³Ð¾Ñодов 1095 suggestionsList.classList.remove("map__filters-list--active"); 1096 } 1097 }); 1098 }); 1099 1100 // УÑÑанавливаем обÑабоÑÑик ÑобÑÑÐ¸Ñ ÐºÐ»Ð¸ÐºÐ° на ÑлеменÑÐ°Ñ ".map__filters-item-text-input-close" 1101 document.querySelectorAll(".map__filters-item").forEach((item) => { 1102 1103 item.addEventListener("click", function (event) { 1104 if ( 1105 event.target.classList.contains("map__filters-item-text-input-close") 1106 ) { 1107 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑÐµÐ»Ñ ÑлеменÑа ".map__filters-item-text-input-close" 1108 let parentWrapper = event.target.closest( 1109 ".map__filters-item-text-input-wrapper" 1110 ); 1111 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑÐµÐ»Ñ ÑлеменÑа ".map__filters-item-form" 1112 let form = event.target.closest(".map__filters-item-form"); 1113 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÐºÐ½Ð¾Ð¿ÐºÑ 1114 let btn = form.querySelector(".map__filters-item-btn"); 1115 // ÐÑклÑÑаем ÐºÐ½Ð¾Ð¿ÐºÑ "ÐайÑи" 1116 btn.disabled = true; 1117 1118 // ÐÑиÑаем инпÑÑ 1119 parentWrapper.querySelector(".map__filters-item-text-input").value = 1120 ""; 1121 1122 // УдалÑем пÑнкÑÑ ÑпиÑка 1123 parentWrapper.querySelector(".map__filters-list").innerHTML = ""; 1124 1125 // СкÑÑваем ÑпиÑок, Ñдалив акÑивнÑй клаÑÑ 1126 parentWrapper 1127 .querySelector(".map__filters-list") 1128 .classList.remove("map__filters-list--active"); 1129 1130 // УдалÑем клаÑÑ "map__filters-item-text-input-close--active" пÑи ÑбÑоÑе знаÑÐµÐ½Ð¸Ñ 1131 event.target.classList.remove( 1132 "map__filters-item-text-input-close--active" 1133 ); 1134 } 1135 }); 1136 }); 1137 1138 1139 1140 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ ÑилÑÑÑаÑии гоÑодов на оÑнове введенного ÑекÑÑа и каÑегоÑии 1141 function getFilteredCities2(input, category) { 1142 let cities; 1143 if(category == 'dealer') cities = $('#citiesdata').val().split(','); 1144 else if(category == 'service-partner-repair') cities = $('#scitiesdata').val().split(','); 1145 else if(category == 'service-partner-parts') cities = $('#scitiesdata').val().split(','); 1146 1147 return cities.filter(function (Ñity) { 1148 let destinationText = Ñity.toLowerCase(); 1149 let matched = true; 1150 1151 // ÐÑовеÑÑем каждÑй Ñимвол во введенном ÑекÑÑе на ÑооÑвеÑÑÑвие 1152 for (let i = 0; i < input.length; i++) { 1153 if (destinationText[i] !== input[i]) { 1154 matched = false;
1155 break; 1156 } 1157 } 1158 1159 // ÐозвÑаÑаем ÑолÑко ÑовпадаÑÑие гоÑода Ñ Ð²ÑбÑанной каÑегоÑией 1160 return matched; 1161 }); 1162 } 1163 1164 // УÑÑанавливаем обÑабоÑÑик ÑобÑÑÐ¸Ñ ÐºÐ»Ð¸ÐºÐ° на ÑлеменÑÐ°Ñ ÑпиÑка подÑказок 1165 document.querySelectorAll(".map__filters-item").forEach((item) => { 1166 item.addEventListener("click", function (event) { 1167 if (event.target.classList.contains("map__filters-list-item")) { 1168 // ÐолÑÑаем вÑбÑаннÑй гоÑод 1169 let selectedCity = event.target.textContent; 1170 1171 // ÐаполнÑем ÑекÑÑовое поле вÑбÑаннÑм гоÑодом 1172 event.target 1173 .closest(".map__filters-item") 1174 .querySelector(".map__filters-item-text-input").value = 1175 selectedCity; 1176 1177 // СкÑÑваем ÑпиÑок подÑказок и оÑиÑаем его 1178 event.target 1179 .closest(".map__filters-list") 1180 .classList.remove("map__filters-list--active"); 1181 event.target.closest(".map__filters-list").innerHTML = ""; 1182 } 1183 }); 1184 }); 1185 1186 // ÐооÑдинаÑÑ Ð¿Ð°ÑÑнеÑов 1187 let userCoords = ""; 1188 1189 /* 1190 * ÐÑовеÑÑем налиÑие ÑазÑеÑÐµÐ½Ð¸Ñ Ð½Ð° опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼ÐµÑÑоположениÑ. 1191 * ÐÑли ÑазÑеÑение еÑÑÑ, Ñо геолокаÑÐ¸Ñ Ð¾Ð¿ÑеделиÑÑ ÐºÐ¾Ð¾ÑдинаÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ ÐºÐ¾ÑÑекÑно 1192 * ÐÑли ÑазÑеÑÐµÐ½Ð¸Ñ Ð½ÐµÑ Ð¸Ð»Ð¸ полÑзоваÑÐµÐ»Ñ Ð¾Ñказал в доÑÑÑпе к геолокаÑии, Ñо вÑзÑваем каÑÑÑ Ð±ÐµÐ· наÑалÑнÑÑ ÐºÐ¾Ð¾ÑÐ´Ð¸Ð½Ð°Ñ 1193 */ 1194 if (navigator.geolocation) { 1195 navigator.permissions 1196 .query({ name: "geolocation" }) 1197 .then(function (permissionStatus) { 1198 if (permissionStatus.state === "granted") { 1199 navigator.geolocation.getCurrentPosition(function (position) { 1200 1201 let latitude = position.coords.latitude; 1202 let longitude = position.coords.longitude; 1203 userCoords = latitude.toString() + "," + longitude.toString(); 1204 initYandexMap(userCoords); 1205 }); 1206 } else if (permissionStatus.state === "denied") { 1207 console.log("ÐолÑзоваÑÐµÐ»Ñ Ð¾Ñказал в доÑÑÑпе к геолокаÑии."); 1208 userCoords = ""; 1209 initYandexMap(userCoords); 1210 } else { 1211 console.log( 1212 "СоÑÑоÑние доÑÑÑпа к геолокаÑии: " + permissionStatus.state 1213 ); 1214 userCoords = ""; 1215 initYandexMap(userCoords); 1216 } 1217 }); 1218 } else { 1219 console.log("Geolocation не поддеÑживаеÑÑÑ Ð²Ð°Ñим бÑаÑзеÑом."); 1220 } 1221 1222 // Ðогика иниÑиализаÑии каÑÑÑ 1223 function initYandexMap(userCoords) { 1224 ymaps.ready(function () { 1225 map = new ymaps.Map("map-small", { 1226 center: [55.76, 37.64], 1227 zoom: 5, 1228 }); 1229 1230 let geoObjects = []; 1231 1232 // Создание макеÑа балÑна 1233 MyBalloonLayout = ymaps.templateLayoutFactory.createClass( 1234 '<div class="map__canvas-balloon">' + 1235 '<div class="map__canvas-btn-close"></div>' + 1236 '<div class="map__canvas-balloon-container">' + 1237/* '<div class="map__canvas-title">ÐлижайÑий к Ðам ÑенÑÑ</div>' +*/ 1238 "<div>$[[options.contentLayout observeSize]]</div>" + 1239 '<div class="map__canvas-arrow"></div>' + 1240 "</div>" + 1241 "</div>", 1242 { 1243 /** 1244 * СÑÑÐ¾Ð¸Ñ ÑкземплÑÑ Ð¼Ð°ÐºÐµÑа на оÑнове Ñаблона и добавлÑÐµÑ ÐµÐ³Ð¾ в ÑодиÑелÑÑкий HTML-ÑлеменÑ. 1245 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/layout.templateBased.Base.xml#build 1246 * @function 1247 * @name build 1248 */ 1249 build: function () { 1250 this.constructor.superclass.build.call(this); 1251 1252 this._$element = $( 1253 ".map__canvas-balloon", 1254 this.getParentElement() 1255 ); 1256 1257 this.applyElementOffset(); 1258 1259 this._$element 1260 .find(".map__canvas-btn-close") 1261 .on("click", $.proxy(this.onCloseClick, this)); 1262 }, 1263 1264 /** 1265 * УдалÑÐµÑ ÑодеÑжимое макеÑа из DOM. 1266 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/layout.templateBased.Base.xml#clear 1267 * @function 1268 * @name clear 1269 */ 1270 clear: function () { 1271 this._$element.find(".map__canvas-btn-close").off("click"); 1272 1273 this.constructor.superclass.clear.call(this); 1274 }, 1275 1276 /** 1277 * ÐеÑод бÑÐ´ÐµÑ Ð²Ñзван ÑиÑÑемой Ñаблонов ÐÐРпÑи изменении ÑазмеÑов вложенного макеÑа. 1278 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose 1279 * @function 1280 * @name onSublayoutSizeChange 1281 */ 1282 onSublayoutSizeChange: function () { 1283 MyBalloonLayout.superclass.onSublayoutSizeChange.apply( 1284 this, 1285 arguments 1286 ); 1287 1288 if (!this._isElement(this._$element)) { 1289 return; 1290 } 1291 1292 this.applyElementOffset(); 1293 1294 this.events.fire("shapechange"); 1295 }, 1296 1297 /** 1298 * Сдвигаем балÑн, ÑÑÐ¾Ð±Ñ "Ñ Ð²Ð¾ÑÑик" Ñказ
1298Ñвал на ÑоÑÐºÑ Ð¿ÑивÑзки. 1299 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose 1300 * @function 1301 * @name applyElementOffset 1302 */ 1303 applyElementOffset: function () { 1304 this._$element.css({ 1305 left: -(this._$element[0].offsetWidth / 2), 1306 top: -( 1307 this._$element[0].offsetHeight + 1308 this._$element.find(".map__canvas-arrow")[0].offsetHeight 1309 ), 1310 }); 1311 }, 1312 1313 /** 1314 * ÐакÑÑÐ²Ð°ÐµÑ Ð±Ð°Ð»Ñн пÑи клике на кÑеÑÑик, ÐºÐ¸Ð´Ð°Ñ ÑобÑÑие "userclose" на макеÑе. 1315 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose 1316 * @function 1317 * @name onCloseClick 1318 */ 1319 onCloseClick: function (e) { 1320 e.preventDefault(); 1321 1322 this.events.fire("userclose"); 1323 }, 1324 1325 /** 1326 * ÐÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð°Ð²ÑопозиÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ (balloonAutoPan). 1327 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/ILayout.xml#getClientBounds 1328 * @function 1329 * @name getClientBounds 1330 * @returns {Number[][]} ÐооÑдинаÑÑ Ð»ÐµÐ²Ð¾Ð³Ð¾ веÑÑ Ð½ÐµÐ³Ð¾ и пÑавого нижнего Ñглов Ñаблона оÑноÑиÑелÑно ÑоÑки пÑивÑзки. 1331 */ 1332 getShape: function () { 1333 if (!this._isElement(this._$element)) { 1334 return MyBalloonLayout.superclass.getShape.call(this); 1335 } 1336 1337 var position = this._$element.position(); 1338 1339 return new ymaps.shape.Rectangle( 1340 new ymaps.geometry.pixel.Rectangle([ 1341 [position.left, position.top], 1342 [ 1343 position.left + this._$element[0].offsetWidth, 1344 position.top + 1345 this._$element[0].offsetHeight + 1346 this._$element.find(".arrow")[0].offsetHeight, 1347 ], 1348 ]) 1349 ); 1350 }, 1351 1352 /** 1353 * ÐÑовеÑÑем налиÑие ÑлеменÑа (в ÐРи ÐпеÑе его еÑе Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ бÑÑÑ). 1354 * @function 1355 * @private 1356 * @name _isElement 1357 * @param {jQuery} [element] ÐлеменÑ. 1358 * @returns {Boolean} Флаг налиÑиÑ. 1359 */ 1360 _isElement: function (element) { 1361 return element && element[0] && element.find(".arrow")[0]; 1362 }, 1363 } 1364 ); 1365 1366 // РазбиÑаем маÑÑив, Ñоздаем балÑÐ½Ñ Ð¸ ÑоÑмиÑÑем ÑодеÑжимое балÑна 1367 // Ð´Ð»Ñ ÑеÑвиÑнÑÑ ÑенÑÑов и диллеÑов<k 1368 destinations.forEach(function (place) { 1369 // Создание вложенного макеÑа ÑодеÑжимого балÑна. 1370 let statusname = ''; 1371 if(place.categoryFlag == 'service-partner-repair') {statusname = 'СеÑвиÑнÑй ÑенÑÑ';} 1372 if(place.categoryFlag == 'dealer') {statusname = 'ÐилеÑ';} 1373 if(place.categoryFlag == 'distributor') {statusname = 'ÐиÑÑÑибÑÑÑоÑ';} 1374 MyBalloonContentLayout = ymaps.templateLayoutFactory.createClass( 1375 '<div class="map__canvas-title">'+place.name+'<span>'+statusname+'</span></div>' + 1376 /*'<div class="map__canvas-title">'+place.categoryFlag+'</div>' +*/ 1377 1378 '<div class="map__canvas-text">' +place.address +'<span class="telephone">'+place.phone+ 1379 "</span></div>" 1380 /*'<div class="map__canvas-btn-route-wrapper"><button class="map__canvas-btn-route" onclick="window.open(\'https://www.yandex.ru/maps/?rtext=' + 1381 userCoords + 1382 "~" + 1383 place.coords + 1384 "')\">ÐÑоложиÑÑ Ð¼Ð°ÑÑÑÑÑ</button></div>"*/ 1385 ); 1386 let icon = "/local/templates/xcmg2024/img/map/icon-marker-new.png"; 1387 if(place.categoryFlag == 'service-partner-repair' || place.categoryFlag == 'service-partner-parts') icon = "/local/templates/xcmg2024/img/map/icon-marker-new.png"; 1388 else icon = "/local/templates/xcmg2024/img/map/icon-marker-new.png"; 1389 let placemark = new ymaps.Placemark(JSON.parse(place.coords), map.getCenter(), { 1390 hintContent: place.address, 1391 balloonShadow: false, 1392 balloonLayout: MyBalloonLayout, 1393 balloonContentLayout: MyBalloonContentLayout, 1394 iconLayout: "default#image", 1395 // Ð¡Ð²Ð¾Ñ Ð¸Ð·Ð¾Ð±Ñажение иконки меÑки 1396 iconImageHref: icon,
1397 // РазмеÑÑ Ð¼ÐµÑки 1398 iconImageSize: [41.92, 54], 1399 // СмеÑение левого веÑÑ Ð½ÐµÐ³Ð¾ Ñгла иконки оÑноÑиÑелÑно 1400 // ÐµÑ "ножки" (ÑоÑки пÑивÑзки) 1401 iconImageOffset: [-21, -54], 1402 }); 1403 1404 //geoObjects.push(placemark); 1405 map.geoObjects.add(placemark); 1406 1407 }); 1408 //map.geoObjects.add(geoObjects); 1409 /*let icon = "/local/templates/xcmg2024/img/map/icon-marker.webp"; 1410 let clusterer = new ymaps.Clusterer({ 1411 clusterDisableClickZoom: true, 1412 clusterOpenBalloonOnClick: true, 1413 clusterBalloonContentLayout: null, 1414 iconLayout: "default#image", 1415 // Ð¡Ð²Ð¾Ñ Ð¸Ð·Ð¾Ð±Ñажение иконки меÑки 1416 iconImageHref: icon, 1417 // РазмеÑÑ Ð¼ÐµÑки 1418 iconImageSize: [41.92, 54], 1419 // СмеÑение левого веÑÑ Ð½ÐµÐ³Ð¾ Ñгла иконки оÑноÑиÑелÑно 1420 // ÐµÑ "ножки" (ÑоÑки пÑивÑзки) 1421 iconImageOffset: [-21, -54], 1422 }); 1423 1424 clusterer.add(geoObjects); 1425 map.geoObjects.add(clusterer);*/ 1426 1427 }); 1428 } 1429 1430 // Ðлик на ÐºÐ½Ð¾Ð¿ÐºÑ "ÐайÑи" СеÑвиÑнÑе ÑенÑÑÑ (вÑоÑой и ÑÑеÑий баннеÑ) 1431 document 1432 .querySelector(".map__filters") 1433 .addEventListener("click", function (event) { 1434 1435 event.preventDefault(); 1436 if (event.target.classList.contains("map__filters-item-btn")) { 1437 1438 let button = event.target; 1439 1440 let selectedCity = button.parentNode.querySelector( 1441 ".map__filters-item-text-input" 1442 ).value; 1443 1444 let category = button.parentNode.getAttribute("data-category"); 1445 1446 let filteredOrganizations = destinations.filter(function (destination) { 1447 1448 return ( 1449 destination.city === selectedCity && 1450 (destination.categoryFlag === category ) 1451 ); 1452 1453 }); 1454 1455 1456 1457 let organizationsData = filteredOrganizations.map(function ( 1458 destination 1459 ) { 1460 1461 return { 1462 name: destination.name, 1463 category: destination.categoryFlag, 1464 address: destination.address, 1465 phone: destination.phone, 1466 coords: JSON.parse(destination.coords), 1467 }; 1468 }); 1469 // initYandexMap(organizationsData.coords); 1470 1471 1472 // ÐÑобÑажаем вÑбÑаннÑе оÑганизаÑии на ЯндекÑ.ÐаÑÑÐ°Ñ 1473 // Ðогика иниÑиализаÑии каÑÑÑ Ð¾ÑÑаеÑÑÑ Ñой же 1474 ymaps.ready(function () { 1475 1476 map.destroy(); 1477 let mapCenter; 1478 let category; 1479 1480 organizationsData.forEach(function (place) { 1481 console.log(place) 1482 mapCenter = place.coords; 1483 category = place.category; 1484 }); 1485 let icon = "/local/templates/xcmg2024/img/map/icon-marker-new.png"; 1486 if(category == 'service-partner-repair' || category == 'service-partner-parts') 1487 icon = "/local/templates/xcmg2024/img/map/icon-marker-new.png"; 1488 else icon = "/local/templates/xcmg2024/img/map/icon-marker-new.png"; 1489 1490 map = new ymaps.Map("map-small", { 1491 center: mapCenter, 1492 zoom: 4, 1493 }); 1494 1495 1496 1497 let geoObjects = []; 1498 1499 // Создание макеÑа балÑна 1500 MyBalloonLayout = ymaps.templateLayoutFactory.createClass( 1501 '<div class="map__canvas-balloon">' + 1502 '<div class="map__canvas-btn-close"></div>' + 1503 '<div class="map__canvas-balloon-container">' + 1504 /*'<div class="map__canvas-title">ÐлижайÑий к Ðам адÑеÑ</div>' +*/ 1505 "$[[options.contentLayout observeSize]]" + 1506 '<div class="map__canvas-arrow"></div>' + 1507 "</div>" + 1508 "</div>", 1509 { 1510 /** 1511 * СÑÑÐ¾Ð¸Ñ ÑкземплÑÑ Ð¼Ð°ÐºÐµÑа на оÑнове Ñаблона и добавлÑÐµÑ ÐµÐ³Ð¾ в ÑодиÑелÑÑкий HTML-ÑлеменÑ. 1512 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/layout.templateBased.Base.xml#build 1513 * @function 1514 * @name build 1515 */ 1516 build: function () { 1517 this.constructor.superclass.build.call(this); 1518 1519 this._$element = $( 1520 ".map__canvas-balloon", 1521 this.getParentElement() 1522 ); 1523 1524 this.applyElementOffset(); 1525 1526 this._$element 1527 .find(".map__canvas-btn-close") 1528 .on("click", $.proxy(this.onCloseClick, this)); 1529 }, 1530 1531 /** 1532 * УдалÑÐµÑ ÑодеÑжимое макеÑа из DOM. 1533 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/layout.templateBased.Base.xml#clear 1534 * @function 1535 * @name clear 1536 */ 1537 clear: function () { 1538 this._$element.find(".map__canvas-btn-close").off("click"); 1539 1540 this.constructor.superclass.clear.call(this); 1541 }, 1542 1543 /** 1544 * ÐеÑод бÑÐ´ÐµÑ Ð²Ñзван ÑиÑÑемой Ñаблонов ÐÐРпÑи изменении ÑазмеÑов вложенного макеÑа. 1545 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose 1546 * @function 1547 * @name onSublayoutSizeChange 1548 */ 1549 onSublayoutSizeChange: function () { 1550 MyBalloonLayout.superclass.onSublayoutSizeChange.apply( 1551 this, 1552 arguments 1553 ); 1554 1555 if (!this._isElement(this._$element)) { 1556 return; 1557 } 1558 1559 this.applyElementOffset(); 1560 1561 this.events.fire("shapechange"); 1562 }, 1563 1564 /** 1565 * Сдвигаем балÑн, ÑÑÐ¾Ð±Ñ "Ñ Ð²Ð¾ÑÑик" Ñказ
1565Ñвал на ÑоÑÐºÑ Ð¿ÑивÑзки. 1566 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose 1567 * @function 1568 * @name applyElementOffset 1569 */ 1570 applyElementOffset: function () { 1571 this._$element.css({ 1572 left: -(this._$element[0].offsetWidth / 2), 1573 top: -( 1574 this._$element[0].offsetHeight + 1575 this._$element.find(".map__canvas-arrow")[0].offsetHeight 1576 ), 1577 }); 1578 }, 1579 1580 /** 1581 * ÐакÑÑÐ²Ð°ÐµÑ Ð±Ð°Ð»Ñн пÑи клике на кÑеÑÑик, ÐºÐ¸Ð´Ð°Ñ ÑобÑÑие "userclose" на макеÑе. 1582 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/IBalloonLayout.xml#event-userclose 1583 * @function 1584 * @name onCloseClick 1585 */ 1586 onCloseClick: function (e) { 1587 e.preventDefault(); 1588 1589 this.events.fire("userclose"); 1590 }, 1591 1592 /** 1593 * ÐÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð°Ð²ÑопозиÑиониÑÐ¾Ð²Ð°Ð½Ð¸Ñ (balloonAutoPan). 1594 * @see https://api.yandex.ru/maps/doc/jsapi/2.1/ref/reference/ILayout.xml#getClientBounds 1595 * @function 1596 * @name getClientBounds 1597 * @returns {Number[][]} ÐооÑдинаÑÑ Ð»ÐµÐ²Ð¾Ð³Ð¾ веÑÑ Ð½ÐµÐ³Ð¾ и пÑавого нижнего Ñглов Ñаблона оÑноÑиÑелÑно ÑоÑки пÑивÑзки. 1598 */ 1599 getShape: function () { 1600 if (!this._isElement(this._$element)) { 1601 return MyBalloonLayout.superclass.getShape.call(this); 1602 } 1603 1604 var position = this._$element.position(); 1605 1606 return new ymaps.shape.Rectangle( 1607 new ymaps.geometry.pixel.Rectangle([ 1608 [position.left, position.top], 1609 [ 1610 position.left + this._$element[0].offsetWidth, 1611 position.top + 1612 this._$element[0].offsetHeight + 1613 this._$element.find(".arrow")[0].offsetHeight, 1614 ], 1615 ]) 1616 ); 1617 }, 1618 1619 /** 1620 * ÐÑовеÑÑем налиÑие ÑлеменÑа (в ÐРи ÐпеÑе его еÑе Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ бÑÑÑ). 1621 * @function 1622 * @private 1623 * @name _isElement 1624 * @param {jQuery} [element] ÐлеменÑ. 1625 * @returns {Boolean} Флаг налиÑиÑ. 1626 */ 1627 _isElement: function (element) { 1628 return element && element[0] && element.find(".arrow")[0]; 1629 }, 1630 } 1631 ); 1632 1633 // РазбиÑаем маÑÑив, Ñоздаем балÑÐ½Ñ Ð¸ ÑоÑмиÑÑем ÑодеÑжимое балÑна 1634 organizationsData.forEach(function (place) { 1635 // Создание вложенного макеÑа ÑодеÑжимого балÑна. 1636 1637 let statusname = ''; 1638 if(place.category == 'service-partner-repair') {statusname = 'СеÑвиÑнÑй ÑенÑÑ';} 1639 if(place.category == 'dealer') {statusname = 'ÐилеÑ';} 1640 if(place.category == 'distributor') {statusname = 'ÐиÑÑÑибÑÑÑоÑ';} 1641 MyBalloonContentLayout = ymaps.templateLayoutFactory.createClass( 1642 '<div class="map__canvas-title">'+place.name+'<span>'+statusname+'</span></div>' + 1643 '<div class="map__canvas-text">' + 1644 place.address + 1645 '<span class="telephone">'+place.phone + '</span>' + 1646 "</div>" 1647 /*'<div class="map__canvas-btn-route-wrapper"><button class="map__canvas-btn-route" onclick="window.open(\'https://www.yandex.ru/maps/?rtext=' + 1648 userCoords + 1649 "~" + 1650 place.coords + 1651 "')\">ÐÑоложиÑÑ Ð¼Ð°ÑÑÑÑÑ</button></div>"*/ 1652 ); 1653 let icon = "/local/templates/xcmg2024/img/map/icon-marker-new.png"; 1654 if(category == 'service-partner-repair' || category == 'service-partner-parts') icon = "/local/templates/xcmg2024/img/map/icon-marker-new.png"; 1655 else icon = "/local/templates/xcmg2024/img/map/icon-marker-new.png"; 1656 1657 let placemark = new ymaps.Placemark( 1658 place.coords, 1659 map.getCenter(), 1660 { 1661 hintContent: place.address, 1662 balloonShadow: false, 1663 balloonLayout: MyBalloonLayout, 1664 balloonContentLayout: MyBalloonContentLayout, 1665 iconLayout: "default#image", 1666 // Ð¡Ð²Ð¾Ñ Ð¸Ð·Ð¾Ð±Ñажение иконки меÑки 1667 iconImageHref: icon,
1668 // РазмеÑÑ Ð¼ÐµÑки 1669 iconImageSize: [41.92, 54], 1670 // СмеÑение левого веÑÑ Ð½ÐµÐ³Ð¾ Ñгла иконки оÑноÑиÑелÑно 1671 // ÐµÑ "ножки" (ÑоÑки пÑивÑзки) 1672 iconImageOffset: [-21, -54], 1673 } 1674 ); 1675 1676 //geoObjects.push(placemark); 1677 //alert(geoObjects) 1678 map.geoObjects.add(placemark); 1679 }); 1680 /*let icon = "/local/templates/xcmg2024/img/map/icon-marker.webp"; 1681 let clusterer = new ymaps.Clusterer({ 1682 clusterDisableClickZoom: true, 1683 clusterOpenBalloonOnClick: true, 1684 clusterBalloonContentLayout: null, 1685 iconLayout: "default#image", 1686 // Ð¡Ð²Ð¾Ñ Ð¸Ð·Ð¾Ð±Ñажение иконки меÑки 1687 iconImageHref: icon, 1688 // РазмеÑÑ Ð¼ÐµÑки 1689 iconImageSize: [41.92, 54], 1690 // СмеÑение левого веÑÑ Ð½ÐµÐ³Ð¾ Ñгла иконки оÑноÑиÑелÑно 1691 // ÐµÑ "ножки" (ÑоÑки пÑивÑзки) 1692 iconImageOffset: [-21, -54], 1693 }); 1694 1695 clusterer.add(geoObjects);*/ 1696// map.geoObjects.add(clusterer); 1697 1698 1699 }); 1700 } 1701 }); 1702 1703 // ---------------------------------------------------------------- 1704 const regionsToCities = arrRegionsCities; 1705 console.log(arrRegionsCities); 1706 /*{ 1707 moscow: ["ÐоÑква", "Ðлабино"], 1708 krasnoyarsk: ["ÐÑÑемовÑк", "ÐÐ°Ð»Ð°Ñ Ñа", "Ðежма"], 1709 bashkortostan: ["Ðглино", "СÑаÑобалÑаÑево", "СÑаÑÑй ÐÑкол", "ЧеÑнÑнка"], 1710 };*/ 1711 1712 const regionsSelect = document.querySelector( 1713 ".map__search-form-select--region" 1714 ); 1715 const citiesSelect = document.querySelector( 1716 ".map__search-form-select--city" 1717 ); 1718 const findBtn = document.querySelector(".map__search-form-btn"); 1719 1720 regionsSelect.addEventListener("change", function () { 1721 const selectedRegion = this.value; 1722 citiesSelect.innerHTML = 1723 '<option value="" disabled selected>ÐÑбеÑиÑе гоÑод</option>'; 1724 1725 if (selectedRegion) { 1726 regionsToCities[selectedRegion].forEach((city) => { 1727 const option = document.createElement("option"); 1728 option.text = city; 1729 citiesSelect.add(option); 1730 }); 1731 citiesSelect.disabled = false; 1732 } else { 1733 citiesSelect.disabled = true; 1734 findBtn.disabled = true; 1735 } 1736 }); 1737 1738 citiesSelect.addEventListener("change", function () { 1739 findBtn.disabled = !this.value; 1740 }); 1741 1742 findBtn.addEventListener("click", function () { 1743 const selectedCity = citiesSelect.value; 1744 1745 if (selectedCity) { 1746 const urlParams = new URLSearchParams(); 1747 urlParams.append("region", regionsSelect.value); 1748 urlParams.append("city", selectedCity); 1749 1750 const queryString = urlParams.toString(); 1751 1752 //location.href = "/dilerskaya-set/?" + queryString; 1753 form = findBtn.closest('.map__search-form') 1754 //let searchUrl = "/garantiya-i-servis/set-servisnyix-czentrov/?" + queryString; 1755 let searchUrl = "/dilerskaya-set/?" + queryString; 1756 window.location.href=searchUrl; 1757 } 1758 }); 1759 // ---------------------------------------------------------------- 1760 } 1761} 1762 1763function newsInit() { 1764 const news = document.querySelector(".news"); 1765 1766 if (news) { 1767 let gallery = document.querySelector(".news__list"); 1768 1769 /* 1770 * Cоздаем новÑй ÑкземплÑÑ Masonry Ð´Ð»Ñ Ð¾ÑганизаÑии плиÑоÑного макеÑа 1771 * https://masonry.desandro.com 1772 */ 1773 // ÐниÑиализаÑÐ¸Ñ Masonry 1774 let msnry = new Masonry(gallery, { 1775 itemSelector: ".news__list-item", 1776 columnWidth: ".news__list-item", 1777 gutter: 28, 1778 horizontalOrder: true, 1779 fitWidth: true, 1780 }); 1781 1782 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÑовеÑки ÑиÑÐ¸Ð½Ñ Ð¾ÐºÐ½Ð° бÑаÑзеÑа и повоÑоÑа ÑÑÑÑойÑÑва, и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°ÑÑÑоек Masonry 1783 function checkViewportWidth() { 1784 if (window.innerWidth <= 768) { 1785 msnry.destroy(); // УниÑÑожаем ÑекÑÑий Masonry 1786 1787 msnry = new Masonry(gallery, { 1788 itemSelector: ".news__list-item", 1789 columnWidth: ".news__list-item", 1790 gutter: 6, 1791 horizontalOrder: true, 1792 fitWidth: true, 1793 percentPosition: true, // ÐобавлÑем новÑÑ Ð¾Ð¿ÑÐ¸Ñ 1794 }); 1795 } else { 1796 msnry.destroy(); // УниÑÑожаем ÑекÑÑий Masonry 1797 1798 msnry = new Masonry(gallery, { 1799 itemSelector: ".news__list-item", 1800 columnWidth: ".news__list-item", 1801 gutter: 28, 1802 horizontalOrder: true, 1803 fitWidth: true, 1804 }); 1805 } 1806 } 1807 1808 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¸Ð½Ð¸ÑиализаÑии Masonry и пÑовеÑки ÑиÑÐ¸Ð½Ñ Ð¾ÐºÐ½Ð° пÑи загÑÑзке ÑÑÑаниÑÑ 1809 function initMasonryAndCheckWidth() { 1810 checkViewportWidth(); // ÐÑовеÑÑем ÑиÑÐ¸Ð½Ñ Ð¾ÐºÐ½Ð° пÑи загÑÑзке ÑÑÑаниÑÑ 1811 1812 // ÐÑÑлеживание Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑазмеÑа окна бÑаÑзеÑа 1813 window.addEventListener("resize", checkViewportWidth); 1814 1815 // ÐÑÑлеживание повоÑоÑа ÑÑÑÑойÑÑва 1816 window.addEventListener("orientationchange", checkViewportWidth); 1817 } 1818 1819 // ÐÑзÑваем ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¸Ð½Ð¸ÑиализаÑии Masonry и пÑовеÑки ÑиÑÐ¸Ð½Ñ Ð¾ÐºÐ½Ð° пÑи загÑÑзке 1820 initMasonryAndCheckWidth(); 1821 } 1822} 1823
1824function historyInit() { 1825 const history = document.querySelector(".history"); 1826 1827 if (history) { 1828 // ÐолÑÑаем вÑе ÑлеменÑÑ Ñабов и Ð¸Ñ ÐºÐ¾Ð½ÑенÑа 1829 const tabs = document.querySelectorAll(".history__tabs-nav-item"); 1830 const tabContents = document.querySelectorAll( 1831 ".history__tabs-content-item" 1832 ); 1833 1834 // ÐобавлÑем обÑабоÑÑик клика Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа Ñаба 1835 tabs.forEach((tab) => { 1836 tab.addEventListener("click", () => { 1837 const tabIndex = tab.dataset.tab; // ÐолÑÑаем Ð¸Ð½Ð´ÐµÐºÑ Ñаба 1838 1839 // УбиÑаем акÑивнÑй клаÑÑ Ñ Ð²ÑÐµÑ Ñабов 1840 tabs.forEach((tab) => { 1841 tab.classList.remove("history__tabs-nav-item--active"); 1842 }); 1843 1844 // ÐобавлÑем акÑивнÑй клаÑÑ Ðº ÑекÑÑÐµÐ¼Ñ ÑÐ°Ð±Ñ 1845 tab.classList.add("history__tabs-nav-item--active"); 1846 1847 // ÐеÑеклÑÑаем акÑивное ÑодеÑжимое 1848 tabContents.forEach((content) => { 1849 if (content.dataset.tab === tabIndex) { 1850 content.classList.add("history__tabs-content-item--active"); 1851 } else { 1852 content.classList.remove("history__tabs-content-item--active"); 1853 } 1854 }); 1855 }); 1856 }); 1857 } 1858} 1859 1860$(".nav__item--second-lvl>.nav__link").click(function () { 1861 console.log(true) 1862 $(this).parent(".nav__item--second-lvl").toggleClass("_open") 1863 $(this).siblings(".nav__submenu").slideToggle() 1864}) 1865 1866function navInit() { 1867 return 1868 const nav = document.querySelector(".nav"); 1869 1870 if (nav) { 1871 const navItems = document.querySelectorAll(".nav__item--second-lvl"); 1872 let openedSubMenu = null; // СÑÑлка на ÑекÑÑее оÑкÑÑÑое Ð¿Ð¾Ð´Ð¼ÐµÐ½Ñ 1873 1874 function hideSubMenu(submenu) { 1875 if (submenu) { 1876 submenu.style.height = "0"; 1877 // УдалÑем клаÑÑ Ñ ÑекÑÑего оÑкÑÑÑого ÑлеменÑа .nav__item--second-lvl 1878 if (openedSubMenu) { 1879 openedSubMenu.parentElement.classList.remove("nav__item--active"); 1880 } 1881 openedSubMenu = null; // СбÑаÑÑваем ÑÑÑÐ»ÐºÑ Ð½Ð° оÑкÑÑÑое Ð¼ÐµÐ½Ñ 1882 } 1883 } 1884 1885 function showSubMenu(submenu) { 1886 // submenu.style.height = submenu.scrollHeight + "px"; 1887 submenu.style.height = "auto"; 1888 // УдалÑем клаÑÑ Ñ ÑекÑÑего оÑкÑÑÑого ÑлеменÑа .nav__item--second-lvl 1889 if (openedSubMenu) { 1890 openedSubMenu.parentElement.classList.remove("nav__item--active"); 1891 } 1892 openedSubMenu = submenu; // Ð¡Ð¾Ñ ÑанÑем ÑÑÑÐ»ÐºÑ Ð½Ð° новое оÑкÑÑÑое Ð¼ÐµÐ½Ñ 1893 submenu.parentElement.classList.add("nav__item--active"); 1894 } 1895 1896 navItems.forEach((navItem) => { 1897 1898 navItem.querySelector(".nav__item--second-lvl>.nav__link").addEventListener("click", (event) => { 1899 event.stopPropagation(); 1900 1901 const submenu = navItem.querySelector(".nav__submenu"); 1902 1903 if (!submenu) return; 1904 1905 if (submenu !== openedSubMenu) { 1906 // ÐÑли кликнÑÑое Ð¼ÐµÐ½Ñ Ð¾ÑлиÑаеÑÑÑ Ð¾Ñ Ð¾ÑкÑÑÑого, закÑÑваем оÑкÑÑÑое и оÑкÑÑваем новое 1907 //hideSubMenu(openedSubMenu); 1908 //showSubMenu(submenu); 1909 } else { 1910 // ÐÑли кликнÑÑое Ð¼ÐµÐ½Ñ ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¾ÑкÑÑÑÑм, пÑоÑÑо закÑÑваем его 1911 //hideSubMenu(openedSubMenu); 1912 } 1913 }); 1914 }); 1915 1916 document.addEventListener("click", (event) => { 1917 // ÐакÑÑваем оÑкÑÑÑое Ð¼ÐµÐ½Ñ Ð¿Ñи клике за его пÑеделами 1918 if (openedSubMenu && !nav.contains(event.target)) { 1919 hideSubMenu(openedSubMenu); 1920 } 1921 }); 1922 } 1923} 1924 1925function productInit() { 1926 const product = document.querySelector(".product"); 1927 1928 if (product) { 1929 /* 1930 * ÐниÑиализиÑÑем каÑÑÑелÑ, иÑполÑзÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ Slick Carousel 1931 * https://kenwheeler.github.io/slick/ 1932 */ 1933 $(".product__slider").slick({ 1934 slidesToShow: 1, 1935 slidesToScroll: 1,
1936 arrows: false, 1937 fade: true, 1938 asNavFor: ".product__nav", 1939 autoplay: false, 1940 speed: 800, 1941 responsive: [ 1942 { 1943 breakpoint: 1024, 1944 settings: { 1945 slidesToShow: 1, 1946 slidesToScroll: 1, 1947 arrows: false, 1948 dots: true, 1949 fade: false, 1950 autoplay: false, 1951 speed: 800, 1952 }, 1953 }, 1954 // You can unslick at a given breakpoint now by adding: 1955 // settings: "unslick" 1956 // instead of a settings object 1957 ], 1958 }); 1959 /* 1960 * ÐниÑиализиÑÑем каÑÑÑелÑ, иÑполÑзÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ Slick Carousel Ð´Ð»Ñ Ð½Ð°Ð²Ð¸Ð³Ð°Ñии по оÑÐ½Ð¾Ð²Ð½Ð¾Ð¼Ñ ÑлайдеÑÑ 1961 * https://kenwheeler.github.io/slick/ 1962 */ 1963 $(".product__nav").slick({ 1964 slidesToShow: 4, 1965 slidesToScroll: 1, 1966 asNavFor: ".product__slider", 1967 dots: false, 1968 arrows: false, 1969 vertical: false, 1970 centerMode: false, 1971 focusOnSelect: true, 1972 speed: 800, 1973 responsive: [ 1974 { 1975 breakpoint: 1024, 1976 settings: "unslick", 1977 }, 1978 // You can unslick at a given breakpoint now by adding: 1979 // settings: "unslick" 1980 // instead of a settings object 1981 ], 1982 }); 1983 /* 1984 * ÐниÑиализиÑÑем галеÑÐµÑ Ð¸Ð·Ð¾Ð±Ñажений Ð´Ð»Ñ ÐºÐ°ÑÑÑели, иÑполÑзÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ LightGallery. 1985 * ÐдеÑÑ Ð¼Ñ Ð½Ð°ÑÑÑаиваем опÑии галеÑеи, Ñакие как оÑклÑÑение кнопки ÑкаÑиваниÑ, 1986 * наÑÑÑойка ÑÑвÑÑвиÑелÑноÑÑи Ñвайпа, ÑелекÑÐ¾Ñ Ð¸Ð·Ð¾Ð±Ñажений и дÑÑгие паÑамеÑÑÑ. 1987 * https://www.lightgalleryjs.com 1988 */ 1989 let gallery = document.querySelector(".product__slider"); 1990 lightGallery(gallery, { 1991 download: false, // оÑклÑÑение кнопки ÑкаÑÐ¸Ð²Ð°Ð½Ð¸Ñ 1992 swipeThreshold: 50, // наÑÑÑойка ÑÑвÑÑвиÑелÑноÑÑи Ñвайпа, 1993 selector: ".product__slider-item", 1994 counter: false, 1995 }); 1996 1997 // ÐолÑÑаем вÑе ÑлеменÑÑ Ñабов и Ð¸Ñ ÐºÐ¾Ð½ÑенÑа 1998 const tabs = document.querySelectorAll(".product__tabs-nav-item"); 1999 const tabContents = document.querySelectorAll( 2000 ".product__tabs-content-item" 2001 ); 2002 2003 // ÐобавлÑем обÑабоÑÑик клика Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа Ñаба
2004 tabs.forEach((tab) => { 2005 tab.addEventListener("click", () => { 2006 const tabIndex = tab.dataset.tab; // ÐолÑÑаем Ð¸Ð½Ð´ÐµÐºÑ Ñаба 2007 2008 // УбиÑаем акÑивнÑй клаÑÑ Ñ Ð²ÑÐµÑ Ñабов 2009 tabs.forEach((tab) => { 2010 tab.classList.remove("product__tabs-nav-item--active"); 2011 }); 2012 2013 // ÐобавлÑем акÑивнÑй клаÑÑ Ðº ÑекÑÑÐµÐ¼Ñ ÑÐ°Ð±Ñ 2014 tab.classList.add("product__tabs-nav-item--active"); 2015 2016 // ÐеÑеклÑÑаем акÑивное ÑодеÑжимое 2017 tabContents.forEach((content) => { 2018 if (content.dataset.tab === tabIndex) { 2019 content.classList.add("product__tabs-content-item--active"); 2020 } else { 2021 content.classList.remove("product__tabs-content-item--active"); 2022 } 2023 }); 2024 2025 // УÑÑанавливаем ÑаймеÑ, ÑÑÐ¾Ð±Ñ Ñ Ð·Ð°Ð´ÐµÑжкой пÑимениÑÑ Ð²ÑÑоÑÑ ÑаблиÑÑ 2026 setTimeout(() => { 2027 calcTableHeight(); 2028 accordionInit(); 2029 }, 200); 2030 }); 2031 }); 2032 2033 function calcTableHeight() { 2034 /* 2035 * ÐÑбиÑаем акÑивнÑÑ Ð²ÐºÐ»Ð°Ð´ÐºÑ. 2036 * ФÑнкÑÐ¸Ñ Ð¸ÑÐµÑ Ð°ÐºÑивнÑÑ Ð²ÐºÐ»Ð°Ð´ÐºÑ Ñ ÐºÐ»Ð°ÑÑом .product__tabs-content-item--active. 2037 */ 2038 let activeTab = document.querySelector( 2039 ".product__tabs-content-item--active" 2040 ); 2041 2042 /* 2043 * ÐÑÑиÑлÑем вÑÑоÑÑ ÑаблиÑÑ. 2044 ÐÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿Ð¾Ð´ÑÑÐµÑ Ð¾Ð±Ñей вÑÑоÑÑ ÑаблиÑÑ, ÑÑммиÑÑÑ Ð²ÑÑоÑÑ ÑÑÑок (.product__tr) до ÑеÑÑÑÐµÑ ÑÑÑок или до конÑа ÑаблиÑÑ. 2045 */ 2046 let totalHeight = 0; 2047 const rows = activeTab.querySelectorAll(".product__tr"); 2048 for (let i = 0; i < 4 && i < rows.length; i++) { 2049 totalHeight += rows[i].offsetHeight; 2050 } 2051 2052 /* 2053 * ÐбновлÑем ÑекÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸ "ÐоказаÑÑ Ð±Ð¾Ð»ÑÑе". 2054 * ÐÑли на акÑивной вкладке еÑÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ° Ñ ÐºÐ»Ð°ÑÑом .product__link--show-more, 2055 * ей пÑиÑваиваеÑÑÑ ÑекÑÑ "ÐоказаÑÑ Ð±Ð¾Ð»ÑÑе". 2056 */ 2057 if (activeTab && activeTab.querySelector(".product__link--show-more")) { 2058 activeTab.querySelector(".product__link--show-more").textContent = 2059 "ÐоказаÑÑ Ð±Ð¾Ð»ÑÑе"; 2060 } 2061 2062 // ÐÑбиÑаем обеÑÑÐºÑ ÑаблиÑÑ Ð¾ÑноÑиÑелÑно акÑивного Ñаба 2063 let tableWrapper = activeTab.querySelector(".product__table-wrapper"); 2064 // console.log("tableWrapper: " + tableWrapper); 2065 2066 if (tableWrapper) { 2067 /* 2068 * УÑÑанавливаем вÑÑоÑÑ Ð¾Ð±ÐµÑÑки ÑаблиÑÑ. 2069 * УÑÑанавливаеÑÑÑ Ð²ÑÑоÑа обеÑÑки ÑаблиÑÑ ÑÐ°Ð²Ð½Ð°Ñ Ð¿Ð¾Ð´ÑÑиÑанной обÑей вÑÑоÑе. 2070 */ 2071 tableWrapper.style.height = totalHeight + "px"; 2072 2073 let btnMore = tableWrapper 2074 .closest(".product__tabs-content-item--active") 2075 .querySelector(".product__link--show-more"); 2076 2077 /* 2078 * ÐобавлÑем ÑлÑÑаÑÐµÐ»Ñ ÑобÑÑий на ÐºÐ½Ð¾Ð¿ÐºÑ "ÐоказаÑÑ Ð±Ð¾Ð»ÑÑе". 2079 * ÐÑи клике на кнопкÑ, пÑовеÑÑеÑÑÑ ÑекÑÑий ÑекÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸. 2080 * ÐÑли он Ñавен "СкÑÑÑÑ", ÑекÑÑ Ð¼ÐµÐ½ÑеÑÑÑ Ð½Ð° "ÐоказаÑÑ Ð±Ð¾Ð»ÑÑе" 2081 * и ÑÑÑанавливаеÑÑÑ ÑикÑиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ Ð²ÑÑоÑа ÑаблиÑÑ, инаÑе ÑÑÑанавливаеÑÑÑ Ð°Ð²ÑомаÑиÑеÑÐºÐ°Ñ Ð²ÑÑоÑа 2082 * и ÑекÑÑ Ð¼ÐµÐ½ÑеÑÑÑ Ð½Ð° "СкÑÑÑÑ". 2083 */ 2084 2085 let showContentFlag = false; 2086 2087 // console.log(btnMore); 2088 2089 btnMore.addEventListener("click", (event) => { 2090 // showContentFlag = true; 2091 console.log(event.target); 2092 2093 if (event.target.textContent === "СкÑÑÑÑ") { 2094 event.target.textContent = "ÐоказаÑÑ Ð±Ð¾Ð»ÑÑе"; 2095 tableWrapper.style.height = totalHeight + "px"; 2096 } else { 2097 tableWrapper.style.height = "auto"; 2098 event.target.textContent = "СкÑÑÑÑ"; 2099 } 2100 }); 2101 } 2102 } 2103 2104 // УÑÑанавливаем ÑаймеÑ, ÑÑÐ¾Ð±Ñ Ñ Ð·Ð°Ð´ÐµÑжкой пÑимениÑÑ Ð²ÑÑоÑÑ ÑаблиÑÑ 2105 setTimeout(() => { 2106 // calcTableHeight(); 2107 accordionMobileInit(); 2108 }, 100); 2109 2110 $('.product__accordion-link--open-all').click(function() { 2111 if($(this).hasClass('opened')) { 2112 $(this).removeClass('opened'); 2113 } else { 2114 $(this).addClass('opened'); 2115 } 2116 }); 2117 2118 // ÐккоÑдеон внÑÑÑи ÑоваÑного блока 2119 function accordionInit() { 2120 // ÐÑем конÑÐµÐ¹Ð½ÐµÑ Ð°ÐºÐºÐ¾Ñдеона Ñ ÐºÐ»Ð°ÑÑом "product__accordion" 2121 let accordion = document.querySelector(".product__accordion"); 2122 2123 if (accordion) { 2124 // ÐобавлÑем обÑабоÑÑик ÑобÑÑÐ¸Ñ click на конÑÐµÐ¹Ð½ÐµÑ Ð°ÐºÐºÐ¾Ñдеона 2125 accordion.addEventListener("click", function (event) { 2126 const targetItem = event.target.closest(".product__accordion-item"); 2127 if (targetItem) { 2128 if ( 2129 !targetItem.classList.contains("product__accordion-item--active") 2130 ) { 2131 targetItem.classList.add("product__accordion-item--active"); 2132 } 2133 } 2134 2135 // ÐбÑабоÑÑик клика на пÑÐ½ÐºÑ Ð°ÐºÐºÐ¾Ñдеона или на Ð¸ÐºÐ¾Ð½ÐºÑ "минÑÑ" 2136 const targetIcon = event.target.closest( 2137 ".product__accordion-icon.product__accordion-icon--minus" 2138 ); 2139 // ÐÑли клик на Ð¸ÐºÐ¾Ð½ÐºÑ "минÑÑ", ÑдалÑем клаÑÑ Ð°ÐºÑивноÑÑи Ñ ÑодиÑелÑÑкого ÑлеменÑа. 2140 if (targetIcon) { 2141 const parentItem = targetIcon.closest(".product__accordion-item"); 2142 if (parentItem) { 2143 parentItem.classList.remove("product__accordion-item--active"); 2144 } 2145 } 2146 2147 /* 2148 * ÐбÑабоÑÑик клика на ÐºÐ½Ð¾Ð¿ÐºÑ "ÐÑкÑÑÑÑ Ð²Ñе/ÐакÑÑÑÑ Ð²Ñе" 2149 * ÐÑли нажаÑа кнопка "ÐÑкÑÑÑÑ Ð²Ñе", оÑкÑÑваем вÑе пÑнкÑÑ Ð°ÐºÐºÐ¾Ñдеона, 2150 * еÑли нажаÑа кнопка "ÐакÑÑÑÑ Ð²Ñе", закÑÑваем вÑе пÑнкÑÑ 2151 */ 2152 if (event.target.classList.contains("product__accordion-link--open-all")) { 2153 const isOpeningAll = !event.target.classList.contains("opened"); 2154 const accordionItems = accordion.querySelectorAll( 2155 ".product__accordion-item" 2156 );
2157 accordionItems.forEach((item) => { 2158 if (isOpeningAll) { 2159 item.classList.remove("product__accordion-item--active"); 2160 } else { 2161 item.classList.add("product__accordion-item--active"); 2162 } 2163 }); 2164 2165 const openAllButtons = accordion.querySelectorAll( 2166 ".product__accordion-link--open-all" 2167 ); 2168 openAllButtons.forEach((button) => { 2169 // ТекÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸ менÑеÑÑÑ Ð¼ÐµÐ¶Ð´Ñ "ÐÑкÑÑÑÑ Ð²ÑÑ" и "ÐакÑÑÑÑ Ð²ÑÑ" 2170 button.textContent = isOpeningAll ? "ÐÑкÑÑÑÑ Ð²ÑÑ" : "ÐакÑÑÑÑ Ð²ÑÑ"; 2171 //button.classList.toggle("opened"); 2172 }); 2173 } 2174 }); 2175 } 2176 } 2177 2178 // ФÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи загÑÑзке ÑÑÑаниÑÑ Ð¸Ð»Ð¸ изменении ÑазмеÑов 2179 function handleResize() { 2180 // УÑÑанавливаем ÑаймеÑ, ÑÑÐ¾Ð±Ñ Ñ Ð·Ð°Ð´ÐµÑжкой пÑимениÑÑ Ð²ÑÑоÑÑ ÑаблиÑÑ 2181 setTimeout(() => { 2182 calcTableHeight(); 2183 accordionInit(); 2184 }, 200); 2185 } 2186 2187 // СлÑÑаем ÑобÑÑÐ¸Ñ Ð·Ð°Ð³ÑÑзки ÑÑÑаниÑÑ, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑазмеÑа окна и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾ÑиенÑаÑии ÑÑÑÑойÑÑва 2188 window.addEventListener("DOMContentLoaded", handleResize); 2189 window.addEventListener("resize", handleResize); 2190 window.addEventListener("orientationchange", handleResize); 2191 2192 // ÐобилÑнÑй аккоÑдеон 2193 function accordionMobileInit() { 2194 const tabs = document.querySelectorAll( 2195 ".product__tabs-content-item-title" 2196 ); 2197
2198 tabs.forEach((tab) => { 2199 tab.addEventListener("click", () => { 2200 const parent = tab.parentNode; 2201 const activeTab = document.querySelector( 2202 ".product__tabs-content-item--active" 2203 ); 2204 2205 if (parent.classList.contains("product__tabs-content-item--active")) { 2206 parent.classList.remove("product__tabs-content-item--active"); 2207 } else { 2208 if (activeTab) { 2209 activeTab.classList.remove("product__tabs-content-item--active"); 2210 } 2211 parent.classList.add("product__tabs-content-item--active"); 2212 } 2213 }); 2214 }); 2215 } 2216 2217 2218 } 2219} 2220 2221// Ðоказ/ÑкÑÑÑие конÑенÑа в пÑавой колонке на мобилÑнÑÑ ÑÑÑÑойÑÑÐ²Ð°Ñ 2222 document.addEventListener("click", function (event) { 2223 const btn = event.target.closest(".product__text-more"); 2224 if (btn) { 2225 const textContainer = btn.closest(".product__col--right"); 2226 if (textContainer) { 2227 // ÐÑли Ñ .text Ð½ÐµÑ ÐºÐ»Ð°ÑÑа text--visible, добавлÑем его, инаÑе ÑбиÑаем 2228 textContainer.classList.toggle("product__col--visible"); 2229 2230 // ÐенÑем ÑекÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸ в завиÑимоÑÑи Ð¾Ñ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ ÐºÐ»Ð°ÑÑа text--visible 2231 if (textContainer.classList.contains("product__col--visible")) { 2232 btn.textContent = "СкÑÑÑÑ"; 2233 } else { 2234 btn.textContent = "ÐодÑобнее"; 2235 } 2236 } 2237 } 2238 }); 2239 2240function presentationInit() { 2241 const presentation = document.querySelector(".presentation"); 2242 2243 if (presentation) { 2244 const videoElement = presentation.querySelector(".presentation__player"); 2245 /* 2246 * Создаем новÑй обÑÐµÐºÑ Plyr, коÑоÑÑй пÑедÑÑавлÑÐµÑ Ñобой каÑÑомизиÑованнÑй HTML5 видеоплееÑ. 2247 * УказÑваем некоÑоÑÑе опÑии Ð´Ð»Ñ ÑÑого плееÑа, Ñакие как авÑовоÑпÑоизведение, пÑедзагÑÑзка, 2248 * доÑÑÑпнÑе ÑлеменÑÑ ÑпÑавлениÑ, наÑалÑÐ½Ð°Ñ Ð³ÑомкоÑÑÑ Ð¸ дÑÑгие. 2249 * https://github.com/sampotts/plyr/#options 2250 */ 2251 const player = new Plyr(videoElement, { 2252 autoplay: false, 2253 preload: "none", 2254 controls: ["play", "progress", "fullscreen", "volume"], 2255 hideControls: true, 2256 volume: 15, 2257 iconUrl: "/local/templates/xcmg2024/img/presentation/plyr.svg", 2258 blankVideo: "/local/templates/xcmg2024/video/blank.mp4", 2259 }); 2260 2261 // ÐолÑÑаем маÑÑив ÑлеменÑов ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Plyr и добавлÑем обÑабоÑÑик ÑобÑÑÐ¸Ñ click на ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿ÑезенÑаÑии. 2262 let controls = Array.from(presentation.querySelectorAll(".plyr__control")); 2263 2264 /* 2265 * РобÑабоÑÑике ÑобÑÑÐ¸Ñ Ð¿ÑовеÑÑем, бÑл ли клик вÑполнен на ÑлеменÑÐ°Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Plyr. 2266 * ÐÑли да, оÑÑанавливаем далÑнейÑее вÑплÑÑие ÑобÑÑиÑ, инаÑе пеÑеклÑÑаем пÑоигÑÑвание видео. 2267 */ 2268 presentation.addEventListener("click", (event) => { 2269 // ÐÑовеÑÑем, бÑл ли клик вÑполнен на ÑлеменÑÐ°Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Plyr.js 2270 if (controls.some((control) => control.contains(event.target))) { 2271 event.stopPropagation(); // ÐÑÑанавливаем далÑнейÑее вÑплÑÑие ÑобÑÑÐ¸Ñ 2272 return; // Ðе пÑедпÑинимаем Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð´ÐµÐ¹ÑÑвий 2273 } else { 2274 // ÐÑли клик бÑл не на ÑлеменÑÐ°Ñ ÑпÑавлениÑ, Ñо пеÑеклÑÑаем пÑоигÑÑвание видео 2275 player.togglePlay(); 2276 } 2277 }); 2278 2279 /* 2280 * УÑÑанавливаем обÑабоÑÑики ÑобÑÑий "playing" и "pause" Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ 2281 * ÑоÑÑоÑÐ½Ð¸Ñ Ð¿ÑезенÑаÑии пÑи пÑоигÑÑвании видео. 2282 */ 2283 player.on("playing", (event) => { 2284 presentation.classList.add("presentation--active"); 2285 }); 2286 2287 player.on("pause", (event) => { 2288 presentation.classList.remove("presentation--active"); 2289 }); 2290 2291 /* 2292 * ÐобавлÑем обÑабоÑÑик ÑобÑÑÐ¸Ñ scroll на окне, ÑÑÐ¾Ð±Ñ Ð¿Ñи пÑокÑÑÑке ÑÑÑаниÑÑ 2293 * авÑомаÑиÑеÑки пÑиоÑÑанавливаÑÑ Ð²Ð¾ÑпÑоизведение видео и изменÑÑÑ ÑоÑÑоÑние пÑезенÑаÑии. 2294 */ 2295 window.addEventListener("scroll", function () { 2296 let bounding = videoElement.getBoundingClientRect(); 2297 2298 if (bounding.top > window.innerHeight || bounding.bottom < 0) { 2299 player.pause(); 2300 presentation.classList.remove("presentation--active"); 2301 } 2302 }); 2303 2304 // ÐÑклÑÑаем ÑлеменÑÑ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð»ÐµÐµÑа по ÑмолÑÐ°Ð½Ð¸Ñ 2305 player.toggleControls(false); 2306 } 2307} 2308 2309function textInit() { 2310 let text = document.querySelector(".text"); 2311 2312 if (text) { 2313 // Шаблон "ÐовоÑÑÑ". ÐоказаÑÑ/ÑкÑÑÑÑ ÑекÑÑовÑй конÑÐµÐ½Ñ 2314 const cut = document.querySelector(".text__cut"); 2315 2316 if (cut) { 2317 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÑовеÑки, акÑивиÑоваÑÑ Ð»Ð¸ клаÑÑ .text__cut--active 2318 function checkTextCutHeight() { 2319 const textCut = document.querySelector(".text__cut"); 2320 const textMoreButton = document.querySelector(".text__more"); 2321 const rightColHeight = 2322 document.querySelector(".text__col--right").offsetHeight; 2323 2324 // УÑÑанавливаем вÑÑоÑÑ Ð¿Ñавой колонки Ð´Ð»Ñ .text__cut 2325 textCut.style.height = rightColHeight + "px"; 2326 2327 let totalChildrenHeight = 0; 2328 2329 // ÐолÑÑаем доÑеÑние ÑлеменÑÑ Ð¸ вÑÑиÑлÑем Ð¸Ñ ÑÑммаÑнÑÑ Ð²ÑÑоÑÑ Ñ Ð¾ÑÑÑÑпами 2330 const children = textCut.children; 2331 for (let i = 0; i < children.length; i++) { 2332 totalChildrenHeight += children[i].getBoundingClientRect().height; 2333 } 2334 2335 // ÐобавлÑем или ÑдалÑем клаÑÑ .text__cut--active в завиÑимоÑÑи Ð¾Ñ Ð²ÑÑиÑлений 2336 if (totalChildrenHeight > rightColHeight) { 2337 textCut.classList.remove("text__cut--active"); 2338 textMoreButton.classList.remove("text__more--hidden"); 2339 } else { 2340 textCut.classList.add("text__cut--active"); 2341 textMoreButton.classList.add("text__more--hidden"); 2342 } 2343 } 2344 2345 // ФÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð¿Ñи загÑÑзке ÑÑÑаниÑÑ Ð¸Ð»Ð¸ изменении ÑазмеÑов 2346 function handleResize() { 2347 checkTextCutHeight(); 2348 } 2349 2350 // СлÑÑаем ÑобÑÑÐ¸Ñ Ð·Ð°Ð³ÑÑзки ÑÑÑаниÑÑ, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑазмеÑа окна и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¾ÑиенÑаÑии ÑÑÑÑойÑÑва 2351 window.addEventListener("DOMContentLoaded", handleResize); 2352 window.addEventListener("resize", handleResize); 2353 window.addEventListener("orientationchange", handleResize); 2354 2355 // ÐолÑÑаем ÑÑÑлки на ÑлеменÑÑ DOM 2356 const textCutElement = document.querySelector(".text__cut"); 2357 const textMoreButton = document.querySelector(".text__more"); 2358 2359 // ÐбÑабоÑÑик клика по кнопке 2360 const handleMoreButtonClick = () => { 2361 // ÐеÑеклÑÑаем клаÑÑ Ñ ÑлеменÑа .text__cut 2362 textCutElement.classList.toggle("text__cut--active"); 2363 2364 // ÐеÑеклÑÑаем ÑекÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸ в завиÑимоÑÑи Ð¾Ñ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ ÐºÐ»Ð°ÑÑа text__cut--active 2365 if (textCutElement.classList.contains("text__cut--active")) { 2366 textMoreButton.textContent = "СкÑÑÑÑ"; 2367 } else { 2368 textMoreButton.textContent = "ÐоказаÑÑ Ð±Ð¾Ð»ÑÑе"; 2369 } 2370 }; 2371 2372 // ÐазнаÑаем обÑабоÑÑик клика на ÐºÐ½Ð¾Ð¿ÐºÑ 2373 textMoreButton.addEventListener("click", handleMoreButtonClick); 2374 } 2375 2376 // Шаблон "ÐовоÑÑÑ". ÐоказаÑÑ/ÑкÑÑÑÑ ÑекÑÑовÑй конÑÐµÐ½Ñ 2377 // 1) ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑÐ»ÐµÐ¼ÐµÐ½Ñ .text--simple 2378 const simpleText = document.querySelector(".text--simple"); 2379 2380 // ÐÑовеÑÑем, ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ Ñакой ÑÐ»ÐµÐ¼ÐµÐ½Ñ 2381 if (simpleText) { 2382 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ пеÑвÑй h1 внÑÑÑи .text--simple 2383 const h1Element = simpleText.querySelector("h1"); 2384 2385 // ÐÑовеÑÑем, ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ Ñакой h1 2386 if (h1Element) { 2387 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑледÑÑÑие ÑлеменÑÑ Ð½Ð° одном ÑÑовне поÑле h1 2388 const nextElements = h1Element.nextElementSibling; 2389 2390 // ÐÑовеÑÑем, еÑÑÑ Ð»Ð¸ ÑледÑÑÑие ÑлеменÑÑ 2391 if (nextElements) { 2392 // ÐÑли колиÑеÑÑво ÑледÑÑÑÐ¸Ñ ÑлеменÑов болÑÑе одного, добавлÑем клаÑÑ .text__read-more--active 2393 const siblings = Array.from(nextElements.parentNode.children).filter( 2394 (element) => element !== h1Element 2395 ); 2396 if (siblings.length > 1) { 2397 const readMoreButton = simpleText.querySelector(".text__read-more"); 2398 if (readMoreButton) { 2399 readMoreButton.classList.add("text__read-more--active"); 2400 } 2401 } 2402 } 2403 } 2404 } 2405 2406 // 2) ÐбÑабоÑÑик клика на .text__read-more 2407 document.addEventListener("click", function (event) { 2408 const readMoreButton = event.target.closest(".text__read-more"); 2409 if (readMoreButton) { 2410 const textContainer = readMoreButton.closest(".text"); 2411 if (textContainer) { 2412 // ÐÑли Ñ .text Ð½ÐµÑ ÐºÐ»Ð°ÑÑа text--visible, добавлÑем его, инаÑе ÑбиÑаем 2413 textContainer.classList.toggle("text--visible"); 2414 2415 // ÐенÑем ÑекÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ¸ в завиÑимоÑÑи Ð¾Ñ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ ÐºÐ»Ð°ÑÑа text--visible 2416 if (textContainer.classList.contains("text--visible")) { 2417 readMoreButton.textContent = "СкÑÑÑÑ"; 2418 } else { 2419 readMoreButton.textContent = "ÐодÑобнее"; 2420 } 2421 } 2422 } 2423 }); 2424 } 2425} 2426 2427function videoInit() { 2428 const video = document.querySelector(".video"); 2429 2430 if (video) { 2431 const videoElement = video.querySelector(".video__player"); 2432 /* 2433 * Создаем новÑй обÑÐµÐºÑ Plyr, коÑоÑÑй пÑедÑÑавлÑÐµÑ Ñобой каÑÑомизиÑованнÑй HTML5 видеоплееÑ.
2434 * УказÑваем некоÑоÑÑе опÑии Ð´Ð»Ñ ÑÑого плееÑа, Ñакие как авÑовоÑпÑоизведение, пÑедзагÑÑзка, 2435 * доÑÑÑпнÑе ÑлеменÑÑ ÑпÑавлениÑ, наÑалÑÐ½Ð°Ñ Ð³ÑомкоÑÑÑ Ð¸ дÑÑгие. 2436 * https://github.com/sampotts/plyr/#options 2437 */ 2438 const player = new Plyr(videoElement, { 2439 autoplay: false, 2440 preload: "none", 2441 controls: ["play", "progress", "fullscreen", "volume"], 2442 hideControls: true, 2443 volume: 15, 2444 iconUrl: "/local/templates/xcmg2024/img/video/plyr.svg", 2445 blankVideo: "/local/templates/xcmg2024/video/blank.mp4", 2446 }); 2447 2448 // ÐолÑÑаем маÑÑив ÑлеменÑов ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Plyr и добавлÑем обÑабоÑÑик ÑобÑÑÐ¸Ñ click на ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿ÑезенÑаÑии. 2449 let controls = Array.from(video.querySelectorAll(".plyr__control")); 2450 2451 /* 2452 * РобÑабоÑÑике ÑобÑÑÐ¸Ñ Ð¿ÑовеÑÑем, бÑл ли клик вÑполнен на ÑлеменÑÐ°Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Plyr. 2453 * ÐÑли да, оÑÑанавливаем далÑнейÑее вÑплÑÑие ÑобÑÑиÑ, инаÑе пеÑеклÑÑаем пÑоигÑÑвание видео. 2454 */ 2455 video.addEventListener("click", (event) => { 2456 // ÐÑовеÑÑем, бÑл ли клик вÑполнен на ÑлеменÑÐ°Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Plyr.js 2457 if (controls.some((control) => control.contains(event.target))) { 2458 event.stopPropagation(); // ÐÑÑанавливаем далÑнейÑее вÑплÑÑие ÑобÑÑÐ¸Ñ 2459 return; // Ðе пÑедпÑинимаем Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ Ð´ÐµÐ¹ÑÑвий 2460 } else { 2461 // ÐÑли клик бÑл не на ÑлеменÑÐ°Ñ ÑпÑавлениÑ, Ñо пеÑеклÑÑаем пÑоигÑÑвание видео 2462 player.togglePlay(); 2463 } 2464 }); 2465 2466 /* 2467 * УÑÑанавливаем обÑабоÑÑики ÑобÑÑий "playing" и "pause" Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ 2468 * ÑоÑÑоÑÐ½Ð¸Ñ Ð¿ÑезенÑаÑии пÑи пÑоигÑÑвании видео. 2469 */ 2470 player.on("playing", (event) => { 2471 video.classList.add("video--active"); 2472 }); 2473 2474 player.on("pause", (event) => { 2475 video.classList.remove("video--active"); 2476 }); 2477 2478 /* 2479 * ÐобавлÑем обÑабоÑÑик ÑобÑÑÐ¸Ñ scroll на окне, ÑÑÐ¾Ð±Ñ Ð¿Ñи пÑокÑÑÑке ÑÑÑаниÑÑ 2480 * авÑомаÑиÑеÑки пÑиоÑÑанавливаÑÑ Ð²Ð¾ÑпÑоизведение видео и изменÑÑÑ ÑоÑÑоÑние пÑезенÑаÑии. 2481 */ 2482 window.addEventListener("scroll", function () { 2483 let bounding = videoElement.getBoundingClientRect(); 2484 2485 if (bounding.top > window.innerHeight || bounding.bottom < 0) { 2486 player.pause(); 2487 video.classList.remove("video--active"); 2488 } 2489 }); 2490 2491 // ÐÑклÑÑаем ÑлеменÑÑ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð»ÐµÐµÑа по ÑмолÑÐ°Ð½Ð¸Ñ 2492 player.toggleControls(false); 2493 } 2494} 2495 2496function specsDealersInit() { 2497 let arrspecs = []; 2498 if(typeof arraySpecs !== "undefined") { arrspecs = arraySpecs; } 2499 let arrcities = arrayCities; 2500 2501 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ вÑе ÑлеменÑÑ ÑоÑÐ¼Ñ Ð²Ð²Ð¾Ð´Ð° ÑекÑÑа на ÑÑÑаниÑе 2502 let textSpecsInputs = document.querySelectorAll(".specs__filters-item-text-input"); 2503 // ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ð¾Ð³Ð¾ ÑекÑÑа 2504 let inputSpecText = ""; 2505 // ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð´Ð»Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð²ÑбÑанной каÑегоÑии 2506 let spec_category = ""; 2507 console.log(textSpecsInputs); 2508 // УÑÑанавливаем обÑабоÑÑик ÑобÑÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° ÑекÑÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа ÑоÑÐ¼Ñ 2509 textSpecsInputs.forEach((textInput) => { 2510 textInput.addEventListener("input", function () { 2511 // Ð¡Ð¾Ñ ÑанÑем введеннÑй ÑекÑÑ Ð² нижнем ÑегиÑÑÑе 2512 inputSpecText = this.value.toLowerCase(); 2513 2514 // ÐолÑÑаем каÑегоÑÐ¸Ñ Ð¸Ð· ближайÑего ÑодиÑелÑÑкого ÑлеменÑа 2515 spec_category = this.dataset.category; 2516 2517 btn = this.closest(".specs__filters-item-form").querySelector( 2518 ".specs__filters-item-btn" 2519 ); 2520 2521 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑÐµÐ»Ñ ÑлеменÑа ".specs__filters-item-text-input-wrapper" 2522 let parentWrapper = this.closest( 2523 ".specs__filters-item-text-input-wrapper" 2524 ); 2525 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑÐ»ÐµÐ¼ÐµÐ½Ñ ".specs__filters-item-text-input-close" внÑÑÑи ÑодиÑÐµÐ»Ñ 2526 let inputSpecClose = parentWrapper.querySelector( 2527 ".specs__filters-item-text-input-close" 2528 ); 2529 2530 // ÐобавлÑем клаÑÑ "specs__filters-item-text-input-close--active" ÑлеменÑÑ Ð¿Ñи вводе ÑекÑÑа 2531 if (inputSpecText !== "") { 2532 inputSpecClose.classList.add( 2533 "specs__filters-item-text-input-close--active" 2534 ); 2535 } else { 2536 // УдалÑем клаÑÑ "specs__filters-item-text-input-close--active" еÑли в инпÑÑе Ð½ÐµÑ Ñимволов 2537 inputSpecClose.classList.remove( 2538 "specs__filters-item-text-input-close--active" 2539 ); 2540 } 2541 2542 // ФилÑÑÑÑем гоÑода на оÑнове введенного ÑекÑÑа и каÑегоÑии 2543 //let filteredCities = getFilteredCities3(inputSpecText, spec_category); 2544 2545 2546 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ вÑе ÑлеменÑÑ Ñ ÐºÐ»Ð°ÑÑом .specs__filters-list 2547 const filterLists = document.querySelectorAll(".specs__filters-list"); 2548 2549 2550 2551 // ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ найденного ÑлеменÑа добавлÑем обÑабоÑÑик ÑобÑÑÐ¸Ñ Ð½Ð° клик
2552 filterLists.forEach((filterList) => { 2553 filterList.addEventListener("click", function (event) { 2554 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑÐµÐ»Ñ ÑлеменÑа Ñ ÐºÐ»Ð°ÑÑом .specs__filters-item-form 2555 const formItem = event.target.closest(".specs__filters-item-form"); 2556 2557 // ÐÑли ÑодиÑÐµÐ»Ñ Ð±Ñл найден, иÑем доÑеÑний ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ñ ÐºÐ»Ð°ÑÑом .specs__filters-item-text-input 2558 if (formItem) { 2559 const textInput = formItem.querySelector( 2560 ".specs__filters-item-text-input" 2561 ); 2562 const textInputSpec = formItem.querySelector( 2563 "#input-dealer-spec" 2564 ); 2565 2566 // ÐÑли ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð°Ð¹Ð´ÐµÐ½, вÑводим его знаÑение 2567 2568 console.log('filteredCities'+filteredCities) 2569 if (textInput && !textInputSpec) { 2570 setTimeout(function () { 2571 // Создадим Ñлаг, коÑоÑÑй показÑваеÑ, бÑло ли Ñ Ð¾ÑÑ Ð¾Ð´Ð½Ð¾ Ñовпадение 2572 let cityMatched = false; 2573 2574 // ÐÑойдем по ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑлеменÑÑ Ð² filteredCities 2575 filteredCities.forEach((obj) => { 2576 // ÐÑовеÑим, еÑÑÑ Ð»Ð¸ Ñ ÑекÑÑего обÑекÑа поле city 2577 if (obj) { 2578 let city = obj.toLowerCase(); 2579 console.log(city+' -- '+textInput.value.toLowerCase()) 2580 if (city === textInput.value.toLowerCase()) { 2581 // ÐÑли Ñ Ð¾ÑÑ Ð¾Ð´Ð½Ð¾ знаÑение ÑовпадаеÑ, ÑÑÑановим Ñлаг в true 2582 cityMatched = true; 2583 } 2584 } 2585 }); 2586 console.log(cityMatched) 2587 // ÐоÑле пÑÐ¾Ñ Ð¾Ð´Ð° по вÑем знаÑениÑм, пÑовеÑим Ñлаг и вклÑÑим/вÑклÑÑим ÐºÐ½Ð¾Ð¿ÐºÑ "ÐайÑи" 2588 if (cityMatched) { 2589 btn.disabled = false; 2590 } else { 2591 btn.disabled = true; 2592 } 2593 }, 350); 2594 } else if(textInput && textInputSpec) { 2595 setTimeout(function () { 2596 // Создадим Ñлаг, коÑоÑÑй показÑваеÑ, бÑло ли Ñ Ð¾ÑÑ Ð¾Ð´Ð½Ð¾ Ñовпадение 2597 let cityMatched = false; 2598 2599 // ÐÑойдем по ÐºÐ°Ð¶Ð´Ð¾Ð¼Ñ ÑлеменÑÑ Ð² filteredCities 2600 filteredCities.forEach((obj) => { 2601 // ÐÑовеÑим, еÑÑÑ Ð»Ð¸ Ñ ÑекÑÑего обÑекÑа поле city 2602 if (obj) { 2603 let city = obj.toLowerCase(); 2604 console.log(city+' -- '+textInputSpec.value.toLowerCase()) 2605 if (city === textInputSpec.value.toLowerCase()) { 2606 // ÐÑли Ñ Ð¾ÑÑ Ð¾Ð´Ð½Ð¾ знаÑение ÑовпадаеÑ, ÑÑÑановим Ñлаг в true 2607 cityMatched = true; 2608 } 2609 } 2610 }); 2611 console.log(cityMatched) 2612 // ÐоÑле пÑÐ¾Ñ Ð¾Ð´Ð° по вÑем знаÑениÑм, пÑовеÑим Ñлаг и вклÑÑим/вÑклÑÑим ÐºÐ½Ð¾Ð¿ÐºÑ "ÐайÑи" 2613 if (cityMatched) { 2614 btn.disabled = false; 2615 } else { 2616 btn.disabled = true; 2617 } 2618 }, 350); 2619 } 2620 } 2621 }); 2622 }); 2623 2624 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑпиÑок подÑказок Ð´Ð»Ñ ÑекÑÑего ÑлеменÑа ввода 2625 let suggestionsList = this.nextElementSibling; 2626 2627 // ÐÑиÑаем ÑпиÑок подÑказок 2628 suggestionsList.innerHTML = ""; 2629 2630 // ÐÑли еÑÑÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие гоÑода и введен ÑекÑÑ 2631 if (filteredCities.length > 0 && inputSpecText !== "") { 2632 // ÐоказÑваем ÑпиÑок подÑказок 2633 suggestionsList.classList.add("specs__filters-list--active"); 2634 // ÐобавлÑем Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑие гоÑода в ÑпиÑок подÑказок
2635 filteredCities.forEach(function (city) { 2636 suggestionsList.innerHTML += 2637 "<li class='specs__filters-list-item'>" + 2638 city + 2639 "</li>"; 2640 }); 2641 const items = suggestionsList.querySelectorAll( 2642 ".specs__filters-list-item" 2643 ); // ÐайÑи вÑе ÑлеменÑÑ ÑпиÑка 2644 2645 if (items.length > 7) { 2646 const totalItems = Math.min(items.length, 7); // ÐодÑÑиÑÑваем не более 7 ÑлеменÑов 2647 2648 let totalHeight = 0; 2649 for (let i = 0; i < totalItems; i++) { 2650 totalHeight += items[i].clientHeight; 2651 } 2652 2653 suggestionsList.style.height = totalHeight + "px"; // ÐÑименÑем ÑÑÐ¼Ð¼Ñ Ð²ÑÑÐ¾Ñ Ðº suggestionsList 2654 } 2655 } else { 2656 // СкÑÑваем ÑпиÑок подÑказок, еÑли Ð½ÐµÑ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÐ¸Ñ Ð³Ð¾Ñодов 2657 suggestionsList.classList.remove("specs__filters-list--active"); 2658 } 2659 }); 2660 }); 2661 2662 // УÑÑанавливаем обÑабоÑÑик ÑобÑÑÐ¸Ñ ÐºÐ»Ð¸ÐºÐ° на ÑлеменÑÐ°Ñ ".specs__filters-item-text-input-close" 2663 document.querySelectorAll(".specs__filters-item").forEach((item) => { 2664 2665 item.addEventListener("click", function (event) { 2666 if ( 2667 event.target.classList.contains("specs__filters-item-text-input-close") 2668 ) { 2669 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑÐµÐ»Ñ ÑлеменÑа ".specs__filters-item-text-input-close" 2670 let parentWrapper = event.target.closest( 2671 ".specs__filters-item-text-input-wrapper" 2672 ); 2673 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÑодиÑÐµÐ»Ñ ÑлеменÑа ".specs__filters-item-form" 2674 let form = event.target.closest(".specs__filters-item-form"); 2675 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ ÐºÐ½Ð¾Ð¿ÐºÑ 2676 let btn = form.querySelector(".specs__filters-item-btn"); 2677 // ÐÑклÑÑаем ÐºÐ½Ð¾Ð¿ÐºÑ "ÐайÑи" 2678 btn.disabled = true; 2679 2680 // ÐÑиÑаем инпÑÑ 2681 parentWrapper.querySelector(".specs__filters-item-text-input").value = 2682 ""; 2683 2684 // УдалÑем пÑнкÑÑ ÑпиÑка 2685 parentWrapper.querySelector(".specs__filters-list").innerHTML = ""; 2686 2687 // СкÑÑваем ÑпиÑок, Ñдалив акÑивнÑй клаÑÑ 2688 parentWrapper 2689 .querySelector(".specs__filters-list") 2690 .classList.remove("specs__filters-list--active"); 2691 2692 // УдалÑем клаÑÑ "specs__filters-item-text-input-close--active" пÑи ÑбÑоÑе знаÑÐµÐ½Ð¸Ñ 2693 event.target.classList.remove( 2694 "specs__filters-item-text-input-close--active" 2695 ); 2696 } 2697 }); 2698 }); 2699 2700 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ ÑилÑÑÑаÑии гоÑодов на оÑнове введенного ÑекÑÑа и каÑегоÑии 2701 function getFilteredCities3(input, category) { 2702 let cities; 2703 if(category == 'dealer-city') cities = $('#citiesdata2').val().split(','); 2704 else if(category == 'dealer-spec') cities = $('#specsdata2').val().split(','); 2705 2706 return cities.filter(function (Ñity) { 2707 let destinationText = Ñity.toLowerCase(); 2708 let matched = true; 2709 2710 // ÐÑовеÑÑем каждÑй Ñимвол во введенном ÑекÑÑе на ÑооÑвеÑÑÑвие 2711 for (let i = 0; i < input.length; i++) { 2712 if (destinationText[i] !== input[i]) { 2713 matched = false; 2714 break; 2715 } 2716 } 2717 2718 // ÐозвÑаÑаем ÑолÑко ÑовпадаÑÑие гоÑода Ñ Ð²ÑбÑанной каÑегоÑией 2719 return matched; 2720 }); 2721 } 2722 2723 // УÑÑанавливаем обÑабоÑÑик ÑобÑÑÐ¸Ñ ÐºÐ»Ð¸ÐºÐ° на ÑлеменÑÐ°Ñ ÑпиÑка подÑказок 2724 document.querySelectorAll(".specs__filters-item").forEach((item) => { 2725 item.addEventListener("click", function (event) { 2726 if (event.target.classList.contains("specs__filters-list-item")) { 2727 // ÐолÑÑаем вÑбÑаннÑй гоÑод 2728 let selectedCity = event.target.textContent; 2729 2730 // ÐаполнÑем ÑекÑÑовое поле вÑбÑаннÑм гоÑодом 2731 console.log(event.target); 2732 event.target.closest(".specs__filters-item-text-input-wrapper").querySelector('.specs__filters-item-text-input').value = selectedCity; 2733 2734 // СкÑÑваем ÑпиÑок подÑказок и оÑиÑаем его 2735 event.target 2736 .closest(".specs__filters-list") 2737 .classList.remove("specs__filters-list--active"); 2738 event.target.closest(".specs__filters-list").innerHTML = ""; 2739 } 2740 }); 2741 }); 2742}
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.