// Global variables 
// **************** 
 
var indexOfEntries = new Array();
var nEntries = 0;
var selectedFolder = 0;

function Folder(desc, url, icon)
{ 
  //constant data 
  this.desc = desc;
  this.url = url;
  this.id = -1;
  this.navObj = 0;
  this.iconImg = 0;
  this.nodeImg = 0;
  this.isLastNode = 0;
  
  //dynamic data 
  this.isOpen = true;
  this.iconSrc = icon;
  this.children = new Array;
  this.nChildren = 0;

  //methods 
  this.initialize = initializeFolder;
  this.setState = setStateFolder;
  this.addChild = addChild;
  this.createIndex = createEntryIndex;
  this.hide = hideFolder;
  this.display = display;
  this.renderOb = drawFolder;
  this.subEntries = folderSubEntries;
  this.outputLink = outputFolderLink;
} 
 
function setStateFolder(isOpen) 
{ 
  var subEntries;
  var fIt = 0;
  var i = 0;
 
  if(isOpen == this.isOpen) 
    return;
 
  this.isOpen = isOpen;
  propagateChangesInState(this);
} 
 
function propagateChangesInState(folder) 
{   
  var i = 0;
 
  if(folder.isOpen) 
  { 
    if(folder.nodeImg)
    {
      if(folder.isLastNode) 
        folder.nodeImg.src = "/img/tree_mlastnode.gif";
      else 
	     folder.nodeImg.src = "/img/tree_mnode.gif";
    }
    
    folder.iconImg.src = folder.iconSrc;

    for(i = 0; i < folder.nChildren; i++)
    {
      folder.children[i].display();
    }
  } 
  else 
  { 
    if(folder.nodeImg)
    {
      if(folder.isLastNode) 
        folder.nodeImg.src = "/img/tree_plastnode.gif";
      else 
	     folder.nodeImg.src = "/img/tree_pnode.gif";
    }
    
    folder.iconImg.src = folder.iconSrc;

    for(i = 0; i < folder.nChildren; i++)
    {
      folder.children[i].hide();
    }
  }  
} 
 
function hideFolder() 
{ 
  if(this.navObj.style.display == "none") 
    return;
  
  this.navObj.style.display = "none";   
  this.setState(0);
} 
 
function initializeFolder(level, lastNode, leftSide) 
{
  var j = 0;
  var i = 0;
  var numberOfFolders;
  var numberOfDocs;
  var nc;
  var auxEv = "";

  nc = this.nChildren;   
  this.createIndex();
 
  auxEv = "<a href='javascript:clickOnNode("+this.id+")'>";
 
  if(level>0)
  {
    if(lastNode) //the last 'brother' in the children array 
    { 
      this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' id='nodeIcon" + this.id + "' src='/img/tree_mlastnode.gif' width=16 height=22 border=0></a>");
      leftSide = leftSide + "<img src='/img/tree_blank.gif' width=16 height=22>";
      this.isLastNode = 1;
    } 
    else 
    { 
      this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' id='nodeIcon" + this.id + "' src='/img/tree_mnode.gif' width=16 height=22 border=0></a>");
      leftSide = leftSide + "<img src='/img/tree_vertline.gif' width=16 height=22>";
      this.isLastNode = 0;
    }
  }
  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) 
{ 
  document.write("<table ");
  document.write(" id='folder" + this.id + "' style='position:block;' ");
  document.write(" border=0 cellspacing=0 cellpadding=0 class='body13gray19'>");
  document.write("<tr><td>");
  document.write(leftSide);
  if(this.url)
  {
     this.outputLink();
     document.write("<img name='folderIcon" + this.id + "' ");
     document.write("id='folderIcon" + this.id + "' ");
     document.write("src='" + this.iconSrc+"' border=0></a>");
     document.write("</td><td valign=middle nowrap>");
     this.outputLink() 
     document.write(this.desc + "</a>");
  }
  else
  {
     document.write("<img name='folderIcon" + this.id + "' ");
     document.write("id='folderIcon" + this.id + "' ");
     document.write("src='" + this.iconSrc+"' border=0>");
     document.write("</td><td valign=middle nowrap>");
     document.write(this.desc);
  }
  document.write("</td>");
  document.write("</table>");
   
  this.navObj = document.getElementById("folder"+this.id);
  this.iconImg = document.getElementById("folderIcon"+this.id);
  this.nodeImg = document.getElementById("nodeIcon"+this.id);
} 
 
