//**************************************************************** 
// Keep this copyright notice: 
// This copy of the script is the property of the owner of the 
// particular web site you were visiting.
// Do not download the script's files from there.
// For a free download and full instructions go to: 
// http://www.treeview.net
//**************************************************************** 

 
// Log of changes: 
//
//      21 Mar 04 - Support for folder.p04_addChildren allows for much bigger trees
//      12 May 03 - Support for Safari Beta 3
//      01 Mar 03 - VERSION 4.3 - Support for checkboxes
//      21 Feb 03 - Added support for Opera 7
//      22 Sep 02 - Added maySelect member for node-by-node control
//                  of selection and highlight
//      21 Sep 02 - Cookie values are now separated by cookieCutter
//      12 Sep 02 - VERSION 4.2 - Can highlight Selected Nodes and 
//                  can preserve state through external (DB) IDs
//      29 Aug 02 - Fine tune 'supportDeferral' for IE4 and IE Mac
//      25 Aug 02 - Fixes: p04_STARTALLOPEN, and multi-page frameless
//      09 Aug 02 - Fix repeated folder on Mozilla 1.x
//      31 Jul 02 - VERSION 4.1 - Dramatic speed increase for trees 
//      with hundreds or thousands of nodes; changes to the control
//      flags of the p04_gLnk function
//      18 Jul 02 - Changes in pre-load images function
//      13 Jun 02 - Add p04_ICONPATH var to allow for gif subdir
//      20 Apr 02 - Improve support for frame-less layout
//      07 Apr 02 - Minor changes to support server-side dynamic feeding
//                  (example: FavoritesManagerASP)


// Definition of class Folder 
// ***************************************************************** 
function p04_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;
  this.iconSrc = p04_ICONPATH + "ftv2folderopen.gif";
  this.iconSrcClosed = p04_ICONPATH + "ftv2folderclosed.gif";
  this.children = new Array;
  this.nChildren = 0;
  this.level = 0;
  this.leftSideCoded = "";
  this.isLastNode=false;
  this.parentObj = null;
  this.maySelect=true;
  this.prependHTML = ""
	// Afegit per Jordi Palŕ - 08/09/2004
	// Motiu: a l'arbre d'agenda hi ha d'aparčixer una fletxa a la dreta en cas de tractar-se
	// de l'item actiu.
	this.itemactivo=0;
 
  //dynamic data 
  this.isOpen = false
  this.isLastOpenedFolder = false
  this.isRendered = 0
 
  //methods 
  this.initialize = p04_initializeFolder 
  this.setState = p04_setStateFolder 
  this.p04_addChild = p04_addChild 
  this.p04_addChildren = p04_addChildren
  this.createIndex = p04_createEntryIndex 
  this.p04_escondeBlock = p04_escondeBlock
  this.esconde = p04_escondeFolder 
  this.p04_folderMstr = p04_folderMstr 
  this.renderOb = p04_drawFolder 
  this.p04_totalHeight = p04_totalHeight 
  this.subEntries = p04_folderSubEntries 
  this.linkHTML = p04_linkFolderHTML
  this.p04_blockStartHTML = p04_blockStartHTML
  this.p04_blockEndHTML = p04_blockEndHTML
  this.p04_nodeImageSrc = p04_nodeImageSrc
  this.p04_iconImageSrc = p04_iconImageSrc
  this.p04_getID = p04_getID
  this.p04_forceOpeningOfAncestorFolders = p04_forceOpeningOfAncestorFolders
} 
 
function p04_initializeFolder(level, lastNode, leftSide) 
{ 
  var j=0 
  var i=0       
  nc = this.nChildren 
   
  this.createIndex() 
  this.level = level
  this.leftSideCoded = leftSide

  if (browserVersion == 0 || p04_STARTALLOPEN==1)
    this.isOpen=true;

  if (level>0)
    if (lastNode) //the last child in the children array 
		leftSide = leftSide + "0"
	else
		leftSide = leftSide + "1"

  this.isLastNode = lastNode
 
  if (nc > 0) 
  { 
    level = level + 1 
    for (i=0 ; i < this.nChildren; i++)  
    {
      if (typeof this.children[i].initialize == 'undefined') //document node was specified using the p04_addChildren function
      {
        if (typeof this.children[i][0] == 'undefined' || typeof this.children[i] == 'string')
        {
          this.children[i] = ["item incorrectly defined", ""];
        }

        //Basic initialization of the Item object
        //These members or methods are needed even before the Item is rendered
        this.children[i].initialize=p04_initializeItem;
        this.children[i].createIndex=p04_createEntryIndex;
        if (typeof this.children[i].maySelect == 'undefined')
          this.children[i].maySelect=true
        this.children[i].p04_forceOpeningOfAncestorFolders = p04_forceOpeningOfAncestorFolders
      }
      if (i == this.nChildren-1) 
        this.children[i].initialize(level, 1, leftSide)
      else 
        this.children[i].initialize(level, 0, leftSide)
    } 
  } 
} 
 
