/// <summary>urceni typu prohlizece. prevzato z ??? </summary>

 IE= null;
 /// <summary>ma-li hodnotu true, jedna se o InternetExporer</summary>

 NS= null;
/// <summary>ma-li hodnotu true: Mozzila</summary>

 ua = navigator.appName.toLowerCase();

 if(ua.indexOf('explorer')>-1 && document.getElementById && document.childNodes) {IE=true;}
 if(ua.indexOf('netscape')>-1 && document.getElementById && document.childNodes) {NS=true;}

 
 function test_prohlizec()
 {

 if(!IE && !NS) 
  {
   self.location = "javascript: alert('Chyba v dokumentu "+self.location+" .Prohlizec nepodporuje metody standardu W3C DOM a neni mozno dokument spravne zobrazit.')";
  }
 
 }

 function test_metoda(name)
 {
   eval("what = "+name);
   if(!what) {self.location = "javascript: alert('Chyba v dokumentu "+self.location+" .Prohlizec nepodporuje metodu "+name+" a neni mozno dokument spravne zobrazit.')";}
 }  

  


// JScript File bubliny.js
/// <author> vkvkvkvk </author>
/// <summary>Vytvori a zobrazi bublinu napovedy tez jejich skryti</summary>
/// <remarks>
///  Vsechny navenek prezentovane promenne a funkce zacinaji "bub", aby nedochazelo ke kolizi nazvu
///  Pro spravnou funkci musi byt k html strance pripojen soubor sniffer.js
/// </remarks>
/// <reference path="sniffer.js">

//=====================================================================
//globalni promenne (mozno nastavovat i programove z vnejsku skriptu)

var bubSmerBubliny = ["DP","DS","DL","PD","PS","PH","HL","HS","HP","LD","LS","LH"];
//                      0    1    2    3    4    5    6    7    8    9   10   11
/// <summary>Seznam smeru, kterymi muze byt bublina orientova</summary>
/// <remarks>
///    podle tohoto hledam indexy do nasledujicich vektoru
  ///                                           "DP" dolu doprava
  ///                                           "DS" dolu na stred
  ///                                           "DL" dolu doleva
  ///                                           "PD" napravo dolu
  ///                                           "PS" napravo na stred
  ///                                           "PH" napravo nahoru
  ///                                           "HL" nahoru vlevo
  ///                                           "HS" nahoru na st5ed
  ///                                           "HP" nahoru  napravo
  ///                                           "LD" vlevo dolu
  ///                                           "LS" vlevo na stred
  ///                                           "LH" vlevo nahoru
  ///                                           ostatni hodnoty jsou ignorovany
/// </remarks>

var bubSipky = ["images/bub/sipkaSZ.gif","images/bub/sipkaSS.gif","images/bub/sipkaSV.gif",
                "images/bub/sipkaZS.gif","images/bub/sipkaZZ.gif","images/bub/sipkaZJ.gif",
                "images/bub/sipkaJV.gif","images/bub/sipkaJS.gif","images/bub/sipkaJZ.gif",
                "images/bub/sipkaVS.gif","images/bub/sipkaVZ.gif","images/bub/sipkaVJ.gif",];
/// <summary>Seznam obrazku sipek ktere mohou byt pouzity</summary>
/// <remarks>
///    jsou serazeny v tomto poradi
///    Nejdrive sipky vychazejici z horni strany bubliny - doleva, na stred, doprava
///    dale sipky vychazejici s leve strany bubliny - nahoru, na stred, dolu
/// </remarks>

var bubVlastniBublina = ["bublinaVlastniDolu","bublinaVlastniDolu","bublinaVlastniDolu",
                         "bublinaVlastniVpravo","bublinaVlastniVpravo","bublinaVlastniVpravo",
                         "bublinaVlastniNahoru","bublinaVlastniNahoru","bublinaVlastniNahoru",
                         "bublinaVlastniVlevo","bublinaVlastniVlevo","bublinaVlastniVlevo"];
/// <summary>jednotlive styly  umisteni bublin</summary>
/// <remarks>
///    trikrat se hodnota opakuje proto, aby indexy odpovidaly vektoru bubSmerBubliny
/// </remarks>

var bubSipkyClass = ["bublinaSipkaNahoruVlevo","bublinaSipkaNahoruStred","bublinaSipkaNahoruNapravo",
                "bublinaSipkaVlevoDolu","bublinaSipkaVlevoStred","bublinaSipkaVlevoNahoru",
                "bublinaSipkaDoluNapravo","bublinaSipkaDoluStred","bublinaSipkaDoluVlevo",
                "bublinaSipkaVpravoDolu","bublinaSipkaVpravoStred","bublinaSipkaVpravoNahoru"];
/// <summary>jednotlive styly  umisteni div sipek</summary>
/// <remarks>
///    trikrat se hodnota opakuje proto, aby indexy odpovidaly vektoru bubSmerBubliny
/// </remarks>

var bubSipkyImgClass = ["bublinaSipkaImgDoleva", "bublinaSipkaImgStredVodorovne", "bublinaSipkaImgDoprava",
                        "bublinaSipkaImgNahoru","bublinaSipkaImgStredSvisle","bublinaSipkaImgDolu", 
                        "bublinaSipkaImgDoleva", "bublinaSipkaImgStredVodorovne", "bublinaSipkaImgDoprava",
                        "bublinaSipkaImgNahoru","bublinaSipkaImgStredSvisle","bublinaSipkaImgDolu"];
