# Unquote form data
sub unhtml {
  my ($str) = @_;
  $str =~ s/%([0-9a-f]{2})/chr(hex($1))/eig;
  $str =~ s/\+/ /g;
  $str;
}

# Make strings safe for form values
sub html_safe {
  my ($str) = @_;
  $str =~ s/"/&quot;/g;
  $str;
}

sub parse_query {
  my $QUERY_STRING;
  if ($ENV{REQUEST_METHOD} eq "POST") {
    read(STDIN,$QUERY_STRING,$ENV{CONTENT_LENGTH});
  } else {
    $QUERY_STRING = $ENV{QUERY_STRING};
  }
  chomp($QUERY_STRING);
  # $QUERY_STRING is of the form:  "variable=value&var2=val2&.."
  my @querys=split(/[\&\?]/,$QUERY_STRING);
  my (%query,$var,$val);
  foreach my $str (@querys) {
    $var=$str if (!(($var,$val) = ($str =~ /([^=]*)=(.*)/)));
    $val=unhtml($val);
    $query{$var}=$val;
  }

  \%query;
}

sub check_form_page1 {
  my ($query) = @_;
  my @bad;
  $_ = $query->{first_name};  push(@bad,[first_name,""])
    unless (/\S/);
  $_ = $query->{email};  push(@bad,[email,"email must be of form <i>login\@somewhere.com</i>"])
    unless (/\S\@\S+\.\S+/);
  $_ = $query->{cost};  push(@bad,[cost,"cost must be a number"])
    unless (/^\d+$/ && $_);
  push(@bad,[airport,"Must select one of the Airport: options"])
    unless ($query->{airport});
  $_ = $query->{airport};  push(@bad,[airport,""])
    unless ($_ ne none || 0);
  $_ = $query->{airport};  push(@bad,[airport,"Mike lives in oak"])
    unless ($_ ne oak || $query->{first_name} =~ /mike/);
  push(@bad,[fav_color,"Must select one of the Favorite color options"])
    unless ($query->{fav_color});
  $_ = $query->{fav_color};  push(@bad,[fav_color,"Only people named Mike like the color red"])
    unless ($_ ne red || $query->{first_name} =~ /mike/);
  return unless @bad;
  print "<h2>Error: fields are missing or invalid (marked in red)</h2>\n";
  my @bad_fields;
  foreach ( @bad ) {
    push(@bad_fields,$_->[0]);
    print "<li> <font color=red>$_->[1]</font>\n" if ($_->[1]);
  }
  @bad_fields;
}

sub check_form_page2 {
  my ($query) = @_;
  my @bad;
  $_ = $query->{salary};  push(@bad,[salary,"Salary must be a number"])
    unless (/^\d+$/ && $_);
  return unless @bad;
  print "<h2>Error: fields are missing or invalid (marked in red)</h2>\n";
  my @bad_fields;
  foreach ( @bad ) {
    push(@bad_fields,$_->[0]);
    print "<li> <font color=red>$_->[1]</font>\n" if ($_->[1]);
  }
  @bad_fields;
}

