#!/usr/bin/perl
# Přečte databázi akcí a zobrazí je.
# Copyright © 2004-2006 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("skoly"),
    "nadpis" => jazyky::zjistit("skoly")." $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_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("skoly_text");
    # Tady má být nadpis Miniturnaje.
    $tabulka .= "<h2>".jazyky::zjistit("skoly_nadpis_mini")."</h2>";
    $tabulka .= sestavit_tabulku_juniorskych_akci($akce, $konfig, 0);
    # Tady má být nadpis Hlavní turnaje.
    $tabulka .= "<h2>".jazyky::zjistit("skoly_nadpis_hlavni")."</h2>";
    $tabulka .= sestavit_tabulku_juniorskych_akci($akce, $konfig, 1);
    return $tabulka;
}



#------------------------------------------------------------------------------
# Sestaví HTML tabulku juniorský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á. Podle parametru vybere buď
# všechny akce s kódem "juh", nebo "ju[^h]".
#------------------------------------------------------------------------------
sub sestavit_tabulku_juniorskych_akci
{
    my $akce = shift; # databázová tabulka akcí načtená z Accessu
    my $konfig = shift; # odkaz na hash
    my $juh = shift; # 1 nebo 0
    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=akce.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é nejsou pro školy.
        if($juh && $akce->[$i]{kod_turnaje} ne "juh" ||
           !$juh && $akce->[$i]{kod_turnaje} !~ m/^ju[^h]$/)
        {
            next;
        }
        # 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;
}
