PageSourceSearch

https://letopis.by/wp-content/themes/letopis/assets/js/app.js?ver=1.0.10

js letopis.by collected 2026-10-02 23:00:20 UTC 29,519 bytes, 805 lines download raw bytes

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.