/// <summary>jednotlive styly  umisteni obrazku v div sipek</summary>

var bubDelkaSipky = 30;
/// <summary>rozmery sipky</summary>
var bubSirkaSipky = 73;
/// <summary>rozmery sipky</summary>

var bubVyskaObrazkuUBubliny = 15;
/// <summary>tyka se borazku bublinaH.gif a bublinaD.gif</summary>

var bubObrazky = ["images/bub/bublinaH.gif","images/bub/bublinaD.gif"]
/// <summary>Obrazky na horni a spodni stranu bubliny</summary>
/// <remarks>
///    jsou serazeny v tomto poradi: horni okraj, dolni okraj
/// </remarks>

var bubPrekrytiBublinyASipky = 1;
/// <summary>o kolik bodu se prekryva vlasrni bublina a sipka</summary>
/// <remarks>
///    Zajisti se tim skyti obrysove cary bubliny v miste sipky
/// </remarks>

var bubSeznamStylu = ["bublinaTelo","bublinaTeloSkryt","bublinaHlavni","bublinaHlavniiframe","bublinaHlavniSkryt",
//                      0               1                   2               3                   4                 
"bublinaVlastniDolu","bublinaVlastniVpravo","bublinaVlastniVlevo","bublinaVlastniNahoru","bublinaSipkaNahoruVlevo",
//5                       6                   7                       8                       9                   
"bublinaSipkaNahoruStred","bublinaSipkaNahoruNapravo","bublinaSipkaVlevoNahoru","bublinaSipkaVlevoStred","bublinaSipkaVlevoDolu",
//   10                          11                          12                      13                      14                  
"bublinaSipkaVpravoNahoru","bublinaSipkaVpravoStred","bublinaSipkaVpravoDolu","bublinaSipkaDoluVlevo","bublinaSipkaDoluStred",
//       15                          16                          17                      18                      19           
"bublinaSipkaDoluNapravo","bublinaSipkaImgNahoru","bublinaSipkaImgStredSvisle","bublinaSipkaImgDolu","bublinaSipkaImgDoleva",
//       20                          21                      22                          23                  24   
"bublinaSipkaImgStredVodorovne","bublinaSipkaImgDoprava"];
//       25                              26                  
/// <summary>seznam jednotlivych stylu</summary>

//=====================================================================

var bubSeznamBublin = new Array(0);
/// <summary>seznam vsech bublin, ktere jsou vytvoreny</summary>
/// <remarks>
///    udaje jsou ulozeny v objektu bubParametryBubliny
/// </remarks>

function bubParametryBubliny(IDBubliny,IDTextuBubliny, PoziceElementu,RozmerElementu,SmerBubliny,IDElementu){
/// <summary>objekt pro ulozeni informaci o bubline</summary>
    this.IDBubliny = IDBubliny;
    this.IDTextuBubliny = IDTextuBubliny;
    this.PoziceElementu = PoziceElementu;
    this.RozmerElementu = RozmerElementu;
    this.SmerBubliny = SmerBubliny;
    this.IDElementu = IDElementu;
}

var bubTimerID;
/// <summary>casovac pro onresize</summary>

// konec globalnich promennych
//=====================================================================



function bubVytvorBublinuSPrepisem(IdBubliny, VlastniTextuBubliny,IDElementu,SouradniceX,SouradniceY,SmerBubliny) // IdBubliny musi byt cislo od nuly!
{
  /// <summary>Vytvori a zobrazi bublinu napovedy. Pokud bublina s timto ID existuje, tak jen zmeni jeji text</summary>
  /// <param name="IdBubliny" type="string">Vlastni ID, diky kteremu se bublina nikdy nezobrazi vicekrat, pri dalsim volani se funkce ukonci.
  /// <param name="VlastniTextuBubliny" type="string">text, ktery ma byt zobrazen jako text napovedy, muze obsahovat html tagy.</param>
  /// <param name="IDElementu" type="string">element, ke kteremu ma byt napoveda zobrazena</param>
  /// <param name="SouradniceX" type="number">Xova souradnice hrotu sipky, hodnota udavana v px</param>
  /// <param name="SouradniceY" type="number">Yova souradnice hrotu sipky, hodnota udavana v px</param>
  /// <param name="SmerBubliny" type="string">Jakym smerem budee bublina vykreslena. Popis je u promenne bubSmerBubliny
  /// </param>
  /// <returns type="string">ID bubliny, aby mohla byt skryta</returns>
  /// <remarks>
  ///         VlastniTextuBubliny bude vlozen do elementu div a je mu prirazen styl .bublinaTelo
  ///         Pokud je zadan IDElementu , tak jsou ignorovany souradnice.
  ///         Bublinu se snazi vykreslit tak, aby byla videt v aktualnim okne. 
  ///         Je-li male okno, muze ignorovat SmerBubliny
  /// </remarks>
		if (document.getElementById("bublinaText" + IdBubliny) != null)
		{
			//alert("bublinaText" + IdBubliny);
			
			//bubSkryjBublinu("bublinaText" + IdBubliny)
			document.getElementById("bublinaText" + IdBubliny).innerHTML = VlastniTextuBubliny;									
			return;
		};  // bublina jiz byla zobrazena predtim, koncim bez dalsiho zobrazeni
    
    
		var teloBubliny = document.createElement("div");    //vytvorim VlastniTextuBubliny teloBubliny bubliny
		teloBubliny.id = "bublinaText" + IdBubliny;		
	    teloBubliny.className = bubSeznamStylu[1];   //"bublinaTeloSkryt"
    	teloBubliny.innerHTML = VlastniTextuBubliny;		
		document.body.appendChild(teloBubliny);
        
    return bubVytvorBublinuObject("bublinaText" + IdBubliny,IDElementu,SouradniceX,SouradniceY,SmerBubliny)
}




