#!/usr/local/bin/perl
#
# Math Journey CGI game
# $Id$
# Copyright (c) 2001, Quia Corporation. All rights reserved.
#
# created by pmishkin in 1999
#
# This CGI is invoked from the mathjourney.html page. Since it is our only
# Perl CGI game and we are not planning to add any other such games, some
# portions of it need not be maintained.
#

use BootstrapIXLPerlEnvironment; # include this first

use quia::util::GeneralUtils ;
use quia::conf::JavaQuiaConf ;
use quia::activities::mathjourney::ixlbanner ;

&ReadParse(*in) ;

srand;
$num_skills = &get_num_skills;
$html_content = 'Content-type: text/html; charset=utf-8';  # fixing bug 12173, ltang, 02/01/2008

if ($in{"missed_flag"} eq "y") {

   $skillset = $in{"skillset"};
   @skill_array = split(/-/, $skillset);
   $num_missed = $in{"num_missed"};
   $segment_id = $in{"segment_id"};

   if ($num_missed == 3) {
      $html = &get_over_html($segment_id);
      print $html_content . "\n\n";
      print $html . "\n\n";
      exit;
   }

} elsif ($in{"start_flag"} eq "y") {

   $skillset = "";
   for ($i = 0; $i < $num_skills; $i++) {
      if ($in{&get_skill_code($i)} eq "y") {
         push @skill_array, $i;
         $skillset .= "-" . $i;
      }
   }
   $skillset = substr($skillset, 1);
   $segment_id = 0;
   $num_missed = 0;

   if ($skillset eq "") {
      $msg = '<font face="arial,helvetica"><b>Error - No Skills Selected</b><br><br>
      You didn\'t select any skills.<br><br>Press your browser\'s
      <i>BACK</i> button and select the skills you want to practice.<br></font>
      ';

      print $html_content . "\n\n";
      print createErrorPage($msg);
      exit;
   }

} else {

   $skillset = $in{"skillset"};
   @skill_array = split(/-/, $skillset);
   $i = 1;
   while ($in{"part" . $i} ne "") {
      push @part_array, $in{"part" . $i};
      $i++;
   }

   $answer_string = &uncommaize($in{"answer1"});
   $i = 2;
   while ($in{"answer" . $i} ne "") {
      $answer_string .= "||" . &uncommaize($in{"answer" . $i});
      $i++;
   }

   $num_missed = $in{"num_missed"};
   $segment_id = $in{"segment_id"};
   $problem_type = $in{"problem_type"};

   # check for missing answer here
   # if missing answer, show error page

   # check for answer correctness here
   $is_correct = &check_answer($problem_type, $answer_string, @part_array);

   if ($is_correct eq "n") {
      $num_missed++;
      $html = &get_missed_html($segment_id, $num_missed, $problem_type, $skillset, @part_array);
      print $html_content . "\n\n";
      print $html . "\n\n";
      exit;
   }

   # check for win here
   # show win page or next train page

   $segment_id++;

   if ($segment_id == 30) {
      $html = &get_win_html($num_missed);
      print $html_content . "\n\n";
      print $html . "\n\n";
      exit;
   }

}

# Step 2.  Select a random skill and get a problem
$skill_id = $skill_array[int(rand(scalar(@skill_array)))];
@part_array = &get_problem($skill_id);
$train_html = &get_train_html($segment_id, $num_missed, $skill_id, $skillset, @part_array);

# Train html output

print $html_content . "\n\n";
print $train_html . "\n\n";


#
# subroutines
#

sub get_num_skills {
   return 21;
}

sub uncommaize {
   my($value) = @_;

   $value =~ s/,//g;

   return $value;
}

sub commaize {
   my($value) = @_;

   my($before_dec, $after_dec, $with_commas);

   my(@part_array) = split(/\./, $value);

   $before_dec = $part_array[0];
   $after_dec = "";
   if ($#part_array > 0) {
      $after_dec = "." . $part_array[1];
   }

   $with_commas = "";
   while (length($before_dec) >= 3) {
      $with_commas = "," . substr($before_dec, length($before_dec) - 3) . $with_commas;
      $before_dec = substr($before_dec, 0, length($before_dec) - 3);
   }
   $with_commas = $before_dec . $with_commas;
   if (substr($with_commas, 0, 1) eq ',') {
      $with_commas = substr($with_commas, 1);
   }

   $with_commas = $with_commas . $after_dec;

   return $with_commas;
}

sub get_miles {
   my($segment_id) = @_;
   my($miles);

      if ($segment_id == 0) { $miles = 0; }
   elsif ($segment_id == 1) { $miles = 216; }
   elsif ($segment_id == 2) { $miles = 1175; }
   elsif ($segment_id == 3) { $miles = 1949; }
   elsif ($segment_id == 4) { $miles = 3038; }
   elsif ($segment_id == 5) { $miles = 5500; }
   elsif ($segment_id == 6) { $miles = 6164; }
   elsif ($segment_id == 7) { $miles = 7052; }
   elsif ($segment_id == 8) { $miles = 8946; }
   elsif ($segment_id == 9) { $miles = 9523; }
   elsif ($segment_id == 10) { $miles = 10288; }
   elsif ($segment_id == 11) { $miles = 11644; }
   elsif ($segment_id == 12) { $miles = 13189; }
   elsif ($segment_id == 13) { $miles = 14081; }
   elsif ($segment_id == 14) { $miles = 14635; }
   elsif ($segment_id == 15) { $miles = 16505; }
   elsif ($segment_id == 16) { $miles = 18546; }
   elsif ($segment_id == 17) { $miles = 19891; }
   elsif ($segment_id == 18) { $miles = 24280; }
   elsif ($segment_id == 19) { $miles = 26678; }
   elsif ($segment_id == 20) { $miles = 28559; }
   elsif ($segment_id == 21) { $miles = 29745; }
   elsif ($segment_id == 22) { $miles = 31334; }
   elsif ($segment_id == 23) { $miles = 33281; }
   elsif ($segment_id == 24) { $miles = 34315; }
   elsif ($segment_id == 25) { $miles = 38273; }
   elsif ($segment_id == 26) { $miles = 40813; }
   elsif ($segment_id == 27) { $miles = 43006; }
   elsif ($segment_id == 28) { $miles = 44310; }
   elsif ($segment_id == 29) { $miles = 45096; }
   elsif ($segment_id == 30) { $miles = 45870; }

   return $miles;
}

