var TREE_FORMAT =
[
//0. left position
	250,
//1. top position
	200,
//2. show +/- buttons
	true,
//3. couple of button images (collapsed/expanded/blank)
	["images/plus.gif", "images/minus.gif", "images/spacer.gif"],
//4. size of images (width, height,ident for nodes w/o children)
	[18,18,0],
//5. show folder image
	false,
//6. folder images (closed/opened/document)
	["images/spacer.gif", "images/spacer.gif", "images/spacer.gif"],
//7. size of images (width, height)
	[8,2],
//8. identation for each level [0/*first level*/, 16/*second*/, 32/*third*/,...]
	[0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272],
//9. tree background color ("" - transparent)
	"",
//10. default style for all nodes
	"clsNode",
//11. styles for each level of menu (default style will be used for undefined levels)
	["clsNode","clsNode1","clsNode1","clsNode1","clsNode1","clsNode1","clsNode1"],
//12. true if only one branch can be opened at same time
	true,
//13. item pagging and spacing
	[0,1],
];
var h = 0;
window.NTrees=[];
function bw_check(){
	var is_major=parseInt(navigator.appVersion);
	this.nver=is_major;
	this.ver=navigator.appVersion;
	this.agent=navigator.userAgent;
	this.dom=document.getElementById?1:0;
	this.opera=window.opera?1:0;
	this.ie5=(this.ver.indexOf("MSIE 5")>-1&&this.dom&&!this.opera)?1:0;
	this.ie6=(this.ver.indexOf("MSIE 6")>-1&&this.dom&&!this.opera)?1:0;
	this.ie4=(document.all&&!this.dom&&!this.opera)?1:0;
	this.ie=this.ie4||this.ie5||this.ie6;this.mac=this.agent.indexOf("Mac")>-1;
	this.ns6=(this.dom&&parseInt(this.ver)>=5)?1:0;
	this.ie3=(this.ver.indexOf("MSIE")&&(is_major<4));
	this.hotjava=(this.agent.toLowerCase().indexOf('hotjava')!=-1)?1:0;
	this.ns4=(document.layers&&!this.dom&&!this.hotjava)?1:0;
	this.bw=(this.ie6||this.ie5||this.ie4||this.ns4||this.ns6||this.opera);
	this.ver3=(this.hotjava||this.ie3);
	this.opera7=((this.agent.toLowerCase().indexOf('opera 7')>-1) || (this.agent.toLowerCase().indexOf('opera/7')>-1));
	this.operaOld=this.opera&&!this.opera7;
	return this;
};

function pldImg(arg){
	for(var i in arg){var im=new Image();im.src=arg[i];}
}
function CTreeFormat(fmt, tree, treetop){
	this.init=function(fmt, tree){
		var offset = (navigator.userAgent.indexOf("Gecko")>-1)?15:0;
		this.left=fmt[0];
		this.top=treetop + offset; //fmt[1];
		this.showB=fmt[2];
		this.clB=fmt[3][0];
		this.exB=fmt[3][1];
		this.iE=fmt[3][2];
		this.Bw=fmt[4][0];
		this.Bh=fmt[4][1];
		this.Ew=fmt[4][2];
		this.showF=fmt[5];
		this.clF=fmt[6][0];
		this.exF=fmt[6][1];
		this.iF=fmt[6][2];
		this.Fw=fmt[7][0];
		this.Fh=fmt[7][1];
		this.ident=fmt[8];
		this.back=new CTreeBack(this.left, this.top, fmt[9], 'cls'+tree.name+'_back');
		this.nst=fmt[10];
		this.nstl=fmt[11];
		this.so=fmt[12];
		this.pg=fmt[13][0];
		this.sp=fmt[13][1];
		if (this.showB)
			pldImg([this.clB,this.exB,this.iE]);
		if (this.showF)
			pldImg([this.exF,this.clF,this.iF]);						
	}
	this.nstyle=function(lvl){
		return(und(this.nstl[lvl])) ? this.nst : this.nstl[lvl];
	}
	this.idn=function(lvl){
		var r=(und(this.ident[lvl])) ? this.ident[0]*lvl : this.ident[lvl];return r;
	}
	this.init(fmt, tree);
}

