Diff for /loncom/interface/lonwhatsnew.pm between versions 1.38.2.2 and 1.69

version 1.38.2.2, 2005/12/22 22:39:49 version 1.69, 2007/03/02 20:58:32
Line 39  use Apache::lonuserstate; Line 39  use Apache::lonuserstate;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Time::Local;  use Time::Local;
 use GDBM_File;  use GDBM_File;
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
   
 #----------------------------  #----------------------------
 # handler  # handler
Line 52  sub handler { Line 54  sub handler {
         $r->send_http_header;          $r->send_http_header;
         return OK;          return OK;
     }      }
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['command']);      &Apache::loncommon::get_unprocessed_cgi(
                                      $ENV{'QUERY_STRING'},['command','refpage']);
   
     my $command = $env{'form.command'};      my $command = $env{'form.command'};
       my $refpage = $env{'form.refpage'};
   
     &Apache::loncommon::content_type($r,'text/html');      my %checkallowed = ( coursenormalmail => 1,
     $r->send_http_header;   coursecritmail => 1, );
     if (! (($env{'request.course.fn'}) && (&Apache::lonnet::allowed('bre',$env{'request.course.id'})))) {      foreach my $perm_check (['whn','whatsnew',1],
         # Not in a course, or not allowed to view action items      ['pch','coursediscussion',1],
         $env{'user.error.msg'}="/adm/whatsnew:bre:0:0:Cannot display what's new screen";      ['mgr','handgrading',1],
       ['vgr','abovethreshold',1],
       ['opa','haserrors',1],
       ['mdc','versionchanges',0],
       ) {
    my ($perm,$key,$check_section) = @{ $perm_check };
    my $scope = $env{'request.course.id'};
    if (!($checkallowed{$key} = &Apache::lonnet::allowed($perm,$scope))) {
       $scope .= '/'.$env{'request.course.sec'};
       if ( $check_section ) {
    $checkallowed{$key} = &Apache::lonnet::allowed($perm,$scope);
       }
       if ($checkallowed{$key}) {
    $checkallowed{$key.'_section'} = $env{'request.course.sec'};
       }
    }
       }
   
       if ( ! $env{'request.course.fn'} || ! $checkallowed{'whatsnew'}) {
           # Not in a course, or no whn priv in course
           $env{'user.error.msg'}="/adm/whatsnew::whn:0:0:Cannot display what's new page";
         return HTTP_NOT_ACCEPTABLE;          return HTTP_NOT_ACCEPTABLE;
     }      }
   
     my %checkallowed = (      &Apache::loncommon::content_type($r,'text/html');
              coursediscussion => &Apache::lonnet::allowed('pch',$env{'request.course.id'}),      $r->send_http_header;
              handgrading => &Apache::lonnet::allowed('mgr',$env{'request.course.id'}),  
              abovethreshold => &Apache::lonnet::allowed('vgr',$env{'request.course.id'}),  
              haserrors => &Apache::lonnet::allowed('opa',$env{'request.course.id'}),  
              versionchanges => &Apache::lonnet::allowed('opa',$env{'request.course.id'}),  
              coursenormalmail => 1,  
              coursecritmail => 1,  
     );  
   
     $r->print(&display_header($command,\%checkallowed));      $r->print(&display_header($command,\%checkallowed));
   
Line 80  sub handler { Line 97  sub handler {
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/whatsnew',              ({href=>'/adm/whatsnew',
               text=>"Display Action Items"});                text=>"Display Action Items"});
     if (($command eq 'chgthreshold') && (&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) {      if (($command eq 'chgthreshold') && $checkallowed{'abovethreshold'}) {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/whatsnew?command=chgthreshold',              ({href=>'/adm/whatsnew?command=chgthreshold&refpage='.$refpage,
               text=>"Change thresholds"});                text=>"Change thresholds"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs
             (undef,'Course Action Items','Course_Action_Items_Thresholds'));              ("What's New?",#'Course_Action_Items_Thresholds'
     } elsif (($command eq 'chginterval') && (&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) {       ));
       } elsif (($command eq 'chginterval') && $checkallowed{'versionchanges'} ) {
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>'/adm/whatsnew?command=chginterval',              ({href=>'/adm/whatsnew?command=chginterval&refpage='.$refpage,
               text=>"Change interval"});                text=>"Change interval"});
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs
             (undef,'Course Action Items','Course_Action_Items_Intervals'));              ("What's New?",#'Course_Action_Items_Intervals'
        ));
       } elsif (($command eq 'chgdisc') && $checkallowed{'coursediscussion'}) {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/whatsnew?command=chgdisc&refpage='.$refpage,
                 text=>"Change discussion display"});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs
               ("What's New?",#'Course_Action_Items_Intervals'
        ));
       } elsif ($command eq 'courseinit') {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>'/adm/whatsnew?command=courseinit&refpage='.$refpage,
                 text=>"Course initialization preference"});
           $r->print(&Apache::lonhtmlcommon::breadcrumbs
               ("What's New?",#'Course_Action_Items_Initialization'
        ));
     } else {      } else {
         $r->print(&Apache::lonhtmlcommon::breadcrumbs          $r->print(&Apache::lonhtmlcommon::breadcrumbs
             (undef,'Course Action Items','Course_Action_Items_Display'));              ("What's New?",#'Course_Action_Items_Display'
        ));
     }      }
     &display_main_box($r,$command,\%checkallowed);      &display_main_box($r,$command,$refpage,\%checkallowed);
     return OK;      return OK;
 }  }
   
