#!/usr/bin/perl
# Podle tabulky vyexportované z Hry.mdb generuje HTML stránku s programem Paluby na nejbližší týden.
# (c) únor 2004 Daniel Zeman
use utf8;
use Encode;
require("../access.pm");
use paluba;
# Přinutit Perl, aby UTF8 vypisoval jako UTF8 a nevymýšlel pro mě "vhodné" osmibitové kódování.
binmode(STDOUT, ":utf8");

# Načíst tabulku s programem Paluby.
$program = access::cist_tabulku_access("program.txt");

    open(KONFIG, "../cgi.cfg");
    while(<KONFIG>)
    {
        if(m/(\S+)\s*=\s*([^\r\n]*)/)
        {
            $konfig{$1} = $2;
        }
    }
    close(KONFIG);
    $koren_hrejsi = $konfig{ccesta_html_www};
    $koren_system = $konfig{scesta_html_www};


#if ($ARGV[0] eq "pristi")
#{print "ahoj";}
#else
#{


print("Content-type: text/html; charset=utf-8\n\n");

# Načíst tabulku her.
$hry = access::cist_tabulku_access("hry.txt");

# Přeskládat si tabulku her tak, aby se dal vyhledat název hry podle jejího kódu.
for(my $i = 0; $i<=$#{$hry}; $i++)
{
    $nazvyher{$hry->[$i]{kod}} = $hry->[$i]{nazev};
}


# Zjistit aktuální datum.
$dnes = dnes();
# $dnes = "28.2.2004";
@nazvy_dnu = ("pondělí", "úterý", "středa", "čtvrtek", "pátek", "sobota", "neděle");

$minden = den($dnes);
$maxden = $minden+30;

# Projít program a najít záznamy, které spadají do daného časového intervalu.
for(my $i = 0; $i<=$#{$program}; $i++)
{
    my $den = den($program->[$i]{datum});
    if($den>=$minden && $den<=$maxden)
    {
        # Kódy souvisejících her musí být v poli. Pokud tohle není první záznam o dané akci,
        # tak se dokonce jen přidá do pole další kód hry a nic víc.
        if($#vyber>=0 && $program->[$i]{"kod akce"} eq $vyber[$#vyber]{"kod akce"})
        {
            my %zaznam;
            $zaznam{kod} = $program->[$i]{"kod hry"};
            $zaznam{nazev} = $nazvyher{$program->[$i]{"kod hry"}};
            push(@{$vyber[$#vyber]{hry}}, \%zaznam);
        }
        else
        {
            my %zaznam;
            $zaznam{kod} = $program->[$i]{"kod hry"};
            $zaznam{nazev} = $nazvyher{$program->[$i]{"kod hry"}};
            push(@{$program->[$i]{hry}}, \%zaznam);
            push(@vyber, $program->[$i]);
            # Zapamatovat si odkaz i podle data, abychom ho později snadno našli.
            # (Podle data mi stačí jedna - ta první - akce v daný den).
            $dledata{$program->[$i]{datum}} = $program->[$i];
        }
    }
}
# Projít zvolené časové období a přidat automaticky generované záznamy.
# Nedělat to o prázdninách.
for(my $i = $minden; $i<=$maxden; $i++)
{
    my $den_v_tydnu = den_v_tydnu($i);
    my $datum_i = datum($i);
    unless($datum_i=~m/^\d+\.[78]\.\d+$/)
    {
        if($den_v_tydnu==1 || $den_v_tydnu==3) # pondělí a středa
        {
            # Pokud je ten den alespoň jedna databázová akce, přidat pouze text "volné hraní" na její začátek.
            if(exists($dledata{$datum_i}))
            {
                if($dledata{$datum_i}{"nazev akce"} !~ m/zavřeno/i)
                {
                    $dledata{$datum_i}{"nazev akce"} = "volné hraní + ".$dledata{$datum_i}{"nazev akce"};
                }
            }
            # Jinak přidat celou novou akci.
            else
            {
                my %akce;
                if($#vyber>=0)
                {
                    $akce{"kod akce"} = $vyber[$#vyber]{"kod akce"}+1;
                }
                else
                {
                    $akce{"kod akce"} = 1;
                }
                $akce{datum} = $datum_i;
                $akce{"nazev akce"} = "volné hraní";
                $akce{"popis akce"} = "Můžete přijít, kdy chcete, a zahrát si, co chcete.";
                push(@vyber, \%akce);
            }
        }
        else
        {
             if($den_v_tydnu==4) # čtvrtek
             {
                 # Pokud je ten den alespoň jedna databázová akce, přidat pouze text "kluby" na její začátek.
                 if(exists($dledata{$datum_i}))
                 {
                     if($dledata{$datum_i}{"nazev akce"} !~ m/zavřeno/i)
                     {
                         $dledata{$datum_i}{"nazev akce"} = "kluby + ".$dledata{$datum_i}{"nazev akce"};
                     }
                 }
                 # Jinak přidat celou novou akci.
                 else
                 {
                     my %akce;
                     $akce{"kod akce"} = $vyber[$#vyber]{"kod akce"}+1;
                     $akce{datum} = $datum_i;
                     $akce{"nazev akce"} = "kluby";
                     $akce{"popis akce"} = "Můžete si zahrát a zdokonalovat se ve <a href=\"hry.pl?hra=scr\">Scrabblu</a>, <a href=\"hry.pl?hra=oth\">Othellu</a> a <a href=\"hry.pl?hra=goo\">Go.</a>";
                     push(@vyber, \%akce);
                 }
             }
        }
    }
}
# Seřadit všechny akce (databázové i generované) najednou.
@vyber = sort
{
    my $vysledek = den($a->{datum})<=>den($b->{datum});
    unless($vysledek)
    {
        $vysledek = $a->{"kod akce"}<=>$b->{"kod akce"};
    }
    return $vysledek;
}
(@vyber);

# Vypsat stránku.
paluba::vypsat_zacatek($vyber[0]{"datum"}." (".$nazvy_dnu[den_v_tydnu(den($vyber[0]{"datum"}))-1].") ".$vyber[0]{"nazev akce"}."\n");
#print("<tr><td align=left valign=top>Dnes je ".$nazvy_dnu[den_v_tydnu(den($dnes))-1].", ".$dnes."</td>\n");
print <<EOF
    <td align="center" valign="top" WIDTH="25%">
      <p>Přijít může každý, kdykoliv je
         <a href="$koren_hrejsi/paluba/kdy.htm">otevřeno.</a></p>
  <!--#          <p><b>Prázdninový provoz:</b></p>
            <table>
                <tr><td>neděle 14 - 22 </td><td><a href="volne_hrani.htm">volné hraní</a></td></tr>
                <tr><td>(každá)</td><td>  </td><td></td></tr>
                <tr><td>sobota 16 - 22 </td><td><a href="klubohrani.htm">klubohraní</a></td></tr>
                <tr><td>(jednou za 14 dní)</td><td>  </td><td></td></tr>
            </table>


  -->
        <table>
        <tr><td>po</td><td> 16 - 22 </td><td><a href="$koren_hrejsi/paluba/volne_hrani.htm">volné hraní</a></td></tr>
        <tr><td>út</td><td> 17 - 21 </td><td><a href="$koren_hrejsi/paluba/kluby.htm">kluby</a>
            a <a href="$koren_hrejsi/paluba/klubohrani.htm">klubohraní</a></td></tr>
        <tr><td>st</td><td> 16 - 22 </td><td><a href="$koren_hrejsi/paluba/volne_hrani.htm">volné hraní</a></td></tr>
        <tr><td>čt</td><td> 17 - 21 </td><td><a href="$koren_hrejsi/paluba/kluby.htm">kluby</a></td></tr>
      </table>
    
      <p>Na Palubu může <b>přijít každý zadarmo</b> a podívat se, jak to chodí, posedět,
         popovídat si... Rozhodne-li se hrát, zaplatí <a HREF="$koren_hrejsi/paluba/vstupne.htm">herné.</a>
         Ve skupině a při opakovaných návštěvách můžete využít našich slev
         <a HREF="$koren_hrejsi/paluba/vstupne.htm">KAŽDÝ 4. ZDARMA</a>, nebo se můžete stát naším
         <a HREF="$koren_hrejsi/paluba/clenstvi.htm">členem.</a></p>
      <p>Hry si na Palubě nejen zahrajete, ale můžete si je i koupit.</p>
EOF
;


# Vypsat všechny akce.

print("<td WIDTH=50%><h1>Program Paluby na následující měsíc</h1><table>");
for(my $i = 0; $i<=$#vyber; $i++)
{
    my $text = "<tr><td align=right valign=top><b>".$vyber[$i]{datum}."</b><br>"
                .$nazvy_dnu[den_v_tydnu(den($vyber[$i]{datum}))-1]
                ."</td><td>&nbsp;&nbsp;</td><td valign=top><b> "
                .$vyber[$i]{"nazev akce"}."</b><br> ".$vyber[$i]{"popis akce"}."</td></tr>\n";
    # První výskyt názvu každé související hry v textu programu předělat na odkaz.
    for(my $j = 0; $j<=$#{$vyber[$i]{hry}}; $j++)
    {
        my $kod_hry = $vyber[$i]{hry}[$j]{kod};
        next if($kod_hry eq "nic");
        my $nazev_hry = $vyber[$i]{hry}[$j]{nazev};
        my $odkaz = "<a href=\"hry.pl?hra=$kod_hry\">$nazev_hry</a>";
        unless($text =~ s/$nazev_hry/$odkaz/i)
        {
            $text =~ s-</td></tr>- ($odkaz)</td></tr>-;
        }
    }
    # Pokud existuje odkaz na podrobnější propozice, přidá ho do názvu akce.
    if($vyber[$i]{odkaz} ne "")
    {
        my $odkaz = $vyber[$i]{odkaz};
        # Relativní odkazy interpretovat jako cesty relativní ke kořeni statických stránek.
        # Absolutní odkazy nechat beze změny. Lokální absolutní odkazy umožňují např.
        # přístup k dynamickým stránkám.
        if($odkaz !~ m-^(http://|/)-)
        {
            $odkaz = $koren_hrejsi."/".$odkaz;
        }
        $text =~ s-</td></tr>- (<a href=\"$odkaz\">další informace</a>)</td></tr>-;
    }
    print($text);
}

print <<EOF
        </table></td>\
        <td align="center" valign="top" WIDTH="50%">
  <!--#              <h3 ALIGN="CENTER"><font color=red>!!! Prázdninová hra !!!
                    <br><a href="hry.pl?hra=osa">Osadníci z Katanu</a></font></h3>
  -->
                <h3 ALIGN="CENTER">Každé úterý od 17 hod. se koná
                <a HREF="$koren_hrejsi/paluba/klubohrani.htm"><b>Klubohraní</b></a></h3>
               <p><a HREF="$koren_hrejsi/paluba/kde.htm"><b>v Klubu deskových her Paluba.</b></a></p>
               <p>Každý měsíc se můžete ponořit do jedné hry. 
               
   <!--#        V červnu to je 
                  <br><a href="hry.pl?hra=med">Medina</a></p> 
   
                    a o prázdninách vás čekají <a href="hry.pl?hra=osa">Osadníci z Katanu</a> 
                  a jejich varianty. Pravděpodobně se bude konat o sobotách jednou za 14 dnů.
    -->
               <p>Chcete-li vědět víc, <a HREF="$koren_hrejsi/paluba/kontakty.htm">kontaktujte nás.</a></p>
        </td>
EOF
;


paluba::vypsat_konec;

#}

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



#------------------------------------------------------------------------------
# Nastaví epochu pro přepočítávání data na celé číslo a zpět. Epocha je číslo
# roku, tj. epocha začíná 1. ledna v tomto roce.
#------------------------------------------------------------------------------
sub epocha
{
    return 1970;
}



#------------------------------------------------------------------------------
# Přepočítá počet dnů od začátku epochy na datum ve formátu d.m.rrrr.
#------------------------------------------------------------------------------
sub datum
{
    my $epocha = epocha();
    my $den = shift;
    my $rok = $epocha;
    my $dni_v_roce;
    # Zjistit rok.
    for(;;)
    {
        # Je tento rok přestupný?
        if($rok % 400 == 0 || $rok % 4 == 0 && $rok % 100 != 0)
        {
            $dni_v_roce = 366;
        }
        else
        {
            $dni_v_roce = 365;
        }
        if($den>$dni_v_roce)
        {
            $den -= $dni_v_roce;
            $rok++;
        }
        else
        {
            last;
        }
    }
    # Zjistit měsíc.
    my $unor = $dni_v_roce==365 ? 28 : 29;
    my @delka_mesice = (31, $unor, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    my $mesic;
    for($mesic = 1; $mesic<=12; $mesic++)
    {
        if($den>$delka_mesice[$mesic-1])
        {
            $den -= $delka_mesice[$mesic-1];
        }
        else
        {
            last;
        }
    }
    my $datum = "$den.$mesic.$rok";
    return $datum;
}



#------------------------------------------------------------------------------
# Zjistí pro libovolné datum, kolikátý je to den od začátku epochy (nastavena
# na začátku funkce, např. na 1.1.1970). Umožňuje provádět aritmetické operace
# s daty.
#------------------------------------------------------------------------------
sub den
{
    my $epocha = epocha();
    my $datum = $_[0]; # dd.mm.rrrr
    my $vysledek = 0;
    $datum =~ m/(\d+)\.(\d+)\.(\d+)/;
    my $den = $1;
    my $mesic = $2;
    my $rok = $3;
    my($irok, $imesic);
    for($irok = $epocha; $irok<$rok; $irok++)
    {
        if(($irok % 400 == 0) ||
        ($irok %   4 == 0) && ($irok % 100 != 0))
        {
            $vysledek += 366;
        }
        else
        {
            $vysledek += 365;
        }
    }
    my @delka_mesice = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    for($imesic = 1; $imesic<$mesic; $imesic++)
    {
        $vysledek += $delka_mesice[$imesic-1];
    }
    if(($mesic>2) && (($irok%400==0) || ($irok%4==0) && ($irok%100!=0)))
    {
        $vysledek++;
    }
    $vysledek += $den;
    return $vysledek;
}



#------------------------------------------------------------------------------
# Pro zadané číslo dne od začátku epochy zjistí, kolikátý je to den v týdnu.
#------------------------------------------------------------------------------
sub den_v_tydnu
{
    my $den = $_[0];
    return ($den+3)%7;
}



#------------------------------------------------------------------------------
# Zjistí dnešní datum.
#------------------------------------------------------------------------------
sub dnes
{
    my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
    my $dnes = sprintf("%d.%d.%d", $mday, $mon+1, $year+1900);
    return $dnes;
}
