#!/usr/bin/perl
# CGI přístup k databázi her. Generuje jak seznamy, tak stránky o konkrétních hrách.
# (c) 2002 - 2006 Daniel Zeman
# Licence: GNU GPL
# prosinec 2002: vytvořeno
# 30.12.2003: přechod na UTF-8
# 11.12.2005: data už se neberou z textových souborů, ale z MySQL serveru

use utf8;
use open ":utf8";
use Encode;
use DBI;
# Přidat Danovy sdílené knihovny. Skript běžící pod uživatelem apache by je jinak nenašel.
BEGIN {unshift(@INC, "/home/dan/lib") unless(grep {$_ =~ m-/home/dan/lib-} @INC);}
use dzcgi;
use mysql;
use csort;
use cas;
# Přinutit Perl, aby UTF8 vypisoval jako UTF8 a nevymýšlel pro mě "vhodné" osmibitové kódování.
binmode(STDOUT, ":utf8");
use pomoc;
use kecy;
use katalog;
use kosik;
use objednavka;



# Zapamatovat si, kdy jsme s generováním stránky začali, abychom na konci mohli
# zjistit, jak dlouho nám to trvalo.
$starttime = time();



# Přečíst parametry.
dzcgi::cist_parametry(\%pole);
dzcgi::cist_formular_post(\%pole) if($pole{formular});
# Pro ladící účely si nachystat výpis parametrů na výstup.
$ladeni = 0;
if($ladeni)
{
    $dbg_parametry .= "QUERY_STRING = $ENV{QUERY_STRING}\n";
    foreach my $key (sort(keys(%pole)))
    {
        $dbg_parametry .= "$key = $pole{$key}\n";
    }
    $dbg_parametry = "<pre>$dbg_parametry</pre>\n";
}
# Robotům odmítnout přístup, jestliže si chtějí něco strčit do košíku.
use norobot;
if(exists($pole{kosik}) && !norobot::proverit())
{
    norobot::ohlasit_chybu();
    exit(0);
}



# Zjistit cestu pro odkazování na statické stránky hrejsi.
open(KONFIG, "../cgi.cfg");
while(<KONFIG>)
{
    if(m/(\S+)\s*=\s*([^\r\n]*)/)
    {
        $konfig{$1} = $2;
    }
}
close(KONFIG);
$koren_hrejsi = $konfig{ccesta_html_www};
$koren_system = $konfig{scesta_html_www};
# Připojit se k databázi her.
# Pokud je skript spuštěn webovým serverem (uživatel www-data), měl by mít dostatečná práva pro přístup k databázi.
# Pokud je ale spuštěn uživatelem dan@kub.cz, práva nemá a musí se databázi hlásit jako root. V tom případě je potřeba,
# aby příslušné heslo bylo v proměnné prostředí DBI_ROOT_PASS.
if($ENV{USER} eq "dan")
{
    if(!exists($ENV{DBI_ROOT_PASS}))
    {
        die("Pri spusteni jinym uzivatelem nez www-data musi byt v promenne prostredi DBI_ROOT_PASS heslo roota do databaze.\n");
    }
    $dbi_uzivatel = "root";
    $dbi_heslo = $ENV{DBI_ROOT_PASS};
}
$databaze = DBI->connect("DBI:mysql:hry", $dbi_uzivatel, $dbi_heslo)
  or print STDERR ("Nelze se pripojit k databazi: $DBI::errstr\n");
# Nastavit kódování klienta, spojení a výsledků.
$databaze->prepare("SET NAMES 'utf8'")->execute();
# Některé parametry CGI se jmenují jinak, než bych chtěl, ale neumím to s těmi tlačítky líp.
if($pole{submit} eq "Zpět")
{
    if($pole{hra} eq "objednavka")
    {
        $pole{hra} = "konec1";
    }
    delete($pole{submit});
}
# Parametry, které se nemají propagovat do všech odkazů vedoucích odsud dál,
# je potřeba přestěhovat z hashe %pole někam jinam, kde je najdou pouze funkce,
# které je potřebují pro výrobu této stránky, ale ne pro konstrukci odkazů z ní.
# Jak původní parametry CGI, tak kopie těch, které se nemají propagovat, budou
# uložené v globálních proměnných.
$hledat = $pole{hledat};
delete($pole{hledat});
$objednavka = objednavka::zjistit(\%pole, $databaze);
delete($pole{kosik}) if($pole{hra} eq "objednavka");
vypsat_stranku();



