#!/usr/bin/perl
# Pošle na výstup obsah souboru. Slouží jako obálka na statické soubory ve složkách CGI.
# Copyright © 2006-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 open ":utf8"; # Perl musí vědět, že texty, které čteme z disku, jsou v UTF-8
use Encode; # funkce pro překódování
# Ří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);
# 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);
# Není-li soubor předán jako parametr $konfig{soubor}, může být předán jako podcesta.
unless(exists($konfig{text}))
{
    $konfig{text} = $ENV{PATH_INFO};
}
# Opsat z parametrů jazyk a pak doplnit jazykově závislé hodnoty.
$konfig{jazyk} = "cs" if($konfig{jazyk} eq "");
$jazyky::jazyk = $konfig{jazyk};

# Zjistit údaje, které mohou být v některých stránkách potřeba.
# Zjistit termín daného roku.
my $dotaz = "SELECT zacatek, konec FROM rocniky WHERE (rok = '$konfig{rok}')";
my $dtzobj = $databaze->prepare($dotaz);
$dtzobj->execute();
my @radek = map{decode("utf8", $_)}($dtzobj->fetchrow_array());
# Mezi dvěma daty by neměl být spojovník, ale pomlčka (n-dash).
my $pomlcka = "\x{2013}";
$termin = "$radek[0] $pomlcka $radek[1]";
# Termín ludotéky se nemusí shodovat s termínem celého festivalu (stalo se poprvé 2007).
my $dotaz = "SELECT zacatek, konec FROM akce WHERE (rok = '$konfig{rok}') AND (kod_hry = 'lud') AND (kod_turnaje = 'lud')";
my $dtzobj = $databaze->prepare($dotaz);
$dtzobj->execute();
my @radek = map{decode("utf8", $_)}($dtzobj->fetchrow_array());
$radek[0] =~ s/\s.*//;
$radek[1] =~ s/\s.*//;
$ltermin = "$radek[0] $pomlcka $radek[1]";
# Zjistit počet akcí v daném roce.
my $dotaz = "SELECT COUNT(kod_turnaje) AS pocet FROM akce WHERE (rok = '$konfig{rok}')";
my $dtzobj = $databaze->prepare($dotaz);
$dtzobj->execute();
my @radek = map{decode("utf8", $_)}($dtzobj->fetchrow_array());
$n_akci = $radek[0];
# Vstupné do ludotéky platí až od roku 2007 a od roku 2011 zdarma jenpondělí a středa, jinak 70/50/30.
if($konfig{rok}>=2007)
{    if($konfig{rok}>=2011)
    {
        $vstupne = jazyky::zjistit("zdarma_jen_po-st");
    }
    else
    {
        $vstupne = jazyky::zjistit("zdarma_jen_vseddny");
    }
}    
else
{
    $vstupne = jazyky::zjistit("zdarma");
};
# promenne pro potvrzeni.htm
$pemail = $konfig{pemail};
$pjmeno = $konfig{pjmeno};
$pprijmeni = $konfig{pprijmeni};
$pakce = $konfig{pakce};

# Vypsat propozice.
mso::vypsat_stranku(
{
    "nazev"  => "MSO: $konfig{rok}",
    "nadpis" => "",
    "telo"   => sestavit_text(\%konfig),
    "rok"  => $konfig{rok},
});


###############################################################################
# PODPROGRAMY
###############################################################################
#------------------------------------------------------------------------------
# Přečte z disku HTML, nahradí v něm případné proměnné jejich hodnotami, a výsledné HTML vrátí.
#------------------------------------------------------------------------------

sub sestavit_text
{
    my $konfig = shift; # odkaz na hash
    my $stranka;
    # Následující krok představuje bezpečnostní hrozbu, proto dovolíme otevření
    # pouze souborů z předem známého seznamu. Kdyby nám někdo podstrčil cestu
    # obalenou svislítky, vytvoří rouru a může spustit systémový příkaz. Pomocí
    # programů jako curl, wget, links apod. potom může na náš systém dopravit
    # trojského koně. (To se už stalo 24.1.2008 při útoku z Kazachstánu.)
    return "jjjj\n$konfig->{text}\njjjj\n" unless($konfig->{text} =~ m/^(kde|ludoteka|organizatori|petimysl|predchozi_rocniky(_20\d\d)?|sponzori|ubytovani|uvod|seznamher|potvrzeni|foto|ateam|aktuality|hlidani)\.htm$/);
    open(TEXT, "texty/$jazyky::jazyk/$konfig->{text}");
    while(<TEXT>)
    {
        # Doplnit odkazy na jiné dynamické stránky.
        while(m/[^\\]\$odkaz\((.*?)\)/)
        {
            my $parametry = $1;
            my @parametry = split(/\?/, $parametry);
            my $cele_parametry = dancgi::sestavit_parametry_odkaz($konfig, @parametry);
            my $odkaz = "index.pl?$cele_parametry";
            s/([^\\])\$odkaz\(.*?\)/$1$odkaz/;
        }
        # Nahradit odkazy na proměnné jejich hodnotami.
        while(m/[^\\]\$([a-z_]+)/)
        {
            my $promenna = $1;
            s/\$$promenna/${$promenna}/g;
        }
        $stranka .= $_;
    }
    close(TEXT);
    return $stranka;
}