function jsTree(name, nodes, format, treetop){
	this.REGISTERED=true;
	this.bw=new bw_check();
	this.ns4=this.bw.ns4;
	this.name=name;
	this.fmt=new CTreeFormat(format, this, treetop);
	if (und(window.NTrees)) 
		window.NTrees=[];
	window.NTrees[this.name]=this;
	this.Nodes=[];
	this.rootNode=new CTreeNode(null, "", "", "", null);
	this.rootNode.treeView=this;
	this.selectedNode=null;
	this.maxWidth=0;
	this.maxHeight=0;
	this.ondraw=null;	
	this.nbn=function(nm){
		for (var i=0;i<this.Nodes.length;i++) 
			if (this.Nodes[i].text == nm) 
				return this.Nodes[i];
			return null;
	}
	this.nodeByName=this.nbn;
	this.nodeByID=function(id){
		for (var i=0;i<this.Nodes.length;i++) 
			if (this.Nodes[i].nodeID==id) 
				return this.Nodes[i];
			return null;
	}

	this.nodeByURL=function(u){
		for(var i=0;i<this.Nodes.length;i++) 
			if (this.Nodes[i].url==u) 
				return this.Nodes[i];
			return null;
	}

	this.moveTo=function(x,y){
		this.fmt.back.top=y;
		this.fmt.back.left=y;
		this.fmt.back.moveTo(x,y);
		this.fmt.top=y;this.fmt.left=x;
	}

	this.addNode=function(node){
		var parentNode=node.parentNode;
		this.Nodes[this.Nodes.length]=node;
		node.index=this.Nodes.length-1;
		if (parentNode == null) 
			this.rootNode.children[this.rootNode.children.length]=node;
		else 
			parentNode.children[parentNode.children.length]=node;
		return node;
	}

	this.rebuildTree=function(){
		for (var i=0;i < this.Nodes.length;i++) document.write(this.Nodes[i].init());
        for (var i=0;i < this.Nodes.length;i++){
			var node=this.Nodes[i];
			node.el=this.ns4?document.layers[node.id()+"d"]:this.bw.dom?document.getElementById(node.id()+"d"):document.all[node.id()+"d"];		
		}
	}

	this.getImgEl=function(node){
		if (this.ns4) {
			if (this.fmt.showF&&!node.nf)node.nf=node.el.document.images[node.id()+"nf"];
			if (this.fmt.showB&&!node.nb)node.nb=node.el.document.images[node.id()+"nb"];
		} else {
			if (this.fmt.showB&&!node.nb)node.nb=this.bw.dom? document.getElementById(node.id()+"nb"):document.all[node.id()+"nb"];
			if (this.fmt.showF&&!node.nf)node.nf=this.bw.dom? document.getElementById(node.id()+"nf"):document.all[node.id()+"nf"];
		}
	}

	this.draw=function(){
		var innerText="";
		h = 0;
		this.currTop=this.fmt.top;
		this.maxHeight =0;
		this.maxWidth=0;
		for (var i=0;i < this.rootNode.children.length;i++) {
			this.rootNode.children[i].draw(true);
			h++;
		}
		this.fmt.back.resize(this.maxWidth-this.fmt.left, this.maxHeight-this.fmt.top);
		if (this.ondraw!=null) 
			this.ondraw();
		for(var ii=0;ii<h;ii++)
			innerText = innerText + '<p style="margin: .0em 0em .3em .6em;">&nbsp;</p>';
		writit(innerText,'spacer')
	}

	this.updateImages=function(node, ff){
		this.getImgEl(node);
		var b = this.fmt[node.expanded? "exB" : "clB"];
		var f = this.fmt[node.hasChildren()?(node.expanded?"exF":"clF"):"iF"]; 
		if (node.treeView.fmt.showB && node.nb && node.nb.src!=b) node.nb.src=b;
		if (node.treeView.fmt.showF && node.nf && node.nf.src!=f) node.nf.src=f;
	}

	this.expandNode=function(index){
		var node=this.Nodes[index];
		var pNode=node.parentNode ? node.parentNode : null;
		if (!und(node) && node.hasChildren()){
			node.expanded=!node.expanded;
			this.updateImages(node);
			if (!node.expanded)
				node.hideChildren();
			else 
				if (this.fmt.so)
					for (var i=0;i < this.Nodes.length;i++){
						this.Nodes[i].show(false);
						if(this.Nodes[i] != node && this.Nodes[i].parentNode == pNode) {
							this.Nodes[i].expanded=false;
							this.updateImages(this.Nodes[i]);
						}
					}
         this.draw();
		}
	}

	this.selectNode=function(index){
		var node=this.Nodes[index];
		if(!und(node)) this.selectedNode=node;
		node.draw();
	}

	this.readNodes=function(nodes){
		var ind=0;var par=null;
		function readOne(arr , tree){
			if (und(arr)) return;
			var i=0;var nodeID=0;
			if (arr[0]&&arr[0].id) {nodeID=arr[0].id;i++};
			var node=tree.addNode(new CTreeNode(tree, par, arr[i], url=arr[i+1] == null? "": arr[i+1], arr[i+2] == null? "": arr[i+2]));
			node.nodeID=nodeID;
			while (!und(arr[i+3])){
				par=node;
				readOne(arr[i+3], tree);
				i++;
			}
		}
		if (und(nodes) || und(nodes[0]) || und(nodes[0][0])) return;
		for (var i=0;i<nodes.length;i++){
			par=null;readOne(nodes[i], this);
		}
	}

	this.collapseAll=function(rd){
		for (var i=0;i < this.Nodes.length;i++){
			if (this.Nodes[i].parentNode != this.rootNode) this.Nodes[i].show(false);
			this.Nodes[i].expanded=false;
			this.updateImages(this.Nodes[i]);
		}
		if (rd) this.draw();
	}

	this.expandAll=function(rd){
		for (var i=0;i < this.Nodes.length;i++){
			this.Nodes[i].expanded=true;
			this.updateImages(this.Nodes[i]);
		}
		if (rd) this.draw();
	}

	this.init=function(){
		this.readNodes(nodes);
		this.rebuildTree();
		this.draw();
	}
	this.init();
	return this;
}

