/* PREFS manager */
	function TR_prefs()
	{
		/* atributes */
		this.prefs = new Array();
		/* default settings */
		this.prefs['open_level'] = 1;
		this.prefs['hide_levels_css'] = false;
		/* methods */
		this.setClassNames = setClassNames;
		this.setElNames = setElNames;
		this.setOpenLevel = setOpenLevel;
		this.setOpenerBgImages = setOpenerBgImages;
		this.hideLevelsCSS = hideLevelsCSS;
	}
	
	function setElNames() 
	{
		this.prefs['tree_elements'] = setElNames.arguments;
	}
	
	function setClassNames(CN_tree, CN_list, CN_item_container, CN_item, CN_open_subcatgs, CN_nochild, CN_open_subitems, CN_opened, CN_last, /* pridano kvuli odkazovniku - trida pro vybranou item */ CN_active)
	{
		this.prefs['CN_tree'] = CN_tree;
		this.prefs['CN_list'] = CN_list;
		this.prefs['CN_item_container'] = CN_item_container;
		this.prefs['CN_item'] = CN_item;
		this.prefs['CN_open_subcatgs'] = CN_open_subcatgs;
		this.prefs['CN_nochild'] = CN_nochild;
		this.prefs['CN_open_subitems'] = CN_open_subitems;
		this.prefs['CN_opened'] = CN_opened;
		this.prefs['CN_last'] = CN_last;
		this.prefs['CN_nochild'] = CN_nochild;
		this.prefs['CN_active'] = CN_active;
	}
	
	function setOpenLevel(level)
	{
		this.prefs['open_level'] = level;
	}
	
	function setOpenerBgImages(plusImg, minusImg)
	{
		this.prefs['plus_img'] = plusImg;
		this.prefs['minus_img'] = minusImg;
	}
	/* vypise do stranky CSS skryvajici levely */
	function hideLevelsCSS()
	{
		var x = 0;
		var CSS_list = '';
		var CSS_plusminus = '';
		var CODE = '';
		while(x <= this.prefs['open_level']) {
			CSS_list += '.'+this.prefs['CN_list']+' ';
			if (x < this.prefs['open_level']) {
				CSS_plusminus += '.'+this.prefs['CN_list']+' ';
			}
			x++;
		}
		
		CODE = CSS_list + '{ display : none; } ' + CSS_plusminus + ' .TR-open-subcatgs { background-image : url('+this.prefs['plus_img']+'); } ';
		CODE = '<style type="text/css">' + CODE + '</style>';
		document.write(CODE);
		
		this.prefs['hide_levels_css'] = true;
	}
