/**
 * UniMenu - JavaScript, zajistujici dynamicke akce s jiz vytvorenym HTML stromovym menu
 *
 * @author Daniel Felix Hrouzek
 * @version 2005-04-28
 */

/**
 * Pole, uchovavajici seznam objektu menu (na strance jich muze byt vic)
 */
UM_list = [];

/*
	pole uchovavajici pozici elementu na strance
*/
	elementsArr = new Array();
	
	/* is onload, priznak urci, zda je stranka nactena	*/
	isOnload = false;
	
/**
 * Trida pro dynamicke akce s HTML menu
 *
 * Vytvoreni je kompletne generovano na strane PHP - objekt prebira vsechny parametry
 */
function UniMenu(id) {
	
	this.evtProcessed = navigator.userAgent.indexOf('Safari') > -1 ? 'safRtnVal' : 'returnValue';

	this.root = null;
	this.id = id;
	this.timeWatch = null;

	this.autoCollapseSiblings = false;
	this.selfParam = true;
	this.globalParam = '';
	this.timeout = 0;
	this.onOver = false;

	this.collapseAll = UM_collapseAll;
	this.expandAll = UM_expandAll;
	this.collapseAllButMe = UM_collapseAllButMe;

	this.expandByID = UM_expandByID;
	this.collapseByID = UM_collapseByID;
	this.switchByID = UM_switchByID;

	this.hideByID = UM_hideByID;
	this.showByID = UM_showByID;

	this.openURL = UM_openURL;
	this.setProperties = UM_setProperties;
	this.setAutoCollapseSiblings = UM_setAutoCollapseSiblings;

	this.addClassLast = UM_addClassLast;
	this.findRoot = UM_findRoot;
	this.findParentLI = UM_findParentLI;

	UM_list[id] = this;
}



/**
 * Inicializacni metoda
 *
 * Najde prislusny prvek podle predaneho id, projde vsechny jeho uzly a upravi
 * jejich styly, pak nastavi eventy
 */
UniMenu.prototype.init = function() { with (this) {
	if (!document.getElementById) return;

	root = document.getElementById(id);

	if (root) {
		addClassLast(root);

		if (onOver) {
			if (root.addEventListener && navigator.vendor != 'Apple Computer, Inc.') {
				root.addEventListener('mouseover', new Function('e', id + '.mouseover(e)'), false);
			}
			else root.onmouseover = new Function('e', id + '.mouseover(e)');

			if (root.addEventListener && navigator.vendor != 'Apple Computer, Inc.') {
				root.addEventListener('mouseout', new Function('e', id + '.mouseout(e)'), false);
			}
			else root.onmouseout = new Function('e', id + '.mouseout(e)');
		}
		else {
			if (root.addEventListener && navigator.vendor != 'Apple Computer, Inc.') {
				root.addEventListener('click', new Function('e', id + '.click(e)'), false);
			}
			else root.onclick = new Function('e', id + '.click(e)');
		}
	}
}}

var chtOldOL = window.onload;
/*
window.onload = function() {
	if (chtOldOL) chtOldOL();
	for (var i in UM_list) UM_list[i].init();
}
*/
function UM_init(id) {
	if (id){
		UM_list[id].init();
	}else{
		for (var i in UM_list) UM_list[i].init();
	}
}



/**
 * Metoda pri onclick eventu
 *
 * Pokud je puvodce eventu vetev, sbali ji nebo rozbali (podle predchoziho stavu)
 */
UniMenu.prototype.click = function(e) { with (this) {
	e = e || window.event;
	element = e.srcElement || e.target;

	switchByID(findParentLI(element).id);
}}



/**
 * Metoda pri onmouseover eventu
 *
 * Pokud je puvodce eventu vetev, pokusi se ji rozbalit
 */
UniMenu.prototype.mouseover = function(e) { with (this) {
	e = e || window.event;
	element = e.srcElement || e.target;
//	hideShowCovered(element);
	if (!element.tagName.match(/^ul/i)) {
		var parentElement = findParentLI(element);
		if (parentElement) {
			if (timeWatch) {
				clearTimeout(timeWatch);
				timeWatch = null;
			}
			
			if (hiding){
				hideShowCovered(parentElement.parentNode);
		
			/* misto hideCoverdAllParentUl 
				by slo volat jen hideShowcovered s parametrem hide
				ale jenom na li mimo v menu level 1 a vyse
			*/
				hideCoverdAllParenUL(parentElement);
			}
			expandByID(parentElement.id);
		}
	}
	
}}