sub form_page1 {
  my ($query,@bad_fields) = @_;
  my %did_fields;
  print "<form method=POST>\n";
  print "  <table>\n";
  $did_fields{form_number} = 1;
  print "    <tr>\n";
  print "    <td align=left colspan=2><input type=hidden name='form_number' value='1' ></td>\n";
  print "    </tr>\n";
  $did_fields{first_name} = 1;
  print "    <tr>\n";
  if (grep(first_name eq $_, @bad_fields)) {
  print "    <td align=left><font color='red'>First Name:</font></td>\n";
  } else {
  print "    <td align=left>First Name:</td>\n";
  }
  print "    <td align=left><input name='first_name' value=";
  print '"'.html_safe($query->{first_name}).'"';
  print " size='25' maxsize='100'></td>\n";
  print "    </tr>\n";
  $did_fields{email} = 1;
  print "    <tr>\n";
  if (grep(email eq $_, @bad_fields)) {
  print "    <td align=left><font color='red'>Email:</font></td>\n";
  } else {
  print "    <td align=left>Email:</td>\n";
  }
  print "    <td align=left><input name='email' value=";
  print '"'.html_safe($query->{email}).'"';
  print " size='25' maxsize='100'></td>\n";
  print "    </tr>\n";
  $did_fields{cost} = 1;
  print "    <tr>\n";
  if (grep(cost eq $_, @bad_fields)) {
  print "    <td align=left><font color='red'>Cost:</font></td>\n";
  } else {
  print "    <td align=left>Cost:</td>\n";
  }
  print "    <td align=left><input name='cost' value=";
  print '"'.html_safe($query->{cost}).'"';
  print " size='5' maxsize='10'></td>\n";
  print "    </tr>\n";
  $did_fields{airport} = 1;
  print "    <tr>\n";
  if (grep(airport eq $_, @bad_fields)) {
  print "    <td align=left><font color='red'>Airport:</font></td>\n";
  } else {
  print "    <td align=left>Airport:</td>\n";
  }
  print "    <td align=left>\n";
  print "    <select name='airport'>\n";
  print "<option value='none'";
  print " selected" if ($query->{airport} eq "none");
  print ">Where are you flying into?</option>\n";
  print "<option value='sfo'";
  print " selected" if ($query->{airport} eq "sfo");
  print ">SFO</option>\n";
  print "<option value='oak'";
  print " selected" if ($query->{airport} eq "oak");
  print ">OAK</option>\n";
  print "<option value='sjc'";
  print " selected" if ($query->{airport} eq "sjc");
  print ">SJC</option>\n";
  print "    </select></td></tr>\n";
  $did_fields{fav_color} = 1;
  print "    <tr>\n";
  if (grep(fav_color eq $_, @bad_fields)) {
  print "    <td align=left><font color='red'>Favorite color</font></td>\n";
  } else {
  print "    <td align=left>Favorite color</td>\n";
  }
  print "    <td align=left>\n";
  print "    <input type='radio' name='fav_color' value='red'";
  print " checked" if ($query->{fav_color} eq "red");
  print "> Red\n";
  print "    <input type='radio' name='fav_color' value='green'";
  print " checked" if ($query->{fav_color} eq "green");
  print "> Green\n";
  print "    <input type='radio' name='fav_color' value='blue'";
  print " checked" if ($query->{fav_color} eq "blue");
  print "> Blue\n";
  $did_fields{next} = 1;
  print "    <tr>\n";
  print "    <td align=left colspan=2><input type=submit name='next' value='Next page' ></td>\n";
  print "    </tr>\n";
  print "  </table>\n";
  foreach my $k ( keys %$query ) {
    next if ($did_fields{$k});
  print "    <input type='hidden' name='$k' value=";
  print '"'.html_safe($query->{$k}).'"';
  print ">\n";
  }
  print "</form>\n";
}

sub form_page2 {
  my ($query,@bad_fields) = @_;
  my %did_fields;
  print "<form method=POST>\n";
  print "  <table>\n";
  $did_fields{form_number} = 1;
  print "    <tr>\n";
  print "    <td align=left colspan=2><input type=hidden name='form_number' value='2' ></td>\n";
  print "    </tr>\n";
  $did_fields{days} = 1;
  print "    <tr>\n";
  if (grep(days eq $_, @bad_fields)) {
  print "    <td align=left><font color='red'>Select days</font></td>\n";
  } else {
  print "    <td align=left>Select days</td>\n";
  }
  print "    <td align=left>\n";
  print "    <select name='days'>\n";
  print "<option value='fri'";
  print " selected" if ($query->{days} eq "fri");
  print ">Friday: \$50</option>\n";
  print "<option value='sat'";
  print " selected" if ($query->{days} eq "sat");
  print ">Saturday: \$50</option>\n";
  print "<option value='package'";
  print " selected" if ($query->{days} eq "package");
  print ">Package deal: \$95</option>\n";
  print "    </select></td></tr>\n";
  $did_fields{salary} = 1;
  print "    <tr>\n";
  if (grep(salary eq $_, @bad_fields)) {
  print "    <td align=left><font color='red'>Annual Salary: \$</font></td>\n";
  } else {
  print "    <td align=left>Annual Salary: \$</td>\n";
  }
  print "    <td align=left><input name='salary' value=";
  print '"'.html_safe($query->{salary}).'"';
  print " size='5' maxsize='10'></td>\n";
  print "    </tr>\n";
  $did_fields{reg} = 1;
  print "    <tr>\n";
  print "    <td align=left colspan=2><input type=submit name='reg' value='Register me' ></td>\n";
  print "    </tr>\n";
  print "  </table>\n";
  foreach my $k ( keys %$query ) {
    next if ($did_fields{$k});
  print "    <input type='hidden' name='$k' value=";
  print '"'.html_safe($query->{$k}).'"';
  print ">\n";
  }
  print "</form>\n";
}


1;
