// The only code that needs to be modified is the LoadTree function and the value of "Main" above.  
// See comments in Node fuction for more information.  
// Visit http://lapeer.org/ to see how the following code looks.  

// Created by: Patrick Gormley
//						Lapeer East high School
//						Lapeer Michigan 48446
//						June 1999
// Modified by: Paolo Pasini
//						Utilia S.p.A
//						Rimini (RN) - Italy
//						Last update: december 2004

var doc; // global constant
var m_div;	// div in cui sta il menù
// var Main="Categoria principale";
var reload_on_open_branch=true;
var reload_on_close_branch=false;
var open_branch_on_folder_link=false;
var	only_one_open_folder=false;		//se true faccio in modo che allo stesso livello sia aperta un solo folder
var change_sel_icon=false;				//se true uso img diversa per nodo selezionato
var folderNode=0;
var maxNumElemInBranch = 4;
var hide_main_node=false;

var curSelNode;		// current selected node
var treeStatusStr=new String();	// contains the status of each item

var nodeImage=new Image()
var lastNodeImage=new Image()
var vLineImage=new Image()
var docImage=new Image()
var docImage_sel=new Image()
var linkImage=new Image()
var openFolderImage= new Image()
var openFolderImage_sel= new Image()
var closedFolderImage= new Image()
var closedFolderImage_sel= new Image()
var m_html;


// classi css e layout ----------------------
var js_menu_doc_link='js_menu_doc_link';
var js_menu_folder_link='js_menu_folder_link';
var js_menu_doc_link_sel='js_menu_doc_link_sel';
var js_menu_folder_link_sel='js_menu_folder_link_sel';
var js_menu_td='';
var js_menu_td_sel='';
var js_menu_doc_td='';
var js_menu_folder_td='';
var js_menu_doc_td_sel='';
var js_menu_folder_td_sel='';
var main_tbl_prop = 'border="0" width="100%" cellpadding="0" cellspacing="0"';
var folder_tbl_prop = 'border="0" width="100%" cellspacing="0" cellpadding="0"';
var doc_tbl_prop = 'border="0" width="100%" cellpadding="0" cellspacing="0"';
// --------------------------------



// Object definition for Node follows
function Node (parent,level,folder,name,id,frame,link,icon)
// parent:  the parent node
// level:  Which level this node will be at 
// folder: Controls the icon displayed (0=file icon; 1=folder icon)
// name: Name to be displayed to the right of this icon
// frame:  Which frame this page will be displayed in (0=new frame; 1=self frame)
// link:  the link to the page
// icon: type of file icon to be displayed for the link (0=link icon; 1=file icon)
//   Note:  0 for a link icon is used for pages on another server, 1 for pages on your server)
{

	//Object Definition 
	this.level=level;	//level of this icon
	this.folder=folder;  // 0=file; 1=folder
	this.link=link;			//HREF link
	this.frame=frame;  // Which frame this file should open in.  0=new, 1=self.
	this.name=name; // name of this icon.
	this.id=id; // item unque id
	this.icon=icon;	// 0=link icon; 1=doc icon
	this.last=0;	// 0=not last icon in this level (initial value); 1=last icon in this level.
	this.table=new Array; // a table of things to write out
	this.table[0]=level;  // which level this icon is to be printed at
	this.state=0;  // Folder only.  0=closed; 1=open.  Initially closed
	this.html=m_html;
	this.list=new Array;  // Folder only.  List of icons in this folder. 
		this.list[0]=0;  // Initially empty.
	this.ToggleFolder=ToggleFolder;  // Folder Only.  Fuction which toggles a folder's open state.
	this.WriteMe=WriteMe		//Method to write out
	for (var i=1;i<=7;i++) { this.table[i]=0;}	//initialize table
	if (parent!=null) { 
		this.parent=parent;
		parent.list[parent.list.length]=this;	//si aggiunge in coda alla list del parent
	}
//	PackPrArray(this);
	
	function ToggleFolder()
	{
		state=Number(this.state);
		state=(state+1) % 2;	// 0=closed, 1=open.
		this.state=state;
	}  
	

	function WriteMe()
	{
		var i=0;
		var tableBgn;
		var tableEnd="</table></td></tr>";
		
		if(this.folder) tbl_prop = folder_tbl_prop;
		else tbl_prop = doc_tbl_prop;
		
		tableBgn='<tr><td><table '+ tbl_prop +'>';		
		
		m_html += tableBgn;
		while (this.table[i]!=0) 
		{
			m_html +=  this.table[i];
			i++;
		}
		m_html += tableEnd;
	}
	

} // End of Node definition