/**
 * Metoda pri onmouseout eventu
 *
 * Pokud je puvodce eventu vetev, nastavi timeout pro jeji sbaleni
 */
UniMenu.prototype.mouseout = function(e) { with (this) {
	e = e || window.event;
	element = e.srcElement || e.target;
	if (!element.tagName.match(/^ul/i)) {
		var parentElement = findParentLI(element);
		if (parentElement){
			if (!(parentElement.parentNode.tagName.match(/^ul/i) && parentElement.parentNode.id == id)) {
				parentElement = findParentLI(findParentLI(element).parentNode);
			}
		}
		if (parentElement) {
			timeWatch = setTimeout(id + ".collapseByID('" + parentElement.id + "');", timeout);
		}
	}
}}



/**
 * Projde vsechny <<li>> potomky zadaneho elementu a poslednimu nastavi class na 'last'
 */
function UM_addClassLast(element) {
	if (element) {
		var kids = element.childNodes;
		var pravda = false;
		for (var i = kids.length - 1; i >= 0; i--) {
			if (kids[i].tagName && kids[i].tagName.match(/^li/i)) {
				if (!pravda) {
					kids[i].className = 'last';
					pravda = true;
				}
				this.addClassLast(kids[i]);
			}
			if (kids[i].tagName && kids[i].tagName.match(/^ul/i)) {
				this.addClassLast(kids[i]);
			}
		}
	}
}



/**
 * Sbali vechny <<ul>> potomky zadaneho elementu
 */
function UM_collapseAll(element) {

	var lists = element.getElementsByTagName('ul');
	var pomNode;
	for (var ul = 0; ul < lists.length; ul++) {
		lists[ul].style.display = 'none';
   
		pomNode = lists[ul].parentNode;
		if (pomNode) {
			pomNode.className = (pomNode.className.match(/last$/i) ? 'plus-last' : 'plus');
		}
	}
}



/**
 * Rozbali vechny <<ul>> potomky zadaneho elementu
 */
function UM_expandAll(element) {
	var lists = element.getElementsByTagName('ul');
	var pomNode;
	for (var ul = 0; ul < lists.length; ul++) {
		lists[ul].style.display = 'block';
		pomNode = lists[ul].parentNode;
		if (pomNode) {
			pomNode.className = (pomNode.className.match(/last$/i) ? 'minus-last' : 'minus');
		}
	}
}



/**
 * Sbali vechny vetve menu krome te, ve ktere se nachazi zadany element
 */
function UM_collapseAllButMe(element) {
	var pomNode = element;
	var x;
	
	while (pomNode.parentNode.tagName.match(/^ul/i) || pomNode.parentNode.tagName.match(/^li/i)) {
		if (pomNode.tagName && pomNode.tagName.match(/^li/i)) {
			x = pomNode.nextSibling;
			while (x) {
				if (x.nodeType == 1) this.collapseAll(x);
				x = x.nextSibling;
				
			}
			
			x = pomNode.previousSibling;
			while (x) {
				if (x.nodeType == 1) this.collapseAll(x);
				x = x.previousSibling;
			
			}
		}
	
		pomNode = pomNode.parentNode;
	}
};



/**
 * Najde nejvyssi uroven vetve, ve ktere se nachazi zadany element
 */
function UM_findRoot(element) {
	var pomNode = element.parentNode;
	var x;

	while (pomNode.parentNode.tagName.match(/^ul/i) || pomNode.parentNode.tagName.match(/^li/i)) {
		x = pomNode;
		pomNode = pomNode.parentNode;
	}

	return x;
}



/**
 * Najde nejblizsiho <<li>> rodice zadaneho prvku
 */
function UM_findParentLI(element) {
	var pomNode = element.parentNode;
	var x;

	if (element.tagName.match(/^li/i) && element.id) {
		x = element;
	}
	else {
		while (pomNode.tagName.match(/^div/i) || (pomNode.tagName.match(/^li/i) && pomNode.id)) {
			x = pomNode;
			pomNode = pomNode.parentNode;
		}
	}

	return x;
}