function bubVytvorBublinuSVlastnimID(IdBubliny, VlastniTextuBubliny,IDElementu,SouradniceX,SouradniceY,SmerBubliny)
{
  /// <summary>Vytvori a zobrazi bublinu napovedy</summary>
  /// <param name="IdBubliny" type="string">Vlastni ID, diky kteremu se bublina nikdy nezobrazi vicekrat, pri dalsim volani se funkce ukonci.
  /// <param name="VlastniTextuBubliny" type="string">text, ktery ma byt zobrazen jako text napovedy, muze obsahovat html tagy.</param>
  /// <param name="IDElementu" type="string">element, ke kteremu ma byt napoveda zobrazena</param>
  /// <param name="SouradniceX" type="number">Xova souradnice hrotu sipky, hodnota udavana v px</param>
  /// <param name="SouradniceY" type="number">Yova souradnice hrotu sipky, hodnota udavana v px</param>
  /// <param name="SmerBubliny" type="string">Jakym smerem budee bublina vykreslena. Popis je u promenne bubSmerBubliny
  /// </param>
  /// <returns type="string">ID bubliny, aby mohla byt skryta</returns>
  /// <remarks>
  ///         VlastniTextuBubliny bude vlozen do elementu div a je mu prirazen styl .bublinaTelo
  ///         Pokud je zadan IDElementu , tak jsou ignorovany souradnice.
  ///         Bublinu se snazi vykreslit tak, aby byla videt v aktualnim okne. 
  ///         Je-li male okno, muze ignorovat SmerBubliny
  /// </remarks>
    
    if (document.getElementById("bublinaText" + IdBubliny) != null){return};  // bublina jiz byla zobrazena predtim, koncim bez dalsiho zobrazeni
    var teloBubliny = document.createElement("div");    //vytvorim VlastniTextuBubliny teloBubliny bubliny
    teloBubliny.id = "bublinaText" + IdBubliny;
    teloBubliny.className = bubSeznamStylu[1];   //"bublinaTeloSkryt"
    teloBubliny.innerHTML = VlastniTextuBubliny;
    document.body.appendChild(teloBubliny);
    
    return bubVytvorBublinuObject("bublinaText" + IdBubliny,IDElementu,SouradniceX,SouradniceY,SmerBubliny)
}


function bubVytvorBublinu(VlastniTextuBubliny,IDElementu,SouradniceX,SouradniceY,SmerBubliny)
{
  /// <summary>Vytvori a zobrazi bublinu napovedy</summary>
  /// <param name="VlastniTextuBubliny" type="string">text, ktery ma byt zobrazen jako text napovedy, muze obsahovat html tagy.</param>
  /// <param name="IDElementu" type="string">element, ke kteremu ma byt napoveda zobrazena</param>
  /// <param name="SouradniceX" type="number">Xova souradnice hrotu sipky, hodnota udavana v px</param>
  /// <param name="SouradniceY" type="number">Yova souradnice hrotu sipky, hodnota udavana v px</param>
  /// <param name="SmerBubliny" type="string">Jakym smerem budee bublina vykreslena. Popis je u promenne bubSmerBubliny
  /// </param>
  /// <returns type="string">ID bubliny, aby mohla byt skryta</returns>
  /// <remarks>
  ///         VlastniTextuBubliny bude vlozen do elementu div a je mu prirazen styl .bublinaTelo
  ///         Pokud je zadan IDElementu , tak jsou ignorovany souradnice.
  ///         Bublinu se snazi vykreslit tak, aby byla videt v aktualnim okne. 
  ///         Je-li male okno, muze ignorovat SmerBubliny
  /// </remarks>
    var I = 0;
    while (document.getElementById("bublinaText" + I) != null){I++};    //mam volne ID pro text bubliny
    var teloBubliny = document.createElement("div");    //vytvorim VlastniTextuBubliny teloBubliny bubliny
    teloBubliny.id = "bublinaText" + I;
    teloBubliny.className = bubSeznamStylu[1];   //"bublinaTeloSkryt"
    teloBubliny.innerHTML = VlastniTextuBubliny;
    document.body.appendChild(teloBubliny);
    
    return bubVytvorBublinuObject("bublinaText" + I,IDElementu,SouradniceX,SouradniceY,SmerBubliny)
}

