#!/usr/bin/perl
# Internetový obchod s hrami / katalog (většina zobrazovaných informací o hrách, včetně ceníků)
# (c) 2007-2009 Dan Zeman <zeman@ufal.mff.cuni.cz>
# Licence: GNU GPL

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;
    $html .= "<h3 align=left>Seznam her na prodej:</h3>\n";
    # Přidat okénko pro vyhledávání v seznamu (včetně alternativních názvů a názvů zboží).
    $html .= "<form method=get action=\"prodej.pl\">\n";
    $html .= odsadit(formpar(), 2);
    # Vynulovat pole hra, aby se místo výsledků hledání nezobrazilo něco jiného.
    $html .= "  <input type=hidden name=hra value=\"\">\n";
    $html .= "  <input name=hledat>\n";
    $html .= "  <input type=submit value=\"Hledat\">\n";
    $html .= "</form>\n";
    $html .= "<p align=left>\n";
    # 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;
    while(my ($kod, $nazev, $nazev_cs) = map{decode("utf8", $_)}($dtzobj->fetchrow_array()))
    {
        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);
        }
    }
    # 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.
    foreach my $hra (@hry)
    {
        $html .= odkazpar($hra->{nazev}, "hra=$hra->{kod}")."<br>\n";
    }
    $html .= "</p>\n";
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví kořenovou stránku hry.
#------------------------------------------------------------------------------
sub hra
{
    my $databaze = shift;
    my $hra = shift; # kód hry, jejíž stránka se má generovat
    # Získat z databáze údaje o hře.
    my @nazvy = qw(nazev nazev_na_ceskem_trhu upoutavka pocet_hracu min_vek min_delka max_delka slozka_hrejsi htmltext htmllink htmlvlink htmlalink);
    my $nazvy = join(", ", @nazvy);
    my $dotaz = "SELECT $nazvy FROM hry WHERE kod = '$hra'";
    my $dtzobj = $databaze->prepare($dotaz);
    $dtzobj->execute();
    my @zaznam = map{decode("utf8", $_)}($dtzobj->fetchrow_array());
    my %zaznam; for(my $i = 0; $i<=$#nazvy; $i++) {$zaznam{$nazvy[$i]} = $zaznam[$i];}
    my $nazev = $zaznam{nazev_na_ceskem_trhu} ? $zaznam{nazev_na_ceskem_trhu} : $zaznam{nazev};
    my $upoutavka = $zaznam{upoutavka};
    my $pocet_hracu = $zaznam{pocet_hracu};
    my $min_vek = $zaznam{min_vek};
    my $min_delka = $zaznam{min_delka};
    my $max_delka = $zaznam{max_delka};
    my $slozka = $zaznam{slozka_hrejsi};
    my $text = $zaznam{htmltext};
    my $link = $zaznam{htmllink};
    my $vlink = $zaznam{htmlvlink};
    my $alink = $zaznam{htmlalink};
    # Druhým dotazem získat alternativní názvy hry.
    $dotaz = "SELECT kod_hry, nazev FROM nazvy WHERE (kod_hry = '$hra') AND (nazev <> '$nazev')";
    $dtzobj = $databaze->prepare($dotaz);
    $dtzobj->execute();
    my @dalsi_nazvy;
    while(my ($kod_hry, $nazev) = map{decode("utf8", $_)}($dtzobj->fetchrow_array()))
    {
        push(@dalsi_nazvy, $nazev);
    }
    my $dalsi_nazvy = join(", ", @dalsi_nazvy);
    # Třetím dotazem získat odkazy na stránky o této hře.
    $dotaz = "SELECT hra, text, adresa FROM odkazy WHERE (hra = '$hra')";
    $dtzobj = $databaze->prepare($dotaz);
    $dtzobj->execute();
    my @odkazy;
    while(my ($hra, $text, $adresa) = map{decode("utf8", $_)}($dtzobj->fetchrow_array()))
    {
        push(@odkazy, {"text" => $text, "adresa" => $adresa});
    }
    # Čtvrtým dotazem získat přehled zboží souvisejícího s touto hrou.
    my $zbozi = dzsql::dotaz($databaze, "kod", "kod_hry", "nelze_koupit", "nazev",
        "prodejni_cena", "bezna_cena", "poznamka", "popis_zbozi", "lokalizace",
        "cerny_most", "paluba", "dostupnost", "dostupnost_poznamka",
        "zbozi WHERE (kod_hry = '$hra')");
    my @zbozi = @{$zbozi};
    # Vypsat informace o hře.
    my $html;
    $html .= "  <table border=0 bgcolor=white>\n";
    $html .= "    <tr>\n";
    $html .= "      <td width=\"30%\" valign=\"bottom\">\n";
    # Zkontrolovat, že máme fotku hry, a pokud ano, vložit ji.
    $html .= "        ".foto($slozka, "", "", 150)."\n";
    $html .= "      </td>\n";
    $html .= "      <td width=\"40%\">\n";
    $html .= "        <h1 align=center>$nazev</h1>\n";
    # Pokud známe alternativní názvy, vypsat je.
    my $neboli;
    if($dalsi_nazvy)
    {
        $neboli = $dalsi_nazvy;
        $neboli = "        <center>neboli $neboli</center>";
    }
    $html .= "$neboli\n";
    # Vypsat upoutávku na hru a charakteristiku hry.
    $html .= "        <p>$upoutavka</p>\n";
    $html .= "      </td>\n";
    $html .= "      <td valign=\"bottom\">\n";
    $html .= "        <p><b>Počet hráčů:</b> $pocet_hracu.\n";
    $html .= "        <br><b>Minimální věk:</b> $min_vek let.\n";
    if($min_delka!=0)
    {
        if($min_delka>=60*24)
        {
             $dnymin = sprintf("%d", ($min_delka/60/24)+0.5);
             $dnymax = sprintf("%d", ($max_delka/60/24)+0.5);
             $html .= sprintf("<br><b>Délka hry:</b> %s %s.\n", $dnymax==$dnymin ? $dnymax : "$dnymin až $dnymax", $dnymax==1 ? "den" : $dnymax>=2 && $dnymax<=4 ? "dny" : "dnů");
        }
        elsif($min_delka>=100)
        {
             $hodmin = sprintf("%.1f", ($min_delka/60)+0.05);
             $hodmax = sprintf("%.1f", ($max_delka/60)+0.05);
             $html .= "<br><b>Délka hry:</b> $hodmin až $hodmax hod.\n";
        }
        else
        {
            $html .= "<br><b>Délka hry:</b> $min_delka - $max_delka min.\n";
        }
    }
    # Vypsat odkazy na stránky o této hře.
    $html .= "        <p><a href=\"hry.pl?hra=$hra\">Základní informace o hře</a><br><a href=\"http://www.deskovehry.cz/index.php/$nazev\">Informace z&nbsp;deskovehry.cz</a><br>\n";
    foreach my $odkaz (@odkazy)
    {
        my $adresa = $odkaz->{adresa};
        unless($adresa =~ m/^(\/|http:)/)
        {
            $adresa = "$main::koren_hrejsi/$slozka/$adresa";
        }
        $html .= "        <a href=\"$adresa\">$odkaz->{text}</a><br>\n";
    }
    $html .= "      </td>\n";
    $html .= "    </tr>\n";
    # 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++;
            $html .= "    <tr>\n";
            $html .= "      <td valign=\"top\">\n";
            $html .= "        <hr><h3 align=left><b>$zbozi->{nazev}</b></h3>\n";
            $html .= "        <p>Naše cena:<b> $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><font color=red>(Tedy ušetříte %d&nbsp;Kč, resp. %d&nbsp;%%.)</font>\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ě.
            my $prah = 3;
            my @sklad;
            if($zbozi->{cerny_most}>=$prah)
            {
                push(@sklad, "Distribuční sklad: <b>alespoň $prah&nbsp;ks.</b><br>");
            }
            elsif($zbozi->{cerny_most}>0)
            {
                push(@sklad, "Distribuční sklad: <b>".$zbozi->{cerny_most}."&nbsp;ks.</b><br>");
            }
            elsif($zbozi->{paluba}>0)
            {
                push(@sklad, "Distribuční sklad: <b>není</b>, ale rádi ji doobjednáme.<br>");
            }
            if($zbozi->{paluba}>=$prah)
            {
                push(@sklad, "Paluba: <b>alespoň $prah&nbsp;ks.</b><br>");
            }
            elsif($zbozi->{paluba}>0)
            {
                push(@sklad, "Paluba: <b>".$zbozi->{paluba}."&nbsp;ks.</b><br>");
            }
            elsif($zbozi->{cerny_most}>0)
            {
                push(@sklad, "Paluba: <b>není</b>, ale rádi vám ho tam připravíme.<br>");
            }
            if($zbozi->{cerny_most}<=0 && $zbozi->{paluba}<=0)
            {
                push(@sklad, "Toto zboží momentálně nemáme skladem, ale rádi ho pro vás doobjednáme.<br>");
                # U zboží, které nemáme, navíc doplnit informaci, za jak dlouho ho budeme mít.
                if($zbozi->{dostupnost_poznamka})
                {
                    push(@sklad, "Dostupnost: $zbozi->{dostupnost_poznamka}<br>");
                }
                elsif($zbozi->{dostupnost}>=29)
                {
                    my $m0 = int(($zbozi->{dostupnost}+1)/30);
                    my $m1 = $m0+1;
                    $m1 .= $m1>=5 ? ' měsíců' : ' měsíce';
                    push(@sklad, "Dostupnost: $m0 až $m1<br>");
                }
                elsif($zbozi->{dostupnost}>14)
                {
                    my $t0 = int($zbozi->{dostupnost}/7);
                    my $t1 = $t0+1;
                    $t1 .= $t1>=5 ? ' týdnů' : ' týdny';
                    push(@sklad, "Dostupnost: $t0 až $t1<br>");
                }
                elsif($zbozi->{dostupnost}>1)
                {
                    my $d = $zbozi->{dostupnost};
                    $d .= $d>=5 ? ' dní' : ' dny';
                    push(@sklad, "Dostupnost: $d<br>");
                }
            }
            else
            {
                push(@sklad, "Údaje o zásobách jsou orientační!");
            }
            $html .= "        <p>".join(" ", @sklad)."</p>\n";
            $html .= "      </td>\n";
            $html .= "      <td valign=\"top\">\n";
            $html .= "        <hr><p><b>$zbozi->{poznamka}</b><br/>\n";
            $html .= "        $zbozi->{popis_zbozi}<br/>\n";
            $html .= "        $zbozi->{lokalizace}<br/>\n";
            # Vytvořit odkaz na košík, v němž je o 1 ks tohoto zboží víc.
            my @kosik = split(/a/, $main::pole{kosik});
            my $nalezeno = 0;
            foreach my $polozka (@kosik)
            {
                my ($pocet, $vec) = split(/x/, $polozka);
                if($vec==$zbozi->{kod})
                {
                    $nalezeno = 1;
                    $polozka = ($pocet+1)."x$vec";
                    last;
                }
            }
            unless($nalezeno)
            {
                push(@kosik, "1x$zbozi->{kod}");
            }
            my $novy_kosik = join("a", @kosik);
#            $html .= "<a href=\"mailto:klara.zemanova\@atlas.cz\">Objednat e-mailem.</a></p></td>\n";
            $html .= "        ".odkazpar("Přidat do košíku.", "", "kosik=$novy_kosik")."</p>\n";
            $html .= "      </td>\n";
            # Vložit fotku zboží, pokud je k dispozici.
            my $foto = foto($slozka, $zbozi->{kod_hry}, $zbozi->{kod}, 150);
            if($foto ne "")
            {
                $html .= "      <td valign=\"top\">\n";
                $html .= "        <hr>$foto\n";
                $html .= "      </td>\n";
            }
            $html .= "    </tr>\n";
        }
    }
    $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><b><font color=red>Litujeme, ale tuto hru momentálně nemáme v&nbsp;nabídce.</font></b></p>\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.
