$.fn.fireEvent = function(eventType) {
    return this.each(function() {
        if (document.createEvent) {
            var event = document.createEvent("HTMLEvents");
            event.initEvent(eventType, true, true);
            return !this.dispatchEvent(event);
        } else {
            var event = document.createEventObject();
            return this.fireEvent("on" + eventType, event)
        }
    });
};

//------------------------------------------------------------------- 
// metody detailního zobrazení varianty
var Det = {
    Chng: function(e) {
        // nejdříve zablokuju bublání události click
        //Srv.stob(e);
        var ectlg_id = $("#Varianty>option:selected").val();
        var Sklad = $('#SkladNo').val();

        // oprava údajů v detailu
        PageMethods.DejDalsiVariantu(ectlg_id, Sklad, this.PoNacteniVarianty, Srv.OnGetMessageFailure);

        // oprava dostupnosti na skladech, pokud tam je odpovídající záložka
        if ($("#dostupnostNaSkladech").length != 0) {
            PageMethods.DejDostupnostNaSkladech(ectlg_id, Srv.PrekreslitHTML, Srv.OnGetMessageFailure, "dostupnostNaSkladech");
        }
        return false;
    },
    PoNacteniVarianty: function(txtServer) {
        var Hodnoty = txtServer.split("|");
        // ECTLG_ID
        $('#ItemNo').val(Hodnoty[0]);
        // název
        $('#Item > h1')[0].innerHTML = Hodnoty[1];
        // Code
        $('#zboziCislo')[0].innerHTML = Hodnoty[2];

        //ADDPRP ID
        $('#AddPropID').val(Hodnoty[3]);

        //Cena
        $('#cenaDPH')[0].innerHTML = Hodnoty[4];

        //Cena bez DPH
        $('#cenaBezDPH')[0].innerHTML = Hodnoty[5];

        //obrázek
        if (Hodnoty[7] != '') {
            $('#BlowUp').attr('href', Hodnoty[8]);
        }

        //obrázek velký
        if (Hodnoty[8] != '') {
            $('#MainPicture').attr('src', Hodnoty[7]);
        }

        //Dostupnost
        $('#zboziDostupnost')[0].innerHTML = Hodnoty[9];

        // Sklad
        $('#SkladNo').val(Hodnoty[10]);
    }
};          // konec Det
//-----------------------------------------------------------------------------

// metody kontaktních údajů

