PageSourceSearch

https://radiofrankfurt.de/wp-content/plugins/ajax-news-teasers/ass…/ajax-news-teasers-load-more.js?ver=1.4.4

js radiofrankfurt.de collected 2026-09-25 04:11:27 UTC 10,265 bytes, 282 lines download raw bytes

1(function () {
2    'use strict';
3
4    if (window.__ADN_LOAD_MORE_READY__) {
5        return;
6    }
7    window.__ADN_LOAD_MORE_READY__ = true;
8
9    var config = window.ADNAjaxNewsTeasersLoadMore || {};
10    var loadMoreAction = config.loadMoreAction || 'adn_ajax_news_teasers_load_more';
11    var footerAction = config.footerAction || 'adn_ajax_news_teasers_load_more_footer';
12
13    function getSectionConfig(section) {
14        return {
15            ajaxUrl: section.getAttribute('data-ajax-url') || (window.ADNAjaxNewsTeasers && window.ADNAjaxNewsTeasers.ajaxUrl) || '',
16            nonce: section.getAttribute('data-nonce') || (window.ADNAjaxNewsTeasers && window.ADNAjaxNewsTeasers.nonce) || '',
17            scopeMode: section.getAttribute('data-scope-mode') || 'all',
18            scopeCategories: section.getAttribute('data-scope-categories') || ''
19        };
20    }
21
22    function getActiveCategory(section) {
23        var activeButton = section.querySelector('.ajax-news-filter__button.is-active');
24        if (activeButton) {
25            return activeButton.getAttribute('data-category') || '';
26        }
27        var select = section.querySelector('.ajax-news-filter__select');
28        return select ? (select.value || '') : '';
29    }
30
31    function getGrid(section) {
32        var results = section.querySelector('.ajax-news-results');
33        var inner = results ? results.querySelector('.ajax-news-results-inner') : null;
34        return inner ? inner.querySelector('.ajax-news-grid') : null;
35    }
36
37    function getBatchSize(section) {
38        return parseInt(section.getAttribute('data-load-more-batch') || section.getAttribute('data-cards-count') || '6', 10);
39    }
40
41    function slugFromUrl(url) {
42        try {
43            var parts = new URL(url, window.location.origin).pathname.split('/').filter(Boolean);
44            return parts.length ? parts[parts.length - 1] : '';
45        } catch (error) {
46            return '';
47        }
48    }
49
50    function getVisibleSlugs(section) {
51        var slugs = [];
52
53        section.querySelectorAll('.ajax-news-featured-wrap a[href], .ajax-news-grid a[href]').forEach(function (link) {
54            var slug = link.getAttribute('data-post-slug') || slugFromUrl(link.href);
55            if (slug && slugs.indexOf(slug) === -1) {
56                slugs.push(slug);
57            }
58        });
59
60        section.querySelectorAll('.ajax-news-card-wrap[data-post-slug]').forEach(function (card) {
61            var slug = card.getAttribute('data-post-slug') || '';
62            if (slug && slugs.indexOf(slug) === -1) {
63                slugs.push(slug);
64            }
65        });
66
67        return slugs;
68    }
69
70    function getVisibleIds(section) {
71        var ids = [];
72        section.querySelectorAll('[data-post-id]').forEach(function (el) {
73            var id = parseInt(el.getAttribute('data-post-id') || '0', 10);
74            if (id > 0 && ids.indexOf(id) === -1) {
75                ids.push(id);
76            }
77        });
78        return ids;
79    }
80
81    function removeLoadMoreWrap(section) {
82        section.querySelectorAll('.ajax-news-load-more-wrap').forEach(function (wrap) {
83            wrap.remove();
84        });
85    }
86
87    function insertLoadMoreHtml(section, html) {
88        removeLoadMoreWrap(section);
89        if (!html) {
90            return;
91        }
92        var results = section.querySelector('.ajax-news-results');
93        if (results) {
94            results.insertAdjacentHTML('beforeend', html);
95        }
96    }
97
98    function appendUniqueCards(section, grid, html) {
99        if (!html) {
100            return 0;
101        }
102
103        var knownSlugs = getVisibleSlugs(section);
104        var knownIds = getVisibleIds(section);
105        var template = document.createElement('template');
106        template.innerHTML = html;
107        var added = 0;
108
109        template.content.querySelectorAll('.ajax-news-card-wrap').forEach(function (card) {
110            var link = card.querySelector('a[href]');
111            var slug = card.getAttribute('data-post-slug') || (link ? slugFromUrl(link.href) : '');
112            var id = parseInt(card.getAttribute('data-post-id') || '0', 10);
113
114            if (id > 0 && knownIds.indexOf(id) !== -1) {
115                return;
116            }
117
118            if (slug && knownSlugs.indexOf(slug) !== -1) {
119                return;
120            }
121
122            grid.appendChild(card);
123
124            if (id > 0) {
125                knownIds.push(id);
126            }
127
128            if (slug) {
129                knownSlugs.push(slug);
130            }
131
132            added += 1;
133        });
134
135        return added;
136    }
137
138    function refreshLoadMoreButton(section) {
139        var sectionConfig = getSectionConfig(section);
140        if (!sectionConfig.ajaxUrl || !sectionConfig.nonce) {
141            return;
142        }
143
144        var formData = new FormData();
145        formData.append('action', footerAction);
146        formData.append('nonce', sectionConfig.nonce);
147        formData.append('category', getActiveCategory(section));
148        formData.append('scope_mode', sectionConfig.scopeMode);
149        formData.append('scope_categories', sectionConfig.scopeCategories);
150        formData.append('exclude_slugs', getVisibleSlugs(section).join(','));
151        formData.append('exclude_ids', getVisibleIds(section).join(','));
152
153        fetch(sectionConfig.ajaxUrl, { method: 'POST', credentials: 'same-origin', body: formData })
154            .then(function (response) {
155                if (!response.ok) {
156                    throw new Error('HTTP ' + response.status);
157                }
158                return response.json();
159            })
160            .then(function (data) {
161                if (data && data.success && data.data) {
162                    insertLoadMoreHtml(section, data.data.html || '');
163                }
164            })
165            .catch(function (error) {
166                console.error('Load-More Footer Fehler:', error);
167            });
168    }
169
170    function loadMore(section, wrap) {
171        if (!section || !wrap || section.classList.contains('is-loading') || section.__adnLoadMoreBusy) {
172            return;
173        }
174
175        var sectionConfig = getSectionConfig(section);
176        var button = wrap.querySelector('.ajax-news-load-more');
177        var grid = getGrid(section);
178
179        if (!sectionConfig.ajaxUrl || !sectionConfig.nonce || !button || !grid) {
180            return;
181        }
182
183        var category = wrap.getAttribute('data-category') || getActiveCategory(section);
184        var excludeSlugs = getVisibleSlugs(section);
185        var excludeIds = getVisibleIds(section);
186
187        button.disabled = true;
188        section.__adnLoadMoreBusy = true;
189        section.classList.add('is-loading');
190
191        var formData = new FormData();
192        formData.append('action', loadMoreAction);
193        formData.append('nonce', sectionConfig.nonce);
194        formData.append('category', category);
195        formData.append('scope_mode', sectionConfig.scopeMode);
196        formData.append('scope_categories', sectionConfig.scopeCategories);
197        formData.append('count', String(getBatchSize(section)));
198        formData.append('exclude_slugs', excludeSlugs.join(','));
199        formData.append('exclude_ids', excludeIds.join(','));
200
201        fetch(sectionConfig.ajaxUrl, { method: 'POST', credentials: 'same-origin', body: formData })
202            .then(function (response) {
203                if (!response.ok) {
204                    throw new Error('HTTP ' + response.status);
205                }
206                return response.json();
207            })
208            .then(function (data) {
209                if (!(data && data.success && data.data)) {
210                    throw new Error('Ungültige Antwort');
211                }
212
213                var added = appendUniqueCards(section, grid, data.data.html || '');
214                var batchSize = getBatchSize(section);
215                var loadedCount = parseInt(data.data.loaded, 10) || 0;
216                var hasMore = !!data.data.has_more;
217
218                if (added === 0 || loadedCount === 0 || loadedCount < batchSize) {
219                    hasMore = false;
220                }
221
222                removeLoadMoreWrap(section);
223
224                if (hasMore) {
225                    insertLoadMoreHtml(
226                        section,
227                        '<div class="ajax-news-load-more-wrap" data-category="' + category + '"><button type="button" class="ajax-news-load-more">Mehr laden</button></div>'
228                    );
229                }
230            })
231            .catch(function (error) {
232                console.error('Load-More Fehler:', error);
233            })
234            .finally(function () {
235                button.disabled = false;
236                section.__adnLoadMoreBusy = false;
237                section.classList.remove('is-loading');
238            });
239    }
240
241    function scheduleLoadMoreRefreshAfterFilter(section) {
242        var attempts = 0;
243        var timer = window.setInterval(function () {
244            attempts += 1;
245            if (section.classList.contains('is-loading')) {
246                if (attempts >= 100) {
247                    window.clearInterval(timer);
248                }
249                return;
250            }
251            window.clearInterval(timer);
252            refreshLoadMoreButton(section);
253        }, 100);
254    }
255
256    document.addEventListener('click', function (event) {
257        var loadMoreButton = event.target.closest('.ajax-news-load-more');
258        if (loadMoreButton) {
259            event.preventDefault();
260            loadMore(loadMoreButton.closest('.ajax-news-section'), loadMoreButton.closest('.ajax-news-load-more-wrap'));
261            return;
262        }
263
264        var filterButton = event.target.closest('.ajax-news-filter__button');
265        if (filterButton) {
266            var filterSection = filterButton.closest('.ajax-news-section');
267            if (filterSection) {
268                scheduleLoadMoreRefreshAfterFilter(filterSection);
269            }
270        }
271    }, true);
272
273    document.addEventListener('change', function (event) {
274        var select = event.target.closest('.ajax-news-filter__select');
275        if (select) {
276            var section = select.closest('.ajax-news-section');
277            if (section) {
278                scheduleLoadMoreRefreshAfterFilter(section);
279            }
280        }
281    }, true);
282}());

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.