formiky = {
    
    elIdArr: Array(),

    // vrati element zjisteny pres getElementById
    // jednou zjisteny element ukladam do pole, a pri pristi potrebe ho taham uz z tama
    get: function(id)
    {
        if (this.elIdArr[id] !== undefined) {
            _el = this.elIdArr[id];
        }
        else {
            _el = document.getElementById(id);
            this.elIdArr[id] = _el;
        }
        return _el;
    },


    // pomocna fce na zpracovani udalosti od elementu (kus fczbkk kodu)
    osetri_udalost: function(elm)
    {
        if (!elm || !elm.tagName) {
            var e = evt.fix(elm);
            elm = e.target;
        }
        
        if (elm &&
            ((elm.tagName.toLowerCase() == "input") ||
             (elm.tagName.toLowerCase() == "select") ||
             (elm.tagName.toLowerCase() == "textarea"))) {

            return elm;
        }
        else {
            return undefined;
        }
    },


    // vytvori lookup pole radku tabulek, ve kterych se nachazi labely
    // (klicem je id prvku na ktery se label odkazuje, hodnota je element radku tabulky)
    vytvor_lookup: function()
    {
        labely = document.getElementsByTagName('label');
        this.lookUp = Array();
        for (var i = 0; i < labely.length; i++) {
            // this.lookUp[labely[i].htmlFor] = labely[i];
            this.lookUp[labely[i].htmlFor] = labely[i].parentNode.parentNode;
        }
    },


    // vrati element radku pro zadane id input prvku (radek ve ktrem se input nachazi)
    vrat_radek: function(id)
    {
        return this.lookUp[id];
    },


    // podtrhne v labelech accesskey (pokud je pro label definovan)
    podtrhni_hot_keys: function()
    {
        labely = document.getElementsByTagName("label");
        for (i = 0; i < labely.length; i++) {
            aktualniLabel = labely[i];
            znak = aktualniLabel.accessKey;
            nazev = '';
            if (aktualniLabel.childNodes.length) {
                nazev = aktualniLabel.childNodes[0].data;
            }
            // pokud se text nasel, pokracujme...
            if (nazev && znak) {
                // prevedeme retezce na upper case
                tmpNazev = nazev.toUpperCase();
                tmpZnak = znak.toUpperCase();
                // pokusime se nalezt pozici tmpZnaku v tmpNazvu
                poziceZnaku = tmpNazev.indexOf(tmpZnak);
                if (poziceZnaku != -1) {
                    // pozice se nasla
                    znak = nazev.charAt(poziceZnaku);
                    if (poziceZnaku == 0) {
                        // znak lezi na zacatku slova
                        nazevCast1 = '';
                        nazevCast2 = nazev.substring(poziceZnaku + 1);
                    }
                    else if (poziceZnaku == (nazev.length - 1)) {
                        // znak lezi na konci slova
                        nazevCast1 = nazev.substring(0,poziceZnaku);
                        nazevCast2 = '';
                    }
                    else {
                        // znak lezi nekde uvnitr slova
                        nazevCast1 = nazev.substring(0,poziceZnaku);
                        nazevCast2 = nazev.substring(poziceZnaku + 1);
                    }

                    // odstraneni potomku labelu (vseho co label ohranicuje)
                    for (ii = 0; ii < aktualniLabel.childNodes.length; ii++) {
                        aktualniLabel.removeChild(aktualniLabel.childNodes[ii]);
                    }

                    // vytvoreni podtrzeneho pismenka
                    podtrzeni = document.createElement("span");
                    cls.add(podtrzeni, "hotkey");
                    podtrzeni.appendChild(document.createTextNode(znak));
                    
                    // fiknuti novych elementu do dokumentu
                    aktualniLabel.appendChild(document.createTextNode(nazevCast1));
                    aktualniLabel.appendChild(podtrzeni);
                    aktualniLabel.appendChild(document.createTextNode(nazevCast2));
                }
            }
        }
    },

    
    // pomucka: hromadna odstraneni stylu u vice elementu najednou
    // (prvni argument je jmeno stylu, dalsi argumenty jsou nazvy elementu)
    cls_remove: function(styl)
    {
        if ((arguments.length > 1) && (styl)) {
            for (var i = 1; i < arguments.length; i++) {
                _el = this.get(arguments[i]);
                elLabel = this.vrat_radek(arguments[i]);
                if (_el) {
                    cls.remove(elLabel, styl);
                }
            }
        }
    },


    // pomucka: hromadne pridani stylu u vice elementu najednou
    // (prvni atrgument je jmeno stylu, dalsi argumenty jsou nazvy elementu)
    cls_add: function(styl)
    {
        if ((arguments.length > 1) && (styl)) {
            for (var i = 1; i < arguments.length; i++) {
                _el = this.get(arguments[i]);
                elLabel = this.vrat_radek(arguments[i]);
                if (_el) {
                    cls.add(elLabel, styl);
                }
            }
        }
    },

    // vrati boolean podle toho, jestli jsou prveky prazdne
    // (facha pro input (typu text urcite, u ostatnich nevim) a select elementy)
    is_empty: function()
    {
        out = true;
        if (arguments.length > 0) {
            for (var i = 0; i < arguments.length; i++) {
                if ((typeof(arguments[i]) == 'string') && arguments[i]) {
                    _el = this.get(arguments[i]);
                    if (_el) {
                        if (_el.tagName.toLowerCase() == 'input') {
                            if (_el.value) {
                                out = false;
                                break;
                            }
                        }
                        else if (_el.tagName.toLowerCase() == 'select') {
                            if ((_el.value != '__void__') && (_el.value)) {
                                out = false;
                                break;
                            }
                        }
                    }
                }
            }
        }
        return out;
    },



    // pomucka: hromadne nastaveni udalosti na zadany element
    // name = jmeno elementu, fce = obsluzna fce, dalsi argumenty udalosti (stringy)
    evt_add: function(name, fce)
    {
        _el = this.get(name);
        if (_el && (arguments.length > 2) && fce) {
            for (var i = 2; i < arguments.length; i++) {
                evt.add(_el, arguments[i], fce);
            }
        }
    },


    // uchova ve vnitrnim poli oldValues hodnoty prvku, zadanych pres argumenty
    // (argumenty stringy, nazvy prvku)
    uchovej: function()
    {
        if (arguments.length > 0) {
            this.oldValues = Array();
            for (var i = 0; i < arguments.length; i++) {
                _el = this.get(arguments[i]);
                if (_el) {
                    this.oldValues[arguments[i]] = _el.value;
                }
            }
        }
    },


    // porovna aktualni hodnoty zadanych prvku (zjistene pres getElementById) 
    // s hodnotami v internim poli oldValues
    // (argumenty jsou stringy, nazvy prvku; vraci boolean)
    srovnej_aktualni_a_stare: function()
    {
        output = true;
        if (arguments.length > 0) {
            for (var i = 0; i < arguments.length; i++) {
                if (this.oldValues[arguments[i]] !== undefined) {
                    _el = this.get(arguments[i]);
                    if (_el) {
                        if (_el.value != this.oldValues[arguments[i]]) {
                            output = false;
                            break;
                        }
                    }
                }
            }
        }
        return output;
    },


    // xxxx
    srovnej_hodnotu_a_stare: function(name, value)
    {
        if (this.oldValues[name] !== undefined) {
            return (value == this.oldValues[name]);
        }
        return false;
    },

    
    // xxxxx
    enable_disable: function(stav)
    {
        if (arguments.length > 1) {
            for (var i = 1; i < arguments.length; i++) {
                _el = this.get(arguments[i]);
                if (_el) {
                    _el.disabled = stav;
                    if (stav) {
                        _el.value = "";
                    }
                }
            }
        }
    },


    // xxxxx
    enable_disable2: function(stav, styl)
    {
        if (arguments.length > 2) {
            for (var i = 2; i < arguments.length; i++) {
                _el = this.get(arguments[i]);
                if (_el) {
                    _el.disabled = stav;
                }
                _elRow = this.vrat_radek(arguments[i]);
                if (_elRow) {
                    if (stav) {
                        cls.add(_elRow, styl);
                    }
                    else {
                        cls.remove(_elRow, styl);
                    }
                }
            }
        }
    }
}

// vim: set et ts=4 sw=4 enc=utf-8: 
// vim: set penc=utf-8 popt=paper\:A4,duplex\:off,collate\:n,number\:y,left\:4pc,right\:4pc: 
// ha > jmeno_souboru.ps
