//	vrati element..ak uz je, tak ten, inak cez gebi()
function getElement(e) {
	
	return (e.nodeType == 1) ? e : gebi(e);
}

//  ak je iba 1 parameter, tak sa viaze na cely 'dokument' inak na ine :) [ i.e <form> ]
function gebi(e,parent) {

	if(typeof(e)!='string') return e;
  	if (parent == null) {
    	if(document.getElementById) e=document.getElementById(e);
    	else if(document.all) e=document.all[e];
    	else e=null;
  	} else {
	    if(document.getElementById) e=parent.getElementById(e);
	    else e=null;
  	}
    
 	return e;
}

//	vrati true, ak je hodnota prazdny string
function empty(e) {
	
	var blankRE=/^\s*$/;
	if (blankRE.test(e)) {
		return true;
	} else {
		return false;
	}
}

/*	ukaze alebo skryje element	*/
function showHide(id,imgName) {

	if (!gebi)	return;
	
	var i = null;				//	img 
	var e = gebi(id);			//	element
	
	if (imgName) {
	   i = document.images[imgName];
	}
	
	if(e.className == "visible") {
		e.className = "invisible";
		if (i) {
		  	i.src="pics/" + imgName + "_down.png";	
		}
	} else {					
		e.className = "visible";
		if (i) {
		  	i.src="pics/" + imgName + "_up.png";
		}
	}
}

/*	ukaze element	*/
//	param bool useVisib .. ci sa pouzije trieda na visibility alebo nie [display]
function show(e, useVisib) {
	
	e = getElement(e)
	
	e.className = useVisib? "shown" : "visible";
	
	return true;
}

/*	skryje element	*/
//	param bool useVisib .. ci sa pouzije trieda na visibility alebo nie [display]
function hide(e, useVisib) {
	
	e = getElement(e)
	
	e.className = useVisib? "hidden" : "invisible";
	
	return true;
}


function isVisible(e) {
	
	e = getElement(e)
	
	return e.className == "visible" ? true : false;
}

function isInvisible(e) {
	
	e = getElement(e)
	
	return e.className == "invisible" ? true : false;
}

function isShown(e) {
	
	e = getElement(e)
	
	return e.className == "shown" ? true : false;
}

function isHidden(e) {
	
	e = getElement(e)
	
	return e.className == "hidden" ? true : false;
}


// dorobit...vracia object..doosetrovat specialne pre "array"
function is_array(e) {
	
	return typeof e == "object" ? true : false;
}


//	nastavi innerHTML
function setInner(e, str) {
	
	if (gebi(e)) {
		gebi(e).innerHTML = str;
	}
}

//	nastavi value
function setVal(e, str) {
	
	if (gebi(e)) {
		gebi(e).value = str;
	}
}

//	vrati value aj zo selectu
//	bool text .. ci sa ma zo selectu brat text def. Value
function getVal(e, text) {
	
	e = gebi(e)
	if (e) {
//		ak je to select
		if (e.type == "select-one" || e.type == "select-multiple") {
			return 	text ? e.options[e.selectedIndex].text : e.options[e.selectedIndex].value;

//		inak vrati obyc value
		} else {
			return gebi(e).value;
		}
	}
	
	return null;
}


function setClassName(e, cName) {
	
	if (gebi(e)) {
		gebi(e).className = cName;
	}
}

// zo stringu @param s, kt. obsahuje data oddelene @param sep, spravi pole a vrati ho
function explode(s, sep) {
	
	var ret = new Array();
	var pos = null;		//	pozicia separatora
	var i = 0;
	
	while((pos = s.indexOf(sep)) != -1) {
		ret[i++] = s.substring(0, pos);
		s = s.substring(pos+1);
//		alert(ret[i-1])
	}
	
	// posledny prvok pridam..tam uz nie je oddelovac za nim
	ret[i] = s;
//	alert(typeof(ret))
	return ret;
}


//	nastavi onclick
//	cez addEvent to zatial nejde...
function setOnclick(e, str) {
	
	if (gebi(e)) {
//		addEvent(gebi(e), "click", function() {editLabel});
		gebi(e).onclick = function() {eval(str)};
//		alert(gebi(e).onclick)
	}
}

