<!--

//****************************************************************
// You are free to copy the "Folder-Tree" script as long as you
// keep this copyright notice:
//
// original script concepts adopted from
//     Author:  Marcelino Alves Martins (martins@hks.com) December '97.
//     Located: http://www.geocities.com/Paris/LeftBank/2178/
//
// *** SEE <WhatsNew.txt> FOR A LISTING OF MODIFICATIONS MADE ***
//****************************************************************

function Folder(folderDescription, hreference) //CONSTRUCTOR
{
  //CONSTANT DATA
  this.desc = folderDescription
  this.hreference = hreference
  this.id = -1
  this.navObj = 0
  this.iconImg = 0
  this.nodeImg = 0
  this.isLastNode = 0

  //DYNAMIC DATA
  this.isOpen = true
  this.iconSrc = dfOpen
  this.children = new Array
  this.nChildren = 0

  //METHODS
  this.initialize = initFolder
  this.setState = setStateFolder
  this.addChild = addChild
  this.createIndex = createEntryIndex
  this.hide = hideFolder
  this.display = display
  this.renderOb = drawFolder
  this.totalHeight = totalHeight
  this.subEntries = folderSubEntries
  this.outputLink = outputFolderLink
  this.outputLink2 = outputFolderTextLink
  this.DOFimages = initDOFimages
  this.CFimages = initCFimages
}

function setStateFolder(isOpen)
{
  var subEntries
  var totalHeight
  var fIt = 0
  var i=0

  if (isOpen == this.isOpen)
    return

  if (browserVersion == 2) {
    totalHeight = 0

    for (i=0; i < this.nChildren; i++)
      totalHeight = totalHeight + this.children[i].navObj.clip.height
    subEntries = this.subEntries()

    if (this.isOpen)
      totalHeight = 0 - totalHeight

    for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++)
      indexOfEntries[fIt].navObj.moveBy(0, totalHeight)
  }

  this.isOpen = isOpen
  propagateChangesInState(this)

}

function propagateChangesInState(folder)
{
  var i=0

  if (folder.isOpen) {
    if (folder.nodeImg) {
      if (folder.isLastNode)
        folder.nodeImg.src = srcIMAGES+"mlastnode.gif"
      else
	     folder.nodeImg.src = srcIMAGES+"mnode.gif"
	 }

    if ((CUSTOMIZE) && (DOFimages[folder.id]))
      folder.iconImg.src = srcIMAGES+DOFimages[folder.id]
    else
      folder.iconImg.src = dfOpen

    for (i=0; i<folder.nChildren; i++)
      folder.children[i].display()
  }
  else {
    if (folder.nodeImg) {
      if (folder.isLastNode)
        folder.nodeImg.src = srcIMAGES+"plastnode.gif"
      else
	     folder.nodeImg.src = srcIMAGES+"pnode.gif"
	 }

    if ((CUSTOMIZE) && (CFimages[folder.id]))
      folder.iconImg.src = srcIMAGES+CFimages[folder.id]
    else
      folder.iconImg.src = dfClosed

    for (i=0; i<folder.nChildren; i++)
      folder.children[i].hide()
  }
}

function hideFolder()
{
  if (browserVersion == 1) {
    if (this.navObj.style.display == "none")
      return
    this.navObj.style.display = "none"
  }
  else {
    if (this.navObj.visibility == "hidden")
      return
    this.navObj.visibility = "hidden"
  }

  this.setState(0)
}

function initFolder(level, lastNode, leftSide)
{
  var i=0
  var nc
  var auxEv = ""
  var a = ""
  var img1 = "mnode.gif"
  var img2 = "vertline.gif"
  var LN = 0

  nc = this.nChildren

  this.createIndex()

  // ASSOCIATE CLICK/MOUSEOVER METHODS WITH THE (+/-) SIGN ICONS
  if ((browserVersion>0) && (USESIGNLINKS>0)) {
    if (USESIGNLINKS>1)
	   auxEv=auxEv+"<a href='javascript:clickOnNode("+this.id+")' onMouseover='javascript:clickOnNode("+this.id+")'; return true>"
	else
      auxEv = "<a href='javascript:clickOnNode("+this.id+")'; return true>"
	
	a = "</a>"
  }

  if (level>0) {
    if (lastNode) {   //the last 'brother' in the children array
	  img1 = "mlastnode.gif"
	  img2 = "blank.gif"
	  LN = 1
    }
    this.renderOb(leftSide+auxEv+"<img name='nodeIcon"+this.id+"' src='"+srcIMAGES+img1+"' border=0>"+a)
    leftSide = leftSide+"<img src='"+srcIMAGES+img2+"' border=0>"
    this.isLastNode = LN
  }
  else
    this.renderOb("")

  if (nc > 0) {
    level = level + 1
    for (i=0 ; i < this.nChildren; i++) {
      if (i == this.nChildren-1)
        this.children[i].initialize(level, 1, leftSide)
      else
        this.children[i].initialize(level, 0, leftSide)
    }
  }
}

