#!/usr/bin/perl
# Zobrazí informace o doprovodném programu včetně vybraných akcí z databáze.
# Tento skript původně vznikl naklonováním skriptu akce.pl.
# Copyright © 2012-2013 Dan Zeman <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
use dancgi; # čtení parametrů z webu nebo z ARGV
use jazyky; # jazykové verze textů
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();



# Výchozí nastavení parametrů. Může být přebito parametry z URL/ARGV.
mso::provest_vychozi_nastaveni_parametru(\%konfig, $databaze);
$konfig{trid} = "datz,casz,hra,akce,datk,cask";
$konfig{_trideni} = ["_nazev_hry_tridici", "nazev", "_zacatek_datum_tridici", "_zacatek_cas_tridici", "_konec_datum_tridici", "_konec_cas_tridici"];
$konfig{_sloupce} = # v pořadí, v jakém se mají objevit na výstupu
[
    # nadpis ... co se objeví v záhlaví tabulky
    # urlid ... slovo, kterým se na tento sloupec odkazuje parametr skriptu, který definuje třídící kritéria
    #           (ještě je nutné v mso::prevest_konfig_trid() svázat toto slovo s příslušnou třídící hodnotou v hashi)
    # zdroj ... klíč do hashe, kterým se najde hodnota do buňky v tomto sloupci; podtržítkem začínají dopočítané věci
    #           (viz mso::dopocitat_akce())
    # zarovnani ... left|right|center
    {
        "nadpis"    => jazyky::zjistit("hra"),
        "urlid"     => "hra",
        "zdroj"     => "_nazev_hry",
        "zarovnani" => "left"
    },{
        "nadpis"    => jazyky::zjistit("akce"),
        "urlid"     => "akce",
        "zdroj"     => "_nazev_ppv",
        "zarovnani" => "left"
    },{
        "nadpis"    => jazyky::zjistit("datum_zacatku"),
        "urlid"     => "datz",
        "zdroj"     => "_zacatek_datum",
        "zarovnani" => "right"
    },{
        "nadpis"    => jazyky::zjistit("cas_zacatku"),
        "urlid"     => "casz",
        "zdroj"     => "_zacatek_cas",
        "zarovnani" => "right"
    },{
        "nadpis"    => jazyky::zjistit("datum_konce"),
        "urlid"     => "datk",
        "zdroj"     => "_konec_datum",
        "zarovnani" => "right"
    },{
        "nadpis"    => jazyky::zjistit("cas_konce"),
        "urlid"     => "cask",
        "zdroj"     => "_konec_cas",
        "zarovnani" => "right"
    }
];
# 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);
# Převést parametr trid (např. trid=hra,akce,datum,cas) na náš hash.
mso::prevest_konfig_trid(\%konfig);
# Opsat z parametrů jazyk a pak doplnit jazykově závislé hodnoty.
$konfig{jazyk} = "cs" if($konfig{jazyk} eq "");
$jazyky::jazyk = $konfig{jazyk};
$konfig{_sloupce}[0]{nadpis} = jazyky::zjistit("hra");
$konfig{_sloupce}[1]{nadpis} = jazyky::zjistit("akce");
$konfig{_sloupce}[2]{nadpis} = jazyky::zjistit("datum_zacatku");
$konfig{_sloupce}[3]{nadpis} = jazyky::zjistit("cas_zacatku");
$konfig{_sloupce}[4]{nadpis} = jazyky::zjistit("datum_konce");
$konfig{_sloupce}[5]{nadpis} = jazyky::zjistit("cas_konce");



# Přečíst tabulku akcí.
$akce = mso::nacist_akce($databaze, $konfig{rok});
# Seřadit akce podle výše zvolených kritérií.
seradit_akce($akce, $konfig{_trideni});
# Vypsat přehled akcí na obrazovku.
mso::vypsat_stranku(
{
    'nazev'  => "MSO: $konfig{rok}: ".jazyky::zjistit('doprogram'),
    'nadpis' => jazyky::zjistit('program')." $konfig{rok}",
    'telo'   => sestavit_tabulku_akci($akce, \%konfig),
    'rok'    => $konfig{rok}
});



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