function p04_drawFolder(insertAtObj) 
{ 
  var nodeName = ""
  var auxEv = ""
  var docW = ""
  var i=0

  p04_finalizeCreationOfChildDocs(this)

  var leftSide = p04_leftSideHTML(this.leftSideCoded)

  if (browserVersion > 0) 
    auxEv = "<a href='javascript:p04_clickOnNode(\""+this.p04_getID()+"\")'>" 
  else 
    auxEv = "<a>" 

  nodeName = this.p04_nodeImageSrc()
 
  if (this.level>0) 
    if (this.isLastNode) //the last child in the children array 
	    leftSide = leftSide + "<td valign=top>" + auxEv + "<img name='p04_nodeIcon" + this.id + "' id='p04_nodeIcon" + this.id + "' src='" + nodeName + "' width=\"16\" height=\"13\" style=\"vertical-align:top; margin-bottom:3px;\"></a></td>"
    else 
      leftSide = leftSide + "<td valign=top background=" + p04_ICONPATH + "ftv2vertline.gif>" + auxEv + "<img name='p04_nodeIcon" + this.id + "' id='p04_nodeIcon" + this.id + "' src='" + nodeName + "' width=\"16\" height=\"13\" style=\"vertical-align:top; margin-bottom:3px;\"></a></td>"

  this.isRendered = 1

  if (browserVersion == 2) { 
    if (!doc.yPos) 
      doc.yPos=20 
  } 

  docW = this.p04_blockStartHTML("p04_folder");

  docW = docW + "<tr>" + leftSide + "<td valign=top>";
  if (p04_USEICONS)
  {
    docW = docW + this.linkHTML(false) 
    docW = docW + "<img id='p04_folderIcon" + this.id + "' name='p04_folderIcon" + this.id + "' src='" + this.p04_iconImageSrc() + "' style=\"vertical-align:top; margin-bottom:3px;\"></a>"
  }
  else
  {
	  if (this.prependHTML == "")
        docW = docW + "<img src=" + p04_ICONPATH + "ftv2blank.gif height=2 width=2 style=\"vertical-align:top; margin-bottom:3px;\">"
  }
  if (p04_WRAPTEXT)
	  docW = docW + "</td>"+this.prependHTML+"<td valign=top width=100%>"
  else
	  docW = docW + "</td>"+this.prependHTML+"<td valign=top nowrap width=100%>"
  if (p04_USETEXTLINKS) 
  { 
    docW = docW + this.linkHTML(true)
	// -------------------------------------
	// Aquest link es correspon amb l'arrel.
	// -------------------------------------	
    docW = docW + this.desc + "</a>"
  } 
  else 
    docW = docW + this.desc
	if(this.itemactivo==1){
		docW = docW + "</td><td style=\"padding-right:5px;\"></td>";
	}
	if(this.itemactivo==2){
		docW = docW + "</td><td style=\"padding-right:5px;\"><img src='"+p04_ICONPATH+ "menu_fletxa_in.gif' width=\"15\" height=\"14\" style=\"vertical-align:top; margin-bottom:3px;\"></td>";
	}
	else{
		docW = docW + "</td><td style=\"padding-right:5px;\"></td>";
	}
  //alert('p04_itemTextLink'+lastClicked.id+','+'p04_itemTextLink'+this.id);
  docW = docW + "</tr>" + this.p04_blockEndHTML()

  if (insertAtObj == null)
  {
	  if (supportsDeferral) {
		  doc.write("<div id=p04_domRoot></div>") //transition between regular flow HTML, and node-insert DOM DHTML
		  insertAtObj = p04_getElById("p04_domRoot")
		  insertAtObj.insertAdjacentHTML("beforeEnd", docW)
	  }
	  else
		  doc.write(docW)
  }
  else
  {
      insertAtObj.insertAdjacentHTML("afterEnd", docW)
  }
 
  if (browserVersion == 2) 
  { 
    this.navObj = doc.layers["p04_folder"+this.id] 
    if (p04_USEICONS)
      this.iconImg = this.navObj.document.images["p04_folderIcon"+this.id] 
    this.nodeImg = this.navObj.document.images["p04_nodeIcon"+this.id] 
    doc.yPos=doc.yPos+this.navObj.clip.height 
  } 
  else if (browserVersion != 0)
  { 
    this.navObj = p04_getElById("p04_folder"+this.id)
    if (p04_USEICONS)
      this.iconImg = p04_getElById("p04_folderIcon"+this.id) 
    this.nodeImg = p04_getElById("p04_nodeIcon"+this.id)
  } 
} 
 
function p04_setStateFolder(isOpen) 
{ 
  var subEntries 
  var p04_totalHeight 
  var fIt = 0 
  var i=0 
  var currentOpen
 
  if (isOpen == this.isOpen) 
    return 
 
  if (browserVersion == 2)  
  { 
    p04_totalHeight = 0 
    for (i=0; i < this.nChildren; i++) 
      p04_totalHeight = p04_totalHeight + this.children[i].navObj.clip.height 
      subEntries = this.subEntries() 
    if (this.isOpen) 
      p04_totalHeight = 0 - p04_totalHeight 
    for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++) 
      indexOfEntries[fIt].navObj.moveBy(0, p04_totalHeight) 
  }  
  this.isOpen = isOpen;

  if (this.p04_getID()!=p04_foldersTree.p04_getID() && p04_PRESERVESTATE && !this.isOpen) //closing
  {
     currentOpen = p04_GetCookie("p04_clickedFolder")
     if (currentOpen != null) {
         currentOpen = currentOpen.replace(this.p04_getID()+cookieCutter, "")
         p04_SetCookie("p04_clickedFolder", currentOpen)
     }
  }
	
  if (!this.isOpen && this.isLastOpenedfolder)
  {
		lastOpenedFolder = null;
		this.isLastOpenedfolder = false;
  }
  p04_propagateChangesInState(this) 
} 
 
