From: Mischa POSLAWSKY Date: Tue, 7 Dec 2010 18:39:07 +0000 (+0100) Subject: browser: write out search javascript code X-Git-Tag: v1.4~49 X-Git-Url: http://git.shiar.net/sheet.git/commitdiff_plain/84f409871561a3274afffe221828ee71d850bdb2 browser: write out search javascript code --- diff --git a/searchlocal.js b/searchlocal.js index f0036a6..1a5037f 100644 --- a/searchlocal.js +++ b/searchlocal.js @@ -1,24 +1,44 @@ -function filtertable(query, action) { - var rows = document.getElementsByTagName('TBODY')[0].rows; +function filtercell(el, set, action) { + switch (action) { + case 'focus': + el.classList[set ? 'add' : 'remove'](action); + break; + case 'target': + if (set) el.classList.toggle(action); + break; + case 'filter': + el.style.display = set ? '' : 'none'; + if (!Element.prototype.hasOwnProperty('classList')) return; + // continue + default: // reset + el.classList.remove('focus'); + el.classList.remove('target'); + } +} + +function filterrows(table, match, action) { + var rows = table.tBodies[0].rows; for (var i = 0; i < rows.length; i++) { - var keep = query.match(/^[A-Z0-9 ]{2,}$/) ? rows[i].cells[0].title.match(query, 'i') - : rows[i].cells[1].textContent.match(query, query.match(/[A-Z]/) ? '' : 'i'); - switch (action) { - case 'focus': - rows[i].classList[keep ? 'add' : 'remove'](action); - break; - case 'target': - if (keep) rows[i].classList.toggle(action); - break; - case 'filter': - rows[i].style.display = keep ? '' : 'none'; - if (!Element.prototype.hasOwnProperty('classList')) continue; - // continue - default: // reset - rows[i].classList.remove('focus'); - rows[i].classList.remove('target'); - } + filtercell(rows[i], match(rows[i]), action); + } +} + +function filtertable(query, action) { + var table = document.getElementsByTagName('TABLE')[0]; + + if (/^[A-Z0-9 ]{2,}$/.test(query)) { + // category title if all uppercase + var match = function(row) { + return row.cells[0].title.match(query, 'i'); + }; + } + else { + // title text (case-insensitive unless caps in input) + var match = function(row) { + return row.cells[1].textContent.match(query, /[A-Z]/.test(query) ? '' : 'i'); + }; } + filterrows(table, match, action || 'filter'); } function newelement(tagname, attrlist, childlist) { @@ -36,7 +56,7 @@ function prependsearch(target) { 'form', { id: 'search', 'class': 'aside', - onsubmit: "filtertable(this.q.value, 'filter'); this.q.value = ''; return false", + onsubmit: "filtertable(this.q.value); this.q.value = ''; return false", }, [ newelement('input', {