#------------------------------------------------------------------------------
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>";
    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 = 0;
        foreach my $zbozi (@{$zbozii})
        {
            $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, "", "", 100);
            }
            $html .= "$foto\n";
            $html .= "</td>\n";
            $html .= "<td>\n";
            $html .= "<br>\n" if($foto eq "");
            $html .= odkazpar($nazev, "", "hra=$hra->{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";
        }
        my $nabidka;
        if($n_zbozi<=0)
        {
            # 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, "", "", 100);
            $html .= "$foto\n";
            $html .= "</td>\n";
            $html .= "<td>\n";
            $html .= "<br>\n" if($foto eq "");
            $html .= odkazpar($nazev, "", "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", "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)
    {
        $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}, "", "", 100);
        }
        $html .= "$foto\n";
        $html .= "</td>\n";
        $html .= "<td>\n";
        $html .= "<br>\n" if($foto eq "");
        $html .= odkazpar($zbozi->{"hry.nazev"}, "", "hra=$zbozi->{\"hry.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 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 .= "<h1>Podobné hry</h1>\n";
            $html .= "<table>\n";
            foreach my $p (@podobne)
            {
                my $nazev = $p->{nazev_na_ceskem_trhu} ? $p->{nazev_na_ceskem_trhu} : $p->{nazev};
                my $odkaz = odkazpar($nazev, "", "hra=$p->{kod}");
                my $foto = foto($p->{slozka_hrejsi}, "", "", 50);
                $html .= "<tr><td>$foto</td><td>$odkaz</td></tr>\n";
            }
            $html .= "</table>\n";
        }
    }
    return $html;
}



