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 = '🔈'; 302 title = 'Ton an!'; 303 304 305 } else { 306 html = '🔇'; 307 title = 'Ton aus!'; 308 } 309 break; 310 case elemButtonPlayPause: 311 if (elemVideo.paused) { 312 html = '▶'; 313 title = 'Fortsetzen!'; 314 } else { 315 html = '⏸'; 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.