// Global variables 
// **************** 

//These two variables are overwriten on defineMyTree.js if needed be
USETEXTLINKS   = 1;
STARTALLOPEN   = 0;
indexOfEntries = new Array;
doc            = document;
browserVersion = 0;

//------------------------------------------------------------------------------
// Folder contructor

function Folder(folderDescription, hreference, linkClass, linkTarget) {
  
  descArr = folderDescription.split("|");
  

  // constant data
  this.desc       = descArr[0];
  this.closeImg   = descArr[1]? descArr[1]: "/kserver/images/ftv2folderclosed.gif";
  this.openImg    = descArr[2]? descArr[2]: "/kserver/images/ftv2folderopen.gif";
  this.hreference = hreference;
  this.linkClass  = linkClass;
  this.linkTarget = linkTarget;
  this.id         = -1;
  this.navObj     = 0;
  this.iconImg    = 0;
  this.nodeImg    = 0;
  this.isLastNode = 0;
  

  // dynamic data
  this.isOpen    = true;
  this.iconSrc   = this.openImg;
  this.children  = new Array;
  

  // methods
  this.initialize   = initializeFolder;
  this.setState     = setStateFolder;
  this.addChild     = addChild;
  this.createIndex  = createEntryIndex;
  this.escondeBlock = escondeBlock;
  this.esconde      = escondeFolder;
  this.mostra       = mostra;
  this.renderOb     = drawFolder;
  this.totalHeight  = totalHeight;
  this.subEntries   = folderSubEntries;
  this.outputLink   = outputFolderLink;
  this.blockStart   = blockStart;
  this.blockEnd     = blockEnd;
} 

//------------------------------------------------------------------------------
function initializeFolder(level, lastNode, leftSide) {
  var j  = 0;
  var i  = 0;
  var nc = this.children.length;
  
  this.createIndex();
  
  var auxEv = (browserVersion > 0)? "<A HREF='javascript:clickOnNode(" + this.id + ")'>": "<A>";
  
  if (level > 0) {
    if (lastNode) {   //the last child in the children array
      this.renderOb(leftSide + auxEv + "<IMG NAME='nodeIcon" + this.id + "' ID='nodeIcon" + this.id + "' SRC='/kserver/images/ftv2mlastnode.gif' WIDTH=16 HEIGHT=22 BORDER=0></A>");
      leftSide += "<IMG SRC='/kserver/images/ftv2blank.gif' WIDTH=16 HEIGHT=22>";
      this.isLastNode = 1;
    }
    else {
      this.renderOb(leftSide + auxEv + "<IMG NAME='nodeIcon" + this.id + "' ID='nodeIcon" + this.id + "' SRC='/kserver/images/ftv2mnode.gif' WIDTH=16 HEIGHT=22 BORDER=0></A>");
      leftSide += "<IMG SRC='/kserver/images/ftv2vertline.gif' WIDTH=16 HEIGHT=22>";
      this.isLastNode = 0;
    }
  }
  else {
    this.renderOb("");
  }
  
  if (nc > 0) {
    level++;
    for (i = 0; i < this.children.length; i++) {
      this.children[i].initialize(level, (i == this.children.length - 1)? 1: 0, leftSide);
    }
  }
} 

//------------------------------------------------------------------------------
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.children.length; i++) {
      totalHeight += this.children[i].navObj.clip.height;
    }
    subEntries = this.subEntries();
    
    if (this.isOpen) {
      totalHeight = 0 - totalHeight;
    }

    for (fIt = this.id + subEntries + 1; fIt < indexOfEntries.length; fIt++) {
      indexOfEntries[fIt].navObj.moveBy(0, totalHeight);
    }
  }

  this.isOpen = isOpen;
  propagateChangesInState(this);
} 

//------------------------------------------------------------------------------
function propagateChangesInState(folder) {
  var i = 0;
  
  if (folder.isOpen) {
    if (folder.nodeImg) {
      folder.nodeImg.src = "/kserver/images/" + ((folder.isLastNode)? "ftv2mlastnode.gif": "ftv2mnode.gif");
    }

    folder.iconImg.src = folder.openImg;
    for (i = 0; i < folder.children.length; i++) {
      folder.children[i].mostra();
    }
  }
  else {
    if (folder.nodeImg) {
      folder.nodeImg.src = "/kserver/images/" + ((folder.isLastNode)? "ftv2plastnode.gif": "ftv2pnode.gif");
    }

    folder.iconImg.src = folder.closeImg;
    for (i = 0; i < folder.children.length; i++) {
      folder.children[i].esconde();
    }
  }
} 

//------------------------------------------------------------------------------
function escondeFolder() {
  
  this.escondeBlock();
  this.setState(0);
}

