PageSourceSearch

https://riskconference.ru/wp-content/plugins/heavy-addons/js/loop-builder.js?ver=1

js riskconference.ru collected 2026-09-28 13:21:04 UTC 6,681 bytes, 199 lines download raw bytes

1if (document.querySelector('.heavyLoopBuilderPage')) {
2	document.addEventListener('DOMContentLoaded', function () {
3
4		// mark all widgets as initialized
5		document.querySelectorAll('.elementor-widget[data-element_type]').forEach(function (ajaxWidget) {
6			ajaxWidget.classList.add('heavy-ajax-initialized');
7		});
8
9		document.addEventListener('click', function (event) {
10			if (event.target.matches('.heavyLoopBuilderPage, .heavyLoopBuilderPage *')) {
11				event.preventDefault();
12
13				if (document.querySelector('body').classList.contains('elementor-editor-active')) {
14					return;
15				}
16
17				let button = event.target;
18
19				if (!button.classList.contains('heavyLoopBuilderPage')) {
20					button = button.closest('.heavyLoopBuilderPage');
21				}
22
23				if (button.classList.contains('loading') || button.classList.contains('disabled')) {
24					return;
25				}
26
27				const builder = button.closest('.heavy-loop-builder');
28
29				if (builder.classList.contains('loading')) {
30					return;
31				}
32
33				builder.classList.add('loading');
34				button.classList.add('loading');
35
36				const widget_id = builder.getAttribute('data-id');
37				const pageNumb = button.getAttribute('data-page');
38				const pagePHolder = builder.getAttribute('data-placeholder');
39				const fetchUrl = builder.getAttribute('data-fetch').replace(pagePHolder, pageNumb);
40				const pageUrl = builder.getAttribute('data-page').replace(pagePHolder, pageNumb);
41				const mode = builder.getAttribute('data-mode');
42				const updateRouting = builder.classList.contains('update-routing');
43
44				// for multiple loop builders on one page
45				if (updateRouting) {
46					const prevClickedButton = document.querySelector('.heavy-loop-builder.last-triggered');
47					if (prevClickedButton) {
48						prevClickedButton.classList.remove('last-triggered');
49					}
50					builder.classList.add('last-triggered');
51				}
52
53				return fetch(fetchUrl).then(result => result.text()).then(result => {
54					const newPage = (new DOMParser).parseFromString(result, "text/html");
55					const newContent = newPage.querySelector('.heavy-loop-builder[data-id="' + widget_id + '"] .heavy-loop-wrapper');
56					const newNav = newPage.querySelector('.heavy-loop-builder[data-id="' + widget_id + '"] .heavy-loop-builder-nav-wrap');
57
58					if (newContent) {
59						if (mode === 'more') {
60							// append
61							builder.querySelector('.heavy-loop-wrapper').insertAdjacentHTML('beforeend', newContent.innerHTML);
62						} else {
63							// replace
64							builder.querySelector('.heavy-loop-wrapper').innerHTML = newContent.innerHTML;
65
66							if (updateRouting) {
67								if (button.classList.contains('heavy-history')) {
68									button.classList.remove('heavy-history');
69									const tmpButton = document.querySelector('.heavy-loop-tmp-button');
70									if (tmpButton) {
71										tmpButton.remove();
72									}
73								} else {
74									if (builder.classList.contains('update-routing')) {
75										window.history.pushState('page' + pageNumb, document.title, pageUrl);
76									}
77								}
78							}
79
80							if (builder.classList.contains('hlb-scroll-up')) {
81								let builderTop = builder.getBoundingClientRect().top + window.scrollY;
82								const adminBar = document.querySelector('#wpadminbar');
83								if (adminBar) {
84									builderTop = builderTop - adminBar.offsetHeight;
85								}
86
87								builderTop = builderTop - 20;
88								if (builderTop < 0) {
89									builderTop = 0;
90								}
91
92								window.scrollTo({ top: builderTop, behavior: 'smooth'});
93							}
94
95						}
96
97						// init ajaxed widgets
98						builder.querySelectorAll('.elementor-widget[data-element_type]:not(.heavy-ajax-initialized)').forEach(function (ajaxWidget) {
99							elementorFrontend.elementsHandler.runReadyTrigger(ajaxWidget);
100							ajaxWidget.classList.add('heavy-ajax-initialized');
101						});
102
103						// replace navigation
104						if (newNav) {
105							builder.querySelector('.heavy-loop-builder-nav-wrap').innerHTML = newNav.innerHTML;
106						} else {
107							builder.querySelector('.heavy-loop-builder-nav-wrap').remove();
108						}
109					} else {
110						button.classList.remove('loading');
111						console.log('Can\'t load more in: .heavy-loop-builder[data-id="' + widget_id + '"]');
112					}
113
114					builder.classList.remove('loading');
115				});
116			}
117		}, false);
118	});
119}
120
121if (document.querySelector('.heavy-loop-builder.update-routing')) {
122	addEventListener("popstate", function () {
123		if (document.querySelector('body').classList.contains('elementor-editor-active')) {
124			return;
125		}
126
127		// get new page number from current url
128		let newUrl = window.location.href;
129		let newPage = 1;
130		if (newUrl.indexOf('/page/') > -1) {
131			newPage = newUrl.split('/page/');
132			newPage = newPage[1];
133			newPage = newPage.split('/');
134			newPage = parseInt(newPage[0]);
135			if (!newPage) {
136				newPage = 1;
137			}
138		}
139
140		// find builder
141		let builder = document.querySelector('.heavy-loop-builder.update-routing.last-triggered');
142		if (!builder) {
143			builder = document.querySelector('.heavy-loop-builder.update-routing');
144		}
145		if (!builder) {
146			return;
147		}
148
149		// find button to push
150		let button;
151		if (builder.querySelector('.heavyLoopBuilderPage.heavy-loop-builder-nav-numbers')) {
152			// if we have page numbers, trigger them
153			button = builder.querySelector('.heavyLoopBuilderPage.heavy-loop-builder-nav-numbers[data-page="' + newPage + '"]');
154		} else {
155			// if we have only prev and next buttons
156			button = builder.querySelector('.heavyLoopBuilderPage.heavy-loop-builder-prev-next[data-page="' + newPage + '"]');
157		}
158
159		if (!button) {
160			// no button with such page - let's create one
161			builder.insertAdjacentHTML('beforeend', '<a data-page="' + newPage + '" class="heavyLoopBuilderPage heavy-loop-tmp-button"></a>');
162			button = document.querySelector('.heavyLoopBuilderPage.heavy-loop-tmp-button[data-page="' + newPage + '"]');
163		}
164
165		// flag - we don't want to push history
166		button.classList.add('heavy-history');
167
168		button.click();
169	});
170}
171
172document.addEventListener('scroll', function () {
173	if (document.querySelector('body').classList.contains('elementor-editor-active')) {
174		return;
175	}
176
177	const button = document.querySelector('.heavyLoopBuilderInf');
178	if (!button) {
179		return;
180	}
181
182	const builder = button.closest('.heavy-loop-builder');
183	let triggerEl = builder.querySelector('.heavy-loop-item:last-child');
184	if (!triggerEl) {
185		triggerEl = button;
186	}
187
188	const windowH = window.innerHeight || document.documentElement.clientHeight;
189	const rect = triggerEl.getBoundingClientRect();
190	let offset = 0;
191	const adminBar = document.querySelector('#wpadminbar');
192	if (adminBar) {
193		offset = adminBar.offsetHeight;
194	}
195
196	if ((rect.top - windowH) <= 0 && (rect.bottom - offset) >= 0) {
197		button.click();
198	}
199});

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.