git.shiar.nl
/
sheet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
unicode: replace generic Rs by indian rupee sign
[sheet.git]
/
searchlocal.js
diff --git
a/searchlocal.js
b/searchlocal.js
index ac38dce9501aa502d82dc387095e937ae7880507..512f07b8482cf1bf293e16c09d385a6178fb014a 100644
(file)
--- a/
searchlocal.js
+++ b/
searchlocal.js
@@
-1,4
+1,8
@@
+var filterupdate;
+var filtertoggles = document.body.classList !== undefined;
+
function filtercell(el, set, action) {
function filtercell(el, set, action) {
+ if (set === undefined) return;
switch (action) {
case 'focus':
el.classList[set ? 'add' : 'remove'](action);
switch (action) {
case 'focus':
el.classList[set ? 'add' : 'remove'](action);
@@
-17,8
+21,7
@@
function filtercell(el, set, action) {
break;
case 'filter':
el.style.display = set ? '' : 'none';
break;
case 'filter':
el.style.display = set ? '' : 'none';
- if (!Element.prototype.hasOwnProperty('classList')) return;
- el.classList.remove('focus');
+ if (filtertoggles) el.classList.remove('focus');
break;
default: // reset
el.classList.remove('focus');
break;
default: // reset
el.classList.remove('focus');
@@
-27,20
+30,17
@@
function filtercell(el, set, action) {
}
function filtercols(table, match, action) {
}
function filtercols(table, match, action) {
- var matchloc;
+ var matchloc
= []
;
for (var y = 0; y < table.rows.length; y++) {
var loc = 0;
for (var x = 0; x < table.rows[y].cells.length; x++) {
var cell = table.rows[y].cells[x];
if (y == 0) {
for (var y = 0; y < table.rows.length; y++) {
var loc = 0;
for (var x = 0; x < table.rows[y].cells.length; x++) {
var cell = table.rows[y].cells[x];
if (y == 0) {
- if (match(cell)) {
- if (!matchloc) matchloc = [loc];
- matchloc[1] = loc + cell.colSpan;
- filtercell(table.children.item(x+2), true, action); // colgroup
- }
+ var res = match(cell);
+ for (var i = loc; i < loc + cell.colSpan; i++) matchloc[i] = res;
+ filtercell(table.children.item(x), res, action); // colgroup
}
}
- var keep = matchloc && loc >= matchloc[0] && loc < matchloc[1];
- filtercell(cell, keep, action);
+ filtercell(cell, matchloc[loc], action);
loc += cell.colSpan;
}
}
loc += cell.colSpan;
}
}
@@
-54,6
+54,8
@@
function filterrows(table, match, action) {
}
function filtertable(query, action) {
}
function filtertable(query, action) {
+ filterupdate = undefined;
+ if (query === undefined) query = document.getElementById('search').q.value;
var table = document.getElementsByTagName('TABLE')[0];
if (!action) {
var table = document.getElementsByTagName('TABLE')[0];
if (!action) {
@@
-67,13
+69,21
@@
function filtertable(query, action) {
query = match[2];
}
query = match[2];
}
+if (document.querySelector !== undefined) {
+ if (query == '' && action == 'add') {
+ // restore all columns if explicitly adding all ("+")
+ filtercols(table, function(){return true}, 'add');
+ // continue to restore rows
+ }
if (/^[a-z_]+$/.test(query) && document.querySelector('.b-a-'+query)) {
// column if class b-a-* exists
var match = function(th) {
if (/^[a-z_]+$/.test(query) && document.querySelector('.b-a-'+query)) {
// column if class b-a-* exists
var match = function(th) {
+ if (!/\bb-a-/.test(th.className)) return;
return new RegExp('-'+query+'\\b').test(th.className);
}
return filtercols(table, match, action || 'toggle');
}
return new RegExp('-'+query+'\\b').test(th.className);
}
return filtercols(table, match, action || 'toggle');
}
+}
if (/^[A-Z0-9 ]{2,}$/.test(query)) {
// category title if all uppercase
if (/^[A-Z0-9 ]{2,}$/.test(query)) {
// category title if all uppercase
@@
-108,7
+118,7
@@
function newelement(tagname, attrlist, childlist) {
for (var name in attrlist)
el.setAttribute(name, attrlist[name]);
if (childlist) for (var i = 0; i < childlist.length; i++)
for (var name in attrlist)
el.setAttribute(name, attrlist[name]);
if (childlist) for (var i = 0; i < childlist.length; i++)
- el.appendChild(childlist[i]);
+
if (childlist[i])
el.appendChild(childlist[i]);
return el;
}
return el;
}
@@
-117,20
+127,22
@@
function prependsearch(target) {
'form', {
id: 'search',
'class': 'aside',
'form', {
id: 'search',
'class': 'aside',
- onsubmit: "filtertable(this.q.value); this.q.value = ''; return false",
+ 'className': 'aside', // msie
+ onsubmit: "filtertable(this.q.value); this.q.value = ''; return false"
},
[
newelement('input', {
type: 'search',
name: 'q',
},
[
newelement('input', {
type: 'search',
name: 'q',
- onkeyup: "filtertable(this.value, 'focus')",
+ onkeyup: "if (filtertoggles && !filterupdate) filterupdate = "
+ + "window.setTimeout(filtertable, 300, undefined, 'focus')"
}),
}),
- newelement('input', {
+
filtertoggles &&
newelement('input', {
type: 'button',
value: 'toggle',
type: 'button',
value: 'toggle',
- onclick: "filtertable(this.form.q.value, 'target')"
,
+ onclick: "filtertable(this.form.q.value, 'target')"
}),
}),
- newelement('input', {type:'submit', value:'filter'})
,
+ newelement('input', {type:'submit', value:'filter'})
]
), target);
}
]
), target);
}