1 /* MarkTree JavaScript code
\r
3 * Distributed under the terms of the MIT License.
\r
4 * See "LICENCE.MIT" or http://www.opensource.org/licenses/mit-license.php for details.
\r
6 * Software distributed under the License is distributed on an "AS IS" basis,
\r
7 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
\r
8 * for the specific language governing rights and limitations under the
\r
11 * Miika Nurminen, 12.7.2004.
\r
14 /* cross-browser (tested with ie5, mozilla 1 and opera 5) keypress detection */
\r
15 function get_keycode(evt) {
\r
17 code = document.layers ? evt.which
\r
18 : document.all ? event.keyCode // event.keyCode!=evt.keyCode!
\r
22 code=evt.which; // for NS
\r
27 var listnodes = null;
\r
29 var lastnodetype=''; // determines if node is a link, input or text;
\r
31 // up, left, down, right, keypress codes
\r
33 //var keys = new Array(105,106,107,108);
\r
35 //var keys = new Array(56,52,50,54);
\r
37 // var press2 = new Array(119,97,115,100);
\r
38 var press = new Array(47,45,42,43);
\r
41 // var keys2=new Array(87,65,83,68);
\r
42 var keys= new Array(38,37,40,39);
\r
44 // keyset 1 = keydown, otherwise press
\r
45 function checkup(keyset,n) {
\r
46 if (keyset==1) return (n==keys[0]);
\r
47 return ((n==press[0]) /*|| (n==press2[0])*/)
\r
50 function checkdn(keyset,n) {
\r
51 if (keyset==1) return (n==keys[2]);
\r
52 return ((n==press[2]) /*|| (n==press2[2])*/)
\r
55 function checkl(keyset,n) {
\r
56 if (keyset==1) return (n==keys[1]);
\r
57 return ((n==press[1]) /*|| (n==press2[1])*/)
\r
60 function checkr(keyset,n) {
\r
61 if (keyset==1) return (n==keys[3]);
\r
62 return ((n==press[3]) /*|| (n==press2[3])*/)
\r
69 function is_exp(n) {
\r
70 if (n==null) return false;
\r
71 return ((n.className=='exp') || (n.className=='exp_active'));
\r
74 function is_col(n) {
\r
75 if (n==null) return false;
\r
76 return ((n.className=='col') || (n.className=='col_active'));
\r
79 function is_basic(n) {
\r
80 if (n==null) return false;
\r
81 return ((n.className=='basic') || (n.className=='basic_active'));
\r
86 /* returns i>=0 if true */
\r
87 function is_active(node) {
\r
88 if (node.className==null) return false
\r
89 return node.className.indexOf('_active');
\r
92 function toggle_class(node) {
\r
93 if ((node==null) || (node.className==null)) return;
\r
96 i = str.indexOf('_active');
\r
98 result= str.substr(0,i);
\r
100 result= str+"_active";
\r
101 node.className=result;
\r
105 function activate(node) {
\r
106 node.style.backgroundColor='#eeeeff';
\r
109 function deactivate(node) {
\r
110 node.style.backgroundColor='#ffffff';
\r
113 function is_list_node(n) {
\r
114 if (n==null) return false;
\r
115 if (n.className==null) return false;
\r
116 if ( (is_exp(n)) ||
\r
119 return true; else return false;
\r
123 function get_href(n) {
\r
124 alist=n.attributes;
\r
126 hr = alist.getNamedItem('href');
\r
127 if (hr!=null) return hr.nodeValue;
\r
129 if (n.childNodes.length==0) return '';
\r
130 for (var i=0; i<n.childNodes.length; i++) {
\r
131 s = get_href(n.childNodes[i]);
\r
132 if (s!='') return s;
\r
137 function get_link(n) {
\r
138 if (n==null) return null;
\r
139 if (n.style==null) return null;
\r
141 // disabling uncontrolled recursion to prevent error messages on IE
\r
142 // when trying to focus to invisible links (readonly mode)
\r
143 // alert(n.nodeName+' '+n.className);
\r
144 if ((n.nodeName=='UL') && (n.className=='sub')) return null;
\r
146 if (n.nodeName=='A') return n;
\r
147 if (n.childNodes.length==0) return null;
\r
148 for (var i=0; i<n.childNodes.length; i++) {
\r
149 s = get_link(n.childNodes[i]);
\r
150 if (s!=null) return s;
\r
155 function set_lastnode(n) {
\r
156 /*var d = new Date();
\r
157 var t_mil = d.getMilliseconds();*/
\r
158 // testattu nopeuksia explorerilla, ei merkittäviä eroja
\r
159 if (lastnode==n) return;
\r
160 /* deactivate(lastnode)
\r
162 activate(lastnode);*/
\r
164 if (is_active(lastnode)>=0)
\r
165 toggle_class(lastnode);
\r
167 if (!(is_active(lastnode)>=0))
\r
168 toggle_class(lastnode);
\r
171 /*var d2 = new Date();
\r
172 var t_mil2 = d2.getMilliseconds();
\r
173 window.alert(t_mil2-t_mil);*/
\r
176 function next_list_node() {
\r
177 tempIndex = list_index;
\r
178 while (tempIndex<listnodes.length-1) {
\r
180 var x = listnodes[tempIndex];
\r
181 if (is_list_node(x)) {
\r
182 list_index=tempIndex;
\r
188 function prev_list_node() {
\r
189 tempIndex = list_index;
\r
190 while (tempIndex>0) {
\r
192 var x = listnodes[tempIndex];
\r
193 if (is_list_node(x)) {
\r
194 list_index=tempIndex;
\r
202 function getsub (li) {
\r
203 if (li.childNodes.length==0) return null;
\r
204 for (var c = 0; c < li.childNodes.length; c++)
\r
205 if ( (li.childNodes[c].className == 'sub') || (li.childNodes[c].className == 'subexp') )
\r
206 return li.childNodes[c];
\r
209 function find_listnode_recursive (li) {
\r
210 if (is_list_node(li)) return li;
\r
211 if (li.childNodes.length==0) return null;
\r
213 for (var c = 0; c < li.childNodes.length; c++) {
\r
214 result=find_listnode_recursive(li.childNodes[c]);
\r
215 if (result!=null) return result;
\r
220 function next_child_listnode(li) {
\r
222 for (var i=0; i<li.childNodes.length; i++) {
\r
223 result=find_listnode_recursive(li.childNodes[i]);
\r
224 if (result!=null) return result;
\r
229 function next_actual_sibling_listnode(li) {
\r
230 if (li==null) return null;
\r
233 var n = temp.nextSibling;
\r
235 n=parent_listnode(temp);
\r
236 return next_actual_sibling_listnode(n);
\r
238 if (is_list_node(n)) return n;
\r
243 function next_sibling_listnode(li) {
\r
244 if (li==null) return null;
\r
247 if (is_col(temp)) return next_child_listnode(temp);
\r
249 var n = temp.nextSibling;
\r
251 n=parent_listnode(temp);
\r
252 return next_actual_sibling_listnode(n);
\r
254 if (is_list_node(n)) return n;
\r
259 function last_sibling_listnode(li) {
\r
260 if (li==null) return null;
\r
264 var n = temp.nextSibling;
\r
265 if (is_list_node(temp))
\r
268 if (is_col(last)) return last_sibling_listnode(next_child_listnode(last));
\r
275 function prev_sibling_listnode(li) {
\r
276 if (li==null) return null;
\r
280 n = temp.previousSibling;
\r
282 return parent_listnode(li);
\r
284 if (is_list_node(n)) {
\r
286 return last_sibling_listnode(next_child_listnode(n));
\r
297 function parent_listnode(li) {
\r
298 // added 12.7.2004 to prevent IE error when readonly mode==true
\r
299 if (li==null) return null;
\r
303 if (n==null) return null;
\r
304 if (is_list_node(n)) return n;
\r
308 function getVisibleParents(id) {
\r
309 var n = document.getElementById(id);
\r
312 n = parent_listnode(n);
\r
313 if (n==null) return;
\r
317 function onClickHandler (evt) {
\r
318 if (lastnode==null)
\r
320 listnodes = document.getElementsByTagName('li');
\r
321 lastnode=listnodes[1];
\r
326 var target = evt ? evt.target : event.srcElement;
\r
327 if (!is_list_node(target)) return;
\r
329 set_lastnode(target);
\r
333 function expand(node) {
\r
334 if (!is_exp(node)) return;
\r
335 if (node.className=='exp_active')
\r
336 node.className='col_active';
\r
338 node.className='col';
\r
339 setSubClass(node,'subexp');
\r
340 // getsub(node).className='subexp';
\r
343 function collapse(node) {
\r
344 if (!is_col(node)) return;
\r
346 if (node.className=='col_active')
\r
347 node.className='exp_active'
\r
349 node.className='exp';
\r
351 setSubClass(node,'sub');
\r
352 // getsub(node).className='sub';
\r
356 function setSubClass(node,name) {
\r
357 sub = getsub(node);
\r
358 if (sub==null) return;
\r
359 sub.className=name;
\r
362 function toggle(target) {
\r
363 if (!is_list_node(target)) return;
\r
364 if (is_col(target)) {
\r
365 target.className='exp';
\r
366 setSubClass(target,'sub');
\r
367 // getsub(target).className='sub';
\r
369 else if (is_exp(target)) {
\r
370 target.className='col';
\r
371 setSubClass(target,'subexp');
\r
372 // getsub(target).className='subexp';
\r
377 function expandAll(node) {
\r
378 if (node.className=='exp') {
\r
379 node.className='col';
\r
380 setSubClass(node,'subexp');
\r
381 // getsub(node).className='subexp';
\r
384 if (node.childNodes!=null)
\r
385 // if (node.hasChildNodes())
\r
386 for ( i = 0; i<node.childNodes.length; i++)
\r
387 expandAll(node.childNodes[i]);
\r
390 function collapseAll(node) {
\r
391 if (node.className=='col') {
\r
392 node.className='exp';
\r
393 setSubClass(node,'sub');
\r
394 // getsub(node).className='sub';
\r
397 if (node.childNodes!=null)
\r
398 // for opera if (node.hasChildNodes())
\r
399 for ( i = 0; i<node.childNodes.length; i++)
\r
400 collapseAll(node.childNodes[i]);
\r
405 function unFocus(node) {
\r
406 // unfocuses potential link that is to be hidden (if a==null there is no link so it should not be blurred).
\r
407 // tested with mozilla 1.7, 12.7.2004. /mn (
\r
408 intemp=parent_listnode(node);
\r
409 a = get_link(intemp); // added 6.4. to get keyboard working with
\r
410 // moved before collapse to prevent an error message with IE when readonly==true
\r
411 if (a!=null) a.blur(); // netscape after collapsing a focused node
\r
415 // mode: 0==keypress, 1==keyup
\r
416 function keyfunc(evt,mode) {
\r
417 var c = get_keycode(evt);
\r
421 if (lastnode==null) {
\r
422 listnodes = document.getElementsByTagName('li');
\r
423 lastnode=listnodes[1];
\r
428 if (checkup(mode,c)) { // i
\r
429 temp=prev_sibling_listnode(lastnode);
\r
431 else if (checkdn(mode,c)) { // k
\r
432 temp=next_sibling_listnode(lastnode);
\r
434 else if (checkr(mode,c)) { // l
\r
436 // temp=next_child_listnode(lastnode);
\r
437 // if (temp==null) {
\r
438 a = get_link(lastnode);
\r
439 if (a!=null) a.focus(); else self.focus();
\r
442 else if (checkl(mode,c)) { // j
\r
443 if (is_col(lastnode)) {
\r
445 collapse(lastnode);
\r
448 temp=unFocus(lastnode);
\r
451 // if (temp==null) lastnode.focus(); // forces focus to correct div (try mozilla typesearch) (doesn't seem to work -mn/6.4.2004)
\r
454 if (temp!=null) set_lastnode(temp);
\r
456 // alert('pressed ' + String.fromCharCode(c) + '(' + c + ')');
\r
461 function keytest (evt) {
\r
462 return keyfunc(evt,1);
\r
466 function presstest (evt) {
\r
467 return keyfunc(evt,0);
\r
471 document.onclick = onClickHandler;
\r
472 document.onkeypress = presstest;
\r
473 document.onkeyup = keytest;
\r