PageSourceSearch

https://www.erlebnis-tipps.de/scripts.js?cache=20250325

js erlebnis-tipps.de collected 2026-10-05 23:04:06 UTC 15,438 bytes, 585 lines download raw bytes

1/*
2
3
4<script type="text/javascript">
5		var werbung_aus = true;
6</script>
7
8
9<script type="text/javascript" src="/werbung-banner-ads.js"></script>
10
11
12
13
14function check_ads() {
15		if (document.getElementById('tipp_werb_1')) {
16				//if (werbung_aus) {
17				 if (document.getElementById('tipp_werb_1').offsetHeight == 0) {		// funktioniert bei Firefox aber nicht bei AdBlockern (z.B. IE) die den Platz trotzdem reservieren
18
19
20
21						// document.getElementById('container').style.position = 'absolute';
22
23
24						  var snode = document.createElement('div');
25						  snode.setAttribute('style','background-color: #ffffff; top: 76px; opacity: 0.9; width: 1000px; height: 500px; position: absolute; border: 1px solid #000000;');
26						  snode.setAttribute('id','werb_hinweis');
27						  snode.setAttribute('onclick','document.getElementById(\'werb_hinweis\').style.display = \'none\';');
28						  snode.innerHTML = '<div style="text-align: center; padding: 100px; font-weight: bold; font-size: 2em;">Bitte deaktivieren Sie Ihren Werbeblocker!</div>';
29						  // document.getElementsByTagName('body')[0].appendChild(snode);
30						  document.getElementById('container').appendChild(snode);
31
32				}
33		}
34
35}
36
37setTimeout('check_ads()', 2000); // Wartezeit bevor das Script losgeht
38mach ich nicht mehr, weil Besucher Besucher anziehen, auch die, die AdBlock und Co installiert haben
39*/
40
41
42
43
44function ajax_wertung() {
45
46	var wertung_index = -1;
47	var formWertung = document.getElementById('form_wertung');
48
49	for (var i = 0; i < formWertung.wertung.length; i++) {
50			if (formWertung.wertung[i].checked) {
51					wertung_index = i;
52					break;
53			}
54	}
55
56	if (wertung_index == -1) {
57			document.getElementById('wertung_msgbox').innerHTML = 'Bitte wählen Sie erst zwischen 1 und 5 Sternen!';
58	} else {
59
60			let wertung = formWertung.wertung[wertung_index].value * 1;
61
62			fetch(
63					'ajax_wertung.php'
64					,
65					{
66							  'method': 'POST'
67							, 'cache': 'no-cache'
68							, 'headers': {
69									// 'Content-Type': 'application/json'
70									'Content-Type': 'application/x-www-form-urlencoded'
71							}
72							, 'body': 'tipp=' + tipp.id + '&wertung=' + wertung
73					}
74			)
75			.then( response => response.json() )
76			.then( data => {
77
78
79					var msg = '';
80
81					switch (data.status) {
82							case 'init': msg = 'Es ist ein Fehler aufgetreten. Wenn Sie dies für einen permamenten Fehler halten, informieren Sie bitte die Webmaster.'; break;
83							case 'reloadsperre': msg = 'Sie haben diesen Tipp bereits mit <b>' + data.wertung_alt + ' Sternen</b> bewertet. Bitte beachten Sie, dass Sie jeden Tipp nur einmal bewerten dürfen.'; break;
84							case 'wertung ausserhalb des gueltigen bereichs': msg = 'Wertung außerhalb des gültigen Bereichs. Bitte geben Sie nur Wertung zwischen inklusive 1 und 5 ab!'; break;
85							case 'ok':
86									msg = 'Die Wertung wurde erfolgreich abgegeben. Vielen Dank für Ihre Stimme!';
87									var wertung_anz = document.getElementById('wertung_anz').innerHTML * 1;
88									var wertung_schnitt = document.getElementById('wertung_schnitt').innerHTML * 1;
89									var wertung_schnitt_neu = (wertung_anz * wertung_schnitt + wertung) / (wertung_anz + 1);
90									wertung_schnitt_neu = Math.round(wertung_schnitt_neu * 10) / 10;
91									wertung_schnitt_neu = String(wertung_schnitt_neu).replace(',', '.');
92
93									document.getElementById('wertung_anz').innerHTML = (wertung_anz + 1);
94									document.getElementById('wertung_schnitt').innerHTML = wertung_schnitt_neu;
95									break;
96					};
97
98					if (msg != '') {
99							document.getElementById('wertung_msgbox').innerHTML = msg;
100					}
101
102			} );
103
104	}
105}
106
107function MenuMobile() {
108
109		this.menuHtml = null;
110		this.elemMenu;
111		this.charset = null;
112		this.isOpen = false;
113
114		var self = this;
115
116		this.putHtmlToDom = function() {
117
118				var elemMenu = document.createElement('div');
119				elemMenu.classList.add('menuMobile');
120				elemMenu.innerHTML = self.menuHtml;
121				document.body.appendChild(elemMenu);
122				self.elemMenu = elemMenu;
123
124				document.querySelector('.menuMobile .menuMobileHeadSchliessen').addEventListener('click', function() {
125						self.close();
126				});
127
128				var i, aElem, elem;
129
130				aElem = document.querySelectorAll('.menuMobile .menuMobileKategorie');
131				for (i = 0; i < aElem.length; i++) {
132						aElem[i].addEventListener('click', function(event) {
133								var elemKategorie = event.target;
134								var elemKategoriebox = document.getElementById('menuMobileKategoriebox_' + event.target.dataset.id);
135
136								var open;
137								if ('open' in elemKategoriebox.dataset) {
138										if (elemKategoriebox.dataset.open == '0') {
139												elemKategoriebox.dataset.open = '1';
140												open = true;
141										} else {
142												elemKategoriebox.dataset.open = '0';
143												open = false;
144										}
145								} else {
146										elemKategoriebox.dataset.open = '1';
147										open = true;
148								}
149
150								if (open) {
151										elemKategorie.classList.add('open');
152										// elemKategoriebox.style.display = 'block';		// laesst sich damit mit css-transition nicht animieren, getestet mit firefox 106
153										elemKategoriebox.classList.add('visible');
154								} else {
155										elemKategorie.classList.remove('open');
156										elemKategoriebox.classList.remove('visible');
157										// elemKategoriebox.style.display = 'none';
158								}
159						});
160				}
161
162
163				aElem = document.querySelectorAll('.menuMobile .menuMobileLanguages a');
164				let link;
165				for (i = 0; i < aElem.length; i++) {
166						elem = aElem[i];
167
168						// window.location.pathname kommt mit / vorne dran
169						// bei (mindestens) ist bei elem.href auch ein Slash hintendran, obwohl nicht um original href definiert wurde
170						// deshalb ein / entfernen
171
172						link = elem.href;
173
174						if (link.lastIndexOf('/') == link.length - 1) {
175								link = link.substring(0, link.length - 1);
176						}
177
178						elem.href = link + window.location.pathname;
179				}
180
181		}
182
183		this.open = function() {
184				if (!self.isOpen) {
185						self.isOpen = true;
186
187						if (self.menuHtml == null) {
188
189
190								fetch('/menu-mobile.html.php')
191								.then(response => {
192
193										let headerContentType = response.headers.get('content-type');
194										let posCharset = headerContentType.toLowerCase().indexOf('charset=');
195
196										if (posCharset >= 0) {
197												self.charset = headerContentType.substr(posCharset + 'charset='.length);
198												return response.arrayBuffer();
199										} else {
200												return response.text();
201										}
202
203								})
204								.then(data => {
205
206										if (self.charset == null) {
207												self.menuHtml = data;
208										} else {
209												let decoder = new TextDecoder(self.charset);
210												self.menuHtml = decoder.decode(data);
211										}
212
213										self.putHtmlToDom();
214
215								});
216						} else {
217								self.putHtmlToDom();
218						}
219
220
221				}
222		}
223		this.close = function() {
224				if (self.isOpen) {
225						self.isOpen = false;
226						self.elemMenu.parentNode.removeChild(self.elemMenu);
227				}
228		}
229
230
231		document.querySelector('#menuMobile').addEventListener('click', function() {
232				self.open();
233		});
234
235}
236
237function loadCSS(href) {
238    return new Promise((resolve, reject) => {
239        let link = document.createElement("link");
240        link.rel = "stylesheet";
241        link.type = "text/css";
242        link.media = "screen";
243        link.href = href;
244        link.onload = () => resolve(link);
245        link.onerror = () => reject(new Error(`CSS konnte nicht geladen werden: ${href}`));
246        document.head.appendChild(link);
247    });
248}
249
250var menuMobile;
251var galleryInited = false;
252var map;
253
254function initGallery() {
255		if (
256				   typeof GLightbox != 'undefined'
257				&& !galleryInited
258				&& window.innerWidth > 400
259		) {
260				loadCSS('/frameworks/glightbox/glightbox.css');
261				//jQuery('a.fancybox').fancybox();
262				new GLightbox({'selector': '.fancybox'});
263				galleryInited = true;
264				window.removeEventListener('resize', initGallery);
265		}
266}
267
268
269
270function cleanName(name) {
271		name = name.toLowerCase();
272		name = name.replace(/ /g, '_');
273		name = name.replace(/\//g, '-');
274		name = name.replace(/&/g, 'u');
275		name = name.replace(/ß/g, 'ss');
276		name = name.replace(/ä/g, 'ae');
277		name = name.replace(/ö/g, 'oe');
278		name = name.replace(/ü/g, 'ue');
279		return name;
280}
281
282
283function Videosteuerung(elemContainer) {
284
285		// /freizeit/poetenweg.php
286		// /freizeit/fuerstlich-greizer-park.php
287
288
289		var self = this;
290
291		var elemVideo = elemContainer.querySelector('video');
292
293		var elemButtonMuteUnmute = elemContainer.querySelector('.buttonMuteUnmute');
294		var elemButtonPlayPause = elemContainer.querySelector('.buttonPlayPause');
295
296		this.updateButton = function(button) {
297				var html, title;
298				switch (button) {
299						case elemButtonMuteUnmute:
300								if (elemVideo.muted) {
301										html = '&#x1F508;';
302										title = 'Ton an!';
303
304
305								} else {
306										html = '&#x1F507;';
307										title = 'Ton aus!';
308								}
309								break;
310						case elemButtonPlayPause:
311								if (elemVideo.paused) {
312										html = '&#x25b6;';
313										title = 'Fortsetzen!';
314								} else {
315										html = '&#x23f8;';
316										title = 'Pause!';
317
318								}
319								break;
320						default:
321								html = '';
322								title = '';
323								console.log('Button not found.', button);
324								break;
325				}
326				button.innerHTML = html;
327				button.title = title;
328		}
329
330		this.videoMuteUnmute = function() {
331				if (elemVideo.muted) {
332						elemVideo.muted = false;
333				} else {
334						elemVideo.muted = true;
335				}
336		}
337
338		this.videoPlayPause = function() {
339				if (elemVideo.paused) {
340						elemVideo.play();
341				} else {
342						elemVideo.pause();
343				}
344		}
345
346		self.updateButton(elemButtonMuteUnmute);
347		self.updateButton(elemButtonPlayPause);
348
349		elemVideo.addEventListener('play', function() {
350				self.updateButton(elemButtonPlayPause);
351		});
352		elemVideo.addEventListener('pause', function() {
353				self.updateButton(elemButtonPlayPause);
354		});
355		elemVideo.addEventListener('volumechange', function() {
356				self.updateButton(elemButtonMuteUnmute);
357		});
358
359		elemButtonMuteUnmute.addEventListener('click', function() {
360				self.videoMuteUnmute();
361		});
362		elemButtonPlayPause.addEventListener('click', function() {
363				self.videoPlayPause();
364		});
365
366
367
368}
369
370
371async function init() {
372
373
374		menuMobile = new MenuMobile();
375
376
377		let elem = document.querySelector('script[data-name="glightbox"]');
378		if (elem) {
379				elem.addEventListener(
380						// dadurch dass das scritp asynchron geladen wird, kann es auch sonstwann fertig sein
381						  'load'
382						, function (e) {
383									initGallery();
384						}
385				)
386		}
387
388
389		if (typeof startseite !== 'undefined') {
390
391				// Maps
392
393				const { Map } = await google.maps.importLibrary('maps');
394				const { AdvancedMarkerElement } = await google.maps.importLibrary('marker');
395
396
397				map = new Map(document.getElementById('map'), {
398						  'zoom': 10
399						, 'center': { 'lat': 50.49115283387326, 'lng': 12.277908325195312 }
400						, 'mapId': 'map'
401						, 'mapTypeId': 'roadmap'
402				});
403
404				let lastHovered = null;
405
406				fetch('/startseite.json.php')
407				.then((response) => response.json())
408				.then((data) => {
409
410
411						let tipp;
412						let categoryNameClean, img;
413						for (let seite in data.oTipp) {
414
415								let tipp = data.oTipp[seite];
416
417								let categoryNameClean = cleanName(data.oKategorie[tipp.kategorie]);
418
419
420								let img = document.createElement('img');
421								img.src = '/icons2/' + categoryNameClean + '.png';
422
423
424
425
426								let marker = new AdvancedMarkerElement({
427										  'map': map
428										, 'position': { 'lat': tipp.lat, 'lng': tipp.lng }
429										, 'content': img
430										//, 'title': 'Titel',
431								});
432
433								let linkurl = '\/freizeit\/' + seite + '.php';
434
435								let beschr =
436								'<div style="width: 210px; overflow: auto; text-align: left;">'
437										+ '<a href="' + linkurl + '">' + tipp.name + '</a><br><br>' + tipp.kurzebschreibung
438								'</div>';
439
440								let infowWindow = new google.maps.InfoWindow({
441										content: beschr
442								});
443
444
445
446
447								marker.content.addEventListener('mouseover', function() {
448										/*
449												mouserver geht nur auf content, nicht auf dem marker selbst
450										*/
451
452										if (lastHovered) {
453												lastHovered.close();
454										}
455
456										infowWindow.open({
457											anchor: marker,
458											map,
459										});
460
461
462										lastHovered = infowWindow;
463
464
465								});
466
467								marker.addListener('click', function() {
468										/*
469												mouseover auf content geht nur, wenn der marker ein click event hag
470										*/
471
472										window.location = linkurl;
473
474								});
475
476
477
478								marker.content.addEventListener('mouseout', function() {
479
480								});
481
482
483						}
484				})
485				;
486
487
488
489
490		}
491
492
493		if (typeof beschreibungsseite !== 'undefined') {
494
495				// Gallery
496				window.addEventListener('resize', initGallery);
497				initGallery();
498
499				// Maps
500				if (tipp.hasCoords) {
501
502						const { Map } = await google.maps.importLibrary('maps');
503						const { AdvancedMarkerElement } = await google.maps.importLibrary('marker');
504
505						map = new Map(document.getElementById('map'), {
506								  'zoom': (!tipp.indoor && tipp.hasCoords ? (tipp.kategorie == 25 ? 18 : 17) : 12)			// zoom: tipp.kategorie == 25: Freibaeder, diese sind nicht von Baeumen verdeckt und das Becken ist sehr gut zu sehen
507								, 'center': { 'lat': tipp.lat, 'lng': tipp.lng }
508								, 'mapId': 'map'
509								, 'mapTypeId': (!tipp.indoor && tipp.hasCoords ? 'satellite' : 'roadmap')
510						});
511
512
513						if (tipp.indoor) {
514
515								let marker = new AdvancedMarkerElement({
516										  'map': map
517										, 'position': { 'lat': tipp.lat, 'lng': tipp.lng }
518								});
519								
520						}
521
522				}
523
524		}
525
526
527
528		var videos = document.querySelectorAll('video.livebild');
529		var video;
530		for (var i = 0; i < videos.length; i++) {
531
532				video = videos[i];
533
534				video.muted = true;		// das video wird ueber javascript sonst erst gar nicht gestartet
535				video.loop = false;
536
537				video.addEventListener('mouseover', function(event) {
538						this.play();
539				});
540
541				video.addEventListener('touchstart', function(event) {
542						this.play();
543
544				});
545
546				video.addEventListener('mouseout', function(event) {
547						this.pause();
548				});
549
550				video.addEventListener('touchend', function(event) {
551						this.pause();
552				});
553
554		}
555
556		// Videosteuerung
557		let aElem = document.querySelectorAll('.inlinevideo');
558		for (let i = 0; i < aElem.length; i++) {
559				new Videosteuerung(aElem[i]);
560		}
561
562
563		if (document.getElementById('form_wertung')) {
564				document.getElementById('form_wertung').addEventListener('submit', function(e) {
565						ajax_wertung();
566						e.preventDefault();
567				});
568		}
569
570
571}
572
573
574if (document.readyState === 'loading') {		// wenn dieses Scrit mit async eingebunden wird, kann es auch spaeter (nach Event DOMContentLoaded) laden
575
576		document.addEventListener('DOMContentLoaded', function(event) {
577				init();
578
579		});
580
581} else {
582		init();
583}
584
585

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.