#------------------------------------------------------------------------------
# Seřadí akce podle zadaných kritérií.
#------------------------------------------------------------------------------
sub seradit_akce
{
    my $akce = shift; # odkaz na tabulku
    my $trideni = shift; # odkaz na posloupnost názvů sloupců podle jejich důležitosti při třídění
    @{$akce} = sort
    {
        my $vysledek;
        for(my $i = 0; $i<=$#{$trideni}; $i++)
        {
            $vysledek = $a->{$trideni->[$i]} cmp $b->{$trideni->[$i]};
            last if($vysledek);
        }
        return $vysledek;
    }
    (@{$akce});
}



#------------------------------------------------------------------------------
# Sestaví HTML tabulku akcí a vrátí ji jako řetězec s HTML kódem.
# Potřebuje k tomu databázovou tabulku akcí, ve které jsou již dopočítané
# některé hodnoty a která je správně seřazená.
#------------------------------------------------------------------------------
sub sestavit_telo_stranky_program
{
    my $akce = shift; # databázová tabulka akcí načtená z Accessu
    my $konfig = shift; # odkaz na hash
    my $sloupce = $konfig->{_sloupce}; # odkaz na pole popisů sloupců v pořadí, v jakém se mají zobrazit
    my $telo; # výstupní HTML řetězec.
    # Ludotéka a Dětská ludotéka
    $telo .= jazyky::zjistit('program_text_ludoteky', mso::odkaz(\%konfig, 'telo=text.pl', 'text=ludoteka.htm'), mso::odkaz(\%konfig, 'telo=text.pl', 'text=hlidani.htm'), 'href="#de" onclick="return showDe();"');
    $telo .= "<p><a onclick=\"return changeDe();\"><b>".jazyky::zjistit('vice_det')."</b></a></p>\n";
    $telo .= "<div id=\"skryta_de\" style=\"display:none;\">\n";
    $telo .=    jazyky::zjistit('program_text_detska_ludoteka_skryty', mso::odkaz(\%konfig, 'telo=text.pl', 'text=hlidani.htm'), mso::odkaz(\%konfig, 'telo=propozice.pl', 'hra=lud', 'turnaj=det'));
    $telo .=    "<h3 id=\"de\">".jazyky::zjistit('doprogram_nadpis_detska_ludoteka')."</h3>";
    $telo .=    sestavit_tabulku_doprovodnych_akci($akce, $konfig, 'de');
    $telo .= "</div>\n";
    # Turnaje
    $telo .= jazyky::zjistit('program_text_turnaje', mso::odkaz(\%konfig, 'telo=globtabl.pl'), mso::odkaz(\%konfig, 'telo=akce.pl'), mso::odkaz(\%konfig, 'telo=prihlaska.pl'));
    # Miniturnaje
    $telo .= jazyky::zjistit('program_text_miniturnaje');
    $telo .= "<p><a onclick=\"return changeMi();\"><b>".jazyky::zjistit('vice_mini')."</b></a></p>\n";
    $telo .= "<div id=\"skryta_mi\" style=\"display:none;\">\n";
    $telo .=    jazyky::zjistit('program_text_miniturnaje_skryty');
    $telo .=    "<h3 id=\"mi\">".jazyky::zjistit('doprogram_nadpis_miniturnaje')."</h3>";
    $telo .=    sestavit_tabulku_doprovodnych_akci($akce, $konfig, 'min');
    $telo .= "</div>\n";
    # Rychlokurzy a prezentace
    $telo .= jazyky::zjistit('program_text_rychlokurzy');
    $telo .= "<p><a onclick=\"return changeRy();\"><b>".jazyky::zjistit('vice_ryk')."</b></a></p>\n";
    $telo .= "<div id=\"skryta_ry\" style=\"display:none;\">\n";
    $telo .=    jazyky::zjistit('program_text_rychlokurzy_skryty');
    $telo .=    "<h3 id=\"ry\">".jazyky::zjistit('doprogram_nadpis_rychlokurzy')."</h3>";
    $telo .=    sestavit_tabulku_doprovodnych_akci($akce, $konfig, 'ry');
    $telo .=    "<h3 id=\"pe\">".jazyky::zjistit('doprogram_nadpis_prezentace')."</h3>";
    $telo .=    sestavit_tabulku_doprovodnych_akci($akce, $konfig, 'pr');
    $telo .= "</div>\n";
    # Hraní komplexních her
    $telo .= jazyky::zjistit('program_text_hkh');
    $telo .= "<p><a onclick=\"return changeHkh();\"><b>".jazyky::zjistit('vice_hkh')."</b></a></p>\n";
    $telo .= "<div id=\"skryta_hkh\" style=\"display:none;\">\n";
    $telo .=    jazyky::zjistit('program_text_hkh_skryty');
    $telo .=    "<h3 id=\"hkh\">".jazyky::zjistit('doprogram_nadpis_komplexni_hry')."</h3>";
    $telo .=    sestavit_tabulku_doprovodnych_akci($akce, $konfig, 'hkh');
    $telo .= "</div>\n";
    
    $telo .= pripravit_js_scripty();
    return $telo;
}



#------------------------------------------------------------------------------
# Sestaví js <script> nutné pro funkčnost stránky
#------------------------------------------------------------------------------
sub pripravit_js_scripty
{
    my $html = <<EOF
<script>
    function showDe() { var element = document.getElementById('skryta_de'); element.style.display = ''; return true;}
    function hideDe() { var element = document.getElementById('skryta_de'); element.style.display = 'none'; return true;}
    function changeDe() {
        var element = document.getElementById('skryta_de');
        if (element.style.display == 'none')
            {element.style.display = '';}
        else {element.style.display = 'none';}
        return true;
    }
    function showMi() { var element = document.getElementById('skryta_mi'); element.style.display = ''; return true;}
    function hideMi() { var element = document.getElementById('skryta_mi'); element.style.display = 'none'; return true;}
    function changeMi() {
        var element = document.getElementById('skryta_mi');
        if (element.style.display == 'none')
            {element.style.display = '';}
        else {element.style.display = 'none';}
        return true;
    }
    function showRy() { var element = document.getElementById('skryta_ry'); element.style.display = ''; return true;}
    function hideRy() { var element = document.getElementById('skryta_ry'); element.style.display = 'none'; return true;}
    function changeRy() {
        var element = document.getElementById('skryta_ry');
        if (element.style.display == 'none')
            {element.style.display = '';}
        else {element.style.display = 'none';}
        return true;
    }
    function showHkh() { var element = document.getElementById('skryta_hkh'); element.style.display = ''; return true;}
    function hideHkh() { var element = document.getElementById('skryta_hkh'); element.style.display = 'none'; return true;}
    function changeHkh() {
        var element = document.getElementById('skryta_hkh');
        if (element.style.display == 'none')
            {element.style.display = '';}
        else {element.style.display = 'none';}
        return true;
    }
</script>
EOF
    ;
    return $html;
}



#------------------------------------------------------------------------------
# Sestaví HTML tabulku akcí a vrátí ji jako řetězec s HTML kódem.
# Potřebuje k tomu databázovou tabulku akcí, ve které jsou již dopočítané
# některé hodnoty a která je správně seřazená.
#------------------------------------------------------------------------------
sub sestavit_tabulku_akci
{
    my $akce = shift; # databázová tabulka akcí načtená z Accessu
    my $konfig = shift; # odkaz na hash
    my $sloupce = $konfig->{_sloupce}; # odkaz na pole popisů sloupců v pořadí, v jakém se mají zobrazit
    my $tabulka; # výstupní HTML řetězec.
    # Předsadit odkazy na všechny roky, o kterých zatím víme.
    my $roky = mso::dotazat_se_databaze($databaze, "rok", "rocniky ORDER BY rok");
    my @odkazy_na_jine_roky;
    foreach my $rok (map{$_->{rok}}(@{$roky}))
    {
        if($rok==$konfig->{rok})
        {
            push(@odkazy_na_jine_roky, $rok);
        }
        else
        {
            my $parametry = dancgi::sestavit_parametry_odkaz($konfig, "telo=akce.pl", "rok=$rok");
            push(@odkazy_na_jine_roky, "<a href=\"index.pl?$parametry\" target=\"_top\">$rok</a>");
        }
    }
    $tabulka .= jazyky::zjistit('doprogram_text', mso::odkaz(\%konfig, 'telo=text.pl', 'text=ludoteka.htm'));
    $tabulka .= "<h2>".jazyky::zjistit('doprogram_nadpis_komplexni_hry')."</h2>";
    $tabulka .= sestavit_tabulku_doprovodnych_akci($akce, $konfig, 'hkh');
    $tabulka .= "<h2 id=\"ry\">".jazyky::zjistit('doprogram_nadpis_rychlokurzy')."</h2>";
    $tabulka .= sestavit_tabulku_doprovodnych_akci($akce, $konfig, 'ry');
    # $tabulka .= "<h2>".jazyky::zjistit('doprogram_nadpis_seminare')."</h2>";
    # $tabulka .= sestavit_tabulku_doprovodnych_akci($akce, $konfig, 'se');
    $tabulka .= "<h2 id=\"pe\">".jazyky::zjistit('doprogram_nadpis_prezentace')."</h2>";
    $tabulka .= sestavit_tabulku_doprovodnych_akci($akce, $konfig, 'pr');
    $tabulka .= "<h2 id=\"de\">".jazyky::zjistit('doprogram_nadpis_detska_ludoteka')."</h2>";
    $tabulka .= sestavit_tabulku_doprovodnych_akci($akce, $konfig, 'de');
    return $tabulka;
}



#------------------------------------------------------------------------------
# Sestaví HTML tabulku doprovodných akcí a vrátí ji jako řetězec s HTML kódem.
# Potřebuje k tomu databázovou tabulku akcí, ve které jsou již dopočítané
# některé hodnoty a která je správně seřazená.
# Používá se pro tvorbu dvou různých tabulek. Parametr určí, kterou z nich
# chceme, čili jak chceme data filtrovat:
# Rychlokurzy: akce s kódem "ry.*".
# Semináře a simultánky: akce s kódem "s[ei].*".
# Prezentace her: akce s kódem "pr.*".
# Dětská ludotéka: akce s kódem "de.*".
# Hraní komplexních her: akce s kódem "hkh".
# Miniturnaje: akce s kódem "min".
#------------------------------------------------------------------------------
sub sestavit_tabulku_doprovodnych_akci
{
    my $akce = shift; # databázová tabulka akcí načtená z Accessu
    my $konfig = shift; # odkaz na hash
    my $druh = shift; # ry | se | pr | de | hkh | min
    my $sloupce = $konfig->{_sloupce}; # odkaz na pole popisů sloupců v pořadí, v jakém se mají zobrazit
    my $tabulka; # výstupní HTML řetězec.
    $tabulka .= jazyky::zjistit("akce_vysvetleni_razeni");
    $tabulka .= "<p>".jazyky::zjistit("akce_vysvetleni_odkazu")."</p>\n";
    $tabulka .= "<table class=\"small\">\n";
    # Přidat záhlaví tabulky.
    $tabulka .= "<tr><th>Č.</th>";
    foreach my $sloupec (@{$sloupce})
    {
        # Připravit odkaz na stejnou stránku tříděnou přednostně podle tohoto sloupce.
        my $novytrid = $konfig->{trid};
        $novytrid =~ s/$sloupec->{urlid}//;
        $novytrid =~ s/,,/,/;
        $novytrid = $sloupec->{urlid}.",".$novytrid;
        my $parametry = dancgi::sestavit_parametry_odkaz($konfig, "trid=$novytrid", "telo=doprogram.pl");
        $tabulka .= "<th><a href=\"index.pl?$parametry\" target=\"_top\">$sloupec->{nadpis}</a></th>";
    }
    $tabulka .= "</tr>\n";
    my $poradi = 1;
    for(my $i = 0; $i<=$#{$akce}; $i++)
    {
        # Přeskočit akce, které nepatří do doprovodného programu.
        next unless($druh eq 'ry' && $akce->[$i]{kod_turnaje} =~ m/^ry/ ||
                    $druh eq 'se' && $akce->[$i]{kod_turnaje} =~ m/^s[ei]/ ||
                    $druh eq 'pr' && $akce->[$i]{kod_turnaje} =~ m/^pr/ ||
                    $druh eq 'de' && $akce->[$i]{kod_turnaje} =~ m/^de/ ||
                    $druh eq 'min' && $akce->[$i]{kod_turnaje} =~ m/^min/ ||
                    $druh eq 'hkh' && $akce->[$i]{kod_turnaje} =~ m/^hkh/);
        # Začít nový řádek tabulky.
        $tabulka .= "<tr class=\"".($poradi % 2 == 0 ? 'even' : 'odd')."\">";
        # Přidat číslo řádku.
        $tabulka .= "<td align=\"right\">".($poradi++).".</td>";
        # Přidat hodnoty jednotlivých sloupců v požadovaném pořadí.
        foreach my $sloupec (@{$sloupce})
        {
            $tabulka .= "<td align=\"$sloupec->{zarovnani}\">$akce->[$i]{$sloupec->{zdroj}}</td>";
        }
        # Ukončit řádek tabulky.
        $tabulka .= "</tr>\n";
    }
    $tabulka .= "</table>\n";
    return $tabulka;
}
