#!/usr/bin/perl
# Přečte databázi akcí a zobrazí je.
# Copyright © 2004-2011 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
# Říct Perlu, kde najde Danovy sdílené knihovny.
# CGI skripty běží pod uživatelem apache, který nemá tyto knihovny v cestě.
BEGIN {unshift(@INC, '/s/w/lib/dan') unless(grep {$_ eq '/s/w/lib/dan'} @INC)}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} = "hra,akce,datz,casz,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("prehled_akci"),
    "nadpis" => jazyky::zjistit("h1_prehled_akci")." $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 .= "<p>".join(" ", @odkazy_na_jine_roky)."</p>\n";
    $tabulka .= jazyky::zjistit("akce_vysvetleni_razeni");
    my $abc = "<a href=\"index.pl?".dancgi::sestavit_parametry_odkaz($konfig, "telo=akce.pl", "trid=hra,akce")."\" target=\"_top\">".jazyky::zjistit("abecedne")."</a>";
    my $chr = "<a href=\"index.pl?".dancgi::sestavit_parametry_odkaz($konfig, "telo=akce.pl", "trid=datz,casz,hra,akce")."\" target=\"_top\">".jazyky::zjistit("chronologicky")."</a>";
    $tabulka .= "<ul>\n  <li>$abc</li>\n  <li>$chr</li>\n</ul>\n";
    $tabulka .= "<p>".jazyky::zjistit("akce_vysvetleni_odkazu")."</p>\n";
    $tabulka .= "<table id=\"seznamakci\" 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++)
    {
        # Vynechat pseudoakce "vstupné na daný den do Ludotéky".
        next if($akce->[$i]{kod_hry} eq 'lud' && $akce->[$i]{kod_turnaje} =~ m/^l\d\d$/);
        # 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})
        {
            my $text = $akce->[$i]{$sloupec->{zdroj}};
            # Zabezpečit české neslabičné předložky proti zalomení řádku.
            if($konfig->{jazyk} eq 'cs')
            {
                $text =~ s/ ([ksvz])\s+/ $1&nbsp;/g;
            }
            $tabulka .= "<td align=\"$sloupec->{zarovnani}\">$text</td>";
        }
        # Ukončit řádek tabulky.
        $tabulka .= "</tr>\n";
    }
    $tabulka .= "</table>\n";
    return $tabulka;
}
