document.onclick = combo_CatchClick;

function combo_CatchClick(e)
{
	if (!e) e = window.event; //Firefox vola funkci s e, IE a Opera pres window.event
	var oSrcElement = (e.target || e.srcElement);
	var oSub = combo_getObj('combo_sub',oSrcElement);
	combo_HideAllCombos(oSub);
}

function combo_CatchKeyPress(e,oCurr)
{
    if(!oCurr) return false;
    key = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;
    key = combo_toInt(key);
    //A-z a Enter
    if(key==13 || key==38 || key==40 || key>=48)
    {
    	//Reference na combo_sub
    	var oSub = combo_getObj('combo_sub',oCurr);
        if(oSub.style.display!='block') return false;

        //Vybere prvek enterem a zavre combo
        switch(key)
        {
            case 13:
            {
                var oSel = combo_getObj('combo_sel',oSub.childNodes[0]);
                var oDivs = oSub.getElementsByTagName('div');
                var oNew = oDivs[combo_toInt(oSel.indexover)];
                combo_ItemSelect(oNew);
                window.returnValue = false;
                return false;
            }
            case 38:
            case 40:
            {
                var oSel = combo_getObj('combo_sel',oSub.childNodes[0]);
                var oDivs = oSub.getElementsByTagName('div');
                var oNew = oDivs[combo_toInt(oSel.indexover)];
                if(key==38)
                    oNew = oDivs[combo_toInt(oNew.indexprev)];
                else
                    oNew = oDivs[combo_toInt(oNew.indexnext)];
                combo_ItemOver(oNew);
                combo_SetScroll(oNew,oSub);
                //combo_ItemSelect(oNew);
                return false;
            }
            default:
            {
                try
                {
                    var pressChar = String.fromCharCode(key);
                    pressChar = pressChar.toLowerCase();
                    var oDivs = oSub.getElementsByTagName('div');
                    for(i=0;i<oDivs.length;i++)
                    {
                        var oItem = oDivs[i];
                        //Ve firefoxu a opere se nejdriv na hodnotu index dostanu pres combo_getAttribute
                        //a po 1. nasetovanim primo jako vlastnost
                        if(combo_toInt(oItem.index)>=0)
                        {
                            if(oItem.innerHTML!='')
                            {
                                var innerHTML = oItem.innerHTML.toLowerCase();
                                var firstChar = combo_CharsFromLeft(innerHTML,1);
                                if(firstChar==pressChar)
                                {
                                    combo_ItemOver(oItem);
                                    combo_SetScroll(oItem,oSub);
                                    return true;
                                }
                            }
                        }
                    }
                }
                catch(e){alert(e);return true}
                break;
            }
        }
    }
}

//Zobrazi nebo skryje combo
function combo_BtnAction(oBtn,currW,maxH)
{

	//Reference na combo_sub a dalsi objekty
	var oSub = combo_getObj('combo_sub',oBtn);
    //Hodnoty
	var oVal = combo_getObj('combo_val',oBtn);
    var oHid = combo_getObj('combo_hid',oBtn);
    var oSel = combo_getObj('combo_sel',oBtn);

	//combo_HideAllCombos(oSub); //Vola se pres combo_CatchClick

	//Skryje nebo zviditelni
	oSub.style.display=(oSub.style.display=='block')?'none':'block';

	if(oSub.style.display=='block')
	{
		oSub.style.zIndex=combo_toInt(oBtn.style.zIndex)+1;
		oSub.style.width = combo_getSize('sub_width',currW) + 'px';

        //Kolekce vsech prvku pro vyber comba
        var oDivs = oSub.getElementsByTagName('div');
        var divCount = oDivs.length;

		//Sirka vsech prvku (nastavuje jen jednou pri prvnim kliknutim na buton)
		if(oSub.style.height=='')
		{
			var isScrool = false;
			var curH = oSub.clientHeight;

            //Upravi maxH na pocet celych viditelnych prvku
            var itemsCount = 0;
			if(curH>maxH)
			{
    			for(i=0;i<divCount;i++)
                {
                    var iHeight = oDivs[i].offsetHeight;
                    maxH = parseInt(maxH/iHeight,0) * iHeight;
                    break;
                }
				oSub.style.height=maxH + 'px';
				isScrool = true;
			}

            //projde vsechny prvky a oznaci jim jejich index a nastavi aktualni index
            for(i=0;i<divCount;i++)
            {
                var oItem = oDivs[i];
                //nastavi skutecny index v divu oSub do vlastnosti index
                oItem.index = i;
                oItem.indexprev = (i==0)?i:i-1;
                oItem.indexnext = (i==divCount-1)?i:i+1;
                //Ulozi oznaceny zaznam
                if(oDivs[i].id==oHid.value)
                {
                    oSel.value=i;
                    oSel.indexover=i;
                }
           }
        }
		//Oznaci prvek podle indexu
        var i = combo_toInt(oSel.value);
        combo_ItemOver(oDivs[i]);

        //Nascroluje aby byl videt
        combo_SetScroll(oDivs[i],oSub);
    }
}

//Nastavi scrollBar do odpovidajici pozice (Nascroluje aby byl videt prvek)
function combo_SetScroll(oItem,oSub)
{
        //Nascroluje aby byl videt
        var offsetTop = combo_toInt(oItem.offsetTop);
        while(offsetTop>=0)
        {
                try
                {
                    //V IE je treba pohnout scrollbarem jinak napoprve nereaguje
                    if(combo_getNavigator()=='ie') oSub.doScroll();
                    oSub.scrollTop=offsetTop
                    firstItem = null;
                    break;
                }
                catch(e){offsetTop--;}
        }
        return;
}