###############################################################################
# Podprogramy
###############################################################################



#------------------------------------------------------------------------------
# Vypíše kostru stránky. Volá podřízené funkce pro jednotlivé části stránky.
#------------------------------------------------------------------------------
sub vypsat_stranku
{
    vypsat_zahlavi();
    print("  <table border=\"0\" width=\"100%\">\n");
    print("    <tr style='height:1cm'>\n");
    print("      <td align=center valign=top width=\"20%\">\n");
    vypsat_odkazy_na_palubu();
    print("      </td>\n");
    print("      <td align=center valign=top width=\"60%\">\n");
    vypsat_uvod_obchodu();
    print("      </td>\n");
    print("      <td align=center valign=top width=\"20%\" bgcolor=lightgreen>\n");
    vypsat_poradnu();
    print("      </td>\n");
    print("    </tr>\n");
    print("    <tr>\n");
    print("      <td align=center valign=top width=\"20%\">\n");
    print(odsadit(katalog::seznam_her($databaze), 8));
    print("      </td>\n");
    print("      <td align=left   valign=top width=\"60%\">\n");
    vypsat_prostredek_stranky();
    print("      </td>\n");
    print("      <td align=center valign=top width=\"20%\">\n");
    vypsat_pravy_okraj();
    print("      </td>\n");
    print("    </tr>\n");
    print("  </table>\n");
    # Zjistit, jak dlouho nám to trvalo, a vypsat to na konec stránky.
    my $hlaseni = sestavit_hlaseni_o_trvani_programu($starttime);
    print("  <div align=right><address>$hlaseni</address></div>\n");
    # Vypsat závěr stránky.
    vypsat_zapati();
}



#------------------------------------------------------------------------------
# Provede počáteční úkony, nezávislé na tom, jaký pohled uživatel zvolil.
# Pozor! (léto 2007) Ve skutečnosti i tady musíme vědět, jaký pohled uživatel
# zvolil. Pokud si řekl o konkrétní hru, chceme, aby v názvu stránky bylo
# "koupit hru tu a tu". To kvůli indexování roboty.
# Načte parametry a vypíše začátek HTML stránky.
#------------------------------------------------------------------------------
sub vypsat_zahlavi
{
    # Poslat MIME záhlaví dokumentu.
    print("Content-Type: text/html; charset=utf-8\n\n");
    # Poslat začátek stránky.
    print("<html>\n");
    print("  <head>\n");
    # Nedovolit robotům indexovat stránku, na které je něco v košíku.
    if(exists($pole{kosik}))
    {
        # index/noindex ... indexovat tuto stránku?
        # follow/nofollow ... sledovat odkazy z této stránky?
        # noindex,nofollow
        print("    <meta name=\"robots\" content=\"noindex\">\n");
    }
    # Sestavit název stránky. Pokud je stránka cílena na určitou hru, musí být název hry obsažen v názvu.
    my $nazev_stranky;
    if(exists($pole{hra}))
    {
        my $odpoved = mysql::dotaz($databaze, "nazev", "hry WHERE kod='$pole{hra}'");
        if(scalar(@{$odpoved}))
        {
            my $nazev_hry = $odpoved->[0]{nazev};
            $nazev_stranky = "Koupit $nazev_hry (obchod)";
        }
        else
        {
            # Nebyl nalezen název hry podle kódu. Nejspíš šlo o pseudokód, např. "novinky" nebo "poradna".
            $nazev_stranky = "Deskové hry: obchod: $pole{hra}";
        }
    }
    else
    {
        $nazev_stranky = "Deskové hry: obchod";
    }
    print <<EOF
    <meta http-equiv="Content-Language" content="cs">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>$nazev_stranky</title>
    <meta name="description" content="Obchod s hrami, Portál o deskových hrách. Pravidla, recenze, akce, e-obchod, pozvánky, turnaje, informace o deskových hrách.">
    <meta name="keywords" content="prodej, nákup, obchod, e-obchod, on-line obchod, obchod s hrami, objednávky, košík, košíček, objednat, hračky, deskove hry, hry, deskové hry, stolní hry, společenské hry, Klub deskových her Paluba, Klub Paluba, pravidla, turnaje, games, board games, akce, pozvánky, recenze, Othello, Abalone, Carcassonne, Osadníci, Bang, Vrhcáby, Scrabble, Zatre.">
  </head>
  <body>$dbg_parametry
EOF
    ;
}