//	odstrani onclick
//	cez addEvent to zatial nejde...
function unsetOnclick(e) {
	
	if (gebi(e)) {
//		addEvent(gebi(e), "click", function() {editLabel});
		gebi(e).onclick = null;
//		alert(gebi(e).onclick)
	}
}


function increment(e) {
	
	if (gebi(e)) {
		var val = gebi(e).value;
		var parseVal = parseInt(gebi(e).value);
		if (!isNaN(parseVal)) {
			val = parseVal++;
		}
	}
}

function decrement(e) {
	
	if (gebi(e)) {
		var val = gebi(e).value;
		var parseVal = parseInt(gebi(e).value);
		if (!isNaN(parseVal)) {
			val = parseVal--;
		}
	}
}

// danemu elementu strieda atribut 'class'
function toggleClassNames(e, cName1, cName2) {
	
	if (!gebi(e)) {
		return false;
	}
	
	e = gebi(e);
	
	e.className = (e.className==cName1) ? cName2 : cName1;
	
	return true;
}

//	fcia sluzi na menenie obsahu elementu e ... pri fcii showHide hlavne ... 
function changeTogglerInner(e1, val1, val2) {
	
	var e = (e1.nodeType == 1) ? e1 : gebi(e1);
	if (e) {
		if (e.innerHTML == val1) {
			e.innerHTML = val2;
		} else {
			e.innerHTML = val1;
		}
	}
	
	return true;
}


/**
 *  fcia prejde cely formular a vrati jeho hodnoty okrem 'disabled' poloziek
 *  */ 
function getPostMsg(f) {
	
	if (!gebi(f)) {
		return false;
	}
	
  	var post_msg = ""
 	var elems = gebi(f).elements;
 	var e = null;
 	var incToMsg = false;	//	priznak, ze sa ma element pripojit k vysledku
  	var max = elems.length;
   	var val = null;			//	tu sa odklada e.value alebo e.text
   	
  	for (var i=0; i<max; i++) {
  		e = elems[i]
  		incToMsg = false;
  		
      	if (e.disabled == false) {
      		switch (e.type) {
      			case "checkbox":
	      			if (e.checked) {
	      				incToMsg = true;
	      			}
      				break;

      			case "text":
				case "textarea":
        			if (!empty(e.value)) {     
	      				incToMsg = true;
        			}
        			break;
        			
//        		defaultne pre selecty apod aby sa brali..	
        		default: incToMsg = true;
      		}
      		
      		if (incToMsg) {

//      		ak ma class="txt_val_to_ajax", tak sa zbera text, nie value
//				realne iba pri selectoch
				if (e.className == 'txt_val_to_ajax') {
					val = e.options[e.selectedIndex].text;
				} else {
					val = e.value
				}

//      		ak nema prvok 'name', tak skusi 'id'
		      	if (!e.name) {
			        post_msg += e.id + '=' + val;
		      	} else {
			        post_msg += e.name + '=' + val;
		      	}
		      	
		      	post_msg += '&';
		    }
      	}
  	}
  	
//  	odstranim posledny '&'
	post_msg = stripLastChars(post_msg, '&');
	
 	return post_msg
}


/**
   	* odstrani posledne znaky $s2, ak su uplne na konci, inak povodny string $s1
   	*
   	* @param str $s			haystack
   	* @param str $s2			needle
   	* @return str
   	*/
function stripLastChars(s1, s2) {
	
	var pos = null;
	if ((pos = s1.lastIndexOf(s2)) == (s1.length - s2.length)) {
     		s1 = s1.substr(0, pos);
  	}

  	return s1;
}

// vrati element, ktory je vyssi
function getHigher(e1, e2) {
	
	var e1a = gebi(e1);
	var e2a = gebi(e2);
	var e1H = parseInt(e1a.offsetHeight);
	var e2H = parseInt(e2a.offsetHeight);
	
	return e1H > e2H ? e1 : e2;
}