function CTreeNode(treeView, parentNode , text, url, target){
	this.index=-1;this.treeView=treeView;this.parentNode=parentNode;
	this.text=text;this.url=url;this.target=target;this.expanded=false;
	this.children=[];
	this.level=function(){
		var node=this;var i=0;
		while (node.parentNode != null){i++;node=node.parentNode;}
		return i;
	}
	this.hasChildren=function(){
		return this.children.length > 0;
	}
	
	this.init=function(){
		var bw = this.treeView.bw;
		return this.treeView.ns4?
			'<layer id="'+this.id()+'d" z-index="'+this.index+10+'" visibility="hidden">'+this.getContent()+'</layer>'
			:'<div id="'+this.id()+'d" style="position:absolute;visibility:hidden;'+(bw.opera&&(bw.nver!=6)||bw.ie4?'width:1px':'')+';z-index:'+this.index+10+';">'+this.getContent()+'</div>';
	}
	
	this.getH=function(){
		var bw = this.treeView.bw;
		this.css=bw.dom||bw.ie4?this.el.style:this.el;this.doc=bw.dom||bw.ie4?document:this.css.document;
		this.h=this.el.offsetHeight||this.css.clip.height||this.doc.height||this.css.pixelHeight;
		return this.h;
	}
	
	this.getH1=function(){
		if(!this.h)
			this.h=this.treeView.ns4 ? this.el.clip.height:this.treeView.bw.dom&&!this.treeView.bw.operaOld? this.el.firstChild.offsetHeight:this.el.offsetHeight;
		return this.h
	}
	
   this.getW=function(){
		if(!this.w)
			this.w=this.treeView.ns4 ? this.el.clip.width:this.treeView.bw.dom&&!this.treeView.bw.operaOld? this.el.firstChild.offsetWidth:this.el.offsetWidth;
		return this.w
	}
	
	this.id=function(){
		return 'nt'+this.treeView.name+this.index;
	}
	
	this.getContent=function(){
		function itemSquare(node){
      	var img=node.treeView.fmt[node.hasChildren()?(node.expanded?"exF":"clF"):"iF"]; 
			var w=node.treeView.fmt.Fw;var h=node.treeView.fmt.Fh;
			var img = "<img id=\""+node.id()+"nf\" name=\""+node.id()+"nf\" src=\"" + img + "\" width="+w+" height="+h+" border=0>"
			img = node.hasChildren()?'<a href="javascript:CTExpand(\''+node.treeView.name+'\','+node.index+')">'+img+'</a>':img;
			return "<td valign=\"middle\" width=\""+w+"\">"+img+"</td>\n";
		}
		function buttonSquare(node){
         var img=node.treeView.fmt[node.expanded? "exB" : "clB"]; 
			var w=node.treeView.fmt.Bw;var h=node.treeView.fmt.Bh;
			return '<td valign=\"middle\" width="'+w+'"><a href="javascript:CTExpand(\''+node.treeView.name+'\','+node.index+')"><img name=\''+node.id()+'nb\' id=\''+node.id()+'nb\' src="' + img + '" width="'+w+'" height="'+h+'" border=0></a></td>\n';
		}
		function blankSquare(node, ww){
			var img=node.treeView.fmt.iE;
			return "<td width=\""+ww+"\"><img src=\"" + img + "\" width="+ww+" height=1 border=0></td>\n"
		}
		var s='';
		var ll=this.level();
		s += '<table cellpadding='+this.treeView.fmt.pg+' cellspacing='+this.treeView.fmt.sp+' border=0 class="cls'+this.treeView.name+'_back'+ll+'"><tr>';
		var idn=this.treeView.fmt.idn(ll);
		if (idn > 0) s += blankSquare(this, idn);
		if(this.treeView.fmt.showB) s += this.hasChildren() ? buttonSquare(this) : blankSquare(this, this.treeView.fmt.Ew);
		if(this.treeView.fmt.showF) s += itemSquare(this);
		var n = this.treeView.name;
		if(this.url == "")	
			s += this.hasChildren()? '<td nowrap=\"1\"><a class="'+this.treeView.fmt.nstyle(ll)+'" href="javascript:CTExpand(\''+n+'\','+this.index+')">'+this.text+'</a></td></tr></table>' : '<td nowrap=\"1\"><a class="'+this.treeView.fmt.nstyle(ll)+'" href="javascript:void(0)">'+this.text+'</a></td></tr></table>';
		else 
			s += '<td nowrap=\"1\"><a class="'+this.treeView.fmt.nstyle(ll)+'" href="'+this.url+'" target="'+this.target+'">'+this.text+'</a></td></tr></table>';
        return s;
	}
	this.moveTo=function(x, y){
		if (this.treeView.ns4)
			this.el.moveTo(x,y);
		else{
			this.el.style.left=x;
			this.el.style.top=y;
		}
	}
	this.show=function(sh){
		if (this.visible == sh)
			return;
		this.visible=sh;
		var vis=this.treeView.ns4 ? (sh ? 'show': 'hide') : (sh ? 'visible': 'hidden');
		if (this.treeView.ns4)
			this.el.visibility=vis;
		else 
			this.el.style.visibility=vis;
	}
	this.hideChildren=function(){
		this.show(false);
		for (var i=0;i < this.children.length;i++)
			this.children[i].hideChildren();
	}
	this.draw=function(){
		var ll=this.treeView.fmt.left;
		this.moveTo(this.treeView.fmt.left, this.treeView.currTop);
		this.show(true);
		var w = this.getW();
		if (ll+ w> this.treeView.maxWidth)
			this.treeView.maxWidth=ll+w;
		this.treeView.currTop += this.getH();
		if (this.treeView.currTop > this.treeView.maxHeight)
			this.treeView.maxHeight=this.treeView.currTop;
		if (this.expanded && this.hasChildren()){
			for (var i=0;i < this.children.length;i++){
				this.children[i].draw();
				h++;
			}
		}
	}
}