function PrepareFolderIcon (theNode)
{
	var openFolder;
	var closedFolder;
	var endAHREF, temp='';
	var AHREF;
	var open_img_src=openFolderImage.src;
	var closed_img_src=closedFolderImage.src;
	
	// se il nodo è selezionato posso utilizzare immagini diverse
	if(theNode.id == curSelNode.id) {
		open_img_src = openFolderImage_sel.src;
		closed_img_src = closedFolderImage_sel.src;
	}

	openFolder="<IMG src="+ open_img_src + "  border=noborder align=\"top\">";
	closedFolder="<IMG src="+ closed_img_src + "  border=noborder align=\"top\">";

	// si assume che se il link è vuoto non si possa neanche effettuare il browse, quindi aprire il folder
	if(theNode.link != '' ) {
		AHREF="<a href='javascript: OpenBranch(\""+theNode.id + "\")\'>";
		endAHREF="</a>";
	} else { 
		AHREF="";
		endAHREF="";
	}
	
	if (theNode.state==0) {
		temp=AHREF+closedFolder+endAHREF;
	} else {
		temp=AHREF+openFolder+endAHREF;
	}
	return(temp);
}

function PrepareDocIcon(theNode)
{
	var linkIcon="<IMG src= \"" + linkImage.src+ "\" border=\"0\" align=\"top\" ";
	var docIcon;
	var img_src=docImage.src;
	var js="onclick=\"OpenBranch('"+theNode.id+"')\" ";
	var endAHREF, temp='';
	var AHREF;

	// se il nodo è selezionato posso utilizzare immagini diverse
	if(theNode.id == curSelNode.id) img_src = docImage_sel.src;
	
	docIcon="<IMG src= \"" + img_src + "\" border=\"0\" align=\"top\" ";

	// si assume che se il link è vuoto non si possa neanche effettuare il browse, quindi aprire il folder
	if(theNode.link != '' ) {
		startHref="<a href="+theNode.link+"&str_tree_status="+treeStatusStr+"&menu_sel_item="+theNode.id+" >";
		endHref='</a>';
	} else { 
		startHref="";
		endHref="";
	}

	temp = startHref + docIcon + '>' + endHref;
	
	/*
	if (theNode.frame==0)
		temp = temp + bTargetFrame;
	else
		temp = temp + rTargetFrame;

	temp+='>';

	if (theNode.icon==1)
		temp = temp +docIcon + endAHREF;
	else
		temp = temp +linkIcon + endAHREF;
	*/
	return (temp);
}


