function Folder(cid,folderDescription, hreference, nodeImg)
{
   //constant data;
   this.desc = folderDescription;
   this.hreference = hreference;
   this.cid = cid;
   this.id = -1;
   this.navObj = 0;
   this.iconImg = 0;
   this.nodeImg = 0;
   this.isLastNode = 0;

   // dynamic data
   this.isRoot = true;
   this.isOpen = true;
   this.iconSrc = nodeImg;
   this.iconRoot = nodeImg;
   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.totalHeight = totalHeight;
   this.subEntries = folderSubEntries;
   this.outputLink = outputFolderLink;
}


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 = "tools/images/mlastnode.gif";
           else
               folder.nodeImg.src = "tools/images/mnode.gif";
       }
       if(this.isRoot)
           folder.iconImg.src = "tools/images/mail.gif";
       else
	   if(!folder.iconSrc)
	   	folder.iconImg.src = "tools/images/folderopen.gif";
           else
           	folder.iconImg.src = "tools/images/" + folder.iconSrc;

       for(i = 0; i < folder.nChildren; i++)
           folder.children[i].display();
   }
   else {
       if(folder.nodeImg) {
           if(folder.isLastNode)
               folder.nodeImg.src = "tools/images/plastnode.gif";
           else
               folder.nodeImg.src = "tools/images/pnode.gif";
       }

       if(this.isRoot)
           folder.iconImg.src = "tools/images/mail.gif";
       else{
	   if(!folder.iconSrc)
	   	folder.iconImg.src = "tools/images/folderclosed.gif";
           else
           	folder.iconImg.src = "tools/images/" + folder.iconSrc;
       }

       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 == "hiden")
            return;

        this.navObj.visibility = "hiden";
    }

    this.setState(0);
}


function initializeFolder(level, lastNode, leftSide) {
    var i = 0;
    var j = 0;

    var numberOfFolders;
    var numberOfDocs;

    nc = this.nChildren;
    this.createIndex();

    var nc;
    var auxEv = "";

    if(browserVersion > 0)
        auxEv = "<A HREF='JavaScript: clickOnNode("+this.id+")'>";
    else
        auxEv = "<A>";

    if(level > 0)
    {
        if(lastNode)
        { //the last 'brother' in the children array
           this.renderOb(level,leftSide + auxEv + "<IMG NAME='nodeIcon" + this.id + "' SRC='tools/images/mlastnode.gif' WIDTH=16 HEIGHT=22 BORDER=0></A>");
           leftSide = leftSide + "<IMG SRC='tools/images/blank.gif' WIDTH=16 HEIGHT=22>";
           this.isLastNode = 1;
        }
        else
        {
            this.renderOb(level,leftSide + auxEv + "<IMG NAME='nodeIcon" + this.id + "' SRC='tools/images/mnode.gif' WIDTH=16 HEIGHT=22 BORDER=0></A>");
            leftSide = leftSide + "<IMG SRC='tools/images/vertline.gif' WIDTH=16 HEIGHT=22>";
            this.isLastNode = 0;
        }
    }
    else
    {
        this.renderOb(level,"");
    }

    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(level, leftSide)
{
    if(browserVersion == 2)
    {
        if(!doc.yPos)
          doc.yPos = 8;

        doc.write("<LAYER ID='folder" + this.id + "' TOP=" + doc.yPos + " VISIBILITY=hiden>");
    }
    doc.write("<TABLE WIDTH=100%")

    if(browserVersion == 1)
        doc.write(" ID='folder" + this.id + "' STYLE='position:block;' ");

    doc.write(" BORDER=0 CELLSPACING=0 CELLPADDING=0>");
    doc.write("<TR><TD class=p1 width="+ (16*(level+1)+6) +">");
    doc.write(leftSide);

    this.outputLink();
    doc.write("<IMG NAME='folderIcon" + this.id + "' ");
    if(leftSide == '')
    {
        doc.write("SRC='tools/images/" + this.iconRoot+"' BORDER=0></A>");
    }
    else
    {
        doc.write("SRC='tools/images/" + this.iconSrc+"' BORDER=0></A>");
    }
    doc.write("</TD><TD>");
    if(leftSide == '')
    {
       if(USETEXTLINKS)
       {
          this.outputLink();
          doc.write(this.desc + "</A>");
       }
       else
         doc.write(this.desc);
    }
    else
    {
        doc.write("<A HREF='JavaScript: clickOnNode("+this.id+")'>");
        doc.write(this.desc + "</A>");
    }

    doc.write("</TD><TD WIDTH=\"32\">"+ (this.cid == 0 ? "<INPUT TYPE=\"CHECKBOX\" NAME=\"checkboxC0\" VALUE=\"0\" onClick=\"OnCheckboxCAll(form)\">":"") +"</TD><TD WIDTH=\"32\"></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.tools/images["folderIcon"+this.id];
        this.nodeImg = this.navObj.document.tools/images["nodeIcon"+this.id];
        doc.yPos = doc.yPos + this.navObj.clip.height;
    }
}

function outputFolderLink()
{
    if(this.hreference)
    {
        doc.write("<A HREF='" + this.hreference + "' TARGET=\"basefrm\" ")

        if(browserVersion > 0)
        {
            doc.write("onClick='JavaScript: clickOnFolder("+this.id+")'")
        }
        doc.write(">")
    }
    else
        doc.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(cid,itemDescription, hreference, itemLink, itemImg) // Constructor
{
    // constant data
    this.desc = itemDescription
    this.link = itemLink
    this.hreference = hreference;
    this.cid = cid;
    this.id = -1;     //initialized in initalize()
    this.navObj = 0;  //initialized in render()
    this.iconImg = 0; //initialized in render()

    this.iconSrc = itemImg;

    // methods
    this.initialize = initializeItem ;
    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 == "hiden")
            return;
        this.navObj.visibility = "hiden";
    }
}


