//http://www.fczbkk.com/js/tree/

//object holding all functions and variables
tree1 = {
	//paths to images used in tree nodes
	nodeExpand			: "images/plus3.gif",
	nodeExpandAlt		: "[ + ] ",
	nodeCollapse		: "images/minus3.gif",
	nodeCollapseAlt	: "[ - ] ",
	nodeNone				: "images/nic3.gif",
	nodeNoneAlt			: "[   ] ",

	init : function(idecko,trida,cesta,tree1)
	{	init(idecko,trida,cesta,tree1);	},

	//gets the actual state of branch and changes it
	changeState : function(e)
	{
		e = evt.fix(e);
		var obj = (e.currentTarget) ? e.currentTarget : e.target;
		while (obj.tagName!="LI")
		{	obj = obj.parentNode;	}

		if (obj.state=="collapsed")
		{	expand(obj,tree1);	}
		else
		{	collapse(obj,tree1);	}
	} //end changeState()
};

tree2 = {
	//paths to images used in tree nodes
	nodeExpand			: "images/plus2.gif",
	nodeExpandAlt		: "[ + ] ",
	nodeCollapse		: "images/minus2.gif",
	nodeCollapseAlt	: "[ - ] ",
	nodeNone				: "images/nic2.gif",
	nodeNoneAlt			: "[   ] ",

	init : function(idecko,trida,cesta,tree1)
	{	init(idecko,trida,cesta,tree2);	},

	//gets the actual state of branch and changes it
	changeState : function(e)
	{
		e = evt.fix(e);
		var obj = (e.currentTarget) ? e.currentTarget : e.target;
		while (obj.tagName!="LI")
		{	obj = obj.parentNode;	}

		if (obj.state=="collapsed")
		{	expand(obj,tree2);	}
		else
		{	collapse(obj,tree2);	}
	} //end changeState()
};

// initialisation of the tree
function init(idecko,trida,cesta,tree)
{
	tree.nodeExpand = cesta + tree.nodeExpand;
	tree.nodeCollapse = cesta + tree.nodeCollapse;
	tree.nodeNone = cesta + tree.nodeNone;

	var ul = document.getElementById(idecko);
	ul.className = trida;

	//přidej všem obrázky
	var lis = ul.getElementsByTagName('li');
	for (var i=0; i<lis.length; i++)
	{	addNode(lis[i],tree);	}

	//zavři na začátku všechny
	collapseAll(ul,tree);

	//najdi to, co má být otevřeno a rozbal to
	var def = otevri(ul,trida + 'o',"li");
	for (var i=0; i<def.length; i++)
	{
		var step = def[i];
		while (step!=ul)
		{
			if (step.tagName=="LI")
			{	expand(step,tree); }
			step = step.parentNode;
		}
	}
} //end init()

//přidá obrázek
function addNode(elm,tree)
{
	var uls = elm.getElementsByTagName("ul");
	var image = document.createElement("img");
	if (uls.length>0)
	{
		image.src = tree.nodeExpand;
		image.alt = tree.nodeExpandAlt;
		evt.add(image,"click",tree.changeState);
	}
	else
	{
		image.src = tree.nodeNone;
		image.alt = tree.nodeNoneAlt;
	}
	elm.insertBefore(image,elm.firstChild);
} //end addNode()

//zabalí všechny
function collapseAll(elm,tree)
{
	if (elm.tagName=="LI")
	{	tree.expand(elm);	}
	var lis = elm.getElementsByTagName("li");
	for (var i=0; i<lis.length; i++)
	{	collapse(lis[i],tree);	}
} //end collapseAll()

//zabalí konkrétní
function collapse(elm,tree)
{
	var uls = elm.getElementsByTagName("ul");
	for (var i=0; i<uls.length; i++)
	{
		if (uls[i].parentNode==elm)
		{
			uls[i].style.display = "none";
			uls[i].parentNode.state = "collapsed";
			elm.firstChild.src = tree.nodeExpand;
			elm.firstChild.alt = tree.nodeExpandAlt;
		}
	}
} //end collapse()

