1 function filtercell(el, set, action) {
4 el.classList[set ? 'add' : 'remove'](action);
7 if (set) el.classList.toggle(action);
10 if (set) el.style.display = 'none';
13 if (set) el.style.display = '';
16 if (set) el.style.display = el.style.display == 'none' ? '' : 'none';
19 el.style.display = set ? '' : 'none';
20 if (!Element.prototype.hasOwnProperty('classList')) return;
21 el.classList.remove('focus');
24 el.classList.remove('focus');
25 el.classList.remove('target');
29 function filterrows(table, match, action) {
30 var rows = table.tBodies[0].rows;
31 for (var i = 0; i < rows.length; i++) {
32 filtercell(rows[i], match && match(rows[i]), action);
36 function filtertable(query, action) {
37 var table = document.getElementsByTagName('TABLE')[0];
40 var match = /^([-+?=]?)(.*)/.exec(query);
42 case '+': action = 'add'; break;
43 case '-': action = 'remove'; break;
44 case '?': action = 'toggle'; break;
45 case '=': action = 'filter'; break;
50 if (/^[A-Z0-9 ]{2,}$/.test(query)) {
51 // category title if all uppercase
52 var match = function(row) {
53 return row.cells[0].title.match(query, 'i');
56 else if (action == 'focus' && query.length <= 1) {
57 // prevent superfluous highlighting
61 // title text (case-insensitive unless caps in input)
62 var match = function(row) {
63 return row.cells[1].textContent.match(query, /[A-Z]/.test(query) ? '' : 'i');
66 filterrows(table, match, action || 'filter');
69 function newelement(tagname, attrlist, childlist) {
70 if (!attrlist) return document.createTextNode(tagname);
71 var el = document.createElement(tagname);
72 for (var name in attrlist)
73 el.setAttribute(name, attrlist[name]);
74 if (childlist) for (var i = 0; i < childlist.length; i++)
75 el.appendChild(childlist[i]);
79 function prependsearch(target) {
80 target.parentNode.insertBefore(newelement(
84 onsubmit: "filtertable(this.q.value); this.q.value = ''; return false",
90 onkeyup: "filtertable(this.value, 'focus')",
95 onclick: "filtertable(this.form.q.value, 'target')",
97 newelement('input', {type:'submit', value:'filter'}),