#!/usr/bin/perl
# CGI přístup k databázi her. Generuje jak seznamy, tak stránky o konkrétních hrách.
# (c) prosinec 2002 Daniel Zeman
# 30.12.2003: přechod na UTF-8
use utf8;
use Encode;
# Přinutit Perl, aby UTF8 vypisoval jako UTF8 a nevymýšlel pro mě "vhodné" osmibitové kódování.
binmode STDOUT, ":utf8";



# Zjistit cestu pro odkazování na statické stránky hrejsi.
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};



# Přečíst parametry.
do "../formdata.pl";
precist_parametry_url();
precist_data_formulare() if($pole{formular});
# Pro ladící účely si nachystat výpis parametrů na výstup.
$ladeni = 0;
if($ladeni)
{
    foreach($key, sort(keys(%pole)))
    {
        $dbg_parametry .= "$key = $pole{$key}\n";
    }
    $dbg_parametry = "<pre>$dbg_parametry</pre>\n";
}



# Načíst procedury na čtení tabulky her.
do "cist.pl";
# Načíst tabulku her.
precist_hry("hry.txt");
precist_provedeni("provedeni.txt");
zjistit_pocet_exemplaru("exemplare.txt");
zjistit_pocet_na_prodej("prodej.txt");



# Poslat MIME záhlaví dokumentu.
print("Content-Type: text/html; charset=utf-8\n\n");



