component(developer/golang-123): Add Component
[oi-userland.git] / components / text / tidy / files / treeview.js
blob6b5ef511028f40d62046c37af7972d06bf87ec16
1 //**************************************************************** 
2 // You are free to copy the "Folder-Tree" script as long as you  
3 // keep this copyright notice: 
4 // Script found in: http://www.geocities.com/Paris/LeftBank/2178/ 
5 // Author: Marcelino Alves Martins (martins@hks.com) December '97. 
6 //**************************************************************** 
7  
8 //Log of changes: 
9 //       17 Feb 98 - Fix initialization flashing problem with Netscape
10 //       
11 //       27 Jan 98 - Root folder starts open; support for USETEXTLINKS; 
12 //                   make the ftien4 a js file 
13 //       
14 // DvH:  Dec 2000 -  Made some minor changes to support external 
15 //                   references
17 // Definition of class Folder 
18 // ***************************************************************** 
20 function Folder(folderDescription, tagName, hreference) //constructor 
21
22   //constant data 
23   this.desc = folderDescription 
24   this.tagName = tagName
25   this.hreference = hreference 
26   this.id = -1   
27   this.navObj = 0  
28   this.iconImg = 0  
29   this.nodeImg = 0  
30   this.isLastNode = 0 
32   //dynamic data 
33   this.isOpen = true 
34   this.iconSrc = "ftv2folderopen.png"   
35   this.children = new Array 
36   this.nChildren = 0 
38   //methods 
39   this.initialize = initializeFolder 
40   this.setState = setStateFolder 
41   this.addChild = addChild 
42   this.createIndex = createEntryIndex 
43   this.hide = hideFolder 
44   this.display = display 
45   this.renderOb = drawFolder 
46   this.totalHeight = totalHeight 
47   this.subEntries = folderSubEntries 
48   this.outputLink = outputFolderLink 
49
51 function setStateFolder(isOpen) 
52
53   var subEntries 
54   var totalHeight 
55   var fIt = 0 
56   var i=0 
58   if (isOpen == this.isOpen) 
59     return 
61   if (browserVersion == 2)  
62   { 
63     totalHeight = 0 
64     for (i=0; i < this.nChildren; i++) 
65       totalHeight = totalHeight + this.children[i].navObj.clip.height 
66       subEntries = this.subEntries() 
67     if (this.isOpen) 
68       totalHeight = 0 - totalHeight 
69     for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++) 
70       indexOfEntries[fIt].navObj.moveBy(0, totalHeight) 
71   }  
72   this.isOpen = isOpen 
73   propagateChangesInState(this) 
74
76 function propagateChangesInState(folder) 
77 {   
78   var i=0 
80   if (folder.isOpen) 
81   { 
82     if (folder.nodeImg) 
83       if (folder.isLastNode) 
84         folder.nodeImg.src = "ftv2mlastnode.png" 
85       else 
86           folder.nodeImg.src = "ftv2mnode.png" 
87     folder.iconImg.src = "ftv2folderopen.png" 
88     for (i=0; i<folder.nChildren; i++) 
89       folder.children[i].display() 
90   } 
91   else 
92   { 
93     if (folder.nodeImg) 
94       if (folder.isLastNode) 
95         folder.nodeImg.src = "ftv2plastnode.png" 
96       else 
97           folder.nodeImg.src = "ftv2pnode.png" 
98     folder.iconImg.src = "ftv2folderclosed.png" 
99     for (i=0; i<folder.nChildren; i++) 
100       folder.children[i].hide() 
101   }  
104 function hideFolder() 
106   if (browserVersion == 1 || browserVersion == 3) { 
107     if (this.navObj.style.display == "none") 
108       return 
109     this.navObj.style.display = "none" 
110   } else { 
111     if (this.navObj.visibility == "hidden") 
112       return 
113     this.navObj.visibility = "hidden" 
114   } 
115    
116   this.setState(0) 
119 function initializeFolder(level, lastNode, leftSide) 
121 var j=0 
122 var i=0 
123 var numberOfFolders 
124 var numberOfDocs 
125 var nc 
126       
127   nc = this.nChildren 
128    
129   this.createIndex() 
131   var auxEv = "" 
133   if (browserVersion > 0) 
134     auxEv = "<a href='javascript:clickOnNode("+this.id+")'>" 
135   else 
136     auxEv = "<a>" 
138   if (level>0) 
139     if (lastNode) //the last 'brother' in the children array 
140     { 
141       this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='ftv2mlastnode.png' width=16 height=22 border=0></a>") 
142       leftSide = leftSide + "<img src='ftv2blank.png' width=16 height=22>"  
143       this.isLastNode = 1 
144     } 
145     else 
146     { 
147       this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='ftv2mnode.png' width=16 height=22 border=0></a>") 
148       leftSide = leftSide + "<img src='ftv2vertline.png' width=16 height=22>" 
149       this.isLastNode = 0 
150     } 
151   else 
152     this.renderOb("") 
153    
154   if (nc > 0) 
155   { 
156     level = level + 1 
157     for (i=0 ; i < this.nChildren; i++)  
158     { 
159       if (i == this.nChildren-1) 
160         this.children[i].initialize(level, 1, leftSide) 
161       else 
162         this.children[i].initialize(level, 0, leftSide) 
163       } 
164   } 
167 function drawFolder(leftSide) 
169   if (browserVersion == 2) { 
170     if (!doc.yPos) 
171       doc.yPos=8 
172     doc.write("<layer id='folder" + this.id + "' top=" + doc.yPos + " visibility=hidden>") 
173   } 
174   if (browserVersion == 3) 
175   {
176     doc.write("<div id='folder" + this.id + "' style='visibility:hide;'>") 
177   }
178    
179   doc.write("\n<table ") 
180   if (browserVersion == 1) 
181     doc.write(" id='folder" + this.id + "' style='position:block;' ") 
182   doc.write(" border=0 cellspacing=0 cellpadding=0>") 
183   doc.write("\n<tr><td>") 
184   doc.write(leftSide) 
185   this.outputLink() 
186   doc.write("<img name='folderIcon" + this.id + "' ") 
187   doc.write("src='" + this.iconSrc+"' border=0></a>") 
188   doc.write("</td>\n<td valign=middle nowrap>") 
189   if (USETEXTLINKS) 
190   { 
191     this.outputLink() 
192     doc.write(this.desc + "</a>") 
193   } 
194   else 
195     doc.write(this.desc) 
196   if (this.tagName!="")
197   {
198     doc.write(" [external]")
199   }
200   doc.write("</td>")  
201   doc.write("\n</table>\n") 
202    
203   if (browserVersion == 2) { 
204     doc.write("</layer>") 
205   } 
206   if (browserVersion == 3) { 
207     doc.write("</div>") 
208   } 
210   if (browserVersion == 1) { 
211     this.navObj = doc.all["folder"+this.id] 
212     this.iconImg = doc.all["folderIcon"+this.id] 
213     this.nodeImg = doc.all["nodeIcon"+this.id] 
214   } else if (browserVersion == 2) { 
215     this.navObj = doc.layers["folder"+this.id] 
216     this.iconImg = this.navObj.document.images["folderIcon"+this.id] 
217     this.nodeImg = this.navObj.document.images["nodeIcon"+this.id] 
218     doc.yPos=doc.yPos+this.navObj.clip.height 
219   } else if (browserVersion == 3) {
220     this.navObj = doc.getElementById("folder"+this.id)
221     this.iconImg = doc.images.namedItem("folderIcon"+this.id)
222     this.nodeImg = doc.images.namedItem("nodeIcon"+this.id)
223   }
226 function outputFolderLink() 
228   if (this.hreference) 
229   { 
230     doc.write("<a ")
231     if (this.tagName)
232     {
233       doc.write("doxygen='" + this.tagName + "' ");
234     }
235     doc.write("href='" + this.hreference + "' TARGET=\"basefrm\" ") 
236     if (browserVersion > 0) 
237       doc.write("onClick='javascript:clickOnFolder("+this.id+")'") 
238     doc.write(">") 
239   } 
240   else 
241     doc.write("<a>") 
244 function addChild(childNode) 
246   this.children[this.nChildren] = childNode 
247   this.nChildren++ 
248   return childNode 
251 function folderSubEntries() 
253   var i = 0 
254   var se = this.nChildren 
256   for (i=0; i < this.nChildren; i++){ 
257     if (this.children[i].children) //is a folder 
258       se = se + this.children[i].subEntries() 
259   } 
261   return se 
265 // Definition of class Item (a document or link inside a Folder) 
266 // ************************************************************* 
268 function Item(itemDescription, tagName, itemLink) // Constructor 
270   // constant data 
271   this.desc = itemDescription 
272   this.tagName = tagName
273   this.link = itemLink 
274   this.id = -1 //initialized in initalize() 
275   this.navObj = 0 //initialized in render() 
276   this.iconImg = 0 //initialized in render() 
277   this.iconSrc = "ftv2doc.png" 
279   // methods 
280   this.initialize = initializeItem 
281   this.createIndex = createEntryIndex 
282   this.hide = hideItem 
283   this.display = display 
284   this.renderOb = drawItem 
285   this.totalHeight = totalHeight 
288 function hideItem() 
290   if (browserVersion == 1 || browserVersion == 3) { 
291     if (this.navObj.style.display == "none") 
292       return 
293     this.navObj.style.display = "none" 
294   } else { 
295     if (this.navObj.visibility == "hidden") 
296       return 
297     this.navObj.visibility = "hidden" 
298   }     
301 function initializeItem(level, lastNode, leftSide) 
302 {  
303   this.createIndex() 
305   if (level>0) 
306     if (lastNode) //the last 'brother' in the children array 
307     { 
308       this.renderOb(leftSide + "<img src='ftv2lastnode.png' width=16 height=22>") 
309       leftSide = leftSide + "<img src='ftv2blank.png' width=16 height=22>"  
310     } 
311     else 
312     { 
313       this.renderOb(leftSide + "<img src='ftv2node.png' width=16 height=22>") 
314       leftSide = leftSide + "<img src='ftv2vertline.png' width=16 height=22>" 
315     } 
316   else 
317     this.renderOb("")   
320 function drawItem(leftSide) 
322   if (browserVersion == 2) 
323     doc.write("<layer id='item" + this.id + "' top=" + doc.yPos + " visibility=hidden>") 
324   if (browserVersion == 3) 
325     doc.write("<div id='item" + this.id + "' style='display:block;'>") 
326      
327   doc.write("\n<table ") 
328   if (browserVersion == 1) 
329     doc.write(" id='item" + this.id + "' style='position:block;' ") 
330   doc.write(" border=0 cellspacing=0 cellpadding=0>\n") 
331   doc.write("<tr><td>") 
332   doc.write(leftSide) 
333   if (this.link!="")
334   {
335     doc.write("<a href=" + this.link + ">") 
336   }
337   doc.write("<img id='itemIcon"+this.id+"' ") 
338   doc.write("src='"+this.iconSrc+"' border=0>") 
339   if (this.link!="")
340   {
341     doc.write("</a>")
342   } 
343   doc.write("</td>\n<td valign=middle nowrap>") 
344   if (USETEXTLINKS && this.link!="") 
345     doc.write("<a href=" + this.link + ">" + this.desc + "</a>") 
346   else 
347     doc.write(this.desc) 
348   if (this.tagName!="")
349   {
350     doc.write(" [external]");
351   }
352   doc.write("\n</table>\n") 
353    
354   if (browserVersion == 2) 
355     doc.write("</layer>") 
356   if (browserVersion == 3) 
357     doc.write("</div>")
359   if (browserVersion == 1) { 
360     this.navObj = doc.all["item"+this.id] 
361     this.iconImg = doc.all["itemIcon"+this.id] 
362   } else if (browserVersion == 2) { 
363     this.navObj = doc.layers["item"+this.id] 
364     this.iconImg = this.navObj.document.images["itemIcon"+this.id] 
365     doc.yPos=doc.yPos+this.navObj.clip.height 
366   } else if (browserVersion == 3) {
367     this.navObj = doc.getElementById("item"+this.id)
368     this.iconImg = doc.images.namedItem("itemIcon"+this.id)
369   }
373 // Methods common to both objects (pseudo-inheritance) 
374 // ******************************************************** 
376 function display() 
378   if (browserVersion == 1 || browserVersion == 3) 
379     this.navObj.style.display = "block" 
380   else 
381     this.navObj.visibility = "show" 
384 function createEntryIndex() 
386   this.id = nEntries 
387   indexOfEntries[nEntries] = this 
388   nEntries++ 
391 // total height of subEntries open 
392 function totalHeight() //used with browserVersion == 2 
394   var h = this.navObj.clip.height 
395   var i = 0 
396    
397   if (this.isOpen) //is a folder and _is_ open 
398     for (i=0 ; i < this.nChildren; i++)  
399       h = h + this.children[i].totalHeight() 
401   return h 
405 // Events 
406 // ********************************************************* 
408 function clickOnFolder(folderId) 
410   var clicked = indexOfEntries[folderId] 
412   if (!clicked.isOpen) 
413     clickOnNode(folderId) 
415   return  
417   if (clicked.isSelected) 
418     return 
421 function clickOnNode(folderId) 
423   var clickedFolder = 0 
424   var state = 0 
426   clickedFolder = indexOfEntries[folderId] 
427   state = clickedFolder.isOpen 
429   clickedFolder.setState(!state) //open<->close  
432 function initializeDocument() 
434   doc = document;
435   if (doc.all) 
436     browserVersion = 1 //IE4   
437   else 
438     if (doc.layers) 
439       browserVersion = 2 //NS4 
440     else if(navigator.userAgent.toLowerCase().indexOf('gecko') != -1)
441         browserVersion = 3 //mozilla
442       else 
443         browserVersion = 0 //other 
445   foldersTree.initialize(0, 1, "") 
446   foldersTree.display()
447   
448   if (browserVersion > 0) 
449   { 
450     if(browserVersion != 3)
451       doc.write("<layer top="+indexOfEntries[nEntries-1].navObj.top+">&nbsp;</layer>") 
453     // close the whole tree 
454     clickOnNode(0) 
455     // open the root folder 
456     clickOnNode(0) 
457   } 
460 // Auxiliary Functions for Folder-Treee backward compatibility 
461 // ********************************************************* 
463 function gFld(description, tagName, hreference) 
465   folder = new Folder(description, tagName, hreference) 
466   return folder 
469 function gLnk(description, tagName, linkData) 
471   fullLink = "" 
473   if (linkData!="")
474   {
475     fullLink = "'"+linkData+"' target=\"basefrm\"" 
476   } 
478   linkItem = new Item(description, tagName, fullLink)   
479   return linkItem 
482 function insFld(parentFolder, childFolder) 
484   return parentFolder.addChild(childFolder) 
487 function insDoc(parentFolder, document) 
489   parentFolder.addChild(document) 
492 // Global variables 
493 // **************** 
495 USETEXTLINKS = 1
496 indexOfEntries = new Array 
497 nEntries = 0 
498 doc = document 
499 browserVersion = 0 
500 selectedFolder=0