ftiens4.js
上传用户:jdr1jdr
上传日期:2013-05-07
资源大小:68k
文件大小:33k
源码类别:

JavaScript

开发平台:

JavaScript

  1. //**************************************************************** 
  2. // Keep this copyright notice: 
  3. // This copy of the script is the property of the owner of the 
  4. // particular web site you were visiting.
  5. // Do not download the script's files from there.
  6. // For a free download and full instructions go to: 
  7. // http://www.treeview.net
  8. //**************************************************************** 
  9.  
  10. // Log of changes: 
  11. //
  12. //      08 Jun 04 - Very small change to one error message
  13. //      21 Mar 04 - Support for folder.addChildren allows for much bigger trees
  14. //      12 May 03 - Support for Safari Beta 3
  15. //      01 Mar 03 - VERSION 4.3 - Support for checkboxes
  16. //      21 Feb 03 - Added support for Opera 7
  17. //      22 Sep 02 - Added maySelect member for node-by-node control
  18. //                  of selection and highlight
  19. //      21 Sep 02 - Cookie values are now separated by cookieCutter
  20. //      12 Sep 02 - VERSION 4.2 - Can highlight Selected Nodes and 
  21. //                  can preserve state through external (DB) IDs
  22. //      29 Aug 02 - Fine tune 'supportDeferral' for IE4 and IE Mac
  23. //      25 Aug 02 - Fixes: STARTALLOPEN, and multi-page frameless
  24. //      09 Aug 02 - Fix repeated folder on Mozilla 1.x
  25. //      31 Jul 02 - VERSION 4.1 - Dramatic speed increase for trees 
  26. //      with hundreds or thousands of nodes; changes to the control
  27. //      flags of the gLnk function
  28. //      18 Jul 02 - Changes in pre-load images function
  29. //      13 Jun 02 - Add ICONPATH var to allow for gif subdir
  30. //      20 Apr 02 - Improve support for frame-less layout
  31. //      07 Apr 02 - Minor changes to support server-side dynamic feeding
  32. //                  (example: FavoritesManagerASP)
  33.  
  34. // Definition of class Folder 
  35. // ***************************************************************** 
  36. function Folder(folderDescription, hreference) //constructor 
  37.   //constant data 
  38.   this.desc = folderDescription; 
  39.   this.hreference = hreference;
  40.   this.id = -1;
  41.   this.navObj = 0;
  42.   this.iconImg = 0; 
  43.   this.nodeImg = 0;
  44.   this.isLastNode = 0;
  45.   this.iconSrc = ICONPATH + "ftv2folderopen.gif";
  46.   this.iconSrcClosed = ICONPATH + "ftv2folderclosed.gif";
  47.   this.children = new Array;
  48.   this.nChildren = 0;
  49.   this.level = 0;
  50.   this.leftSideCoded = "";
  51.   this.isLastNode=false;
  52.   this.parentObj = null;
  53.   this.maySelect=true;
  54.   this.prependHTML = ""
  55.  
  56.   //dynamic data 
  57.   this.isOpen = false
  58.   this.isLastOpenedFolder = false
  59.   this.isRendered = 0
  60.  
  61.   //methods 
  62.   this.initialize = initializeFolder 
  63.   this.setState = setStateFolder 
  64.   this.addChild = addChild 
  65.   this.addChildren = addChildren
  66.   this.createIndex = createEntryIndex 
  67.   this.escondeBlock = escondeBlock
  68.   this.esconde = escondeFolder 
  69.   this.folderMstr = folderMstr 
  70.   this.renderOb = drawFolder 
  71.   this.totalHeight = totalHeight 
  72.   this.subEntries = folderSubEntries 
  73.   this.linkHTML = linkFolderHTML
  74.   this.blockStartHTML = blockStartHTML
  75.   this.blockEndHTML = blockEndHTML
  76.   this.nodeImageSrc = nodeImageSrc
  77.   this.iconImageSrc = iconImageSrc
  78.   this.getID = getID
  79.   this.forceOpeningOfAncestorFolders = forceOpeningOfAncestorFolders
  80.  
  81. function initializeFolder(level, lastNode, leftSide) 
  82.   var j=0 
  83.   var i=0       
  84.   nc = this.nChildren 
  85.    
  86.   this.createIndex() 
  87.   this.level = level
  88.   this.leftSideCoded = leftSide
  89.   if (browserVersion == 0 || STARTALLOPEN==1)
  90.     this.isOpen=true;
  91.   if (level>0)
  92.     if (lastNode) //the last child in the children array 
  93. leftSide = leftSide + "0"
  94. else
  95. leftSide = leftSide + "1"
  96.   this.isLastNode = lastNode
  97.  
  98.   if (nc > 0) 
  99.   { 
  100.     level = level + 1 
  101.     for (i=0 ; i < this.nChildren; i++)  
  102.     {
  103.       if (typeof this.children[i].initialize == 'undefined') //document node was specified using the addChildren function
  104.       {
  105.         if (typeof this.children[i][0] == 'undefined' || typeof this.children[i] == 'string')
  106.         {
  107.           this.children[i] = ["item incorrectly defined", ""];
  108.         }
  109.         //Basic initialization of the Item object
  110.         //These members or methods are needed even before the Item is rendered
  111.         this.children[i].initialize=initializeItem;
  112.         this.children[i].createIndex=createEntryIndex;
  113.         if (typeof this.children[i].maySelect == 'undefined')
  114.           this.children[i].maySelect=true
  115.         this.children[i].forceOpeningOfAncestorFolders = forceOpeningOfAncestorFolders
  116.       }
  117.       if (i == this.nChildren-1) 
  118.         this.children[i].initialize(level, 1, leftSide)
  119.       else 
  120.         this.children[i].initialize(level, 0, leftSide)
  121.     } 
  122.   } 
  123.  
  124. function drawFolder(insertAtObj) 
  125.   var nodeName = ""
  126.   var auxEv = ""
  127.   var docW = ""
  128.   var i=0
  129.   finalizeCreationOfChildDocs(this)
  130.   var leftSide = leftSideHTML(this.leftSideCoded)
  131.   if (browserVersion > 0) 
  132.     auxEv = "<a href='javascript:clickOnNode(""+this.getID()+"")'>" 
  133.   else 
  134.     auxEv = "<a>" 
  135.   nodeName = this.nodeImageSrc()
  136.  
  137.   if (this.level>0) 
  138.     if (this.isLastNode) //the last child in the children array 
  139.     leftSide = leftSide + "<td valign=top>" + auxEv + "<img name='nodeIcon" + this.id + "' id='nodeIcon" + this.id + "' src='" + nodeName + "' width=16 height=22 border=0></a></td>"
  140.     else 
  141.       leftSide = leftSide + "<td valign=top background=" + ICONPATH + "ftv2vertline.gif>" + auxEv + "<img name='nodeIcon" + this.id + "' id='nodeIcon" + this.id + "' src='" + nodeName + "' width=16 height=22 border=0></a></td>"
  142.   this.isRendered = 1
  143.   if (browserVersion == 2) { 
  144.     if (!doc.yPos) 
  145.       doc.yPos=20 
  146.   } 
  147.   docW = this.blockStartHTML("folder");
  148.   docW = docW + "<tr>" + leftSide + "<td valign=top>";
  149.   if (USEICONS)
  150.   {
  151.     docW = docW + this.linkHTML(false) 
  152.     docW = docW + "<img id='folderIcon" + this.id + "' name='folderIcon" + this.id + "' src='" + this.iconImageSrc() + "' border=0></a>"
  153.   }
  154.   else
  155.   {
  156.   if (this.prependHTML == "")
  157.         docW = docW + "<img src=" + ICONPATH + "ftv2blank.gif height=2 width=2>"
  158.   }
  159.   if (WRAPTEXT)
  160.   docW = docW + "</td>"+this.prependHTML+"<td valign=middle width=100%>"
  161.   else
  162.   docW = docW + "</td>"+this.prependHTML+"<td valign=middle nowrap width=100%>"
  163.   if (USETEXTLINKS) 
  164.   { 
  165.     docW = docW + this.linkHTML(true) 
  166.     docW = docW + this.desc + "</a>"
  167.   } 
  168.   else 
  169.     docW = docW + this.desc
  170.   docW = docW + "</td>"
  171.   docW = docW + this.blockEndHTML()
  172.   if (insertAtObj == null)
  173.   {
  174.   if (supportsDeferral) {
  175.   doc.write("<div id=domRoot></div>") //transition between regular flow HTML, and node-insert DOM DHTML
  176.   insertAtObj = getElById("domRoot")
  177.   insertAtObj.insertAdjacentHTML("beforeEnd", docW)
  178.   }
  179.   else
  180.   doc.write(docW)
  181.   }
  182.   else
  183.   {
  184.       insertAtObj.insertAdjacentHTML("afterEnd", docW)
  185.   }
  186.  
  187.   if (browserVersion == 2) 
  188.   { 
  189.     this.navObj = doc.layers["folder"+this.id] 
  190.     if (USEICONS)
  191.       this.iconImg = this.navObj.document.images["folderIcon"+this.id] 
  192.     this.nodeImg = this.navObj.document.images["nodeIcon"+this.id] 
  193.     doc.yPos=doc.yPos+this.navObj.clip.height 
  194.   } 
  195.   else if (browserVersion != 0)
  196.   { 
  197.     this.navObj = getElById("folder"+this.id)
  198.     if (USEICONS)
  199.       this.iconImg = getElById("folderIcon"+this.id) 
  200.     this.nodeImg = getElById("nodeIcon"+this.id)
  201.   } 
  202.  
  203. function setStateFolder(isOpen) 
  204.   var subEntries 
  205.   var totalHeight 
  206.   var fIt = 0 
  207.   var i=0 
  208.   var currentOpen
  209.  
  210.   if (isOpen == this.isOpen) 
  211.     return 
  212.  
  213.   if (browserVersion == 2)  
  214.   { 
  215.     totalHeight = 0 
  216.     for (i=0; i < this.nChildren; i++) 
  217.       totalHeight = totalHeight + this.children[i].navObj.clip.height 
  218.       subEntries = this.subEntries() 
  219.     if (this.isOpen) 
  220.       totalHeight = 0 - totalHeight 
  221.     for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++) 
  222.       indexOfEntries[fIt].navObj.moveBy(0, totalHeight) 
  223.   }  
  224.   this.isOpen = isOpen;
  225.   if (this.getID()!=foldersTree.getID() && PRESERVESTATE && !this.isOpen) //closing
  226.   {
  227.      currentOpen = GetCookie("clickedFolder")
  228.      if (currentOpen != null) {
  229.          currentOpen = currentOpen.replace(this.getID()+cookieCutter, "")
  230.          SetCookie("clickedFolder", currentOpen)
  231.      }
  232.   }
  233.   if (!this.isOpen && this.isLastOpenedfolder)
  234.   {
  235. lastOpenedFolder = null;
  236. this.isLastOpenedfolder = false;
  237.   }
  238.   propagateChangesInState(this) 
  239.  
  240. function propagateChangesInState(folder) 
  241. {   
  242.   var i=0 
  243.   //Change icon
  244.   if (folder.nChildren > 0 && folder.level>0)  //otherwise the one given at render stays
  245.     folder.nodeImg.src = folder.nodeImageSrc()
  246.   //Change node
  247.   if (USEICONS)
  248.     folder.iconImg.src = folder.iconImageSrc()
  249.   //Propagate changes
  250.   for (i=folder.nChildren-1; i>=0; i--) {
  251.     if (folder.isOpen) 
  252.       folder.children[i].folderMstr(folder.navObj)
  253.     else 
  254.      folder.children[i].esconde() 
  255.   }
  256.  
  257. function escondeFolder() 
  258.   this.escondeBlock()
  259.    
  260.   this.setState(0) 
  261.  
  262. function linkFolderHTML(isTextLink) 
  263.   var docW = "";
  264.   if (this.hreference) 
  265.   { 
  266. if (USEFRAMES)
  267.   docW = docW + "<a href='" + this.hreference + "' TARGET="basefrm" "
  268. else
  269.   docW = docW + "<a href='" + this.hreference + "' TARGET=_top "
  270.         
  271.     if (isTextLink) {
  272.         docW += "id="itemTextLink"+this.id+"" ";
  273.     }
  274.     if (browserVersion > 0) 
  275.       docW = docW + "onClick='javascript:clickOnFolder(""+this.getID()+"")'"
  276.     docW = docW + ">"
  277.   } 
  278.   else 
  279.     docW = docW + "<a>" 
  280.   return docW;
  281.  
  282. function addChild(childNode) 
  283.   this.children[this.nChildren] = childNode 
  284.   childNode.parentObj = this
  285.   this.nChildren++ 
  286.   return childNode 
  287. //The list can contain either a Folder object or a sub list with the arguments for Item 
  288. function addChildren(listOfChildren) 
  289.   this.children = listOfChildren 
  290.   this.nChildren = listOfChildren.length
  291.   for (i=0; i<this.nChildren; i++)
  292.     this.children[i].parentObj = this
  293. function folderSubEntries() 
  294.   var i = 0 
  295.   var se = this.nChildren 
  296.  
  297.   for (i=0; i < this.nChildren; i++){ 
  298.     if (this.children[i].children) //is a folder 
  299.       se = se + this.children[i].subEntries() 
  300.   } 
  301.  
  302.   return se 
  303. function nodeImageSrc() {
  304.   var srcStr = "";
  305.   if (this.isLastNode) //the last child in the children array 
  306.   { 
  307.     if (this.nChildren == 0)
  308.       srcStr = ICONPATH + "ftv2lastnode.gif"
  309.     else
  310.       if (this.isOpen)
  311.         srcStr = ICONPATH + "ftv2mlastnode.gif"  
  312.       else
  313.         srcStr = ICONPATH + "ftv2plastnode.gif"  
  314.   } 
  315.   else 
  316.   { 
  317.     if (this.nChildren == 0)
  318.       srcStr = ICONPATH + "ftv2node.gif"
  319.     else
  320.       if (this.isOpen)
  321.         srcStr = ICONPATH + "ftv2mnode.gif"
  322.       else
  323.         srcStr = ICONPATH + "ftv2pnode.gif"
  324.   }   
  325.   return srcStr;
  326. }
  327. function iconImageSrc() {
  328.   if (this.isOpen)
  329.     return(this.iconSrc)
  330.   else
  331.     return(this.iconSrcClosed)
  332.  
  333. // Definition of class Item (a document or link inside a Folder) 
  334. // ************************************************************* 
  335.  
  336. function Item(itemDescription) // Constructor 
  337.   // constant data 
  338.   this.desc = itemDescription 
  339.   this.level = 0
  340.   this.isLastNode = false
  341.   this.leftSideCoded = ""
  342.   this.parentObj = null
  343.   this.maySelect=true
  344.   this.initialize = initializeItem;
  345.   this.createIndex = createEntryIndex;
  346.   this.forceOpeningOfAncestorFolders = forceOpeningOfAncestorFolders;
  347.   finalizeCreationOfItem(this)
  348. //Assignments that can be delayed when the item is created with folder.addChildren
  349. //The assignments that cannot be delayed are done in addChildren and in initializeFolder
  350. //Additionaly, some assignments are also done in finalizeCreationOfChildDocs itself
  351. function finalizeCreationOfItem(itemArray)
  352. {
  353.   itemArray.navObj = 0 //initialized in render() 
  354.   itemArray.iconImg = 0 //initialized in render() 
  355.   itemArray.iconSrc = ICONPATH + "ftv2doc.gif" 
  356.   itemArray.isRendered = 0
  357.   itemArray.nChildren = 0
  358.   itemArray.prependHTML = ""
  359.  
  360.   // methods 
  361.   itemArray.escondeBlock = escondeBlock
  362.   itemArray.esconde = escondeBlock
  363.   itemArray.folderMstr = folderMstr 
  364.   itemArray.renderOb = drawItem 
  365.   itemArray.totalHeight = totalHeight 
  366.   itemArray.blockStartHTML = blockStartHTML
  367.   itemArray.blockEndHTML = blockEndHTML
  368.   itemArray.getID = getID
  369. }
  370. function initializeItem(level, lastNode, leftSide) 
  371. {  
  372.   this.createIndex() 
  373.   this.level = level
  374.   this.leftSideCoded = leftSide
  375.   this.isLastNode = lastNode
  376.  
  377. function drawItem(insertAtObj) 
  378.   var leftSide = leftSideHTML(this.leftSideCoded)
  379.   var docW = ""
  380.   var fullLink = "href=""+this.link+"" target=""+this.target+"" onClick="clickOnLink('"+this.getID()+"', '"+this.link+"','"+this.target+"');return false;"";
  381.   this.isRendered = 1
  382.   if (this.level>0) 
  383.     if (this.isLastNode) //the last 'brother' in the children array 
  384.     { 
  385.       leftSide = leftSide + "<td valign=top><img src='" + ICONPATH + "ftv2lastnode.gif' width=16 height=22></td>"
  386.     } 
  387.     else 
  388.     { 
  389.       leftSide = leftSide + "<td valign=top background=" + ICONPATH + "ftv2vertline.gif><img src='" + ICONPATH + "ftv2node.gif' width=16 height=22></td>"
  390.     } 
  391.   docW = docW + this.blockStartHTML("item")
  392.   docW = docW + "<tr>" + leftSide + "<td valign=top>"
  393.   if (USEICONS)
  394.       docW = docW + "<a " + fullLink  + " id="itemIconLink"+this.id+"">" + "<img id='itemIcon"+this.id+"' " + "src='"+this.iconSrc+"' border=0>" + "</a>"
  395.   else
  396.   if (this.prependHTML == "")
  397.         docW = docW + "<img src=" + ICONPATH + "ftv2blank.gif height=2 width=3>"
  398.   if (WRAPTEXT)
  399.     docW = docW + "</td>"+this.prependHTML+"<td valign=middle width=100%>"
  400.   else
  401.     docW = docW + "</td>"+this.prependHTML+"<td valign=middle nowrap width=100%>"
  402.   if (USETEXTLINKS) 
  403.     docW = docW + "<a " + fullLink + " id="itemTextLink"+this.id+"">" + this.desc + "</a>"
  404.   else 
  405.     docW = docW + this.desc
  406.   docW = docW + "</td>"
  407.   docW = docW + this.blockEndHTML()
  408.  
  409.   if (insertAtObj == null)
  410.   {
  411.   doc.write(docW)
  412.   }
  413.   else
  414.   {
  415.       insertAtObj.insertAdjacentHTML("afterEnd", docW)
  416.   }
  417.   if (browserVersion == 2) { 
  418.     this.navObj = doc.layers["item"+this.id] 
  419.     if (USEICONS)
  420.       this.iconImg = this.navObj.document.images["itemIcon"+this.id] 
  421.     doc.yPos=doc.yPos+this.navObj.clip.height 
  422.   } else if (browserVersion != 0) { 
  423.     this.navObj = getElById("item"+this.id)
  424.     if (USEICONS)
  425.       this.iconImg = getElById("itemIcon"+this.id)
  426.   } 
  427.  
  428.  
  429. // Methods common to both objects (pseudo-inheritance) 
  430. // ******************************************************** 
  431.  
  432. function forceOpeningOfAncestorFolders() {
  433.   if (this.parentObj == null || this.parentObj.isOpen)
  434.     return
  435.   else {
  436.     this.parentObj.forceOpeningOfAncestorFolders()
  437.     clickOnNodeObj(this.parentObj)
  438.   }
  439. }
  440. function escondeBlock() 
  441.   if (browserVersion == 1 || browserVersion == 3) { 
  442.     if (this.navObj.style.display == "none") 
  443.       return 
  444.     this.navObj.style.display = "none" 
  445.   } else { 
  446.     if (this.navObj.visibility == "hidden") 
  447.       return 
  448.     this.navObj.visibility = "hidden" 
  449.   }     
  450.  
  451. function folderMstr(domObj) 
  452.   if (browserVersion == 1 || browserVersion == 3) { 
  453.     if (t==-1)
  454.       return
  455.     var str = new String(doc.links[t])
  456.     if (str.slice(14,16) != "em")
  457.       return
  458.   }
  459.   if (!this.isRendered)
  460.      this.renderOb(domObj)
  461.   else
  462.     if (browserVersion == 1 || browserVersion == 3) 
  463.       this.navObj.style.display = "block" 
  464.     else 
  465.       this.navObj.visibility = "show" 
  466. function blockStartHTML(idprefix) {
  467.   var idParam = "id='" + idprefix + this.id + "'"
  468.   var docW = ""
  469.   if (browserVersion == 2) 
  470.     docW = "<layer "+ idParam + " top=" + doc.yPos + " visibility=show>"
  471.   else if (browserVersion != 0)
  472.     docW = "<div " + idParam + " style='display:block; position:block;'>"
  473.      
  474.   docW = docW + "<table border=0 cellspacing=0 cellpadding=0 width=100% >"
  475.   return docW
  476. }
  477. function blockEndHTML() {
  478.   var docW = ""
  479.   docW = "</table>"
  480.    
  481.   if (browserVersion == 2) 
  482.     docW = docW + "</layer>"
  483.   else if (browserVersion != 0)
  484.     docW = docW + "</div>"
  485.   return docW
  486. }
  487.  
  488. function createEntryIndex() 
  489.   this.id = nEntries 
  490.   indexOfEntries[nEntries] = this 
  491.   nEntries++ 
  492.  
  493. // total height of subEntries open 
  494. function totalHeight() //used with browserVersion == 2 
  495.   var h = this.navObj.clip.height 
  496.   var i = 0 
  497.    
  498.   if (this.isOpen) //is a folder and _is_ open 
  499.     for (i=0 ; i < this.nChildren; i++)  
  500.       h = h + this.children[i].totalHeight() 
  501.  
  502.   return h 
  503. function leftSideHTML(leftSideCoded) {
  504. var i;
  505. var retStr = "";
  506. for (i=0; i<leftSideCoded.length; i++)
  507. {
  508. if (leftSideCoded.charAt(i) == "1")
  509. {
  510. retStr = retStr + "<td valign=top background=" + ICONPATH + "ftv2vertline.gif><img src='" + ICONPATH + "ftv2vertline.gif' width=16 height=22></td>"
  511. }
  512. if (leftSideCoded.charAt(i) == "0")
  513. {
  514. retStr = retStr + "<td valign=top><img src='" + ICONPATH + "ftv2blank.gif' width=16 height=22></td>"
  515. }
  516. }
  517. return retStr
  518. }
  519. function getID()
  520. {
  521.   //define a .xID in all nodes (folders and items) if you want to PERVESTATE that
  522.   //work when the tree changes. The value eXternal value must be unique for each
  523.   //node and must node change when other nodes are added or removed
  524.   //The value may be numeric or string, but cannot have the same char used in cookieCutter
  525.   if (typeof this.xID != "undefined") 
  526.     return this.xID
  527.   else
  528.     return this.id
  529. }
  530.  
  531. // Events 
  532. // ********************************************************* 
  533.  
  534. function clickOnFolder(folderId) 
  535.   var clicked = findObj(folderId)
  536.   if (typeof clicked=='undefined' || clicked==null)
  537.   {
  538.     alert("Treeview was not able to find the node object corresponding to ID=" + folderId + ". If the configuration file sets a.xID values, it must set them for ALL nodes, including the foldersTree root.")
  539.     return;
  540.   }
  541.   if (!clicked.isOpen) {
  542.     clickOnNodeObj(clicked) 
  543.   }
  544.   if (lastOpenedFolder != null && lastOpenedFolder != folderId)
  545.     clickOnNode(lastOpenedFolder); //sets lastOpenedFolder to null
  546.   if (clicked.nChildren==0) {
  547.     lastOpenedFolder = folderId;
  548.     clicked.isLastOpenedfolder = true
  549.   }
  550.   if (isLinked(clicked.hreference)) {
  551.       highlightObjLink(clicked);
  552.   }
  553.  
  554. function clickOnNode(folderId) 
  555.   fOb = findObj(folderId);
  556.   if (typeof fOb=='undefined' || fOb==null)
  557.   {
  558.     alert("Treeview was not able to find the node object corresponding to ID=" + folderId + ". If the configuration file sets a.xID, it must set foldersTree.xID as well.")
  559.     return;
  560.   }
  561.   clickOnNodeObj(fOb);
  562. }
  563. function clickOnNodeObj(folderObj) 
  564.   var state = 0 
  565.   var currentOpen
  566.  
  567.   state = folderObj.isOpen 
  568.   folderObj.setState(!state) //open<->close  
  569.   if (folderObj.id!=foldersTree.id && PRESERVESTATE)
  570.   {
  571.     currentOpen = GetCookie("clickedFolder")
  572.     if (currentOpen == null)
  573.       currentOpen = ""
  574.     if (!folderObj.isOpen) //closing
  575.     {
  576.       currentOpen = currentOpen.replace(folderObj.getID()+cookieCutter, "")
  577.       SetCookie("clickedFolder", currentOpen)
  578.     }
  579.     else
  580.       SetCookie("clickedFolder", currentOpen+folderObj.getID()+cookieCutter)
  581.   }
  582. }
  583. function clickOnLink(clickedId, target, windowName) {
  584.     highlightObjLink(findObj(clickedId));
  585.     if (isLinked(target)) {
  586.         window.open(target,windowName);
  587.     }
  588. }
  589. function ld  ()
  590. {
  591. return document.links.length-1
  592. }
  593.  
  594. // Auxiliary Functions 
  595. // *******************
  596. function finalizeCreationOfChildDocs(folderObj) {
  597.   for(i=0; i < folderObj.nChildren; i++)  {
  598.     child = folderObj.children[i]
  599.     if (typeof child[0] != 'undefined')
  600.     {
  601.       // Amazingly, arrays can have members, so   a = ["a", "b"]; a.desc="asdas"   works
  602.       // If a doc was inserted as an array, we can transform it into an itemObj by adding 
  603.       // the missing members and functions
  604.       child.desc = child[0] 
  605.       setItemLink(child, GLOBALTARGET, child[1])   
  606.       finalizeCreationOfItem(child)
  607.     }
  608.   }
  609. }
  610. function findObj(id)
  611. {
  612.   var i=0;
  613.   var nodeObj;
  614.   if (typeof foldersTree.xID != "undefined") {
  615.     nodeObj = indexOfEntries[i];
  616.     for(i=0;i<nEntries&&indexOfEntries[i].xID!=id;i++) //may need optimization
  617.       ;
  618.     id = i
  619.   }
  620.   if (id >= nEntries)
  621.     return null; //example: node removed in DB
  622.   else
  623.     return indexOfEntries[id];
  624. }
  625. function isLinked(hrefText) {
  626.     var result = true;
  627.     result = (result && hrefText !=null);
  628.     result = (result && hrefText != '');
  629.     result = (result && hrefText.indexOf('undefined') < 0);
  630.     result = (result && hrefText.indexOf('parent.op') < 0);
  631.     return result;
  632. }
  633. // Do highlighting by changing background and foreg. colors of folder or doc text
  634. function highlightObjLink(nodeObj) {
  635.   if (!HIGHLIGHT || nodeObj==null || nodeObj.maySelect==false) {//node deleted in DB 
  636.     return;
  637.   }
  638.   if (browserVersion == 1 || browserVersion == 3) {
  639.     var clickedDOMObj = getElById('itemTextLink'+nodeObj.id);
  640.     if (clickedDOMObj != null) {
  641.         if (lastClicked != null) {
  642.             var prevClickedDOMObj = getElById('itemTextLink'+lastClicked.id);
  643.             prevClickedDOMObj.style.color=lastClickedColor;
  644.             prevClickedDOMObj.style.backgroundColor=lastClickedBgColor;
  645.         }
  646.         
  647.         lastClickedColor    = clickedDOMObj.style.color;
  648.         lastClickedBgColor  = clickedDOMObj.style.backgroundColor;
  649.         clickedDOMObj.style.color=HIGHLIGHT_COLOR;
  650.         clickedDOMObj.style.backgroundColor=HIGHLIGHT_BG;
  651.     }
  652.   }
  653.   lastClicked = nodeObj;
  654.   if (PRESERVESTATE)
  655.     SetCookie('highlightedTreeviewLink', nodeObj.getID());
  656. }
  657. function insFld(parentFolder, childFolder) 
  658.   return parentFolder.addChild(childFolder) 
  659.  
  660. function insDoc(parentFolder, document) 
  661.   return parentFolder.addChild(document) 
  662. function gFld(description, hreference) 
  663.   folder = new Folder(description, hreference);
  664.   return folder;
  665.  
  666. function gLnk(optionFlags, description, linkData) 
  667.   if (optionFlags>=0) { //is numeric (old style) or empty (error)
  668.     //Target changed from numeric to string in Aug 2002, and support for numeric style was entirely dropped in Mar 2004
  669.     alert("Change your Treeview configuration file to use the new style of target argument in gLnk");
  670.     return;
  671.   }
  672.   newItem = new Item(description);
  673.   setItemLink(newItem, optionFlags, linkData);
  674.   return newItem;
  675. function setItemLink(item, optionFlags, linkData) {
  676.   var targetFlag = "";
  677.   var target = "";
  678.   var protocolFlag = "";
  679.   var protocol = "";
  680.   targetFlag = optionFlags.charAt(0)
  681.   if (targetFlag=="B")
  682.     target = "_blank"
  683.   if (targetFlag=="P")
  684.     target = "_parent"
  685.   if (targetFlag=="R")
  686.     target = "basefrm"
  687.   if (targetFlag=="S")
  688.     target = "_self"
  689.   if (targetFlag=="T")
  690.     target = "_top"
  691.   if (optionFlags.length > 1) {
  692.     protocolFlag = optionFlags.charAt(1)
  693.     if (protocolFlag=="h")
  694.       protocol = "http://"
  695.     if (protocolFlag=="s")
  696.       protocol = "https://"
  697.     if (protocolFlag=="f")
  698.       protocol = "ftp://"
  699.     if (protocolFlag=="m")
  700.       protocol = "mailto:"
  701.   }
  702.   item.link = protocol+linkData;    
  703.   item.target = target
  704. }
  705. //Function created  for backwards compatibility purposes
  706. //Function contents voided in March 2004
  707. function oldGLnk(target, description, linkData)
  708. {
  709. }
  710.  
  711. function preLoadIcons() {
  712. var auxImg
  713. auxImg = new Image();
  714. auxImg.src = ICONPATH + "ftv2vertline.gif";
  715. auxImg.src = ICONPATH + "ftv2mlastnode.gif";
  716. auxImg.src = ICONPATH + "ftv2mnode.gif";
  717. auxImg.src = ICONPATH + "ftv2plastnode.gif";
  718. auxImg.src = ICONPATH + "ftv2pnode.gif";
  719. auxImg.src = ICONPATH + "ftv2blank.gif";
  720. auxImg.src = ICONPATH + "ftv2lastnode.gif";
  721. auxImg.src = ICONPATH + "ftv2node.gif";
  722. auxImg.src = ICONPATH + "ftv2folderclosed.gif";
  723. auxImg.src = ICONPATH + "ftv2folderopen.gif";
  724. auxImg.src = ICONPATH + "ftv2doc.gif";
  725. }
  726. //Open some folders for initial layout, if necessary
  727. function setInitialLayout() {
  728.   if (browserVersion > 0 && !STARTALLOPEN)
  729.     clickOnNodeObj(foldersTree);
  730.   
  731.   if (!STARTALLOPEN && (browserVersion > 0) && PRESERVESTATE)
  732. PersistentFolderOpening();
  733. }
  734. //Used with NS4 and STARTALLOPEN
  735. function renderAllTree(nodeObj, parent) {
  736.   var i=0;
  737.   nodeObj.renderOb(parent)
  738.   if (supportsDeferral)
  739.     for (i=nodeObj.nChildren-1; i>=0; i--) 
  740.       renderAllTree(nodeObj.children[i], nodeObj.navObj)
  741.   else
  742.     for (i=0 ; i < nodeObj.nChildren; i++) 
  743.       renderAllTree(nodeObj.children[i], null)
  744. }
  745. function hideWholeTree(nodeObj, hideThisOne, nodeObjMove) {
  746.   var i=0;
  747.   var heightContained=0;
  748.   var childrenMove=nodeObjMove;
  749.   if (hideThisOne)
  750.     nodeObj.escondeBlock()
  751.   if (browserVersion == 2)
  752.     nodeObj.navObj.moveBy(0, 0-nodeObjMove)
  753.   for (i=0 ; i < nodeObj.nChildren; i++) {
  754.     heightContainedInChild = hideWholeTree(nodeObj.children[i], true, childrenMove)
  755.     if (browserVersion == 2) {
  756.       heightContained = heightContained + heightContainedInChild + nodeObj.children[i].navObj.clip.height
  757.       childrenMove = childrenMove + heightContainedInChild
  758. }
  759.   }
  760.   return heightContained;
  761. }
  762.  
  763. // Simulating inserAdjacentHTML on NS6
  764. // Code by thor@jscript.dk
  765. // ******************************************
  766. if(typeof HTMLElement!="undefined" && !HTMLElement.prototype.insertAdjacentElement){
  767. HTMLElement.prototype.insertAdjacentElement = function (where,parsedNode)
  768. {
  769. switch (where){
  770. case 'beforeBegin':
  771. this.parentNode.insertBefore(parsedNode,this)
  772. break;
  773. case 'afterBegin':
  774. this.insertBefore(parsedNode,this.firstChild);
  775. break;
  776. case 'beforeEnd':
  777. this.appendChild(parsedNode);
  778. break;
  779. case 'afterEnd':
  780. if (this.nextSibling) 
  781. this.parentNode.insertBefore(parsedNode,this.nextSibling);
  782. else this.parentNode.appendChild(parsedNode);
  783. break;
  784. }
  785. }
  786. HTMLElement.prototype.insertAdjacentHTML = function(where,htmlStr)
  787. {
  788. var r = this.ownerDocument.createRange();
  789. r.setStartBefore(this);
  790. var parsedHTML = r.createContextualFragment(htmlStr);
  791. this.insertAdjacentElement(where,parsedHTML)
  792. }
  793. }
  794. function getElById(idVal) {
  795.   if (document.getElementById != null)
  796.     return document.getElementById(idVal)
  797.   if (document.all != null)
  798.     return document.all[idVal]
  799.   
  800.   alert("Problem getting element by id")
  801.   return null
  802. }
  803. // Functions for cookies
  804. // Note: THESE FUNCTIONS ARE OPTIONAL. No cookies are used unless
  805. // the PRESERVESTATE variable is set to 1 (default 0)
  806. // The separator currently in use is ^ (chr 94)
  807. // *********************************************************** 
  808. function PersistentFolderOpening()
  809. {
  810.   var stateInCookie;
  811.   var fldStr=""
  812.   var fldArr
  813.   var fldPos=0
  814.   var id
  815.   var nodeObj
  816.   stateInCookie = GetCookie("clickedFolder");
  817.   SetCookie('clickedFolder', "") //at the end of function it will be back, minus null cases
  818.   if(stateInCookie!=null)
  819.   {
  820.     fldArr = stateInCookie.split(cookieCutter)
  821.     for (fldPos=0; fldPos<fldArr.length; fldPos++)
  822.     {
  823.       fldStr=fldArr[fldPos]
  824.       if (fldStr != "") {
  825.         nodeObj = findObj(fldStr)
  826.         if (nodeObj!=null) //may have been deleted
  827.           if (nodeObj.setState) {
  828.             nodeObj.forceOpeningOfAncestorFolders()
  829.             clickOnNodeObj(nodeObj);
  830.           }
  831.           else
  832.             alert("Internal id is not pointing to a folder anymore.nConsider giving an ID to the tree and external IDs to the individual nodes.")
  833.       }
  834.     }
  835.   }
  836. }
  837. function storeAllNodesInClickCookie(treeNodeObj)
  838. {
  839.   var currentOpen
  840.   var i = 0
  841.   if (typeof treeNodeObj.setState != "undefined") //is folder
  842.   {
  843.     currentOpen = GetCookie("clickedFolder")
  844.     if (currentOpen == null)
  845.       currentOpen = ""
  846.     if (treeNodeObj.getID() != foldersTree.getID())
  847.       SetCookie("clickedFolder", currentOpen+treeNodeObj.getID()+cookieCutter)
  848.     for (i=0; i < treeNodeObj.nChildren; i++) 
  849.         storeAllNodesInClickCookie(treeNodeObj.children[i])
  850.   }
  851. }
  852. function CookieBranding(name) {
  853.   if (typeof foldersTree.treeID != "undefined")
  854.     return name+foldersTree.treeID //needed for multi-tree sites. make sure treeId does not contain cookieCutter
  855.   else
  856.     return name
  857. }
  858.  
  859. function GetCookie(name)
  860. {  
  861.   name = CookieBranding(name)
  862. var arg = name + "=";  
  863. var alen = arg.length;  
  864. var clen = document.cookie.length;  
  865. var i = 0;  
  866. while (i < clen) {    
  867. var j = i + alen;    
  868. if (document.cookie.substring(i, j) == arg)      
  869. return getCookieVal (j);    
  870. i = document.cookie.indexOf(" ", i) + 1;    
  871. if (i == 0) break;   
  872. }  
  873. return null;
  874. }
  875. function getCookieVal(offset) {  
  876. var endstr = document.cookie.indexOf (";", offset);  
  877. if (endstr == -1)    
  878. endstr = document.cookie.length;  
  879. return unescape(document.cookie.substring(offset, endstr));
  880. }
  881. function SetCookie(name, value) 
  882. {  
  883. var argv = SetCookie.arguments;  
  884. var argc = SetCookie.arguments.length;  
  885. var expires = (argc > 2) ? argv[2] : null;  
  886. //var path = (argc > 3) ? argv[3] : null;  
  887. var domain = (argc > 4) ? argv[4] : null;  
  888. var secure = (argc > 5) ? argv[5] : false;  
  889. var path = "/"; //allows the tree to remain open across pages with diff names & paths
  890.   name = CookieBranding(name)
  891. document.cookie = name + "=" + escape (value) + 
  892. ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + 
  893. ((path == null) ? "" : ("; path=" + path)) +  
  894. ((domain == null) ? "" : ("; domain=" + domain)) +    
  895. ((secure == true) ? "; secure" : "");
  896. }
  897. function ExpireCookie (name) 
  898. {  
  899. var exp = new Date();  
  900. exp.setTime (exp.getTime() - 1);  
  901. var cval = GetCookie (name);  
  902.   name = CookieBranding(name)
  903. document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
  904. }
  905. //To customize the tree, overwrite these variables in the configuration file (demoFramesetNode.js, etc.)
  906. var USETEXTLINKS = 0;
  907. var STARTALLOPEN = 0;
  908. var USEFRAMES = 1;
  909. var USEICONS = 1;
  910. var WRAPTEXT = 0;
  911. var PERSERVESTATE = 0; //backward compatibility
  912. var PRESERVESTATE = 0;
  913. var ICONPATH = '';
  914. var HIGHLIGHT = 0;
  915. var HIGHLIGHT_COLOR = 'white';
  916. var HIGHLIGHT_BG    = 'blue';
  917. var BUILDALL = 0;
  918. var GLOBALTARGET = "R"; // variable only applicable for addChildren uses
  919. //Other variables
  920. var lastClicked = null;
  921. var lastClickedColor;
  922. var lastClickedBgColor;
  923. var indexOfEntries = new Array 
  924. var nEntries = 0 
  925. var browserVersion = 0 
  926. var selectedFolder=0
  927. var lastOpenedFolder=null
  928. var t=5
  929. var doc = document
  930. var supportsDeferral = false
  931. var cookieCutter = '^' //You can change this if you need to use ^ in your xID or treeID values
  932. doc.yPos = 0
  933. // Main function
  934. // ************* 
  935. // This function uses an object (navigator) defined in
  936. // ua.js, imported in the main html page (left frame).
  937. function initializeDocument() 
  938.   preLoadIcons();
  939.   switch(navigator.family)
  940.   {
  941.     case 'ie4':
  942.       browserVersion = 1 //Simply means IE > 3.x
  943.       break;
  944.     case 'opera':
  945.       browserVersion = (navigator.version > 6 ? 1 : 0); //opera7 has a good DOM
  946.       break;
  947.     case 'nn4':
  948.       browserVersion = 2 //NS4.x 
  949.       break;
  950.     case 'gecko':
  951.       browserVersion = 3 //NS6.x
  952.       break;
  953.     case 'safari':
  954.       browserVersion = 1 //Safari Beta 3 seems to behave like IE in spite of being based on Konkeror
  955.       break;
  956. default:
  957.       browserVersion = 0 //other, possibly without DHTML  
  958.       break;
  959.   }
  960.   // backward compatibility
  961.   if (PERSERVESTATE)
  962.     PRESERVESTATE = 1;
  963.   supportsDeferral = ((navigator.family=='ie4' && navigator.version >= 5 && navigator.OS != "mac") || browserVersion == 3);
  964.   supportsDeferral = supportsDeferral & (!BUILDALL)
  965.   if (!USEFRAMES && browserVersion == 2)
  966.    browserVersion = 0;
  967.   eval(String.fromCharCode(116,61,108,100,40,41))
  968.   //If PRESERVESTATE is on, STARTALLOPEN can only be effective the first time the page 
  969.   //loads during the session. For subsequent (re)loads the PRESERVESTATE data stored 
  970.   //in cookies takes over the control of the initial expand/collapse
  971.   if (PRESERVESTATE && GetCookie("clickedFolder") != null)
  972.     STARTALLOPEN = 0
  973.   //foldersTree (with the site's data) is created in an external .js (demoFramesetNode.js, for example)
  974.   foldersTree.initialize(0, true, "") 
  975.   if (supportsDeferral && !STARTALLOPEN) {
  976.       foldersTree.renderOb(null) //delay construction of nodes
  977.   }
  978.   else {
  979.     renderAllTree(foldersTree, null);
  980.     if (PRESERVESTATE && STARTALLOPEN)
  981.       storeAllNodesInClickCookie(foldersTree)
  982.     //To force the scrollable area to be big enough
  983.     if (browserVersion == 2) 
  984.       doc.write("<layer top=" + indexOfEntries[nEntries-1].navObj.top + ">&nbsp;</layer>") 
  985.     if (browserVersion != 0 && !STARTALLOPEN)
  986.       hideWholeTree(foldersTree, false, 0)
  987.   }
  988.   setInitialLayout()
  989.   if (PRESERVESTATE && GetCookie('highlightedTreeviewLink')!=null  && GetCookie('highlightedTreeviewLink')!="") {
  990.     var nodeObj = findObj(GetCookie('highlightedTreeviewLink'))
  991.     if (nodeObj!=null){
  992.       nodeObj.forceOpeningOfAncestorFolders()
  993.       highlightObjLink(nodeObj);
  994.     }
  995.     else
  996.       SetCookie('highlightedTreeviewLink', '')
  997.   }
  998.