1/** 2 * SCROLL BACK TO TOP BUTTON 3 * When the user scrolls down 40px from the top of the document, show Back-to-Top button 4 */ 5if ($('#btn-back-to-top').length) { 6 $(window).on('scroll', function () { 7 var bodyScrollTop = $(document.body).scrollTop(); 8 var docScrollTop = $(document.documentElement).scrollTop(); 9 10 if (bodyScrollTop > 40 || docScrollTop > 40) { 11 $('#btn-back-to-top').show(); 12 } else { 13 $('#btn-back-to-top').hide(); 14 } 15 }); 16} 17 18/** 19 * OPEN BROWSER PRINT 20 */ 21$(document).on('click', '.function-print', function () { 22 window.print(); 23 return false; 24}); 25 26/** 27 * FILTER ELEMENTS 28 */ 29$('#filter-group').on('submit', function (e) { 30 e.preventDefault(); 31}); 32 33$('#filter-button').on('click', function (e) { 34 e.preventDefault(); 35 filterElements('#filter-text', 'filter-groupping', '#clearBtn'); 36}); 37 38// Clear filter 39$('#clearBtn').on('click', function (e) { 40 e.preventDefault(); 41 42 // Empty input field and focus it 43 $('#filter-text').val('').focus(); 44 45 // Show all results again 46 filterElements('#filter-text', 'filter-groupping', '#clearBtn'); 47}); 48 49function filterElements(filterTextField, dataId, clearButton) { 50 var lang = $('html').attr('lang'); 51 var noResultMessage = lang === 'de' 52 ? "<p role='alert' class='js-filter-no-results'>Es konnten keine Ergebnisse zum gesuchten Begriff <strong id='js-filter-no-results-val'></strong> gefunden werden.</p>" 53 : "<p role='alert' class='js-filter-no-results'>No results for <strong id='js-filter-no-results-val'></strong>.</p>"; 54 55 var groups = $(".js-filter-container[data-id='" + dataId + "'] [data-id='js-filter-group']"); 56 57 var searchText = $(filterTextField).val().toLowerCase(); 58 59 var firstGroupWithResults = null; 60 var containerHasResults = false; 61 62 groups.each(function () { 63 var $group = $(this); 64 var groupHasResults = false; 65 66 var letterRows = $group.find('.filter-group-section'); 67 68 letterRows.each(function () { 69 var $letterRow = $(this); 70 var letterRowHasResults = false; 71 72 var filterResults = $letterRow.find('.overview-item'); 73 74 filterResults.each(function () { 75 var $item = $(this); 76 var title = $item.find('.card-title-heading').text().toLowerCase(); 77 78 if (searchText === '' || title.indexOf(searchText) !== -1) { 79 $item.removeAttr('hidden'); 80 groupHasResults = true; 81 containerHasResults = true; 82 letterRowHasResults = true; 83 } else { 84 $item.attr('hidden', 'hidden'); 85 } 86 }); 87 88 // Show/hide letter row if it does/doesn't have any results 89 if (!letterRowHasResults) { 90 $letterRow.attr('hidden', 'hidden'); 91 } else { 92 $letterRow.removeAttr('hidden'); 93 } 94 }); 95 96 // Show/hide this group if it does/doesn't have any results 97 if (!groupHasResults) { 98 $group.attr('hidden', 'hidden'); 99 } else { 100 $group.removeAttr('hidden'); 101 if (!firstGroupWithResults) { 102 firstGroupWithResults = $group; 103 } 104 } 105 }); 106 107 // Add/remove "no result" message 108 $('.js-filter-no-results').remove(); 109 if (!containerHasResults) { 110 $(noResultMessage).insertAfter('.js-filter-container'); 111 $('#js-filter-no-results-val').text($(filterTextField).val()); 112 } 113 114 // Show/hide clear button 115 if ($(filterTextField).val() === '') { 116 $(clearButton).hide(); 117 } else { 118 $(clearButton).show(); 119 } 120 121 // Open the first section with visible results after filtering 122 // and close the others, to keep UX clean. 123 $(".card-collapse.content-collapse").each(function () { 124 var $section = $(this); 125 var hasVisibleItems = $section.find('.overview-item').filter(function () { 126 return !$(this).is('[hidden]'); 127 }).length > 0;
128 129 var sectionId = $section.attr('id'); 130 if (!sectionId) { 131 return; 132 } 133 var $headerButton = $(".card-collapse-heading button[data-toggle='collapse'][data-target='#" + sectionId + "'], " + 134 ".card-collapse-heading button[data-toggle='collapse'][href='#" + sectionId + "']"); 135 136 if (hasVisibleItems && !firstGroupWithResults) { 137 firstGroupWithResults = $section.closest("[data-id='js-filter-group']"); 138 } 139 if (!hasVisibleItems) { 140 $section.removeClass('show'); 141 $section.attr('aria-expanded', 'false'); 142 $headerButton.attr('aria-expanded', 'false'); 143 } 144 }); 145 146 // Now open the first section body (collapse div) that has results (if any) 147 if (firstGroupWithResults) { 148 var $firstSectionBody = firstGroupWithResults.find('.collapse').first(); 149 var firstSectionId = $firstSectionBody.attr('id'); 150 if (firstSectionId) { 151 var $firstHeaderButton = $(".card-collapse-heading button[data-toggle='collapse'][data-target='#" + firstSectionId + "'], " + 152 ".card-collapse-heading button[data-toggle='collapse'][href='#" + firstSectionId + "']"); 153 154 $firstSectionBody.addClass('show'); 155 $firstSectionBody.attr('aria-expanded', 'true'); 156 $firstHeaderButton.attr('aria-expanded', 'true'); 157 $firstHeaderButton.focus(); 158 } 159 } 160} 161 162 163$(document).on('click', '[data-toggle="collapse"]', function (e) { 164 e.preventDefault(); 165 166 var $trigger = $(this); 167 168 // Determine target selector (#id) 169 var targetSelector = $trigger.attr('data-target') || $trigger.attr('href'); 170 if (!targetSelector) { 171 return; 172 } 173 174 // In case href="#content_block_0" style 175 if (targetSelector.indexOf('#') === -1 && this.hash) { 176 targetSelector = this.hash; 177 } 178 179 var $target = $(targetSelector); 180 if ($target.length === 0) { 181 return; 182 } 183 184 var isShown = $target.hasClass('show'); 185 186 // Toggle show class 187 if (isShown) { 188 $target.removeClass('show'); 189 $target.attr('aria-expanded', 'false'); 190 $trigger.attr('aria-expanded', 'false'); 191 } else { 192 $target.addClass('show'); 193 $target.attr('aria-expanded', 'true'); 194 $trigger.attr('aria-expanded', 'true'); 195 } 196});
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.