sub get_start_city {
   my($segment_id) = @_;
   my($city);

      if ($segment_id == 0) { $city = "London, United Kingdom"; }
   elsif ($segment_id == 1) { $city = "Paris, France"; }
   elsif ($segment_id == 2) { $city = "Stockholm, Sweden"; }
   elsif ($segment_id == 3) { $city = "Moscow, Russia"; }
   elsif ($segment_id == 4) { $city = "Istanbul, Turkey"; }
   elsif ($segment_id == 5) { $city = "Karachi, Pakistan"; }
   elsif ($segment_id == 6) { $city = "New Delhi, India"; }
   elsif ($segment_id == 7) { $city = "Dacca, Bangladesh"; }
   elsif ($segment_id == 8) { $city = "Beijing, China"; }
   elsif ($segment_id == 9) { $city = "Seoul, South Korea"; }
   elsif ($segment_id == 10) { $city = "Tokyo, Japan"; }
   elsif ($segment_id == 11) { $city = "Taipei, Taiwan"; }
   elsif ($segment_id == 12) { $city = "Bangkok, Thailand"; }
   elsif ($segment_id == 13) { $city = "Singapore"; }
   elsif ($segment_id == 14) { $city = "Jakarta, Indonesia"; }
   elsif ($segment_id == 15) { $city = "Perth, Australia"; }
   elsif ($segment_id == 16) { $city = "Sydney, Australia"; }
   elsif ($segment_id == 17) { $city = "Auckland, New Zealand"; }
   elsif ($segment_id == 18) { $city = "Honolulu, USA"; }
   elsif ($segment_id == 19) { $city = "San Francisco, USA"; }
   elsif ($segment_id == 20) { $city = "Mexico City, Mexico"; }
   elsif ($segment_id == 21) { $city = "San José, Costa Rica"; }
   elsif ($segment_id == 22) { $city = "Lima, Peru"; }
   elsif ($segment_id == 23) { $city = "Buenos Aires, Argentina"; }
   elsif ($segment_id == 24) { $city = "São Paulo, Brazil"; }
   elsif ($segment_id == 25) { $city = "Cape Town, South Africa"; }
   elsif ($segment_id == 26) { $city = "Nairobi, Kenya"; }
   elsif ($segment_id == 27) { $city = "Cairo, Egypt"; }
   elsif ($segment_id == 28) { $city = "Tunis, Tunisia"; }
   elsif ($segment_id == 29) { $city = "Madrid, Spain"; }

   return $city;
}

sub get_end_city {
   my($segment_id) = @_;
   my($city);

      if ($segment_id == 0) { $city = "Paris, France"; }
   elsif ($segment_id == 1) { $city = "Stockholm, Sweden"; }
   elsif ($segment_id == 2) { $city = "Moscow, Russia"; }
   elsif ($segment_id == 3) { $city = "Istanbul, Turkey"; }
   elsif ($segment_id == 4) { $city = "Karachi, Pakistan"; }
   elsif ($segment_id == 5) { $city = "New Delhi, India"; }
   elsif ($segment_id == 6) { $city = "Dacca, Bangladesh"; }
   elsif ($segment_id == 7) { $city = "Beijing, China"; }
   elsif ($segment_id == 8) { $city = "Seoul, South Korea"; }
   elsif ($segment_id == 9) { $city = "Tokyo, Japan"; }
   elsif ($segment_id == 10) { $city = "Taipei, Taiwan"; }
   elsif ($segment_id == 11) { $city = "Bangkok, Thailand"; }
   elsif ($segment_id == 12) { $city = "Singapore"; }
   elsif ($segment_id == 13) { $city = "Jakarta, Indonesia"; }
   elsif ($segment_id == 14) { $city = "Perth, Australia"; }
   elsif ($segment_id == 15) { $city = "Sydney, Australia"; }
   elsif ($segment_id == 16) { $city = "Auckland, New Zealand"; }
   elsif ($segment_id == 17) { $city = "Honolulu, USA"; }
   elsif ($segment_id == 18) { $city = "San Francisco, USA"; }
   elsif ($segment_id == 19) { $city = "Mexico City, Mexico"; }
   elsif ($segment_id == 20) { $city = "San José, Costa Rica"; }
   elsif ($segment_id == 21) { $city = "Lima, Peru"; }
   elsif ($segment_id == 22) { $city = "Buenos Aires, Argentina"; }
   elsif ($segment_id == 23) { $city = "São Paulo, Brazil"; }
   elsif ($segment_id == 24) { $city = "Cape Town, South Africa"; }
   elsif ($segment_id == 25) { $city = "Nairobi, Kenya"; }
   elsif ($segment_id == 26) { $city = "Cairo, Egypt"; }
   elsif ($segment_id == 27) { $city = "Tunis, Tunisia"; }
   elsif ($segment_id == 28) { $city = "Madrid, Spain"; }
   elsif ($segment_id == 29) { $city = "London, England"; }

   return $city;
}