function outputFolderLink() 
{ 
  if (this.url) 
  { 
    document.write("<a href='" + this.url + "' ");
    document.write("onClick='javascript:clickOnFolder("+this.id+")'");
    document.write(">");
  } 
  else 
    document.write("<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, itemIcon) // 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() 
  this.iconSrc = itemIcon;
 
  // methods 
  this.initialize = initializeItem;
  this.createIndex = createEntryIndex;
  this.hide = hideItem;
  this.display = display;
  this.renderOb = drawItem;
} 
 
function hideItem() 
{ 
  if (this.navObj.style.display == "none") 
    return;
  this.navObj.style.display = "none";
} 
 
function initializeItem(level, lastNode, leftSide) 
{  
  this.createIndex();
 
  if (level>0) 
    if (lastNode) //the last 'brother' in the children array 
    { 
      this.renderOb(leftSide + "<img src='/img/tree_lastnode.gif' width=16 height=22>");
      leftSide = leftSide + "<img src='/img/tree_blank.gif' width=16 height=22>";
    } 
    else 
    { 
      this.renderOb(leftSide + "<img src='/img/tree_node.gif' width=16 height=22>");
      leftSide = leftSide + "<img src='/img/tree_vertline.gif' width=16 height=22>";
    } 
  else 
    this.renderOb("");
} 
 
function drawItem(leftSide) 
{ 
  document.write("<table ");
  document.write(" id='item" + this.id + "' style='position:block;' ");
  document.write(" border=0 cellspacing=0 cellpadding=0 class='body13gray19'>");
  document.write("<tr><td>");
  document.write(leftSide);
  document.write("<a href=" + this.link + ">");
  document.write("<img id='itemIcon"+this.id+"' ");
  document.write("src='"+this.iconSrc+"' border=0>");
  document.write("</a>");
  document.write("</td><td valign=middle nowrap>");
  document.write("<a href=" + this.link + ">" + this.desc + "</a>");
  document.write("</table>");
   
  this.navObj = document.getElementById("item"+this.id);
  this.iconImg = document.getElementById("itemIcon"+this.id);
} 
 
 
// Methods common to both objects (pseudo-inheritance) 
// ******************************************************** 
 
function display() 
{ 
  this.navObj.style.display = "block";
} 
 
function createEntryIndex() 
{ 
  this.id = nEntries;
  indexOfEntries[nEntries] = this;
  nEntries++;
} 
 
// Events 
// ********************************************************* 
 
function clickOnFolder(folderId) 
{ 
  var clicked = indexOfEntries[folderId];
 
  // do not open folder when click
  return ;
  
  if (!clicked.isOpen)
    clickOnNode(folderId);
 
  return;
 
  if (clicked.isSelected)
    return;
} 
 
function clickOnNode(folderId) 
{ 
  var clickedFolder = 0;
  var state = 0;
 
  clickedFolder = indexOfEntries[folderId];
  state = clickedFolder.isOpen;
 
  clickedFolder.setState(!state); //open<->close  
} 
 
function BuildTree(root) 
{ 
  root.initialize(0, 1, "");
  root.display();

  document.write("<layer top="+indexOfEntries[nEntries-1].navObj.top+">&nbsp;</layer>");
 
  // close the whole tree 
  clickOnNode(0);
  // open the root folder 
  clickOnNode(0);
} 

function NewFolder(desc, url, icon) 
{ 
  folderObj = new Folder(desc, url, icon);
  return folderObj;
} 
 
function NewItem(desc, url, icon) 
{ 
  url = "'" + url + "'";
  itemObj = new Item(desc, url, icon);
  return itemObj;
} 
