# Internetový obchod nejen s hrami / katalog (většina zobrazovaných informací o zboží, včetně ceníků)
# Copyright © 2007-2025 Dan Zeman <zeman@ufal.mff.cuni.cz>
# Licence: GNU GPL
# 3.3.2012: začíná přestavba, na jejímž konci by obchod měl mít několik oddělení, hry budou jedno z nich
# 9.4.2015: stěhování na new.kub.cz

package katalog;
use utf8;
use Encode;
use dzsql;
use mysql;
use csort;
use pomoc;

#------------------------------------------------------------------------------
# Sestaví seznam her na prodej.
#------------------------------------------------------------------------------
sub seznam_her
{
    my $databaze = shift;
    my $html;
    # Získat z databáze seznam názvů her a jejich kódů.
    # Propojit s tabulkou "prodej", aby se seznam her omezil na hry, které se dají koupit.
    # Nepoužijeme funkci dzsql::dotaz(), protože rovnou v průběhu načítání her budeme vyrábět jejich třídící hodnoty.
    my $dotaz = "SELECT kod, hry.nazev, hry.nazev_na_ceskem_trhu FROM hry INNER JOIN prodej ON hry.kod = prodej.kod_hry GROUP BY kod, hry.nazev";
    my $dtzobj = $databaze->prepare($dotaz);
    $dtzobj->execute();
    # Nejdříve načíst, potom si je sami seřadíme podle české abecedy algoritmem,
    # kterému můžeme důvěřovat.
    my @hry;
    my $mess='';
    while(@row = $dtzobj->fetchrow_array())
    {
        my ($kod, $nazev, $nazev_cs) = map{decode("utf8", $_)}(@row);
        my %zaznam =
         (
             "kod"   => $kod,
             "nazev" => $nazev,
             "trid"  => csort::zjistit_tridici_hodnoty($nazev, "cs")
         );
       push(@hry, \%zaznam);
        # Jestliže se na českém trhu používá odlišný název, zařadit ho do seznamu také.
        if($nazev_cs && $nazev_cs ne $nazev)
        {
            my %zaznam =
            (
                "kod"   => $kod,
                "nazev" => $nazev_cs,
                "trid"  => csort::zjistit_tridici_hodnoty($nazev_cs, "cs")
            );
            push(@hry, \%zaznam);
        }
    }
    $dtzobj->finish();
    # Seřadit seznam her podle názvů her podle české abecedy.
    @hry = sort{$a->{trid} cmp $b->{trid}}(@hry);
    # Projít seřazený seznam a vypsat odkazy na hry.
    my $n = scalar(@hry);
    $html .= "<h3>V&nbsp;nabídce máme těchto $n her:</h3>\n";
    my $odkazy = join(" \x{203B} ", map {odkazpar($_->{nazev}, 'pohled=hra', "hra=$_->{kod}")} (@hry));
    $html .= "<p>$odkazy</p>\n";
    return $html;
}



#------------------------------------------------------------------------------
# Vytáhne z databáze seznam her a zboží.
#------------------------------------------------------------------------------
sub dbzbozi
{
    my $databaze = shift;
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    # Získat z databáze údaje o hrách.
    my $tabulka;
    my @nazvy;
    if($odd eq 'hry')
    {
        $tabulka = 'zbozi INNER JOIN hry ON hry.kod=zbozi.kod_hry';
        @nazvy = qw(kod_hry zbozi.kod hry.kod zbozi.nazev prodejni_cena bezna_cena cena_na_akci nelze_koupit slozka_hrejsi novinka omezeny_pocet sleva popis_zbozi zbozi.poznamka lokalizace paluba cerny_most deti zbozi.rodina experti mejdan logicka postreh vedomostni karetni pro_2 rozsireni pocet_hracu min_delka max_delka min_vek upoutavka);
    }
    else
    {
        $tabulka = 'zbozi INNER JOIN skupiny ON skupiny.kod=zbozi.kod_skupiny';
        @nazvy = qw(kod_skupiny zbozi.kod skupiny.kod zbozi.nazev prodejni_cena bezna_cena cena_na_akci nelze_koupit slozka_hrejsi novinka omezeny_pocet sleva popis_zbozi zbozi.poznamka lokalizace paluba cerny_most deti zbozi.rodina experti mejdan logicka postreh vedomostni karetni pro_2 rozsireni);
    }
    my $zbozi = dzsql::dotaz($databaze, @nazvy, "$tabulka ORDER BY zbozi.nazev");
    return $zbozi;
}



#------------------------------------------------------------------------------
# Získá z databáze údaje o hře. Nezabývá se údaji specifickými pro konkrétní
# druh zboží (např. u hry Carcassonne zjistí doporučený minimální věk, ale
# nezjišťuje prodejní ceny základní hry a jednotlivých rozšíření).
#------------------------------------------------------------------------------
sub zjistit_udaje_o_hre
{
    my $databaze = shift;
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $hra = shift; # kód hry
    # Získat z databáze údaje o hře.
    my $tabulka;
    my @nazvy;
    if($odd eq 'hry')
    {
        $tabulka = 'hry';
        @nazvy = ('nazev', 'nazev_na_ceskem_trhu', 'upoutavka', 'pocet_hracu', 'min_vek', 'min_delka', 'max_delka', 'slozka_hrejsi', 'htmltext', 'htmllink', 'htmlvlink', 'htmlalink');
    }
    else
    {
        $tabulka = 'skupiny';
        @nazvy = ('nazev', 'nazev_na_ceskem_trhu', 'slozka_hrejsi', 'htmltext', 'htmllink', 'htmlvlink', 'htmlalink');
    }
    my $hry = dzsql::dotaz($databaze, @nazvy, "$tabulka WHERE kod = ".dzsql::ap($hra));
    # Nepokračovat, jestliže jsme z databáze k danému kódu hry nedostali žádný záznam.
    return if(scalar(@{$hry})<1);
    $hry->[0]{kod} = $hra;
    my %zaznam = %{$hry->[0]};
    # Název na českém trhu je pro nás hlavní, takže zajistit, aby byl vždy vyplněn.
    unless($zaznam{nazev_na_ceskem_trhu})
    {
        $zaznam{nazev_na_ceskem_trhu} = $zaznam{nazev};
    }
    # Druhým dotazem získat alternativní názvy hry.
    my $dalsi_nazvy = dzsql::dotaz($databaze, 'kod_hry', 'nazev',
        "nazvy WHERE (kod_hry = ".dzsql::ap($zaznam{kod}).") AND (nazev <> ".dzsql::ap($zaznam{nazev}).")");
    my @dalsi_nazvy = map {$_->{nazev}} (@{$dalsi_nazvy});
    if(scalar(@dalsi_nazvy))
    {
        $zaznam{dalsi_nazvy} = \@dalsi_nazvy;
    }
    # Třetím dotazem získat odkazy na stránky o této hře.
    my $odkazy = dzsql::dotaz($databaze, 'hra', 'text', 'adresa',
        "odkazy WHERE (hra = ".dzsql::ap($zaznam{kod}).")");
    if(scalar(@{$odkazy}))
    {
        $zaznam{odkazy} = $odkazy;
    }
    return \%zaznam;
}



#------------------------------------------------------------------------------
# Zjistí rozšíření k danému zboží
#------------------------------------------------------------------------------
sub zjistit_rozsireni
{
    my $databaze = shift;
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $kod = shift; # kód zboží, ke kterému hledáme rozšíření
    # Pokud se nejedná o hru, nechceme hledat rozšíření (korálky nic takového asi nemají)
    if ($odd ne 'hry') {
        return '';
    }
    #my $vsechno_zbozi = dbzbozi($databaze, $odd);
    #my @zbozi = @{$vsechno_zbozi};
    my $zbozi = dzsql::dotaz($databaze, 'kod', 'kod_hry', 'nelze_koupit', 'nazev',
        'prodejni_cena', 'bezna_cena', 'cena_na_akci', 'poznamka', 'popis_zbozi', 'lokalizace',
        'cerny_most', 'paluba', 'dostupnost', 'dostupnost_poznamka', 'rozsireni',
        "zbozi WHERE (rozsireni != '0')");
    my @zbozi = @{$zbozi};
    # Vybrat zboží, které ma v kolonce rozšíření kód našeho zboží a lze koupit.
    @zbozi = grep
    {
        ((($_->{rozsireni} =~ /^$kod$/) or ($_->{rozsireni} =~ /^$kod;/) or ($_->{rozsireni} =~ /;$kod;/) or ($_->{rozsireni} =~ /;$kod$/)) && (!$_->{nelze_koupit}))
    }
    (@zbozi);
    return @zbozi;
}



