#!/usr/bin/perl
use strict;
use warnings;

$| = 1;

#-------------- Konfiguration ------------------
#my $CGI = 1;  # Ausgabe als CGI-Programm
my $CGI = 0;  # Ausgabe in Datei

# Pfad zu den Bildern innerhalb "Document Root"
# Achtung: '/' am Ende noetig!
# wird bei $CGI = 0 auf '' gesetzt
#     (Bilder im akt Verzeichnis).
my $imgpath = '/kalender/';
#-------------- Konfiguration ------------------

my @months = (' ', 'Januar', 'Februar', 'März', 'April',
              'Mai', 'Juni', 'Juli', 'August', 'September',
              'Oktober', 'November', 'Dezember');

my @weekdays = (' ', 'Montag', 'Dienstag', 'Mittwoch',
                'Donnerstag', 'Freitag', 'Samstag',
                '<FONT COLOR="#EE0000">Sonntag</FONT>');
my $file;

# aktuelles Jahr:
my $year  = (localtime(time))[5] + 1900;
# aktueller Monat:
my $month = (localtime(time))[4] + 1;
# im November und Dezember gibt's den Kalender vom kommenden Jahr
$year++ if ($month > 10);

# "$start" ist der Tag, auf den der 1. eines Monats faellt:
# 0=So, 1=Mo, 2=Di, 3=Mi, 4=Do, 5=Fr, 6=Sa
my @start = ();
for my $month (1 .. 12)
  { $start[$month] = weekday(1,$month,$year); }

# "$end" enthaelt den letzten Tag des jeweiligen Monats
my @end = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
# Schaltjahr?
$end[2] = 29 if ((($year%4 == 0) and ($year%100 != 0)) or ($year%400 == 0));

if ($CGI)
  {
  # Ausgabe als CGI-Programm
  $file = '>&STDOUT';
  print "Content-type: text/html\n\n";
  }
else
  {
  # Ausgabe in Datei:
  $file = '>Kalender_' . $year .'.html';
  $imgpath = '';
  }
# die 3-Parametervariante von Open geht hier nicht
open(DAT,$file) || die "Oops: $!\n";
print DAT "<HTML><HEAD><TITLE> $year </TITLE></HEAD>\n",
          "<BODY BGCOLOR='#FFFFFF' TEXT='#000000'>\n";
for $month (1 .. 12)
  { print DAT calendar($month,$year); }
print DAT "</BODY></HTML>\n";
close(DAT);

sub calendar #(Month, Year)
  {
  my($month, $year) = @_;
  my (@days, $table, $file, $i, $day);

  # etwas seltsame Rechnerei, weil So = 0 ist, aber in die 7. Spalte soll
  if ($start[$month] == 0)
    { $day = -5; }
  else
    { $day = 2 - $start[$month]; }
  # HTML-Style-Trick: beim Drucken kommt jedes Blatt auf eine Seite
  $table = '<P style="page-break-after:always">
   <DIV ALIGN="CENTER"><BR /> <BR />
   <IMG SRC="' . $imgpath . $month . '.jpg" width="640"><BR /> <BR /> <BR />
   <TABLE BORDER="2" WIDTH="640" CELLSPACING="0" CELLPADDING="8">
   <TR><TH COLSPAN="7"> ' . "$months[$month] $year" . '</TH>
   </TR><TR>';
  for $i (1 .. 7)
      { $table .= '<TH WIDTH="14%">' . $weekdays[$i] . '</TH>'; }
  $table .= "</TR>\n";
  while ($day <= $end[$month])
    {
    for $i (1 .. 7)
      {
      if ($day > 0 && $day <= $end[$month])
        { $days[$i] = $day; }
      else
        {$days[$i] = '&nbsp;'; }
      $day++;
      }
    $table .= '<TR VALIGN="TOP">';
    for $i (1 .. 6)
      { $table .=  '<TD ALIGN="RIGHT">' . $days[$i] . '</TD>'; }
    $table .=  '<TD ALIGN="RIGHT"><FONT COLOR="#EE0000">' .
               $days[7] . '</FONT></TD></TR>' . "\n";
    }
  $table .=  "</TABLE></DIV></P>\n";
  return($table);
  }

sub weekday # ($dd, $mm, $yyyy)
  {
  # Wochentagsberechnung
  my($d, $m, $y) = @_;
  my @hd = (0,3,2,5,0,3,5,1,4,6,2,4);
  $y-- if $m < 3;
  my $day = ($y+int($y/4)-int($y/100)+int($y/400)+$hd[$m-1]+$d) % 7;
  return ($day);
  }