#------------------------------------------------------------------------------
# Vypíše závěr stránky HTML.
#------------------------------------------------------------------------------
sub vypsat_zapati
{
    # Poslat konec stránky.
    print <<EOF
  </body>
</html>
EOF
    ;
}


#------------------------------------------------------------------------------
# Vypíše přehled poraden v horním proužku.
#------------------------------------------------------------------------------
sub vypsat_poradnu
{
    print(odkazpar("<font color=green size=+1><b>Herní poradna:</b></font>", \%pole, "hra=poradna"), "\n");
    print("<br><font color=green>Hry pro:</font>\n");
    print("<table width=\"100%\">\n");
    print("<tr><td>", odkazpar("<font color=green>celou rodinu </font>", \%pole, "hra=rodina"), "\n");
    print("    <td>", odkazpar("<font color=green>děti 2-7 let </font>", \%pole, "hra=deti"), "\n");
    print("<tr><td>", odkazpar("<font color=green>fajnšmekry </font>", \%pole, "hra=experti"), "\n");
    print("    <td>", odkazpar("<font color=green>dva </font>", \%pole, "hra=pro2"), "\n");
    print("<tr><td>", odkazpar("<font color=green>party a mejdany </font>", \%pole, "hra=mejdan"), "\n");
    print("</table>\n");
}



#------------------------------------------------------------------------------
# Vypíše úvodní text obchodu s hrami.
#------------------------------------------------------------------------------
sub vypsat_uvod_obchodu
{
    print("<h3>\n");
    print(odkazpar("<font color=red>NOVINKY</font>", \%pole, "hra=novinky"), " | \n");
    print(odkazpar("DODACÍ PODMÍNKY", \%pole, "hra=obecne"), " | \n");
    print(odkazpar("SLEVY", \%pole, "hra=slevy"), " | \n");
    print(odkazpar("CENÍK", \%pole, "hra=cenik"), " | \n");
    print(odkazpar("SLOVENSKO", \%pole, "hra=slovensko"), " | \n");
    print(odkazpar("<font color=green>PORADNA</font>", \%pole, "hra=poradna"), " \n");
    print("</h3>\n");
    if(cas::ted()->{eden} < datum2eden("25.12.2007"))
    {
        print("<h1>Obchod s&nbsp;hrami</h1>\n");
        print("<p><b>Upozornění:</b>\n");
        print("Objednávky s&nbsp;doručením <b>poštou</b> (nevztahuje se na osobní odběr!)\n");
        print("podané do 13.12.2007 stihneme <b>doručit do Vánoc</b> u her, které jsou skladem.\n");
        print("Objednávky podané 14.12.2007 nebo později stihneme jen jako obchodní balíky, tedy s&nbsp;expresním příplatkem 50&nbsp;Kč.\n");
        print("Poslední objednávky, které stihneme doručit poštou, lze podat 18.12. Ty budeme odesílat 19. a doručeny budou 20. nebo 21.\n");
        print("Vše se vztahuje pouze na hry, které máme na skladě.</p>\n");
    }
}



#------------------------------------------------------------------------------
# Vypíše odkazy na Palubu.
#------------------------------------------------------------------------------
sub vypsat_odkazy_na_palubu
{
    print("<p>Hry si můžete koupit jak ");
    print("<a href=\"http://www.paluba.cz\">na&nbsp;Palubě,</a>");
#     print("</br><img src=\"$koren_hrejsi/obr/logo.gif\" height=50 align=center>");
    print(" tak ");
    print(odkazpar("zde na dobírku.", \%pole, "hra=obecne"));
}