function p04_propagateChangesInState(folder) 
{   
  var i=0 

  //Change icon
  if (folder.nChildren > 0 && folder.level>0)  //otherwise the one given at render stays
    folder.nodeImg.src = folder.p04_nodeImageSrc()

  //Change node
  if (p04_USEICONS)
    folder.iconImg.src = folder.p04_iconImageSrc()

  //Propagate changes
  for (i=folder.nChildren-1; i>=0; i--) {
    if (folder.isOpen) 
      folder.children[i].p04_folderMstr(folder.navObj)
    else 
  	  folder.children[i].esconde() 
  }
} 
 
function p04_escondeFolder() 
{ 
  this.p04_escondeBlock()
   
  this.setState(0) 
} 
 
function p04_linkFolderHTML(isTextLink) 
{ 
  var docW = "";
  var linkClass;

  if (this.hreference) 
  { 
	if(this.itemactivo==1){
		linkClass="actiu";
	} else if(this.itemactivo==2){	
		linkClass="actual";
	} else{
		linkClass="";
	}

  	//alert(linkClass);
  
	if (p04_USEFRAMES)
	  docW = docW + "<a class='" + linkClass + "' href='" + this.hreference + "' TARGET=\"basefrm\" "
	else
	  docW = docW + "<a class='" + linkClass + "' href='" + this.hreference + "' TARGET=_top "
        
    if (isTextLink) {
        docW += "id=\"p04_itemTextLink"+this.id+"\" ";
    }

    if (browserVersion > 0) 
      docW = docW + "onkeypress='javascript:p04_clickOnFolder(\""+this.p04_getID()+"\")' onclick='javascript:p04_clickOnFolder(\""+this.p04_getID()+"\")'"

    docW = docW + ">"
  } 
  else{
	if(this.itemactivo==1){
		docW = docW + "<a class='a.actiu'>";
	} else if(this.itemactivo==2){	
		docW = docW + "<a class='a.actual'>";
	} else{
		docW = docW + "<a>";
	}
  }
	
  //alert(docW);
  return docW;
} 
 
function p04_addChild(childNode) 
{ 
  this.children[this.nChildren] = childNode 
  childNode.parentObj = this
  this.nChildren++ 
  return childNode 
} 

//The list can contain either a Folder object or a sub list with the arguments for Item 
function p04_addChildren(listOfChildren) 
{ 
  this.children = listOfChildren 
  this.nChildren = listOfChildren.length
  for (i=0; i<this.nChildren; i++)
    this.children[i].parentObj = this
} 

function p04_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 
} 

function p04_nodeImageSrc() {
  var srcStr = "";

  if (this.isLastNode) //the last child in the children array 
  { 
    if (this.nChildren == 0)
      srcStr = p04_ICONPATH + "ftv2lastnode.gif"
    else
      if (this.isOpen)
        srcStr = p04_ICONPATH + "ftv2mlastnode.gif"  
      else
        srcStr = p04_ICONPATH + "ftv2plastnode.gif"  
  } 
  else 
  { 
    if (this.nChildren == 0)
      srcStr = p04_ICONPATH + "ftv2node.gif"
    else
      if (this.isOpen)
        srcStr = p04_ICONPATH + "ftv2mnode.gif "
      else
        srcStr = p04_ICONPATH + "ftv2pnode.gif"
  }   
  return srcStr;
}

function p04_iconImageSrc() {
  if (this.isOpen)
    return(this.iconSrc)
  else
    return(this.iconSrcClosed)
} 
 
// Definition of class Item (a document or link inside a Folder) 
// ************************************************************* 
 
function p04_Item(itemDescription) // Constructor 
{ 
  // constant data 
  this.desc = itemDescription 

  this.level = 0
  this.isLastNode = false
  this.leftSideCoded = ""
  this.parentObj = null
	// Afegit per Jordi Palŕ - 08/09/2004
	// Motiu: a l'arbre d'agenda hi ha d'aparčixer una fletxa a la dreta en cas de tractar-se
	// de l'item actiu.
	this.actiu=false;


  this.maySelect=true

  this.initialize = p04_initializeItem;
  this.createIndex = p04_createEntryIndex;
  this.p04_forceOpeningOfAncestorFolders = p04_forceOpeningOfAncestorFolders;

	//alert(this.desc);


  p04_finalizeCreationOfItem(this)
} 

//Assignments that can be delayed when the item is created with folder.p04_addChildren
//The assignments that cannot be delayed are done in p04_addChildren and in p04_initializeFolder
//Additionaly, some assignments are also done in p04_finalizeCreationOfChildDocs itself
function p04_finalizeCreationOfItem(itemArray)
{
  itemArray.navObj = 0 //initialized in render() 
  itemArray.iconImg = 0 //initialized in render() 
  itemArray.iconSrc = p04_ICONPATH + "ftv2doc.gif" 
  itemArray.isRendered = 0
  itemArray.nChildren = 0
  itemArray.prependHTML = ""
 
  // methods 
  itemArray.p04_escondeBlock = p04_escondeBlock
  itemArray.esconde = p04_escondeBlock
  itemArray.p04_folderMstr = p04_folderMstr 
  itemArray.renderOb = p04_drawItem 
  itemArray.p04_totalHeight = p04_totalHeight 
  itemArray.p04_blockStartHTML = p04_blockStartHTML
  itemArray.p04_blockEndHTML = p04_blockEndHTML
  itemArray.p04_getID = p04_getID
}

