#!/usr/bin/perl
# Zobrazí nebo zpracuje hlasovací formulář.
# Copyright © 2011-2016 Klára a Dan Zemanovi <zeman@ufal.mff.cuni.cz>
# Licence: GNU GPL

use utf8; # říct Perlu, že konstantní řetězce ve zdrojáku jsou v UTF
use Encode; # funkce pro překódování
use DBI; # spolupráce se serverem MySQL
# Říct Perlu, kde najde Danovy sdílené knihovny.
# CGI skripty běží pod uživatelem apache, který nemá tyto knihovny v cestě.
use lib '/s/w/lib/dan';
use dancgi; # čtení parametrů z webu nebo z ARGV
use cas; # práce s daty a časem
use jazyky; # jazykové verze textů
use csort; # jazykově závislé řazení podle abecedy
use mso; # funkce pro generování stránek o olympiádě
binmode(STDOUT, ':utf8'); # říct Perlu, že UTF chceme i na výstupu


# Připojit se k databázi.
$databaze = mso::pripojit_se_k_databazi();
# Každý rok je potřeba nejdříve v databázi na serveru vytvořit novou tabulku,
# ta stará tam zůstane jako archív. Dá se to udělat tak, že u loňské tabulky dám
# export do SQL, v tom, co dostanu, umažu dlouhý příkaz INSERT pro vložení dat,
# zbude nějaká inicializace a příkaz CREATE, v něm změním jméno tabulky na nový rok,
# pak to zase vložím do záložky SQL databáze mso na serveru.
# Potom musíme změnit název tabulky i tady.
$tabulka = 'hlasovani_2016';