sub check_answer {
   my($problem_type, $answer_string, @part_array) = @_;
   my(@answer_array) = split(/\|\|/, $answer_string);

   if ($problem_type eq "add") {
      if ($part_array[2] == $answer_array[0]) {
         return "y";
      }
   } elsif ($problem_type eq "sub") {
      if ($part_array[2] == $answer_array[0]) {
         return "y";
      }
   } elsif ($problem_type eq "mul") {
      if ($part_array[2] == $answer_array[0]) {
         return "y";
      }
   } elsif ($problem_type eq "div") {
      if (($part_array[2] == $answer_array[0]) && ($part_array[3] == $answer_array[1])) {
         return "y";
      }
   } elsif ($problem_type eq "rou") {
      if ($part_array[2] == $answer_array[0]) {
         return "y";
      }
   }

   return "n";
}

sub get_missed_answer_html {
   my($problem_type, @part_array) = @_;
   my($html);

   if ($problem_type eq "add") {
      $html = '<font size=+4 face=arial,helvetica>' . &commaize($part_array[0]) . ' + ' . &commaize($part_array[1]) . ' = <font color=red>' . &commaize($part_array[2]) . '</font></font>';
   } elsif ($problem_type eq "sub") {
      $html = '<font size=+4 face=arial,helvetica>' . &commaize($part_array[0]) . ' - ' . &commaize($part_array[1]) . ' = <font color=red>' . &commaize($part_array[2]) . '</font></font>';
   } elsif ($problem_type eq "mul") {
      $html = '<font size=+4 face=arial,helvetica>' . &commaize($part_array[0]) . ' X ' . &commaize($part_array[1]) . ' = <font color=red>' . &commaize($part_array[2]) . '</font></font>';
   } elsif ($problem_type eq "div") {
      $html = '<font size=+4 face=arial,helvetica>' . &commaize($part_array[1]) . ' &#247; ' . &commaize($part_array[0]) . ' = <font color=red>' . &commaize($part_array[2]) . '</font> r<font color=red>' . &commaize($part_array[3]) . '</font></font>';
   } elsif ($problem_type eq "rou") {
      $html = '<font size=+2 face=arial,helvetica>' . &commaize($part_array[0]) . ' rounded to the nearest ' . $part_array[1] . ' is <font color=red>' . &commaize($part_array[2]) . '</font>.</font>';
   }

   return $html;
}

# Fix bug 12239 -ltang 02/14/2008 Modify html content with IXL ads
sub get_win_html {
  my($num_missed) = @_;
  my($html, @html);

  @html = () ;

  $html = createPageHeader("Math Journey", "", "", "", "Math Journey", "", "", "") ;
  push(@html, $html) ;

  $html =<<"  _EOS_" ;
  <center>

  <table>
  <tr>
  <td><font size=+4 face=arial,helvetica>You win!</font></td>
  </tr>
  </table>

  <table cellspacing=4 cellpadding=4 border=0>
  <tr>
  <td>

  <table cellspacing=4 cellpadding=4 border=0>
  <tr>
  <!-- -->
  <!--<td width="150px"></td>-->
  <td>
  <img src="/img/mathjourney/me_win.jpg">
  </td>
  </tr>
  </table>

  </td></tr></table>
  <table cellspacing=4 cellpadding=4>
  <tr>
  <td><font face=arial,helvetica><b>Distance traveled:</b></font></td>
  <td><font face=arial,helvetica>45,870 miles (30 segments)</font></td>
  </tr><tr>
  <td><font face=arial,helvetica><b>Missed flights:</b></font></td>
  <td><font face=arial,helvetica>$num_missed</font></td>
  </tr>
  </table>
  <font face=arial,helvetica><b><a href="mathjourney.html">Start over</a></b></font>
  </center>
  </td></tr></table></center>
  </body></html>
  _EOS_
  push(@html, $html) ;

  return join("", @html) ;
}

# Fix bug 12239 -ltang 02/14/2008 Modify html content with IXL ads
sub get_over_html {
  my($segment_id) = @_;
  my($html, @html, $start_city);
  my($distance) = &get_miles($segment_id);
  my($distance_string) = &commaize($distance);
  my($segment_text) = $segment_id . " segments";

  if ($segment_id == 1) {
    $segment_text = "1 segment";
  }

  $start_city = &get_start_city($segment_id);

  @html = () ;

  $html = createPageHeader("Math Journey", "", "", "", "Math Journey", "", "", "") ;
  push(@html, $html) ;

  $html =<<"  _EOS_" ;
  <br>
  <center>
  <table>
  <tr>
  <td><font size=+3 face=arial,helvetica>Journey Over</font><br><br></td>
  </tr>
  <tr>
  <td><img src=img/me_xticket.jpg> <img src=img/me_xticket.jpg> <img src=img/me_xticket.jpg></td>
  </tr>
  </table>
  <table cellspacing=4 cellpadding=4 border=0>
  <tr>
  <td>
  <table cellspacing=4 cellpadding=4 border=0>
  <tr>
  <td>
  <img src=img/me_over.jpg>
  </td>
  </tr>
  </table>
  </td>
  </tr>
  </table>

  <table cellspacing=4 cellpadding=4>
  <tr>
  <td><font face=arial,helvetica><b>Final location:</b></font></td>
  <td><font face=arial,helvetica>$start_city</font></td>
  </tr>
  <tr>
  <td><font face=arial,helvetica><b>Distance traveled:</b></font></td>
  <td><font face=arial,helvetica>$distance_string miles ($segment_text)</font></td>
  </tr>
  </table>

  <table>
  <tr>
  <td colspan="3" align="center">
  <font face=arial,helvetica><b><a href="mathjourney.html">Start over</a></b></font>
  </td>
  </tr>
  </table>

  </center>
  </td></tr></table></center>
  </body></html>
  _EOS_
  push(@html, $html) ;

  return join("", @html) ;
}

