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;
23 el.classList.remove('focus');
24 el.classList.remove('target');
28 function filterrows(table, match, action) {
29 var rows = table.tBodies[0].rows;
30 for (var i = 0; i < rows.length; i++) {
31 filtercell(rows[i], match(rows[i]), action);
35 function filtertable(query, action) {
36 var table = document.getElementsByTagName('TABLE')[0];
39 var match = /^([-+?=]?)(.*)/.exec(query);
41 case '+': action = 'add'; break;
42 case '-': action = 'remove'; break;
43 case '?': action = 'toggle'; break;
44 case '=': action = 'filter'; break;
49 if (/^[A-Z0-9 ]{2,}$/.test(query)) {
50 // category title if all uppercase
51 var match = function(row) {
52 return row.cells[0].title.match(query, 'i');
56 // title text (case-insensitive unless caps in input)
57 var match = function(row) {
58 return row.cells[1].textContent.match(query, /[A-Z]/.test(query) ? '' : 'i');
61 filterrows(table, match, action || 'filter');
64 function newelement(tagname, attrlist, childlist) {
65 if (!attrlist) return document.createTextNode(tagname);
66 var el = document.createElement(tagname);
67 for (var name in attrlist)
68 el.setAttribute(name, attrlist[name]);
69 if (childlist) for (var i = 0; i < childlist.length; i++)
70 el.appendChild(childlist[i]);
74 function prependsearch(target) {
75 target.parentNode.insertBefore(newelement(
79 onsubmit: "filtertable(this.q.value); this.q.value = ''; return false",
85 onkeyup: "filtertable(this.value, this.value.length > 1 ? 'focus' : 'reset')",
90 onclick: "filtertable(this.form.q.value, 'target')",
92 newelement('input', {type:'submit', value:'filter'}),