//------------------------------------------------------------------------------
function drawFolder(leftSide) {
  
  var idParam = "ID='folder" + this.id + "'";
  
  if (browserVersion == 2) {
    if (!doc.yPos) {
      doc.yPos = 20;
    }
  }

  this.blockStart("folder");
  
  doc.write("<TR><TD>");
  doc.write(leftSide);
  this.outputLink();
  doc.write("<IMG ID='folderIcon" + this.id + "' NAME='folderIcon" + this.id + "' SRC='" + this.iconSrc+"' BORDER=0></A>");
  doc.write("</TD><TD VALIGN=MIDDLE NOWRAP>");
  
  if (USETEXTLINKS) {
    this.outputLink();
    doc.write(this.desc + "</A>");
  }
  else {
    doc.write(this.desc);
  }
  
  doc.write("</TD>");
  
  this.blockEnd();
  
  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    += this.navObj.clip.height;
  }
  else if (browserVersion == 3) {
    this.navObj  = doc.getElementById("folder"     + this.id);
    this.iconImg = doc.getElementById("folderIcon" + this.id);
    this.nodeImg = doc.getElementById("nodeIcon"   + this.id);
  }
} 

//------------------------------------------------------------------------------
function outputFolderLink() {
  
  doc.write("<A");

  if (this.hreference) {
    doc.write(" HREF='" + this.hreference + "'");
    if (browserVersion > 0) {
      doc.write(" onClick='javascript:clickOnFolder(" + this.id + ")'");
    }
  }

  if (this.linkClass) {
    doc.write(" CLASS=" + this.linkClass);
  }

  if (this.linkTarget) {
    doc.write(" TARGET=" + this.hrefTarget);
	}

  doc.write(">");
} 

//------------------------------------------------------------------------------
function addChild(childNode) {
  this.children[this.children.length] = childNode;
  return childNode;
}

//------------------------------------------------------------------------------
function folderSubEntries() {
  var i  = 0;
  var se = this.children.length;
  
  for (i = 0; i < this.children.length; i++) {
    if (this.children[i].children) { //is a folder
      se += this.children[i].subEntries();
    }
  }
  
  return se;
} 

//------------------------------------------------------------------------------
function Item(itemDescription, itemLink, linkClass, linkTarget) {   // Constructor

  descArr = itemDescription.split("|");

  // constant data
  this.desc      = descArr[0];
  this.link      = itemLink;
  this.linkClass = linkClass;
  this.linkTarget= linkTarget;
  this.id        = -1;   //initialized in initalize()
  this.navObj    =  0;   //initialized in render()
  this.iconImg   =  0;   //initialized in render()
  this.iconSrc   = descArr[1]? descArr[1]: "/kserver/images/ftv2doc.gif";
  

  // methods
  this.initialize  = initializeItem;
  this.createIndex = createEntryIndex;
  this.esconde     = escondeBlock;
  this.mostra      = mostra;
  this.renderOb    = drawItem;
  this.outputLink  = outputItemLink;
  this.totalHeight = totalHeight;
  this.blockStart  = blockStart;
  this.blockEnd    = blockEnd;
}

//------------------------------------------------------------------------------
function initializeItem(level, lastNode, leftSide) {
  this.createIndex();
  
  if (level > 0) {
    if (lastNode) {   //the last 'brother' in the children array
      this.renderOb(leftSide + "<IMG SRC='/kserver/images/ftv2lastnode.gif' WIDTH=16 HEIGHT=22>");
      leftSide += "<IMG SRC='/kserver/images/ftv2blank.gif' WIDTH=16 HEIGHT=22>";
    }
    else {
      this.renderOb(leftSide + "<IMG SRC='/kserver/images/ftv2node.gif' WIDTH=16 HEIGHT=22>");
      leftSide += "<IMG SRC='/kserver/images/ftv2vertline.gif' WIDTH=16 HEIGHT=22>";
    }
  }
  else {
    this.renderOb("");
  }
} 

//------------------------------------------------------------------------------
function outputItemLink() {
  
  doc.write("<A");
  doc.write(" HREF='" + this.link + "'");

  if (this.linkClass) {
    doc.write(" CLASS=" + this.linkClass);
  }
  if (this.linkTarget) {
    doc.write(" TARGET=" + this.linkTarget);
	}

  doc.write(">");
} 

//------------------------------------------------------------------------------
function drawItem(leftSide) {
  this.blockStart("item");
  
  doc.write("<TR><TD>");
  doc.write(leftSide);
  this.outputLink();
  doc.write("<IMG ID='itemIcon" + this.id + "' ");
  doc.write("SRC='" + this.iconSrc + "' BORDER=0>");
  doc.write("</A>");
  doc.write("</TD><TD VALIGN=MIDDLE NOWRAP>");
  
  if (USETEXTLINKS) {
    this.outputLink();
    doc.write(this.desc + "</A>");
  }
  else
    doc.write(this.desc);
  
  this.blockEnd();
  
  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    += this.navObj.clip.height;
  }
  else if (browserVersion == 3) {
    this.navObj  = doc.getElementById("item"     + this.id);
    this.iconImg = doc.getElementById("itemIcon" + this.id);
  }
} 