#------------------------------------------------------------------------------
# Sestaví kořenovou stránku hry.
#------------------------------------------------------------------------------
sub hra
{
    my $databaze = shift;
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $kod_hry = shift; # kód hry, jejíž stránka se má generovat
    my $kosik = shift; # aktuální obsah košíku; kvůli generování odkazů přidej/uber
    # Získat z databáze údaje o hře.
    my $hra = zjistit_udaje_o_hre($databaze, $odd, $kod_hry);
    # Získat přehled zboží souvisejícího s touto hrou.
    my ($nazev_kod_hry, $filtr);
    if($odd eq 'hry')
    {
        $nazev_kod_hry = 'kod_hry';
        $filtr = "kod_hry = '$kod_hry'";
    }
    else
    {
        $nazev_kod_hry = 'kod_skupiny AS kod_hry';
        $filtr = "kod_skupiny = '$kod_hry'";
    }
    my $zbozi = dzsql::dotaz($databaze, 'kod', $nazev_kod_hry, 'nelze_koupit', 'nazev',
        'prodejni_cena', 'bezna_cena', 'cena_na_akci', 'poznamka', 'popis_zbozi', 'lokalizace', 'novinka', 'sleva',
        'cerny_most', 'paluba', 'dostupnost', 'dostupnost_poznamka', 'rozsireni',
        'deti', 'rodina', 'experti', 'mejdan', 'logicka', 'postreh', 'vedomostni', 'karetni', 'pro_2', 'luxus',
        "zbozi WHERE ($filtr)");
    my @zbozi = @{$zbozi};
    # Vypsat informace o hře.
    my $html;
    $html .= "  <table border=0 bgcolor=white>\n";
    
    # Informace o počtu hráčů apod. jsou k dispozici u her, ale ne u zboží z ostatních oddělení.
    if($odd eq 'hry')
    {
        $html .= sestavit_radek_tabulky_o_hre_3_bunky($hra, 'hra');
    }
    # Vypsat informace o jednotlivých druzích zboží souvisejících s touto hrou.
    my $n_zbozi = 0;
    foreach my $zbozi (@zbozi)
    {
        unless($zbozi->{nelze_koupit})
        {
            $n_zbozi++;
            $zbozi->{slozka_hrejsi} = $hra->{slozka_hrejsi};
            $html .= "    <tr><td colspan=3><hr noshade /></td></tr>\n";
            $html .= sestavit_radek_tabulky_o_zbozi_3_bunky($odd, $zbozi, $kosik, 'hra', $databaze);
        }
    }
    $html .= "  </table>\n";
    # Pokud k této hře nemáme žádné zboží, napsat to (na stránku hry se můžeme dostat z vyhledávačů).
    if($n_zbozi<=0)
    {
        $html .= "  <p style='color:red; font-weight:bold'>Litujeme, ale toto zboží momentálně nemáme v&nbsp;nabídce.</p>\n";
    }
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví stránku o jednom výrobku (druhu zboží).
#------------------------------------------------------------------------------
sub zbozi
{
    my $databaze = shift;
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $kod = shift; # kód zboží, jehož stránka se má generovat
    my $kosik = shift; # aktuální obsah košíku; kvůli generování odkazů přidej/uber
    # Získat z databáze údaje o tomto druhu zboží.
    my $nazev_kod_skupiny = $odd eq 'hry' ? 'kod_hry' : 'kod_skupiny';
    my $zbozi = dzsql::dotaz($databaze, 'kod', $nazev_kod_skupiny, 'nelze_koupit', 'nazev',
        'prodejni_cena', 'bezna_cena', 'cena_na_akci', 'poznamka', 'popis_zbozi', 'lokalizace', 'novinka', 'sleva',
        'cerny_most', 'paluba', 'dostupnost', 'dostupnost_poznamka', 'rozsireni',
        'deti', 'rodina', 'experti', 'mejdan', 'logicka', 'postreh', 'vedomostni', 'karetni', 'pro_2', 'luxus',
        "zbozi WHERE (kod = '$kod')");
    my @zbozi = @{$zbozi};
    # Nepokračovat, jestliže jsme z databáze nezískali žádný záznam o zboží s takovým kódem.
    return "<p style='color:magenta'>Neznámé zboží $kod.</p>\n" if(scalar(@zbozi)<1);
    # Vygenerovat HTML s informacemi o zboží.
    my $html;
    $zbozi = $zbozi[0];
    my $hra;
    if($odd eq 'hry')
    {
        # Získat informace o hře, ke které tento druh zboží patří.
        $hra = zjistit_udaje_o_hre($databaze, $odd, $zbozi->{kod_hry});
        $zbozi->{slozka_hrejsi} = $hra->{slozka_hrejsi};
    }
    $html .= "  <table border=0 bgcolor=white>\n";
    if($odd eq 'hry')
    {
        $html .= sestavit_radek_tabulky_o_hre_3_bunky($hra, 'zbozi');
    }
    # Pokud není zboží v prodeji, napsat to (na stránku zboží se můžeme dostat z vyhledávačů)
    if($zbozi->{nelze_koupit})
    {
        $html .= "    <tr><td colspan=3><hr noshade /></td></tr>\n";
        $html .= "    <tr><td colspan=3><p style='color:red; font-weight:bold'>Litujeme, ale <em>$zbozi->{nazev}</em> momentálně nemáme v&nbsp;nabídce.</p></td></tr>\n";
    }
    # Vypsat informace o druhu zboží.
    else
    {
        $html .= "    <tr><td colspan=3><hr noshade /></td></tr>\n";
        $html .= sestavit_radek_tabulky_o_zbozi_3_bunky($odd, $zbozi, $kosik, 'zbozi', $databaze);
        # Pokud má hra rozšíření, vypsat odkaz na pohled rozsireni
        if(zjistit_rozsireni($databaze, $odd, $zbozi->{kod})) {
            $zobrazit = odkazpar("Zobrazit rozšíření k této hře", "pohled=rozsireni");
            $html .= "    <tr><td colspan=3>$zobrazit</td></tr>\n";
        }
    }
    $html .= sestavit_radek_tabulky_s_podobnym_zbozim($odd, $zbozi, $databaze, $kod);
    $html .= "  </table>\n";
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví stránku o jednom výrobku (druhu zboží) a pod ním jeho rozšíření,
# pokud nějaká jsou.
#------------------------------------------------------------------------------
sub rozsireni
{
    my $databaze = shift;
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $kod = shift; # kód zboží, jehož stránka se má generovat
    my $kosik = shift; # aktuální obsah košíku; kvůli generování odkazů přidej/uber
    # Získat z databáze údaje o tomto druhu zboží.
    my $nazev_kod_skupiny = $odd eq 'hry' ? 'kod_hry' : 'kod_skupiny';
    my $zbozi = dzsql::dotaz($databaze, 'kod', $nazev_kod_skupiny, 'nelze_koupit', 'nazev',
        'prodejni_cena', 'bezna_cena', 'cena_na_akci', 'poznamka', 'popis_zbozi', 'lokalizace', 'novinka', 'sleva',
        'cerny_most', 'paluba', 'dostupnost', 'dostupnost_poznamka', 'rozsireni',
        'deti', 'rodina', 'experti', 'mejdan', 'logicka', 'postreh', 'vedomostni', 'karetni', 'pro_2', 'luxus',
        "zbozi WHERE (kod = '$kod')");
    my @zbozi = @{$zbozi};
    # Nepokračovat, jestliže jsme z databáze nezískali žádný záznam o zboží s takovým kódem.
    return "<p style='color:magenta'>Neznámé zboží $kod.</p>\n" if(scalar(@zbozi)<1);
    # Vygenerovat HTML s informacemi o zboží.
    my $html;
    $zbozi = $zbozi[0];
    my $hra;
    if($odd eq 'hry')
    {
        # Získat informace o hře, ke které tento druh zboží patří.
        $hra = zjistit_udaje_o_hre($databaze, $odd, $zbozi->{kod_hry});
        $zbozi->{slozka_hrejsi} = $hra->{slozka_hrejsi};
    }
    $html .= "  <table border=0 bgcolor=white>\n";
    if($odd eq 'hry')
    {
        $html .= sestavit_radek_tabulky_o_hre_3_bunky($hra, 'zbozi');
    }
    # Pokud není zboží v prodeji, napsat to (na stránku zboží se můžeme dostat z vyhledávačů)
    if($zbozi->{nelze_koupit})
    {
        $html .= "    <tr><td colspan=3><hr noshade /></td></tr>\n";
        $html .= "    <tr><td colspan=3><p style='color:red; font-weight:bold'>Litujeme, ale <em>$zbozi->{nazev}</em> momentálně nemáme v&nbsp;nabídce.</p></td></tr>\n";
    }
    # Vypsat informace o jednotlivých druzích zboží souvisejících s touto hrou.
    else
    {
        $html .= "    <tr><td colspan=3><hr noshade /></td></tr>\n";
        $html .= sestavit_radek_tabulky_o_zbozi_3_bunky($odd, $zbozi, $kosik, 'zbozi', $databaze);
    }
    # Najít rozšíření ke hře a vypsat je
    my @rozsireni = zjistit_rozsireni($databaze, $odd, $kod);
    if(@rozsireni) {
        $skryt = odkazpar("Skrýt rozšíření", "pohled=zbozi");
        $html .= "    <tr><td colspan=3>$skryt</td></tr>\n";
        $html .= "    <tr><td colspan=3><hr noshade /></td></tr>\n";
        $html .= "    <tr><td colspan=3><h2 align='center' style='margin-left:0px;margin-bottom:25px;'>Rozšíření ke hře:</h2></td></tr>\n";
        foreach my $r (@rozsireni) {
            $html .= sestavit_radek_tabulky_o_zbozi_3_bunky($odd, $r, $kosik, 'zbozi', $databaze);
            $html .= "    <tr><td colspan=3><hr noshade /></td></tr>\n";
        }
    }
    # Pokud žádná nejsou, napsat to
    else {
        $zpet = odkazpar("Zpět", "pohled=zbozi");
        $html .= "    <tr><td colspan=3>$zpet</td></tr>\n";
        $html .= "    <tr><td colspan=3><hr noshade /></td></tr>\n";
        $html .= "    <tr><td colspan=3><p style='color:red; font-weight:bold'>Hra nemá žádná rozšíření</p></td></tr>\n";
    }
    $html .= "  </table>\n";
    return $html;
}



#------------------------------------------------------------------------------
# Hledá řetězec v kódu hry, názvu hry, alternativních názvech hry a názvech
# zboží. Hledá i ve hrách, které neprodáváme, aby mohl informovat, že je
# neprodáváme. Vrátí přehled výsledků hledání v HTML.
#
# 2025 provizorně znásilněno, aby to nejdříve zobrazovalo hry, které lze koupit
# a až poté ty, které nelze koupit. (Je to pouze zkopírované s drobnými úpravami)
#------------------------------------------------------------------------------
sub hledat
{
    my $databaze = shift;;
    my $retezec = shift;
    my $html;
    $html .= "<table>\n";
    # Hledat podle hlavního názvu hry.
    my $hry = mysql::dotaz($databaze, "kod", "nazev", "slozka_hrejsi", "hry WHERE nazev LIKE '%$retezec%'");
    # Hledat podle alternativních názvů hry.
    my $althry = mysql::dotaz($databaze, "kod", "hry.nazev AS nazev", "slozka_hrejsi", "hry INNER JOIN nazvy ON hry.kod = nazvy.kod_hry WHERE nazvy.nazev LIKE '%$retezec%'");
    # Přidat do her alternativní hry, které už v hrách nejsou.
    foreach my $althra (@{$althry})
    {
        unless(grep{$_->{kod} eq $althra->{kod}}(@{$hry}))
        {
            push(@{$hry}, $althra);
        }
    }
    # Nastavit způsob zvýrazňování nalezeného řetězce (musí být tady, využijeme nejen uvnitř následujícího cyklu).
    my $zvyr1 = "<span style='background:yellow'>";
    my $zvyr0 = "</span>";
    my @hry_bez_zbozi; # Sem budu dočasně házet kódy her, které nemají žádné zboží, abych si to pamatoval i pro druhou část
    foreach my $hra (@{$hry})
    {
        # Zjistit alternativní názvy hry.
        my $nazvy = mysql::dotaz($databaze, "nazev", "nazvy WHERE (kod_hry = '$hra->{kod}') AND (nazev <> '$hra->{nazev}')");
        my $dalsi_nazvy = join(", ", map{$_->{nazev}}(@{$nazvy}));
        # Zvýraznit hledaný řetězec v názvech hry.
        my $nazev = $hra->{nazev};
        $nazev =~ s/($retezec)/$zvyr1$1$zvyr0/ig;
        $dalsi_nazvy =~ s/($retezec)/$zvyr1$1$zvyr0/ig;
        # Získat seznam zboží patřícího k této hře, abychom věděli, zda ji máme v nabídce.
        my $zbozii = mysql::dotaz($databaze, "kod", "kod_hry", "nelze_koupit", "nazev", "prodejni_cena", "sleva", "cena_na_akci", "zbozi WHERE (kod_hry = '$hra->{kod}')");
        my $n_zbozi;
        foreach my $zbozi (@{$zbozii})
        {
            if(!$zbozi->{nelze_koupit})
            {
                $n_zbozi++;
                $html .= "<tr>\n";
                $html .= "<td>\n";
                # Zobrazit fotografii zboží.
                my $slozka = $hra->{slozka_hrejsi};
                my $foto = foto($slozka, $zbozi->{kod_hry}, $zbozi->{kod}, 100);
                if($foto eq '')
                {
                    $foto = foto($slozka, $zbozi->{kod_hry}, '', 100);
                }
                $html .= "$foto\n";
                $html .= "</td>\n";
                $html .= "<td>\n";
                $html .= "<br>\n" if($foto eq "");
                $html .= odkazpar($nazev, "", 'pohled=zbozi', "hra=$hra->{kod}", "zbozi=$zbozi->{kod}")."<br>\n";
                if($dalsi_nazvy ne "")
                {
                    $html .= "<b>Alternativní názvy:</b> $dalsi_nazvy<br>\n";
                }
                # Zvýraznit hledaný řetězec v názvu zboží, podobně jako jsme to už dříve udělali s názvem hry.
                my $nazev_zbozi = $zbozi->{nazev};
                $nazev_zbozi =~ s/($retezec)/$zvyr1$1$zvyr0/ig;
                $html .= "<b>Zboží:</b> <font color=blue>$nazev_zbozi</font>";
                if($zbozi->{nelze_koupit})
                {
                    $html .= "<br>\nToto zboží momentálně nemáme v&nbsp;nabídce.";
                }
                else
                {
                    $cena = $zbozi->{sleva} ? "<span color=red>".$zbozi->{cena_na_akci}."</span>" : $zbozi->{prodejni_cena};
                    $html .= "<br>\n<b>Naše cena:</b> $cena&nbsp;Kč";
                }
                $html .= "\n";
                $html .= "<br>\n<br>\n" if($foto eq "");
                $html .= "</td>\n";
                $html .= "</tr>\n";
            }
        }
        # Toto chceme vypsat až pod hrami, které zboží mají, ale chceme si uložit aspoň hry, které to teď splňují
        if($n_zbozi<=0)
        {
            push(@hry_bez_zbozi, $hra->{kod});
            # K této hře nemáme žádné zboží. Přidat obecný řádek o hře.
            #$html .= "<tr>\n";
            #$html .= "<td>\n";
            #my $slozka = $hra->{slozka_hrejsi};
            #my $foto = foto($slozka, $hra->{kod}, '', 100);
            #$html .= "$foto\n";
            #$html .= "</td>\n";
            #$html .= "<td>\n";
            #$html .= "<br>\n" if($foto eq "");
            #$html .= odkazpar($nazev, 'pohled=hra', "hra=$hra->{kod}")."<br>\n";
            #if($dalsi_nazvy ne "")
            #{
            #    $html .= "<b>Alternativní názvy:</b> $dalsi_nazvy<br>\n";
            #}
            #$html .= "Toto zboží momentálně nemáme v&nbsp;nabídce.";
            #$html .= "<br>\n<br>\n" if($foto eq '');
            #$html .= "</td>\n";
            #$html .= "</tr>\n";
        }
    }
    # Hledat podle názvů zboží. Děláme zvlášť, protože od těchto her nechceme zobrazit druhy zboží, které řetězec neobsahují.
    my $zbohry = mysql::dotaz($databaze, "hry.kod", "hry.nazev", "slozka_hrejsi", "zbozi.kod", "nelze_koupit", "zbozi.nazev", "prodejni_cena", "sleva", "cena_na_akci", "hry INNER JOIN zbozi ON hry.kod = zbozi.kod_hry WHERE zbozi.nazev LIKE '%$retezec%'");
    # Vynechat hry, které už jsme zobrazili.
    my @nove;
    foreach my $zbohra (@{$zbohry})
    {
        unless(grep{$_->{kod} eq $zbohra->{"hry.kod"}}(@{$hry}))
        {
            push(@nove, $zbohra);
        }
    }
    foreach my $zbozi (@nove)
    {
        if(!$zbozi->{nelze_koupit})
        {
            $html .= "<tr>\n";
            $html .= "<td>\n";
            # Zobrazit fotografii zboží.
            my $foto = foto($zbozi->{slozka_hrejsi}, $zbozi->{'hry.kod'}, $zbozi->{'zbozi.kod'}, 100);
            if($foto eq '')
            {
                $foto = foto($zbozi->{slozka_hrejsi}, $zbozi->{'hry.kod'}, "", 100);
            }
            $html .= "$foto\n";
            $html .= "</td>\n";
            $html .= "<td>\n";
            $html .= "<br>\n" if($foto eq "");
            $html .= odkazpar($zbozi->{"hry.nazev"}, 'pohled=zbozi', "hra=$zbozi->{\"hry.kod\"}", "zbozi=$zbozi->{\"zbozi.kod\"}")."<br>\n";
            # Zvýraznit hledaný řetězec v názvu zboží, podobně jako jsme to už dříve udělali s názvem hry.
            my $nazev_zbozi = $zbozi->{"zbozi.nazev"};
            $nazev_zbozi =~ s/($retezec)/$zvyr1$1$zvyr0/ig;
            $html .= "<b>Zboží:</b> <font color=blue>$nazev_zbozi</font>";
            if($zbozi->{nelze_koupit})
            {
                $html .= "<br>\nToto zboží momentálně nemáme v&nbsp;nabídce.";
            }
            else
            {
                $cena = $zbozi->{sleva} ? "<span color=red>".$zbozi->{cena_na_akci}."</span>" : $zbozi->{prodejni_cena};
                $html .= "<br>\n<b>Naše cena:</b> $cena&nbsp;Kč";
            }
            $html .= "\n";
            $html .= "<br>\n<br>\n" if($foto eq '');
            $html .= "</td>\n";
            $html .= "</tr>\n";
        }
    }
    
    # Teď vypsat ty, které nelze koupit
    
    foreach my $hra (@{$hry})
    {
        # Zjistit alternativní názvy hry.
        my $nazvy = mysql::dotaz($databaze, "nazev", "nazvy WHERE (kod_hry = '$hra->{kod}') AND (nazev <> '$hra->{nazev}')");
        my $dalsi_nazvy = join(", ", map{$_->{nazev}}(@{$nazvy}));
        # Zvýraznit hledaný řetězec v názvech hry.
        my $nazev = $hra->{nazev};
        $nazev =~ s/($retezec)/$zvyr1$1$zvyr0/ig;
        $dalsi_nazvy =~ s/($retezec)/$zvyr1$1$zvyr0/ig;
        # Získat seznam zboží patřícího k této hře, abychom věděli, zda ji máme v nabídce.
        my $zbozii = mysql::dotaz($databaze, "kod", "kod_hry", "nelze_koupit", "nazev", "prodejni_cena", "zbozi WHERE (kod_hry = '$hra->{kod}')");
        my $n_zbozi;
        foreach my $zbozi (@{$zbozii})
        {
            if($zbozi->{nelze_koupit})
            {
                $n_zbozi++;
                $html .= "<tr>\n";
                $html .= "<td>\n";
                # Zobrazit fotografii zboží.
                my $slozka = $hra->{slozka_hrejsi};
                my $foto = foto($slozka, $zbozi->{kod_hry}, $zbozi->{kod}, 100);
                if($foto eq '')
                {
                    $foto = foto($slozka, $zbozi->{kod_hry}, '', 100);
                }
                $html .= "$foto\n";
                $html .= "</td>\n";
                $html .= "<td>\n";
                $html .= "<br>\n" if($foto eq "");
                $html .= odkazpar($nazev, "", 'pohled=zbozi', "hra=$hra->{kod}", "zbozi=$zbozi->{kod}")."<br>\n";
                if($dalsi_nazvy ne "")
                {
                    $html .= "<b>Alternativní názvy:</b> $dalsi_nazvy<br>\n";
                }
                # Zvýraznit hledaný řetězec v názvu zboží, podobně jako jsme to už dříve udělali s názvem hry.
                my $nazev_zbozi = $zbozi->{nazev};
                $nazev_zbozi =~ s/($retezec)/$zvyr1$1$zvyr0/ig;
                $html .= "<b>Zboží:</b> <font color=blue>$nazev_zbozi</font>";
                if($zbozi->{nelze_koupit})
                {
                    $html .= "<br>\nToto zboží momentálně nemáme v&nbsp;nabídce.";
                }
                else
                {
                    $html .= "<br>\n<b>Naše cena:</b> $zbozi->{prodejni_cena}&nbsp;Kč";
                }
                $html .= "\n";
                $html .= "<br>\n<br>\n" if($foto eq "");
                $html .= "</td>\n";
                $html .= "</tr>\n";
            }
        }
        if($n_zbozi<=0 && grep(/^$hra->{kod}$/, @hry_bez_zbozi))
        {
            # K této hře nemáme žádné zboží. Přidat obecný řádek o hře.
            $html .= "<tr>\n";
            $html .= "<td>\n";
            my $slozka = $hra->{slozka_hrejsi};
            my $foto = foto($slozka, $hra->{kod}, '', 100);
            $html .= "$foto\n";
            $html .= "</td>\n";
            $html .= "<td>\n";
            $html .= "<br>\n" if($foto eq "");
            $html .= odkazpar($nazev, 'pohled=hra', "hra=$hra->{kod}")."<br>\n";
            if($dalsi_nazvy ne "")
            {
                $html .= "<b>Alternativní názvy:</b> $dalsi_nazvy<br>\n";
            }
            $html .= "Toto zboží momentálně nemáme v&nbsp;nabídce.";
            $html .= "<br>\n<br>\n" if($foto eq '');
            $html .= "</td>\n";
            $html .= "</tr>\n";
        }
    }
    foreach my $zbozi (@nove)
    {
        if($zbozi->{nelze_koupit})
        {
            $html .= "<tr>\n";
            $html .= "<td>\n";
            # Zobrazit fotografii zboží.
            my $foto = foto($zbozi->{slozka_hrejsi}, $zbozi->{'hry.kod'}, $zbozi->{'zbozi.kod'}, 100);
            if($foto eq '')
            {
                $foto = foto($zbozi->{slozka_hrejsi}, $zbozi->{'hry.kod'}, "", 100);
            }
            $html .= "$foto\n";
            $html .= "</td>\n";
            $html .= "<td>\n";
            $html .= "<br>\n" if($foto eq "");
            $html .= odkazpar($zbozi->{"hry.nazev"}, 'pohled=zbozi', "hra=$zbozi->{\"hry.kod\"}", "zbozi=$zbozi->{\"zbozi.kod\"}")."<br>\n";
            # Zvýraznit hledaný řetězec v názvu zboží, podobně jako jsme to už dříve udělali s názvem hry.
            my $nazev_zbozi = $zbozi->{"zbozi.nazev"};
            $nazev_zbozi =~ s/($retezec)/$zvyr1$1$zvyr0/ig;
            $html .= "<b>Zboží:</b> <font color=blue>$nazev_zbozi</font>";
            if($zbozi->{nelze_koupit})
            {
                $html .= "<br>\nToto zboží momentálně nemáme v&nbsp;nabídce.";
            }
            else
            {
                $html .= "<br>\n<b>Naše cena:</b> $zbozi->{prodejni_cena}&nbsp;Kč";
            }
            $html .= "\n";
            $html .= "<br>\n<br>\n" if($foto eq '');
            $html .= "</td>\n";
            $html .= "</tr>\n";
        }
    }
    $html .= "</table>\n";
    # Pokud nebylo nalezeno nic, nahradit prázdný prostor krátkou zprávou.
    if(scalar(@{$hry})<=0 && scalar(@nove)<=0)
    {
        $html .= "<p>Nebyly nalezeny žádné hry, jejichž název by obsahoval daný řetězec znaků.</p>\n";
    }
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví přehled novinek.
#------------------------------------------------------------------------------
sub novinky
{
    my $databaze = shift;
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $kosik = shift; # Pro tlačítko přidat do košíku musíme znát obsah
    my $zbozi = dbzbozi($databaze, $odd);
    # Novinky nechceme řadit podle abecedy, ale sestupně podle čísla zboží, aby se ty nejnovější novinky dostaly nahoru.
    my @zbozi = sort {$b->{'zbozi.kod'} <=> $a->{'zbozi.kod'}} @{$zbozi};
    my $html;
    $html .= "      <h1 align=center><font color=red>Novinky</font></h1>\n";
#    $html .= "      <h3 align=center><font color=red>Den dopravy zdarma - DPD a Uloženka - až do 19.11. do 19:00</font></h3>\n";
    $html .= "      <table border=0 bgcolor=white align=center>\n";
    my $prvni = 1;
    for(my $i = 0; $i<=$#zbozi; $i++)
    {
        if(($zbozi[$i]->{novinka}) && !($zbozi[$i]->{nelze_koupit}))
        {
            # Mezi dvěma řádky tabulky udělat vodorovnou čáru. Před prvním řádkem ne.
            if($prvni)
            {
                # Čáru nezobrazíme, ale prázdný řádek ano, aby text nebyl nalepený k hornímu okraji tabulky.
                $html .= "        <tr><td colspan=4></td></tr>\n";
                $prvni = 0;
            }
            else
            {
                $html .= "        <tr><td colspan=4><hr noshade /></td></tr>\n";
            }
            $html .= sestavit_radek_tabulky_o_zbozi($odd, $zbozi[$i], $kosik, 'novinky');
        }
    }
    $html .= "      </table>\n";
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví přehled her v akci.
#------------------------------------------------------------------------------
sub akce
{
    my $databaze = shift;
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $kosik = shift; # Pro tlačítko přidat do košíku musíme znát obsah
    my $zbozi = dbzbozi($databaze, $odd);
    my @zbozi = @{$zbozi};
    my $html;
    $html .= "      <h1 align=center><font color=red>Akce</font></h1>\n";
#    $html .= "      <h3 align=center><font color=red>Den dopravy zdarma - DPD a Uloženka - až do 19.11. do 19:00</font></h3>\n";
    $html .= "      <table border=0 bgcolor=white align=center>\n";
    my $prvni = 1;
    for(my $i = 0; $i<=$#zbozi; $i++)
    {
        if(($zbozi[$i]->{sleva}) && !($zbozi[$i]->{nelze_koupit}))
        {
            # Mezi dvěma řádky tabulky udělat vodorovnou čáru. Před prvním řádkem ne.
            if($prvni)
            {
                # Čáru nezobrazíme, ale prázdný řádek ano, aby text nebyl nalepený k hornímu okraji tabulky.
                $html .= "        <tr><td colspan=4></td></tr>\n";
                $prvni = 0;
            }
            else
            {
                $html .= "        <tr><td colspan=4><hr noshade /></td></tr>\n";
            }
            $html .= sestavit_radek_tabulky_o_zbozi($odd, $zbozi[$i], $kosik, 'akce');
        }
    }
    $html .= "      </table>\n";
    return $html;
}



#==============================================================================
# Řádky v tabulkách zboží
#==============================================================================



#------------------------------------------------------------------------------
# Vyrobí HTML řádek tabulky o jedné, např. v pohledu na konkrétní hru nebo druh
# zboží. Je to ten první řádek tabulky, kde jsou informace společné pro všechny
# druhy zboží od dané hry.
#------------------------------------------------------------------------------
sub sestavit_radek_tabulky_o_hre_3_bunky
{
    my $hra = shift; # odkaz na hash
    my $pohled = shift; # zajímá nás jestli jsme se sem dostali ze stránky hry nebo zboží
    my $html;
    $html .= "    <tr>\n";
    $html .= "      <td width=\"25%\" valign=\"bottom\">\n";
    # Zkontrolovat, že máme fotku hry, a pokud ano, vložit ji.
    #$html .= "        ".odkazpar(foto($hra->{slozka_hrejsi}, $hra->{kod}, '', 200), 'pohled=hra')."\n";
    #$html .= "        <br>";
    #$html .= "        ".odkazpar((($pohled eq 'hra') ? '' : 'Všechny produkty této hry'), 'pohled=hra');
    $odkaz = statpath_url()."/k/".$hra->{kod}."/fotka.".foto_format($hra->{slozka_hrejsi}, $hra->{kod}, '');
    $html .= "        <a href=$odkaz>".foto($hra->{slozka_hrejsi}, $hra->{kod}, '', 200)."</a>\n";
    $html .= "      </td>\n";
    $html .= "      <td width=\"50%\">\n";
    my $nazev = $hra->{nazev_na_ceskem_trhu} ? $hra->{nazev_na_ceskem_trhu} : $hra->{nazev};
    $html .= "        <h1 align=center style='margin-left:0px'>$nazev</h1>\n";
    # Pokud známe alternativní názvy, vypsat je.
    my $neboli;
    if(@{$hra->{dalsi_nazvy}})
    {
        $neboli = join(', ', @{$hra->{dalsi_nazvy}});
        $neboli = "        <center><small>neboli <em>$neboli</em></small></center>";
    }
    $html .= "$neboli\n";
    # Vypsat upoutávku na hru a charakteristiku hry.
    $html .= "        <br />\n";
    $html .= "        <p>$hra->{upoutavka}</p>\n";
    $html .= "      </td>\n";
    $html .= "      <td valign=\"bottom\" style=\"padding-left: 25px;\">\n";
    ###!!! Tohle by mělo být jen dočasné, než přestěhujeme všechny korálky z oddělení her tam, kam patří.
    ###!!! Ke korálkům nemáme takové údaje, jaké máme ke hrám.
    if($hra ne 'kor')
    {
        my $pocet_hracu = zjistit_pocet_hracu($hra->{pocet_hracu});
        $html .= "        <p><b>Počet hráčů:</b> $pocet_hracu\n";
        $html .= "        <br><b>Věk:</b> $hra->{min_vek}+\n";
        if($hra->{min_delka}!=0)
        {
            if($hra->{min_delka}>=60*24)
            {
                 my $dnymin = sprintf("%d", ($hra->{min_delka}/60/24)+0.5);
                 my $dnymax = sprintf("%d", ($hra->{max_delka}/60/24)+0.5);
                 $html .= sprintf("<br><b>Délka hry:</b> %s %s.\n", $dnymax==$dnymin ? $dnymax : "$dnymin - $dnymax", $dnymax==1 ? "den" : $dnymax>=2 && $dnymax<=4 ? "dny" : "dnů");
            }
            elsif($hra->{min_delka}>=100)
            {
                 my $hodmin = sprintf("%.1f", ($hra->{min_delka}/60)+0.05);
                 my $hodmax = sprintf("%.1f", ($hra->{max_delka}/60)+0.05);
                 my $delka = $hodmin == $hodmax ? "$hodmin hod\n" : "$hodmin - $hodmax hod\n";
                 $html .= "<br><b>Délka hry:</b> $delka\n";
            }
            else
            {
                my $delka = $hra->{min_delka} == $hra->{max_delka} ? "$hra->{min_delka} min\n" : "$hra->{min_delka} - $hra->{max_delka} min\n";
                $html .= "<br><b>Délka hry:</b> $delka\n";
            }
        }
        # Vypsat odkazy na stránky o této hře.
        $html .= "        <p><a href=\"hry.pl?hra=$hra->{kod}\">Více informací o hře</a><br>\n"; # Odebráno: <a href=\"http://www.deskovehry.cz/index.php/$nazev\">Informace z&nbsp;deskovehry.cz</a><br>
    }
    else
    {
        # Zkontrolovat, že máme fotku hry, a pokud ano, vložit ji.
        $html .= "        ".foto($hra->{slozka_hrejsi}, $hra->{kod}, '', 200)."\n";
    }
    foreach my $odkaz (@{$hra->{odkazy}})
    {
        my $adresa = $odkaz->{adresa};
        unless($adresa =~ m/^(\/|http:)/)
        {
            $adresa = statpath_url()."/$hra->{slozka_hrejsi}/$adresa";
        }
        $html .= "        <a href=\"$adresa\">$odkaz->{text}</a><br>\n";
    }
    $html .= "      </td>\n";
    $html .= "    </tr>\n";
    return $html;
}



#------------------------------------------------------------------------------
# Vyrobí HTML řádek tabulky o jednom zboží, např. v pohledu na konkrétní hru
# nebo druh zboží.
#------------------------------------------------------------------------------
sub sestavit_radek_tabulky_o_zbozi_3_bunky
{
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $zbozi = shift; # odkaz na hash o druhu zboží
    my $kosik = shift; # aktuální obsah košíku; kvůli generování odkazů přidej/uber
    my $pohled = shift; # zajímá nás jestli jsme se sem dostali ze stránky hry nebo zboží
    my $databaze = shift;
    my $html;
    $html .= "        <tr>\n";
    $html .= "          <td valign=\"top\">\n";
    $html .= "            <h3 align=left><b>$zbozi->{nazev}</b></h3>\n";
    # Přidat štítky se zařazením hry do vybraných kategorií
    $html .= stitky_kategorii($zbozi, '20px', 6, '');
    # Uvést cenu a srovnat ji s běžnou cenou tohoto zboží na trhu.
    if($zbozi->{sleva})
    {
        if($zbozi->{prodejni_cena} == $zbozi->{cena_na_akci})
        {
            $html .= "            <b>Trvale nízká cena: <span style='color: red;'>$zbozi->{cena_na_akci}&nbsp;Kč</span></b><br/>\n";
        }
        else
        {
            $html .= "            <b>Cena před 30 dny: <span style='text-decoration-line: line-through;'>$zbozi->{prodejni_cena}&nbsp;Kč</span></b><br/>\n";
            $sleva_prc = int(($zbozi->{prodejni_cena}-$zbozi->{cena_na_akci})/$zbozi->{prodejni_cena}*100);
            $html .= "            <b>Akční cena: <span style='color: red;'>$zbozi->{cena_na_akci}&nbsp;Kč</span> (<span style='color: red;'>-$sleva_prc%</span>)</b><br/>\n";
        }
        if($zbozi->{bezna_cena}>0)
        {
            $html .= "            Běžná cena: $zbozi->{bezna_cena}&nbsp;Kč\n";
            if($zbozi->{bezna_cena}>$zbozi->{cena_na_akci})
            {
                my $uspora_kc = $zbozi->{bezna_cena}-$zbozi->{cena_na_akci};
                my $uspora_prc = $uspora_kc/$zbozi->{bezna_cena}*100;
                if($uspora_prc>=4)
                {
                    $html .= sprintf("            <br/><span style='color:red'>(Tedy ušetříte %d&nbsp;Kč, resp. %d&nbsp;%%.)</span>\n", $uspora_kc, $uspora_prc);
                }
            }
        }
        else
        {
            $html .= "            Běžně se v&nbsp;Česku neprodává.\n";
        }
    }
    else
    {
        $html .= "            <b>Naše cena: $zbozi->{prodejni_cena}&nbsp;Kč</b><br/>\n";
        if($zbozi->{bezna_cena}>0)
        {
            $html .= "            Běžná cena: $zbozi->{bezna_cena}&nbsp;Kč\n";
            if($zbozi->{bezna_cena}>$zbozi->{prodejni_cena})
            {
                my $uspora_kc = $zbozi->{bezna_cena}-$zbozi->{prodejni_cena};
                my $uspora_prc = $uspora_kc/$zbozi->{bezna_cena}*100;
                if($uspora_prc>=4)
                {
                    $html .= sprintf("            <br/><span style='color:red'>(Tedy ušetříte %d&nbsp;Kč, resp. %d&nbsp;%%.)</span>\n", $uspora_kc, $uspora_prc);
                }
            }
        }
        else
        {
            $html .= "            Běžně se v&nbsp;Česku neprodává.\n";
        }
    }
    # Sestavit informaci o aktuální zásobě tohoto zboží na skladě.
    # Z historických důvodů je distribuční sklad v databázi veden ve sloupci "cerny_most".
    # Nyní je tento sklad samozřejmě v Jenštejně a je to náš jediný sklad.
    my $sklad = $zbozi->{cerny_most};
    my $prah = 3;
    $html .= "            <br/>\n";
    if($sklad>=$prah)
    {
        $html .= "            Skladem <b>alespoň $prah&nbsp;ks.</b> Údaje o zásobách jsou orientační!\n";
    }
    elsif($sklad>0)
    {
        $html .= "            Skladem <b>$sklad&nbsp;ks.</b> Údaje o zásobách jsou orientační!\n";
    }
    else
    {
        $html .= "            Tato položka momentálně <b>není skladem.</b>\n";
        # U zboží, které nemáme, navíc doplnit informaci, za jak dlouho ho budeme mít.
        if($zbozi->{dostupnost_poznamka})
        {
            $html .= "            <br/>Dostupnost: $zbozi->{dostupnost_poznamka}\n";
        }
        elsif($zbozi->{dostupnost}>=29)
        {
            my $m0 = int(($zbozi->{dostupnost}+1)/30);
            my $m1 = $m0+1;
            $m1 .= $m1>=5 ? ' měsíců' : ' měsíce';
            $html .= "            <br/>Dostupnost: $m0 až $m1\n";
        }
        elsif($zbozi->{dostupnost}>14)
        {
            my $t0 = int($zbozi->{dostupnost}/7);
            my $t1 = $t0+1;
            $t1 .= $t1>=5 ? ' týdnů' : ' týdny';
            $html .= "            <br/>Dostupnost: $t0 až $t1\n";
        }
        elsif($zbozi->{dostupnost}>1)
        {
            my $d = $zbozi->{dostupnost};
            $d .= $d>=5 ? ' dní' : ' dny';
            $html .= "            <br/>Dostupnost: $d\n";
        }
    }
    $html .= "          </td>\n";
    # Doplnit další poznámky o této položce.
    my @poznamky;
    my @odkazy;
    if($zbozi->{rozsireni} && $odd eq 'hry') {
        my @rozsireni = split(";", $zbozi->{rozsireni});
        my $zakladni_hry = dzsql::dotaz($databaze, 'kod', 'kod_hry', 'nazev', "zbozi WHERE (kod = ".join(" OR kod = ", @rozsireni).")");
        my @zakladni_hry = @{$zakladni_hry};
        foreach my $zakladni_hra (@zakladni_hry) {
            my $odkaz = odkazpar($zakladni_hra->{nazev}, 'pohled=zbozi', 'zbozi='.$zakladni_hra->{kod}, 'hra='.$zakladni_hra->{kod_hry});
            push(@odkazy, $odkaz);
        }
    }
    push(@poznamky, "<b style='color:red'>NELZE hrát samostatně</b>, ke hře potřebujete základní hru ".join(" či ", @odkazy).".<br/>") if(@odkazy);
    push(@poznamky, "<b>$zbozi->{poznamka}</b>") if($zbozi->{poznamka} ne '');
    push(@poznamky, $zbozi->{popis_zbozi}) if($zbozi->{popis_zbozi} ne '');
    push(@poznamky, $zbozi->{lokalizace}) if($zbozi->{lokalizace} ne '');
    # Vytvořit odkaz na košík, v němž je o 1 ks tohoto zboží víc.
    $odd = 'korálky' if($odd eq 'koralky');
    my $novy_kosik = kosik::upravit_pocet($kosik, $odd, $zbozi->{kod}, +1, 1);
    push(@poznamky, button_odkazpar("<br/><div style='display:flex; align-items:center; gap:8px;'><img src=https://obchod.hrejsi.cz/ondra_2012/grafika/kosik-add.png height=50px class=enlarge /> Přidat do košíku</div>", "", "kosik=$novy_kosik"));
    my $poznamky = join("<br/>\n            ", @poznamky);
    $html .= "          <td valign=\"top\">\n";
    $html .= "            $poznamky\n";
    $html .= "          </td>\n";
    # Vložit fotku zboží, pokud je k dispozici.
    $html .= "          <td valign=\"top\">\n";
    $odkaz = statpath_url()."/k/".$zbozi->{kod_hry}."/zbo".$zbozi->{kod_hry}.$zbozi->{kod}.".".foto_format($zbozi->{slozka_hrejsi}, $zbozi->{kod_hry}, $zbozi->{kod});
    $html .= "            <a href=$odkaz>".foto($zbozi->{slozka_hrejsi}, $zbozi->{kod_hry}, $zbozi->{kod}, 200)."</a>\n";
    $html .= "          </td>\n";
    $html .= "        </tr>\n";
    return $html;
}



#------------------------------------------------------------------------------
# Vyrobí HTML řádek tabulky, kde budou jednotlivé odkazy na zboží od stejné hry
# nebo stejné rodiny, např. v pohledu na konkrétní zboží
#                                                                      - Martin
#------------------------------------------------------------------------------
sub sestavit_radek_tabulky_s_podobnym_zbozim
{
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $zbozi = shift; # odkaz na hash o druhu zboží
    my $databaze = shift;
    my $kod = shift;
    my $vsechno_zbozi = dbzbozi($databaze, $odd);
    my @zbozi = @{$vsechno_zbozi};
    my @podobne = podobne_seznam_her($databaze, $zbozi->{kod_hry});
    my %podobne_kody;
    map{$podobne_kody{$_->{kod}}++} (@podobne) if(@podobne); # seznam kódu her, které jsou ve stejné rodině jako naše zboží
    my $hkodnazev = ($odd eq 'hry') ? 'hry.kod' : 'skupiny.kod';
    # Vybrat zboží, které má fotku a stejný kód hry jako naše zboží, nebo je ve stejné rodině.
    @zbozi = grep
    {
        $_->{fotka} = foto($_->{slozka_hrejsi}, $_->{$hkodnazev}, $_->{'zbozi.kod'}, 100);
        # Každé položce vygenerovat náhodné číslo pro řazení.
        $_->{nahod} = rand();
        # Chceme aby to mělo vyšší pravděpodobnost ukázání hry stejného kódu a ze stejné rodiny
        if(($_->{kod_hry} eq $zbozi->{kod_hry}) or ($podobne_kody{$_->{kod_hry}})){
            $_->{nahod} += rand(0.75);
            # Pokud hra nelze koupit, chceme zobrazit opravdu ty nejbližší hry jako první
            if($zbozi->{nelze_koupit})
            {
                $_->{nahod} += 100;
            }
        }
        # Pokud patří do aspoň jedné stejné kategorie, chceme zahrnout. Zároveň čím více shodných kategorií, tím více chceme zvýšit pravděpodobnost.
        my $kategorie = 0;
        if($_->{deti} && $zbozi->{deti}){
            $kategorie = 1;
            $_->{nahod} += rand(0.5);
        }
        if($_->{'zbozi.rodina'} && $zbozi->{rodina}){
            $kategorie = 1;
            $_->{nahod} += rand(0.5);
        }
        if($_->{experti} && $zbozi->{experti}){
            $kategorie = 1;
            $_->{nahod} += rand(0.5);
        }
        if($_->{mejdan} && $zbozi->{mejdan}){
            $kategorie = 1;
            $_->{nahod} += rand(0.25);
        }
        if($_->{logicka} && $zbozi->{logicka}){
            $kategorie = 1;
            $_->{nahod} += rand(0.5);
        }
        if($_->{jazykove} && $zbozi->{jazykove}){
            $kategorie = 1;
            $_->{nahod} += rand(0.5);
        }
        if($_->{postreh} && $zbozi->{postreh}){
            $kategorie = 1;
            $_->{nahod} += rand(0.75);
        }
        if($_->{vedomostni} && $zbozi->{vedomostni}){
            $kategorie = 1;
            $_->{nahod} += rand(0.5);
        }
        if($_->{karetni} && $zbozi->{karetni}){
            $kategorie = 1;
            $_->{nahod} += rand(0.25);
        }
        if($_->{pro_2} && $zbozi->{pro_2}){
            $kategorie = 1;
            $_->{nahod} += rand(0.25);
        }
        # Pokud nepatří do žádné kategorie, tak nejdřív ukázat hry stejného kódu a ze stejné rodiny, pak nějaké náhodné
        if (!($zbozi->{deti} or $zbozi->{rodina} or $zbozi->{experti} or $zbozi->{mejdan} or $zbozi->{logicka} or $zbozi->{jazykove} or $zbozi->{postreh} or $zbozi->{vedomostni} or $zbozi->{karetni} or $zbozi->{pro_2}) && !(($_->{kod_hry} eq $zbozi->{kod_hry}) or ($podobne_kody{$_->{kod_hry}}))) {
            $kategorie = 1;
        }
        (($_->{kod_hry} eq $zbozi->{kod_hry}) or ($podobne_kody{$_->{kod_hry}}) or $kategorie) && !$_->{nelze_koupit} && $_->{fotka} && ($_->{'zbozi.kod'}!=$kod)
    }
    (@zbozi);
    @zbozi = sort {$a->{nahod} <=> $b->{nahod}} (@zbozi);
    
    my $html;
    my $konec = 0;
    for(my $i = 0; $i<20 && 0<=$#zbozi; $i++)
    {
        if($i==0){
            $konec = 1;
            $html .= "    <script>\n";
            $html .= "      function leftScroll() {\n        const left = document.querySelector('.scroll-images');\n        left.scrollBy({left: -250,behavior: 'smooth',});\n      }\n";
            $html .= "      function rightScroll() {\n        const right = document.querySelector('.scroll-images');\n        right.scrollBy({left: 250,behavior: 'smooth',});\n      }\n";
            $html .= "    </script>\n";
            $html .= "    <tr><td colspan=3><hr noshade /></td></tr>\n";
            $html .= "    <tr><td colspan=3><h2>Mohlo by Vás zajímat:</h2></td></tr>\n";
            $html .= "    <tr valign=middle>\n";
            $html .= "      <td colspan=3 class='cover'>\n";
            $html .= "        <button class='left' onclick='leftScroll()'></button>\n";
            $html .= "        <div class='scroll-images'>\n";
        };
        my $akt_zbozi = pop(@zbozi);
        #$html .= "        ".odkazpar(@zbozi[$i]->{'zbozi.nazev'}, 'pohled=zbozi', "hra=".@zbozi[$i]->{kod_hry}, "zbozi=".@zbozi[$i]->{'zbozi.kod'})."\n";
        $html .= "          <span style=\"margin-left: 10px;\">\n";
        $url = statpath_url()."/k/$akt_zbozi->{kod_hry}/zbo$akt_zbozi->{kod_hry}$akt_zbozi->{'zbozi.kod'}";
        $format = foto_format($akt_zbozi->{slozka_hrejsi}, $akt_zbozi->{kod_hry}, $akt_zbozi->{'zbozi.kod'});
        $html .= "            ".odkazpar("<img src=$url.$format class='enlarge' height=150px alt=\"fotografie\">", 'pohled=zbozi', "hra=$akt_zbozi->{kod_hry}", "zbozi=$akt_zbozi->{'zbozi.kod'}")."\n";
        $html .= "          </span>\n";
    }
    if($konec){
        $html .= "        </div>";
        $html .= "        <button class='right' onclick='rightScroll()'></button>";
        $html .= "      </td>\n";
        $html .= "    </tr>\n";
    }
    return $html;
}



#------------------------------------------------------------------------------
# Vyrobí HTML řádek tabulky o jednom zboží, např. v tabulce novinek nebo akcí.
#------------------------------------------------------------------------------
sub sestavit_radek_tabulky_o_zbozi
{
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $zbozi = shift; # odkaz na hash o druhu zboží
    my $kosik = shift; # Pro tlačítko přidat do košíku musíme znát obsah
    my $cast = shift; # Abychom věděli odkud toto voláme
    my $html;
    my $hnazev = ($odd eq 'hry') ? 'hry' : 'skupiny';
    $html .= "        <tr>\n";
    # Vložit fotku zboží, pokud je k dispozici.
    $html .= "          <td valign=\"top\">\n";
    $html .= "            ".foto($zbozi->{slozka_hrejsi}, $zbozi->{$hnazev.'.kod'}, $zbozi->{'zbozi.kod'}, 100)."\n";

    $html .= "          </td>\n";
    $html .= "          <td valign=\"top\" width='20%'>\n";
    # Přidat štítky kategorií
    $html .= stitky_kategorii($zbozi, '17.5px', 2, $cast);
    $html .= "            <b>".odkazpar($zbozi->{'zbozi.nazev'}, 'pohled=zbozi', "hra=$zbozi->{'kod_'.$hnazev}", "zbozi=$zbozi->{\"zbozi.kod\"}")."</b><br/>\n";
    # Uvést cenu a srovnat ji s běžnou cenou tohoto zboží na trhu.
    if($zbozi->{sleva})
    {
        if($zbozi->{prodejni_cena} == $zbozi->{cena_na_akci})
        {
            $html .= "            <b>Trvale nízká cena: <span style='color: red;'>$zbozi->{cena_na_akci}&nbsp;Kč</span></b><br/>\n";
        }
        else
        {
            $html .= "            Cena před 30 dny: <span style='text-decoration-line: line-through;'>$zbozi->{prodejni_cena}&nbsp;Kč</span><br/>\n";
            $sleva_prc = int(($zbozi->{prodejni_cena}-$zbozi->{cena_na_akci})/$zbozi->{prodejni_cena}*100);
            $html .= "            <b>Akční cena: <span style='color: red;'>$zbozi->{cena_na_akci}&nbsp;Kč</span></b> (<span style='color: red;'>-$sleva_prc%</span>)<br/>\n";
        }
        if($zbozi->{bezna_cena}>0)
        {
            $html .= "            Běžná cena: $zbozi->{bezna_cena}&nbsp;Kč\n";
        }
        else
        {
            $html .= "            Běžně se v&nbsp;Česku neprodává.\n";
        }
    }
    else
    {
        $html .= "            <b>Naše cena: $zbozi->{prodejni_cena}&nbsp;Kč</b><br/>\n";
        if($zbozi->{bezna_cena}>0)
        {
            $html .= "            Běžná cena: $zbozi->{bezna_cena}&nbsp;Kč\n";
            if($zbozi->{bezna_cena}>$zbozi->{prodejni_cena})
            {
                my $uspora_kc = $zbozi->{bezna_cena}-$zbozi->{prodejni_cena};
                my $uspora_prc = $uspora_kc/$zbozi->{bezna_cena}*100;
                if($uspora_prc>=4)
                {
                    $html .= sprintf("            <br/>(ušetříte %d&nbsp;%%)\n", $uspora_prc);
                }
            }
        }
        else
        {
            $html .= "            Běžně se v&nbsp;Česku neprodává.\n";
        }
    }
    $html .= "          </td>\n";
    # Sestavit informaci o aktuální zásobě tohoto zboží na skladě.
    # Z historických důvodů je distribuční sklad v databázi veden ve sloupci "cerny_most".
    # Nyní je tento sklad samozřejmě v Jenštejně a je to náš jediný sklad.
    my $sklad = $zbozi->{cerny_most};
    my $prah = 2;
    $html .= "          <td valign=\"top\">\n";
    if($sklad>=$prah)
    {
        $html .= "            Skladem <b>alespoň $prah&nbsp;ks.</b>\n";
    }
    elsif($sklad>0)
    {
        $html .= "            Skladem <b>$sklad&nbsp;ks.</b>\n";
    }
    else
    {
        $html .= "            Tato položka momentálně <b>není skladem,</b> ale rádi ji pro vás doobjednáme.\n";
    }
    my $novy_kosik = kosik::upravit_pocet($kosik, $odd, $zbozi->{'zbozi.kod'}, +1, 1);
    $html .= button_odkazpar("<br/><br/><img src=https://obchod.hrejsi.cz/ondra_2012/grafika/kosik-add.png height=40px class=enlarge />", "", "kosik=$novy_kosik");
    $html .= "          </td>\n";
    # Přidat info o počtu hráčů, délky hry a min věku
    $html .= "          <td valign=\"top\">\n";
    $html .= "            <table class=\"zbozi_info\"><tr>\n";
    my $pocet_hracu = zjistit_pocet_hracu($zbozi->{pocet_hracu});
    $html .= "              <td><img src=https://obchod.hrejsi.cz/ondra_2012/grafika/players.png height=30px></td>\n" if($pocet_hracu);
    $html .= "              <td valign=\"center\">$pocet_hracu</td>\n" if($pocet_hracu);
    my $delka;
    if($zbozi->{min_delka}!=0)
    {
        if($zbozi->{min_delka}>=60*24)
        {
             my $dnymin = sprintf("%d", ($zbozi->{min_delka}/60/24)+0.5);
             my $dnymax = sprintf("%d", ($zbozi->{max_delka}/60/24)+0.5);
             $delka = sprintf("%s %s.\n", $dnymax==$dnymin ? $dnymax : "$dnymin - $dnymax", $dnymax==1 ? "den" : $dnymax>=2 && $dnymax<=4 ? "dny" : "dnů");
        }
        elsif($zbozi->{min_delka}>=100)
        {
             my $hodmin = sprintf("%.1f", ($zbozi->{min_delka}/60)+0.05);
             my $hodmax = sprintf("%.1f", ($zbozi->{max_delka}/60)+0.05);
             $delka = $hodmin == $hodmax ? "$hodmin hod\n" : "$hodmin - $hodmax hod\n";
        }
        else
        {
            $delka = $zbozi->{min_delka} == $zbozi->{max_delka} ? "$zbozi->{min_delka} min\n" : "$zbozi->{min_delka} - $zbozi->{max_delka} min\n";
        }
    }
    $html .= "              <td><img src=https://obchod.hrejsi.cz/ondra_2012/grafika/time.png height=30px></td>\n" if($delka);
    $html .= "              <td valign=\"center\">$delka</td>\n" if($delka);
    $html .= "              <td><img src=https://obchod.hrejsi.cz/ondra_2012/grafika/age.png height=30px></td>\n" if($zbozi->{min_vek});
    $html .= "              <td valign=\"center\">$zbozi->{min_vek}+</td>\n" if($zbozi->{min_vek});
    $html .= "            </tr></table>\n";
    $html .= "            <br/>\n";
    # Doplnit další poznámky o této položce.
    my @poznamky;
    push(@poznamky, "<b>$zbozi->{'zbozi.poznamka'}</b>") if($zbozi->{'zbozi.poznamka'} ne '');
    push(@poznamky, "<div class='zbozi_popis'><p>$zbozi->{upoutavka}</p></div>") if($zbozi->{upoutavka} ne '');
    push(@poznamky, $zbozi->{popis_zbozi}) if($zbozi->{popis_zbozi} ne '');
    #push(@poznamky, $zbozi->{lokalizace}) if($zbozi->{lokalizace} ne '');
    my $poznamky = join("<br/>\n            ", @poznamky);
    $html .= "            $poznamky\n";
    $html .= "          </td>\n";
    $html .= "        </tr>\n";
    return $html;
}



#------------------------------------------------------------------------------
# Vyrobí HTML štítků kategorií
#------------------------------------------------------------------------------
sub stitky_kategorii {
    my $zbozi = shift;
    my $height = shift;
    my $max_pocet = shift; # Někde se nám nevejdou všechny, tak dát jen prvních několik
    my $bez = shift; # Tam kde např. zobrazuji všechny novinky, nechci u každé psát, že je to novinka
    my $html = "";
    my $odsazeni = 0;
    my $base_url = "https://obchod.hrejsi.cz/ondra_2012/grafika/stitky/";
    if ($zbozi->{luxus} and $odsazeni < $max_pocet and $bez ne 'luxus') {
        my $url = $base_url . "doporucujeme.png";
        $html .= "            <img src=\"$url\" align=\"left\" height=\"$height\">\n";
        $odsazeni++;
    }
    if ($zbozi->{sleva} and $odsazeni < $max_pocet and $bez ne 'akce') {
        my $url = $base_url . "akce.png";
        my $odkaz = odkazpar("<img src=\"$url\" align=\"left\" height=\"$height\" class=\"enlarge\">", 'pohled=akce');
        $html .= "            $odkaz\n";
        $odsazeni++;
    }
    if ($zbozi->{novinka} and $odsazeni < $max_pocet and $bez ne 'novinky') {
        my $url = $base_url . "novinka.png";
        my $odkaz = odkazpar("<img src=\"$url\" align=\"left\" height=\"$height\" class=\"enlarge\">", 'pohled=novinky');
        $html .= "            $odkaz\n";
        $odsazeni++;
    }
    if ($zbozi->{deti} and $odsazeni < $max_pocet and $bez ne 'deti') {
        my $url = $base_url . "deti.png";
        $html .= "            <img src=\"$url\" align=\"left\" height=\"$height\">\n";
        $odsazeni++;
    }
    if (($zbozi->{rodina} or $zbozi->{'zbozi.rodina'}) and $odsazeni < $max_pocet and $bez ne 'rodina') {
        my $url = $base_url . "rodina.png";
        $html .= "            <img src=\"$url\" align=\"left\" height=\"$height\">\n";
        $odsazeni++;
    }
    if ($zbozi->{mejdan} and $odsazeni < $max_pocet and $bez ne 'party') {
        my $url = $base_url . "party.png";
        $html .= "            <img src=\"$url\" align=\"left\" height=\"$height\">\n";
        $odsazeni++;
    }
    if ($odsazeni) {
        $html .= "            <br><br>\n";
    }
    return $html;
}




#==============================================================================
# Miniseznamy do pravého sloupce
#==============================================================================


#------------------------------------------------------------------------------
# Sestaví přehled her v akci - slevy - ve zmenšené formě pro tisk na okraj.
#------------------------------------------------------------------------------
sub akce_mini
{
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $zbozi = shift;
    my $n = shift; $n = 2 unless(defined($n));
    my @zbozi = @{$zbozi};
    my $hkodnazev = ($odd eq 'hry') ? 'hry.kod' : 'skupiny.kod';
    # Vybrat zboží, které je v akci a má fotku.
    @zbozi = grep
    {
        $_->{fotka} = foto($_->{slozka_hrejsi}, $_->{$hkodnazev}, $_->{'zbozi.kod'}, 35);
        # Každé položce vygenerovat náhodné číslo pro řazení.
        $_->{nahod} = rand();
        $_->{sleva} && !$_->{nelze_koupit} && $_->{fotka}
    }
    (@zbozi);
    @zbozi = sort {$a->{nahod} <=> $b->{nahod}} (@zbozi);
    my $html = "      <h2 align=left><font color=red>Akce</font></h2>\n";
    $html .= sestavit_mini_vyber($odd, $n, @zbozi);
    $html .= odkazpar("<h3> ... další zboží v&nbsp;akci</h3>", 'pohled=akce', "odd=$odd");
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví vlastní přehled novinek, bez informace o akčním zboží vpravo ve zmenšené podobě.
#------------------------------------------------------------------------------
sub novinky_mini
{
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $zbozi = shift;
    my $n = shift; $n = 2 unless(defined($n));
    my @zbozi = @{$zbozi};
    my $hkodnazev = ($odd eq 'hry') ? 'hry.kod' : 'skupiny.kod';
    # Vybrat zboží, které je nové a má fotku.
    @zbozi = grep
    {
        $_->{fotka} = foto($_->{slozka_hrejsi}, $_->{$hkodnazev}, $_->{'zbozi.kod'}, 35);
        # Každé položce vygenerovat náhodné číslo pro řazení.
        $_->{nahod} = rand();
        $_->{novinka} && !$_->{nelze_koupit} && $_->{fotka}
    }
    (@zbozi);
    # Novinky určitě nechceme řadit podle abecedy.
    # Sestupně podle čísla zboží znamená, že se ty nejnovější novinky dostanou nahoru.
    # Nebo náhodně, aby se vpravo vždy vybraly jiné dvě.
    #@zbozi = sort {$b->{'zbozi.kod'} <=> $a->{'zbozi.kod'}} @{$zbozi};
    @zbozi = sort {$a->{nahod} <=> $b->{nahod}} (@zbozi);
    my $html = "      <h2 align=left><font color=red>Novinky</font></h2>\n";
    $html .= sestavit_mini_vyber($odd, $n, @zbozi);
    $html .= odkazpar("<h3> ... všechny novinky</h3>", 'pohled=novinky', "odd=$odd");
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví přehled her podobných hře X.
#------------------------------------------------------------------------------
sub podobne
{
    my $databaze = shift;
    my $hra = shift;
    my $html;
    # Zjistit, zda je daná hra členem rodiny her.
    my $odpoved = dzsql::dotaz($databaze, 'rodina', "hry WHERE kod='$hra'");
    my $rodina = $odpoved->[0]{rodina};
    # Ke hře existují podobné hry pouze v případě, že hra je členem nějaké rodiny.
    if($rodina ne '')
    {
        # Zajímají nás pouze hry, od kterých existuje alespoň jedno zboží, které lze koupit.
        my $podobne = dzsql::dotaz($databaze, "hry.kod AS kod", "hry.nazev AS nazev", "nazev_na_ceskem_trhu", "slozka_hrejsi", "hry INNER JOIN prodej ON hry.kod=prodej.kod_hry WHERE (rodina='$rodina') AND (nelze_koupit=0)");
        # Dotaz mohl vrátit jednu hru několikrát, pokud od ní existuje několik druhů zboží.
        # Vybrat každou hru jen jednou a vynechat hru, podle které jsme podobnost určovali.
        my @podobne;
        my %pridano;
        foreach my $p (@{$podobne})
        {
            unless($p->{kod} eq $hra || $pridano{$p->{kod}})
            {
                push(@podobne, $p);
                $pridano{$p->{kod}}++;
            }
        }
        # Pokud nám zbyla alespoň jedna jiná hra, vypsat.
        if(@podobne)
        {
            $html .= "<h2><font color=red>Podobné hry</font></h2>\n";
            $html .= "<table>\n";
            # Máme tady seznam her, ne druhů zboží. Proto nemůžeme využít funkci sestavit_mini_vyber(), kterou používáme pro akce a novinky.
            foreach my $p (@podobne)
            {
                my $nazev = $p->{nazev_na_ceskem_trhu} ? $p->{nazev_na_ceskem_trhu} : $p->{nazev};
                my $odkaz = odkazpar($nazev, 'pohled=hra', "hra=$p->{kod}");
                my $foto = foto($p->{slozka_hrejsi}, $p->{kod_hry}, '', 50);
                $html .= "<tr><td>$foto</td><td>$odkaz</td></tr>\n";
            }
            $html .= "</table>\n";
        }
    }
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví seznam her, které jsou ve stejné rodině jako hra X.
#                                                                      - Martin
#------------------------------------------------------------------------------
sub podobne_seznam_her
{
    my $databaze = shift;
    my $hra = shift;
    # Zjistit, zda je daná hra členem rodiny her.
    my $odpoved = dzsql::dotaz($databaze, 'rodina', "hry WHERE kod='$hra'");
    my $rodina = $odpoved->[0]{rodina};
    # Ke hře existují podobné hry pouze v případě, že hra je členem nějaké rodiny.
    if($rodina ne '')
    {
        # Zajímají nás pouze hry, od kterých existuje alespoň jedno zboží, které lze koupit.
        my $podobne = dzsql::dotaz($databaze, "hry.kod AS kod", "hry.nazev AS nazev", "nazev_na_ceskem_trhu", "slozka_hrejsi", "hry INNER JOIN prodej ON hry.kod=prodej.kod_hry WHERE (rodina='$rodina') AND (nelze_koupit=0)");
        # Dotaz mohl vrátit jednu hru několikrát, pokud od ní existuje několik druhů zboží.
        # Vybrat každou hru jen jednou a vynechat hru, podle které jsme podobnost určovali.
        my @podobne;
        my %pridano;
        foreach my $p (@{$podobne})
        {
            unless($p->{kod} eq $hra || $pridano{$p->{kod}})
            {
                push(@podobne, $p);
                $pridano{$p->{kod}}++;
            }
        }
        return @podobne;
    }
    return '';
}



#------------------------------------------------------------------------------
# Vyrobí HTML seznam (tabulku) se stručným výběrem her pro pravý sloupec. Volá
# se z funkcí akce_mini() a novinky_mini().
#------------------------------------------------------------------------------
sub sestavit_mini_vyber
{
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    # Seznam zboží už očekáváme vyfiltrovaný a seřazený tak, jak se má
    # zobrazovat. Jediné další filtrování, které provedeme zde, je, že zobrazíme
    # jen prvních N položek. (N==0 znamená bez omezení.)
    my $n = shift;
    my @zbozi = @_;
    my $hkodnazev = ($odd eq 'hry') ? 'kod_hry' : 'kod_skupiny';
    $n = scalar(@zbozi) if($n==0);
    my $html;
    $html .= "      <table>\n";
    for(my $i = 0; $i<$n && $i<=$#zbozi; $i++)
    {
        $html .= "        <tr>\n";
        $html .= "          <td>\n";
        $html .= "            $zbozi[$i]{fotka}\n";
        $html .= "          </td>\n";
        $html .= "          <td>\n";
        # Změnit mezery za neslabičnými předložkami v názvech zboží na nezalomitelné.
        my $nazev = $zbozi[$i]{'zbozi.nazev'};
        $nazev =~ s/^([KSVZ])\s+/$1&nbsp;/i;
        $nazev =~ s/\s+([ksvz])\s+/ $1&nbsp;/ig;
        $nazev =~ s/\s+-\s+/ &ndash; /g;
        $html .= "            <b>".odkazpar($nazev, 'pohled=zbozi', "hra=$zbozi[$i]{$hkodnazev}", "zbozi=$zbozi[$i]{\"zbozi.kod\"}")."</b><br/>\n";
        my $cena = $zbozi[$i]{sleva} ? $zbozi[$i]{cena_na_akci} : $zbozi[$i]{prodejni_cena};
        $html .= "            <span style='color:red; font-weight:bold;'>$cena&nbsp;Kč</span>\n";
        if($zbozi[$i]{bezna_cena}>0)
        {
            if($zbozi[$i]{bezna_cena}>$cena)
            {
                my $uspora_kc = $zbozi[$i]{bezna_cena}-$cena;
                my $uspora_prc = $uspora_kc/$zbozi[$i]{bezna_cena}*100;
                if($uspora_prc>=4)
                {
                    $html .= sprintf("            (<span style='color:red; font-weight:bold;'>&ndash;%d&nbsp;%%</b></span>)\n", $uspora_prc);
                }
            }
        }
        $html .= "          </td>\n";
        $html .= "        </tr>\n";
    }
    $html .= "      </table>\n";
    return $html;
}



#==============================================================================
# Ceníky
#==============================================================================



#------------------------------------------------------------------------------
# Zjistí z databáze ceník. Vrací tabulku, ještě ne HTML, na to jsou jiné
# funkce.
#------------------------------------------------------------------------------
sub zjistit_cenik
{
    my $databaze = shift;
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    # Získat z databáze přehled zboží.
    # Oddělení her je v samostatné databázi. U ostatních oddělení musíme zajistit, že se vybere pouze jejich zboží.
    my $zbozi;
    if($odd eq 'hry')
    {
        my @nazvy = qw(kod_hry kod nazev prodejni_cena clenska_cena bezna_cena nelze_koupit);
        $zbozi = dzsql::dotaz($databaze, @nazvy, 'zbozi ORDER BY prodejni_cena, nazev');
    }
    else
    {
        # Názvy oddělení v parametrech webové aplikace jsou bez diakritiky, ale v databázi jsou s diakritikou, takže je musíme převést.
        my %dbodd = ('koralky' => 'korálky', 'puzzle' => 'puzzle');
        my $dbodd = exists($dbodd{$odd}) ? $dbodd{$odd} : 'korálky';
        my @nazvy = ('kod_skupiny AS kod_hry', 'zbozi.kod AS kod', 'nazev', 'prodejni_cena', 'clenska_cena', 'bezna_cena', 'nelze_koupit');
        #$dzsql::debug = 1; ###!!!
        $zbozi = dzsql::dotaz($databaze, 'kod_skupiny AS kod_hry', 'zbozi.nazev AS nazev',
            'prodejni_cena', 'clenska_cena', 'bezna_cena', 'nelze_koupit',
            'zbozi LEFT JOIN skupiny ON zbozi.kod_skupiny=skupiny.kod'.
            " WHERE skupiny.oddeleni='$dbodd'".
            ' ORDER BY prodejni_cena, nazev');
        my $n = scalar(@{$zbozi});
    }
    return $zbozi;
}



#------------------------------------------------------------------------------
# Sestaví ceník.
#------------------------------------------------------------------------------
sub cenik
{
    my $databaze = shift;
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $zbozi = zjistit_cenik($databaze, $odd);
    # Seřadit zboží vzestupně podle cen.
    # (Sice jsme o totéž už požádali SQL server, jenže on to seřadí řetězcově, takže cena 1128 bude před 128.)
    my @cenik = sort{$a->{prodejni_cena} <=> $b->{prodejni_cena}}(@{$zbozi});
    my $dodacipodminky = odkazpar('dodacích podmínkách', 'odd=info', 'pohled=obecne');
    # Vypsat ceník.
    my $html = <<EOF
            <h1>Ceník</h1>
            <p>Položky jsou řazeny od nejlevnějších po nejdražší.
               Kliknutím na název se o daném zboží dozvíte více.
               Ceny poštovného najdete v&nbsp;$dodacipodminky.
            </p>
            <br/>
            <table align="center" border="1">
              <tr>
                <td align="center"><b>Název zboží</b></td>
                <td align="center"><b>Naše cena</b></td>
                <td align="center"><b>Běžná cena</b></td>
              </tr>
EOF
    ;
    foreach my $radek (@cenik)
    {
        unless($radek->{nelze_koupit})
        {
            $html .= "              <tr>\n";
            $html .= "                <td align=left>".odkazpar($radek->{nazev}, 'pohled=zbozi', "hra=$radek->{kod_hry}", "zbozi=$radek->{kod}")."</td>\n";
            $html .= "                <td align=right>$radek->{prodejni_cena}&nbsp;Kč</td>\n";
            $html .= "                <td align=right>$radek->{bezna_cena}&nbsp;Kč</td>\n";
            $html .= "              </tr>\n";
        }
    }
    $html .= <<EOF
            </table>
EOF
    ;
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví ceník pro kluby.
#------------------------------------------------------------------------------
sub klubovy_cenik
{
    my $databaze = shift;
    my $odd = shift; # kód oddělení obchodu; zajímá nás zejména, zda jde o hry, nebo o něco jiného
    my $zbozi = zjistit_cenik($databaze, $odd);
    # Pro název každého zboží získat jeho třídící hodnoty.
    foreach my $z (@{$zbozi})
    {
        $z->{_trid} = csort::zjistit_tridici_hodnoty($z->{nazev}, "cs");
    }
    # Seřadit zboží vzestupně podle abecedy.
    my @cenik = sort{$a->{_trid} cmp $b->{_trid}}(@{$zbozi});
    my $dodacipodminky = odkazpar('dodacích podmínkách', 'odd=info', 'pohled=obecne');
    # Vypsat ceník.
    my $html = <<EOF
            <h1>Klubový ceník</h1>
            <p>Tento ceník platí pro organizace pracující s&nbsp;dětmi a mládeží.
               U většiny položek jde o zhruba 10&nbsp;% slevu oproti našim cenám.
               Srovnání s&nbsp;běžnými cenami na trhu vychází ještě příznivěji.
               Ceny poštovného najdete v&nbsp;$dodacipodminky.
            </p>
            <p>Položky jsou řazeny podle abecedy.
               Kliknutím na název se o daném zboží dozvíte více.
            </p>
            <br/>
            <table align="center" border="1">
              <tr>
                <td align="center"><b>Název zboží</b></td>
                <td align="center"><b>Klubová cena</b></td>
                <td align="center">Běžná cena</td>
              </tr>
EOF
    ;
    foreach my $radek (@cenik)
    {
        unless($radek->{nelze_koupit})
        {
            $html .= "              <tr>\n";
            $html .= "                <td align=left>".odkazpar($radek->{nazev}, 'pohled=zbozi', "hra=$radek->{kod_hry}", "zbozi=$radek->{kod}")."</td>\n";
            $html .= "                <td align=right>$radek->{clenska_cena}&nbsp;Kč</td>\n";
            $html .= "                <td align=right>$radek->{bezna_cena}&nbsp;Kč</td>\n";
            $html .= "              </tr>\n";
        }
    }
    $html .= <<EOF
            </table>
EOF
    ;
    return $html;
}



#==============================================================================
# Pomocné funkce
#==============================================================================



#------------------------------------------------------------------------------
# Vrátí HTML odkaz (<img>) na fotku zboží. Pokud fotka není k dispozici, vrátí
# prázdný řetězec.
#------------------------------------------------------------------------------
sub foto
{
    my $slozka = shift; # položka slozka_hrejsi k dané hře v databázi ###!!! ZASTARALE! Tento parametr by se mel uplne vyhodit. (Ale to bychom nejdriv museli najit vsechna mista, kde se tahle funkce vola, a odstranit ho i tam.)
    my $kod_hry = shift;
    my $kod_zbozi = shift;
    my $sirka = shift; # šířka fotky do parametru width; výchozí = 100
    $sirka = 100 if($sirka eq '');
    my $odkaz;
    my $soubor;
    if($kod_hry ne '' && $kod_zbozi ne '')
    {
        $soubor = 'zbo'.$kod_hry.$kod_zbozi;
    }
    else
    {
        $soubor = 'fotka';
    }
    my $cesta_sys = statpath_sys()."/k/$kod_hry/$soubor";
    my $cesta_url = statpath_url()."/k/$kod_hry/$soubor";
    if(-f "$cesta_sys.jpg")
    {
        $odkaz = "<img src=\"$cesta_url.jpg\" width=\"$sirka\" alt=\"fotografie\">";
    }
    elsif(-f "$cesta_sys.gif")
    {
        $odkaz = "<img src=\"$cesta_url.gif\" width=\"$sirka\" alt=\"fotografie\">";
    }
    elsif(-f "$cesta_sys.png")
    {
        $odkaz = "<img src=\"$cesta_url.png\" width=\"$sirka\" alt=\"fotografie\">";
    }
    elsif(0) ###!!! DEBUG: 1
    {
        $odkaz = " Nelze nalézt fotku $cesta_sys; $cesta_url";
    }
    return $odkaz;
}



#------------------------------------------------------------------------------
# Vrátí formát fotky (jpg/png/gif), pokud existuje.
# Pokud fotka není k dispozici, vrátí prázdný řetězec.
#------------------------------------------------------------------------------
sub foto_format
{
    my $slozka = shift; # položka slozka_hrejsi k dané hře v databázi ###!!! ZASTARALE! Tento parametr by se mel uplne vyhodit. (Ale to bychom nejdriv museli najit vsechna mista, kde se tahle funkce vola, a odstranit ho i tam.)
    my $kod_hry = shift;
    my $kod_zbozi = shift;
    my $soubor;
    my $format;
    if($kod_hry ne '' && $kod_zbozi ne '')
    {
        $soubor = 'zbo'.$kod_hry.$kod_zbozi;
    }
    else
    {
        $soubor = 'fotka';
    }
    my $cesta_sys = statpath_sys()."/k/$kod_hry/$soubor";
    my $cesta_url = statpath_url()."/k/$kod_hry/$soubor";
    if(-f "$cesta_sys.jpg")
    {
        $format = "jpg";
    }
    elsif(-f "$cesta_sys.gif")
    {
        $format = "gif";
    }
    elsif(-f "$cesta_sys.png")
    {
        $format = "png";
    }
    return $format;
}



#------------------------------------------------------------------------------
# Vrátí počet hráčů v lepším formátu
#------------------------------------------------------------------------------
sub zjistit_pocet_hracu
{
    my $pocet_hracu_puvodne = shift;
    # Rozdělíme na hodnoty
    my @pocet_hracu = split(/,/, $pocet_hracu_puvodne);
    # Ořežeme stringy pouze na čísla, prázdné vyhodíme
    @pocet_hracu = map { /([-+]?\d*\.?\d+)/ ? $1 : () } @pocet_hracu;
    # Seřadíme číselně
    @pocet_hracu = sort { int($a) <=> int($b) } @pocet_hracu;
    # Projdeme
    my $last;
    my $first;
    my $vysl = '';
    foreach my $i (@pocet_hracu)
    {
        $i = int($i);
        if($last)
        {
            if($i == $last + 1)
            {
                $last++;
            }
            elsif($first == $last)
            {
                $vysl .= ", $i";
                $first = $i;
                $last = $i;
            }
            else
            {
                $vysl .= " - $last, $i";
                $first = $i;
                $last = $i;
            }
        }
        else
        {
            if($vysl)
            {
                $vysl .= ", ";
            }
            $vysl .= "$i";
            $first = $i;
            $last = $i;
        }
    }
    if($first != $last)
    {
        $vysl .= " - $last";
    }
    return $vysl;
}



1;