#------------------------------------------------------------------------------
# Vypíše prostředek stránky
#------------------------------------------------------------------------------
sub vypsat_prostredek_stranky
{
    if($pole{hra} eq "" && $hledat eq "" || $pole{hra} eq "novinky")
    {
        print(katalog::novinky($databaze));
    }
    elsif($pole{hra} eq "obecne")
    {
        kecy::obecne();
    }
    elsif($pole{hra} eq "poradna")
    {
        kecy::poradna();
    }
    elsif($pole{hra} eq "deti")
    {
        kecy::poradna_deti();
    }
    elsif($pole{hra} eq "rodina")
    {
        kecy::poradna_rodina();
    }
    elsif($pole{hra} eq "pro2")
    {
        kecy::poradna_pro2();
    }
    elsif($pole{hra} eq "experti")
    {
        kecy::poradna_experti();
    }
    elsif($pole{hra} eq "mejdan")
    {
        kecy::poradna_mejdan();
    }
    elsif($pole{hra} eq "cenik")
    {
        print(katalog::cenik($databaze));
    }
    elsif($pole{hra} eq "cenikk")
    {
        print(katalog::klubovy_cenik($databaze));
    }
    elsif($pole{hra} eq "slevy")
    {
        kecy::slevy();
    }
    elsif($pole{hra} eq "slovensko")
    {
        kecy::slovensko();
    }
    elsif($pole{hra} eq "konec1")
    {
        print("<h2>Obsah vašeho košíku</h2>\n");
        print(kosik::html($objednavka, 1));
        print("<p><b>Chcete-li do košíku něco přidat, zvolte si hru v&nbsp;levém sloupci.\n");
        print("   Pokud jste již s&nbsp;obsahem košíku spokojeni, vyplňte a odešlete následující údaje:</b></p>\n");
        print(objednavka::formular1($objednavka));
    }
    elsif($pole{hra} eq "konec2")
    {
        print("<h2>Obsah vašeho košíku</h2>\n");
        print(kosik::html($objednavka, 1));
        print("<p><b>Chcete-li do košíku něco přidat, zvolte si hru v&nbsp;levém sloupci.\n");
        print("   Pokud jste již s&nbsp;obsahem košíku spokojeni, vyplňte a odešlete následující údaje:</b></p>\n");
        print(objednavka::formular2($objednavka));
    }
    elsif($pole{hra} eq "objednavka")
    {
        print(objednavka::zpracovat($objednavka, $databaze));
    }
    elsif($hledat ne "")
    {
        print("<h2>Výsledky hledání řetězce '$hledat' v&nbsp;katalogu</h2>\n");
        print(katalog::hledat($databaze, $hledat));
    }
    else
    {
        print(katalog::hra($databaze, $pole{hra}));
    }
}



#------------------------------------------------------------------------------
# Vypíše pravý okraj stránky s výjimkou odkazů na Palubu vpravo nahoře.
#------------------------------------------------------------------------------
sub vypsat_pravy_okraj
{
    if(length($pole{hra})==3)
    {
        print("<div align=left>\n");
        print(katalog::podobne($databaze, $pole{hra}));
        print("</div>\n");
    }
    if($pole{kosik} eq "" || $pole{hra} =~ m/^konec/)
    {
        # Pokud se obchodní podmínky psaly už doprostřed, nepsat je znova vpravo.
        if($pole{hra} eq "obecne")
        {
            my $zbozi = katalog::dbzbozi($databaze);
            print(katalog::novinky_bez_akce($zbozi));
        }
        else
        {
            kecy::obecne();
        }
    }
    else
    {
        print("<h2>Obsah vašeho košíku</h2>\n");
        print(kosik::html($objednavka, 1));
        print("<p><b>Chcete-li do košíku něco přidat, zvolte si hru v&nbsp;levém sloupci.\n");
        print("   Pokud jste již s&nbsp;obsahem košíku spokojeni, přesuňte se prosím k&nbsp;pokladně:</b></p>\n");
        # Vypsat odkaz na objednávkový formulář.
        my $odkazobr = odkazpar("<img src=\"/obr/pokladna.gif\" border=0>", \%pole, "hra=konec1");
        my $odkaztxt = odkazpar("K&nbsp;pokladně", \%pole, "hra=konec1");
        print("<p>$odkazobr<br>\n$odkaztxt</p>\n");
    }
}



#------------------------------------------------------------------------------
# Vypíše dobu, po kterou program běžel. K tomu potřebuje dostat časové otisky
# začátku a konce.
#------------------------------------------------------------------------------
sub sestavit_hlaseni_o_trvani_programu
{
    my $starttime = shift;
    my $stoptime = time();
    my $cas = $stoptime-$starttime;
    my $hod = int($cas/3600);
    my $min = int(($cas%3600)/60);
    my $sek = $cas%60;
    my $hlaseni;
    if($hod==0)
    {
        if($min==0)
        {
            $hlaseni = sprintf("Program běžel $sek vteřin%s.\n", $sek==1 ? "u" : $sek>=2 && $sek<=4 ? "y" : "");
        }
        else
        {
            $hlaseni = sprintf("Program běžel %d:%02d minut.\n", $min, $sek);
        }
    }
    else
    {
        $hlaseni = sprintf("Program běžel %2d:%02d:%02d hodin.\n", $hod, $min, $sek);
    }
    return $hlaseni;
}