/**
 * Skryje vetev <<li>> zadaneho id
 */
function UM_hideByID(element_id) {
	
	var elm = document.getElementById(element_id);

	if (elm) {
		if (elm.tagName.match(/^(li)/i)) {
			elm.style.display = 'none';
		}
		else alert('Na uzel se zadanym id (' + element_id +') nelze aplikovat hideByID!');
	}
	else alert('Uzel se zadanym id (' + element_id +') neexistuje!');
}



/**
 * Ukaze vetev <<li>> zadaneho id
 */
function UM_showByID(element_id) {
	var elm = document.getElementById(element_id);
	if (elm) {
		if (elm.tagName.match(/^(li)/i)) {
			elm.style.display = 'block';
		}
		else alert('Na uzel se zadanym id (' + element_id +') nelze aplikovat showByID!');
	}
	else alert('Uzel se zadanym id (' + element_id +') neexistuje!');
}



/**
 * Rozbali vetev <<li>> zadaneho id
 */
function UM_expandByID(element_id) {
	var elm = document.getElementById(element_id);
	
	if (elm) {
	
		while (elm) {
			if (elm.tagName.match(/^(input|ul)/i)) break;
	
			if (elm.tagName.match(/^(span|div)/i)) {
				var elm_o = elm.parentNode;
			}
			else {
				var elm_o = elm;
			}
	
			if (this.autoCollapseSiblings) this.collapseAllButMe(elm);

			var uly = elm_o.getElementsByTagName('ul');
			
			if (uly.length > 0) {
				var targ = uly[0];
				if (targ.style && targ.style.display != 'block') {
					if (targ.filters && targ.filters[0]){
						targ.filters[0].apply();
						targ.style.visibility = 'visible';
						targ.style.display = 'block';
						targ.filters[0].play();
					}else{
						targ.style.display = 'block';
					}
					elm_o.className = elm_o.className.replace('minus', 'plus');
				}
				
				// volat funkci, ktera projde parenty 
			if (hiding){
				hideShowCovered(targ,1);
			}	
			}
			
			
			
			break;
		
			elm = elm.parentNode;
		}
	}
	else alert('Uzel se zadanym id (' + my_id +') neexistuje!');
}




/**
 * Sbali vetev <<li>> zadaneho id
 */
function UM_collapseByID(element_id) {
	var elm = document.getElementById(element_id);
	
	if (elm) {
		while (elm) {
	/*		if (elm.tagName.match(/^(input|ul)/i)) break; */

			if (elm.tagName.match(/^(span|div)/i)) {
				var elm_o = elm.parentNode;
			}
			else {
				var elm_o = elm;
			}

			var uly = elm_o.getElementsByTagName('ul');
			
					
			if (uly.length > 0) {
				var targ = uly[0];
				if (targ.style) {
					targ.style.display = 'none';
					elm_o.className = elm_o.className.replace('plus', 'minus');
/*					if (this.autoCollapseSiblings && col) this.collapseAllButMe(elm); */
				}
				if (hiding){
				hideShowCovered(targ);
				}
			}
			
			break;

			elm = elm.parentNode;
		}
	}
	else alert('Uzel se zadanym id (' + my_id +') neexistuje!');
}



/**
 * Sbali nebo rozbali vetev <<li>> zadaneho id (podle predchoziho stavu)
 */
function UM_switchByID(element_id) {
	var elm = document.getElementById(element_id);

	while (elm) {
/*		if (elm.tagName.match(/^(input|ul)/i)) break; */
  
		if (elm.tagName.match(/^(span|div)/i)) {
			var elm_o = elm.parentNode;
		}
		else {
			var elm_o = elm;
		}

		var uly = elm_o.getElementsByTagName('ul');
		if (uly.length > 0) {
			var targ = uly[0];
			if (targ.style) {
				var col = (targ.style.display == 'none');
				targ.style.display = col ? 'block' : 'none';
				elm_o.className = elm_o.className.replace(col ? 'plus' : 'minus', col ? 'minus' : 'plus');
				if (this.autoCollapseSiblings && col) this.collapseAllButMe(elm);
			}
		}
		break;
  
		elm = elm.parentNode;
	}
}