//rozbalí všechny
function expandAll(elm,tree)
{
	if (elm.tagName=="LI")
	{	tree.expand(elm);	}
	var lis = elm.getElementsByTagName("li");
	for (var i=0; i<lis.length; i++)
	{	tree.expand(lis[i]);	}
} //end expandAll()

//rozbalí konkrétní
function expand(elm,tree)
{
	var uls = elm.getElementsByTagName("ul");
	for (var i=0; i<uls.length; i++)
	{
		if (uls[i].parentNode==elm)
		{
			uls[i].style.display = "block";
			uls[i].parentNode.state = "expanded";
			elm.firstChild.src = tree.nodeCollapse;
			elm.firstChild.alt = tree.nodeCollapseAlt;
		}
	}
} //end expand()

//otevři to, co bylo otevřeno
function otevri(srcElm,clName,tName)
{
	foundElements = [];
	allElements = srcElm.getElementsByTagName(tName);
	for (var i=0; i<allElements.length; i++)
	{
		if (cls.has(allElements[i],clName))
		{	foundElements[foundElements.length] = allElements[i];	}
	}
	return foundElements;
} //end otevri()

//library for cross-browser event management
evt = {
	// attach event
	add : function(obj,evType,fn,useCapture)
	{
		// Opera hack
		if (window.opera && (obj==window))
		{	obj = document;	}
	
		if (obj.addEventListener)
		{
			obj.addEventListener(evType,fn,useCapture);
			return true;
		}
		else
		{
			if (obj.attachEvent)
			{
				var r = obj.attachEvent("on" + evType, fn);
				return r;
			}
			else
			{	return false;	}
		}
	}, //end add()

	//remove event
	remove : function(obj,evType,fn,useCapture)
	{
		//Opera hack
		if (window.opera && (obj==window))
		{	obj = document;	}
	
		if (obj.removeEventListener)
		{
			obj.removeEventListener(evType,fn,useCapture);
			return true;
		}
		else
		{
			if (obj.detachEvent)
			{
				var r = obj.detachEvent("on" + evType,fn);
				return r;
			}
			else
			{	return false;	}
		}
	}, //end remove()

	//fix for IE event model
	fix : function(e)
	{
		if (typeof e=='undefined') e = window.event;
		if (typeof e.target=='undefined') e.target = e.srcElement;
		if (typeof e.layerX=='undefined') e.layerX = e.offsetX;
		if (typeof e.layerY=='undefined') e.layerY = e.offsetY;
		if ((typeof e.which=='undefined') && e.keyCode) e.which = e.keyCode;

		if (!e.preventDefault) e.preventDefault = function()
		{	e.returnValue = false;	}
		return e;
	}
}; //konec třídy evt

//library for working with multiple classes
var cls = {
	//vrati pole obsahujuce vsetky triedy daneho elementu
	get : function(elm)
	{
		if (elm && elm.tagName)
		{
			var classes = [];
			if (elm.className)
			{// na zaklade Centiho upozornenia o divnej interpretacii v Opere
				var cl = elm.className.replace(/\s+/g, " ");
				classes = cl.split(" ");
			}
			return classes;
		}
		return false;
	}, //end get()

	//vrati true, ak element obsahuje triedu
	has : function(elm,cl)
	{
		if ((actCl=cls.get(elm)) && (typeof(cl)=="string"))
		{
			for (var i=0; i<actCl.length; i++)
			{
				if (actCl[i]==cl)
				{	return true;	}
			}
		}
		return false;
	} //end has()
}; //konec třídy cls

// initialisation of the script on load
function mbSet(idecko,trida,cesta,typ)
{
	switch (typ)
	{
		case 1:
			tree1.init(idecko,trida,cesta,tree1);
			break;
		case 2:
			tree2.init(idecko,trida,cesta,tree2);
			break;
	}
}
