(function () { var BAR_ID = 'fb-inline-search'; function q(sel, root) { return (root || document).querySelector(sel); } function qa(sel, root) { return Array.from((root || document).querySelectorAll(sel)); } function ensureBar() { var bar = q('#' + BAR_ID); if (bar) return bar; bar = document.createElement('div'); bar.id = BAR_ID; bar.innerHTML = '' + '' + '' + ''; document.body.appendChild(bar); var input = q('#fb-inline-search-input', bar); var clearBtn = q('.fb-clear', bar); input.addEventListener('input', applyFilter); input.addEventListener('keydown', function (e) { if (e.key === 'Escape') { input.value = ''; applyFilter(); } }); clearBtn.addEventListener('click', function () { input.value = ''; applyFilter(); input.focus(); }); return bar; } function getItems() { var nodes = qa('#listing .item, #listing [data-type], #listing tr, #listing li'); var seen = new Set(); return nodes.filter(function (el) { if (!el || seen.has(el)) return false; seen.add(el); return !!(el.querySelector('.name') || el.getAttribute('data-type') || (el.textContent || '').trim()); }); } function getName(el) { var n = q('.name', el); if (n && n.textContent) return n.textContent.trim(); var a = q('a', el); if (a && a.textContent) return a.textContent.trim(); return (el.textContent || '').trim(); } function setVisible(el, show) { if (show) { if (el.dataset.fbOrigDisplay !== undefined) { el.style.display = el.dataset.fbOrigDisplay; delete el.dataset.fbOrigDisplay; } else { el.style.removeProperty('display'); } el.removeAttribute('data-fb-hidden'); return; } if (el.dataset.fbOrigDisplay === undefined) { el.dataset.fbOrigDisplay = el.style.display || ''; } el.style.display = 'none'; el.setAttribute('data-fb-hidden', '1'); } function applyFilter() { var bar = ensureBar(); var input = q('#fb-inline-search-input', bar); var count = q('.fb-count', bar); var query = (input.value || '').trim().toLowerCase(); var items = getItems(); var shown = 0; items.forEach(function (el) { var ok = !query || getName(el).toLowerCase().indexOf(query) !== -1; setVisible(el, ok); if (ok) shown += 1; }); count.textContent = query ? (shown + '/' + items.length) : ''; } function focusSearch() { var input = q('#fb-inline-search-input') || q('#fb-inline-search-input', ensureBar()); if (!input) return; input.focus(); input.select(); } function intercept(evt) { var ctrlF = evt.type === 'keydown' && (evt.ctrlKey || evt.metaKey) && (evt.key === 'f' || evt.key === 'F'); var btn = evt.type === 'click' && evt.target && evt.target.closest && evt.target.closest('.search-button'); if (!ctrlF && !btn) return; evt.preventDefault(); evt.stopPropagation(); if (evt.stopImmediatePropagation) evt.stopImmediatePropagation(); ensureBar(); focusSearch(); } function closeNativeSearch() { var nativeSearch = q('#search'); if (!nativeSearch) return; nativeSearch.classList.remove('active', 'ongoing'); nativeSearch.style.display = 'none'; document.body.style.overflow = 'auto'; } function bootstrap() { ensureBar(); closeNativeSearch(); applyFilter(); } window.addEventListener('keydown', intercept, true); window.addEventListener('click', intercept, true); var mo = new MutationObserver(function () { closeNativeSearch(); if (q('#fb-inline-search-input') && q('#fb-inline-search-input').value) applyFilter(); }); bootstrap(); mo.observe(document.documentElement, { childList: true, subtree: true }); })();