

function id(nazev) {
  return document.getElementById(nazev);
}

function tag(nazev, elem) {
  // Pokud nebyl předán element jako kontext, prohledáme celý dokument.
  return (elem || document).getElementsByTagName(nazev);
}

function odstranBileZnaky( element ) {
  // Pokud není předán element, aplikujeme funkci na celý dokument HTML.
  element = element || document;
  // První dceřiný uzel elementu použijeme jako výchozí bod.
  var aktualni = element.firstChild;

  // Pokračujeme, dokud zde nějaké dceřiné uzly jsou.
  while ( aktualni != null ) {

    // Pokud je uzel textovým uzlem a obsahuje jen bílé znaky
    if ( aktualni.nodeType == 3 && ! /\S/.test(aktualni.nodeValue) ) {
      // odstraníme tento uzel.
      element.removeChild( aktualni );

      // V opačném případě, pokud jde o element
    } else if ( aktualni.nodeType == 1 ) {
      // pokračujeme dolů strukturou dokumentu.
      odsranBileZnaky( aktualni );
    }

    aktualni = aktualni.nextSibling; // Přesouváme se mezi dceřinými uzly.
  }
}

function pred( elem ) {
  do {
    elem = elem.previousSibling;
  } while ( elem && elem.nodeType != 1 );
  return elem;
}

function dalsi( elem ) {
  do {
    elem = elem.nextSibling;
  } while ( elem && elem.nodeType != 1 );
  return elem;
}

function prvni( elem ) {
  elem = elem.firstChild;
  return elem && elem.nodeType != 1 ?
    dalsi ( elem ) : elem;
}

function posledni( elem ) {
  elem = elem.lastChild;
  return elem && elem.nodeType != 1 ?
    pred ( elem ) : elem;
}

function rodic( elem, cislo ) {
  cislo = cislo || 1;
  for ( var i = 0; i < cislo; i++ )
    if ( elem != null ) elem = elem.parentNode;
  return elem;
}

function maTridu(nazev,typ) {
  var r = [];
  // Vyhledá název třídy (umožňuje více tříd pro jeden element).
  var re = new RegExp("(^|\\s)" + nazev + "(\\s|$)");

  // Prohledávání buď omezíme na konkrétní typ elementů, nebo prohledáme
  // všechny elementy.
  var e = document.getElementsByTagName(typ || "*");
  for ( var j = 0; j < e.length; j++ )
    // Pokud má element danou třídu, přidáme ho k výslednému poli.
    if ( re.test(e[j]) ) r.push( e[j] );

  // Vrátíme pole vyhledaných elementů.
  return r;
}





// Získáme hodnotu vlastnosti stylů (nazev) určitého elementu (elem).
function ziskejStyl( elem, nazev ) {
  // Pokud je vlastnost v poli style[], pak byla nastavena
  // nedávno (a je aktuální).
  if (elem.style[nazev])
    return elem.style[nazev];

  // Jinak zkusíme metodu podle IE
  else if (elem.currentStyle)
    return elem.currentStyle[nazev];

  // nebo metodu podle W3C.
  else if (document.defaultView && document.defaultView.getComputedStyle) {
    // Používá běžnou vlastnost CSS 'text-align' pro zarovnávání
    // místo parametru textAlign.
    nazev = nazev.replace(/([A-Z])/g,"-$1");
    nazev = nazev.toLowerCase();

    // Získáme objekt stylu a hodnotu vlastnosti (pokud existuje).
    var s = document.defaultView.getComputedStyle(elem,"");
    return s && s.getPropertyValue(nazev);

    // V opačném případě používáme nějaký jiný prohlížeč.
  } else
  return null;
}



function rozvin( elem ) {
  // Rozvinutí zahájíme s nulovou výškou elementu.
  elem.style.height = '0px';

  // Zobrazíme daný element (ale ten není vidět, protože má výšku 0).
  zobraz( elem );

  // Zjistíme si, jaká je maximální možná výška daného elementu.
  var v = maximalniVyska( elem );

  // Uděláme animaci o 20 snímcích a s délkou trvání 1 sekunda.
  for ( var i = 0; i <= 100; i += 5 ) {
    // Ujistíme se, že máme správné 'i'.
    (function(){
      var poz = i;

      // Nastavíme dobu, za kterou bude volána daná funkce.
      setTimeout(function(){

        // Nastavíme novou výšku elementu.
        elem.style.height = (( poz / 100 ) * v ) + "px";

      }, ( poz + 1 ) * 10 );
    })();
  }
}



// Funkce pro skrytí elementu (pomocí vlastnosti display).
function skryj( elem ) {
  // Zjistíme, jaký je stav vlastnosti display.
  var aktualniDisplay = ziskejStyl( elem, 'display' );

  // Zapamatujeme si aktuální stav pro pozdější obnovu.
  if ( aktualniDisplay != 'none' )
    elem.$staryDisplay = aktualniDisplay;

  // Nastavíme vlastnost display na none (skryjeme element).
  elem.style.display = 'none';
}