//Skryje vsechny comba na strance, podle oCurrSub (pokud kliknu na buton comba) provede prislusnou operaci s timto combem
function combo_HideAllCombos(oCurrSub)
{
	var allCombos = document.getElementsByName('combo_sub');
	for(i=0;i<allCombos.length;i++)
	{
		if(oCurrSub!=allCombos[i])
		{
			allCombos[i].style.display='none';
		}
	}
}

//Vybere prvek a skryje combo
function combo_ItemSelect(oItem)
{
	var oVis = combo_getObj('combo_vis',oItem);
	var oHid = combo_getObj('combo_hid',oItem);
	var oSel = combo_getObj('combo_sel',oItem);

	oVis.value = oItem.innerHTML;       //Textova hodnota
	oHid.value = oItem.id;              //Cislena hodnota pro request_form
	oSel.value = oItem.index;           //index childu po vybrani hodnoty
    oSel.indexover = oItem.index;       //Aktualni itemOver jako informace pro oznacovani a naopak
    
	//Provede eval
	var evalCmd = combo_getAttribute(oVis,'evalcmd');
    	if(evalCmd!='')
    	{
        	var thisValue = oHid.value;
        	evalCmd = evalCmd.replace('#this.value#',thisValue);
        	eval(evalCmd);
    	}

	//Skryje vyber hodnot v combu
	if(isObj(oItem.parentNode)) oItem.parentNode.style.display='none';
}
function combo_ItemOver(oItem)
{
    //Reference na combo_sub
	var oSub = combo_getObj('combo_sub',oItem);
    //Reference na combo_sel
    var oSel = combo_getObj('combo_sel',oItem);
    //Index oznaceneho zaznamu (hlavne prvni prehud mysi z tlacitka na seznam)
    var i = combo_toInt(oSel.indexover);
    //Stary vyresetuje
    var oDivs = oSub.getElementsByTagName('div');
    oDivs[i].className='comboitem';
    //Novy nastavi
	oItem.className='comboitemo';
    //Ulozi zmenu
    oSel.indexover = oItem.index;
}
function combo_ItemOut(oItem)
{
	oItem.className='comboitem';
}

//Vrati pozadovany prvek
function combo_getObj(name,oCurr)
{
	switch(name)
	{
		//Top div
		case 'combo_main':
		{
			while(true)
			{
				try
				{
					oCurr = oCurr.parentNode;
					if(oCurr.id==name) return oCurr;
				}
				catch(e){return null;}

			}
			break;
		}
		case 'combo_val':
		case 'combo_sub':
		{
			var oTop = combo_getObj('combo_main',oCurr);
			if(oTop==null) return null;
			for(i=0;i<oTop.getElementsByTagName('div').length;i++)
			{
				if(oTop.childNodes[i].id==name) return oTop.childNodes[i];
			}
			break;
		}
		case 'combo_vis':
		case 'combo_hid':
		case 'combo_sel':
		{
			var oVal = combo_getObj('combo_val',oCurr);
			for(i=0;i<oVal.childNodes.length;i++)
			{
				if(oVal.childNodes[i].id==name) return oVal.childNodes[i];
			}
			break;
		}
	}
	return null;
}

//Vrati jednotlive hodnoty podle modu a browseru
function combo_getSize(mode,value,isScrool)
{
	switch(mode)
	{
		case 'sub_top':
		{
			switch(combo_getNavigator())
			{
				case 'firefox': return 9;
				case 'netscape': return 17;
				case 'opera': return 9;
				default: return 2;
			}
			break;
		}
		case 'sub_width':
		{
			value = combo_toInt(value);
			switch(combo_getNavigator())
			{
				case 'firefox': return value - 3;
				case 'netscape': return value - 3;
				case 'opera': return value - 0;
				default: return value - 0;
			}
			break;
		}
	}
	return 0;
}

//Vrati kod browseru
function combo_getNavigator()
{
	var browser = navigator.userAgent.toLowerCase();
	if(browser.indexOf('opera')>=0) return 'opera';
	if(browser.indexOf('firefox')>=0) return 'firefox';
	if(browser.indexOf('netscape')>=0) return 'netscape';
	return 'ie';
}
//Konverze na cislo
function combo_toInt(strValue)
{
    if(!strValue) return 0;
	strValue = strValue.toString();
	if(strValue=='') strValue='0';
	var i = 0;
	try
	{
		i = parseInt(strValue);
	}catch(e){}
	return i;
}
//Vrati hodnotu atributu
function combo_getAttribute(o,name)
{
    try
    {
      var oRet = o.getAttribute(name);
      return (oRet)?oRet:'';
	}
	catch(e){return '';}
}
//Trimuje string
function combo_Trim(mStr,tmpApp){
  //Nebezpecne znaky
	mStr = mStr.replace(/<[^<]*>/g,'');
 	mStr = mStr.replace(/<!--/g,'');
	mStr = mStr.replace(/-->/g,'');
	//Zachova apostrof
	if(!isObj(tmpApp)) mStr = mStr.replace(/'/g,'');
	//Pouze trim
	mStr = mStr.replace(/^\mStr*/,'').replace(/\s*$/, '');
	return mStr;
}
//Vrati orezany podretezec zleva podle zadane delky len
function combo_CharsFromLeft(mStr,len)
{
    var sRes = '';
    var i=0;
    while(combo_toInt(sRes.length) < len)
    {
        try
        {
            sRes+=combo_Trim(mStr.substring(i,1));
        }
        catch(e){break;}
        i++;
    }
    return sRes;
}

