browser: support filter form without classList
[sheet.git] / searchlocal.js
1 function filtertable(query, action) {
2         var rows = document.getElementsByTagName('TBODY')[0].rows;
3         for (var i = 0; i < rows.length; i++) {
4                 var keep = query.match(/^[A-Z0-9 ]{2,}$/) ? rows[i].cells[0].title.match(query, 'i')
5                         : rows[i].cells[1].textContent.match(query, query.match(/[A-Z]/) ? '' : 'i');
6                 switch (action) {
7                         case 'focus':
8                                 rows[i].classList[keep ? 'add' : 'remove'](action);
9                                 break;
10                         case 'target':
11                                 if (keep) rows[i].classList.toggle(action);
12                                 break;
13                         case 'filter':
14                                 rows[i].style.display = keep ? '' : 'none';
15                                 if (!Element.prototype.hasOwnProperty('classList')) continue;
16                                 // continue
17                         default: // reset
18                                 rows[i].classList.remove('focus');
19                                 rows[i].classList.remove('target');
20                 }
21         }
22 }
23
24 function newelement(tagname, attrlist, childlist) {
25         if (!attrlist) return document.createTextNode(tagname);
26         var el = document.createElement(tagname);
27         for (var name in attrlist)
28                 el.setAttribute(name, attrlist[name]);
29         if (childlist) for (var i = 0; i < childlist.length; i++)
30                 el.appendChild(childlist[i]);
31         return el;
32 }
33
34 function prependsearch(target) {
35         target.parentNode.insertBefore(newelement(
36                 'form', {
37                         id: 'search',
38                         'class': 'aside',
39                         onsubmit: "filtertable(this.q.value, 'filter'); this.q.value = ''; return false",
40                 },
41                 [
42                         newelement('input', {
43                                 type: 'search',
44                                 name: 'q',
45                                 onkeyup: "filtertable(this.value, this.value.length > 1 ? 'focus' : 'reset')",
46                         }),
47                         newelement('input', {
48                                 type: 'button',
49                                 value: 'toggle',
50                                 onclick: "filtertable(this.form.q.value, 'target')",
51                         }),
52                         newelement('input', {type:'submit', value:'filter'}),
53                 ]
54         ), target);
55 }
56