/* ************************************************************************* *\
    
    Soubor: pageutils.js
    
    Popis:
        Různé utility pro práci se stránkou.
    
    Implementované funkce:
        zmenStyl(obj, prop, hod)            [změní styl objektu]
        zmenVisibility(obj, hod)            [změní "visibility"]
        zmenViditelnost(obj, hod)           [změní viditelnost]
        nastavViditelnost(obj, hod, typ)    [nastaví (výchozí) viditelnost]
        datumZmenyStranky()                 [vrátí datum změny stránky]
        jeStrankaZmenena(id)                [indikuje změněnu stránky]
        poznacNavstevu(id)                  [uloží datum návštěvy]
        jdiZpet(adresa)                     [vrátí se zpět (lze-li)]
        lzeJitZpet()                        [detekuje, zda lze jít zpět]
    
    Závislosti:
        basic.js
        cookies.js
    
\* ************************************************************************* */


/*  function zmenStyl(obj, prop, hod)

    Zmeni styl zadaneho objektu. Vraci hodnotu true/false podle uspechu
    operace. Soucasti operace je test, zda objekt pozadovanou vlastnost
    vubec ma.
*/

function zmenStyl(obj, prop, hod) {
    // získej objekt
    var o = vratObjekt(obj);
    // pokud objekt existuje a má styl, pokračujeme
    if (o && o.style) {
        // nastavení vlastnosti provedeme, pouze pokud je podporovaná
        eval('if (typeof(o.style.' + prop + ') != "undefined") o.style.' + prop + ' = "' + hod + '";');
        return true;
    } // if
	
    return false;
} // function


/*  function nastavViditelnost(obj, hod, typ)
    
    Nastaví výchozí viditelnost a typ "display". Používá se později pro snadné
    překlápění viditelnosti pomocí "zmenViditelnost()".
*/

function nastavViditelnost(obj, hod, typ) {
    obj = vratObjekt(obj);
    
    if (obj) {
        obj.vychoziViditelnost = typ;
        obj.aktualniViditelnost = hod;
        return true;
    } // if
    
    return false;
} // function


/*  function zmenViditelnost(obj, hod)

    Nastaví viditelnost objektu pomocí "display" či "visibility". Povolené
    hodnoty "hod" jsou "none", "hidden" a "visible" (odpovídají hodnotám
    "block" a "visibility", které lze užít).
*/

function zmenViditelnost(obj, hod) {
    obj = vratObjekt(obj);
    // vrať se, pokud nenalezeno
    if (!obj) return;
    
    if (typeof(obj.vychoziViditelnost) == 'undefined') {
        // výchozí viditelnost elementu je viditelný blok (jiné se moc neskrývají)
        obj.aktualniViditelnost = 'visible';
        obj.vychoziViditelnost = 'block';
    } // if

    if (typeof(hod) == 'undefined') {
        // chybějící argument: zvolíme inverzi hodnoty
        hod = (obj.aktualniViditelnost == 'visible') ? 'hidden' : 'visible';
    } // if
    
    if (hod == 'none') {
        // celkové skrytí pomocí "display"
        zmenStyl(obj, 'display', 'none');
    } // if
    else {
        // skrytí pouze změnou "visibility"
        zmenStyl(obj, 'visibility', hod);
        // pokud je objekt zcela skrytý, je nutné jej odkrýt
        if (obj.aktualniViditelnost == 'none') zmenStyl(obj, 'display', obj.vychoziViditelnost);
    } // else
    
    // poznamenat si viditelnost
    obj.aktualniViditelnost = hod;
} // function


/*  function zmenVisibility(obj, hod)

    Nastaví vlastnost stylu "visibility" pro objekt "obj". Hodnota je zadaná 
    logickou hodnotou (true/false) nebo přímo řetězcem.
*/

function zmenVisibility(obj, hod) {
    // pokud "hod" není string, provede se převod na možné hodnoty "visibility"
    if (typeof(hod) != 'string') hod = Boolean(hod) ? 'visible' : 'hidden';
    // a pak se dodaná/změněná hodnota použije
    return zmenStyl(obj, 'visibility', hod);
} // function


/*  function poznacNavstevu(id, expirace)

    Uloží do cookie aktuální datum; může datum parametrizovat řetězce a je možné
    zadat různou dobu expirace.
*/

function poznacNavstevu(id, expirace) {
    if ((typeof(id) != 'string') || !id.length) id = 'PosledniNavsteva';
    else id = 'PosledniNavsteva:' + id;
    // ještě vezmeme v úvahu expirační dobu
    if (typeof(expirace) != 'number') expirace = 356;
    // uložíme cookie s daným identifikátorem
    return nastavKukinu(id, new Date(), casPlusDny(expirace));
} // function


/*  function jeStrankaZmenena(id)

    Vrátí true/false, pokud stránka byla změněna oproti hodnotě v cookie.
    V případě, že cookies nejsou podporovány, vrací null.
*/

function jeStrankaZmenena(id) {
    // pokud cookies nejsou k dispozici, vrať null
    if (!jsouKukiny()) return null;
    // upravíme identifikaci, pokud je zadaná
    if ((typeof(id) != 'string') || id.length) id = 'PosledniNavsteva';
    else id = 'PosledniNavsteva-' + id;

    // jinak získáme příslušnou cookie
    var datum = vratKukinu(id);
    
    if (datum != null) {
        var posledniNavsteva = new Date(datum);
        // nutné převést lastModified na Date pro porovnání
        return (posledniNavsteva < datumZmenyStranky());
    } // if
    
    return false;
} // function


/*  function datumZmenyStranky()

    Vrátí datum změny aktuální stránky.
*/

function datumZmenyStranky() {
    return new Date(document.lastModified);
} // function


/*  function lzeJitZpet()

    Vrací "true", pokud existuje nějaká položka v historii, a "false" 
    v opačném případě.
*/
function lzeJitZpet() {
    return (window.history.length > 1) || ((navigator.userAgent.indexOf('Firefox') == -1) && (window.history.length > 0));
} // function


/*  function jdiZpet(adresa)

    Vrací "true", pokud existuje nějaká položka v historii nebo je zadaný "odkaz", 
    a "false" v opačném případě. Pokud lze jít zpět v historii, zároveň se o jednu
    položku zpět posune.
*/
function jdiZpet(adresa) {
    if (lzeJitZpet()) {
        window.history.back();
        return true;
    } // if
    
    if (typeof(adresa) != 'undefined') {
        location.assign(adresa);
        return true;
    } // if
    
    return false;
} // function