function initializeItem(level, lastNode, leftSide)
{
    this.createIndex();

    if(level > 0)
    {
        if(lastNode)
        { //the last 'brother' in the children array
            this.renderOb(level, leftSide + "<IMG SRC='tools/images/lastnode.gif' WIDTH=16 HEIGHT=22>")
            leftSide = leftSide + "<IMG SRC='tools/images/blank.gif' WIDTH=16 HEIGHT=22>"
        }
        else {
            this.renderOb(level, leftSide + "<IMG SRC='tools/images/node.gif' WIDTH=16 HEIGHT=22>")
            leftSide = leftSide + "<IMG SRC='tools/images/vertline.gif' WIDTH=16 HEIGHT=22>"
        }
    }
    else
        this.renderOb(level, "")
}


function drawItem(level, leftSide)
{
    if(browserVersion == 2)
        doc.write("<LAYER ID='item" + this.id + "' TOP=" + doc.yPos + " VISIBILITY=hiden>");

    doc.write("<TABLE WIDTH=100%");
    if(browserVersion == 1)
        doc.write(" ID='item" + this.id + "' STYLE='position:block;' ");
    doc.write(" BORDER=0 CELLSPACING=0 CELLPADDING=0>");
    doc.write("<TR><TD class=p1 width="+ (16*(level+1)+6) +">");
    doc.write(leftSide);

    if(this.link != "")
        doc.write("<A HREF=" + this.link + ">");

    doc.write("<IMG ID='itemIcon"+this.id+"' ")
    doc.write("SRC='tools/images/"+this.iconSrc+"' BORDER=0>")

    if(this.link != "")
        doc.write("</A>");
    doc.write("</TD><TD>");
    if(USETEXTLINKS) {
        if(this.link != "")
            doc.write("<A HREF=" + this.link + ">" + this.desc + "</A>");
        else
            doc.write(this.desc);
    }
    else {
        doc.write(this.desc);
    }
    doc.write("</TD>");
    doc.write("<TD WIDTH=\"32\"><INPUT TYPE=\"CHECKBOX\" NAME=\"checkboxC"+this.cid +"\" VALUE=\""+ this.cid +"\""+ (this.cid < 0 ? " disabled":"") +" onClick=\"onClickMe(form)\"></TD>");
    doc.write("<TD WIDTH=\"32\"></TD>");
    doc.write("</TR></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.tools/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];

    if(!clicked.isOpen)
        clickOnNode(folderId);

    if(clicked.isSelected)
        return;
}

function clickOnNode(folderId)
{
    var clickedFolder = 0;
    var state = 0;

    clickedFolder = indexOfEntries[folderId];
    state = clickedFolder.isOpen;

    if(state==true || state==false)
    	clickedFolder.setState(!state); //open<->close
}

function initializeDocument() {
    if(doc.all)
        browserVersion = 1; //IE4
    else if(doc.layers)
        browserVersion = 2; //NS4
    else
        browserVersion = 0; //other

    foldersTree.initialize(0, 1, "");
    foldersTree.display();

    if(browserVersion > 0)
    {
        doc.write("<LAYER TOP=\""+indexOfEntries[nEntries-1].navObj.top+"\">&nbsp;</LAYER>");

        // close the whole tree
        clickOnNode(0);

        // open the root folder
        clickOnNode(0);
    }
}

// Auxiliary Functions for Folder-Treee backward compatibility
function gFld(cid,description, hreference, nodeImg)
{
    folder = new Folder(cid,description, hreference, nodeImg);
    return(folder);
}


function gLnk(cid, target, description, linkData, itemImg)
{
    fullLink = ""

    if(target == 0) {
        if(linkData != "")
            fullLink = "'"+linkData+"' TARGET=\"main\"";
        else
            fullLink = "";
    }
    else if(target == 1) {
        if(linkData != "")
            fullLink = "'"+linkData+"' TARGET=\"_top\"";
        else
            fullLink = "";
    }

    linkItem = new Item(cid,description, linkData, fullLink, itemImg)
    return linkItem
}


function insFld(parentFolder, childFolder)
{
    return(parentFolder.addChild(childFolder));
}

function insDoc(parentFolder, document) {
    parentFolder.addChild(document);
}

function onClickMe(form)
{
  var newValue;

  newValue = ""
  with 	(parent.document.InfoEdit)
  {
    for(var i=0;i<form.elements.length;i++)
    {
      var e = form.elements[i];
      if (e.name != 'checkboxC0')
      {
        if (e.name.substr(0,9) == 'checkboxC')
        {
          if (e.checked)
          {
            newValue += e.value +",";
          }
        }
      }
    }
    newsClass.value = newValue.substr(0,newValue.length-1);
  }
}

function OnCheckboxCAll(form)
{
  for(var i=0;i<form.elements.length;i++)
  {
    var e = form.elements[i];
    if (e.name != 'checkboxC0')
    {
      if (e.name.substr(0,9) == 'checkboxC' && e.disabled == false)
      {
        e.checked = form.checkboxC0.checked;
      }
    }
  }
  onClickMe(form);
}

function initCheckBox(form)
{
  var strKeyword = "";

  for(var i=0;i<form.elements.length;i++)
  {
    var e = form.elements[i];

    strKeyword = ","+ e.value +",";
    if (e.name.substr(0,9) == 'checkboxC')
    {
      e.checked = (strCID.indexOf(strKeyword) > 0);
    }
  }
}

function expandAllNode()
{
  var clickedFolder;

  for (clickedFolder in indexOfEntries)
  {
    clickOnNode(clickedFolder);
  }
}

// Global variables
strCID = "";
USETEXTLINKS = 1;
indexOfEntries = new Array;
nEntries = 0;
doc = document;
browserVersion = 0;
selectedFolder = 0;