// Funkce pro zobrazeni elementu (pomocí display).
function zobraz( elem ) {
  // Nastavíme vlastnosti display původní hodnotu, případně použijeme
  // 'block', pokud nebyla původní hodnota uložena.
  elem.style.display = elem.$staryDisplay || '';
}


// Nastaví úroveň neprůhlednosti elementu
// (kde parametr uroven je číslo 0 - 100).
function nastavNepruhlednost( elem, uroven ) {
  // Pokud existuje atribut filters, pak jsme v prohlížeči IE, proto
  // nastavíme filtr alpha.
  if ( elem.filters ) {
	elem.style.filter = 'alpha(opacity=' + uroven + ')';
}
  // Jinak použijeme vlastnost opacity podle W3C.
  else
    elem.style.opacity = uroven / 100;
}


function roztmivej( elem ) {
  // Začínáme s úrovní neprůhlednosti 0.
  nastavNepruhlednost( elem, 0 );

  // Zobrazíme daný element (ale ten není vidět, protože má úroveň
  // neprůhlednosti 0).
  zobraz( elem );

  // Uděláme animaci o 20 snímcích a s délkou trvání 1 sekunda.
  for ( var i = 0; i <= 100; i += 5 ) {
    // Ujistíme se, že máme správné 'i'.
    (function(){
      var poz = i;

      // Nastavíme dobu, za kterou bude volána daná funkce.
      setTimeout(function(){

        // Nastavíme novou úroveň neprůhlednosti elementu.
         nastavNepruhlednost( elem, poz );

      }, ( poz + 1 ) * 10 );
    })();
  }
}


function ztmivej( elem ) {
  // Začínáme s úrovní neprůhlednosti 0.
  nastavNepruhlednost( elem, 0 );

  // Zobrazíme daný element (ale ten není vidět, protože má úroveň
  // neprůhlednosti 0).
  zobraz( elem );

  // Uděláme animaci o 20 snímcích a s délkou trvání 1 sekunda.
  for ( var i = 100; i >= 0; i -= 5 ) {
    // Ujistíme se, že máme správné 'i'.
    (function(){
      var poz = i;

      // Nastavíme dobu, za kterou bude volána daná funkce.
      setTimeout(function(){

        // Nastavíme novou úroveň neprůhlednosti elementu.
         nastavNepruhlednost( elem, poz );

      }, ( poz + 1 ) * 10 );
    })();
  }
}




// Vyhledá maximální možnou výšku elementu (nikoliv aktuální výšku).
function maximalniVyska( elem ) {
  // Pokud je element zobrazen, použijeme atribut offsetHeight
  // nebo funkci ziskejVysku().
  if ( ziskejStyl( elem, 'display' ) != 'none' )
    return elem.offsetHeight || ziskejVysku( elem );

  // V opačném případě jde o element s display: none, proto musíme upravit
  // jeho vlastnosti CSS, abychom mohli zjistit požadovanou informaci.
  var stare = prenastavCSS( elem, {
    display: '',
    visibility: 'hidden',
    position: 'absolute'
  });

  // Získáme maximální výšku elementu pomocí clientHeight, pokud
  // nefunguje, tak použijeme ziskejVysku.
  var v = elem.clientHeight || ziskejVysku( elem );

  // Nakonec obnovíme původní vlastnosti CSS
  obnovCSS( elem, stare );

  // a vrátíme maximální možnou výšku elementu.
  return v;
}

// Vyhledá maximální možnou šířku elementu (nikoliv aktuální šířku).
function maximalniSirka( elem ) {
  // Pokud je element zobrazen, použijeme atribut offsetWidth
  // nebo funkci ziskejSirku().
  if ( ziskejStyl( elem, 'display' ) != 'none' )
    return elem.offsetWidth || ziskejSirku( elem );

  // V opačném případě jde o element s display: none, proto musíme upravit
  // jeho vlastnosti CSS, abychom mohli zjistit požadovanou informaci.
  var stare = prenastavCSS( elem, {
    display: '',
    visibility: 'hidden',
    position: 'absolute'
  });

  // Získáme maximální šířku elementu pomocí clientWidth, pokud
  // nefunguje, tak použijeme ziskejSirku.
  var s = elem.clientWidth || ziskejSirku( elem );

  // Nakonec obnovíme původní vlastnosti CSS
  obnovCSS( elem, stare );

  // a vrátíme maximální možnou šířku elementu.
  return s;
}