/**
 * Otevre zadane URL podle parametru target
 */
function UM_openURL(adresa, target) {
	var parametr;

	if (this.globalParam != '')
		parametr = this.globalParam;

	if (adresa.match(/\?/) && parametr != '') {
		adresa = adresa + '&' + parametr;
	}
	else if (!adresa.match(/\?/) && parametr != '') {
		adresa = adresa + '?' + parametr;
	}

	if (target == '_blank')
		window.open(adresa);
	else if (target == '_self')
		window.location = adresa;
	else if (target == '_top')
		top.location = adresa;
	else if (target == 'parent')
		parent.location = adresa;
	else
		eval('parent'.target+'.location='+adresa);
}



/**
 * Zmeni paranetry prvku se zadanym id
 */
function UM_setProperties(element_id, link, target, title, className) {
	var elm = document.getElementById(element_id);

	if (elm && elm.tagName && elm.tagName.match(/^li/i)) {
		var linky = elm.childNodes;
		for (var i = 0; i < linky.length; i++) {
			if (linky[i].tagName && linky[i].tagName.match(/^a/i)) {
				if (link != undefined)
					linky[i].href = link;
				if (target != undefined)
					linky[i].target = target;
				if (title != undefined) {
					linky[i].firstChild.data = title;
				}
				if (className != undefined)
					linky[i].className = className;

				break;
			}
		}
	}
	else alert('Chyba: metoda setProperties nedostala jako parametr id tagu <li>!');
}



function UM_setAutoCollapseSiblings(param) {
	this.autoCollapseSiblings = param;
}

/*
 *	funkce schova vsechny elementy, ktere se nachazi pod elementem el
 *	nebo pod nekterym z jeho rodicu
*/
function hideCoverdAllParenUL(el){
	hide = true;
	parentNode = el.parentNode;
	while(parentNode.tagName.match(/^ul/i) || parentNode.tagName.match(/^li/i)){
		if (hiding && parentNode.tagName.match(/^ul/i)){
			hideShowCovered(parentNode,hide);
		}
		parentNode = parentNode.parentNode;
	}
}

/*
	vrati hodnotu visibility pro dany objekt
*/
function getVisib(obj){
	var value = obj.style.visibility;
	if (!value) {
		if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C
		
				value = document.defaultView.
					getComputedStyle(obj, "").getPropertyValue("visibility");
			
		} else if (obj.currentStyle) { // IE
			value = obj.currentStyle.visibility;
		} else
			value = '';
	}
	return value;
};
/*
	vrati hodnotu position (relativa, absolute, static..)
*/
function getPositionStatus(obj){
	var value = obj.style.position;
	if (!value) {
		if (document.defaultView && typeof (document.defaultView.getComputedStyle) == "function") { // Gecko, W3C
		
				value = document.defaultView.
					getComputedStyle(obj, "").getPropertyValue("position");
			
		} else if (obj.currentStyle) { // IE
			value = obj.currentStyle.position;
		} else
			value = '';
	}
	return value;
};

/*
 *	vrati pozici elementu
 */
function getAbsolutePos(el) {
	
	var SL = 0, ST = 0;
	var is_div = /^div$/i.test(el.tagName);
	if (is_div && el.scrollLeft)
		SL = el.scrollLeft;
	if (is_div && el.scrollTop)
		ST = el.scrollTop;
	var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
	if (el.offsetParent) {
		var tmp = this.getAbsolutePos(el.offsetParent);
		r.x += tmp.x;
		r.y += tmp.y;
	}
	return r;
};