function drawFolder(leftSide)
{

  if (browserVersion == 2) {
    if (!doc.yPos)
      doc.yPos=8
    doc.write("<layer id='folder"+this.id+"' top="+doc.yPos+" visibility=hidden>")
  }

  if ((this.id==0) && LOGO)
    doc.write("<table border=0 cellspacing=0 cellpadding=0><tr><td valign=middle nowrap><br><img src="+srcLogo+"><br></td></tr></table>")

  if (browserVersion == 1)
    doc.write("<table id='folder"+this.id+"' style='position:block;' border=0 cellspacing=0 cellpadding=0><tr><td valign=middle nowrap>"+leftSide)
  else
    doc.write("<table border=0 cellspacing=0 cellpadding=0><tr><td valign=middle nowrap>"+leftSide)
  
  this.outputLink() //CALL FOLDER ICON

  if (this.id==0) doc.write("<br>")

  if ((CUSTOMIZE) && (DOFimages[this.id]))
    doc.write("<img name='folderIcon"+this.id+"' src='"+srcIMAGES+DOFimages[this.id]+"' border=0></a></td><td valign=middle nowrap>")
  else 
    doc.write("<img name='folderIcon"+this.id+"' src='"+this.iconSrc+"' border=0></a></td><td valign=middle nowrap>")

  if (this.id==0) doc.write("<br>")

  if ((FOLDERTEXTLINKS>0) && (this.hreference))
	 this.outputLink2()  //CALL TO ASSOCIATE LINK WITH FOLDER TEXT
  else
    doc.write(SPACE+this.desc)
  
  doc.write("</td></table>")

  if (browserVersion == 2)
    doc.write("</layer>")

  if (browserVersion == 1) {
    this.navObj = doc.all["folder"+this.id]
    this.iconImg = doc.all["folderIcon"+this.id]
    this.nodeImg = doc.all["nodeIcon"+this.id]
  }
  else if (browserVersion == 2) {
      this.navObj = doc.layers["folder"+this.id]
      this.iconImg = this.navObj.document.images["folderIcon"+this.id]
      this.nodeImg = this.navObj.document.images["nodeIcon"+this.id]
      doc.yPos=doc.yPos+this.navObj.clip.height
    }
}

function outputFolderLink()
{
  if ((this.hreference) && (USEFOLDERLINKS % 2)) {
    if (browserVersion>0) {
	  if ((USEFOLDERLINKS==1) || (USEFOLDERLINKS==5))
	    doc.write("<a href='"+this.hreference+"' TARGET=\""+frmNAME+"\" onClick='javascript:clickOnFolder("+this.id+")' onMouseover='javascript:clickOnFolder("+this.id+")'; return true>")
	  else
	    doc.write("<a href='"+this.hreference+"' TARGET=\""+frmNAME+"\" onClick='javascript:clickOnFolder("+this.id+")'; return true>")
	}
	else
	  doc.write("<a href='"+this.hreference+"' TARGET=\""+frmNAME+"\">")
  }

  else {
    if ((USEFOLDERLINKS==2) || (USEFOLDERLINKS==6) || (USEFOLDERLINKS==1) || (USEFOLDERLINKS==5))
      doc.write("<a href='javascript:clickOnFolder("+this.id+")'  onMouseover='javascript:clickOnFolder("+this.id+")'; return true>")
	else
      doc.write("<a href='javascript:clickOnFolder("+this.id+")'; return true>")
  }
}

function outputFolderTextLink()
{
  // USE OF TEXT LINKS WITH FOLDER
  if ((this.hreference) && (FOLDERTEXTLINKS>0)) {
    if (browserVersion>0) {
	  if (FOLDERTEXTLINKS==2)
	    doc.write(SPACE+"<a href='"+this.hreference+"' TARGET=\""+frmNAME+"\" onClick='javascript:clickOnFolder("+this.id+")' onMouseover=parent.frames[frmNO].location.href='"+this.hreference+"'; return true>"+this.desc+"</a>")
	  else
	    doc.write(SPACE+"<a href='"+this.hreference+"' TARGET=\""+frmNAME+"\" onClick='javascript:clickOnFolder("+this.id+")'; return true>"+this.desc+"</a>")
	 }
    else
      doc.write(SPACE+"<a href='"+this.hreference+"' TARGET=\""+frmNAME+"\">"+this.desc+"</a>")
  }
}

