PageSourceSearch

https://www.gresb.com/wp-content/themes/framework/assets/js/custom/custom.js?ver=1790907545

js gresb.com collected 2026-10-02 02:38:37 UTC 14,305 bytes, 531 lines download raw bytes

1(function ($, root, undefined) {
2	$(function () {
3		"use strict";
4
5		var $ = jQuery;
6
7		/*
8		|------------------------------------------------------
9		|	Framework: Listener for Drawer
10		|------------------------------------------------------
11		*/
12
13		if ($(".js-td-drawer").length > 0) {
14			var drawer = document.getElementsByClassName("js-td-drawer")[0];
15			drawer.addEventListener("drawerIsOpen", function (event) {
16				// drawer is open
17				$("body").addClass("overflow-hidden");
18			});
19			drawer.addEventListener("drawerIsClose", function (event) {
20				// drawer is closed
21				$("body").removeClass("overflow-hidden");
22				$(".anim-menu-btn").removeClass("anim-menu-btn--state-b");
23			});
24		}
25
26		/*
27		|------------------------------------------------------
28		|	Framework: Listener for Modals
29		|------------------------------------------------------
30		*/
31
32		if ($(".js-modal").length > 0) {
33			var modal = document.getElementsByClassName("js-modal")[0];
34			modal.addEventListener("modalIsOpen", function (event) {
35				// modal is open
36				$("body").addClass("overflow-hidden");
37			});
38			modal.addEventListener("modalIsClose", function (event) {
39				// modal is closed
40				$("body").removeClass("overflow-hidden");
41			});
42		}
43
44		/*
45		|------------------------------------------------------
46		|	Custom: Sticky Header on Scroll
47		|------------------------------------------------------
48		*/
49
50		if ($(".header-sticky")[0]) {
51			// Helper function:
52			var supportsES6 = (function () {
53				try {
54					new Function("(a = 0) => a");
55					return true;
56				} catch (err) {
57					return false;
58				}
59			})();
60
61			var StickyHeader = (function (window, document) {
62				// version 3.0 - MJF @ websemantics.uk 2017
63
64				"use strict";
65				if (!supportsES6) {
66					return false;
67				}
68
69				const stickyClass = "header-sticky";
70				const header = document.querySelector("." + stickyClass);
71				const hiddenClass = stickyClass + "-hidden";
72
73				// The amount of downward movement before header is hidden
74				const downTolerance = 30;
75				let hasScrolled = false;
76				let lastScrollTop = 200;
77
78				var _redraw = function () {
79					// This is costly to performance but unavoidable
80					const pageY = window.scrollY;
81
82					// Put it away
83					if (pageY > lastScrollTop + downTolerance) {
84						header.classList.add(hiddenClass);
85					}
86
87					// Pull em down
88					if (pageY < lastScrollTop || pageY <= 0) {
89						header.classList.remove(hiddenClass);
90					}
91
92					lastScrollTop = pageY;
93					hasScrolled = false;
94				};
95
96				// Important: keep this function as performant as possible!
97				var _onScroll = function () {
98					if (!hasScrolled) {
99						window.requestAnimationFrame(_redraw);
100					}
101					hasScrolled = true;
102					window.requestAnimationFrame(_onScroll);
103				};
104
105				_onScroll();
106			})(window, document);
107
108			/*
109				jQuery(window).on('scroll',function () {
110				// 50 = height of topbar, without topbar use 1
111				if ($(this).scrollTop() > 50){	
112						$('.header-sticky').addClass("sticky");
113					}
114					else{
115						$('.header-sticky').removeClass("sticky");
116					}
117				});
118			*/
119
120			var div_top = $(".header-sticky").offset().top;
121			jQuery(window).on("scroll", function () {
122				var window_top = $(window).scrollTop() - 0;
123				if (window_top > div_top) {
124					$(".header-sticky").addClass("sticky");
125				} else {
126					$(".header-sticky").removeClass("sticky");
127				}
128			});
129		} else {
130		}
131
132		/*
133		|------------------------------------------------------
134		|  Swiper: Hero Slider
135		|------------------------------------------------------
136		*/
137
138		jQuery(document).ready(function () {
139			//initialize swiper when document ready
140			var mySwiper = new Swiper("#hero-slider .swiper-container", {
141				fadeEffect: {
142					crossFade: true,
143				},
144				effect: "fade",
145				// Optional parameters
146				speed: 1000,
147				allowTouchMove: false,
148				spaceBetween: 0,
149				loop: true,
150				autoplay: {
151					delay: 4000,
152				},
153				pagination: {
154					el: "#hero-slider .swiper-pagination",
155					clickable: true,
156				},
157				navigation: {
158					nextEl: "#hero-slider .swiper-button-next",
159					prevEl: "#hero-slider .swiper-button-prev",
160				},
161			});
162		});
163
164		/*
165		|------------------------------------------------------
166		|	JS: Medewerker Slider
167		|------------------------------------------------------
168		*/
169
170		$("#medewerker_slider .swiper-container").each(function (index, element) {
171			var $this = $(this);
172			$this.addClass("instance-" + index);
173			$this.find(".swiper-button-prev").addClass("btn-prev-" + index);
174			$this.find(".swiper-button-next").addClass("btn-next-" + index);
175			var swiper = new Swiper(".instance-" + index, {
176				slidesPerView: 4,
177				spaceBetween: 30,
178				breakpoints: {
179					1024: {
180						slidesPerView: 4,
181						spaceBetween: 30,
182					},
183					768: {
184						slidesPerView: 3,
185						spaceBetween: 20,
186					},
187					640: {
188						slidesPerView: 2,
189						spaceBetween: 20,
190					},
191					320: {
192						slidesPerView: 1.3,
193						spaceBetween: 20,
194					},
195				},
196				//centeredSlides: true,
197				//loop: true,
198				grabCursor: true,
199				pagination: {
200					el: "#medewerker_slider .swiper-pagination",
201					type: "custom",
202					renderCustom: function (swiper, current, total) {
203						//return current + ' & ' + (current + 1) + ' of ' + swiper.slides.length;
204						//return current + ' - ' + (current + swiper.params.slidesPerView) + ' of ' + swiper.slides.length;
205						//return (current + 1) + ' / ' + swiper.slides.length;
206						return current + " / " + swiper.slides.length;
207					},
208				},
209				navigation: {
210					nextEl: "#medewerker_slider .btn-next-" + index,
211					prevEl: "#medewerker_slider .btn-prev-" + index,
212				},
213				//slideToClickedSlide: true,
214			});
215		});
216
217		// Add disable classes if < 4 slide
218		if ($("#medewerker_slider .swiper-slide").length == 3) {
219			$("#medewerker_slider .swiper-wrapper").addClass("disabled");
220			$("#medewerker_slider .swiper-button-prev").addClass("is-hidden");
221			$("#medewerker_slider .swiper-button-next").addClass("is-hidden");
222			$("#medewerker_slider .swiper-pagination").addClass("is-hidden");
223		}
224
225		/*
226		|------------------------------------------------------
227		|	Custom: logo_slider
228		|------------------------------------------------------
229		*/
230
231		jQuery(document).ready(function () {
232			//initialize swiper when document ready
233			var mySwiper = new Swiper(".logo_slider .swiper-container", {
234				observer: true,
235				observeParents: true,
236				observeSlideChildren: true,
237				slidesPerView: 5,
238				watchSlidesVisibility: true,
239				slideToClickedSlide: true,
240				spaceBetween: 32,
241				breakpoints: {
242					1024: {
243						slidesPerView: 5,
244					},
245					768: {
246						slidesPerView: 3,
247					},
248					640: {
249						slidesPerView: 3,
250					},
251					320: {
252						slidesPerView: 3,
253					},
254				},
255				loop: true,
256				autoplay: {
257					delay: 4000,
258					disableOnInteraction: false,
259				},
260				grabCursor: true,
261				pagination: {
262					el: ".logo_slider .swiper-pagination",
263					clickable: true,
264				},
265				navigation: {
266					prevEl: ".logo_slider .swiper-button-prev",
267					nextEl: ".logo_slider .swiper-button-next",
268				},
269			});
270		});
271
272		/*
273		|------------------------------------------------------
274		|	Custom: hero_slider
275		|------------------------------------------------------
276		*/
277
278		jQuery(document).ready(function () {
279			//initialize swiper when document ready
280			var mySwiper = new Swiper(".hero-slider .swiper-container", {
281				observer: true,
282				observeParents: true,
283				observeSlideChildren: true,
284				slidesPerView: 1,
285				spaceBetween: 0,
286				createElements: true,
287				watchSlidesVisibility: true,
288				autoplay: {
289					delay: 4000,
290				},
291				breakpoints: {
292					1024: {
293						slidesPerView: 1,
294					},
295					768: {
296						slidesPerView: 1,
297					},
298					640: {
299						slidesPerView: 1,
300					},
301					320: {
302						slidesPerView: 1,
303					},
304				},
305				navigation: {
306					prevEl: ".hero-slider .swiper-button-prev",
307					nextEl: ".hero-slider .swiper-button-next"
308				},
309			});
310		});
311
312		/*
313		|------------------------------------------------------
314		|	Video: Hero Video with Plyr
315		|------------------------------------------------------
316		*/
317
318		// https://github.com/sampotts/plyr/#options
319		const herovideo = new Plyr(".hero__video", {
320			autoplay: 1,
321			controls: 0,
322			muted: true,
323			volume: 1,
324			loop: { active: true },
325			clickToPlay: false,
326		});
327
328		// Expose player so it can be used from the console
329		window.player = herovideo;
330
331		/*
332		|------------------------------------------------------
333		|	Meganav: Sliding submenus
334		|------------------------------------------------------
335		*/
336
337		$("document").ready(function () {
338			$(".widget_sliding_menu_widget > div").slider();
339		});
340
341		/*
342		|------------------------------------------------------
343		|	Custom: Remove class 'preload' after Page Load
344		|------------------------------------------------------
345		*/
346
347		jQuery(document).ready(function () {
348			$("body").removeClass("preload");
349		});
350
351		/*
352		|------------------------------------------------------
353		|	Custom: Events filters
354		|------------------------------------------------------
355		*/
356
357		const filterItems = document.querySelectorAll(".filters__item");
358		const filterCheckboxes = document.querySelectorAll(
359			".filters__item-checkbox"
360		);
361
362		if (filterItems) {
363			filterItems.forEach((item) => {
364				const trigger = item.querySelector(".filters__item-title");
365				const dropdown = item.querySelector(".filters__item-content");
366				const dropdownInner = item.querySelector(
367					".filters__item-content-inner"
368				);
369				const activeFilter = "filters__item--active";
370
371				const handleClick = () => {
372					item.classList.remove(activeFilter);
373				};
374
375				// If clicked outside the label, close menu
376				document.addEventListener("click", (event) => {
377					const isClickInside = item.contains(event.target);
378					if (!isClickInside) {
379						handleClick();
380					}
381				});
382				trigger.addEventListener("click", () => {
383					const dropdownHeight = dropdownInner.clientHeight;
384					item.classList.toggle(activeFilter);
385
386					if (window.innerWidth <= 767) {
387						if (item.classList.contains(activeFilter)) {
388							dropdown.style.setProperty("max-height", `${dropdownHeight}px`);
389
390							setTimeout(() => {
391								dropdown.style.setProperty("max-height", "none");
392								dropdown.style.setProperty("height", "100%");
393							}, 200);
394						} else {
395							dropdown.style.setProperty("max-height", `${dropdownHeight}px`);
396							dropdown.style.removeProperty("height");
397
398							setTimeout(() => {
399								dropdown.style.setProperty("max-height", "0px");
400							}, 1);
401						}
402					}
403				});
404			});
405
406			filterCheckboxes.forEach((item) => {
407				item.addEventListener("change", (e) => {
408					const element = e.srcElement;
409					const elementData = element.dataset.id;
410					const parent = document.querySelector(`[data-id="${elementData}"]`);
411
412					const sameInputs = parent.parentElement.getElementsByClassName(
413						"filters__item-checkbox"
414					);
415					let checked = false;
416					[...sameInputs].forEach((sameInput) => {
417						if (sameInput.checked) {
418							checked = true;
419						}
420					});
421					parent.classList.toggle("filters__item-title--active", checked);
422				});
423			});
424		}
425
426		/*
427		|------------------------------------------------------
428		|	Custom: Team filters
429		|------------------------------------------------------
430		*/
431
432		const teamFilterItems = document.querySelectorAll(".team-filters__item");
433		const teamFlterCheckboxes = document.querySelectorAll(
434			".team-filters__item-checkbox"
435		);
436
437		if (teamFilterItems) {
438			teamFilterItems.forEach((item) => {
439				const trigger = item.querySelector(".team-filters__item-title");
440				const dropdown = item.querySelector(".team-filters__item-content");
441				const dropdownInner = item.querySelector(
442					".team-filters__item-content-inner"
443				);
444				const activeTeamFilter = "team-filters__item--active";
445
446				const handleClick = () => {
447					item.classList.remove(activeTeamFilter);
448				};
449
450				// If clicked outside the label, close menu
451				document.addEventListener("click", (event) => {
452					const isClickInside = item.contains(event.target);
453					if (!isClickInside) {
454						handleClick();
455					}
456				});
457				trigger.addEventListener("click", () => {
458					const dropdownHeight = dropdownInner.clientHeight;
459					item.classList.toggle(activeTeamFilter);
460
461					if (window.innerWidth <= 767) {
462						if (item.classList.contains(activeTeamFilter)) {
463							dropdown.style.setProperty("max-height", `${dropdownHeight}px`);
464
465							setTimeout(() => {
466								dropdown.style.setProperty("max-height", "none");
467								dropdown.style.setProperty("height", "100%");
468							}, 200);
469						} else {
470							dropdown.style.setProperty("max-height", `${dropdownHeight}px`);
471							dropdown.style.removeProperty("height");
472
473							setTimeout(() => {
474								dropdown.style.setProperty("max-height", "0px");
475							}, 1);
476						}
477					}
478				});
479			});
480
481			teamFlterCheckboxes.forEach((item) => {
482				item.addEventListener("change", (e) => {
483					const element = e.srcElement;
484					const elementData = element.dataset.id;
485					const parent = document.querySelector(`[data-id="${elementData}"]`);
486
487					const sameInputs = parent.parentElement.getElementsByClassName(
488						"team-filters__item-checkbox"
489					);
490					let checked = false;
491					[...sameInputs].forEach((sameInput) => {
492						if (sameInput.checked) {
493							checked = true;
494						}
495					});
496					parent.classList.toggle("team-filters__item-title--active", checked);
497				});
498			});
499		}
500
501
502		const buttons = document.getElementsByClassName('upload');
503		
504		if (buttons.length) {
505			[...buttons].forEach((button) => {
506				const input = button.querySelector('input.upload__select');
507				const label = button.querySelector('.upload__result');
508				const originalText = label.innerText;
509				
510				input.addEventListener('change', () => {
511					const filename = input?.files[0].name;
512					label.innerText = filename || originalText;
513				});
514			});
515		}
516
517		
518
519		/*
520		|------------------------------------------------------
521		|	Custom: Add aria label to custom footer widget iframe (not accessable)
522		|------------------------------------------------------
523		*/
524
525		const iframes = document.querySelectorAll(".main-footer #iframe_widget-2");
526
527		[...iframes].forEach((iframe) => {
528			iframe.setAttribute("title", "Newsletter form");
529		});
530	});
531})(jQuery, this);

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.