PageSourceSearch

https://www.skincareandbeauty.de/js/custom.221028151608.js

js skincareandbeauty.de collected 2026-10-07 04:43:34 UTC 9,631 bytes, 348 lines download raw bytes

1/* JS for preset "Header Thor" */
2$(function() {
3	init();
4});
5
6// Make :active pseudo classes work on iOS
7document.addEventListener("touchstart", function() {}, false);
8
9var init = function() {
10	// menu-wrapper-spacer height calc for non-jumpy sticky
11	var menuSpacer = function() {
12		$('.menu-wrapper-spacer').each(function() {
13			var mwh = $('.menu-wrapper', this).outerHeight();
14			$(this).get(0).style.setProperty("--spacer-height", mwh + 'px'); 
15			// dont write inline css in cms because it will get saved
16			if (document.body.classList.contains('edit') || document.body.classList.contains('preview')) {
17				return;
18			}
19			$(this).css('height', mwh); 
20		});
21	}
22
23	// call initial and then call on every resize
24	menuSpacer();
25
26	$(window).resize(function() {
27		menuSpacer();
28	});
29
30	// scope 
31	$('.header').each(function() {
32
33		var isOnePager = true;
34
35		// Commonly used elements 
36		var $menu = $('.ed-menu', this);
37		var $menuLinks = $('a', $menu); 
38		var $menuTrigger = $('.menu-trigger', this);
39		var $backToTop = $('.back-to-top', this);
40		var $menuWrapper = $('.menu-wrapper', this);
41
42		var headerHeight = $(this).outerHeight();
43		var menuWrapperHeight = $menuWrapper.outerHeight() || 0;
44
45		// if gefion check for nav and add additional classes  
46		var $closeTrigger = $('.nav').length ? $('.menu-backdrop, .logo', this) : $();
47		var $toggleClasses = $('.nav').length ? $('.nav', this).add($('body')) : $menu;
48
49		toggleClassOnClick($toggleClasses, $menuTrigger, $closeTrigger, 'open');
50
51		clickToTop($backToTop);
52		activateSticky($menuWrapper, 'sticky', function(params) {
53		    menuWrapperHeight = $menuWrapper.outerHeight() || 0;
54			params.offset = Math.max(menuWrapperHeight, headerHeight - menuWrapperHeight - 2);
55		});
56
57		// Activate functions that are needed for one-pagers
58		if (isOnePager) {
59			activateSmoothScroll($menuLinks.add($('.scroll a')));
60			addClassOnVisibleLinkTargets($menuLinks, 'active', 2 / 3);
61		}
62	});
63
64};
65
66/**
67 * Toggles class on a target when a trigger is clicked
68 * 
69 * @param {jQuery} The target to apply the CSS class to
70 * @param {jQuery} The Trigger
71 * @param {string} CSS Class to toggle on the target
72 * @param {Boolean} If off canvas menu is used
73 */
74var toggleClassOnClick = function($target, $trigger, $closeTrigger, cssClass) {
75	// Reset in case class "open" was saved accidentally
76	$target.removeClass(cssClass);
77	$trigger.removeClass(cssClass);
78	
79	// Click on trigger toggles class "open"
80	$trigger.off('.toggle').on('click.toggle', function() {
81		$(this).toggleClass(cssClass);
82		$target.toggleClass(cssClass);
83	});
84
85	// Close target when link inside is clicked
86	$target.find('a').click(function() {
87		$target.removeClass(cssClass);
88		$trigger.removeClass(cssClass);
89	});
90	
91	$closeTrigger.on('click', function() { 
92		$target.removeClass(cssClass);
93        $trigger.removeClass(cssClass);
94	})
95};
96
97/**
98 * Scroll to the top of the page when element is clicked
99 * 
100 * @param {jQuery} The element which triggers scroll to top
101 */
102var clickToTop = function($trigger) {
103	$trigger.removeClass('show');
104
105	$trigger.click(function(e) {
106		e.preventDefault();
107		viewport.scrollTo(0, 'top', 500, 0);
108	});
109
110	// Show back to top only below the fold
111	viewport.observe('scroll', function() {
112		if (viewport.getScrollTop() > viewport.getHeight()) {
113			$trigger.addClass('show');
114		} else {
115			$trigger.removeClass('show');
116		}
117	});
118}
119
120/**
121 * Smooth scroll to link targets
122 * 
123 * @param {jQuery} The links
124 * @param {jQuery} Offset to subtract from the scroll target position (e.g. for fixed positioned elements like a menu)
125 */
126var activateSmoothScroll = function($scrollLinks, scrollOffset) {
127	if (typeof scrollOffset === 'undefined') {
128		scrollOffset = 0;
129	}
130
131	var determineTarget = function($trigger, hash) {
132		if (hash == '#!next') {
133			return $trigger.parents('.ed-element').last().next();
134		}
135
136		return $(hash);
137	}
138
139	$scrollLinks.click(function(e) {
140		var $target = determineTarget($(this), this.hash);
141		if (!$target.length) return;
142
143		e.preventDefault();
144		viewport.scrollTo($target, 'top', 500, -scrollOffset);
145	});
146};
147
148/**
149 * Adds a class to an element when not currently visible
150 * 
151 * @param {jQuery} Element
152 * @param {string} CSS class to be applied to the element when it's outside the viewport
153 * @param {string} Can be set to 'top', 'bottom' or 'full'
154 * @param {int|function} Custom offset after which cssClass is applied. If not set, default to $element's position
155 */
156var activateSticky = function($element, cssClass, offset, mode) {
157	var self = this;
158
159	self.offset = 0;
160	self.height = 0;
161
162	$element.removeClass(cssClass);
163
164	var updateOffset = function() {
165		if (typeof offset === 'undefined') {
166			self.offset = $element.offset().top;
167			self.height = $element.outerHeight();
168		} else if (typeof offset === 'function') {
169			offset(self);
170		} else {
171			self.offset = offset;
172			self.height = 0;
173		}
174	}
175	viewport.observe('resize', updateOffset);
176	viewport.observe('animation.end', updateOffset);
177	updateOffset();
178
179	var isVisible = function(mode) {
180		return (
181			(typeof mode === 'undefined' && (self.offset + self.height) > viewport.getScrollTop()) ||
182			((mode === true || mode == 'full') && self.offset > viewport.getScrollTop()) ||
183			(mode == 'top' && self.offset > viewport.getScrollTop()) ||
184			(mode == 'bottom' && (self.offset + self.height) > viewport.getScrollTop())
185		);
186	};
187
188	viewport.observe('scroll', function() {
189	    if (!$element.length) return;
190		if (!isVisible(mode)) {
191			$element.addClass(cssClass);
192		} else {
193			$element.removeClass(cssClass);
194		}
195	});
196};
197
198/**
199 * Adds a class to links whose target is currently inside the viewport
200 * 
201 * @param {jQuery} Link(s) to be observed
202 * @param {string} CSS Class to be applied
203 * @param {float} Ratio by which the target should be within the viewport
204 */
205var addClassOnVisibleLinkTargets = function($links, cssClass, sectionViewportRatio) {
206	if (typeof sectionViewportRatio === 'undefined') {
207		sectionViewportRatio = 1 / 2;
208	}
209
210	var menuTargets = [];
211	var activeLink = $links.filter('.active:not(.wv-link-elm)').eq(0);
212
213	var links = $links.filter(function() {
214		var $target = $(this.hash);
215		if (!$target.length) {
216			return false;
217		}
218
219		// Cache offset position to improve performance (update on resize)		
220		var updateOffset = function() {
221			$target.data('offset', $target.offset().top);
222		};
223
224		viewport.observe('resize', updateOffset);
225		viewport.observe('animation.end', updateOffset);
226		updateOffset();
227
228		menuTargets.push($target);
229		return true;
230	});
231
232	// No hash links found, so don't handle it at all
233	if (!links.length) {
234		return;
235	}
236
237	var checkVisibility = function() {
238		$links.removeClass('active');
239
240		// Check section position reversely
241		for (var i = menuTargets.length - 1; i >= 0; i--) {
242			var desiredScrollPosition = menuTargets[i].data('offset') - viewport.getHeight() * (1 - sectionViewportRatio);
243			if (viewport.getScrollTop() >= desiredScrollPosition) {
244				links.eq(i).addClass(cssClass);
245				return;
246			}
247		}
248
249		// Fallback to originally active item
250		activeLink.addClass(cssClass);
251	};
252
253	viewport.observe('scroll', checkVisibility);
254	checkVisibility();
255};
256/* End JS for preset "Header Thor" */
257
258/* JS for preset "Cookie Consent Bar V3" */
259$(function() {
260	$('#cookieClose').click(function(e) {
261		e.preventDefault();
262		createCookie('cookieConsentBar', "rejected", 0.5);
263		$('.cookie-consent-bar').hide();
264		
265		// If inside of an overlay, close it too
266		if ($('.cookie-consent-bar').closest('.mfp-content').length) {
267			$.magnificPopup.close();
268			return;
269		}
270	});
271
272	$('#acceptCookie').click(function(e) {
273		e.preventDefault();
274		createCookie('cookieConsentBar', "accepted", 0.5);
275		$('.cookie-consent-bar').hide();
276
277		if (typeof ThirdPartyScripts !== "undefined") {
278			ThirdPartyScripts.unblock();
279		}
280
281		// If inside of an overlay, close it too
282		if ($('.cookie-consent-bar').closest('.mfp-content').length) {
283			$.magnificPopup.close();
284			return;
285		}
286	});
287
288	var preview = false;
289	
290	var listener = function() {
291		if (!preview && document.body.classList.contains('preview')) {
292			console.log("entering preview");
293			preview = true;
294		} else if (preview && !document.body.classList.contains('preview')) {
295			console.log("leaving preview");
296			$('.cookie-consent-bar').show();
297			preview = false;
298		}
299		requestAnimationFrame(listener);
300	};
301	
302	requestAnimationFrame(listener);
303
304	if (document.body.classList.contains('edit') || document.body.classList.contains('preview')) {
305		return;
306	}
307
308	
309	// Cookie bar
310	if (readCookie('cookieConsentBar') == "accepted") {
311		$('.cookie-consent-bar').hide();
312		window.setTimeout(function() {
313			if (typeof ThirdPartyScripts !== "undefined") {
314				ThirdPartyScripts.unblock();
315			}
316		}, 100);
317	} else if (readCookie('cookieConsentBar') == "rejected") {
318		$('.cookie-consent-bar').hide();
319	} else {
320		$('.cookie-consent-bar').show();
321	}
322	
323	function readCookie(name) {
324		var nameEQ = name + "=";
325		var ca = document.cookie.split(';');
326		for (var i = 0; i < ca.length; i++) {
327			var c = ca[i];
328			while (c.charAt(0) == ' ') c = c.substring(1, c.length);
329			if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
330		}
331		return null;
332	}   
333    
334	function createCookie(name, value, days) {
335		if (days) {
336			var date = new Date();
337			date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
338			var expires = "; expires=" + date.toGMTString();
339		} else expires = "";
340		document.cookie = name + "=" + value + expires + "; path=/";
341	}
342	
343    // Fix for hiding Content till page is loaded
344	$(document).ready(function() {
345		$('.hide-cookie-content').removeClass("hide-cookie-content");
346	});
347});   
348/* End JS for preset "Cookie Consent Bar V3" */

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.