function addChild(childNode)
{
  this.children[this.nChildren] = childNode
  this.nChildren++
  return childNode
}

function folderSubEntries()
{
  var i = 0
  var se = this.nChildren

  for (i=0; i < this.nChildren; i++)
    if (this.children[i].children) //is a folder
      se = se + this.children[i].subEntries()

  return se
}


// DEFINITION OF CLASS Item (a document or link inside a Folder)
// *************************************************************

function Item(itemDescription, itemLink) //CONSTRUCTOR
{
  // CONSTANT DATA
  this.desc = itemDescription
  this.link = itemLink
  this.id = -1      //INITIALIZED IN initalize()
  this.navObj = 0   //INITIALIZED IN render()
  this.iconImg = 0  //INITIALIZED IN render()

  // METHODS
  this.initialize = initItem
  this.createIndex = createEntryIndex
  this.hide = hideItem
  this.display = display
  this.renderOb = drawItem
  this.totalHeight = totalHeight
}

function hideItem()
{
  if (browserVersion == 1) {
    if (this.navObj.style.display == "none")
      return
    this.navObj.style.display = "none"
  }
  else {
    if (this.navObj.visibility == "hidden")
      return
    this.navObj.visibility = "hidden"
  }
}

function initItem(level, lastNode, leftSide)
{
  var img1 = "node.gif"
  var img2 = "vertline.gif"

  this.createIndex()

  if (level>0) {
    if (lastNode) {     //THE LAST 'brother' IN THE CHILDREN ARRAY
	   img1 = "lastnode.gif"
		img2 = "blank.gif"
    }
    this.renderOb(leftSide+"<img src='"+srcIMAGES+img1+"' border=0>")
    leftSide = leftSide+"<img src='"+srcIMAGES+img2+"' border=0>"
  }
  else
    this.renderOb("")
}

function drawItem(leftSide)
{
  if (browserVersion == 2)
    doc.write("<layer id='item"+this.id+"' top="+doc.yPos+" visibility=hidden><table border=0 cellspacing=0 cellpadding=0><tr><td valign=middle nowrap>"+leftSide)

  if (browserVersion == 1)
    doc.write("<table id='item"+this.id+"' style='position:block;' border=0 cellspacing=0 cellpadding=0><tr><td valign=middle nowrap>"+leftSide)

  if ((USEDOCLINKS>0) && (this.link!="")) {
	if (USEDOCLINKS==2)
	  doc.write("<a href="+this.link+" onMouseover=parent.frames[frmNO].location="+this.link+"; return true><img id='itemIcon"+this.id+"' ")
    else	  
      doc.write("<a href="+this.link+"><img id='itemIcon"+this.id+"' ")
  }
  else
    doc.write("<img id='itemIcon"+this.id+"' ")

  if ((CUSTOMIZE) && (DOFimages[this.id]))
    doc.write("src='"+srcIMAGES+DOFimages[this.id]+"' border=0>")
  else
    doc.write("src='"+dfDoc+"' border=0>")

  if ((USEDOCLINKS>0) && (this.link!="")) doc.write("</a></td><td valign=middle nowrap>")
  else
    doc.write("</td><td valign=middle nowrap>")

  if ((DOCTEXTLINKS>0) && (this.link!="")) {
    if (DOCTEXTLINKS==2)
	  doc.write(SPACE+"<a href="+this.link+" onmouseover=parent.frames[frmNO].location="+this.link+"; return true>"+this.desc+"</a></table>")
    else
      doc.write(SPACE+"<a href="+this.link+">"+this.desc+"</a></table>")
  }
  else
    doc.write(SPACE+this.desc+"</table>")

  if (browserVersion == 2)
    doc.write("</layer>")

  if (browserVersion == 1) {
    this.navObj = doc.all["item"+this.id]
    this.iconImg = doc.all["itemIcon"+this.id]
  }
  else if (browserVersion == 2) {
      this.navObj = doc.layers["item"+this.id]
      this.iconImg = this.navObj.document.images["itemIcon"+this.id]
      doc.yPos=doc.yPos+this.navObj.clip.height
  }
}


// METHODS COMMON TO BOTH OBJECTS (pseudo-inheritance)
// ********************************************************

