// *****************************************************************
// Global variables 
// *****************************************************************

indexOfEntries			= new Array;
nEntries				= 0;
doc						= document;

// *****************************************************************
// Definition of class Folder 
// ***************************************************************** 

	//constructor

function Folder( folderDescription, hreference ) { 

		//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		= imgFolderOpen;
	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 = imgLastNodeMinus;
			} else {
				folder.nodeImg.src = imgNodeMinus;
			}
		}
		folder.iconImg.src = imgFolderOpen;
		for ( i=0; i<folder.nChildren; i++ ) {
			folder.children[i].display();
		}
	} else { 
		if ( folder.nodeImg ) {
			if ( folder.isLastNode ) {
				folder.nodeImg.src = imgLastNodePlus;
			} else {
				folder.nodeImg.src = imgNodePlus;
			}
		}
		folder.iconImg.src = imgFolderClosed;
		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 j=0;
	var i=0;
	var numberOfFolders;
	var numberOfDocs;
	var nc;
		
	nc = this.nChildren;
	 
	this.createIndex();
 
	var auxEv = "";
 
	if ( browserVersion > 0 ) {
		auxEv = "<a href='javascript:clickOnNode( " + this.id + " )'>";
	} else {
		auxEv = "<a>";
	}
 
	if ( level > 0 ) {
	
			// the last 'brother' in the children array

		if ( lastNode ) { 
			this.renderOb( leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='" + imgLastNodeMinus + "' border=0></a>" );
			leftSide = leftSide + "<img src='" + imgBlank + "' border=0>";
			this.isLastNode = 1;
		} else { 
			this.renderOb( leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='" + imgNodeMinus + "' border=0></a>" );
			leftSide = leftSide + "<img src='" + imgVerticalLIne + "' border=0>";
			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 ) { 
	if ( browserVersion == 2 ) { 
		if ( !doc.yPos ) {
			doc.yPos=8;
		}
		doc.write( "<layer id='folder" + this.id + "' top=" + doc.yPos + " visibility=hiden>" ) 
	} 
	 
	doc.write( "<table " ) 
	if ( browserVersion == 1 ) {
		doc.write( " id='folder" + this.id + "' style='position:block;' " );
	}
	doc.write( " border=0 cellspacing=0 cellpadding=0>" );
	doc.write( "<tr><td>" );
	doc.write( leftSide );
	this.outputLink();
	doc.write( "<img name='folderIcon" + this.id + "' " );
	doc.write( "src='" + this.iconSrc + "' border=0></a>" );
	doc.write( "</td><td valign=middle nowrap><span class=menulabel>" );
	if ( USETEXTLINKS ) { 
		this.outputLink();
		doc.write( this.desc + "</a>" );
	} else {
		doc.write( this.desc );
	}
		doc.write( "</td></tr>" );
		doc.write( "</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 ) { 
		doc.write( "<a href='" + this.hreference + "' target=frameBase " );
		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++ ) { 
	
		//is a folder
	if ( this.children[ i ].children )  
		se = se + this.children[ i ].subEntries();
	} 
 
	return se;
} 
 

// *****************************************************************
// Definition of class Item ( a document or link inside a Folder ) 
// *****************************************************************

	// Constructor

function Item( itemDescription, itemLink ) { 

		// 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		= imgDocument;
 
		// 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 ) {
	
			// the last 'brother' in the children array
		if ( lastNode ) { 
			this.renderOb( leftSide + "<img src='" + imgLastNode + "' border=0>" );
			leftSide = leftSide + "<img src='" + imgBlank + "' border=0>";
		} else { 
			this.renderOb( leftSide + "<img src='" + imgNode + "' border=0>" );
			leftSide = leftSide + "<img src='" + imgVerticalLIne + "' border=0>";
		} 

	} else {

		this.renderOb( "" );

	}
} 
 
function drawItem( leftSide ) { 
	if ( browserVersion == 2 ) {
		doc.write( "<layer id='item" + this.id + "' top=" + doc.yPos + " visibility=hiden>" );
	}
	 
	doc.write( "<table " );
	
	if ( browserVersion == 1 ) {
		doc.write( " id='item" + this.id + "' style='position:block;' " );
	}

	doc.write( " border=0 cellspacing=0 cellpadding=0>" );
	doc.write( "<tr><td>" );
	doc.write( leftSide );
	doc.write( "<a href=" + this.link + ">" );
	doc.write( "<img id='itemIcon" + this.id + "' " );
	doc.write( "src='" + this.iconSrc + "' border=0>" );
	doc.write( "</a>" );
	doc.write( "</td><td valign=middle nowrap><span class=menulabel>" );

	if ( USETEXTLINKS ) {
		doc.write( "<a href=" + this.link + ">" + this.desc + "</a>" );
	} else {
		doc.write( this.desc );
	}
	doc.write( "</td></tr>" );
	doc.write( "</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 
	// used with browserVersion == 2
function totalHeight() { 
	var h = this.navObj.clip.height;
	var i = 0;
	
		//is a folder and _is_ open
	if ( this.isOpen ) {
		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 );
	}
 
	return;
 
	if ( clicked.isSelected ) {
		return;
	}
} 
 
function clickOnNode( folderId ) { 
	var clickedFolder = 0;
	var state = 0;
 
	clickedFolder = indexOfEntries[ folderId ];
	state = clickedFolder.isOpen;
 
		// open<->close
	clickedFolder.setState( !state );
} 
 
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 makeFolder( description, hreference ) { 
	folder = new Folder( description, hreference );
	return folder;
} 
 
function makeLink( target, description, linkData ) { 
	fullLink = "";
 
	if ( target==0 ) { 
		fullLink = linkData + " target=frameBase";
	} else { 
		if ( target==1 ) {
			 fullLink = "http://" + linkData + " target=_blank";
		} else {
			 fullLink = "http://" + linkData + " target=frameBase";
		}
	} 
 
	linkItem = new Item( description, fullLink );
	return linkItem;
} 
 
function insertFolder( parentFolder, childFolder ) { 
	return parentFolder.addChild( childFolder );
} 
 
function insertDocument( parentFolder, document ) { 
	parentFolder.addChild( document );
} 