function bubVytvorBublinuObject(IDTextuBubliny,IDElementu,SouradniceX,SouradniceY,SmerBubliny)
{
  /// <summary>Vytvori a zobrazi bublinu napovedy</summary>
  /// <param name="IDTextuBubliny" type="string">element, ktery ma byt zobrazen jako text napovedy</param>
  /// <param name="IDElementu" type="string">element, ke kteremu ma byt napoveda zobrazena</param>
  /// <param name="SouradniceX" type="number">Xova souradnice hrotu sipky, hodnota udavana v px</param>
  /// <param name="SouradniceY" type="number">Yova souradnice hrotu sipky, hodnota udavana v px</param>
  /// <param name="SmerBubliny" type="string">Jakym smerem budee bublina vykreslena. Popis je u promenne bubSmerBubliny
  /// </param>
  /// <returns type="string">ID bubliny, aby mohla byt skryta</returns>
  /// <remarks>
  ///         Pokud je zadan IDElementu , tak jsou ignorovany souradnice.
  ///         Bublinu se snazi vykreslit tak, aby byla videt v aktualnim okne. 
  ///         Je-li male okno, muze ignorovat SmerBubliny
  /// </remarks>
    
    var pomElement= document.getElementById(IDElementu);
    var PoziceElementu;
    var RozmerElementu = new bubPozice(0,0);
    if(pomElement != null){    //budu bublinu umistovat dle souradnic
        PoziceElementu = bubSpocitejPozici(pomElement);
        RozmerElementu.x = pomElement.offsetWidth;
        RozmerElementu.y = pomElement.offsetHeight;
    }
    else{   //budu umistovat k elementu
        PoziceElementu = new bubPozice(SouradniceX,SouradniceY);
    }
    var SmerUmisteniBubliny = bubSmerUmisteniBubliny(IDTextuBubliny, PoziceElementu,RozmerElementu,SmerBubliny);

    var IDBubliny = bubKonstrukceBubliny(IDTextuBubliny,SmerUmisteniBubliny.SmerBubliny);
    Bublina = document.getElementById(IDBubliny);
    Bublina.style.left = SmerUmisteniBubliny.x +"px";
    Bublina.style.top = SmerUmisteniBubliny.y +"px";
    //Zapis bublin do seznamu bublin
    bubSeznamBublin.push(new bubParametryBubliny(IDBubliny,IDTextuBubliny,PoziceElementu,RozmerElementu,SmerBubliny,IDElementu));
    return IDBubliny;

}

function bubSmerUmisteniBubliny(IDTextuBubliny,PoziceElementu,RozmerElementu,SmerBubliny){
    /// <summary>urci nejvhodnejsi smer umisteni bubliny a pozici jejiho leveho horniho rohu</summary>
    /// <param name="IDTextuBubliny" type="string">element, ktery ma byt zobrazen jako text napovedy</param>
    /// <param name="PoziceElementu" type="bubPozice">ke ktere pozici bude ukazovat sipka bubliny</param>
    /// <param name="RozmerElementu" type="bubPozice">Okolo jak velkeho obdelnikuse bude sipka posouvat</param>
    /// <param name="SmerBubliny" type="string">hodnoty dle bubSmerBubliny</param>
    /// <returns type="bubPoziceSeSmerem">Umisteni leveho horniho rohu bubliny a smer sipky</returns>
    var VelikostBublinySvisle = bubVelikostBubliny(IDTextuBubliny,"S");
    var VelikostBublinyVodorovne = bubVelikostBubliny(IDTextuBubliny,"V");
    var VelikostOkna = new bubPozice(bubWinW(), bubWinH());    //blbe se mi vraci Velikost okna
    var PosunDokumentuVOkne = new bubPozice(document.body.scrollLeft,document.body.scrollTop);
    
    var Navrat = bubJeBublinaVOkne(VelikostBublinySvisle,VelikostBublinyVodorovne,PosunDokumentuVOkne,
                                   VelikostOkna,PoziceElementu,RozmerElementu,SmerBubliny);
    if(Navrat.JeVOkne){
        return Navrat;
    } else {
        for(I=0;I<bubSmerBubliny.length;I++){
            var Navrat1 = bubJeBublinaVOkne(VelikostBublinySvisle,VelikostBublinyVodorovne,PosunDokumentuVOkne,
                                   VelikostOkna,PoziceElementu,RozmerElementu,bubSmerBubliny[I]);
            if(Navrat1.JeVOkne){
                return Navrat1;
            }
        }
        return Navrat;
    }
}

