#!/usr/bin/perl
use strict;
#
# Formular fuer die Abstimmung
# <form action="/cgi-bin/poll.cgi method=POST>
# <table border=0 cellspacing=0 cellpadding=2>
# <tr><td colspan=2></td></tr>
# <tr><th colspan=2>FRAGETEXT</th></tr>
# <tr><td><input type=radio name=vote value=0></td>
#     <td>ERSTE ANTWORTALTERNATIVE</td></tr>
# <tr><td><input type=radio name=vote value=1></td>
#     <td>ZWEITE ANTWORTALTERNATIVE</td></tr>
#
#   ... usw. (value immer um 1 erhoehen)
#
# <td colspan=2>
# <center><input type=submit name=submit value=absenden></center></td>
# </tr></table></form>
#
# 
# Fragetext und Antwortalternativen des HTML-Formulars sind die gleichen 
# wie in der Datei poll.dat, die in der ersten Zeile den Fragetext 
# enthaelt und danach durch Doppelpunkt getrennt die Zahl der Antwort-
# alternativen. 
# In den folgenden Zeilen steht jeweils eine Antwortalternative, gefolgt
# von einem Doppelpunkt und der Anzahl der Stimmen (anfangs auf 0 setzen).
# Zum Beispiel:
#
#     Was halten Sie von dieser Demo-Frage?:5
#     Gar nichts:0
#     Nicht viel:0
#     Geht so:0
#     Ganz O.K.:0
#     Super!:0
#
# Wird das Skript ohne Parameter aufgerufen, erfolgt die Anzeige des 
# Poll-Ergebnisses
#
# Der folgende Pfad zur Datendatei muss angepasst werden
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
my $poll = "/opt/www/data/poll.dat";
# Die Datei muss fuer den HTTP-Daemon schreibbar sein (user wwwrun oder so)
#
# ------------------------------------------------------------------------
# Ab hier ist eigentlich nichts mehr zu aendern
#
my $numalt = 0;       # Anzahl Antwortalternativen
my $quest = '';       # Text der Frage
my $vote = '';        # Stimme aus dem Formular
my @text = ();        # Alternativen-Texte
my @voting = ();      # Wahlhaeufigkeiten der Alternativen
my @percent = ();     # Prozentsaetze der Antworten
my %FORM = ();        # Hash fuer Formulardaten

### Main Program ###
&parse; 
&load;
print "Content-type: text/html\n\n";
$vote = $FORM{'vote'};
&update if ($vote ne "");  # Neue Abstimmung
&percent;                  # Ergebnis anzeigen
&result;
### end main ###

sub parse 
  {
  my $pair = '';
  my @pairs = ();
  my $buffer = '';
  my $name = '';
  my $value = '';

  read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
  @pairs = split(/&/, $buffer);
  foreach $pair (@pairs) 
    {
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $FORM{$name} = $value;
    }
  }

sub load 
  {
  my $i = 0;
  my $line = '';

  open(DATA,"<$poll") || die("Cannot open $poll for reading");
  flock(DATA, 2); # exclusive lock
  $line = <DATA>; chomp($line);
  ($quest,$numalt) = split(/:/,$line);
  for ($i = 0; $i < $numalt; $i++)
    {
    $line = <DATA>; chomp($line);
    ($text[$i], $voting[$i]) = split(/:/,$line);
    }
  flock(DATA, 8); # unlock
  close(DATA);
  }


sub update 
  {
  my $i = 0;

  $voting[$vote]++; # update votings
  open(DATA,">$poll") || die("Cannot open $poll for writing");
  flock(DATA, 2); # exclusive lock
  print DATA $quest . ":" . $numalt . "\n";
  for ($i = 0; $i < $numalt; $i++)
    { print DATA $text[$i]. ':' . $voting[$i] . "\n"; }
  flock(DATA, 8); # unlock
  close (DATA);  
  }


sub percent 
  {  
  my $sum = 0;
  my $i = 0;

  for ($i = 0; $i < $numalt; $i++)
    { $sum = $sum + $voting[$i]; }
  for ($i = 0; $i < $numalt; $i++)
    {
    $percent[$i] = 0.00;
    if ($voting[$i] > 0) 
      { $percent[$i] = sprintf("%5.2f",($voting[$i]*100/$sum)); }
    }
  }

sub result
  {
  my $i = 0;
  my $ip = 0;

  print qq~
  <html><head><title>Poll</title></head>
  <body text="#000000" bgcolor="#ffffff">
  <p>
  Vielen Dank f&uuml;r Ihre Teilnahme an der Abstimmung zur Frage<br>
  <B>$quest</B>.
  <P><UL>
  <table border=1 cellspacing=0 cellpadding=4>
  <tr><th colspan=4>Bisheriges Abstimmungsergebnis</th></tr>
  <tr><td>&nbsp;</td>
      <td align=center>Anzahl </td>
      <td align=center>&nbsp; </td>
      <td align=center>Prozent </td></tr>~;
  for ($i = 0; $i < $numalt; $i++)
    {
    $ip = int($percent[$i]*2);
    print "<tr><td>$text[$i]</td>\n";
    print "<td align=right bgcolor=\"#dddddd\">$voting[$i]</td>\n";
    print "<td align=left bgcolor=\"#dddddd\" width=220>";
    # Balken wird als einzeilige Tabelle mit variabler Breite realisiert
    print "<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0 BGCOLOR=\"#0000cc\"";
    print " HEIGHT=10 WIDTH=$ip>\n";
    print "<TR><TD>\&nbsp;</TD></TR></TABLE></td>\n";
    print "<td align=right bgcolor=\"#dddddd\">$percent[$i] \%</td>\n";
    print "</tr>\n";
    }
  print qq~
  <tr><th colspan=4><a href="javascript:history.back()">Zur&uuml;ck</a></th></tr>
  </table></ul><p>
  </body></html>~; 
 }