/*----*/

	/* vraci true, pokud string className obsahuje prislusne jmeno tridy (pokud je jich vice) */
	function containsClass(el, className) {
		if(!el) return false;
		if(!el.className) return false;
		var subNames = el.className.split(' ');
		for(i=0; i<subNames.length; i++) {
			if(subNames[i]==className) return true;
		}
		return false;
	}
	
	/* inicializace */
	function TR_init()
	{
		var i, j;
		var opened_elements = new Array();
		var elements;
		/* prolezeni stromu a registrace udalosti/ostatni akce */
		for (i=0; i<TR_prefs.prefs['tree_elements'].length; i++) {
			elements = document.getElementsByTagName(TR_prefs.prefs['tree_elements'][i]);
			for (j=0; j<elements.length; j++) {
				if (containsClass(elements[j], TR_prefs.prefs['CN_open_subcatgs'])) {
					/* na openery subkategorii (vetsinou obr. s +/-) zaregistruje akce */
					elements[j].onclick = openCloseSubtree;
				}
				if (containsClass(elements[j], TR_prefs.prefs['CN_list'])) {
					/* list elementy se zkontroluji, jestli maji byt zobrazeny, nebo ne */
					checkListDisplay(elements[j]);
				}
				if (containsClass(elements[j], TR_prefs.prefs['CN_opened']) || containsClass(elements[j], TR_prefs.prefs['CN_active'])) {
					/* pokud se najde nejaky otevreny folder  u element typu TR-open-subitems (TR-opened), nebo aktivni folder (TR-active),  zaznamena se */
					opened_elements[opened_elements.length] = elements[j];
				}
			}
		}
		/* zpracovani opened_elements - otevreni vsech vetvi s opened foldery */
		for (i=0; i<opened_elements.length; i++) {
			el = opened_elements[i].parentNode;
			while (!containsClass(el, TR_prefs.prefs['CN_tree'])) {
				if (containsClass(el, TR_prefs.prefs['CN_list'])) {
					checkListDisplay(el, true);
				}
				el = el.parentNode;
			}
		}
	}
	
	function openCloseSubtree(e)
	{
		if (window.event) {
			var OpenEl = window.event.srcElement;
		} else {
			var OpenEl = e.currentTarget;
		}
		var Item = OpenEl.parentNode;
		var List = getNextList(Item);
		if (List) {
			//if (List.style.display=='' || List.style.display=='block') {//zavreni submenu
			if (List.offsetHeight > 0) {//zavreni submenu
				List.style.display = 'none';
				OpenEl.style.backgroundImage = 'url('+TR_prefs.prefs['plus_img']+')';
				
			//} else if (List.style.display=='none') {//otevreni submenu
			} else {//otevreni submenu
				List.style.display = 'block';
				OpenEl.style.backgroundImage = 'url('+TR_prefs.prefs['minus_img']+')';
			}
		}
		return false;
	}
	
	function checkListDisplay(List, open)//open - true/false; muze byt vynechano a pak se to ridi podle nastaveneho levelu
	{
		if (open==null) {
			if (TR_prefs.prefs['hide_levels_css']) return false;//pokud jsou levely skryty pres CSS, nemusim je skryvat skriptem
			
			var level = getListLevel(List);
			if (level>TR_prefs.prefs['open_level']) {
				open = false;
			} else {
				open = true;
			}
		}
		
		if (open) {
			List.style.display = 'block';
		} else {
			List.style.display = 'none';
		}
		var Item = getPreviousItem(List);
		if (Item) {
			var OpenEl = getItemOpenEl(Item);
			if (OpenEl) {
				if (open) {
					OpenEl.style.backgroundImage = 'url('+TR_prefs.prefs['minus_img']+')';
				} else {
					OpenEl.style.backgroundImage = 'url('+TR_prefs.prefs['plus_img']+')';
				}
			}
		}
	}
	
	/* vraci level zadaneho elementu typu TR-listu */
	function getListLevel(List)
	{
		var level = 0;
		var el = List;
		while (!containsClass(el, TR_prefs.prefs['CN_tree']) && el!=document.body) {
			if (containsClass(el, TR_prefs.prefs['CN_list'])) level++;
			el = el.parentNode;
		}
		if (containsClass(el, TR_prefs.prefs['CN_tree'])) level++;
		return level;
	}
	
	/* vraci 1. element typu TR-list mezi nasledujicimi siblingy (nebo null) */
	function getNextList(Item)
	{
		var el = Item.nextSibling;
		while (el!=null) {
			if (el.nodeType==1) {
				if (containsClass(el, TR_prefs.prefs['CN_list'])) {
					return el;
				}
			}
			el = el.nextSibling;
		}
		return null;
	}
	
	/* vraci 1.  element typu TR-item mezi predchozimi siblingy (nebo null) */
	function getPreviousItem(List)
	{
		var el = List.previousSibling;
		while (el!=null) {
			if (el.nodeType==1) {
				if (containsClass(el, TR_prefs.prefs['CN_item'])) {
					return el;
				}
			}
			el = el.previousSibling;
		}
		return null;
	}
	
	/* vraci 1.child element typu TR-item, ktery je typu TR-open-subcatgs (nebo null) */
	function getItemOpenEl(Item)
	{
		var el = Item.firstChild;
		while(el!=null) {
			if (el.nodeType==1) {
				if (containsClass(el, TR_prefs.prefs['CN_open_subcatgs'])) {
					return el;
				}
			}
			el = el.nextSibling;
		}
		return null;
	}