sub get_missed_html {
  my($segment_id, $num_missed, $skill_id, $skillset, @part_array) = @_;
  my($html, @html);
  my($problem_html) = &get_missed_answer_html($skill_id, @part_array);

  @html = () ;

  $html = createPageHeader("Math Journey", "", "", "", "Math Journey", "", "", "") ;
  push(@html, $html) ;

  $html =<<"  _EOS_" ;
  <br>
  <center>
  <table>
  <tr>
  <td><font size=+3 face=arial,helvetica>You missed your flight!</font></td>
  </tr>
  </table>

  <table cellspacing=4 cellpadding=4 border=0>
  <tr>
  <td>

  <table cellspacing=4 cellpadding=4 border=0>
  <tr>
  <td>
  <img src=img/me_missed.jpg>
  </td>
  <td>
  </td>
  </tr>
  </table>

  </td>
  </tr>
  </table>
  $problem_html
  <form method="POST" action="mathjourney.cgi">
  <input type=hidden name=missed_flag value="y">
  <input type=hidden name=segment_id value="$segment_id">
  <input type=hidden name=num_missed value="$num_missed">
  <input type=hidden name=skillset value="$skillset">

  <input type=submit id=btn_continue value="Continue...">
  </form>

  </center>
  </td></tr></table></center>
  </body></html>
  _EOS_
  push(@html, $html) ;

  return join("", @html) ;
}

sub get_train_html {
   my($segment_id, $num_missed, $skill_id, $skillset, @part_array) = @_;

   my($html, @html, $form_html);
   my($code) = &get_skill_code($skill_id);

   my($problem_type) = substr($code, 0, 3);
   my($problem_level) = substr($code, 3, 1);
   my($start_city) = &get_start_city($segment_id);
   my($end_city) = &get_end_city($segment_id);
   my($xticket_html) = '<img src=img/me_xticket.jpg>&nbsp;&nbsp;';
   $xticket_html x= $num_missed;
   my($remaining_segments) = 30 - $segment_id;
   my($missed_text);
   my($scene_image) = "";
   my($distance) = &get_miles($segment_id);
   my($distance_remaining) = &get_miles(30) - $distance;
   my($distance_string) = &commaize($distance);
   my($distance_remaining_string) = &commaize($distance_remaining);

   my($segment_text) = $segment_id . " segments";
   if ($segment_id == 1) {
      $segment_text = "1 segment";
   }

   my($remaining_segment_text) = $remaining_segments . " segments";
   if ($remaining_segments == 1) {
      $remaining_segment_text = "1 segment";	# Bug fixed, ltang, 01/31/2008
   }

   if (	($segment_id == 0) ||
   		($segment_id == 1) ||
   		($segment_id == 3) ||
       	($segment_id == 6) ||
       	($segment_id == 8) ||
       	($segment_id == 10) ||
       	($segment_id == 16) ||
       	($segment_id == 18) ||
       	($segment_id == 19) ||
       	($segment_id == 20) ||
       	($segment_id == 21) ||
       	($segment_id == 27) ||
       	($segment_id == 29)) {
      $scene_image = '<img src=img/me_scene' . $segment_id . '.jpg>';
   }

   if ($num_missed == 0) {
      $missed_text = "No missed flights";
   } elsif ($num_missed == 1) {
      $missed_text = "1 missed flight";
   } else {
      $missed_text = "" . $num_missed . " missed flights";
   }

   if ($problem_type eq "add") {
      $form_html = &get_train_html_add($segment_id, $num_missed, $problem_level, $skillset, @part_array);
   } elsif ($problem_type eq "sub") {
      $form_html = &get_train_html_sub($segment_id, $num_missed, $problem_level, $skillset, @part_array);
   } elsif ($problem_type eq "mul") {
      $form_html = &get_train_html_mul($segment_id, $num_missed, $problem_level, $skillset, @part_array);
   } elsif ($problem_type eq "div") {
      $form_html = &get_train_html_div($segment_id, $num_missed, $problem_level, $skillset, @part_array);
   } elsif ($problem_type eq "rou") {
      $form_html = &get_train_html_rou($segment_id, $num_missed, $problem_level, $skillset, @part_array);
   }

  @html = () ;

  $html = createPageHeader("Math Journey", "", "", "", "Math Journey", "", "", "") ;
  push(@html, $html) ;

  $html =<<"  _EOS_" ;
  <br>
  <center>
  <table cellspacing=4 cellpadding=4 border=0>
  <tr>
  <td><center>
  <img src=img/me_seg$segment_id.jpg>
  </center></td>
  </tr>
  </table>

  <table>
  <tr>
  <td><img src=img/me_location.jpg valign=bottom></td>
  <td><font size=+3 face=arial,helvetica>$start_city</font></td>
  </tr><tr>
  <td><img src=img/me_destination.jpg></td>
  <td><font size=+3 face=arial,helvetica>$end_city</font></td>
  </tr>
  </table>

  <table>
  <tr>
  <td>$scene_image</td>
  <td>
  <table>
  <tr>
  <td><font face=arial,helvetica>Distance traveled:</font></td><td><font face=arial,helvetica>$distance_string miles ($segment_text)</font></td>
  </tr><tr>
  <td><font face=arial,helvetica>Distance remaining:</font></td><td><font face=arial,helvetica>$distance_remaining_string miles ($remaining_segment_text)</font></td>
  </tr><tr>
  <td><font face=arial,helvetica>$missed_text</font></td><td>$xticket_html</td>
  </tr><tr>
  <td><font face=arial,helvetica><a href="mathjourney.html">Start over</a></font></td>
  </tr>
  </table>
  </td>
  </tr>
  </table>

  <br><br>
  $form_html
  </center>
  </td></tr></table></center>
  </body></html>
  _EOS_
  push(@html, $html) ;

  return join("", @html) ;
}