function bubJeBublinaVOkne(VelikostBublinySvisle,VelikostBublinyVodorovne,PosunDokumentuVOkne,VelikostOkna,
                            PoziceElementu,RozmerElementu,SmerBubliny){
    /// <summary>urci nejvhodnejsi smer umisteni bubliny</summary>
    /// <param name="VelikostBublinySvisle" type="bubPozice">Rozmer bubliny, pokud ma sipku nahore nebo dole</param>
    /// <param name="VelikostBublinyVodorovne" type="bubPozice">Rozmer bubliny, pokud ma sipku vpravo nebo vlevo</param>
    /// <param name="PosunDokumentuVOkne" type="bubPozice">O kolik je dokument posunut vuci oknu prohlizece (obvykle bude asi 0,0)</param>
    /// <param name="VelikostOkna" type="bubPozice">Okno prohlizece ma tyto rozmery</param>
    /// <param name="PoziceElementu" type="bubPozice">ke ktere pozici bude ukazovat sipka bubliny</param>
    /// <param name="RozmerElementu" type="bubPozice">Okolo jak velkeho obdelnikuse bude sipka posouvat</param>
    /// <param name="SmerBubliny" type="string">hodnoty dle bubSmerBubliny</param>
    /// <returns type="bubPoziceSeSmerem">Umisteni leveho horniho rohu bubliny a smer sipky</returns>
    /// <remarks>
    ///         Jestli se bublina bublina vejde do okna urcuje vlastnost JeVOkne
    /// </remarks>
    var pomVelikostBubliny = new bubPozice(0,0);    //musim sem dat rozmer bubliny, se kterym se bude pocitat
    switch (bubIndexSipky(SmerBubliny)){
        case 0:
        case 1:
        case 2:
        case 6:
        case 7:
        case 8:
            pomVelikostBubliny = VelikostBublinySvisle;
            break;
        case 3:
        case 4:
        case 5:
        case 9:
        case 10:
        case 11:
            pomVelikostBubliny = VelikostBublinyVodorovne;
            break;
        default:
            pomVelikostBubliny = VelikostBublinySvisle;
            break;
    }
    //kde ma bublina levy horni roh v ramci oka?
    var PozicebuBlinyVOkne= new bubPozice(PoziceElementu.x - PosunDokumentuVOkne.x,
                                           PoziceElementu.y - PosunDokumentuVOkne.y);
    //umisteni bubliny v okne x-souradnice
    switch (bubIndexSipky(SmerBubliny)){
        case 0:
        case 3:
        case 4:
        case 5:
        case 8:
            PozicebuBlinyVOkne.x  += RozmerElementu.x;
            break;
        case 1:
        case 7:
            PozicebuBlinyVOkne.x += (RozmerElementu.x - pomVelikostBubliny.x) / 2;
            break;
        case 2:
        case 6:
        case 9:
        case 10:
        case 11:
            PozicebuBlinyVOkne.x -= pomVelikostBubliny.x;
            break;
    }
    //umisteni bubliny v okne y-souradnice
    switch (bubIndexSipky(SmerBubliny)){
        case 0:
        case 1:
        case 2:
        case 3:
        case 9:
            PozicebuBlinyVOkne.y += RozmerElementu.y;
            break;
        case 4:
        case 10:
            PozicebuBlinyVOkne.y += (RozmerElementu.y - pomVelikostBubliny.y) / 2;
            break;
        case 5:
        case 6:
        case 7:
        case 8:
        case 11:
            PozicebuBlinyVOkne.y -= pomVelikostBubliny.y;
            break;
    }   //Huraa mam levy horni roh bubliny
    var Navrat = new bubPoziceSeSmerem(PozicebuBlinyVOkne.x + PosunDokumentuVOkne.x,
                                       PozicebuBlinyVOkne.y + PosunDokumentuVOkne.y, SmerBubliny,false);
    if(PozicebuBlinyVOkne.x >= 0 && PozicebuBlinyVOkne.y >= 0 &&    //levy horni roh je v okne
       PozicebuBlinyVOkne.x + pomVelikostBubliny.x <= VelikostOkna.x && 
       PozicebuBlinyVOkne.y + pomVelikostBubliny.y <= VelikostOkna.y){  //i pravy dolni roh vyhovuje
        Navrat.JeVOkne = true;
    }
    return Navrat;
    
}

function bubVelikostBubliny(IDTextuBubliny,OrientaceBubliny){
    /// <summary>zjisteni velikosti cele bubliny</summary>
    /// <param name="IDTextuBubliny" type="string">element, ktery ma byt zobrazen jako text napovedy</param>
    /// <param name="OrientaceBubliny" type="string">Jakym smerem bude bublina vykreslena. 
    ///                                                S - svisle bublina nad nevo pod sipkou
    ///                                                V - vodorovne bublina vedle sipky</param>
    /// <returns type="bubPozice">rozmer bubliny vcetne sipky</returns>
    /// <remarks>
    ///         Bublinu vytvorim v absolutne pozicovanem div.
    ///         V nem je obrazek sipky a druhy div obsahujici horni obrazek (zakulacene rohy),telo bubliny a spodni obrazek.
    /// </remarks>
    var Rozmer = new bubPozice(0, 0);
    //zjisteni velikostitextu bubliny a dle toho urcim velikost cele bubliny se sipkou
    var pomTextBubliny = document.getElementById(IDTextuBubliny);
    document.body.appendChild(pomTextBubliny);   //presunu bubliny na konec dokumentu, aby jeji zobrazeni nerozhodilo str.
    pomTextBubliny.className = bubSeznamStylu[0];    //"bublinaTelo"
    Rozmer.x = pomTextBubliny.offsetWidth;
    Rozmer.y = pomTextBubliny.offsetHeight;
    pomTextBubliny.className = bubSeznamStylu[1];    //"bublinaTeloSkryt"
    // Prictu horni a dolni obrazek
    Rozmer.y += bubVyskaObrazkuUBubliny * 2;
    //ted prictu velikostsipky
    switch (OrientaceBubliny) {
        case "S":
            Rozmer.y += bubDelkaSipky - bubPrekrytiBublinyASipky;
            break;
        case "V":
            Rozmer.x += bubDelkaSipky - bubPrekrytiBublinyASipky;
            break;
    }
    return Rozmer;
}


