Diff for /loncom/interface/lonmsgdisplay.pm between versions 1.96 and 1.169

version 1.96, 2008/11/17 17:19:52 version 1.169, 2013/09/04 14:21:30
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
   
Line 128  sub folderlist { Line 128  sub folderlist {
                 go   => 'Go',                  go   => 'Go',
                 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',  
   
     );      );
   
    # 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',
                                 rename => 'Rename Folder',                                  rename => 'Rename Folder',
Line 143  sub folderlist { Line 143  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 170  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 179  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]+"' -- $lt{'fmnb'}");
                     return;                      return;
                 }                  }
             }              }
Line 187  function folder_choice(targetform,caller Line 188  function folder_choice(targetform,caller
                 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+"' $lt{'asth'}");
                         return;                          return;
                     }                      }
                 }                  }
Line 203  function folder_choice(targetform,caller Line 204  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+"' -- $lt{'asth'}");
                     return;                      return;
                 }                  }
             }              }
Line 211  function folder_choice(targetform,caller Line 212  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>'.$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>'.$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><b>'.$lt{'status'}.'</b><br />'."\n".
          &Apache::loncommon::select_form($msgstatus,'msgstatus',\%statushash).'
      </td>       </td>
      <td align="center"><b>'.$lt{'status'}.'</b><br />'."\n".       <td style="padding-right: 40px;">
        &Apache::loncommon::select_form($msgstatus,'msgstatus',%statushash).'           <b>'.$lt{'actn'}.'</b><br />'."\n".'
            <span class="LC_nobreak">'.
            &Apache::loncommon::select_form('view','folderaction',\%actions).
            ' <input type="button" value="'.$lt{'go'}.
            '" onclick="javascript:folder_choice(this.form,'."'change'".');" />
            </span>
      </td>       </td>
      <td align="center"><b>'.$lt{'actn'}.'</b><br />'.       <td style="border-left: 1px solid;padding-left: 40px;">
          &Apache::loncommon::select_form('view','folderaction',%actions).'           <b>'.&mt('New Folder').'</b><br />'."\n".'
      </td><td><br />'.           <span class="LC_nobreak">
     '<input type="button" value="'.$lt{'go'}.'" onClick="javascript:folder_choice(this.form,'."'change'".');" />           <input type="text" size="15" name="newfolder" value="" />
            <input type="button" value="'.$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 268  sub get_permanent_folders { Line 270  sub get_permanent_folders {
 }  }
   
 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 289  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 369  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 380  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.',$folder); 
     }      }
     my %userfolders = &Apache::lonmsg::get_user_folders();      my %userfolders = &Apache::lonmsg::get_user_folders();
     if (!defined($userfolders{$folder})) {      if (!defined($userfolders{$folder})) {
Line 504  sub movemsg { Line 520  sub movemsg {
 sub discourse {  sub discourse {
     my ($statushash) = @_;      my ($statushash) = @_;
     my ($result,$active,$previous,$future);      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 519  sub discourse { Line 536  sub discourse {
                                                                \%defaultUsers,                                                                 \%defaultUsers,
                                                                1,"selectedusers",1,'email')                                                                 1,"selectedusers",1,'email')
        ) {         ) {
        $result .= '<fieldset id="LC_activeusers"><legend><b>'.&mt('Bcc: course members with current access').'</b></legend><form name="activeusers">';         my $bcc_curr_hdr;
          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 />';         $result .= $tmptext.'</form></fieldset><br />';
        if (ref($statushash) eq 'HASH') {         if (ref($statushash) eq 'HASH') {
            $statushash->{'active'} = 1;             $statushash->{'active'} = 1;
Line 531  sub discourse { Line 557  sub discourse {
                                                                \%defaultUsers,                                                                 \%defaultUsers,
                                                                1, "selectedusers",0,'email')                                                                 1, "selectedusers",0,'email')
        ) {         ) {
        $result .= '<fieldset id="LC_previoususers"><legend><b>'.&mt('Bcc: course members with expired access').'</b></legend><form name="previoususers">';         my $bcc_prev_hdr;
          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 />';         $result .= $tmptext.'</form></fieldset><br />';
        if (ref($statushash) eq 'HASH') {         if (ref($statushash) eq 'HASH') {
            $statushash->{'previous'} = 1;             $statushash->{'previous'} = 1;
Line 544  sub discourse { Line 579  sub discourse {
                                                                \%defaultUsers,                                                                 \%defaultUsers,
                                                                1, "selectedusers",0,'email')                                                                 1, "selectedusers",0,'email')
        ) {         ) {
        $result .= '<fieldset id="LC_futureusers"><legend><b>'.&mt('Bcc: course members with future access').'</b></legend><form name="previoususers">';         my $bcc_future_hdr;
          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>';         $result .= $tmptext.'</form></fieldset>';
        if (ref($statushash) eq 'HASH') {         if (ref($statushash) eq 'HASH') {
            $statushash->{'future'} = 1;             $statushash->{'future'} = 1;
Line 555  sub discourse { Line 600  sub discourse {
 }  }
   
 sub disgroup {  sub disgroup {
     my ($cdom,$cnum,$group,$access_status) = @_;      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           $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>');
 e-mail to a group in the course.');          return;
         return $result;  
     }      }
     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,{},[]);
Line 578  e-mail to a group in the course.'); Line 622  e-mail to a group in the course.');
         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 {
           $hasfloat = 1;
           $r->print('<div class="LC_left_float">');
         my %Sortby = (          my %Sortby = (
                          active   => {},                           active   => {},
                          previous => {},                           previous => {},
Line 607  e-mail to a group in the course.'); Line 654  e-mail to a group in the course.');
                 push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user);                  push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user);
             }              }
         }          }
         $result .= &group_check_uncheck();          $r->print(&group_check_uncheck());
         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})) {
Line 615  e-mail to a group in the course.'); Line 662  e-mail to a group in the course.');
                     if (ref($access_status) eq 'HASH') {                      if (ref($access_status) eq 'HASH') {
                         $access_status->{$status} = $$numitems{$status};                          $access_status->{$status} = $$numitems{$status};
                     }                      }
                     $result.='<fieldset><legend><b>'.$lt{$status}.                      $r->print('<fieldset>'.
                              '</b></legend><form name="'.$formname.'">'.                                '<legend>'.$lt{$status}.'</legend>'.
                              '<span class="LC_nobreak">'.                                '<form name="'.$formname.'" action="">'.
                              '<input type="button" value="'.&mt('Check All').'" '.                                '<span class="LC_nobreak">'.
                              'onclick="javascript:toggleAll('."this.form,'check'".')" />'.                                '<input type="button" value="'.&mt('Check All').'" '.
                              '&nbsp;&nbsp;'.                                'onclick="javascript:toggleAll('."this.form,'check'".')" />'.
                              '<input type="button" value="'.&mt('Uncheck All').'" '.                                '&nbsp;&nbsp;'.
                              'onclick="javascript:toggleAll('."this.form,'uncheck'".')" />'.                                '<input type="button" value="'.&mt('Uncheck All').'" '.
                              '</span>';                                'onclick="javascript:toggleAll('."this.form,'uncheck'".')" />'.
                                 '</span>');
                     if ($status eq 'active') {                      if ($status eq 'active') {
                         $result .= '&nbsp;&nbsp;&nbsp;<select name="groupmail">'.                          $r->print(('&nbsp;'x3).'<select name="groupmail">'.
                                    '<option value="bcc" selected="selected">'.&mt('Bcc').'</option>'.                                   '<option value="bcc" selected="selected">'.&mt('Bcc').'</option>'.
                                    '<option value="cc">'.&mt('Cc').'</option>'.                                   '<option value="cc">'.&mt('Cc').'</option>'.
                                '</select>';                                 '</select>');
                     }                      }
                     $result .= '<br />'.&Apache::loncommon::start_data_table().                      $r->print('<br />'.&Apache::loncommon::start_data_table().
                                &Apache::loncommon::start_data_table_header_row().                                 &Apache::loncommon::start_data_table_header_row().
                                "<th>$lt{'name'}</a></th>".                                 "<th>$lt{'name'}</th>".
                                "<th>$lt{'usnm'}</a></th>".                                 "<th>$lt{'usnm'}</th>".
                                "<th>$lt{'doma'}</a></th>".                                 "<th>$lt{'doma'}</th>".
                                &Apache::loncommon::end_data_table_header_row();                                 &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().'</form></fieldset><br />';                      $r->print(&Apache::loncommon::end_data_table().'</form>'.
                                 '</fieldset><br />');
                 }                  }
             }              }
         }          }
           $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">
   // <![CDATA[
 function toggleAll(form,action) {  function toggleAll(form,action) {
     if (typeof(form.selectedusers_forminput.length)=="undefined") {      if (typeof(form.selectedusers_forminput.length)=="undefined") {
          if (action == 'check') {           if (action == 'check') {
Line 677  function toggleAll(form,action) { Line 727  function toggleAll(form,action) {
         }          }
     }      }
 }  }
   // ]]>
 </script>  </script>
     |;      |;
 }  }