function p04_initializeItem(level, lastNode, leftSide) 
{  
  this.createIndex() 
  this.level = level
  this.leftSideCoded = leftSide
  this.isLastNode = lastNode
} 
 
function p04_drawItem(insertAtObj) 
{ 
  var leftSide = p04_leftSideHTML(this.leftSideCoded)
  var docW = ""

  var fullLink = "href=\""+this.link+"\" target=\""+this.target+"\" onkeypress=\"p04_clickOnLink('"+this.p04_getID()+"\', '"+this.link+"','"+this.target+"');return false;\" onclick=\"p04_clickOnLink('"+this.p04_getID()+"\', '"+this.link+"','"+this.target+"');return false;\"";
  this.isRendered = 1

  //alert('p04_itemTextLink'+lastClicked.id+','+'p04_itemTextLink'+this.id);

  if (this.level>0) 
    if (this.isLastNode) //the last 'brother' in the children array 
    { 
      leftSide = leftSide + "<td valign=top><img src='" + p04_ICONPATH + "ftv2lastnode.gif' width=\"16\" height=\"13\" style=\"vertical-align:top; margin-bottom:3px;\"></td>"
    } 
    else 
    { 
      leftSide = leftSide + "<td valign=top background=" + p04_ICONPATH + "ftv2vertline.gif><img src='" + p04_ICONPATH + "ftv2node.gif' width=\"16\" height=\"13\" style=\"vertical-align:top; margin-bottom:3px;\"></td>"
    } 

  docW = docW + this.p04_blockStartHTML("p04_item")

  docW = docW + "<tr>" + leftSide + "<td valign=top>"
  if (p04_USEICONS)
	    docW = docW + "<a class='MenuItemLink'" + fullLink  + " id=\"p04_itemIconLink"+this.id+"\">" + "</a>"
  else
	  if (this.prependHTML == "")
        docW = docW + "<img src=" + p04_ICONPATH + "ftv2blank.gif height=2 width=3 style=\"vertical-align:top; margin-bottom:3px;\">"

  if (p04_WRAPTEXT)
    docW = docW + "</td>"+this.prependHTML+"<td valign=top width=100%>"
  else
    docW = docW + "</td>"+this.prependHTML+"<td valign=top nowrap width=100%>"

  if (p04_USETEXTLINKS) 
	if(this.itemactivo==1){
		docW = docW + "<a class='actiu' " + fullLink + " id=\"p04_itemTextLink"+this.id+"\">" + this.desc + "</a>"
	} else if(this.itemactivo==2){	
		docW = docW + "<a class='actual' " + fullLink + " id=\"p04_itemTextLink"+this.id+"\">" + this.desc + "</a>"
	} else{
		docW = docW + "<a " + fullLink + " id=\"p04_itemTextLink"+this.id+"\">" + this.desc + "</a>"		
	}

  else{
    docW = docW + this.desc
  }
	
	if(this.itemactivo==1){
		docW = docW + "</td><td style=\"padding-right:5px;background-color:blue;\"></td>";
	}
	else if(this.itemactivo==2){
		docW = docW + "</td><td style=\"padding-right:5px;\"><img src='"+p04_ICONPATH+ "menu_fletxa_in.gif' width=\"15\" height=\"14\" style=\"vertical-align:top; margin-bottom:3px;\"></td>";
	}
	else{
		docW = docW + "</td><td style=\"padding-right:5px;\"></td>";	
	}

  docW = docW + "</tr>" + this.p04_blockEndHTML()
 
  if (insertAtObj == null)
  {
	  doc.write(docW)
  }
  else
  {
      insertAtObj.insertAdjacentHTML("afterEnd", docW)
  }

  if (browserVersion == 2) { 
    this.navObj = doc.layers["p04_item"+this.id] 
    if (p04_USEICONS)
      this.iconImg = this.navObj.document.images["p04_itemIcon"+this.id] 
    doc.yPos=doc.yPos+this.navObj.clip.height 
  } else if (browserVersion != 0) { 
    this.navObj = p04_getElById("p04_item"+this.id)
    if (p04_USEICONS)
      this.iconImg = p04_getElById("p04_itemIcon"+this.id)
  }
} 
 
 
// Methods common to both objects (pseudo-inheritance) 
// ******************************************************** 
 
function p04_forceOpeningOfAncestorFolders() {
  if (this.parentObj == null || this.parentObj.isOpen)
    return
  else {
    this.parentObj.p04_forceOpeningOfAncestorFolders()
    p04_clickOnNodeObj(this.parentObj)
  }
}

function p04_escondeBlock() 
{ 
  if (browserVersion == 1 || browserVersion == 3) { 
    if (this.navObj.style.display == "none") 
      return 
    this.navObj.style.display = "none" 
  } else { 
    if (this.navObj.visibility == "hidden") 
      return 
    this.navObj.visibility = "hidden" 
  }     
} 
 
function p04_folderMstr(domObj) 
{ 
  if (!this.isRendered)
     this.renderOb(domObj)
  else
    if (browserVersion == 1 || browserVersion == 3) 
      this.navObj.style.display = "block" 
    else 
      this.navObj.visibility = "show" 
} 

function p04_blockStartHTML(idprefix) {
  var idParam = "id='" + idprefix + this.id + "'"
  var docW = ""

  if (browserVersion == 2) 
    docW = "<layer "+ idParam + " top=" + doc.yPos + " visibility=show>"
  else if (browserVersion != 0)
    docW = "<div " + idParam + " style='display:block; position:block;'>"
     
  docW = docW + "<table style=\"\" border=0 cellspacing=0 cellpadding=0 width=100% >"

  return docW
}