# Načíst parametry z URL.
dancgi::cist_parametry(\%konfig);
# Umožnit volat skript z příkazového řádku a předat parametry tam (např. perl partie.pl zdroj=cas).
dancgi::rozebrat_parametry($ARGV[0], \%konfig);
# Načíst formulář.
if($konfig{co} eq 'zpracuj')
{
    dancgi::cist_formular_post(\%konfig);
}
if($konfig{jazyk} eq '')
{
    $konfig{jazyk} = 'cs';
}
$jazyky::jazyk = $konfig{jazyk};
# Vždy lze hlasovat pouze pro jeden ročník: ten nejbližší, který bude, případně
# ten, který právě probíhá. Zjistit, který ročník to je, a přepsat parametr rok,
# ať už tam měl uživatel cokoli.
$ted = cas::ted();
$roky = mso::dotazat_se_databaze($databaze, 'rok', 'konec', 'vcasne_prihlasky_do', 'rocniky ORDER BY rok');
for(my $i = 0; $i<=$#{$roky}; $i++)
{
    $konfig{rok} = $roky->[$i]{rok};
    $konfig{vcas} = $roky->[$i]{vcasne_prihlasky_do};
    if($ted->{eden} <= cas::datum2eden($roky->[$i]{konec}))
    {
        last;
    }
}



if($konfig{co} ne 'zpracuj')
{
    zobrazit_hlasovani($databaze, \%konfig);
}
else
{
    zpracovat_hlasovani($databaze, $tabulka, \%konfig);
}



###############################################################################
# PODPROGRAMY
###############################################################################



#------------------------------------------------------------------------------
# Zobrazí hlasovací formulář.
#------------------------------------------------------------------------------
sub zobrazit_hlasovani
{
    my $databaze = shift;
    my $konfig = shift;
    mso::vypsat_stranku(
    {
        'nazev'  => "MSO: $konfig->{rok}: ".jazyky::zjistit('Hlasovani'),
        'nadpis' => jazyky::zjistit('hlasovani_nadpis', $konfig->{rok}),
        'telo'   => hlasovani($databaze, $konfig),
        'rok'    => $konfig->{rok}
    });
}



#------------------------------------------------------------------------------
# Vypíše hlasovací formulář.
#------------------------------------------------------------------------------
sub hlasovani
{
    my $databaze = shift;
    my $konfig = shift;
    my $stranka;
    # Přečíst tabulku akcí.
    my $akce = mso::nacist_akce($databaze, $konfig->{rok});
    # Rozebrat hlasovací kód.
    # Kdyby byl z nějakého důvodu vadný, tak to oznámit hned a vůbec jim nenabídnout hlasovací formulář.
    if($konfig->{hl_kod} =~ m/^(\d\d)(\d\d\d\d\d)(\d\d)$/)
    {
        $konfig->{hlasu_celkem}= $1;
        $konfig->{hlasu_celkem} =~ s/^0*(\d+?)$/$1/;
        $konfig->{kod_osoby} = $2;
        if($konfig->{hlasu_celkem} > 10 || $konfig->{hl_kod} % 11 != 0)
        {
            return "<p style='color:red'>Chyba: neplatný hlasovací kód</p>\n";
        }
    }
    else
    {
        return "<p style='color:red'>Chyba: neplatný hlasovací kód '$konfig->{hl_kod}'</p>\n";
    }
    # Vypsat formulář hlasování.
    my $parametry = dancgi::sestavit_parametry_odkaz($konfig, 'telo=hlasovani.pl', 'co=zpracuj');
    $stranka .= "<form class=\"hlasovani\" method=\"post\" action=\"index.pl?$parametry\">\n";
    $stranka .= "<p align=right><b>".jazyky::zjistit("hlasovaci_kod")."$konfig->{hl_kod}<input type=\"hidden\" name=\"hl_kod\" value=\"$konfig->{hl_kod}\"/></b></p>\n";
    $stranka .= "<p>Vážený hráči, zde máte možnost hlasovat o turnajích podle Vaší preference.\n";
    $stranka .= " Níže můžete hlasovat samostatně o \"starých\" hrách (tedy takových, které už na Deskohraní měly vícero turnajů) a \"nových\" hrách, tedy takových, které na Deskohraní ještě nebyly, nebo zde měly maximáně jeden turnaj.\n";
    $stranka .= " <br/>Každé hře můžete přidělit 0 - 3 bodů tak, aby součet bodů u všech \"starých\" her byl nejvýše <b>$konfig->{hlasu_celkem} bodů </b> a rovněž tak u \"nových\" her musí být součet nejvýše <b>$konfig->{hlasu_celkem} bodů. </b>\n";
    $stranka .= " <br/>Hlasovací body jste dostali přidělené (3 - 10 bodů) podle množství a různorodosti turnajů, kterých jste se v předchozích 3 letech zúčastnili.\n";
    $stranka .= " Z tohoto důvodu máte přidělený svůj hlasovací kod. Z každého kodu lze hlasovat pouze jednou.\n";
    $stranka .= " <p><b>Hlasování bude ukončeno 15.7.2016. </b></p><p> Poté zařadíme do programu 3 turnaje ve \"starých\" a 3 v \"nových\", které získaly nejvíce hlasů.\n";
    $stranka .= " Kromě toho zařadíme i pár dalších s přihlédnutím na hlasování i na celkovou koncepci festivalu. \n";
    $stranka .= " <p>V záložce \"Turnaje přehledně\" a \"Přehled všech akcí\" se můžete podívat, jaké turnaje, akce a doprovodné události Vás čekají. Další informace průběžně přibývají tak, jak pokračuje komunikace s jednotlivými partnery.</p>\n";
    $stranka .= "<p>Máte k dispozici: <br/>\n";
    $stranka .= "<b>$konfig->{hlasu_celkem} hlasovacích bodů</b> k rozdělení <b>\x{201E}starým\x{201C}</b> hrám.<br/>\n";
    $stranka .= "<b>$konfig->{hlasu_celkem} hlasovacích bodů</b> k rozdělení <b>\x{201E}novým\x{201C}</b> hrám.</p>\n";

	#
	# Staré hry
    #
	$stranka .= "<h3>Volba z&nbsp;her, které již na Deskohraní měly vícero turnajů (\"staré\" hry)</h3>\n";
    $stranka .= "<p>Prosíme, přidělte hrám v součtu nejvýše <b>$konfig->{hlasu_celkem} hlasovacích bodů</b>.</p>\n";

    $stranka .= "<p><select type=\"text\" name=\"s7wo\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=7wo\" target=\"pokladnice\">7 divů světa</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"safr\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=afr\" target=\"pokladnice\">Afrika</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"sbuh\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=buh\" target=\"pokladnice\">Burgundské hrady</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"scle\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=cle\" target=\"pokladnice\">Colt Express</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"sdix\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=dix\" target=\"pokladnice\">Dixit</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"sdok\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=dok\" target=\"pokladnice\">Doba Kamenná</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"srfg\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=rfg\" target=\"pokladnice\">Dobyvatelé vesmíru</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"sisb\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=isb\" target=\"pokladnice\">Istanbul</a>  </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"sgen\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=gen\" target=\"pokladnice\">Kaleidoskop (Genial)</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"skib\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=kib\" target=\"pokladnice\">Kingdom Builder</a></p>\n";

    $stranka .= "<p><select type=\"text\" name=\"spor\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=por\" target=\"pokladnice\">Port Royal </a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"stut\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=tut\" target=\"pokladnice\">Poštovní kurýr </a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"spur\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=pur\" target=\"pokladnice\">Puerto Rico</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"ssju\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=sju\" target=\"pokladnice\">San Juan</a>  </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"sspe\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=spe\" target=\"pokladnice\">Sankt Petersburg</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"szug\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=zug\" target=\"pokladnice\">Ticket to Ride</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"strn\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=trn\" target=\"pokladnice\">Trans America či Trans Evropa</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"subo\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=ubo\" target=\"pokladnice\">Ubongo</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"segi\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=egi\" target=\"pokladnice\">Údolí králů (Egizia)</a> </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"sfun\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=fun\" target=\"pokladnice\">Vysoké napětí (Funkenschlag)</a> </p>\n";
	
	#
	# Nové hry
    #
	$stranka .= "<h3>Volba z her, které měly na Deskohraní do jednoho turnaje (\"nové\" hry)</h3>\n";
    $stranka .= "<p>Některé z nich jsou letošní či loňské novinky! Proto u těchto her naleznete vždy krátký popis, snažící se vám danou hru přiblížit. ";
	$stranka .= "Stejně jako u \"starých\" i <b>zde máte k dispozici $konfig->{hlasu_celkem} bodů k rozdělení </b> podle Vašeho uvážení.</p>\n";

    $stranka .= "<p><select type=\"text\" name=\"n6nm\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=6nm\" target=\"pokladnice\">6 bere</a> \n";
    $stranka .= "Karty s různou bodovou hodnotou se odkládají do řad podle velikosti. Maximální počet karet v řadě je pět. Pokud musíte doplnit šestou, řadu si vezmete a dostanete trestné body. Odhadněte soupeřovy záměry, aby šestá karta nevyšla na Vás! (40-60 min, 10+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"n7wo\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.zatrolene-hry.cz/spolecenska-hra/7-wonders-duel-5005/\" target=\"pokladnice\">7 divů světa - Duel</a> \n";
    $stranka .= "Hra 7 Wonders: Duel je určena pro dva hráče, čerpá ze známé hry 7 Divů světa a cílem hráčů bude předčit svého soupeře na poli vědeckém, vojenském a státnickém. (30 min, 10+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"nalh\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=alh\" target=\"pokladnice\">Alhambra</a> \n";
    $stranka .= "Každý hráč staví \"svou\" Alhambru. Hráči se snaží mít většinu v určitém druhu budovy, které jsou k mání jen v určitou dobu, a také mít nejdelší městské hradby. (45-60 min, 8+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"namu\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=amu\" target=\"pokladnice\">Amun-Re</a> \n";
    $stranka .= "Hráči se snaží mít nejen co nejvíce pyramid, ale i provincii s nejvíce pyramidami. Potřebné zlato získají výnosem z úrody, a proto je třeba si oběťmi naklonit vládce bohů Amun-Re. (60-120 min, 12+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"ncnc\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=cnc\" target=\"pokladnice\">Concordia</a> \n";
    $stranka .= "Kolonizujete Římskou říši, budujete města a obchodujete se surovinami. (90-120 min, 12+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"nfar\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=far\" target=\"pokladnice\">Farmáři</a> \n";
    $stranka .= "Farmáři jsou rodinná hra s jednoduchými pravidly, ve které budete potřebovat i trochu strategie. Obsahuje spoustu dřevěných hracích dílků ve tvaru různých typů ovoce. (40-60 min, 10+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"n5tr\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.zatrolene-hry.cz/spolecenska-hra/five-tribes-4128\" target=\"pokladnice\">Five Tribes</a> \n";
    $stranka .= "Five Tribes jsou hrou zasazenou do prostředí daleké Arábie z Příběhů tisíce a jedné noci, v níž hráči dělají vše, co je v jejich silách, aby zprostředkovali setkání příslušníků pěti různých kmenů. (60 min, 13+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"nfrs\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=frs\" target=\"pokladnice\">Fresco</a> \n";
    $stranka .= "Staňte se na chvíli restaurátorem fresky starobylého kostela. Nominace Spiel des Jahres 2010. (60-80 min, 10+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"nglm\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=glm\" target=\"pokladnice\">Glen More</a> \n";
    $stranka .= "Jako vůdce skotských horalů rozšiřujete svoje území pokládáním destiček pastvin, vesnic, jezer a hradů. Jediná hra, kde můžete vypálit whisky! :) (60-90 min, 10+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"nlac\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=lac\" target=\"pokladnice\">Lancaster</a> \n";
    $stranka .= "Boj o moc mezi šlechtickými rody ve středověké Anglii v období Stoleté války s Francií. (60-90 min, 10+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"nlau\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=lau\" target=\"pokladnice\">Land Unter (Povodeň, Země pod vodou)</a> \n";
    $stranka .= "Karetní hra o přežití stoupající hladiny. Hráči mají v ruce karty, které představují počasí. Mají také omezený počet záchranných kruhů, o které postupně přicházejí. Kdo nemá žádný kruh, prohrál. (20-40 min, 10+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"nlnd\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=lnd\" target=\"pokladnice\">London</a> \n";
    $stranka .= "Vybudujte město od katedrály sv. Pavla až po první metro na světě. Hra je založená na mechanismu vykládání karet, z nichž ale polovinu vždy musíte nabídnout soupeřům! (90-120 min, 13+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"nlui\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=lui\" target=\"pokladnice\">Ludvík XIV</a> \n";
    $stranka .= "Hráči jsou dvořané a mají zhruba 100 minut na dosažení svých cílů u dvora. Pochopitelně, svou roli zde hraje i sám Král Slunce. (90-120 min, 12+) </p>\n";

    $stranka .= "<p><select type=\"text\" name=\"npaw\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=paw\" target=\"pokladnice\">Patchwork </a> \n";
    $stranka .= "Se svou přikrývkou dosáhne zaslouženého vítězství ten, kdo chytře zvolí a nejlépe zkombinuje vybrané záplaty. (30-45 min, 8+)</p>\n";

    $stranka .= "<p><select type=\"text\" name=\"npra\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=pra\" target=\"pokladnice\">Pravěk </a> \n";
    $stranka .= "Hráči začínají jako prostí lovci a sběrači a snaží se osvojovat nové technologie jako zemědělství. Hra obsahuje podobné mechanismy jako Vysoké napětí. (60-90 min, 12+)</p>\n";

    $stranka .= "<p><select type=\"text\" name=\"nspl\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=spl\" target=\"pokladnice\">Splendor</a> \n";
    $stranka .= "V roli bohatého obchodníka za časů renesance budete využívat své zdroje na získávání dolů, dopravních prostředků a řemeslníků, kteří přetvoří surové drahokamy v nádherné šperky. (30-45 min, 10+)</p>\n";

    $stranka .= "<p><select type=\"text\" name=\"ntkn\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=tkn\" target=\"pokladnice\">Takenoko</a> \n";
    $stranka .= "Budete obdělávat a zavlažovat pole a snažit se vypěstovat co nejvíce bambusů. Je to totiž jediná potrava, co jí panda, kterou máte na starosti přímo od císaře. (40-60 min, 8+)</p>\n";

    $stranka .= "<p><select type=\"text\" name=\"ntas\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=tas\" target=\"pokladnice\">Tash-Kalar</a> \n";
    $stranka .= "Tash-Kalar: Aréna legend je strategicko-logická desková hra. Hráči v roli vyvolávači zápasí v aréně sesíláním legendárních bytostí a vzájemně si konkurují v získávání bodů. Prvek náhody je zde velmi malý. (20-40 min, 12+)</p>\n";

    $stranka .= "<p><select type=\"text\" name=\"ntac\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=tac\" target=\"pokladnice\">Tádž Mahal (Taj Mahal)</a> \n";
    $stranka .= "Hra o ovládnutí Indie. Hráči v roli maharádžů a princů ve dvanácti kolech procházejí postupně provincie a soupeří mezi sebou o moc a vliv. (75-120 min, 12+)</p>\n";

    $stranka .= "<p><select type=\"text\" name=\"ntro\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "   <a href=\"http://www.hrejsi.cz/cgi/hry/hry.pl?hra=tro\" target=\"pokladnice\">Troyes</a> \n";
    $stranka .= "Hráči se ve hře Troyes ujímají rolí bohatých rodin z kraje Champagne ve Francii a používají svůj vliv na získání a vedení osob ze tří oblastí: armády, duchovních a lidu. Cílem hry je získat co nejvíce slávy, čehož lze dosáhnout vícero způsoby. (90-120 min, 12+)</p>\n";

    $stranka .= "<p><select type=\"text\" name=\"novinka1\">\n";
    $stranka .= "<option value=0 default>0</option>\n";
    $stranka .= "<option value=1>1</option>\n";
    $stranka .= "<option value=2>2</option>\n";
    $stranka .= "<option value=3>3</option>\n";
    $stranka .= "</select>\n";
    $stranka .= "Místo pro Váš návrh: <input type=\"text\" name=\"novinka1_nazev\" size=\"30\"/></p>\n";

#    $stranka .= "<p><select type=\"text\" name=\"novinka2\">\n";
#    $stranka .= "<option value=0 default>0</option>\n";
#    $stranka .= "<option value=1>1</option>\n";
#    $stranka .= "<option value=2>2</option>\n";
#    $stranka .= "<option value=3>3</option>\n";
#    $stranka .= "</select>\n";
#    $stranka .= "Místo pro Váš 2. návrh: <input type=\"text\" name=\"novinka2_nazev\" size=\"30\"/></p>\n";

    my $parametry = dancgi::sestavit_parametry_odkaz($konfig, "telo=hlasovani.pl", "hra=pet", "turnaj=oly");

    $stranka .= "  <table border=\"0\">\n";
    $stranka .= "  </table>\n";

    # Přidat parametry, které uživatele nezajímají, ale my je potřebujeme.
    $stranka .= "  <input type=\"hidden\" name=\"jazyk\"  value=\"$jazyky::jazyk\"/>\n";
    $stranka .= "  <input type=\"hidden\" name=\"co\"     value=\"zpracuj\"/>\n";
    my $cas = cas::ted()->{rmdhms};
    $stranka .= "  <input type=\"hidden\" name=\"casgen\" value=\"$cas\"/>\n";
    # Přidat tlačítka pro odeslání nebo vymazání formuláře.
    $stranka .= "  <p>\n";
    $stranka .= "    <input type=\"submit\" value=\"".jazyky::zjistit("odeslat")."\"/>\n";
    $stranka .= "    <input type=\"reset\"  value=\"".jazyky::zjistit("vymazat")."\"/>\n";
    $stranka .= "  </p>\n";
    $stranka .= "</form>\n";

    return $stranka;
}



#==============================================================================
# Funkce pro zpracování vyplněného formuláře
#==============================================================================



#------------------------------------------------------------------------------
# Zkontroluje údaje z formuláře, uloží je do databáze, pošle je e-mailem
# organizátorům a uživateli vygeneruje odpověď.
#------------------------------------------------------------------------------
sub zpracovat_hlasovani
{
    my $databaze = shift;
    my $tabulka = shift;
    my $konfig = shift;
    # Údaje z formuláře jsou v hashi %{$konfig} pohromadě s případnými dalšími
    # parametry skriptu. Přidat mezi údaje datum a čas odeslání formuláře.
    $konfig->{casode} = cas::ted()->{rmdhms};
    # Zkontrolovat údaje.
    my $chyby = zkontrolovat_hlasovani($databaze, $tabulka, $konfig);
    # Pokud byla kontrola úspěšná, uložit údaje do databáze a odeslat je e-mailem organizátorům.
    unless(scalar(@{$chyby}))
    {
        ulozit_hlasovani_do_databaze($databaze, $tabulka, $konfig);
        odeslat_hlasovani_e_mailem($databaze, $konfig);
    }
    # Vygenerovat odpověď pro uživatele.
    zobrazit_potvrzovaci_stranku($databaze, $konfig, $chyby);
}



#------------------------------------------------------------------------------
# Zkontroluje údaje z formuláře a vrátí seznam chyb, které najde.
#------------------------------------------------------------------------------
sub zkontrolovat_hlasovani
{
    my $databaze = shift;
    my $tabulka = shift;
    my $konfig = shift;
    my @chyby;
    # Zkontrolovat platnost hlasovacího kódu.
    my $kod = $konfig->{kod_hlas} = $konfig->{hl_kod};
    # Kód se skládá z osmi číslic a je dělitelný jedenácti. První dvě číslice znamenají počet hlasů, který není vyšší než 10.
    my $kod_osoby;
    my $n_hlasu;
    my $kontrola;
    if($kod =~ m/^(\d\d)(\d\d\d\d\d)(\d\d)$/)
    {
        $konfig->{hlasu_celkem} = $n_hlasu = $1;
        $konfig->{kod_osoby} = $kod_osoby = $2;
        $kontrola = $3;
        if($n_hlasu > 10 || $kod % 11 != 0)
        {
            push(@chyby, 'chyba_neplatny_kod');
        }
        else
        {
            # Zjistit, zda už s tímto kódem někdo nehlasoval.
            my $drivejsi = mso::dotazat_se_databaze($databaze, 'kod_hlas', "$tabulka WHERE kod_osoby = '$kod_osoby'");
            if(scalar(@{$drivejsi}))
            {
                push(@chyby, 'chyba_pouzity_kod');
            }
        }
    }
    else
    {
        push(@chyby, 'chyba_neplatny_kod');
    }
    # Projít všechny parametry.
    # Jestliže jejich název jsou 4 písmena nebo číslice, první je 's' nebo 'n',
    # a jestliže hodnotou parametru je 0, 1, 2 nebo 3, považovat je za kód hry.
    my @stare_hry = grep {m/^s[a-z0-9]{3}$/ && $konfig->{$_} =~ m/^[0-3]$/} (keys(%{$konfig}));
    my @nove_hry = grep {m/^(n[a-z0-9]{3}|novinka[12])$/ && $konfig->{$_} =~ m/^[0-3]$/} (keys(%{$konfig}));
    $konfig->{stare} = \@stare_hry;
    $konfig->{nove} = \@nove_hry;
    # Zkontrolovat, že počet hlasů udělených starým hrám nepřekročil maximální počet hlasů, které má dotyčný uživatel k dispozici.
    my $soucet_stare = 0;
    foreach my $hra (@stare_hry)
    {
        $soucet_stare += $konfig->{$hra};
    }
    if($soucet_stare>$n_hlasu)
    {
        push(@chyby, sprintf("chyba_moc_starych_%d_%d", $soucet_stare, $n_hlasu));
    }
    # Zkontrolovat, že počet hlasů udělených novým hrám nepřekročil maximální počet hlasů, které má dotyčný uživatel k dispozici.
    my $soucet_nove = 0;
    foreach my $hra (@nove_hry)
    {
        $soucet_nove += $konfig->{$hra};
    }
    if($soucet_nove>$n_hlasu)
    {
        push(@chyby, sprintf("chyba_moc_novych_%d_%d", $soucet_nove, $n_hlasu));
    }
    # Jestliže novinka1 nebo novinka2 dostala hlas, nesmí zůstat prázdné pole s názvem hry.
    if($konfig->{novinka1}>0 && $konfig->{novinka1_nazev} =~ m/^\s*$/ ||
       $konfig->{novinka2}>0 && $konfig->{novinka2_nazev} =~ m/^\s*$/)
    {
        push(@chyby, 'chyba_prazdna_novinka');
    }
    # Zkontrolovat, že se dal hlas alespoň jedné hře.
    if($soucet_stare==0 && $soucet_nove==0)
    {
        push(@chyby, 'chyba_zadne_hlasy');
    }
    return \@chyby;
}



#------------------------------------------------------------------------------
# Uloží údaje z formuláře do databáze MySQL na serveru.
#------------------------------------------------------------------------------
sub ulozit_hlasovani_do_databaze
{
    my $databaze = shift;
    my $tabulka = shift;
    my $konfig = shift;
    my @nazvy = qw(kod_hlas kod_osoby hlasu_celkem kod_hry hlasu nazev_hry);
    my $seznam_poli = join(', ', @nazvy);
    foreach my $hra (@{$konfig->{stare}}, @{$konfig->{nove}})
    {
        next unless($konfig->{$hra}>0);
        my $kod_hry = $hra;
        $kod_hry =~ s/^[sn]// unless($kod_hry =~ m/^novinka/);
        # Řetězcové hodnoty musí být v apostrofech, číselné bez apostrofů.
        my @hodnoty =
        (
            "'$konfig->{kod_hlas}'",
            $konfig->{kod_osoby},
            $konfig->{hlasu_celkem},
            "'$kod_hry'",
            $konfig->{$hra}
        );
        if($hra =~ m/^novinka\d$/)
        {
            my $nazev = $konfig->{$hra.'_nazev'};
            push(@hodnoty, "'$nazev'");
        }
        else
        {
            push(@hodnoty, "''");
        }
        # The MySQL driver must get the data as a sequence of bytes, not of varying-width characters.
        my $seznam_hodnot = encode('utf8', join(', ', @hodnoty));
        my $dotaz = "INSERT INTO $tabulka ($seznam_poli) VALUES ($seznam_hodnot);";
        $databaze->do($dotaz);
    }
}



#------------------------------------------------------------------------------
# Odešle údaje z formuláře e-mailem organizátorům.
#------------------------------------------------------------------------------
sub odeslat_hlasovani_e_mailem
{
    my $databaze = shift;
    my $konfig = shift;
    my $sendmail;
    if(-e "/usr/lib/sendmail")
    {
        $sendmail = "|/usr/lib/sendmail -oi -t";
    }
    else
    {
        $sendmail = ">posledni-prihlaska.txt";
    }
    my $adresat = "klara\@hrejsi.cz, zeman\@ufal.mff.cuni.cz";
    my $mail;
    $mail .= "From: Robot Hrejsi <robot\@hrejsi.cz>\n";
    $mail .= "To: $adresat\n";
    $mail .= "Subject: MSO hlasovani\n";
    $mail .= "Content-Type: text/plain; charset=\"utf-8\"\n";
    $mail .= "Content-Transfer-Encoding: 8bit\n\n";
    # Sestavit tělo zprávy.
    $mail .= "kod = $konfig->{kod_hlas}\n";
    my @hry = grep {$konfig->{$_}>0} (@{$konfig->{stare}}, @{$konfig->{nove}});
    $mail .= join(', ', map {"$_=$konfig->{$_}"} (sort(@hry)))."\n\n";
    $mail .= "novinka1_nazev=$konfig->{novinka1_nazev}\n";
    $mail .= "novinka2_nazev=$konfig->{novinka2_nazev}\n";
    # Odeslat zprávu organizátorům.
    open(SENDMAIL, $sendmail) or print "Nemůžu najít sendmail: $!\n";
    print SENDMAIL ($mail);
    close(SENDMAIL);
    open(KOPIE, ">posledni_hlasovani.txt");
    print KOPIE ($mail);
    close(KOPIE);
    open(KOPIE, ">>archiv_hlasovani.txt");
    print KOPIE ("----------------------------------------------------------------------\n");
    print KOPIE ($mail);
    close(KOPIE);
}



#------------------------------------------------------------------------------
# Vygeneruje pro uživatele stránku se zprávou o úspěchu či neúspěchu jím
# odeslaného formuláře.
#------------------------------------------------------------------------------
sub zobrazit_potvrzovaci_stranku
{
    my $databaze = shift;
    my $konfig = shift;
    my $chyby = shift;
    my $nadpis;
    my $stranka;
    # Pokud byly v hlasování nalezeny chyby, upozornit uživatele, že hlasování nebylo přijato.
    if(scalar(@{$chyby}))
    {
        $nadpis = jazyky::zjistit("hlasovani_nadpis_chyba");
        $stranka .= "<h3>".jazyky::zjistit("hlasovani_nadpis2_chyba")."</h3>\n";
        $stranka .= "<ul>\n";
        foreach my $chyba0 (@{$chyby})
        {
            my $chyba = $chyba0;
            my ($k, $n);
            if($chyba =~ m/^chyba_moc_(star|nov)ych_(\d+)_(\d+)$/)
            {
                $chyba = "chyba_moc_${1}ych";
                $k = $2;
                $n = $3;
            }
            # Ke všem chybám by nyní mělo existovat vysvětlení v jazyky.pm.
            # Pokud náhodou neexistuje (někdo přidal nový kód chyby a zapomněl na to), vypíšeme alespoň kód chyby.
            my $hlaseni = jazyky::zjistit("hlasovani_$chyba", $k, $n);
            $hlaseni = $chyba0 if(!defined($hlaseni));
            $stranka .= "  <li>$hlaseni</li>\n";
        }
        $stranka .= "</ul>\n";
    }
    # Pokud byla přihláška bez chyb, ukázat uživateli přehled údajů a oznámit mu, že přihláška byla přijata.
    else
    {
        $nadpis = jazyky::zjistit("hlasovani_potvrzeni");
        $stranka .= jazyky::zjistit("hlasovani_potvrzeni_nadpis");
    }
    # Obalit stránku jednotným záhlavím a zápatím a poslat ji na výstup.
    mso::vypsat_stranku(
    {
        'nazev'  => "MSO: $konfig->{rok}: ".jazyky::zjistit("Hlasovani"),
        'nadpis' => $nadpis,
        'telo'   => $stranka,
        'rok'    => $konfig->{rok}
    });
}