function display()
{
  if (browserVersion == 1)
    this.navObj.style.display = "block"

  else
    this.navObj.visibility = "show"
}

function createEntryIndex()
{
  this.id = nEntries
  indexOfEntries[nEntries] = this
  nEntries++
}

// TOTAL HEIGHT OF SUBENTRIES OPEN
function totalHeight() //USED WITH [browserVersion] == 2
{
  var h = this.navObj.clip.height
  var i = 0

  if (this.isOpen) //IS A FOLDER AND _IS_ OPEN
    for (i=0 ; i < this.nChildren; i++)
      h = h + this.children[i].totalHeight()

  return h
}


// EVENTS
// *********************************************************

function clickOnFolder(folderId)
{
  var clicked = indexOfEntries[folderId]
  var topBranch = this.indexOfEntries[topNode]
  var prevBranch = this.indexOfEntries[prevNode]
  var i

  // USE OF CLICK METHOD ON FOLDER LINK
  if ((USEFOLDERLINKS>0) && (USEFOLDERLINKS<5)) {
	// COLLAPSE THE BRANCH WHEN ACCESSING A NEW BRANCH
	if (prevNode!=folderId) {
	  if ((prevNode!=0) && (prevBranch.isOpen) && (clicked.level<=prevBranch.level))
	    clickOnNode(prevNode)
	  if (clicked.level==1) {
        if ((topNode!=folderId) && (topNode!=0) && (topBranch.isOpen)) {
		  for (i=0; i<topBranch.nChildren; i++)
		    if (topBranch.isOpen)
		      clickOnNode(topNode)
		  }
		topNode=folderId
		}
	  prevNode = folderId
	  }
    clickOnNode(folderId)
	}

  else if (USEFOLDERLINKS>4)
    if (!clicked.isOpen)
	    clickOnNode(folderId)

  return

}

function clickOnNode(folderId)
{
  var clickedFolder = 0
  var state = 0

  clickedFolder = indexOfEntries[folderId]
  state = clickedFolder.isOpen

  clickedFolder.setState(!state) //open<->close
}

function initDoc()
{
  var i = 0

  if (doc.all)
    browserVersion = 1 //IE4
  else if (doc.layers)
    browserVersion = 2 //NS4
  else
    browserVersion = 0 //other

  foldersTree.CFimages()
  foldersTree.DOFimages()
  foldersTree.initialize(0, 1, "")
  foldersTree.display()

  if (browserVersion > 0) {
    if (browserVersion==2)
      doc.write("<layer top="+indexOfEntries[nEntries-1].navObj.top+" visibility=hidden></layer>")

    clickOnFolder(0)      // CLOSE THE ENTIRE TREE
	 if (STATEOFTREE==1)
      clickOnNode(0)      // OPEN THE ROUTE FOLDER ==> LEVEL 1

	if (STATEOFTREE == 0)  // OPEN ENTIRE TREE-FOLDER
	  {
	   for (i=0; i<nEntries; i++)
	   { 
          if (this.indexOfEntries[i].children)
             {
              clickOnNode(i)
             }
         }
       }
  }
}


// AUXILIARY FUNCTIONS FOR FOLDER-TREE BACKWARD COMPATIBILITY
// **********************************************************

function getFolder(description, hreference)
{
  folder = new Folder(description, hreference)
  return folder
}
function closeTree()
{
  clickOnNode(0);
  clickOnNode(0);
}
function openTree()
{
  closeTree();
  for (i=0; i<nEntries; i++)
    { 
     if (this.indexOfEntries[i].children && (!this.indexOfEntries[i].isOpen))
       {
        clickOnNode(i)
       }
    }
}
function getLink(target, description, linkData)
{
  fullLink = ""

  if (linkData != "") {
    if (target==0)
      fullLink = "'"+linkData+"' target=\""+frmNAME+"\""
    else if (target==1)
	   fullLink = "'http://"+linkData+"' target=_blank"
	 else if (target==2)
	   fullLink = "'ftp://"+linkData+"' target=_blank"
	 else if (target==3)
	   fullLink = "'http://"+linkData+"' target=\""+frmNAME+"\""
	 else if (target==4)
	   fullLink = "'ftp://"+linkData+"' target=\""+frmNAME+"\""
	 else if (target==5)
	   fullLink = "'"+linkData+"' target=\_top"       //make a link for the whole page
       else if (target==6)
	    fullLink = "javascript:closeTree();"
       else  
          fullLink = "javascript:openTree();"
 }

  linkItem = new Item(description, fullLink)
  return linkItem
}