function p04_blockEndHTML() {
  var docW = ""

  docW = "</table>"
   
  if (browserVersion == 2) 
    docW = docW + "</layer>"
  else if (browserVersion != 0)
    docW = docW + "</div>"

  return docW
}
 
function p04_createEntryIndex() 
{ 
  this.id = nEntries 
  indexOfEntries[nEntries] = this 
  nEntries++ 
} 
 
// total height of subEntries open 
function p04_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].p04_totalHeight() 
 
  return h 
} 


function p04_leftSideHTML(leftSideCoded) {
	var i;
	var retStr = "";

	for (i=0; i<leftSideCoded.length; i++)
	{
		if (leftSideCoded.charAt(i) == "1")
		{
			retStr = retStr + "<td valign=top background=" + p04_ICONPATH + "ftv2vertline.gif><img src='" + p04_ICONPATH + "ftv2vertline.gif' width=\"16\" height=\"13\" style=\"vertical-align:top; margin-bottom:3px;\"></td>"
		}
		if (leftSideCoded.charAt(i) == "0")
		{
			retStr = retStr + "<td valign=top><img src='" + p04_ICONPATH + "ftv2blank.gif' width=\"16\" height=\"13\" style=\"vertical-align:top; margin-bottom:3px;\"></td>"
		}
	}
	return retStr
}

function p04_getID()
{
  //define a .xID in all nodes (folders and items) if you want to PERVESTATE that
  //work when the tree changes. The value eXternal value must be unique for each
  //node and must node change when other nodes are added or removed
  //The value may be numeric or string, but cannot have the same char used in cookieCutter
  if (typeof this.xID != "undefined") 
    return this.xID
  else
    return this.id
}

 
// Events 
// ********************************************************* 
 
function p04_clickOnFolder(folderId) 
{ 
  var clicked = p04_findObj(folderId)

  if (typeof clicked=='undefined' || clicked==null)
  {
    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 p04_foldersTree root.")
    return;
  }

  if (!clicked.isOpen) {
    p04_clickOnNodeObj(clicked) 
  }

  if (lastOpenedFolder != null && lastOpenedFolder != folderId)
    p04_clickOnNode(lastOpenedFolder); //sets lastOpenedFolder to null

  if (clicked.nChildren==0) {
    lastOpenedFolder = folderId;
    clicked.isLastOpenedfolder = true
  }

  if (p04_isLinked(clicked.hreference)) {
      p04_highlightObjLink(clicked);
  }
} 
 
function p04_clickOnNode(folderId) 
{ 
  fOb = p04_findObj(folderId);
  if (typeof fOb=='undefined' || fOb==null)
  {
    alert("Treeview was not able to find the node object corresponding to ID=" + folderId + ". If the configuration file sets a.xID, it must set p04_foldersTree.xID as well.")
    return;
  }

  p04_clickOnNodeObj(fOb);
  
  try {redimensionarAlcadesBlocs();} catch(errorinfo) {}

}

function p04_clickOnNodeObj(folderObj) 
{ 
  var state = 0 
  var currentOpen
 
  state = folderObj.isOpen 
  folderObj.setState(!state) //open<->close  

  if (folderObj.id!=p04_foldersTree.id && p04_PRESERVESTATE)
  {
    currentOpen = p04_GetCookie("p04_clickedFolder")
    if (currentOpen == null)
      currentOpen = ""

    if (!folderObj.isOpen) //closing
    {
      currentOpen = currentOpen.replace(folderObj.p04_getID()+cookieCutter, "")
      p04_SetCookie("p04_clickedFolder", currentOpen)
    }
    else
      p04_SetCookie("p04_clickedFolder", currentOpen+folderObj.p04_getID()+cookieCutter)
  }
}

function p04_clickOnLink(clickedId, target, windowName) {
    p04_highlightObjLink(p04_findObj(clickedId));
    if (p04_isLinked(target)) {
        window.open(target,windowName);
    }
}

function ld  ()
{
	return document.links.length-1
}
 

// Auxiliary Functions 
// *******************

function p04_finalizeCreationOfChildDocs(folderObj) {
  for(i=0; i < folderObj.nChildren; i++)  {
    child = folderObj.children[i]
    if (typeof child[0] != 'undefined')
    {
      // Amazingly, arrays can have members, so   a = ["a", "b"]; a.desc="asdas"   works
      // If a doc was inserted as an array, we can transform it into an itemObj by adding 
      // the missing members and functions
      child.desc = child[0] 
      p04_setItemLink(child, p04_GLOBALTARGET, child[1])   
      p04_finalizeCreationOfItem(child)
    }
  }
}

function p04_findObj(id)
{
  var i=0;
  var nodeObj;

  if (typeof p04_foldersTree.xID != "undefined") {
    nodeObj = indexOfEntries[i];
    for(i=0;i<nEntries&&indexOfEntries[i].xID!=id;i++) //may need optimization
      ;
    id = i
  }
  if (id >= nEntries)
    return null; //example: node removed in DB
  else
    return indexOfEntries[id];
}

function p04_isLinked(hrefText) {
    var result = true;
    result = (result && hrefText !=null);
    result = (result && hrefText != '');
    result = (result && hrefText.indexOf('undefined') < 0);
    result = (result && hrefText.indexOf('parent.op') < 0);
    return result;
}