sub get_train_html_add {
   my($segment_id, $num_missed, $problem_level, $skillset, @part_array) = @_;
   my($html);

   $html = '
   <font size=+4 face=arial,helvetica>' . &commaize($part_array[0]) . ' + ' . &commaize($part_array[1]) . ' = ?</font>
   <form method="POST" action="mathjourney.cgi">
   <input type=hidden name=problem_type value="add">
   <input type=hidden name=problem_level value="' . $problem_level . '">
   <input type=hidden name=part1 value="' . $part_array[0] . '">
   <input type=hidden name=part2 value="' . $part_array[1] . '">
   <input type=hidden name=part3 value="' . $part_array[2] . '">
   <input type=hidden name=segment_id value="' . $segment_id . '">
   <input type=hidden name=num_missed value="' . $num_missed . '">
   <input type=hidden name=skillset value="' . $skillset . '">
   <table cellspacing=4 cellpadding=4 border=0>
   <tr>
   <td><img src=img/me_board.jpg></td><td><font face=arial,helvetica>To board the flight, <br>enter the correct answer:</font></td>
   <td><input type=text name=answer1 id=ipt_answer1 size=10 height=50></td>
   <td><input type=submit value="Check Answer"></td>
   </tr>
   </table>
   </form>';

   return $html;
}

sub get_train_html_sub {
   my($segment_id, $num_missed, $problem_level, $skillset, @part_array) = @_;
   my($html);

   $html = '
   <font size=+4 face=arial,helvetica>' . &commaize($part_array[0]) . ' - ' . &commaize($part_array[1]) . ' = ?</font>
   <form method="POST" action="mathjourney.cgi">
   <input type=hidden name=problem_type value="sub">
   <input type=hidden name=problem_level value="' . $problem_level . '">
   <input type=hidden name=part1 value="' . $part_array[0] . '">
   <input type=hidden name=part2 value="' . $part_array[1] . '">
   <input type=hidden name=part3 value="' . $part_array[2] . '">
   <input type=hidden name=segment_id value="' . $segment_id . '">
   <input type=hidden name=num_missed value="' . $num_missed . '">
   <input type=hidden name=skillset value="' . $skillset . '">
   <table cellspacing=4 cellpadding=4 border=0>
   <tr>
   <td><img src=img/me_board.jpg></td><td><font face=arial,helvetica>To board the flight, <br>enter the correct answer:</font></td>
   <td><input type=text name=answer1 id=ipt_answer1 size=10 height=50></td>
   <td><input type=submit value="Check Answer"></td>
   </tr>
   </table>
   </form>';

   return $html;
}

sub get_train_html_mul {
   my($segment_id, $num_missed, $problem_level, $skillset, @part_array) = @_;
   my($html);

   $html = '
   <font size=+4 face=arial,helvetica>' . &commaize($part_array[0]) . ' X ' . &commaize($part_array[1]) . ' = ?</font>
   <form method="POST" action="mathjourney.cgi">
   <input type=hidden name=problem_type value="mul">
   <input type=hidden name=problem_level value="' . $problem_level . '">
   <input type=hidden name=part1 value="' . $part_array[0] . '">
   <input type=hidden name=part2 value="' . $part_array[1] . '">
   <input type=hidden name=part3 value="' . $part_array[2] . '">
   <input type=hidden name=segment_id value="' . $segment_id . '">
   <input type=hidden name=num_missed value="' . $num_missed . '">
   <input type=hidden name=skillset value="' . $skillset . '">
   <table cellspacing=4 cellpadding=4 border=0>
   <tr>
   <td><img src=img/me_board.jpg></td><td><font face=arial,helvetica>To board the flight, <br>enter the correct answer:</font></td>
   <td><input type=text name=answer1 id=ipt_answer1 size=10 height=50></td>
   <td><input type=submit value="Check Answer"></td>
   </tr>
   </table>
   </form>';

   return $html;
}

sub get_train_html_div {
   my($segment_id, $num_missed, $problem_level, $skillset, @part_array) = @_;
   my($html);

   $html = '
   <font size=+4 face=arial,helvetica>' . &commaize($part_array[1]) . ' &#247; ' . &commaize($part_array[0]) . ' = ?</font>
   <form method="POST" action="mathjourney.cgi">
   <input type=hidden name=problem_type value="div">
   <input type=hidden name=problem_level value="' . $problem_level . '">
   <input type=hidden name=part1 value="' . $part_array[0] . '">
   <input type=hidden name=part2 value="' . $part_array[1] . '">
   <input type=hidden name=part3 value="' . $part_array[2] . '">
   <input type=hidden name=part4 value="' . $part_array[3] . '">
   <input type=hidden name=segment_id value="' . $segment_id . '">
   <input type=hidden name=num_missed value="' . $num_missed . '">
   <input type=hidden name=skillset value="' . $skillset . '">
   <table cellspacing=4 cellpadding=4 border=0>
   <tr>
   <td><img src=img/me_board.jpg></td><td><font face=arial,helvetica>To board the flight, <br>enter the correct answer:</font></td>
   <td><nobr><input type=text name=answer1 id=ipt_answer1 size=8 height=50> <font face=arial,helvetica><b>r</b></font> <input type=text name=answer2 size=5 height=50></nobr></td>
   <td><input type=submit value="Check Answer"></td>
   </tr>
   </table>
   </form>';

   return $html;
}

