Diff for /loncom/homework/lonhomework.pm between versions 1.164 and 1.221

version 1.164, 2004/02/13 21:27:22 version 1.221, 2005/11/08 21:09:08
Line 30  package Apache::lonhomework; Line 30  package Apache::lonhomework;
 use strict;  use strict;
 use Apache::style();  use Apache::style();
 use Apache::lonxml();  use Apache::lonxml();
 use Apache::lonnet();  use Apache::lonnet;
 use Apache::lonplot();  use Apache::lonplot();
 use Apache::inputtags();  use Apache::inputtags();
 use Apache::structuretags();  use Apache::structuretags();
Line 47  use Apache::externalresponse(); Line 47  use Apache::externalresponse();
 use Apache::rankresponse();  use Apache::rankresponse();
 use Apache::matchresponse();  use Apache::matchresponse();
 use Apache::chemresponse();  use Apache::chemresponse();
   use Apache::drawimage();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use HTML::Entities();  use HTML::Entities();
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 #use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
   use Apache::lonnet();
   
   # FIXME - improve commenting
   
   
 BEGIN {  BEGIN {
     &Apache::lonxml::register_insert();      &Apache::lonxml::register_insert();
 }  }
   
   
   #
   # Decides what targets to render for.
   # Implicit inputs:
   #   Various session environment variables:
   #      request.state -  published  - is a /res/ resource
   #                       uploaded   - is a /uploaded/ resource
   #                       contruct   - is a /priv/ resource
   #      form.grade_target - a form parameter requesting a specific target
 sub get_target {  sub get_target {
     if (($ENV{'request.state'} eq "published") ||      &Apache::lonxml::debug("request.state = $env{'request.state'}");
  ($ENV{'request.state'} eq "uploaded")) {      if( defined($env{'form.grade_target'})) {
  if ( defined($ENV{'form.grade_target'}  )    &Apache::lonxml::debug("form.grade_target= $env{'form.grade_target'}");
      && ($ENV{'form.grade_target'} eq 'tex')) {      } else {
     return ($ENV{'form.grade_target'});   &Apache::lonxml::debug("form.grade_target <undefined>");
  } elsif ( defined($ENV{'form.grade_target'}  )       }
       if (($env{'request.state'} eq "published") ||
    ($env{'request.state'} eq "uploaded")) {
    if ( defined($env{'form.grade_target'}  ) 
        && ($env{'form.grade_target'} eq 'tex')) {
       return ($env{'form.grade_target'});
    } elsif ( defined($env{'form.grade_target'}  ) 
   && ($Apache::lonhomework::viewgrades eq 'F' )) {    && ($Apache::lonhomework::viewgrades eq 'F' )) {
     return ($ENV{'form.grade_target'});      return ($env{'form.grade_target'});
  }   }
    if ($env{'form.webgrade'} &&
  if ( defined($ENV{'form.submitted'}) &&      $Apache::lonhomework::modifygrades eq 'F') {
      ( !defined($ENV{'form.resetdata'})) &&      return ('grade','webgrade');
      ( !defined($ENV{'form.newrandomization'}))) {   }
    if ( defined($env{'form.submitted'}) &&
        ( !defined($env{'form.resetdata'})) &&
        ( !defined($env{'form.newrandomization'}))) {
     return ('grade', 'web');      return ('grade', 'web');
  } else {   } else {
     return ('web');      return ('web');
  }   }
     } elsif ($ENV{'request.state'} eq "construct") {      } elsif ($env{'request.state'} eq "construct") {
  if ( defined($ENV{'form.grade_target'}) ) {   if ( defined($env{'form.grade_target'}) ) {
     return ($ENV{'form.grade_target'});      return ($env{'form.grade_target'});
  }   }
  if ( defined($ENV{'form.preview'})) {   if ( defined($env{'form.preview'})) {
     if ( defined($ENV{'form.submitted'})) {      if ( defined($env{'form.submitted'})) {
  return ('grade', 'web');   return ('grade', 'web');
     } else {      } else {
  return ('web');   return ('web');
     }      }
  } else {   } else {
     if ( $ENV{'form.problemmode'} eq &mt('View') ||      if ( $env{'form.problemmode'} eq &mt('View') ||
  $ENV{'form.problemmode'} eq &mt('Discard Edits and View')) {   $env{'form.problemmode'} eq &mt('Discard Edits and View')) {
  if ( defined($ENV{'form.submitted'}) &&   if ( defined($env{'form.submitted'}) &&
      (!defined($ENV{'form.resetdata'})) &&       (!defined($env{'form.resetdata'})) &&
      (!defined($ENV{'form.newrandomization'}))) {       (!defined($env{'form.newrandomization'}))) {
     return ('grade', 'web','answer');      return ('grade', 'web','answer');
  } else {   } else {
     return ('web','answer');      return ('web','answer');
  }   }
     } elsif ( $ENV{'form.problemmode'} eq &mt('Edit') ) {      } elsif ( $env{'form.problemmode'} eq &mt('Edit') ||
  if ( $ENV{'form.submitted'} eq 'edit' ) {        $env{'form.problemmode'} eq 'Edit') {
     if ( $ENV{'form.submit'} eq &mt('Submit Changes and View') ) {   if ( $env{'form.submitted'} eq 'edit' ) {
       if ( $env{'form.submit'} eq &mt('Submit Changes and View') ) {
  return ('modified','web','answer');   return ('modified','web','answer');
     } else {      } else {
  return ('modified','edit');   return ('modified','no_output_web','edit');
     }      }
  } else {   } else {
     return ('edit');      return ('no_output_web','edit');
  }   }
     } else {      } else {
  return ('web');   return ('web');
Line 122  sub setup_vars { Line 146  sub setup_vars {
 sub send_header {  sub send_header {
     my ($request)= @_;      my ($request)= @_;
     $request->print(&Apache::lontexconvert::header());      $request->print(&Apache::lontexconvert::header());
 #  $request->print('<form name='.$ENV{'form.request.prefix'}.'lonhomework method="POST" action="'.$request->uri.'">');  #  $request->print('<form name='.$env{'form.request.prefix'}.'lonhomework method="POST" action="'.$request->uri.'">');
 }  }
   
 sub createmenu {  sub createmenu {
Line 141  sub send_footer { Line 165  sub send_footer {
     $request->print(&Apache::lontexconvert::footer());      $request->print(&Apache::lontexconvert::footer());
 }  }
   
 $Apache::lonxml::browse='';  sub proctor_checked_in {
       my ($slot_name,$slot)=@_;
       my @allowed=split(",",$slot->{'proctor'});
       my $version=$Apache::lonhomework::history{'resource.version'};
       foreach my $possible (@allowed) { 
    if ($Apache::lonhomework::history{"resource.$version.checkedin"} eq
       $possible &&
       $Apache::lonhomework::history{"resource.$version.checkedin.slot"}
          eq $slot_name) {
       return 1;
    }
       }
       return 0;
   }
   
   $Apache::lonxml::browse='';
 sub check_ip_acc {  sub check_ip_acc {
     my ($acc)=@_;      my ($acc)=@_;
     if (!defined($acc) || $acc =~ /^\s*$/) { return 1; }      &Apache::lonxml::debug("acc is $acc");
       if (!defined($acc) || $acc =~ /^\s*$/ || $acc =~/^\s*no\s*$/i) { 
    return 1;
       }
     my $allowed=0;      my $allowed=0;
     my $ip=$ENV{'REMOTE_ADDR'};      my $ip=$ENV{'REMOTE_ADDR'};
     my $name;      my $name;
Line 188  sub check_ip_acc { Line 229  sub check_ip_acc {
     }      }
     return $allowed;      return $allowed;
 }  }
   
   sub check_task_access {
       # does it pass normal muster
       # yes we really do want the default args passing
       my ($status,$datemsg)=&check_access;
       if ($status eq 'SHOW_ANSWER' ||
    $status eq 'CLOSED' ||
    $status eq 'CANNOT_ANSWER' ||
    $status eq 'INVALID_ACCESS' ||
    $status eq 'UNAVAILABLE') {
    return ($status,$datemsg);
       }
       if ($env{'request.state'} eq "construct") {
    return ($status,$datemsg);
       }
       my $version=$Apache::lonhomework::history{'resource.version'};
       if ($Apache::lonhomework::history{"resource.$version.checkedin"} &&
    $Apache::lonhomework::history{"resource.$version.status"} eq 'pass') {
    return ('SHOW_ANSWER');
       }
       my ($id)=@_;
       my @slots=
    (split(':',&Apache::lonnet::EXT("resource.$id.availablestudent")),
    split(':',&Apache::lonnet::EXT("resource.$id.available")));
   
   #    if (!@slots) {
   # return ($status,$datemsg);
   #    }
       my $slotstatus='NOT_IN_A_SLOT';
       my ($returned_slot,$slot_name);
       foreach my $slot (@slots) {
    &Apache::lonxml::debug("getting $slot");
    my %slot=&Apache::lonnet::get_slot($slot);
    &Apache::lonhomework::showhash(%slot);
    if ($slot{'starttime'} < time &&
       $slot{'endtime'} > time &&
       &check_ip_acc($slot{'ip'})) {
       &Apache::lonxml::debug("$slot is good");
       $slotstatus='NEEDS_CHECKIN';
       $returned_slot=\%slot;
       $slot_name=$slot;
       last;
    }
       }
       if ($slotstatus eq 'NEEDS_CHECKIN' &&
    &proctor_checked_in($slot_name,$returned_slot)) {
    &Apache::lonxml::debug("protoctor checked in");
    $slotstatus='CAN_ANSWER';
       }
       if ( $slotstatus eq 'NOT_IN_A_SLOT' && 
    $Apache::lonhomework::history{"resource.$version.checkedin"}) {
    if ($Apache::lonhomework::history{"resource.$version.status"} eq 'fail') {
       return ('SHOW_ANSWER');
    } else {
       return ('WAITING_FOR_GRADE');
    }
       }
       return ($slotstatus,$datemsg,$slot_name,$returned_slot);
   }
   
 # JB, 9/24/2002: Any changes in this function may require a change  # JB, 9/24/2002: Any changes in this function may require a change
 # in lonnavmaps::resource::getDateStatus.  # in lonnavmaps::resource::getDateStatus.
 sub check_access {  sub check_access {
Line 200  sub check_access { Line 301  sub check_access {
     my $type;      my $type;
     my $passed;      my $passed;
   
     if ($ENV{'request.state'} eq "construct") {      if ($env{'request.state'} eq "construct") {
    if ($env{'form.problemstate'}) {
       if ($env{'form.problemstate'} =~ /^CANNOT_ANSWER/) {
    if ( ! ($env{'form.problemstate'} eq 'CANNOT_ANSWER_correct' &&
    lc($Apache::lonhomework::problemstatus) eq 'no')) {
       return ('CANNOT_ANSWER',
       &mt('is in this state due to author settings.'));
    }
       } else {
    return ($env{'form.problemstate'},
    &mt('is in this state due to author settings.'));
       }
    }
  &Apache::lonxml::debug("in construction ignoring dates");   &Apache::lonxml::debug("in construction ignoring dates");
  $status='CAN_ANSWER';   $status='CAN_ANSWER';
  $datemsg=&mt('is in under construction');   $datemsg=&mt('is in under construction');
Line 210  sub check_access { Line 323  sub check_access {
     &Apache::lonxml::debug("checking for part :$id:");      &Apache::lonxml::debug("checking for part :$id:");
     &Apache::lonxml::debug("time:".time);      &Apache::lonxml::debug("time:".time);
   
     if ($ENV{'request.state'} ne "construct") {      my ($symb)=&Apache::lonxml::whichuser();
       &Apache::lonxml::debug("symb:".$symb);
       #if ($env{'request.state'} ne "construct" && $symb ne '') {
       if ($env{'request.state'} ne "construct") {
  my $allowed=&check_ip_acc(&Apache::lonnet::EXT("resource.$id.acc"));   my $allowed=&check_ip_acc(&Apache::lonnet::EXT("resource.$id.acc"));
  if (!$allowed && ($Apache::lonhomework::browse ne 'F')) {   if (!$allowed && ($Apache::lonhomework::browse ne 'F')) {
     $status='INVALID_ACCESS';      $status='INVALID_ACCESS';
Line 262  sub check_access { Line 378  sub check_access {
     $datemsg = &mt("was due on")." $lastdate".&mt(", and answers will be available on")." $date";      $datemsg = &mt("was due on")." $lastdate".&mt(", and answers will be available on")." $date";
  }   }
     }      }
     if ($status eq 'CAN_ANSWER') {      if ($status eq 'CAN_ANSWER' ||
    (($Apache::lonhomework::browse eq 'F') && ($status eq 'CLOSED'))) {
  #check #tries, and if correct.   #check #tries, and if correct.
  my $tries = $Apache::lonhomework::history{"resource.$id.tries"};   my $tries = $Apache::lonhomework::history{"resource.$id.tries"};
  my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");   my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
  if ( $tries eq '' ) { $tries = '0'; }   if ( $tries eq '' ) { $tries = '0'; }
  if ( $maxtries eq '' &&    if ( $maxtries eq '' && 
      $ENV{'request.state'} ne 'construct') { $maxtries = '2'; }        $env{'request.state'} ne 'construct') { $maxtries = '2'; } 
  if ($maxtries && $tries >= $maxtries) { $status = 'CANNOT_ANSWER'; }   if ($maxtries && $tries >= $maxtries) { $status = 'CANNOT_ANSWER'; }
  # if (correct and show prob status) or excused then CANNOT_ANSWER   # if (correct and show prob status) or excused then CANNOT_ANSWER
  if(($Apache::lonhomework::history{"resource.$id.solved"}=~/^correct/   if(($Apache::lonhomework::history{"resource.$id.solved"}=~/^correct/
Line 279  sub check_access { Line 396  sub check_access {
     $status = 'CANNOT_ANSWER';      $status = 'CANNOT_ANSWER';
  }   }
     }      }
       if ($status eq 'CAN_ANSWER' || $status eq 'CANNOT_ANSWER') {
    my $interval=&Apache::lonnet::EXT("resource.$id.interval");
    &Apache::lonxml::debug("looking for interval $interval");
    if ($interval) {
       my $first_access=&Apache::lonnet::get_first_access('map');
       &Apache::lonxml::debug("looking for accesstime $first_access");
       if (!$first_access) {
    $status='NOT_YET_VIEWED';
    $datemsg=&seconds_to_human_length($interval);
       } else {
    my $newdate=localtime($first_access+$interval);
    if (time > ($first_access+$interval)) {
       $status='CLOSED';
       $datemsg = &mt("was due on")." $newdate".&mt(", and answers will be available on")." $date";
    } else {
       $datemsg = &mt("is due at")." $newdate";
    }
       }
    }
       }
   #if (($status ne 'CLOSED') && ($Apache::lonhomework::type eq 'exam') &&    #if (($status ne 'CLOSED') && ($Apache::lonhomework::type eq 'exam') &&
   #    (!$Apache::lonhomework::history{"resource.0.outtoken"})) {    #    (!$Apache::lonhomework::history{"resource.0.outtoken"})) {
   #    return ('UNCHECKEDOUT','needs to be checked out');    #    return ('UNCHECKEDOUT','needs to be checked out');
Line 296  sub check_access { Line 432  sub check_access {
     return ($status,$datemsg);      return ($status,$datemsg);
 }  }
   
   sub seconds_to_human_length {
       my ($length)=@_;
   
       my $seconds=$length%60; $length=int($length/60);
       my $minutes=$length%60; $length=int($length/60);
       my $hours=$length%24;   $length=int($length/24);
       my $days=$length;
   
       my $timestr;
       if ($days > 0) { $timestr.=&mt('[quant,_1,day]',$days); }
       if ($hours > 0) { $timestr.=($timestr?", ":"").
     &mt('[quant,_1,hour]',$hours); }
       if ($minutes > 0) { $timestr.=($timestr?", ":"").
       &mt('[quant,_1,minute]',$minutes); }
       if ($seconds > 0) { $timestr.=($timestr?", ":"").
       &mt('[quant,_1,second]',$seconds); }
       return $timestr;
   }
   
 sub showhash {  sub showhash {
     my (%hash) = @_;      my (%hash) = @_;
     &showhashsubset(\%hash,'.');      &showhashsubset(\%hash,'.');
Line 306  sub showarray { Line 461  sub showarray {
     my ($array)=@_;      my ($array)=@_;
     my $string="(";      my $string="(";
     foreach my $elm (@{ $array }) {      foreach my $elm (@{ $array }) {
  if (ref($elm)) {   if (ref($elm) eq 'ARRAY') {
     if ($elm =~ /ARRAY/ ) {      $string.=&showarray($elm);
  $string.=&showarray($elm);   } elsif (ref($elm) eq 'HASH') {
     }      $string.= "HASH --- \n<br />";
       $string.= &showhashsubset($elm,'.');
  } else {   } else {
     $string.="$elm,"      $string.="$elm,"
  }   }
Line 323  sub showhashsubset { Line 479  sub showhashsubset {
     my ($hash,$keyre) = @_;      my ($hash,$keyre) = @_;
     my $resultkey;      my $resultkey;
     foreach $resultkey (sort keys %$hash) {      foreach $resultkey (sort keys %$hash) {
  if ($resultkey =~ /$keyre/) {   if ($resultkey !~ /$keyre/) { next; }
     if (ref($$hash{$resultkey})) {   if (ref($$hash{$resultkey})  eq 'ARRAY' ) {
  if ($$hash{$resultkey} =~ /ARRAY/ ) {      &Apache::lonxml::debug("$resultkey ---- ".
     &Apache::lonxml::debug("$resultkey ---- ".     &showarray($$hash{$resultkey}));
    &showarray($$hash{$resultkey}));   } elsif (ref($$hash{$resultkey}) eq 'HASH' ) {
  } elsif ($$hash{$resultkey} =~ /HASH/ ) {      &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}");
     &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}");      &showhashsubset($$hash{$resultkey},'.');
     &showhashsubset($$hash{$resultkey},'.');   } else {
  } else {      &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}");
     &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}");  
  }  
     } else {  
  &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}");  
     }  
  }   }
     }      }
     &Apache::lonxml::debug("\n<br />restored values^</br>\n");      &Apache::lonxml::debug("\n<br />restored values^</br>\n");
Line 344  sub showhashsubset { Line 495  sub showhashsubset {
 }  }
   
 sub setuppermissions {  sub setuppermissions {
     $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$ENV{'request.filename'});      $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$env{'request.filename'});
     my $viewgrades = &Apache::lonnet::allowed('vgr',$ENV{'request.course.id'});      my $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
     if (! $viewgrades &&       if (! $viewgrades && 
  exists($ENV{'request.course.sec'}) &&    exists($env{'request.course.sec'}) && 
  $ENV{'request.course.sec'} !~ /^\s*$/) {   $env{'request.course.sec'} !~ /^\s*$/) {
  $viewgrades = &Apache::lonnet::allowed('vgr',$ENV{'request.course.id'}.   $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}.
                                                '/'.$ENV{'request.course.sec'});                                                 '/'.$env{'request.course.sec'});
       }
       $Apache::lonhomework::viewgrades = $viewgrades; # File global variable...dirt.
       if ($Apache::lonhomework::browse eq 'F' && 
    $env{'form.devalidatecourseresdata'} eq 'on') {
    my (undef,$courseid) = &Apache::lonxml::whichuser();
    &Apache::lonnet::devalidatecourseresdata($env{"course.$courseid.num"},
         $env{"course.$courseid.domain"});
       }
       my $modifygrades = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
       if (! $modifygrades && 
    exists($env{'request.course.sec'}) && 
    $env{'request.course.sec'} !~ /^\s*$/) {
    $modifygrades = 
       &Apache::lonnet::allowed('mgr',$env{'request.course.id'}.
        '/'.$env{'request.course.sec'});
     }      }
     $Apache::lonhomework::viewgrades = $viewgrades;      $Apache::lonhomework::modifygrades = $modifygrades;
     return ''      return '';
 }  }
   
 sub setupheader {  sub setupheader {
     my $request=$_[0];      my $request=$_[0];
     if ($ENV{'browser.mathml'}) {      &Apache::loncommon::content_type($request,'text/html');
  &Apache::loncommon::content_type($request,'text/xml');  
     } else {  
  &Apache::loncommon::content_type($request,'text/html');  
     }  
     if (!$Apache::lonxml::debug && ($ENV{'REQUEST_METHOD'} eq 'GET')) {      if (!$Apache::lonxml::debug && ($ENV{'REQUEST_METHOD'} eq 'GET')) {
  &Apache::loncommon::no_cache($request);   &Apache::loncommon::no_cache($request);
     }      }
   #    $request->set_last_modified(&Apache::lonnet::metadata($request->uri,
   #  'lastrevisiondate'));
     $request->send_http_header;      $request->send_http_header;
     return OK if $request->header_only;      return OK if $request->header_only;
     return ''      return ''
Line 380  sub handle_save_or_undo { Line 544  sub handle_save_or_undo {
   
     &Apache::lonnet::correct_line_ends($result);      &Apache::lonnet::correct_line_ends($result);
   
     if ($ENV{'form.Undo'} eq &mt('undo')) {      if ($env{'form.Undo'} eq &mt('undo')) {
  my $error=0;   my $error=0;
  if (!copy($file,$filetmp)) { $error=1; }   if (!copy($file,$filetmp)) { $error=1; }
  if ((!$error) && (!copy($filebak,$file))) { $error=1; }   if ((!$error) && (!copy($filebak,$file))) { $error=1; }
  if ((!$error) && (!move($filetmp,$filebak))) { $error=1; }   if ((!$error) && (!move($filetmp,$filebak))) { $error=1; }
  if (!$error) {   if (!$error) {
     $request->print("<p><b>".&mt("Undid changes, Switched")." $filebak ".&mt("and")." $file</b></p>");      &Apache::lonxml::info("<p><b>".&mt("Undid changes, Switched")." $filebak ".&mt("and")." $file</b></p>");
  } else {   } else {
     $request->print("<p><font color=\"red\" size=\"+1\"><b>".&mt("Unable to undo, unable to switch")." $filebak ".&mt("and")." $file</b></font></p>");      &Apache::lonxml::info("<p><font color=\"red\" size=\"+1\"><b>".&mt("Unable to undo, unable to switch")." $filebak ".&mt("and")." $file</b></font></p>");
     $error=1;      $error=1;
  }   }
     } else {      } else {
  my $fs=Apache::File->new(">$filebak");   my $fs=Apache::File->new(">$filebak");
  if (defined($fs)) {   if (defined($fs)) {
     print $fs $$problem;      print $fs $$problem;
     $request->print("<b>".&mt("Making Backup to").      &Apache::lonxml::info("<b>".&mt("Making Backup to").
     " $filebak</b><br />");    " $filebak</b>");
  } else {   } else {
     $request->print("<font color=\"red\" size=\"+1\"><b>".&mt("Unable to make backup")." $filebak</b></font>");      &Apache::lonxml::info("<font color=\"red\" size=\"+1\"><b>".&mt("Unable to make backup")." $filebak</b></font>");
     $error=2;      $error=2;
  }   }
  my $fh=Apache::File->new(">$file");   my $fh=Apache::File->new(">$file");
  if (defined($fh)) {   if (defined($fh)) {
     print $fh $$result;      print $fh $$result;
     $request->print("<b>".&mt("Saving Modifications to").      &Apache::lonxml::info("<b>".&mt("Saving Modifications to").
     " $file</b><br />");    " $file</b>");
  } else {   } else {
     $request->print("<font color=\"red\" size=\"+1\"><b>".      &Apache::lonxml::info("<font color=\"red\" size=\"+1\"><b>".
     &mt("Unable to write to")." $file</b></font>");    &mt("Unable to write to")." $file</b></font>");
     $error|=4;      $error|=4;
  }   }
     }      }
Line 417  sub handle_save_or_undo { Line 581  sub handle_save_or_undo {
   
 sub analyze_header {  sub analyze_header {
     my ($request) = @_;      my ($request) = @_;
     my $result.='<html>      my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,
       ($env{'environment.remote'} ne 'off'));
       my $html=&Apache::lonxml::xmlbegin();
       my $result.=$html.'
             <head><title>'.&mt("Analyzing a problem").'</title></head>              <head><title>'.&mt("Analyzing a problem").'</title></head>
             <body bgcolor="#FFFFFF">              '.$bodytag.&Apache::lonxml::message_location().'
             <form name="lonhomework" method="POST" action="'.              <form name="lonhomework" method="POST" action="'.
     $ENV{'request.uri'}.'">      &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.
       &Apache::structuretags::remember_problem_state().'
             <input type="submit" name="problemmode" value="'.&mt("EditXML").'" />              <input type="submit" name="problemmode" value="'.&mt("EditXML").'" />
             <input type="submit" name="problemmode" value="'.&mt('Edit').'" />              <input type="submit" name="problemmode" value="'.&mt('Edit').'" />
             <hr />              <hr />
             <input type="submit" name="submit" value="'.&mt("View").'" />              <input type="submit" name="submit" value="'.&mt("View").'" />
             <hr />              <hr />
             '.&mt('List of possible answers').':  
             </form>';              </form>';
       &Apache::lonxml::add_messages(\$result);
     $request->print($result);      $request->print($result);
     $request->rflush();      $request->rflush();
 }  }
Line 445  sub analyze { Line 613  sub analyze {
     &Apache::lonxml::debug("Analyze");      &Apache::lonxml::debug("Analyze");
     my $result;      my $result;
     my %overall;      my %overall;
       my %seedexample;
     my %allparts;      my %allparts;
     my $rndseed=$ENV{'form.rndseed'};      my $rndseed=$env{'form.rndseed'};
     &analyze_header($request);      &analyze_header($request);
     my %prog_state=      my %prog_state=
  &Apache::lonhtmlcommon::Create_PrgWin($request,&mt('Analyze Progress'),   &Apache::lonhtmlcommon::Create_PrgWin($request,&mt('Analyze Progress'),
       &mt('Getting Problem Variants'),        &mt('Getting Problem Variants'),
       $ENV{'form.numtoanalyze'});        $env{'form.numtoanalyze'},
     for(my $i=1;$i<$ENV{'form.numtoanalyze'}+1;$i++) {        'inline',undef);
       for(my $i=1;$i<$env{'form.numtoanalyze'}+1;$i++) {
  &Apache::lonhtmlcommon::Increment_PrgWin($request,\%prog_state,   &Apache::lonhtmlcommon::Increment_PrgWin($request,\%prog_state,
  &mt('last problem'));   &mt('last problem'));
    if (&Apache::loncommon::connection_aborted($request)) { return; }
           my $thisseed=$i+$rndseed;
  my $subresult=&Apache::lonnet::ssi($request->uri,   my $subresult=&Apache::lonnet::ssi($request->uri,
    ('grade_target' => 'analyze'),     ('grade_target' => 'analyze'),
    ('rndseed' => $i+$rndseed));     ('rndseed' => $thisseed));
  (my $garbage,$subresult)=split(/_HASH_REF__/,$subresult,2);   (my $garbage,$subresult)=split(/_HASH_REF__/,$subresult,2);
  my %analyze=&Apache::lonnet::str2hash($subresult);   my %analyze=&Apache::lonnet::str2hash($subresult);
  my @parts;   my @parts;
Line 469  sub analyze { Line 641  sub analyze {
     if ($analyze{$part.'.type'} eq 'numericalresponse' ||      if ($analyze{$part.'.type'} eq 'numericalresponse' ||
  $analyze{$part.'.type'} eq 'stringresponse' ||   $analyze{$part.'.type'} eq 'stringresponse' ||
  $analyze{$part.'.type'} eq 'formularesponse'   ) {   $analyze{$part.'.type'} eq 'formularesponse'   ) {
    my $concatanswer=join("\0",@{ $analyze{$part.'.answer'} });
    if (($concatanswer eq '') || ($concatanswer=~/^\@/)) {
       @{$analyze{$part.'.answer'}}=('<font color="red">'.&mt('Error').'</font>');
    }
  push( @{ $overall{$part.'.answer'} },   push( @{ $overall{$part.'.answer'} },
       [@{ $analyze{$part.'.answer'} }]);        [@{ $analyze{$part.'.answer'} }]);
                   $seedexample{join("\0",@{ $analyze{$part.'.answer'}})}=$thisseed;
     }      }
  }   }
     }      }
     &Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state,      &Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state,
   &mt('Analyzing Results'));    &mt('Analyzing Results'));
       $request->print('<hr />'.&mt('List of possible answers').': ');
     foreach my $part (sort(keys(%allparts))) {      foreach my $part (sort(keys(%allparts))) {
  if (defined(@{ $overall{$part.'.answer'} })) {   if (defined(@{ $overall{$part.'.answer'} })) {
     my $num_cols=scalar(@{ $overall{$part.'.answer'}->[0] });      my $num_cols=scalar(@{ $overall{$part.'.answer'}->[0] });
     $request->print('<table><tr><td colspan="'.($num_cols+1).'">'.&mt('Part').' '.$part.'</td></tr>');      $request->print('<table class="thinborder"><tr><th colspan="'.($num_cols+1).'">'.&mt('Part').' '.$part.'</th></tr>');
     my %frequency;      my %frequency;
     foreach my $answer (sort {$a->[0] <=> $b->[0]} (@{ $overall{$part.'.answer'} })) {      foreach my $answer (sort {$a->[0] <=> $b->[0]} (@{ $overall{$part.'.answer'} })) {
  $frequency{join("\0",@{ $answer })}++;   $frequency{join("\0",@{ $answer })}++;
     }      }
     $request->print('<tr><td colspan="'.($num_cols).'">'.&mt('Answer').'</td><td>'.&mt('Frequency').'</td></tr>');      $request->print('<tr><th colspan="'.($num_cols).'">'.&mt('Answer').'</th><th>'.&mt('Frequency').'<br />('
       .&mt('click for example').')</th></tr>');
     foreach my $answer (sort {(split("\0",$a))[0] <=> (split("\0",$b))[0]} (keys(%frequency))) {      foreach my $answer (sort {(split("\0",$a))[0] <=> (split("\0",$b))[0]} (keys(%frequency))) {
  $request->print('<tr><td align="right">'.   $request->print('<tr><td class="center">'.
  join('</td><td align="right">',split("\0",$answer)).   join('</td><td class="center">',split("\0",$answer)).
  '</td><td>('.$frequency{$answer}.   '</td><td class="center"><a href="'.$request->uri.'?rndseed='.$seedexample{$answer}.'">'.$frequency{$answer}.
  ')</td></tr>');   '</a></td></tr>');
     }      }
     $request->print('</table>');      $request->print('</table>');
  } else {   } else {
Line 498  sub analyze { Line 677  sub analyze {
  }   }
     }      }
     if (scalar(keys(%allparts)) == 0 ) {      if (scalar(keys(%allparts)) == 0 ) {
  $request->print('<p>'.&mt('Found no analyzable respones in this problem, currently only Numerical, Formula and String response styles are supported.').'</p>');   $request->print('<p>'.&mt('Found no analyzable responses in this problem, currently only Numerical, Formula and String response styles are supported.').'</p>');
     }      }
     &Apache::lonhtmlcommon::Close_PrgWin($request,\%prog_state);      &Apache::lonhtmlcommon::Close_PrgWin($request,\%prog_state);
     &analyze_footer($request);      &analyze_footer($request);
Line 515  sub editxmlmode { Line 694  sub editxmlmode {
        " <i>$file</i></b>");         " <i>$file</i></b>");
  $problem='';   $problem='';
     }      }
     if (defined($ENV{'form.editxmltext'}) || defined($ENV{'form.Undo'})) {      if (defined($env{'form.editxmltext'}) || defined($env{'form.Undo'})) {
  my $error=&handle_save_or_undo($request,\$problem,   my $error=&handle_save_or_undo($request,\$problem,
        \$ENV{'form.editxmltext'});         \$env{'form.editxmltext'});
  if (!$error) { $problem=&Apache::lonnet::getfile($file); }   if (!$error) { $problem=&Apache::lonnet::getfile($file); }
     }      }
     &Apache::lonhomework::showhashsubset(\%ENV,'^form');      &Apache::lonhomework::showhashsubset(\%env,'^form');
     if ( $ENV{'form.submit'} eq &mt('Submit Changes and View') ) {      if ( $env{'form.submit'} eq &mt('Submit Changes and View') ) {
  &Apache::lonhomework::showhashsubset(\%ENV,'^form');   &Apache::lonhomework::showhashsubset(\%env,'^form');
  $ENV{'form.problemmode'}='View';   $env{'form.problemmode'}='View';
  &renderpage($request,$file);   &renderpage($request,$file);
     } else {      } else {
  my ($rows,$cols) = &Apache::edit::textarea_sizes(\$problem);   my ($rows,$cols) = &Apache::edit::textarea_sizes(\$problem);
Line 531  sub editxmlmode { Line 710  sub editxmlmode {
     &Apache::loncommon::helpLatexCheatsheet("Problem_Editor_XML_Index",      &Apache::loncommon::helpLatexCheatsheet("Problem_Editor_XML_Index",
     "Problem Editing Help").      "Problem Editing Help").
     '</td><td>'.      '</td><td>'.
        &Apache::loncommon::help_open_faq(5).         &Apache::loncommon::help_open_menu('',undef,undef,undef,5,'Authoring').
        &Apache::loncommon::help_open_bug('Authoring').'</td></tr></table>';                  '</td></tr></table>';
  if ($cols > 80) { $cols = 80; }   if ($cols > 80) { $cols = 80; }
  if ($cols < 70) { $cols = 70; }   if ($cols < 70) { $cols = 70; }
  if ($rows < 20) { $rows = 20; }   if ($rows < 20) { $rows = 20; }
  $result.='<html><body bgcolor="#FFFFFF">   my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,
    ($env{'environment.remote'} ne 'off'));
    my $html=&Apache::lonxml::xmlbegin();
    $result.=$html.$bodytag.
       &renderpage($request,$file,['no_output_web'],1).
       &Apache::lonxml::message_location().'
             <form name="lonhomework" method="POST" action="'.              <form name="lonhomework" method="POST" action="'.
     $ENV{'request.uri'}.'">      &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.
       &Apache::structuretags::remember_problem_state().'
             <input type="hidden" name="problemmode" value="'.&mt('EditXML').'" />              <input type="hidden" name="problemmode" value="'.&mt('EditXML').'" />
             <input type="submit" name="problemmode" value="'.&mt('Discard Edits and View').'" />              <input type="submit" name="problemmode" accesskey="d" value="'.&mt('Discard Edits and View').'" />
             <input type="submit" name="problemmode" value="'.&mt('Edit').'" />              <input type="submit" name="problemmode" accesskey="e" value="'.&mt('Edit').'" />
             <hr />              <hr />
             <input type="submit" name="submit" value="'.&mt('Submit Changes').'" />              <input type="submit" name="submit" accesskey="s" value="'.&mt('Submit Changes').'" />
             <input type="submit" name="submit" value="'.&mt('Submit Changes and View').'" />              <input type="submit" name="submit" accesskey="v" value="'.&mt('Submit Changes and View').'" />
             <input type="submit" name="Undo" value="'.&mt('undo').'" />              <input type="submit" name="Undo" accesskey="u" value="'.&mt('undo').'" />
             <hr />              <hr />
             ' . $xml_help . '              ' . $xml_help . '
             <textarea rows="'.$rows.'" cols="'.$cols.'" name="editxmltext">'.              <textarea style="width:100%" rows="'.$rows.'" cols="'.$cols.'" name="editxmltext">'.
     &HTML::Entities::encode($problem).'</textarea>      &HTML::Entities::encode($problem,'<>&"').'</textarea>
             </form></body></html>';              </form></body></html>';
    &Apache::lonxml::add_messages(\$result);
  $request->print($result);   $request->print($result);
     }      }
     return '';      return '';
 }  }
   
   #
   #    Render the page in whatever target desired.
   #
 sub renderpage {  sub renderpage {
     my ($request,$file) = @_;      my ($request,$file,$targets,$return_string) = @_;
   
     my (@targets) = &get_target();      my @targets = @{$targets || [&get_target()]};
     &Apache::lonhomework::showhashsubset(\%ENV,'form.');      &Apache::lonhomework::showhashsubset(\%env,'form.');
     &Apache::lonxml::debug("Running targets ".join(':',@targets));      &Apache::lonxml::debug("Running targets ".join(':',@targets));
       my $overall_result;
     foreach my $target (@targets) {      foreach my $target (@targets) {
    # FIXME need to do something intelligent when a problem goes
           # from viewable to not viewable due to map conditions
    #&setuppermissions();
    #if (   $Apache::lonhomework::browse ne '2'
    #    && $Apache::lonhomework::browse ne 'F' ) {
    #    $request->print(" You most likely shouldn't see me.");
    #}
  #my $t0 = [&gettimeofday()];   #my $t0 = [&gettimeofday()];
    my $output=1;
    if ($target eq 'no_output_web') {
       $target = 'web'; $output=0;
    }
  my $problem=&Apache::lonnet::getfile($file);   my $problem=&Apache::lonnet::getfile($file);
  if ($problem eq -1) {   if ($problem eq -1) {
     &Apache::lonxml::error("<b> ".&mt('Unable to find')." <i>$file</i></b>");      &Apache::lonxml::error("<b> ".&mt('Unable to find')." <i>$file</i></b>");
Line 571  sub renderpage { Line 772  sub renderpage {
  }   }
   
  my %mystyle;   my %mystyle;
  my $result = '';  
  if ($target eq 'analyze') { %Apache::lonhomework::analyze=(); }   if ($target eq 'analyze') { %Apache::lonhomework::analyze=(); }
  if ($target eq 'answer') { &showhash(%Apache::lonhomework::history); }   if ($target eq 'answer') { &showhash(%Apache::lonhomework::history); }
  if ($target eq 'web') {&Apache::lonhomework::showhashsubset(\%ENV,'^form');}   if ($target eq 'web') {&Apache::lonhomework::showhashsubset(\%env,'^form');}
   
  &Apache::lonxml::debug("Should be parsing now");   &Apache::lonxml::debug("Should be parsing now");
  $result = &Apache::lonxml::xmlparse($request, $target, $problem,   my $result = &Apache::lonxml::xmlparse($request, $target, $problem,
     &setup_vars($target),%mystyle);         &setup_vars($target),%mystyle);
  undef($Apache::lonhomework::parsing_a_problem);   undef($Apache::lonhomework::parsing_a_problem);
    if (!$output) { $result = ''; }
  #$request->print("Result follows:");   #$request->print("Result follows:");
  if ($target eq 'modified') {   if ($target eq 'modified') {
     &handle_save_or_undo($request,\$problem,\$result);      &handle_save_or_undo($request,\$problem,\$result);
Line 593  sub renderpage { Line 794  sub renderpage {
     #$result =~ s:</body>::;      #$result =~ s:</body>::;
     #$result.="<br />Spent $td seconds processing target $target\n</body>";      #$result.="<br />Spent $td seconds processing target $target\n</body>";
     #}      #}
     $request->print($result);  #    $request->print($result);
     $request->rflush();      $overall_result.=$result;
   #    $request->rflush();
  }   }
  #$request->print(":Result ends");   #$request->print(":Result ends");
  #my $td=&tv_interval($t0);   #my $td=&tv_interval($t0);
     }      }
       if (!$return_string) {
    &Apache::lonxml::add_messages(\$overall_result);
    $request->print($overall_result);   
    $request->rflush();   
       } else {
    return $overall_result;
       }
 }  }
   
 # with no arg it returns a HTML <option> list of the template titles  # with no arg it returns a HTML <option> list of the template titles
Line 630  sub newproblem { Line 839  sub newproblem {
     $extension=~s:^.*\.([\w]+)$:$1:;      $extension=~s:^.*\.([\w]+)$:$1:;
     &Apache::lonxml::debug("Looking for :$extension:");      &Apache::lonxml::debug("Looking for :$extension:");
     my $templatelist=&get_template_list('',$extension);      my $templatelist=&get_template_list('',$extension);
     if ($ENV{'form.template'} &&      if ($env{'form.template'} &&
  $ENV{'form.template'} ne "Select a $extension template") {   $env{'form.template'} ne "Select a $extension template") {
  use File::Copy;   use File::Copy;
  my $file = &get_template_list($ENV{'form.template'},$extension);   my $file = &get_template_list($env{'form.template'},$extension);
  my $dest = &Apache::lonnet::filelocation("",$request->uri);   my $dest = &Apache::lonnet::filelocation("",$request->uri);
  copy($file,$dest);   copy($file,$dest);
  &renderpage($request,$dest);   &renderpage($request,$dest);
     } elsif($ENV{'form.newfile'} && !$templatelist) {      } elsif($env{'form.newfile'} && !$templatelist) {
  # I don't like hard-coded filenames but for now, this will work.   # I don't like hard-coded filenames but for now, this will work.
  use File::Copy;   use File::Copy;
  my $templatefilename =   my $templatefilename =
Line 647  sub newproblem { Line 856  sub newproblem {
  copy($templatefilename,$dest);   copy($templatefilename,$dest);
  &renderpage($request,$dest);   &renderpage($request,$dest);
     } else {      } else {
  my $url=$request->uri;   my $url=&HTML::Entities::encode($request->uri,'<>&"');
  my $shownurl=$url;   my $shownurl=$url;
  $shownurl=~s-^/~-/priv/-;   $shownurl=~s-^/~-/priv/-;
  my $dest = &Apache::lonnet::filelocation("",$request->uri);   my $dest = &Apache::lonnet::filelocation("",$request->uri);
  my $errormsg;   my $errormsg;
  if ($ENV{'form.newfile'}) {   if ($env{'form.newfile'}) {
     $errormsg='<p><font color="red">'.&mt('You did not select a template.').'</font></p>'."\n";      $errormsg='<p><font color="red">'.&mt('You did not select a template.').'</font></p>'."\n";
  }   }
  my $instructions;   my $instructions;
  my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,1);   my $bodytag=&Apache::loncommon::bodytag(undef,undef,undef,
    ($env{'environment.remote'} ne 'off'));
  if ($templatelist) { $instructions=&mt(", select a template from the pull-down menu below.").'<br />'.&mt("Then");}   if ($templatelist) { $instructions=&mt(", select a template from the pull-down menu below.").'<br />'.&mt("Then");}
  my %lt=&Apache::lonlocal::texthash( 'create' => 'Creating a new',   my %lt=&Apache::lonlocal::texthash( 'create' => 'Creating a new',
   'resource' => 'resource',    'resource' => 'resource',
Line 687  ENDNEWPROBLEM Line 897  ENDNEWPROBLEM
   
 sub view_or_edit_menu {  sub view_or_edit_menu {
     my ($request) = @_;      my ($request) = @_;
     my $url=$request->uri;      my $url=&HTML::Entities::encode($request->uri,'<>&"');
     my %lt=&Apache::lonlocal::texthash( 'would' => 'Would you like to',      my %lt=&Apache::lonlocal::texthash( 'would' => 'Would you like to',
       'view' => 'View',        'view' => 'View',
       'Edit' => 'edit',        'Edit' => 'edit',
Line 696  sub view_or_edit_menu { Line 906  sub view_or_edit_menu {
     $request->print(<<EDITMENU);      $request->print(<<EDITMENU);
 <body bgcolor="#FFFFFF">  <body bgcolor="#FFFFFF">
 <form action="$url" method="POST">  <form action="$url" method="POST">
 $lt{'would'} <input type="submit" name="problemmode" value="&lt{'view'}">  $lt{'would'} <input type="submit" name="problemmode" accesskey="v" value="&lt{'view'}">
 &lt{'or'} <input type="submit" name="problemmode" value="&lt{'Edit'}">  &lt{'or'} <input type="submit" name="problemmode" accesskey="e" value="&lt{'Edit'}">
 &lt{'the problem'}.  &lt{'the problem'}.
 </form>  </form>
 </body>  </body>
Line 708  sub handler { Line 918  sub handler {
     #my $t0 = [&gettimeofday()];      #my $t0 = [&gettimeofday()];
     my $request=$_[0];      my $request=$_[0];
           
     $Apache::lonxml::debug=$ENV{'user.debug'};      $Apache::lonxml::debug=$env{'user.debug'};
     if (&setupheader($request)) { return OK; }      $env{'request.uri'}=$request->uri;
     $ENV{'request.uri'}=$request->uri;      &setuppermissions();
   
     #setup permissions  
     $Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$ENV{'request.filename'});  
     $Apache::lonhomework::viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'});  
     &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:");  
     # some times multiple problemmodes are submitted, need to select      # some times multiple problemmodes are submitted, need to select
     # the last one      # the last one
     &Apache::lonxml::debug("Problem Mode ".$ENV{'form.problemmode'});      if ( defined($env{'form.problemmode'}) && ref($env{'form.problemmode'}) ) {
     if ( defined($ENV{'form.problemmode'}) &&   my $mode=$env{'form.problemmode'}->[-1];
  ref($ENV{'form.problemmode'}) ) {   undef $env{'form.problemmode'};
  &Apache::lonxml::debug("Problem Mode ".join(",",@$ENV{'form.problemmode'}));   $env{'form.problemmode'}=$mode;
  my $mode=$ENV{'form.problemmode'}->[-1];  
  undef $ENV{'form.problemmode'};  
  $ENV{'form.problemmode'}=$mode;  
     }      }
     &Apache::lonxml::debug("Problem Mode ".$ENV{'form.problemmode'});  
     my $file=&Apache::lonnet::filelocation("",$request->uri);      my $file=&Apache::lonnet::filelocation("",$request->uri);
   
     #check if we know where we are      #check if we know where we are
     if ($ENV{'request.course.fn'} && !&Apache::lonnet::symbread()) {       if ($env{'request.course.fn'} && !&Apache::lonnet::symbread()) { 
  # if we are browsing we might not be able to know where we are   # if we are browsing we might not be able to know where we are
  if ($Apache::lonhomework::browse ne 'F') {   if ($Apache::lonhomework::browse ne 'F' && 
       $env{'request.state'} ne "construct") {
     #should know where we are, so ask      #should know where we are, so ask
     if ( &Apache::lonnet::mod_perl_version() == 2 ) {      if ( &Apache::lonnet::mod_perl_version() == 2 ) {
  &Apache::lonnet::cleanenv();   &Apache::lonnet::cleanenv();
     }      }
     $request->internal_redirect('/adm/ambiguous'); return;      &Apache::lonnet::logthis(&Apache::lonnet::mod_perl_version());
       $request->internal_redirect('/adm/ambiguous'); return OK;
  }   }
     }      }
       if (&setupheader($request)) { return OK; }
       &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:");
       &Apache::lonxml::debug("Problem Mode ".$env{'form.problemmode'});
     my ($symb) = &Apache::lonxml::whichuser();      my ($symb) = &Apache::lonxml::whichuser();
     &Apache::lonxml::debug('symb is '.$symb);      &Apache::lonxml::debug('symb is '.$symb);
     if ($ENV{'request.state'} eq "construct" || $symb eq '') {      if ($env{'request.state'} eq "construct" || $symb eq '') {
  if ($ENV{'form.resetdata'} eq &mt('Reset Submissions') ||   if ($env{'form.resetdata'} eq &mt('Reset Submissions') ||
     $ENV{'form.resetdata'} eq &mt('New Problem Variation') ||      $env{'form.resetdata'} eq &mt('New Problem Variation') ||
     $ENV{'form.newrandomization'} eq &mt('New Randomization')) {      $env{'form.newrandomization'} eq &mt('New Randomization')) {
     my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();      my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
     &Apache::lonnet::tmpreset($symb,'',$domain,$name);      &Apache::lonnet::tmpreset($symb,'',$domain,$name);
     &Apache::lonxml::debug("Attempt reset");      &Apache::lonxml::debug("Attempt reset");
  }   }
     }      }
     if ($ENV{'request.state'} eq "construct") {      if ($env{'request.state'} eq "construct") {
  if ( -e $file ) {   if ( -e $file ) {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
     ['problemmode']);      ['problemmode']);
     if (!(defined $ENV{'form.problemmode'})) {      if (!(defined $env{'form.problemmode'})) {
  #first visit to problem in construction space   #first visit to problem in construction space
  #&view_or_edit_menu($request);   #&view_or_edit_menu($request);
  $ENV{'form.problemmode'}='View';   $env{'form.problemmode'}='View';
  &renderpage($request,$file);   &renderpage($request,$file);
     } elsif ($ENV{'form.problemmode'} eq &mt('EditXML')) {      } elsif ($env{'form.problemmode'} eq &mt('EditXML') ||
        $env{'form.problemmode'} eq 'EditXML') {
  &editxmlmode($request,$file);   &editxmlmode($request,$file);
     } elsif ($ENV{'form.problemmode'} eq &mt('Calculate answers')) {      } elsif ($env{'form.problemmode'} eq &mt('Calculate answers')) {
  &analyze($request,$file);   &analyze($request,$file);
     } else {      } else {
  &renderpage($request,$file);   &renderpage($request,$file);

Removed from v.1.164  
changed lines
  Added in v.1.221


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.