// CANVIS QUE ES PRODUEIXEN AL TENIR UNA OPCIÓ ACTIVA.
// Do highlighting by changing background and foreg. colors of folder or doc text
function p04_highlightObjLink(nodeObj) {
  if (!p04_HIGHLIGHT || nodeObj==null || nodeObj.maySelect==false) {//node deleted in DB 
    return;
  }

  if (browserVersion == 1 || browserVersion == 3) {
    var clickedDOMObj = p04_getElById('p04_itemTextLink'+nodeObj.id);
    if (clickedDOMObj != null) {
        if (lastClicked != null) {
            var prevClickedDOMObj = p04_getElById('p04_itemTextLink'+lastClicked.id);
            //prevClickedDOMObj.style.color=lastClickedColor;
            //prevClickedDOMObj.style.backgroundColor=lastClickedBgColor;
			prevClickedDOMObj.className=lastClickedColor;
            //prevClickedDOMObj.style.backgroundColor=lastClickedBgColor;
			
        }
        
        lastClickedColor    = clickedDOMObj.className;
        //lastClickedBgColor  = clickedDOMObj.style.backgroundColor;
        //clickedDOMObj.style.color=p04_HIGHLIGHT_COLOR;
        //clickedDOMObj.style.backgroundColor=p04_HIGHLIGHT_BG;
		//clickedDOMObj.style.fontSize="14px"
		//clickedDOMObj.className='MenuItemLinkActiuFletxa';
    }
  }
  lastClicked = nodeObj;
  if (p04_PRESERVESTATE)
    p04_SetCookie('p04_highlightedTreeviewLink', nodeObj.p04_getID());
}

function p04_insFld(parentFolder, childFolder) 
{ 
  return parentFolder.p04_addChild(childFolder) 
} 
 
function p04_insDoc(parentFolder, document) 
{ 
  return parentFolder.p04_addChild(document) 
} 

function p04_gFld(description, hreference, itemactivo) 
{ 
  folder = new p04_Folder(description, hreference);
  folder.itemactivo=itemactivo;
  return folder;
} 
 
function p04_gLnk(optionFlags, description, linkData, itemactivo) 
{ 
  if (optionFlags>=0) { //is numeric (old style) or empty (error)
    //Target changed from numeric to string in Aug 2002, and support for numeric style was entirely dropped in Mar 2004
    alert("Change your Treeview configuration file to use the new style of target argument in p04_gLnk");
    return;
  }

  newItem = new p04_Item(description);
  p04_setItemLink(newItem, optionFlags, linkData);
  newItem.itemactivo=itemactivo;
  return newItem;
} 

function p04_setItemLink(item, optionFlags, linkData) {
  var targetFlag = "";
  var target = "";
  var protocolFlag = "";
  var protocol = "";

  targetFlag = optionFlags.charAt(0)
  if (targetFlag=="B")
    target = "_blank"
  if (targetFlag=="P")
    target = "_parent"
  if (targetFlag=="R")
    target = "basefrm"
  if (targetFlag=="S")
    target = "_self"
  if (targetFlag=="T")
    target = "_top"

  if (optionFlags.length > 1) {
    protocolFlag = optionFlags.charAt(1)
    if (protocolFlag=="h")
      protocol = "http://"
    if (protocolFlag=="s")
      protocol = "https://"
    if (protocolFlag=="f")
      protocol = "ftp://"
    if (protocolFlag=="m")
      protocol = "mailto:"
  }

  item.link = protocol+linkData;    
  item.target = target
}

//Function created  for backwards compatibility purposes
//Function contents voided in March 2004
function p04_oldGLnk(target, description, linkData)
{
}
 
function p04_preLoadIcons() {
	var auxImg
	auxImg = new Image();
	auxImg.src = p04_ICONPATH + "ftv2vertline.gif";
	auxImg.src = p04_ICONPATH + "ftv2mlastnode.gif";
	auxImg.src = p04_ICONPATH + "ftv2mnode.gif";
	auxImg.src = p04_ICONPATH + "ftv2plastnode.gif";
	auxImg.src = p04_ICONPATH + "ftv2pnode.gif";
	auxImg.src = p04_ICONPATH + "ftv2blank.gif";
	auxImg.src = p04_ICONPATH + "ftv2lastnode.gif";
	auxImg.src = p04_ICONPATH + "ftv2node.gif";
	auxImg.src = p04_ICONPATH + "ftv2folderclosed.gif";
	auxImg.src = p04_ICONPATH + "ftv2folderopen.gif";
	auxImg.src = p04_ICONPATH + "ftv2doc.gif";
}

//Open some folders for initial layout, if necessary
function p04_setInitialLayout() {
  if (browserVersion > 0 && !p04_STARTALLOPEN)
    p04_clickOnNodeObj(p04_foldersTree);
  
  if (!p04_STARTALLOPEN && (browserVersion > 0) && p04_PRESERVESTATE)
		p04_PersistentFolderOpening();
}

//Used with NS4 and p04_STARTALLOPEN
function p04_renderAllTree(nodeObj, parent) {
  var i=0;
  nodeObj.renderOb(parent)
  if (supportsDeferral)
    for (i=nodeObj.nChildren-1; i>=0; i--) 
      p04_renderAllTree(nodeObj.children[i], nodeObj.navObj)
  else
    for (i=0 ; i < nodeObj.nChildren; i++) 
      p04_renderAllTree(nodeObj.children[i], null)
}

