1// Mobile menu 2document.querySelector(".header__mobile-menu-block > a").addEventListener("click", function(event){ 3 event.preventDefault(); 4 this.nextElementSibling.classList.add("open"); 5}); 6 7document.querySelector(".mobile-menu__close a").addEventListener("click", function(event){ 8 event.preventDefault(); 9 this.closest(".mobile-menu").classList.remove("open"); 10}); 11 12document.querySelector(".header__modes .header__mode-lang").addEventListener("click", function () { 13 document.querySelector(".header__modes .header__lang").classList.toggle("open"); 14}); 15 16document.querySelector(".mobile-menu__modes .mobile-menu__mode-lang").addEventListener("click", function () { 17 document.querySelector(".mobile-menu__modes .header__lang").classList.toggle("open"); 18}); 19 20// Filter open/hide 21const openFilterMobile = document.querySelector(".filter__show_mobile .filter_open"); 22const closeFilterMobile = document.querySelector(".filter__show_mobile .filter_hide"); 23const openFilter = document.querySelector(".filter__show_md-hide .filter_open"); 24const closeFilter = document.querySelector(".filter__show_md-hide .filter_hide"); 25 26if(openFilterMobile) 27 openFilterMobile.addEventListener("click", function(event){ 28 event.preventDefault(); 29 this.classList.add("hide") 30 this.nextElementSibling.classList.remove("hide"); 31 document.querySelector(".filter__row_add").classList.remove("hide"); 32 }) 33 34if(closeFilterMobile) 35 closeFilterMobile.addEventListener("click", function(event){ 36 event.preventDefault(); 37 this.classList.add("hide") 38 this.previousElementSibling.classList.remove("hide"); 39 document.querySelector(".filter__row_add").classList.add("hide"); 40 }) 41if(openFilter) 42 openFilter.addEventListener("click", function(event){ 43 event.preventDefault(); 44 this.classList.add("hide") 45 this.nextElementSibling.classList.remove("hide"); 46 document.querySelector(".filter__row_add").classList.remove("hide"); 47 }) 48if(closeFilter) 49 closeFilter.addEventListener("click", function(event){ 50 event.preventDefault(); 51 this.classList.add("hide") 52 this.previousElementSibling.classList.remove("hide"); 53 document.querySelector(".filter__row_add").classList.add("hide"); 54 }) 55 56// Custom select 57 58const customSelects = document.querySelectorAll(".input_select"); 59const customDropdown = document.querySelectorAll(".custom-select"); 60 61 62if(customSelects.length){ 63 customSelects.forEach(select => select.addEventListener("click", function(event){ 64 event.preventDefault(); 65 event.stopPropagation(); 66 let dropdownBlock = this.parentElement; 67 customSelects.forEach(list => list.parentElement != dropdownBlock && list.parentElement.classList.remove("open")); 68 dropdownBlock.classList.toggle("open"); 69 }) 70 ); 71} 72 73if(customDropdown.length){ 74 customDropdown.forEach(list => list.addEventListener("click", function(event){ 75 event.preventDefault(); 76 event.stopPropagation(); 77 if(event.target.tagName != "LI") return; 78 this.parentElement.classList.remove("open"); 79 this.previousElementSibling.value = event.target.innerText; 80 this.previousElementSibling.previousElementSibling.value = event.target.dataset.id; 81 if(this.parentElement.querySelector(".clear-filter")) 82 this.parentElement.querySelector(".clear-filter").classList.add("show"); 83 }) 84 ); 85 document.addEventListener("click", function(event){ 86 customDropdown.forEach(list => list.parentElement.classList.remove("open")); 87 }) 88} 89 90// city filter 91const cityFilter = document.querySelector(".filter__alfabet"); 92const cityList = document.querySelectorAll(".card__link"); 93 94if(cityFilter) 95 cityFilter.addEventListener("click", function(event){ 96 event.preventDefault(); 97 if(event.target.tagName != "A") return; 98 let letter = event.target.innerText.toLowerCase(); 99 let active = document.querySelector(".filter__alfabet a.active"); 100 if(active) 101 active.classList.remove("active"); 102 event.target.classList.add("active"); 103 if(cityList.length) 104 cityList.forEach(city => {
105 if(city.dataset.filter == letter) 106 city.classList.remove("hide"); 107 else 108 city.classList.add("hide"); 109 }) 110 }) 111 112// Zoom effect 113 114const zoomButtons = document.querySelectorAll(".button-zoom"); 115 116if(zoomButtons) 117 zoomButtons.forEach(button => { 118 119 button.addEventListener("click", function(event){ 120 event.preventDefault(); 121 let zoomContainer = this.closest(".event__document-image-wrap"); 122 if(this.classList.contains("active")){ 123 this.classList.remove("active"); 124 zoomContainer.classList.remove("zoom-in"); 125 zoomContainer.removeEventListener("mousemove", onZoom); 126 zoomContainer.removeEventListener("mouseover", onZoom); 127 zoomContainer.removeEventListener("mouseleave", offZoom); 128 129 zoomContainer.removeEventListener("touchmove", onZoom); 130 zoomContainer.removeEventListener("touchstart", onZoom); 131 zoomContainer.removeEventListener("touchend", offZoom); 132 133 zoomContainer.firstElementChild.style.transformOrigin = `center center`; 134 zoomContainer.firstElementChild.style.transform = `scale(1)`; 135 } else { 136 this.classList.add("active"); 137 zoomContainer.classList.add("zoom-in"); 138 zoomContainer.addEventListener("mousemove", onZoom); 139 zoomContainer.addEventListener("mouseover", onZoom); 140 zoomContainer.addEventListener("mouseleave", offZoom); 141 142 zoomContainer.addEventListener("touchmove", onZoom); 143 zoomContainer.addEventListener("touchstart", onZoom); 144 zoomContainer.addEventListener("touchend", offZoom); 145 } 146 }) 147 }) 148 149function onZoom(event){ 150 const coords = this.getBoundingClientRect(); 151 const x = event.clientX - coords.x; 152 const y = event.clientY - coords.y; 153 this.firstElementChild.style.transformOrigin = `${x}px ${y}px`; 154 this.firstElementChild.style.transform = `scale(2)` 155} 156function offZoom(event){ 157 this.firstElementChild.style.transformOrigin = `center center`; 158 this.firstElementChild.style.transform = `scale(1)`; 159} 160 161//Modal 162 163const modalButtons = document.querySelectorAll(".button-decode"); 164 165if(modalButtons.length) 166 modalButtons.forEach(button => button.addEventListener("click", function(event){ 167 event.preventDefault(); 168 this.nextElementSibling.classList.add("open"); 169 document.body.classList.add("modal-open"); 170 })) 171 172const closeModalButtons = document.querySelectorAll(".modal__close a"); 173 174if(closeModalButtons) 175 closeModalButtons.forEach(button => button.addEventListener("click", function(event){ 176 event.preventDefault(); 177 this.closest(".modal").classList.remove("open"); 178 document.body.classList.remove("modal-open"); 179 })) 180 181document.addEventListener("keypress", function(event){ 182 if(event.key == `Escape`){ 183 let modal = document.querySelector(".modal.open") 184 if(modal){ 185 modal.classList.remove("open"); 186 document.body.classList.remove("modal-open"); 187 } 188 } 189}) 190 191//Main slider 192let swiper; 193let swiperCurrentIndex = 0; 194if(document.querySelector('.swiper-container')){ 195 swiper = new Swiper('.swiper-container', { 196 effect: 'coverflow', 197 autoplay: { 198 delay: 5000, 199 }, 200 parallax: true, 201 grabCursor: false, 202 centeredSlides: true, 203 breakpoints: { 204 320: { 205 slidesPerView: 1, 206 spaceBetween: 0, 207 }, 208 576: { 209 slidesPerView: 2, 210 spaceBetween: 0, 211 }, 212 992: { 213 slidesPerView: 3, 214 spaceBetween: 0, 215 }, 216 1280: { 217 slidesPerView: 4, 218 spaceBetween: 0, 219 } 220 }, 221 speed: 1500, 222 loop: true 223 }); 224 225 swiper.on('transitionStart', function(event){ 226 if(this.realIndex == swiperCurrentIndex) return; 227 document.querySelector(".main__slider-bg-item.active").classList.remove("active"); 228 document.querySelector(`.main__slider-bg-item:nth-child(${this.realIndex+1})`).classList.add("active"); 229 swiperCurrentIndex = this.realIndex; 230 }); 231} 232 233//timeline scroll 234const timeline = document.querySelector(".timeline__content"); 235if(timeline) 236 timeline.onmousedown = () => { 237 let pageX = 0; 238 239 document.onmousemove = e => { 240 if (pageX !== 0) { 241 timeline.scrollLeft = timeline.scrollLeft + (pageX - e.pageX); 242 } 243 pageX = e.pageX; 244 }; 245 246 // заканÑиваем вÑполнение ÑобÑÑий 247 timeline.onmouseup = () => { 248 document.onmousemove = null; 249 timeline.onmouseup = null; 250 }; 251 252 timeline.onmouseleave = () => { 253 document.onmousemove = null; 254 timeline.onmouseup = null; 255 } 256 257 // оÑменÑем бÑаÑзеÑнÑй drag 258 timeline.ondragstart = () => { 259 return false;
260 }; 261 }; 262 263//events output switch 264 265let eventsBlock = document.querySelector(".fact"); 266 267if(eventsBlock){ 268 document.querySelector("#event_output").addEventListener("change", function(){ 269 eventsBlock.classList.toggle("fact_table"); 270 }) 271} 272 273// main map 274function initMap(){ 275 let map = document.querySelector(".map__canvas"); 276 if(map){ 277 let borders = { 278 top: "56°10'", 279 bottom: "51°16'", 280 left: "23°11'", 281 right: "32°47'" 282 } 283 // x - longitude, y - latitude 284 let mapSizes = [map.offsetWidth, map.offsetHeight]; 285 document.querySelectorAll(".map__marker-item").forEach(city => { 286 let position = [ 287 mapSizes[0]*(convertGeoToDeg(city.dataset.longitude) - convertGeoToDeg(borders.left)) / (convertGeoToDeg(borders.right) - convertGeoToDeg(borders.left)), 288 mapSizes[1]*(convertGeoToDeg(city.dataset.latitude) - convertGeoToDeg(borders.bottom)) / (convertGeoToDeg(borders.top) - convertGeoToDeg(borders.bottom)) 289 ]; 290 city.style.left = `${position[0]-20}px`; 291 city.style.bottom = `${position[1]}px`; 292 let mapBlock = map.parentElement; 293 let popupLeft = 150 - city.offsetWidth/2; 294 let offsetRight = window.innerWidth - mapBlock.offsetLeft - mapBlock.offsetWidth; 295 let offsetLeft = mapBlock.offsetLeft; 296 if(offsetLeft + (position[0]-20) < popupLeft){ 297 city.querySelector(".map__marker-full").style.left = `-${(mapBlock.offsetLeft + (position[0]-20))}px`; 298 } else if((map.offsetWidth + offsetRight - (position[0]-20)) < (popupLeft + city.offsetWidth)){ 299 city.querySelector(".map__marker-full").style.left = `-${300 - (map.offsetWidth - (position[0]-20)) - offsetRight/2}px`; 300 } 301 city.classList.remove("hide"); 302 }) 303 } 304} 305function convertGeoToDeg(geoCoord){ 306 let coords = geoCoord.split("°"); 307 let deg = +coords[0]; 308 let minutes = + coords[1].split("'")[0]; 309 return deg + minutes/60; 310} 311 312window.addEventListener("load", initMap); 313window.addEventListener("resize", initMap); 314 315// book height 316 317function setBookHeight(){ 318 let book = document.querySelector(".book__wrap"); 319 if(book){ 320 let newHeight; 321 if(window.innerWidth < 475) 322 newHeight = book.offsetWidth * 675 / 900; 323 else if(window.innerWidth < 576) 324 newHeight = book.offsetWidth * 675 / 1350; 325 else if(window.innerWidth < 992) 326 newHeight = book.offsetWidth * 675 / 1800; 327 else 328 newHeight = book.offsetWidth * 900 / 1790; 329 book.style.height = `${newHeight}px`; 330 } 331 332} 333 334window.addEventListener("load", setBookHeight); 335window.addEventListener("resize", setBookHeight); 336 337// book nav 338 339const bookPrev = document.querySelector(".book__nav-prev"); 340const bookNext = document.querySelector(".book__nav-next"); 341const bookContainer = document.querySelector(".book__wrap"); 342let currentPage = 1; 343let maxPage = document.querySelectorAll(`.book__page`).length * 2; 344if(bookPrev) 345 bookPrev.addEventListener("click", function(event){ 346 event.preventDefault(); 347 if(window.innerWidth > 991){ 348 if(currentPage > 1){ 349 document.querySelector(`.book__page:nth-child(${(currentPage-1)/2})`).classList.remove("active"); 350 currentPage -= 2; 351 } 352 } else { 353 if(currentPage > 1){ 354 if(currentPage % 2 == 1){ 355 bookContainer.classList.add("next-page"); 356 document.querySelector(`.book__page:nth-child(${(currentPage-1)/2})`).classList.remove("active"); 357 } else { 358 bookContainer.classList.remove("next-page"); 359 } 360 currentPage--; 361 } 362 } 363 }) 364if(bookNext) 365 bookNext.addEventListener("click", function(event){ 366 event.preventDefault(); 367 if(window.innerWidth > 991){ 368 if(currentPage < maxPage - 1){ 369 document.querySelector(`.book__page:nth-child(${(currentPage+1)/2})`).classList.add("active"); 370 currentPage += 2; 371 } 372 } else { 373 if(currentPage < maxPage){ 374 if(currentPage % 2 == 1){ 375 bookContainer.classList.add("next-page"); 376 } else { 377 bookContainer.classList.remove("next-page"); 378 document.querySelector(`.book__page:nth-child(${currentPage/2})`).classList.add("active"); 379 } 380 currentPage++; 381 } 382 } 383 384 385 }) 386 387//main map timeline 388const timeRow = document.querySelector(".cmap-time__row"); 389if(timeRow){ 390 timeRow.addEventListener("click", function(event){ 391 event.preventDefault(); 392 let target = event.target; 393 if(target.tagName == "H5") 394 target = target.parentElement; 395 const active = document.querySelector(".cmap-time__item.active"); 396 if(active) 397 active.classList.remove("active"); 398 target.classList.add("active"); 399 let year = parseInt(target.innerText); 400 document.querySelector(".cmap__events-title span").innerText = year; 401 let mapImages = []; 402 document.querySelectorAll(".cmap__canvas > img").forEach((mapImage) => { 403 mapImages.push(parseInt(mapImage.dataset.year)); 404 }); 405 let activeMap = 1919; 406 for(let i = 0; i < mapImages.length; i++){ 407 if(year >= mapImages[i]){ 408 activeMap = mapImages[i]; 409 } else { 410 break; 411 } 412 } 413 console.log(mapImages, activeMap, year); 414 document.querySelector(".cmap__canvas > img.active").classList.remove("active"); 415 document.querySelector(`.cmap__canvas > img[data-year="${activeMap}"]`).classList.add("active"); 416 let url = `/wp-admin/admin-ajax.php?` + new URLSearchParams({ 417 action: 'load', 418 type: "load_map_events", 419 year: year 420 }); 421 fetch(url) 422 .then(response => response.text()) 423 .then(html => { 424 let parser = new DOMParser(); 425 let container = parser.parseFromString(html, 'text/html'); 426 document.querySelector(".container__pager").innerHTML = container.querySelector(".container__pager").innerHTML; 427 document.querySelector(".cmap__info").innerHTML = container.querySelector(".container__pager-map").innerHTML; 428 initPageMap(); 429 }) 430 .catch(err => console.warn('Error', err)); 431 }) 432} 433 434 435// map navigation 436const mapPrev = document.querySelector(".cmap-time__nav-prev"); 437const mapNext = document.querySelector(".cmap-time__nav-next"); 438const mapContainer = document.querySelector(".cmap-time__content"); 439const mapRow = document.querySelector(".cmap-time__row"); 440if(mapContainer){ 441 let mapContainerWidth = mapContainer.offsetWidth; 442 let mapRowWidth = document.querySelectorAll(".cmap-time__item").length * document.querySelector(".cmap-time__item:nth-child(1)").offsetWidth; 443 mapNext.addEventListener("click", function(event){ 444 event.preventDefault(); 445 let style = window.getComputedStyle(mapRow); 446 let matrix3D = new WebKitCSSMatrix(style.transform); 447 let translateX = matrix3D.m41; 448 let maxTranslate = mapContainerWidth - mapRowWidth; 449 let newTranslate = translateX - mapContainerWidth/2; 450 if(newTranslate < maxTranslate) 451 newTranslate = maxTranslate; 452 mapRow.style.transform = `translateX(${newTranslate}px)`; 453 }); 454 mapPrev.addEventListener("click", function(event){ 455 event.preventDefault(); 456 let style = window.getComputedStyle(mapRow); 457 let matrix3D = new WebKitCSSMatrix(style.transform); 458 let translateX = matrix3D.m41; 459 let newTranslate = translateX + mapContainerWidth/2; 460 if(newTranslate > 0) 461 newTranslate = 0; 462 mapRow.style.transform = `translateX(${newTranslate}px)`; 463 }); 464} 465 466//About slider 467 468if(document.querySelector('.swiper__about-container')){ 469 swiper = new Swiper('.swiper__about-container', { 470 autoplay: { 471 delay: 2000,
472 }, 473 grabCursor: false, 474 centeredSlides: true, 475 breakpoints: { 476 320: { 477 slidesPerView: 1, 478 spaceBetween: 20, 479 }, 480 576: { 481 slidesPerView: 2, 482 spaceBetween: 20, 483 }, 484 768: { 485 slidesPerView: 3, 486 spaceBetween: 20, 487 }, 488 1280: { 489 slidesPerView: 4, 490 spaceBetween: 30, 491 }, 492 1920: { 493 slidesPerView: 5, 494 spaceBetween: 30, 495 } 496 }, 497 speed: 1500, 498 loop: true 499 }); 500} 501 502// load event to field 503 504const autoEventSelects = document.querySelectorAll(".input_auto-select-event"); 505 506if(autoEventSelects.length > 0){ 507 autoEventSelects.forEach((autoEventSelect) => { 508 autoEventSelect.addEventListener("input", function(event){ 509 let q = this.value; 510 let input = this; 511 if(q.length > 2){ 512 fetch(`/wp-admin/admin-ajax.php?` + new URLSearchParams({ 513 action: 'load', 514 type: 'search_event', 515 q: q, 516 }) 517 ) 518 .then(response => response.json()) 519 .then(result => { 520 let list = input.nextElementSibling.querySelector("ul"); 521 list.innerHTML = ""; 522 if(result.success == 1){ 523 result.data.forEach(event => list.insertAdjacentHTML('beforeend',`<li data-id='${event.id}'>${event.title}</li>`)); 524 input.parentElement.classList.add("open"); 525 } else { 526 input.parentElement.classList.remove("open"); 527 } 528 }) 529 .catch(err => console.warn('Error', err)); 530 } else{ 531 input.parentElement.classList.remove("open"); 532 } 533 }) 534 }) 535} 536 537// load person to field 538 539const autoPersonSelects = document.querySelectorAll(".input_auto-select-person"); 540 541if(autoPersonSelects.length > 0){ 542 autoPersonSelects.forEach((autoPersonSelect) => { 543 autoPersonSelect.addEventListener("input", function(event){ 544 let q = this.value; 545 let input = this; 546 if(q.length > 2){ 547 fetch(`/wp-admin/admin-ajax.php?` + new URLSearchParams({ 548 action: 'load', 549 type: 'search_person', 550 q: q, 551 }) 552 ) 553 .then(response => response.json()) 554 .then(result => { 555 let list = input.nextElementSibling.querySelector("ul"); 556 list.innerHTML = ""; 557 if(result.success == 1){ 558 result.data.forEach(event => list.insertAdjacentHTML('beforeend',`<li data-id='${event.id}'>${event.title}</li>`)); 559 input.parentElement.classList.add("open"); 560 } else { 561 input.parentElement.classList.remove("open"); 562 } 563 }) 564 .catch(err => console.warn('Error', err)); 565 } else{ 566 input.parentElement.classList.remove("open"); 567 } 568 }) 569 }) 570} 571 572// load event buttons 573 574const loadButton = document.querySelector(".button__pager"); 575 576if(loadButton){ 577 loadButton.addEventListener("click", function(event){ 578 event.preventDefault(); 579 let button = this; 580 if(paged < maxPaged){ 581 paged++; 582 button.classList.add("disabled"); 583 let url = `/wp-admin/admin-ajax.php?` + new URLSearchParams({ 584 action: 'load', 585 type: postType, 586 posts_per_page: postsPerPage, 587 paged: paged 588 }); 589 if(queryFilter != "") 590 url += `&${queryFilter}`; 591 fetch(url) 592 .then(response => response.text()) 593 .then(html => { 594 let parser = new DOMParser(); 595 let container = parser.parseFromString(html, 'text/html'); 596 document.querySelector(".container__pager").insertAdjacentHTML('beforeend', container.querySelector(".container__pager").innerHTML); 597 if(paged == maxPaged){ 598 button.parentElement.classList.add("hide"); 599 } 600 button.classList.remove("disabled"); 601 }) 602 .catch(err => console.warn('Error', err)); 603 } 604 }) 605} 606 607// filter form submit 608 609const filterForm = document.querySelector(".filter__form"); 610 611if(filterForm){ 612 filterForm.addEventListener("submit", function(event){ 613 event.preventDefault(); 614 let button = document.querySelector(".button__pager"); 615 button.classList.add("disabled"); 616 paged = 1; 617 queryFilter = new URLSearchParams((new FormData(this))); 618 let url = `/wp-admin/admin-ajax.php?` + new URLSearchParams({ 619 action: 'load', 620 type: postType, 621 posts_per_page: postsPerPage, 622 paged: paged 623 }) + `&${queryFilter}`; 624 fetch(url) 625 .then(response => response.text()) 626 .then(html => { 627 let parser = new DOMParser(); 628 let container = parser.parseFromString(html, 'text/html'); 629 maxPaged = parseInt(container.querySelector(".container__pager").dataset.maxpaged); 630 document.querySelector(".container__pager").innerHTML = container.querySelector(".container__pager").innerHTML; 631 if(paged == maxPaged || maxPaged == 0){ 632 button.parentElement.classList.add("hide"); 633 } else { 634 button.parentElement.classList.remove("hide"); 635 } 636 button.classList.remove("disabled"); 637 }) 638 .catch(err => console.warn('Error', err)); 639 }) 640} 641 642//header search 643 644const searchButton = document.querySelector(".header__search-button"); 645 646if(searchButton) 647 searchButton.addEventListener("click", function(event){ 648 event.preventDefault(); 649 this.classList.toggle("show"); 650 document.querySelector(".search__block-dropdown").classList.toggle("show"); 651 }); 652 653// clear input 654const clearInput = document.querySelectorAll(".clear-filter"); 655if(clearInput.length > 0) 656 clearInput.forEach((clear) => { 657 clear.addEventListener("click", function(event){ 658 this.classList.remove("show"); 659 this.nextElementSibling.value = ""; 660 this.nextElementSibling.nextElementSibling.value = ""; 661 }) 662 }) 663//modal search 664const searchQuick = document.querySelector("#s"); 665if(searchQuick) 666 searchQuick.addEventListener("input", fastSearch); 667 668document.querySelector(".search__form__quick").addEventListener("submit", function(event){ 669 event.preventDefault(); 670}); 671function fastSearch(){ 672 let input = searchQuick; 673 let q = input.value; 674 if(q.length > 2){ 675 let activePostType = "all"; 676 let activeType = document.querySelector(".search-result__nav li.active"); 677 if(activeType) 678 activePostType = activeType.querySelector("a").dataset.f
678ilter; 679 fetch(`/wp-admin/admin-ajax.php?` + new URLSearchParams({ 680 action: 'load', 681 type: 'search_quick', 682 q: q, 683 post_type: activePostType 684 }) 685 ) 686 .then(response => response.text()) 687 .then(html => { 688 let parser = new DOMParser(); 689 let container = parser.parseFromString(html, 'text/html'); 690 document.querySelector(".search-result__block_modal").innerHTML = container.querySelector(".search-result__block_modal").innerHTML; 691 }) 692 .catch(err => console.warn('Error', err)); 693 } 694} 695 696//change modal search category 697 698const searchQuickCategory = document.querySelectorAll(".search-result__nav a"); 699if(searchQuickCategory.length > 0) 700 searchQuickCategory.forEach((category) => { 701 category.addEventListener("click", function(event){ 702 event.preventDefault(); 703 if(this.parentElement.classList.contains("active")) return; 704 705 let active = document.querySelector(".search-result__nav li.active"); 706 if(active) 707 active.classList.remove("active"); 708 709 this.parentElement.classList.add("active"); 710 fastSearch(); 711 }) 712 }); 713 714 715// page map 716function initPageMap(){ 717 let map = document.querySelector(".cmap__canvas > img.active"); 718 if(map){ 719 let borders = mapBorders; 720 // x - longitude, y - latitude 721 let mapSizes = [map.offsetWidth, map.offsetHeight]; 722 document.querySelectorAll(".cmap__marker-item").forEach(city => { 723 let position = [ 724 mapSizes[0]*(convertGeoToDeg(city.dataset.longitude) - convertGeoToDeg(borders.left)) / (convertGeoToDeg(borders.right) - convertGeoToDeg(borders.left)), 725 mapSizes[1]*(convertGeoToDeg(city.dataset.latitude) - convertGeoToDeg(borders.bottom)) / (convertGeoToDeg(borders.top) - convertGeoToDeg(borders.bottom)) 726 ]; 727 city.style.left = `${position[0]-20}px`; 728 city.style.bottom = `${position[1]+(map.parentElement.offsetHeight - map.offsetHeight)}px`; 729 city.classList.remove("hide"); 730 }) 731 } 732} 733 734window.addEventListener("load", initPageMap); 735window.addEventListener("resize", initPageMap); 736 737let mapMarkerBlock = document.querySelector(".cmap__info"); 738if(mapMarkerBlock){ 739 mapMarkerBlock.addEventListener("click", function(event){ 740 event.preventDefault(); 741 event.stopPropagation(); 742 let item = event.target.closest(".cmap__marker-item") 743 if(!item) return; 744 let id = parseInt(item.dataset.id); 745 let city = item.querySelector("h5").innerText; 746 document.querySelector(".cmap__events-filter span").innerText = city; 747 document.querySelector(".cmap__events-filter").classList.remove("hide"); 748 document.querySelectorAll(".cmap__event").forEach((event) => { 749 if(event.dataset.city.indexOf(` ${id} `) != -1){ 750 event.classList.remove("hide"); 751 } else { 752 event.classList.add("hide"); 753 } 754 }); 755 if(window.innerWidth < 1280){ 756 document.querySelector(".cmap__events-mobile-link").classList.add("open"); 757 document.querySelector(".cmap__event-block").classList.add("open"); 758 } 759 }) 760 document.querySelector(".cmap__events-filter-close").addEventListener("click", function(event){ 761 event.preventDefault(); 762 this.parentElement.classList.add("hide"); 763 document.querySelectorAll(".cmap__event").forEach((event) => { 764 event.classList.remove("hide"); 765 }); 766 }) 767 document.querySelector(".cmap__events-mobile-link").addEventListener("click", function(event){ 768 event.preventDefault(); 769 this.classList.toggle("open"); 770 document.querySelector(".cmap__event-block").classList.toggle("open"); 771 }) 772} 773 774//partner slider 775 776if(document.querySelector('.swiper-container__partner')){ 777 swiper = new Swiper('.swiper-container__partner', { 778 grabCursor: false, 779 observer: true, 780 observeParents: true, 781 parallax:true, 782 navigation: { 783 nextEl: '.swiper-button-next', 784 prevEl: '.swiper-button-prev', 785 }, 786 breakpoints: { 787 320: { 788 slidesPerView: 1, 789 spaceBetween: 20, 790 }, 791 576: { 792 slidesPerView: 2, 793 spaceBetween: 20, 794 }, 795 992: { 796 slidesPerView: 3, 797 spaceBetween: 20, 798 }, 799 1280: { 800 slidesPerView: 4, 801 spaceBetween: 30, 802 }, 803 }, 804 }); 805}
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.