// prisposobi vysku jedneho elementu e2 druhemu e1
// pouzivane pri obtekani divov s pozadim
function adjustElementHeight(e1, e2, onlyIfLess) {
//return
	e1 = gebi(e1);
	e2 = gebi(e2);
//	vynulujem vysku praveho stlpca, ktora je nastavovana explicitne viackrat, aby sa nebrala do offsetHeight
//	pri porovnavani vysok	..	dobre by to neobalovalo
	e2.style.height = "";

	var e1H = parseInt(e1.offsetHeight);
	var e2H = parseInt(e2.offsetHeight);
//	pre potreby wm4y, bude cnt_l asi vzdy vacsi ako cnt_r
	if (onlyIfLess) {
		if (e1H > e2H)
			e2.style.height = e1H + 'px';
//			else klauzula pre tento pripad nie je treba, lebo je nastavovana na zaciatku fcie
//		else {
//			e2.style.height = "";
////			skusim nastavit opacne..e1 podla e2
////			e1.style.height = e2H + 'px';
//		}
	} else {
		e2.style.height = e1H + 'px';
	}
	
//	alert(e1.id + ": " +e1H)
//	alert(e1.id + ": real " +e1.style.height)
//	alert(e2.id + ": " +e2H)
//	alert(e2.id + ": real " +e2.style.height)
}

// s = child
// d = parent
function isChild(s,d) {
	while(s) {
		if (s==d) 
			return true;
		s=s.parentNode;
	}
	return false;
}

/*
//treba pridavat 'px' 
// vrati poziciu objektu zlava
function Left(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
		
	return curleft;
}


// vrati poziciu objektu zhora
function Top(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	
	return curtop;
}
*/

function getInputsByType(f, tp) {
	
	f = gebi(f);
	var ret = new Array();
	var inputs = f.getElementsByTagName('input');
    var max = inputs.length;
    for (var i=0; i<max; i++) {
    	if (inputs[i].type==tp) {
    		ret.push(inputs[i])
          }
    }

    return ret
}

// 	vracia radio.value | null podla toho ci je radio input checknuty
//	@param f 	je id rodicovskeho formularu 
//	@param name je name radio inputu
function getCheckedRadio(f, name) {
	
	var radios = getInputsByType(f, 'radio')
    var max = radios.length;
    for (var i=0; i<max; i++) {
    	if (radios[i].name==name && radios[i].checked == true) {
    		return radios[i].value;
          }
    }

    return null;
}


						/*		DOM FUNCTIONS		*/

//  vrati rodicovsky prvok s menom 'pTagName'
function getParent(el, pTagName) {
	if (el == null) return null;
	else if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())	// Gecko bug, supposed to be uppercase
		return el;
	else
		return getParent(el.parentNode, pTagName);
}


/**
 *  returns element
 *  @param node je hocijaky node
 *  @param which NEXT|PREV pre siblings, CHILD pre firstChild
 *  
 **/    
function get_elem(node, which)
{
  var temp = node;
  switch(which)
  {
    case 'next':  while (temp.nextSibling) {
                    	if (temp.nextSibling.nodeType != 1) {
                      		temp = temp.nextSibling;
                    	} else {
                      		return temp.nextSibling;
                    	}
                  }
                  return null; break;

    case 'prev':  while (temp.previousSibling) {
                    	if (temp.previousSibling.nodeType != 1) {
                      		temp = temp.previousSibling;
                    	} else {
                      		return temp.previousSibling;
                    	}
                  }
                  return null; break;
                  
    case 'child': var i = 0;                    //  pri tabulkach to vrati HTMLTableSectionElement object ..preto treba zobrat firstChild to get <tr>
                  var child = null;
                  while (false != (child = temp.childNodes[i])) {
                    	if (child.nodeType == 1) {
		                	return child.parentNode.nodeName.toLowerCase() == 'table' ? child.firstChild : child;
                    	}
                    	i++;
                  }
                  return null; break;
    
    default: return null; break;
  }
//  kvoli warningu to tu je
  return null;
}