Line 706  sub groupmail_header { Line 757  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 718  sub groupmail_header { Line 775  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 E-mail"},);            title=>"Compose Group Message"},);
     if ($action eq 'sending') {      if ($action eq 'sending') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
                          ({text=>"E-mails being sent.",                           ({text=>"Messages being sent.",
                            title=>"E-mails 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 738  sub groupmail_sent { Line 795  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 752  sub discrit { Line 809  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))) {      foreach my $key (sort(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 770  sub discrit { Line 836  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 804  sub discrit { Line 875  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 831  sub sortedmessages { Line 906  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 922  sub get_course_desc { Line 998  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 964  sub disfolder { Line 1045  sub disfolder {
     my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');      my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');
     my %lt = &Apache::lonlocal::texthash(      my %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.',  
     );      );
     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() {
Line 998  sub disfolder { Line 1080  sub disfolder {
         }          }
         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 1032  ENDDISHEADER Line 1116  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 1107  ENDDISHEADER Line 1197  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.(($status eq 'new')?'</b>':'').'</a></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 1124  ENDDISHEADER Line 1214  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') {
Line 1164  ENDDISHEADER Line 1269  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 1191  sub blocked_in_folder { Line 1298  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 1237  sub compout { Line 1348  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 1283  sub compout { Line 1395  sub compout {
     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=
  '<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 />'.   '<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 />'.
  '<label><input type="checkbox" name="permanent" /> '.   '<label><input type="checkbox" name="permanent" /> '.
 &mt('Send copy to permanent email address (if known)').'</label><br />'.  &mt('Send copy to permanent e-mail address (if known)').'</label><br />'.
 '<label><input type="checkbox" name="rsspost" /> '.  '<label><input type="checkbox" name="rsspost" /> '.
   &mt('Include in course RSS newsfeed').'</label><br />';    $rsstxt.'</label><br />';
     }      }
     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'})) {
   
               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>'.              $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><br />';                         '</label><br />';
         }          }
     }      }
Line 1323  sub compout { Line 1449  sub compout {
         } else {          } else {
             $can_grp_broadcast = &check_group_priv($group);              $can_grp_broadcast = &check_group_priv($group);
             if ($can_grp_broadcast) {              if ($can_grp_broadcast) {
                 $r->print('<div class="LC_left_float">'.                  $hasfloat = &disgroup($r,$cdom,$cnum,$group,\%access_status);
                           &disgroup($cdom,$cnum,$group,\%access_status).  
                          '</div>');  
                 $hasfloat = 1;  
             }              }
         }          }
         if ($hasfloat) {          if ($hasfloat) {
             $sendmode = '<input type="hidden" name="sendmode" value="group" />'."\n";              $sendmode = '<input type="hidden" name="sendmode" value="group" />'."\n";
             $broadcast_js = qq|              $broadcast_js = qq|
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function courseRecipients() {  function courseRecipients() {
 |;  |;
         foreach my $type (keys(%access_status)) {          foreach my $type (keys(%access_status)) {
Line 1343  function courseRecipients() { Line 1467  function courseRecipients() {
                     document.compemail.groupmail.value = document.$formname.groupmail[document.$formname.groupmail.selectedIndex].value;                      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|                  $broadcast_js .= qq|
     if (typeof(document.$formname.selectedusers_forminput.length)=="undefined") {      if (typeof(document.$formname.selectedusers_forminput.length)=="undefined") {
         document.compemail.courserecips.value += '_&&&_'+document.$formname.selectedusers_forminput.value;          if (document.$formname.selectedusers_forminput.checked) {
               document.compemail.courserecips.value += '_&&&_'+document.$formname.selectedusers_forminput.value;
           }
     } else {      } else {
         for (var i=0; i<document.$formname.selectedusers_forminput.length; i++) {          for (var i=0; i<document.$formname.selectedusers_forminput.length; i++) {
             if (document.$formname.selectedusers_forminput[i].checked) {              if (document.$formname.selectedusers_forminput[i].checked) {
Line 1359  function courseRecipients() { Line 1486  function courseRecipients() {
         $broadcast_js .= qq|          $broadcast_js .= qq|
     return;      return;
 }  }
   // ]]>
 </script>  </script>
   
 |;  |;
Line 1402  function courseRecipients() { Line 1530  function courseRecipients() {
         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
     }      }
Line 1521  ENDREPSCRIPT Line 1651  ENDREPSCRIPT
             $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 $wysiwyglink=&Apache::lonhtmlcommon::htmlareaselectactive('message').'<br />';      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>');
         $func1='Forward'; # do not translate here!          $func1='Forward'; # do not translate here!
         $dissub = &mt('Forwarding').': ';          $dissub = &mt('Forwarding').': ';
         $subj_size = '10';          $subj_size = '10';
Line 1544  ENDREPSCRIPT Line 1678  ENDREPSCRIPT
 <tr><td align="left">'."\n".  <tr><td align="left">'."\n".
 $latexHelp."<br />\n".  $latexHelp."<br />\n".
 &mt("Any new text to display before the text of the original messages:").'<br />'."\n".  &mt("Any new text to display before the text of the original messages:").'<br />'."\n".
 '<textarea name="message" id="message" cols="80" rows="5" wrap="hard"></textarea>'.  '<textarea name="message" id="message" cols="80" rows="5" wrap="hard" $textareaclass></textarea>');
 $wysiwyglink);  
         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.'" />');
Line 1564  $wysiwyglink); Line 1697  $wysiwyglink);
         $r->print(<<"ENDCOMP");          $r->print(<<"ENDCOMP");
 $attachrow  $attachrow
 </table><br />  </table><br />
 $latexHelp  $latexHelp<br />
 <textarea name="message" id="message" cols="80" rows="15" wrap="hard">$dismsg  <textarea name="message" id="message" cols="80" rows="15" wrap="hard" $textareaclass>$dismsg
 </textarea>$wysiwyglink  </textarea>
   <br />
 $sendmode  $sendmode
 $dispcrit  $dispcrit
 $disbase  $disbase
 ENDCOMP  ENDCOMP
         $r->print(&submit_button_row($folder,$dismode,&mt($func1),          $r->print(&submit_button_row($folder,$dismode,&mt($func1.' '.$func2{'ma'}),
                                      \%lt,$hasfloat,$group));                                       \%lt,$hasfloat,$group));
         $r->print($citation);          $r->print($citation);
         if (exists($env{'form.ref'})) {          if (exists($env{'form.ref'})) {
Line 1591  ENDCOMP Line 1725  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>$wysiwyglink</p>  </textarea></p>
 <p>  <p>
 $lt{'tff'}:  $lt{'tff'}:
 ENDBLOCK  ENDBLOCK
Line 1604  ENDBLOCK Line 1738  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 1665  sub additional_rec_row { Line 1799  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 colspan="3"><fieldset id="LC_additionalrecips"><legend><b>$lt->{'ad'}</b> <tt>($exmpl)</tt>:</legend><table>  <tr><td colspan="3"><fieldset id="LC_additionalrecips"><legend>$lt->{'ad'} <tt>($exmpl)</tt></legend><table>
 <tr><td>&nbsp;</td><td>$lt->{'to'}</td><td><input type="text" size="50" name="additionalrec_to" /></td></tr>  <tr><td>&nbsp;</td><td>$lt->{'to'}</td><td><input type="text" size="50" name="additionalrec_to" /></td></tr>
 <tr><td>&nbsp;</td><td>$cc</td><td><input type="text" size="50" name="additionalrec_cc" /></td></tr>   <tr><td>&nbsp;</td><td>$cc</td><td><input type="text" size="50" name="additionalrec_cc" /></td></tr> 
 <tr><td>&nbsp;</td><td>$bcc</td><td><input type="text" size="50" name="additionalrec_bcc" /></td></tr></table></fieldset>  <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;
 }  }
Line 1676  ENDADD Line 1810  ENDADD
 sub submit_button_row {  sub submit_button_row {
     my ($folder,$dismode,$sendtext,$lt,$is_crsform,$group) = @_;      my ($folder,$dismode,$sendtext,$lt,$is_crsform,$group) = @_;
     my $pre=&mt("Show Preview and Check Spelling");      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 $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|      my $output = qq|
 <input type="hidden" name="folder" value="$folder" />  <input type="hidden" name="folder" value="$folder" />
Line 1688  sub submit_button_row { Line 1823  sub submit_button_row {
     }      }
     $output .= qq|      $output .= qq|
 <table><tr><td align="left">  <table><tr><td align="left">
 <input type="submit" name="send" value="$sendtext" />  <input type="submit" name="send" value="$value" title="$sendtext" />
 <input type="submit" name="cancel" value="$lt->{'ca'}" />  <input type="submit" name="cancel" value="$lt->{'ca'}" />
 </td><td width="60">&nbsp;</td><td align="right">$prevbutton</td></tr></table>  </td><td width="60">&nbsp;</td><td align="right">$prevbutton</td></tr></table>
 |;  |;
Line 1742  sub retrieve_instructor_comments { Line 1877  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 1755  sub disfacetoface { Line 1892  sub disfacetoface {
  $env{'course.'.$env{'request.course.id'}.'.domain'},   $env{'course.'.$env{'request.course.id'}.'.domain'},
  $env{'course.'.$env{'request.course.id'}.'.num'},   $env{'course.'.$env{'request.course.id'}.'.num'},
                          '%255b'.$user.'%253a'.$domain.'%255d');                           '%255b'.$user.'%253a'.$domain.'%255d');
     my $result='';      my $result='<div>';
     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 1813  $content{'sendername'}.':'. Line 1952  $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 [_1].',$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 [_1].',$lctype).'}\\\\');
  }   }
       } elsif ($target ne 'tex') {
          $r->print($result.'</div>');
     } else {      } else {
        $r->print($result);   $r->print(&Apache::lonxml::xmlparse($r, 'tex', $result));
     }   }
 }  }
   
 sub general_message {  sub general_message {
Line 1847  sub facetoface { Line 1988  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 1870  sub facetoface { Line 2011  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 1893  ENDTREC Line 2037  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 1912  ENDBFORM Line 2065  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 2225  sub displaymessage { Line 2080  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 2261  sub displaymessage { Line 2117  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(                                        &mt('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>'  
                      .$actionlist  
                      .'</tr></table>');  
         }  
     }      }
   
   # Print functionlist, navigationlist, and actionlist in page header
           my $functions='<div class="LC_columnSection">';
   
           # Functionlist
           $functions.=&Apache::lonhtmlcommon::start_funclist();
           foreach my $item (@functionlist) {
               $functions.=&Apache::lonhtmlcommon::add_item_funclist($item);
           }
           $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);      my ($tonum,$tolist,$cclist,$bcclist,$groupcclist,%recipients);
     if ($content{'recipid'}) {      if ($content{'recipid'}) {
         $tonum = &retrieve_recips('display',\%content,\%recipients);          $tonum = &retrieve_recips('display',\%content,\%recipients);
Line 2333  sub displaymessage { Line 2231  sub displaymessage {
             $bcclist = join(', ',@{$recipients{'bcc'}});              $bcclist = join(', ',@{$recipients{'bcc'}});
         }          }
     }      }
     if (!$tolist && ref($content{'recuser'}) eq 'ARRAY') {  
       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;          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(
Line 2355  sub displaymessage { Line 2262  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>');
     }  
   
     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);  
     }      }
   
     # 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 2377  sub displaymessage { Line 2277  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) {          if ($cclist) {
             $r->print(&Apache::lonhtmlcommon::row_title(&mt('Cc'))              $r->print(&Apache::lonhtmlcommon::row_title(&mt('Cc'))
                      .$cclist                       .$cclist
Line 2469  sub displaymessage { Line 2371  sub displaymessage {
             }              }
             if ($content{'group'} ne '') {              if ($content{'group'} ne '') {
                 if (&check_group_priv($content{'group'})) {                  if (&check_group_priv($content{'group'})) {
                     $groupcclist = join(', ',@{$recipients{'group_cc_broadcast'}});                      if (ref($recipients{'group_cc_broadcast'}) eq 'ARRAY') { 
                     if ($groupcclist) {                          $groupcclist = join(', ',@{$recipients{'group_cc_broadcast'}});
                         $r->print(&Apache::lonhtmlcommon::row_title(&mt('Group Cc'))                          if ($groupcclist) {
                                  .$groupcclist                              $r->print(&Apache::lonhtmlcommon::row_title(&mt('Group Cc'))
                                  .&Apache::lonhtmlcommon::row_closure()                                       .$groupcclist
                         );                                       .&Apache::lonhtmlcommon::row_closure()
                               );
                           }
                     }                      }
                 }                  }
             }              }
Line 2482  sub displaymessage { Line 2386  sub displaymessage {
     }      }
   
     # 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 2634  sub recipients_link { Line 2546  sub recipients_link {
             $nothing=&Apache::lonhtmlcommon::javascript_nothing();              $nothing=&Apache::lonhtmlcommon::javascript_nothing();
             $height = 400;              $height = 400;
             $width = 600;              $width = 600;
             my $start_page =              $start_page =
                     &Apache::loncommon::start_page('Broadcast List', undef,                  &Apache::loncommon::start_page('Broadcast List', undef,
                                        {only_body => 1,                                                 {only_body => 1,
                                         js_ready  => 1,});                                                  js_ready  => 1,});
             my $end_page = &Apache::loncommon::end_page({js_ready => 1,});              $end_page = &Apache::loncommon::end_page({js_ready => 1,});
             my $body = '<h3>'.&mt("Recipients of broadcast message").'</h3>'.              $body = '<h3>'.&mt("Recipients of broadcast message").'</h3>'.
                        &Apache::loncommon::start_data_table();                      &Apache::loncommon::start_data_table();
             my $cell = 0;              my $cell = 0;
             $body .= &Apache::loncommon::start_data_table_row();              $body .= &Apache::loncommon::start_data_table_row();
             foreach my $item (@{$recipients->{$show.'_broadcast'}}) {              foreach my $item (@{$recipients->{$show.'_broadcast'}}) {
Line 2661  sub recipients_link { Line 2573  sub recipients_link {
             $body =~ s{\n}{}g;              $body =~ s{\n}{}g;
             $r->print(<<ENDJS);              $r->print(<<ENDJS);
 <script type="text/javascript">  <script type="text/javascript">
   // <![CDATA[
 function showBroadcastList() {  function showBroadcastList() {
     var caller = this;      var caller = this;
     var newWindow = null;      var newWindow = null;
Line 2683  function writeWin(caller) { Line 2596  function writeWin(caller) {
     caller.document.close();      caller.document.close();
     caller.focus();      caller.focus();
 }  }
   // ]]>
 </script>  </script>
   
 ENDJS  ENDJS
Line 2737  sub displayresource { Line 2650  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 2998  sub sendoffmail { Line 2910  sub sendoffmail {
     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 3103  sub sendoffmail { Line 3015  sub sendoffmail {
                        '','','','',$recipid);                         '','','','',$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 3116  sub sendoffmail { Line 3029  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 3140  sub handler { Line 3058  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 3164  sub handler { Line 3080  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 3196  sub handler { Line 3112  sub handler {
  $startdis++;   $startdis++;
     }      }
     my $postedstartdis=$startdis+1;      my $postedstartdis=$startdis+1;
     $sqs.='&startdis='.$postedstartdis;      $sqs.='&amp;startdis='.$postedstartdis;
   
 # --------------------------------------------------------------- Render Output  # --------------------------------------------------------------- Render Output
   
Line 3236  sub handler { Line 3152  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 3260  sub handler { Line 3177  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 3271  sub handler { Line 3191  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 3280  sub handler { Line 3203  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 3294  sub handler { Line 3217  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 3320  sub handler { Line 3245  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 3340  sub handler { Line 3267  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 3384  sub handler { Line 3309  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 3420  sub handler { Line 3345  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 3435  sub handler { Line 3363  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 3448  sub handler { Line 3380  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.96  
changed lines
  Added in v.1.169


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

Internal Server Error

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

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

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