#!/usr/bin/perl
# Zobrazí výsledky turnaje předaného parametrem.
# Copyright © 2004-2012 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; # knihovna pro překódování ne-ASCII znaků
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 csort; # české a anglické abecední řazení UTF znaků
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);
# 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 prihlaseni.pl akce=caroly).
dancgi::rozebrat_parametry($ARGV[0], \%konfig);
if($konfig{jazyk} eq "")
{
    $konfig{jazyk} = "cs";
}
$jazyky::jazyk = $konfig{jazyk};



# Zjistit z databáze údaje o akci.
($akce, $vysledky) = zjistit_udaje_o_akci($konfig{rok}, $konfig{hra}, $konfig{turnaj});



# Vypsat stránku.
mso::vypsat_stranku(
{
    "nazev"  => "MSO: $konfig{rok}: ".jazyky::zjistit("vysledky"),
    "nadpis" => jazyky::zjistit("vysledky_nadpis", $akce->{nazev}),
    "telo"   => sestavit_vysledky($akce, $vysledky, \%konfig),
    "rok"    => $konfig{rok},
});



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



#------------------------------------------------------------------------------
# Zjistí údaje o akci.
#------------------------------------------------------------------------------
sub zjistit_udaje_o_akci
{
    my $rok = shift;
    my $hra = shift;
    my $turnaj = shift;
    # Zjistit z databáze údaje o akci.
    my $nazev_hry_jazyk = jazyky::zjistit("klic_nazev_hry");
    my $nazev_jazyk = jazyky::zjistit("klic_nazev");
    my $tiskova_zprava_jazyk = jazyky::zjistit("klic_tiskova_zprava");
    my $akce = mso::dotazat_se_databaze($databaze, "rok", "kod_hry", "kod_turnaje", $nazev_hry_jazyk, $nazev_jazyk, $tiskova_zprava_jazyk, "akce WHERE (rok = '$rok') AND (kod_hry = '$hra') AND (kod_turnaje = '$turnaj')")->[0];
    my $vysledky = mso::dotazat_se_databaze($databaze, "poradi", "jmeno", "prijmeni", "zeme", "obec", "kriterium_1", "kriterium_2", "kriterium_3", "kriterium_4", "kriterium_5", "vysledky WHERE (rok = '$rok') AND (kod_hry = '$hra') AND (kod_akce = '$turnaj')");
    $akce->{nazev_hry} = $akce->{$nazev_hry_jazyk};
    $akce->{nazev} = $akce->{$nazev_jazyk};
    $akce->{tiskova_zprava} = $akce->{$tiskova_zprava_jazyk};
    return ($akce, $vysledky);
}