/*
	nastaveni visibility
	el - element, kvuli kteremu se schovavaji cc elementy
	cc - element pro ktery se nastavi visibility
	hide - pokud je definovano, nebudou se zobrazovat elementy mimo cc element
	E - pozice elementu el
*/
function setVisibility(el, EX1, EX2, EY1, EY2, cc, hide) {
	

	if (caching && isOnload){
		
	var CX1 = elementsArr[cc.id]['CX1'];
	var CX2 = elementsArr[cc.id]['CX2'];
	var CY1 = elementsArr[cc.id]['CY1'];
	var CY2 = elementsArr[cc.id]['CY2'];
		
	}else{
		p = getAbsolutePos(cc);	
		var CX1 = p.x;
		var CX2 = cc.offsetWidth + CX1;
		var CY1 = p.y;
		var CY2 = cc.offsetHeight + CY1;
	}
	
	var is_span = /^span$/i.test(cc.tagName);
	var is_div = /^div$/i.test(cc.tagName);
	var is_a = /^a$/i.test(cc.tagName);
	if (is_span || is_div || is_a){
		if (el.style.visibility == 'hidden' || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
			if(hide){
			}else{	
				if (!cc.__msh_save_position) {
					cc.__msh_save_position = getPositionStatus(cc);
				}				
				cc.style.position = cc.__msh_save_position;
			}
		} else {
			if (!cc.__msh_save_position) {
				cc.__msh_save_position = getPositionStatus(cc);
				}
			cc.style.position = "static";
		}
	}else{		
		if (el.style.visibility == 'hidden' || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)) {
			if(hide){
			}else{	
				if (!cc.__msh_save_visibility) {
					cc.__msh_save_visibility = getVisib(cc);
				}				
				cc.style.visibility = cc.__msh_save_visibility;
			}
		} else {
			if (!cc.__msh_save_visibility) {
				cc.__msh_save_visibility = getVisib(cc);
				}
			cc.style.visibility = "hidden";
		}
	}
}

/*
	schova/zobrazi objekty, ktere jsou pod elementem el
*/	
function hideShowCovered(el,hide){
	
	p = getAbsolutePos(el);
	
	var EX1 = p.x;
	var EX2 = el.offsetWidth + EX1;
	var EY1 = p.y;
	var EY2 = el.offsetHeight + EY1;
	
//	if ((navigator.appName).indexOf("Microsoft")!=-1) {
//		for (var k = namesArr.length; k > 0; ) {
//			var ar = document.getElementsByName(names[--k]);	
//			var cc = null;	
//			for (var i = ar.length; i > 0;) {
//				cc = ar[--i];
//				setVisibility(el, EX1, EX2, EY1, EY2, cc, hide);			
//			}				
//		}

		for (var k = tagsArr.length; k > 0; ) {
			var ar = document.getElementsByTagName(tagsArr[--k]);		
			var cc = null;

			for (var i = ar.length; i > 0;) {
				cc = ar[--i];
				setVisibility(el, EX1, EX2, EY1, EY2, cc, hide);			
			}			
		}
		
		for (var k = idsArr.length; k > 0; ) {		
			if ( cc = document.getElementById(idsArr[--k])){
			
				setVisibility(el, EX1, EX2, EY1, EY2, cc, hide);				
			}	
		}
//	}			
}	



window.onload = function saveElmPosition() {
	isOnload = true;	

	if (caching){
		
		/* ulozi do pole vsechny elementy podle tagu z pole tagsArray	*/
		for (var k = tagsArr.length; k > 0;){
			var tagArr = document.getElementsByTagName(tagsArr[--k]);
			for (var i = tagArr.length; i >0;){
				var	tag = tagArr[--i];
				if (tag.id){
					p = getAbsolutePos(tag);
					elementsArr[tag.id] = new Array();
					elementsArr[tag.id]['CX1'] = p.x;
					elementsArr[tag.id]['CX2'] = tag.ofssetWidth + p.x;
					elementsArr[tag.id]['CY1'] = p.y;
					elementsArr[tag.id]['CY2'] = tag.offsetWidth + p.y; 				
				}
			}		
		}
		
		/* ulozi do pole vsechny elementy podle id z pole idsArray	*/
		for (var k = idsArr.length; k > 0;){
			if( el = document.getElementById(idsArr[--k])){
			
				p = getAbsolutePos(el);
				elementsArr[el.id] = new Array();
				elementsArr[el.id]['CX1'] = p.x;
				elementsArr[el.id]['CX2'] = el.ofssetWidth + p.x;
				elementsArr[el.id]['CY1'] = p.y;
				elementsArr[el.id]['CY2'] = el.offsetWidth + p.y; 				
				
			}
		}			
	}
}	
	

	
//}