#------------------------------------------------------------------------------
# Vytáhne z databáze seznam her a zboží.
#------------------------------------------------------------------------------
sub dbzbozi
{
    my $databaze = shift;
    # Získat z databáze údaje o hrách.
    my @nazvy = qw(kod_hry zbozi.kod hry.kod zbozi.nazev prodejni_cena bezna_cena nelze_koupit slozka_hrejsi novinka omezeny_pocet sleva popis_zbozi lokalizace);
    my $nazvy = join(", ", @nazvy);
    my $dotaz = "SELECT $nazvy FROM zbozi INNER JOIN hry ON hry.kod=zbozi.kod_hry ORDER BY zbozi.nazev";
    my $dtzobj = $databaze->prepare($dotaz);
    $dtzobj->execute();
    my @zbozi;
    # Vysvětlení následujícího while: dokud (while) nejsme na konci výstupu dotazu (tedy v podstatě tabulky), načti další řádek (to je to fetchrow_array), převeď ho do utf8 a ulož do pole @zaznam (i-tý prvek pole bude obsahovat hodnotu v i-tém sloupci právě načteného řádku). Abychom to mohli použít, musíme vědět, která položka je v i-tém sloupci, což nám naštěstí řekne pole @nazvy. Takže uvnitř těch { } se pole @zaznam a @nazvy zkombinují do hashe %zaznam, s jehož pomocí pak budeme moct přistupovat k hodnotám pomocí názvu sloupce a ne jeho čísla: např. $zaznam{bezna_cena}. Protože ale záznam odpovídá jen jedinému řádku (jedinému druhu zboží) a my chceme tabulku všech řádků (všech druhů zboží), uložíme potom odkaz na tento %zaznam do pole @zbozi. Tohle je pole řádků, tedy tabulka. 
    # Pak můžeš udělat např. $zbozi[$i]->{bezna_cena} nebo $zbozi[$i]{bezna_cena} (v tomhle konkrétním případě je ta šipka mezi ] a { nepovinná). 
    while(my @zaznam = map{decode("utf8", $_)}($dtzobj->fetchrow_array()))
    {
        my %zaznam; for(my $i = 0; $i<=$#nazvy; $i++) {$zaznam{$nazvy[$i]} = $zaznam[$i];}
        push(@zbozi, \%zaznam);
    }
    return \@zbozi;
}



#------------------------------------------------------------------------------
# Sestaví vlastní přehled novinek, bez informace o akčním zboží vpravo.
#------------------------------------------------------------------------------
sub novinky_bez_akce
{
    my $zbozi = shift;
    my @zbozi = @{$zbozi};
    my $html;
    $html .= "      <h2><font color=red>NOVINKY</font></h2>\n";
    $html .= "      <table>\n";
    for(my $i = 0; $i<=$#zbozi; $i++)
    {
        if(($zbozi[$i]->{novinka}) && !($zbozi[$i]->{nelze_koupit}))
        {
        
            $html .= "        <tr>\n";
            $html .= "          <td>\n";
            # Vložit fotku zboží, pokud je k dispozici.
            $html .= foto($zbozi[$i]{slozka_hrejsi}, $zbozi[$i]{"hry.kod"}, $zbozi[$i]{"zbozi.kod"})."\n";
            $html .= "          </td>\n";
            $html .= "          <td>\n";
            $html .= "            ".odkazpar($zbozi[$i]->{"zbozi.nazev"}, "", "hra=$zbozi[$i]->{kod_hry}")."</br>\n";
            $html .= "            <b>Naše cena: $zbozi[$i]->{prodejni_cena}&nbsp;Kč</b></br>\n";
            if($zbozi[$i]->{bezna_cena}>0)
                {
                    $html .= "            Běžná cena: $zbozi[$i]->{bezna_cena}&nbsp;Kč\n";
                    if($zbozi[$i]->{bezna_cena}>$zbozi[$i]->{prodejni_cena})
                    {
                        my $uspora_kc = $zbozi[$i]->{bezna_cena}-$zbozi[$i]->{prodejni_cena};
                        my $uspora_prc = $uspora_kc/$zbozi[$i]->{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";
            $html .= "        </tr>\n";
        }
 
    }
    $html .= "      </table>\n";
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví přehled novinek.
#------------------------------------------------------------------------------
sub novinky
{
    my $databaze = shift;
    my $zbozi = dbzbozi($databaze);
    my @zbozi = @{$zbozi};
    my $html;
    $html .= "<table>\n";
    $html .= "  <tr>\n";
    $html .= "    <td valign=top>\n";
    $html .= novinky_bez_akce($zbozi);
    $html .= "    </td>\n";
    $html .= "    <td valign=top align=center>\n";
    $html .= "      <h2><font color=red>AKCE</font></h2>\n";
    $html .= "      <table>\n";
    for(my $i = 0; $i<=$#zbozi; $i++)
    {
        if(($zbozi[$i]->{sleva}) && !($zbozi[$i]->{nelze_koupit}))
        {
            $html .= "      <tr>\n";
            $html .= "        <td align=center>\n";
            $html .= "          <h2 align=center>".odkazpar($zbozi[$i]->{"zbozi.nazev"}, "", "hra=$zbozi[$i]->{kod_hry}")."</h2>\n";
            # Vložit fotku zboží, pokud je k dispozici.
            $html .= "          ".foto($zbozi[$i]{slozka_hrejsi}, "", "", 250)."\n";
            if($zbozi[$i]->{bezna_cena}>0)
            {
                $html .= "          <h3>běžně: $zbozi[$i]->{bezna_cena}&nbsp;Kč\n";
                if($zbozi[$i]->{bezna_cena}>$zbozi[$i]->{prodejni_cena})
                {
                    my $uspora_kc = $zbozi[$i]->{bezna_cena}-$zbozi[$i]->{prodejni_cena};
                    my $uspora_prc = $uspora_kc/$zbozi[$i]->{bezna_cena}*100;
                    if($uspora_prc>=4)
                    {
                        $html .= sprintf("          <br><font color=red>sleva %d&nbsp;%% </font>\n", $uspora_prc);
                    }
                }
            }
            else
            {
                $html .= "          Běžně se v&nbsp;Česku neprodává.\n";
            }
            $html .= "          <br><font color=red><b>nyní: $zbozi[$i]->{prodejni_cena}&nbsp;Kč</b></font>\n";
            $html .= "          $zbozi[$i]->{poznamka}</h3>\n";
            $html .= "          <p>$zbozi[$i]->{popis_zbozi}</p>\n";
            $html .= "          <p>$zbozi[$i]->{lokalizace}</p>\n";
            $html .= "        </td>\n";
            $html .= "        <td>\n";
        }
    }
    $html .= "      </table>\n";
    $html .= "    </td>\n";
    $html .= "  </tr>\n";
    $html .= "</table>\n";
    my $urlrodina = urlpar("hra=rodina");
    my $urldeti = urlpar("hra=deti");
    my $urlpro2 = urlpar("hra=pro2");
    my $urlexperti = urlpar("hra=experti");
    my $urlmejdan = urlpar("hra=mejdan");
    $html .= <<EOF
    <h3>Podívejte se také na naše tipy pro:</h3>
    <ul>
      <li><a href="$urlrodina">celou rodinu, která s&nbsp;hraním začíná</a></li>
      <li><a href="$urldeti">malé děti (2 - 7 let)</a></li>
      <li><a href="$urlpro2">dva</a></li>
      <li><a href="$urlexperti">celou rodinu či skupinu přátel, kteří už hrají nějaký ten pátek</a></li>
      <li><a href="$urlmejdan">kamaráda - hry, které se hodí na párty a mejdany</a></li>
    </ul>
    <p>Máte-li jakékoliv dotazy, obraťte se na nás:
       <a HREF="mailto:obchod\@hrejsi.cz">obchod\@hrejsi.cz</a>,
       +420&nbsp;777&nbsp;552&nbsp;729 (dobírky, sklad), +420&nbsp;777&nbsp;692&nbsp;337 (odběr Paluba).
    </p>
EOF
    ;
    return $html;
}



#------------------------------------------------------------------------------
# Zjistí z databáze ceník.
#------------------------------------------------------------------------------
sub zjistit_cenik
{
    my $databaze = shift;
    # Získat z databáze přehled zboží.
    my @nazvy = qw(kod_hry kod nazev prodejni_cena clenska_cena bezna_cena nelze_koupit);
    my $nazvy = join(", ", @nazvy);
    my $dotaz = "SELECT $nazvy FROM zbozi ORDER BY prodejni_cena, nazev";
    my $dtzobj = $databaze->prepare($dotaz);
    $dtzobj->execute();
    my @zbozi;
    while(my @zaznam = map{decode("utf8", $_)}($dtzobj->fetchrow_array()))
    {
        my %zaznam; for(my $i = 0; $i<=$#nazvy; $i++) {$zaznam{$nazvy[$i]} = $zaznam[$i];}
        push(@zbozi, \%zaznam);
    }
    return \@zbozi;
}



#------------------------------------------------------------------------------
# Sestaví ceník.
#------------------------------------------------------------------------------
sub cenik
{
    my $databaze = shift;
    my $zbozi = zjistit_cenik($databaze);
    # 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});
    # Vypsat ceník.
    my $html = <<EOF
            <h1>Ceník her</h1>
            <p>Hry jsou řazeny dle cen od nejlevnějších po nejdražší.
               Všechny hry jsou zároveň odkazy na informace o dané hře se všemi variantami na prodej.
            <br> Ceny poštovného najdete v DODACÍCH PODMÍNKÁCH.
            </p>
            <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}, "", "hra=$radek->{kod_hry}")."</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 $zbozi = zjistit_cenik($databaze);
    # 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});
    # Vypsat ceník.
    my $html = <<EOF
            <h1>Klubový ceník her</h1>
             <p>Tento ceník platí pro organizace pracující s dětmi a mládeží a také pro členy Klubu deskových her Paluba. U většiny jde zhruba o 10% nižší ceny, než jsou naše ceny. Oproti běžným cenám na trhu je to ještě levnější.
            <br> Ceny poštovného najdete v DODACÍCH PODMÍNKÁCH.
            </p>
            <p>Hry jsou řazeny podle abecedy.
               Všechny hry jsou zároveň odkazy na informace o dané hře se všemi variantami na prodej.
            </p>
            <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}, "", "hra=$radek->{kod_hry}")."</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;
}



#------------------------------------------------------------------------------
# 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
    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;
    if($slozka eq "")
    {
        return "";
    }
    my $soubor;
    if($kod_hry ne "" && $kod_zbozi ne "")
    {
        $soubor = "zbo".$kod_hry.$kod_zbozi;
    }
    else
    {
        $soubor = "fotka";
    }
    my $cesta_disk = "$main::koren_system/$slozka/obr/$soubor";
    my $cesta_url = "$main::koren_hrejsi/$slozka/obr/$soubor";
    if(-f "$cesta_disk.jpg")
    {
        $odkaz = "<img src=\"$cesta_url.jpg\" width=\"$sirka\" alt=\"fotografie\">";
    }
    elsif(-f "$cesta_disk.gif")
    {
        $odkaz = "<img src=\"$cesta_url.gif\" width=\"$sirka\" alt=\"fotografie\">";
    }
    return $odkaz;
}



1;