# Nachystat si proměnné části začátku stránky.
if($pole{radit} eq "pocethracu") {
    $pocethracu = " checked";
} else {
    $abecedne = " checked";
} if($pole{jenspravidly}) {
    $jenspravidly = " checked";
} if($pole{jenlzezahrat}) {
    $jenlzezahrat = " checked";
} if($pole{jenlzekoupit}) {
    $jenlzekoupit = " checked";
}
# Poslat začátek stránky.
if($pole{hra} eq "") {
    print("<html>\n");
    print("<head>\n");
    print("<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n");
    print("<title>Palubní pokladnice her</title>\n");
    print("<link rel=\"stylesheet\" type=\"text/css\" href=\"$koren_hrejsi/obr/main.css\">\n");
    print("<link rel=\"stylesheet\" type=\"text/css\" href=\"$koren_hrejsi/obr/titulni.css\">\n");
    print("</head>\n");
    print("<body text=\"#C0C0C0\" bgcolor=\"#000000\" link=\"#FFFF99\" vlink=\"#C0C0C0\">\n");
    print("<!--webbot bot=\"Include\" U-Include=\"$koren_hrejsi/obr/topmenu.htm\" TAG=\"BODY\" startspan -->\n");
    print("<!-- #BeginLibraryItem \"/Library/Hlavicka - black s sedou bublinou.lbi\" -->\n");
    print("<script language=\"JavaScript\" src=\"$koren_hrejsi/obr/menus.js\"></script>\n");
    print("<script language=\"JavaScript\" src=\"$koren_hrejsi/obr/menusopts.js\"></script>\n");
    print("<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">\n");
    print("<tr>\n");
    print("<td>\n");
    print("<p align=left>\n");
    print("<map name=\"FPMap0\">\n");
    print("<area href=\"$koren_hrejsi/paluba\" alt=\"Klub deskových her Paluba\" shape=\"rect\" coords=\"9,66,207,85\" title=\"Klub deskových her Paluba\">\n");
    print("<area href=\"$koren_hrejsi/index.htm\" alt=\"Hrejsi.cz - svět deskových her jako na dlani\" shape=\"rect\" coords=\"9,3,206,67\" title=\"Hrejsi.cz - svět deskových her jako na dlani\">\n");
    print("</map>\n");
    print("<img border=\"0\" src=\"$koren_hrejsi/obr/hrejsibub.gif\" usemap=\"#FPMap0\" width=\"288\" height=\"91\">\n");
    print("</td>\n");
    print("<td width=\"90%\" valign=\"top\">&nbsp;</td>\n");
    print("</tr>\n");
    print("<tr>\n");
    print("<td colspan=\"2\" height=\"5\">\n");
    print("<table border=\"0\" cellpadding=\"0\" width=\"100%\" cellspacing=\"0\">\n");
    print("<tr>\n");
    print("<td colspan=\"2\">\n");
    print("<div width=\"50\" height=\"1\"><b><font size=\"-2\" color=\"#C0C0C0\"> </font></b></div>\n");
    print("</td>\n");
    print("</tr>\n");
    print("</table>\n");
    print("</td>\n");
    print("</tr>\n");
    print("</table>\n");
    print("<!-- #EndLibraryItem --><!-- #BeginEditable \"Obsah stranky\" --> <!--webbot bot=\"Include\" U-Include=\"obr/topmenu.htm\" TAG=\"BODY\" startspan -->\n");
    print("<!--webbot bot=\"Include\" endspan i-checksum=\"45316\" -->\n");
    print("$dbg_parametry\n");
    print("<h1><font color=yellow>Pokladnice her</font></h1>\n");
    print("<form method=post action=\"hry.pl?formular\">\n");
    print("Řadit\n");
    print("<input type=radio name=radit value=abecedne$abecedne> abecedně |\n");
    print("<input type=radio name=radit value=pocethracu$pocethracu> podle počtu hráčů<br>\n");
    print("<table><tr><td valign=top>Pouze hry</td>\n");
    print("<td><input type=checkbox name=jenspravidly$jenspravidly> od kterých tu máme pravidla<br>\n");
    print("<input type=checkbox name=jenlzezahrat$jenlzezahrat> které si na Palubě můžete zahrát<br>\n");
    print("<input type=checkbox name=jenlzekoupit$jenlzekoupit> které si na Palubě můžete koupit</td></tr></table>\n");
    print("<input type=submit value=\"Odeslat\">\n");
    print("</form>\n");
} else {
    generovat_stranku_hry($pole{hra});
    exit;
}



# Neřadíme hry abecedně, protože by byla spousta problémů s Unicodem a systémovým locale.
# Místo toho spoléháme na řazení, které provedl Access těsně před exportem.
# Seskupit hry podle počtu hráčů.
# Pole indexované počtem hráčů, prvkem je pole kódů her připouštějících tento
# počet.
for($i = 0; $i<=$#kody; $i++) {
    # Zjistit možné počty hráčů pro tuto hru.
    my $mozne_pocty = $hry{"$kody[$i]: pocet hracu"};
    # Odstranit ze seznamu počtů nepatřičné znaky.
    $mozne_pocty =~ s/[^0-9+,]//g;
    # Rozsekat počty do pole.
    @mozne_pocty = split(/,/, $mozne_pocty);
    # Pro každý počet si uložit tuto hru do příslušného seznamu.
    for($j = 0; $j<=$#mozne_pocty; $j++)
    {
        # Plus interpretovat jako "a libovolný vyšší počet".
        if($mozne_pocty[$j] =~ s/\+//)
        {
            # Do 6 hráčů musí být počty vyjmenovány jednotlivě.
            for($k = $mozne_pocty[j]+1; $k<=6; $k++)
            {
                push(@mozne_pocty, $k);
            }
            # Každopádně hru zařadit do kategorie "mnoho hráčů".
            push(@skupina_mnoho, $kody[$i]);
        }
        push(@{$skupiny[$mozne_pocty[$j]]}, $kody[$i]);
    }
}



# Vypsat hry.
if($pole{radit} eq "pocethracu")
{
    for($i = 0; $i<=$#skupiny; $i++)
    {
        if($#{$skupiny[$i]}>=0)
        {
            print("<h2>Hry pro $i hráč".($i>0&&$i<5?"e":"ů")."</h2>\n");
            print("<ol>\n");
            for($j = 0; $j<=$#{$skupiny[$i]}; $j++)
            {
                vypsat_odkaz_na_hru_do_seznamu($skupiny[$i][$j]);
            }
            print("</ol>\n");
        }
    }
    if($#skupina_mnoho>=0)
    {
        print("<h2>Hry pro libovolný počet hráčů větší než 6</h2>\n");
        print("<ol>\n");
        for($j = 0; $j<=$#skupina_mnoho; $j++)
        {
            vypsat_odkaz_na_hru_do_seznamu($skupiny[$i][$j]);
        }
        print("</ol>\n");
    }
}
else
{
    my @abeceda;
    foreach my $pismeno ("A", "B", "C", "Č", "D", "E", "F", "G", "H", "CH", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "Ř", "S", "Š", "T", "U", "V", "W", "X", "Y", "Z", "Ž")
    {
        push(@abeceda, "<a href=\"#$pismeno\">$pismeno</a>");
    }
    print("<p>", join(" | ", @abeceda), "</p>\n");
    print("<ol>\n");
    for($i = 0; $i<=$#kody; $i++)
    {
        $predch = vypsat_odkaz_na_hru_do_seznamu($kody[$i], $predch);
    }
    print("</ol>\n");
}



# Vypsat závěr stránky.
print <<EOF
<div align=right>
<hr>
<address>&copy; 2002 - 2005 Paluba</address>
</div>
</body>
</html>
EOF
;



###############################################################################
# Podprogramy 
###############################################################################



#------------------------------------------------------------------------------
# Čte globální hash %hry a globální proměnnou $koren_hrejsi.
# Vrátí název hry, abychom si ho mohli zapamatovat do příště a poznat, kdy
# začíná nové písmeno abecedy.
#------------------------------------------------------------------------------
sub vypsat_odkaz_na_hru_do_seznamu
{
    my $hra = shift; # třípísmenný kód hry
    my $predch = shift; # název předcházející hry (abychom poznali nové písmeno v abecedě)
    if($predch eq "")
    {
        $predch = $hry{"$hra: nazev"};
    }
    # Vynechat hry, kterým databáze účast ve webové pokladnici nedoporučuje
    # (buď o nich nemáme téměř žádné informace, nebo dokonce nejde o skutečné hry).
    if($hry{"$hra: noweb"})
    {
        return $predch;
    }
    # Pokud to uživatel požaduje, vynechat hry, ke kterým nemáme pravidla.
    # To testujeme tak ze se podivame jestli je tam soubor nazevhry/pravidla.htm 
    # nebo soubor nazevhry/pravidla.html
    if($pole{jenspravidly} && !((-e "/home/paluba/web/www/".$hry{"$hra: slozka hrejsi"}.'/pravidla.htm') || (-e "/home/paluba/web/www/".$hry{"$hra: slozka hrejsi"}.'/pravidla.html') ) )
    {
        return $predch;
    };
    # Pokud to uživatel požaduje, vynechat hry, které nemáme na Palubě.
    if($pole{jenlzezahrat} && $hry{"$hra: pocet exemplaru"}==0)
    {
        return $predch;
    }
    # Pokud to uživatel požaduje, vynechat hry, které nemáme na prodej.
    if($pole{jenlzekoupit} && !$hry{"$hra: prodej"})
    {
        return $predch;
    }
    print("<li>");
    # Začíná-li název hry na jiné písmeno než předcházející hra, vygenerovat
    # záložku pro skoky po abecedě.
    my $pismeno = substr($hry{"$hra: nazev"}, 0, 1);
    $pismeno = "CH" if(substr($hry{"$hra: nazev"}, 0, 2) =~ m/ch/i);
    if($pismeno ne substr($predch, 0, 1))
    {
        print("<a name=\"$pismeno\"/>\n");
    }
    # U všech her přednostně nabízet dynamickou stránku.
    print("<a href=\"hry.pl?hra=$hra\">".$hry{"$hra: nazev"}."</a>");
    # Vypsat všechny alternativní názvy hry.
    if(exists($hry{$hra}{_dalsi_nazvy}))
    {
        print(" (", join("; ", @{$hry{$hra}{_dalsi_nazvy}}), ")");
    }
    # Závěr.
    print("</li>\n");
    return $hry{"$hra: nazev"};
}



#------------------------------------------------------------------------------
# Zobrazí kořenovou stránku hry.
#------------------------------------------------------------------------------
sub generovat_stranku_hry {
    my $hra = shift; # kód hry, jejíž stránka se má generovat
    my $slozka = $hry{"$hra: slozka hrejsi"};
    my $pozadi = $hry{"$hra: htmlbgr"};
    my $text = $hry{"$hra: htmltext"};
    my $link = $hry{"$hra: htmllink"};
    my $vlink = $hry{"$hra: htmlvlink"};
    my $alink = $hry{"$hra: htmlalink"};
    my $nazev = $hry{"$hra: nazev"};
    my $dalsi_nazvy = $hry{"$hra: dalsi nazvy"};
    print("<html>\n");
    print("<head>\n");
    print("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n");
    print("<title>".$nazev."</title>\n");
    print("<meta name=\"keywords\" CONTENT=\"$nazev, ".$dalsi_nazvy.", deskové hry, pravidla\">\n");
    print("</head>\n");
    # Nastavit barvy pozadí a popředí.
    my $body = "<body";
    if($pozadi =~ m/\./) # obsahuje-li tečku, je to název souboru
    {
        $body .= " background=\"$koren_hrejsi/$slozka/$pozadi\"";
    }
    elsif($pozadi ne "") # neobsahuje-li tečku, je to kód nebo název barvy
    {
        $body .= " bgcolor=\"$pozadi\"";
    }
    $body .= " text=\"$text\"" if($text ne "");
    $body .= " link=\"$link\"" if($link ne "");
    $body .= " vlink=\"$vlink\"" if($vlink ne "");
    $body .= " alink=\"$alink\"" if($alink ne "");
    $body .= ">";
    $body .= "<b>" if($hry{"$hra: htmltuc"});
    print("$body\n");
    print("Zpět nahoru: [ <a href=\"hry.pl\">seznam her</a> ].\n");
    print("<hr>\n");

    # Pokud existuje, zobrazit barevný nadpis.
    if($slozka ne "" && -f "$koren_system/$slozka/obr/nadpis.gif")
    
    # if($slozka ne "")# && -f $nadpis) Tahle kontrola nefunguje, protože cesta z pohledu webu není stejná jako skutečná cesta v rámci systému.
    {
        my $nadpis = "$koren_hrejsi/$slozka/obr/nadpis.gif";
        print("<h1 align=center><a name=\"zacatek\"><img src=\"$nadpis\" alt=\"$nazev\"></a></h1>\n");
    }
    else
    {
        print("<h1 align=center><a name=zacatek>$nazev</a></h1>\n");
    }
    my $neboli;
    if($dalsi_nazvy)
    {
        $neboli = $dalsi_nazvy;
        $neboli = "<center>neboli $neboli</center>";
    }
    print("$neboli\n");



 print("<table width=100%><tr><td>\n");

    print("<h2><a name=\"Charakteristika\">Charakteristika</a></h2>\n");

    if ($hry{"$hra: pocet hracu"} ne "") 
        {print("<p><b>Počet hráčů:</b> ".$hry{"$hra: pocet hracu"}.".\n")};
    if ($hry{"$hra: min vek"} !=0) 
        {print("<br><b>Doporučený věk:</b> alespoň ".$hry{"$hra: min vek"}." let.\n")};
    if ($hry{"$hra: min delka"} !=0) 
        {print("<br><b>Délka hry:</b> ".$hry{"$hra: min delka"}." až ".$hry{"$hra: max delka"}." minut.\n")};
    if(scalar(@{$hry{$hra}{_vydavatele}})>0)
    {
        print("<br><b>Vydavatel:</b> ", join(", ", @{$hry{$hra}{_vydavatele}}), ".\n");
    }
    if ($hry{"$hra: rok vydani"} !=0) 
        {print("<br><b>Rok vydání:</b> ".$hry{"$hra: rok vydani"}.".\n")};
    if ($hry{"$hra: autor"} ne "") 
        {print("<br><b>Autor:</b> ".$hry{"$hra: autor"}.".\n")};
    if ($hry{"$hra: oceneni"} ne "") 
        {print("<br><b>Ocenění:</b> ".$hry{"$hra: oceneni"}.".</p>\n")};
    print("<p>".$hry{"$hra: upoutavka"}."</p>\n");
    print("<p>".$hry{"$hra: charakteristika"}."</p>\n");

    # Vypsat odkazy na stránky o této hře.
    # Zatím předpokládáme, že funkce generovat_stranku_hry() se volá jen jednou během jednoho běhu skriptu, jinak by bylo
    # efektivnější načíst tabulku odkazů dopředu!
    my $odkazy = access::cist_tabulku_access("odkazy.txt");
    print("<ul>\n");
    for(my $i = 0; $i<=$#{$odkazy}; $i++)
    {
        if($odkazy->[$i]{hra} eq $hra)
        {
            my $odkaz;
            unless($odkazy->[$i]{adresa} =~ m/^(\/|http:)/)
            {
                $odkaz = "$koren_hrejsi/$slozka/";
            }
            $odkaz .= $odkazy->[$i]{adresa};
            print("<li><a href=\"$odkaz\">$odkazy->[$i]{text}</a></li>\n");
        }
    }

    # Pokud to uživatel požaduje, vynechat hry, které nemáme na prodej.
    if($hry{"$hra: prodej"})
    {
       print("<li><a href=\"prodej.pl?hra=$hra\">Hru lze koupit</a></li>\n");
    }



    print("</ul>\n");

 print("</td><td>\n");


    #!!! Chtělo by to kontrolu, že soubor s fotkou existuje!!!
    if($slozka ne "" && -f "$koren_system/$slozka/obr/fotka.jpg")
    {
        print("<img src=\"$koren_hrejsi/$slozka/obr/fotka.jpg\" align=right alt=\"fotografie\">\n");
    }


 print("</td></tr></table>\n");



    print("<hr>\n");
    print("<center>\n");
    print("<address>Vytvořil tým Klubu deskových her Paluba.</address>\n");
    print("<address>Obsah webových stránek je chráněn autorskými právy. Jeho reprodukce za komerčními účely <b>je zakázána</b>.</address>\n");
    print("<address>The contents of these web pages is copyrighted. Any reproduction for commercial use <b>is prohibited</b>.</address>\n");
    print("<p><a HREF=\"http://www.hrejsi.cz/paluba/\"><img SRC=\"$koren_hrejsi/obr/logo.gif\" ALT=\"[PALUBA]\" BORDER=\"0\" WIDTH=\"95\" HEIGHT=\"94\"></a>\n");
    print("</center>\n");
    print("</b>\n") if($hry{"$hra: htmltuc"});
    print("</body>\n");
    print("</html>\n");
}