function p04_hideWholeTree(nodeObj, hideThisOne, nodeObjMove) {
  var i=0;
  var heightContained=0;
  var childrenMove=nodeObjMove;

  if (hideThisOne)
    nodeObj.p04_escondeBlock()

  if (browserVersion == 2)
    nodeObj.navObj.moveBy(0, 0-nodeObjMove)

  for (i=0 ; i < nodeObj.nChildren; i++) {
    heightContainedInChild = p04_hideWholeTree(nodeObj.children[i], true, childrenMove)
    if (browserVersion == 2) {
      heightContained = heightContained + heightContainedInChild + nodeObj.children[i].navObj.clip.height
      childrenMove = childrenMove + heightContainedInChild
	}
  }

  return heightContained;
}

 
// Simulating inserAdjacentHTML on NS6
// Code by thor@jscript.dk
// ******************************************

if(typeof HTMLElement!="undefined" && !HTMLElement.prototype.insertAdjacentElement){
	HTMLElement.prototype.insertAdjacentElement = function (where,parsedNode)
	{
		switch (where){
		case 'beforeBegin':
			this.parentNode.insertBefore(parsedNode,this)
			break;
		case 'afterBegin':
			this.insertBefore(parsedNode,this.firstChild);
			break;
		case 'beforeEnd':
			this.appendChild(parsedNode);
			break;
		case 'afterEnd':
			if (this.nextSibling) 
				this.parentNode.insertBefore(parsedNode,this.nextSibling);
			else this.parentNode.appendChild(parsedNode);
			break;
		}
	}

	HTMLElement.prototype.insertAdjacentHTML = function(where,htmlStr)
	{
		var r = this.ownerDocument.createRange();
		r.setStartBefore(this);
		var parsedHTML = r.createContextualFragment(htmlStr);
		this.insertAdjacentElement(where,parsedHTML)
	}
}

function p04_getElById(idVal) {
  if (document.getElementById != null)
    return document.getElementById(idVal)
  if (document.all != null)
    return document.all[idVal]
  
  alert("Problem getting element by id")
  return null
}


// Functions for cookies
// Note: THESE FUNCTIONS ARE OPTIONAL. No cookies are used unless
// the p04_PRESERVESTATE variable is set to 1 (default 0)
// The separator currently in use is ^ (chr 94)
// *********************************************************** 

function p04_PersistentFolderOpening()
{
  var stateInCookie;
  var fldStr=""
  var fldArr
  var fldPos=0
  var id
  var nodeObj
  stateInCookie = p04_GetCookie("p04_clickedFolder");
  p04_SetCookie('p04_clickedFolder', "") //at the end of function it will be back, minus null cases

  if(stateInCookie!=null)
  {
    fldArr = stateInCookie.split(cookieCutter)
    for (fldPos=0; fldPos<fldArr.length; fldPos++)
    {
      fldStr=fldArr[fldPos]
      if (fldStr != "") {
        nodeObj = p04_findObj(fldStr)
        if (nodeObj!=null) //may have been deleted
          if (nodeObj.setState) {
            nodeObj.p04_forceOpeningOfAncestorFolders()
            p04_clickOnNodeObj(nodeObj);
          }
          //else
            //alert("Internal id is not pointing to a folder anymore. Consider using external IDs")
      }
    }
  }
}

function p04_storeAllNodesInClickCookie(treeNodeObj)
{
  var currentOpen
  var i = 0

  if (typeof treeNodeObj.setState != "undefined") //is folder
  {
    currentOpen = p04_GetCookie("p04_clickedFolder")
    if (currentOpen == null)
      currentOpen = ""

    if (treeNodeObj.p04_getID() != p04_foldersTree.p04_getID())
      p04_SetCookie("p04_clickedFolder", currentOpen+treeNodeObj.p04_getID()+cookieCutter)

    for (i=0; i < treeNodeObj.nChildren; i++) 
        p04_storeAllNodesInClickCookie(treeNodeObj.children[i])
  }
}

function p04_CookieBranding(name) {
  if (typeof p04_foldersTree.treeID != "undefined")
    return name+p04_foldersTree.treeID //needed for multi-tree sites. make sure treeId does not contain cookieCutter
  else
    return name
}
 
function p04_GetCookie(name)
{  
  name = p04_CookieBranding(name)

	var arg = name + "=";  
	var alen = arg.length;  
	var clen = document.cookie.length;  
	var i = 0;  

	while (i < clen) {    
		var j = i + alen;    
		if (document.cookie.substring(i, j) == arg)      
			return p04_getCookieVal (j);    
		i = document.cookie.indexOf(" ", i) + 1;    
		if (i == 0) break;   
	}  
	return null;
}

function p04_getCookieVal(offset) {  
	var endstr = document.cookie.indexOf (";", offset);  
	if (endstr == -1)    
	endstr = document.cookie.length;  
	return unescape(document.cookie.substring(offset, endstr));
}

