#!/usr/bin/perl -w
use CGI;
use CGI::Carp qw(fatalsToBrowser);
$q = CGI::new();
$datafile="data.txt";
$smilyDir="../smilys/";
@alteEintraege=();
@neuerEintrag=();
$anzahlEintraege=0;
$time=0;
@smilyCommands=(':\)',':\(',':D',':mad:',';\)',':P',':rolleyes:',':cool:',':confused:',':eek:',':angry:',':smoke:',':beer:',':yeah:');
@smilyGifs=('happy.gif','sad.gif','laughin.gif','mad.gif','blink.gif','haha.gif','rolleyes.gif','cool.gif','confused.gif',
             'eek.gif','angry.gif','smoke.gif','beer.gif','yeah.gif');
$name=$q->param("name");
$email=$q->param("email");
$url=$q->param("url");
$beitrag=$param("beitrag");
if($name eq "" || $beitrag eq "")
{
 print "Content-type: text/html";
 print "
Error";
 print "";
 print "";
 print "Fehler: es wurde kein Name oder kein Betragstext eingegeben!";
 print "
";
 print "";
 print "";
}
else
{
 open(FILE,"<".$datafile) || die "Fehler beim Öffnen der Datei data.txt";
 flock(FILE,1);
 @alteEintraege=;
 close(FILE);
 $anzahlEintraege=&getNumberOfEntries(@alteEintraege);
 &filterHTML($name,$email,$url,$beitrag);
 &setSmilyTags($beitrag);
 $time=&getTime;
 ++$anzahlEintraege;
 push(@neuerEintrag, "\n");
 push(@neuerEintrag, "\n");
 push(@neuerEintrag, "| $name schrieb am $time: | 
\n");
 push(@neuerEintrag, "| \n");
 #wenn Format der E-Mail Adresse korrekt
 if(($email =~ /^([a-zA-Z0-9][a-zA-Z_0-9-\.]*)(\@)([a-zA-Z0-9][a-zA-Z_0-9-\.]*[a-zA-Z0-9])(\.)([a-zA-Z0-9]*)$/)){
   push(@neuerEintrag, "  \n");
       }
 #wenn Format der URL korrekt
 if($url=~/^http:\/\/[a-zA-Z0-9][a-zA-Z_0-9-\.]*(\.)[a-zA-Z0-9][a-zA-Z_0-9-\.]*/)
       {
        push(@neuerEintrag, "
  \n");
              }
 push(@neuerEintrag, " | $beitrag\n");
 push(@neuerEintrag, " | 
\n");
 push(@neuerEintrag, "
\n");
 unshift(@alteEintraege, @neuerEintrag);
 open(FILE,">".$datafile) || die "Fehler beim Öffnen der Datei data.txt";
 flock(FILE,2);
 foreach(@alteEintraege)
 {
  print FILE $_;
 }
 close(FILE);
}
###Subroutines
sub getNumberOfEntries
{
 $number=0;
 @zeilen=@_;
  foreach(@zeilen)
  {
  if(/\n/)
  {
   $number=$1;
   last;
  }
  }
 return $number;
}
sub filterHTML
{
 foreach(@_)
 {
  $_ =~ s/<[^>]*?>//g;  #HTML filtern
  $_ =~ s///g;   #SSI und Script Tags filtern
  $_ =~ s/"/"/g;   #Anführungszeichen " zu "
   $_ =~ s/\r//g;    #Returns (Wagenrücklauf) entfernen
   $_ =~ s/\n/
/g;   #Zeilenumbruch zu 
 umwandeln
 }
}
sub setSmilyTags
{
 for($zaehler=0;$zaehler<@smilyCommands;$zaehler++)
 {
  $ersatztext="";
  if($beitrag=~/$smilyCommands[$zaehler]/)
  {
   $ersatztext=" ";
   $beitrag=~s/$smilyCommands[$zaehler]/$ersatztext/gi;
  }
 }
}
sub getTime
{
 ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat,  $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
 $Monat+=1;
 $Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat;
 $Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag;
 $Stunden = $Stunden < 10 ? $Stunden = "0".$Stunden : $Stunden;
 $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten;
 $Jahr+=1900;
 return "$Monatstag.$Monat.$Jahr um $Stunden:$Minuten Uhr";
}
";
   $beitrag=~s/$smilyCommands[$zaehler]/$ersatztext/gi;
  }
 }
}
sub getTime
{
 ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat,  $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
 $Monat+=1;
 $Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat;
 $Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag;
 $Stunden = $Stunden < 10 ? $Stunden = "0".$Stunden : $Stunden;
 $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten;
 $Jahr+=1900;
 return "$Monatstag.$Monat.$Jahr um $Stunden:$Minuten Uhr";
}