function CTreeBack(aleft, atop, color, name){
	this.bw=new bw_check();
	this.ns4=this.bw.ns4;
	this.left=aleft;
	this.top=atop;
	this.name=name;
	this.color=color;
	this.t='';
	
	this.moveTo=function(x, y){
		if (this.ns4)
			this.el.moveTo(x,y);
		else{
			this.el.style.left=x;
			this.el.style.top=y;
			this.el2.style.left=x;
		}
	};
	this.resize=function(w,h){
		if (this.ns4){
			this.el.resizeTo(w,h);
		}
		else{
			this.el.style.width=w;
			this.el.style.height=h;
			if (this.r) 
				this.el2.style.top=h+this.top-5;
		}
	};
	this.init=function(){
		if (this.r)
			if (!this.ns4) {
				var bgc=this.color == ""? "" : " background-color:"+this.color+";";
				document.write('<div id="'+this.name+'c" style="'+bgc+'position:absolute;z-index:0;top:'+this.top+'px;left:0px;"></div>');
				this.el2=document.all? document.all[this.name+'c'] : document.getElementById(this.name+'c');
			}
			if(this.ns4){
				var bgc=this.color == ""? "" : ' bgcolor="'+this.color+'" ';
				document.write('<layer '+bgc+' top="'+this.top+'" left="'+this.left+'" id="'+this.name+'" z-index="0">'+ '</layer>');
				this.el=document.layers[this.name];
			} 
			else {
				var bgc=this.color == ""? "" : " background-color:"+this.color+";";
				document.write('<div id="'+this.name+'" style="'+bgc+'position:absolute;z-index:0;top:'+this.top+'px;left:'+this.left+'px">'+ '</div>');
				this.el=document.all? document.all[this.name] : document.getElementById(this.name);
			}
	};
	this.r=1;
	this.init();
}