// Funkce pro nastavení vlastností CSS, která vrací původní nastavení pro
// pozdější obnovu.
function resetCSS( elem, vlastn ) {
  var stare = {};

  // Projdeme všechny vlastnosti.
  for ( var i in vlastn ) {
    // Uložíme původní hodnotu vlastnosti
    stare[ i ] = elem.style[ i ];

    // a nastavíme novou hodnotu.
    elem.style[ i ] = vlastn[i];
  }

  // Vrátíme pole změněných hodnot, které můžeme později obnovit funkcí
  // obnovCSS.
  return stare;
}

// Funkce odstraňující vedlejší efekty funkce prenastavCSS.
function obnovCSS( elem, vlastn ) {
  // Všem vlastnostem nastavíme původní hodnoty.
  for ( var i in vlastn )
    elem.style[ i ] = vlastn[ i ];
}



function domReady( f ) {
  // Pokud je DOM načten, zavoláme hned danou funkci f().
  if ( domReady.done ) return f();

  // Jestliže jsme už přidali funkci
  if ( domReady.timer ) {
    // přidáme ji do seznamu funkcí k zavolání.
    domReady.ready.push( f );
  } else {
    // Přidáme událost pro dokončení načítání stránky,
    // jen pro případ, že by skončilo dříve.
    addEvent( window, "load", isDOMReady );

    // Vytvoříme pole funkcí k zavolání.
    domReady.ready = [ f ];

    // Ověříme, jestli je DOM připraven, jak to bude nejrychleji možné.
    domReady.timer = setInterval( isDOMReady, 13 );
  }
}

// Ověří, zda je DOM připraven pro navigaci.
function isDOMReady() {
  // Pokud jsme již zjistili, že stránka byla načtena, ukončíme funkci.
  if ( domReady.done ) return false;

  // Zkontrolujeme, zda jsou dostupné některé elementy a funkce.
  if ( document && document.getElementsByTagName &&
       document.getElementById && document.body ) {

    // Pokud jsou dostupné, ukončíme kontrolu.
    clearInterval( domReady.timer );
    domReady.timer = null;

   // Zavoláme všechny čekající funkce.
    for ( var i = 0; i < domReady.ready.length; i++ )
      domReady.ready[i]();

    // Nyní jsme hotovi.
    domReady.ready = null;
    domReady.done = true;
  }
}

// addEvent/removeEvent napsal Dean Edwards, 2005
// doplnil Tino Zijdel
// http://dean.edwards.name/weblog/2005/10/add-event/

function addEvent(element, typ, obsluha) {
  // Každé funkci pro obsluhu události přiřadíme jedinečný identifikátor.
  if (!obsluha.$$jid) obsluha.$$jid = addEvent.jid++;

  // Vytvoříme hašovací tabulku typů událostí pro daný element.
  if (!element.udalosti) element.udalosti = {};

  // Vytvoříme hašovací tabulku funkcí pro obsluhu události pro každou
  // dvojici element/událost.
  var obsluhy = element.udalosti[typ];
  if (!obsluhy) {
    obsluhy = element.udalosti[typ] = {};

    // Uložíme funkci pro obsluhu události (pokud existuje).
    if (element["on" + typ]) {
      obsluhy[0] = element["on" + typ];
    }

  }

  // Uložíme funkci pro obsluhu události do hašovací tabulky.
  obsluhy[obsluha.$$jid] = obsluha;

  // Připojíme globální funkci pro obsluhu události, která odvede všechnu
  // práci.
  element["on" + typ] = zpracujUdalost;
};

// Počítadlo použité pro vytvoření jedinečného identifikátoru.
addEvent.jid = 1;

function removeEvent(element, typ, obsluha) {
  // Smažeme funkci pro obsluhu události z hašovací tabulky.
  if (element.udalosti && element.udalosti[typ]) {
    delete element.udalosti[typ][obsluha.$$jid];
  }
};

function zpracujUdalost(udalost) {
  var navratovaHodnota = true;

  // Získáme objekt události (IE používá globální objektu události).
  udalost = udalost || opravUdalost(window.event);

  // Získáme odkaz na hašovací tabulku funkcí pro obsluhu událostí.
  var obsluhy = this.udalosti[udalost.typ];

  // Spustíme všechny funkce pro obsluhu událostí.
  for (var i in obsluhy) {
    this.$$zpracujUdalost = obsluhy[i];
    if (this.$$zpracujUdalost(udalost) === false) {
      navratovaHodnota = false;
    }
  }

  return navratovaHodnota;
};

// Přidáme nějaké "chybějící" metody k objektu události v IE.
function opravUdalost(udalost) {
  // Přidáme standardní metody objektu události od W3C.
  udalost.preventDefault = opravUdalost.preventDefault;
  udalost.stopPropagation = opravUdalost.stopPropagation;
  return udalost;
};

opravUdalost.preventDefault = function() {
  this.navratovaHodnota = false;
};

opravUdalost.stopPropagation = function() {
  this.cancelBubble = true;
};