//------------------------------------------------------------------------------------------------------------------------------
var Kontakt = {

    Boxy: new Object,

    NaServer: function() {
        if (this.Kontrola() == true) {
            Srv.Submt();
            return
        }
        return;
    },

    ZmenaDopravy: function() {
        var Doprava = $(':checked[name=Doprava]').val();
        $(':input[name = ordDoprava]').val(Doprava);
        return;
    },

    ZmenaSkladu: function() {
        var Parametr = $(':checked[name=Sklad]').val();
        var TypProdejny = Parametr.substr(0, 1);
        var ID_Skladu = Parametr.substr(2);

        $(':input[name = ordNovySklad]').val(ID_Skladu);

        switch (TypProdejny) {
            case "1": // normální prodejna
                // úprava platby, pouze platba v hotovosti              
                $(':input[name=Platba][value=hotovost]').removeAttr('disabled').attr("checked", "checked");
                $(':input[name=Platba][value=dobirka]').attr('disabled', 'disabled');
                $(':input[name=ordPlatba]').val('hotovost');

                // úprava způsobu dopravy
                $(':input[name=Doprava][value!="0"]').removeAttr('checked').attr('disabled', 'disabled');
                $(':input[name=Doprava][value="0"]').removeAttr('disabled').attr("checked", "checked");
                $(':input[name=ordDoprava]').val('0');
                break;

            case "3": // zásilkový sklad
                // úprava platby, pouze na dobírku 
                $(':input[name=Platba][value=dobirka]').removeAttr('disabled').attr("checked", "checked");
                $(':input[name=Platba][value=hotovost]').attr('disabled', 'disabled');
                $(':input[name=ordPlatba]').val('dobirka');

                // úprava způsobu dopravy
                $(':input[name=Doprava][value="0"]').removeAttr('checked').attr('disabled', 'disabled');
                $(':input[name=Doprava][value!="0"]').removeAttr('disabled').removeAttr("checked");
                $(':input[name=ordDoprava]').val('0');

                break;
        }

    }, // konec ZmenaSkladu


    Kontrola: function() {
        // načtu ze stránky všechny boxy a listboxy, jejichž jméno začína "ord"
        Boxy = $(":text[name^=ord],:password[name^=ord]");
        var KolikBoxu = Boxy.length;
        var reg = "";
        // proměnné pro hesla
        var JeTamHeslo = 0;
        var KontrolaHesla = "A";
        var Heslo1 = "";
        var Heslo2 = "";

        // chybové hlášení
        var Message = '';

        // cyklus přes jednotlivé objekty objednávky
        for (idx = 0; idx < KolikBoxu; idx++) {
            var BoxName = Boxy[idx].name;
            switch (BoxName) {

                case "ordDodPrijmeni":
                    if (this.testEmpty(idx, 'A')) {
                        Message += '&nbsp;&nbsp;- není vyplněné příjmení \n';
                    }
                    break;

                case "ordDodUlice":
                    if (this.testEmpty(idx, 'A')) {
                        Message += '&nbsp;&nbsp;- není vyplněná ulice \n';
                    }
                    break;

                case "ordDodPSC":
                    if (this.testEmpty(idx, 'A')) {
                        Message += '&nbsp;&nbsp;- není vyplněné PSČ \n';
                        break;
                    }
                    reg = /^\d{3} ?\d{2}$/;
                    if (!reg.test(Boxy[idx].value)) {
                        Message += '&nbsp;&nbsp;- chybně vyplněné PSČ \n';
                    }
                    break;

                case "ordDodObec":
                    if (this.testEmpty(idx, 'A')) {
                        Message += '&nbsp;&nbsp;- není vyplněné město \n';
                    }
                    break;

                case "ordDodTelefon":
                    if (this.testEmpty(idx, 'A')) {
                        Message += '&nbsp;&nbsp;- není vyplněno číslo telefonu \n';
                        break;
                    }
                    reg = /^(\+420)? ?[0-9]{3} ?[0-9]{3} ?[0-9]{3}$/;
                    if (!reg.test(Boxy[idx].value)) {
                        Message += '&nbsp;&nbsp;- chybné číslo telefonu \n';
                    }
                    break;

                case "ordEmail":
                    if (this.testEmpty(idx, 'A')) {
                        Message += '&nbsp;&nbsp;- není vyplněna mailová adresa \n';
                        break;
                    }
                    reg = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
                    if (!reg.test(Boxy[idx].value)) {
                        Message += '&nbsp;&nbsp;- chybná mailová adresa \n';
                        break;
                    }
                    break;

                case "ordHeslo":
                    JeTamHeslo++;
                    Heslo1 = Boxy[idx].value;
                    if (this.testEmpty(idx, 'A')) {
                        KontrolaHesla = "N";
                        Message += '&nbsp;&nbsp;- není vyplněno heslo \n';
                        break;
                    }

                case "ordHesloK":
                    JeTamHeslo++;
                    Heslo2 = Boxy[idx].value;
                    if (this.testEmpty(idx, 'A')) {
                        KontrolaHesla = "N";
                        Message += '&nbsp;&nbsp;- není vyplněno kontrolní heslo \n';
                        break;
                    }

                case "ordKarta":
                    if (this.testEmpty(idx, 'A')) {
                        Message += '&nbsp;&nbsp;- není vyplněno číslo karty \n';
                        break;
                    }
                case "ordCisloOb":
                    if (this.testEmpty(idx, 'A')) {
                        Message += '&nbsp;&nbsp;- není vyplněné číslo objednávky \n';
                    }
                    break;
            } // konec switche 

        } // konec cyklu

        // testování hesel, pokud tam jsou
        if ((JeTamHeslo = 2) && (KontrolaHesla == 'A')) {
            if (Heslo1 !== Heslo2) {
                Message += '&nbsp;&nbsp;- nesouhlasí heslo a kontrolní zadání hesla';
            }
        }


        var JeDoprava = $(':radio[name=Doprava]');
        if (typeof (JeDoprava[0]) !== 'undefined') {
            var Doprava = $(':checked[name=Doprava]').val();
            if (typeof (Doprava) == 'undefined') {
                Message += '&nbsp;&nbsp;- není určen způsob dopravy \n';
            }
            else {
                var Sklad = $(':checked[name=Sklad]').val();
                var TypSkladu = Sklad.substr(0, 1);
                switch (TypSkladu) {
                    case "1": // normální prodejna
                        if (Doprava !== '0') {
                            Message += '&nbsp;&nbsp;- není určen způsob dopravy \n';
                        }
                        break;

                    case "3": // zásilkový sklad
                        if (Doprava == 0) {
                            Message += '&nbsp;&nbsp;- musíte zvolit dopravce \n';
                        }
                        break;
                }
            }
        }

        // signalizace chyby
        if (Message !== '') {
            Message = 'Při kontrole byly nalezeny tyto nesrovnalosti: \n' + Message;
            Srv.MsgBox(Message, "Kontrola zadaných údajů");
            return false;
        }
        // validace prošla, zablokuji nové kliknutí
        return Srv.CheckClick('', '');
       }, // konec function Kontrola

    testEmpty: function(idx, mode) {
        // funkce testuje obsah input boxu. V případě, že je prázdný a musí být vyplněn, nastaví barvu jeho pozadí 
        // Parametry idx  - index boxu v objektu Boxy
        //           mode - pžíznak vyžadovaného obsahu ('N' - údaj není povinný, 'A' - údaj je povinný)
        //
        // Výstupní paremetr : true  - textbox je prázdný
        //                     false - textbox není prázdný 
        //
        if (Boxy[idx].value == '') {
            if (mode == 'A') {
                $(Boxy[idx]).css("background-color", "#FF8080");
                return true;
            }
        }
        else {
            // nastavi pozadí do původního stavu
            $(Boxy[idx]).removeAttr("style");
            return false;
        }
    }

};                         // konec objektu Kontakt