sub get_train_html_rou {
   my($segment_id, $num_missed, $problem_level, $skillset, @part_array) = @_;
   my($html);

   $html = '
   <font size=+2 face=arial,helvetica>What is ' . &commaize($part_array[0]) . ' rounded to the nearest ' . $part_array[1] . '?</font>
   <form method="POST" action="mathjourney.cgi">
   <input type=hidden name=problem_type value="rou">
   <input type=hidden name=problem_level value="' . $problem_level . '">
   <input type=hidden name=part1 value="' . $part_array[0] . '">
   <input type=hidden name=part2 value="' . $part_array[1] . '">
   <input type=hidden name=part3 value="' . $part_array[2] . '">
   <input type=hidden name=segment_id value="' . $segment_id . '">
   <input type=hidden name=num_missed value="' . $num_missed . '">
   <input type=hidden name=skillset value="' . $skillset . '">
   <table cellspacing=4 cellpadding=4 border=0>
   <tr>
   <td><img src=img/me_board.jpg></td><td><font face=arial,helvetica>To board the flight, <br>enter the correct answer:</font></td>
   <td><input type=text name=answer1 id=ipt_answer1 size=10 height=50></td>
   <td><input type=submit value="Check Answer"></td>
   </tr>
   </table>
   </form>';

   return $html;
}

sub get_problem {
   my($i) = @_;

   my($code) = &get_skill_code($i);

   my($problem_type) = substr($code, 0, 3);
   my($problem_level) = substr($code, 3, 1);

   if ($problem_type eq "add") {
      return &get_problem_add($problem_level);
   } elsif ($problem_type eq "sub") {
      return &get_problem_sub($problem_level);
   } elsif ($problem_type eq "mul") {
      return &get_problem_mul($problem_level);
   } elsif ($problem_type eq "div") {
      return &get_problem_div($problem_level);
   } elsif ($problem_type eq "rou") {
      return &get_problem_rou($problem_level);
   }
}

sub get_problem_add {
   my($level) = @_;

   my($part1) = 0;
   my($part2) = 0;
   my($part3) = 0;
   my(@ret);

   if ($level == 1) {
      $part1 = int(rand(10));
      $part2 = int(rand(10));
   } elsif ($level == 2) {
      $part1 = int(rand(90)) + 10;
      $part2 = int(rand(100));
   } elsif ($level == 3) {
      $part1 = int(rand(900)) + 100;
      $part2 = int(rand(990)) + 10;
   } elsif ($level == 4) {
      $part1 = int(rand(9000)) + 1000;
      $part2 = int(rand(9900)) + 100;
   }

   $part3 = $part1 + $part2;

   @ret = ($part1, $part2, $part3);

   return @ret;
}

sub get_problem_sub {
   my($level) = @_;

   my($part1) = 0;
   my($part2) = 0;
   my($part3) = 0;
   my(@ret);

   if ($level == 1) {
      $part1 = int(rand(10));
      $part2 = int(rand(10));
   } elsif ($level == 2) {
      $part1 = int(rand(90)) + 10;
      $part2 = int(rand(100));
   } elsif ($level == 3) {
      $part1 = int(rand(900)) + 100;
      $part2 = int(rand(990)) + 10;
   } elsif ($level == 4) {
      $part1 = int(rand(9000)) + 1000;
      $part2 = int(rand(9900)) + 100;
   }

   if ($part1 < $part2) {
      $temp = $part1;
      $part1 = $part2;
      $part2 = $temp;
   }

   $part3 = $part1 - $part2;

   @ret = ($part1, $part2, $part3);

   return @ret;
}

sub get_problem_mul {
   my($level) = @_;

   my($part1) = 0;
   my($part2) = 0;
   my($part3) = 0;
   my(@ret);

   if ($level == 1) {
      $part1 = int(rand(10));
      $part2 = int(rand(10));
   } elsif ($level == 2) {
      $part1 = int(rand(90)) + 10;
      $part2 = int(rand(100));
   } elsif ($level == 3) {
      $part1 = int(rand(900)) + 100;
      $part2 = int(rand(990)) + 10;
   } elsif ($level == 4) {
      $part1 = int(rand(9000)) + 1000;
      $part2 = int(rand(9900)) + 100;
   }

   $part3 = $part1 * $part2;

   @ret = ($part1, $part2, $part3);

   return @ret;
}

sub get_problem_div {
   my($level) = @_;

   my($divisor, $quotient, $dividend, $remainder, $quotient_length);
   my(@ret);

   if ($level == 1) {
      $divisor = int(rand(9)) + 1;		# 1-9
      $quotient = int(rand(9)) + 1;		# 1-9
      $dividend = $divisor * $quotient;
      $remainder = int(rand($divisor));
      $dividend += $remainder;
   } elsif ($level == 2) {
      $divisor = int(rand(9)) + 1;					# 1-9
      $quotient_length = int(rand(3)) + 2;				# 2-4
      $quotient = int(rand(10 ** $quotient_length)) + 1;		# 100-10000
      $dividend = $divisor * $quotient;
      $remainder = int(rand($divisor));
      $dividend += $remainder;
   } elsif ($level == 3) {
      $divisor = int(rand(90)) + 10;					# 10-99
      $quotient_length = int(rand(3)) + 2;				# 2-4
      $quotient = int(rand(10 ** $quotient_length)) + 1;		# 100-10000
      $dividend = $divisor * $quotient;
      $remainder = int(rand($divisor));
      $dividend += $remainder;
   } elsif ($level == 4) {
      $divisor = int(rand(900)) + 100;					# 100-999
      $quotient_length = int(rand(3)) + 2;				# 2-4
      $quotient = int(rand(10 ** $quotient_length)) + 1;		# 100-10000
      $dividend = $divisor * $quotient;
      $remainder = int(rand($divisor));
      $dividend += $remainder;
   } elsif ($level == 5) {
      $divisor = int(rand(9000)) + 1000;				# 1000-9999
      $quotient_length = int(rand(3)) + 2;				# 2-4
      $quotient = int(rand(10 ** $quotient_length)) + 1;		# 100-10000
      $dividend = $divisor * $quotient;
      $remainder = int(rand($divisor));
      $dividend += $remainder;
   }

   @ret = ($divisor, $dividend, $quotient, $remainder);

   return @ret;
}

