Diff for /loncom/homework/bridgetask.pm between versions 1.239 and 1.271

version 1.239, 2008/08/13 09:10:44 version 1.271, 2020/09/01 16:36:38
Line 37  use Apache::lonmenu; Line 37  use Apache::lonmenu;
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::slotrequest();  use Apache::slotrequest();
   use Apache::structuretags();
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
 use LONCAPA;  use LONCAPA;
     
Line 64  sub initialize_bridgetask { Line 65  sub initialize_bridgetask {
 sub proctor_check_auth {  sub proctor_check_auth {
     my ($slot_name,$slot,$type)=@_;      my ($slot_name,$slot,$type)=@_;
     my $user=$env{'form.proctorname'};      my $user=$env{'form.proctorname'};
       $user =~ s/^\s+|\s+$//g;
     my $domain=$env{'form.proctordomain'};      my $domain=$env{'form.proctordomain'};
           
     my @allowed=split(",",$slot->{'proctor'});      my @allowed=split(",",$slot->{'proctor'});
Line 82  sub proctor_check_auth { Line 84  sub proctor_check_auth {
  }   }
     }      }
     if ($authenticated) {      if ($authenticated) {
  &check_in($type,$user,$domain,$slot_name);   my $check = &check_in($type,$user,$domain,$slot_name,$slot->{'iptied'});
                   if ($check =~ /^error:/) {
                       return 0;
                   }
  return 1;   return 1;
     }      }
  }   }