//------------------------------------------------------------------------------------------------------------------------------
// Metody košíku
var Basket = {

    // Zápis položky do košíku na stránce galerie
    Zapis: function(e, ectlg_id, addprop_id, mnozstvi) {
        // nejdříve zablokuju bublání události click
        Srv.stob(e);

        // ID uživatele by mělo být na serveru

        PageMethods.KosikPolozka('A', ectlg_id, addprop_id, mnozstvi, this.PoZapisuPolozky, Srv.OnGetMessageFailure);
        return false;
    },

    // Zápis položky do košíku na stránce detailu zboží
    ZapisD: function(e, mnozstvi) {
        // nejdříve zablokuju bublání události click
        Srv.stob(e);
        var ectlg_id = $('#ItemNo').val();
        var addprop_id = $('#AddPropID').val();
        // ID uživatele by mělo být na serveru
        PageMethods.KosikPolozka('A', ectlg_id, addprop_id, mnozstvi, this.PoZapisuPolozky, Srv.OnGetMessageFailure);
        return false;
    },

    NastavCenuKosiku: function(txtServer) {
      $("#kosikCena").html(txtServer);
    },

    PoZapisuPolozky: function(txtServer) {
        //Srv.PrekreslitHTML(txtServer, "kosikCena");
        $("#kosikCena").html(txtServer);
        if (txtServer != "") {

            Srv.MsgBox("Zboží bylo přidano do košíku", "Nákupní košík");
        }
        else {
            Srv.MsgBox("Zápis do košíku se nepodařil", "Nákupní košík");
        }
    },
    /*
    SmazatPolozku: function(o) {
    var IDradku = o.parentNode.id;

        $("#" + IDradku).remove();

        // spočítat součet cen zbylých položek
    var Ceny = $('td[name=Cena]');
    var Soucet = 0;
    var Kolik = Ceny.length;
    if (Kolik == 0) {
    $('td[name=Celkem]').html('0');
    }
    for (i = 0; i < Kolik; i++) {
    Soucet += parseFloat(Ceny[i].innerHTML);
    }

        $('td[name=Celkem]').html(Soucet);

        PageMethods.KosikPolozkaSmazat(IDradku, this.PoSmazaniPolozky, Srv.OnGetMessageFailure);
    return;

    }, // konec SmazatPolozku

    PoSmazaniPolozky: function(txtServer) {

        if (txtServer >= 0) {
    Srv.MsgBox("Zboží bylo smazáno z košíku", "Nákupní košík");
    }
    else {
    Srv.MsgBox("Výmaz položky se nepodařil", "Nákupní košík");
    }
    },
    */
    // změna počtu v košíku
    Zmena1: function(id, Kam) {
        var IDpoctu = "#" + id + " > td[name=Pocet]";
        var Pocet = Number($(IDpoctu).text());
        switch (Kam) {
            case 'P':
                Pocet++;
                break;

            case 'M':
                Pocet--;
                if (Pocet < 0) { Pocet = 0; }
                break;
        }

        $(IDpoctu).text(Pocet);
        return;
    },

    // změna počtu v košíku, parametr Max udává maximální přípustný počet
    Zmena2: function(id, Kam, Max) {
        var IDpoctu = "#" + id + " > td[name=Pocet]";
        var Pocet = Number($(IDpoctu).text());
        switch (Kam) {
            case 'P':
                Pocet++;
                if (Pocet > Max) { Pocet = Max; }
                break;

            case 'M':
                Pocet--;
                if (Pocet < 0) { Pocet = 0; }
                break;
        }
        $(IDpoctu).text(Pocet);
        return;
    },

    PrepKont: function() {
        //alert("Prep");
        return true;
    },


    // přepočítání košíku
    Prepocitat: function() {
        var Pocty = "";
        var Radky = $("#Kosik tr").get();
        var Kolik = Radky.length;

        $.each(Radky,
           function(index) {
               var Ide = Radky[index].id
               if (Ide != "") {
                   Pocty += Ide + '|';
                   var $TR = Radky[index];
                   Pocty += $('td[name=Pocet]', $TR).text() + '|';
               }
           }
         );

        PageMethods.KosikPrepocitat(Pocty, Srv.PrekreslitHTML, Srv.OnGetMessageFailure, "Basket");
        PageMethods.KosikCena('C', this.NastavCenuKosiku, Srv.OnGetMessageFailure);
        return;
    }


};                   // konec Basket

