993e8f458cc76ae300971d4c9532a2beb2f6d7af
[sheet.git] / keys.js
1 function setmode(classname) {
2         // set style for each #rows>li>ul>li to display:none unless it matches classname
3         var showclass = classname ? '^mode '+classname+'(?!\\w)' : '^(?!mode)';
4         var rows = document.getElementById('rows').getElementsByTagName('TR');
5         for (var i = 0; i < rows.length; i++) {
6                 var el = rows[i];
7                 el.style.display = el.className.match(showclass) ? 'block' : 'none';
8         }
9
10         // update H2 to reflect the first part of a currently active (but hidden) row header
11         var h3s = document.getElementsByTagName('TH');
12         for (var i = 0; i < h3s.length; i++) {
13                 if (h3s[i].parentNode.style.display != 'block') continue;
14                 document.getElementsByTagName('H2')[0].innerHTML = h3s[i].firstChild.data;
15         }
16 }
17
18 var keyfocus = undefined;
19 document.onkeypress = function(e) {
20         var keylabels = document.getElementById('rows').getElementsByTagName('B');
21         var keys = {};
22         for (var i = 0; i < keylabels.length; i++) {
23                 keys[keylabels[i].innerHTML] = keylabels[i].parentNode;
24         }
25         var input = e.charCode || e.keyCode;
26
27         // find key element matching input
28         for (var i = 0; i < keylabels.length; i++) {
29                 var key = keylabels[i].parentNode;
30                 if (!key.onclick) continue; // link
31                 var keychar = key.className.match(/ chr(\d+)$/);
32                 if (!keychar) continue; // has code
33                 keychar = keychar[1];
34                 if (keychar != input) continue; // matches code
35
36                 // match mode (visibility)
37                 var row = key.parentNode;
38                 var shown = row.style.display != 'none';
39                 if (!shown) continue;
40
41                 // match key modifiers
42                 var keymod = row.className;
43                 if ((keymod.search(/\bctrl\b/) != -1) != e.ctrlKey) continue;
44                 if ((keymod.search(/\bmeta\b/) != -1) != e.altKey) continue;
45
46                 // select
47                 if (keyfocus) keyfocus.style.outline = '';
48                 key.style.outline = '1px solid red';
49                 keyfocus = key;
50                 if (key.onclick) key.onclick();
51                 return false;
52         }
53 }