function bubKonstrukceBubliny(IDTextuBubliny,SmerBubliny)
{
  /// <summary>Vytvori vlastni bublinu</summary>
  /// <param name="IDTextuBubliny" type="string">element, ktery ma byt zobrazen jako text napovedy</param>
  /// <param name="SmerBubliny" type="string">Jakym smerem bude bublina vykreslena. Popis u funkce VytvorBublinu.</param>
  /// <returns type="string">ID bubliny, aby mohla byt skryta</returns>
  /// <remarks>
  ///         Bublinu vytvorim v absolutne pozicovanem div.
  ///         V nem je obrazek sipky a druhy div obsahujici horni obrazek (zakulacene rohy),telo bubliny a spodni obrazek.
  /// </remarks>

    var hlavniDIV = document.createElement("div");
    //Najiti prvniho volneho ID pro bublinu
    var I = 0;
    while(document.getElementById("bublina"+I)!=null){
        I++;
    }
    hlavniDIV.id = "bublina"+I;
    //hlavniDIV.style.display = "none";
    hlavniDIV.className = bubSeznamStylu[2]; //"bublinaHlavni"
    document.body.appendChild(hlavniDIV);
    var VelikostBubliny;
    switch (bubIndexSipky(SmerBubliny)){    //jakym smerem je bublina od sipky
       case 0 : //sipky smerem nahoru
       case 1 :
       case 2 :
       case 6 : //sipky smerem dolu
       case 7 :
       case 8 :
          VelikostBubliny = bubVelikostBubliny(IDTextuBubliny,"S");
          break;
       case 3 : //sipky smerem doleva
       case 4 :
       case 5 :
       case 9 : //sipky smerem doprava
       case 10 :
       case 11 :
          VelikostBubliny = bubVelikostBubliny(IDTextuBubliny,"V");
          break;
       default : ;
    }
    hlavniDIV.style.width = VelikostBubliny.x;
    hlavniDIV.style.height = VelikostBubliny.y;
    
    //kvuli chybe v IE6 musim vlozit iframe. prevzato z http://shepherdweb.com/2007/02/14/z-index-ignored-for-select-element-in-ie-6-workaround/select-element-z-index-workaround/
    if(IE){
        var hlavniIframe = document.createElement("iframe");
        hlavniDIV.appendChild(hlavniIframe);
    }
    
    //vytvoreni vlastni bubliny bez sipky.
    //v div je vlozen horni obrazek, telo bubliny a dolni obrazek
    var vlastniBublina = document.createElement("div");
    vlastniBublina.className = bubVlastniBublina[bubIndexSipky(SmerBubliny)];
    vlastniBublina.onclick = function() {bubSkryjBublinu('bublina'+I);};
    //horni obrazek
    var pomObrH = document.createElement("img");
    pomObrH.setAttribute("src",bubObrazky[0]);
    vlastniBublina.appendChild(pomObrH);
    //vlastni telo
    var pomTelo = document.getElementById(IDTextuBubliny);
    pomTelo.className = bubSeznamStylu[0];    //"bublinaTelo"aby se zobrazilo 
    vlastniBublina.appendChild(pomTelo);
    //dolni obrazek
    var pomObrD = document.createElement("img");
    pomObrD.setAttribute("src",bubObrazky[1]);
    vlastniBublina.appendChild(pomObrD);
    //pridam bublinu do celku
    hlavniDIV.appendChild(vlastniBublina);
    
    bubPrilepSipku(hlavniDIV,pomTelo,SmerBubliny);

    return hlavniDIV.id;
}

function bubPrilepSipku(hlavniDIV,bublinaTelo,SmerBubliny){
  /// <summary>K vlastni bubline pripoji sipku</summary>
  /// <param name="hlavniDIV" type="div">hlavni element bubliny</param>
  /// <param name="bublinaTelo" type="div">element s telem vlastni bubliny</param>
  /// <param name="SmerBubliny" type="string">Jakym smerem bude bublina vykreslena. Popis u funkce VytvorBublinu.</param>
    //prilepim sipku
    var sipkaDiv = document.createElement("div");
    sipkaDiv.className = bubSipkyClass[bubIndexSipky(SmerBubliny)];
    var sipka = document.createElement("img");
    sipka.setAttribute("src",bubSipky[bubIndexSipky(SmerBubliny)]);
    sipkaDiv.appendChild(sipka);
    hlavniDIV.appendChild(sipkaDiv);
    //Nastaveni pozice sipkaDiv
    switch (bubIndexSipky(SmerBubliny)){    //jakym smerem je bublina od sipky
       case 6 : //sipky smerem dolu
       case 7 :
       case 8 :
          sipkaDiv.style.top = (bublinaTelo.offsetHeight + bubVyskaObrazkuUBubliny * 2 - bubPrekrytiBublinyASipky) + "px";
          break;
       case 9 : //sipky smerem doleva
       case 10 :
       case 11 :
          sipkaDiv.style.left = (bublinaTelo.offsetWidth - bubPrekrytiBublinyASipky) + "px";
          break;
       default : ;
    }
    //Nastaveni rozmeru sipkaDiv
    switch (bubIndexSipky(SmerBubliny)){    //jakym smerem je bublina od sipky
       case 0 : //sipky smerem nahoru
       case 1 :
       case 2 :
       case 6 : //sipky smerem dolu
       case 7 :
       case 8 :
          sipkaDiv.style.width = bublinaTelo.offsetWidth + "px";
          break;
       case 3 : //sipky smerem doleva
       case 4 :
       case 5 :
       case 9 : //sipky smerem doprava
       case 10 :
       case 11 :
          sipkaDiv.style.height = bublinaTelo.offsetHeight + bubVyskaObrazkuUBubliny * 2 + "px";
          break;
       default : ;
    }
    //Nastaveni stylu sipka
    sipka.className = bubSipkyImgClass[bubIndexSipky(SmerBubliny)];
    //Svisle umisteni sipky
    switch (bubIndexSipky(SmerBubliny)){    //jakym smerem je bublina od sipky
       case 5 : //sipky smerem dolu
       case 11 :
          sipka.style.top = (sipkaDiv.offsetHeight - bubSirkaSipky) + "px";
          break;
       case 4 : //sipky na stred
       case 10 :
          sipka.style.top = ((sipkaDiv.offsetHeight - bubSirkaSipky) / 2) + "px";
          break;
       default : ;  //ostatnim smerum nemusim nic delat
    }
}

