(function () { "use strict"; // Alle unterstützten Suchformulare finden var forms = document.querySelectorAll( "#header-suche, #header-suche-eng, #header-suche-desktop" ); if (!forms.length) { return; } // Elemente, deren Inhalte nicht durchsucht werden sollen var excludedTags = [ "SCRIPT", "STYLE", "NOSCRIPT", "TEXTAREA", "INPUT", "SELECT", "BUTTON", "OPTION" ]; // Bereits vorhandene Hervorhebungen entfernen function removeHighlights() { var marks = document.querySelectorAll( "mark.header-suche-highlight" ); marks.forEach(function (mark) { var parent = mark.parentNode; if (parent) { parent.replaceChild( document.createTextNode(mark.textContent), mark ); parent.normalize(); } }); } // Prüfen, ob ein Textknoten durchsucht werden darf function isAllowedNode(node) { var parent = node.parentElement; while (parent) { if (excludedTags.indexOf(parent.tagName) !== -1) { return false; } if ( parent.classList && parent.classList.contains("header-suche-highlight") ) { return false; } parent = parent.parentElement; } return true; } // Alle Vorkommen des Suchbegriffs auf der Seite finden function findMatches(term) { var matches = []; if (!term) { return matches; } var walker = document.createTreeWalker( document.body, NodeFilter.SHOW_TEXT, { acceptNode: function (node) { if ( node.nodeValue && isAllowedNode(node) && node.nodeValue.toLowerCase().indexOf( term.toLowerCase() ) !== -1 ) { return NodeFilter.FILTER_ACCEPT; } return NodeFilter.FILTER_REJECT; } } ); var node; while ((node = walker.nextNode())) { var text = node.nodeValue; var lowerText = text.toLowerCase(); var lowerTerm = term.toLowerCase(); var position = 0; while ( (position = lowerText.indexOf( lowerTerm, position )) !== -1 ) { matches.push({ node: node, start: position, end: position + term.length }); position += term.length; } } return matches; } // Ein einzelnes Vorkommen hervorheben function highlightMatch(matches, index) { if (index < 0 || index >= matches.length) { return false; } var match = matches[index]; var node = match.node; if (!node.parentNode) { return false; } var text = node.nodeValue; var before = text.substring(0, match.start); var found = text.substring(match.start, match.end); var after = text.substring(match.end); var fragment = document.createDocumentFragment(); if (before) { fragment.appendChild( document.createTextNode(before) ); } var mark = document.createElement("mark"); mark.className = "header-suche-highlight"; mark.textContent = found; mark.style.backgroundColor = "#ffff00"; mark.style.color = "#000000"; mark.style.padding = "0"; fragment.appendChild(mark); if (after) { fragment.appendChild( document.createTextNode(after) ); } node.parentNode.replaceChild(fragment, node); // Zum gefundenen Text springen mark.scrollIntoView({ behavior: "smooth", block: "center" }); return true; } // Abfrage nach dem letzten Ergebnis function showNoMoreResults(term, state) { var answer = window.confirm( "Keine weiteren Vorkommnisse auf dieser Seite. " + "Möchtest Du stattdessen auf allen Unterseiten suchen?" ); if (answer) { window.location.href = "suche.php?term=" + encodeURIComponent('"' + term + '"'); } else { // Bei Abbrechen wieder zum ersten Ergebnis state.currentIndex = 0; removeHighlights(); state.matches = findMatches(term); if (state.matches.length > 0) { highlightMatch(state.matches, 0); } } } // Jedes Formular separat initialisieren forms.forEach(function (form) { var input = form.querySelector('input[name="term"]'); var mode = form.querySelector('select[name="mode"]'); if (!input || !mode) { return; } // Eigener Suchstatus für jedes Formular var state = { currentTerm: "", currentIndex: -1, matches: [] }; // Suche neu starten function startSearch(term) { removeHighlights(); state.currentTerm = term; state.currentIndex = -1; state.matches = findMatches(term); if (state.matches.length > 0) { state.currentIndex = 0; highlightMatch(state.matches, 0); } } // Suche beim Tippen starten input.addEventListener("input", function () { if (mode.value !== "here") { return; } var term = input.value.trim(); if (term !== state.currentTerm) { startSearch(term); } }); // Formular absenden form.addEventListener("submit", function (event) { // Normale Suche für Inhalte und Bilder if (mode.value !== "here") { return; } // Suche auf dieser Seite event.preventDefault(); var term = input.value.trim(); if (!term) { return; } // Falls der Begriff noch nicht gesucht wurde if (term !== state.currentTerm) { startSearch(term); return; } // Falls keine Ergebnisse vorhanden sind if (state.matches.length === 0) { showNoMoreResults(term, state); return; } // Zum nächsten Vorkommen springen state.currentIndex++; if (state.currentIndex < state.matches.length) { highlightMatch( state.matches, state.currentIndex ); } else { showNoMoreResults(term, state); } }); }); })();