Diff for /loncom/homework/grades.pm between versions 1.117 and 1.122

version 1.117, 2003/07/16 19:28:08 version 1.122, 2003/07/22 18:59:57
Line 106  sub response_type { Line 106  sub response_type {
  if (/^\w+response_\w+.*/) {   if (/^\w+response_\w+.*/) {
     my ($responsetype,$part) = split(/_/,$_,2);      my ($responsetype,$part) = split(/_/,$_,2);
     my ($partid,$respid) = split(/_/,$part);      my ($partid,$respid) = split(/_/,$part);
       $responsetype =~ s/response$//; # make it compatible w/ navmaps - should move to that!!
     $handgrade{$part} = $responsetype.':'.($allkeys =~ /parameter_$part\_handgrade/ ? 'yes' : 'no');      $handgrade{$part} = $responsetype.':'.($allkeys =~ /parameter_$part\_handgrade/ ? 'yes' : 'no');
     next if ($seen{$partid} > 0);      next if ($seen{$partid} > 0);
     $seen{$partid}++;      $seen{$partid}++;
Line 115  sub response_type { Line 116  sub response_type {
     return \@partlist,\%handgrade;      return \@partlist,\%handgrade;
 }  }
   
   #--- Show resource title
   #--- and parts and response type
   sub showResourceInfo {
       my ($url,$probTitle) = @_;
       my $result ='<table border="0">'.
    '<tr><td colspan=3><font size=+1><b>Current Resource: </b>'.$probTitle.'</font></td></tr>'."\n";
       my ($partlist,$handgrade) = &response_type($url);
       my %resptype = (); #,$hdgrade)=('','no');
       my $hdgrade='no';
       for (sort keys(%$handgrade)) {
    my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});
    my $partID = (split(/_/))[0];
    $resptype{$partID} = $responsetype;
    $hdgrade = $handgrade if ($handgrade eq 'yes');
    $result.='<tr><td><b>Part </b>'.$partID.'</td>'.
       '<td><b>Type: </b>'.$responsetype.'</td></tr>';
   #    '<td><b>Handgrade: </b>'.$handgrade.'</td></tr>';
       }
       $result.='</table>'."\n";
       return $result,\%resptype,$hdgrade,$partlist,$handgrade;
   }
   
   #--- Clean response type for display
   #--- Currently filters option response type only.
   sub cleanRecord {
       my ($answer,$response,$symb) = @_;
       if ($response eq 'option') {
    my (@IDs,@ans);
    foreach (split(/\&/,&Apache::lonnet::unescape($answer))) {
       my ($optionID,$ans) = split(/=/);
       push @IDs,$optionID.'</font>';
       push @ans,$ans;
    }
    my $grayFont = '<font color="#999999">';
    return '<table border="1">'.
       '<tr valign="top"><td>Answer</td><td>'.
       (join '</td><td>',@ans).'</td></tr>'.
       '<tr valign="top"><td>'.$grayFont.'Option ID</font></td><td>'.$grayFont.
       (join '</td><td>'.$grayFont,@IDs).'</font></td></tr>'.
       '</table>';
       }
       if ($response eq 'essay') {
    if (! exists ($ENV{'form.'.$symb})) {
       my (%keyhash) = &Apache::lonnet::dump('nohist_handgrade',
     $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
     $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
   
       my $loginuser = $ENV{'user.name'}.':'.$ENV{'user.domain'};
       $ENV{'form.keywords'} = $keyhash{$symb.'_keywords'} ne '' ? $keyhash{$symb.'_keywords'} : '';
       $ENV{'form.kwclr'}    = $keyhash{$loginuser.'_kwclr'} ne '' ? $keyhash{$loginuser.'_kwclr'} : 'red';
       $ENV{'form.kwsize'}   = $keyhash{$loginuser.'_kwsize'} ne '' ? $keyhash{$loginuser.'_kwsize'} : '0';
       $ENV{'form.kwstyle'}  = $keyhash{$loginuser.'_kwstyle'} ne '' ? $keyhash{$loginuser.'_kwstyle'} : '';
       $ENV{'form.'.$symb} = 1; # so that we don't have to read it from disk for multiple sub of the same prob.
    }
    return &keywords_highlight($answer);
       }
       return $answer;
   }
   
   #-- A couple of common js functions
   sub commonJSfunctions {
       my $request = shift;
       $request->print(<<COMMONJSFUNCTIONS);
   <script type="text/javascript" language="javascript">
       function radioSelection(radioButton) {
    var selection=null;
    if (radioButton.length > 1) {
       for (var i=0; i<radioButton.length; i++) {
    if (radioButton[i].checked) {
       return radioButton[i].value;
    }
       }
    } else {
       if (radioButton.checked) return radioButton.value;
    }
    return selection;
       }
   
       function pullDownSelection(selectOne) {
    var selection="";
    if (selectOne.length > 1) {
       for (var i=0; i<selectOne.length; i++) {
    if (selectOne[i].selected) {
       return selectOne[i].value;
    }
       }
    } else {
       if (selectOne.selected) return selectOne.value;
    }
       }
   </script>
   COMMONJSFUNCTIONS
   }
   
 #--- Dumps the class list with usernames,list of sections,  #--- Dumps the class list with usernames,list of sections,
 #--- section, ids and fullnames for each user.  #--- section, ids and fullnames for each user.
 sub getclasslist {  sub getclasslist {
     my ($getsec,$filterlist) = @_;      my ($getsec,$filterlist) = @_;
       $getsec = $getsec eq '' ? 'all' : $getsec;
     my $classlist=&Apache::loncoursedata::get_classlist();      my $classlist=&Apache::loncoursedata::get_classlist();
     # Bail out if we were unable to get the classlist      # Bail out if we were unable to get the classlist
     return if (! defined($classlist));      return if (! defined($classlist));
Line 297  sub verifyreceipt { Line 393  sub verifyreceipt {
   
     my $title.='<h3><font color="#339933">Verifying Submission Receipt '.      my $title.='<h3><font color="#339933">Verifying Submission Receipt '.
  $receipt.'</h3></font>'."\n".   $receipt.'</h3></font>'."\n".
  '<font size=+1><b>Problem: </b>'.$ENV{'form.probTitle'}.'</font><br><br>'."\n";   '<font size=+1><b>Resource: </b>'.$ENV{'form.probTitle'}.'</font><br><br>'."\n";
   
     my ($string,$contents,$matches) = ('','',0);      my ($string,$contents,$matches) = ('','',0);
     my (undef,undef,$fullname) = &getclasslist('all','0');      my (undef,undef,$fullname) = &getclasslist('all','0');
Line 345  sub listStudents { Line 441  sub listStudents {
     my $getsec    = $ENV{'form.section'} eq '' ? 'all' : $ENV{'form.section'};      my $getsec    = $ENV{'form.section'} eq '' ? 'all' : $ENV{'form.section'};
     my $submitonly= $ENV{'form.submitonly'} eq '' ? 'all' : $ENV{'form.submitonly'};      my $submitonly= $ENV{'form.submitonly'} eq '' ? 'all' : $ENV{'form.submitonly'};
   
     my $result;      my $viewgrade = $ENV{'form.showgrading'} eq 'yes' ? 'View/Grade/Regrade' : 'View';
     my ($partlist,$handgrade) = &response_type($url);  
     for (sort keys(%$handgrade)) {  
  my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});  
  $ENV{'form.handgrade'} = 'yes' if ($handgrade eq 'yes');  
  $result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'.  
     '<td><b>Type: </b>'.$responsetype.'</td>'.  
     '<td><b>Handgrade: </b>'.$handgrade.'</font></td></tr>';  
     }  
     $result.='</table>'."\n";  
   
     my $viewgrade = $ENV{'form.handgrade'} eq 'yes' ? 'View/Grade' : 'View';  
     $ENV{'form.probTitle'} = $ENV{'form.probTitle'} eq '' ?       $ENV{'form.probTitle'} = $ENV{'form.probTitle'} eq '' ? 
  &Apache::lonnet::gettitle($symb) : $ENV{'form.probTitle'};   &Apache::lonnet::gettitle($symb) : $ENV{'form.probTitle'};
   
     $result='<h3><font color="#339933">&nbsp;'.      my $result='<h3><font color="#339933">&nbsp;'.$viewgrade.
  $viewgrade.   ' Submissions for a Student or a Group of Students</font></h3>';
     ' Submissions for a Student or a Group of Students</font></h3>'.  
     '<table border="0"><tr><td colspan=3><font size=+1>'.      my ($table,undef,$hdgrade,$partlist,$handgrade) = &showResourceInfo($url,$ENV{'form.probTitle'});
     '<b>Problem: </b>'.$ENV{'form.probTitle'}.'</font></td></tr>'.$result;      $result.=$table;
   
     $request->print(<<LISTJAVASCRIPT);      $request->print(<<LISTJAVASCRIPT);
 <script type="text/javascript" language="javascript">  <script type="text/javascript" language="javascript">
Line 396  sub listStudents { Line 481  sub listStudents {
  formname.command.value = 'submission';   formname.command.value = 'submission';
  formname.submit();   formname.submit();
     }      }
   
     function pullDownSelection(selectOne) {  
  var selection="";  
  if (selectOne.length > 1) {  
     for (var i=0; i<selectOne.length; i++) {  
  if (selectOne[i].selected) {  
     return selectOne[i].value;  
  }  
     }  
  } else {  
     if (selectOne.selected) return selectOne.value;  
  }  
     }  
 </script>  </script>
 LISTJAVASCRIPT  LISTJAVASCRIPT
   
       &commonJSfunctions($request);
     $request->print($result);      $request->print($result);
   
     my $checkhdgrade = $ENV{'form.handgrade'} eq 'yes' ? 'checked' : '';      my $checkhdgrade = ($ENV{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1 ) ? 'checked' : '';
     my $checklastsub = $ENV{'form.handgrade'} eq 'yes' ? '' : 'checked';      my $checklastsub = $checkhdgrade eq '' ? 'checked' : '';
   
     my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'."\n".      my $gradeTable='<form action="/adm/grades" method="post" name="gradesub">'."\n".
  '&nbsp;<b>View Problem Text: </b><input type="radio" name="vProb" value="no" checked /> no '."\n".   '&nbsp;<b>View Problem Text: </b><input type="radio" name="vProb" value="no" checked /> no '."\n".
  '<input type="radio" name="vProb" value="yes" /> one student '."\n".   '<input type="radio" name="vProb" value="yes" /> one student '."\n".
  '<input type="radio" name="vProb" value="all" /> all students <br />'."\n".   '<input type="radio" name="vProb" value="all" /> all students <br />'."\n".
  '&nbsp;<b>Submissions: </b>'."\n";   '&nbsp;<b>Submissions: </b>'."\n";
     if ($ENV{'form.handgrade'} eq 'yes') {      if ($ENV{'form.handgrade'} eq 'yes' && scalar(@$partlist) > 1) {
  $gradeTable.='<input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> handgrade only'."\n";   $gradeTable.='<input type="radio" name="lastSub" value="hdgrade" '.$checkhdgrade.' /> essay part only'."\n";
     }      }
   
     my $saveStatus = $ENV{'form.Status'} eq '' ? 'Active' : $ENV{'form.Status'};      my $saveStatus = $ENV{'form.Status'} eq '' ? 'Active' : $ENV{'form.Status'};
Line 431  LISTJAVASCRIPT Line 503  LISTJAVASCRIPT
   
     $gradeTable.='<input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last sub only'."\n".      $gradeTable.='<input type="radio" name="lastSub" value="lastonly" '.$checklastsub.' /> last sub only'."\n".
  '<input type="radio" name="lastSub" value="last" /> last sub & parts info'."\n".   '<input type="radio" name="lastSub" value="last" /> last sub & parts info'."\n".
    '<input type="radio" name="lastSub" value="datesub" /> by dates and submissions'."\n".
  '<input type="radio" name="lastSub" value="all" /> all details'."\n".   '<input type="radio" name="lastSub" value="all" /> all details'."\n".
  '<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".   '<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".
  '<input type="hidden" name="submitonly"  value="'.$submitonly.'" />'."\n".   '<input type="hidden" name="submitonly"  value="'.$submitonly.'" />'."\n".
  '<input type="hidden" name="response"    value="'.$ENV{'form.response'}.'" />'."\n".  
  '<input type="hidden" name="handgrade"   value="'.$ENV{'form.handgrade'}.'" /><br />'."\n".   '<input type="hidden" name="handgrade"   value="'.$ENV{'form.handgrade'}.'" /><br />'."\n".
  '<input type="hidden" name="showgrading" value="'.$ENV{'form.showgrading'}.'" /><br />'."\n".   '<input type="hidden" name="showgrading" value="'.$ENV{'form.showgrading'}.'" /><br />'."\n".
  '<input type="hidden" name="saveState"   value="'.$ENV{'form.saveState'}.'" />'."\n".   '<input type="hidden" name="saveState"   value="'.$ENV{'form.saveState'}.'" />'."\n".
Line 653  sub sub_page_js { Line 725  sub sub_page_js {
     }      }
   
     function checkSolved(formname,id) {      function checkSolved(formname,id) {
  if (eval("formname.solved"+id+".value") == "correct_by_student") {   if (eval("formname.solved"+id+".value") == "correct_by_student" && formname.overRideScore.value == 'no') {
     alert("This problem has been graded correct by the computer. The score cannot be changed.");      var reply = confirm("This problem has been graded correct by the computer. Do you want to change the score?");
     return "noupdate";      if (!reply) {return "noupdate";}
       formname.overRideScore.value = 'yes';
  }   }
  return "update";   return "update";
     }      }
Line 666  sub sub_page_js { Line 739  sub sub_page_js {
  return;   return;
     }      }
   
 //=========== Check that a point is assigned for all the parts (essay grading only) ============  //=========== Check that a point is assigned for all the parts  ============
     function checksubmit(formname,val,total,parttot) {      function checksubmit(formname,val,total,parttot) {
  document.SCORE.gradeOpt.value = val;   formname.gradeOpt.value = val;
  if (val == "Save & Next") {   if (val == "Save & Next") {
     for (i=0;i<=total;i++) {      for (i=0;i<=total;i++) {
  for (j=0;j<parttot;j++) {   for (j=0;j<parttot;j++) {
Line 690  sub sub_page_js { Line 763  sub sub_page_js {
     }      }
           
  }   }
    if (val == "Grade Student") {
       formname.showgrading.value = "yes";
       if (formname.Status.value == "") {
    formname.Status.value = "Active";
       }
       formname.studentNo.value = total;
    }
  formname.submit();   formname.submit();
     }      }
   
Line 738  SUBJAVASCRIPT Line 818  SUBJAVASCRIPT
 sub sub_page_kw_js {  sub sub_page_kw_js {
     my $request = shift;      my $request = shift;
     my $iconpath = $request->dir_config('lonIconsURL');      my $iconpath = $request->dir_config('lonIconsURL');
       &commonJSfunctions($request);
     $request->print(<<SUBJAVASCRIPT);      $request->print(<<SUBJAVASCRIPT);
 <script type="text/javascript" language="javascript">  <script type="text/javascript" language="javascript">
   
 //===================== Show list of keywords ====================  //===================== Show list of keywords ====================
   function keywords(keyform) {    function keywords(formname) {
     var nret = prompt("Keywords list, separated by a space. Add/delete to list if desired.",keyform.value);      var nret = prompt("Keywords list, separated by a space. Add/delete to list if desired.",formname.keywords.value);
     if (nret==null) return;      if (nret==null) return;
     keyform.value = nret;      formname.keywords.value = nret;
   
     document.SCORE.refresh.value = "on";      formname.refresh.value = "on";
     if (document.SCORE.keywords.value != "") {      if (formname.keywords.value != "") {
  document.SCORE.submit();   formname.submit();
     }      }
     return;      return;
   }    }
Line 818  sub sub_page_kw_js { Line 899  sub sub_page_kw_js {
     return;      return;
   }    }
   
 //  var pWin = null;  
   function savedMsgHeader(Nmsg,usrctr,fullname) {    function savedMsgHeader(Nmsg,usrctr,fullname) {
     var height = 70*Nmsg+250;      var height = 70*Nmsg+250;
     var scrollbar = "no";      var scrollbar = "no";
Line 827  sub sub_page_kw_js { Line 907  sub sub_page_kw_js {
  scrollbar = "yes";   scrollbar = "yes";
     }      }
 //    if (window.pWin) {window.pWin.close(); window.pWin=null}  //    if (window.pWin) {window.pWin.close(); window.pWin=null}
     pWin = window.open('', 'MessageCenter', 'toolbar=no,location=no,scrollbars='+scrollbar+',screenx=70,screeny=75,width=600,height='+height);      var xpos = (screen.width-600)/2;
       xpos = (xpos < 0) ? '0' : xpos;
       var ypos = (screen.height-height)/2-30;
       ypos = (ypos < 0) ? '0' : ypos;
   
       pWin = window.open('', 'MessageCenter', 'toolbar=no,location=no,scrollbars='+scrollbar+',screenx='+xpos+',screeny='+ypos+',width=600,height='+height);
     pWin.focus();      pWin.focus();
     pDoc = pWin.document;      pDoc = pWin.document;
     pDoc.write("<html><head>");      pDoc.write("<html><head>");
Line 947  sub sub_page_kw_js { Line 1032  sub sub_page_kw_js {
     return;      return;
   }    }
   
 //  var hwdWin = null;  
   function highlightCentral() {    function highlightCentral() {
 //    if (window.hwdWin) window.hwdWin.close();  //    if (window.hwdWin) window.hwdWin.close();
     hwdWin = window.open('', 'KeywordHighlightCentral', 'toolbar=no,location=no,scrollbars=no,width=400,height=300,screenx=100,screeny=75');      var xpos = (screen.width-400)/2;
       xpos = (xpos < 0) ? '0' : xpos;
       var ypos = (screen.height-330)/2-30;
       ypos = (ypos < 0) ? '0' : ypos;
   
       hwdWin = window.open('', 'KeywordHighlightCentral', 'toolbar=no,location=no,scrollbars=no,width=400,height=300,screenx='+xpos+',screeny='+ypos);
     hwdWin.focus();      hwdWin.focus();
     var hDoc = hwdWin.document;      var hDoc = hwdWin.document;
     hDoc.write("<html><head>");      hDoc.write("<html><head>");
Line 958  sub sub_page_kw_js { Line 1047  sub sub_page_kw_js {
   
     hDoc.write("<script language=javascript>");      hDoc.write("<script language=javascript>");
     hDoc.write("function updateChoice(flag) {");      hDoc.write("function updateChoice(flag) {");
     hDoc.write("  opener.document.SCORE.kwclr.value = radioSelection(document.hlCenter.kwdclr);");      hDoc.write("  opener.document.SCORE.kwclr.value = opener.radioSelection(document.hlCenter.kwdclr);");
     hDoc.write("  opener.document.SCORE.kwsize.value = radioSelection(document.hlCenter.kwdsize);");      hDoc.write("  opener.document.SCORE.kwsize.value = opener.radioSelection(document.hlCenter.kwdsize);");
     hDoc.write("  opener.document.SCORE.kwstyle.value = radioSelection(document.hlCenter.kwdstyle);");      hDoc.write("  opener.document.SCORE.kwstyle.value = opener.radioSelection(document.hlCenter.kwdstyle);");
     hDoc.write("  opener.document.SCORE.refresh.value = \\"on\\";");      hDoc.write("  opener.document.SCORE.refresh.value = \\"on\\";");
     hDoc.write("  if (opener.document.SCORE.keywords.value!=\\"\\"){");      hDoc.write("  if (opener.document.SCORE.keywords.value!=\\"\\"){");
     hDoc.write("     opener.document.SCORE.submit();");      hDoc.write("     opener.document.SCORE.submit();");
Line 968  sub sub_page_kw_js { Line 1057  sub sub_page_kw_js {
     hDoc.write("  self.close()");      hDoc.write("  self.close()");
     hDoc.write("}");      hDoc.write("}");
   
     hDoc.write("function radioSelection(radioButton) {");  
     hDoc.write("    var selection=null;");  
     hDoc.write("    for (var i=0; i<radioButton.length; i++) {");  
     hDoc.write("        if (radioButton[i].checked) {");  
     hDoc.write("            selection=radioButton[i].value;");  
     hDoc.write("            return selection;");  
     hDoc.write("        }");  
     hDoc.write("    }");  
     hDoc.write("}");  
   
     hDoc.write("<");      hDoc.write("<");
     hDoc.write("/script>");      hDoc.write("/script>");
   
Line 1107  sub submission { Line 1186  sub submission {
   
     (my $url=$ENV{'form.url'})=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;      (my $url=$ENV{'form.url'})=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
     my ($uname,$udom)     = ($ENV{'form.student'},$ENV{'form.userdom'});      my ($uname,$udom)     = ($ENV{'form.student'},$ENV{'form.userdom'});
       $udom = ($udom eq '' ? $ENV{'user.domain'} : $udom); #has form.userdom changed for a student?
     my $usec = &Apache::lonnet::getsection($udom,$uname,$ENV{'request.course.id'});      my $usec = &Apache::lonnet::getsection($udom,$uname,$ENV{'request.course.id'});
     $ENV{'form.fullname'} = &get_fullname ($uname,$udom) if $ENV{'form.fullname'} eq '';      $ENV{'form.fullname'} = &get_fullname ($uname,$udom) if $ENV{'form.fullname'} eq '';
   
Line 1120  sub submission { Line 1200  sub submission {
  return;   return;
     }      }
   
       $ENV{'form.lastSub'} = ($ENV{'form.lastSub'} eq '' ? 'datesub' : $ENV{'form.lastSub'});
     my $last = ($ENV{'form.lastSub'} eq 'last' ? 'last' : '');      my $last = ($ENV{'form.lastSub'} eq 'last' ? 'last' : '');
       my $checkIcon = '<img src="'.$request->dir_config('lonIconsURL').
    '/check.gif" height="16" border="0" />';
   
     # header info      # header info
     if ($counter == 0) {      if ($counter == 0) {
  &sub_page_js($request);   &sub_page_js($request);
  &sub_page_kw_js($request);   &sub_page_kw_js($request) if ($ENV{'form.handgrade'} eq 'yes');
  $ENV{'form.probTitle'} = $ENV{'form.probTitle'} eq '' ?    $ENV{'form.probTitle'} = $ENV{'form.probTitle'} eq '' ? 
     &Apache::lonnet::gettitle($symb) : $ENV{'form.probTitle'};      &Apache::lonnet::gettitle($symb) : $ENV{'form.probTitle'};
   
  $request->print('<h3>&nbsp;<font color="#339933">Submission Record</font></h3>'."\n".   $request->print('<h3>&nbsp;<font color="#339933">Submission Record</font></h3>'."\n".
  '<font size=+1>&nbsp;<b>Problem: </b>'.$ENV{'form.probTitle'}.'</font>'."\n");   '<font size=+1>&nbsp;<b>Resource: </b>'.$ENV{'form.probTitle'}.'</font>'."\n");
   
    if ($ENV{'form.handgrade'} eq 'no') {
       my $checkMark='<br /><br />&nbsp;<b>Note:</b> Part(s) graded correct by the computer is marked with a '.
    $checkIcon.' symbol.'."\n";
       $request->print($checkMark);
    }
   
  # option to display problem, only once else it cause problems    # option to display problem, only once else it cause problems 
         # with the form later since the problem has a form.          # with the form later since the problem has a form.
Line 1141  sub submission { Line 1230  sub submission {
  # kwclr is the only variable that is guaranteed to be non blank    # kwclr is the only variable that is guaranteed to be non blank 
         # if this subroutine has been called once.          # if this subroutine has been called once.
  my %keyhash = ();   my %keyhash = ();
  if ($ENV{'form.kwclr'} eq '') {   if ($ENV{'form.kwclr'} eq '' && $ENV{'form.handgrade'} eq 'yes') {
     %keyhash = &Apache::lonnet::dump('nohist_handgrade',      %keyhash = &Apache::lonnet::dump('nohist_handgrade',
      $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},       $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
      $ENV{'course.'.$ENV{'request.course.id'}.'.num'});       $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
Line 1156  sub submission { Line 1245  sub submission {
     $ENV{'form.savemsgN'} = $keyhash{$symb.'_savemsgN'} ne '' ? $keyhash{$symb.'_savemsgN'} : '0';      $ENV{'form.savemsgN'} = $keyhash{$symb.'_savemsgN'} ne '' ? $keyhash{$symb.'_savemsgN'} : '0';
   
  }   }
    my $overRideScore = $ENV{'form.overRideScore'} eq '' ? 'no' : $ENV{'form.overRideScore'};
   
  $request->print('<form action="/adm/grades" method="post" name="SCORE">'."\n".   $request->print('<form action="/adm/grades" method="post" name="SCORE">'."\n".
  '<input type="hidden" name="command"    value="handgrade" />'."\n".   '<input type="hidden" name="command"    value="handgrade" />'."\n".
  '<input type="hidden" name="saveState"  value="'.$ENV{'form.saveState'}.'" />'."\n".   '<input type="hidden" name="saveState"  value="'.$ENV{'form.saveState'}.'" />'."\n".
    '<input type="hidden" name="Status"     value="'.$ENV{'form.Status'}.'" />'."\n".
    '<input type="hidden" name="overRideScore" value="'.$overRideScore.'" />'."\n".
  '<input type="hidden" name="probTitle"  value="'.$ENV{'form.probTitle'}.'" />'."\n".   '<input type="hidden" name="probTitle"  value="'.$ENV{'form.probTitle'}.'" />'."\n".
  '<input type="hidden" name="refresh"    value="off" />'."\n".   '<input type="hidden" name="refresh"    value="off" />'."\n".
    '<input type="hidden" name="studentNo"  value="" />'."\n".
    '<input type="hidden" name="gradeOpt"   value="" />'."\n".
  '<input type="hidden" name="symb"       value="'.$symb.'" />'."\n".   '<input type="hidden" name="symb"       value="'.$symb.'" />'."\n".
  '<input type="hidden" name="url"        value="'.$url.'" />'."\n".   '<input type="hidden" name="url"        value="'.$url.'" />'."\n".
  '<input type="hidden" name="showgrading" value="'.$ENV{'form.showgrading'}.'" />'."\n".   '<input type="hidden" name="showgrading" value="'.$ENV{'form.showgrading'}.'" />'."\n".
Line 1169  sub submission { Line 1263  sub submission {
  '<input type="hidden" name="lastSub"    value="'.$ENV{'form.lastSub'}.'" />'."\n".   '<input type="hidden" name="lastSub"    value="'.$ENV{'form.lastSub'}.'" />'."\n".
  '<input type="hidden" name="section"    value="'.$ENV{'form.section'}.'">'."\n".   '<input type="hidden" name="section"    value="'.$ENV{'form.section'}.'">'."\n".
  '<input type="hidden" name="submitonly" value="'.$ENV{'form.submitonly'}.'">'."\n".   '<input type="hidden" name="submitonly" value="'.$ENV{'form.submitonly'}.'">'."\n".
  '<input type="hidden" name="response"   value="'.$ENV{'form.response'}.'">'."\n".  
  '<input type="hidden" name="handgrade"  value="'.$ENV{'form.handgrade'}.'">'."\n".   '<input type="hidden" name="handgrade"  value="'.$ENV{'form.handgrade'}.'">'."\n".
  '<input type="hidden" name="keywords"   value="'.$ENV{'form.keywords'}.'" />'."\n".   '<input type="hidden" name="keywords"   value="'.$ENV{'form.keywords'}.'" />'."\n".
  '<input type="hidden" name="kwclr"      value="'.$ENV{'form.kwclr'}.'" />'."\n".   '<input type="hidden" name="kwclr"      value="'.$ENV{'form.kwclr'}.'" />'."\n".
Line 1197  sub submission { Line 1290  sub submission {
 #  #
     $request->print(<<KEYWORDS);      $request->print(<<KEYWORDS);
 &nbsp;<b>Keyword Options:</b>&nbsp;  &nbsp;<b>Keyword Options:</b>&nbsp;
 <a href="javascript:keywords(document.SCORE.keywords)"; TARGET=_self>List</a>&nbsp; &nbsp;  <a href="javascript:keywords(document.SCORE)"; TARGET=_self>List</a>&nbsp; &nbsp;
 <a href="#" onMouseDown="javascript:getSel(); return false"  <a href="#" onMouseDown="javascript:getSel(); return false"
  CLASS="page">Paste Selection to List</a>&nbsp; &nbsp;   CLASS="page">Paste Selection to List</a>&nbsp; &nbsp;
 <a href="javascript:kwhighlight()"; TARGET=_self>Highlight Attribute</a><br /><br />  <a href="javascript:kwhighlight()"; TARGET=_self>Highlight Attribute</a><br /><br />
Line 1217  KEYWORDS Line 1310  KEYWORDS
  $request->print('<br /><br /><br />') if ($counter > 0);   $request->print('<br /><br /><br />') if ($counter > 0);
  $request->print(&show_problem($request,$symb,$uname,$udom,1,1));   $request->print(&show_problem($request,$symb,$uname,$udom,1,1));
     }      }
   
     my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname);      my %record = &Apache::lonnet::restore($symb,$ENV{'request.course.id'},$udom,$uname);
     my ($partlist,$handgrade) = &response_type($url);      my ($partlist,$handgrade) = &response_type($url);
   
Line 1229  KEYWORDS Line 1321  KEYWORDS
     $result.='<b>Fullname: </b>'.$ENV{'form.fullname'}.      $result.='<b>Fullname: </b>'.$ENV{'form.fullname'}.
  '<font color="#999999">&nbsp; &nbsp;Username: '.$uname.   '<font color="#999999">&nbsp; &nbsp;Username: '.$uname.
  ($ENV{'user.domain'} eq $udom ? '' : ' ('.$udom.')').'</font><br />'."\n";   ($ENV{'user.domain'} eq $udom ? '' : ' ('.$udom.')').'</font><br />'."\n";
 # '<font color="#999999">&nbsp; &nbsp;Domain: '.$udom.'</font><br />'."\n";  
     $result.='<input type="hidden" name="name'.$counter.      $result.='<input type="hidden" name="name'.$counter.
  '" value="'.$ENV{'form.fullname'}.'" />'."\n";   '" value="'.$ENV{'form.fullname'}.'" />'."\n";
   
     # If this is an essay-response part(handgraded), then check for collaborators      # If any part of the problem is an essay-response (handgraded), then check for collaborators
     my @col_fullnames;      my @col_fullnames;
     my ($classlist,$fullname);      my ($classlist,$fullname);
     if ($ENV{'form.handgrade'} eq 'yes') {      if ($ENV{'form.handgrade'} eq 'yes') {
Line 1305  KEYWORDS Line 1396  KEYWORDS
  $$fullname{$ENV{'form.'.$uname.':'.$udom.':submitted_by'}}.'</a>';   $$fullname{$ENV{'form.'.$uname.':'.$udom.':submitted_by'}}.'</a>';
     $request->print($submitby);      $request->print($submitby);
  } else {   } else {
     my ($string,$timestamp)=      my ($string,$timestamp)= &get_last_submission (\%record);
  &get_last_submission (%record);  
     my $lastsubonly=''.      my $lastsubonly=''.
  ($$timestamp eq '' ? '' : '<b>Date Submitted:</b> '.   ($$timestamp eq '' ? '' : '<b>Date Submitted:</b> '.
  $$timestamp).'';   $$timestamp)."</td></tr>\n";
     if ($$timestamp eq '') {      if ($$timestamp eq '') {
  $lastsubonly.='<tr><td bgcolor="#ffffe6">'.$$string[0].'</td></tr>'."\n";   $lastsubonly.='<tr><td bgcolor="#ffffe6">'.$$string[0]; 
     } else {      } else {
  for my $part (sort keys(%$handgrade)) {   for my $part (sort keys(%$handgrade)) {
     foreach (@$string) {      my ($responsetype,$foo) = split(/:/,$$handgrade{$part});
  my ($partid,$respid) = /^resource\.(\w+)\.(\w+)\.submission/;      my ($partid,$respid) = split(/_/,$part);
  if ($part eq ($partid.'_'.$respid)) {      if (!exists($record{'resource.'.$partid.'.'.$respid.'.submission'})) {
     my ($ressub,$subval) = split(/:/,$_,2);   $lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '.
 # Similarity check      $partid.'</b> <font color="#999999">( ID '.$respid.
                             my $similar='';      ' )</font>&nbsp; &nbsp;Nothing submitted - no attempts<br /><br />';
                             my ($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval);       } else {
                             if ($osim) {   foreach (@$string) {
  $osim=int($osim*100.0);      my ($partid,$respid) = /^resource\.(\w+)\.(\w+)\.submission/;
  $similar='<hr /><h3><font color="#FF0000">Essay is '.$osim.      if ($part eq ($partid.'_'.$respid)) {
     '% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom).   my ($ressub,$subval) = split(/:/,$_,2);
                                 '</font></h3><blockquote><i>'.                              # Similarity check
                                 &keywords_highlight($oessay).'</i></blockquote><hr />';   my $similar='';
                             }   my ($oname,$odom,$ocrsid,$oessay,$osim)=&most_similar($uname,$udom,$subval);
     $lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '.   if ($osim) {
  $partid.'</b> <font color="#999999">( ID '.$respid.      $osim=int($osim*100.0);
  ' )</font>&nbsp; &nbsp;'.      $similar='<hr /><h3><font color="#FF0000">Essay is '.$osim.
                                 ($record{"resource.$partid.$respid.uploadedurl"}?   '% similar to an essay by '.&Apache::loncommon::plainname($oname,$odom).
                                 '<a href="'.   '</font></h3><blockquote><i>'.
                                 &Apache::lonnet::tokenwrapper($record{"resource.$partid.$respid.uploadedurl"}).   &keywords_highlight($oessay).'</i></blockquote><hr />';
  '"><img src="/adm/lonIcons/unknown.gif" border=0"> File uploaded by student</a> '.   }
  '<font color="red" size="1">Like all files provided by users, '.   $lastsubonly.='<tr><td bgcolor="#ffffe6"><b>Part '.
  'this file may contain virusses</font><br />':'').      $partid.'</b> <font color="#999999">( ID '.$respid.
                                 '<b>Answer: </b><blockquote>'.      ' )</font>&nbsp; &nbsp;'.
  &keywords_highlight($subval).'</blockquote><br />&nbsp;'.$similar.'</td></tr>'."\n"      ($record{"resource.$partid.$respid.uploadedurl"}?
  if ($ENV{'form.lastSub'} eq 'lastonly' ||        '<a href="'.
     ($ENV{'form.lastSub'} eq 'hdgrade' &&        &Apache::lonnet::tokenwrapper($record{"resource.$partid.$respid.uploadedurl"}).
      $$handgrade{$part} =~ /:yes$/));       '"><img src="/adm/lonIcons/unknown.gif" border=0"> File uploaded by student</a> '.
        '<font color="red" size="1">Like all files provided by users, '.
        'this file may contain virusses</font><br />':'').
        '<b>Submitted Answer: </b>'.($responsetype =~ /^(essay|option)$/ ? 
     '<blockquote>' : '').
   #     &cleanRecord(&keywords_highlight($subval),$responsetype).
        &cleanRecord($subval,$responsetype,$symb).
        ($responsetype =~ /^(essay|option)$/ ? '</blockquote><br />' : 
         '<br /><br />').$similar."\n"
        if ($ENV{'form.lastSub'} eq 'lastonly' || 
    ($ENV{'form.lastSub'} eq 'hdgrade' && 
     $$handgrade{$part} =~ /:yes$/));
       }
  }   }
     }      }
  }   }
     }      }
     $lastsubonly.='</td></tr>'."\n";      $lastsubonly.='</td></tr><tr bgcolor="#ffffff"><td>'."\n";
     $request->print($lastsubonly);      $request->print($lastsubonly);
  }   }
     } else {      } elsif ($ENV{'form.lastSub'} eq 'datesub') {
    my (undef,$responseType,undef,$parts) = &showResourceInfo($url);
    $request->print(&displaySubByDates(\$symb,\%record,$parts,$responseType,$checkIcon));
       } elsif ($ENV{'form.lastSub'} =~ /^(last|all)$/) {
  $request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom,   $request->print(&Apache::loncommon::get_previous_attempt($symb,$uname,$udom,
  $ENV{'request.course.id'},   $ENV{'request.course.id'},
  $last,'.submission',   $last,'.submission',
  'Apache::grades::keywords_highlight'));   'Apache::grades::keywords_highlight'));
     }      }
   
       $request->print('<input type="hidden" name="unamedom'.$counter.'" value="'.$uname.':'
    .$udom.'" />'."\n");
           
     # return if view submission with no grading option      # return if view submission with no grading option
 #    if ($ENV{'form.showgrading'} eq '' || (!&canmodify($usec))) {      if ($ENV{'form.showgrading'} eq '' || (!&canmodify($usec))) {
     if (!&canmodify($usec)) {   my $toGrade.='<input type="button" value="Grade Student" '.
  $request->print('</td></tr></table></td></tr></table></form>'."\n");      'onClick="javascript:checksubmit(this.form,\'Grade Student\',\''
  $request->print(&show_grading_menu_form($symb,$url))       .$counter.'\');" TARGET=_self> &nbsp;'."\n" if (&canmodify($usec));
    $toGrade.='</td></tr></table></td></tr></table></form>'."\n";
    $toGrade.=&show_grading_menu_form($symb,$url) 
     if (($ENV{'form.command'} eq 'submission') ||       if (($ENV{'form.command'} eq 'submission') || 
  ($ENV{'form.command'} eq 'processGroup' && $counter == $total));   ($ENV{'form.command'} eq 'processGroup' && $counter == $total));
    $request = print($toGrade);
  return;   return;
     }      }
   
     # Grading options      # essay grading message center
     $result='<input type="hidden" name="newmsg'.$counter.'" value="" />'."\n".      if ($ENV{'form.handgrade'} eq 'yes') {
  '<input type="hidden" name="includemsg'.$counter.'" value="" />'."\n".   my ($lastname,$givenn) = split(/,/,$ENV{'form.fullname'});
  '<input type="hidden" name="unamedom'.$counter.'" value="'.$uname.':'   my $msgfor = $givenn.' '.$lastname;
  .$udom.'" />'."\n";   if (scalar(@col_fullnames) > 0) {
     my ($lastname,$givenn) = split(/,/,$ENV{'form.fullname'});      my $lastone = pop @col_fullnames;
     my $msgfor = $givenn.' '.$lastname;      $msgfor .= ', '.(join ', ',@col_fullnames).' and '.$lastone.'.';
     if (scalar(@col_fullnames) > 0) {   }
  my $lastone = pop @col_fullnames;   $msgfor =~ s/\'/\\'/g; #' stupid emacs - no! javascript
  $msgfor .= ', '.(join ', ',@col_fullnames).' and '.$lastone.'.';  # $result.='<tr><td bgcolor="#ffffff">'."\n".
     }   $result='<input type="hidden" name="includemsg'.$counter.'" value="" />'."\n".
     $msgfor =~ s/\'/\\'/g; #' stupid emacs - no! javascript      '<input type="hidden" name="newmsg'.$counter.'" value="" />'."\n";
     $result.='<tr><td bgcolor="#ffffff">'."\n".   $result.='&nbsp;<a href="javascript:msgCenter(document.SCORE,'.$counter.
  '&nbsp;<a href="javascript:msgCenter(document.SCORE,'.$counter.      ',\''.$msgfor.'\')"; TARGET=_self>'.
  ',\''.$msgfor.'\')"; TARGET=_self>'.      'Compose Message to student'.(scalar(@col_fullnames) >= 1 ? 's' : '').'</a> &nbsp;'.
  'Compose Message to student'.(scalar(@col_fullnames) >= 1 ? 's' : '').'</a> &nbsp;'.      '<img src="'.$request->dir_config('lonIconsURL').
  '<img src="'.$request->dir_config('lonIconsURL').      '/mailbkgrd.gif" width="14" height="10" name="mailicon'.$counter.'" />'."\n".
  '/mailbkgrd.gif" width="14" height="10" name="mailicon'.$counter.'" />'."\n".      '<br />&nbsp;(Message will be sent when you click on Save & Next below.)'."\n" 
  '<br />&nbsp;(Message will be sent when you click on Save & Next below.)'."\n"       if ($ENV{'form.handgrade'} eq 'yes');
  if ($ENV{'form.handgrade'} eq 'yes');   $request->print($result);
     $request->print($result);      }
   
     my %seen = ();      my %seen = ();
     my @partlist;      my @partlist;
Line 1394  KEYWORDS Line 1505  KEYWORDS
  my ($partid,$respid) = split(/_/);   my ($partid,$respid) = split(/_/);
  next if ($seen{$partid} > 0);   next if ($seen{$partid} > 0);
  $seen{$partid}++;   $seen{$partid}++;
 # next if ($$handgrade{$_} =~ /:no$/);   next if ($$handgrade{$_} =~ /:no$/ && $ENV{'form.lastSub'} =~ /^(hdgrade)$/);
  push @partlist,$partid;   push @partlist,$partid;
   
  $request->print(&gradeBox($request,$symb,$uname,$udom,$counter,$partid,\%record));   $request->print(&gradeBox($request,$symb,$uname,$udom,$counter,$partid,\%record));
Line 1411  KEYWORDS Line 1522  KEYWORDS
   
     # print end of form      # print end of form
     if ($counter == $total) {      if ($counter == $total) {
  my $endform='<table border="0"><tr><td>'.   my $endform='<table border="0"><tr><td>'."\n";
     '<input type="hidden" name="gradeOpt" value="" />'."\n";   $endform.='<input type="button" value="Save & Next" '.
  if ($ENV{'form.handgrade'} eq 'yes') {      'onClick="javascript:checksubmit(this.form,\'Save & Next\','.
     $endform.='<input type="button" value="Save & Next" '.      $total.','.scalar(@partlist).');" TARGET=_self> &nbsp;'."\n";
  'onClick="javascript:checksubmit(this.form,\'Save & Next\','.   my $ntstu ='<select name="NTSTU">'.
  $total.','.scalar(@partlist).');" TARGET=_self> &nbsp;'."\n";      '<option>1</option><option>2</option>'.
     my $ntstu ='<select name="NTSTU">'.      '<option>3</option><option>5</option>'.
  '<option>1</option><option>2</option>'.      '<option>7</option><option>10</option></select>'."\n";
  '<option>3</option><option>5</option>'.   my $nsel = ($ENV{'form.NTSTU'} ne '' ? $ENV{'form.NTSTU'} : '1');
  '<option>7</option><option>10</option></select>'."\n";   $ntstu =~ s/<option>$nsel</<option selected="on">$nsel</;
     my $nsel = ($ENV{'form.NTSTU'} ne '' ? $ENV{'form.NTSTU'} : '1');   $endform.=$ntstu.'student(s) &nbsp;&nbsp;';
     $ntstu =~ s/<option>$nsel</<option selected="on">$nsel</;  
     $endform.=$ntstu.'student(s) &nbsp;&nbsp;';  
  } else {  
     $endform.='<input type="hidden" name="NTSTU" value="1" />'."\n";  
  }  
  $endform.='<input type="button" value="Next" '.   $endform.='<input type="button" value="Next" '.
     'onClick="javascript:checksubmit(this.form,\'Next\');" TARGET=_self> &nbsp;'."\n".      'onClick="javascript:checksubmit(this.form,\'Next\');" TARGET=_self> &nbsp;'."\n".
     '<input type="button" value="Previous" '.      '<input type="button" value="Previous" '.
     'onClick="javascript:checksubmit(this.form,\'Previous\');" TARGET=_self> &nbsp;';      'onClick="javascript:checksubmit(this.form,\'Previous\');" TARGET=_self> &nbsp;';
  $endform.='(Next and Previous do not save the scores.)'."\n"    $endform.='(Next and Previous do not save the scores.)'."\n" ;
     if ($ENV{'form.handgrade'} eq 'yes');  
  $endform.='</td><tr></table></form>';   $endform.='</td><tr></table></form>';
  $endform.=&show_grading_menu_form($symb,$url);   $endform.=&show_grading_menu_form($symb,$url);
  $request->print($endform);   $request->print($endform);
Line 1442  KEYWORDS Line 1547  KEYWORDS
   
 #--- Retrieve the last submission for all the parts  #--- Retrieve the last submission for all the parts
 sub get_last_submission {  sub get_last_submission {
     my (%returnhash)=@_;      my ($returnhash)=@_;
     my (@string,$timestamp);      my (@string,$timestamp);
     if ($returnhash{'version'}) {      if ($$returnhash{'version'}) {
  my %lasthash=();   my %lasthash=();
  my ($version);   my ($version);
  for ($version=1;$version<=$returnhash{'version'};$version++) {   for ($version=1;$version<=$$returnhash{'version'};$version++) {
     foreach (sort(split(/\:/,$returnhash{$version.':keys'}))) {      foreach (sort(split(/\:/,$$returnhash{$version.':keys'}))) {
  $lasthash{$_}=$returnhash{$version.':'.$_};   $lasthash{$_}=$$returnhash{$version.':'.$_};
    $timestamp = scalar(localtime($returnhash{$version.':timestamp'}));     $timestamp = scalar(localtime($$returnhash{$version.':timestamp'}));
     }      }
  }   }
  foreach ((keys %lasthash)) {   foreach ((keys %lasthash)) {
Line 1474  sub keywords_highlight { Line 1579  sub keywords_highlight {
     (my $styleoff = $styleon) =~ s/\</\<\//;      (my $styleoff = $styleon) =~ s/\</\<\//;
     my @keylist   = split(/[,\s+]/,$ENV{'form.keywords'});      my @keylist   = split(/[,\s+]/,$ENV{'form.keywords'});
     foreach (@keylist) {      foreach (@keylist) {
  $string =~ s/\b\Q$_\E(\b|\.)/\<font color\=$ENV{'form.kwclr'} $size\>$styleon$_$styleoff\<\/font\>/gi;   $string =~ s/\b\Q$_\E(\b|\.)/<font color\=$ENV{'form.kwclr'} $size\>$styleon$_$styleoff<\/font>/gi;
     }      }
     # This is not really the right place to do this, but I cannot find a  
     # better one at this time.  So here we go - the m in the s:::mg causes  
     # ^ to match the beginning of a new line.  So we replace(???) the beginning  
     # of the line with <br /> to make things formatted a little better.  
     $string =~ s:^:<br />:mg;  
     return $string;      return $string;
 }  }
   
Line 1492  sub processHandGrade { Line 1592  sub processHandGrade {
     my $button = $ENV{'form.gradeOpt'};      my $button = $ENV{'form.gradeOpt'};
     my $ngrade = $ENV{'form.NCT'};      my $ngrade = $ENV{'form.NCT'};
     my $ntstu  = $ENV{'form.NTSTU'};      my $ntstu  = $ENV{'form.NTSTU'};
   
     if ($button eq 'Save & Next') {      if ($button eq 'Save & Next') {
  my $ctr = 0;   my $ctr = 0;
  while ($ctr < $ngrade) {   while ($ctr < $ngrade) {
Line 1526  sub processHandGrade { Line 1625  sub processHandGrade {
     if ($ENV{'form.collaborator'.$ctr}) {      if ($ENV{'form.collaborator'.$ctr}) {
  my (@collaborators) = split(/:/,$ENV{'form.collaborator'.$ctr});   my (@collaborators) = split(/:/,$ENV{'form.collaborator'.$ctr});
  foreach (@collaborators) {   foreach (@collaborators) {
     my ($errorflag,$pts,$wgt) = &saveHandGrade($request,$url,$symb,$_,$udom,$ctr,$ENV{'form.unamedom'.$ctr});      my ($errorflag,$pts,$wgt) = 
    &saveHandGrade($request,$url,$symb,$_,$udom,$ctr,$ENV{'form.unamedom'.$ctr});
     if ($errorflag eq 'not_allowed') {      if ($errorflag eq 'not_allowed') {
  $request->print("<font color=\"red\">Not allowed to modify grades for $_:$udom</font>");   $request->print("<font color=\"red\">Not allowed to modify grades for $_:$udom</font>");
  next;   next;
Line 1543  sub processHandGrade { Line 1643  sub processHandGrade {
  }   }
     }      }
   
     # Keywords sorted in alphabatical order      if ($ENV{'form.handgrade'} eq 'yes') {
     my $loginuser = $ENV{'user.name'}.':'.$ENV{'user.domain'};   # Keywords sorted in alphabatical order
     my %keyhash = ();   my $loginuser = $ENV{'user.name'}.':'.$ENV{'user.domain'};
     $ENV{'form.keywords'}           =~ s/,\s{0,}|\s+/ /g;   my %keyhash = ();
     $ENV{'form.keywords'}           =~ s/^\s+|\s+$//;   $ENV{'form.keywords'}           =~ s/,\s{0,}|\s+/ /g;
     my (@keywords) = sort(split(/\s+/,$ENV{'form.keywords'}));   $ENV{'form.keywords'}           =~ s/^\s+|\s+$//;
     $ENV{'form.keywords'} = join(' ',@keywords);   my (@keywords) = sort(split(/\s+/,$ENV{'form.keywords'}));
     $keyhash{$symb.'_keywords'}     = $ENV{'form.keywords'};   $ENV{'form.keywords'} = join(' ',@keywords);
     $keyhash{$symb.'_subject'}      = $ENV{'form.msgsub'};   $keyhash{$symb.'_keywords'}     = $ENV{'form.keywords'};
     $keyhash{$loginuser.'_kwclr'}   = $ENV{'form.kwclr'};   $keyhash{$symb.'_subject'}      = $ENV{'form.msgsub'};
     $keyhash{$loginuser.'_kwsize'}  = $ENV{'form.kwsize'};   $keyhash{$loginuser.'_kwclr'}   = $ENV{'form.kwclr'};
     $keyhash{$loginuser.'_kwstyle'} = $ENV{'form.kwstyle'};   $keyhash{$loginuser.'_kwsize'}  = $ENV{'form.kwsize'};
    $keyhash{$loginuser.'_kwstyle'} = $ENV{'form.kwstyle'};
     # message center - Order of message gets changed. Blank line is eliminated.  
     # New messages are saved in ENV for the next student.   # message center - Order of message gets changed. Blank line is eliminated.
     # All messages are saved in nohist_handgrade.db   # New messages are saved in ENV for the next student.
     my ($ctr,$idx) = (1,1);   # All messages are saved in nohist_handgrade.db
     while ($ctr <= $ENV{'form.savemsgN'}) {   my ($ctr,$idx) = (1,1);
  if ($ENV{'form.savemsg'.$ctr} ne '') {   while ($ctr <= $ENV{'form.savemsgN'}) {
     $keyhash{$symb.'_savemsg'.$idx} = $ENV{'form.savemsg'.$ctr};      if ($ENV{'form.savemsg'.$ctr} ne '') {
     $idx++;   $keyhash{$symb.'_savemsg'.$idx} = $ENV{'form.savemsg'.$ctr};
    $idx++;
       }
       $ctr++;
  }   }
  $ctr++;   $ctr = 0;
     }   while ($ctr < $ngrade) {
     $ctr = 0;      if ($ENV{'form.newmsg'.$ctr} ne '') {
     while ($ctr < $ngrade) {   $keyhash{$symb.'_savemsg'.$idx} = $ENV{'form.newmsg'.$ctr};
  if ($ENV{'form.newmsg'.$ctr} ne '') {   $ENV{'form.savemsg'.$idx} = $ENV{'form.newmsg'.$ctr};
     $keyhash{$symb.'_savemsg'.$idx} = $ENV{'form.newmsg'.$ctr};   $idx++;
     $ENV{'form.savemsg'.$idx} = $ENV{'form.newmsg'.$ctr};      }
     $idx++;      $ctr++;
  }   }
  $ctr++;   $ENV{'form.savemsgN'} = --$idx;
    $keyhash{$symb.'_savemsgN'} = $ENV{'form.savemsgN'};
    my $putresult = &Apache::lonnet::put
       ('nohist_handgrade',\%keyhash,
        $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
        $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
     }      }
     $ENV{'form.savemsgN'} = --$idx;  
     $keyhash{$symb.'_savemsgN'} = $ENV{'form.savemsgN'};  
     my $putresult = &Apache::lonnet::put  
  ('nohist_handgrade',\%keyhash,  
  $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},  
  $ENV{'course.'.$ENV{'request.course.id'}.'.num'});  
   
     # Called by Save & Refresh from Highlight Attribute Window      # Called by Save & Refresh from Highlight Attribute Window
     my (undef,undef,$fullname) = &getclasslist($ENV{'form.section'},'0');      my (undef,undef,$fullname) = &getclasslist($ENV{'form.section'},'1');
     if ($ENV{'form.refresh'} eq 'on') {      if ($ENV{'form.refresh'} eq 'on') {
  my ($ctr,$total) = (0,0);   my ($ctr,$total) = (0,0);
  while ($ctr < $ngrade) {   while ($ctr < $ngrade) {
Line 1603  sub processHandGrade { Line 1704  sub processHandGrade {
  return '';   return '';
     }      }
   
   # Go directly to grade student - from submission or link from chart page
       if ($button eq 'Grade Student') {
    (undef,undef,$ENV{'form.handgrade'},undef,undef) = &showResourceInfo($url);
    my $processUser = $ENV{'form.unamedom'.$ENV{'form.studentNo'}};
    ($ENV{'form.student'},$ENV{'form.userdom'}) = split(/:/,$processUser);
    $ENV{'form.fullname'} = $$fullname{$processUser};
    &submission($request,0,0);
    return '';
       }
   
     # Get the next/previous one or group of students      # Get the next/previous one or group of students
     my $firststu = $ENV{'form.unamedom0'};      my $firststu = $ENV{'form.unamedom0'};
     my $laststu = $ENV{'form.unamedom'.($ngrade-1)};      my $laststu = $ENV{'form.unamedom'.($ngrade-1)};
     $ctr = 2;      my $ctr = 2;
     while ($laststu eq '') {      while ($laststu eq '') {
  $laststu  = $ENV{'form.unamedom'.($ngrade-$ctr)};   $laststu  = $ENV{'form.unamedom'.($ngrade-$ctr)};
  $ctr++;   $ctr++;
Line 1690  sub saveHandGrade { Line 1801  sub saveHandGrade {
     $wgt = $ENV{'form.WGT'.$newflg.'_'.$_} eq '' ? 1 :       $wgt = $ENV{'form.WGT'.$newflg.'_'.$_} eq '' ? 1 : 
  $ENV{'form.WGT'.$newflg.'_'.$_};   $ENV{'form.WGT'.$newflg.'_'.$_};
     my $partial= $pts/$wgt;      my $partial= $pts/$wgt;
       next if ($partial eq $record{'resource.'.$_.'.awarded'}); #do not update score for part if not changed.
     $newrecord{'resource.'.$_.'.awarded'}  = $partial       $newrecord{'resource.'.$_.'.awarded'}  = $partial 
  if ($record{'resource.'.$_.'.awarded'} ne $partial);   if ($record{'resource.'.$_.'.awarded'} ne $partial);
     my $reckey = 'resource.'.$_.'.solved';      my $reckey = 'resource.'.$_.'.solved';
Line 1702  sub saveHandGrade { Line 1814  sub saveHandGrade {
     }      }
     $newrecord{'resource.'.$_.'.submitted_by'} = $submitter       $newrecord{'resource.'.$_.'.submitted_by'} = $submitter 
  if ($submitter && ($record{'resource.'.$_.'.submitted_by'} ne $submitter));   if ($submitter && ($record{'resource.'.$_.'.submitted_by'} ne $submitter));
     $newrecord{'resource.'.$_.'regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";      $newrecord{'resource.'.$_.'.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";
  }   }
     }      }
   
Line 1895  sub viewgrades { Line 2007  sub viewgrades {
     my ($symb,$url) = ($ENV{'form.symb'},$ENV{'form.url'});       my ($symb,$url) = ($ENV{'form.symb'},$ENV{'form.url'}); 
     my $result='<h3><font color="#339933">Manual Grading</font></h3>';      my $result='<h3><font color="#339933">Manual Grading</font></h3>';
   
     $result.='<font size=+1><b>Problem: </b>'.$ENV{'form.probTitle'}.'</font>'."\n";      $result.='<font size=+1><b>Current Resource: </b>'.$ENV{'form.probTitle'}.'</font>'."\n";
   
     #view individual student submission form - called using Javascript viewOneStudent      #view individual student submission form - called using Javascript viewOneStudent
     $result.=&jscriptNform($url,$symb);      $result.=&jscriptNform($url,$symb);
Line 1964  sub viewgrades { Line 2076  sub viewgrades {
  '<input type="hidden" name="totalparts" value="'.$ctsparts.'" />';   '<input type="hidden" name="totalparts" value="'.$ctsparts.'" />';
     $result.='<input type="button" value="Reset" '.      $result.='<input type="button" value="Reset" '.
  'onClick="javascript:resetEntry('.$ctsparts.');" TARGET=_self>';   'onClick="javascript:resetEntry('.$ctsparts.');" TARGET=_self>';
 #    $result.=' &nbsp; &nbsp;<input type="button" value="Submit Changes" name="subButton1'.  
 # 'onClick="javascript:submit();" TARGET=_self />'."\n";  
   
     #table listing all the students in a section/class      #table listing all the students in a section/class
     #header of table      #header of table
Line 1983  sub viewgrades { Line 2093  sub viewgrades {
     my (@parts) = sort(&getpartlist($url));      my (@parts) = sort(&getpartlist($url));
     foreach my $part (@parts) {      foreach my $part (@parts) {
  my $display=&Apache::lonnet::metadata($url,$part.'.display');   my $display=&Apache::lonnet::metadata($url,$part.'.display');
  next if ($display =~ /Number of Attempts/);   $display =~ s/^Number of Attempts/Tries/; # makes the column narrower
  if  (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); }   if  (!$display) { $display = &Apache::lonnet::metadata($url,$part.'.name'); }
  if ($display =~ /^Partial Credit Factor/) {   if ($display =~ /^Partial Credit Factor/) {
     my ($partid) = &split_part_type($part);      my ($partid) = &split_part_type($part);
Line 2055  sub viewstudentgrade { Line 2165  sub viewstudentgrade {
  if ($status eq 'excused');   if ($status eq 'excused');
     $result.=$optsel;      $result.=$optsel;
     $result.="</select></td>\n";      $result.="</select></td>\n";
 # } else {   } else {
 #    $result.='<input type="hidden" name="'.      $result.='<input type="hidden" name="'.
 # 'GD_'.$student.'_'.$part.'_'.$type.'_s" value="'.$score.'" />'.   'GD_'.$student.'_'.$part.'_'.$type.'_s" value="'.$score.'" />'.
 #    "\n";      "\n";
 #    $result.='<td align="middle"><input type="text" name="'.      $result.='<td align="middle"><input type="text" name="'.
 # 'GD_'.$student.'_'.$part.'_'.$type.'" '.   'GD_'.$student.'_'.$part.'_'.$type.'" '.
 # 'value="'.$score.'" size="4" /></td>'."\n";   'value="'.$score.'" size="4" /></td>'."\n";
  }   }
     }      }
     $result.='</tr>';      $result.='</tr>';
Line 2076  sub editgrades { Line 2186  sub editgrades {
     my $symb=$ENV{'form.symb'};      my $symb=$ENV{'form.symb'};
     my $url =$ENV{'form.url'};      my $url =$ENV{'form.url'};
     my $title='<h3><font color="#339933">Current Grade Status</font></h3>';      my $title='<h3><font color="#339933">Current Grade Status</font></h3>';
     $title.='<font size=+1><b>Problem: </b>'.$ENV{'form.probTitle'}.'</font><br />'."\n";      $title.='<font size=+1><b>Current Resource: </b>'.$ENV{'form.probTitle'}.'</font><br />'."\n";
     $title.='<font size=+1><b>Section: </b>'.$ENV{'form.section'}.'</font>'."\n";      $title.='<font size=+1><b>Section: </b>'.$ENV{'form.section'}.'</font>'."\n";
     my $result= '<table border="0"><tr><td bgcolor="#777777">'."\n";      my $result= '<table border="0"><tr><td bgcolor="#777777">'."\n";
     $result.= '<table border="0"><tr bgcolor="#deffff">'.      $result.= '<table border="0"><tr bgcolor="#deffff">'.
Line 2185  sub editgrades { Line 2295  sub editgrades {
  my $awarded   = $ENV{'form.GD_'.$user.'_'.$part.'_'.$type};   my $awarded   = $ENV{'form.GD_'.$user.'_'.$part.'_'.$type};
  if ($awarded ne '' && $awarded ne $old_aw) {   if ($awarded ne '' && $awarded ne $old_aw) {
     $newrecord{'resource.'.$part.'.'.$type}= $awarded;      $newrecord{'resource.'.$part.'.'.$type}= $awarded;
     $newrecord{'resource.'.$part.'regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";      $newrecord{'resource.'.$part.'.regrader'}="$ENV{'user.name'}:$ENV{'user.domain'}";
     $updateflag=1;      $updateflag=1;
  }   }
  $line .= '<td align="center">'.$old_aw.'&nbsp;</td>'.   $line .= '<td align="center">'.$old_aw.'&nbsp;</td>'.
Line 2314  sub csvuploadmap_header { Line 2424  sub csvuploadmap_header {
  $javascript=&csvupload_javascript_forward_associate();   $javascript=&csvupload_javascript_forward_associate();
     }      }
   
     my $result='<table border="0">';      my ($result) = &showResourceInfo($url,$ENV{'form.probTitle'});
     $result.='<tr><td colspan=3><font size=+1><b>Problem: </b>'.$ENV{'form.probTitle'}.'</font></td></tr>';  
     my ($partlist,$handgrade) = &response_type($url);  
     my ($resptype,$hdgrade)=('','no');  
     for (sort keys(%$handgrade)) {  
  my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});  
  $resptype = $responsetype;  
  $hdgrade = $handgrade if ($handgrade eq 'yes');  
  $result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'.  
     '<td><b>Type: </b>'.$responsetype.'</td>'.  
     '<td><b>Handgrade: </b>'.$handgrade.'</font></td></tr>';  
     }  
     $result.='</table>';  
     $request->print(<<ENDPICK);      $request->print(<<ENDPICK);
 <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">  <form method="post" enctype="multipart/form-data" action="/adm/grades" name="gradesupload">
 <h3><font color="#339933">Uploading Class Grades</font></h3>  <h3><font color="#339933">Uploading Class Grades</font></h3>
Line 2354  to this page if the data selected is ins Line 2453  to this page if the data selected is ins
 $javascript  $javascript
 </script>  </script>
 ENDPICK  ENDPICK
 return '';      $request->print(&show_grading_menu_form($symb,$url));
       return '';
   
 }  }
   
Line 2400  sub upcsvScores_form { Line 2500  sub upcsvScores_form {
     </script>      </script>
 CSVFORMJS  CSVFORMJS
     $ENV{'form.probTitle'} = &Apache::lonnet::gettitle($symb);      $ENV{'form.probTitle'} = &Apache::lonnet::gettitle($symb);
       my ($table) = &showResourceInfo($url,$ENV{'form.probTitle'});
       $result.=$table;
     $result.='<br /><table width=100% border=0><tr><td bgcolor="#777777">'."\n";      $result.='<br /><table width=100% border=0><tr><td bgcolor="#777777">'."\n";
     $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n";      $result.='<table width=100% border=0><tr bgcolor="#e6ffff"><td>'."\n";
     $result.='&nbsp;<b>Specify a file containing the class scores for problem - '.$ENV{'form.probTitle'}.      $result.='&nbsp;<b>Specify a file containing the class scores for current resource'.
  '.</b></td></tr>'."\n";   '.</b></td></tr>'."\n";
     $result.='<tr bgcolor=#ffffe6><td>'."\n";      $result.='<tr bgcolor=#ffffe6><td>'."\n";
     my $upfile_select=&Apache::loncommon::upfile_select_html();      my $upfile_select=&Apache::loncommon::upfile_select_html();
Line 2421  ENDUPFORM Line 2523  ENDUPFORM
     $result.='</td></tr></table>'."\n";      $result.='</td></tr></table>'."\n";
     $result.='</td></tr></table><br /><br />'."\n";      $result.='</td></tr></table><br /><br />'."\n";
     $result.=&show_grading_menu_form($symb,$url);      $result.=&show_grading_menu_form($symb,$url);
   
     return $result;      return $result;
 }  }
   
Line 2535  sub csvuploadassign { Line 2636  sub csvuploadassign {
 #  #
 #-------------------------------------------------------------------  #-------------------------------------------------------------------
 #  #
 #-------------- Next few routines handles grading by page/sequence  #-------------- Next few routines handle grading by page/sequence
 #  #
 #--- Select a page/sequence and a student to grade  #--- Select a page/sequence and a student to grade
 sub pickStudentPage {  sub pickStudentPage {
Line 2555  function checkPickOne(formname) { Line 2656  function checkPickOne(formname) {
     formname.submit();      formname.submit();
 }  }
   
 function radioSelection(radioButton) {  
     var selection=null;  
     if (radioButton.length > 1) {  
  for (var i=0; i<radioButton.length; i++) {  
     if (radioButton[i].checked) {  
  return radioButton[i].value;  
     }  
  }  
     } else {  
  if (radioButton.checked) return radioButton.value;  
     }  
     return selection;  
 }  
       
 function pullDownSelection(selectOne) {  
     var selection="";  
     if (selectOne.length > 1) {  
  for (var i=0; i<selectOne.length; i++) {  
     if (selectOne[i].selected) {  
  return selectOne[i].value;  
     }  
  }  
     } else {  
  if (selectOne.selected) return selectOne.value;  
     }  
 }  
 </script>  </script>
 LISTJAVASCRIPT  LISTJAVASCRIPT
       &commonJSfunctions($request);
     my ($symb,$url) = &get_symb_and_url($request);      my ($symb,$url) = &get_symb_and_url($request);
     my $cdom      = $ENV{"course.$ENV{'request.course.id'}.domain"};      my $cdom      = $ENV{"course.$ENV{'request.course.id'}.domain"};
     my $cnum      = $ENV{"course.$ENV{'request.course.id'}.num"};      my $cnum      = $ENV{"course.$ENV{'request.course.id'}.num"};
Line 2620  LISTJAVASCRIPT Line 2695  LISTJAVASCRIPT
   
     $result.='&nbsp;<b>Submission Details: </b>'.      $result.='&nbsp;<b>Submission Details: </b>'.
  '<input type="radio" name="lastSub" value="none" /> none'."\n".   '<input type="radio" name="lastSub" value="none" /> none'."\n".
  '<input type="radio" name="lastSub" value="datesub" checked /> dates and submissions'."\n".   '<input type="radio" name="lastSub" value="datesub" checked /> by dates and submissions'."\n".
  '<input type="radio" name="lastSub" value="all" /> all details'."\n";   '<input type="radio" name="lastSub" value="all" /> all details'."\n";
   
     $result.='<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".      $result.='<input type="hidden" name="section"     value="'.$getsec.'" />'."\n".
  '<input type="hidden" name="Status"     value="'.$ENV{'form.Status'}.'" />'."\n".   '<input type="hidden" name="Status"  value="'.$ENV{'form.Status'}.'" />'."\n".
  '<input type="hidden" name="command" value="displayPage" />'."\n".   '<input type="hidden" name="command" value="displayPage" />'."\n".
  '<input type="hidden" name="url"     value="'.$url.'" />'."\n".   '<input type="hidden" name="url"     value="'.$url.'" />'."\n".
  '<input type="hidden" name="symb"    value="'.$symb.'" />'."\n".   '<input type="hidden" name="symb"    value="'.$symb.'" />'."\n".
Line 2736  sub displayPage { Line 2811  sub displayPage {
     my $checkIcon = '<img src="'.$request->dir_config('lonIconsURL').      my $checkIcon = '<img src="'.$request->dir_config('lonIconsURL').
  '/check.gif" height="16" border="0" />';   '/check.gif" height="16" border="0" />';
   
     $studentTable.='&nbsp;<b>Note:</b> A problem graded correct ('.$checkIcon.      $studentTable.='&nbsp;<b>Note:</b> Problems graded correct by the computer are marked with a '.$checkIcon.
  ') by the computer cannot be changed.'."\n".   ' symbol.'."\n".
  '<table border="0"><tr><td bgcolor="#777777">'.   '<table border="0"><tr><td bgcolor="#777777">'.
  '<table border="0"><tr bgcolor="#e6ffff">'.   '<table border="0"><tr bgcolor="#e6ffff">'.
  '<td align="center"><b>&nbsp;No&nbsp;</b></td>'.   '<td align="center"><b>&nbsp;Prob.&nbsp;</b></td>'.
  '<td><b>&nbsp;'.($ENV{'form.vProb'} eq 'no' ? 'Title' : 'Problem View').'/Grade</b></td></tr>';   '<td><b>&nbsp;'.($ENV{'form.vProb'} eq 'no' ? 'Title' : 'Problem Text').'/Grade</b></td></tr>';
   
     my ($depth,$question) = (1,1);      my ($depth,$question) = (1,1);
     $iterator->next(); # skip the first BEGIN_MAP      $iterator->next(); # skip the first BEGIN_MAP
Line 2750  sub displayPage { Line 2825  sub displayPage {
         if($curRes == $iterator->BEGIN_MAP) { $depth++; }          if($curRes == $iterator->BEGIN_MAP) { $depth++; }
         if($curRes == $iterator->END_MAP) { $depth--; }          if($curRes == $iterator->END_MAP) { $depth--; }
   
         if (ref($curRes) && $curRes->is_problem() && !$curRes->randomout) {  #        if (ref($curRes) && $curRes->is_problem() && !$curRes->randomout) {
           if (ref($curRes) && $curRes->is_problem()) {
     my $parts = $curRes->parts();      my $parts = $curRes->parts();
             my $title = $curRes->compTitle();              my $title = $curRes->compTitle();
     my $symbx = $curRes->symb();      my $symbx = $curRes->symb();
Line 2776  sub displayPage { Line 2852  sub displayPage {
  if ($record{'version'} eq '') {   if ($record{'version'} eq '') {
     $studentTable.='<br />&nbsp;<font color="red">No recorded submission for this problem</font><br />';      $studentTable.='<br />&nbsp;<font color="red">No recorded submission for this problem</font><br />';
  } else {   } else {
     $studentTable.='<table border="0" width="100%"><tr><td bgcolor="#777777">'.  
  '<table border="0" width="100%"><tr bgcolor="#e6ffff">'.  
  '<td><b>Date/Time</b></td>'.  
  '<td><b>Submission</b></td>'.  
  '<td><b>Status&nbsp;</b></td></tr>';  
     my %responseType = ();      my %responseType = ();
     foreach my $partid (@{$parts}) {      foreach my $partid (@{$parts}) {
  $responseType{$partid} = $curRes->responseType($partid);   $responseType{$partid} = $curRes->responseType($partid);
     }      }
     my ($version);      $studentTable.= &displaySubByDates(\$symbx,\%record,$parts,\%responseType,$checkIcon);
     for ($version=1;$version<=$record{'version'};$version++) {  
  my $timestamp = scalar(localtime($record{$version.':timestamp'}));  
  $studentTable.='<tr bgcolor="#ffffff" valign="top"><td>'.$timestamp.'</td>';  
  my @versionKeys = split(/\:/,$record{$version.':keys'});  
  my @displaySub = ();  
  foreach my $partid (@{$parts}) {  
     my @matchKey = grep /^resource\.$partid\..*?\.submission$/,@versionKeys;  
     next if ($record{"$version:resource.$partid.solved"} eq '');  
     $displaySub[0].=(exists $record{$version.':'.$matchKey[0]}) ?   
  '<b>Part&nbsp;'.$partid.'&nbsp;'.  
  ($record{"$version:resource.$partid.tries"} eq '' ? 'Trial&nbsp;not&nbsp;counted' :  
  'Trial&nbsp;'.$record{"$version:resource.$partid.tries"}).'</b>&nbsp; '.  
  &cleanRecord($record{$version.':'.$matchKey[0]},$responseType{$partid}).'<br />' : '';  
     $displaySub[1].=(exists $record{"$version:resource.$partid.award"}) ?  
  '<b>Part&nbsp;'.$partid.'</b> &nbsp;'.  
  $record{"$version:resource.$partid.award"}.'/'.  
  $record{"$version:resource.$partid.solved"}.'<br />' : '';  
     $displaySub[2].=(exists $record{"$version:resource.$partid.regrader"}) ?  
  $record{"$version:resource.$partid.regrader"}.' (<b>Part:</b> '.$partid.')' : '';  
  }  
  $displaySub[2].=(exists $record{"$version:resource.regrader"}) ?  
     $record{"$version:resource.regrader"} : '';  
  $studentTable.='<td>'.$displaySub[0].'&nbsp;</td><td>'.$displaySub[1].  
     ($displaySub[2] eq '' ? '' : 'Manually graded by '.$displaySub[2]).'&nbsp;</td></tr>';  
     }  
     $studentTable.='</table></td></tr></table>';  
  }   }
     } elsif ($ENV{'form.lastSub'} eq 'all') {      } elsif ($ENV{'form.lastSub'} eq 'all') {
  my $last = ($ENV{'form.lastSub'} eq 'last' ? 'last' : '');   my $last = ($ENV{'form.lastSub'} eq 'last' ? 'last' : '');
Line 2845  sub displayPage { Line 2890  sub displayPage {
     return '';      return '';
 }  }
   
 sub cleanRecord {  sub displaySubByDates {
     my ($answer,$response) = @_;      my ($symbx,$record,$parts,$responseType,$checkIcon) = @_;
     if ($response eq 'option') {      my $studentTable='<table border="0" width="100%"><tr><td bgcolor="#777777">'.
  my (@IDs,@ans);   '<table border="0" width="100%"><tr bgcolor="#e6ffff">'.
  foreach (split(/\&/,&Apache::lonnet::unescape($answer))) {   '<td><b>Date/Time</b></td>'.
     my ($optionID,$ans) = split(/=/);   '<td><b>Submission</b></td>'.
     push @IDs,$optionID.'</font>';   '<td><b>Status&nbsp;</b></td></tr>';
     push @ans,$ans;      my ($version);
  }      my %mark;
  my $grayFont = '<font color="#999999">';      $mark{'correct_by_student'} = $checkIcon;
  return '<table border="1">'.      return '<br />&nbsp;<font color="red">Nothing submitted - no attempts</font><br />' 
     '<tr valign="top"><td>Answer</td><td>'.   if (!exists($$record{'1:timestamp'}));
     (join '</td><td>',@ans).'</td></tr>'.      for ($version=1;$version<=$$record{'version'};$version++) {
     '<tr><td>'.$grayFont.'Option ID</font></td><td>'.$grayFont.   my $timestamp = scalar(localtime($$record{$version.':timestamp'}));
     (join '</td><td>'.$grayFont,@IDs).'</font></td></tr>'.   $studentTable.='<tr bgcolor="#ffffff" valign="top"><td>'.$timestamp.'</td>';
     '</table>';   my @versionKeys = split(/\:/,$$record{$version.':keys'});
    my @displaySub = ();
    foreach my $partid (@{$parts}) {
       my @matchKey = grep /^resource\.$partid\..*?\.submission$/,@versionKeys;
   #    next if ($$record{"$version:resource.$partid.solved"} eq '');
       $displaySub[0].=(exists $$record{$version.':'.$matchKey[0]}) ? 
    '<b>Part&nbsp;'.$partid.'&nbsp;'.
    ($$record{"$version:resource.$partid.tries"} eq '' ? 'Trial&nbsp;not&nbsp;counted' :
    'Trial&nbsp;'.$$record{"$version:resource.$partid.tries"}).'</b>&nbsp; '.
    &cleanRecord($$record{$version.':'.$matchKey[0]},$$responseType{$partid},$$symbx).'<br />' : '';
       $displaySub[1].=(exists $$record{"$version:resource.$partid.award"}) ?
    '<b>Part&nbsp;'.$partid.'</b> &nbsp;'.
    lc($$record{"$version:resource.$partid.award"}).' '.
    $mark{$$record{"$version:resource.$partid.solved"}}.'<br />' : '';
       $displaySub[2].=(exists $$record{"$version:resource.$partid.regrader"}) ?
    $$record{"$version:resource.$partid.regrader"}.' (<b>Part:</b> '.$partid.')' : '';
    }
    $displaySub[2].=(exists $$record{"$version:resource.regrader"}) ?
       $$record{"$version:resource.regrader"} : '';
    $studentTable.='<td>'.$displaySub[0].'&nbsp;</td><td>'.$displaySub[1].
       ($displaySub[2] eq '' ? '' : 'Manually graded by '.$displaySub[2]).'&nbsp;</td></tr>';
     }      }
     return $answer;      $studentTable.='</table></td></tr></table>';
       return $studentTable;
 }  }
   
 sub updateGradeByPage {  sub updateGradeByPage {
Line 3335  sub gradingmenu { Line 3401  sub gradingmenu {
     function checkChoice(formname,val,cmdx) {      function checkChoice(formname,val,cmdx) {
  if (val <= 2) {   if (val <= 2) {
     var cmd = radioSelection(formname.radioChoice);      var cmd = radioSelection(formname.radioChoice);
       var cmdsave = cmd;
  } else {   } else {
     cmd = cmdx;      cmd = cmdx;
       cmdsave = 'submission';
  }   }
  formname.command.value = cmd;   formname.command.value = cmd;
  formname.saveState.value = "saveCmd="+cmd+":saveSec="+pullDownSelection(formname.section)+   formname.saveState.value = "saveCmd="+cmdsave+":saveSec="+pullDownSelection(formname.section)+
     ":saveSub="+radioSelection(formname.submitonly)+":saveStatus="+pullDownSelection(formname.Status);      ":saveSub="+radioSelection(formname.submitonly)+":saveStatus="+pullDownSelection(formname.Status);
  if (val < 5) formname.submit();   if (val < 5) formname.submit();
  if (val == 5) {   if (val == 5) {
Line 3361  sub gradingmenu { Line 3429  sub gradingmenu {
  }   }
  return true;   return true;
     }      }
   
     function radioSelection(radioButton) {  
  var selection=null;  
  if (radioButton.length > 1) {  
     for (var i=0; i<radioButton.length; i++) {  
  if (radioButton[i].checked) {  
     return radioButton[i].value;  
  }  
     }  
  } else {  
     if (radioButton.checked) return radioButton.value;  
  }  
  return selection;  
     }  
   
     function pullDownSelection(selectOne) {  
  var selection="";  
  if (selectOne.length > 1) {  
     for (var i=0; i<selectOne.length; i++) {  
  if (selectOne[i].selected) {  
     return selectOne[i].value;  
  }  
     }  
  } else {  
     if (selectOne.selected) return selectOne.value;  
  }  
     }  
   
 </script>  </script>
 GRADINGMENUJS  GRADINGMENUJS
       &commonJSfunctions($request);
     my $result='<h3>&nbsp;<font color="#339933">Manual Grading/View Submission</font></h3>'.      my $result='<h3>&nbsp;<font color="#339933">Manual Grading/View Submission</font></h3>';
  '<table border="0">'.      my ($table,undef,$hdgrade) = &showResourceInfo($url,$probTitle);
  '<tr><td colspan=3><font size=+1><b>Problem: </b>'.$probTitle.'</font></td></tr>'."\n";      $result.=$table;
     my ($partlist,$handgrade) = &response_type($url);  
     my ($resptype,$hdgrade)=('','no');  
     for (sort keys(%$handgrade)) {  
  my ($responsetype,$handgrade)=split(/:/,$$handgrade{$_});  
  $resptype = $responsetype;  
  $hdgrade = $handgrade if ($handgrade eq 'yes');  
  $result.='<tr><td><b>Part </b>'.(split(/_/))[0].'</td>'.  
     '<td><b>Type: </b>'.$responsetype.'</td></tr>';  
 #    '<td><b>Handgrade: </b>'.$handgrade.'</font></td></tr>';  
     }  
     $result.='</table>'."\n";  
   
     my (undef,$sections) = &getclasslist('all','0');      my (undef,$sections) = &getclasslist('all','0');
     my $savedState = &savedState();      my $savedState = &savedState();
     my $saveCmd = ($$savedState{'saveCmd'} eq '' ? 'pickStudentPage' : $$savedState{'saveCmd'});      my $saveCmd = ($$savedState{'saveCmd'} eq '' ? 'submission' : $$savedState{'saveCmd'});
     my $saveSec = ($$savedState{'saveSec'} eq '' ? 'all' : $$savedState{'saveSec'});      my $saveSec = ($$savedState{'saveSec'} eq '' ? 'all' : $$savedState{'saveSec'});
     my $saveSub = ($$savedState{'saveSub'} eq '' ? 'yes' : $$savedState{'saveSub'});      my $saveSub = ($$savedState{'saveSub'} eq '' ? 'all' : $$savedState{'saveSub'});
     my $saveStatus = ($$savedState{'saveStatus'} eq '' ? 'Active' : $$savedState{'saveStatus'});      my $saveStatus = ($$savedState{'saveStatus'} eq '' ? 'Active' : $$savedState{'saveStatus'});
   
     $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".      $result.='<form action="/adm/grades" method="post" name="gradingMenu">'."\n".
  '<input type="hidden" name="symb"        value="'.$symb.'" />'."\n".   '<input type="hidden" name="symb"        value="'.$symb.'" />'."\n".
  '<input type="hidden" name="url"         value="'.$url.'" />'."\n".   '<input type="hidden" name="url"         value="'.$url.'" />'."\n".
  '<input type="hidden" name="response"    value="'.$resptype.'" />'."\n".  
  '<input type="hidden" name="handgrade"   value="'.$hdgrade.'" />'."\n".   '<input type="hidden" name="handgrade"   value="'.$hdgrade.'" />'."\n".
  '<input type="hidden" name="probTitle"   value="'.$probTitle.'" />'."\n".   '<input type="hidden" name="probTitle"   value="'.$probTitle.'" />'."\n".
  '<input type="hidden" name="command"     value="" />'."\n".   '<input type="hidden" name="command"     value="" />'."\n".
Line 3431  GRADINGMENUJS Line 3458  GRADINGMENUJS
   
     $result.='<table width="100%" border=0>';      $result.='<table width="100%" border=0>';
     $result.='<tr bgcolor="#ffffe6" valign="top"><td>'."\n".      $result.='<tr bgcolor="#ffffe6" valign="top"><td>'."\n".
  '&nbsp;Section: <select name="section">'."\n";   '&nbsp;Select Section: <select name="section">'."\n";
     if (ref($sections)) {      if (ref($sections)) {
  foreach (sort (@$sections)) {$result.='<option value="'.$_.'" '.   foreach (sort (@$sections)) {$result.='<option value="'.$_.'" '.
  ($saveSec eq $_ ? 'selected="on"' : '').'>'.$_.'</option>'."\n";}   ($saveSec eq $_ ? 'selected="on"' : '').'>'.$_.'</option>'."\n";}
Line 3446  GRADINGMENUJS Line 3473  GRADINGMENUJS
     }      }
     $result.='</td></tr>';      $result.='</td></tr>';
   
     $result.='<tr bgcolor="#ffffe6" valign="top"><td>'.      $result.='<tr bgcolor="#ffffe6"valign="top"><td>'.
  '<input type="radio" name="radioChoice" value="pickStudentPage" '.   '<input type="radio" name="radioChoice" value="submission" '.
  ($saveCmd eq 'pickStudentPage' ? 'checked' : '').'> '.   ($saveCmd eq 'submission' ? 'checked' : '').'> '.'<b>Current Resource:</b> For one or more students'.
  'One student for whole page/sequence/folder</td></tr>'."\n";   '<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;-->For students with '.
    '<input type="radio" name="submitonly" value="yes" '.
    ($saveSub eq 'yes' ? 'checked' : '').' /> submissions or '.
    '<input type="radio" name="submitonly" value="all" '.
    ($saveSub eq 'all' ? 'checked' : '').' /> for all</td></tr>'."\n";
   
     $result.='<tr bgcolor="#ffffe6"valign="top"><td>'.      $result.='<tr bgcolor="#ffffe6"valign="top"><td>'.
  '<input type="radio" name="radioChoice" value="viewgrades" '.   '<input type="radio" name="radioChoice" value="viewgrades" '.
  ($saveCmd eq 'viewgrades' ? 'checked' : '').'> '.   ($saveCmd eq 'viewgrades' ? 'checked' : '').'> '.
  'All students in section/course for current resource</td></tr>'."\n";   '<b>Current Resource:</b> For all students in selected section or course</td></tr>'."\n";
   
     $result.='<tr bgcolor="#ffffe6"valign="top"><td>'.      $result.='<tr bgcolor="#ffffe6" valign="top"><td>'.
  '<input type="radio" name="radioChoice" value="submission" '.   '<input type="radio" name="radioChoice" value="pickStudentPage" '.
  ($saveCmd eq 'submission' ? 'checked' : '').'> '.'One or more students for current resource'.   ($saveCmd eq 'pickStudentPage' ? 'checked' : '').'> '.
  '<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;-->For students who has: '.   'The <b>complete</b> set/page/sequence: For one student</td></tr>'."\n";
  '<input type="radio" name="submitonly" value="yes" '.  
  ($saveSub eq 'yes' ? 'checked' : '').' /> submitted'.  
  '<input type="radio" name="submitonly" value="all" '.  
  ($saveSub eq 'all' ? 'checked' : '').' /> everybody</td></tr>'."\n";  
   
     $result.='<tr bgcolor="#ffffe6"><td><br />'.      $result.='<tr bgcolor="#ffffe6"><td><br />'.
  '<input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="View/Grade/Regrade" />'.   '<input type="button" onClick="javascript:checkChoice(this.form,\'2\');" value="View/Grade/Regrade" />'.

Removed from v.1.117  
changed lines
  Added in v.1.122


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