function bubIndexSipky(SmerBubliny)
{
  /// <summary>Vrati odpovidajici index do vektoru s parametry pro zobrazeni</summary>
  /// <param name="SmerBubliny" type="string">Jakym smerem bude bublina vykreslena. Popis u funkce VytvorBublinu.</param>
  /// <returns type="number">index do bubSipky pro odpovidajici sipku</returns>
  /// <remarks>
  ///         jen interni funkce
  ///         Pokud nenajde
  /// </remarks>

    for(I=0;I<bubSmerBubliny.length;I++){
        if(bubSmerBubliny[I]==SmerBubliny){
            return I;
        }
    }
    return 0;
}


function bubPozice(x, y) {
  /// <summary>deklarace tridy pro predavani pozice nebo rozmeru prvku v nadrizenem kontejneru</summary>
  /// <param name="x" type="integer">Xova souradnice</param>
  /// <param name="y" type="integer">Yova souradnice</param>
   this.x = x;
   this.y= y;
}

function bubPoziceSeSmerem(x, y, SmerBubliny, JeVOkne) {
  /// <summary>obdoba tridy bubPozice, rozsirena o JeVOkne</summary>
  /// <param name="x" type="integer">Xova souradnice</param>
  /// <param name="y" type="integer">Yova souradnice</param>
  /// <param name="JeVOkne" type="boolean">urcuje, jestli se bublina vejde do okna prohlizece</param>
   this.x = x;
   this.y = y;
   this.SmerBubliny = SmerBubliny;
   this.JeVOkne = JeVOkne;
}


function bubSpocitejPozici(element) {
  /// <summary>rekurzivne prochazi strukturu dokumentu az k BODY a scita offsety jednotlivych prvku</summary>
  /// <param name="element" type="HTMLelement">element, jehoz pozice ma byt spoctena</param>
  /// <returns type="bubPozice">ID bubliny, aby mohla byt skryta</returns>
  /// <remarks>
  ///         Bublinu vytvorim v absolutne pozicovanem div.
  ///         V nem je obrazek sipky a druhy div obsahujici horni obrazek (zakulacene rohy),telo bubliny a spodni obrazek.
  /// </remarks>
    var PoziceElementu = new bubPozice(0, 0);
    if (element.offsetParent != null) {
        PoziceElementu = bubSpocitejPozici(element.offsetParent);
    };
    PoziceElementu.x += element.offsetLeft;
    PoziceElementu.y += element.offsetTop;
    return PoziceElementu;
}

//nasledujici 2 funkce prevzaty z http://pixy.cz/blogg/clanky/js-rozmery-okna.html
function bubWinH() {    //vyska okna prohlizece
	if (window.innerHeight) return window.innerHeight;
	else if (document.documentElement && document.documentElement.clientHeight)
		return document.documentElement.clientHeight;
	else if (document.body && document.body.clientHeight)
		return document.body.clientHeight;
	else return null;
}
function bubWinW() {    //sirka okna prohlizece
	if (window.innerWidth) return window.innerWidth;
	else if (document.documentElement && document.documentElement.clientWidth)
		return document.documentElement.clientWidth;
	else if (document.body && document.body.clientWidth)
		return document.body.clientWidth;
	else return null;
}
// konec prevzateho kodu

function bubSkryjBublinu(IDBubliny)
{
  /// <summary>Skryje bublinu</summary>
  /// <param name="IDBubliny" type="string">ID bubliny, ktera ma byt skryta</param>
  /// <returns type="boolean">jestli se podarilo bublinu nalezt a skryt</returns>
  /// <remarks>
  ///         Skryti se provadi pomoci nastaveni parametru class
  /// </remarks>
    var Bublina = document.getElementById(IDBubliny);
    if(Bublina == null){
        return false;
    }
    else {
        Bublina.className = bubSeznamStylu[4];   //"bublinaHlavniSkryt"
        return true;
    }
}

