// 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;
};

