PageSourceSearch

https://albato.ru/js/tildaTemplates.js?v=1790248568

js albato.ru collected 2026-09-25 04:27:33 UTC 27,368 bytes, 860 lines download raw bytes

1/**
2 * Тут определяем какие компоненты подключать на какой странице
3 */
4 document.addEventListener('DOMContentLoaded', function() {
5    //Главная страница
6    if (document.querySelectorAll('#rec835134000').length) {
7        new TabNavigator({'tabButtonClass': '.tab-btn', 'tabClass': '.tab-content'});
8        new TabNavigator({'tabButtonClass': '.button-tab', 'tabClass': '.cont-tab'});
9
10        // Включаем показ картинок
11        document.querySelectorAll('img.tn-atom__img').forEach(img => {
12            if (!img.getAttribute('src') && img.getAttribute('data-original')) {
13                img.setAttribute('src', img.getAttribute('data-original'));
14            }
15        });
16
17        // Включаем показ картинок
18        document.querySelectorAll('.tn-atom.t-bgimg').forEach(div => {
19            if (!div.style.backgroundImage && div.getAttribute('data-original')) {
20                div.style.backgroundImage = `url('${div.getAttribute('data-original')}')`;
21            }
22        });
23    }
24
25    // Страница apps
26    if (document.querySelectorAll('#rec836482391').length) {
27        document.querySelector('.uc-tab').classList.add('active');
28        new PartnerFilter({'jsonPartners': allPartners});
29    }
30
31    // Страница двух партнеров редизайн
32    if (document.querySelectorAll('#rec845129035').length) {
33        new TriggerActionTabNavigator({});
34        new TabNavigator({'tabButtonClass': '.tab-btn', 'tabClass': '.tab-content'});
35        new PartnerPaginationNew({'jsonPartners': allPartners1, 'parentBlockId': '#rec833717894', 'currentPartner': currentPartner1});
36        new PartnerPaginationNew({'jsonPartners': allPartners2, 'parentBlockId': '#rec855687099', 'currentPartner': currentPartner2});
37    }
38
39    //Страница одного партнера редизайн
40    if (document.querySelectorAll('#rec832756009').length) {
41        new TriggerActionTabNavigator({});
42        new TabNavigator({'tabButtonClass': '.tab-btn', 'tabClass': '.tab-content'});
43        new PartnerSearchBoxNew({'jsonPartners': allPartners});
44        new PartnerPaginationNew({'jsonPartners': allPartners, 'parentBlockId': '#rec841956641', 'currentPartner': currentPartner, 'pageName': 'page'});
45    }
46});
47
48class PartnerSearchBox {
49    constructor(config) {
50        this.defaultBlock = null; //Блок с которого будут создаваться все остальные
51
52        this.parentBlockId = config.parentBlockId ?? null;
53        this.jsonPartners = config.jsonPartners ?? null;
54
55        if (!this.parentBlockId) {
56            throw new Error('config.parentBlockId not set');
57        }
58
59        if (!this.jsonPartners) {
60            throw new Error('config.jsonPartners not set');
61        }
62
63        this.init();
64    }
65
66    init() {
67        let searchField = $('input[type="text"].t-input.js-tilda-rule');
68
69        this.defaultBlock = this.getContainer().find('.t774__col_mobile-grid').first();
70
71        let _th = this;
72
73        searchField.on('input', function () {
74            let searchValue = $(this).val().toLowerCase();
75
76            _th.filterPartners(searchValue);
77        });
78
79        this.addSearchResultsBox();
80    }
81
82    showSearchResult(partner) {
83        let container = $('#search_result');
84        let partnerBlock = this.generatePartnerBlock(partner);
85
86        partnerBlock.find('.t774__btn-wrapper').remove();
87
88        container.append(partnerBlock);
89        container.css('display', 'block');
90    }
91
92    removeSearchResult() {
93        $('#search_result').find('.t774__col_mobile-grid').remove();
94        $('#search_result').css('display', 'none');
95    }
96
97    filterPartners(searchValue) {
98        let _th = this;
99
100        if (searchValue.length > 0) {
101            this.removeSearchResult();
102
103            $.each(allPartners, function (id, partner) {
104                if (partner.possibleLabels !== undefined && partner.possibleLabels.toLowerCase().indexOf(searchValue) >= 0) {
105                    _th.showSearchResult(partner);
106                }
107            });
108        } else {
109            this.removeSearchResult();
110        }
111    }
112
113    addSearchResultsBox() {
114        let searchBlockResult = $('<div id="search_result"></div>');
115
116        $('#form719532730 .t-col_12').removeClass('t-col_12').addClass('t-col_6');
117
118        $('.t186__wrapper').after(searchBlockResult);
119    }
120
121    getContainer() {
122        return $(this.parentBlockId).find('.t774__container.t774__container_mobile-grid');
123    }
124
125    getBlockId(partner) {
126        return partner['id'] ?? partner['partnerId'] ?? '';
127    }
128
129    generatePartnerBlock(partner) {
130        let container = this.getContainer();
131        let partnerBlock = this.defaultBlock.clone();
132
133        partnerBlock.attr('data-appended', 'true');
134        partnerBlock.attr('data-block-id', this.getBlockId(partner));
135
136        partnerBlock.find('meta').first().attr('content', partner.logo);
137        partnerBlock.find('img').first().attr('src', partner.logo);
138
139        partnerBlock.find('a.t-card__link').first().text(partner.title).attr('href', partner.url);
140
141        partnerBlock.find('.t-card__btn.t-btn.t-btn_sm').text(partner.bundlesCount);
142
143        partnerBlock.css('display', 'block');
144
145        return partnerBlock;
146    }
147}
148
149const partnerFilter = {
150    init: function () {
151        let searchField = $('input[type="text"].t-input.js-tilda-rule');
152
153        searchField.on('input', function () {
154            let searchValue = $(this).val().toLowerCase();
155
156            partnerFilter.filterPartners(searchValue);
157        });
158    },
159    filterPartners: function (searchValue) {
160        let key = 0;
161
162        if (searchValue.length > 0) {
163            this.hidePartners();
164
165            $.each(allPartners, function (id, partner) {
166                if (partnerFilter.isPartnerAllowed(partner, searchValue)) {
167                    key++;
168                    partnerFilter.showPartnerBlock(partner, key);
169                }
170            });
171        } else {
172            this.resetDefaultGrid();
173        }
174    },
175    showPartnerBlock: function (partner, key) {
176        let container = this.getContainer();
177        let partnerBlock = container.find('[data-block-id="' + this.getBlockId(partner) + '"]');
178
179        partnerBlock.css('display', 'block');
180
181        if (key % 3 === 0) {
182            partnerBlock.after('<div class="t-clear t774__separator" data-appended="true"></div>');
183        }
184    },
185    removeGeneratedElements: function () {
186
187    },
188    resetDefaultGrid: function () {
189        this.hidePartners();
190        this.getContainer().find('[data-show-default=1]').css('display', 'block');
191        this.getContainer().find('.t774__separator').css('display', 'block');
192    },
193    hidePartners: function () {
194        this.removeGeneratedElements();
195        this.getContainer().find('.t774__col_mobile-grid').css('display', 'none');
196        this.getContainer().find('.t774__separator').css('display', 'none');
197    },
198    getBlockId: function (partner) {
199        return partner['id'] ?? partner['partnerId'] ?? '';
200    },
201    getContainer: function () {
202        return $(t774ParentBlockId).find('.t774__container.t774__container_mobile-grid');
203    },
204    isPartnerAllowed(partner, searchValue) {
205        let result = partner.label !== undefined && partner.label.toLowerCase().indexOf(searchValue) >= 0;
206
207        if (!result) {
208            partner.possibleLabels !== undefined && partner.possibleLabels.toLowerCase().indexOf(searchValue) >= 0;
209        }
210
211        return result;
212    }
213};
214
215class PartnerPagination {
216    constructor(config) {
217        this.maxPageNum = 1;
218        this.minPageNum = 1;
219        this.itemsPerRow = 3;
220        this.currentPageNum = 1;
221        this.chunkSize = 9;
222        this.previousLink = $('<a id="prev"><</a>');
223        this.nextLink = $('<a id="next">></a>');
224        this.paginationBlock = $('<div id="pagination"></div>');
225        this.defaultBlock = null; //Блок с которого будут создаваться все остальные
226
227        this.parentBlockId = config.parentBlockId ?? null;
228        this.jsonPartners = config.jsonPartners ?? null;
229        this.pageName = config.pageName ?? null;
230
231        if (!this.parentBlockId) {
232            throw new Error('config.parentBlockId not set');
233        }
234
235        if (!this.jsonPartners) {
236            throw new Error('config.jsonPartners not set');
237        }
238
239        this.init();
240    }
241
242    init() {
243        this.updateCurrentPageNumber();
244
245        this.defaultBlock = this.getContainer().find('.t774__col_mobile-grid').first();
246
247        this.maxPageNum = this.chunkArray(Object.values(this.jsonPartners)).length;
248
249        if (this.currentPageNum > this.maxPageNum) {
250            this.currentPageNum = this.maxPageNum;
251
252            this.updateUrl();
253        }
254
255        if (this.currentPageNum < this.minPageNum) {
256            this.currentPageNum = this.minPageNum;
257
258            this.updateUrl();
259        }
260
261        this.getContainer().after(this.paginationBlock);
262
263        this.refreshLinks();
264        this.loadPageData();
265    }
266
267    refreshLinks() {
268        let _th = this;
269
270        if (this.currentPageNum <= this.minPageNum) {
271            this.previousLink = $('<span id="prev"><</span>');
272        } else {
273            this.previousLink = $('<a id="prev"><</a>');
274
275            if (this.pageName) {
276                this.previousLink.attr("href", "#" + this.pageName + "=" + (this.currentPageNum - 1));
277            } else {
278                this.previousLink.attr("href", "javascript:void(0);");
279            }
280
281            this.previousLink.on('click', function (e) {
282                _th.navigate(-1);
283            });
284        }
285
286        if (this.currentPageNum >= this.maxPageNum) {
287            this.nextLink = $('<span id="next">></span>');
288        } else {
289            this.nextLink = $('<a id="next">></a>');
290
291            if (this.pageName) {
292                this.nextLink.attr("href", "#" + this.pageName + "=" + (this.currentPageNum + 1));
293            } else {
294                this.nextLink.attr("href", "javascript:void(0);");
295            }
296
297            this.nextLink.on('click', function (e) {
298                _th.navigate(1);
299            });
300        }
301
302        this.paginationBlock.find('a, span').remove();
303        this.paginationBlock.append(this.previousLink);
304        this.paginationBlock.append(this.nextLink);
305    }
306
307    updateCurrentPageNumber() {
308        if (this.pageName) {
309            let regexp = new RegExp(`${this.pageName}=(\\d+)`);
310            let match = window.location.hash.match(regexp);
311
312            if (match) {
313                this.currentPageNum = parseInt(match[1]);
314            }
315        }
316    }
317
318    getContainer() {
319        return $(this.parentBlockId).find('.t774__container.t774__container_mobile-grid');
320    }
321
322    navigate(direction) {
323        this.updateCurrentPageNumber();
324
325        this.currentPageNum += direction;
326
327        this.updateUrl();
328
329        this.loadPageData();
330        this.refreshLinks();
331    }
332
333    loadPageData() {
334        this.hidePartners();
335
336        let partners = this.chunkArray(Object.values(this.jsonPartners))[this.currentPageNum - 1];
337        let key = 0;
338
339        let _th = this;
340
341        $.each(partners, function (id, partner) {
342            key++;
343
344            _th.generatePartnerBlock(partner, key);
345        });
346    }
347
348    chunkArray(array) {
349        let chunks = [];
350        for (let i = 0; i < array.length; i += this.chunkSize) {
351            chunks.push(array.slice(i, i + this.chunkSize));
352        }
353        return chunks;
354    }
355
356    hidePartners() {
357        this.removeGeneratedElements();
358        this.getContainer().find('.t774__col_mobile-grid').css('display', 'none');
359        this.getContainer().find('.t774__separator').css('display', 'none');
360    }
361
362    generatePartnerBlock(partner, key) {
363        let container = this.getContainer();
364        let partnerBlock = this.defaultBlock.clone();
365
366        partnerBlock.attr('data-appended', 'true');
367        partnerBlock.attr('data-block-id', this.getBlockId(partner));
368
369        partnerBlock.find('meta').first().attr('content', partner.logo);
370        partnerBlock.find('img').first().attr('src', partner.logo);
371
372        partnerBlock.find('a.t-card__link').first().text(partner.title).attr('href', partner.url);
373
374        partnerBlock.find('.t-card__btn.t-btn.t-btn_sm').text(partner.bundlesCount);
375
376        partnerBlock.css('display', 'block');
377
378        container.append(partnerBlock);
379
380        if (key % this.itemsPerRow === 0) {
381            partnerBlock.after('<div class="t-clear t774__separator" data-appended="true"></div>');
382        }
383    }
384
385    removeGeneratedElements() {
386        this.getContainer().find('[data-appended="true"]').remove();
387    }
388
389    getBlockId(partner) {
390        return partner['id'] ?? partner['partnerId'] ?? '';
391    }
392
393    updateUrl() {
394        if (this.pageName) {
395            window.location.hash = this.pageName + '=' + this.currentPageNum;
396        }
397    }
398}
399
400class TriggerActionTabNavigator {
401    constructor(config) {
402        this.buttons = document.querySelectorAll('.tbbtn > a');
403        this.tabs = document.querySelectorAll('.uc-tab');
404
405        if (this.buttons && this.tabs) {
406            this.tabs.forEach(tab => tab.classList.add('active'));
407
408        // Тут страница не успевает отрисоваться поэтому добавляем задержку
409            setTimeout(() => {
410                this.removeActiveClass();
411                this.tabs[0].classList.add('active');
412                this.buttons[0].closest('.tbbtn').classList.add('active');
413            }, 1000);
414        }
415
416        this.buttons.forEach((button, index) => {
417            button.addEventListener('click', (event) => {
418                event.preventDefault();
419
420                this.removeActiveClass();
421                button.closest('.tbbtn').classList.add('active');
422                
423                if (this.tabs[index]) {
424                    this.tabs[index].classList.add('active');
425                }
426            });
427        });
428    }
429    removeActiveClass() {
430        const allButtons = document.querySelectorAll('.tbbtn');
431
432        allButtons.forEach(function(button) {
433            button.classList.remove('active')
434        });
435
436        this.tabs.forEach(function(tab) {
437            tab.classList.remove('active')
438        })
439    }
440}
441class TabNavigator {
442    constructor(config)
443    {
444        this.tabButtons = document.querySelectorAll(config.tabButtonClass);
445        this.tabContents = document.querySelectorAll(config.tabClass);
446
447        this.activateTab(0);
448
449        this.tabButtons.forEach((button, index) => {
450            button.addEventListener('click', event => {
451                event.preventDefault();
452                this.activateTab(index)
453            })
454        })
455    }
456    activateTab(tabIndex) {
457        this.tabButtons.forEach((btn) => btn.classList.remove('active'));
458        this.tabContents.forEach((content) => content.classList.remove('active'));
459        this.tabButtons[tabIndex].classList.add('active');
460        this.tabContents[tabIndex].classList.add('active')
461    }
462}
463
464class PartnerSearchBoxNew {
465    constructor(config) {
466        this.jsonPartners = config.jsonPartners ?? null;
467
468        if (!this.jsonPartners) {
469            throw new Error('config.jsonPartners not set');
470        }
471
472        this.init();
473    }
474
475    init() {
476        const searchField = document.querySelector('input[type="text"]#search');
477
478        if (!searchField) {
479            throw new Error('Search field not found');
480        }
481
482        searchField.addEventListener('input', (event) => {
483            const searchValue = event.target.value.toLowerCase();
484            this.filterPartners(searchValue);
485        });
486
487        this.addSearchResultsBox();
488    }
489
490    showSearchResult(partner) {
491        const container = document.getElementById('search_result');
492
493        if (!container) {
494            throw new Error('Search results container not found');
495        }
496
497        const partnerBlock = this.generatePartnerBlock(partner);
498
499        container.appendChild(partnerBlock);
500        container.style.display = 'block';
501    }
502
503    removeSearchResult() {
504        const container = document.getElementById('search_result');
505
506        if (container) {
507            container.querySelectorAll('.item').forEach((element) => {
508                element.remove();
509            });
510
511            container.style.display = 'none';
512        }
513    }
514
515    filterPartners(searchValue) {
516        if (searchValue.length > 0) {
517            this.removeSearchResult();
518
519            for (const partner of this.jsonPartners) {
520                if (partner.possibleLabels && partner.possibleLabels.toLowerCase().includes(searchValue)) {
521                    this.showSearchResult(partner);
522                }
523            }
524        } else {
525            this.removeSearchResult();
526        }
527    }
528
529    addSearchResultsBox() {
530        const searchBlockResult = document.createElement('div');
531        searchBlockResult.id = 'search_result';
532
533        const wrapper = document.querySelector('#search');
534
535        if (wrapper) {
536            wrapper.insertAdjacentElement('afterend', searchBlockResult);
537        }
538    }
539
540    generatePartnerBlock(partner) {
541        const partnerBlock = document.createElement('div');
542
543        partnerBlock.classList.add('item');
544
545        const link = document.createElement('a');
546
547        link.setAttribute('href', partner.url);
548
549        const imgTag = document.createElement('img');
550
551        imgTag.setAttribute('src', partner.logo);
552
553        const span = document.createElement('span');
554
555        span.innerText = partner.title;
556
557        link.appendChild(imgTag);
558        link.appendChild(span);
559
560        partnerBlock.appendChild(link);
561
562        return partnerBlock;
563    }
564}
565
566class PartnerFilter {
567    constructor(config) {
568        this.jsonPartners = config.jsonPartners ?? null;
569
570        if (!this.jsonPartners) {
571            throw new Error('config.jsonPartners not set');
572        }
573
574        this.init();
575    }
576
577    init() {
578        const searchField = document.querySelector('input[type="text"]#search');
579
580        searchField.addEventListener('input', (event) => {
581            const searchValue = event.target.value.toLowerCase();
582            this.filterPartners(searchValue);
583        });
584    }
585
586    filterPartners(searchValue) {
587        let key = 0;
588
589        if (searchValue.length > 0) {
590            this.hidePartners();
591
592            Object.values(this.jsonPartners).forEach((partner, id) => {
593                if (this.isPartnerAllowed(partner, searchValue)) {
594                    key++;
595                    this.showPartnerBlock(partner, key);
596                }
597            });
598        } else {
599            this.resetDefaultGrid();
600        }
601    }
602
603    showPartnerBlock(partner, key) {
604        const container = this.getContainer();
605        const partnerBlock = container.querySelector(`[data-block-id="${this.getBlockId(partner)}"]`);
606
607        if (partnerBlock) {
608            partnerBlock.style.display = 'block';
609
610            if (key % 3 === 0) {
611                const separator = document.createElement('div');
612                separator.className = 't-clear';
613                separator.setAttribute('data-appended', 'true');
614                partnerBlock.parentNode.insertBefore(separator, partnerBlock.nextSibling);
615            }
616        }
617    }
618
619    removeGeneratedElements() {
620        const container = this.getContainer();
621        container.querySelectorAll('[data-appended="true"]').forEach(el => el.remove());
622    }
623
624    resetDefaultGrid() {
625        this.hidePartners();
626        const container = this.getContainer();
627        container.querySelectorAll('.t396__group').forEach(el => el.style.display = 'block');
628        container.querySelectorAll('.t-clear').forEach(el => el.style.display = 'block');
629    }
630
631    hidePartners() {
632        this.removeGeneratedElements();
633        const container = this.getContainer();
634        container.querySelectorAll('.t396__group').forEach(el => el.style.display = 'none');
635        container.querySelectorAll('.t-clear').forEach(el => el.style.display = 'none');
636    }
637
638    getBlockId(partner) {
639        return partner['id'] || partner['partnerId'] || '';
640    }
641
642    getContainer() {
643        return document.querySelector('.albato-wrapper');
644    }
645
646    isPartnerAllowed(partner, searchValue) {
647        let result = partner.label && partner.label.toLowerCase().includes(searchValue);
648
649        if (!result && partner.possibleLabels) {
650            result = partner.possibleLabels.toLowerCase().includes(searchValue);
651        }
652
653        return result;
654    }
655}
656
657class PartnerPaginationNew {
658    constructor(config) {
659        this.maxPageNum = 1;
660        this.minPageNum = 1;
661        this.itemsPerRow = 3;
662        this.currentPageNum = 1;
663        this.chunkSize = 18;
664        this.previousLink = document.createElement('a');
665        this.previousLink.id = 'prev';
666        this.previousLink.textContent = '<';
667        this.nextLink = document.createElement('a');
668        this.nextLink.id = 'next';
669        this.nextLink.textContent = '>';
670        this.paginationBlock = document.createElement('div');
671        this.paginationBlock.id = 'pagination';
672        this.defaultBlock = null; // Блок с которого будут создаваться все остальные
673
674        this.parentBlockId = config.parentBlockId || null;
675        this.jsonPartners = config.jsonPartners || null;
676        this.pageName = config.pageName || null;
677        this.currentPartner = config.currentPartner || null;
678
679        if (!this.parentBlockId) {
680            throw new Error('config.parentBlockId not set');
681        }
682
683        if (!this.jsonPartners) {
684            throw new Error('config.jsonPartners not set');
685        }
686
687        this.init();
688    }
689
690    init() {
691        this.updateCurrentPageNumber();
692
693        const container = this.getContainer();
694        this.defaultBlock = container.querySelector('.couple-item').cloneNode(true);
695
696        this.maxPageNum = this.chunkArray(Object.values(this.jsonPartners)).length;
697
698        if (this.currentPageNum > this.maxPageNum) {
699            this.currentPageNum = this.maxPageNum;
700
701            this.updateUrl();
702        }
703
704        if (this.currentPageNum < this.minPageNum) {
705            this.currentPageNum = this.minPageNum;
706
707            this.updateUrl();
708        }
709
710        container.appendChild(this.paginationBlock);
711
712        this.refreshLinks();
713        this.loadPageData();
714    }
715
716    refreshLinks() {
717        const _th = this;
718
719        if (this.currentPageNum <= this.minPageNum) {
720            this.previousLink = document.createElement('span');
721            this.previousLink.id = 'prev';
722            this.previousLink.textContent = '<';
723        } else {
724            this.previousLink = document.createElement('a');
725            this.previousLink.id = 'prev';
726            if (this.pageName) {
727                this.previousLink.href = `#${this.pageName}=${this.currentPageNum - 1}`;
728            } else {
729                this.previousLink.href = 'javascript:void(0);';
730            }
731            this.previousLink.addEventListener('click', function (e) {
732                _th.navigate(-1);
733            });
734            this.previousLink.textContent = '<';
735        }
736
737        if (this.currentPageNum >= this.maxPageNum) {
738            this.nextLink = document.createElement('span');
739            this.nextLink.id = 'next';
740            this.nextLink.textContent = '>';
741        } else {
742            this.nextLink = document.createElement('a');
743            this.nextLink.id = 'next';
744            if (this.pageName) {
745                this.nextLink.href = `#${this.pageName}=${this.currentPageNum + 1}`;
746            } else {
747                this.nextLink.href = 'javascript:void(0);';
748            }
749            this.nextLink.addEventListener('click', function (e) {
750                _th.navigate(1);
751            });
752            this.nextLink.textContent = '>';
753        }
754
755        while (this.paginationBlock.firstChild) {
756            this.paginationBlock.removeChild(this.paginationBlock.lastChild);
757        }
758        this.paginationBlock.appendChild(this.previousLink);
759        this.paginationBlock.appendChild(this.nextLink);
760    }
761
762    updateCurrentPageNumber() {
763        if (this.pageName) {
764            const regexp = new RegExp(`${this.pageName}=(\\d+)`);
765            const match = window.location.hash.match(regexp);
766
767            if (match) {
768                this.currentPageNum = parseInt(match[1]);
769            }
770        }
771    }
772
773    getContainer() {
774        return document.querySelector(this.parentBlockId).querySelector('.container-overflow-hidden');
775    }
776
777    navigate(direction) {
778        this.updateCurrentPageNumber();
779
780        this.currentPageNum += direction;
781
782        this.updateUrl();
783
784        this.loadPageData();
785        this.refreshLinks();
786    }
787
788    loadPageData() {
789        this.hidePartners();
790
791        const partners = this.chunkArray(Object.values(this.jsonPartners))[this.currentPageNum - 1];
792        let key = 0;
793
794        const _th = this;
795
796        partners.forEach(function (partner) {
797            key++;
798            _th.generatePartnerBlock(partner, key);
799        });
800    }
801
802    chunkArray(array) {
803        const chunks = [];
804        for (let i = 0; i < array.length; i += this.chunkSize) {
805            chunks.push(array.slice(i, i + this.chunkSize));
806        }
807        return chunks;
808    }
809
810    hidePartners() {
811        this.removeGeneratedElements();
812        const container = this.getContainer();
813        container.querySelectorAll('.couple-item').forEach(function (elem) {
814            elem.style.display = 'none';
815        });
816    }
817
818    generatePartnerBlock(partner, key) {
819        const container = this.getContainer();
820        const partnerBlock = this.defaultBlock.cloneNode(true);
821
822        partnerBlock.setAttribute('href', partner.url);
823        partnerBlock.setAttribute('data-appended', 'true');
824        partnerBlock.setAttribute('data-block-id', this.getBlockId(partner));
825
826        const imgTag1 = partnerBlock.querySelector('.albato-img1 img');
827        imgTag1.setAttribute('data-original', this.currentPartner.logo);
828        imgTag1.setAttribute('src', this.currentPartner.logo);
829        imgTag1.setAttribute('alt', this.currentPartner.title + ' + ' + partner.title);
830
831        const imgTag2 = partnerBlock.querySelector('.albato-img2 img');
832        imgTag2.setAttribute('data-original', partner.logo);
833        imgTag2.setAttribute('src', partner.logo);
834        imgTag2.setAttribute('alt', this.currentPartner.title + ' + ' + partner.title);
835
836        const linkTag = partnerBlock.querySelector('.albato-title div.tn-atom');
837        linkTag.textContent = this.currentPartner.title + ' + ' + partner.title;
838
839        partnerBlock.style.display = 'block';
840
841        container.querySelector('.tn-molecule').appendChild(partnerBlock);
842    }
843
844    removeGeneratedElements() {
845        const container = this.getContainer();
846        container.querySelectorAll('[data-appended="true"]').forEach(function (elem) {
847            elem.remove();
848        });
849    }
850
851    getBlockId(partner) {
852        return partner['id'] || partner['partnerId'] || '';
853    }
854
855    updateUrl() {
856        if (this.pageName) {
857            window.location.hash = `${this.pageName}=${this.currentPageNum}`;
858        }
859    }
860}

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.