function und(val){
	return typeof(val) == 'undefined';
}

window.oldCTOnLoad=window.onload;

function CTOnLoad(){
	var bw=new bw_check();
	if (bw.operaOld)window.operaResizeTimer=setTimeout('resizeHandler()',1000);
	if (typeof(window.oldCTOnLoad)=='function') window.oldCTOnLoad();
	if (bw.ns4) window.onresize=resizeHandler;
}
window.onload=new CTOnLoad();

function resizeHandler() {
	if (window.reloading) return;
	if (!window.origWidth){
		window.origWidth=window.innerWidth;
		window.origHeight=window.innerHeight;
	}
	var reload=window.innerWidth != window.origWidth || window.innerHeight != window.origHeight;
	window.origWidth=window.innerWidth;window.origHeight=window.innerHeight;
	if (window.operaResizeTimer)clearTimeout(window.operaResizeTimer);
	if (reload) {window.reloading=1;document.location.reload();return};
	if (new bw_check().operaOld){window.operaResizeTimer=setTimeout('resizeHandler()',500)};
}

function CTExpand(name, index){
	if(index>-1){
		window.NTrees[name].expandNode(index)
		//alert(index);
	}
}

function writit(text,id){
	var x;
	if (document.getElementById){
   	x = document.getElementById(id);
      x.innerHTML = '';
      x.innerHTML = text;
   }
   else if (document.all){
      x = document.all[id];
      x.innerHTML = text;
   }
}