sub get_problem_rou {
   my($level) = @_;

   my($part1, $part2, $part3, $temp);
   my(@ret);

   if ($level == 1) {
      $part1 = int(rand(90)) + 10;	# 10-99
      $temp = $part1 % 10;
      $part3 = $part1 - $temp;
      if ($temp >= 5) {
         $part3 += 10;
      }
      $part2 = "ten";
   } elsif ($level == 2) {
      $part1 = int(rand(900)) + 100;	# 100-999
      $temp = $part1 % 100;
      $part3 = $part1 - $temp;
      if ($temp >= 50) {
         $part3 += 100;
      }
      $part2 = "hundred";
   } elsif ($level == 3) {
      $part1 = int(rand(9000)) + 1000;	# 1000-9999
      $temp = $part1 % 1000;
      $part3 = $part1 - $temp;
      if ($temp >= 500) {
         $part3 += 1000;
      }
      $part2 = "thousand";
   } elsif ($level == 4) {
      $part1 = int(rand(90000)) + 10000;	# 10000-99999
      $temp = $part1 % 10000;
      $part3 = $part1 - $temp;
      if ($temp >= 5000) {
         $part3 += 10000;
      }
      $part2 = "ten thousand (10,000)"
   }

   @ret = ($part1, $part2, $part3);

   return @ret;
}

sub get_skill_code {
   my($i) = @_;

   my($code) = "add1";

   if ($i == 0) {
      $code = "add1";
   } elsif ($i == 1) {
      $code = "add2";
   } elsif ($i == 2) {
      $code = "add3";
   } elsif ($i == 3) {
      $code = "add4";
   } elsif ($i == 4) {
      $code = "sub1";
   } elsif ($i == 5) {
      $code = "sub2";
   } elsif ($i == 6) {
      $code = "sub3";
   } elsif ($i == 7) {
      $code = "sub4";
   } elsif ($i == 8) {
      $code = "mul1";
   } elsif ($i == 9) {
      $code = "mul2";
   } elsif ($i == 10) {
      $code = "mul3";
   } elsif ($i == 11) {
      $code = "mul4";
   } elsif ($i == 12) {
      $code = "div1";
   } elsif ($i == 13) {
      $code = "div2";
   } elsif ($i == 14) {
      $code = "div3";
   } elsif ($i == 15) {
      $code = "div4";
   } elsif ($i == 16) {
      $code = "div5";
   } elsif ($i == 17) {
      $code = "rou1";
   } elsif ($i == 18) {
      $code = "rou2";
   } elsif ($i == 19) {
      $code = "rou3";
   } elsif ($i == 20) {
      $code = "rou4";
   }

   return $code;
}


#
# Checks whether the $HTTP_COOKIE environment variable sets a Quia session
# cookie of the form "quia_session=<number>_<string>".
#
# TODO - THIS DOES NOT WORK
sub userHasLoginCookies {
  my($cookieList) ;
  my $sessCookieName = "ixl_sess".$QUIA_CONF::SERVER_GROUPING_ID;
  if (defined ($cookieList = $ENV{HTTP_COOKIE})) {
    if ($cookieList =~ /\b$sessCookieName\=\d+\_\S+/) {
      return 1 ;
    }
  }
  return 0 ;
}


