PageSourceSearch

https://swh.de/assets/js/swh_default-VXzizUs.js

js swh.de collected 2026-09-24 11:20:41 UTC 13,182 bytes, 388 lines download raw bytes

1/** #START# Tabs und Slider Template */
2/**
3 * Wenn Option aus Pseudo Select ausgewählt
4 *
5 * @param dropdown HTML Select Element "this" angeben
6 */
7window.showTab = function showTab( dropdown ){
8    $('#' + dropdown).tab('show');
9}
10
11/**
12 * Wenn oben auf Pills geklickt
13 *
14 * @param navPill button element der navigation "this" angeben
15 * @param selectID string ID des zu verknüpfenden Selects
16 */
17window.selectSelectOptionForNavPill = function selectSelectOptionForNavPill(navPill, selectID){
18    let select = document.getElementById(selectID);
19    select.children[0].innerHTML = navPill.innerHTML;
20
21    let selectItems = select.children[1].children;
22
23    for(let child = 0; child < selectItems.length; child++){
24        if(selectItems[child].innerHTML !== navPill.innerHTML){
25            selectItems[child].removeAttribute("hidden");
26            selectItems[child].removeAttribute("class");
27        } else {
28            selectItems[child].setAttribute("class", "pills-to-same-as-selected");
29            selectItems[child].setAttribute("hidden", "hidden");
30        }
31    }
32}
33
34/**
35 * Ein und ausblenden der custom Pseudo-Selectboxen
36 *
37 * @param selectElement html Element über "this" übergeben
38 */
39window.toggleSelect = function toggleSelect(selectElement){
40    selectElement.nextElementSibling.classList.toggle("pills-to-select-hide");
41    selectElement.classList.toggle("pills-to-select-arrow-active");
42}
43
44/**
45 * @param itemElement html Element über "this" übergeben
46 */
47window.setSelectItem = function setSelectItem(itemElement){
48    let displayItem = itemElement.parentNode.previousElementSibling;
49    let selectLength = itemElement.parentNode.children.length;
50
51    displayItem.innerHTML = itemElement.innerHTML;
52
53    for (let child = 0; child < selectLength; child++) {
54        if(itemElement !== itemElement.parentNode.children[child]){
55            itemElement.parentNode.children[child].removeAttribute("hidden");
56            itemElement.parentNode.children[child].removeAttribute("class");
57        }
58    }
59    itemElement.setAttribute("class", "pills-to-same-as-selected");
60    itemElement.setAttribute("hidden", "hidden");
61
62    toggleSelect(displayItem);
63}
64
65/**
66 * Scrolling der Pill-Tabs
67 */
68let scrollInterval;
69
70/**
71 *
72 * @param containerID
73 * @param buttonLeft
74 * @param direction
75 * @param speed Zeit zwischen dem erneuten Ausführen des Intervalls. Je kleiner die Zahl, umso schneller das Scrolling
76 */
77window.startScroll = function startScroll(containerID, buttonLeft, direction, speed = 5) {
78    // simulating hold event
79    scrollInterval = setInterval(function() {
80        document.getElementById(containerID).scrollLeft += direction;
81        if(document.getElementById(containerID).scrollLeft === 0){
82            document.getElementById(buttonLeft).style.display = "none";
83        } else if(document.getElementById(containerID).scrollLeft > 20) {
84            document.getElementById(buttonLeft).style.display = "block";
85        }
86    }, speed);
87}
88
89window.stopScroll = function stopScroll(){
90    clearInterval(scrollInterval);
91}
92/** #END# Tabs und Slider Template */
93
94/**
95 * allgemeine Hide / Visible Funktion
96 */
97window.toggleElementHidden = function toggleElementHidden(id) {
98    let element = document.getElementById(id);
99    element.hidden = !element.hidden;
100}
101
102/**
103 * allgemeine Toggle Slide Funktion
104 */
105window.toggleElementSlide = function toggleElementSlide(id, speed = 160, easing = 'linear') {
106    let element = $('#' + id);
107    element.slideToggle(speed, easing);
108}
109
110/**
111 *  Funktion zum Ersetzen einer Klasse
112 *
113 *  Base Klasse ist die Standardmäßig gesetzte Klasse die im Tamplate eingetragen ist und change Klass bezeichnet die
114 *  Klasse, zu der die Base Klasse gewechselt werden soll.
115 *
116 * @param element HTML Element (mit 'this' übergeben)
117 * @param baseClass String Klassenname
118 * @param changeClass String Klassenname
119 */
120window.changeClass = function changeClass(element, baseClass, changeClass) {
121    if (element.classList.contains(baseClass)) {
122        element.classList.remove(baseClass);
123        element.classList.add(changeClass);
124    } else {
125        element.classList.remove(changeClass);
126        element.classList.add(baseClass);
127    }
128}
129
130
131window.ajaxTest = function ajaxTest(outputElement) {
132    $.get("/ajaxTest", function(data){
133        $("#"+outputElement).html(data);
134    });
135}
136
137/**
138 * Für Fahrtenplaner - Straßenliste
139 *
140 * @param datalist
141 * @param searchQuery
142 */
143window.fillDatalistWithHaconserviceSuggestions = function fillDatalistWithHaconserviceSuggestions(datalist, searchQuery){
144    $.ajax({
145        url: "/get_hacon_stations",
146        data: {query : searchQuery},
147        dataType:"json",
148        success: function(response){
149
150            console.log(response);
151            datalist.innerHTML='';
152            fillDatalistWithArray(datalist, response)
153        }
154    });
155}
156
157/**
158 * Fahrtenplaner Widget Form weiterleiten
159 */
160window.sendFormFahrtenplaner = function sendFormFahrtenplaner(route, target,
161                                                              startStationField = 'start-station',
162                                                              endStationField = 'end-station',
163                                                              dateField = 'date',
164                                                              timeField = 'time',
165                                                              timeSelField = 'timeSel') {
166
167    let startStation = encodeURI(document.getElementById(startStationField).value);
168    let endStation = encodeURI(document.getElementById(endStationField).value);
169    let date = encodeURI(document.getElementById(dateField).value);
170    let time = encodeURI(document.getElementById(timeField).value);
171    let timeSel = encodeURI(document.querySelector('input[name="'+timeSelField+'"]:checked').value);
172
173    let tempDate = new Date();
174    if(date !== null && date !== ''){
175        tempDate = new Date(date);
176    }
177    date = [tempDate.getDate(), tempDate.getMonth() + 1, tempDate.getFullYear()].join('.');
178
179    window.open(route + 'TP&S=' + startStation + '&Z=' + endStation + '&date=' + date + '&time=' + time + '&timeSel=' + timeSel +'#HafasWebApp', target);
180}
181
182/**
183 * Haltestellen Widget Form weiterleiten
184 * (Abfahrtszeiten einer Haltestelle)
185 */
186window.sendFormHaltestellen = function sendFormHaltestellen(route, target,
187                                                            fromStationField = 'from-station',
188                                                            dateField = 'from-date',
189                                                            timeField = 'from-time') {
190
191    let fromStation = encodeURI(document.getElementById(fromStationField).value);
192    let date = encodeURI(document.getElementById(dateField).value);
193    let time = encodeURI(document.getElementById(timeField).value);
194
195    let tempDate = new Date();
196    if(date !== null && date !== ''){
197        tempDate = new Date(date);
198    }
199    date = [tempDate.getDate(), tempDate.getMonth() + 1, tempDate.getFullYear()].join('.');
200
201    window.open(route + 'SQ&input=' + fromStation + '&date=' + date + '&time=' + time +'#HafasWebApp', target);
202}
203
204/**
205 *
206 * @param datalist html element of the datalist (this or getElement)
207 * @param array array wich elements will be converted to single datalist elements
208 */
209window.fillDatalistWithArray = function fillDatalistWithArray(datalist, array){
210    for (let element in array){
211        let option = document.createElement('option');
212        option.value = array[element];
213        datalist.appendChild(option);
214    }
215}
216
217/**
218 * Tauscht die Werte von 2 Eingabefeldern Miteinander.
219 * Hierfor die ID's der beiden Elemente übergeben.
220 *
221 * @param firstElementID
222 * @param secondElementID
223 */
224window.switchFieldValue = function switchFieldValue(firstElementID, secondElementID){
225    let firstValue = document.getElementById(firstElementID).value;
226    let secondValue = document.getElementById(secondElementID).value;
227
228    document.getElementById(firstElementID).value = secondValue;
229    document.getElementById(secondElementID).value = firstValue;
230}
231
232$('#mainmenu')
233
234    // Das Event shown.bs.collapse wird beim Öffnen der Bootstrap-Navbar ausgelöst
235    .on('shown.bs.collapse', function (event) {
236        if (event.target.id === 'mainmenu') {
237            // die Klasse overflow-hidden am BODY verhindert das Scrollen des normalen Inhalts, wenn die mobile Navbar offen ist
238            $('body').addClass('overflow-hidden');
239            // die Klasse overflow-y-auto am #mainmenu sorgt für ein scrollbares Menü in der mobilen Version
240            $('#mainmenu').addClass('overflow-y-auto');
241        }
242    })
243
244    // Das Event hidden.bs.collapse wird beim Schließen der Bootstrap-Navbar ausgelöst
245    .on('hidden.bs.collapse', function (event) {
246        if (event.target.id === 'mainmenu') {
247            $('body').removeClass('overflow-hidden');
248            $('#mainmenu').removeClass('overflow-y-auto');
249        }
250    })
251;
252
253window.movingImageShowLink = function movingImageShowLink(linkID){
254    document.getElementById(linkID).classList.add('text-primary');
255}
256
257window.movingImageHideLink = function movingImageHideLink(linkID){
258    document.getElementById(linkID).classList.remove('text-primary');
259}
260
261/**
262 * Entfernt das hidden Attribut vom Element dessen ID übergeben wurde.
263 *
264 * @param elementID
265 */
266window.showElement = function (elementID){
267    $('#' + elementID).removeAttr('hidden');
268}
269
270
271/**
272 * Fügt das hidden Attribut zum Element dessen ID übergeben wurde hinzu.
273 *
274 * @param elementID
275 */
276window.hideElement = function (elementID){
277    $('#' + elementID).attr('hidden', true);
278}
279
280/**
281 * Ändert den value des Elementes mit der übergebenen ID auf den übergebenen Wert
282 *
283 * @param elementID
284 * @param value
285 */
286window.setElementValue = function (elementID, value){
287    document.getElementById(elementID).value = value;
288}
289
290/**
291 * Setzt innerhalb des Containers bei allen input elementen die das data-required attribute haben das attribute required
292 * oder nimmt es wieder weg.
293 *
294 * @param containerID
295 */
296window.toggleRequiredElements = function (containerID){
297    let container = document.getElementById(containerID);
298
299    let inputs = container.getElementsByTagName('input');
300
301    Array.from(inputs).forEach(function (element){
302        if (element.hasAttribute('data-required')){
303            element.required = !element.required;
304        }
305    })
306
307    let selects = container.getElementsByTagName('select');
308
309    Array.from(selects).forEach(function (element){
310        if (element.hasAttribute('data-required')){
311            element.required = !element.required;
312        }
313    })
314}
315
316/**
317 * Überträgt den übergebenen Wert als innerHTML an das element mit der übergebenen ID
318 *
319 * @param value
320 * @param elementID
321 */
322window.transferValueToInnerHTML = function (value, elementID){
323    document.getElementById(elementID).innerHTML = value;
324}
325
326/**
327 * Teilt die IBAN bei eingabe automatisch in 4er-Blöcke mit Leerzeichentrennung auf
328 * @param field html element des Feldes das getrennt werden soll (this)
329 */
330window.autoSpaceIBAN = function (field){
331    field.value = field.value.replace(/[^\da-zA-Z]/g, '').replace(/(.{4})/g, '$1 ').trim();
332}
333
334/**
335 * Blendet ein über die ID verknüpftes html element beim Auswählen einer select option ein und alle anderen verknüpften
336 * Elemente aus.
337 * Die Verknüpfung zwischen der Select-Option und dem HTML Element erfolgt über das Pseudoattribute "linked-element='[Element-ID]'" innerhalb der select option
338 *
339 *  @param select
340 */
341window.selectToggleLinkedElements = function (select) {
342    Array.from(select.options).forEach(function (option) {
343        if (option === select.options[select.selectedIndex]){
344            document.getElementById(option.getAttribute('linked-element')).hidden = false;
345        } else {
346            document.getElementById(option.getAttribute('linked-element')).hidden = true;
347        }
348    });
349}
350
351/**
352 * Überprüft ob der im Inputfeld eingegeben Wert innerhalb des zugehörigen datalist Element vorhenden ist, zeigt ggf.
353 * eine Feglermeldung an und setzt den Eingabewert zurück.
354 *
355 * @param inputElement
356 * @param feedbackElement
357 */
358window.requireElementFromDatalist = function (inputElement, feedbackElement) {
359    let datalist = document.getElementById(inputElement.getAttribute('list'));
360    let value = inputElement.value;
361
362    if (value !== '' && !valueInDatalist(value, datalist)) {
363        feedbackElement.classList.remove('d-none');
364        feedbackElement.classList.add('d-block');
365        feedbackElement.innerHTML = 'Bitte wählen Sie einen Eintrag aus der Liste aus.';
366
367        inputElement.value = '';
368    } else {
369        feedbackElement.classList.remove('d-block');
370        feedbackElement.classList.add('d-none');
371        feedbackElement.innerHTML = '';
372    }
373}
374
375/**
376 * Überprüft ob der übergebene Wert eine der Options des übergebenen datalist Elements ist.
377 *
378 * @param value
379 * @param datalist
380 * @returns {boolean}
381 */
382window.valueInDatalist = function (value, datalist){
383    if(document.querySelector("#" + datalist.id + " option[value='" + value + "']") === null){
384        return false;
385    }
386
387    return true;
388}

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.