]> git.mxchange.org Git - hub-docs.git/blob - mindmaps/Generic Object Sharing Protocol.html_files/marktree.js
Updated mindmap for 'hub' project
[hub-docs.git] / mindmaps / Generic Object Sharing Protocol.html_files / marktree.js
1 /* MarkTree JavaScript code\r
2  * \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
5  *\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
9  * License.\r
10  * \r
11  * Miika Nurminen, 12.7.2004.\r
12  */\r
13 \r
14 /* cross-browser (tested with ie5, mozilla 1 and opera 5) keypress detection */\r
15 function get_keycode(evt) {\r
16   // IE\r
17     code = document.layers ? evt.which\r
18            : document.all ? event.keyCode // event.keyCode!=evt.keyCode!\r
19            : evt.keyCode;\r
20 \r
21   if (code==0) \r
22     code=evt.which; // for NS\r
23   return code;\r
24 }\r
25 \r
26 var lastnode=null;\r
27 var listnodes = null;\r
28 var list_index=1;\r
29 var lastnodetype=''; // determines if node is a link, input or text;\r
30 \r
31 // up, left, down, right, keypress codes\r
32 //ijkl\r
33 //var keys = new Array(105,106,107,108);\r
34 //num arrows\r
35 //var keys = new Array(56,52,50,54);\r
36 //wasd\r
37 // var press2 = new Array(119,97,115,100);\r
38  var press = new Array(47,45,42,43);\r
39 \r
40 // keydown codes\r
41   //  var keys2=new Array(87,65,83,68);\r
42   var keys= new Array(38,37,40,39);\r
43 \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
48 }\r
49 \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
53 }\r
54 \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
58 }\r
59 \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
63 }\r
64 \r
65 \r
66 \r
67 \r
68 \r
69 function is_exp(n) {\r
70   if (n==null) return false;\r
71   return ((n.className=='exp') || (n.className=='exp_active'));\r
72 }\r
73 \r
74 function is_col(n) {\r
75   if (n==null) return false;\r
76   return ((n.className=='col') || (n.className=='col_active'));\r
77 }\r
78 \r
79 function is_basic(n) {\r
80   if (n==null) return false;\r
81   return ((n.className=='basic') || (n.className=='basic_active'));\r
82 }\r
83 \r
84 \r
85 \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
90 }\r
91 \r
92 function toggle_class(node) {\r
93   if ((node==null) || (node.className==null)) return;\r
94   str=node.className;\r
95   result="";\r
96   i = str.indexOf('_active');\r
97   if (i>0)\r
98     result= str.substr(0,i);\r
99   else\r
100     result= str+"_active";\r
101   node.className=result; \r
102   return node;\r
103 }\r
104 \r
105 function activate(node) {\r
106   node.style.backgroundColor='#eeeeff';\r
107 }\r
108 \r
109 function deactivate(node) {\r
110    node.style.backgroundColor='#ffffff';\r
111 }\r
112 \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
117        (is_col(n)) ||\r
118        (is_basic(n)) )\r
119    return true; else return false;\r
120 }\r
121 \r
122 \r
123 function get_href(n) {\r
124   alist=n.attributes;\r
125   if (alist!=null) {\r
126     hr = alist.getNamedItem('href');\r
127     if (hr!=null) return hr.nodeValue;\r
128   }\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
133   }\r
134   return '';\r
135 }\r
136 \r
137 function get_link(n) {\r
138   if (n==null) return null;\r
139   if (n.style==null) return null;\r
140 \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
145 \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
151   }\r
152   return null;\r
153 }\r
154 \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
161   lastnode=n;\r
162   activate(lastnode);*/\r
163 \r
164   if (is_active(lastnode)>=0)\r
165     toggle_class(lastnode);\r
166   lastnode=n;\r
167   if (!(is_active(lastnode)>=0))\r
168     toggle_class(lastnode);\r
169 \r
170 \r
171 /*var d2 = new Date();\r
172 var t_mil2 = d2.getMilliseconds();\r
173   window.alert(t_mil2-t_mil);*/\r
174 }\r
175 \r
176 function next_list_node() {\r
177   tempIndex = list_index;\r
178   while (tempIndex<listnodes.length-1) {\r
179     tempIndex++;\r
180     var x = listnodes[tempIndex];\r
181     if (is_list_node(x)) {\r
182       list_index=tempIndex;\r
183       return;\r
184     }\r
185   }\r
186 }\r
187 \r
188 function prev_list_node() {\r
189   tempIndex = list_index;\r
190   while (tempIndex>0) {\r
191     tempIndex--;\r
192     var x = listnodes[tempIndex];\r
193     if (is_list_node(x)) {\r
194       list_index=tempIndex;\r
195       return;\r
196     }\r
197   }\r
198 }\r
199 \r
200 \r
201 \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
207 }\r
208 \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
212   result=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
216   }\r
217   return null;\r
218 }\r
219 \r
220 function next_child_listnode(li) {\r
221   var result=null;\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
225   }\r
226   return null;  \r
227 }\r
228 \r
229 function next_actual_sibling_listnode(li) {\r
230   if (li==null) return null;\r
231   var temp=li;\r
232   while (1) { \r
233     var n = temp.nextSibling;\r
234     if (n==null) {\r
235       n=parent_listnode(temp);\r
236       return next_actual_sibling_listnode(n);\r
237     }\r
238     if (is_list_node(n)) return n;\r
239     temp=n;\r
240   }\r
241 }\r
242 \r
243 function next_sibling_listnode(li) {\r
244 if (li==null) return null; \r
245  var result=null;\r
246   var temp=li;\r
247   if (is_col(temp)) return next_child_listnode(temp);\r
248   while (1) { \r
249     var n = temp.nextSibling;\r
250     if (n==null) {\r
251       n=parent_listnode(temp);\r
252       return next_actual_sibling_listnode(n);\r
253     }\r
254     if (is_list_node(n)) return n;\r
255     temp=n;\r
256   }\r
257 }\r
258 \r
259 function last_sibling_listnode(li) {\r
260   if (li==null) return null;\r
261   var temp=li;\r
262   var last=null;\r
263   while(1) {\r
264     var n = temp.nextSibling;\r
265     if (is_list_node(temp)) \r
266       last = temp;\r
267     if (n==null) {\r
268       if (is_col(last)) return last_sibling_listnode(next_child_listnode(last));\r
269       else return last;\r
270     }\r
271     temp = n;\r
272   }\r
273 }\r
274 \r
275 function prev_sibling_listnode(li) { \r
276   if (li==null) return null;\r
277   var temp=li;\r
278   var n = null;\r
279   while (1) { \r
280     n = temp.previousSibling;\r
281     if (n==null) {\r
282       return parent_listnode(li);\r
283     }\r
284     if (is_list_node(n)) {\r
285       if (is_col(n)) { \r
286         return last_sibling_listnode(next_child_listnode(n));\r
287       }\r
288       else {\r
289         return n;\r
290       }\r
291     }\r
292     temp=n;\r
293   }\r
294 }\r
295 \r
296 \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
300   n=li;\r
301   while (1) {\r
302     n=n.parentNode;\r
303     if (n==null) return null;\r
304     if (is_list_node(n)) return n;\r
305   }\r
306 }\r
307 \r
308 function getVisibleParents(id) {\r
309   var n = document.getElementById(id);\r
310   while(1) {\r
311     expand(n);\r
312     n = parent_listnode(n);\r
313     if (n==null) return;\r
314   }\r
315 }\r
316 \r
317 function onClickHandler (evt) {\r
318 if (lastnode==null) \r
319 {\r
320 listnodes = document.getElementsByTagName('li');\r
321 lastnode=listnodes[1];\r
322 temp=listnodes[1];\r
323 }\r
324 \r
325 \r
326   var target = evt ? evt.target : event.srcElement;\r
327   if (!is_list_node(target)) return;\r
328   toggle(target);\r
329   set_lastnode(target);\r
330 }\r
331 \r
332 \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
337     else \r
338         node.className='col';\r
339     setSubClass(node,'subexp');\r
340     //    getsub(node).className='subexp';\r
341 }\r
342 \r
343 function collapse(node) {\r
344   if (!is_col(node)) return;\r
345   \r
346 if (node.className=='col_active')\r
347     node.className='exp_active'\r
348   else \r
349     node.className='exp';\r
350 \r
351  setSubClass(node,'sub');\r
352 //  getsub(node).className='sub';\r
353 \r
354 }\r
355 \r
356 function setSubClass(node,name) {\r
357   sub = getsub(node);\r
358   if (sub==null) return;\r
359   sub.className=name;  \r
360 }\r
361 \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
368     }\r
369     else if (is_exp(target)) {\r
370       target.className='col';\r
371       setSubClass(target,'subexp');\r
372       //      getsub(target).className='subexp';\r
373     }\r
374  \r
375 }\r
376 \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
382     }\r
383     var i;\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
388 }\r
389 \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
395     }\r
396     var i;        \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
401 }\r
402 \r
403 \r
404 \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
412       return intemp;\r
413 }\r
414 \r
415 // mode: 0==keypress, 1==keyup\r
416 function keyfunc(evt,mode) {\r
417  var c = get_keycode(evt);\r
418  var temp = null;\r
419  var a = null;\r
420 \r
421   if (lastnode==null) {\r
422     listnodes = document.getElementsByTagName('li');\r
423     lastnode=listnodes[1];\r
424     temp=listnodes[1];\r
425   }\r
426 \r
427   //window.alert(c);\r
428   if (checkup(mode,c)) { // i \r
429    temp=prev_sibling_listnode(lastnode);\r
430   }\r
431   else if (checkdn(mode,c)) { // k\r
432     temp=next_sibling_listnode(lastnode);\r
433   }\r
434   else if (checkr(mode,c)) { // l\r
435     expand(lastnode);\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
440       //}\r
441   }\r
442   else if (checkl(mode,c)) { // j\r
443     if (is_col(lastnode)) {\r
444       unFocus(lastnode);\r
445       collapse(lastnode);\r
446     }\r
447     else {\r
448       temp=unFocus(lastnode);\r
449       collapse(temp);\r
450     }\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
452   }\r
453   else return;\r
454   if (temp!=null) set_lastnode(temp);\r
455 \r
456   // alert('pressed ' + String.fromCharCode(c) + '(' + c + ')');\r
457   return true;\r
458 }\r
459 \r
460 \r
461 function keytest (evt) {\r
462   return keyfunc(evt,1);\r
463 };\r
464 \r
465 \r
466 function presstest (evt) {\r
467   return keyfunc(evt,0);\r
468 };\r
469 \r
470 \r
471   document.onclick = onClickHandler;\r
472   document.onkeypress = presstest;\r
473   document.onkeyup = keytest;\r