Diff for /loncom/homework/lonhomework.pm between versions 1.280 and 1.310

version 1.280, 2007/10/31 01:37:52 version 1.310, 2009/05/11 16:51:22
Line 49  use Apache::matchresponse(); Line 49  use Apache::matchresponse();
 use Apache::chemresponse();  use Apache::chemresponse();
 use Apache::drawimage();  use Apache::drawimage();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use HTML::Entities();  
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Time::HiRes qw( gettimeofday tv_interval );  use Time::HiRes qw( gettimeofday tv_interval );
 use Apache::lonnet();  use HTML::Entities();
   use File::Copy();
   
 # FIXME - improve commenting  # FIXME - improve commenting
   
Line 137  sub get_target { Line 137  sub get_target {
     if ($env{'form.problemstate'} eq 'WEB_GRADE') {      if ($env{'form.problemstate'} eq 'WEB_GRADE') {
  #$env{'form.webgrade'} = 'yes';   #$env{'form.webgrade'} = 'yes';
  return ('grade','webgrade','answer');   return ('grade','webgrade','answer');
     } elsif ( $env{'form.problemmode'} eq &mt('View') ||      } elsif (($env{'form.problemmode'} eq 'view') ||
  $env{'form.problemmode'} eq &mt('Discard Edits and View')) {       ($env{'form.problemmode'} eq 'discard')) {
  if ( defined($env{'form.submitted'}) &&   if ( defined($env{'form.submitted'}) &&
      (!defined($env{'form.resetdata'})) &&       (!defined($env{'form.resetdata'})) &&
      (!defined($env{'form.newrandomization'}))) {       (!defined($env{'form.newrandomization'}))) {
Line 146  sub get_target { Line 146  sub get_target {
  } else {   } else {
     return ('web','answer');      return ('web','answer');
  }   }
     } elsif ( $env{'form.problemmode'} eq &mt('Edit') ||      } elsif ($env{'form.problemmode'} eq 'edit') {
       $env{'form.problemmode'} eq 'Edit') {  
  if ( $env{'form.submitted'} eq 'edit' ) {   if ( $env{'form.submitted'} eq 'edit' ) {
     if ( $env{'form.submit'} eq &mt('Submit Changes and View') ) {      if ( $env{'form.submitbutton'} eq &mt('Save and View') ) {
  return ('modified','web','answer');   return ('modified','web','answer');
     } else {      } else {
  return ('modified','no_output_web','edit');   return ('modified','no_output_web','edit');
Line 174  sub setup_vars { Line 173  sub setup_vars {
 sub createmenu {  sub createmenu {
     my ($which,$request)=@_;      my ($which,$request)=@_;
     if ($which eq 'grade') {      if ($which eq 'grade') {
  $request->print('<script language="JavaScript">    $request->print('<script type="text/javascript" language="JavaScript"> 
           hwkmenu=window.open("/res/adm/pages/homeworkmenu.html","homeworkremote",            hwkmenu=window.open("/res/adm/pages/homeworkmenu.html","homeworkremote",
                  "height=350,width=150,menubar=no");                   "height=350,width=150,menubar=no");
           </script>');            </script>');
Line 210  sub proctor_checked_in { Line 209  sub proctor_checked_in {
     return 0;      return 0;
 }  }
   
 sub check_ip_acc {  
     my ($acc)=@_;  
     &Apache::lonxml::debug("acc is $acc");  
     if (!defined($acc) || $acc =~ /^\s*$/ || $acc =~/^\s*no\s*$/i) {   
  return 1;  
     }  
     my $allowed=0;  
     my $ip=$env{'request.host'} || $ENV{'REMOTE_ADDR'};  
   
     my $name;  
     foreach my $pattern (split(',',$acc)) {  
  $pattern =~ s/^\s*//;  
  $pattern =~ s/\s*$//;  
  if ($pattern =~ /\*$/) {  
     #35.8.*  
     $pattern=~s/\*//;  
     if ($ip =~ /^\Q$pattern\E/) { $allowed=1; }  
  } elsif ($pattern =~ /(\d+\.\d+\.\d+)\.\[(\d+)-(\d+)\]$/) {      
     #35.8.3.[34-56]  
     my $low=$2;  
     my $high=$3;  
     $pattern=$1;  
     if ($ip =~ /^\Q$pattern\E/) {   
  my $last=(split(/\./,$ip))[3];  
  if ($last <=$high && $last >=$low) { $allowed=1; }  
     }  
  } elsif ($pattern =~ /^\*/) {  
     #*.msu.edu  
     $pattern=~s/\*//;  
     if (!defined($name)) {  
  use Socket;  
  my $netaddr=inet_aton($ip);  
  ($name)=gethostbyaddr($netaddr,AF_INET);  
     }  
     if ($name =~ /\Q$pattern\E$/i) { $allowed=1; }  
  } elsif ($pattern =~ /\d+\.\d+\.\d+\.\d+/) {  
     #127.0.0.1  
     if ($ip =~ /^\Q$pattern\E/) { $allowed=1; }  
  } else {  
     #some.name.com  
     if (!defined($name)) {  
  use Socket;  
  my $netaddr=inet_aton($ip);  
  ($name)=gethostbyaddr($netaddr,AF_INET);  
     }  
     if ($name =~ /\Q$pattern\E$/i) { $allowed=1; }  
  }  
  if ($allowed) { last; }  
     }  
     return $allowed;  
 }  
   
 sub check_slot_access {  sub check_slot_access {
     my ($id,$type)=@_;      my ($id,$type)=@_;
   
Line 292  sub check_slot_access { Line 239  sub check_slot_access {
  }   }
     }      }
   
     my @slots=      my $availablestudent = &Apache::lonnet::EXT("resource.0.availablestudent");
  (split(':',&Apache::lonnet::EXT("resource.0.availablestudent")),      my $available = &Apache::lonnet::EXT("resource.0.available");
  split(':',&Apache::lonnet::EXT("resource.0.available")));      my @slots= (split(':',$availablestudent),split(':',$available));
   
 #    if (!@slots) {  #    if (!@slots) {
 # return ($status,$datemsg);  # return ($status,$datemsg);
Line 308  sub check_slot_access { Line 255  sub check_slot_access {
  &Apache::lonhomework::showhash(%slot);   &Apache::lonhomework::showhash(%slot);
  if ($slot{'starttime'} < time &&   if ($slot{'starttime'} < time &&
     $slot{'endtime'} > time &&      $slot{'endtime'} > time &&
     &check_ip_acc($slot{'ip'})) {      &Apache::loncommon::check_ip_acc($slot{'ip'})) {
     &Apache::lonxml::debug("$slot is good");      &Apache::lonxml::debug("$slot is good");
     $slotstatus='NEEDS_CHECKIN';      $slotstatus='NEEDS_CHECKIN';
     $returned_slot=\%slot;      $returned_slot=\%slot;
Line 350  sub check_slot_access { Line 297  sub check_slot_access {
  return ('WAITING_FOR_GRADE');   return ('WAITING_FOR_GRADE');
     }      }
   
     # no slot is currently open, and has been checked in for this version      # Previously used slot is no longer open, and has been checked in for this version.
     # previous slot is therefore CLOSED, so therefore the problem is      # However, the problem is not closed, and potentially, another slot might be
       # used to gain access to it to work on it, until the due date is reached, and the
       # problem then becomes CLOSED.  Therefore return the slotstatus - 
       # (which will be NOT_IN_SLOT).
     if (!defined($slot_name)      if (!defined($slot_name)
  && $checkedin    && $checkedin 
  && $type eq 'problem') {   && $type eq 'problem') {
  return ('CLOSED',$datemsg);          return ($slotstatus);
     }      }
   
     if ($slotstatus eq 'NOT_IN_A_SLOT'       if ($slotstatus eq 'NOT_IN_A_SLOT' 
Line 421  sub check_access { Line 371  sub check_access {
     &Apache::lonxml::debug("symb:".$symb);      &Apache::lonxml::debug("symb:".$symb);
     #if ($env{'request.state'} ne "construct" && $symb ne '') {      #if ($env{'request.state'} ne "construct" && $symb ne '') {
     if ($env{'request.state'} ne "construct") {      if ($env{'request.state'} ne "construct") {
  my $allowed=&check_ip_acc(&Apache::lonnet::EXT("resource.$id.acc"));          my $idacc = &Apache::lonnet::EXT("resource.$id.acc");
    my $allowed=&Apache::loncommon::check_ip_acc($idacc);
  if (!$allowed && ($Apache::lonhomework::browse ne 'F')) {   if (!$allowed && ($Apache::lonhomework::browse ne 'F')) {
     $status='INVALID_ACCESS';      $status='INVALID_ACCESS';
     $date=&mt("can not be accessed from your location.");      $date=&mt("can not be accessed from your location.");
Line 494  sub check_access { Line 445  sub check_access {
    $Apache::lonhomework::history{"resource.$id.solved"}=~/^excused/) {     $Apache::lonhomework::history{"resource.$id.solved"}=~/^excused/) {
     $status = 'CANNOT_ANSWER';      $status = 'CANNOT_ANSWER';
  }   }
    if ($status eq 'CANNOT_ANSWER'
       && &show_answer_problem_status()) {
       $status = 'SHOW_ANSWER';
    }
     }      }
     if ($status eq 'CAN_ANSWER' || $status eq 'CANNOT_ANSWER') {      if ($status eq 'CAN_ANSWER' || $status eq 'CANNOT_ANSWER') {
  my $interval=&Apache::lonnet::EXT("resource.$id.interval");   my @interval=&Apache::lonnet::EXT("resource.$id.interval");
  &Apache::lonxml::debug("looking for interval $interval");   &Apache::lonxml::debug("looking for interval @interval");
  if ($interval) {   if ($interval[0]) {
     my $first_access=&Apache::lonnet::get_first_access('map');      my $first_access=&Apache::lonnet::get_first_access($interval[1]);
     &Apache::lonxml::debug("looking for accesstime $first_access");      &Apache::lonxml::debug("looking for accesstime $first_access");
     if (!$first_access) {      if (!$first_access) {
  $status='NOT_YET_VIEWED';   $status='NOT_YET_VIEWED';
  my $due_date = &due_date($id);   my $due_date = &due_date($id);
  my $seconds_left = $due_date - time;   my $seconds_left = $due_date - time;
  if ($seconds_left > $interval || $due_date eq '') {   if ($seconds_left > $interval[0] || $due_date eq '') {
     $seconds_left = $interval;      $seconds_left = $interval[0];
  }   }
  $datemsg=&seconds_to_human_length($seconds_left);   $datemsg=&seconds_to_human_length($seconds_left);
     }      }
Line 532  sub check_access { Line 487  sub check_access {
 sub due_date {  sub due_date {
     my ($part_id,$symb,$udom,$uname)=@_;      my ($part_id,$symb,$udom,$uname)=@_;
     my $date;      my $date;
     my $interval= &Apache::lonnet::EXT("resource.$part_id.interval",$symb,      my @interval= &Apache::lonnet::EXT("resource.$part_id.interval",$symb,
        $udom,$uname);         $udom,$uname);
     &Apache::lonxml::debug("looking for interval $part_id $symb $interval");      &Apache::lonxml::debug("looking for interval $part_id $symb @interval");
     my $due_date= &Apache::lonnet::EXT("resource.$part_id.duedate",$symb,      my $due_date= &Apache::lonnet::EXT("resource.$part_id.duedate",$symb,
        $udom,$uname);         $udom,$uname);
     &Apache::lonxml::debug("looking for due_date $part_id $symb $due_date");      &Apache::lonxml::debug("looking for due_date $part_id $symb $due_date");
     if ($interval =~ /\d+/) {      if ($interval[0] =~ /\d+/) {
  my $first_access=&Apache::lonnet::get_first_access('map',$symb);   my $first_access=&Apache::lonnet::get_first_access($interval[1],$symb);
  &Apache::lonxml::debug("looking for first_access $first_access");   &Apache::lonxml::debug("looking for first_access $first_access ($interval[1])");
  if (defined($first_access)) {   if (defined($first_access)) {
     $interval = $first_access+$interval;      my $interval = $first_access+$interval[0];
     $date = ($interval < $due_date)? $interval : $due_date;      $date = (!$due_date || $interval < $due_date) ? $interval
                                                             : $due_date;
  } else {   } else {
     $date = $due_date;      $date = $due_date;
  }   }
Line 683  sub handle_save_or_undo { Line 639  sub handle_save_or_undo {
     my $error=0;      my $error=0;
     if ($env{'form.Undo'} eq &mt('undo')) {      if ($env{'form.Undo'} eq &mt('undo')) {
  my $error=0;   my $error=0;
  if (!copy($file,$filetmp)) { $error=1; }   if (!&File::Copy::copy($file,$filetmp)) { $error=1; }
  if ((!$error) && (!copy($filebak,$file))) { $error=1; }   if ((!$error) && (!&File::Copy::copy($filebak,$file))) { $error=1; }
  if ((!$error) && (!move($filetmp,$filebak))) { $error=1; }   if ((!$error) && (!&File::Copy::move($filetmp,$filebak))) { $error=1; }
  if (!$error) {   if (!$error) {
     &Apache::lonxml::info("<p><b>".      &Apache::lonxml::info("<p><b>".
   &mt("Undid changes, Switched [_1] and [_2]",    &mt("Undid changes, Switched [_1] and [_2]",
Line 707  sub handle_save_or_undo { Line 663  sub handle_save_or_undo {
  my $fs=Apache::File->new(">$filebak");   my $fs=Apache::File->new(">$filebak");
  if (defined($fs)) {   if (defined($fs)) {
     print $fs $$problem;      print $fs $$problem;
     &Apache::lonxml::info("<b>".&mt("Making Backup to [_1]",  
     '<span class="LC_filename">'.  
     $filebak.'</span>').  
   "</b>");  
  } else {   } else {
     &Apache::lonxml::info("<span class=\"LC_error\">".      &Apache::lonxml::info("<span class=\"LC_error\">".
   &mt("Unable to make backup [_1]",    &mt("Unable to make backup [_1]",
Line 721  sub handle_save_or_undo { Line 673  sub handle_save_or_undo {
  my $fh=Apache::File->new(">$file");   my $fh=Apache::File->new(">$file");
  if (defined($fh)) {   if (defined($fh)) {
     print $fh $$result;      print $fh $$result;
     &Apache::lonxml::info("<b>".&mt("Saving Modifications to [_1]",  
    '<span class="LC_filename">'.  
     $file.'</span>' )."</b>");  
  } else {   } else {
     &Apache::lonxml::info('<span class="LC_error">'.      &Apache::lonxml::info('<span class="LC_error">'.
   &mt("Unable to write to [_1]",    &mt("Unable to write to [_1]",
Line 738  sub handle_save_or_undo { Line 687  sub handle_save_or_undo {
   
 sub analyze_header {  sub analyze_header {
     my ($request) = @_;      my ($request) = @_;
       my $js = &Apache::structuretags::setmode_javascript();
     my $result =      my $result =
  &Apache::loncommon::start_page('Analyzing a problem',undef);   &Apache::loncommon::start_page('Analyzing a problem',$js);
   
     $result .=       $result .= 
  &Apache::lonxml::message_location().'   &Apache::lonxml::message_location().'
             <form name="lonhomework" method="POST" action="'.              <form name="lonhomework" method="post" action="'.
     &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.      &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.
               '<input type="hidden" name="problemmode" value="'.
               $env{'form.problemmode'}.'" />'.
     &Apache::structuretags::remember_problem_state().'      &Apache::structuretags::remember_problem_state().'
             <div class="LC_edit_problem_analyze_header">              <div class="LC_edit_problem_analyze_header">
             <input type="submit" name="problemmode" value="'.&mt("EditXML").'" />              <input type="button" name="submitmode" value="'.&mt("EditXML").'" '.
             <input type="submit" name="problemmode" value="'.&mt('Edit').'" />              'onclick="javascript:setmode(this.form,'."'editxml'".')" />
               <input type="button" name="submitmode" value="'.&mt('Edit').'" '.
               'onclick="javascript:setmode(this.form,'."'edit'".')" />
             <hr class="LC_edit_problem_divide" />              <hr class="LC_edit_problem_divide" />
               <input type="button" name="submitmode" value="'.&mt("View").'" '.
             <input type="submit" name="submit" value="'.&mt("View").'" />              'onclick="javascript:setmode(this.form,'."'view'".')" />
             <hr class="LC_edit_problem_divide" />              <hr class="LC_edit_problem_divide" />
             </div>              </div>
             </form>';              </form>';
Line 826  sub analyze { Line 780  sub analyze {
     }      }
     &Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state,      &Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state,
   &mt('Analyzing Results'));    &mt('Analyzing Results'));
     $request->print('<hr class="LC_edit_problem_divide" />'.&mt('List of possible answers').': ');      $request->print('<hr class="LC_edit_problem_divide" />'
                      .'<h3>'
                      .&mt('List of possible answers')
                      .'</h3>'
       );
     foreach my $part (sort(keys(%allparts))) {      foreach my $part (sort(keys(%allparts))) {
  if (defined(@{ $overall{$part.'.answer'} })) {   if (defined(@{ $overall{$part.'.answer'} })) {
     for (my $i=0;$i<scalar(@{ $overall{$part.'.answer'} });$i++) {      for (my $i=0;$i<scalar(@{ $overall{$part.'.answer'} });$i++) {
  my $num_cols=scalar(@{ $overall{$part.'.answer'}[$i][0] });   my $num_cols=scalar(@{ $overall{$part.'.answer'}[$i][0] });
  $request->print('<table class="thinborder"><tr><th colspan="'.($num_cols+1).'">'.&mt('Part').' '.$part);                  $request->print(&Apache::loncommon::start_data_table()
                                  .&Apache::loncommon::start_data_table_header_row()
                                  .'<th colspan="'.($num_cols+1).'">'
                                  .&mt('Part').' '.$part
                   );
  if (scalar(@{ $overall{$part.'.answer'} }) > 1) {   if (scalar(@{ $overall{$part.'.answer'} }) > 1) {
     $request->print(&mt(' Answer [_1]',$i+1));      $request->print(' '.&mt('Answer [_1]',$i+1));
  }   }
  $request->print('</th></tr>');   $request->print('</th>'
                                  .&Apache::loncommon::end_data_table_header_row()
                   );
  my %frequency;   my %frequency;
  foreach my $answer (sort {$a->[0] <=> $b->[0]} (@{ $overall{$part.'.answer'}[$i] })) {   foreach my $answer (sort {$a->[0] <=> $b->[0]} (@{ $overall{$part.'.answer'}[$i] })) {
     $frequency{join("\0",@{ $answer })}++;      $frequency{join("\0",@{ $answer })}++;
  }   }
  $request->print('<tr><th colspan="'.($num_cols).'">'.&mt('Answer').'</th><th>'.&mt('Frequency').'<br />('                  $request->print(&Apache::loncommon::start_data_table_header_row()
  .&mt('click for example').')</th></tr>');                                 .'<th colspan="'.($num_cols).'">'.&mt('Answer').'</th>'
                                  .'<th>'.&mt('Frequency').'<br />'
                                  .'('.&mt('click for example').')</th>'
                                  .&Apache::loncommon::end_data_table_header_row()
                   );
  foreach my $answer (sort {(split("\0",$a))[0] <=> (split("\0",$b))[0]} (keys(%frequency))) {   foreach my $answer (sort {(split("\0",$a))[0] <=> (split("\0",$b))[0]} (keys(%frequency))) {
     $request->print('<tr><td class="center">'.                      $request->print(&Apache::loncommon::start_data_table_row()
     join('</td><td class="center">',split("\0",$answer)).                                     .'<td>'
     '</td><td class="center"><a href="'.$request->uri.'?rndseed='.$seedexample{join("\0",$part,$i,$answer)}.'">'.$frequency{$answer}.                                     .join('</td><td>',split("\0",$answer))
     '</a></td></tr>');     .'</td>'
                                      .'<td>'
                                      .'<a href="'.$request->uri.'?rndseed='.$seedexample{join("\0",$part,$i,$answer)}.'">'.$frequency{$answer}.'</a>'
      .'</td>'
                                      .&Apache::loncommon::end_data_table_row()
                       );
  }   }
  $request->print('</table>');                  $request->print(&Apache::loncommon::end_data_table());
     }      }
  } else {   } else {
     $request->print('<p>'.&mt('Response').' '.$part.' '.              $request->print('<p class="LC_warning">'
     &mt('is not analyzable at this time').'</p>');                             .&mt('Response [_1] is not analyzable at this time.',$part)
      .'</p>'
               );
  }   }
     }      }
     if (scalar(keys(%allparts)) == 0 ) {      if (scalar(keys(%allparts)) == 0 ) {
  $request->print('<p>'.&mt('Found no analyzable responses in this problem, currently only Numerical, Formula and String response styles are supported.').'</p>');          $request->print('<p class="LC_warning">'
                          .&mt('Found no analyzable responses in this problem.'
                              .' Currently only Numerical, Formula and String response styles are supported.')
                          .'</p>'
           );
     }      }
     &Apache::lonhtmlcommon::Close_PrgWin($request,\%prog_state);      &Apache::lonhtmlcommon::Close_PrgWin($request,\%prog_state);
     &analyze_footer($request);      &analyze_footer($request);
Line 882  sub analyze { Line 861  sub analyze {
   
     sub show_problem_status {      sub show_problem_status {
  return ($show_problem_status eq 'yes'   return ($show_problem_status eq 'yes'
    || $show_problem_status eq 'answer'
  || $show_problem_status eq '');   || $show_problem_status eq '');
     }      }
           
Line 892  sub analyze { Line 872  sub analyze {
     sub show_no_problem_status {      sub show_no_problem_status {
  return ($show_problem_status eq 'no_feedback_ever');   return ($show_problem_status eq 'no_feedback_ever');
     }      }
     
       sub show_answer_problem_status {
    return ($show_problem_status eq 'answer');
       }
 }  }
   
 sub editxmlmode {  sub editxmlmode {
Line 899  sub editxmlmode { Line 883  sub editxmlmode {
     my $result;      my $result;
     my $problem=&Apache::lonnet::getfile($file);      my $problem=&Apache::lonnet::getfile($file);
     if ($problem eq -1) {      if ($problem eq -1) {
  &Apache::lonxml::error("<b> ".&mt('Unable to find').   &Apache::lonxml::error(
        " <i>$file</i></b>");              '<b> '
              .&mt('Unable to find [_1]',
                   '<span class="LC_filename">'.$file.'</span>')
              .'</b>');
   
  $problem='';   $problem='';
     }      }
     if (defined($env{'form.editxmltext'}) || defined($env{'form.Undo'})) {      if (defined($env{'form.editxmltext'}) || defined($env{'form.Undo'})) {
Line 909  sub editxmlmode { Line 897  sub editxmlmode {
  if (!$error) { $problem=&Apache::lonnet::getfile($file); }   if (!$error) { $problem=&Apache::lonnet::getfile($file); }
     }      }
     &Apache::lonhomework::showhashsubset(\%env,'^form');      &Apache::lonhomework::showhashsubset(\%env,'^form');
     if ( $env{'form.submit'} eq &mt('Submit Changes and View') ) {      if ( $env{'form.submitbutton'} eq &mt('Save and View') ) {
  &Apache::lonhomework::showhashsubset(\%env,'^form');   &Apache::lonhomework::showhashsubset(\%env,'^form');
  $env{'form.problemmode'}='View';   $env{'form.problemmode'}='view';
  &renderpage($request,$file);   &renderpage($request,$file);
     } else {      } else {
  my ($rows,$cols) = &Apache::edit::textarea_sizes(\$problem);   my ($rows,$cols) = &Apache::edit::textarea_sizes(\$problem);
  my $xml_help = '<table><tr><td>'.  
     &Apache::loncommon::helpLatexCheatsheet("Problem_Editor_XML_Index",  
     "Problem Editing Help").  
     '</td><td>'.  
        &Apache::loncommon::help_open_menu(undef,undef,5,'Authoring').  
                 '</td></tr></table>';  
  if ($cols > 80) { $cols = 80; }   if ($cols > 80) { $cols = 80; }
  if ($cols < 70) { $cols = 70; }   if ($cols < 70) { $cols = 70; }
  if ($rows < 20) { $rows = 20; }   if ($rows < 20) { $rows = 20; }
  my $js =   my $js =
     &Apache::edit::js_change_detection().       &Apache::edit::js_change_detection(). 
     &Apache::loncommon::resize_textarea_js();      &Apache::loncommon::resize_textarea_js().
               &Apache::structuretags::setmode_javascript().
               &Apache::lonhtmlcommon::dragmath_js("EditMathPopup");
  my $only_body =  ($env{'environment.remote'} eq 'off')? 0 : 1;   my $only_body =  ($env{'environment.remote'} eq 'off')? 0 : 1;
    my $dragmath_button = 
               &Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);
  my $start_page =    my $start_page = 
     &Apache::loncommon::start_page(&mt("EditXML [_1]",$file),$js,      &Apache::loncommon::start_page(&mt("EditXML [_1]",$file),$js,
    {'no_auto_mt_title' => 1,     {'no_auto_mt_title' => 1,
Line 936  sub editxmlmode { Line 922  sub editxmlmode {
  'onresize' => q[resize_textarea('LC_editxmltext','LC_aftertextarea')],   'onresize' => q[resize_textarea('LC_editxmltext','LC_aftertextarea')],
  'onload'   => q[resize_textarea('LC_editxmltext','LC_aftertextarea')],   'onload'   => q[resize_textarea('LC_editxmltext','LC_aftertextarea')],
     }});      }});
   
  $result.=$start_page.   $result.=$start_page.
     &renderpage($request,$file,['no_output_web'],1).      &renderpage($request,$file,['no_output_web'],1).
     &Apache::lonxml::message_location().'              '<form '.&Apache::edit::form_change_detection().' name="lonhomework" method="post" action="'.
             <form '.&Apache::edit::form_change_detection().' name="lonhomework" method="POST" action="'.  
     &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.      &HTML::Entities::encode($env{'request.uri'},'<>&"').'">'.
     &Apache::structuretags::remember_problem_state().'      &Apache::structuretags::remember_problem_state().'
             <div class="LC_edit_problem_editxml_header">              <div class="LC_edit_problem_editxml_header">
               <table class="LC_edit_problem_header_title"><tr><td>                <table class="LC_edit_problem_header_title"><tr><td>
                '.&mt('Problem Editing').&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index').'                 '.&mt('Problem Editing').&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index').'
                 </td><td align="right">                  </td><td align="right">
                   '.&Apache::loncommon::helpLatexCheatsheet().'                    '.&Apache::loncommon::helpLatexCheatsheet('Problem_LON-CAPA_Functions','Script Functions').'
                 </td></tr>                  </td></tr>
               </table>                </table>
               <div class="LC_edit_problem_discards">                <div class="LC_edit_problem_discards">
                 <input type="hidden" name="problemmode" value="'.&mt('EditXML').'" />                  <input type="hidden" name="problemmode" value="editxml" />
                 <input type="submit" name="problemmode" accesskey="d" value="'.&mt('Discard Edits and View').'" />  
                 <input type="submit" '.&Apache::edit::submit_ask_anyway().'name="problemmode" accesskey="e" value="'.&mt('Edit').'" />                  <input type="button" name="submitmode" accesskey="d" value="'.&mt('Discard Edits and View').'" '.
                   'onclick="javascript:setmode(this.form,'."'discard'".')" />
                   <input type="button" '.&Apache::edit::submit_ask_anyway('setmode(this.form,'."'edit'".')').'name="submitmode" accesskey="e" value="'.&mt('Edit').'" />
                 <input type="submit" name="Undo" accesskey="u" value="'.&mt('undo').'" />                  <input type="submit" name="Undo" accesskey="u" value="'.&mt('undo').'" />
                   '.$dragmath_button.'
               </div>                </div>
               <div class="LC_edit_problem_saves">                <div class="LC_edit_problem_saves">
                 <input type="submit" name="submit" accesskey="s" value="'.&mt('Save').'" />                  <input type="submit" name="submitbutton" accesskey="s" value="'.&mt('Save').'"  />
                 <input type="submit" name="submit" accesskey="v" value="'.&mt('Save and View').'" />                  <input type="submit" name="submitbutton" accesskey="v" value="'.&mt('Save and View').'" />
               </div>                </div>
               <hr class="LC_edit_problem_divide" />                <hr class="LC_edit_problem_divide" />
         '.&Apache::lonxml::message_location().'
             </div>              </div>
             '  . '              '  . '
             <textarea '.&Apache::edit::element_change_detection().              <textarea '.&Apache::edit::element_change_detection().
Line 1007  sub renderpage { Line 995  sub renderpage {
     my $filename=(split('/',$file))[-1];      my $filename=(split('/',$file))[-1];
     my $error =      my $error =
  "<b> ".&mt('Unable to find [_1]',   "<b> ".&mt('Unable to find [_1]',
    ' <span class="LC_filename">'.$filename.'</span>')     '<span class="LC_filename">'.$filename.'</span>')
  ."</b>";   ."</b>";
     $result.=      $result.=
  &Apache::loncommon::simple_error_page($request,'Not available',   &Apache::loncommon::simple_error_page($request,'Not available',
Line 1059  sub finished_parsing { Line 1047  sub finished_parsing {
     undef($Apache::lonhomework::parsing_a_task);      undef($Apache::lonhomework::parsing_a_task);
 }  }
   
 # with no arg it returns a HTML <option> list of the template titles  
 # with one arg it returns the filename associated with the arg passed  
 sub get_template_list {  sub get_template_list {
     my ($namewanted,$extension) = @_;      my ($extension) = @_;
     my $result;      my $result;
     my @allnames;      my @allnames;
     &Apache::lonxml::debug("Looking for :$extension:");      &Apache::lonxml::debug("Looking for :$extension:");
     foreach my $file (</home/httpd/html/res/adm/includes/templates/*.$extension>) {      my $glob_extension  = $extension;
  &Apache::lonxml::debug("Looking at $file");      if ($extension eq 'survey' || $extension eq 'exam') {
  my $name=&Apache::lonnet::metadata($file,'title');   $glob_extension = 'problem';
  &Apache::lonxml::debug("Got a name $name");      }
  if ($namewanted && ($name eq $namewanted)) {      my @files = glob($Apache::lonnet::perlvar{'lonIncludes'}.
     $result=$file;       '/templates/*.'.$glob_extension);
     last;      @files = map {[$_,&mt(&Apache::lonnet::metadata($_, 'title')),
  } else {                        (&Apache::lonnet::metadata($_, 'category')?&mt(&Apache::lonnet::metadata($_, 'category')):&mt('Miscellaneous')),
     if ($name) { push (@allnames, $name); }                        &mt(&Apache::lonnet::metadata($_, 'help'))]} (@files);
  }      @files = sort {$a->[2].$a->[1] cmp $b->[2].$b->[1]} (@files);
       my ($midpoint,$seconddiv,$numfiles);
       $numfiles = 0;
       foreach my $file (@files) {
           next if ($file->[1] !~ /\S/);
           $numfiles ++;
       }
       if ($numfiles > 0) {
           $result = '<div class="LC_left_float">';
           $midpoint = int($numfiles/2);
           if ($numfiles%2) {
               $midpoint ++;
           }
       }
       my $count = 0;
       my $currentcategory='';
       foreach my $file (@files) {
    next if ($file->[1] !~ /\S/);
           if ($file->[2] ne $currentcategory) {
              $currentcategory=$file->[2];
              if ((!$seconddiv) && ($count >= $midpoint)) {
                  $result .= '</div>'."\n".'<div class="LC_left_float">'."\n";
                  $seconddiv = 1;
              }
              $result.='<h3>'.$currentcategory.'</h3>';
              $count++;
           }
    $result .=
       '<label><input type="radio" name="template" value="'.$file->[0].'" />'.
       $file->[1].'</label>';
           if ($file->[3]) {
              $result.=&Apache::loncommon::help_open_topic($file->[3]);
           }
           my $filename=$file->[0];
           $filename=~s/^\/home\/httpd\/html//;
           $result.=' <font size="-2"><a href="'.$filename.'" target="sample">'.&mt('Example').'</font></a><br />'."\n";
           $count ++;
     }      }
     if (@allnames && !$result) {      if ($numfiles > 0) {
  $result="<option>".&mt("Select a")." $extension ".&mt('template')."</option>\n<option>".          $result .= '</div>'."\n".'<div class="LC_clear_float_footer"></div>'."\n";
     join('</option><option>',sort(@allnames)).'</option>';  
     }      }
     return $result;      return $result;
 }  }
   
 sub newproblem {  sub newproblem {
     my ($request) = @_;      my ($request) = @_;
     my $extension=$request->uri;  
     $extension=~s:^.*\.([\w]+)$:$1:;      if ($env{'form.template'}) {
     &Apache::lonxml::debug("Looking for :$extension:");   my $file = $env{'form.template'};
     my $templatelist=&get_template_list('',$extension);  
     if ($env{'form.template'} &&  
  $env{'form.template'} ne "Select a $extension template") {  
  use File::Copy;  
  my $file = &get_template_list($env{'form.template'},$extension);  
  my $dest = &Apache::lonnet::filelocation("",$request->uri);   my $dest = &Apache::lonnet::filelocation("",$request->uri);
  copy($file,$dest);   &File::Copy::copy($file,$dest);
  &renderpage($request,$dest);   &renderpage($request,$dest);
     } elsif($env{'form.newfile'} && !$templatelist) {   return;
  # I don't like hard-coded filenames but for now, this will work.      }
  use File::Copy;  
       my ($extension) = ($request->uri =~ m/\.(\w+)$/);
       &Apache::lonxml::debug("Looking for :$extension:");
       my $templatelist=&get_template_list($extension);
       if ($env{'form.newfile'} && !$templatelist) {
    # no templates found
  my $templatefilename =   my $templatefilename =
     $request->dir_config('lonIncludes').'/templates/blank.'.$extension;      $request->dir_config('lonIncludes').'/templates/blank.'.$extension;
  &Apache::lonxml::debug("$templatefilename");   &Apache::lonxml::debug("$templatefilename");
  my $dest = &Apache::lonnet::filelocation("",$request->uri);   my $dest = &Apache::lonnet::filelocation("",$request->uri);
  copy($templatefilename,$dest);   &File::Copy::copy($templatefilename,$dest);
  &renderpage($request,$dest);   &renderpage($request,$dest);
     } else {      } else {
  my $url=&HTML::Entities::encode($request->uri,'<>&"');   my $url=&HTML::Entities::encode($request->uri,'<>&"');
Line 1112  sub newproblem { Line 1133  sub newproblem {
  $shownurl=~s-^/~-/priv/-;   $shownurl=~s-^/~-/priv/-;
  my $dest = &Apache::lonnet::filelocation("",$request->uri);   my $dest = &Apache::lonnet::filelocation("",$request->uri);
  my $errormsg;   my $errormsg;
  if ($env{'form.newfile'}) {  
     $errormsg='<p><span class="LC_error">'.&mt('You did not select a template.').'</span></p>'."\n";  
  }  
  my $instructions;   my $instructions;
  my $start_page =    my $start_page = 
     &Apache::loncommon::start_page("Create New $extension");      &Apache::loncommon::start_page("Create New $extension");
Line 1123  $start_page Line 1141  $start_page
 <h1>".&mt("Creating a new $extension resource.")."</h1>  <h1>".&mt("Creating a new $extension resource.")."</h1>
 $errormsg  $errormsg
 ".&mt("The requested file [_1] currently does not exist.",  ".&mt("The requested file [_1] currently does not exist.",
       "<tt>$shownurl</tt>")."        '<span class="LC_filename">'.$shownurl.'</span>')."
 <p>  <p>
 <b>  <b>
 ".&mt("To create a new $extension, select a template from the".  ".&mt("To create a new $extension, select a template from the".
       "pull-down menu below. Then click on the \"Create $extension\" button.")."</b>        " list below. Then click on the \"Create $extension\" button.").'</b>
 </p><form action=\"$url\" method=\"POST\">");  </p><form action="'.$url.'" method="post">');
   
  if (defined($templatelist)) {   if (defined($templatelist)) {
     $request->print("<select name=\"template\">$templatelist</select>");      $request->print($templatelist);
  }   }
  $request->print("<br /><input type=\"submit\" name=\"newfile\" value=\"".&mt('Create')." $extension\" />");   $request->print('<br /><input type="submit" name="newfile" value="'.
    &mt("Create $extension").'" />');
  $request->print("</form></p>".&Apache::loncommon::end_page());   $request->print("</form></p>".&Apache::loncommon::end_page());
     }      }
     return '';      return;
 }  }
   
 sub update_construct_style {  sub update_construct_style {
     if ($env{'request.state'} eq "construct"      if ($env{'request.state'} eq "construct"
  && $env{'form.problemmode'} eq &mt('View')    && $env{'form.problemmode'} eq 'view' 
  &&  defined($env{'form.submitted'})   &&  defined($env{'form.submitted'})
  && !defined($env{'form.resetdata'})   && !defined($env{'form.resetdata'})
  && !defined($env{'form.newrandomization'})) {   && !defined($env{'form.newrandomization'})) {
  if ((!$env{'form.style_file'} && $env{'construct.style'})   if ((!$env{'form.style_file'} && $env{'construct.style'})
     ||$env{'form.clear_style_file'}) {      ||$env{'form.clear_style_file'}) {
     &Apache::lonnet::delenv('construct\\.style');      &Apache::lonnet::delenv('construct.style');
  } elsif ($env{'form.style_file'}    } elsif ($env{'form.style_file'} 
     && $env{'construct.style'} ne $env{'form.style_file'}) {      && $env{'construct.style'} ne $env{'form.style_file'}) {
     &Apache::lonnet::appenv('construct.style' =>       &Apache::lonnet::appenv({'construct.style' => 
         $env{'form.style_file'});          $env{'form.style_file'}});
  }   }
     }      }
 }  }
Line 1164  sub handler { Line 1183  sub handler {
     $Apache::lonxml::debug=$env{'user.debug'};      $Apache::lonxml::debug=$env{'user.debug'};
     $env{'request.uri'}=$request->uri;      $env{'request.uri'}=$request->uri;
     &setuppermissions();      &setuppermissions();
     # some times multiple problemmodes are submitted, need to select  
     # the last one  
     if ( defined($env{'form.problemmode'}) && ref($env{'form.problemmode'}) ) {  
  my $mode=$env{'form.problemmode'}->[-1];  
  undef $env{'form.problemmode'};  
  $env{'form.problemmode'}=$mode;  
     }  
   
     my $file=&Apache::lonnet::filelocation("",$request->uri);      my $file=&Apache::lonnet::filelocation("",$request->uri);
   
Line 1199  sub handler { Line 1211  sub handler {
     ['problemmode']);      ['problemmode']);
     if (!(defined $env{'form.problemmode'})) {      if (!(defined $env{'form.problemmode'})) {
  #first visit to problem in construction space   #first visit to problem in construction space
  $env{'form.problemmode'}='View';   $env{'form.problemmode'}= 'view';
  &renderpage($request,$file);   &renderpage($request,$file);
     } elsif ($env{'form.problemmode'} eq &mt('EditXML') ||      } elsif ($env{'form.problemmode'} eq 'editxml') {
      $env{'form.problemmode'} eq 'EditXML') {  
  &editxmlmode($request,$file);   &editxmlmode($request,$file);
     } elsif ($env{'form.problemmode'} eq &mt('Calculate answers')) {      } elsif ($env{'form.problemmode'} eq 'calcanswers') {
  &analyze($request,$file);   &analyze($request,$file);
     } else {      } else {
  &update_construct_style();   &update_construct_style();

Removed from v.1.280  
changed lines
  Added in v.1.310


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