Line 91  sub proctor_check_auth { Line 96  sub proctor_check_auth {
 }  }
   
 sub check_in {  sub check_in {
     my ($type,$user,$domain,$slot_name) = @_;      my ($type,$user,$domain,$slot_name,$needsiptied) = @_;
     my $useslots = &Apache::lonnet::EXT("resource.0.useslots");      my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
       my $ip=$ENV{'REMOTE_ADDR'} || $env{'request.host'};
     if ( $useslots eq 'map_map') {      if ( $useslots eq 'map_map') {
  &check_in_sequence($user,$domain,$slot_name);   my $result = &check_in_sequence($user,$domain,$slot_name,$ip,$needsiptied);
           if ($result =~ /^error: /) {
               return $result;
           }
     } else {      } else {
  &create_new_version($type,$user,$domain,$slot_name);          my ($symb) = &Apache::lonnet::whichuser();
  &Apache::structuretags::finalize_storage();   my $result = &create_new_version($type,$user,$domain,$slot_name,$symb,$ip,$needsiptied);
           if ($result eq 'ok') {
       &Apache::structuretags::finalize_storage();
           }
           return $result; 
     }      }
     return 1;      return 1;
 }  }
   
 sub check_in_sequence {  sub check_in_sequence {
     my ($user,$domain,$slot_name) = @_;      my ($user,$domain,$slot_name,$ip,$needsiptied) = @_;
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
       if (!defined($navmap)) {
           return 'error: No navmap';
       }
     my ($symb) = &Apache::lonnet::whichuser();      my ($symb) = &Apache::lonnet::whichuser();
     my ($map)  = &Apache::lonnet::decode_symb($symb);      my ($map)  = &Apache::lonnet::decode_symb($symb);
     my @resources =       my @resources = 
  $navmap->retrieveResources($map, sub { $_[0]->is_problem() },0,0);   $navmap->retrieveResources($map, sub { $_[0]->is_problem() || $_[0]->is_tool() },0,0);
     my %old_history = %Apache::lonhomework::history;      my %old_history = %Apache::lonhomework::history;
     my %old_results = %Apache::lonhomework::results;      my %old_results = %Apache::lonhomework::results;
   
       my $errorcount;
     foreach my $res (@resources) {      foreach my $res (@resources) {
  &Apache::lonxml::debug("doing ".$res->src);   &Apache::lonxml::debug("doing ".$res->src);
  &Apache::structuretags::initialize_storage($res->symb);   &Apache::structuretags::initialize_storage($res->symb);
  my $type = ($res->is_task()) ? 'Task' : 'problem';   my $type;
  &create_new_version($type,$user,$domain,$slot_name);          if ($res->is_task()) {
  &Apache::structuretags::finalize_storage($res->symb);              $type = 'Task';
           } elsif ($res->is_tool) {
               $type = 'tool';
           } else {
               $type = 'problem';
           }
    my $result = &create_new_version($type,$user,$domain,$slot_name,$res->symb,$ip,$needsiptied);
           if ($result eq 'ok') {
       &Apache::structuretags::finalize_storage($res->symb);
           } else {
               $errorcount ++;
           }
     }      }
           
     %Apache::lonhomework::history = %old_history;      %Apache::lonhomework::history = %old_history;
     %Apache::lonhomework::results = %old_results;      %Apache::lonhomework::results = %old_results;
       if ($errorcount) {
           return 'error: IP taken';
       }
 }  }
   
 sub create_new_version {  sub create_new_version {
     my ($type,$user,$domain,$slot_name) = @_;      my ($type,$user,$domain,$slot_name,$symb,$ip,$needsiptied) = @_;
   
       if ($needsiptied) {
           my $uniqkey = "$slot_name\0$symb\0$ip";
           my ($cdom,$cnum);
           if ($env{'request.course.id'}) {
               my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
               my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
               my %hash = (
                             "$slot_name\0$symb\0$ip" => $env{'user.name'}.':'.$env{'user.domain'}, 
                          );
               unless (&Apache::lonnet::newput('slot_uniqueips',\%hash,$cdom,$cnum) eq 'ok') {
                   return 'error: IP taken';
               }
           }
       }
           
     my $id = '0';      my $id = '0';
     if ($type eq 'Task') {      if ($type eq 'Task') {
Line 149  sub create_new_version { Line 195  sub create_new_version {
     $domain = $env{'user.domain'};      $domain = $env{'user.domain'};
  }   }
   
     } elsif ($type eq 'problem') {      } elsif (($type eq 'problem') || ($type eq 'tool')) {
  &Apache::lonxml::debug("authed $slot_name");   &Apache::lonxml::debug("authed $slot_name");
     }      }
     if (!defined($user) || !defined($domain)) {      if (!defined($user) || !defined($domain)) {
Line 159  sub create_new_version { Line 205  sub create_new_version {
   
     $Apache::lonhomework::results{"resource.$id.checkedin"}=      $Apache::lonhomework::results{"resource.$id.checkedin"}=
  $user.':'.$domain;   $user.':'.$domain;
       $Apache::lonhomework::results{"resource.$id.checkedin.ip"}=$ip;
   
     if (defined($slot_name)) {      if (defined($slot_name)) {
  $Apache::lonhomework::results{"resource.$id.checkedin.slot"}=   $Apache::lonhomework::results{"resource.$id.checkedin.slot"}=
     $slot_name;      $slot_name;
     }      }
       return 'ok'; 
 }  }
   
 sub get_version {  sub get_version {
Line 189  sub get_version { Line 237  sub get_version {
   
 sub add_previous_version_button {  sub add_previous_version_button {
     my ($status)=@_;      my ($status)=@_;
       my (undef,undef,$udom,$uname)=&Apache::lonnet::whichuser();
       if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
           return;
       }
     my $result;      my $result;
     if ($Apache::lonhomework::history{'resource.0.version'} eq '') {      if ($Apache::lonhomework::history{'resource.0.version'} eq '') {
  return '';   return '';
Line 225  sub add_previous_version_button { Line 277  sub add_previous_version_button {
 }  }
   
 sub add_grading_button {  sub add_grading_button {
     my (undef,$cid)=&Apache::lonnet::whichuser();      my (undef,$cid,$udom,$uname)=&Apache::lonnet::whichuser();
       if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
           return;
       }
     my $cnum=$env{'course.'.$cid.'.num'};      my $cnum=$env{'course.'.$cid.'.num'};
     my $cdom=$env{'course.'.$cid.'.domain'};      my $cdom=$env{'course.'.$cid.'.domain'};
     my %sections = &Apache::loncommon::get_sections($cdom,$cnum);      my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
Line 235  sub add_grading_button { Line 290  sub add_grading_button {
  $size=scalar(keys(%sections))+2;   $size=scalar(keys(%sections))+2;
     }      }
     my $sec_select = "\n".'<select multiple="multiple" name="chosensections" size="'.$size.'">'."\n";      my $sec_select = "\n".'<select multiple="multiple" name="chosensections" size="'.$size.'">'."\n";
     $sec_select .= "\t<option value='all' selected='selected'>all</option>\n";      $sec_select .= "\t".'<option value="all" selected="selected">'.&mt('all')."</option>\n";
     foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {      foreach my $sec (sort {lc($a) cmp lc($b)} (keys(%sections))) {
  $sec_select .= "\t<option value=\"$sec\">$sec</option>\n";   $sec_select .= "\t<option value=\"$sec\">$sec</option>\n";
     }      }
     $sec_select .= "\t<option value='none'>none</option>\n</select>\n";      $sec_select .= "\t".'<option value="none">'.&mt('none')."</option>\n</select>\n";
       
     my $result="\n\t".'<input type="submit" name="gradeasubmission" value="'.      my $uri=$env{'request.uri'};
  &mt("Get a submission to grade").'" />';      if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }
     $result.="\n\t".'<input type="hidden" name="grade_target" value="webgrade" />';      my $result = 
           '<form name="gradesubmission" method="post" action="'.$uri.'">'.
           "\n\t".'<input type="submit" name="gradeasubmission" value="'.
    &mt("Get a submission to grade").'" />'.
           "\n\t".'<input type="hidden" name="grade_target" value="webgrade" />';
     my $see_all = &Apache::lonnet::allowed('mgq',$env{'request.course.id'});      my $see_all = &Apache::lonnet::allowed('mgq',$env{'request.course.id'});
     my $see_sec = &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.      my $see_sec = &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.
    '/'.$env{'request.course.sec'});     '/'.$env{'request.course.sec'});
Line 289  sub add_grading_button { Line 348  sub add_grading_button {
  $result.=&Apache::loncommon::studentbrowser_javascript();   $result.=&Apache::loncommon::studentbrowser_javascript();
  $result.= '</p>'."\n";   $result.= '</p>'."\n";
     }      }
       $result .= '</form>'."\n";
       return $result;
   }
   
   sub add_slotlist_button {
       my (undef,$cid,$udom,$uname)=&Apache::lonnet::whichuser();
       if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
           return;
       }
       my $symb=&Apache::lonnet::symbread();
       my $result;
       if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'}) ||
           &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
           $result = '<form method="post" name="slotrequest" action="/adm/slotrequest">'.
                     '<input type="hidden" name="symb" value="'.$symb.'" />'.
                     '<input type="hidden" name="command" value="showslots" />'.
                     '<input type="submit" name="requestattempt" value="'.
                     &mt('Show Slot list').'" />'.
                     '</form>';
           my $target_id =
                  &Apache::lonstathelpers::make_target_id({symb => $symb,
                                                                part => '0'});
           if (!&section_restricted()) {
               $result.='<form method="post" name="gradingstatus" action="/adm/statistics">'.
                        '<input type="hidden" name="problemchoice" value="'.$target_id.'" />'.
                        '<input type="hidden" name="reportSelected" value="grading_analysis" />'.
                        '<input type="submit" name="grading" value="'.
                        &mt('Show Grading Status').'" />'.
                        '</form>';
           }
       }
     return $result;      return $result;
 }  }
   
 sub add_request_another_attempt_button {  sub add_request_another_attempt_button {
     my ($text)=@_;      my ($text)=@_;
       my (undef,$cid,$udom,$uname)=&Apache::lonnet::whichuser();
       if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) {
           return;
       }
     if (!$text) { $text=&mt('Request another attempt'); }      if (!$text) { $text=&mt('Request another attempt'); }
     my $result;      my $result;
     my $symb=&Apache::lonnet::symbread();      my $symb=&Apache::lonnet::symbread();
Line 306  sub add_request_another_attempt_button { Line 400  sub add_request_another_attempt_button {
     my ($slot_name,$slot)=&Apache::slotrequest::check_for_reservation($symb);      my ($slot_name,$slot)=&Apache::slotrequest::check_for_reservation($symb);
     my $action='get_reservation';      my $action='get_reservation';
     if ($slot_name) {      if ($slot_name) {
  $text=&mt('Change reservation.');   $text=&mt('Change reservation');
  $action='change_reservation';   $action='change_reservation';
  my $description=&Apache::slotrequest::get_description($slot_name,   my $description=&Apache::slotrequest::get_description($slot_name,
       $slot);        $slot);
Line 371  sub show_task { Line 465  sub show_task {
        ( $status eq 'BANNED') ||         ( $status eq 'BANNED') ||
        ( $status eq 'UNAVAILABLE') ||         ( $status eq 'UNAVAILABLE') ||
        ( $status eq 'NOT_IN_A_SLOT') ||         ( $status eq 'NOT_IN_A_SLOT') ||
                          ( $status eq 'NOT_YET_VIEWED') ||
        ( $status eq 'NEEDS_CHECKIN') ||         ( $status eq 'NEEDS_CHECKIN') ||
        ( $status eq 'WAITING_FOR_GRADE') ||         ( $status eq 'WAITING_FOR_GRADE') ||
        ( $status eq 'INVALID_ACCESS') ||         ( $status eq 'INVALID_ACCESS') ||
Line 473  sub file_list { Line 568  sub file_list {
  my $file=$file_url.$partial_file;   my $file=$file_url.$partial_file;
  $file=~s|/+|/|g;   $file=~s|/+|/|g;
  &Apache::lonnet::allowuploaded('/adm/bridgetask',$file);   &Apache::lonnet::allowuploaded('/adm/bridgetask',$file);
  $file_list.='<li><span style="white-space: nowrap;"><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.   $file_list.='<li><span class="LC_nobreak"><a href="'.$file.'?rawmode=1" target="lonGRDs"><img src="'.
     &Apache::loncommon::icon($file).'" alt="file icon" border="0" /> '.$file.      &Apache::loncommon::icon($file).'" alt="file icon" border="0" /> '.$file.
     '</a></span></li>'."\n";      '</a></span></li>'."\n";
     }      }
Line 493  sub webgrade_standard_info { Line 588  sub webgrade_standard_info {
   
     my $file_list = &file_list($Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"});      my $file_list = &file_list($Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"});
   
     my %lt=('done'   => 'Next Item',      my %lt = &Apache::lonlocal::texthash(
     'stop'   => 'Quit Grading',          'done'   => 'Next Item',
     'fail'   => 'Fail Rest',          'stop'   => 'Quit Grading',
     'cancel' => 'Cancel',          'fail'   => 'Fail Rest',
     'submit' => 'Submit Grades',          'cancel' => 'Cancel',
     );          'submit' => 'Submit Grades',
     %lt=&Apache::lonlocal::texthash(%lt);      );
   
     my $result=<<INFO;      my $result=<<INFO;
   <div class="LC_GRADING_maincontrols">    <div class="LC_GRADING_maincontrols">
Line 536  sub done_screen { Line 631  sub done_screen {
     my $title=&Apache::lonnet::gettitle($env{'request.uri'});      my $title=&Apache::lonnet::gettitle($env{'request.uri'});
     my @files=split(',',$Apache::lonhomework::history{'resource.'.$version.'.0.bridgetask.portfiles'});      my @files=split(',',$Apache::lonhomework::history{'resource.'.$version.'.0.bridgetask.portfiles'});
     my (undef,undef,$domain,$user)= &Apache::lonnet::whichuser();      my (undef,undef,$domain,$user)= &Apache::lonnet::whichuser();
     my $files = '<ul>';      my ($msg,$files,$shown);
     my $msg;      if (@files > 0) {
     foreach my $file (@files) {          $files = '<ul>';
  my $url="/uploaded/$domain/$user/portfolio$file";          foreach my $file (@files) {
  if (! &Apache::lonnet::stat_file($url)) {      my $url="/uploaded/$domain/$user/portfolio$file";
     $file = '<span class="LC_error">'      if (! &Apache::lonnet::stat_file($url)) {
                    .&mt('[_1]Nonexistent file:[_2]'          $file = '<span class="LC_error">'
                        ,'<span class="LC_error"> '                         .&mt('[_1]Nonexistent file:[_2]'
                        ,'</span> <span class="LC_filename">'.$file.'</span>');                             ,'<span class="LC_error"> '
     $msg .= "<p>".&mt('Submitted non-existant file [_1]',$file)."</p>\n";                             ,'</span> <span class="LC_filename">'.$file.'</span>');
  } else {          $msg .= "<p>".&mt('Submitted non-existent file [_1]',$file)."</p>\n";
     $file = '<span class="LC_filename">'.$file.'</span>';      } else {
     $msg .= "<p>".&mt('Submitted file [_1]',$file)."</p>\n";          $file = '<span class="LC_filename">'.$file.'</span>';
  }          $msg .= "<p>".&mt('Submitted file [_1]',$file)."</p>\n";
  $files .= '<li>'.$file.'</li>';      }
       $files .= '<li>'.$file.'</li>';
           }
           $files.='</ul>';
           $shown = '<p>'.&mt('Files submitted: [_1]',$files).'</p>'
                   .'<p>'.&mt('You are now done with this Bridge Task').'</p>'
                   .'<hr />'
                   .'<p><a href="/adm/logout">'.&mt('Logout').'</a></p>'
                   .'<p><a href="/adm/roles">'.&mt('Change to a different course').'</a></p>';
       } else {
           $msg = &mt("Submission status: no files currently submitted, when 'Done' was indicated.");
           $shown = '<p class="LC_error">'.
                    &mt('You did not submit any files.  Please try again.').'</span>'.
                    '</p><p><a href="javascript:history.go(-1);">'.&mt('Back to Bridge Task').'</a></p><hr />';
     }      }
     $files.='</ul>';  
     my $subject = &mt('Submission message for [_1]',$title);      my $subject = &mt('Submission message for [_1]',$title);
     my ($message_status,$comment_status);      my ($message_status,$comment_status);
     my $setting = $env{'course.'.$env{'request.course.id'}.'.task_messages'};      my $setting = $env{'course.'.$env{'request.course.id'}.'.task_messages'};
Line 572  sub done_screen { Line 679  sub done_screen {
  $comment_status = '<p>'.&mt('Message sent to instructor: [_1]',   $comment_status = '<p>'.&mt('Message sent to instructor: [_1]',
     $comment_status).' </p>';      $comment_status).' </p>';
     }      }
    
     return "<h2>$title</h2>"      return "<h2>$title</h2>"
           .'<p>'.&mt('Files submitted: [_1]',$files).'</p>'            .$shown
           .'<p>'.&mt('You are now done with this Bridge Task').'</p>'            .$message_status
           .'<hr />'            .$comment_status;
           .'<p><a href="/adm/logout">'.&mt('Logout').'</a></p>'  
 .'<p><a href="/adm/roles">'.&mt('Change to a different course').'</a></p>'  
 .$message_status  
 .$comment_status  
   
 }  }
   
 sub start_Task {  sub start_Task {
Line 610  sub start_Task { Line 713  sub start_Task {
     &Apache::structuretags::page_start($target,$token,$tagstack,      &Apache::structuretags::page_start($target,$token,$tagstack,
        $parstack,$parser,$safeeval,         $parstack,$parser,$safeeval,
        $name,&style($target));         $name,&style($target));
   
       }
       if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
           $target eq 'tex') {
           if ($env{'form.markaccess'}) {
               my @interval=&Apache::lonnet::EXT("resource.0.interval");
               my ($timelimit) = ($interval[0] =~ /^(\d+)/);
               &Apache::lonnet::set_first_access($interval[1],$timelimit);
           }
     }      }
   
     if ($target eq 'web' && $env{'request.state'} ne 'construct') {      if ($target eq 'web' && $env{'request.state'} ne 'construct') {
  if ($Apache::lonhomework::queuegrade   if ($Apache::lonhomework::queuegrade
     || $Apache::lonhomework::modifygrades) {      || $Apache::lonhomework::modifygrades) {
     $result.='<form name="gradesubmission" method="post" action="';      $result .= &add_grading_button();
     my $uri=$env{'request.uri'};  
     if ($env{'request.enc'}) { $uri=&Apache::lonenc::encrypted($uri); }  
     $result.=$uri.'">'.&add_grading_button()."</form>\n";  
     my $symb=&Apache::lonnet::symbread();      my $symb=&Apache::lonnet::symbread();
     if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})      if (&Apache::lonnet::allowed('mgq',$env{'request.course.id'})
  || &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {   || &Apache::lonnet::allowed('mgq',$env{'request.course.id'}.'/'.$env{'request.course.sec'})) {
  $result.='<form method="post" name="slotrequest" action="/adm/slotrequest">'.                  $result .= &add_slotlist_button(); 
     '<input type="hidden" name="symb" value="'.$symb.'" />'.  
     '<input type="hidden" name="command" value="showslots" />'.  
     '<input type="submit" name="requestattempt" value="'.  
     &mt('Show Slot list').'" />'.  
     '</form>';  
  my $target_id =   
     &Apache::lonstathelpers::make_target_id({symb => $symb,  
      part => '0'});  
  if (!&section_restricted()) {  
     $result.='<form method="post" name="gradingstatus" action="/adm/statistics">'.  
  '<input type="hidden" name="problemchoice" value="'.$target_id.'" />'.  
  '<input type="hidden" name="reportSelected" value="grading_analysis" />'.  
  '<input type="submit" name="grading" value="'.  
  &mt('Show Grading Status').'" />'.  
  '</form>';  
  }  
     }      }
  }   }
     }      }
Line 652  sub start_Task { Line 745  sub start_Task {
  my ($version,$previous)=&get_version();   my ($version,$previous)=&get_version();
  ($status,$accessmsg,my $slot_name,$slot) =    ($status,$accessmsg,my $slot_name,$slot) = 
     &Apache::lonhomework::check_slot_access('0','Task');      &Apache::lonhomework::check_slot_access('0','Task');
  if ($status eq 'CAN_ANSWER' && $version eq '') {   if ((($status eq 'CAN_ANSWER') || ($status eq 'NOT_YET_VIEWED')) && ($version eq '')) {
     # CAN_ANSWER mode, and no current version, unproctored access      # CAN_ANSWER or NOT_YET_VIEWED mode, and no current version, unproctored access
     # thus self-checkedin      # thus self-checkedin
     &check_in('Task',undef,undef,$slot_name);              my $needsiptied;
               if (ref($slot)) {
                   $needsiptied = $slot->{'iptied'};
               }
       my $check = &check_in('Task',undef,undef,$slot_name,$needsiptied);
               if ($check =~ /^error:\s+(.*)$/) {
                   my $symb=&Apache::lonnet::symbread();
                   &Apache::lonnet::logthis("Error: $1 during self-checkin of version $version of Task (symb: $symb) using slot: $slot_name");   
               }
     &add_to_queue('gradingqueue',{'type' => 'Task',      &add_to_queue('gradingqueue',{'type' => 'Task',
   'time' => time,    'time' => time,
   'slot' => $slot_name});    'slot' => $slot_name});
     ($version,$previous)=&get_version();      ($version,$previous)=&get_version();
  }   }
           if (($target eq 'web') && ($version ne '') && ($slot_name ne '')) {
  my $status_id =               if (ref($slot) eq 'HASH') {
     ($previous || $status eq 'SHOW_ANSWER') ? 'LC_task_feedback'                  if ($slot->{'endtime'} > time()) {
                                             : 'LC_task_take';                      $result .=
                           &Apache::lonhtmlcommon::set_due_date($slot->{'endtime'});
                   }
               }
    }
   
    my $status_id = 'LC_task_take';
           if ($previous && $target eq 'answer') {
               $status_id = 'LC_task_answer';
           } elsif ($previous || $status eq 'SHOW_ANSWER') {
       $status_id = 'LC_task_feedback';
           }
  $result .= '<div class="LC_task" id="'.$status_id.'">'."\n";   $result .= '<div class="LC_task" id="'.$status_id.'">'."\n";
   
  push(@Apache::inputtags::status,$status);   push(@Apache::inputtags::status,$status);
Line 682  sub start_Task { Line 794  sub start_Task {
  }   }
  my $msg;   my $msg;
  if ($status eq 'UNAVAILABLE') {   if ($status eq 'UNAVAILABLE') {
     $msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>';      $msg.='<p class="LC_error">'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</p>';
  } elsif ($status eq 'NOT_IN_A_SLOT') {   } elsif ($status eq 'NOT_IN_A_SLOT') {
     $msg.='<h1>'.&mt('You are not currently signed up to work at this time and/or place.').'</h1>';      $msg.='<p class="LC_warning">'.&mt('You are not currently signed up to work at this time and/or place.').'</p>';
     $msg.=&add_request_another_attempt_button("Sign up for time to work.");      $msg.=&add_request_another_attempt_button("Sign up for time to work");
  } elsif ($status eq 'NEEDS_CHECKIN') {   } elsif ($status eq 'NEEDS_CHECKIN') {
     $msg.='<h1>'.&mt('You need the Proctor to validate you.').      $msg.='<p class="LC_warning">'.&mt('You need the Proctor to validate you.').
  '</h1>'.&proctor_validation_screen($slot);   '</p>'.&proctor_validation_screen($slot);
  } elsif ($status eq 'WAITING_FOR_GRADE') {   } elsif ($status eq 'WAITING_FOR_GRADE') {
     $msg.='<h1>'.&mt('Your submission is in the grading queue.').'</h1>';      $msg.='<p class="LC_info">'.&mt('Your submission is in the grading queue.').'</p>';
  } elsif ($env{'form.donescreen'}) {   } elsif ($env{'form.donescreen'}) {
     $result .= &done_screen($version);      $result .= &done_screen($version);
  } elsif ($status ne 'NOT_YET_VIEWED') {   } elsif ($status eq 'NOT_YET_VIEWED') {
     $msg.='<h1>'.&mt('Not open to be viewed').'</h1>';                      my $symb=&Apache::lonnet::symbread();
                       $msg.=&Apache::structuretags::firstaccess_msg($accessmsg,$symb);
                   } elsif ($status eq 'NEED_DIFFERENT_IP') {
   #FIXME
    } else {
       $msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>';
  }   }
  if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {   if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
     $msg.='The problem '.$accessmsg;      $msg.='The problem '.$accessmsg;
  }   }
  $result.=$msg.'<br />';   $result.=$msg.'<br />';
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $result.='\begin{document}\noindent \vskip 1 mm  \begin{minipage}{\textwidth}\vskip 0 mm';   $result.='\noindent \vskip 1 mm  \begin{minipage}{\textwidth}\vskip 0 mm';
  if ($status eq 'UNAVAILABLE') {   if ($status eq 'UNAVAILABLE') {
     $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';      $result.=&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'\vskip 0 mm ';
  } else {   } else {
Line 771  sub start_Task { Line 888  sub start_Task {
     $result.='<b>'.&mt("Stopped grading.").'</b>'.$back;      $result.='<b>'.&mt("Stopped grading.").'</b>'.$back;
  } elsif ($status_code eq 'cancel') {   } elsif ($status_code eq 'cancel') {
     $result.='<b>'.&mt("Cancelled grading.").'</b>'.$back;      $result.='<b>'.&mt("Cancelled grading.").'</b>'.$back;
                   } elsif ($status_code eq 'terminated') {
                       $result.= '<b>'.&mt('Terminated grading').'</b><br />'.
                                 '<span class="LC_error">'.
                                 &mt('Grading for [_1] has not been saved because of a grading key mismatch.',
                                 '<tt>'.$env{'form.terminated'}.'</tt>').'</span><br />'.$back;
  } elsif ($status_code eq 'never_versioned') {   } elsif ($status_code eq 'never_versioned') {
     $result.='<b>'.      $result.='<b>'.
  &mt("Requested user has never accessed the task.").   &mt("Requested user has never accessed the task.").
Line 919  sub get_key_todo { Line 1041  sub get_key_todo {
     my $classlist=&get_limited_classlist();      my $classlist=&get_limited_classlist();
     if (!&allow_grade_user($classlist->{$uname.':'.$udom})) {      if (!&allow_grade_user($classlist->{$uname.':'.$udom})) {
  return (undef,'not_allowed',   return (undef,'not_allowed',
  &mt('Requested student ([_1]) is in a section you aren\'t allowed to grade.',$uname.':'.$udom));   &mt("Requested student ([_1]) is in a section you aren't allowed to grade.",$uname.':'.$udom));
     }      }
  }   }
  my $gradingkey=&encode_queue_key($symb,$udom,$uname);   my $gradingkey=&encode_queue_key($symb,$udom,$uname);
Line 991  sub get_key_todo { Line 1113  sub get_key_todo {
     return (undef,'stop');      return (undef,'stop');
  } elsif ($env{'form.cancel'}) {   } elsif ($env{'form.cancel'}) {
     return (undef,'cancel');      return (undef,'cancel');
                   } elsif ($env{'form.terminated'}) {
                       return (undef, 'terminated');
  } elsif ($env{'form.next'}) {   } elsif ($env{'form.next'}) {
     return (undef,'select_user');      return (undef,'select_user');
  }   }
Line 1036  sub get_key_todo { Line 1160  sub get_key_todo {
   
     if ($env{'form.queuemode'} ne 'selected') {      if ($env{'form.queuemode'} ne 'selected') {
  # don't get something new from the queue if they hit the stop button   # don't get something new from the queue if they hit the stop button
     if (!(($env{'form.cancel'} || $env{'form.stop'})       if (!(($env{'form.cancel'} || $env{'form.stop'} || $env{'form.terminated'}) 
       && $target eq 'webgrade')         && $target eq 'webgrade') 
     && !$env{'form.gradingaction'}) {      && !$env{'form.gradingaction'}) {
     &Apache::lonxml::debug("Getting anew $queue");      &Apache::lonxml::debug("Getting anew $queue");
     return (&get_from_queue($queue));      return (&get_from_queue($queue));
  } else {   } else {
     return (undef,'stop');              if ($env{'form.terminated'}) {
                   return (undef,'terminated');
               } else {
                   return (undef,'stop');
               }
  }   }
     }      }
     return (undef,undef)      return (undef,undef)
Line 1072  sub end_Task { Line 1200  sub end_Task {
  }   }
  if ($status eq 'CAN_ANSWER' && !$previous &&    if ($status eq 'CAN_ANSWER' && !$previous && 
     !$env{'form.donescreen'}) {      !$env{'form.donescreen'}) {
     $result.="\n".'<table border="1">'.                      my ($portheader,$porttext);
                       if ($Apache::lonhomework::history{"resource.$version.0.bridgetask.portfiles"}) {
                           $portheader = &mt('Submit Additional Portfolio Files for Grading');
                           $porttext = &mt('Indicate which additional files from your portfolio are to be evaluated in grading this task.');
                       } else {
                           $portheader = &mt('Submit Portfolio Files for Grading');
                           $porttext = &mt('Indicate the files from your portfolio to be evaluated in grading this task.');
                       }
       $result.="\n".'<div>'.&Apache::lonhtmlcommon::start_pick_box().
  &Apache::inputtags::file_selector("$version.0",   &Apache::inputtags::file_selector("$version.0",
   "bridgetask","*",    "bridgetask","*",
   'portfolioonly',    'portfolioonly',
   '                                                            '<h3>'.$portheader.'</h3><br />'.
 <h2>'.&mt('Submit Portfolio Files for Grading').'</h2>                                                            $porttext.'<br />').
 <p>'.&mt('Indicate the files from your portfolio to be evaluated in grading this task.').'</p>').   &Apache::lonhtmlcommon::end_pick_box().'</div>';
   "</table>";  
  }   }
  if (!$previous && $status ne 'SHOW_ANSWER' &&   if (!$previous && $status ne 'SHOW_ANSWER' &&
     &show_task($status,$previous)) {      &show_task($status,$previous)) {
Line 1091  sub end_Task { Line 1226  sub end_Task {
  if (!$previous && $status ne 'SHOW_ANSWER' &&   if (!$previous && $status ne 'SHOW_ANSWER' &&
     &show_task($status,$previous)) {      &show_task($status,$previous)) {
     my $action = &Apache::lonenc::check_encrypt($env{'request.uri'});      my $action = &Apache::lonenc::check_encrypt($env{'request.uri'});
                       my $donetext = &mt('Done');
     $result.=<<DONEBUTTON;      $result.=<<DONEBUTTON;
 <form name="done" method="post" action="$action">  <form name="done" method="post" action="$action">
    <input type="hidden" name="donescreen" value="1" />     <input type="hidden" name="donescreen" value="1" />
    <input type="submit" value="Done" />     <input type="submit" value="$donetext" />
 </form>  </form>
 DONEBUTTON  DONEBUTTON
                 }                  }
Line 1161  DONEBUTTON Line 1297  DONEBUTTON
  }   }
  $result.="\n</div>\n".   $result.="\n</div>\n".
     &Apache::loncommon::end_page({'discussion' => 1});      &Apache::loncommon::end_page({'discussion' => 1});
     }      } elsif ($target eq 'answer') {
                   $result.="\n</div>\n";
               }
  }   }
   
  my $useslots = &Apache::lonnet::EXT("resource.0.useslots");   my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
Line 1172  DONEBUTTON Line 1310  DONEBUTTON
  } elsif (defined($Apache::lonhomework::history{"resource.$version.0.checkedin.slot"})) {   } elsif (defined($Apache::lonhomework::history{"resource.$version.0.checkedin.slot"})) {
     $queue_data{'slot'} = $Apache::lonhomework::history{"resource.$version.0.checkedin.slot"};      $queue_data{'slot'} = $Apache::lonhomework::history{"resource.$version.0.checkedin.slot"};
  }   }
   
   
  if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous   if ($target eq 'grade' && !$env{'form.webgrade'} && !$previous
     && $status eq 'CAN_ANSWER') {      && $status eq 'CAN_ANSWER') {
     my $award='SUBMITTED';      my $award='SUBMITTED';
               my $uploadedflag=0;
               my $totalsize=0;
               my @deletions = &Apache::loncommon::get_env_multiple('form.HWFILE'.$version.'_0_bridgetask_delete');
     &Apache::essayresponse::file_submission("$version.0",'bridgetask',      &Apache::essayresponse::file_submission("$version.0",'bridgetask',
     'portfiles',\$award);      \$award,\$uploadedflag,\$totalsize,\@deletions);
     if ($award eq 'SUBMITTED' &&      if ($award eq 'SUBMITTED' &&
  $Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}) {   $Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"}) {
  $Apache::lonhomework::results{"resource.0.tries"}=   $Apache::lonhomework::results{"resource.0.tries"}=
Line 1191  DONEBUTTON Line 1332  DONEBUTTON
  $Apache::lonhomework::results{"resource.0.submission"}=   $Apache::lonhomework::results{"resource.0.submission"}=
     $Apache::lonhomework::results{"resource.$version.0.submission"}='';      $Apache::lonhomework::results{"resource.$version.0.submission"}='';
     } else {      } else {
  delete($Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"});                  unless($uploadedflag) {
                       delete($Apache::lonhomework::results{"resource.$version.0.bridgetask.portfiles"});
                   }
  $award = '';   $award = '';
     }      }
     &Apache::lonhomework::showhash(%Apache::lonhomework::results);      &Apache::lonhomework::showhash(%Apache::lonhomework::results);
Line 1294  DONEBUTTON Line 1437  DONEBUTTON
     $Apache::lonhomework::results{"resource.$version.0.solved"};      $Apache::lonhomework::results{"resource.$version.0.solved"};
     }      }
     &minimize_storage();      &minimize_storage();
     &Apache::structuretags::finalize_storage();              my ($canstore,$domain,$name,$symb,$courseid);
                   ($symb,$courseid,$domain,$name) = &Apache::lonnet::whichuser();
     # data stored, now handle queue  
     if ($review) {              if ($env{'form.gradingkey'}) {
  if ($env{'form.queue'} eq 'reviewqueue') {                  my $todo=&unescape($env{'form.gradingkey'});
     &check_queue_unlock($env{'form.queue'});                  my ($keysymb,$uname,$udom)=&decode_queue_key($todo);
     &Apache::lonxml::debug(" still needs review not changing status.");                  if ($symb eq $keysymb) {
  } else {                      if (($domain eq $udom) && ($name eq $uname)) {
     if ($env{'form.queue'} ne 'none') {                          $canstore = 1;           
  &move_between_queues($env{'form.queue'},'reviewqueue');                      }
                   }
               }
               if ($canstore) {
           &Apache::structuretags::finalize_storage();
                   my @interval = &Apache::lonnet::EXT("resource.0.interval");
                   if ($interval[0] =~ /^\d+/ && $interval[1] eq 'resource') {
                       my $key=$courseid."\0".$symb;
                       my %times=&Apache::lonnet::get('firstaccesstimes',
                                                      [$key],$domain,$name);
                       if ($times{$key}) {
                           my $delresult.=&Apache::lonnet::del('firstaccesstimes',
                                                               [$key],$domain,$name);
                       }
                   }
           # data stored, now handle queue
           if ($review) {
       if ($env{'form.queue'} eq 'reviewqueue') {
           &check_queue_unlock($env{'form.queue'});
           &Apache::lonxml::debug(" still needs review not changing status.");
     } else {      } else {
  &add_to_queue('reviewqueue',\%queue_data);          if ($env{'form.queue'} ne 'none') {
       &move_between_queues($env{'form.queue'},'reviewqueue');
           } else {
       &add_to_queue('reviewqueue',\%queue_data);
           }
     }      }
  }          } elsif ($ungraded) {
     } elsif ($ungraded) {      if ($env{'form.queue'} eq 'reviewqueue') {
  if ($env{'form.queue'} eq 'reviewqueue') {          &Apache::lonxml::debug("moving back.");
     &Apache::lonxml::debug("moving back.");          &move_between_queues($env{'form.queue'},
     &move_between_queues($env{'form.queue'},       'gradingqueue');
  'gradingqueue');      } elsif ($env{'form.queue'} eq 'none' ) {
  } elsif ($env{'form.queue'} eq 'none' ) {          &add_to_queue('gradingqueue',\%queue_data);
     &add_to_queue('gradingqueue',\%queue_data);      } else {
  } else {          &check_queue_unlock($env{'form.queue'});
     &check_queue_unlock($env{'form.queue'});      }
  }          } elsif ($mandatory_failed) {
     } elsif ($mandatory_failed) {      &remove_from_queue($env{'form.queue'}); 
  &remove_from_queue($env{'form.queue'});           } else {
     } else {      &remove_from_queue($env{'form.queue'});
  &remove_from_queue($env{'form.queue'});          }
     }              } else {
  }                  &check_queue_unlock($env{'form.queue'});
                   $env{'form.terminated'} = $name.':'.$domain;
               }
           }
  if (exists($Apache::lonhomework::results{'INTERNAL_store'})) {   if (exists($Apache::lonhomework::results{'INTERNAL_store'})) {
     # instance generation occured and hasn't yet been stored      # instance generation occurred and hasn't yet been stored
     &Apache::structuretags::finalize_storage();      &Apache::structuretags::finalize_storage();
  }   }
     } elsif ($target eq 'webgrade') {      } elsif ($target eq 'webgrade') {
Line 1381  DONEBUTTON Line 1550  DONEBUTTON
     }      }
     &Apache::structuretags::reset_problem_globals('Task');      &Apache::structuretags::reset_problem_globals('Task');
     undef($Apache::lonhomework::parsing_a_task);      undef($Apache::lonhomework::parsing_a_task);
       if ( ($target eq 'grade' && $env{'form.webgrade'}) ||
             $target eq 'webgrade') {
           delete($env{'form.grade_symb'});
           delete($env{'form.grade_domain'});
           delete($env{'form.grade_username'});
           delete($env{'form.grade_courseid'});
       }
     return $result;      return $result;
 }  }
   
Line 1665  sub show_queue { Line 1841  sub show_queue {
     $result.=(<<FORM);      $result.=(<<FORM);
 <td>$status</td>  <td>$status</td>
 <td>  <td>
 <form style="display: inline" method="post">  <form style="display: inline" method="post" action="">
  <input type="hidden" name="gradingkey" value="$ekey" />   <input type="hidden" name="gradingkey" value="$ekey" />
  <input type="hidden" name="queue" value="$queue" />   <input type="hidden" name="queue" value="$queue" />
  <input type="hidden" name="gradingaction" value="$action" />   <input type="hidden" name="gradingaction" value="$action" />
Line 2080  sub select_user { Line 2256  sub select_user {
  $seclist.='<input type="hidden" name="chosensections"    $seclist.='<input type="hidden" name="chosensections" 
                                value="'.$sec.'" />';                                 value="'.$sec.'" />';
     }      }
               my $buttontext=&mt('Regrade');
     $result.=&Apache::loncommon::start_data_table_row();      $result.=&Apache::loncommon::start_data_table_row();
     $result.=<<RESULT;      $result.=<<RESULT;
   <td>    <td>
     <form style="display: inline" method="post">      <form style="display: inline" method="post" action="">
       <input type="hidden" name="gradingkey" value="$todo" />        <input type="hidden" name="gradingkey" value="$todo" />
       <input type="hidden" name="queue" value="$queue" />        <input type="hidden" name="queue" value="$queue" />
       <input type="hidden" name="webgrade" value="no" />        <input type="hidden" name="webgrade" value="no" />
       <input type="hidden" name="regrade" value="yes" />        <input type="hidden" name="regrade" value="yes" />
       <input type="submit" name="submit" value="Regrade" />        <input type="submit" name="submit" value="$buttontext" />
       $seclist        $seclist
     </form>      </form>
   <td>$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] <tt>($student)</tt> Sec: $classlist->{$student}[&Apache::loncoursedata::CL_SECTION()]</td>    <td>$classlist->{$student}[&Apache::loncoursedata::CL_FULLNAME()] <tt>($student)</tt> Sec: $classlist->{$student}[&Apache::loncoursedata::CL_SECTION()]</td>
Line 2647  sub question_status_message { Line 2824  sub question_status_message {
     }      }
     $status .= '.';      $status .= '.';
     if ($counts->{'opt'}) {      if ($counts->{'opt'}) {
         # FIXME &mt() missing!          if ($counts->{'opt_dim'} + $counts->{'man_dim'} < 1) {
  $status .= ' You were required to pass '.$counts->{'opt_req'}.              $status .= ' '.&mt('You were required to pass [quant,_1,optional criterion,optional criteria].',$counts->{'opt_req'});
     ' optional ';          } else { 
  if ($counts->{'opt_dim'} + $counts->{'man_dim'} < 1) {              $status .= ' '.&mt('You were required to pass [quant,_1,optional component].',$counts->{'opt_req'});
     $status .=          }
  ($counts->{'opt_req'} == 1?'criterion':'criteria');  
  } else {  
     $status .=  
  'component'.($counts->{'opt_req'} == 1?'':'s');  
  }  
  $status .= '.';  
     }      }
     return $status;      return $status;
 }  }
Line 2987  sub layout_webgrade_Criteria { Line 3158  sub layout_webgrade_Criteria {
     my $link=&link($id);      my $link=&link($id);
     my $version = &get_version();      my $version = &get_version();
     my $status  = &get_criteria('status',$version,$dim,$id);      my $status  = &get_criteria('status',$version,$dim,$id);
     my %lt = ( 'ungraded' => 'Ungraded',      my %lt = &Apache::lonlocal::texthash(
        'fail'     => 'Fail',          'ungraded' => 'Ungraded',
        'pass'     => 'Pass',          'fail'     => 'Fail',
        'review'   => 'Review',          'pass'     => 'Pass',
        'comment'  => 'Additional Comment for Student',          'review'   => 'Review',
        );          'comment'  => 'Additional Comment for Student',
     %lt = &Apache::lonlocal::texthash(%lt);      );
     my $comment = &get_criteria('comment',$version,$dim,$id);      my $comment = &get_criteria('comment',$version,$dim,$id);
     $comment = &HTML::Entities::encode($comment,'<>"&');      $comment = &HTML::Entities::encode($comment,'<>"&');
     my %checked;      my %checked;
     foreach my $which ('ungraded','fail','pass','review') {      foreach my $which ('ungraded','fail','pass','review') {
  if ($status eq $which) { $checked{$which} = 'checked="checked"'; }   if ($status eq $which) { $checked{$which} = ' checked="checked"'; }
     }      }
     if (!%checked) { $checked{'ungraded'} = 'checked="checked"'; }      if (!%checked) { $checked{'ungraded'} = ' checked="checked"'; }
     my $buttons;      my $buttons;
     foreach my $which  ('ungraded','fail','pass','review') {      foreach my $which  ('ungraded','fail','pass','review') {
  $buttons .= <<END_BUTTON;   $buttons .= <<END_BUTTON;
  <label class="LC_GRADING_$which">   <label class="LC_GRADING_$which">
  <input type="radio" name="HWVAL_$link" value="$which" $checked{$which} />   <input type="radio" name="HWVAL_$link" value="$which"$checked{$which} />
  $lt{$which}   $lt{$which}
  </label>   </label>
 END_BUTTON  END_BUTTON
Line 3139  sub proctor_validation_screen { Line 3310  sub proctor_validation_screen {
     if (!$env{'form.proctordomain'}) { $env{'form.proctordomain'}=$domain; }      if (!$env{'form.proctordomain'}) { $env{'form.proctordomain'}=$domain; }
     my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});      my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
     $uri = &HTML::Entities::encode($uri,'<>&"');      $uri = &HTML::Entities::encode($uri,'<>&"');
     # FIXME &mt() missing!      my %lt = &Apache::lonlocal::texthash(
                               'prva' => "Proctor Validation",
                               'yoro' => "Your room's proctor needs to validate your access to this resource.",
                               'prus'  => "Proctor's Username:",
                               'pasw'  => "Password:",
                               'prdo'  => "Proctor's Domain:",
                               'vali'  => 'Validate',
                               'stui'  => "Student who should be logged in is:",
                               'name'  => "Name:",
                               'sid'   => "Student/Employee ID",
                               'unam'  => "Username:",
                              );
     my $result= (<<ENDCHECKOUT);      my $result= (<<ENDCHECKOUT);
 <h2>Proctor Validation</h2>  <h2>$lt{'prva'}</h2>
     <p>Your room's proctor needs to validate your access to this resource.</p>      <p>$lt{'yoro'}</p>
     $msg      $msg
 <form name="checkout" method="post" action="$uri">  <form name="checkout" method="post" action="$uri">
 <input type="hidden" name="validate" value="yes" />  <input type="hidden" name="validate" value="yes" />
 <input type="hidden" name="submitted" value="yes" />  <input type="hidden" name="submitted" value="yes" />
 <table>  <table>
   <tr><td>Proctor's Username:</td><td><input type="string" name="proctorname" value="$env{'form.proctorname'}" /></td></tr>    <tr><td>$lt{'prus'}</td><td><input type="string" name="proctorname" value="$env{'form.proctorname'}" autocomplete="off" /></td></tr>
   <tr><td>Password:</td><td><input type="password" name="proctorpassword" value="" /></td></tr>    <tr><td>$lt{'pasw'}</td><td><input type="password" name="proctorpassword" value="" autocomplete="off" /></td></tr>
   <tr><td>Proctor's Domain:</td><td><input type="string" name="proctordomain" value="$env{'form.proctordomain'}" /></td></tr>    <tr><td>$lt{'prdo'}</td><td><input type="string" name="proctordomain" value="$env{'form.proctordomain'}" autocomplete="off" /></td></tr>
 </table>  </table>
 <input type="submit" name="checkoutbutton" value="Validate"  /><br />  <input type="submit" name="checkoutbutton" value="$lt{'vali'}"  /><br />
 <table border="1">  <table border="1">
   <tr><td>    <tr><td>
     <table>      <table>
       <tr><td colspan="2">Student who should be logged in is:</td></tr>        <tr><td colspan="2">$lt{'stui'}</td></tr>
       <tr><td>Name:</td><td>$name</td></tr>        <tr><td>$lt{'name'}</td><td>$name</td></tr>
       <tr><td>Student ID:</td><td>$env{'environment.id'}</td></tr>        <tr><td>$lt{'sid'}</td><td>$env{'environment.id'}</td></tr>
       <tr><td>Usename</td><td>$user:$domain</td></tr>        <tr><td>$lt{'unam'}</td><td>$user:$domain</td></tr>
       $url        $url
     </table>      </table>
   </tr></td>    </tr></td>
 </table>  </table>
 </form>  </form>
 ENDCHECKOUT  ENDCHECKOUT
   
     return $result;      return $result;
 }  }
   

Removed from v.1.239  
changed lines
  Added in v.1.271


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>