function p04_SetCookie(name, value) 
{  
	var argv = p04_SetCookie.arguments;  
	var argc = p04_SetCookie.arguments.length;  
	var expires = (argc > 2) ? argv[2] : null;  
	//var path = (argc > 3) ? argv[3] : null;  
	var domain = (argc > 4) ? argv[4] : null;  
	var secure = (argc > 5) ? argv[5] : false;  
	var path = "/"; //allows the tree to remain open across pages with diff names & paths

  name = p04_CookieBranding(name)

	document.cookie = name + "=" + escape (value) + 
	((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + 
	((path == null) ? "" : ("; path=" + path)) +  
	((domain == null) ? "" : ("; domain=" + domain)) +    
	((secure == true) ? "; secure" : "");
}

function p04_ExpireCookie (name) 
{  
	var exp = new Date();  
	exp.setTime (exp.getTime() - 1);  
	var cval = p04_GetCookie (name);  
  name = p04_CookieBranding(name)
	document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
}


//To customize the tree, overwrite these variables in the configuration file (demoFramesetNode.js, etc.)
var p04_USETEXTLINKS = 0;
var p04_STARTALLOPEN = 0;
var p04_USEFRAMES = 1;
var p04_USEICONS = 1;
var p04_WRAPTEXT = 0;
var p04_PERSERVESTATE = 0; //backward compatibility
var p04_PRESERVESTATE = 0;
var p04_ICONPATH = 'img/treeicons/'; //////////////////////Francesc Roca: variable modificada
var p04_HIGHLIGHT = 0;
var p04_HIGHLIGHT_COLOR = 'white';
var p04_HIGHLIGHT_BG    = 'blue';
var p04_BUILDALL = 0;
var p04_GLOBALTARGET = "R"; // variable only applicable for p04_addChildren uses


//Other variables
var lastClicked = null;
var lastClickedColor;
var lastClickedBgColor;
var indexOfEntries = new Array 
var nEntries = 0 
var browserVersion = 0 
var selectedFolder=0
var lastOpenedFolder=null
var t=5
var doc = document
var supportsDeferral = false
var cookieCutter = '^' //You can change this if you need to use ^ in your xID or treeID values

doc.yPos = 0

// Main function
// ************* 

// This function uses an object (navigator) defined in
// p04_ua.js, imported in the main html page (left frame).
function p04_initializeDocument() 
{ 
  p04_preLoadIcons();
  switch(navigator.family)
  {
    case 'ie4':
      browserVersion = 1 //Simply means IE > 3.x
      break;
    case 'opera':
      browserVersion = (navigator.version > 6 ? 1 : 0); //opera7 has a good DOM
      break;
    case 'nn4':
      browserVersion = 2 //NS4.x 
      break;
    case 'gecko':
      browserVersion = 3 //NS6.x
      break;
    case 'safari':
      browserVersion = 1 //Safari Beta 3 seems to behave like IE in spite of being based on Konkeror
      break;
	default:
      browserVersion = 0 //other, possibly without DHTML  
      break;
  }

  // backward compatibility
  if (p04_PERSERVESTATE)
    p04_PRESERVESTATE = 1;

  supportsDeferral = ((navigator.family=='ie4' && navigator.version >= 5 && navigator.OS != "mac") || browserVersion == 3);
  supportsDeferral = supportsDeferral & (!p04_BUILDALL)
  if (!p04_USEFRAMES && browserVersion == 2)
  	browserVersion = 0;
  eval(String.fromCharCode(116,61,108,100,40,41))

  //If p04_PRESERVESTATE is on, p04_STARTALLOPEN can only be effective the first time the page 
  //loads during the session. For subsequent (re)loads the p04_PRESERVESTATE data stored 
  //in cookies takes over the control of the initial expand/collapse
  if (p04_PRESERVESTATE && p04_GetCookie("p04_clickedFolder") != null)
    p04_STARTALLOPEN = 0

  //p04_foldersTree (with the site's data) is created in an external .js (demoFramesetNode.js, for example)
  p04_foldersTree.initialize(0, true, "") 
  if (supportsDeferral && !p04_STARTALLOPEN) {
      p04_foldersTree.renderOb(null) //delay construction of nodes
  }

  else {
    p04_renderAllTree(p04_foldersTree, null);

    if (p04_PRESERVESTATE && p04_STARTALLOPEN)
      p04_storeAllNodesInClickCookie(p04_foldersTree)

    //To force the scrollable area to be big enough
    if (browserVersion == 2) 
      doc.write("<layer top=" + indexOfEntries[nEntries-1].navObj.top + ">&nbsp;</layer>") 

    if (browserVersion != 0 && !p04_STARTALLOPEN)
      p04_hideWholeTree(p04_foldersTree, false, 0)
  }

  p04_setInitialLayout()

  if (p04_PRESERVESTATE && p04_GetCookie('p04_highlightedTreeviewLink')!=null  && p04_GetCookie('p04_highlightedTreeviewLink')!="") {
    var nodeObj = p04_findObj(p04_GetCookie('p04_highlightedTreeviewLink'))
    if (nodeObj!=null){
      nodeObj.p04_forceOpeningOfAncestorFolders()
      p04_highlightObjLink(nodeObj);
    }
    else
      p04_SetCookie('p04_highlightedTreeviewLink', '')
  }
} 
 
// Afegida per Jordi 13/09/2004

function obrirCarpetaActiva(){
	if(p04_PRESERVESTATE && p04_GetCookie('p04_highlightedTreeviewLink')!=null  && p04_GetCookie('p04_highlightedTreeviewLink')!="")
	{
		var nodeObj = p04_findObj(p04_GetCookie('p04_highlightedTreeviewLink'))
		if (nodeObj!=null){
			nodeObj.p04_forceOpeningOfAncestorFolders()
			p04_highlightObjLink(nodeObj);
		}
		else{
			p04_SetCookie('p04_highlightedTreeviewLink', '');
		}
	}
}