//------------------------------------------------------------------------------------------------------------------------------
// Metody pro další manipulaci s objednávkou
var Obj = {
    // zrušit nevykrytou objednávku
    Zrusit: function() {
        $('#Akce').val('Zrusit');
        // tady ještě musí být dotaz
        Srv.ConfirSubmit("Chcete opravdu objednávku zrušit", "Zrušení objednávky", "Ano", "Nerušit");
    },

    // potvrdit upravené množství - objednávka pro zásilkový obchod
    Upravit: function() {
        // musím načíst nové hodnoty množství u jednotlivých položek
        var Pocty = "";
        var Radky = $("#Kosik tr").get();
        var Kolik = Radky.length;

        $.each(Radky,
           function(index) {
               var Ide = Radky[index].id
               if (Ide != "") {
                   Pocty += Ide + '|';
                   var $TR = Radky[index];
                   Pocty += $('td[name=Pocet]', $TR).text() + '|';
               }
           }
         );

        $('#Akce').val('Upravit');
        $('#RetVal').val(Pocty);
        Srv.ConfirSubmit("Chcete opravdu objednávku upravit", "Úprava objednávky", "Ano", "Ne");
    },

    // potvrdit změněné množství při osobním odběru
    Potvrdit: function() {
        $('#Akce').val('Potvrdit')
        Srv.ConfirSubmit("Chcete opravdu potvrdit upravenou objednávku", "Úprava objednávky", "Ano", "Ne");
    }

};             // konec Obj