function PackPrArray(theNode)
{
	var nodeCell;
	var lnodeCell;
	var verLineCell;
	var temp,temp1;
	var fontInfoBgn;
	var fontInfoSelBgn;
	var fontInfoEnd="</td>";
	var tableBgn="";
	var startHref;
	var endHref;
	var i,tbl_cont,max_tbl;
	var css_class,css_class_tr;
	

	with (theNode)
 {

		if (folder==1) { 
			css_class_name='js_menu_folder_link';
			if(js_menu_folder_td) js_menu_td=js_menu_folder_td;
			if(js_menu_folder_td_sel) js_menu_td_sel=js_menu_folder_td_sel;
			temp=PrepareFolderIcon(theNode);
		} else { 
			css_class_name='js_menu_doc_link';
			if(js_menu_doc_td) js_menu_td=js_menu_doc_td;
			if(js_menu_doc_td_sel) js_menu_td_sel=js_menu_doc_td_sel;
			temp=PrepareDocIcon(theNode);
		}
				
		nodeCell="<td valign =\"top\" class=\""+js_menu_td+"\" wrap><IMG src= " + nodeImage.src + " >";
		lnodeCell="<td valign =\"top\" class=\""+js_menu_td+"\" wrap><IMG src= " + lastNodeImage.src + " >";
		verLineCell="<td valign =\"top\" class=\""+js_menu_td+"\" wrap><IMG src= "+ vLineImage.src + " ></td>";
		fontInfoBgn="<TD width=\"100%\" valign=\"top\" class=\""+js_menu_td+"\" align=\"left\" wrap >";
		fontInfoSelBgn="<TD width=\"100%\"  valign=\"top\" class=\""+js_menu_td_sel+"\" align=\"left\" wrap >";

		if(id==curSelNode.id) { 	// differenzio il nodo selezionato
			css_class_name += '_sel';
			fontInfoBgn=fontInfoSelBgn;	
		}
		eval('css_class='+css_class_name+';');

		if(link != '' )  {
			startHref="<a class=\""+css_class+"\" href=\""+theNode.link+"&str_tree_status="+treeStatusStr+"&menu_sel_item="+theNode.id+"\"";
			if(folder==1 && open_branch_on_folder_link) startHref+= " onclick=\"OpenBranch('"+theNode.id+"'); return false;\" ";
			startHref+= ' >';
			endHref='</a>';
		} else { 
			startHref='';
			endHref='';
		}
		
		if (last==1) temp1=lnodeCell;
	 	else temp1=nodeCell;
				
		switch (level)
		{
		
		case 0: 
			table[0]="<tr class=\""+css_class_tr+"\" ><td valign = middle class=\""+js_menu_td+"\" wrap>" + temp + "</td>";
			table[1]= fontInfoBgn+startHref+name+endHref+fontInfoEnd + "</tr>";
	 	break;
	 	
		case 1: 
			table[0]="<tr class=\""+css_class_tr+"\">"+temp1;
			table[1]=temp + "</td>";	
			table[2]=fontInfoBgn+startHref+name+endHref+fontInfoEnd + "</tr>";
	 	break;
	 		
		default:
	 		max_tbl=level+1;			
			for(i=0; i<=max_tbl; i++) {
				switch(i) {
					case 0:
						tbl_cont="<tr class=\""+css_class_tr+"\">"+verLineCell;
						break;
					case max_tbl-2:
						tbl_cont=temp1;
						break;
					case max_tbl-1:
						tbl_cont=temp;
						break;
					case max_tbl:
						tbl_cont = fontInfoBgn+startHref+name+endHref+fontInfoEnd;
						break;
					default:
						tbl_cont=verLineCell;						
						break;
				}
				table[i]=tbl_cont;
			}	// close for

	 	}	//close switch
	}	//close with
}	//close function


function WriteOutNode(theNode)
{
	var i,k,k1;
	
	k=theNode.list.length;
	// k = min(k1,maxNumElemInBranch);
	if(!hide_main_node || theNode.level > 0) theNode.WriteMe();
	if ((theNode.state==1) && (k>1)) {
		for (i=1;i<k;i++) {
			WriteOutNode(theNode.list[i]);
		}
	}
}


function RefreshScreen()
{
	m_html='<table '+main_tbl_prop+'>';
	WriteOutNode(folderNode);
	m_html+='</table>';
	m_div.innerHTML=m_html;
}

function IdentifyLastChild(theNode)
{
	var k=theNode.list.length;
	
	if ((theNode.folder=1) && (k>1))
		{	
		theNode.list[k-1].last=1;	
		for (var i=1;i<k;i++)
			if (theNode.list[i].folder==1)
				IdentifyLastChild(theNode.list[i]);
		}
}


function PreparePrinting(theNode)
{
	var k=theNode.list.length;
	PackPrArray(theNode);
	if ((theNode.folder==1) && (k>1))
		for (var i=1;i<k;i++)
			PreparePrinting(theNode.list[i]);
}

function initializeTree(path)
{
	if(path) path=path+'/';
	
	//m_if=document.getElementById('menu_if');	// initialize global
	m_div=document.getElementById('menu_div');	// initialize global
	nodeImage.src=path+"menu/Images/node.gif";
	lastNodeImage.src=path+"menu/Images/lastnode.gif";
	vLineImage.src=path+"menu/Images/vertline.gif";
	docImage.src=path+"menu/Images/doc.gif";
	linkImage.src=path+"menu/Images/link.gif";
	openFolderImage.src=path+"menu/Images/openfolder.gif";
	closedFolderImage.src=path+"menu/Images/closefolder.gif";
	if(change_sel_icon) {
		docImage_sel.src=path+"menu/Images/doc_sel.gif";
		openFolderImage_sel.src=path+"menu/Images/openfolder_sel.gif";
		closedFolderImage_sel.src=path+"menu/Images/closefolder_sel.gif";
	} else {
		docImage_sel.src=docImage.src
		openFolderImage_sel.src=openFolderImage.src
		closedFolderImage_sel.src=openFolderImage.src;
	}
	LoadTree();
	readTreeStatus();
	if(curSelNode == null) curSelNode=folderNode;
	IdentifyLastChild(folderNode);
	PreparePrinting(folderNode);
	if(folderNode.state==0) folderNode.ToggleFolder(); //Opening Main folder 
	RefreshScreen();
}