Line 107  sub handler { Line 141  sub handler {
 #------------------------------  #------------------------------
                                                                                                                                                                   
 sub display_main_box {  sub display_main_box {
     my ($r,$command,$checkallowed) = @_;      my ($r,$command,$refpage,$checkallowed) = @_;
     my $domain=&Apache::loncommon::determinedomain();      my $domain=&Apache::loncommon::determinedomain();
     my $function = &Apache::loncommon::get_users_function();      my $function = &Apache::loncommon::get_users_function();
     my $tabbg=&Apache::loncommon::designparm($function.'.tabbg',$domain);      my $lctype = lc(&Apache::loncommon::course_type());
   
     $r->print('<table width="100%" border="0" cellpadding="5" cellspacing="0"><tr><td width="100%">');      $r->print('<table width="100%" border="0" cellpadding="5" cellspacing="0"><tr><td width="100%">');
   
     my %threshold_titles = (      my %threshold_titles = &Apache::lonlocal::texthash (
                          av_attempts => 'Average number of attempts',                           av_attempts => 'Average number of attempts',
                          degdiff => 'Degree of difficulty',                           degdiff => 'Degree of difficulty',
                          numstudents => 'Total number of students with submissions',                           numstudents => 'Total number of students with submissions',
     );      );
   
     my %interval_titles = (      my %interval_titles = &Apache::lonlocal::texthash (
                             -1 => 'since start of course',                              -1 => "since start of $lctype",
                        2592000 => 'since last month',                         2592000 => 'since last month',
                         604800 => 'since last week',                          604800 => 'since last week',
                          86400 => 'since yesterday',                           86400 => 'since yesterday',
     );      );
   
       my %initpage = &Apache::lonlocal::texthash (
                        firstres => "first resource in the $lctype",
                        whatsnew => "what's new? page",
                        userpref => 'your general user preferences',
                        coursespecific => "specific setting for this $lctype",
                      );
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
   
     if (($command eq 'chgthreshold') &&       if (($command eq 'chgthreshold') 
                (&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) {   && $checkallowed->{'abovethreshold'}) {
         &display_threshold_config($r,$command,$tabbg,\%threshold_titles,          &display_threshold_config($r,$refpage,\%threshold_titles,
                                                                    $cdom,$crs);                                                                     $cdom,$crs);
     } elsif (($command eq 'chginterval') &&       } elsif (($command eq 'chginterval') 
                (&Apache::lonnet::allowed('opa',$env{'request.course.id'}))) {       && $checkallowed->{'versionchanges'}) {
         &display_interval_config($r,\%interval_titles);          &display_interval_config($r,$refpage,\%interval_titles);
       } elsif (($command eq 'chgdisc') 
        && $checkallowed->{'coursediscussion'}) {
           &display_discussion_config($r,$refpage);
       } elsif ($command eq 'courseinit') {
           &courseinit_config($r,$refpage,\%initpage);
     } else {      } else {
  &display_actions_box($r,$tabbg,$command,\%threshold_titles,          &display_actions_box($r,$command,$refpage,\%threshold_titles,
      \%interval_titles,$cdom,$crs,$checkallowed);                          \%interval_titles,\%initpage,$cdom,$crs,$checkallowed);
     }      }
       my $end_page = &Apache::loncommon::end_page();
     $r->print(<<END_OF_BLOCK);      $r->print(<<END_OF_BLOCK);
   </td>    </td>
  </tr>   </tr>
 </table><br />  </table><br />
 </body>  $end_page
 </html>  
 END_OF_BLOCK  END_OF_BLOCK
 }  }
   
Line 157  END_OF_BLOCK Line 201  END_OF_BLOCK
 # up the HTML  # up the HTML
 #-------------------------------  #-------------------------------
   
 sub display_header{  sub display_header {
     my ($command,$checkallowed) = @_;      my ($command,$checkallowed) = @_;
     my $html=&Apache::lonxml::xmlbegin();      
     my $bodytag=&Apache::loncommon::bodytag('Course Action Items');  
     my $scripttag;      my $scripttag;
     unless ($command eq 'chgthreshold' || $command eq 'chginterval') {      unless ($command eq 'chgthreshold' || $command eq 'chginterval') {
        $scripttag = <<"END";         $scripttag = <<"END";
Line 173  function change_display(caller,change) { Line 216  function change_display(caller,change) {
 function changeAll(change) {  function changeAll(change) {
 END  END
         foreach my $item (keys(%{$checkallowed})) {          foreach my $item (keys(%{$checkallowed})) {
       if ($item =~ /_section$/) { next; }
             if ($$checkallowed{$item}) {              if ($$checkallowed{$item}) {
                 $scripttag.='document.visible.display_'.$item.'.value=change'.                  $scripttag.='document.visible.display_'.$item.'.value=change'.
                             "\n";                              "\n";
Line 183  END Line 227  END
 </script>  </script>
 ';  ';
     }      }
     return(<<ENDHEAD);      my $course_type=&Apache::loncommon::course_type();
 $html      return &Apache::loncommon::start_page($course_type.' Action Items',
 <head>    $scripttag);
 <title>Course Action Items</title>  
 $scripttag  
 </head>  
 $bodytag  
 ENDHEAD  
 }  }
   
 #-------------------------------  #-------------------------------
Line 200  ENDHEAD Line 239  ENDHEAD
 #  #
 #-------------------------------  #-------------------------------
                                                                                                                                                                   
 sub display_actions_box() {  sub display_actions_box {
     my ($r,$tabbg,$command,$threshold_titles,$interval_titles,      my ($r,$command,$refpage,$threshold_titles,$interval_titles,$initpage,
  $cdom,$crs,$checkallowed) = @_;          $cdom,$crs,$checkallowed) = @_;
   
     my $rowColor1 = "#ffffff";  
     my $rowColor2 = "#eeeeee";  
   
     my $udom = $env{'user.domain'};      my $udom = $env{'user.domain'};
     my $uname = $env{'user.name'};      my $uname = $env{'user.name'};
     my $cid = $env{'request.course.id'};      my $cid = $env{'request.course.id'};
       my $crstype = &Apache::loncommon::course_type();
       my $lctype = lc($crstype);
       my %stulabel = (
                       'Course' => 'students',
                       'Group' => 'members',
                      );
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                  'yacc' => 'You are accessing an invalid course.',                   'yacc' => 'You are accessing an invalid course',
                  'gtfr' => 'Go to first resource',                   'gtfr' => 'Go to first resource',
                  'chyp' => 'Change your preferences',  
                  'tsup' => 'to suppress display of this screen when accessing'.  
                            ' this course in the future.',  
                  'hial' => 'Hide all',                   'hial' => 'Hide all',
                  'shal' => 'Show all',                   'shal' => 'Show all',
     );      );
Line 240  sub display_actions_box() { Line 277  sub display_actions_box() {
     my $needitems = 0;      my $needitems = 0;
     my $boxcount = 0;      my $boxcount = 0;
   
     my %threshold = (      my $result;
                       av_attempts => 2,      if ($command eq 'newcourseinit') {
                       degdiff => 0.5,          $result = &store_courseinit_setting($uname,$udom,$cid,$initpage);
                       numstudents => 2,      }
                      );  
       my %threshold = ();
       my %pagedesc = &Apache::lonlocal::texthash (
                        firstres => 'First resource',
                        whatsnew => "What's New? page",
                        userpref => 'user preference',
                        coursespecific => $lctype.' only',
                        default => 'default',
                      );
   
       my ($initcontrol,$initdisp) = &curr_courseinit();
       my $currinit = $pagedesc{$initdisp}.' ('.$pagedesc{$initcontrol}.')';
   
     unless ($cid) {      unless ($cid) {
         $r->print('<br /><b><center>'.$lt{'yacc'}.'</center></b><br /><br />');          $r->print('<br /><b><center>'.$lt{'yacc'}.'</center></b><br /><br />');
         return;          return;
     }      }
   
     if (tie(my %bighash,'GDBM_File',$env{'request.course.fn'}.'.db',      if ($refpage eq 'start') {
           if (tie(my %bighash,'GDBM_File',$env{'request.course.fn'}.'.db',
             &GDBM_READER(),0640)) {              &GDBM_READER(),0640)) {
         my $furl=$bighash{'first_url'};              my $furl=$bighash{'first_url'};
         $r->print('<font size="+1"><a href="'.$furl.'">'.$lt{'gtfr'}.              untie(%bighash);
                   '</a></font><a href="/adm/preferences?action=changecourseinit">'.              $r->print('<font size="+1"><a href="'.$furl.'">'.$lt{'gtfr'}.
                   '</font><br />'.$lt{'chyp'}.'</a> '.$lt{'tsup'}.'<br /><hr />');                    '</a></font><br />');
         untie(%bighash);          }
     }      }
                                                                                               $r->print(&mt('Page set to be displayed after you have selected a role in this '.$lctype).
     my $result;                '. <nobr>'.&mt('Currently: <i>[_1]</i>',$currinit).'.&nbsp;&nbsp;'.
                                                                                                         &mt('<b>Change</b> for just <a href="/adm/whatsnew?command=courseinit&refpage=[_1]">this '.$lctype.'</a>',$refpage).' '.
                 &mt('or for all <a href="/adm/preferences?action=changecourseinit&refpage=[_1]">your courses</a>',$refpage).'</nobr><br /><hr />');
   
     if ($command eq 'reset') {      if ($command eq 'reset') {
         $result = &process_reset($cdom,$crs);          $result = &process_reset($cdom,$crs);
     } elsif ($command eq 'update') {      } elsif ($command eq 'update') {
         $result = &process_update($cdom,$crs,$threshold_titles);          $result = &process_update($uname,$udom,$threshold_titles);
     } elsif ($command eq 'newinterval') {      } elsif ($command eq 'newinterval') {
         $result = &store_interval_setting($uname,$udom,$cid,$interval_titles);          $result = &store_interval_setting($uname,$udom,$cid,$interval_titles);
       } elsif ($command eq 'newdiscconf') {
           $result = &store_discussion_setting($uname,$udom,$cid);
     }      }
   
     my $store_result=&store_display_settings($uname,$udom,$cid,$checkallowed);      my $store_result=&store_display_settings($uname,$udom,$cid,$checkallowed);
   
     unless ($store_result eq 'ok') {       unless ($store_result eq 'ok') { 
         &Apache::lonnet::logthis('Error storing whatsnew settings: '.          &Apache::lonnet::logthis('Error storing whatsnew settings: '.
             $store_result.' for '.'user '.$uname.':'.$udom.' in course '.$cid);              $store_result.' for '.'user '.$uname.':'.$udom.' in '.$lctype.' '.$cid);
         $result .= &mt('Unable to store visibility settings due to [_1]',          $result .= &mt('Unable to store visibility settings due to [_1]',
                        $store_result);                          $store_result); 
     }      }
Line 294  sub display_actions_box() { Line 347  sub display_actions_box() {
         $timediff = time;          $timediff = time;
     }       } 
     my $starttime = $now - $timediff;      my $starttime = $now - $timediff;
     my $countunread = 1;      my $countunread = $display_settings{$cid.':countunread'};
       unless (defined($countunread)) {
           $countunread = 'on';
       }
   
     my %headings = &Apache::lonlocal::texthash(      my %headings = &Apache::lonlocal::texthash(
                 coursediscussion =>  'Unread course discussion posts',                  coursediscussion =>  'Unread '.$lctype.' discussion posts',
                 handgrading =>  'Problems requiring handgrading',                  handgrading =>  'Problems requiring handgrading',
                 haserrors => 'Problems with errors',                  haserrors => 'Problems with errors',
                 versionchanges => 'Resources in course with version changes '.$interval,                  versionchanges => 'Resources in '.$lctype.' with version changes '.$interval,
                 coursenormalmail => 'New course messages',                  coursenormalmail => 'New '.$lctype.' messages',
                 coursecritmail => 'New critical messages in course',                  coursecritmail => 'New critical messages in '.$lctype,
     );      );
   
     if ($$checkallowed{'abovethreshold'}) {      if ($$checkallowed{'abovethreshold'}) {
         &get_curr_thresholds(\%threshold,$cdom,$crs);          &get_curr_thresholds(\%threshold,$uname,$udom,$cid,$cdom,$crs);
     }      }
   
     $headings{'abovethreshold'} = &mt('Problems with av. attempts').' &ge; '.$threshold{'av_attempts'}.' '.&mt('or deg. difficulty').' &ge; '.$threshold{'degdiff'}.'<br /> '.&mt('and total number of students with submissions').' &ge; '.$threshold{'numstudents'};      $headings{'abovethreshold'} = 
    &mt('Problems with av. attempts &ge; [_1] or deg. difficulty &ge; [_2] <br /> and total number of '.$stulabel{$crstype}.' with submissions &ge; [_3]',
       $threshold{'av_attempts'},$threshold{'degdiff'},
       $threshold{'numstudents'});
   
     my @actionorder = ('handgrading','haserrors','abovethreshold','versionchanges','coursediscussion','coursenormalmail','coursecritmail');      my @actionorder = ('handgrading','haserrors','abovethreshold','versionchanges','coursediscussion','coursenormalmail','coursecritmail');
   
     foreach my $key (keys(%{$checkallowed})) {      foreach my $key (keys(%{$checkallowed})) {
    if ($key =~ /_section$/) { next; }
         $show{$key} = 0;          $show{$key} = 0;
         if ($$checkallowed{$key}) {          if ($$checkallowed{$key}) {
             unless ($display_settings{$cid.':'.$key} eq 'hide') {              unless ($display_settings{$cid.':'.$key} eq 'hide') {
Line 332  sub display_actions_box() { Line 392  sub display_actions_box() {
     }      }
   
     if ($needitems) {      if ($needitems) {
         &getitems(\%unread,\%ungraded,\%bombed,\%triggered,\%changed,\@newdiscussions,\@tograde,\@bombs,\@warnings,$rowColor1,$rowColor2,\%threshold,$cdom,$crs,\%res_title,\%show,$starttime,$countunread);          &getitems(\%unread,\%ungraded,\%bombed,\%triggered,\%changed,\@newdiscussions,\@tograde,\@bombs,\@warnings,\%threshold,$cdom,$crs,\%res_title,\%show,$starttime,$countunread);
     }      }
     if ($show{'coursenormalmail'}) {      if ($show{'coursenormalmail'}) {
         &getnormalmail(\@newmsgs);          $msgcount = &getnormalmail(\@newmsgs);
     }      }
     if ($show{'coursecritmail'}) {      if ($show{'coursecritmail'}) {
         &getcritmail(\@critmsgs);          $critmsgcount = &getcritmail(\@critmsgs);
     }      }
   
     $r->print(qq|<a href="javascript:changeAll('hide');">$lt{'hial'}</a>      $r->print(qq|<a href="javascript:changeAll('hide');">$lt{'hial'}</a>
      &nbsp;&nbsp;<a href="javascript:changeAll('show');">$lt{'shal'}</a>       &nbsp;&nbsp;<a href="javascript:changeAll('show');">$lt{'shal'}</a>
      <form method="post" name="visible" action="/adm/whatsnew">\n|);       <form method="post" name="visible" action="/adm/whatsnew">\n|);
     foreach my $item (keys(%{$checkallowed})) {      foreach my $item (keys(%{$checkallowed})) {
    if ($item =~ /_section$/) { next; }
         if ($$checkallowed{$item}) {          if ($$checkallowed{$item}) {
             $r->print('<input type="hidden" name="display_'.$item.'" />'."\n");              $r->print('<input type="hidden" name="display_'.$item.'" />'."\n");
         }          }
     }      }
   
     $r->print('</form><br /><table border="0" width="100%" cellpadding="2" cellspacing="4"><tr><td align="left" valign="top" width="45%">');      $r->print('<input type="hidden" name="refpage" value="'.$refpage.'"></form><br /><table border="0" width="100%" cellpadding="2" cellspacing="4"><tr><td align="left" valign="top" width="45%">');
   
     my $displayed = 0;      my $displayed = 0;
     my $totalboxes = keys(%{$checkallowed});      my $totalboxes = 0;
       foreach my $key (keys(%{$checkallowed})) {
    if ($key =~ /_section$/) { next; }
    if ($key eq 'whatsnew' ) { next; } # whatsnew check creates no box
           if ($$checkallowed{$key}) {
               $totalboxes ++;
           }
       }
     my $halfway = int($totalboxes/2) + $totalboxes%2;      my $halfway = int($totalboxes/2) + $totalboxes%2;
     foreach my $actionitem (@actionorder) {      foreach my $actionitem (@actionorder) {
         if ($$checkallowed{$actionitem}) {          if ($$checkallowed{$actionitem}) {
             if ($displayed == $halfway) {              if ($displayed == $halfway) {
                 $r->print('</td><td width="5%">&nbsp;</td><td align="left" valign="top" width-"50%">');                  $r->print('</td><td width="6%">&nbsp;</td><td align="left" valign="top" width="47%">');
             }              }
             &display_launcher($r,$actionitem,$checkallowed,$tabbg,$rowColor1,$rowColor2,\%show,\%headings,\%res_title,\@tograde,\%ungraded,\@bombs,\%bombed,\%changed,\@warnings,\%triggered,\@newdiscussions,\%unread,$msgcount,\@newmsgs,$critmsgcount,\@critmsgs,$interval,$countunread);              &display_launcher($r,$actionitem,$refpage,$checkallowed,\%show,\%headings,\%res_title,\@tograde,\%ungraded,\@bombs,\%bombed,\%changed,\@warnings,\%triggered,\@newdiscussions,\%unread,$msgcount,\@newmsgs,$critmsgcount,\@critmsgs,$interval,$countunread);
             $displayed ++;               $displayed ++; 
         }          }
     }      }
Line 382  sub display_actions_box() { Line 450  sub display_actions_box() {
 #-------------------------------  #-------------------------------
                                                                                                                                                                   
 sub display_threshold_config {  sub display_threshold_config {
     my ($r,$command,$tabbg,$threshold_titles,$cdom,$crs) = @_;      my ($r,$refpage,$threshold_titles,$cdom,$crs) = @_;
       my $uname = $env{'user.name'};
       my $udom = $env{'user.dom'};
       my $cid = $env{'request.course.id'};
     my %threshold = ();      my %threshold = ();
     my $rowColor1 = "#ffffff";      my $rowColor1 = "#ffffff";
     my $rowColor2 = "#eeeeee";      my $rowColor2 = "#eeeeee";
     my $rowColor;      my $rowColor;
   
     my @thresholditems = ("av_attempts","degdiff","numstudents");      my @thresholditems = ("av_attempts","degdiff","numstudents");
     my %threshold_titles = (      my %threshold_titles = &Apache::lonlocal::texthash(
                          av_attempts => 'Average number of attempts',                           av_attempts => 'Average number of attempts',
                          degdiff => 'Degree of difficulty',                           degdiff => 'Degree of difficulty',
                          numstudents => 'Total number of students with submissions',                           numstudents => 'Total number of students with submissions',
                          );                           );
     &get_curr_thresholds(\%threshold,$cdom,$crs);      &get_curr_thresholds(\%threshold,$uname,$udom,$cid,$cdom,$crs);
   
     $r->print('<br /><form name="thresholdform" method="post" action="/adm/whatsnew">      $r->print('<br /><form name="thresholdform" method="post" action="/adm/whatsnew">'.
         <table border="0" cellpadding="2" cellspacing="4">                &Apache::loncommon::start_data_table().
          <tr>                &Apache::loncommon::start_data_table_header_row().
           <td align="left" valign="top" width="45%">               '<th>Threshold Name</th>'."\n".
            <table border="0" cellpadding="0" cellspacing="0" bgcolor="#000000">               '<th>Current value</th>'."\n".
             <tr>               '<th>Change?</th>'."\n".
              <td>                &Apache::loncommon::end_data_table_header_row());
                <table border="0" cellpadding="1" cellspacing="1" bgcolor="#000000">  
                 <tr>  
                 <td bgcolor="#ffffff">  
                  <table cellspacing="0" cellpadding="4" border="0">  
      <tr bgcolor="'.$tabbg.'">  
       <th>Threshold Name</th>  
       <th>Current value</th>  
       <th>Change?</th>  
      </tr>');  
     my $rowNum =0;  
     foreach my $type (@thresholditems) {      foreach my $type (@thresholditems) {
         my $parameter = 'internal.threshold_'.$type;          my $parameter = $env{'request.course.id'}.':threshold_'.$type;
 # onchange is javascript to automatically check the 'Set' button.  # onchange is javascript to automatically check the 'Set' button.
         my $onchange = 'onFocus="javascript:window.document.forms'.          my $onchange = 'onFocus="javascript:window.document.forms'.
               "['thresholdform'].elements['".$parameter."_setparmval']".                "['thresholdform'].elements['".$parameter."_setparmval']".
               '.checked=true;"';                '.checked=true;"';
         if ($rowNum %2 == 1) {          $r->print(&Apache::loncommon::start_data_table_row()."\n".
             $rowColor = $rowColor1;                   '<td>'.$threshold_titles{$type}.'</td>'."\n".
         } else {                   '<td>'.&Apache::lonhtmlcommon::textbox($parameter.'_value',
             $rowColor = $rowColor2;  
         }  
         $r->print('  
      <tr bgcolor="'.$rowColor.'">  
       <td>'.$threshold_titles{$type}.'</td>  
       <td>'.&Apache::lonhtmlcommon::textbox($parameter.'_value',  
                                             $threshold{$type},                                              $threshold{$type},
                                             10,$onchange).'</td>                                              10,$onchange).'</td>'."\n".
       <td>'                   '<td>'.
            .&Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').                   &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
       '</td>                   '</td>'."\n".
      </tr>');                   &Apache::loncommon::end_data_table_row());
         $rowNum ++;  
     }      }
     $r->print('</table></td></tr></table></td></tr></table>      $r->print(&Apache::loncommon::end_data_table()."\n".
            <br /><input type="submit" name="threshold" value="Make changes" />            '<br /><input type="submit" name="threshold" value="Make changes" />
                  <input type="hidden" name="command" value="update" />                   <input type="hidden" name="command" value="update" />
                    <input type="hidden" name="refpage" value="'.$refpage.'" />
                </form>');                 </form>');
 }  }
   
Line 450  sub display_threshold_config { Line 505  sub display_threshold_config {
 #-------------------------------  #-------------------------------
                                                                                                                                                                         
 sub display_interval_config {  sub display_interval_config {
     my ($r,$interval_titles) = @_;      my ($r,$refpage,$interval_titles) = @_;
     my $current = &get_curr_interval($env{'user.name'},      my $lctype = lc(&Apache::loncommon::course_type());
                                 $env{'user.domain'},$env{'request.course.id'});      my $current = &get_current($env{'user.name'},$env{'user.domain'},
     $r->print('<br />'.&mt('Choose the time window to use for display of version changes for resources in the course.'));                                  $env{'request.course.id'},'interval');
       $r->print('<br />'.&mt('Choose the time window to use for display of version changes for resources in the '.$lctype.'.'));
     unless ($current eq '') {      unless ($current eq '') {
         $r->print(' '.&mt('Current value is ').$$interval_titles{$current}.'<br /><br />');          $r->print(' '.&mt('Current value is [_1]','<b>'.
                     $$interval_titles{$current}.'</b>.'));
     }      }
     $r->print('<br /><br />      $r->print('<br /><br />
 <form method="post" name="intervalswitch" action="/adm/whatsnew">  <form method="post" name="intervalswitch" action="/adm/whatsnew">
 <input type="hidden" name="command" value="newinterval" />  <input type="hidden" name="command" value="newinterval" />
   <input type="hidden" name="refpage" value="'.$refpage.'" />
 <select name="interval">  <select name="interval">
 ');  ');
     foreach my $key (reverse sort ({$a cmp $b} (keys(%{$interval_titles})))) {      foreach my $key (reverse sort ({$a cmp $b} (keys(%{$interval_titles})))) {
Line 472  sub display_interval_config { Line 530  sub display_interval_config {
     return;      return;
 }  }
   
   #----------------------------------------------
   # display_discussion_config
   #
   # Display the discussion display setting screen
   #
   #----------------------------------------------
                                                                                     
   sub display_discussion_config {
       my ($r,$refpage) = @_;
       my $current = &get_current($env{'user.name'},$env{'user.domain'},
                                   $env{'request.course.id'},'countunread');
       if ($current eq '') {
           $current = 'on';
       }
       my %opposite = ( 
                         'on' => 'off',
                         'off' => 'on',
                       );
       $r->print('<script type="text/javascript">
   function toggle_countunread(choice) {
       if (choice == "unchanged") {
           document.discussionswitch.command.value = "";
       }
       document.discussionswitch.submit();
   }
   </script>');
       $r->print('<br />'.&mt('Choose whether or not to display a count of the number of new posts for each resource or bulletin board which has unread posts.').'<br />'.&mt('This can increase the time taken to gather data for the [_1] page by a few seconds.',"<i>What's New?</i>").'&nbsp;&nbsp;'.&mt('Currently set to [_1].','<b>'.$current.'</b>'));
       $r->print('<br /><br />
   <form method="post" name="discussionswitch" action="/adm/whatsnew">
   <input type="hidden" name="command" value="newdiscconf" />
   <input type="hidden" name="refpage" value="'.$refpage.'" />
   <input type="hidden" name="countunread" value="'.$opposite{$current}.'" />
   ');
       $r->print('<br/>
                  <input type="button" name="display" value="'.
                  &mt('Change to [_1]',$opposite{$current}).'" 
                  onclick="javascript:toggle_countunread('."'change'".')" />
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp&nbsp;&nbsp;
                  <input type="button" name="nochange" value="'.
                  &mt("No change").'" 
                  onclick="javascript:toggle_countunread('."'unchanged'".')" />
                  </form>');
       return;
   }
   
   #---------------------------------------------------
   # courseinit_config
   #
   # Set page displayed when course loads after 
   # selecting a role in the course from the roles page. 
   #
   #---------------------------------------------------
   
   sub courseinit_config {
       my ($r,$refpage,$initpage) = @_;
       my ($control,$current) = &curr_courseinit();
       my @chgstate = ('userpref','coursespecific');
       my @chgentry = ('firstres','whatsnew');
       my $lctype = lc(&Apache::loncommon::course_type());
       my %lt = &Apache::lonlocal::texthash(
                                'chwp' => "Choose which page will be displayed when you enter this $lctype after selecting a role.",
                                'cuva' => 'Current value is determined by',
                                'anis' => 'and is set to display',
                                'padc' => 'Page display controlled by',
                                'chce' => 'Choose '.$lctype.' entry',
                                'moce' => 'Modify '.$lctype.' entry',
       );
       $r->print(<<"END"); 
   <br />$lt{'chwp'}
   <br />$lt{'cuva'}: <b>
   $$initpage{$control}</b> $lt{'anis'} <b>
   $$initpage{$current}</b>.<br /><br />
   <form method="post" name="courseinitswitch" action="/adm/whatsnew">
   <input type="hidden" name="command" value="newcourseinit" />
   <input type="hidden" name="refpage" value="$refpage" />
   $lt{'padc'}:&nbsp;&nbsp;
   END
       foreach my $choice (@chgstate) {
           my $chkstring;
           if ($choice eq $control) {
               $chkstring = ' checked="checked" ';
           }  
           $r->print('<nobr><label><input type="radio" name="courseinit_control" value="'.
                      $choice.'"'.$chkstring.'/>'.$$initpage{$choice}.
                      '&nbsp;&nbsp;</label></nobr>');
       }
       $r->print('<br /><br />'.&mt('If').' '.$$initpage{'coursespecific'}.
                 ' - <br />'.$lt{'chce'}.": \n");
       foreach my $choice (@chgentry) {
           my $chkstring;
           if (($choice eq $current) && ($control eq 'coursespecific')) {
               $chkstring = ' checked="checked" ';
           }
           $r->print('<nobr><label><input type="radio" name="courseinit_page" value="'.
                     $choice.'"'.$chkstring.'/>'.$$initpage{$choice}.
                     '&nbsp;&nbsp;</label></nobr>');
       }
       $r->print('<br /><br /><input type="submit" name="display" value="'.
                  $lt{'moce'}.'" /></form>');
       return;
   }
   
   sub curr_courseinit {
       my $current = &get_current($env{'user.name'},$env{'user.domain'},
                                   $env{'request.course.id'},'courseinit');
       my $control;
       if ($current) {
           $control = 'coursespecific';
       } else {
           $control = 'userpref';
           my %userenv = &Apache::lonnet::get('environment',
                                                         ['course_init_display']);
           if (exists($userenv{'course_init_display'})) {
               $current = $userenv{'course_init_display'};
           }
           unless ($current) {
               $current = 'whatsnew';
           }
       }
       return ($control,$current);
   }
   
 sub display_launcher {  sub display_launcher {
     my ($r,$action,$checkallowed,$tabbg,$rowColor1,$rowColor2,$show,      my ($r,$action,$refpage,$checkallowed,$show,$headings,$res_title,
         $headings,$res_title,$tograde,$ungraded,$bombs,$bombed,$changed,          $tograde,$ungraded,$bombs,$bombed,$changed,$warnings,$triggered,
         $warnings,$triggered,$newdiscussions,$unread,$msgcount,$newmsgs,          $newdiscussions,$unread,$msgcount,$newmsgs,$critmsgcount,$critmsgs,
                           $critmsgcount,$critmsgs,$interval,$countunread) = @_;          $interval,$countunread) = @_;
   
     if ($$checkallowed{$action}) {      if ($$checkallowed{$action}) {
         &start_box($r,$tabbg,$show,$headings,$action);          &start_box($r,$show,$headings,$action,$refpage,$action);
         if ($$show{$action}) {          if ($$show{$action}) {
             if ($action eq 'handgrading') {    # UNGRADED ITEMS              if ($action eq 'handgrading') {    # UNGRADED ITEMS
                 &display_handgrade($r,$tograde,$rowColor1,$rowColor2,                  &display_handgrade($r,$tograde,$ungraded);
                                                                     $ungraded);  
             } elsif ($action eq 'haserrors') { # BOMBS              } elsif ($action eq 'haserrors') { # BOMBS
                 &display_haserrors($r,$bombs,$rowColor1,$rowColor2,$bombed,                  &display_haserrors($r,$bombs,$bombed,$res_title);
                                                                    $res_title);  
             } elsif ($action eq 'versionchanges') { # VERSION CHANGES              } elsif ($action eq 'versionchanges') { # VERSION CHANGES
                 &display_versionchanges($r,$changed,$res_title,$rowColor1,                  &display_versionchanges($r,$changed,$res_title,$interval);
                                                          $rowColor2,$interval);  
   
             } elsif ($action eq 'abovethreshold') { # DEGDIFF/AV. TRIES TRIGGERS              } elsif ($action eq 'abovethreshold') { # DEGDIFF/AV. TRIES TRIGGERS
                 &display_abovethreshold($r,$warnings,$triggered,$res_title,                  &display_abovethreshold($r,$refpage,$warnings,$triggered,
                                                         $rowColor1,$rowColor2);   $res_title);
             } elsif ($action eq 'coursediscussion') { # UNREAD COURSE DISCUSSION              } elsif ($action eq 'coursediscussion') { # UNREAD COURSE DISCUSSION
                 &display_coursediscussion($r,$newdiscussions,$unread,                  &display_coursediscussion($r,$newdiscussions,$unread,
                                 $countunread,$res_title,$rowColor1,$rowColor2);                                  $countunread,$res_title);
             } elsif ($action eq 'coursenormalmail') { # NORMAL MESSAGES              } elsif ($action eq 'coursenormalmail') { # NORMAL MESSAGES
                 &display_coursenormalmail($r,$msgcount,$newmsgs,$rowColor1,                  &display_coursenormalmail($r,$msgcount,$newmsgs);
                                                                    $rowColor2);  
             } elsif ($action eq 'coursecritmail') { # CRITICAL MESSAGES              } elsif ($action eq 'coursecritmail') { # CRITICAL MESSAGES
                 &display_coursecritmail($r,$critmsgcount,$critmsgs,$rowColor1,                  &display_coursecritmail($r,$critmsgcount,$critmsgs);
                                                                    $rowColor2);  
             }              }
         }          }
         &end_box($r);          &end_box($r);
Line 512  sub display_launcher { Line 686  sub display_launcher {
   
 sub getitems {  sub getitems {
     my ($unread,$ungraded,$bombed,$triggered,$changed,$newdiscussions,      my ($unread,$ungraded,$bombed,$triggered,$changed,$newdiscussions,
         $tograde,$bombs,$warnings,$rowColor1,$rowColor2,$threshold,$cdom,$crs,          $tograde,$bombs,$warnings,$threshold,$cdom,$crs,$res_title,$show,
                                  $res_title,$show,$starttime,$countunread) = @_;          $starttime,$countunread) = @_;
     my $navmap = Apache::lonnavmaps::navmap->new();      my $navmap = Apache::lonnavmaps::navmap->new();
     # force retrieve Resource to seed the part id cache we'll need it later      # force retrieve Resource to seed the part id cache we'll need it later
     my @allres=$navmap->retrieveResources(undef,      my @allres=$navmap->retrieveResources(undef,
                      sub {if ($_[0]->is_problem) { $_[0]->parts();} return 1;});                       sub {if ($_[0]->is_problem) { $_[0]->parts();} return 1;});
     my %lastreadtime;  
     my %resourcetracker;      my %resourcetracker;
     my $discussiontime;      my $discussiontime;
   
Line 527  sub getitems { Line 700  sub getitems {
         &checkversions($cdom,$crs,$navmap,$changed,$starttime);          &checkversions($cdom,$crs,$navmap,$changed,$starttime);
     }      }
   
     if ($$show{'coursediscussion'}) {     
         my %lastread = &Apache::lonnet::dump('nohist_'.  
                         $env{'request.course.id'}.'_discuss',  
                         $env{'user.domain'},$env{'user.name'},'lastread');  
         foreach my $key (keys(%lastread)) {  
             my $newkey = $key;  
             $newkey =~ s/_lastread$//;  
             $lastreadtime{$newkey} = $lastread{$key};  
         }  
     }  
    
     if ($$show{'abovethreshold'}) {      if ($$show{'abovethreshold'}) {
         %resourcetracker =  &Apache::lonnet::dump('nohist_resourcetracker',          %resourcetracker =  &Apache::lonnet::dump('nohist_resourcetracker',
                                                                    $cdom,$crs);                                                                     $cdom,$crs);
     }      }
   
     my $warningnum = 0;  
     foreach my $resource (@allres) {      foreach my $resource (@allres) {
         my $result = '';          my $result = '';
         my $applies = 0;          my $applies = 0;
Line 552  sub getitems { Line 713  sub getitems {
         %{$$ungraded{$symb}} = ();          %{$$ungraded{$symb}} = ();
         %{$$triggered{$symb}} = ();          %{$$triggered{$symb}} = ();
         $$triggered{$symb}{numparts} = 0;          $$triggered{$symb}{numparts} = 0;
           if ($resource->encrypted()) {
               $$triggered{$symb}{'enclink'} = $resource->link();
               $$triggered{$symb}{'encsymb'} = $resource->shown_symb();
           }
         my $title = $resource->compTitle();          my $title = $resource->compTitle();
         $$res_title{$symb} = $title;          $$res_title{$symb} = $title;
         my $ressymb = $resource->wrap_symb();          my $ressymb = $resource->wrap_symb();
   
 # Check if there are unread discussion postings  # Check if there are unread discussion postings
         if ($$show{'coursediscussion'}) {          if ($$show{'coursediscussion'}) {
             &check_discussions($cdom,$crs,$resource,$symb,$ressymb,$title,              &check_discussions($resource,$symb,$ressymb,$title,
                                                       $newdiscussions,$unread);         $newdiscussions,$unread,$countunread);
         }          }
   
 # Check for ungraded problems  # Check for ungraded problems
Line 577  sub getitems { Line 742  sub getitems {
   
 # Maxtries and degree of difficulty for problem parts, unless handgradeable  # Maxtries and degree of difficulty for problem parts, unless handgradeable
         if ($$show{'abovethreshold'}) {            if ($$show{'abovethreshold'}) {  
             &check_thresholds($resource,$symb,\%resourcetracker,$triggered,              &check_thresholds($resource,$symb,\%resourcetracker,
                        $threshold,$warnings,$warningnum,$rowColor1,$rowColor2);        $triggered,$threshold,$warnings);
         }          }
   
     }      }
     my $hasdiscussion = @{$newdiscussions};  
     if ($$show{'coursediscussion'} && $hasdiscussion) { # Get time of last post;   
         $discussiontime = $navmap->{DISCUSSION_TIME};  
         foreach my $ressymb (@{$newdiscussions}) {  
             $$unread{$ressymb}{'lastpost'} = $$discussiontime{$ressymb};  
         }  
         if ($countunread) { #Get count of unread postings for each resource   
             my $discussiondata = $navmap->get_discussion_data();  
             foreach my $ressymb (@{$newdiscussions}) {  
                 &get_discussions($cdom,$crs,$discussiondata,$ressymb,  
                                                        $unread,\%lastreadtime);  
             }  
         }  
     }  
 }  }
   
 sub check_discussions {  sub check_discussions {
     my ($cdom,$crs,$resource,$symb,$ressymb,$title,$newdiscussions,      my ($resource,$symb,$ressymb,$title,$newdiscussions,$unread,
                                                                  $unread) = @_;   $countunread) = @_;
     if ($resource->hasDiscussion()) {  
         %{$$unread{$ressymb}} = ();  
         $$unread{$ressymb}{'title'} = $title;  
         $$unread{$ressymb}{'symb'} = $symb;  
         push(@{$newdiscussions}, $ressymb);  
     }  
 }  
   
 sub get_discussions {      if (!$resource->hasDiscussion()) { return; }
     my ($cdom,$crs,$discussiondata,$ressymb,$unread,$lastreadtime) = @_;  
     my $prevread = 0;      %{$$unread{$ressymb}} = ();
     my $unreadcount = 0;      $$unread{$ressymb}{'title'} = $title;
     if (defined($$lastreadtime{$ressymb})) {      $$unread{$ressymb}{'symb'} = $symb;
         $prevread = $$lastreadtime{$ressymb};      if ($resource->encrypted()) {
     }          $$unread{$ressymb}{'enclink'} = $resource->link();
     my $version = $$discussiondata{'version:'.$ressymb};          $$unread{$ressymb}{'encsymb'} = $resource->shown_symb();
     if ($version) {      }
         my $hiddenflag = 0;      push(@{$newdiscussions}, $ressymb);
         my $deletedflag = 0;      
         my ($hidden,$deleted);      $$unread{$ressymb}{'lastpost'} = $resource->last_post_time();
         for (my $id=$version; $id>0; $id--) {      
             my $vkeys=$$discussiondata{$id.':keys:'.$ressymb};      if ($countunread eq 'on') {
             my @keys=split(/:/,$vkeys);   $$unread{$ressymb}{'unreadcount'} = 
             if (grep/^hidden$/,@keys) {                              $resource->discussion_info('unread');
                 unless ($hiddenflag) {  
                     $hidden = $$discussiondata{$id.':'.$ressymb.':hidden'};  
                     $hiddenflag = 1;  
                 }  
             } elsif (grep/^deleted$/,@keys) {  
                 unless ($deletedflag) {  
                     $deleted = $$discussiondata{$id.':'.$ressymb.':deleted'};  
                     $deletedflag = 1;  
                 }  
             } else {   
                 unless (($hidden =~/\.$id\./) || ($deleted =~/\.$id\./)) {  
                     if ($prevread <$$discussiondata{$id.':'.$ressymb.':timestamp'}) {  
                         $unreadcount ++;  
                         $$unread{$ressymb}{$unreadcount} = $id.': '.  
                                  $$discussiondata{$id.':'.$ressymb.':subject'};  
                     }  
                 }  
             }  
         }  
         $$unread{$ressymb}{'unreadcount'} = $unreadcount;  
     }      }
 }  }
   
   
 sub check_handgraded {  sub check_handgraded {
     my ($resource,$symb,$title,$cdom,$cnum,$ungraded,$tograde) = @_;      my ($resource,$symb,$title,$cdom,$cnum,$ungraded,$tograde) = @_;
     if ($resource->is_problem()) {      if ($resource->is_problem()) {
Line 666  sub check_handgraded { Line 789  sub check_handgraded {
             if (@ungraded > 0) {              if (@ungraded > 0) {
                 $$ungraded{$symb}{count} = scalar(@ungraded);                  $$ungraded{$symb}{count} = scalar(@ungraded);
                 $$ungraded{$symb}{title} = $title;                  $$ungraded{$symb}{title} = $title;
                 push(@{$tograde}, $symb);                  if ($resource->encrypted()) {
                       $$ungraded{$symb}{'enclink'} = $resource->link();
                       $$ungraded{$symb}{'encsymb'} = $resource->shown_symb();
                   }
                   push(@{$tograde},$symb);
             }              }
         }          }
     }      }
Line 680  sub check_bombed { Line 807  sub check_bombed {
         my @bombs = split(/,/, $errors);          my @bombs = split(/,/, $errors);
         my $errorcount = scalar(@bombs);          my $errorcount = scalar(@bombs);
         my $errorlink = '<a href="/adm/email?display='.          my $errorlink = '<a href="/adm/email?display='.
                         &Apache::lonnet::escape($bombs[0]).'">'.                          &escape($bombs[0]).'">'.
                         $title.'</a>';                          $title.'</a>';
         $$bombed{$symb}{errorcount} = $errorcount;          $$bombed{$symb}{errorcount} = $errorcount;
         $$bombed{$symb}{errorlink} = $errorlink;          $$bombed{$symb}{errorlink} = $errorlink;
Line 689  sub check_bombed { Line 816  sub check_bombed {
 }  }
   
 sub check_thresholds {  sub check_thresholds {
     my ($resource,$symb,$resourcetracker,$triggered,$threshold,$warnings,      my ($resource,$symb,$resourcetracker,$triggered,$threshold,$warnings) = @_;
                                        $warningnum,$rowColor1,$rowColor2) = @_;  
 # Compile maxtries and degree of difficulty for problem parts, unless handgradeable  # Compile maxtries and degree of difficulty for problem parts, unless handgradeable
     my @parts = @{$resource->parts()};      my @parts = @{$resource->parts()};
     my %stats;      my %stats;
     my %lastreset = ();      my %lastreset = ();
     my $warning = 0;      my $warning = 0;
     my $rowColor;  
     foreach my $part (@parts) {      foreach my $part (@parts) {
         if ($resource->handgrade($part) eq 'yes') {          if ($resource->handgrade($part) eq 'yes') {
             next;              next;
         }          }
           if ($resource->is_survey($part)) {
               next;
           }
         %{$stats{$part}} = ();          %{$stats{$part}} = ();
         my ($attempts,$users,$corrects,$degdiff,$av_attempts);          my ($attempts,$users,$corrects,$degdiff,$av_attempts);
         if (exists($$resourcetracker{$symb."\0".$part."\0attempts"})) {          if (exists($$resourcetracker{$symb."\0".$part."\0attempts"})) {
Line 732  sub check_thresholds { Line 860  sub check_thresholds {
         }          }
     }      }
     if ($warning) {      if ($warning) {
         if ($warningnum %2 == 1) {  
             $rowColor = $rowColor1;  
         } else {  
             $rowColor = $rowColor2;  
         }  
         $$triggered{$symb}{title} = $resource->title;          $$triggered{$symb}{title} = $resource->title;
           my $partcount = 0;
           @{$$triggered{$symb}{text}} = ();
         foreach my $part (@parts) {          foreach my $part (@parts) {
             if (exists($stats{$part}{users})) {              if (exists($stats{$part}{users})) {
                 my $resetname = 'reset_'.&Apache::lonnet::escape($symb."\0".$part);                  my $resetname = 'reset_'.&escape($symb."\0".$part);
                 my $resettitle = 'title_'.&Apache::lonnet::escape($symb."\0".$part);                  my $resettitle = 'title_'.&escape($symb."\0".$part);
                 if ($$triggered{$symb}{numparts}) {  
                     $$triggered{$symb}{text} .= '<tr bgcolor="'.$rowColor.'">'."\n";  
                 }  
                 if (@parts > 1) {                  if (@parts > 1) {
                     $$triggered{$symb}{text} .= '                      $$triggered{$symb}{text}[$partcount] = '
                      <td align="right"><small>part - '.$part.'<small></td>';                       <td>part - '.$part.'</td>';
                 } else {                  } else {
                     $$triggered{$symb}{text} .= '                      $$triggered{$symb}{text}[$partcount] = '
                      <td align="right"><small>single part</small></td>';                       <td>single part</td>';
                 }                  }
                 $$triggered{$symb}{text} .= '                  $$triggered{$symb}{text}[$partcount] .= '
                      <td align="right"><small>'.$stats{$part}{users}.'</small></td>                       <td>'.$stats{$part}{users}.'</td>
                      <td align="right"><small>'.$stats{$part}{attempts}.'</small></td>                       <td>'.$stats{$part}{attempts}.'</td>
                      <td align="right"><small>'.$stats{$part}{degdiff}.'</small></td>                       <td>'.$stats{$part}{degdiff}.'</td>
                      <td align="right"><small>'.$lastreset{$part}.'</small></td>                       <td>'.$lastreset{$part}.'</td>
                      <td align="right"><small><input type="checkbox" name="'.$resetname.'" /><input type="hidden" name="'.$resettitle.'" value="'.&Apache::lonnet::escape($$triggered{$symb}{title}).'" /></td>                       <td><input type="checkbox" name="'.$resetname.'" /><input type="hidden" name="'.$resettitle.'" value="'.&escape($$triggered{$symb}{title}).'" /></td>';
                     </tr>';                  $partcount ++;
                 $$triggered{$symb}{numparts} ++;  
             }              }
               $$triggered{$symb}{numparts} = $partcount;
         }          }
         push(@{$warnings},$symb);          push(@{$warnings},$symb);
         $warningnum ++;  
     }      }
 }  }
   
   
 sub get_curr_thresholds {  sub get_curr_thresholds {
     my ($threshold,$cdom,$crs) = @_;      my ($threshold,$uname,$udom,$cid,$cdom,$crs) = @_;
     my %coursesettings = &Apache::lonnet::dump('environment',      # set default values
                                      $cdom,$crs,'internal.threshold');      %$threshold = (av_attempts => 2,
     if (exists($coursesettings{'internal.threshold_av_attempts'})) {                    degdiff => 0.5,
         $$threshold{'av_attempts'} = $coursesettings{'internal.threshold_av_attempts'};                    numstudents => 2
                     );
       my %thresholdsettings = &Apache::lonnet::dump('nohist_whatsnew',$udom,
                                                        $uname,$cid.':threshold');
       my $thresholdcount = 0;
       my ($tmp) = %thresholdsettings;
       unless ($tmp =~ /^(con_lost|error|no_such_host)/i) {
           foreach my $item (keys %{$threshold}) { 
               if (exists($thresholdsettings{$cid.':threshold_'.$item})) {
                   $$threshold{$item} = 
                                $thresholdsettings{$cid.':threshold_'.$item};
                   $thresholdcount ++;
               }
           }
     }      }
     if (exists($coursesettings{'internal.threshold_degdiff'})) {      if ($thresholdcount == 3) {
         $$threshold{'degdiff'} = $coursesettings{'internal.threshold_degdiff'};          return;
     }      }
     if (exists($coursesettings{'internal.threshold_numstudents'})) {      my %coursesettings = &Apache::lonnet::dump('environment',
         $$threshold{'numstudents'} = $coursesettings{'internal.threshold_numstudents'};                                                $cdom,$crs,'internal.threshold');
       my ($temp) = %coursesettings;
       unless ($temp =~ /^(con_lost|error|no_such_host)/i) {  
           foreach my $item (keys %{$threshold}) {
               unless (exists($thresholdsettings{$cid.':threshold_'.$item})) {
                   if (exists($coursesettings{'internal.threshold_'.$item})) {
                       $$threshold{$item} = 
                                $coursesettings{'internal.threshold_'.$item};
                   }
               }
           }
     }      }
       return;
 }  }
   
 sub get_curr_interval {  sub get_current {
     my ($uname,$udom,$cid);      my ($uname,$udom,$cid,$caller) = @_;
     my $interval;      my $currvalue;
     my %settings = &Apache::lonnet::dump('nohist_whatsnew',$uname,$udom,$cid,':interval');      my %settings = &Apache::lonnet::dump('nohist_whatsnew',$udom,$uname,$cid.
                                                                   ':'.$caller);
     my ($tmp) = %settings;      my ($tmp) = %settings;
   
     unless ($tmp =~ /^(con_lost|error|no_such_host)/i) {      unless ($tmp =~ /^(con_lost|error|no_such_host)/i) {
         $interval = $settings{$cid.':interval'};          $currvalue = $settings{$cid.':'.$caller};
     }      }
     return $interval;      return $currvalue;
 }  }
   
 sub process_reset {  sub process_reset {
     my ($dom,$crs) = @_;      my ($dom,$crs) = @_;
     my $result = '<b>Counters reset for following problems (and parts):</b><br />';      my $result = '<b>'.&mt('Counters reset for following problems (and parts):').
                              '</b><br />';
     my @agg_types = ('attempts','users','correct');      my @agg_types = ('attempts','users','correct');
     my %agg_titles = (      my %agg_titles = &Apache::lonlocal::texthash (
                      attempts => 'Number of submissions',                       attempts => 'Number of submissions',
                      users => 'Students with submissions',                       users => 'Students with submissions',
                      correct => 'Number of correct submissions',                       correct => 'Number of correct submissions',
Line 808  sub process_reset { Line 954  sub process_reset {
     my %titles = ();      my %titles = ();
     foreach my $key (keys(%env)) {      foreach my $key (keys(%env)) {
         next if ($key !~ /^form\.reset_(.+)$/);          next if ($key !~ /^form\.reset_(.+)$/);
         my $title = &Apache::lonnet::unescape($env{'form.title_'.$1});          my $title = &unescape($env{'form.title_'.$1});
         my $reset_item = &Apache::lonnet::unescape($1);          my $reset_item = &unescape($1);
         my %curr_aggregates = &Apache::lonnet::dump('nohist_resourcetracker',$dom,$crs,$reset_item);          my %curr_aggregates = &Apache::lonnet::dump('nohist_resourcetracker',$dom,$crs,$reset_item);
         my %aggregates = ();          my %aggregates = ();
         my ($symb,$part) = split(/\0/,$reset_item);          my ($symb,$part) = split(/\0/,$reset_item);
Line 835  sub process_reset { Line 981  sub process_reset {
 }  }
   
 sub process_update {  sub process_update {
     my ($dom,$crs,$threshold_titles) = @_;      my ($uname,$udom,$threshold_titles) = @_;
     my $setoutput = '<b>Changes to threshold(s) for problem tracking:</b><br />';      my $setoutput = '<b>Changes to threshold(s) for problem tracking:</b><br />';
     foreach (keys %env) {      foreach (keys %env) {
         next if ($_!~/^form\.(.+)\_setparmval$/);          next if ($_!~/^form\.(.+)\_setparmval$/);
         my $name  = $1;          my $name  = $1;
         my $value = $env{'form.'.$name.'_value'};          my $value = $env{'form.'.$name.'_value'};
         if ($name && defined($value)) {          if ($name && defined($value) && ($value ne '')) {
             my $put_result = &Apache::lonnet::put('environment',              my $put_result = &Apache::lonnet::put('nohist_whatsnew',
                                                   {$name=>$value},$dom,$crs);                                                    {$name=>$value},$udom,$uname);
                         
             my ($shortname) = ($name =~ /^internal\.threshold_(.+)$/);               my ($shortname) = ($name =~ /^\Q$env{'request.course.id'}\E:threshold_(.+)$/);
             if ($put_result eq 'ok') {              if ($put_result eq 'ok') {
                 $setoutput.=&mt('Set threshold for [_1] to [_2]',                  $setoutput.=&mt('Set threshold for [_1] to [_2]',
  '<b>'.$$threshold_titles{$shortname}.'</b>',   '<b>'.$$threshold_titles{$shortname}.'</b>',
Line 867  sub getnormalmail { Line 1013  sub getnormalmail {
   
     my @messages = sort(&Apache::lonnet::getkeys('nohist_email'));      my @messages = sort(&Apache::lonnet::getkeys('nohist_email'));
     foreach my $message (@messages) {      foreach my $message (@messages) {
  my $msgid=&Apache::lonnet::escape($message);   my $msgid=&escape($message);
         my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=          my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=
             &Apache::lonmsg::unpackmsgid($msgid);              &Apache::lonmsg::unpackmsgid($msgid);
         if (($fromcid) && ($fromcid eq $env{'request.course.id'})) {          if (($fromcid) && ($fromcid eq $env{'request.course.id'})) {
Line 879  sub getnormalmail { Line 1025  sub getnormalmail {
                     if ($shortsubj eq '') {                      if ($shortsubj eq '') {
                         $shortsubj = &mt('No subject');                          $shortsubj = &mt('No subject');
                     }                      }
                     $shortsubj = &Apache::lonnet::unescape($shortsubj);  
                     push(@{$newmsgs}, {                      push(@{$newmsgs}, {
                         msgid    => $msgid,                          msgid    => $msgid,
                         sendtime => $sendtime,                          sendtime => $sendtime,
Line 911  sub getcritmail { Line 1056  sub getcritmail {
                 if ($shortsubj eq '') {                  if ($shortsubj eq '') {
                     $shortsubj = &mt('No subject');                      $shortsubj = &mt('No subject');
                 }                  }
                 $shortsubj = &Apache::lonnet::unescape($shortsubj);  
                 push(@{$critmsgs}, {                  push(@{$critmsgs}, {
                         msgid    => $msgid,                          msgid    => $msgid,
                         sendtime => $sendtime,                          sendtime => $sendtime,
Line 931  sub checkversions { Line 1075  sub checkversions {
     my %changes=&Apache::lonnet::dump('versionupdate',$cdom,$crs);      my %changes=&Apache::lonnet::dump('versionupdate',$cdom,$crs);
     my ($tmp) = keys(%changes);      my ($tmp) = keys(%changes);
     unless ($tmp =~ /^(con_lost|error|no_such_host)/i) {      unless ($tmp =~ /^(con_lost|error|no_such_host)/i) {
  if (keys(%changes) > 0) {          if (keys(%changes) > 0) {
             foreach my $key (sort(keys(%changes))) {              foreach my $key (sort(keys(%changes))) {
                 if ($changes{$key} > $starttime) {                  if ($changes{$key} > $starttime) {
                     my $version;                      my $version;
Line 967  sub checkversions { Line 1111  sub checkversions {
 }  }
   
 sub display_handgrade {  sub display_handgrade {
     my ($r,$tograde,$rowColor1,$rowColor2,$ungraded) = @_;      my ($r,$tograde,$ungraded) = @_;
     my $rowColor;  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                         'prna' => 'Problem Name',                          'prna' => 'Problem Name',
                         'nmun' => 'Number ungraded',                          'nmun' => 'Number ungraded',
                         'nopr' => 'No problems require handgrading',                          'nopr' => 'No problems require handgrading',
     );      );
     if (@{$tograde} > 0) {      if (@{$tograde} > 0) {
         $r->print('<tr bgcolor="#cccccc"><td><b><small>'.$lt{'prna'}.'</small></b></td><td align="right"><b><small>'.$lt{'nmun'}.'</small></b></td></tr>');          $r->print('<tr class="LC_info_row"><td class="LC_left_item">'.
                     $lt{'prna'}.'</td><td class="LC_right_item">'.
                     $lt{'nmun'}.'</td></tr>');
         my $rowNum = 0;          my $rowNum = 0;
         foreach my $res (@{$tograde}) {          foreach my $res (@{$tograde}) {
             if ($rowNum %2 == 1) {              $rowNum ++;
                 $rowColor = $rowColor1;              my $css_class = $rowNum%2?' class="LC_odd_row"':'';
             } else {  
                 $rowColor = $rowColor2;  
             }  
             my ($map,$id,$url)=&Apache::lonnet::decode_symb($res);              my ($map,$id,$url)=&Apache::lonnet::decode_symb($res);
             my $linkurl=&Apache::lonnet::clutter($url);              my $linkurl=&Apache::lonnet::clutter($url);
             $linkurl .= '?symb='.&Apache::lonnet::escape($res);              $linkurl .= '?symb='.&escape($res);
                                                                                              if ($$ungraded{$res}{'enclink'}) {
             $r->print('<tr bgcolor="'.$rowColor.'"><td><a href="'.$linkurl.'"><small>'.$$ungraded{$res}{title}.'</small></a></td><td align="right"><small>'.$$ungraded{$res}{count}.'</small></td></tr>');                  $linkurl = 
             $rowNum ++;                      $$ungraded{$res}{'enclink'}.'?symb='.$$ungraded{$res}{'encsymb'};
               } 
               $r->print('<tr'.$css_class.'><td><a href="'.$linkurl.'">'.$$ungraded{$res}{title}.'</a></td><td class="LC_right_item">'.$$ungraded{$res}{count}.'</td></tr>');
         }          }
     } else {      } else {
         $r->print('<tr><td bgcolor="#ffffff"><br><center><i><b><small>&nbsp;&nbsp;'.$lt{'nopr'}.'&nbsp;&nbsp;</small><br><br></b></i></td></tr>');          $r->print('<tr class="LC_empty_row"><td>'.$lt{'nopr'}.'</td></tr>');
     }      }
 }  }
   
 sub display_haserrors {  sub display_haserrors {
     my ($r,$bombs,$rowColor1,$rowColor2,$bombed,$res_title) = @_;      my ($r,$bombs,$bombed,$res_title) = @_;
     my $bombnum = 0;      my $bombnum = 0;
     my $rowColor;  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                                    reso => 'Resource',                                     reso => 'Resource',
                                    nmer => 'Number of errors',                                     nmer => 'Number of errors',
                                    noer => 'No problems with errors',                                     noer => 'No problems with errors',
     );      );
     if (@{$bombs} > 0) {      if (@{$bombs} > 0) {
         $r->print('<tr bgcolor="#cccccc"><td><b><small>'.$lt{'reso'}.'</small></b></td><td align="right"><b><small>'.$lt{'nmer'}.'</small></b></td></tr>');          $r->print('<tr class="LC_info_row"><td class="LC_left_item">'.
                     $lt{'reso'}.'</td><td class="LC_right_item">'.
                     $lt{'nmer'}.'</td></tr>');
         @{$bombs} = sort { &cmp_title($a,$b,$res_title) } @{$bombs};          @{$bombs} = sort { &cmp_title($a,$b,$res_title) } @{$bombs};
         foreach my $bomb (@{$bombs}) {          foreach my $bomb (@{$bombs}) {
             if ($bombnum %2 == 1) {  
                 $rowColor = $rowColor1;  
             } else {  
                 $rowColor = $rowColor2;  
             }  
             $r->print('<tr bgcolor="'.$rowColor.'"><td><small>'.$$bombed{$bomb}{errorlink}.'</small></td><td align="right"><small>'.$$bombed{$bomb}{errorcount}.'</small></td></tr>');  
             $bombnum ++;              $bombnum ++;
               my $css_class = $bombnum%2?' class="LC_odd_row"':'';
               $r->print('<tr'.$css_class.'><td>'.$$bombed{$bomb}{errorlink}.
                         '</td><td class="LC_right_item">'.
                         $$bombed{$bomb}{errorcount}.'</td></tr>');
         }          }
     } else {      } else {
         $r->print('<tr><td bgcolor="#ffffff"><br /><center><b><i><small>'.$lt{'noer'}.'</small></i></b></center><br /></td></tr>');          $r->print('<tr class="LC_empty_row"><td>'.$lt{'noer'}.'</td></tr>');
     }      }
     return;      return;
 }  }
   
 sub display_abovethreshold {  sub display_abovethreshold {
     my ($r,$warnings,$triggered,$res_title,$rowColor1,$rowColor2) = @_;      my ($r,$refpage,$warnings,$triggered,$res_title) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                  reso => 'Resource',                   reso => 'Resource',
                  part => 'Part',                   part => 'Part',
Line 1035  sub display_abovethreshold { Line 1178  sub display_abovethreshold {
                  rese => 'Reset counters to 0',                   rese => 'Reset counters to 0',
                  nopr => 'No problems satisfy threshold criteria',                   nopr => 'No problems satisfy threshold criteria',
     );      );
     my $rowColor;   
     my $warningnum = 0;  
     if (@{$warnings} > 0) {      if (@{$warnings} > 0) {
         @{$warnings} = sort { &cmp_title($a,$b,$res_title) } @{$warnings};          @{$warnings} = sort { &cmp_title($a,$b,$res_title) } @{$warnings};
         $r->print('<form name="reset_tracking" method="post" action="/adm/whatsnew">'.          $r->print('<form name="reset_tracking" method="post" action="/adm/whatsnew">'.
                 '  <input type="hidden" name="command" value="reset" />'."\n");                  ' <input type="hidden" name="command" value="reset" />'."\n".
         $r->print('<tr bgcolor="#cccccc"><td><b><small>'.$lt{'reso'}.'</small></b></td><td align="right"><b><small>'.$lt{'part'}.'</small></b></td><td align="right"><b><small>'.$lt{'nust'}.'</small></b></td><td align="right"><b><small>'.$lt{'avat'}.'</small></b></td><td align="right"><b><small>'.$lt{'dedi'}.'</small></b></td><td align="right"><b><small>'.$lt{'lare'}.'</small></b></td><td align="right"><b><small>'.$lt{'reco'}.'</small></b></td></tr>');                  ' <input type="hidden" name="refpage" value="'.$refpage.'" />'.
                   "\n");
           $r->print('<tr class="LC_info_row">'.
     '<td class="LC_left_item">'.$lt{'reso'}.'</td>'.
     '<td>'.$lt{'part'}.'</td><td>'.$lt{'nust'}.'</td>'.
     '<td>'.$lt{'avat'}.'</td><td>'.$lt{'dedi'}.'</td>'.
     '<td>'.$lt{'lare'}.'</td><td  class="LC_right_item">'.
                     $lt{'reco'}.'</td></tr>');
    my $row;
         foreach my $res (@{$warnings}) {          foreach my $res (@{$warnings}) {
             if ($warningnum %2 == 1) {      $row++;
                 $rowColor = $rowColor1;  
             } else {  
                 $rowColor = $rowColor2;  
             }  
             my ($map,$id,$url)=&Apache::lonnet::decode_symb($res);              my ($map,$id,$url)=&Apache::lonnet::decode_symb($res);
             my $linkurl=&Apache::lonnet::clutter($url);              my $linkurl=&Apache::lonnet::clutter($url);
             my $rowspan;              my $rowspan;
             if ($$triggered{$res}{numparts} > 1) {              if ($$triggered{$res}{numparts} > 1) {
                 $rowspan = 'rowspan="'.$$triggered{$res}{numparts}.'"';                  $rowspan = 'rowspan="'.$$triggered{$res}{numparts}.'"';
             }              }
             $linkurl .= '?symb='.&Apache::lonnet::escape($res);              $linkurl .= '?symb='.&escape($res);
             $r->print('<tr bgcolor="'.$rowColor.'"><td '.$rowspan.'><a href="'.$linkurl.'"><small>'.$$triggered{$res}{title}.'</small></a></td>'.$$triggered{$res}{text});              if ($$triggered{$res}{'enclink'}) {
             $warningnum ++;                  $linkurl = 
                     $$triggered{$res}{'enclink'}.'?symb='.$$triggered{$res}{'encsymb'};
               }
               my $css_class = $row%2?' class="LC_odd_row"':'';
               $r->print('<tr'.$css_class.'>'.
         '<td class="LC_first_item" '.$rowspan.'><a href="'.$linkurl.'">'.
         $$triggered{$res}{title}.'</a></td>');
                         if (ref($$triggered{$res}{text}) eq 'ARRAY') {
             $r->print($$triggered{$res}{text}[0]);
                         }
                         $r->print('</tr>');
               if (ref($$triggered{$res}{text}) eq 'ARRAY') {
                   if (@{$$triggered{$res}{text}} > 1) {
                       for (my $i=1; $i<@{$$triggered{$res}{text}}; $i++) {
                           $r->print('<tr class="'.$css_class.'">'.
                                     $$triggered{$res}{text}[$i].'</tr>');
                       }
                   }
               }
         }          }
         $r->print('<tr bgcolor="#cccccc"><td colspan="7" align="right"><br /><b><small><input type="submit" name="counters" value="'.$lt{'rese'}.'" /></form>');          $r->print('<tr class="LC_info_row"><td colspan="7" class="LC_right_item"><br /><input type="submit" name="counters" value="'.$lt{'rese'}.'" /></td></tr></form>');
     } else {      } else {
         $r->print('<tr><td bgcolor="#ffffff"><br /><center><b><i><small>'.$lt{'nopr'}.'</small></i></b></center><br /></td></tr>');          $r->print('<tr class="LC_empty_row"><td>'.$lt{'nopr'}.'</td></tr>');
     }      }
 }  }
   
 sub display_versionchanges {  sub display_versionchanges {
     my ($r,$changed,$res_title,$rowColor1,$rowColor2,$interval) = @_;      my ($r,$changed,$res_title,$interval) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         'reso' => 'Resource',          'reso' => 'Resource',
         'revd' => 'Last revised',          'revd' => 'Last revised',
Line 1073  sub display_versionchanges { Line 1236  sub display_versionchanges {
         'veru' => 'Version used',          'veru' => 'Version used',
         'noup' => 'No updated versions',           'noup' => 'No updated versions', 
     );      );
     my $rowColor;  
     if (keys(%{$changed}) > 0) {      if (keys(%{$changed}) > 0) {
         $r->print('<tr bgcolor="#cccccc"><td><b><small>'.$lt{'reso'}.'</small></b></td><td><b><small>'.$lt{'revd'}.'</small></b></td><td><b><small>'.$lt{'newv'}.'</small></b></td><td><b><small>'.$lt{'veru'}.'</small></b></td></tr>');          $r->print('<tr class="LC_info_row"><td class="LC_left_item">'.
                             $lt{'reso'}.'</td><td>'.$lt{'revd'}.'</td><td>'.
                             $lt{'newv'}.'</td><td class="LC_right_item">'.
                     $lt{'veru'}.'</td></tr>');
         my @changes = sort { &cmp_title($a,$b,$res_title) } keys(%{$changed});          my @changes = sort { &cmp_title($a,$b,$res_title) } keys(%{$changed});
         my $changenum = 0;          my $changenum = 0;
         foreach my $item (@changes) {          foreach my $item (@changes) {
             if ($changenum %2 == 1) {              $changenum ++;
                 $rowColor = $rowColor1;              my $css_class = $changenum%2?' class="LC_odd_row"':'';
             } else {  
                 $rowColor = $rowColor2;  
             }  
             my ($map,$id,$url)=&Apache::lonnet::decode_symb($item);              my ($map,$id,$url)=&Apache::lonnet::decode_symb($item);
             my $linkurl=&Apache::lonnet::clutter($url);              my $linkurl=&Apache::lonnet::clutter($url);
             $linkurl .= '?symb='.&Apache::lonnet::escape($item);              $linkurl .= '?symb='.&escape($item);
   
             $r->print('<tr bgcolor="'.$rowColor.'"><td><small><a href="'.$linkurl.'">'.$$res_title{$item}.'</a></small></td><td><small>'.$$changed{$item}{'revdate'}.'</small></td><td><small>'.$$changed{$item}{'current'}.'</small></td><td><small>'.$$changed{$item}{'version'}.'</small></td></tr>');              $r->print('<tr'.$css_class.'><td><a href="'.$linkurl.'">'.
             $changenum ++;                        $$res_title{$item}.'</a></td><td>'.
                         $$changed{$item}{'revdate'}.'</td><td>'.
                         $$changed{$item}{'current'}.'</td><td>'.
                         $$changed{$item}{'version'}.'</td></tr>');
         }          }
     } else {      } else {
         $r->print('<tr><td bgcolor="#ffffff"><br /><center><b><i><small>'.$lt{'noup'}.' '.$interval.'</small></i></b></center><br /></td></tr>');          $r->print('<tr class="LC_empty_row"><td>'.$lt{'noup'}.
                     ' '.$interval.'</td></tr>');
     }      }
     return;      return;
 }  }
     
 sub display_coursediscussion {  sub display_coursediscussion {
     my ($r,$newdiscussions,$unread,$countunread,$res_title,$rowColor1,      my ($r,$newdiscussions,$unread,$countunread,$res_title) = @_;
                                                               $rowColor2) = @_;      my $lctype = lc(&Apache::loncommon::course_type());
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
                 'loca' => 'Location',                  'loca' => 'Location',
                 'type' => 'Type',                  'type' => 'Type',
                 'numn' => 'Number of new posts',                  'numn' => 'Number of new posts',
                 'noun' => 'No unread posts in course discussions',                  'noun' => 'No unread posts in '.$lctype.' discussions',
                 'tmlp' => 'Time of last post',                   'tmlp' => 'Time of last post', 
     );      );
     my $rowColor;  
     if (@{$newdiscussions} > 0) {      if (@{$newdiscussions} > 0) {
         $r->print('<tr bgcolor="#cccccc"><td><b><small>'.$lt{'loca'}.          $r->print('<tr class="LC_info_row"><td class="LC_left_item">'.
                   '</small></b></td><td><b><small>'.$lt{'type'}.                    $lt{'loca'}.'</td><td>'.
                   '</small></b>');                    $lt{'type'}.'</td>');
         if ($countunread) {          if ($countunread eq 'on') {
             $r->print('<td><b><small>'.$lt{'tmlp'}.'</small></b></td>'.              $r->print('<td>'.$lt{'tmlp'}.'</td>'.
                       '<td align="right"><b><small>'.$lt{'numn'}.                        '<td class="LC_right_item">'.$lt{'numn'}.'</td>');
                       '</small></b></td>');  
         } else {          } else {
             $r->print('<td align="right"><b><small>'.$lt{'tmlp'}.              $r->print('<td class="LC_right_item">'.$lt{'tmlp'}.'</td>');
                          '</small></b></td>');  
         }          }
         $r->print("</tr>\n");          $r->print("</tr>\n");
         @{$newdiscussions} = sort { &cmp_title($a,$b,$res_title) }          @{$newdiscussions} = sort { &cmp_title($a,$b,$res_title) }
                                                             @{$newdiscussions};                                                              @{$newdiscussions};
         my $rowNum = 0;          my $rowNum = 0;
         foreach my $ressymb (@{$newdiscussions}) {          foreach my $ressymb (@{$newdiscussions}) {
               $rowNum ++;
             my $forum_title = $$unread{$ressymb}{'title'};              my $forum_title = $$unread{$ressymb}{'title'};
             my $type = 'Resource';              my $type = 'Resource';
             my $feedurl=&Apache::lonfeedback::get_feedurl($ressymb);              my $feedurl=&Apache::lonfeedback::get_feedurl($ressymb);
               my $disclink = $feedurl.'?symb='.$$unread{$ressymb}{symb};
             if ($feedurl =~ /bulletinboard/) {              if ($feedurl =~ /bulletinboard/) {
                 $type = 'Bulletin Board';                  $type = 'Bulletin Board';
             }              }
             if ($rowNum %2 == 1) {              if ($$unread{$ressymb}{'enclink'}) {
                 $rowColor = $rowColor1;                  $disclink = $$unread{$ressymb}{'enclink'}.'?symb='.$$unread{$ressymb}{'encsymb'};
             } else {  
                 $rowColor = $rowColor2;  
             }              }
               my $css_class = $rowNum%2?' class="LC_odd_row"':'';
             my $lastpost = &Apache::lonnavmaps::timeToHumanString(              my $lastpost = &Apache::lonnavmaps::timeToHumanString(
                                                $$unread{$ressymb}{'lastpost'});                                                 $$unread{$ressymb}{'lastpost'});
             $r->print('<tr bgcolor="'.$rowColor.'"><td><small><a href="'.$feedurl.'?symb='.$$unread{$ressymb}{symb}.'">'.$forum_title.'</a>&nbsp;</td><td><small>'.$type.'&nbsp;</small></td>');              $r->print('<tr'.$css_class.'><td><a href="'.$disclink.'">'.$forum_title.'</a>&nbsp;</td><td>'.$type.'&nbsp;</td>');
             if ($countunread) {              if ($countunread eq 'on') {
                 my $unreadnum = $$unread{$ressymb}{'unreadcount'};                  my $unreadnum = $$unread{$ressymb}{'unreadcount'};
                 $r->print('<td><small>'.$lastpost.'<small></td><td align="right">'.                  $r->print('<td>'.$lastpost.'</td><td class="LC_right_item">'.
                           '<small>',$unreadnum.'&nbsp;</small></td>');                            $unreadnum.'&nbsp;</td>');
             } else {              } else {
                 $r->print('<td align="right"><small>'.$lastpost.'</small></td>');                  $r->print('<td class="LC_right_item">'.$lastpost.'</td>');
             }              }
             $r->print("</tr>\n");              $r->print("</tr>\n");
             $rowNum ++;  
         }          }
     } else {      } else {
         $r->print('<tr><td bgcolor="#ffffff"><br><center>&nbsp;<i><b><small>'.          $r->print('<tr class="LC_empty_row"><td>'.$lt{'noun'}.'</td></tr>');
                   $lt{'noun'}.'</small></b></i><br><br></td></tr>');  
     }      }
 }  }
   
 sub display_coursenormalmail {  sub display_coursenormalmail {
     my ($r,$msgcount,$newmsgs,$rowColor1,$rowColor2) = @_;      my ($r,$msgcount,$newmsgs) = @_;
     my $rowColor;      my $lctype = lc(&Apache::loncommon::course_type());
     if ($msgcount > 0) {      if ($msgcount > 0) {
         $r->print('<tr bgcolor="#cccccc"><td><b><small>'.&mt('Number').'</small></b></td><td><b><small>'.&mt('Subject').'</small></b></td><td><b><small>'.&mt('Sender').'</small></b></td><td><b><small>'.&mt('Date/Time').'</small></b></td></tr>');          $r->print('<tr class="LC_info_row"><td class="LC_left_item">'.
         my $rowNum = 0;                    &mt('Number').'</td><td>'.&mt('Subject').'</td><td>'.
         my $mailcount = 1;                    &mt('Sender').'</td><td class="LC_right_item">'.
                     &mt('Date/Time').'</td></tr>');
           my $mailcount = 0;
         foreach my $msg (@{$newmsgs}) {          foreach my $msg (@{$newmsgs}) {
             if ($rowNum %2 == 1) {  
                 $rowColor = $rowColor1;  
             } else {  
                 $rowColor = $rowColor2;  
             }  
             $r->print('<tr bgcolor="'.$rowColor.'"><td valign="top"><small>'.$mailcount.'. &nbsp;</small></td><td valign="top"><small><a href="/adm/communicate">'.$msg->{'shortsub'}.'</a>&nbsp; &nbsp;</small></td><td valign="top"><small>&nbsp;'.$msg->{'from'}.'@'.$msg->{'fromdom'}.'&nbsp;</small></td><td valign="top"><small>'.$msg->{'sendtime'}.'</small></td></tr>');  
             $rowNum ++;  
             $mailcount ++;              $mailcount ++;
               my $css_class = $mailcount%2?' class="LC_odd_row"':'';
               $r->print('<tr'.$css_class.'><td>'.$mailcount.
                         '. &nbsp;</td><td><a href="/adm/communicate">'.
                         $msg->{'shortsub'}.'</a>&nbsp; &nbsp;</td><td>&nbsp;'.
                         $msg->{'from'}.'@'.$msg->{'fromdom'}.'&nbsp;</td><td>'.
                         $msg->{'sendtime'}.'</td></tr>');
         }          }
     } else {      } else {
         $r->print('<tr><td bgcolor="#ffffff" width="100%"><center><br /><b><i><small>'.&mt('No new course messages').'</small></i></b><br /><br /></center></td></tr>');          $r->print('<tr class="LC_empty_row"><td>'.
                     &mt('No new '.$lctype.' messages').'</td></tr>');
     }      }
 }  }
   
 sub display_coursecritmail {  sub display_coursecritmail {
     my ($r,$critmsgcount,$critmsgs,$rowColor1,$rowColor2) = @_;      my ($r,$critmsgcount,$critmsgs) = @_;
     my $rowColor;      my $lctype = lc(&Apache::loncommon::course_type());
     if ($critmsgcount > 0) {      if ($critmsgcount > 0) {
         $r->print('<tr bgcolor="#cccccc"><td><b><small>'.&mt('Number').'</small></b></td><td><b><small>'.&mt('Subject').'</small></b></td><td><b><small>'.&mt('Sender').'</small></b></td><td><b><small>'.&mt('Date/Time').'</small></b></td></tr>');          $r->print('<tr class="LC_info_row"><td class="LC_left_item">'.
         my $rowNum = 0;                    &mt('Number').'</td><td>'.&mt('Subject').'</td><td>'.
         my $mailcount = 1;                    &mt('Sender').'</td><td class="LC_right_item">'.
                     &mt('Date/Time').'</td></tr>');
           my $mailcount = 0;
         foreach my $msg (@{$critmsgs}) {          foreach my $msg (@{$critmsgs}) {
             if ($rowNum %2 == 1) {  
                 $rowColor = $rowColor1;  
             } else {  
                 $rowColor = $rowColor2;  
             }  
             $r->print('<tr bgcolor="'.$rowColor.'"><td valign="top"><small>'.$mailcount.'. &nbsp;<small></td><td valign="top"><small><a href="/adm/email?folder=critical">'.$msg->{'shortsub'}.'</a>&nbsp; &nbsp;</small></td><td valign="top"><small>&nbsp;'.$msg->{'from'}.'@'.$msg->{'fromdom'}.'&nbsp;</small></td><td valign="top"><small>'.$msg->{'sendtime'}.'</small></td></tr>');  
             $rowNum ++;  
             $mailcount ++;              $mailcount ++;
               my $css_class = $mailcount%2?' class="LC_odd_row"':'';
               $r->print('<tr'.$css_class.'><td>'.$mailcount.
                         '. &nbsp;</td><td><a href="/adm/email?folder=critical">'.
                         $msg->{'shortsub'}.'</a>&nbsp; &nbsp;</td><td>&nbsp;'.
                         $msg->{'from'}.'@'.$msg->{'fromdom'}.'&nbsp;</td><td>'.
                         $msg->{'sendtime'}.'</td></tr>');
         }          }
     } else {      } else {
         $r->print('<tr><td bgcolor="#ffffff" width="100%"><center><br /><b><i><small>'.&mt('No unread critical messages in course').'</small></i></b><br /><br /></center></td></tr>');          $r->print('<tr class="LC_empty_row"><td>'.
                     &mt('No unread critical messages in '.$lctype).
                     '</td></tr>');
     }      }
 }  }
   
Line 1213  sub get_display_settings { Line 1378  sub get_display_settings {
     my ($uname,$udom,$cid) = @_;      my ($uname,$udom,$cid) = @_;
     my %settings = &Apache::lonnet::dump('nohist_whatsnew',$udom,$uname,$cid);       my %settings = &Apache::lonnet::dump('nohist_whatsnew',$udom,$uname,$cid); 
     my ($tmp) = keys(%settings);      my ($tmp) = keys(%settings);
     if ($tmp=~/^(con_lost|error|no_such_host)/i) {      if ($tmp=~ /^(con_lost|error|no_such_host)/i) {
         %settings = ();          %settings = ();
  unless ($tmp =~ /^error: 2 /) {          unless ($tmp =~ /^error: 2 /) {
     &Apache::lonnet::logthis('Error retrieving whatsnew settings: '.      my $lctype = lc(&Apache::loncommon::course_type());
      $tmp.' for '.$uname.':'.$udom.              &Apache::lonnet::logthis('Error retrieving whatsnew settings: '.
      ' for course: '.$cid);              $tmp.' for '.$uname.':'.$udom.' for '.$lctype.': '.$cid);
           }
  }  
     }      }
     return %settings;      return %settings;
 }  }
Line 1230  sub store_display_settings { Line 1394  sub store_display_settings {
     my %whatsnew_settings;      my %whatsnew_settings;
     my $result;      my $result;
     foreach my $key (keys(%{$checkallowed})) {      foreach my $key (keys(%{$checkallowed})) {
    if ($key =~ /_section$/) { next; }
         if (exists($env{'form.display_'.$key})) {          if (exists($env{'form.display_'.$key})) {
             unless ($env{'form.display_'.$key} eq '') {              unless ($env{'form.display_'.$key} eq '') {
                 $whatsnew_settings{$cid.':'.$key} = $env{'form.display_'.$key};                  $whatsnew_settings{$cid.':'.$key} = $env{'form.display_'.$key};
Line 1258  sub store_interval_setting { Line 1423  sub store_interval_setting {
                   '<b>'.$$interval_titles{$env{'form.interval'}}.'</b><br />');                    '<b>'.$$interval_titles{$env{'form.interval'}}.'</b><br />');
   
         } else {          } else {
       my $lctype = lc(&Apache::loncommon::course_type());
             &Apache::lonnet::logthis('Error storing whatsnew interval setting'.              &Apache::lonnet::logthis('Error storing whatsnew interval setting'.
                      ' '.$outcome.' for '.$uname.':'.$udom.' in course '.$cid);                  ' '.$outcome.' for '.$uname.':'.$udom.' in '.$lctype.' '.$cid);
             $result = &mt('Unable to set interval to [_1] due to [_2].',              $result = &mt('Unable to set interval to [_1] due to [_2].',
                          '<b>'.$$interval_titles{$env{'form.interval'}}.'</b>',                           '<b>'.$$interval_titles{$env{'form.interval'}}.'</b>',
                          '<tt>'.$outcome.'</tt>.<br />');                           '<tt>'.$outcome.'</tt>.<br />');
Line 1268  sub store_interval_setting { Line 1434  sub store_interval_setting {
     return $result;      return $result;
 }  }
   
   sub store_discussion_setting {
       my ($uname,$udom,$cid) = @_;
       my %discussion_settings;
       my $result;
       if (defined($env{'form.countunread'})) {
           $discussion_settings{$cid.':countunread'} = $env{'form.countunread'};
           my $outcome = &Apache::lonnet::put('nohist_whatsnew',
                                                \%discussion_settings,$udom,$uname);
           if ($outcome eq 'ok') {
               $result = &mt('Count unread posts in discussions display set to [_1]',
                     '<b>'.$env{'form.countunread'}.'</b><br />');
                                                                                     
           } else {
       my $lctype = lc(&Apache::loncommon::course_type());
               &Apache::lonnet::logthis('Error storing whatsnew countunread setting'.
                   ' '.$outcome.' for '.$uname.':'.$udom.' in '.$lctype.' '.$cid);
               $result = &mt('Unable to set "number unread posts display" to [_1]'.
                             ' due to [_2].',
                            '<b>'.$env{'form.countunread'}.'</b>',
                            '<tt>'.$outcome.'</tt>.<br />');
           }
       }
       return $result;
   }
   
   sub store_courseinit_setting {
       my ($uname,$udom,$cid,$initpage) = @_;
       my %courseinit_settings;
       my $page_control;
       my $result;
       if (defined($env{'form.courseinit_control'})) {
           if ($env{'form.courseinit_control'} eq 'userpref') {
               $courseinit_settings{$cid.':courseinit'} = '';
               $page_control = 'global preferences';
           } else {
               if (defined($env{'form.courseinit_page'})) {
                   $courseinit_settings{$cid.':courseinit'} = 
                                                     $env{'form.courseinit_page'};
                   $page_control = 'course specific setting';
               }
           }
           if ($page_control) {
       my $lctype = lc(&Apache::loncommon::course_type());
               my $outcome = &Apache::lonnet::put('nohist_whatsnew',
                                              \%courseinit_settings,$udom,$uname);
               if ($outcome eq 'ok') {
                   if ($page_control eq 'global preferences') {
                       $result = &mt("Page displayed after role selection in $lctype now set by <b>user's global preferences</b>.");
                   } else {
                       $result = &mt('Page displayed after role selection in this '.$lctype.' set to <b>[_2]</b>',$lctype,$$initpage{$env{'form.courseinit_page'}});
                   }
               } else {
                   &Apache::lonnet::logthis('Error storing whatsnew courseinit '.
                                            'setting: '.$outcome.' for '.$uname.
                                            ':'.$udom.' in '.$lctype.' '.$cid);
                   if ($page_control eq 'global preferences') {
                       $result = &mt('Unable to set control of page display to [_1]'.
                             ' due to [_2].',
                            '<b>'.$page_control.'</b>',
                            '<tt>'.$outcome.'</tt>.<br />');
                   } else {
                       $result = &mt('Unable to set page display, after role selection, for this '.$lctype.' to <b>[_2]</b> due to <tt>[_3]</tt>.<br />',
                            $$initpage{$env{'form.courseinit_page'}},$outcome);
                   }
               }
           }
       }
       return $result;
   }
   
 sub start_box {  sub start_box {
     my ($r,$tabbg,$show,$heading,$caller) = @_;      my ($r,$show,$heading,$caller,$refpage) = @_;
     my %lt = &Apache::lonlocal::texthash(       my %lt = &Apache::lonlocal::texthash( 
                        chth => 'Change thresholds?',                         chth => 'Change thresholds?',
                        chin => 'Change interval?',                         chin => 'Change interval?',
                          chop => 'Change options?',
     );      );
     my $showhide;      my $showhide;
     if ($$show{$caller}) {      if ($$show{$caller}) {
Line 1285  sub start_box { Line 1522  sub start_box {
     }      }
           
     $r->print('      $r->print('
          <table border="0" cellpadding="0" cellspacing="0" bgcolor="#000000" width="100%">           <table class="LC_nested_outer">
           <tr>            <tr>
            <td>             <th>'.$$heading{$caller}.'</th>
             <table border="0" cellpadding="1" cellspacing="1" bgcolor="#000000" width="100%">             <th class="LC_right_item">'.$showhide.'</th>
               <tr>            </tr>');
                <td bgcolor="'.$tabbg.'">  
                 <table width="100%" border="0" cellspacing="0" cellpadding="0">  
                  <tr>  
                   <td><b>'.$$heading{$caller}.'</b></td>  
                   <td valign="top" align="right">'.$showhide.'</td>  
                  </tr>  
                 </table>  
                </td>  
               </tr>');  
      if (($caller eq 'abovethreshold') && ($$show{$caller})) {       if (($caller eq 'abovethreshold') && ($$show{$caller})) {
          $r->print('           if ($$show{$caller}) {
                $r->print('
               <tr>                <tr>
                 <td bgcolor="'.$tabbg.'" align="right"><a href="/adm/whatsnew?command=chgthreshold"><b><small>'.$lt{'chth'}.'</small></b></a></td>                  <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chgthreshold&refpage='.$refpage.'">'.$lt{'chth'}.'</a></td>
               </tr>');                </tr>');
            }
      } elsif (($caller eq 'versionchanges') && ($$show{$caller})) {       } elsif (($caller eq 'versionchanges') && ($$show{$caller})) {
          $r->print('           if ($$show{$caller}) {
                $r->print('
                 <tr>
                   <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chginterval&refpage='.$refpage.'">'.$lt{'chin'}.'</a></td>
                 </tr>');
            }
        } elsif ($caller eq 'coursediscussion') {
            if ($$show{$caller}) {
                $r->print('
               <tr>                <tr>
                 <td bgcolor="'.$tabbg.'" align="right"><a href="/adm/whatsnew?command=chginterval"><b><small>'.$lt{'chin'}.'</small></b></a></td>                  <td class="LC_subheader" colspan="2"><a href="/adm/whatsnew?command=chgdisc&refpage='.$refpage.'">'.$lt{'chop'}.'</a></td>
               </tr>');                </tr>');
            }
      }       }
      $r->print('      $r->print('
               <tr>                <tr>
                <td bgcolor="#ffffff">                 <td colspan="2">
                 <table cellpadding="2" cellspacing="0" border="0" width="100%">                  <table class="LC_nested">
 ');  ');
     return;      return;
 }  }
Line 1321  sub start_box { Line 1560  sub start_box {
 sub end_box {  sub end_box {
     my ($r) = shift;      my ($r) = shift;
     $r->print('      $r->print('
       </table>  
      </td>  
     </tr>  
    </table>     </table>
   </td>    </td>
  </tr>   </tr>

Removed from v.1.38.2.2  
changed lines
  Added in v.1.69


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

Internal Server Error

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

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

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