//------------------------------------------------------------------------------------------------------------------------------
// Menu katalogu zboží
var Ltree = {

    // globalní proměnné pro Ltree
    coll_all: true, // příznak, zda se má automaticky kolabovat strom na nejvyšší úrovni

    coll_part: true, // příznak, zda se má kolabovat strom na lokální úrovni

    remUz: false,  // příznak, zda se má pamatovat posloupnost uzlů rozbaleného stromu

    PosUzlu: "",  // posloupnost uzlů v otevřeném stromu (pomocná proměnná, skutečná hodnota se pamatuje v cookie PosUz)

    CurrURL: "", // URL odku se stránka volá

    // funkce zjistí, co uživatel chce, jestli mám zkolabovat část stromu, nebo ho naopak rozvinout
    // načtu si hodnotu attributu class tagu IMG, abych věděl, co vlastně budu dělat
    // pokud je třída zU, je uzel zabalený a budu ho rozbalovat
    // pokud je třída rU, je uzel rozbalený a musím ho zabalit

    DejURL: function() {
        this.CurrURL = document.URL
        // odstranění znaku # na konci URL
        var delka = this.CurrURL.length
        if (this.CurrURL.substr(delka - 1, 1) == "#") {
            this.CurrURL = this.CurrURL.substr(0, delka - 1);
        }


        // pokud tam odkaz do katalogu je (&cat=...., musí se odstranit
        var cat = this.CurrURL.indexOf("&cat=");

        if (cat != -1) {
            this.CurrURL = this.CurrURL.substr(0, cat);
        }
        this.CurrURL = this.CurrURL + "&cat=";
    },


    clps: function(o, e, aW) {
        // nejdříve zablokuju bublání události click
        this.stob(e);
        var kateg = o.id;
        // nalezení IMG za DIV s daným ID a zjištění jeho stavu
        var selImage = "#" + kateg + ' > img '; // nalezení IMG za DIV
        var selDiv = "#" + kateg + ' > div';    // nalezení vnořeného DIV
        var Mode = $(selImage).attr("class");
        var mazani = 0;

        switch (Mode) {
            case "rU":
                // změna třídy a vymazání DIV za uzlem
                $(selImage).attr("class", "zU");
                $(selDiv).remove();

                this.Cook("G");

                if (this.PosUzlu.length !== 0) {
                    // musím umazat seznam uzlů v PozUzlu od uzlu v kateg
                    mazani = this.PosUzlu.indexOf(kateg);
                    this.PosUzlu = this.PosUzlu.substring(0, mazani);
                    // ještě umažu údaj o hladině, co tam zbyl
                    mazani = this.PosUzlu.lastIndexOf(")");
                    this.PosUzlu = this.PosUzlu.substring(0, mazani + 1);
                }
                this.Cook("P");

                break;

            case "zU":
                // spuštění načítání seznamu kategorií ze serveru
                // metodě, která to bude zpracovávat musím předat informaci o kategorii a o zobrazování zboží
                var Context = aW + "#" + kateg;
                PageMethods.DejUzel(kateg, this.ZpracujUzel, this.OnGetMessageFailure, Context);
                return false;
        }
    },

    ZpracujUzel: function(txtServer, userContext, methodName) {
        if (txtServer.length > 0) {
            var aW = userContext.substring(0, 1);
            var Context = userContext.substring(2);
            //alert(userContext);
            Ltree.xclps(Context, txtServer, aW);
        }
        return;
    },

    OnGetMessageFailure: function(error, userContext, methodName) {
        alert("Chyba serveru: " + error.get_message());
    },

    //--------------------------------------    
    // funkce xclps je původní funkce clps, šlo by ji zjednodušit, protože colaps stromu se řeší ve funkci clps
    // xclps se volá jenom v případě, že strom se má rozvinout
    xclps: function(kateg, ServerText, aW) {
        //var selHere = "#" + kateg;              // nalezení DIV s daným ID
        var selImage = "#" + kateg + ' > img '; // nalezení IMG za DIV
        var selDiv = "#" + kateg + ' > div';    // nalezení vnořeného DIV
        var selA = "#" + kateg + ' > a';        // nalezení A za DIV 
        var txtServer = "";
        var Id = "";
        var Nazev = "";
        var Typ = "";
        var LastTyp = "";
        var IE = jQuery.browser.msie;
        var HTML = "";
        var mazani = 0;

        // načtu si hodnotu attributu class tagu IMG, abych věděl, co vlastně budu dělat
        // pokud je třída zU, je uzel zabalený a budu ho rozbalovat
        // pokud je třída rU, je uzel rozbalený a musím ho zabalit
        var Mode = $(selImage).attr("class");
        var Level = parseInt($(selImage).attr("lvl"));

        // příprava URL pro generování odkazů
        this.DejURL();

        switch (Mode) {
            // kolaps stromu                                   
            case "rU":
                // změna třídy a vymazání DIV za uzlem	  
                $(selImage).attr("class", "zU");
                $(selDiv).remove();
                break;

            // rozbalení stromu                                   
            case "zU":
                // načtení třídy lvl z tagu DIV, 
                // v Level je úroveň do které se bude vkládat podstrom  
                // var Level = parseInt(($(selHere).attr("class")).substr(4));

                var Kolapsuj = false;

                if (this.coll_all && Level === 0) { Kolapsuj = true; }
                if (this.coll_part && Level !== 0) { Kolapsuj = true; }
                if (Kolapsuj == true) {
                    // rozbaluje se uzel na úrovni 0", najdu si seznam všech tagů IMG,
                    // které maji nastavený class na rU a které bezprostředně následují 
                    // za DIV s třídami lvl_0 a ty postupně zavřu  
                    var sel = $('div.lvl_' + Level + '>div>img.rU');
                    var Images = $.makeArray(sel);

                    for (var i = 0; i < Images.length; i++) {
                        var Tmp = "#" + Images[i].parentNode.id;
                        // změním ikonu na mPm
                        $(Tmp + " > img").attr("class", "zU");
                        // smažu dětský DIV
                        $(Tmp + " > div").remove();
                    }

                    // dochází ke kolapsu stromu protože se rozbaluje uzel na stejné úrovni,
                    // musím odmazat posloupnost uzlů  
                    this.Cook("G");
                    if (this.PosUzlu.length !== 0) {
                        // musím umazat seznam uzlů v PozUzlu od dané úrovně
                        //var tmp = String("L(" + Level);     
                        mazani = this.PosUzlu.indexOf(String("L(" + Level));
                        if (mazani >= 0) {
                            this.PosUzlu = this.PosUzlu.substring(0, mazani);
                        }
                    }

                    // zapamatování si posloupnosti uzlů rozbaleného stromu  
                    if (Level == 0) {
                        this.PosUzlu = "L(0)" + kateg + "_";
                    }
                    else {
                        this.PosUzlu = this.PosUzlu + "L(" + Level + ")" + kateg + "_";
                    }
                    this.Cook("P");
                }


                // změna třídy obrázku a načtení skupiny ze serveru vytvoření DIV
                $(selImage).attr("class", "rU");

                LastTyp = "U";
                HTML = "";
                txtServer = ServerText;

                HTML += '<div class ="lvl_' + (Level + 1).toString() + '">';

                do {
                    // vyjmu jeden záznam a zkrátím o něj řetězec 
                    idx = txtServer.indexOf("|");
                    var tempStr = txtServer.substr(0, idx);

                    txtServer = txtServer.substr(idx + 1);

                    // mám vybraný jeden záznam, rozdělím ho a zapíšu do polí Nazev, Typ a ID
                    idx = tempStr.indexOf("#");
                    Id = tempStr.substr(0, idx);
                    tempStr = tempStr.substr(idx + 1);
                    idx = tempStr.indexOf("#");
                    Typ = tempStr.substr(0, idx);
                    tempStr = tempStr.substr(idx + 1);
                    idx = tempStr.indexOf("#");                              // doplněno ArtView
                    ArtView = tempStr.substr(0, idx);
                    Nazev = tempStr.substr(idx + 1, tempStr.length - 1);
                    // generování jednotlivých uzlů

                    // mám načten jeden uzel, teď ho vygeneruju
                    switch (Typ) {
                        // generuji položku                                   
                        case "P":
                            // nejdříve ale musím zjistit, jestli nemám generovat <br>
                            if (LastTyp == "P") { HTML += "<br>"; }
                            HTML += '<img src="img/phantom.gif" width="15" height="13" class="rP" />';
                            //HTML += this.GenAtag(Id,Nazev);   		 
                            HTML += '&nbsp;&nbsp;<a href="#" id="' + Id + '" onclick="Ltree.showArt(this,event,' + ArtView + ')">' + Nazev + "</a>";

                            break;

                        // generuji další kmenový uzel                                   
                        case "U":
                            //var OnClick = 'onclick="Ltree.clps(' + "'i" + Id + "',event,this)" + '"'; 
                            
                            var OnClick = 'onclick="Ltree.clps(this,event,' + ArtView + ')"';
                            if (ArtView == '1')
                            { OnClick = ""; }
                            
                            // počátek DIV
                            HTML += '<div id="' + Id + '" lvl="' + (Level + 1).toString() + '"' + OnClick + '>';
                            // tady bude generování obrázku
                            HTML += '<img src="img/phantom.gif" width="15" height="13" class="zU" ' +
                            'lvl="' + (Level + 1).toString() + '"/>';
                            // Href generuju podle toho, jestli je ArtView
                            if (ArtView == '1') {
                                HTML += '<a href="' + this.CurrURL + Id + '">' + Nazev + "</a>";
                            }
                            else {
                                HTML += '<a href="#" >' + Nazev + "</a>";
                            }
                            HTML += "</div>";
                            break;
                    }
                    // zapamatuji si typ naposled generovaného prvku
                    LastTyp = Typ;
                } // konec cyklu po uzlech 
                while (txtServer.length > 0);

                HTML += "</div>";

                $(HTML).insertAfter(selA);
                break;
        } // konec switche přes funkci

        // všechno jsem vykreslil, musím zjistit, jestli nemám spustit ArtView
        //if (aW != '0') {
        //    alert('Vykresluji ArtView pro ' + kateg);
        //}
    },

    // obnovení rozbaleného stromu
    restore: function() {
        // pokud se struktura stromu neukládí
        if (this.remUz !== true) {
            return;
        }
        // neexistuje cookie s uloženou strukturou, nebo struktura je prázdná 
        var strukt = $.cookie("remUz");
        if (strukt === null || strukt == "") {
            return;
        }
        //alert("Restore " + strukt);
        // v cookie je struktura uložená, mám ji načtenou v proměnné strukt
        // najdu rozbalenou položku na úrovni 0 a tu zkolabuju
        // tím dostanu menu do základního stavu 

        //najdu si seznam všech tagů IMG, které maji nastavený class na rU a které bezprostředně následují 
        // za DIV s třídami lvl_0 a ty postupně zavřu  
        var sel = $('div.lvl_0>div>img.rU');
        var Images = $.makeArray(sel);

        for (var i = 0; i < Images.length; i++) {
            var Tmp = "#" + Images[i].parentNode.id;
            // změním ikonu na zU
            $(Tmp + " > img").attr("class", "zU");
            // smažu dětský DIV
            $(Tmp + " > div").remove();
        }
        // strom je v počátečním stavu, začnu ho postupně obnovovat   
        var Uzly = strukt.split("_");
        var stareUzly = "";
        var idx = 0;
        var tmp = "";

        for (var j = 0; j < Uzly.length; j++) {
            tmp = Uzly[j]
            if (tmp !== "") {
                idx = tmp.indexOf(")");
                stareUzly += tmp.substr(idx + 1, tmp.length - 1) + "|";
            }
        }

        // mám posloupnost uzlů, zavolám server
        PageMethods.ObnovaStromu(stareUzly, this.ObnovStrom, this.OnGetMessageFailure, stareUzly);
        return false;
    },

    ObnovStrom: function(txtServer, userContext, methodName) {
        // nejdříve otestuju, jestli se vůbec něco vrátilo   
        if (txtServer.length == 0) {
            return;
        }
        // dostal jsem, zpátky strukturu, tak ji obnovím
        var Koreny = userContext.split("|");
        //alert(Koreny);
        var Uzly = txtServer.split("?");
        for (var j = 0; j < Uzly.length; j++) {
            if (Uzly[j] !== "") {
                //alert(Uzly[j]);
                Ltree.xclps(Koreny[j], Uzly[j]);
            }
        }
    },


    // manipulace s cookie remUZ
    Cook: function(mode) {

        if (this.remUz !== true) {
            this.PosUzlu = '';
            return '';
        }

        switch (mode) {
            // GET - dej hodnotu                                   
            case "G":
                this.PosUzlu = $.cookie("remUz");
                if (this.PosUzlu == null) {
                    this.PosUzlu = "";
                }
                return this.PosUzlu;
                break;

            // PUT - zapiš hodnotu                                   
            case "P":
                $.cookie("remUz", this.PosUzlu);
                //alert("PUT " + this.PosUzlu);
                break;

            // CLEAR - vymaž hodnotu                                    
            case "C":
                $.cookie("remUz", "");
                this.PosUzlu = "";
                break;
        }
    },

    // zobrazení sortimentu na konci stromu
    showArt: function(o, e, aW) {
        // nejdříve zablokuju bublání události click
        this.stob(e);
        // click na položku
        // alert(o.id);
    },

    // funkce blokuje bubbling události
    stob: function(e) {
        // zablokování bubblingu
        var IE = jQuery.browser.msie;
        if (IE) {
            e.cancelBubble = true;
        }
        else {
            e.stopPropagation();
        }
    },

    parseXML: function(val) {
        if (document.implementation && document.implementation.createDocument) {
            xmlDoc = new DOMParser().parseFromString(val, 'text/xml');
        }
        else if (window.ActiveXObject) {
            xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
            xmlDoc.loadXML(val);
        }
        else {
            //alert('Your browser can\'t handle this script');
            return null;
        }
        return xmlDoc;
    }

};                                    // konec Ltree