function FindFolder(theNode,branchName)
{
	var node;
	var k=theNode.list.length;
	if (theNode.name==branchName) {
		node=theNode;
	} else
	//	if ((theNode.state==1) && (k>1)) {
		if (k>1) {
			for (var i=1;i<k;i++) {
				node=FindFolder(theNode.list[i],branchName);
				if(node!=null) return node;
			}
		}
	return node;
}

function FindFolderById(theNode,id)
{
	var node;
	var k=theNode.list.length;
	if (theNode.id==id) {
		node=theNode;
	} else
	//	if ((theNode.state==1) && (k>1)) {
		if (k>1) {
			for (var i=1;i<k;i++) {
				node=FindFolderById(theNode.list[i],id);
				if(node!=null) return node;
			}
		}
	return node;
}


// apertura folder (ricaricando la pagina oppure no)
function OpenBranch(branchId)
{
	var timeOutID,node;

	node=FindFolderById(folderNode,branchId);
	if(node!= null) {
		if(node.folder==0) {	//it's a doc, not a folder
			 curSelNode=node;	//memorizzo il nodo correntemente selezionato
		}
		node.ToggleFolder();
		
		//chiudo tutti gli altri nodi figli dello stesso parent
		if(node.parent != null && node.state && only_one_open_folder) {
			for(i=0; i<node.parent.list.length; i++) {
				t_node = node.parent.list[i];
				if(t_node.state && t_node.id != node.id) t_node.ToggleFolder();
			}
		}
		
		setTreeStatus(writeTreeStatus(folderNode,0));
		if((reload_on_open_branch && node.state == 1) || (reload_on_close_branch && node.state == 0) ) {		
			window.location.href = node.link+"&str_tree_status="+treeStatusStr+"&menu_sel_item="+node.id;
		} else {
			PreparePrinting(folderNode);
			timeOutID=setTimeout("RefreshScreen()",5);	//avoids grey screen flicker
		}
	}
}

// ricostruisce lo stato del menù a partire dell'array treeStatus
function readTreeStatus() {

	var treeStatusArr = new Array();
	var status,name;

	if(treeStatusStr!='') {
		treeStatusArr=treeStatusStr.split(':');
		startNode=folderNode;
		for(i=0; i<treeStatusArr.length; i++) {
			id=new String(treeStatusArr[i]);
			status=id.substr((id.length-1),1);
			id=id.substr(0,(id.length-2));
			node=FindFolderById(startNode,id);
			//alert('name='+node.name+' id='+node.id+' state='+node.state);
			if(node!= null) {		
				if(node.folder==1) node.state=status;
				else if(node.id==curSelNode.id) node.state=1;
			}
		}
	}
}


// genera stringa con stato del menù. Vengono considerati solo nodi aperti
function writeTreeStatus(startNode,counter) {

	var i,k,c;
	if(startNode == '') startNode=folderNode;
	
	if((startNode.folder==1)&&(startNode.state==1) ) {
		if(counter==0) { treeStatusStr=''; }
		else treeStatusStr+=':';
		c=counter+1;
		treeStatusStr+=startNode.id+'='+startNode.state;
		k=startNode.list.length;
		if(k>1) {
			for(i=1; i<k; i++) {
				writeTreeStatus(startNode.list[i],c);
			}
		}	
	}
	return treeStatusStr;
}


function addItem(objName,parent,level,folder,name,id,frame,link,icon) {
	var str;
	str = objName+'= new Node('+parent+','+level+','+folder+','+name+',\''+id+'\','+frame+',\''+link+'\','+icon+')';
	eval(str);
}

function setTreeStatus(str) {
	// alert('str='+str);
	treeStatusStr=str;
}

function setCurSelItem(id) {
	var node;
	node=FindFolderById(folderNode,id);
	if(node!=null)  curSelNode=node;
}
