]> git.mxchange.org Git - hub-docs.git/blob - mindmaps/Generic Object Sharing Protocol.html_files/marktree.js
MindMap continued and exported to XHTML
[hub-docs.git] / mindmaps / Generic Object Sharing Protocol.html_files / marktree.js
1 /* MarkTree JavaScript code\r
2  * \r
3  * The contents of this file are subject to the Mozilla Public License Version\r
4  * 1.1 (the "License"); you may not use this file except in compliance with\r
5  * the License. You may obtain a copy of the License at\r
6  * http://www.mozilla.org/MPL/\r
7  *\r
8  * Software distributed under the License is distributed on an "AS IS" basis,\r
9  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License\r
10  * for the specific language governing rights and limitations under the\r
11  * License.\r
12  * \r
13  * Miika Nurminen, 12.7.2004.\r
14  */\r
15 \r
16 /* cross-browser (tested with ie5, mozilla 1 and opera 5) keypress detection */\r
17 function get_keycode(evt) {\r
18   // IE\r
19     code = document.layers ? evt.which\r
20            : document.all ? event.keyCode // event.keyCode!=evt.keyCode!\r
21            : evt.keyCode;\r
22 \r
23   if (code==0) \r
24     code=evt.which; // for NS\r
25   return code;\r
26 }\r
27 \r
28 var lastnode=null;\r
29 var listnodes = null;\r
30 var list_index=1;\r
31 var lastnodetype=''; // determines if node is a link, input or text;\r
32 \r
33 // up, left, down, right, keypress codes\r
34 //ijkl\r
35 //var keys = new Array(105,106,107,108);\r
36 //num arrows\r
37 //var keys = new Array(56,52,50,54);\r
38 //wasd\r
39 // var press2 = new Array(119,97,115,100);\r
40  var press = new Array(47,45,42,43);\r
41 \r
42 // keydown codes\r
43   //  var keys2=new Array(87,65,83,68);\r
44   var keys= new Array(38,37,40,39);\r
45 \r
46   // keyset 1 = keydown, otherwise press\r
47 function checkup(keyset,n) {\r
48   if (keyset==1) return (n==keys[0]);\r
49   return ((n==press[0]) /*|| (n==press2[0])*/)\r
50 }\r
51 \r
52 function checkdn(keyset,n) {\r
53   if (keyset==1) return (n==keys[2]);\r
54   return ((n==press[2]) /*|| (n==press2[2])*/)\r
55 }\r
56 \r
57 function checkl(keyset,n) {\r
58   if (keyset==1) return (n==keys[1]);\r
59   return ((n==press[1]) /*|| (n==press2[1])*/)\r
60 }\r
61 \r
62 function checkr(keyset,n) {\r
63   if (keyset==1) return (n==keys[3]);\r
64   return ((n==press[3]) /*|| (n==press2[3])*/)\r
65 }\r
66 \r
67 \r
68 \r
69 \r
70 \r
71 function is_exp(n) {\r
72   if (n==null) return false;\r
73   return ((n.className=='exp') || (n.className=='exp_active'));\r
74 }\r
75 \r
76 function is_col(n) {\r
77   if (n==null) return false;\r
78   return ((n.className=='col') || (n.className=='col_active'));\r
79 }\r
80 \r
81 function is_basic(n) {\r
82   if (n==null) return false;\r
83   return ((n.className=='basic') || (n.className=='basic_active'));\r
84 }\r
85 \r
86 \r
87 \r
88 /* returns i>=0 if true */\r
89 function is_active(node) {\r
90   if (node.className==null) return false\r
91   return node.className.indexOf('_active');\r
92 }\r
93 \r
94 function toggle_class(node) {\r
95   if ((node==null) || (node.className==null)) return;\r
96   str=node.className;\r
97   result="";\r
98   i = str.indexOf('_active');\r
99   if (i>0)\r
100     result= str.substr(0,i);\r
101   else\r
102     result= str+"_active";\r
103   node.className=result; \r
104   return node;\r
105 }\r
106 \r
107 function activate(node) {\r
108   node.style.backgroundColor='#eeeeff';\r
109 }\r
110 \r
111 function deactivate(node) {\r
112    node.style.backgroundColor='#ffffff';\r
113 }\r
114 \r
115 function is_list_node(n) {\r
116   if (n==null) return false;\r
117   if (n.className==null) return false;\r
118   if ( (is_exp(n)) || \r
119        (is_col(n)) ||\r
120        (is_basic(n)) )\r
121    return true; else return false;\r
122 }\r
123 \r
124 \r
125 function get_href(n) {\r
126   alist=n.attributes;\r
127   if (alist!=null) {\r
128     hr = alist.getNamedItem('href');\r
129     if (hr!=null) return hr.nodeValue;\r
130   }\r
131   if (n.childNodes.length==0) return '';\r
132   for (var i=0; i<n.childNodes.length; i++) {\r
133     s = get_href(n.childNodes[i]);\r
134     if (s!='') return s;\r
135   }\r
136   return '';\r
137 }\r
138 \r
139 function get_link(n) {\r
140   if (n==null) return null;\r
141   if (n.style==null) return null;\r
142 \r
143  // disabling uncontrolled recursion to prevent error messages on IE\r
144  // when trying to focus to invisible links (readonly mode)\r
145 //    alert(n.nodeName+' '+n.className);\r
146   if ((n.nodeName=='UL') && (n.className=='sub')) return null;\r
147 \r
148   if (n.nodeName=='A') return n;\r
149   if (n.childNodes.length==0) return null;\r
150   for (var i=0; i<n.childNodes.length; i++) {\r
151     s = get_link(n.childNodes[i]);\r
152     if (s!=null) return s;\r
153   }\r
154   return null;\r
155 }\r
156 \r
157 function set_lastnode(n) {\r
158 /*var d = new Date();\r
159 var t_mil = d.getMilliseconds();*/\r
160 // testattu nopeuksia explorerilla, ei merkittäviä eroja\r
161   if (lastnode==n) return; \r
162 /*  deactivate(lastnode)\r
163   lastnode=n;\r
164   activate(lastnode);*/\r
165 \r
166   if (is_active(lastnode)>=0)\r
167     toggle_class(lastnode);\r
168   lastnode=n;\r
169   if (!(is_active(lastnode)>=0))\r
170     toggle_class(lastnode);\r
171 \r
172 \r
173 /*var d2 = new Date();\r
174 var t_mil2 = d2.getMilliseconds();\r
175   window.alert(t_mil2-t_mil);*/\r
176 }\r
177 \r
178 function next_list_node() {\r
179   tempIndex = list_index;\r
180   while (tempIndex<listnodes.length-1) {\r
181     tempIndex++;\r
182     var x = listnodes[tempIndex];\r
183     if (is_list_node(x)) {\r
184       list_index=tempIndex;\r
185       return;\r
186     }\r
187   }\r
188 }\r
189 \r
190 function prev_list_node() {\r
191   tempIndex = list_index;\r
192   while (tempIndex>0) {\r
193     tempIndex--;\r
194     var x = listnodes[tempIndex];\r
195     if (is_list_node(x)) {\r
196       list_index=tempIndex;\r
197       return;\r
198     }\r
199   }\r
200 }\r
201 \r
202 \r
203 \r
204 function getsub (li) {\r
205   if (li.childNodes.length==0) return null;\r
206   for (var c = 0; c < li.childNodes.length; c++)\r
207     if ( (li.childNodes[c].className == 'sub') || (li.childNodes[c].className == 'subexp') ) \r
208       return li.childNodes[c];\r
209 }\r
210 \r
211 function find_listnode_recursive (li) {\r
212   if (is_list_node(li)) return li; \r
213   if (li.childNodes.length==0) return null;\r
214   result=null;\r
215   for (var c = 0; c < li.childNodes.length; c++) {\r
216     result=find_listnode_recursive(li.childNodes[c]);\r
217     if (result!=null) return result;\r
218   }\r
219   return null;\r
220 }\r
221 \r
222 function next_child_listnode(li) {\r
223   var result=null;\r
224   for (var i=0; i<li.childNodes.length; i++) {\r
225     result=find_listnode_recursive(li.childNodes[i]);\r
226     if (result!=null) return result;\r
227   }\r
228   return null;  \r
229 }\r
230 \r
231 function next_actual_sibling_listnode(li) {\r
232   if (li==null) return null;\r
233   var temp=li;\r
234   while (1) { \r
235     var n = temp.nextSibling;\r
236     if (n==null) {\r
237       n=parent_listnode(temp);\r
238       return next_actual_sibling_listnode(n);\r
239     }\r
240     if (is_list_node(n)) return n;\r
241     temp=n;\r
242   }\r
243 }\r
244 \r
245 function next_sibling_listnode(li) {\r
246 if (li==null) return null; \r
247  var result=null;\r
248   var temp=li;\r
249   if (is_col(temp)) return next_child_listnode(temp);\r
250   while (1) { \r
251     var n = temp.nextSibling;\r
252     if (n==null) {\r
253       n=parent_listnode(temp);\r
254       return next_actual_sibling_listnode(n);\r
255     }\r
256     if (is_list_node(n)) return n;\r
257     temp=n;\r
258   }\r
259 }\r
260 \r
261 function last_sibling_listnode(li) {\r
262   if (li==null) return null;\r
263   var temp=li;\r
264   var last=null;\r
265   while(1) {\r
266     var n = temp.nextSibling;\r
267     if (is_list_node(temp)) \r
268       last = temp;\r
269     if (n==null) {\r
270       if (is_col(last)) return last_sibling_listnode(next_child_listnode(last));\r
271       else return last;\r
272     }\r
273     temp = n;\r
274   }\r
275 }\r
276 \r
277 function prev_sibling_listnode(li) { \r
278   if (li==null) return null;\r
279   var temp=li;\r
280   var n = null;\r
281   while (1) { \r
282     n = temp.previousSibling;\r
283     if (n==null) {\r
284       return parent_listnode(li);\r
285     }\r
286     if (is_list_node(n)) {\r
287       if (is_col(n)) { \r
288         return last_sibling_listnode(next_child_listnode(n));\r
289       }\r
290       else {\r
291         return n;\r
292       }\r
293     }\r
294     temp=n;\r
295   }\r
296 }\r
297 \r
298 \r
299 function parent_listnode(li) {\r
300   // added 12.7.2004 to prevent IE error when readonly mode==true\r
301   if (li==null) return null;\r
302   n=li;\r
303   while (1) {\r
304     n=n.parentNode;\r
305     if (n==null) return null;\r
306     if (is_list_node(n)) return n;\r
307   }\r
308 }\r
309 \r
310 function getVisibleParents(id) {\r
311   var n = document.getElementById(id);\r
312   while(1) {\r
313     expand(n);\r
314     n = parent_listnode(n);\r
315     if (n==null) return;\r
316   }\r
317 }\r
318 \r
319 function onClickHandler (evt) {\r
320 if (lastnode==null) \r
321 {\r
322 listnodes = document.getElementsByTagName('li');\r
323 lastnode=listnodes[1];\r
324 temp=listnodes[1];\r
325 }\r
326 \r
327 \r
328   var target = evt ? evt.target : event.srcElement;\r
329   if (!is_list_node(target)) return;\r
330   toggle(target);\r
331   set_lastnode(target);\r
332 }\r
333 \r
334 \r
335 function expand(node) {\r
336     if (!is_exp(node)) return;\r
337     if (node.className=='exp_active') \r
338       node.className='col_active';\r
339     else \r
340         node.className='col';\r
341     setSubClass(node,'subexp');\r
342     //    getsub(node).className='subexp';\r
343 }\r
344 \r
345 function collapse(node) {\r
346   if (!is_col(node)) return;\r
347   \r
348 if (node.className=='col_active')\r
349     node.className='exp_active'\r
350   else \r
351     node.className='exp';\r
352 \r
353  setSubClass(node,'sub');\r
354 //  getsub(node).className='sub';\r
355 \r
356 }\r
357 \r
358 function setSubClass(node,name) {\r
359   sub = getsub(node);\r
360   if (sub==null) return;\r
361   sub.className=name;  \r
362 }\r
363 \r
364 function toggle(target) {\r
365   if (!is_list_node(target)) return;\r
366     if (is_col(target)) {\r
367       target.className='exp';\r
368       setSubClass(target,'sub');\r
369       //      getsub(target).className='sub';\r
370     }\r
371     else if (is_exp(target)) {\r
372       target.className='col';\r
373       setSubClass(target,'subexp');\r
374       //      getsub(target).className='subexp';\r
375     }\r
376  \r
377 }\r
378 \r
379 function expandAll(node) {\r
380     if (node.className=='exp') {\r
381         node.className='col';\r
382         setSubClass(node,'subexp');\r
383 //        getsub(node).className='subexp';\r
384     }\r
385     var i;\r
386     if (node.childNodes!=null) \r
387 //    if (node.hasChildNodes()) \r
388         for ( i = 0; i<node.childNodes.length; i++)\r
389             expandAll(node.childNodes[i]);\r
390 }\r
391 \r
392 function collapseAll(node) {\r
393     if  (node.className=='col') {\r
394         node.className='exp';\r
395         setSubClass(node,'sub');\r
396 //        getsub(node).className='sub';\r
397     }\r
398     var i;        \r
399     if (node.childNodes!=null) \r
400 // for opera   if (node.hasChildNodes()) \r
401         for ( i = 0; i<node.childNodes.length; i++)\r
402             collapseAll(node.childNodes[i]);\r
403 }\r
404 \r
405 \r
406 \r
407 function unFocus(node) {\r
408      // unfocuses potential link that is to be hidden (if a==null there is no link so it should not be blurred).\r
409      // tested with mozilla 1.7, 12.7.2004. /mn (\r
410       intemp=parent_listnode(node);  \r
411       a = get_link(intemp);     // added 6.4. to get keyboard working with\r
412       // moved before collapse to prevent an error message with IE when readonly==true      \r
413       if (a!=null) a.blur(); // netscape after collapsing a focused node\r
414       return intemp;\r
415 }\r
416 \r
417 // mode: 0==keypress, 1==keyup\r
418 function keyfunc(evt,mode) {\r
419  var c = get_keycode(evt);\r
420  var temp = null;\r
421  var a = null;\r
422 \r
423   if (lastnode==null) {\r
424     listnodes = document.getElementsByTagName('li');\r
425     lastnode=listnodes[1];\r
426     temp=listnodes[1];\r
427   }\r
428 \r
429   //window.alert(c);\r
430   if (checkup(mode,c)) { // i \r
431    temp=prev_sibling_listnode(lastnode);\r
432   }\r
433   else if (checkdn(mode,c)) { // k\r
434     temp=next_sibling_listnode(lastnode);\r
435   }\r
436   else if (checkr(mode,c)) { // l\r
437     expand(lastnode);\r
438     //  temp=next_child_listnode(lastnode);\r
439     // if (temp==null) {\r
440       a = get_link(lastnode);\r
441         if (a!=null) a.focus(); else self.focus(); \r
442       //}\r
443   }\r
444   else if (checkl(mode,c)) { // j\r
445     if (is_col(lastnode)) {\r
446       unFocus(lastnode);\r
447       collapse(lastnode);\r
448     }\r
449     else {\r
450       temp=unFocus(lastnode);\r
451       collapse(temp);\r
452     }\r
453    //    if (temp==null) lastnode.focus(); // forces focus to correct div (try mozilla typesearch) (doesn't seem to work -mn/6.4.2004)\r
454   }\r
455   else return;\r
456   if (temp!=null) set_lastnode(temp);\r
457 \r
458   // alert('pressed ' + String.fromCharCode(c) + '(' + c + ')');\r
459   return true;\r
460 }\r
461 \r
462 \r
463 function keytest (evt) {\r
464   return keyfunc(evt,1);\r
465 };\r
466 \r
467 \r
468 function presstest (evt) {\r
469   return keyfunc(evt,0);\r
470 };\r
471 \r
472 \r
473   document.onclick = onClickHandler;\r
474   document.onkeypress = presstest;\r
475   document.onkeyup = keytest;\r