function bubZobrazBublinu(IDBubliny)
{
  /// <summary>Zobrazi drive vytvorenou bublinu</summary>
  /// <param name="IDBubliny" type="string">ID bubliny, ktera ma byt zobrazena</param>
  /// <returns type="boolean">jestli se podarilo bublinu nalezt a zobrazit</returns>
  /// <remarks>
  ///         Zobrazeni se provadi pomoci nastaveni parametru class
  /// </remarks>
    var Bublina = document.getElementById(IDBubliny);
    if(Bublina == null){
        return false;
    }
    else {
        Bublina.className = bubSeznamStylu[2];  //"bublinaHlavni"
        return true;
    }
}

function bubZrusBublinu(IDBubliny)
{
  /// <summary>Zrusi bublinu a jeji text prevede do elementu body</summary>
  /// <param name="IDBubliny" type="string">ID bubliny, ktera ma byt zrusena</param>
  /// <returns type="boolean">jestli se podarilo bublinu zlikvidovat</returns>
  /// <remarks>
  ///         v bubSeznamBublin najde informace o bubline
  ///         element IDTextuBubliny presune do elemenu body
  ///         Zbytek bubliny je odstranen
  /// </remarks>
    //najiti odpovidajiciho zaznamu v seznamu
    var I;
    var J;
    var pomParametryBubliny = null;
    for (I=0;I<bubSeznamBublin.length;I++){
        if(IDBubliny == bubSeznamBublin[I].IDBubliny){
            pomParametryBubliny = bubSeznamBublin[I];
            J = I;
            I = bubParametryBubliny.length;
        }
    };
    if(pomParametryBubliny == null){ return false}; //nenasel jsem zaznam
    //element IDTextuBubliny presun do elemenu body
    var pomTextuBubliny = document.getElementById(pomParametryBubliny.IDTextuBubliny);
    pomTextuBubliny.className = bubSeznamStylu[1];   //"bublinaTeloSkryt"
    document.body.appendChild(pomTextuBubliny);
    //Zbytek bubliny je odstranen
    document.body.removeChild(document.getElementById(IDBubliny));
    //odstaraneni zaznamu z bubSeznamBublin
    bubSeznamBublin[J] = bubSeznamBublin[bubSeznamBublin.length - 1];   //Posledni bublinu v seznamu dam misto vyrazovane bubliny
    bubSeznamBublin.pop();  //zkratim vektor o nepotrebnou bublinu
    return true;
}

function bubVyberVzhled(IDVzhledu){
/// <summary>Vybere vzhed a styly bubliny</summary>
/// <param name="IDVzhledu" type="string">ID jaky vzhled vybrat</param>
/// <remarks>
///         pro vyber vzhledu musi byt definovany jiste promenne a tato funkce tyto promenne prekopiruje do implicitnich promennych
///         Pro spravnou funkci vyzaduje mit deklarovane promenne bubSipkyX, bubDelkaSipkyX, bubSirkaSipkyX, bubVyskaObrazkuUBublinyX,
///         bubObrazkyX, bubPrekrytiBublinyASipkyX, bubSeznamStyluX, kde X=IDVzhledu
///         Dale musi byt vztvoreny vsechny obrazky a styly uvedene v techto promennych
///         nejlepe je toto ulozit do specialnich souboru bublinyX.js, bublinyX.css
/// </remarks>

bubSeznamStylu = eval("bubSeznamStylu" + IDVzhledu);
bubPrekrytiBublinyASipky = eval("bubPrekrytiBublinyASipky" + IDVzhledu);
bubObrazky = eval("bubObrazky" + IDVzhledu);
bubVyskaObrazkuUBubliny = eval("bubVyskaObrazkuUBubliny" + IDVzhledu);
bubSirkaSipky = eval("bubSirkaSipky" + IDVzhledu);
bubDelkaSipky = eval("bubDelkaSipky" + IDVzhledu);
bubSipkyImgClass = [bubSeznamStylu[24],bubSeznamStylu[25],bubSeznamStylu[26],
                    bubSeznamStylu[21],bubSeznamStylu[22],bubSeznamStylu[23],
                    bubSeznamStylu[24],bubSeznamStylu[25],bubSeznamStylu[26],
                    bubSeznamStylu[21],bubSeznamStylu[22],bubSeznamStylu[23]];
bubSipkyClass = [bubSeznamStylu[9],bubSeznamStylu[10],bubSeznamStylu[11],
                 bubSeznamStylu[14],bubSeznamStylu[13],bubSeznamStylu[12],
                 bubSeznamStylu[20],bubSeznamStylu[19],bubSeznamStylu[18],
                 bubSeznamStylu[17],bubSeznamStylu[16],bubSeznamStylu[15]];
bubVlastniBublina = [bubSeznamStylu[5],bubSeznamStylu[5],bubSeznamStylu[5],
                     bubSeznamStylu[6],bubSeznamStylu[6],bubSeznamStylu[6],
                     bubSeznamStylu[8],bubSeznamStylu[8],bubSeznamStylu[8],
                     bubSeznamStylu[7],bubSeznamStylu[7],bubSeznamStylu[7]];
bubSipky = eval("bubSipky" + IDVzhledu);

}