#------------------------------------------------------------------------------
# Sestaví HTML zprávu o výsledcích dané akce.
#------------------------------------------------------------------------------
sub sestavit_vysledky
{
    my $akce = shift;
    my $vysledky = shift;
    my $konfig = shift;
    # Případný požadavek na hraní hymny si zapamatovat pro tento běh, ale z %{$konfig} ho odstranit, aby nezůstal v žádných odkazech.
    my $hymna = $konfig->{hymna};
    delete($konfig->{hymna});
    # Zjistit, ve kterých letech se tento turnaj konal.
    my $roky = mso::dotazat_se_databaze($databaze, "rok", "vysledky WHERE (kod_hry = '$akce->{kod_hry}') AND (kod_akce = '$akce->{kod_turnaje}') GROUP BY rok");
    my @odkazy_na_jine_roky;
    foreach my $rok (map{$_->{rok}}(@{$roky}))
    {
        if($rok==$akce->{rok})
        {
            push(@odkazy_na_jine_roky, $rok);
        }
        else
        {
            my $parametry = dancgi::sestavit_parametry_odkaz($konfig, "telo=vysledky.pl", "rok=$rok");
            push(@odkazy_na_jine_roky, "<a href=\"index.pl?$parametry\" target=\"_top\">$rok</a>");
        }
    }

    ### Sestavit přehled výsledků v HTML.
    my $tabulka;

    $tabulka = "<p>\n";

    # Ilustrační obrázek - najít a přidat
    if(-f "$konfig->{_cesta_html_system}/obr/fotky/$akce->{kod_hry}/$akce->{rok}$akce->{kod_hry}$akce->{kod_turnaje}.jpg")
     {
        $ilustracni_obrazek = "$konfig->{_cesta_html_prohlizec}/obr/fotky/$akce->{kod_hry}/$akce->{rok}$akce->{kod_hry}$akce->{kod_turnaje}.jpg";
     }
     elsif(-f "$konfig->{_cesta_html_system}/obr/fotky/$akce->{kod_hry}/$akce->{kod_hry}$akce->{kod_turnaje}.jpg")
     {
        $ilustracni_obrazek = "$konfig->{_cesta_html_prohlizec}/obr/fotky/$akce->{kod_hry}/$akce->{kod_hry}$akce->{kod_turnaje}.jpg";
     }
     elsif(-f "$konfig->{_cesta_html_system}/obr/fotky/$akce->{kod_hry}/$akce->{kod_hry}.jpg")
     {
        $ilustracni_obrazek = "$konfig->{_cesta_html_prohlizec}/obr/fotky/$akce->{kod_hry}/$akce->{kod_hry}.jpg";
     }
     else {
        $ilustracni_obrazek = '';
    };
    if ($ilustracni_obrazek)
    {
      $tabulka .= "<a href=\"$ilustracni_obrazek\"><img src=\"$ilustracni_obrazek\" align=\"right\" width=\"250\"/></a>";
    };

    if(scalar(@odkazy_na_jine_roky)>1)
    {
        $tabulka .= "<p>".jazyky::zjistit("turnaj_se_konal_v_letech")." ".join(", ", @odkazy_na_jine_roky).".\n";
    }
    else
    {
        $tabulka .= "<p>".jazyky::zjistit("turnaj_se_konal_v_roce")." $odkazy_na_jine_roky[0].\n";
    }

    # Přidat odkaz na propozice.
    my $parametry = dancgi::sestavit_parametry_odkaz($konfig, "telo=propozice.pl");
    $tabulka .= "<p>".jazyky::zjistit("propozice_najdete_zde", $akce->{rok}, $parametry)."</p>\n";
    # Přidat odkaz na seznam akcí v dané hře.
    my $parametry = dancgi::sestavit_parametry_odkaz($konfig, "telo=hra.pl");
    $tabulka .= "<p>".jazyky::zjistit("seznam_akci_ve_hre_najdete_zde", $akce->{nazev_hry}, $parametry)."</p>\n";
    $tabulka .= "<p>".jazyky::zjistit('odkaz_na_anketu')."</p>\n";
    # Přidat tiskovou zprávu o akci, pokud existuje.
    if($akce->{tiskova_zprava} !~ m/^\s*$/)
    {
        $tabulka .= "<p>$akce->{tiskova_zprava}</p>\n";
    }
     $tabulka .= "</p>\n";




    # Přidat na pozadí hrající hymnu.
    if($hymna ne "")
    {
        $hymna = "$konfig->{_cesta_html_prohlizec}/obr/hymny/".lc($hymna).".mid";
        $tabulka .= "<script type=\"text/javascript\">\n";
        $tabulka .= "<!--\n";
        $tabulka .= "var filename=\"$hymna\";\n";
        $tabulka .= "if (navigator.appName == \"Microsoft Internet Explorer\") document.writeln ('<bgsound src=\"' + filename + '\">');\n";
        $tabulka .= "else if (navigator.appName == \"Netscape\") document.writeln ('<embed src=\"' + filename + '\" autostart=TRUE width=144 height=60><p>');\n";
        $tabulka .= "// -->\n";
        $tabulka .= "</script>\n";
        $tabulka .= "<noscript>\n";
        $tabulka .= "<bgsound src=\"$hymna\">\n";
        $tabulka .= "</noscript>\n";
    }

#    $tabulka .= "<table class=\"smallest\"><tr><td valign=top>\n";
        $tabulka .= "<div class=\"cleaner\"></div>";
        $tabulka .= "<table class=\"smallest\">\n";
        # Vypsat záhlaví tabulky.
        $tabulka .= "<tr><th rowspan=\"2\" align=\"left\"><p>".jazyky::zjistit("c")."</th><th rowspan=\"2\" align=\"left\">".jazyky::zjistit("jmeno")."</th><th rowspan=\"2\" align=\"left\">".jazyky::zjistit("zeme")."</th><th rowspan=\"2\" align=\"left\">".jazyky::zjistit("obec")."</th>";
        # Seřadit výsledky podle pořadí. Nemůžeme o to požádat SQL server, protože
        # pořadí máme v databázi uložené jako řetězec, takže 10. by nám vyšlo před 2.
        my @serazene_vysledky = sort{$a->{poradi}<=>$b->{poradi}}(@{$vysledky});
        $vysledky = \@serazene_vysledky;
        # Zjistit, která kritéria jsou u této akce vyplněna.
        my $max_kriterium;
        foreach my $vysledek (@{$vysledky})
        {
            for(my $i = $max_kriterium+1; $i<=5; $i++)
            {
                if($vysledek->{"kriterium_$i"} ne "")
                {
                    $max_kriterium = $i;
                }
            }
            last if($max_kriterium>=5);
        }
        if ($max_kriterium>0)
        {
          $tabulka .= "<th rowspan=\"1\" colspan=\"$max_kriterium\" style=\"text-align:center\">".jazyky::zjistit("kriteria")."</th>";
        };
        # Nad vlajkami přidat odkaz na hymnu vítěze.
        if(scalar(@{$vysledky}))
        {
            # Znak U+266B (nota) je vidět ve Firefoxu, ale Internet Explorer si neumí sáhnout do správného fontu.
            # Obrázková verze: výšku omezuju na 20, při zmenšení na 18 pixelů už se u noty ztrácí nožička.
            # my $nota = chr(hex("266B"));
            my $nota = "<img src=\"$konfig->{_cesta_html_prohlizec}/obr/nota.png\" height=\"20\" alt=\"Hymna vítěze\" class=\"nogallery\">";
            $tabulka .= "<th rowspan=\"2\"><a ".mso::odkaz(\%konfig, "telo=vysledky.pl", "hymna=$vysledky->[0]{zeme}").">$nota</a></th>";
        }
        $tabulka .= "</tr><tr>\n";
        for(my $i = 1; $i<=$max_kriterium; $i++)
        {
             $tabulka .= "<th>$i.</th>";
        };
        $tabulka .= "</tr>\n";

        # Vypsat hráče a jejich výsledky podle závěrečného pořadí.
        foreach my $vysledek (@{$vysledky})
        {
            $tabulka .= "<tr class=\"".($vysledek->{poradi} % 2 == 0 ? 'even' : 'odd')."\">";
            $tabulka .= "<td align=right>$vysledek->{poradi}. </td>";
            $tabulka .= "<td>$vysledek->{jmeno} $vysledek->{prijmeni}&nbsp;</td>";
            $tabulka .= "<td>$vysledek->{zeme}</td>";
            $tabulka .= "<td>$vysledek->{obec}</td>";
            for(my $i = 1; $i<=$max_kriterium; $i++)
            {
                $tabulka .= "<td align=center>$vysledek->{\"kriterium_$i\"} </td>";
            }
            # Sestavit odkaz na vlajku.
            my $cesta = "$konfig->{_cesta_html_prohlizec}/obr/vlajky/".lc($vysledek->{zeme}).".png";
            $tabulka .= "<td style=\"padding-top:2px\"><img src=\"$cesta\" height=\"20\" width=\"30\" align=center></td>";
            $tabulka .= "</tr>\n"
        }
        $tabulka .= "</table>\n";

       # Naskládání obrázků do @gallery - zobrazí se postranní galerii.

        if((-f "$konfig->{_cesta_html_system}/obr/fotky/$akce->{kod_hry}/$akce->{kod_hry}$akce->{kod_turnaje}.jpg") && (-f "$konfig->{_cesta_html_system}/obr/fotky/$akce->{kod_hry}/$akce->{rok}$akce->{kod_hry}$akce->{kod_turnaje}.jpg"))
        {
            push (@gallery, "$konfig->{_cesta_html_prohlizec}/obr/fotky/$akce->{kod_hry}/$akce->{kod_hry}$akce->{kod_turnaje}.jpg" );
            $hide_where = 1;
        }

        for(my $i = 1; $i<= 9; $i++)
        {
             if(-f "$konfig->{_cesta_html_system}/obr/fotky/$akce->{kod_hry}/$akce->{rok}$akce->{kod_hry}$akce->{kod_turnaje}0$i.jpg")
             {
                 push (@gallery, "$konfig->{_cesta_html_prohlizec}/obr/fotky/$akce->{kod_hry}/$akce->{rok}$akce->{kod_hry}$akce->{kod_turnaje}0$i.jpg");
                 $hide_where = 1;
             }
        }


    $tabulka .= "</td></tr></table>\n";
    return $tabulka;
}