//------------------------------------------------------------------------------------------------------------------------------
// servisní funkce
var Srv = {
    MsgBox: function(txtMess, txtNadpis) {
        $.alerts.overlayOpacity = .25;
        $.alerts.okButton = '&nbsp;Pokračovat&nbsp;';
        jAlert(txtMess, txtNadpis);
    },

    VypisVlastnosti: function(inobj) {
        //op = window.open();
        //op.document.open('text/plain');
        str = '';
        kolik = 0;
        for (prop in inobj) {
            if (prop !== "sessionStorage") {
                temp = String(inobj[prop]);
                if (temp.indexOf("function") < 0) {
                    str += (prop + ' => ' + temp + '\n');
                    kolik++;
                    if (kolik >= 20) {
                        if (!confirm(str)) return false;
                        str = "";
                        kolik = 0;
                    }
                }
            }
        }
        if (str !== '') {
            confirm(str)
        }
    },

    ConfirSubmit: function(txtMess, txtNadpis, txtOK, txtCancel) {
        $.alerts.okButton = '&nbsp;' + txtOK + '&nbsp;';
        $.alerts.cancelButton = '&nbsp;' + txtCancel + '&nbsp;';
        jConfirm(txtMess, txtNadpis, function(answer) {
            if (answer == true) {
                // uživatel stiskl ano
                Srv.Submt();
            }
            else {
                // uživatel stiskl ne
                return false;
            }
        }
       )
    },

    // submit stránky
    Submt: function() {
        //$('#frmEShop').fireEvent('submit');
        document.forms["frmEShop"].submit();
        return true;
    },
    // kontrola, zda nervózní uživatel nekliká vícekrát na jedno tlačítko
    CheckClick: function(Message, Header) {
        var Kliknuto = $('#NoClick').val();
        if (typeof (Kliknuto) == 'undefined') {
            return true
        }

        if (Kliknuto == 0) {
            $('#NoClick').val(1);
            return true;
        }
        else {
            if (Message !== "") {
                Srv.MsgBox(Message, Header);
            }
            return false;
        }
    },

    ChangeParam: function(key, value) {
        var params = document.location.search.substr(1).split('&');
        var nasli = false;
        var search = "";
        var kolik = params.length;

        if (params !== "") {
            for (i = 0; i < kolik; i++) {
                var x = params[i].split('=');
                if (x[0] == key) {
                    nasli = true;
                    x[1] = value;
                    params[i] = x.join('=');
                }
            }
        }
        if (!nasli) {
            params[kolik] = key + "=" + value;
        }
        search = params.join("&")
        //this will reload the page, it's likely better to store this until finished
        document.location.search = search;
    },

    // změna viditelnosti
    SwitchVis: function(DivID) {
        if ($('#' + DivID).length != 0) {
            if ($('#' + DivID).css("visibility") == "hidden") {
                $('#' + DivID).css("visibility", "visible")
            }
            else {
                $('#' + DivID).css("visibility", "hidden")
            }
        }
    },

    // změna display
    SwitchDsp: function(DivID) {
        if ($('#' + DivID).length != 0) {
            if ($('#' + DivID).css("display") == "none") {
                $('#' + DivID).css("display", "block")
            }
            else {
                $('#' + DivID).css("display", "none")
            }
        }
    },

    // Hromadné nastavení chcekboxů
    SwitchChkbx: function(o) {
        var BxName = o.name;
        var NameSelector = ':checkbox[name="' + BxName + '"]';
        //var Boxy = $(NameSelector);
        //var Kolik = Boxy.length;
        var CurrBoxValue = o.value;
        var CurrBoxCheck = o.checked;

        // jsem na Vše a je odškrnuté
        if ((CurrBoxValue == '') && (CurrBoxCheck == false)) {
            return;
        }

        // jsem na Vše a to zaškrtnuté => musím odškrtnout všechny ostatní boxy
        if ((CurrBoxValue == '') && (CurrBoxCheck == true)) {
            Selector = NameSelector + '[value != ""]';
            $(Selector).attr("checked", false);
            return;
        }
        // jsem kdekoliv mimo Vše a je zaškrtnuté => musím odškrtnout Vše
        if ((CurrBoxValue !== '') && (CurrBoxCheck == true)) {
            Selector = NameSelector + '[value = ""]';
            $(Selector).attr("checked", false);
            return;
        }

        return;
    },

    // změna zaškrtnutí checkboxu při kliknutí na caption
    NastavChbox: function(identifikator) {
        var checkBox = $('#' + identifikator);
        if ($(checkBox).attr('checked')) {
            $(checkBox).attr('checked', false);
        }
        else {
            $(checkBox).attr('checked', true);
        }
    },

    OnGetMessageFailure: function(error, userContext, methodName) {
        alert("Chyba serveru: " + error.get_message());
        return;
    },

    PrekreslitHTML: function(zeServeru, userContext) {
        $("#" + userContext).replaceWith(zeServeru);
        return;
    },


    // funkce blokuje bubbling události
    stob: function(e) {
        // zablokování bubblingu
        var IE = jQuery.browser.msie;
        if (IE) {
            e.cancelBubble = true;
        }
        else {
            e.stopPropagation();
        }
    }


};                           // konec Srv


function checkValue(ID) {
    var selektor = '#' + ID;
    var checkBox = $(selektor);
    if ($(checkBox).attr('checked')) {
        $(checkBox).attr('checked', false);
    }
    else {
        $(checkBox).attr('checked', true);
    }
}
