1( function () { 2 'use strict'; 3 4 function initVariantC() { 5 document.querySelectorAll( '[data-ksc3-vc-tabs]' ).forEach( function ( root ) { 6 var tabs = Array.prototype.slice.call( root.querySelectorAll( '[role="tab"][data-ksc3-vc-target]' ) ); 7 var panels = Array.prototype.slice.call( root.querySelectorAll( '[data-ksc3-vc-panel]' ) ); 8 9 function activate( name, moveFocus ) { 10 tabs.forEach( function ( tab ) { 11 var active = tab.getAttribute( 'data-ksc3-vc-target' ) === name; 12 tab.classList.toggle( 'ksc3-vc-is-active', active ); 13 tab.setAttribute( 'aria-selected', active ? 'true' : 'false' ); 14 tab.tabIndex = active ? 0 : -1; 15 if ( active && moveFocus ) tab.focus(); 16 } ); 17 panels.forEach( function ( panel ) { 18 panel.hidden = panel.getAttribute( 'data-ksc3-vc-panel' ) !== name; 19 } ); 20 } 21 22 root.addEventListener( 'click', function ( event ) { 23 var trigger = event.target.closest( '[data-ksc3-vc-target]' ); 24 if ( ! trigger || ! root.contains( trigger ) ) return; 25 var isTab = trigger.getAttribute( 'role' ) === 'tab'; 26 activate( trigger.getAttribute( 'data-ksc3-vc-target' ), isTab ); 27 // Kein Pill-Klick (z.B. Zähler âKurse/Merkzettel/Termine" oder Kachel-Button): 28 // zum Pill-Menü hochscrollen, damit der geöffnete Reiter oben sichtbar ist. 29 if ( ! isTab ) { 30 var pills = root.querySelector( '.ksc3-vc-pills' ); 31 if ( pills ) { 32 var top = pills.getBoundingClientRect().top + window.pageYOffset - 100; 33 window.scrollTo( { top: Math.max( 0, top ), behavior: 'smooth' } ); 34 } 35 } 36 } ); 37 root.addEventListener( 'keydown', function ( event ) { 38 var current = event.target.closest( '[role="tab"]' ); 39 if ( ! current || ( event.key !== 'ArrowLeft' && event.key !== 'ArrowRight' ) ) return; 40 event.preventDefault(); 41 var index = tabs.indexOf( current ); 42 var next = event.key === 'ArrowRight' ? ( index + 1 ) % tabs.length : ( index - 1 + tabs.length ) % tabs.length; 43 activate( tabs[ next ].getAttribute( 'data-ksc3-vc-target' ), true ); 44 } ); 45 /* Deep-Link auf eine Pille, für Schnellzugriff, Menü-Plugin und 46 * Hilfeseite: `?ks_panel=bookmarks` oder `#merkzettel`. 47 * CLIENTSEITIG ausgewertet, damit der WP-Rocket-Cache egal ist 48 * (serverseitig gelesene Query-Vars liefern sonst die gecachte 49 * Basisseite und der Link greift für Ausgeloggte nicht). 50 * Deutsche Aliase, damit die URL im Backend lesbar bleibt. */ 51 var ALIAS = { 52 'merkzettel': 'bookmarks', 'gespeichert': 'bookmarks', 'bookmarks': 'bookmarks', 53 'kurse': 'courses', 'meine-kurse': 'courses', 'courses': 'courses', 54 'termine': 'events', 'meine-termine': 'events', 'events': 'events', 55 'lounge': 'lounge', 'community': 'lounge', 56 'uebersicht': 'overview', 'übersicht': 'overview', 'overview': 'overview' 57 }; 58 59 function wanted() { 60 var v = ''; 61 try { 62 v = new URLSearchParams( window.location.search ).get( 'ks_panel' ) || ''; 63 } catch ( e ) {} 64 if ( ! v && window.location.hash ) { v = window.location.hash.replace( /^#/, '' ); } 65 v = ( v || '' ).toLowerCase(); 66 return ALIAS[ v ] || ''; 67 } 68 69 function openFromUrl( scroll ) { 70 var name = wanted(); 71 if ( ! name ) { return false; } 72 // Nur öffnen, wenn es die Pille auf dieser Seite wirklich gibt. 73 var exists = tabs.some( function ( t ) { return t.getAttribute( 'data-ksc3-vc-target' ) === name; } ); 74 if ( ! exists ) { return false; } 75 activate( name, false ); 76 if ( scroll ) { 77 var pills = root.querySelector( '.ksc3-vc-pills' ); 78 if ( pills ) { 79 var top = pills.getBoundingClientRect().top + window.pageYOffset - 100; 80 window.scrollTo( { top: Math.max( 0, top ), behavior: 'smooth' } ); 81 } 82 } 83 return true; 84 } 85 86 if ( ! openFromUrl( true ) ) { 87 activate( 'overview', false ); 88 } 89 // Klick auf denselben Link ohne Neuladen (Hash-Wechsel) ebenfalls beachten. 90 window.addEventListener( 'hashchange', function () { openFromUrl( true ); } ); 91 } ); 92 } 93 94 /* App-Hinweis-Banner (1.66.0): à klickt den Hinweis dauerhaft weg. Nonce + admin-ajax 95 * stehen als data-Attribute am Banner (kein wp_localize nötig). Erst optisch ausblenden 96 * (reaktiv), dann serverseitig als âweggeklickt" merken. */ 97 function initAppHint() { 98 var el = document.querySelector( '.ksc3-vc-apphint' ); 99 if ( ! el ) { return; } 100 var btn = el.querySelector( '[data-ksc3-apphint-close]' ); 101 if ( ! btn ) { return; } 102 btn.addEventListener( 'click', function () { 103 el.hidden = true; 104 var ajax = el.getAttribute( 'data-ajax' ); 105 var nonce = el.getAttribute( 'data-nonce' ); 106 if ( ! ajax || ! nonce ) { return; } 107 var fd = new FormData(); 108 fd.append( 'action', 'ksc3_app_hint_dismiss' ); 109 fd.append( 'nonce', nonce ); 110 try { fetch( ajax, { method: 'POST', credentials: 'same-origin', body: fd } ); } catch ( e ) {} 111 } ); 112 } 113 114 if ( document.readyState === 'loading' ) document.addEventListener( 'DOMContentLoaded', function () { initVariantC(); initAppHint(); } ); 115 else { initVariantC(); initAppHint(); } 116} )();
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.