Diff for /loncom/interface/lonmsgdisplay.pm between versions 1.92 and 1.181

version 1.92, 2008/08/27 08:57:15 version 1.181, 2015/06/09 21:22:56
Line 110  use Apache::lonfeedback; Line 110  use Apache::lonfeedback;
 use Apache::lonrss();  use Apache::lonrss();
 use Apache::lonselstudent();  use Apache::lonselstudent();
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
 use LONCAPA;  use LONCAPA qw(:DEFAULT :match);
   
 # Querystring component with sorting type  # Querystring component with sorting type
 my $sqs;  my $sqs='';
 my $startdis;  my $startdis='';
   
 # ============================================================ List all folders  # ============================================================ List all folders
   
 sub folderlist {  sub folderlist {
     my ($folder,$msgstatus) = @_;      my ($folder,$msgstatus) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %html_lt = &Apache::lonlocal::texthash(
                 actn => 'Action',                  actn => 'Action',
                 fold => 'Folder',                  fold => 'Folder',
                 show => 'Show',                  show => 'Show',
                 status => 'Message Status',                  status => 'Message Status',
                 go   => 'Go',                  go   => 'Go',
   
       );
       &html_escape(\%html_lt);
       my %js_lt = &Apache::lonlocal::texthash(
                 nnff => 'New Name for Folder',                  nnff => 'New Name for Folder',
                 newn => 'New Name',                  newn => 'New Name',
                 thfm => 'The folder may not be renamed',                  fmnb => 'Folder may not be renamed as it is a folder provided by the system.',
                 fmnb => 'folder may not be renamed as it is a folder provided by the system.',                  asth => 'Requested name already in use for a system-provided or user-defined folder.',
                 asth => 'as this name is already in use for a system-provided or user-defined folder.',  
                 the => 'The',  
                 tnfm => 'The new folder may not be named',  
   
     );      );
       &js_escape(\%js_lt);
   
    # set se lastvisit for the new mail check in the toplevel menu
    &Apache::lonnet::appenv({'user.mailcheck.lastvisit'=>time});
   
     my %actions = &Apache::lonlocal::texthash(      my %actions = &Apache::lonlocal::texthash(
                                 view => 'View Folder',                                  view => 'View Folder',
Line 143  sub folderlist { Line 148  sub folderlist {
     );      );
     $actions{'select_form_order'} = ['view','rename','delete'];      $actions{'select_form_order'} = ['view','rename','delete'];
   
     my %statushash = &get_msgstatus_types();      my %statushash = &Apache::lonlocal::texthash(&get_msgstatus_types());
   
     $statushash{'select_form_order'} = ['','new','read','replied','forwarded'];      $statushash{'select_form_order'} = ['','new','read','replied','forwarded'];
   
Line 170  sub folderlist { Line 175  sub folderlist {
   
     $formhash{'select_form_order'} = ['','critical',@userorder,'sent','trash'];      $formhash{'select_form_order'} = ['','critical',@userorder,'sent','trash'];
     my $output = qq|<script type="text/javascript">      my $output = qq|<script type="text/javascript">
   // <![CDATA[
 function folder_choice(targetform,caller) {  function folder_choice(targetform,caller) {
     var permfolders_keys = new Array('$permlistkeys');      var permfolders_keys = new Array('$permlistkeys');
     var permfolders_vals = new Array('$permlistvals');      var permfolders_vals = new Array('$permlistvals');
Line 178  function folder_choice(targetform,caller Line 184  function folder_choice(targetform,caller
         if (targetform.folderaction.options[targetform.folderaction.selectedIndex].value == 'rename') {          if (targetform.folderaction.options[targetform.folderaction.selectedIndex].value == 'rename') {
             for (var i=0; i<permfolders_keys.length; i++) {              for (var i=0; i<permfolders_keys.length; i++) {
                 if (permfolders_keys[i] == targetform.folder.value) {                  if (permfolders_keys[i] == targetform.folder.value) {
                     alert("$lt{'the'} '"+permfolders_vals[i]+"' $lt{'fmnb'}");                      alert("'"+permfolders_vals[i]+"' -- $js_lt{'fmnb'}");
                     return;                      return;
                 }                  }
             }              }
             var foldername=prompt('$lt{'nnff'}','$lt{'newn'}');              var foldername=prompt('$js_lt{'nnff'}','$js_lt{'newn'}');
             if (foldername) {              if (foldername) {
                 targetform.renamed.value=foldername;                  targetform.renamed.value=foldername;
                 for (var i=0; i<allfolders.length; i++) {                  for (var i=0; i<allfolders.length; i++) {
                     if (allfolders[i] == foldername) {                      if (allfolders[i] == foldername) {
                         alert("$lt{'thfm'} '"+foldername+"' $lt{'asth'}");                          alert("'"+foldername+"' $js_lt{'asth'}");
                         return;                          return;
                     }                      }
                 }                  }
Line 203  function folder_choice(targetform,caller Line 209  function folder_choice(targetform,caller
         if (newname) {          if (newname) {
             for (var i=0; i<allfolders.length; i++) {              for (var i=0; i<allfolders.length; i++) {
                 if (allfolders[i] == newname) {                  if (allfolders[i] == newname) {
                     alert("$lt{'tnfm'} '"+newname+"' $lt{'asth'}");                      alert("'"+newname+"' -- $js_lt{'asth'}");
                     return;                      return;
                 }                  }
             }              }
Line 211  function folder_choice(targetform,caller Line 217  function folder_choice(targetform,caller
         }          }
     }      }
 }  }
   // ]]>
 </script>|;  </script>|;
     my %show = ('select_form_order' => [10,20,50,100,200],      my %show = ('select_form_order' => [10,20,50,100,200],
  map {$_=>$_} (10,20,50,100,200));   map {$_=>$_} (10,20,50,100,200));
   
      
     $output .= '      $output .= '
 <form method="post" action="/adm/email" name="folderlist">  <form method="post" action="/adm/email" name="folderlist">
 <table border="0" cellspacing="2" cellpadding="2">     <div class="LC_columnSection"><fieldset>
  <tr>     <legend>'.&mt('Folder Actions').'</legend>
   <td align="left">     <table border="0" cellspacing="2" cellpadding="8">
    <table border="0" cellspacing="2" cellpadding="2">  
     <tr>      <tr>
      <td align="center"><b>'.$lt{'fold'}.'</b><br />'."\n".       <td><b>'.$html_lt{'fold'}.'</b><br />'."\n".
          &Apache::loncommon::select_form($folder,'folder',%formhash).'           &Apache::loncommon::select_form($folder,'folder',\%formhash).'
      </td>       </td>
      <td align="center"><b>'.$lt{'show'}.'</b><br />'."\n".       <td><b>'.$html_lt{'show'}.'</b><br />'."\n".
          &Apache::loncommon::select_form($env{'form.interdis'},'interdis',           &Apache::loncommon::select_form($env{'form.interdis'},'interdis',
  %show).'   \%show).'
      </td>       </td>
      <td align="center"><b>'.$lt{'status'}.'</b><br />'."\n".       <td><b>'.$html_lt{'status'}.'</b><br />'."\n".
        &Apache::loncommon::select_form($msgstatus,'msgstatus',%statushash).'         &Apache::loncommon::select_form($msgstatus,'msgstatus',\%statushash).'
      </td>       </td>
      <td align="center"><b>'.$lt{'actn'}.'</b><br />'.       <td style="padding-right: 40px;">
          &Apache::loncommon::select_form('view','folderaction',%actions).'           <b>'.$html_lt{'actn'}.'</b><br />'."\n".'
      </td><td><br />'.           <span class="LC_nobreak">'.
     '<input type="button" value="'.$lt{'go'}.'" onClick="javascript:folder_choice(this.form,'."'change'".');" />           &Apache::loncommon::select_form('view','folderaction',\%actions).
            ' <input type="button" value="'.$html_lt{'go'}.
            '" onclick="javascript:folder_choice(this.form,'."'change'".');" />
            </span>
        </td>
        <td style="border-left: 1px solid;padding-left: 40px;">
            <b>'.&mt('New Folder').'</b><br />'."\n".'
            <span class="LC_nobreak">
            <input type="text" size="15" name="newfolder" value="" />
            <input type="button" value="'.$html_lt{'go'}.
            '" onclick="javascript:folder_choice(this.form,'."'new'".');" />
            </span>
      </td>       </td>
     </tr>      </tr>
    </table>     </table>
   </td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>     </fieldset></div>
   <td align="right">  '."\n".
    <table><tr><td><br />  
     <input type="button" value="'.&mt('Make New Folder').  
     '" onClick="javascript:folder_choice(this.form,'."'new'".');" /></td>'.  
     '<td align="center"><b>'.&mt('New Folder').'</b><br />'.  
     '<input type="text" size="15" name="newfolder" value="" />  
     </td></tr></table>  
   </td>  
  </tr>  
 </table>'."\n".  
     '<input type="hidden" name="sortedby" value="'.$env{'form.sortedby'}.'" />'.      '<input type="hidden" name="sortedby" value="'.$env{'form.sortedby'}.'" />'.
     '<input type="hidden" name="renamed" value="" />'.      '<input type="hidden" name="renamed" value="" />'.
         ($folder=~/^critical/?'</form>':'');          ($folder=~/^critical/?'</form>':'');
Line 261  sub get_permanent_folders { Line 268  sub get_permanent_folders {
     my %permfolders =       my %permfolders = 
  &Apache::lonlocal::texthash(''         => 'INBOX',   &Apache::lonlocal::texthash(''         => 'INBOX',
     'trash'    => 'TRASH',      'trash'    => 'TRASH',
     'critical' => 'Critical',      'critical' => 'CRITICAL',
     'sent'     => 'Sent Messages',      'sent'     => 'SENT MESSAGES',
     );      );
     return %permfolders;      return %permfolders;
 }  }
   
 sub get_msgstatus_types {  sub get_msgstatus_types {
     my %statushash = &Apache::lonlocal::texthash(      # Don't translate here!
                                 '' => 'Any',      my %statushash = (
                                 new => 'Unread',          ''          => 'Any',
                                 read => 'Read',          'new'       => 'Unread',
                                 replied => 'Replied to',          'read'      => 'Read',
                                 forwarded => 'Forwarded',          'replied'   => 'Replied to',
           'forwarded' => 'Forwarded',
     );      );
     return %statushash;      return %statushash;
 }  }
Line 286  sub scrollbuttons { Line 294  sub scrollbuttons {
     my %statushash = &get_msgstatus_types();      my %statushash = &get_msgstatus_types();
     my $status;      my $status;
     if ($msgstatus eq '') {      if ($msgstatus eq '') {
         $status = &mt('All');          $status = 'All'; # Don't translate here!
     } else {      } else {
         $status = $statushash{$msgstatus};          $status = $statushash{$msgstatus};
     }      }
     return      my $output = '<b>'.&mt('Page:').'</b> ';
    '<b>'.&mt('Page').'</b>: '.       if ($maxdis == 1) {
    '<input type="submit" name="firstview" value="'.&mt('First').'" />'.          # No buttons if only one page is displayed
    '<input type="submit" name="prevview" value="'.&mt('Previous').'" />'.          $output .= '1/1';
    '<input type="text" size="5" name="startdis" value="'.$start.'" onChange="this.form.submit()" /> of '.$maxdis.      } else {
    '<input type="submit" name="nextview" value="'.&mt('Next').'" />'.          $output .=
    '<input type="submit" name="lastview" value="'.&mt('Last').'" /><br />'.             '<input type="submit" name="firstview" value="|&lt;" />'.
    &mt('<b>[_1] messages</b>: showing messages [_2] through [_3] of [_4].',$status,$first,$finish,$total).'</form>';             '<input type="submit" name="prevview" value="&lt;" />'.
              ' <input type="text" size="5" name="startdis" value="'.$start.'" onchange="this.form.submit()" /> / '.$maxdis.' '.
              '<input type="submit" name="nextview" value="&gt;" />'.
              '<input type="submit" name="lastview" value="&gt;|" />';
       }
       $output .=
           '<p>'
          .'<b>'.&mt($status.' messages:').'</b> '
          .&mt('showing messages [_1] through [_2] of [_3].',
               $first,$finish,$total)
          .'</p>'
          .'</form>';
   
       return $output;
 }  }
 # =============================================================== Status Change  # =============================================================== Status Change
   
Line 353  sub makefolder { Line 374  sub makefolder {
         }          }
     } else {      } else {
         $outcome =           $outcome = 
     &mt('Error - could not obtain lock on email folders record.');      &mt('Error - could not obtain lock on message folders record.');
     }      }
     return ($outcome,$warning);      return ($outcome,$warning);
 }  }
Line 364  sub deletefolder { Line 385  sub deletefolder {
     my ($folder)=@_;      my ($folder)=@_;
     my %permfolders = &get_permanent_folders();      my %permfolders = &get_permanent_folders();
     if (defined($permfolders{$folder})) {      if (defined($permfolders{$folder})) {
         return &mt('The folder "[_1]" may not be deleted',$folder);           return &mt('The folder "[_1]" may not be deleted.',$permfolders{$folder}); 
     }      }
     my %userfolders = &Apache::lonmsg::get_user_folders();      my %userfolders = &Apache::lonmsg::get_user_folders();
     if (!defined($userfolders{$folder})) {      if (!defined($userfolders{$folder})) {
Line 502  sub movemsg { Line 523  sub movemsg {
 # ======================================================= Display a course list  # ======================================================= Display a course list
   
 sub discourse {  sub discourse {
     my $result;      my ($statushash) = @_;
       my ($result,$active,$previous,$future);
       my $crstype = &Apache::loncommon::course_type();
     my ($course_personnel,      my ($course_personnel,
  $current_members,   $current_members,
  $expired_members,   $expired_members,
Line 511  sub discourse { Line 534  sub discourse {
     unshift @$current_members, (@$course_personnel);      unshift @$current_members, (@$course_personnel);
     my %defaultUsers;      my %defaultUsers;
           
     $result .= '<input type="hidden" name="sendmode" value="group" />'."\n";  
   
     my $tmptext;      my $tmptext;
     if ($tmptext = &Apache::lonselstudent::render_student_list($current_members,      if ($tmptext = &Apache::lonselstudent::render_student_list($current_members,
                                                                "compemail",                                                                 "activeusers",
                                                                "current",                                                                 "current",
                                                                \%defaultUsers,                                                                 \%defaultUsers,
                                                                1,"selectedusers",1)                                                                 1,"selectedusers",1,'email')
        ) {         ) {
        $result .= '<h2>'.&mt('Course members with current access').'</h2>';         my $bcc_curr_hdr;
        $result .= $tmptext;         if ($crstype eq 'Community') {
              $bcc_curr_hdr = &mt('Bcc: community participants with current access');
          } else {
              $bcc_curr_hdr = &mt('Bcc: course members with current access');
          }
          $result .= '<fieldset id="LC_activeusers"><legend>'
                    .$bcc_curr_hdr
                    .'</legend>'
                    .'<form name="activeusers" action="">';
          $result .= $tmptext.'</form></fieldset><br />';
          if (ref($statushash) eq 'HASH') {
              $statushash->{'active'} = 1;
          }
     }      }
     if ($tmptext = &Apache::lonselstudent::render_student_list($expired_members,      if ($tmptext = &Apache::lonselstudent::render_student_list($expired_members,
                                                                "compemail",                                                                 "previoususers",
                                                                "expired",                                                                 "expired",
                                                                \%defaultUsers,                                                                 \%defaultUsers,
                                                                1, "selectedusers",0)                                                                 1, "selectedusers",0,'email')
        ) {         ) {
        $result .= '<h2>'.&mt('Course members with expired access').'</h2>';         my $bcc_prev_hdr;
        $result .= $tmptext;         if ($crstype eq 'Community') {
              $bcc_prev_hdr = &mt('Bcc: community participants with expired access');
          } else {
              $bcc_prev_hdr = &mt('Bcc: course members with expired access');
          }
          $result .= '<fieldset id="LC_previoususers"><legend>'
                    .$bcc_prev_hdr
                    .'</legend>'
                    .'<form name="previoususers" action="">';
          $result .= $tmptext.'</form></fieldset><br />';
          if (ref($statushash) eq 'HASH') {
              $statushash->{'previous'} = 1;
          }
   
     }      }
     if ($tmptext = &Apache::lonselstudent::render_student_list($future_members,      if ($tmptext = &Apache::lonselstudent::render_student_list($future_members,
                                                                "compemail",                                                                 "futureusers",
                                                                "future",                                                                 "future",
                                                                \%defaultUsers,                                                                 \%defaultUsers,
                                                                1, "selectedusers", 0)                                                                 1, "selectedusers",0,'email')
        ) {         ) {
        $result .= '<h2>'.&mt('Course members with future access').'</h2>';         my $bcc_future_hdr;
        $result .= $tmptext;         if ($crstype eq 'Community') {
              $bcc_future_hdr = &mt('Bcc: community participants with future access');
          } else {
              $bcc_future_hdr = &mt('Bcc: course members with future access');
          }
   
          $result .= '<fieldset id="LC_futureusers"><legend>'
                    .$bcc_future_hdr
                    .'</legend>'
                    .'<form name="futureusers" action="">';
          $result .= $tmptext.'</form></fieldset>';
          if (ref($statushash) eq 'HASH') {
              $statushash->{'future'} = 1;
          }
   
     }      }
     return $result;      return $result;
 }  }
   
 sub disgroup {  sub disgroup {
     my ($cdom,$cnum,$group,$viewgrps,$editgrps) = @_;      my ($r,$cdom,$cnum,$group,$access_status) = @_;
     my $result;      my $hasfloat;
     #  Needs to be in a course      #  Needs to be in a course
     if (!($env{'request.course.fn'})) {      if (!($env{'request.course.fn'})) {
         $result = &mt('Error: you must have a course role selected to be able to send a broadcast message to a group in the course.');          $r->print('<span class="LC_error">'.&mt('Error: you must have a course role selected to be able to send a broadcast message to a group in the course.').'</span>');
         return $result;          return;
     }      }
     if ($cdom eq '' || $cnum eq '') {      if ($cdom eq '' || $cnum eq '') {
         $result = &mt('Error: could not determine domain or number of course');          $r->print('<span class="LC_error">'.&mt('Error: could not determine domain or number of course').'</span>');
         return $result;          return;
     }      }
     my ($memberinfo,$numitems) =      my ($memberinfo,$numitems) =
                  &Apache::longroup::group_memberlist($cdom,$cnum,$group,{},[]);                   &Apache::longroup::group_memberlist($cdom,$cnum,$group,{},[]);
     my @statustypes = ('active');      my @statustypes = ('active');
       my $viewgrps = &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.
                      ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
       my $editgrps = &Apache::lonnet::allowed('mdg',$env{'request.course.id'}.
                      ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
     if ($viewgrps || $editgrps) {      if ($viewgrps || $editgrps) {
         push(@statustypes,('future','previous'));          push(@statustypes,('future','previous'));
     }      }
     if (keys(%{$memberinfo}) == 0) {      if (keys(%{$memberinfo}) == 0) {
         $result = &mt('As this group has no members, there are no '.          $r->print('<span class="LC_warning">'.
                       'recipients to select.');                    &mt('As this group has no members, there are no recipients to select').
         return $result;                    '</span>');
           return;
     } else {      } else {
         $result = &mt('Select message recipients from the group members listed below.').'<br />';            $hasfloat = 1;
           $r->print('<div class="LC_left_float">');
         my %Sortby = (          my %Sortby = (
                          active   => {},                           active   => {},
                          previous => {},                           previous => {},
Line 577  sub disgroup { Line 643  sub disgroup {
                                      'name'     => 'Name',                                       'name'     => 'Name',
                                      'usnm'     => 'Username',                                       'usnm'     => 'Username',
                                      'doma'     => 'Domain',                                       'doma'     => 'Domain',
                                      'active'   => 'Active Members',                                       'active'   => 'Broadcast to Active Members',
                                      'previous' => 'Former Members',                                       'previous' => 'Broadcast (Bcc) to Former Members',
                                      'future'   => 'Future Members',                                       'future'   => 'Broadcast (Bcc) to Future Members',
                                     );                                      );
         foreach my $user (sort(keys(%{$memberinfo}))) {          foreach my $user (sort(keys(%{$memberinfo}))) {
             my $status = $$memberinfo{$user}{status};              my $status = $$memberinfo{$user}{status};
Line 593  sub disgroup { Line 659  sub disgroup {
                 push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user);                  push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user);
             }              }
         }          }
         $result .= &group_check_uncheck();          $r->print(&group_check_uncheck());
         $result .= '<table border="0" cellspacing="8" cellpadding="2">'.  
                    '<tr>';  
         foreach my $status (@statustypes)  {          foreach my $status (@statustypes)  {
             if (ref($numitems) eq 'HASH') {              if (ref($numitems) eq 'HASH') {
                 if ((defined($$numitems{$status})) && ($$numitems{$status})) {                  if ((defined($$numitems{$status})) && ($$numitems{$status})) {
                     $result.='<td valign="top">'.                      my $formname = $status.'users';
                              '<fieldset><legend><b>'.$lt{$status}.                      if (ref($access_status) eq 'HASH') {
                              '</b></legend><nobr>'.                          $access_status->{$status} = $$numitems{$status};
                              '<input type="button" value="'.&mt('Check All').'" '.                      }
                              'onclick="javascript:toggleAll('."'".$status."','check'".')" />'.                      $r->print('<fieldset>'.
                              '&nbsp;&nbsp;'.                                '<legend>'.$lt{$status}.'</legend>'.
                              '<input type="button" value="'.&mt('Uncheck All').'" '.                                '<form name="'.$formname.'" action="">'.
                              'onclick="javascript:toggleAll('."'".$status."','uncheck'".')" />'.                                '<span class="LC_nobreak">'.
                              '</nobr></fieldset><br />'.                                '<input type="button" value="'.&mt('Check All').'" '.
                              &Apache::loncommon::start_data_table().                                'onclick="javascript:toggleAll('."this.form,'check'".')" />'.
                              &Apache::loncommon::start_data_table_header_row();                                '&nbsp;&nbsp;'.
                     $result .= "<th>$lt{'name'}</a></th>".                                '<input type="button" value="'.&mt('Uncheck All').'" '.
                                "<th>$lt{'usnm'}</a></th>".                                'onclick="javascript:toggleAll('."this.form,'uncheck'".')" />'.
                                "<th>$lt{'doma'}</a></th>".                                '</span>');
                     &Apache::loncommon::end_data_table_header_row();                      if ($status eq 'active') {
                           $r->print(('&nbsp;'x3).'<select name="groupmail">'.
                                    '<option value="bcc" selected="selected">'.&mt('Bcc').'</option>'.
                                    '<option value="cc">'.&mt('Cc').'</option>'.
                                  '</select>');
                       }
                       $r->print('<br />'.&Apache::loncommon::start_data_table().
                                  &Apache::loncommon::start_data_table_header_row().
                                  "<th>$lt{'name'}</th>".
                                  "<th>$lt{'usnm'}</th>".
                                  "<th>$lt{'doma'}</th>".
                                  &Apache::loncommon::end_data_table_header_row());
                     foreach my $key (sort(keys(%{$Sortby{$status}}))) {                      foreach my $key (sort(keys(%{$Sortby{$status}}))) {
                         foreach my $user (@{$Sortby{$status}{$key}}) {                          foreach my $user (@{$Sortby{$status}{$key}}) {
                             $result .=                              $r->print(&Apache::loncommon::start_data_table_row().
                                 &Apache::loncommon::start_data_table_row().                                  '<td><span class="LC_nobreak"><input type="checkbox" '.
                                 '<td><input type="checkbox" '.  
                                 'name="selectedusers_forminput" value="'.                                  'name="selectedusers_forminput" value="'.
                                 $user.':'.$status.'" />'.                                  $user.':'.$status.'" />'.
                                 $$memberinfo{$user}{'fullname'}.'</td>'.                                  $$memberinfo{$user}{'fullname'}.'</span></td>'.
                                 '<td>'.$$memberinfo{$user}{'uname'}.'</td>'.                                  '<td>'.$$memberinfo{$user}{'uname'}.'</td>'.
                                 '<td>'.$$memberinfo{$user}{'udom'}.'</td>'.                                  '<td>'.$$memberinfo{$user}{'udom'}.'</td>'.
                                 &Apache::loncommon::end_data_table_row();                                  &Apache::loncommon::end_data_table_row());
                         }                          }
                     }                      }
                     $result .= &Apache::loncommon::end_data_table();                      $r->print(&Apache::loncommon::end_data_table().'</form>'.
                                 '</fieldset><br />');
                 }                  }
             }              }
             $result .= '</td><td>&nbsp;&nbsp;</td>';  
         }          }
         $result .= '</tr></table>';          $r->print('</div>');
     }      }
     return $result;      return $hasfloat;
 }  }
   
 sub group_check_uncheck {  sub group_check_uncheck {
     my $output = qq|      my $output = qq|
 <script type="text/javascript">  <script type="text/javascript">
 function toggleAll(caller,action) {  // <![CDATA[
     var pattern = new RegExp(":"+caller+"\$");  function toggleAll(form,action) {
     if (typeof(document.compemail.selectedusers_forminput.length)=="undefined") {      if (typeof(form.selectedusers_forminput.length)=="undefined") {
         if (document.compemail.selectedusers_forminput.value.match(pattern)) {           if (action == 'check') {
             if (action == 'check') {              form.selectedusers_forminput.checked = true;
                 document.groupmail.selectedusers_forminput.checked = true;           } else {
             } else {              form.selectedusers_forminput.checked = false;
                 document.groupmail.selectedusers_forminput.checked = false;  
             }  
         }          }
     } else {      } else {
         for (var i=0; i<document.compemail.selectedusers_forminput.length; i++) {          for (var i=0; i<form.selectedusers_forminput.length; i++) {
             if (document.compemail.selectedusers_forminput[i].value.match(pattern)) {              if (action == 'check') {
                 if (action == 'check') {                  form.selectedusers_forminput[i].checked = true;
                     document.compemail.selectedusers_forminput[i].checked = true;              } else {
                 } else {                  form.selectedusers_forminput[i].checked = false;
                     document.compemail.selectedusers_forminput[i].checked = false;  
                 }  
             }              }
         }          }
     }      }
 }  }
   // ]]>
 </script>  </script>
     |;      |;
 }  }
Line 691  sub groupmail_header { Line 762  sub groupmail_header {
     }      }
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     if ($refarg) {      if ($refarg) {
           my $brtitle;
           if (&Apache::loncommon::course_type() eq 'Community') {
               $brtitle = 'View community groups';  
           } else {
               $brtitle = 'View course groups';
           }  
         &Apache::lonhtmlcommon::add_breadcrumb          &Apache::lonhtmlcommon::add_breadcrumb
             ({href=>"/adm/coursegroups",              ({href=>"/adm/coursegroups",
               text=>"Groups",                text=>"Groups",
               title=>"View course groups"});                title=>$brtitle});
     }      }
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"/adm/$cdom/$cnum/$group/smppg?$refarg",          ({href=>"/adm/$cdom/$cnum/$group/smppg?$refarg",
Line 703  sub groupmail_header { Line 780  sub groupmail_header {
          {href=>"/adm/email?compose=group&amp;group=".           {href=>"/adm/email?compose=group&amp;group=".
                 "$env{'form.group'}&amp;$refarg",                  "$env{'form.group'}&amp;$refarg",
           text=>"Send a Message in a Group",            text=>"Send a Message in a Group",
           title=>"Compose Group Email Message"},);            title=>"Compose Group Message"},);
     if ($action eq 'sending') {      if ($action eq 'sending') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
                          ({text=>"Messages being sent.",                           ({text=>"Messages being sent.",
                            title=>"Messages sent"},);                             title=>"E-mails sent"},);
     }      }
     my $groupheader = &Apache::loncommon::start_page('Group Email');      my $groupheader = &Apache::loncommon::start_page('Group Message');
     $groupheader .= &Apache::lonhtmlcommon::breadcrumbs      $groupheader .= &Apache::lonhtmlcommon::breadcrumbs
                 ('Group - '.$env{'form.group'}.' Email');                  ('Group - '.$env{'form.group'}.' Email');
     return $groupheader;      return $groupheader;
Line 723  sub groupmail_sent { Line 800  sub groupmail_sent {
     }      }
     my $output .= '<br /><br /><a href="/adm/email?compose=group&amp;group='.      my $output .= '<br /><br /><a href="/adm/email?compose=group&amp;group='.
                   $group.'&amp;'.$refarg.'">'.                    $group.'&amp;'.$refarg.'">'.
                   &mt('Send another group email').'</a>'.'&nbsp;&nbsp;&nbsp;'.                    &mt('Send another group message').'</a>'.'&nbsp;&nbsp;&nbsp;'.
                   '<a href="/adm/'.$cdom.'/'.$cnum.'/'.$group.'/smppg?'.                    '<a href="/adm/'.$cdom.'/'.$cnum.'/'.$group.'/smppg?'.
                   $refarg.'">'. &mt('Return to group page').'</a>';                    $refarg.'">'. &mt('Return to group page').'</a>';
     return $output;      return $output;
Line 737  sub discrit { Line 814  sub discrit {
                 .'<div class="LC_warning">'                  .'<div class="LC_warning">'
                 .&mt('Access to other pages will be prevented until you have moved all critical messages to your inbox.')                  .&mt('Access to other pages will be prevented until you have moved all critical messages to your inbox.')
                 .'</div><br />'                  .'</div><br />'
                 .'<form action="/adm/email" method="POST">'                  .'<form action="/adm/email" method="post">'
                 .'<input type="hidden" name="confirm" value="true" />';                  .'<input type="hidden" name="confirm" value="true" />';
     my %what=&Apache::lonnet::dump('critical');      my %what=&Apache::lonnet::dump('critical');
     my $result = '';      my $result = '';
     foreach my $key (sort(keys(%what))) {      # Sort by date in descending order
       foreach my $key (sort{$b <=> $a}(keys(%what))) {    
         my %content=&Apache::lonmsg::unpackagemsg($what{$key});          my %content=&Apache::lonmsg::unpackagemsg($what{$key});
         next if ($content{'senderdomain'} eq '');          next if ($content{'senderdomain'} eq '');
           my $description;
           if ($content{'courseid'} ne '') {
               if ($content{'courseid'} =~ m{/^$match_domain\_$match_courseid$}) {
                   my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'},{'one_time' => 1});
                   if ($courseinfo{'description'} ne '') {
                       $description = $courseinfo{'description'};
                   }
               }
           }
         $result .= &Apache::lonhtmlcommon::start_pick_box()          $result .= &Apache::lonhtmlcommon::start_pick_box()
                   .&Apache::lonhtmlcommon::row_title(&mt('From'),undef,'LC_oddrow_value')                    .&Apache::lonhtmlcommon::row_title(&mt('From'),undef,'LC_oddrow_value')
                   .'<b>'.&Apache::loncommon::aboutmewrapper(                    .'<b>'.&Apache::loncommon::aboutmewrapper(
Line 755  sub discrit { Line 842  sub discrit {
                   .&Apache::lonhtmlcommon::row_closure(1)                    .&Apache::lonhtmlcommon::row_closure(1)
                   .&Apache::lonhtmlcommon::row_title(&mt('Subject'),undef,'LC_oddrow_value')                    .&Apache::lonhtmlcommon::row_title(&mt('Subject'),undef,'LC_oddrow_value')
                   .$content{'subject'}                    .$content{'subject'}
                   .&Apache::lonhtmlcommon::row_closure(1)                    .&Apache::lonhtmlcommon::row_closure(1);
                   .&Apache::lonhtmlcommon::row_title(&mt('Message'),undef,'LC_evenrow_value')          if ($description ne '') {
               $result .= &Apache::lonhtmlcommon::row_title(&mt('Course'),undef,'LC_oddrow_value')
                         .$description
                         .&Apache::lonhtmlcommon::row_closure(1);
           }
           $result .= &Apache::lonhtmlcommon::row_title(&mt('Message'),undef,'LC_evenrow_value')
                   .'<pre>'.&Apache::lontexconvert::msgtexconverted($content{'message'}).'</pre>'                    .'<pre>'.&Apache::lontexconvert::msgtexconverted($content{'message'}).'</pre>'
                   .&Apache::lonhtmlcommon::row_closure()                    .&Apache::lonhtmlcommon::row_closure()
                   .&Apache::lonhtmlcommon::row_title('',undef,'LC_oddrow_value')                    .&Apache::lonhtmlcommon::row_title('',undef,'LC_oddrow_value')
Line 789  sub discrit { Line 881  sub discrit {
     }      }
     # Check to see if there were any messages.      # Check to see if there were any messages.
     if ($result eq '') {      if ($result eq '') {
         $result = "<h2>".&mt('You have no critical messages.')."</h2>".          $result =
     '<a href="/adm/roles">'.&mt('Select a course').'</a><br />'.              '<p class="LC_info">'.
             '<a href="/adm/email">'.&mt('Communicate').'</a>';              &mt('You have no critical messages.').
               '</p>'.
               &Apache::lonhtmlcommon::actionbox(
                   ['<a href="/adm/roles">'.&mt('Select a course').'</a>',
                    '<a href="/adm/email">'.&mt('Communicate').'</a>']);
     } else {      } else {
         $r->print($header);          $r->print($header);
     }      }
Line 816  sub sortedmessages { Line 912  sub sortedmessages {
     }      }
   
     foreach my $msgid (@messages) {      foreach my $msgid (@messages) {
           next if ($msgid eq '');
  my $esc_msgid=&escape($msgid);   my $esc_msgid=&escape($msgid);
  my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid,$processid,$symb,$error) =   my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid,$processid,$symb,$error) =
     &Apache::lonmsg::unpackmsgid($esc_msgid,$folder,undef,      &Apache::lonmsg::unpackmsgid($esc_msgid,$folder,undef,
Line 907  sub get_course_desc { Line 1004  sub get_course_desc {
             if (defined($env{'course.'.$fromcid.'.description'})) {              if (defined($env{'course.'.$fromcid.'.description'})) {
                 $description = $env{'course.'.$fromcid.'.description'};                  $description = $env{'course.'.$fromcid.'.description'};
             } else {              } else {
                 my %courseinfo=&Apache::lonnet::coursedescription($fromcid);                  if ($fromcid =~ m{/^$match_domain\_$match_courseid$}) {
                 $description = $courseinfo{'description'};                      my %courseinfo=&Apache::lonnet::coursedescription($fromcid,
                                                                         {'one_time' => 1});
                       $description = $courseinfo{'description'};
                   }
               }
               if ($description ne '') {
                   $$descriptions{$fromcid} = $description;
             }              }
             $$descriptions{$fromcid} = $description;  
         }          }
         return $description;          return $description;
     }      }
Line 927  sub disall { Line 1029  sub disall {
     &Apache::loncommon::store_settings('user','mail',\%saveable);      &Apache::loncommon::store_settings('user','mail',\%saveable);
     &Apache::loncommon::restore_settings('user','mail',\%saveable);      &Apache::loncommon::restore_settings('user','mail',\%saveable);
     $folder    ||= $env{'form.folder'};      $folder    ||= $env{'form.folder'};
       # Always show critical messages if present
       my @what=&Apache::lonnet::dump('critical',$env{'user.domain'},$env{'user.name'});
       if ($what[0]) {
    if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) {
               $folder = 'critical';
           }
       }
     $msgstatus ||= $env{'form.msgstatus'};      $msgstatus ||= $env{'form.msgstatus'};
     $env{'form.interdis'} ||= 20;      $env{'form.interdis'} ||= 20;
   
Line 947  sub disfolder { Line 1056  sub disfolder {
     my %setters = ();      my %setters = ();
     my $numblocked = 0;      my $numblocked = 0;
     my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');      my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');
     my %lt = &Apache::lonlocal::texthash(      my %js_lt = &Apache::lonlocal::texthash(
                       sede => 'Select a destination folder to which the messages will be moved.',                        sede => 'Select a destination folder to which the messages will be moved.',
                       nome => 'No messages have been selected to apply ths action to.',                        nome => 'No messages have been selected to apply this action to.',
                       chec => 'Check the checkbox for at least one message.',                          chec => 'Check the checkbox for at least one message.',  
     );      );
       &js_escape(\%js_lt);
     my $jscript = &Apache::loncommon::check_uncheck_jscript();      my $jscript = &Apache::loncommon::check_uncheck_jscript();
     $r->print(<<ENDDISHEADER);      $r->print(<<ENDDISHEADER);
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
     $jscript      $jscript
   
     function validate_checkedaction() {      function validate_checkedaction() {
         document.disall.markedaction.value = document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value;          document.disall.markedaction.value = document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value;
         if (document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value == 'markedmove') {          if (document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value == 'markedmove') {
             if (document.disall.movetofolder.options[document.disall.movetofolder.selectedIndex].value == "") {              if (document.disall.movetofolder.options[document.disall.movetofolder.selectedIndex].value == "") {
                 alert("$lt{'sede'}");                  alert("$js_lt{'sede'}");
                 return;                  return;
             }               } 
         }          }
Line 978  sub disfolder { Line 1089  sub disfolder {
             }              }
         }             }   
         if (checktotal == 0) {          if (checktotal == 0) {
             alert("$lt{'nome'}\\n$lt{'chec'}");              alert("$js_lt{'nome'}\\n$js_lt{'chec'}");
             return;              return;
         }          }
         document.disall.submit();          document.disall.submit();
     }      }
   // ]]>
 </script>  </script>
 ENDDISHEADER  ENDDISHEADER
   
     my $fsqs='&folder='.$folder;      my $fsqs='&amp;folder='.$folder;
     my @temp=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus);      my @temp=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus);
     my $totalnumber=$#temp+1;      my $totalnumber=$#temp+1;
     if ($totalnumber < 1) {      if ($totalnumber < 1) {
           $r->print('<p class="LC_info">');
         if ($msgstatus eq '') {          if ($msgstatus eq '') {
     $r->print('<h2>'.&mt('Empty Folder').'</h2>');              $r->print(&mt('There are no messages in this folder.'));
         } elsif ($msgstatus eq 'replied') {          } elsif ($msgstatus eq 'replied') {
             $r->print('<h2>'.&mt('You have not replied to any messages in this folder.').'</h2>');              $r->print(&mt('You have not replied to any messages in this folder.'));
         } else {           } else {
             $r->print('<h2>'.&mt('There are no '.lc($statushash{$msgstatus}).' messages in this folder.').'</h2>');              $r->print(&mt('There are no '.lc($statushash{$msgstatus}).' messages in this folder.'));
         }          }
           $r->print('</p>');
         if ($numblocked > 0) {          if ($numblocked > 0) {
             $r->print(&blocked_in_folder($numblocked,$startblock,$endblock,              $r->print(&blocked_in_folder($numblocked,$startblock,$endblock,
                                          \%setters));                                           \%setters));
         }          }
  return;          return;
     }      }
     my $interdis = $env{'form.interdis'};      my $interdis = $env{'form.interdis'};
     my $number=int($totalnumber/$interdis);      my $number=int($totalnumber/$interdis);
Line 1017  ENDDISHEADER Line 1130  ENDDISHEADER
     if ($lastdis>$#temp) { $lastdis=$#temp; }      if ($lastdis>$#temp) { $lastdis=$#temp; }
     $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber,$msgstatus));      $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber,$msgstatus));
     $r->print('<form method="post" name="disall" action="/adm/email">'.      $r->print('<form method="post" name="disall" action="/adm/email">'.
       '<table class="LC_mail_list"><tr><th colspan="1">&nbsp;</th><th>');        &Apache::loncommon::start_data_table().
             &Apache::loncommon::start_data_table_row().
             '<th colspan="1">&nbsp;</th><th>');
     if ($env{'form.sortedby'} eq "revdate") {      if ($env{'form.sortedby'} eq "revdate") {
  $r->print('<a href = "?sortedby=date'.$fsqs.'">'.&mt('Date').'</a></th>');   $r->print('<a href = "/adm/email?sortedby=date'.$fsqs.'">'.&mt('Date').'</a></th>');
     } else {      } else {
  $r->print('<a href = "?sortedby=revdate'.$fsqs.'">'.&mt('Date').'</a></th>');   $r->print('<a href = "/adm/email?sortedby=revdate'.$fsqs.'">'.&mt('Date').'</a></th>');
     }      }
     $r->print('<th>');      $r->print('<th>');
     if ($env{'form.sortedby'} eq "revuser") {      if ($env{'form.sortedby'} eq "revuser") {
  $r->print('<a href = "?sortedby=user'.$fsqs.'">'.&mt('Username').'</a>');   $r->print('<a href = "/adm/email?sortedby=user'.$fsqs.'">'.&mt('Username').'</a>');
     } else {      } else {
  $r->print('<a href = "?sortedby=revuser'.$fsqs.'">'.&mt('Username').'</a>');   $r->print('<a href = "/adm/email?sortedby=revuser'.$fsqs.'">'.&mt('Username').'</a>');
     }      }
     $r->print('</th><th>');      $r->print('</th><th>');
     if ($env{'form.sortedby'} eq "revdomain") {      if ($env{'form.sortedby'} eq "revdomain") {
  $r->print('<a href = "?sortedby=domain'.$fsqs.'">'.&mt('Domain').'</a>');   $r->print('<a href = "/adm/email?sortedby=domain'.$fsqs.'">'.&mt('Domain').'</a>');
     } else {      } else {
  $r->print('<a href = "?sortedby=revdomain'.$fsqs.'">'.&mt('Domain').'</a>');   $r->print('<a href = "/adm/email?sortedby=revdomain'.$fsqs.'">'.&mt('Domain').'</a>');
     }      }
     $r->print('</th><th>');      $r->print('</th><th>');
     if ($env{'form.sortedby'} eq "revsubject") {      if ($env{'form.sortedby'} eq "revsubject") {
  $r->print('<a href = "?sortedby=subject'.$fsqs.'">'.&mt('Subject').'</a>');   $r->print('<a href = "/adm/email?sortedby=subject'.$fsqs.'">'.&mt('Subject').'</a>');
     } else {      } else {
     $r->print('<a href = "?sortedby=revsubject'.$fsqs.'">'.&mt('Subject').'</a>');      $r->print('<a href = "/adm/email?sortedby=revsubject'.$fsqs.'">'.&mt('Subject').'</a>');
     }      }
     $r->print('</th><th>');      $r->print('</th><th>');
     if ($env{'form.sortedby'} eq "revcourse") {      if ($env{'form.sortedby'} eq "revcourse") {
         $r->print('<a href = "?sortedby=course'.$fsqs.'">'.&mt('Course').'</a>');          $r->print('<a href = "/adm/email?sortedby=course'.$fsqs.'">'.&mt('Course').'</a>');
     } else {      } else {
         $r->print('<a href = "?sortedby=revcourse'.$fsqs.'">'.&mt('Course').'</a>');          $r->print('<a href = "/adm/email?sortedby=revcourse'.$fsqs.'">'.&mt('Course').'</a>');
     }      }
     $r->print('</th><th>');      $r->print('</th><th colspan="2">');
     if ($env{'form.sortedby'} eq "revstatus") {      if ($env{'form.sortedby'} eq "revstatus") {
  $r->print('<a href = "?sortedby=status'.$fsqs.'">'.&mt('Status').'</a></th>');   $r->print('<a href = "/adm/email?sortedby=status'.$fsqs.'">'.&mt('Status').'</a></th>');
     } else {      } else {
       $r->print('<a href = "?sortedby=revstatus'.$fsqs.'">'.&mt('Status').'</a></th>');        $r->print('<a href = "/adm/email?sortedby=revstatus'.$fsqs.'">'.&mt('Status').'</a></th>');
     }      }
     $r->print("</tr>\n");      $r->print("</tr>\n");
   
     my $suffix = &Apache::lonmsg::foldersuffix($folder);      my $suffix = &Apache::lonmsg::foldersuffix($folder);
       my $count = $firstdis;
     for (my $n=$firstdis;$n<=$lastdis;$n++) {      for (my $n=$firstdis;$n<=$lastdis;$n++) {
  my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID,   my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID,
     $description,$recv_name,$recv_domain)=       $description,$recv_name,$recv_domain)= 
  @{$temp[$n]};   @{$temp[$n]};
  if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) {          if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) {
     if ($status eq 'new') {              my $class_msgstatus = '';
  $r->print('<tr class="LC_mail_new">');              $count ++;
     } elsif ($status eq 'read') {              if ($status eq 'new') {
  $r->print('<tr class="LC_mail_read">');                  $class_msgstatus = 'LC_mail_new';
     } elsif ($status eq 'replied') {              } elsif ($status eq 'read') {
  $r->print('<tr class="LC_mail_replied">');                   $class_msgstatus = 'LC_mail_read';
     } else {              } elsif ($status eq 'replied') {
  $r->print('<tr class="LC_mail_other">');                  $class_msgstatus = 'LC_mail_replied'; 
     }              } else {
                   $class_msgstatus = 'LC_mail_other';
               }
               $r->print(&Apache::loncommon::start_data_table_row($class_msgstatus));
     my ($dis_name,$dis_domain) = ($fromname,$fromdomain);      my ($dis_name,$dis_domain) = ($fromname,$fromdomain);
     if ($folder eq 'sent') {      if ($folder eq 'sent') {
                 if (defined($recv_name) && defined($recv_domain)) {                  if (defined($recv_name) && defined($recv_domain)) {
Line 1092  ENDDISHEADER Line 1211  ENDDISHEADER
  }   }
     }      }
             my $localsenttime = &Apache::lonlocal::locallocaltime($sendtime);              my $localsenttime = &Apache::lonlocal::locallocaltime($sendtime);
             my $count = $n +1;      $r->print('<td align="right"><span class="LC_nobreak">'.(($status eq 'new')?'<b>':'').
     $r->print('<td align="right"><nobr>'.(($status eq 'new')?'<b>':'').  
                       $count.'.'.(($status eq 'new')?'</b>':'').'&nbsp;'.                        $count.'.'.(($status eq 'new')?'</b>':'').'&nbsp;'.
                       '<input type="checkbox" name="delmark"'.                         '<input type="checkbox" name="delmark"'. 
                       ' value="'.$origID.'" /></nobr></td>');                        ' value="'.$origID.'" /></span></td>');
             foreach my $item ($localsenttime,$dis_name,$dis_domain,$shortsubj) {              foreach my $item ($localsenttime,$dis_name,$dis_domain,$shortsubj) {
                 $r->print('<td>'.(($status eq 'new')?'<b>':'').                  $r->print('<td>'.(($status eq 'new')?'<b>':'').
                           '<a href="/adm/email?display='.$origID.$sqs.'">'.                            '<a href="/adm/email?display='.$origID.$sqs.'">'.
                           $item.(($status eq 'new')?'</b>':'').'</td>');                            $item.'</a>'.(($status eq 'new')?'</b>':'').'</td>');
             }              }
               # Description and Status
             my $showstatus;              my $showstatus;
             my %statushash = &get_msgstatus_types();              my %statushash = &get_msgstatus_types();
             if ($status eq '') {              if ($status eq '') {
Line 1109  ENDDISHEADER Line 1228  ENDDISHEADER
             } else {              } else {
                 $showstatus = $statushash{$status};                  $showstatus = $statushash{$status};
             }              }
     $r->print('<td>'.(($status eq 'new')?'<b>':'').$description.              $r->print('<td>'.(($status eq 'new')?'<b>':'').$description.
                       (($status eq 'new')?'</b>':'').'</td><td>'.                        (($status eq 'new')?'</b>':'').
                       (($status eq 'new')?'<b>':'').$showstatus.                        '</td>');
                       (($status eq 'new')?'</b>':'').'</td></tr>'."\n");              $r->print('<td class="'.$class_msgstatus.'">&nbsp;&nbsp;</td>'.
  } elsif ($status eq 'deleted') {                        '<td>'.
                         (($status eq 'new')?'<b>':'').&mt($showstatus).
                         (($status eq 'new')?'</b>':'').
                         '</td>');
   
               $r->print(&Apache::loncommon::end_data_table_row());
   
           } elsif ($status eq 'deleted') {
 # purge  # purge
     my ($result,$msg) =               my ($result,$msg) = 
  &movemsg(&unescape($origID),$folder,'trash');          &movemsg(&unescape($origID),$folder,'trash');
               }
  }  
     }         }   
     $r->print("</table>\n");      $r->print(&Apache::loncommon::end_data_table());
     $r->print('<table border="0" cellspacing="2" cellpadding="2">  
   
       # Bottom Functions
       $r->print('
   <div class="LC_columnSection"><fieldset>
   <legend>'.&mt('Message Actions').'</legend>
   <table border="0" cellspacing="2" cellpadding="8">
  <tr>   <tr>
   <td>'.    <td><b>'.&mt('Select Messages').'</b><br />
   '<input type="button" onclick="javascript:checkAll(document.disall.delmark)" value="'.&mt('Check All').'" /><br />'."\n".     <span class="LC_nobreak">
   '<input type="button" onclick="javascript:uncheckAll(document.disall.delmark)" value="'.&mt('Uncheck All').'" />'."\n".     <input type="button" onclick="javascript:checkAll(document.disall.delmark)" value="'.&mt('Check All').'" />'."\n".
   '<input type="hidden" name="sortedby" value="'.$env{'form.sortedby'}.'" /></td><td>&nbsp;</td>'."\n".    ' <input type="button" onclick="javascript:uncheckAll(document.disall.delmark)" value="'.&mt('Uncheck All').'" />'."\n".
   '<td align="center"><b>'.&mt('Action').'</b><br />'."\n".    '<input type="hidden" name="sortedby" value="'.$env{'form.sortedby'}.'" />
     </span>
     </td>'."\n".
     '<td><b>'.&mt('Action').'</b><br />'."\n".
   '  <select name="checkedaction">'."\n");    '  <select name="checkedaction">'."\n");
   
     if ($folder ne 'trash') {      if ($folder ne 'trash') {
         $r->print('    <option value="markeddel">'.&mt('Delete').'</option>'."\n");          $r->print('    <option value="markeddel">'.&mt('Delete').'</option>'."\n");
     }      }
     if ($msgstatus ne 'read') {      if ($msgstatus ne 'read') {
         $r->print('    <option value="markedread">'.&mt('Mark Read').'</option>."\n"');          $r->print('    <option value="markedread">'.&mt('Mark Read').'</option>'."\n");
     }      }
     if ($msgstatus ne 'unread') {      if ($msgstatus ne 'unread') {
         $r->print('    <option value="markedunread">'.&mt('Mark Unread').'</option>'."\n");          $r->print('    <option value="markedunread">'.&mt('Mark Unread').'</option>'."\n");
Line 1149  ENDDISHEADER Line 1283  ENDDISHEADER
     $r->print("\n".'</select></td>'."\n");      $r->print("\n".'</select></td>'."\n");
   
     if (keys(%gotfolders) > 0) {      if (keys(%gotfolders) > 0) {
         $r->print('<td align="center"><b>'.&mt('Destination folder').'<b><br />');          $r->print('<td><b>'.&mt('Destination folder').'</b><br />');
  my %userfolders;   my %userfolders;
         foreach my $key (keys(%gotfolders)) {          foreach my $key (keys(%gotfolders)) {
             $userfolders{$key} = $key;              $userfolders{$key} = $key;
         }          }
         $userfolders{''} = "";          $userfolders{''} = "";
         $r->print(&Apache::loncommon::select_form('','movetofolder',%userfolders).          $r->print(&Apache::loncommon::select_form('','movetofolder',\%userfolders).
                   '</td>');                    '</td>');
     }      }
     $r->print('<td>&nbsp;</td><td>&nbsp;&nbsp;'.      $r->print('<td style="vertical-align:bottom;">'.
               '<input type="button" name="go" value="'.&mt('Go').                '<input type="button" name="go" value="'.&mt('Go').
               '" onclick="javascript:validate_checkedaction()"/></td>'."\n".                '" onclick="javascript:validate_checkedaction()"/></td>'."\n".
               '</tr></table>');                '</tr></table>'."\n".
                 '</fieldset></div>'."\n"
       );
     my $postedstartdis=$startdis+1;      my $postedstartdis=$startdis+1;
     $r->print('<input type="hidden" name="folder" value="'.$folder.'" /><input type="hidden" name="startdis" value="'.$postedstartdis.'" /><input type="hidden" name="interdis" value="'.$env{'form.interdis'}.'" /><input type="hidden" name="msgstatus" value="'.$msgstatus.'" ><input type="hidden" name="markedaction" value="" /></form>');      $r->print('<input type="hidden" name="folder" value="'.$folder.'" /><input type="hidden" name="startdis" value="'.$postedstartdis.'" /><input type="hidden" name="interdis" value="'.$env{'form.interdis'}.'" /><input type="hidden" name="msgstatus" value="'.$msgstatus.'" /><input type="hidden" name="markedaction" value="" /></form>');
     if ($numblocked > 0) {      if ($numblocked > 0) {
         $r->print(&blocked_in_folder($numblocked,$startblock,$endblock,          $r->print(&blocked_in_folder($numblocked,$startblock,$endblock,
                                      \%setters));                                       \%setters));
Line 1176  sub blocked_in_folder { Line 1312  sub blocked_in_folder {
     my $finishblock = &Apache::lonlocal::locallocaltime($endblock);      my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
     my $output = '<br /><br />'.      my $output = '<br /><br />'.
                   &mt('[quant,_1,message is, messages are] not viewable because display of LON-CAPA messages sent to you by other students between [_2] and [_3] is currently being blocked because of online exams.',$numblocked,$beginblock,$finishblock);                    &mt('[quant,_1,message is, messages are] not viewable because display of LON-CAPA messages sent to you by other students between [_2] and [_3] is currently being blocked because of online exams.',$numblocked,$beginblock,$finishblock);
     $output .= &Apache::loncommon::build_block_table($startblock,$endblock,      #$output .= &Apache::loncommon::build_block_table($startblock,$endblock,
                                                      $setters);      #                                                 $setters);
       
       my ($blocked, $blocktext) = &Apache::loncommon::blocking_status("com");
       $output .="<br /><br />".$blocktext;
   
     return $output;      return $output;
 }  }
   
Line 1222  sub compout { Line 1362  sub compout {
         &printheader($r,'/adm/email?compose=multiforward',          &printheader($r,'/adm/email?compose=multiforward',
              'Forwarding Multiple Messages');               'Forwarding Multiple Messages');
         if ($multiforward > 1) {          if ($multiforward > 1) {
             $r->print(&mt('Each of the <b>[quant,_1,message]</b> you checked'              $r->print(&mt('Each of the[_1] [quant,_2,message] [_3]you checked'
                          .' will be forwarded to the recipient(s) you select below.',$multiforward)                           .' will be forwarded to the recipient(s) you select below.'
                            ,'<b>',$multiforward,'</b>')
                     .'<br />');                      .'<br />');
         } else {          } else {
             $r->print(&mt('The message you checked will be forwarded to the recipient(s) you select below.').'<br />');              $r->print(&mt('The message you checked will be forwarded to the recipient(s) you select below.').'<br />');
Line 1239  sub compout { Line 1380  sub compout {
     my $dismsg='';      my $dismsg='';
     my $disbase='';      my $disbase='';
     my $attachrow;      my $attachrow;
     my $func=&mt('Send New');      my $func1='Send'; # do not translate here!
       my %func2=( # do not translate here!
                  'ma'  => 'Message',
                  'msg' => 'Messages',
                 );
     my %lt=&Apache::lonlocal::texthash('us'  => 'Username',      my %lt=&Apache::lonlocal::texthash('us'  => 'Username',
        'do'  => 'Domain',         'do'  => 'Domain',
        'ad'  => 'Additional Recipients',         'ad'  => 'Additional Recipients',
Line 1247  sub compout { Line 1392  sub compout {
                                        'ar'  => 'Allow replies',                                         'ar'  => 'Allow replies',
        'sb'  => 'Subject',         'sb'  => 'Subject',
        'ca'  => 'Cancel',         'ca'  => 'Cancel',
        'ma'  => 'Mail',  
                                        'msg' => 'Messages',  
                                        'gen' => 'Generate messages from a file',                                         'gen' => 'Generate messages from a file',
                                        'gmt' => 'General message text',                                         'gmt' => 'General message text',
                                        'tff' => 'The file format for the uploaded portion of the message is',                                         'tff' => 'The file format for the uploaded portion of the message is',
                                        'uas' => 'Upload and Send',                                         'uas' => 'Upload and Send',
                                        'atta' => 'Attachment',                                         'atta' => 'Attachment',
                                          'to'   => 'To:',
                                       );                                        );
     my %attachmax = (      my %attachmax = (
                      text => '(128 KB max size)',                       text => &mt('(128 KB max size)'),
                      num  => 131072,                       num  => 131072,
                     );                      );
     if (!$forwarding && !$multiforward) {      if (!$forwarding && !$multiforward) {
         $attachrow = '<br />'.$lt{'atta'}.' '.$attachmax{'text'}.': <input type="file" name="attachment" />';          $attachrow = '<tr><td colspan="3"><b>'.$lt{'atta'}.'</b> '.$attachmax{'text'}.': <input type="file" name="attachment" /></td></tr>';
     }      }
     if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})      if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
  || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.   || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
     '/'.$env{'request.course.sec'})) {      '/'.$env{'request.course.sec'})) {
            my $crstype = &Apache::loncommon::course_type();
  my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message");   my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message");
            my $rsstxt;
            if (&Apache::loncommon::course_type() eq 'Community') {
                $rsstxt = &mt('Include in community RSS newsfeed');
            } else {
                $rsstxt = &mt('Include in course RSS newsfeed');
            }
          $dispcrit=           $dispcrit=
  '<p><label><input type="checkbox" name="critmsg" /> '.&mt('Send as critical message').'</label> ' . $crithelp .    '<span class="LC_nobreak"><label><input type="checkbox" name="critmsg" /> '.&mt('Send as critical message').'.</label>'.$crithelp.'&nbsp;&nbsp;'.&mt('Require return receipt?').'<label><input type="radio" name="sendbck" value="1" />'.&mt('Yes').'</label>&nbsp;&nbsp;<label><input type="radio" name="sendbck" value="" checked="checked" />'.&mt('No').'</label></span><br />'.
  '</p><p>'.   '<label><input type="checkbox" name="permanent" /> '.
  '<label><input type="checkbox" name="sendbck" /> '.&mt('Send as critical message').'  ' .  &mt('Send copy to permanent e-mail address (if known)').'</label><br />'.
  &mt('and return receipt') . '</label>' . $crithelp .   '<label><input type="checkbox" name="rsspost" /> '.
  '</p><p><label><input type="checkbox" name="permanent" /> '.    $rsstxt.'</label><br />';
 &mt('Send copy to permanent email address (if known)').'</label></p>'.  
 '<p><label><input type="checkbox" name="rsspost" /> '.  
   &mt('Include in course RSS newsfeed').'</label></p>';  
     }      }
     if ($broadcast ne 'group') {      if ($broadcast ne 'group') {
         if (&Apache::lonnet::allowed('dff',$env{'request.course.id'}) ||          if (&Apache::lonnet::allowed('dff',$env{'request.course.id'}) ||
             &Apache::lonnet::allowed('dff',$env{'request.course.id'}.              &Apache::lonnet::allowed('dff',$env{'request.course.id'}.
                                      '/'.$env{'request.course.sec'})) {                                       '/'.$env{'request.course.sec'})) {
   
             $dispcrit.='<p><label>'.              my $rectxt;
               if (&Apache::loncommon::course_type() eq 'Community') {
                   $rectxt = &mt("Include in community's 'User records' for recipient(s)");
               } else {
                   $rectxt = &mt("Include in course's 'User records' for recipient(s)");
               }
   
               $dispcrit.='<label>'.
                        '<input type="checkbox" name="courserecord" value="1" /> '.                         '<input type="checkbox" name="courserecord" value="1" /> '.
                        &mt("Include in course's 'User records' for recipient(s)").                         $rectxt.
                        '</label></p>';                         '</label><br />';
         }          }
     }      }
   
     my %message;      my %message;
     my %content;      my %content;
       my ($hasfloat,$broadcast_js,$sendmode,$can_grp_broadcast);
     my $defdom=$env{'user.domain'};      my $defdom=$env{'user.domain'};
       if ($broadcast eq 'group') {
           my %access_status = (
                              active => 0,
                              previous => 0,
                              future => 0,
                         );
    
           if ($group eq '') {
               my $studentsel = &discourse(\%access_status);
               if ($studentsel) {
                   $r->print('<div class="LC_left_float">'.$studentsel.'</div>');
                   $hasfloat = 1;
               }
           } else {
               $can_grp_broadcast = &check_group_priv($group);
               if ($can_grp_broadcast) {
                   $hasfloat = &disgroup($r,$cdom,$cnum,$group,\%access_status);
               }
           }
           if ($hasfloat) {
               $sendmode = '<input type="hidden" name="sendmode" value="group" />'."\n";
               $broadcast_js = qq|
   <script type="text/javascript">
   // <![CDATA[
   function courseRecipients() {
   |;
           foreach my $type (keys(%access_status)) {
               if ($access_status{$type}) {
                   my $formname = $type.'users';
                   if ($type eq 'active' && $group ne '') {
                       $broadcast_js .= qq|
                       document.compemail.groupmail.value = document.$formname.groupmail[document.$formname.groupmail.selectedIndex].value;
   |;
                   }
                   #typeof(...forminput.length) returns 'undefined' if only one entry exists
                   $broadcast_js .= qq|
       if (typeof(document.$formname.selectedusers_forminput.length)=="undefined") {
           if (document.$formname.selectedusers_forminput.checked) {
               document.compemail.courserecips.value += '_&&&_'+document.$formname.selectedusers_forminput.value;
           }
       } else {
           for (var i=0; i<document.$formname.selectedusers_forminput.length; i++) {
               if (document.$formname.selectedusers_forminput[i].checked) {
                   document.compemail.courserecips.value += '_&&&_'+document.$formname.selectedusers_forminput[i].value;  
               }
           }
       }
                   |;
               }
           }
           $broadcast_js .= qq|
       return;
   }
   // ]]>
   </script>
   
   |;
           }
       }
     if ($forwarding) {      if ($forwarding) {
  %message=&Apache::lonnet::get('nohist_email'.$suffix,[$forwarding]);   %message=&Apache::lonnet::get('nohist_email'.$suffix,[$forwarding]);
  %content=&Apache::lonmsg::unpackagemsg($message{$forwarding},$folder);   %content=&Apache::lonmsg::unpackagemsg($message{$forwarding},$folder);
  $dispcrit.='<input type="hidden" name="forwid" value="'.   $dispcrit.='<input type="hidden" name="forwid" value="'.
     $forwarding.'" />';      $forwarding.'" />';
  $func=&mt('Forward');   $func1='Forward'; # do not translate here!
   
  $dissub=&mt('Forwarding').': '.$content{'subject'};   $dissub=&mt('Forwarding').': '.$content{'subject'};
  $dismsg=&mt('Forwarded message from').' '.   $dismsg=&mt('Forwarded message from').' '.
Line 1310  sub compout { Line 1525  sub compout {
  %content=&Apache::lonmsg::unpackagemsg($message{$replying},$folder);   %content=&Apache::lonmsg::unpackagemsg($message{$replying},$folder);
  $dispcrit.='<input type="hidden" name="replyid" value="'.   $dispcrit.='<input type="hidden" name="replyid" value="'.
     $replying.'" />';      $replying.'" />';
  $func=&mt('Send Reply to');   $func1='Send Reply to'; # do not translate here!
   
  $dissub=&mt('Reply').': '.$content{'subject'};          $dissub=&mt('Reply').': '.$content{'subject'};       
  $dismsg='> '.$content{'message'};   $dismsg='> '.$content{'message'};
Line 1329  sub compout { Line 1544  sub compout {
         my $jscript = &Apache::loncommon::check_uncheck_jscript();          my $jscript = &Apache::loncommon::check_uncheck_jscript();
         $r->print(<<"ENDREPSCRIPT");          $r->print(<<"ENDREPSCRIPT");
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 $jscript  $jscript
   // ]]>
 </script>  </script>
 ENDREPSCRIPT  ENDREPSCRIPT
     }      }
     my $citation=&displayresource(%content);      my $citation=&displayresource(%content);
     my ($can_grp_broadcast,$viewgrps,$editgrps);      my $onsubmit;
     if ($env{'form.recdom'}) { $defdom=$env{'form.recdom'}; }      if ($env{'form.recdom'}) { $defdom=$env{'form.recdom'}; }
     if ($env{'form.text'}) { $dismsg=$env{'form.text'}; }      if ($env{'form.text'}) { $dismsg=$env{'form.text'}; }
     if ($env{'form.subject'}) { $dissub=$env{'form.subject'}; }      if ($env{'form.subject'}) { $dissub=$env{'form.subject'}; }
       if ($hasfloat) {
           $r->print($broadcast_js.'<div class="LC_left_float">');
           $onsubmit = ' onsubmit="javascript:courseRecipients();" ';
       }
     $r->print(      $r->print(
                 '<form action="/adm/email"  name="compemail" method="post"'.                  '<form action="/adm/email"  name="compemail" method="post"'.
                 ' enctype="multipart/form-data">'."\n".                  ' enctype="multipart/form-data"'.$onsubmit.'>'."\n".
                 '<input type="hidden" name="sendmail" value="on" />'."\n");                  '<input type="hidden" name="sendmail" value="on" />'."\n".
     if ($broadcast eq 'group' && $env{'form.group'} ne '') {                  '<table>');
         $can_grp_broadcast =       if (($broadcast eq 'group') && ($group ne '') && (!$can_grp_broadcast)) {
                 &Apache::lonnet::allowed('sgb',$env{'request.course.id'}.'/'.  
                                          $group);  
         $viewgrps =   
                &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.  
                ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));  
         $editgrps =   
                &Apache::lonnet::allowed('mdg',$env{'request.course.id'}.  
                ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));  
         if ($viewgrps || $editgrps || $can_grp_broadcast) {  
             $r->print(&disgroup($cdom,$cnum,$group,$viewgrps,$editgrps));  
         }  
     }  
     $r->print('<table>');  
     if (($broadcast eq 'group') && ($group ne '') &&   
         (!$can_grp_broadcast && !$viewgrps && !$editgrps)) {  
         $r->print(&recipient_input_row($cdom,%lt));          $r->print(&recipient_input_row($cdom,%lt));
     }       }
     if (($broadcast ne 'group') && ($broadcast ne 'upload')) {      if (($broadcast ne 'group') && ($broadcast ne 'upload')) {
  if ($replying) {   if ($replying) {
             if ($content{'noreplies'}) {              if ($content{'noreplies'}) {
                 $r->print('<tr><td>'.&mt('This message was designated by the sender not to allow replies.').'</td></tr></table></form>');                  $r->print('<tr><td>'.&mt('This message was designated by the sender not to allow replies.').'</td></tr></table></form>');
                 return;                  return;
             }              }
             $r->print('<tr><td colspan="2">'.&mt('Replying to').' ');              $r->print('<tr><td colspan="3"><b>'.&mt('Replying to').'</b> ');
             if ($content{'replytoaddr'}) {              if ($content{'replytoaddr'}) {
                 my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});                  my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
                 if ($replytoname ne '' && $replytodom ne '') {                  if ($replytoname ne '' && $replytodom ne '') {
Line 1394  ENDREPSCRIPT Line 1600  ENDREPSCRIPT
                           $content{'senderdomain'}.'" /></td></tr>');                            $content{'senderdomain'}.'" /></td></tr>');
             }              }
             if ($content{'recipid'}) {              if ($content{'recipid'}) {
                 my @ccs = &retrieve_cc_recips('replying',%content);                  my %recips;
                 if (@ccs > 0) {                  &retrieve_recips('replying',\%content,\%recips);
                     my $replyall = qq|                  if (ref($recips{'to'}) eq 'ARRAY') {
                       if (@{$recips{'to'}} > 0) {
                           my $replyall;
                           if (@{$recips{'to'}} > 1) {
                               $replyall = qq|
    <span class="LC_nobreak">
         <input type="button" value="check all"
           onclick="javascript:checkAll(document.compemail.replying_to)" />
           &nbsp;&nbsp;
         <input type="button" value="uncheck all"
           onclick="javascript:uncheckAll(document.compemail.replying_to)" />
    </span>
   |;
                           }
                           my $tolist = join(' ',@{$recips{'to'}});
                           $r->print('<tr><td colspan="3"><table><tr><td>'.&mt('[_1]Send reply[_2] to other recipients','<b>','</b>').':<br />'.$replyall.'</td><td>'.$tolist.'</td></tr></table></td></tr>');
                       }
                   }
                   if (ref($recips{'cc'}) eq 'ARRAY') {
                       if (@{$recips{'cc'}} > 0) {
                           my $replyall;
                           if (@{$recips{'cc'}} > 1) {
                               $replyall = qq|
  <span class="LC_nobreak">   <span class="LC_nobreak">
       <input type="button" value="check all"        <input type="button" value="check all"
         onclick="javascript:checkAll(document.compemail.replying_cc)" />          onclick="javascript:checkAll(document.compemail.replying_cc)" />
Line 1405  ENDREPSCRIPT Line 1633  ENDREPSCRIPT
         onclick="javascript:uncheckAll(document.compemail.replying_cc)" />          onclick="javascript:uncheckAll(document.compemail.replying_cc)" />
  </span>   </span>
 |;  |;
                     my $cclist = join(' ',@ccs);                          }
                     $r->print('<tr><td>'.&mt('Reply to other recipients').':<br />'.$replyall.'</td><td>'.$cclist.'</td></tr>');                          my $cclist = join(' ',@{$recips{'cc'}});
                           $r->print('<tr><td colspan="3"><table><tr><td>'.&mt('[_1]Cc[_2] to other copied recipients','<b>','</b>').':<br />'.$replyall.'</td><td>'.$cclist.'</td></tr></table></td></tr>');
                       }
                   }
                   if ($content{'group'} ne '') {
                       if (&check_group_priv($content{'group'})) {
                           if (ref($recips{'group_cc_broadcast'}) eq 'ARRAY') {
                               if (@{$recips{'group_cc_broadcast'}} > 0) {
                                   my $replyall;
                                   if (@{$recips{'group_cc_broadcast'}} > 1) {
                                       $replyall = qq|
    <span class="LC_nobreak">
         <input type="button" value="check all"
           onclick="javascript:checkAll(document.compemail.replying_groupcc)" />
           &nbsp;&nbsp;
         <input type="button" value="uncheck all"
           onclick="javascript:uncheckAll(document.compemail.replying_groupcc)" />
    </span>
   |;
                                   }
                                   my $groupcclist = join(' ',@{$recips{'group_cc_broadcast'}});
                                   $r->print('<tr><td colspan="3"><table><tr><td>'.&mt('[_1]Cc[_2] to other copied group members','<b>','</b>').':<br />'.$replyall.'</td><td>'.$groupcclist.'<input type="hidden" name="group" value="'.$content{'group'}.'" /><input type="hidden" name="sendmode" value="group" /><input type="hidden" name="groupmail" value="cc" /></td></tr></table></td></tr>');
                               }
                           }
                       }
                 }                  }
             }              }
  } else {   } else {
             $r->print(&recipient_input_row($defdom,%lt));              $r->print(&recipient_input_row($defdom,%lt));
         }          }
     }      }
     my $latexHelp = Apache::loncommon::helpLatexCheatsheet();      my $latexHelp = &Apache::loncommon::helpLatexCheatsheet(undef,undef,1);
       my $textareaclass;
       if (&Apache::lonhtmlcommon::htmlareabrowser()) {
           $r->print(&Apache::lonhtmlcommon::htmlareaselectactive());
           $textareaclass = 'class="LC_richDefaultOff"';
       }
     my $subj_size;      my $subj_size;
     if ($multiforward) {      if ($multiforward) {
         $r->print(&additional_rec_row(\%lt));          $r->print(&additional_rec_row(\%lt));
         $r->print('<tr><td colspan="2">'.          $r->print('<tr><td colspan="2">'.
                   &mt('Unless you choose otherwise:').'<ul><li>'.                    &mt('Unless you choose otherwise:').'<ul><li>'.
         &mt("The subject in each forwarded message will be <i>'Forwarding:'</i> followed by the original subject.").'</li><li>'.          &mt("The subject in each forwarded message will be [_1]'Forwarding:'[_2] followed by the original subject.",'<i>','</i>').'</li><li>'.
         &mt("The message itself will begin with a first line: <i>'Forwarded message from'</i> followed by the original sender's name.").'</li></ul></td></tr>');          &mt("The message itself will begin with a first line: [_1]'Forwarded message from'[_2] followed by the original sender's name.",'<i>','</i>').'</li></ul></td></tr>');
         $func=&mt('Forward');          $func1='Forward'; # do not translate here!
         $dissub = &mt('Forwarding').': ';          $dissub = &mt('Forwarding').': ';
         $subj_size = '10';          $subj_size = '10';
         my $extra = '&lt;'.&mt('original subject').'&gt;&nbsp;&nbsp;&nbsp;'.          my $extra = '&lt;'.&mt('original subject').'&gt;&nbsp;&nbsp;&nbsp;'.
Line 1431  ENDREPSCRIPT Line 1688  ENDREPSCRIPT
         $r->print(&msg_subject_row($dissub,\%lt,$subj_size,$extra));          $r->print(&msg_subject_row($dissub,\%lt,$subj_size,$extra));
         $r->print('<tr><td>'.&mt('Message begins with:').'</td><td><input type="text" name="msgheader" value="'.$dismsg.'" />&nbsp;'.$sender.'&nbsp;&nbsp;&nbsp;<input type="radio" name="showorigsender" value="1" checked="checked" />'.&mt('Yes').'&nbsp;<input type="radio" name="showorigsender" value="0" />'.&mt('No').'<input type="hidden" name="multiforward" value="'.$multiforward.'" /></td></tr>          $r->print('<tr><td>'.&mt('Message begins with:').'</td><td><input type="text" name="msgheader" value="'.$dismsg.'" />&nbsp;'.$sender.'&nbsp;&nbsp;&nbsp;<input type="radio" name="showorigsender" value="1" checked="checked" />'.&mt('Yes').'&nbsp;<input type="radio" name="showorigsender" value="0" />'.&mt('No').'<input type="hidden" name="multiforward" value="'.$multiforward.'" /></td></tr>
 </table>  </table>
 <br />'.  <br /><table>
 $latexHelp.  <tr><td align="left">'."\n".
 &mt("Any new text to display before the text of the original messages:").'<br />  $latexHelp."<br />\n".
 <textarea name="message" id="message" cols="80" rows="5" wrap="hard">  &mt("Any new text to display before the text of the original messages:").'<br />'."\n".
 </textarea></p><br />');  '<textarea name="message" id="message" cols="80" rows="5" wrap="hard" $textareaclass></textarea>');
         my @to_forward = &Apache::loncommon::get_env_multiple('form.delmark');          my @to_forward = &Apache::loncommon::get_env_multiple('form.delmark');
         foreach my $msg (@to_forward) {          foreach my $msg (@to_forward) {
             $r->print('<input type="hidden" name="delmark" value="'.$msg.'" />');              $r->print('<input type="hidden" name="delmark" value="'.$msg.'" />');
         }          }
         $r->print(&submit_button_row($folder,$dismode,$func.' '.$lt{'msg'},          $r->print(&submit_button_row($folder,$dismode,&mt($func1.' '.$func2{'msg'}),
                                      \%lt));                                       \%lt));
     } elsif ($broadcast ne 'upload') {      } elsif ($broadcast ne 'upload') {
         $subj_size = '50';          $subj_size = '50';
Line 1452  $latexHelp. Line 1709  $latexHelp.
         }          }
         $r->print(&msg_subject_row($dissub,\%lt,$subj_size));          $r->print(&msg_subject_row($dissub,\%lt,$subj_size));
         $r->print(<<"ENDCOMP");          $r->print(<<"ENDCOMP");
 </table>  
 $latexHelp  
 <textarea name="message" id="message" cols="80" rows="15" wrap="hard">$dismsg  
 </textarea>  
 $attachrow  $attachrow
 </p>  </table><br />
   $latexHelp<br />
   <textarea name="message" id="message" cols="80" rows="15" wrap="hard" $textareaclass>$dismsg
   </textarea>
 <br />  <br />
   $sendmode
 $dispcrit  $dispcrit
 $disbase  $disbase
 ENDCOMP  ENDCOMP
         $r->print(&submit_button_row($folder,$dismode,$func.' '.$lt{'ma'},          $r->print(&submit_button_row($folder,$dismode,&mt($func1.' '.$func2{'ma'}),
                                      \%lt));                                       \%lt,$hasfloat,$group));
         $r->print($citation);          $r->print($citation);
         if (exists($env{'form.ref'})) {          if (exists($env{'form.ref'})) {
             $r->print('<input type="hidden" name="ref" value="'.              $r->print('<input type="hidden" name="ref" value="'.
Line 1482  ENDCOMP Line 1739  ENDCOMP
 Subject: <input type="text" size="50" name="subject" />  Subject: <input type="text" size="50" name="subject" />
 </p>  </p>
 <p>$lt{'gmt'}:<br />  <p>$lt{'gmt'}:<br />
 <textarea name="message" id="message" cols="60" rows="10" wrap="hard">$dismsg  <textarea name="message" id="message" cols="60" rows="10" wrap="hard" $textareaclass>$dismsg
 </textarea></p>  </textarea></p>
 <p>  <p>
 $lt{'tff'}:  $lt{'tff'}:
Line 1495  ENDBLOCK Line 1752  ENDBLOCK
 '</pre>  '</pre>
 </p>  </p>
 <p>  <p>
 '.&mt('The messages will be assembled from all lines with the respective'."\n".'<tt>username:domain</tt>, and appended to the general message text.'));  '.&mt('The messages will be assembled from all lines with the respective [_1][_2]username:domain[_3], and appended to the general message text.','<br />','<tt>','</tt>'));
         $r->print(<<ENDUPLOAD);          $r->print(<<ENDUPLOAD);
 </p>  </p>
 <p>  <p>
Line 1504  $dispcrit Line 1761  $dispcrit
 <input type="submit" value="$lt{'uas'}" /></p>  <input type="submit" value="$lt{'uas'}" /></p>
 ENDUPLOAD  ENDUPLOAD
     }      }
     if ($broadcast eq 'group') {  
        if ($group eq '') {  
            my $studentsel = &discourse();  
            $r->print($studentsel);  
        }  
     }  
     if ($env{'form.displayedcrit'}) {      if ($env{'form.displayedcrit'}) {
  $r->print('<input type="hidden" name="displayedcrit" value="true" />');   $r->print('<input type="hidden" name="displayedcrit" value="true" />');
     }      }
     $r->print('</form>'.      $r->print('</form>');
       &Apache::lonfeedback::generate_preview_button('compemail','message').      if ($hasfloat) {
       &Apache::lonhtmlcommon::htmlareaselectactive('message'));          $r->print('</div><div class="LC_clear_float_footer"></div>');
       }
       $r->print(&generate_preview_form);
   }
   
   sub check_group_priv {
       my ($group) = @_;
       my $cid = $env{'request.course.id'};
       my $sec = $env{'request.course.sec'};
       return if !$cid;
       my $can_broadcast = &Apache::lonnet::allowed('sgb',$cid.'/'.$group);
       my $viewgrps = &Apache::lonnet::allowed('vcg',$cid.($sec?'/'.$sec:''));
       my $editgrps = &Apache::lonnet::allowed('mdg',$cid.($sec?'/'.$sec:''));
       if ($viewgrps || $editgrps || $can_broadcast) {
           return 1;
       }
       return;
 }  }
   
 # ---------------------------------------------------- Display all face to face  
   
 sub recipient_input_row {  sub recipient_input_row {
     my ($dom,%lt) = @_;      my ($dom,%lt) = @_;
     my $domform = &Apache::loncommon::select_dom_form($dom,'recdomain');      my $domform = &Apache::loncommon::select_dom_form($dom,'recdomain');
Line 1527  sub recipient_input_row { Line 1792  sub recipient_input_row {
       &Apache::loncommon::selectstudent_link('compemail','recuname',        &Apache::loncommon::selectstudent_link('compemail','recuname',
                                              'recdomain');                                               'recdomain');
     my $output = <<"ENDREC";      my $output = <<"ENDREC";
 <tr><td colspan="2"><span class="LC_nobreak">$lt{'us'}:&nbsp;<input type="text" size="12" name="recuname" value="$env{'form.recname'}" />&nbsp;$lt{'do'}:&nbsp;$domform&nbsp;&nbsp;$selectlink</span></td></tr>  <tr><td colspan="3"><span class="LC_nobreak"><b>$lt{'to'}</b> $lt{'us'}:&nbsp;<input type="text" size="12" name="recuname" value="$env{'form.recname'}" />&nbsp;$lt{'do'}:&nbsp;$domform&nbsp;&nbsp;$selectlink</span></td></tr>
 ENDREC  ENDREC
     return $output;      return $output;
 }  }
Line 1537  sub reply_to_row { Line 1802  sub reply_to_row {
     my $radioyes = &mt('Yes');      my $radioyes = &mt('Yes');
     my $radiono = &mt('No');      my $radiono = &mt('No');
     my $output = <<"ENDREP";      my $output = <<"ENDREP";
 <tr><td colspan="2"><span class="LC_nobreak">$lt->{'ar'}:<label><input type="radio" name="can_reply" value="Y" checked="checked" />$radioyes</label>&nbsp;&nbsp;<label><input type="radio" name="can_reply" value="N" />$radiono</label></span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="LC_nobreak">$lt->{'rt'}:&nbsp;<input type="text" size="25" name="reply_to_addr" value="$env{'user.name'}:$env{'user.domain'}" /></span></td></tr>  <tr><td colspan="3"><span class="LC_nobreak"><b>$lt->{'ar'}</b>:<label><input type="radio" name="can_reply" value="Y" checked="checked" />$radioyes</label>&nbsp;&nbsp;<label><input type="radio" name="can_reply" value="N" />$radiono</label></span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="LC_nobreak">$lt->{'rt'}:&nbsp;<input type="text" size="25" name="reply_to_addr" value="$env{'user.name'}:$env{'user.domain'}" /></span></td></tr>
 ENDREP  ENDREP
     return $output;      return $output;
 }  }
Line 1548  sub additional_rec_row { Line 1813  sub additional_rec_row {
     my $bcc = &mt('Bcc:');      my $bcc = &mt('Bcc:');
     my $exmpl = &mt('username:domain,username:domain,...');       my $exmpl = &mt('username:domain,username:domain,...'); 
     my $output = <<"ENDADD";      my $output = <<"ENDADD";
 <tr><td>$lt->{'ad'} :<br /><tt>($exmpl)  <tr><td colspan="3"><fieldset id="LC_additionalrecips"><legend>$lt->{'ad'} <tt>($exmpl)</tt></legend><table>
 </tt></td><td>&nbsp;<span class="LC_nobreak">$cc   <tr><td>&nbsp;</td><td>$lt->{'to'}</td><td><input type="text" size="50" name="additionalrec_to" /></td></tr>
 <input type="text" size="50" name="additionalrec_cc" /></span><br />  <tr><td>&nbsp;</td><td>$cc</td><td><input type="text" size="50" name="additionalrec_cc" /></td></tr> 
 <span class="LC_nobreak">$bcc <input type="text" size="50" name="additionalrec_bcc" /></span></td></tr>  <tr><td>&nbsp;</td><td>$bcc</td><td><input type="text" size="50" name="additionalrec_bcc" /></td></tr></table></fieldset></td></tr>
 ENDADD  ENDADD
     return $output;      return $output;
 }  }
   
 sub submit_button_row {  sub submit_button_row {
     my ($folder,$dismode,$sendtext,$lt) = @_;      my ($folder,$dismode,$sendtext,$lt,$is_crsform,$group) = @_;
     my $output = qq|       my $pre=&mt("Show Preview and Check Spelling");
       my $value=&mt('Send');
       my $prevbutton = '<input type="button" name="preview" value="'.$pre.'" onclick="if (typeof(document.compemail.onsubmit)=='."'function'".') {document.compemail.onsubmit();};document.preview.comment.value=document.compemail.message.value;document.preview.subject.value=document.compemail.subject.value;document.preview.submit();" />';
       my $output = qq|
 <input type="hidden" name="folder" value="$folder" />  <input type="hidden" name="folder" value="$folder" />
 <input type="hidden" name="dismode" value="$dismode" />  <input type="hidden" name="dismode" value="$dismode" />|;
 <input type="submit" name="send" value="$sendtext" />      if ($is_crsform) {
 <input type="submit" name="cancel" value="$lt->{'ca'}" /><hr />          $output .= '<input type="hidden" name="courserecips" value="" />'."\n";
           if ($group ne '') {
               $output .= '<input type="hidden" name="groupmail" value="" />'."\n";
           }
       }
       $output .= qq|
   <table><tr><td align="left">
   <input type="submit" name="send" value="$value" title="$sendtext" />
   <input type="submit" name="cancel" value="$lt->{'ca'}" />
   </td><td width="60">&nbsp;</td><td align="right">$prevbutton</td></tr></table>
 |;  |;
     return $output;      return $output;
 }  }
   
 sub msg_subject_row {  sub msg_subject_row {
     my ($dissub,$lt,$subj_size,$extra) = @_;      my ($dissub,$lt,$subj_size,$extra) = @_;
     my $output = '<tr><td colspan="2">'.$lt->{'sb'}.':&nbsp;<input type="text" size="'.      my $output = '<tr><td colspan="3"><b>'.$lt->{'sb'}.'</b>:&nbsp;<input type="text" size="'.
                  $subj_size.'" name="subject" value="'.$dissub.'" />'.$extra.                   $subj_size.'" name="subject" value="'.$dissub.'" />'.$extra.
                  '</td></tr>';                   '</td></tr>';
     return $output;      return $output;
 }  }
   
   sub generate_preview_form {
       my $prevbutton = (<<ENDPREVIEW);
   <form name="preview" action="/adm/feedback?preview=1" method="post" target="preview">
   <input type="hidden" name="subject" />
   <input type="hidden" name="comment" />
   </form>
   ENDPREVIEW
   }
   
   # ---------------------------------------------------- Display all face to face
   
 sub retrieve_instructor_comments {  sub retrieve_instructor_comments {
     my ($user,$domain)=@_;      my ($user,$domain)=@_;
     my $target=$env{'form.grade_target'};      my $target=$env{'form.grade_target'};
Line 1603  sub retrieve_instructor_comments { Line 1891  sub retrieve_instructor_comments {
 }  }
   
 sub disfacetoface {  sub disfacetoface {
     my ($r,$user,$domain)=@_;      my ($r,$user,$domain,$target)=@_;
     my $target=$env{'form.grade_target'};      if ($target eq '') {
           $target=$env{'form.grade_target'};
       }
     unless ($env{'request.course.id'}) { return; }      unless ($env{'request.course.id'}) { return; }
     if  (!&Apache::lonnet::allowed('dff',$env{'request.course.id'})      if  (!&Apache::lonnet::allowed('dff',$env{'request.course.id'})
  && ! &Apache::lonnet::allowed('dff',$env{'request.course.id'}.   && ! &Apache::lonnet::allowed('dff',$env{'request.course.id'}.
Line 1620  sub disfacetoface { Line 1910  sub disfacetoface {
     foreach my $key (sort(keys(%records))) {      foreach my $key (sort(keys(%records))) {
         my %content=&Apache::lonmsg::unpackagemsg($records{$key});          my %content=&Apache::lonmsg::unpackagemsg($records{$key});
         next if ($content{'senderdomain'} eq '');          next if ($content{'senderdomain'} eq '');
  &Apache::lonfeedback::newline_to_br(\$content{'message'});      if (!&Apache::lonfeedback::contains_block_html($content{'message'})) {
    &Apache::lonfeedback::newline_to_br(\$content{'message'});
    }
         if ($content{'subject'}=~/^Record/) {          if ($content{'subject'}=~/^Record/) {
     $result.='<h3>'.&mt('Record').'</h3>';      $result.='<h3>'.&mt('Record').'</h3>';
         } elsif ($content{'subject'}=~/^Broadcast/) {          } elsif ($content{'subject'}=~/^Broadcast/) {
Line 1646  sub disfacetoface { Line 1938  sub disfacetoface {
             } else {              } else {
                 %content=&Apache::lonmsg::unpackagemsg($content{'message'});                  %content=&Apache::lonmsg::unpackagemsg($content{'message'});
                 $content{'message'} =                  $content{'message'} =
                 '<b>'.&mt('Subject').': '.$content{'subject'}.'</b><br                  '<b>'.&mt('Subject').': '.$content{'subject'}.'</b><br />'.
 '.  
                 $content{'message'};                  $content{'message'};
             }              }
         } else {          } else {
Line 1674  $content{'sendername'}.':'. Line 1965  $content{'sendername'}.':'.
      }       }
     # Check to see if there were any messages.      # Check to see if there were any messages.
     if ($result eq '') {      if ($result eq '') {
         my $lctype = lc(&Apache::loncommon::course_type());          my $lctype = &mt(lc(&Apache::loncommon::course_type()));
  if ($target ne 'tex') {    if ($target ne 'tex') { 
     $r->print("<p><b>".&mt('No notes, face-to-face discussion records, critical messages, or broadcast messages in this [_1].',$lctype)."</b></p>");      $r->print("<p><b>".&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this '.$lctype.'.')."</b></p>");
  } else {   } else {
     $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this [_1].',$lctype).'}\\\\');      $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this '.$lctype.'.').'}\\\\');
  }   }
       } elsif ($target eq 'tex') {
           $r->print(&Apache::lonxml::xmlparse($r,$target,$result));
     } else {      } else {
        $r->print($result);          $r->print('<div>'.$result.'</div>');
     }      }
 }  }
   
Line 1708  sub facetoface { Line 2001  sub facetoface {
  return;   return;
     }      }
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
     my $leaders = ($crstype eq 'Group') ? 'coordinators and leaders'      my $leaders = ($crstype eq 'Community') ? 'coordinators and leaders'
                                         : 'faculty and staff';                                              : 'faculty and staff';
     &printheader($r,      &printheader($r,
  '/adm/email?recordftf=query',   '/adm/email?recordftf=query',
  "User Notes, Face-to-Face, Critical Messages, Broadcast Messages, Archived Messages");   "User Notes, Face-to-Face, Critical Messages, Broadcast Messages, Archived Messages");
Line 1731  sub facetoface { Line 2024  sub facetoface {
        'subm' => 'Retrieve discussion and message records',         'subm' => 'Retrieve discussion and message records',
        'newr' => 'New Record (record is visible to '.lc($crstype).' '.$leaders.')',         'newr' => 'New Record (record is visible to '.lc($crstype).' '.$leaders.')',
        'post' => 'Post this Record');         'post' => 'Post this Record');
     $r->print(<<"ENDTREC");  
 <h3>$lt{'head'}</h3>      $r->print('<h2>'.$lt{'head'}.'</h2>'
 <form method="post" action="/adm/email" name="stdselect">               .'<form method="post" action="/adm/email" name="stdselect">'
 <input type="hidden" name="recordftf" value="retrieve" />               .'<input type="hidden" name="recordftf" value="retrieve" />'
 <table>               .&Apache::lonhtmlcommon::start_pick_box()
 <tr><td>$lt{'user'}:</td><td><input type="text" size="12" name="recuname" value="$env{'form.recuname'}" /></td>               .&Apache::lonhtmlcommon::row_title($lt{'user'})
 <td rowspan="2">               .'<input type="text" size="12" name="recuname" value="'.$env{'form.recuname'}.'" />'
 $stdbrws               .' '.$stdbrws
 <input type="submit" value="$lt{'subm'}" /></td>               .&Apache::lonhtmlcommon::row_closure()
 </tr>               .&Apache::lonhtmlcommon::row_title($lt{'dom'})
 <tr><td>$lt{'dom'}:</td>               .$domform
 <td>$domform</td></tr>               .&Apache::lonhtmlcommon::row_closure(1)
 </table>               .&Apache::lonhtmlcommon::end_pick_box()
 </form>               .'<br />'
 ENDTREC               .'<input type="submit" value="'.$lt{'subm'}.'" />'
                .'</form>'
       );
   
     if (($stage ne 'query') &&      if (($stage ne 'query') &&
         ($env{'form.recdomain'}) && ($env{'form.recuname'})) {          ($env{'form.recdomain'}) && ($env{'form.recuname'})) {
         chomp($env{'form.newrecord'});          chomp($env{'form.newrecord'});
Line 1754  ENDTREC Line 2050  ENDTREC
       $env{'form.recuname'},        $env{'form.recuname'},
       $env{'form.recdomain'});        $env{'form.recdomain'});
         }          }
         $r->print('<h3>'.&Apache::loncommon::plainname($env{'form.recuname'},          my $aboutmelink=&Apache::loncommon::aboutmewrapper(
      $env{'form.recdomain'}).'</h3>');                              &Apache::loncommon::plainname($env{'form.recuname'}
                                                            ,$env{'form.recdomain'})
                              ,$env{'form.recuname'},$env{'form.recdomain'});
           $r->print('<hr />'
                    .'<h2>'
                    .&mt('Discussion and message records for [_1] ([_2])'
                        ,$aboutmelink
                        ,$env{'form.recuname'}.':'.$env{'form.recdomain'})
                    .'</h2>'
          );
         &disfacetoface($r,$env{'form.recuname'},$env{'form.recdomain'});          &disfacetoface($r,$env{'form.recuname'},$env{'form.recdomain'});
  $r->print(<<ENDRHEAD);   $r->print(<<ENDRHEAD);
 <form method="post" action="/adm/email">  <form method="post" action="/adm/email">
Line 1773  ENDBFORM Line 2078  ENDBFORM
     }      }
 }  }
   
 # ----------------------------------------------------------- Blocking during exams  
   
 sub examblock {  
     my ($r,$action) = @_;  
     unless ($env{'request.course.id'}) { return;}  
     if (!&Apache::lonnet::allowed('dcm',$env{'request.course.id'})  
  && ! &Apache::lonnet::allowed('dcm',$env{'request.course.id'}.  
       '/'.$env{'request.course.sec'})) {  
  $r->print('Not allowed');  
  return;  
     }  
     my $usertype = (&Apache::loncommon::course_type() eq 'Group') ? 'members'  
                                                           : 'students';  
     my %lt=&Apache::lonlocal::texthash(  
             'comb' => 'Communication Blocking',  
             'cbds' => 'Communication blocking during scheduled exams',  
             'desc' => "You can use communication blocking to prevent $usertype enrolled in this course from displaying LON-CAPA messages sent by other $usertype during an online exam. As blocking of communication could potentially interrupt legitimate communication between $usertype who are also both enrolled in a different LON-CAPA course, please be careful that you select the correct start and end times for your scheduled exam when setting or modifying these parameters.",  
              'mecb' => 'Modify existing communication blocking periods',  
              'ncbc' => 'No communication blocks currently saved',  
              'stor' => 'Save',  
     );  
   
     my %ltext = &Apache::lonlocal::texthash(  
             'dura' => 'Duration',  
             'setb' => 'Set by',  
             'even' => 'Event',  
             'blck' => 'Blocked?',  
             'actn' => 'Action',  
             'star' => 'Start',  
             'endd' => 'End'  
     );  
   
     &printheader($r,'/adm/email?block=display',$lt{'comb'});  
     $r->print('<h3>'.$lt{'cbds'}.'</h3>');  
   
     if ($action eq 'store') {  
         &blockstore($r);  
     }  
   
     $r->print($lt{'desc'}.'<br /><br />  
                <form name="blockform" method="post" action="/adm/email?block=store">  
              ');  
   
     $r->print('<h4>'.$lt{'mecb'}.'</h4>');  
     my %records = ();  
     my $blockcount = 0;  
     my $parmcount = 0;  
     &get_blockdates(\%records,\$blockcount);  
     if ($blockcount > 0) {  
         $parmcount = &display_blocker_status($r,\%records,\%ltext);  
     } else {  
         $r->print($lt{'ncbc'}.'<br /><br />');  
     }  
     &display_addblocker_table($r,$parmcount,\%ltext);  
     my $end_page=&Apache::loncommon::end_page();  
     $r->print(<<"END");  
 <br />  
 <input type="hidden" name="blocktotal" value="$blockcount" />  
 <input type ="submit" value="$lt{'stor'}" />  
 </form>  
 $end_page  
 END  
     return;  
 }  
   
 sub blockstore {  
     my $r = shift;  
     my %lt=&Apache::lonlocal::texthash(  
             'tfcm' => 'The following changes were made',  
             'ncwm' => 'No changes were made.'   
     );  
     my %adds = ();  
     my %removals = ();  
     my %cancels = ();  
     my $modtotal = 0;  
     my $canceltotal = 0;  
     my $addtotal = 0;  
     my %blocking = ();  
     $r->print('<h3>'.$lt{'head'}.'</h3>');  
     foreach my $envkey (keys(%env)) {  
         if ($envkey =~ m/^form\.modify_(\d+)$/) {  
             $adds{$1} = $1;  
             $removals{$1} = $1;  
             $modtotal ++;  
         } elsif ($envkey =~ m/^form\.cancel_(\d+)$/) {  
             $cancels{$1} = $1;  
             unless ( defined($removals{$1}) ) {  
                 $removals{$1} = $1;  
                 $canceltotal ++;  
             }  
         } elsif ($envkey =~ m/^form\.add_(\d+)$/) {  
             $adds{$1} = $1;  
             $addtotal ++;  
         }   
     }  
   
     foreach my $key (keys(%removals)) {  
         my $hashkey = $env{'form.key_'.$key};  
         &Apache::lonnet::del('comm_block',["$hashkey"],  
                          $env{'course.'.$env{'request.course.id'}.'.domain'},  
                          $env{'course.'.$env{'request.course.id'}.'.num'}  
                          );  
     }  
     foreach my $key (keys(%adds)) {  
         unless ( defined($cancels{$key}) ) {  
             my ($newstart,$newend) = &get_dates_from_form($key);  
             my $newkey = $newstart.'____'.$newend;  
             my $blocktypes = &get_block_choices($key);  
             $blocking{$newkey} = {  
                           setter => $env{'user.name'}.':'.$env{'user.domain'},  
                           event  => &escape($env{'form.title_'.$key}),  
                           blocks => $blocktypes,  
                         };  
         }  
     }  
     if ($addtotal + $modtotal > 0) {  
         &Apache::lonnet::put('comm_block',\%blocking,  
                      $env{'course.'.$env{'request.course.id'}.'.domain'},  
                      $env{'course.'.$env{'request.course.id'}.'.num'}  
                      );  
     }  
     my $chgestotal = $canceltotal + $modtotal + $addtotal;  
     if ($chgestotal > 0) {  
         $r->print($lt{'tfcm'}.'<ul>');  
         if ($canceltotal > 0) {  
             $r->print('<li>'.&mt('[quant,_1,communication blocking period was,communication blocking periods were] removed.',$canceltotal).'</li>');  
         }  
         if ($modtotal > 0) {  
             $r->print('<li>'.&mt('[quant,_1,communication blocking period was,communication blocking periods were] modified.',$modtotal).'</li>');  
         }  
         if ($addtotal > 0) {  
             $r->print('<li>'.&mt('[quant,_1,communication blocking period was,communication blocking periods were] added.',$addtotal).'</li>');  
         }  
         $r->print('</ul>');  
     } else {  
         $r->print($lt{'ncwm'});  
     }  
     $r->print('<br />');  
     return;  
 }  
   
 sub get_dates_from_form {  
     my $item = shift;  
     my $startdate = &Apache::lonhtmlcommon::get_date_from_form('startdate_'.$item);  
     my $enddate   = &Apache::lonhtmlcommon::get_date_from_form('enddate_'.$item);  
     return ($startdate,$enddate);  
 }  
   
 sub get_blockdates {  
     my ($records,$blockcount) = @_;  
     $$blockcount = 0;  
     %{$records} = &Apache::lonnet::dump('comm_block',  
                          $env{'course.'.$env{'request.course.id'}.'.domain'},  
                          $env{'course.'.$env{'request.course.id'}.'.num'}  
                          );  
     $$blockcount = keys(%{$records});  
   
     if ((keys(%{$records}))[0] =~ /^error: 2 /) {  
  $records = {};  
  $$blockcount = 0;  
     }  
 }  
   
 sub get_block_choices {  
     my $item = shift;  
     my $blocklist;  
     my ($typeorder,$types) = &blocktype_text();  
     foreach my $type (@{$typeorder}) {  
         if ($env{'form.'.$type.'_'.$item}) {  
             $blocklist->{$type} = 'on';   
         } else {  
             $blocklist->{$type} = 'off';  
         }  
     }  
     return $blocklist;  
 }  
   
 sub display_blocker_status {  
     my ($r,$records,$ltext) = @_;  
     my $parmcount = 0;  
     
     my %lt = &Apache::lonlocal::texthash(  
         'modi' => 'Modify',  
         'canc' => 'Cancel',  
     );  
     my ($typeorder,$types) = &blocktype_text();  
     $r->print(&Apache::loncommon::start_data_table());  
     $r->print(<<"END");  
   <tr>  
     <th>$ltext->{'dura'}</th>  
     <th>$ltext->{'setb'}</th>  
     <th>$ltext->{'even'}</th>  
     <th>$ltext->{'blck'}</th>  
     <th>$ltext->{'actn'}?</th>  
   </tr>  
 END  
     foreach my $record (sort(keys(%{$records}))) {  
         my $onchange = 'onFocus="javascript:window.document.forms['.  
                        "'blockform'].elements['modify_".$parmcount."'].".  
                        'checked=true;"';  
         my ($start,$end) = split(/____/,$record);  
         my $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.$parmcount,$start,$onchange);  
         my $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.$parmcount,$end,$onchange);  
   
  my ($setuname,$setudom,$title,$blocks) =   
     &Apache::loncommon::parse_block_record($$records{$record});  
  $title = &HTML::Entities::encode($title,'"<>&');  
         my $settername =   
            &Apache::loncommon::aboutmewrapper(  
                            &Apache::loncommon::plainname($setuname,$setudom),  
                            $setuname,$setudom);  
         $r->print(&Apache::loncommon::start_data_table_row());  
         $r->print(<<"END");  
         <td>$ltext->{'star'}:&nbsp;$startform<br/>$ltext->{'endd'}:&nbsp;&nbsp;$endform</td>  
         <td>$settername</td>  
         <td><input type="text" name="title_$parmcount" size="15" value="$title" /><input type="hidden" name="key_$parmcount" value="$record" /></td>  
         <td>  
 END  
         foreach my $block (@{$typeorder}) {  
             my $blockstatus = '';  
             if ($blocks->{$block} eq 'on') {  
                 $blockstatus = 'checked="true"';  
             }  
             $r->print('<label><input type="checkbox" name="'.$block.'_'.$parmcount.'" '.$blockstatus.' value="1" />'.$types->{$block}.'</label><br />');  
         }  
         $r->print(<<"END");  
         </td>        
         <td><label>$lt{'modi'}?&nbsp;<input type="checkbox" name="modify_$parmcount" /></label><br /><label>$lt{'canc'}?&nbsp;&nbsp;<input type="checkbox" name="cancel_$parmcount" /></label>  
 END  
         $r->print(&Apache::loncommon::end_data_table_row());  
         $parmcount++;  
     }  
     $r->print(<<"END");  
 </table>  
 <br />  
 <br />  
 END  
     return $parmcount;  
 }  
   
 sub display_addblocker_table {  
     my ($r,$parmcount,$ltext) = @_;  
     my $start = time;  
     my $end = $start + (60 * 60 * 2); #Default is an exam of 2 hours duration.  
     my $onchange = 'onFocus="javascript:window.document.forms['.  
                    "'blockform'].elements['add_".$parmcount."'].".  
                    'checked=true;"';  
     my $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.$parmcount,$start,$onchange);  
     my $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.$parmcount,$end,$onchange);  
     my %lt = &Apache::lonlocal::texthash(  
         'addb' => 'Add block',  
         'exam' => 'e.g., Exam 1',  
         'addn' => 'Add new communication blocking periods'  
     );  
     my ($typeorder,$types) = &blocktype_text();  
     $r->print(<<"END");  
 <h4>$lt{'addn'}</h4>   
 END  
     $r->print(&Apache::loncommon::start_data_table());  
     $r->print(<<"END");  
    <tr>  
      <th>$ltext->{'dura'}</th>  
      <th>$ltext->{'even'} $lt{'exam'}</th>  
      <th>$ltext->{'blck'}</th>  
      <th>$ltext->{'actn'}?</th>  
    </tr>  
 END  
     $r->print(&Apache::loncommon::start_data_table_row());  
     $r->print(<<"END");  
      <td>$ltext->{'star'}:&nbsp;$startform<br />$ltext->{'endd'}:&nbsp;&nbsp;$endform</td>  
      <td><input type="text" name="title_$parmcount" size="15" value="" /></td>  
      <td>  
 END  
     foreach my $block (@{$typeorder}) {  
         $r->print('<label><input type="checkbox" name="'.$block.'_'.$parmcount.'" value="1" />'.$types->{$block}.'</label><br />');  
      }  
      $r->print(<<"END");  
      </td>   
      <td><label>$lt{'addb'}?&nbsp;<input type="checkbox" name="add_$parmcount" value="1" /></label></td>  
 END  
     $r->print(&Apache::loncommon::end_data_table_row());  
     $r->print(&Apache::loncommon::end_data_table());  
     return;  
 }  
   
 sub blocktype_text {  
     my %types = &Apache::lonlocal::texthash(  
         'com' => 'Messaging',  
         'chat' => 'Chat',  
         'boards' => 'Discussion',  
         'port' => 'Portfolio',  
         'groups' => 'Groups',  
         'blogs' => 'Blogs',  
     );  
     my $typeorder = ['com','chat','boards','port','groups','blogs'];  
     return ($typeorder,\%types);  
 }  
   
 # ----------------------------------------------------------- Display a message  # ----------------------------------------------------------- Display a message
   
 sub displaymessage {  sub displaymessage {
Line 2086  sub displaymessage { Line 2093  sub displaymessage {
     my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus);      my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus);
     if ( $blocked{$msgid} eq 'ON' ) {      if ( $blocked{$msgid} eq 'ON' ) {
         &printheader($r,'/adm/email',&mt('Display a Message'));          &printheader($r,'/adm/email',&mt('Display a Message'));
         $r->print(&mt('You attempted to display a message that is currently blocked because you are enrolled in one or more courses for which there is an ongoing online exam.'));          #$r->print(&mt('You attempted to display a message that is currently blocked because you are enrolled in one or more courses for which there is an ongoing online exam.'));
         &build_block_table($r,$startblock,$endblock,\%setters);          my($blocked, $blocktext) = &Apache::loncommon::blocking_status("com");
           $r->print("<br />".$blocktext);
         return;          return;
     }      }
     if ($msgstatus eq '') {      if ($msgstatus eq '') {
Line 2122  sub displaymessage { Line 2130  sub displaymessage {
     my $number_of_messages = scalar(@messages); #subtract 1 for last index      my $number_of_messages = scalar(@messages); #subtract 1 for last index
 # start output  # start output
     &printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','',$content{'baseurl'});      &printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','',$content{'baseurl'});
     my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'});  
 # Functions  # Prepare available functions
     $r->print('<table border="2" width="100%"><tr bgcolor="#FFFFAA"><td>'.&mt('Functions').':</td>');      my @functionlist;
     if (!$content{'noreplies'}) {      if (!$content{'noreplies'}) {
         $r->print('<td><a href="/adm/email?replyto='.&escape($msgid).$sqs.          push(@functionlist,'<a href="/adm/email?replyto='.&escape($msgid).$sqs.'">'
           '"><b>'.&mt('Reply').'</b></a></td>');                       .&mt('Reply')
     }                       .'</a>');
     $r->print('<td><a href="/adm/email?forward='.&escape($msgid).$sqs.      }
       '"><b>'.&mt('Forward').'</b></a></td>'.      push(@functionlist,'<a href="/adm/email?forward='.&escape($msgid).$sqs.'">'
       '<td><a href="/adm/email?markunread='.&escape($msgid).$sqs.                    .&mt('Forward')
       '"><b>'.&mt('Mark Unread').'</b></a></td>'.                    .'</a>');
       '<td><a href="/adm/email?markdel='.&escape($msgid).$sqs.      push(@functionlist,'<a href="/adm/email?markunread='.&escape($msgid).$sqs.'">'
       '"><b>'.&mt('Delete').'</b></a></td>'.                    .&mt('Mark Unread')
       '<td><a href="/adm/email?'.$sqs.                    .'</a>');
       '"><b>'.&mt('Back to Folder Display').'</b></a></td>');      push(@functionlist,'<a href="/adm/email?markdel='.&escape($msgid).$sqs.'">'
                     .&mt('Delete')
                     .'</a>');
   
   # Prepare available navigation
       my @navigationlist;
     if ($counter > 0){      if ($counter > 0){
  $r->print('<td><a href="/adm/email?display='.$messages[$counter-1]->[5].$sqs.          push(@navigationlist,'<a href="/adm/email?display='.$messages[$counter-1]->[5].$sqs.'">'
   '"><b>'.&mt('Previous').'</b></a></td>');                            .&mt('Previous')
                             .'</a>');
     }      }
     if ($counter < $number_of_messages - 1){      if ($counter < $number_of_messages - 1){
  $r->print('<td><a href="/adm/email?display='.$messages[$counter+1]->[5].$sqs.          push(@navigationlist,'<a href="/adm/email?display='.$messages[$counter+1]->[5].$sqs.'">'
   '"><b>'.&mt('Next').'</b></a></td>');                            .&mt('Next')
     }                            .'</a>');
     $r->print('</tr></table>');      }
       push(@navigationlist,'<a href="/adm/email?'.$sqs.'">'
                     .&mt('Back to Folder Display')
                     .'</a>');
   
   # Prepare available actions
     my $symb;      my $symb;
     if (defined($content{'symb'})) {      if (defined($content{'symb'})) {
         $symb = $content{'symb'};          $symb = $content{'symb'};
     } elsif (defined($content{'baseurl'})) {      } elsif (defined($content{'baseurl'})) {
         $symb=&Apache::lonnet::symbread($content{'baseurl'});          $symb=&Apache::lonnet::symbread($content{'baseurl'});
     }      }
       my @actionlist;
     if ($env{'user.adv'}) {      if ($env{'user.adv'}) {
         my $actionlist='';  
  if (&Apache::lonnet::allowed('vgr',$env{'request.course.id'})) {   if (&Apache::lonnet::allowed('vgr',$env{'request.course.id'})) {
  $actionlist.='<td><b>'   push(@actionlist,&Apache::loncommon::track_student_link(
                             .&Apache::loncommon::track_student_link(                                        'View recent activity'
                                  &mt('View recent activity'),$content{'sendername'},$content{'senderdomain'},'check')                                       ,$content{'sendername'}
                             .'</b></td>';                                       ,$content{'senderdomain'}
                                        ,'check'));
  }   }
  if (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) && $symb) {   if (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) && $symb) {
     $actionlist.='<td><b>'      push(@actionlist,&Apache::loncommon::pprmlink(
                         .&Apache::loncommon::pprmlink(                                    &mt('Set/Change parameters')
                              &mt('Set/Change parameters'),$content{'sendername'},$content{'senderdomain'},$symb,'check')                                       ,$content{'sendername'}
                         .'</b></td>';                                       ,$content{'senderdomain'}
                                        ,$symb
                                        ,'check'));
  }   }
  if (&Apache::lonnet::allowed('mgr',$env{'request.course.id'}) && $symb) {   if (&Apache::lonnet::allowed('mgr',$env{'request.course.id'}) && $symb) {
     $actionlist.='<td><b>'      push(@actionlist,&Apache::loncommon::pgrdlink(
                        .&Apache::loncommon::pgrdlink(                                   &mt('Set/Change grades')
                             &mt('Set/Change grades'),$content{'sendername'},$content{'senderdomain'},$symb,'check')                                       ,$content{'sendername'}
                        .'</b></td>';                                       ,$content{'senderdomain'}
  }                                       ,$symb
         if ($actionlist) {                                       ,'check'));
             $r->print('<table border="2" width="100%">'   }
                      .'<tr bgcolor="#FFAAAA"><td>'      }
                      .&mt('Currently available actions (will open extra window):')  
                      .'</td>'  # Print functionlist, navigationlist, and actionlist in page header
                      .$actionlist          my $functions='<div class="LC_columnSection">';
                      .'</tr></table>');  
         }          # Functionlist
     }          $functions.=&Apache::lonhtmlcommon::start_funclist();
     my ($tolist,$cclist);          foreach my $item (@functionlist) {
     my (@recipients,@ccs);              $functions.=&Apache::lonhtmlcommon::add_item_funclist($item);
     if (ref($content{'recuser'}) eq 'ARRAY') {          }
           $functions .= &Apache::lonhtmlcommon::end_funclist();
   
           # Navigationlist
           $functions.=&Apache::lonhtmlcommon::start_funclist(
                       &mt('Navigation'));
           foreach my $item (@navigationlist) {
               $functions.=&Apache::lonhtmlcommon::add_item_funclist($item);
           }
           $functions .= &Apache::lonhtmlcommon::end_funclist();
   
           # Actionlist
           if (@actionlist) {
               $functions.=&Apache::lonhtmlcommon::start_funclist(
                               &mt('Currently available actions (will open extra window)'));
               foreach my $item (@actionlist) {
                   $functions.=&Apache::lonhtmlcommon::add_item_funclist($item);
               }
               $functions.=&Apache::lonhtmlcommon::end_funclist();
           }
   
           $functions.='</div>';
           $r->print(&Apache::loncommon::head_subbox($functions));
   
   
       my ($tonum,$tolist,$cclist,$bcclist,$groupcclist,%recipients);
       if ($content{'recipid'}) {
           $tonum = &retrieve_recips('display',\%content,\%recipients);
           if (ref($recipients{'cc'}) eq 'ARRAY') {
               $cclist = join(', ',@{$recipients{'cc'}});
           }
           if (ref($recipients{'to'}) eq 'ARRAY') {
               $tolist = join(', ',@{$recipients{'to'}});
           }
           if (ref($recipients{'bcc'}) eq 'ARRAY') {
               $bcclist = join(', ',@{$recipients{'bcc'}});
           }
       }
   
       my $broadcast_link;
       if (($content{'courseid'}) && ($content{'recipid'} &&
           (ref($recipients{'course_broadcast'}) eq 'ARRAY') ||
           (ref($recipients{'group_cc_broadcast'}) eq 'ARRAY') ||
           (ref($recipients{'group_bcc_broadcast'}) eq 'ARRAY'))) {
           $broadcast_link = &recipients_link($r,\%content,\%recipients);
       }
   
       if (((!$tolist) && (!$broadcast_link)) && ref($content{'recuser'}) eq 'ARRAY') {
           my @recipients;
         for (my $i=0; $i<@{$content{'recuser'}}; $i++) {          for (my $i=0; $i<@{$content{'recuser'}}; $i++) {
             $recipients[$i] =  &Apache::loncommon::aboutmewrapper(              $recipients[$i] =  &Apache::loncommon::aboutmewrapper(
                &Apache::loncommon::plainname($content{'recuser'}[$i],                 &Apache::loncommon::plainname($content{'recuser'}[$i],
                                       $content{'recdomain'}[$i]),                                        $content{'recdomain'}[$i]),
                   $content{'recuser'}[$i],$content{'recdomain'}[$i]).                    $content{'recuser'}[$i],$content{'recdomain'}[$i]).
            ' ('.$content{'recuser'}[$i].' '.&mt('at').' '.$content{'recdomain'}[$i].') ';             ' ('.$content{'recuser'}[$i].':'.$content{'recdomain'}[$i].') ';
         }          }
     }          $tolist = join(', ',@recipients);
     $tolist = join(', ',@recipients);  
     if ($content{'recipid'}) {  
         @ccs = &retrieve_cc_recips('display',%content);  
         $cclist = join(', ',@ccs);  
     }      }
     my ($restitle,$baseurl,$refers_to);      my ($restitle,$baseurl,$refers_to);
     if (defined($content{'resource_title'})) {      if (defined($content{'resource_title'})) {
Line 2208  sub displaymessage { Line 2275  sub displaymessage {
     if (defined($content{'baseurl'})) {      if (defined($content{'baseurl'})) {
         $baseurl = &Apache::lonenc::check_encrypt($content{'baseurl'});          $baseurl = &Apache::lonenc::check_encrypt($content{'baseurl'});
     }      }
       $r->print('<div class="LC_clear_float_footer">');
     if ($from_student && $see_anonymous ) {      if ($from_student && $see_anonymous ) {
  $r->print(&Apache::loncommon::student_image_tag($content{'senderdomain'},$content{'sendername'}));   $r->print(&Apache::loncommon::student_image_tag($content{'senderdomain'},$content{'sendername'}).'</br>');
     }      }
   
     # Display LON-CAPA Message (Start)      # Display LON-CAPA Message (Start)
     # Subject      # Subject
     $r->print('<br />'      $r->print('</div>'
              .&Apache::lonhtmlcommon::start_pick_box()               .&Apache::lonhtmlcommon::start_pick_box()
              .&Apache::lonhtmlcommon::row_title(&mt('Subject'))               .&Apache::lonhtmlcommon::row_title(&mt('Subject'))
              .$content{'subject'}               .$content{'subject'}
Line 2222  sub displaymessage { Line 2290  sub displaymessage {
     );      );
     if ($folder eq 'sent') {      if ($folder eq 'sent') {
         # To          # To
         $r->print(&Apache::lonhtmlcommon::row_title(&mt('To'))          if ($tolist) {
                  .$tolist              $r->print(&Apache::lonhtmlcommon::row_title(&mt('To'))
                  .&Apache::lonhtmlcommon::row_closure()                       .$tolist
         );                       .&Apache::lonhtmlcommon::row_closure()
               );
           }
           if ($cclist) {
               $r->print(&Apache::lonhtmlcommon::row_title(&mt('Cc'))
                        .$cclist
                        .&Apache::lonhtmlcommon::row_closure()
               );
           }
           if ($bcclist) {
               $r->print(&Apache::lonhtmlcommon::row_title(&mt('Bcc'))
                        .$bcclist
                        .&Apache::lonhtmlcommon::row_closure()
               );
           }
           if (($content{'courseid'}) && ($content{'recipid'})) {
               my %broadcast_types = 
                   &Apache::lonlocal::texthash (
                       course_broadcast    => 'Broadcast to', 
                       group_cc_broadcast  => 'Cc to group',
                       group_bcc_broadcast => 'Bcc to group',
                   );                   
               foreach my $type (sort(keys(%broadcast_types))) {
                   if (ref($recipients{$type}) eq 'ARRAY') {
                       my $num = @{$recipients{$type}};
                       my $broadcastlist = join(', ',@{$recipients{$type}});
                       if ($broadcastlist && $broadcast_link) {
                           if ($type eq 'group_cc_broadcast') {
                               $groupcclist = $broadcastlist;
                           }
                           $r->print(&Apache::lonhtmlcommon::row_title(
                                               $broadcast_types{$type})
                                     .&mt('[quant,_1,recipient]',$num)
                                     .' <a href="javascript:showBroadcastList();">['
                                     .&mt('Show').']</a>' 
                                     .&Apache::lonhtmlcommon::row_closure());
                       }
                   }
               }
           }
         if ($content{'replytoaddr'}) {          if ($content{'replytoaddr'}) {
             my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});              my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
             if ($replytoname ne '' && $replytodom ne '') {              if ($replytoname ne '' && $replytodom ne '') {
                 $r->print(&Apache::lonhtmlcommon::row_title(&mt('Reply To'))                  $r->print(&Apache::lonhtmlcommon::row_title(&mt('Reply To'))
                          .&mt('[_1] at [_2]',$replytoname,$replytodom)                           .$replytoname.':'.$replytodom
                          .&Apache::lonhtmlcommon::row_closure()                           .&Apache::lonhtmlcommon::row_closure()
                 );                  );
             }              }
Line 2245  sub displaymessage { Line 2352  sub displaymessage {
         if ($content{'noreplies'}) {          if ($content{'noreplies'}) {
             $r->print(' ('.&mt('No replies to sender').')'              $r->print(' ('.&mt('No replies to sender').')'
                      .&Apache::lonhtmlcommon::row_closure()                       .&Apache::lonhtmlcommon::row_closure()
             );               );
         } else {          } else {
             if ($content{'replytoaddr'}) {              if ($content{'replytoaddr'}) {
                 my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});                  my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
                 if ($replytoname ne '' && $replytodom ne '') {                  if ($replytoname ne '' && $replytodom ne '') {
                     $r->print(&Apache::lonhtmlcommon::row_closure()                      $r->print(&Apache::lonhtmlcommon::row_closure()
                              .&Apache::lonhtmlcommon::row_title(&mt('Reply To'))                               .&Apache::lonhtmlcommon::row_title(&mt('Reply To'))
                              .&mt('[_1] at [_2]',$replytoname,$replytodom)                               .$replytoname.':'.$replytodom
                              .&Apache::lonhtmlcommon::row_closure()                               .&Apache::lonhtmlcommon::row_closure()
                     );                      );
                 } else {                  } else {
                     $r->print(&Apache::lonhtmlcommon::row_closure());                      $r->print(&Apache::lonhtmlcommon::row_closure());
                 }                  }
             } else {              } else {
                 $r->print(' ('.&mt('[_1] at [_2]',$content{'sendername'},$content{'senderdomain'}).') '                  $r->print(' ('.$content{'sendername'}.':'.$content{'senderdomain'}.') '
                          .&Apache::lonhtmlcommon::row_closure()                           .&Apache::lonhtmlcommon::row_closure()
                 );                  );
             }              }
             if ($cclist) {              if ($tonum && $tolist) {
                   $r->print(&Apache::lonhtmlcommon::row_title(&mt('To'))
                            .$tolist
                            .&Apache::lonhtmlcommon::row_closure()
                       );
               }
               if ($cclist) { 
                 $r->print(&Apache::lonhtmlcommon::row_title(&mt('Cc'))                  $r->print(&Apache::lonhtmlcommon::row_title(&mt('Cc'))
                          .$cclist                           .$cclist
                          .&Apache::lonhtmlcommon::row_closure()                           .&Apache::lonhtmlcommon::row_closure()
                     );                      );
               }
               if ($content{'group'} ne '') {
                   if (&check_group_priv($content{'group'})) {
                       if (ref($recipients{'group_cc_broadcast'}) eq 'ARRAY') { 
                           $groupcclist = join(', ',@{$recipients{'group_cc_broadcast'}});
                           if ($groupcclist) {
                               $r->print(&Apache::lonhtmlcommon::row_title(&mt('Group Cc'))
                                        .$groupcclist
                                        .&Apache::lonhtmlcommon::row_closure()
                               );
                           }
                       }
                   }
             }              }
         }          }
     }      }
   
     # Course      # Course
     if ($content{'courseid'}) {      if ($content{'courseid'} ne '') {
         $r->print(&Apache::lonhtmlcommon::row_title(&mt($crstype))          if ($content{'courseid'} =~ m{^$match_domain\_$match_courseid$}) {
                  .$courseinfo{'description'}              my %courseinfo;
         );              %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'},
         if ($content{'coursesec'}) {                                                             {'one_time' => 1});
             $r->print(' ('.&mt('Section').': '.$content{'coursesec'}.')');              my $description = $courseinfo{'description'};
               if ($description ne '') {
                   $r->print(&Apache::lonhtmlcommon::row_title(&mt($crstype))
                            .$description
                   );
                   if ($content{'coursesec'}) {
                       $r->print(' ('.&mt('Section').': '.$content{'coursesec'}.')');
                   }
                   $r->print(&Apache::lonhtmlcommon::row_closure());
               }
         }          }
         $r->print(&Apache::lonhtmlcommon::row_closure());  
     }      }
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Time'))      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Time'))
              .$content{'time'}               .$content{'time'}
Line 2360  sub displaymessage { Line 2493  sub displaymessage {
     return;      return;
 }  }
   
 sub retrieve_cc_recips {  sub retrieve_recips {
     my ($context,%content) = @_;       my ($context,$content,$recips)= @_;
     my %reciphash =      my $tonum = 0;
          &Apache::lonnet::get('nohist_emailrecip',[$content{'recipid'}],      if (ref($content) eq 'HASH') {
                               $content{'senderdomain'},$content{'sendername'});          my %reciphash =
     my $recipinfo = $reciphash{$content{'recipid'}};              &Apache::lonnet::get('nohist_emailrecip',[$content->{'recipid'}],
     my @ccs;                                   $content->{'senderdomain'},$content->{'sendername'});
     if (ref($recipinfo) eq 'HASH') {          my $recipinfo = $reciphash{$content->{'recipid'}};
         if (ref($recipinfo->{'cc'}) eq 'HASH') {          if (ref($recipinfo) eq 'HASH') {
             foreach my $cc (sort(keys(%{$recipinfo->{'cc'}}))) {              foreach my $type ('to','cc','course_broadcast','group_cc_broadcast','group_bcc_broadcast') {
                 my ($ccname,$ccdom) = split(/:/,$cc);                  if (ref($recipinfo->{$type}) eq 'HASH') {
                 if (!(($ccname eq $env{'user.name'}) &&                      if ($type eq 'to') {
                      ($ccdom eq $env{'user.domain'}))) {                          $tonum = keys(%{$recipinfo->{$type}});
                     my $showcc ='<span class="LC_nobreak">';                      }
                     if ($context eq 'replying') {                       foreach my $user (sort(keys(%{$recipinfo->{$type}}))) {
                         $showcc = '<label><input type="checkbox" name="replying_cc" value="'.$cc.'" />';                          my ($uname,$udom) = split(/:/,$user);
                     }                          next if (($context eq 'replying') && ($uname eq $env{'user.name'})
                     $showcc .= &Apache::loncommon::aboutmewrapper(                                   && ($udom eq $env{'user.domain'}));
                                        &Apache::loncommon::plainname($ccname,                          my $showuser ='<span class="LC_nobreak">';
                                          $ccdom),$ccname,$ccdom);                          if ($context eq 'replying') {
     if ($context eq 'replying') {                              if (($type eq 'to') || ($type eq 'cc')) { 
  $showcc .='</label>';                                  $showuser = '<label><input type="checkbox" name="replying_'.$type.'" value="'.$user.'" />';
     }                              } elsif ($type eq 'group_cc_broadcast') {
     $showcc .= '</span>';                                  $showuser = '<label><input type="checkbox" name="replying_groupcc" value="'.$user.'" />';
     push(@ccs,$showcc);                              }
                           }
                           $showuser .= &Apache::loncommon::aboutmewrapper(
                                              &Apache::loncommon::plainname($uname,
                                              $udom),$uname,$udom);
           if ($context eq 'replying') {
               $showuser .='</label>';
           }
           $showuser .= '</span>';
                           if (ref($recips) eq 'HASH') {
               push(@{$recips->{$type}},$showuser);
                           }
                       }
                 }                  }
             }              }
         }          }
     }      }
     return @ccs;      return $tonum;
   }
   
   sub recipients_link {
       my ($r,$content,$recipients) = @_;
       my ($broadcast_link,$show);
       if ((ref($content) eq 'HASH') && (ref($recipients) eq 'HASH')) {
           if (ref($recipients->{'course_broadcast'}) eq 'ARRAY') {
               if (@{$recipients->{'course_broadcast'}} > 0) {
                   $show = 'course';
               }
           } elsif (ref($recipients->{'group_cc_broadcast'}) eq 'ARRAY') {
               if (@{$recipients->{'group_cc_broadcast'}} > 0) {
                   $show = 'group_cc';
               }
           } elsif (ref($recipients->{'group_bcc_broadcast'}) eq 'ARRAY') {
               if (@{$recipients->{'group_bcc_broadcast'}} > 0) {
                   $show = 'group_bcc';
               }
           }
           if ($show) {
               my ($nothing,$height,$width,$start_page,$end_page,$body);
               $nothing=&Apache::lonhtmlcommon::javascript_nothing();
               $height = 400;
               $width = 600;
               $start_page =
                   &Apache::loncommon::start_page('Broadcast List', undef,
                                                  {only_body => 1,
                                                   js_ready  => 1,});
               $end_page = &Apache::loncommon::end_page({js_ready => 1,});
               $body = '<h3>'.&mt("Recipients of broadcast message").'</h3>'.
                       &Apache::loncommon::start_data_table();
               my $cell = 0;
               $body .= &Apache::loncommon::start_data_table_row();
               foreach my $item (@{$recipients->{$show.'_broadcast'}}) {
                   $item =~ s/'/\\'/g;
                   if (!($cell%2) && $cell > 0) {
                       $body .= &Apache::loncommon::end_data_table_row().
                                &Apache::loncommon::start_data_table_row();
                   }
                   $cell ++;
                   $body .= '<td>'.$cell.'&nbsp;'.$item.'&nbsp;&nbsp;</td>';
               }
               if ($cell%2) {
                   $body .= '<td>&nbsp;</td>';
               }
               $body .= &Apache::loncommon::end_data_table_row().
                        &Apache::loncommon::end_data_table();
               $body =~ s{</}{<\\/}g;
               $body =~ s{\n}{}g;
               $r->print(<<ENDJS);
   <script type="text/javascript">
   // <![CDATA[
   function showBroadcastList() {
       var caller = this;
       var newWindow = null;
       try {
           newWindow =  window.open($nothing,"broadcast","HEIGHT=$height,WIDTH=$width,resizable=yes,scrollbars=yes" );
       }
       catch(error) {
           writeWin(caller);
           return;
       }
       if (newWindow) {
           caller = newWindow;
       }
       writeWin(caller);
       return;
   }
   
   function writeWin(caller) {
       caller.document.writeln('$start_page $body $end_page');
       caller.document.close();
       caller.focus();
   }
   // ]]>
   </script>
   
   ENDJS
               $broadcast_link = 1;
           }
       }
       return $broadcast_link;
 }  }
   
 # =========================================================== Show the citation  # =========================================================== Show the citation
Line 2436  sub displayresource { Line 2663  sub displayresource {
   
 sub header {  sub header {
     my ($r,$title,$baseurl)=@_;      my ($r,$title,$baseurl)=@_;
       
     my $extra = &Apache::loncommon::studentbrowser_javascript();      my $extra = &Apache::loncommon::studentbrowser_javascript();
     if ($baseurl) {      if ($baseurl) {
  $extra .= "<base href=\"".&Apache::lonnet::absolute_url()."/$baseurl\" />";   $extra .= "<base href=\"".&Apache::lonnet::absolute_url()."/$baseurl\" />";
     }      }
     $r->print(&Apache::loncommon::start_page('Communication and Messages',      $r->print(&Apache::loncommon::start_page('Messages',
   $extra));    $extra));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs      $r->print(&Apache::lonhtmlcommon::breadcrumbs
       (($title?$title:'Communication and Messages')));        (($title?$title:'Send and display messages')));
 }  }
   
 # ---------------------------------------------------------------- Print header  # ---------------------------------------------------------------- Print header
Line 2478  sub storedcommentlisting { Line 2704  sub storedcommentlisting {
        '^'.&escape(&escape($env{'form.showcommentbaseurl'})));         '^'.&escape(&escape($env{'form.showcommentbaseurl'})));
     $r->print(&Apache::loncommon::start_page('Saved Comment Listing',undef,      $r->print(&Apache::loncommon::start_page('Saved Comment Listing',undef,
      {'onlybody' => 1}));       {'onlybody' => 1}));
     if ((keys %msgs)[0]=~/^error\:/) {      if ((keys(%msgs))[0]=~/^error\:/) {
  $r->print(&mt('No saved comments yet.'));   $r->print(&mt('No saved comments yet.'));
     } else {      } else {
  my $found=0;   my $found=0;
Line 2540  sub sendoffmail { Line 2766  sub sendoffmail {
     &statuschange($msgid,'replied',$folder);      &statuschange($msgid,'replied',$folder);
  }   }
   
  my @to =  
     &Apache::loncommon::get_env_multiple('form.selectedusers_forminput');  
  my $mode = $env{'form.sendmode'};   my $mode = $env{'form.sendmode'};
    my (%toaddr,$tos,$cc,$bcc,$broadcast);
   
  my (%toaddr,$cc,$bcc);   if ($mode eq 'group') {
  if (@to) {              if (defined($env{'form.courserecips'})) {
     foreach my $dest (@to) {                  my $courseusers = $env{'form.courserecips'};
  my ($user,$domain) = split(/:/, $dest);                  $courseusers =~ s/^_\&\&\&_//;
  if (($user ne '') && ($domain ne '')) {                  my @to = split('_&&&_',$courseusers);
     my $address = $user.":".$domain; # How the code below expects it.                  foreach my $dest (@to) {
     $toaddr{$address} = '';                      my ($user,$domain) = split(/:/, $dest);
  }                      if (($user ne '') && ($domain ne '')) {
     }                          my $rec = $user.":".$domain;
  }                          $toaddr{$rec} = '';
                           $broadcast->{$rec} = '';
  if ($env{'form.sendmode'} eq 'group') {                      }
      foreach my $address (keys(%env)) {                  }
  if ($address=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {              }
     $toaddr{$1}='';   } elsif ($mode eq 'upload') {
  }  
     }  
  } elsif ($env{'form.sendmode'} eq 'upload') {  
             $nosentstore = 0;              $nosentstore = 0;
     foreach my $line (split(/[\n\r\f]+/,$env{'form.upfile'})) {      foreach my $line (split(/[\n\r\f]+/,$env{'form.upfile'})) {
                 my ($rec,$txt) = ($line =~ /^([^:]+:[^:]+):(.*)$/);                  my ($rec,$txt) = ($line =~ /^([^:]+:[^:]+):(.*)$/);
Line 2569  sub sendoffmail { Line 2791  sub sendoffmail {
                     $rec =~ s/^\s+//;                      $rec =~ s/^\s+//;
                     $rec =~ s/\s+$//;                      $rec =~ s/\s+$//;
     $toaddr{$rec}.=$txt."\n";      $toaddr{$rec}.=$txt."\n";
                       $broadcast->{$rec} = '';
  }   }
     }      }
  } else {   } else {
     if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) {      if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) {
  $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';   $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
                 $cc->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';                  $tos->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
     }      }
  }   }
           if ($env{'form.additionalrec_to'}) {
               foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_to'})) {
                   my ($auname,$audom)=split(/:/,$rec);
                   if (($auname ne "") && ($audom ne "")) {
                       $toaddr{$auname.':'.$audom}='';
                       $tos->{$auname.':'.$audom}='';
                   }
               }
           }
           if ($env{'form.replying_to'}) {
               my @toreplies =
                   &Apache::loncommon::get_env_multiple('form.replying_to');
               foreach my $rec (@toreplies) {
                   my ($auname,$audom)=split(/:/,$rec);
                   if (($auname ne "") && ($audom ne "")) {
                       $toaddr{$auname.':'.$audom}='';
                       $tos->{$auname.':'.$audom}='';
                   }
               }
           }
  if ($env{'form.additionalrec_cc'}) {   if ($env{'form.additionalrec_cc'}) {
     foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_cc'})) {      foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_cc'})) {
  my ($auname,$audom)=split(/:/,$rec);   my ($auname,$audom)=split(/:/,$rec);
  if (($auname ne "") && ($audom ne "")) {   if (($auname ne "") && ($audom ne "")) {
                     $toaddr{$auname.':'.$audom}='';                      $toaddr{$auname.':'.$audom}='';
     $cc->{$auname.':'.$audom}='';                      if (!defined($tos->{$auname.':'.$audom})) {
           $cc->{$auname.':'.$audom}='';
                       }
  }   }
     }      }
  }   }
         if ($env{'form.additionalrec_bcc'}) {          if ($env{'form.replying_cc'}) {
             foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_bcc'})) {              my @ccreplies =
                   &Apache::loncommon::get_env_multiple('form.replying_cc');
               foreach my $rec (@ccreplies) {
                 my ($auname,$audom)=split(/:/,$rec);                  my ($auname,$audom)=split(/:/,$rec);
                 if (($auname ne "") && ($audom ne "")) {                  if (($auname ne "") && ($audom ne "")) {
                     $toaddr{$auname.':'.$audom}='';                      $toaddr{$auname.':'.$audom}='';
                     $bcc->{$auname.':'.$audom}='';                      if (!defined($tos->{$auname.':'.$audom})) {
                           $cc->{$auname.':'.$audom}='';
                       }
                 }                  }
             }              }
         }          }
         if ($env{'form.replying_cc'}) {          if ($env{'form.replying_groupcc'}) {
             my @ccreplies =               my @groupreplies =
                 &Apache::loncommon::get_env_multiple('form.replying_cc');                  &Apache::loncommon::get_env_multiple('form.replying_groupcc');
             foreach my $rec (@ccreplies) {              foreach my $rec (@groupreplies) {
                   my ($auname,$audom)=split(/:/,$rec);
                   if (($auname ne "") && ($audom ne "")) {
                       $toaddr{$auname.':'.$audom}='';
                       if (!defined($tos->{$auname.':'.$audom})) {
                           $broadcast->{$auname.':'.$audom}='';
                       }
                   }
               }
           }
           if ($env{'form.additionalrec_bcc'}) {
               foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_bcc'})) {
                 my ($auname,$audom)=split(/:/,$rec);                  my ($auname,$audom)=split(/:/,$rec);
                 if (($auname ne "") && ($audom ne "")) {                  if (($auname ne "") && ($audom ne "")) {
                     $toaddr{$auname.':'.$audom}='';                      $toaddr{$auname.':'.$audom}='';
                     $cc->{$auname.':'.$audom}='';                      if ((!defined($tos->{$auname.':'.$audom})) && 
                           (!defined($cc->{$auname.':'.$audom}))) {
                           $bcc->{$auname.':'.$audom}='';
                       }
                 }                  }
             }              }
         }          }
Line 2622  sub sendoffmail { Line 2885  sub sendoffmail {
             $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});              $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});
         }          }
         my %reciphash = (          my %reciphash = (
                              to => $tos,
                            cc => $cc,                             cc => $cc,
                            bcc => $bcc,                             bcc => $bcc,
                         );                           );
           if ($mode eq 'group') {
               if ($group eq '') {
                   $reciphash{'course_broadcast'} = $broadcast;
               } else {
                   if ($env{'form.groupmail'} eq 'cc') {
                       $reciphash{'group_cc_broadcast'} = $broadcast;
                   } else {
                       $reciphash{'group_bcc_broadcast'} = $broadcast;
                   }
               }
           }
         my ($recipid,$recipstatus) =           my ($recipid,$recipstatus) = 
             &Apache::lonmsg::store_recipients($msgsubj,$env{'user.name'},              &Apache::lonmsg::store_recipients($msgsubj,$env{'user.name'},
                                        $env{'user.domain'},\%reciphash);                                         $env{'user.domain'},\%reciphash);
         if ($recipstatus ne 'ok') {          if ($recipstatus ne 'ok') {
             &Apache::lonnet::logthis('Failed to store Bcc and Cc recipients for '.$env{'user.name'}.':'.$env{'user.domain'});              &Apache::lonnet::logthis('Failed to store To, Bcc and Cc recipients for '.$env{'user.name'}.':'.$env{'user.domain'});
         }          }
         if ($env{'form.attachment'}) {          if ($env{'form.attachment'}) {
             if (length($env{'form.attachment'})<131072) {              if (length($env{'form.attachment'})<131072) {
Line 2644  sub sendoffmail { Line 2919  sub sendoffmail {
         }          }
         my @recusers;          my @recusers;
         my @recudoms;          my @recudoms;
           my %permresults;
  foreach my $address (sort(keys(%toaddr))) {   foreach my $address (sort(keys(%toaddr))) {
     my ($recuname,$recdomain)=split(/\:/,$address);      my ($recuname,$recdomain)=split(/\:/,$address);
             my $msgtxt = $savemsg;              my $msgtxt = $savemsg;
             if ($toaddr{$address}) {              if ($toaddr{$address}) {
         $msgtxt.='<hr />'.$toaddr{$address};          $msgtxt.="\n".'<hr />'."\n".$toaddr{$address};
             }              }
     my @thismsg;      my @thismsg;
     if ($msgtype eq 'critical') {      if ($msgtype eq 'critical') {
Line 2660  sub sendoffmail { Line 2936  sub sendoffmail {
    $env{'form.sendbck'},     $env{'form.sendbck'},
    $env{'form.permanent'},     $env{'form.permanent'},
    \$sentmessage{$address},     \$sentmessage{$address},
                                                    $nosentstore,$recipid);                                                     $nosentstore,$recipid,
                                                      $attachmenturl,\%permresults);
     } else {      } else {
  $r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');   $r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');
  @thismsg=   @thismsg=
Line 2671  sub sendoffmail { Line 2948  sub sendoffmail {
      $env{'form.permanent'},       $env{'form.permanent'},
      \$sentmessage{$address},       \$sentmessage{$address},
                                                      undef,undef,undef,                                                       undef,undef,undef,
                                                      $nosentstore,$recipid);                                                       $nosentstore,$recipid,
                                                        \%permresults);
             }              }
     $msg_status{$recuname.':'.$recdomain}=join(' ',@thismsg);      $msg_status{$recuname.':'.$recdomain}=join(' ',@thismsg);
     if ($msg_status{$recuname.':'.$recdomain} =~ /(ok|con_delayed)/) {        if ($msg_status{$recuname.':'.$recdomain} =~ /(ok|con_delayed)/) {  
         $numsent++;          $numsent++;
                 push(@recusers,$recuname);                  push(@recusers,$recuname);
                 push(@recudoms,$recdomain);                  push(@recudoms,$recdomain);
                   if ($1 eq 'ok') {
                       $r->print('ok ');
                   }
                   if ($permresults{$recuname.':'.$recdomain}) {
                       $r->print(' (email) ');
                   }
     }      }
     $sendstatus.=' '.join(' ',@thismsg);      $sendstatus.=' '.join(' ',@thismsg);
  }   }
         my $subj_prefix;          my $subj_prefix;
         if ($numsent > 0) {          if ($numsent > 0) {
             if (($env{'request.course.id'}) &&               if (($env{'request.course.id'}) && 
                 (($env{'form.sendmode'} eq 'group') ||                  (($mode eq 'group') ||
                  ($env{'form.courserecord'}) ||                   ($env{'form.courserecord'}) ||
                  ($msgtype eq 'critical'))) {                   ($msgtype eq 'critical')) ||
                   ($env{'form.replyid'} && 
                    (($content{'courseid'} ne '') && 
                     ($mode eq 'group')))) {
                 if ($msgtype eq 'critical') {                  if ($msgtype eq 'critical') {
                     $subj_prefix = 'Critical.';                      $subj_prefix = 'Critical.';
                 } elsif ($env{'form.sendmode'} eq 'group') {                  } elsif ($mode eq 'group') {
                     $subj_prefix = 'Broadcast.';                      $subj_prefix = 'Broadcast.';
                 } else {                  } else {
                     $subj_prefix = 'Archive';                      $subj_prefix = 'Archive';
                 }                  }
                 my ($specialmsgid,$specialresult);                  my ($specialmsgid,$specialresult);
                 my $course_str = &escape('['.$cnum.':'.$cdom.']');                  my $course_str;
                   if ($env{'form.replyid'}) {
                       if ($content{'courseid'} ne '') {
                           my %crsdesc = 
                               &Apache::lonnet::coursedescription($content{'courseid'},
                                                                  {'one_time' => 1});
                           $course_str = &escape('['.$crsdesc{'num'}.':'.$crsdesc{'domain'}.']');
                       }
                   } elsif ($env{'request.course.id'}) {
                       $course_str = &escape('['.$cnum.':'.$cdom.']');
                   }
                 $specialresult =                   $specialresult = 
                     &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,                      &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,
                         $subj_prefix.' '.$course_str,$savemsg,undef,undef,                          $subj_prefix.' '.$course_str,$savemsg,undef,undef,
Line 2721  sub sendoffmail { Line 3017  sub sendoffmail {
                                 undef,$specialmsgid,undef,undef,undef,1);                                  undef,$specialmsgid,undef,undef,undef,1);
                         }                          }
                     }                      }
                     if (($env{'form.sendmode'} ne 'upload') && (@recusers > 0)) {                      if (($mode ne 'upload') && (@recusers > 0)) {
                         &Apache::lonmsg::process_sent_mail($msgsubj,                          &Apache::lonmsg::process_sent_mail($msgsubj,
                            $subj_prefix,$numsent,$stamp,$msgname,$msgdom,                             $subj_prefix,$numsent,$stamp,$msgname,$msgdom,
                            $msgcount,$context,$pid,$savemsg,\@recusers,                             $msgcount,$context,$pid,$savemsg,\@recusers,
                            \@recudoms,undef,$attachmenturl);                             \@recudoms,undef,$attachmenturl,'','','','',$recipid);
                     }                      }
                 } else {                  } else {
                     &Apache::lonnet::logthis('Failed to create record of critical, broadcast or archived message in '.$env{'course.'.$env{'request.course.id'}.'.num'}.' '&mt('at').' '.$env{'course.'.$env{'request.course.id'}.'.domain'}.' - no msgid generated');                      &Apache::lonnet::logthis('Failed to create record of critical, broadcast or archived message in '.$env{'course.'.$env{'request.course.id'}.'.num'}.' '&mt('at').' '.$env{'course.'.$env{'request.course.id'}.'.domain'}.' - no msgid generated');
Line 2737  sub sendoffmail { Line 3033  sub sendoffmail {
                 &Apache::lonmsg::process_sent_mail($msgsubj,$subj_prefix,                  &Apache::lonmsg::process_sent_mail($msgsubj,$subj_prefix,
                        $numsent,$stamp,$env{'user.name'},                         $numsent,$stamp,$env{'user.name'},
                        $env{'user.domain'},$msgcount,$context,                         $env{'user.domain'},$msgcount,$context,
                        $$,$savemsg,\@recusers,\@recudoms,undef,$attachmenturl);                         $$,$savemsg,\@recusers,\@recudoms,undef,$attachmenturl,
                          '','','','',$recipid);
             }              }
         }          }
         if (!$env{'form.multiforward'}) {           if (!$env{'form.multiforward'}) {
             if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) {              if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) {
         $r->print('<br /><span class="LC_success">'.&mt('Completed.').                  my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Completed.'));
                           '</span>');                  $message = &Apache::loncommon::confirmwrapper($message);
                   $r->print($message);
         if ($env{'form.displayedcrit'}) {          if ($env{'form.displayedcrit'}) {
             &discrit($r);              &discrit($r);
                 }                  }
Line 2753  sub sendoffmail { Line 3051  sub sendoffmail {
             &Apache::loncommunicate::menu($r);              &Apache::loncommunicate::menu($r);
         }          }
             } else {              } else {
         $r->print('<p><span class="LC_error">'.&mt('Could not deliver message').'</span> '.                  my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Could not deliver message'),1);
           &mt('Please use the browser "Back" button and correct the recipient addresses ([_1]).',$sendstatus).'</p>');                  $message .= '<br />'.&mt('Please use the browser "Back" button and correct the recipient addresses ([_1]).',$sendstatus);
                   $message = &Apache::loncommon::confirmwrapper($message);
                   $r->print($message);
             }              }
         }          }
       } else {
           &printheader($r,'','Messages cancelled.');
           return 'cancelled';
     }      }
     return $sendstatus;      return $sendstatus;
 }  }
Line 2777  sub handler { Line 3080  sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
         ['display','replyto','forward','markread','markdel','markunread',          ['display','replyto','forward','markread','markdel','markunread',
          'sendreply','compose','sendmail','critical','recname','recdom',           'sendreply','compose','sendmail','critical','recname','recdom',
          'recordftf','sortedby','block','folder','startdis','interdis',           'recordftf','sortedby','folder','startdis','interdis',
  'showcommentbaseurl','dismode','group','subject','text','ref',   'showcommentbaseurl','dismode','group','subject','text','ref',
          'msgstatus']);           'msgstatus']);
     $sqs='&sortedby='.$env{'form.sortedby'};      $sqs='&amp;sortedby='.$env{'form.sortedby'};
   
 # ------------------------------------------------------ They checked for email  # ------------------------------------------------------ They checked for email
     unless ($env{'form.block'}) {      &Apache::lonnet::put('email_status',{'recnewemail'=>0});
         &Apache::lonnet::put('email_status',{'recnewemail'=>0});  
     }  
   
 # ----------------------------------------------------------------- Breadcrumbs  # ----------------------------------------------------------------- Breadcrumbs
   
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"/adm/communicate",          ({href=>"/adm/communicate",
           text=>"Communication/Messages",            text=>"Messages",
           faq=>12,bug=>'Communication Tools',});            faq=>12,bug=>'Communication Tools',});
   
 # ------------------------------------------------------------------ Get Folder  # ------------------------------------------------------------------ Get Folder
Line 2801  sub handler { Line 3102  sub handler {
     unless ($folder) {       unless ($folder) { 
  $folder='';    $folder=''; 
     } else {      } else {
  $sqs.='&folder='.&escape($folder);   $sqs.='&amp;folder='.&escape($folder);
     }      }
 # ------------------------------------------------------------ Get Display Mode  # ------------------------------------------------------------ Get Display Mode
   
Line 2833  sub handler { Line 3134  sub handler {
  $startdis++;   $startdis++;
     }      }
     my $postedstartdis=$startdis+1;      my $postedstartdis=$startdis+1;
     $sqs.='&startdis='.$postedstartdis;      $sqs.='&amp;startdis='.$postedstartdis;
   
 # --------------------------------------------------------------- Render Output  # --------------------------------------------------------------- Render Output
   
Line 2873  sub handler { Line 3174  sub handler {
  my ($result,$msg) =    my ($result,$msg) = 
     &statuschange($env{'form.markdel'},'deleted',$folder);      &statuschange($env{'form.markdel'},'deleted',$folder);
  if (!$result) {   if (!$result) {
     $r->print('<p class="LC_error">'.              my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Failed to delete the message.'),1);
       &mt('Failed to delete the message.').'</p>'.              $message .= '<p class="LC_error" style="font-size: inherit;">'.$msg.'</p>';
       '<p class="LC_error">'.$msg."</p>\n");              $message = &Apache::loncommon::confirmwrapper($message);
               $r->print($message);
  }   }
  &Apache::loncommunicate::menu($r);   &Apache::loncommunicate::menu($r);
  &disall($r,($folder?$folder:$dismode),$msgstatus);   &disall($r,($folder?$folder:$dismode),$msgstatus);
Line 2897  sub handler { Line 3199  sub handler {
             $total ++;              $total ++;
         }          }
         &printheader($r,'','Marked Messages Read');          &printheader($r,'','Marked Messages Read');
         $r->print(&mt('Marked [_1] message(s) read',$total).'<p>');          my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Marked [quant,_1,message] read',$total));
           $message = &Apache::loncommon::confirmwrapper($message);
           $r->print($message);
         # $r->print('<p>');
         &Apache::loncommunicate::menu($r);          &Apache::loncommunicate::menu($r);
         &disall($r,($folder?$folder:$dismode),$msgstatus);          &disall($r,($folder?$folder:$dismode),$msgstatus);
     } elsif ($env{'form.markedaction'} eq 'markedunread') {      } elsif ($env{'form.markedaction'} eq 'markedunread') {
Line 2908  sub handler { Line 3213  sub handler {
             $total ++;              $total ++;
         }          }
         &printheader($r,'','Marked Messages Unread');          &printheader($r,'','Marked Messages Unread');
         $r->print(&mt('Marked [_1] message(s) unread',$total).'<p>');          my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Marked [quant,_1,message] unread',$total));
           $message = &Apache::loncommon::confirmwrapper($message);
           $r->print($message);
         # $r->print('<p>');
         &Apache::loncommunicate::menu($r);          &Apache::loncommunicate::menu($r);
         &disall($r,($folder?$folder:$dismode),$msgstatus);          &disall($r,($folder?$folder:$dismode),$msgstatus);
     } elsif ($env{'form.markedaction'} eq 'markedmove') {      } elsif ($env{'form.markedaction'} eq 'markedmove') {
Line 2917  sub handler { Line 3225  sub handler {
         &printheader($r,'','Moved Messages');          &printheader($r,'','Moved Messages');
         if (!defined($gotfolders{$destfolder})) {          if (!defined($gotfolders{$destfolder})) {
             $r->print(&mt('Destination folder [_1] is not a valid folder',              $r->print(&mt('Destination folder [_1] is not a valid folder',
                       $destfolder));                            '<span class="LC_filename">'.$destfolder.'</span>'));
         } else {          } else {
     my ($total,$failed,@failed_msg)=(0,0);      my ($total,$failed,@failed_msg)=(0,0);
             my @to_move = &Apache::loncommon::get_env_multiple('form.delmark');              my @to_move = &Apache::loncommon::get_env_multiple('form.delmark');
Line 2931  sub handler { Line 3239  sub handler {
     push(@failed_msg,$msg);      push(@failed_msg,$msg);
         }          }
     }      }
     if ($failed) {              my $message = '';
         $r->print('<p class="LC_error">              if ($failed) {
                           '.&mt('Failed to move [_1] message(s)',$failed).                  $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Failed to move [quant,_1,message]',$failed),1);
       '</p>');                  $message .= '<p class="LC_error" style="font-size: inherit;">'.
         $r->print('<p class="LC_error">'.              join("</p>\n<p class=\"LC_error\" style=\"font-size: inherit;\">",@failed_msg).
             join("</p>\n<p class=\"LC_error\">",@failed_msg).              "</p>\n";
           "</p>\n");              }
     }              $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Moved [quant,_1,message]',$total));
     $r->print(&mt('Moved [_1] message(s)',$total).'<p>');              $message = &Apache::loncommon::confirmwrapper($message);
               $r->print($message);
             # $r->print('<p>');
         }          }
  &Apache::loncommunicate::menu($r);   &Apache::loncommunicate::menu($r);
  &disall($r,($folder?$folder:$dismode),$msgstatus);   &disall($r,($folder?$folder:$dismode),$msgstatus);
Line 2957  sub handler { Line 3267  sub handler {
     }      }
  }   }
  &printheader($r,'','Deleted Messages');   &printheader($r,'','Deleted Messages');
           my $message = '';
  if ($failed) {   if ($failed) {
     $r->print('<p class="LC_error">              $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Failed to delete [quant,_1,message]',$failed),1);
                           '.&mt('Failed to delete [_1] message(s)',$failed).              $message .= '<p class="LC_error" style="font-size: inherit;">'.
       '</p>');        join("</p>\n<p class=\"LC_error\" style=\"font-size: inherit;\">",@failed_msg).
     $r->print('<p class="LC_error">'.        "</p>\n";
       join("</p>\n<p class=\"LC_error\">",@failed_msg).   }
       "</p>\n");          $message .= &Apache::lonhtmlcommon::confirm_success(&mt('Deleted [quant,_1,message]',$total));
  }          $message = &Apache::loncommon::confirmwrapper($message);
  $r->print(&mt('Deleted [_1] message(s)',$total).'<p>');          $r->print($message);
         # $r->print('<p>');
  &Apache::loncommunicate::menu($r);   &Apache::loncommunicate::menu($r);
  &disall($r,($folder?$folder:$dismode),$msgstatus);   &disall($r,($folder?$folder:$dismode),$msgstatus);
     } elsif ($env{'form.markunread'}) {      } elsif ($env{'form.markunread'}) {
Line 2977  sub handler { Line 3289  sub handler {
  &compout($r,'','',$env{'form.compose'});   &compout($r,'','',$env{'form.compose'});
     } elsif ($env{'form.recordftf'}) {      } elsif ($env{'form.recordftf'}) {
  &facetoface($r,$env{'form.recordftf'});   &facetoface($r,$env{'form.recordftf'});
     } elsif ($env{'form.block'}) {  
         &examblock($r,$env{'form.block'});  
     } elsif ($env{'form.sendmail'}) {      } elsif ($env{'form.sendmail'}) {
         if ($env{'form.multiforward'}) {          if ($env{'form.multiforward'}) {
             &printheader($r,'','Messages being sent.');              &printheader($r,'','Messages being sent.');
Line 3021  sub handler { Line 3331  sub handler {
             }              }
             if (keys(%forwardok) > 0) {              if (keys(%forwardok) > 0) {
                 my $count = keys(%forwardok);                  my $count = keys(%forwardok);
                 $r->print('<br /><span class="LC_success">'.                  my $message = &Apache::lonhtmlcommon::confirm_success(&mt('[quant,_1,message] forwarded.',$count));
                           &mt('[quant,_1,message] forwarded.',$count).                  $message = &Apache::loncommon::confirmwrapper($message);
                           '</span>');                  $r->print($message);
             }              }
             if (keys(%forwardfail) > 0) {              if (keys(%forwardfail) > 0) {
                 my $count = keys(%forwardfail);                  my $count = keys(%forwardfail);
                 $r->print('<p><span class="LC_error">'.                  my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Could not forward [quant,_1,message].',$count),1);
                           &mt('Could not forward [quant,_1,message].',$count).  
                           '</span> ');  
                 foreach my $key (keys(%forwardfail)) {                  foreach my $key (keys(%forwardfail)) {
                     $r->print(&mt('Could not deliver forwarded message.').'</span> '.                      $message .= '<br />'.&mt('Could not deliver forwarded message.').'</span> '.
                               &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.').<br /><br />');                                  &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.')';
                 }                  }
                   $message = &Apache::loncommon::confirmwrapper($message);
                   $r->print($message);
             }              }
             &Apache::loncommunicate::menu($r);              &Apache::loncommunicate::menu($r);
         } else {          } else {
Line 3057  sub handler { Line 3367  sub handler {
         my $showfolder = $env{'form.newfolder'};          my $showfolder = $env{'form.newfolder'};
  my ($makeresult,$warning) = &makefolder($env{'form.newfolder'});   my ($makeresult,$warning) = &makefolder($env{'form.newfolder'});
         if ($makeresult eq 'ok') {          if ($makeresult eq 'ok') {
             $r->print(&mt('Mail folder "[_1]" created.',$showfolder).'<br />');              my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Folder "[_1]" created.',$showfolder));
               $message = &Apache::loncommon::confirmwrapper($message);
               $r->print($message);
         } else {          } else {
             $r->print(&mt('Creation failed.').' '.$makeresult.'<br />'.              my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Creation failed.').' '.$makeresult.'<br />'.$warning,1);
                       $warning);              $message = &Apache::loncommon::confirmwrapper($message);
               $r->print($message);
             $showfolder = $folder;              $showfolder = $folder;
         }          }
         &Apache::loncommunicate::menu($r);          &Apache::loncommunicate::menu($r);
Line 3072  sub handler { Line 3385  sub handler {
         my $showfolder = '';          my $showfolder = '';
         my $delresult = &deletefolder($folder);          my $delresult = &deletefolder($folder);
         if ($delresult eq 'ok') {          if ($delresult eq 'ok') {
             $r->print(&mt('Mail folder "[_1]" deleted.',$folder).'<br />');              my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Folder "[_1]" deleted.',$folder));
               $message = &Apache::loncommon::confirmwrapper($message);
               $r->print($message);
             $env{'form.folder'} = '';              $env{'form.folder'} = '';
         } else {          } else {
             $r->print(&mt('Deletion failed.').' '.$delresult.'<br />');              my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Deletion failed.').' '.$delresult,1);
               $message = &Apache::loncommon::confirmwrapper($message);
               $r->print($message);
             $showfolder = $folder;              $showfolder = $folder;
         }          }
         &Apache::loncommunicate::menu($r);          &Apache::loncommunicate::menu($r);
Line 3085  sub handler { Line 3402  sub handler {
         my $showfolder = $env{'form.renamed'};          my $showfolder = $env{'form.renamed'};
         my $renresult = &renamefolder($folder);          my $renresult = &renamefolder($folder);
         if ($renresult eq 'ok') {          if ($renresult eq 'ok') {
             $r->print(&mt('Mail folder "[_1]" renamed "[_2]".',$folder,$showfolder).'<br />');              my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Folder "[_1]" renamed to "[_2]".',$folder,$showfolder));
               $message = &Apache::loncommon::confirmwrapper($message);
               $r->print($message);
         } else {          } else {
             $r->print(&mt('Renaming failed.').' '.$renresult.'<br />');              my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Renaming failed.').' '.$renresult,1);
               $message = &Apache::loncommon::confirmwrapper($message);
               $r->print($message);
             $showfolder = $folder;              $showfolder = $folder;
         }          }
         &Apache::loncommunicate::menu($r);          &Apache::loncommunicate::menu($r);

Removed from v.1.92  
changed lines
  Added in v.1.181


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