//------------------------------------------------------------------------------
function mostra() {
  if (browserVersion == 1 || browserVersion == 3)
    this.navObj.style.display = "block";
  else
    this.navObj.visibility = "show";
}

//------------------------------------------------------------------------------
function escondeBlock() {
  if (browserVersion == 1 || browserVersion == 3) {
    if (this.navObj.style.display == "none")
      return;
    this.navObj.style.display = "none";
  }
  else {
    if (this.navObj.visibility == "hiden")
      return;
    this.navObj.visibility = "hiden";
  }
} 

//------------------------------------------------------------------------------
function blockStart(idprefix) {
  var idParam = "ID='" + idprefix + this.id + "'";
  
  if (browserVersion == 2)
    doc.write("<LAYER "+ idParam + " TOP=" + doc.yPos + " VISIBILITY=show>");

  if (browserVersion == 3)   //N6 has bug on display property with tables
    doc.write("<DIV " + idParam + " STYLE='display:block; position:block;'>");

  doc.write("<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 ");
  
  if (browserVersion == 1)
    doc.write(idParam + " STYLE='display:block; position:block; '>");
  else
    doc.write(">");
}

//------------------------------------------------------------------------------
function blockEnd() {
  doc.write("</TABLE>");
  
  if (browserVersion == 2)
    doc.write("</LAYER>");

  if (browserVersion == 3)
    doc.write("</DIV>");
}

//------------------------------------------------------------------------------
function createEntryIndex() {
  this.id = indexOfEntries.length;
  indexOfEntries[indexOfEntries.length] = this;
}

//------------------------------------------------------------------------------
// 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.children.length; i++) {
      h += this.children[i].totalHeight();
    }
  }

  return h;
} 

//------------------------------------------------------------------------------
function clickOnFolder(folderId) {
  if (! indexOfEntries[folderId].isOpen) {
    clickOnNode(folderId);
  }
} 

//------------------------------------------------------------------------------
function clickOnNode(folderId) {

  var clickedFolder = indexOfEntries[folderId];
  var state         = clickedFolder.isOpen;
  
  clickedFolder.setState(! state); //open<->close  

  var openIds = "";
  for (idx = 0; idx < indexOfEntries.length; idx++) {
    if (indexOfEntries[idx].isOpen) {
      openIds += idx + "|";
    }
  }
  
  if (openIds.length > 0) {
  SetCookie("openIds", openIds);
} 
} 

//------------------------------------------------------------------------------
function gFld(description, hreference, linkClass, linkTarget) {
  return new Folder(description, hreference, linkClass);
} 

//------------------------------------------------------------------------------
function gLnk(description, linkData, linkClass, linkTarget) {
  
  return new Item(description, linkData, linkClass, linkTarget);
} 

//------------------------------------------------------------------------------
function insFld(parentFolder, childFolder) {
  return parentFolder.addChild(childFolder);
} 

//------------------------------------------------------------------------------
function insDoc(parentFolder, document) {
  parentFolder.addChild(document);
} 

//------------------------------------------------------------------------------
// This function uses an object (navigator) defined in
// ua.js, imported in the main html page (left frame).
function initializeDocument() {
  switch (navigator.family) {
  case 'ie4':   browserVersion = 1;  break;   //IE4
  case 'nn4':   browserVersion = 2;  break;   //NS4 
  case 'gecko': browserVersion = 3;  break;   //NS6
  default:      browserVersion = 0;  break;   //other
  }
  
  //foldersTree (with the site's data) is created in an external .js
  foldersTree.initialize(0, 1, "");
  
  if (browserVersion == 2) {
    doc.write("<LAYER TOP=" + indexOfEntries[indexOfEntries.length - 1].navObj.top + ">&nbsp;</LAYER>");
  }

  //The tree starts in full display
  if (! STARTALLOPEN) {
    var cookieIds = GetCookie("openIds");

    if (browserVersion > 0) {
      clickOnNode(0);   // close the whole tree

      if (cookieIds) {
        id_arr = cookieIds.split("|");
        for (idx = 0; idx < id_arr.length; idx++) {
          if (id_arr[idx]) {
            indexOfEntries[id_arr[idx]].setState(true);
          }
        }
      }
      else {
        clickOnNode(0);      // open the root folder
      }
    }
  }

  if (browserVersion == 0) {
    doc.write("<TABLE BORDER=0><TR><TD><BR><BR><FONT SIZE=-1>This tree only expands or contracts with DHTML capable browsers</FONT></TABLE>");
  }
} 