function insertFolder(parentFolder, childFolder)
{
  return parentFolder.addChild(childFolder)
}

function insertDoc(parentFolder, document)
{
  parentFolder.addChild(document)
}


// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function initDOFimages()
{
  if (CUSTOMIZE) {
	 DOFimages[0] = "raopen.gif"
	 DOFimages[1] = "home.gif"
       DOFimages[2] = "bookc.gif"
       DOFimages[3] = "booko.gif"
    }
  return DOFimages
}

function initCFimages()
{
  if (CUSTOMIZE) {
	 CFimages[0] = "raclosed.gif"
  }
  return CFimages
}
// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


// Global variables
// ****************

// USE OF FOLDER TEXT LINKS
FOLDERTEXTLINKS = 1 // 0 == NULL
                    // 1 == (CLICK) && (NO MOUSEOVER)
				    // 2 == (CLICK) && (MOUSEOVER)

// USE OF DOCUMENT TEXT LINKS
DOCTEXTLINKS = 1    // 0 == NULL
                    // 1 == (CLICK) && (NO MOUSEOVER)
					// 2 == (CLICK) && (MOUSEOVER)

// USE OF SIGN ICON LINKS:  no URL linkage
USESIGNLINKS = 1    // 0 == NULL
                    // 1 == (CLICK OPEN/CLOSE) && (NO MOUSEOVER)
					// 2 == (CLICK+MOUSEOVER OPEN/CLOSE)

// USE OF FOLDER LINKS
USEFOLDERLINKS = 3  // 0 == NULL
                    // 1 == (CLICK+MOUSEOVER OPEN/CLOSE) && (CLICK URL)
					// 2 == (CLICK+MOUSEOVER OPEN/CLOSE) && (NO URL)
					// 3 == (CLICK OPEN/CLOSE) && (NO MOUSEOVER) && (CLICK URL)
                    // 4 == (CLICK OPEN/CLOSE) && (NO MOUSEOVER) && (NO URL)
					// 5 == (CLICK+MOUSEOVER OPEN) && (NO CLOSE) && (CLICK URL)
					// 6 == (CLICK+MOUSEOVER OPEN) && (NO CLOSE) && (NO URL)
					// 7 == (CLICK OPEN) && CLICK URL
					// 8 == (CLICK OPEN) && NO URL

// USE OF DOCUMENT ICON LINKS:  URL linkage
USEDOCLINKS = 1     // 0 == NULL
                    // 1 == (CLICK) && (NO MOUSEOVER)
					// 2 == (CLICK) && (MOUSEOVER)

// INITIALIZE STATE OF TREE-FOLDER STRUCTURE
STATEOFTREE = 0     // 0 == OPEN ENTIRE TREE-FOLDER
                    // 1 == ROUTE FOLDER ==> LEVEL 1
					// 2 == NO ROUTE ======> LEVEL 0

indexOfEntries = new Array

nEntries = 0
doc = document
browserVersion = 0
selectedFolder = 0

frmNO = 1               // THE VALUE ASSIGNED CORRESPONDS TO THE TARGET FRAME
frmNAME = "main"     // NAME OF ASSIGNED TARGET FRAME
srcIMAGES = "images/"   // LOCATION OF FOLDER-TREE IMAGES
CUSTOMIZE = 1           // 1=CUSTOMIZE DOCUMENT && FOLDER ICONS, 0=DEFAULT
LOGO = 0                // 1=INSERT COMPANY LOGO, 0=DEFAULT
SPACE = "&nbsp;"        // THE COMMAND FOR A SPACE BETWEEN ICONS AND LABELS

DOFimages = new Array // ARRAY OF CUSTOMIZED DOC ICONS
CFimages  = new Array // ARRAY OF CUSTOMIZED FOLDER ICONS

// LIST OF DEFAULT ICONS
dfOpen   = srcIMAGES+"fopen.gif"
dfClosed = srcIMAGES+"fclosed.gif"
dfDoc    = srcIMAGES+"doc2.gif"
srcLogo  = srcIMAGES+"theLogo.gif"

// VARIABLES FOR FONT COLOR and SIZE OF LABELS
routeFONT = "<font face=Arial size=3 color=800000>"
fldFONT   = "<font face=Arial size=1 color=800000>"
docFONT   = "<font face=Arial size=1 color=000000>"
//docFONT = "<span onmouseover=this.style.fontWeight='bold' onmouseout=this.style.fontWeight=''; return true>"

// PREVIOUS && CURRENT OPEN FOLDER NODES
prevNode = 0
topNode = 0

//-->