#
# Creates the beginning of a Web page, from the <HTML> tag
# through the <HEAD> and </HEAD> tags, and including a <BODY> tag
#
# Parameters:
#   page_title - the title of the page, to be appending within the <TITLE> tags after "Quia - ".
#   no_cache - if not null, include a pragma no-cache tag
#   expired - if not null, include a tag indicating an expiration date in the past
#   keywords - if not null, what to include in a meta keywords tag
#   bar_title - the text appearing in the navigation bar
#   help - the url that the "Help" image will link to; if null, will link to "faq.html"
#   up - the url that the "Up One Level" image will link to; if null, this
#   no_banner - if not null, indicates that ad banner should be omitted
#
# Returns:
#   an HTML string
#
sub createPageHeader {
  my($page_title, $no_cache, $expired, $keywords, $bar_title, $help, $up, $no_banner, $uri) = @_ ;
  my($html, $login, @html, $loginImage, $loginImageAlt, $loginImageTarget, $adText) ;
  my($auxmenu);

  # Set the login/logout link.
  if (userHasLoginCookies()) {
    $loginImage = "/img/ui/qhlogout.gif";
    $loginImageTarget = "/logout.cgi";
    $loginImageAlt = "Log Out";
  } else {
    $loginImage = "/img/ui/qhlogin.gif";
    $loginImageTarget = "/web";
    $loginImageAlt = "Log In";
  }
  $login =
    qq`<a href="$loginImageTarget"><img src="$loginImage" alt="$loginImageAlt" border="0"></a>` ;

  # Add a link to the Activity Manager if the user is logged in.
  # Note that we are not expecting the Activity Manager itself (now a Servlet)
  # to use this method.
  $auxmenu = "" ;
  if (userHasLoginCookies()) {
    $auxmenu = '<a href="/instructorZone"><img src="/img/ui/qhactman.gif" ' .
               'alt="Instructor Zone" border=0></a>&nbsp;&nbsp';
  }

  $bar_title = "" unless (defined $bar_title) ;

  $html = "<html><head>" ;
  if ((defined $no_cache) && ($no_cache ne "")) {
    $html .= '<meta http-equiv="Pragma" CONTENT="no-cache">' . "\n" ;
  }

  if ($expired ne "") {
    $html .= '<meta http-equiv="Expires" content="Tue, 25 August 1998 15:39:02 GMT">' . "\n" ;
  }

  if ($keywords ne "") {
    $html .= '<meta name="keywords" content="' . $keywords . '">' . "\n" ;
  }

  # Character {é, ã} fixing bug 12173, ltang, 01/31/2008
  $html .= '<meta content="text/html; charset=utf-8">' . "\n" ;

  push(@html, $html) ;

  # Script added, fixing bug 12173, ltang, 01/31/2008
  $html = qq`
  <title>Quia - $page_title</title>
  <script language = "javascript">
  function SetFocus()
  {
    var obj = document.getElementById('ipt_answer1');
    if (obj == null) {  obj = document.getElementById('btn_continue');  }
    if (obj == null) {  return;  }
    else {  obj.focus();  }
    return;
  }
  </script>
  </head>
  <body bgcolor="white" text="#000000" leftmargin="3" topmargin="3" link="#0000cc" vlink="#0000cc" alink="#0000cc" onload="SetFocus()">
  <center><table cellspacing=0 cellpadding=0 border=0 width=620><tr><td>
  `;  push(@html, $html) ;

  if ((! defined($help)) || ($help eq "")) {
    $help = "/faq.html";
  }

  if (defined($up) && ($up ne "")) {
    $up = '<a href="' . $up . '"><img src="/img/ui/qhup.gif" border="0"></a> &nbsp; ';
  }


  #
  #Keep the following banner text close and tight.  Don't add any extra new lines
  #unless absolutely necesssary.  Thanks!
  #-dk 8-2-00
  #

  $html =qq`
  <table width="620" cellspacing="0" cellpadding="0" border="0">
  <tr>
  <td colspan=2><a href="/"><img src="/img/ui/bn1.gif" border=0 alt="Quia"></a>`;
  push(@html, $html) ;

  $html=qq`</td></tr>
  <tr><td colspan=2><img src="/img/ui/bn2.gif"></td></tr>
  <tr><td bgcolor="#336699" colspan=2><font color=#ffffff face="arial,helvetica"><b>&nbsp;$bar_title</b></font></td></tr>
  <tr><td colspan=2><img src="/img/ui/bn3.gif"></td></tr>
  <tr><td align=left>&nbsp<a href="/index.html"><img src="/img/ui/qhhome.gif" border="0" alt="Quia Home"></a>&nbsp;&nbsp<a href="$help"><img src="/img/ui/qhhelp.gif" alt="Help"  border="0"></a>&nbsp;&nbsp;$login&nbsp;&nbsp;$auxmenu`;
  push(@html, $html);

  if(defined $adText) {
    $html=qq`</td><td align=right><img src="/img/ui/bn4.gif" alt="For your convenience, clicking on the banner opens a new browser window">&nbsp`;
    push(@html, $html);
  }
  $html=qq`</td></tr>`;
  push(@html, $html) ;

  #
  # Add Quia IXL ad banner below the Quia banner
  # -ltang 02/25/08
  #
  $banner=IXL_AD();

  $html=qq'
  </table>
  $banner
  ';
  push(@html, $html);

  return join("", @html) ;
}


#
# Creates a standard-looking error page
#
# Parameters:
#   error_html - a string containing a snippet of error text in html form
#   no_banner - if not null, hides the ad banner
#   no_cache - if not null, include a pragma no-cache tag
#
# Returns:
#   an HTML page containing an error message
#
sub createErrorPage {
  my($error_html, $no_banner, $no_cache) = @_ ;
  my($html) ;

  $html = createMessagePage("Error", "Error", $error_html, $no_banner, $no_cache) ;

  return $html ;
}


#
# Creates a standard-looking page for simple messages
#
# Parameters:
#   page_title - the title of the page, to be appending within the <TITLE> tags after "Quia - ".
#   bar_title - the text appearing in the navigation bar
#   message_html - a string containing a snippet of message text in html form
#   no_banner - if not null, hides the ad banner
#   no_cache - if not null, include a pragma no-cache tag
#
# Returns:
#   an HTML page containing the message
#
sub createMessagePage {
  my($page_title, $bar_title, $message_html, $no_banner, $no_cache) = @_ ;
  my($html, @html) ;

  @html = () ;

  $html = createPageHeader($page_title, $no_cache, "", "", $bar_title, "", "", $no_banner) ;
  push(@html, $html) ;

  push(@html, "<br>", $message_html) ; #jk, need to be clear on <br> tags

  $html = createPageFooter();

  push(@html, $html) ;

  return join("", @html) ;
}


#
# Creates a page footer
#
# Parameters:
#   none.
#
# Returns:
#   an HTML string.
#
sub createPageFooter {
  my ($html);
  $html = qq`
  </td></tr>
  </table>
  </center>
  </body>
  </html>
  `;
  return $html;
}


