Diff for /loncom/interface/lonmsgdisplay.pm between versions 1.156 and 1.196

version 1.156, 2011/05/03 10:37:14 version 1.196, 2022/01/18 17:33:13
Line 1 Line 1
 # $textareaclass The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Routines for messaging display  # Routines for messaging display
 #  #
 # $Id$  # $Id$
Line 102  use HTML::TokeParser(); Line 102  use HTML::TokeParser();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::loncommon();  use Apache::loncommon();
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
   use Apache::longroup;
   use Apache::lonnavmaps;
 use Apache::lontexconvert();  use Apache::lontexconvert();
 use HTML::Entities();  use HTML::Entities();
 use Apache::lonlocal;  use Apache::lonlocal;
Line 110  use Apache::lonfeedback; Line 112  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='';
Line 120  my $startdis=''; Line 122  my $startdis='';
   
 sub folderlist {  sub folderlist {
     my ($folder,$msgstatus) = @_;      my ($folder,$msgstatus) = @_;
     my %lt = &Apache::lonlocal::texthash(      my %html_lt = &Apache::lonlocal::texthash(
                 actn => 'Action',                  actn => 'Action',
                 fold => 'Folder',                  fold => 'Folder',
                 show => 'Show',                  show => 'Show',
                 status => 'Message Status',                  status => 'Message Status',
                 go   => 'Go',                  go   => 'Go',
   
       );
       &html_escape(\%html_lt);
       my %js_lt = &Apache::lonlocal::texthash(
                 nnff => 'New Name for Folder',                  nnff => 'New Name for Folder',
                 newn => 'New Name',                  newn => 'New Name',
                 thfm => 'The folder may not be renamed',                  fmnb => 'Folder may not be renamed as it is a folder provided by the system.',
                 fmnb => 'folder may not be renamed as it is a folder provided by the system.',                  asth => 'Requested name already in use for a system-provided or user-defined folder.',
                 asth => 'as this name is already in use for a system-provided or user-defined folder.',  
                 the => 'The',  
                 tnfm => 'The new folder may not be named',  
   
     );      );
       &js_escape(\%js_lt);
   
  # set se lastvisit for the new mail check in the toplevel menu   # set se lastvisit for the new mail check in the toplevel menu
  &Apache::lonnet::appenv({'user.mailcheck.lastvisit'=>time});   &Apache::lonnet::appenv({'user.mailcheck.lastvisit'=>time});
Line 182  function folder_choice(targetform,caller Line 186  function folder_choice(targetform,caller
         if (targetform.folderaction.options[targetform.folderaction.selectedIndex].value == 'rename') {          if (targetform.folderaction.options[targetform.folderaction.selectedIndex].value == 'rename') {
             for (var i=0; i<permfolders_keys.length; i++) {              for (var i=0; i<permfolders_keys.length; i++) {
                 if (permfolders_keys[i] == targetform.folder.value) {                  if (permfolders_keys[i] == targetform.folder.value) {
                     alert("$lt{'the'} '"+permfolders_vals[i]+"' $lt{'fmnb'}");                      alert("'"+permfolders_vals[i]+"' -- $js_lt{'fmnb'}");
                     return;                      return;
                 }                  }
             }              }
             var foldername=prompt('$lt{'nnff'}','$lt{'newn'}');              var foldername=prompt('$js_lt{'nnff'}','$js_lt{'newn'}');
             if (foldername) {              if (foldername) {
                 targetform.renamed.value=foldername;                  targetform.renamed.value=foldername;
                 for (var i=0; i<allfolders.length; i++) {                  for (var i=0; i<allfolders.length; i++) {
                     if (allfolders[i] == foldername) {                      if (allfolders[i] == foldername) {
                         alert("$lt{'thfm'} '"+foldername+"' $lt{'asth'}");                          alert("'"+foldername+"' $js_lt{'asth'}");
                         return;                          return;
                     }                      }
                 }                  }
Line 207  function folder_choice(targetform,caller Line 211  function folder_choice(targetform,caller
         if (newname) {          if (newname) {
             for (var i=0; i<allfolders.length; i++) {              for (var i=0; i<allfolders.length; i++) {
                 if (allfolders[i] == newname) {                  if (allfolders[i] == newname) {
                     alert("$lt{'tnfm'} '"+newname+"' $lt{'asth'}");                      alert("'"+newname+"' -- $js_lt{'asth'}");
                     return;                      return;
                 }                  }
             }              }
Line 222  function folder_choice(targetform,caller Line 226  function folder_choice(targetform,caller
   
     $output .= '      $output .= '
 <form method="post" action="/adm/email" name="folderlist">  <form method="post" action="/adm/email" name="folderlist">
      <div class="LC_columnSection"><fieldset>
      <legend>'.&mt('Folder Actions').'</legend>
    <table border="0" cellspacing="2" cellpadding="8">     <table border="0" cellspacing="2" cellpadding="8">
     <tr>      <tr>
      <td><b>'.$lt{'fold'}.'</b><br />'."\n".       <td><b>'.$html_lt{'fold'}.'</b><br />'."\n".
          &Apache::loncommon::select_form($folder,'folder',\%formhash).'           &Apache::loncommon::select_form($folder,'folder',\%formhash).'
      </td>       </td>
      <td><b>'.$lt{'show'}.'</b><br />'."\n".       <td><b>'.$html_lt{'show'}.'</b><br />'."\n".
          &Apache::loncommon::select_form($env{'form.interdis'},'interdis',           &Apache::loncommon::select_form($env{'form.interdis'},'interdis',
  \%show).'   \%show).'
      </td>       </td>
      <td><b>'.$lt{'status'}.'</b><br />'."\n".       <td><b>'.$html_lt{'status'}.'</b><br />'."\n".
        &Apache::loncommon::select_form($msgstatus,'msgstatus',\%statushash).'         &Apache::loncommon::select_form($msgstatus,'msgstatus',\%statushash).'
      </td>       </td>
      <td><b>'.$lt{'actn'}.'</b><br />'."\n".'       <td style="padding-right: 40px;">
            <b>'.$html_lt{'actn'}.'</b><br />'."\n".'
          <span class="LC_nobreak">'.           <span class="LC_nobreak">'.
          &Apache::loncommon::select_form('view','folderaction',\%actions).           &Apache::loncommon::select_form('view','folderaction',\%actions).
          ' <input type="button" value="'.$lt{'go'}.           ' <input type="button" value="'.$html_lt{'go'}.
          '" onclick="javascript:folder_choice(this.form,'."'change'".');" />           '" onclick="javascript:folder_choice(this.form,'."'change'".');" />
          </span>           </span>
      </td>       </td>
      <td><b>'.&mt('New Folder').'</b><br />'."\n".'       <td style="border-left: 1px solid;padding-left: 40px;">
            <b>'.&mt('New Folder').'</b><br />'."\n".'
          <span class="LC_nobreak">           <span class="LC_nobreak">
          <input type="text" size="15" name="newfolder" value="" />           <input type="text" size="15" name="newfolder" value="" />
          <input type="button" value="'.$lt{'go'}.           <input type="button" value="'.$html_lt{'go'}.
          '" onclick="javascript:folder_choice(this.form,'."'new'".');" />           '" onclick="javascript:folder_choice(this.form,'."'new'".');" />
          </span>           </span>
      </td>       </td>
     </tr>      </tr>
    </table>     </table>
      </fieldset></div>
 '."\n".  '."\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="" />'.
Line 261  sub get_permanent_folders { Line 270  sub get_permanent_folders {
     my %permfolders =       my %permfolders = 
  &Apache::lonlocal::texthash(''         => 'INBOX',   &Apache::lonlocal::texthash(''         => 'INBOX',
     'trash'    => 'TRASH',      'trash'    => 'TRASH',
     'critical' => 'Critical',      'critical' => 'CRITICAL',
     'sent'     => 'Sent Messages',      'sent'     => 'SENT MESSAGES',
     );      );
     return %permfolders;      return %permfolders;
 }  }
Line 378  sub deletefolder { Line 387  sub deletefolder {
     my ($folder)=@_;      my ($folder)=@_;
     my %permfolders = &get_permanent_folders();      my %permfolders = &get_permanent_folders();
     if (defined($permfolders{$folder})) {      if (defined($permfolders{$folder})) {
         return &mt('The folder "[_1]" may not be deleted.',$folder);           return &mt('The folder "[_1]" may not be deleted.',$permfolders{$folder}); 
     }      }
     my %userfolders = &Apache::lonmsg::get_user_folders();      my %userfolders = &Apache::lonmsg::get_user_folders();
     if (!defined($userfolders{$folder})) {      if (!defined($userfolders{$folder})) {
Line 543  sub discourse { Line 552  sub discourse {
        $result .= '<fieldset id="LC_activeusers"><legend>'         $result .= '<fieldset id="LC_activeusers"><legend>'
                  .$bcc_curr_hdr                   .$bcc_curr_hdr
                  .'</legend>'                   .'</legend>'
                  .'<form name="activeusers">';                   .'<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 564  sub discourse { Line 573  sub discourse {
        $result .= '<fieldset id="LC_previoususers"><legend>'         $result .= '<fieldset id="LC_previoususers"><legend>'
                  .$bcc_prev_hdr                   .$bcc_prev_hdr
                  .'</legend>'                   .'</legend>'
                  .'<form name="previoususers">';                   .'<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 587  sub discourse { Line 596  sub discourse {
        $result .= '<fieldset id="LC_futureusers"><legend>'         $result .= '<fieldset id="LC_futureusers"><legend>'
                  .$bcc_future_hdr                   .$bcc_future_hdr
                  .'</legend>'                   .'</legend>'
                  .'<form name="futureusers">';                   .'<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 662  sub disgroup { Line 671  sub disgroup {
                     }                      }
                     $r->print('<fieldset>'.                      $r->print('<fieldset>'.
                               '<legend>'.$lt{$status}.'</legend>'.                                '<legend>'.$lt{$status}.'</legend>'.
                               '<form name="'.$formname.'">'.                                '<form name="'.$formname.'" action="">'.
                               '<span class="LC_nobreak">'.                                '<span class="LC_nobreak">'.
                               '<input type="button" value="'.&mt('Check All').'" '.                                '<input type="button" value="'.&mt('Check All').'" '.
                               'onclick="javascript:toggleAll('."this.form,'check'".')" />'.                                'onclick="javascript:toggleAll('."this.form,'check'".')" />'.
Line 766  sub groupmail_header { Line 775  sub groupmail_header {
               text=>"Groups",                text=>"Groups",
               title=>$brtitle});                title=>$brtitle});
     }      }
     &Apache::lonhtmlcommon::add_breadcrumb      my $view_permission =
         ({href=>"/adm/$cdom/$cnum/$group/smppg?$refarg",            &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
           text=>"Group: $description",      my $navmap=Apache::lonnavmaps::navmap->new();
           title=>"Go to group's home page"},      my $grouppagelink = &Apache::longroup::get_group_link($cdom,$cnum,$group,$navmap,$view_permission,$refarg);
          {href=>"/adm/email?compose=group&amp;group=".      if ($grouppagelink) {
                 "$env{'form.group'}&amp;$refarg",          &Apache::lonhtmlcommon::add_breadcrumb
           text=>"Send a Message in a Group",              ({href=>$grouppagelink,
           title=>"Compose Group Message"},);                text=>&mt('Group').": $description",
                 title=>&mt("Go to group's home page"),
                 no_mt=>1,
                },);
       } else {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({text=>&mt('Group').": $description",
                 no_mt=>1,});
       }
       &Apache::lonhtmlcommon::add_breadcrumb   
             ({href=>"/adm/email?compose=group&amp;group=".
                        "$env{'form.group'}&amp;$refarg",
                  text=>"Send a Message in a Group",
                  title=>"Compose Group Message"},);
     if ($action eq 'sending') {      if ($action eq 'sending') {
             &Apache::lonhtmlcommon::add_breadcrumb              &Apache::lonhtmlcommon::add_breadcrumb
                          ({text=>"Messages being sent.",                           ({text=>"Messages being sent.",
                            title=>"E-mails sent"},);                             title=>"E-mails sent"},);
     }      }
     my $groupheader = &Apache::loncommon::start_page('Group Message');      my $groupheader = &Apache::loncommon::start_page('Group Message');
     $groupheader .= &Apache::lonhtmlcommon::breadcrumbs      $groupheader .= &Apache::lonhtmlcommon::breadcrumbs(
                 ('Group - '.$env{'form.group'}.' Email');                                      &mt('Group messages - [_1]',$description),
                                                           undef,undef,undef,undef,1);
     return $groupheader;      return $groupheader;
 }  }
   
Line 811  sub discrit { Line 834  sub discrit {
                 .'<input type="hidden" name="confirm" value="true" />';                  .'<input type="hidden" name="confirm" value="true" />';
     my %what=&Apache::lonnet::dump('critical');      my %what=&Apache::lonnet::dump('critical');
     my $result = '';      my $result = '';
     foreach my $key (sort(keys(%what))) {      # Sort by date in descending order
       foreach my $key (sort{$b <=> $a}(keys(%what))) {    
         my %content=&Apache::lonmsg::unpackagemsg($what{$key});          my %content=&Apache::lonmsg::unpackagemsg($what{$key});
         next if ($content{'senderdomain'} eq '');          next if ($content{'senderdomain'} eq '');
         my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'});          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 827  sub discrit { Line 859  sub discrit {
                   .&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);
         if ($courseinfo{'description'}) {          if ($description ne '') {
             $result .= &Apache::lonhtmlcommon::row_title(&mt('Course'),undef,'LC_oddrow_value')              $result .= &Apache::lonhtmlcommon::row_title(&mt('Course'),undef,'LC_oddrow_value')
                       .$courseinfo{'description'}                        .$description
                       .&Apache::lonhtmlcommon::row_closure(1);                        .&Apache::lonhtmlcommon::row_closure(1);
         }          }
         $result .= &Apache::lonhtmlcommon::row_title(&mt('Message'),undef,'LC_evenrow_value')          $result .= &Apache::lonhtmlcommon::row_title(&mt('Message'),undef,'LC_evenrow_value')
                   .'<pre>'.&Apache::lontexconvert::msgtexconverted($content{'message'}).'</pre>'                    .'<pre class="LC_wordwrap">'.&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')
                   .'<div class="LC_warning">';                    .'<div class="LC_warning">';
Line 869  sub discrit { Line 901  sub discrit {
             '<p class="LC_info">'.              '<p class="LC_info">'.
             &mt('You have no critical messages.').              &mt('You have no critical messages.').
             '</p>'.              '</p>'.
             '<a href="/adm/roles">'.&mt('Select a course').'</a><br />'.              &Apache::lonhtmlcommon::actionbox(
             '<a href="/adm/email">'.&mt('Communicate').'</a>';                  ['<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 879  sub discrit { Line 912  sub discrit {
 }  }
   
 sub sortedmessages {  sub sortedmessages {
     my ($blocked,$startblock,$endblock,$numblocked,$folder,$msgstatus) = @_;      my ($blocked,$startblock,$endblock,$by_ip,$numblocked,$folder,$msgstatus) = @_;
     my $suffix=&Apache::lonmsg::foldersuffix($folder);      my $suffix=&Apache::lonmsg::foldersuffix($folder);
     my @messages = &Apache::lonnet::getkeys('nohist_email'.$suffix);      my @messages = &Apache::lonnet::getkeys('nohist_email'.$suffix);
     #unpack the varibles and repack into temp for sorting      #unpack the varibles and repack into temp for sorting
Line 911  sub sortedmessages { Line 944  sub sortedmessages {
     push(@temp1,$content{'recuser'},$content{'recdomain'});      push(@temp1,$content{'recuser'},$content{'recdomain'});
  }   }
         # Check whether message was sent during blocking period.          # Check whether message was sent during blocking period.
         if ($sendtime >= $startblock && ($sendtime <= $endblock && $endblock > 0) ) {          if (($by_ip) ||
               (($sendtime >= $startblock) && ($sendtime <= $endblock && $endblock > 0))) {
             $$blocked{$msgid} = 'ON';              $$blocked{$msgid} = 'ON';
             $$numblocked ++;              $$numblocked ++;
         } else {           } else { 
Line 987  sub get_course_desc { Line 1021  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 1007  sub disall { Line 1046  sub disall {
     &Apache::loncommon::store_settings('user','mail',\%saveable);      &Apache::loncommon::store_settings('user','mail',\%saveable);
     &Apache::loncommon::restore_settings('user','mail',\%saveable);      &Apache::loncommon::restore_settings('user','mail',\%saveable);
     $folder    ||= $env{'form.folder'};      $folder    ||= $env{'form.folder'};
       # Always show critical messages if present
       my @what=&Apache::lonnet::dump('critical',$env{'user.domain'},$env{'user.name'});
       if ($what[0]) {
    if (($what[0] ne 'con_lost') && ($what[0]!~/^error\:/)) {
               $folder = 'critical';
           }
       }
     $msgstatus ||= $env{'form.msgstatus'};      $msgstatus ||= $env{'form.msgstatus'};
     $env{'form.interdis'} ||= 20;      $env{'form.interdis'} ||= 20;
   
Line 1026  sub disfolder { Line 1072  sub disfolder {
     my %blocked = ();      my %blocked = ();
     my %setters = ();      my %setters = ();
     my $numblocked = 0;      my $numblocked = 0;
     my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');      my $clientip = &Apache::lonnet::get_requestor_ip($r);
     my %lt = &Apache::lonlocal::texthash(      my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) =
           &Apache::loncommon::blockcheck(\%setters,'com',$clientip);
       my %js_lt = &Apache::lonlocal::texthash(
                       sede => 'Select a destination folder to which the messages will be moved.',                        sede => 'Select a destination folder to which the messages will be moved.',
                       nome => 'No messages have been selected to apply this action to.',                        nome => 'No messages have been selected to apply this action to.',
                       chec => 'Check the checkbox for at least one message.',                          chec => 'Check the checkbox for at least one message.',  
     );      );
       &js_escape(\%js_lt);
     my $jscript = &Apache::loncommon::check_uncheck_jscript();      my $jscript = &Apache::loncommon::check_uncheck_jscript();
     $r->print(<<ENDDISHEADER);      $r->print(<<ENDDISHEADER);
 <script type="text/javascript">  <script type="text/javascript">
Line 1042  sub disfolder { Line 1091  sub disfolder {
         document.disall.markedaction.value = document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value;          document.disall.markedaction.value = document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value;
         if (document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value == 'markedmove') {          if (document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value == 'markedmove') {
             if (document.disall.movetofolder.options[document.disall.movetofolder.selectedIndex].value == "") {              if (document.disall.movetofolder.options[document.disall.movetofolder.selectedIndex].value == "") {
                 alert("$lt{'sede'}");                  alert("$js_lt{'sede'}");
                 return;                  return;
             }               } 
         }          }
Line 1059  sub disfolder { Line 1108  sub disfolder {
             }              }
         }             }   
         if (checktotal == 0) {          if (checktotal == 0) {
             alert("$lt{'nome'}\\n$lt{'chec'}");              alert("$js_lt{'nome'}\\n$js_lt{'chec'}");
             return;              return;
         }          }
         document.disall.submit();          document.disall.submit();
Line 1069  sub disfolder { Line 1118  sub disfolder {
 ENDDISHEADER  ENDDISHEADER
   
     my $fsqs='&amp;folder='.$folder;      my $fsqs='&amp;folder='.$folder;
     my @temp=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus);      my @temp=&sortedmessages(\%blocked,$startblock,$endblock,$by_ip,\$numblocked,$folder,$msgstatus);
     my $totalnumber=$#temp+1;      my $totalnumber=$#temp+1;
     if ($totalnumber < 1) {      if ($totalnumber < 1) {
         $r->print('<p class="LC_info">');          $r->print('<p class="LC_info">');
Line 1082  ENDDISHEADER Line 1131  ENDDISHEADER
         }          }
         $r->print('</p>');          $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,$by_ip,$clientip,$blockdom,
                                          \%setters));                                           \%setters));
         }          }
         return;          return;
Line 1188  ENDDISHEADER Line 1237  ENDDISHEADER
             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>':'').'</a></td>');                            $item.'</a>'.(($status eq 'new')?'</b>':'').'</td>');
             }              }
             # Description and Status              # Description and Status
             my $showstatus;              my $showstatus;
Line 1219  ENDDISHEADER Line 1268  ENDDISHEADER
   
   
     # Bottom Functions      # Bottom Functions
     $r->print('<table border="0" cellspacing="2" cellpadding="8">      $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 />
    <fieldset>  
    <legend>'.&mt('Select').'</legend>  
    <span class="LC_nobreak">     <span class="LC_nobreak">
    <input type="button" onclick="javascript:checkAll(document.disall.delmark)" value="'.&mt('Check All').'" />'."\n".     <input type="button" onclick="javascript:checkAll(document.disall.delmark)" value="'.&mt('Check All').'" />'."\n".
   ' <input type="button" onclick="javascript:uncheckAll(document.disall.delmark)" value="'.&mt('Uncheck All').'" />'."\n".    ' <input type="button" onclick="javascript:uncheckAll(document.disall.delmark)" value="'.&mt('Uncheck All').'" />'."\n".
   '<input type="hidden" name="sortedby" value="'.$env{'form.sortedby'}.'" />    '<input type="hidden" name="sortedby" value="'.$env{'form.sortedby'}.'" />
   </span>    </span>
   </fieldset>  
   </td>'."\n".    </td>'."\n".
   '<td><b>'.&mt('Action').'</b><br />'."\n".    '<td><b>'.&mt('Action').'</b><br />'."\n".
   '  <select name="checkedaction">'."\n");    '  <select name="checkedaction">'."\n");
Line 1238  ENDDISHEADER Line 1287  ENDDISHEADER
         $r->print('    <option value="markeddel">'.&mt('Delete').'</option>'."\n");          $r->print('    <option value="markeddel">'.&mt('Delete').'</option>'."\n");
     }      }
     if ($msgstatus ne 'read') {      if ($msgstatus ne 'read') {
         $r->print('    <option value="markedread">'.&mt('Mark Read').'</option>."\n"');          $r->print('    <option value="markedread">'.&mt('Mark Read').'</option>'."\n");
     }      }
     if ($msgstatus ne 'unread') {      if ($msgstatus ne 'unread') {
         $r->print('    <option value="markedunread">'.&mt('Mark Unread').'</option>'."\n");          $r->print('    <option value="markedunread">'.&mt('Mark Unread').'</option>'."\n");
Line 1253  ENDDISHEADER Line 1302  ENDDISHEADER
     $r->print("\n".'</select></td>'."\n");      $r->print("\n".'</select></td>'."\n");
   
     if (keys(%gotfolders) > 0) {      if (keys(%gotfolders) > 0) {
         $r->print('<td><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;
Line 1262  ENDDISHEADER Line 1311  ENDDISHEADER
         $r->print(&Apache::loncommon::select_form('','movetofolder',\%userfolders).          $r->print(&Apache::loncommon::select_form('','movetofolder',\%userfolders).
                   '</td>');                    '</td>');
     }      }
     $r->print('<td>'.      $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));                                       $by_ip,$clientip,$blockdom,\%setters));
     }      }
 }  }
   
 sub blocked_in_folder {  sub blocked_in_folder {
     my ($numblocked,$startblock,$endblock,$setters) = @_;      my ($numblocked,$startblock,$endblock,$by_ip,$clientip,$blockdom,$setters) = @_;
     my $beginblock = &Apache::lonlocal::locallocaltime($startblock);      my $output;
     my $finishblock = &Apache::lonlocal::locallocaltime($endblock);      if ($by_ip) {
     my $output = '<br /><br />'.          $output = '<br /><br />'.
                     &mt('[quant,_1,message is, messages are] not viewable because display of LON-CAPA messages is blocked for your current IP address: [_2].',$numblocked,$clientip).'<br />'.
                     &mt('Note: communication is being blocked for certain IP address(es).');
       } else {
           my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
           my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
           $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",$clientip);
     my ($blocked, $blocktext) = &Apache::loncommon::blocking_status("com");  
     $output .="<br /><br />".$blocktext;      $output .="<br /><br />".$blocktext;
   
     return $output;      return $output;
Line 1294  sub blocked_in_folder { Line 1351  sub blocked_in_folder {
 sub compout {  sub compout {
     my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode,      my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode,
         $multiforward)=@_;          $multiforward)=@_;
       my $clientip = &Apache::lonnet::get_requestor_ip($r);
       my %setters;
       my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) =
           &Apache::loncommon::blockcheck(\%setters,'com',$clientip);
       if ($by_ip) {
           my $showdom = &Apache::lonnet::domain($blockdom);
           if ($showdom eq '') {
               $showdom = $blockdom;
           }
           $r->print(&Apache::loncommon::start_page('Messages'));
           $r->print(&Apache::lonhtmlcommon::breadcrumbs('Send and display messages'));
           $r->print('<p class="LC_warning">'.
                    &mt('Sending of LON-CAPA messages is blocked for your current IP address: [_1].',$clientip).'</p>'.
                    '<ul><li>'.
                    &mt('Note: communication is being blocked for certain IP address(es).').
                    '</li><li>'.
                    &mt('This restriction was set by an administrator in the [_1] LON-CAPA domain.',$showdom).
                    '</li></ul>');
           return;
       }
     my $suffix=&Apache::lonmsg::foldersuffix($folder);      my $suffix=&Apache::lonmsg::foldersuffix($folder);
     my ($cdom,$cnum,$group,$refarg);      my ($cdom,$cnum,$group,$refarg);
     if (exists($env{'form.group'})) {      if (exists($env{'form.group'})) {
Line 1368  sub compout { Line 1445  sub compout {
                                        'to'   => 'To:',                                         'to'   => 'To:',
                                       );                                        );
     my %attachmax = (      my %attachmax = (
                      text => &mt('(128 KB max size)'),                       text => &mt('(1 MB max size)'),
                      num  => 131072,                       num  => 1048576,
                     );                      );
     if (!$forwarding && !$multiforward) {      if (!$forwarding && !$multiforward) {
         $attachrow = '<tr><td colspan="3"><b>'.$lt{'atta'}.'</b> '.$attachmax{'text'}.': <input type="file" name="attachment" /></td></tr>';          $attachrow = '<tr><td colspan="3"><b>'.$lt{'atta'}.'</b> '.$attachmax{'text'}
               .': <input type="file" name="attachment" class="LC_flUpload" multiple />'
               .'<input type="hidden" id="LC_free_space" value="'.$attachmax{'num'}.'" />'
               .'</td></tr>';
     }      }
     if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})      if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
  || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.   || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
Line 1449  function courseRecipients() { Line 1529  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 1641  ENDREPSCRIPT Line 1724  ENDREPSCRIPT
         $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 1717  ENDBLOCK Line 1800  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 1871  sub disfacetoface { Line 1954  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='<div>';      my $result='';
     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 '');
Line 1903  sub disfacetoface { Line 1986  sub disfacetoface {
             } else {              } else {
                 %content=&Apache::lonmsg::unpackagemsg($content{'message'});                  %content=&Apache::lonmsg::unpackagemsg($content{'message'});
                 $content{'message'} =                  $content{'message'} =
                 '<b>'.&mt('Subject').': '.$content{'subject'}.'</b><br                  '<b>'.&mt('Subject').': '.$content{'subject'}.'</b><br />'.
 '.  
                 $content{'message'};                  $content{'message'};
             }              }
         } else {          } else {
Line 1925  sub disfacetoface { Line 2007  sub disfacetoface {
  &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('.   &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('.
 $content{'sendername'}.':'.  $content{'sendername'}.':'.
             $content{'senderdomain'}.') '.$content{'time'}.              $content{'senderdomain'}.') '.$content{'time'}.
             '<br /><pre>'.              '<br /><pre class="LC_wordwrap">'.
               &Apache::lontexconvert::msgtexconverted($content{'message'}).                &Apache::lontexconvert::msgtexconverted($content{'message'}).
       '</pre>';        '</pre>';
      }       }
Line 1933  $content{'sendername'}.':'. Line 2015  $content{'sendername'}.':'.
     if ($result eq '') {      if ($result eq '') {
         my $lctype = &mt(lc(&Apache::loncommon::course_type()));          my $lctype = &mt(lc(&Apache::loncommon::course_type()));
  if ($target ne 'tex') {    if ($target ne 'tex') { 
     $r->print("<p><b>".&mt('No notes, face-to-face discussion records, critical messages, or broadcast messages in this [_1].',$lctype)."</b></p>");      $r->print("<p><b>".&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this '.$lctype.'.')."</b></p>");
  } else {   } else {
     $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this [_1].',$lctype).'}\\\\');      $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this '.$lctype.'.').'}\\\\');
  }   }
     } elsif ($target ne 'tex') {      } elsif ($target eq 'tex') {
        $r->print($result.'</div>');          $r->print(&Apache::lonxml::xmlparse($r,$target,$result));
     } else {      } else {
  $r->print(&Apache::lonxml::xmlparse($r, 'tex', $result));          $r->print('<div>'.$result.'</div>');
  }      }
 }  }
   
 sub general_message {  sub general_message {
Line 2025  sub facetoface { Line 2107  sub facetoface {
                  .&mt('Discussion and message records for [_1] ([_2])'                   .&mt('Discussion and message records for [_1] ([_2])'
                      ,$aboutmelink                       ,$aboutmelink
                      ,$env{'form.recuname'}.':'.$env{'form.recdomain'})                       ,$env{'form.recuname'}.':'.$env{'form.recdomain'})
                  .'<h2>'                   .'</h2>'
        );         );
         &disfacetoface($r,$env{'form.recuname'},$env{'form.recdomain'});          &disfacetoface($r,$env{'form.recuname'},$env{'form.recdomain'});
  $r->print(<<ENDRHEAD);   $r->print(<<ENDRHEAD);
Line 2044  ENDBFORM Line 2126  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;  
     my $crstype = &Apache::loncommon::course_type();  
     if ($crstype eq 'Community') {  
         $usertype = 'members';  
     } else {  
  $usertype = 'students';  
     }  
     my $lctype = lc($crstype);  
     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 $lctype 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 or community, 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="checked"';  
             }  
             $r->print('<span class="LC_nobreak"><label><input type="checkbox" name="'.$block.'_'.$parmcount.'" '.$blockstatus.' value="1" />'.$types->{$block}.'</label></span><br />');  
         }  
         $r->print(<<"END");  
         </td>        
         <td><span class="LC_nobreak"><label>  
         <input type="checkbox" name="modify_$parmcount" />$lt{'modi'}  
         </label></span><br /><span class="LC_nobreak">  
         <label>  
         <input type="checkbox" name="cancel_$parmcount" />$lt{'canc'}  
         </label></span>  
 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('<span class="LC_nobreak"><label><input type="checkbox" name="'.$block.'_'.$parmcount.'" value="1" />'.$types->{$block}.'</label></span><br />');  
      }  
      $r->print(<<"END");  
      </td>  
      <td><span class="LC_nobreak"><label>  
      <input type="checkbox" name="add_$parmcount" value="1" />$lt{'addb'}  
      </label></span></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 Room',  
         '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 2364  sub displaymessage { Line 2135  sub displaymessage {
     my %setters = ();      my %setters = ();
     my $numblocked = 0;      my $numblocked = 0;
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
       my $clientip = &Apache::lonnet::get_requestor_ip($r);
   
 # info to generate "next" and "previous" buttons and check if message is blocked  # info to generate "next" and "previous" buttons and check if message is blocked
     my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');      my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) =
     my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder,$msgstatus);          &Apache::loncommon::blockcheck(\%setters,'com',$clientip);
       my @messages=&sortedmessages(\%blocked,$startblock,$endblock,$by_ip,\$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",$clientip);
         my($blocked, $blocktext) = &Apache::loncommon::blocking_status("com");  
         $r->print("<br />".$blocktext);          $r->print("<br />".$blocktext);
         return;          return;
     }      }
Line 2406  sub displaymessage { Line 2178  sub displaymessage {
   
   
     my $number_of_messages = scalar(@messages); #subtract 1 for last index      my $number_of_messages = scalar(@messages); #subtract 1 for last index
       my $head_extra;
   
   # if student's view of resource will be included
   # get <link> tag(s) for css file(s) in use, and pass to &header to include
   # in call to loncommon::start_page()
   
       if (($env{'request.course.id'} eq $content{'courseid'}) &&
           (&Apache::lonnet::allowed('vgr',$content{'courseid'}))) {
           my $symb;
           if (defined($content{'symb'})) {
               $symb = $content{'symb'};
           } elsif (defined($content{'baseurl'})) {
               $symb=&Apache::lonnet::symbread($content{'baseurl'});
           }
           if ($symb) {
               $head_extra = &Apache::loncommon::css_links($symb);
           }
       }
   
 # 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','',
     my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'});                   $content{'baseurl'},$head_extra);
   
 # Prepare available functions  # Prepare available functions
     my @functionlist;      my @functionlist;
Line 2426  sub displaymessage { Line 2217  sub displaymessage {
     push(@functionlist,'<a href="/adm/email?markdel='.&escape($msgid).$sqs.'">'      push(@functionlist,'<a href="/adm/email?markdel='.&escape($msgid).$sqs.'">'
                   .&mt('Delete')                    .&mt('Delete')
                   .'</a>');                    .'</a>');
     push(@functionlist,'<a href="/adm/email?'.$sqs.'">'  
                   .&mt('Back to Folder Display')  # Prepare available navigation
                   .'</a>');      my @navigationlist;
     if ($counter > 0){      if ($counter > 0){
         push(@functionlist,'<a href="/adm/email?display='.$messages[$counter-1]->[5].$sqs.'">'          push(@navigationlist,'<a href="/adm/email?display='.$messages[$counter-1]->[5].$sqs.'">'
                           .&mt('Previous')                            .&mt('Previous')
                           .'</a>');                            .'</a>');
     }      }
     if ($counter < $number_of_messages - 1){      if ($counter < $number_of_messages - 1){
         push(@functionlist,'<a href="/adm/email?display='.$messages[$counter+1]->[5].$sqs.'">'          push(@navigationlist,'<a href="/adm/email?display='.$messages[$counter+1]->[5].$sqs.'">'
                           .&mt('Next')                            .&mt('Next')
                           .'</a>');                            .'</a>');
     }      }
       push(@navigationlist,'<a href="/adm/email?'.$sqs.'">'
                     .&mt('Back to Folder Display')
                     .'</a>');
   
 # Prepare available actions  # Prepare available actions
     my $symb;      my $symb;
Line 2447  sub displaymessage { Line 2241  sub displaymessage {
     } elsif (defined($content{'baseurl'})) {      } elsif (defined($content{'baseurl'})) {
         $symb=&Apache::lonnet::symbread($content{'baseurl'});          $symb=&Apache::lonnet::symbread($content{'baseurl'});
     }      }
         my @actionlist;      my @actionlist;
     if ($env{'user.adv'}) {      if ($env{'user.adv'}) {
   
  if (&Apache::lonnet::allowed('vgr',$env{'request.course.id'})) {   if (($env{'request.course.id'}) && ($from_student) &&
               (&Apache::lonnet::allowed('vgr',$env{'request.course.id'}))) {
  push(@actionlist,&Apache::loncommon::track_student_link(   push(@actionlist,&Apache::loncommon::track_student_link(
                                       &mt('View recent activity')                                        'View recent activity'
                                      ,$content{'sendername'}                                       ,$content{'sendername'}
                                      ,$content{'senderdomain'}                                       ,$content{'senderdomain'}
                                      ,'check'));                                       ,'check'));
Line 2475  sub displaymessage { Line 2270  sub displaymessage {
  }   }
     }      }
   
 # Print functionlist and actionlist in page header  # Print functionlist, navigationlist, and actionlist in page header
         my $functions='<div class="LC_columnSection">';          my $functions='<div class="LC_columnSection">';
   
         # Functionlist          # Functionlist
Line 2485  sub displaymessage { Line 2280  sub displaymessage {
         }          }
         $functions .= &Apache::lonhtmlcommon::end_funclist();          $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          # Actionlist
         if (@actionlist) {          if (@actionlist) {
             my $legendtext=&mt('Currently available actions (will open extra window)');              $functions.=&Apache::lonhtmlcommon::start_funclist(
             $functions.=&Apache::lonhtmlcommon::start_funclist($legendtext);                              &mt('Currently available actions (will open extra window)'));
             foreach my $item (@actionlist) {              foreach my $item (@actionlist) {
                 $functions.=&Apache::lonhtmlcommon::add_item_funclist($item);                  $functions.=&Apache::lonhtmlcommon::add_item_funclist($item);
             }              }
Line 2667  sub displaymessage { Line 2470  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 2737  sub displaymessage { Line 2548  sub displaymessage {
   
     # Message      # Message
     $r->print(&Apache::lonhtmlcommon::row_title(&mt('Message'))      $r->print(&Apache::lonhtmlcommon::row_title(&mt('Message'))
              .'<pre>'               .'<pre class="LC_wordwrap">'
      .&Apache::lontexconvert::msgtexconverted($content{'message'},1)       .&Apache::lontexconvert::msgtexconverted($content{'message'},1)
      .'</pre>'       .'</pre>'
     );      );
Line 2897  sub displayresource { Line 2708  sub displayresource {
         }          }
 # Could not get a symb, give up  # Could not get a symb, give up
  unless ($symb) { return $content{'citation'}; }   unless ($symb) { return $content{'citation'}; }
           if ($symb =~ /ext\.tool$/) {
               return '<h2>'.&mt('Current transactions for student (if applicable)').'</h2>'.
               &Apache::loncommon::get_previous_attempt($symb,
                                                        $content{'sendername'},
                                                        $content{'senderdomain'},
                                                        $content{'courseid'});
           }
 # Have a symb, can render  # Have a symb, can render
  return '<h2>'.&mt('Current attempts of student (if applicable)').'</h2>'.   return '<h2>'.&mt('Current attempts of student (if applicable)').'</h2>'.
     &Apache::loncommon::get_previous_attempt($symb,      &Apache::loncommon::get_previous_attempt($symb,
Line 2922  sub displayresource { Line 2740  sub displayresource {
 # ================================================================== The Header  # ================================================================== The Header
   
 sub header {  sub header {
     my ($r,$title,$baseurl)=@_;      my ($r,$title,$baseurl,$head_extra)=@_;
     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\" />";
     }      }
       $extra .= '<script type="text/javascript"
                   src="/res/adm/includes/file_upload.js"></script>';
       if ($head_extra) {
           $extra .= "\n$head_extra";
       }
     $r->print(&Apache::loncommon::start_page('Messages',      $r->print(&Apache::loncommon::start_page('Messages',
   $extra));    $extra));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs      $r->print(&Apache::lonhtmlcommon::breadcrumbs
Line 2936  sub header { Line 2759  sub header {
 # ---------------------------------------------------------------- Print header  # ---------------------------------------------------------------- Print header
   
 sub printheader {  sub printheader {
     my ($r,$url,$desc,$title,$baseurl)=@_;      my ($r,$url,$desc,$title,$baseurl,$head_extra)=@_;
     &Apache::lonhtmlcommon::add_breadcrumb      &Apache::lonhtmlcommon::add_breadcrumb
  ({href=>$url,   ({href=>$url,
   text=>$desc});    text=>$desc});
     &header($r,$title,$baseurl);      &header($r,$title,$baseurl,$head_extra);
 }  }
   
 # ------------------------------------------------------------ Store the comment  # ------------------------------------------------------------ Store the comment
Line 2964  sub storedcommentlisting { Line 2787  sub storedcommentlisting {
        '^'.&escape(&escape($env{'form.showcommentbaseurl'})));         '^'.&escape(&escape($env{'form.showcommentbaseurl'})));
     $r->print(&Apache::loncommon::start_page('Saved Comment Listing',undef,      $r->print(&Apache::loncommon::start_page('Saved Comment Listing',undef,
      {'onlybody' => 1}));       {'onlybody' => 1}));
     if ((keys %msgs)[0]=~/^error\:/) {      if ((keys(%msgs))[0]=~/^error\:/) {
  $r->print(&mt('No saved comments yet.'));   $r->print(&mt('No saved comments yet.'));
     } else {      } else {
  my $found=0;   my $found=0;
Line 2997  sub sendoffmail { Line 2820  sub sendoffmail {
         $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     }      }
     if ($env{'form.send'}) {      my $clientip = &Apache::lonnet::get_requestor_ip($r);
         if (!$env{'form.multiforward'}) {       my %setters;
       my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) =
           &Apache::loncommon::blockcheck(\%setters,'com',$clientip);
       if ($by_ip) {
           &printheader($r,'','Sending messages blocked from your location.');
           return 'blocked';
       } elsif ($env{'form.send'}) {
           if (!$env{'form.multiforward'}) {
             if ($group eq '') {              if ($group eq '') {
         &printheader($r,'','Messages being sent.');          &printheader($r,'','Messages being sent.');
             } else {              } else {
Line 3028  sub sendoffmail { Line 2858  sub sendoffmail {
   
  my $mode = $env{'form.sendmode'};   my $mode = $env{'form.sendmode'};
  my (%toaddr,$tos,$cc,$bcc,$broadcast);   my (%toaddr,$tos,$cc,$bcc,$broadcast);
           my (%willtrust,%trustchecked,%disallowed);
           my $serverdefdom = &Apache::lonnet::default_login_domain();
   
  if ($mode eq 'group') {   if ($mode eq 'group') {
             if (defined($env{'form.courserecips'})) {              if (defined($env{'form.courserecips'})) {
Line 3037  sub sendoffmail { Line 2869  sub sendoffmail {
                 foreach my $dest (@to) {                  foreach my $dest (@to) {
                     my ($user,$domain) = split(/:/, $dest);                      my ($user,$domain) = split(/:/, $dest);
                     if (($user ne '') && ($domain ne '')) {                      if (($user ne '') && ($domain ne '')) {
                         my $rec = $user.":".$domain;                          unless ($trustchecked{$domain}) {
                         $toaddr{$rec} = '';                              $willtrust{$domain} = &Apache::lonnet::will_trust('msg',$serverdefdom,$domain);
                         $broadcast->{$rec} = '';                              $trustchecked{$domain} = 1;
                           }
                           if ($willtrust{$domain}) {
                               my $rec = $user.":".$domain;
                               $toaddr{$rec} = '';
                               $broadcast->{$rec} = '';
                           } else {
                               $disallowed{'to'}{$user.":".$domain} = 1; 
                           }
                     }                      }
                 }                  }
             }              }
Line 3050  sub sendoffmail { Line 2890  sub sendoffmail {
  if ($txt) {   if ($txt) {
                     $rec =~ s/^\s+//;                      $rec =~ s/^\s+//;
                     $rec =~ s/\s+$//;                      $rec =~ s/\s+$//;
     $toaddr{$rec}.=$txt."\n";                      my ($recuname,$recudom) = split(/:/,$rec);
                     $broadcast->{$rec} = '';                      unless ($trustchecked{$recudom}) {
                           $willtrust{$recudom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$recudom);
                           $trustchecked{$recudom} = 1;
                       }
                       if ($willtrust{$recudom}) {
           $toaddr{$rec}.=$txt."\n";
                           $broadcast->{$rec} = '';
                       } else {
                           $disallowed{'to'}{$rec} = 1;
                       }
  }   }
     }      }
  } else {   } else {
     if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) {      if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) {
  $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';                  unless ($trustchecked{$env{'form.recdomain'}}) {
                 $tos->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';                      $willtrust{$env{'form.recdomain'}} = &Apache::lonnet::will_trust('msg',$serverdefdom,$env{'form.recdomain'});
                       $trustchecked{$env{'form.recdomain'}} = 1;
                   }
                   if ($willtrust{$env{'form.recdomain'}}) {
       $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
                       $tos->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
                   } else {
                       $disallowed{'to'}{$env{'form.recuname'}.':'.$env{'form.recdomain'}}; 
                   }
     }      }
  }   }
         if ($env{'form.additionalrec_to'}) {          if ($env{'form.additionalrec_to'}) {
             foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_to'})) {              foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_to'})) {
                 my ($auname,$audom)=split(/:/,$rec);                  my ($auname,$audom)=split(/:/,$rec);
                 if (($auname ne "") && ($audom ne "")) {                  if (($auname ne "") && ($audom ne "")) {
                     $toaddr{$auname.':'.$audom}='';                      unless ($trustchecked{$audom}) {
                     $tos->{$auname.':'.$audom}='';                          $willtrust{$audom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$audom);
                           $trustchecked{$audom} = 1;
                       }
                       if ($willtrust{$audom}) {
                           $toaddr{$auname.':'.$audom}='';
                           $tos->{$auname.':'.$audom}='';
                       } else {
                           $disallowed{'to'}{$auname.':'.$audom};
                       }
                 }                  }
             }              }
         }          }
Line 3075  sub sendoffmail { Line 2940  sub sendoffmail {
             foreach my $rec (@toreplies) {              foreach my $rec (@toreplies) {
                 my ($auname,$audom)=split(/:/,$rec);                  my ($auname,$audom)=split(/:/,$rec);
                 if (($auname ne "") && ($audom ne "")) {                  if (($auname ne "") && ($audom ne "")) {
                     $toaddr{$auname.':'.$audom}='';                      unless ($trustchecked{$audom}) {
                     $tos->{$auname.':'.$audom}='';                          $willtrust{$audom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$audom);
                           $trustchecked{$audom} = 1;
                       }
                       if ($willtrust{$audom}) {
                           $toaddr{$auname.':'.$audom}='';
                           $tos->{$auname.':'.$audom}='';
                       } else {
                           $disallowed{'to'}{$auname.':'.$audom};
                       } 
                 }                  }
             }              }
         }          }
Line 3084  sub sendoffmail { Line 2957  sub sendoffmail {
     foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_cc'})) {      foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_cc'})) {
  my ($auname,$audom)=split(/:/,$rec);   my ($auname,$audom)=split(/:/,$rec);
  if (($auname ne "") && ($audom ne "")) {   if (($auname ne "") && ($audom ne "")) {
                     $toaddr{$auname.':'.$audom}='';  
                     if (!defined($tos->{$auname.':'.$audom})) {                      if (!defined($tos->{$auname.':'.$audom})) {
         $cc->{$auname.':'.$audom}='';                          unless ($trustchecked{$audom}) {
                               $willtrust{$audom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$audom);
                               $trustchecked{$audom} = 1;
                           }
                           if ($willtrust{$audom}) {
                               $toaddr{$auname.':'.$audom}='';
               $cc->{$auname.':'.$audom}='';
                           } else {
                               $disallowed{'cc'}{$auname.':'.$audom};
                           }
                     }                      }
  }   }
     }      }
Line 3097  sub sendoffmail { Line 2978  sub sendoffmail {
             foreach my $rec (@ccreplies) {              foreach my $rec (@ccreplies) {
                 my ($auname,$audom)=split(/:/,$rec);                  my ($auname,$audom)=split(/:/,$rec);
                 if (($auname ne "") && ($audom ne "")) {                  if (($auname ne "") && ($audom ne "")) {
                     $toaddr{$auname.':'.$audom}='';  
                     if (!defined($tos->{$auname.':'.$audom})) {                      if (!defined($tos->{$auname.':'.$audom})) {
                         $cc->{$auname.':'.$audom}='';                          unless ($trustchecked{$audom}) {
                               $willtrust{$audom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$audom);
                               $trustchecked{$audom} = 1;
                           }
                           if ($willtrust{$audom}) {
                               $toaddr{$auname.':'.$audom}='';
                               $cc->{$auname.':'.$audom}='';
                           } else {
                               $disallowed{'cc'}{$auname.':'.$audom} = 1;
                           }
                     }                      }
                 }                  }
             }              }
Line 3110  sub sendoffmail { Line 2999  sub sendoffmail {
             foreach my $rec (@groupreplies) {              foreach my $rec (@groupreplies) {
                 my ($auname,$audom)=split(/:/,$rec);                  my ($auname,$audom)=split(/:/,$rec);
                 if (($auname ne "") && ($audom ne "")) {                  if (($auname ne "") && ($audom ne "")) {
                     $toaddr{$auname.':'.$audom}='';  
                     if (!defined($tos->{$auname.':'.$audom})) {                      if (!defined($tos->{$auname.':'.$audom})) {
                         $broadcast->{$auname.':'.$audom}='';                          unless ($trustchecked{$audom}) {
                               $willtrust{$audom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$audom);
                               $trustchecked{$audom} = 1;
                           }
                           if ($willtrust{$audom}) {
                               $toaddr{$auname.':'.$audom}='';
                               $broadcast->{$auname.':'.$audom}='';
                           } else {
                               $disallowed{'to'}{$auname.':'.$audom} = 1;
                           }
                     }                      }
                 }                  }
             }              }
Line 3121  sub sendoffmail { Line 3018  sub sendoffmail {
             foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_bcc'})) {              foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_bcc'})) {
                 my ($auname,$audom)=split(/:/,$rec);                  my ($auname,$audom)=split(/:/,$rec);
                 if (($auname ne "") && ($audom ne "")) {                  if (($auname ne "") && ($audom ne "")) {
                     $toaddr{$auname.':'.$audom}='';                      if ((!defined($tos->{$auname.':'.$audom})) &&
                     if ((!defined($tos->{$auname.':'.$audom})) &&   
                         (!defined($cc->{$auname.':'.$audom}))) {                          (!defined($cc->{$auname.':'.$audom}))) {
                         $bcc->{$auname.':'.$audom}='';                          unless ($trustchecked{$audom}) {
                               $willtrust{$audom} = &Apache::lonnet::will_trust('msg',$serverdefdom,$audom);
                               $trustchecked{$audom} = 1;
                           }
                           if ($willtrust{$audom}) {
                               $toaddr{$auname.':'.$audom}='';
                               $bcc->{$auname.':'.$audom}='';
                           } else {
                               $disallowed{'bcc'}{$auname.':'.$audom} = 1;
                           }
                     }                      }
                 }                  }
             }              }
Line 3144  sub sendoffmail { Line 3049  sub sendoffmail {
         } else {          } else {
             $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});              $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});
         }          }
         my %reciphash = (          my ($recipid, @recusers, @recudoms, %permresults);
                            to => $tos,          if (keys(%toaddr) > 0) {
                            cc => $cc,              my %reciphash = (
                            bcc => $bcc,                                 to => $tos,
                         );                                 cc => $cc,
         if ($mode eq 'group') {                                 bcc => $bcc,
             if ($group eq '') {                              );
                 $reciphash{'course_broadcast'} = $broadcast;              if ($mode eq 'group') {
             } else {                  if ($group eq '') {
                 if ($env{'form.groupmail'} eq 'cc') {                      $reciphash{'course_broadcast'} = $broadcast;
                     $reciphash{'group_cc_broadcast'} = $broadcast;  
                 } else {                  } else {
                     $reciphash{'group_bcc_broadcast'} = $broadcast;                      if ($env{'form.groupmail'} eq 'cc') {
                           $reciphash{'group_cc_broadcast'} = $broadcast;
                       } else {
                           $reciphash{'group_bcc_broadcast'} = $broadcast;
                       }
                 }                  }
             }              }
         }              ($recipid,my $recipstatus) = 
         my ($recipid,$recipstatus) =                   &Apache::lonmsg::store_recipients($msgsubj,$env{'user.name'},
             &Apache::lonmsg::store_recipients($msgsubj,$env{'user.name'},                                                    $env{'user.domain'},\%reciphash);
                                        $env{'user.domain'},\%reciphash);              if ($recipstatus ne 'ok') {
         if ($recipstatus ne 'ok') {                  &Apache::lonnet::logthis('Failed to store To, Bcc and Cc recipients for '.$env{'user.name'}.':'.$env{'user.domain'});
             &Apache::lonnet::logthis('Failed to store To, Bcc and Cc recipients for '.$env{'user.name'}.':'.$env{'user.domain'});              }
         }              if ($env{'form.attachment'}) {
         if ($env{'form.attachment'}) {                  if (length($env{'form.attachment'}) <= 1048576) {
             if (length($env{'form.attachment'})<131072) {                      $attachmenturl=&Apache::lonnet::userfileupload('attachment',undef,'feedback/'.$now);
                 $attachmenturl=&Apache::lonnet::userfileupload('attachment',undef,'feedback/'.$now);                  } else {
             } else {                      $r->print('<p><span class="LC_warning">'.&mt('Attachment not included - exceeded permitted length').'</span><br /></p>');
                 $r->print('<p><span class="LC_warning">'.&mt('Attachment not included - exceeded permitted length').'</span><br /></p>');                  }
             }              } elsif ($env{'form.multiforward'}) {
         } elsif ($env{'form.multiforward'}) {                  if ($env{'form.attachmenturl'} ne '') {
             if ($env{'form.attachmenturl'} ne '') {                      $attachmenturl = $env{'form.attachmenturl'};
                 $attachmenturl = $env{'form.attachmenturl'};                  }
             }              }
         }          }
         my @recusers;  
         my @recudoms;  
  foreach my $address (sort(keys(%toaddr))) {   foreach my $address (sort(keys(%toaddr))) {
     my ($recuname,$recdomain)=split(/\:/,$address);      my ($recuname,$recdomain)=split(/\:/,$address);
             my $msgtxt = $savemsg;              my $msgtxt = $savemsg;
Line 3195  sub sendoffmail { Line 3101  sub sendoffmail {
    $env{'form.sendbck'},     $env{'form.sendbck'},
    $env{'form.permanent'},     $env{'form.permanent'},
    \$sentmessage{$address},     \$sentmessage{$address},
                                                    $nosentstore,$recipid);                                                     $nosentstore,$recipid,
                                                      $attachmenturl,\%permresults);
     } else {      } else {
  $r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');   $r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');
  @thismsg=   @thismsg=
Line 3206  sub sendoffmail { Line 3113  sub sendoffmail {
      $env{'form.permanent'},       $env{'form.permanent'},
      \$sentmessage{$address},       \$sentmessage{$address},
                                                      undef,undef,undef,                                                       undef,undef,undef,
                                                      $nosentstore,$recipid);                                                       $nosentstore,$recipid,
                                                        \%permresults);
             }              }
     $msg_status{$recuname.':'.$recdomain}=join(' ',@thismsg);      $msg_status{$recuname.':'.$recdomain}=join(' ',@thismsg);
     if ($msg_status{$recuname.':'.$recdomain} =~ /(ok|con_delayed)/) {        if ($msg_status{$recuname.':'.$recdomain} =~ /(ok|con_delayed)/) {  
         $numsent++;          $numsent++;
                 push(@recusers,$recuname);                  push(@recusers,$recuname);
                 push(@recudoms,$recdomain);                  push(@recudoms,$recdomain);
                   if ($1 eq 'ok') {
                       $r->print('ok ');
                   }
                   if ($permresults{$recuname.':'.$recdomain}) {
                       $r->print(' (email) ');
                   }
     }      }
     $sendstatus.=' '.join(' ',@thismsg);      $sendstatus.=' '.join(' ',@thismsg);
  }   }
Line 3308  sub sendoffmail { Line 3222  sub sendoffmail {
                 $r->print($message);                  $r->print($message);
             }              }
         }          }
           if (keys(%disallowed)) {
               if ((ref($disallowed{'to'}) eq 'HASH') && (keys(%{$disallowed{'to'}}) > 0)) {
                   $r->print(&mt("The following recipients were excluded because the user's domain does not accept messages from server's domain:").'<ul><li>'.
                             join("</li><li>\n",sort(keys(%{$disallowed{'to'}}))).
                             '</li><ul><br />');
               }
               if (ref($disallowed{'cc'}) eq 'HASH') {
                   $r->print(&mt("The following CCs were excluded because the user's domain does not accept messages from server's domain:").'<ul><li>'.
                             join("</li><li>\n",sort(keys(%{$disallowed{'cc'}}))).
                             '</li><ul><br />');
               }
               if (ref($disallowed{'bcc'}) eq 'HASH') {
                   $r->print(&mt("The following BCCs were excluded because the user's domain does not accept messages from server's domain:").'<ul><li>'.
                             join("</li><li>\n",sort(keys(%{$disallowed{'bcc'}}))).
                             '</li><ul><br />');
               }
           }
     } else {      } else {
         &printheader($r,'','Messages cancelled.');          &printheader($r,'','Messages cancelled.');
         return 'cancelled';          return 'cancelled';
Line 3331  sub handler { Line 3262  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='&amp;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
   
Line 3542  sub handler { Line 3471  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 3594  sub handler { Line 3521  sub handler {
                 my $count = keys(%forwardfail);                  my $count = keys(%forwardfail);
                 my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Could not forward [quant,_1,message].',$count),1);                  my $message = &Apache::lonhtmlcommon::confirm_success(&mt('Could not forward [quant,_1,message].',$count),1);
                 foreach my $key (keys(%forwardfail)) {                  foreach my $key (keys(%forwardfail)) {
                     $message .= '<br />'.&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}.')';                      if ($forwardfail{$key} eq 'blocked') {
                           $message .= &mt('Sending messages is blocked from your IP address');
                       } else {
                           $message .= &mt('The recipient addresses may need to be corrected').' ('.$forwardfail{$key}.')';
                       }
                 }                  }
                 $message = &Apache::loncommon::confirmwrapper($message);                  $message = &Apache::loncommon::confirmwrapper($message);
                 $r->print($message);                  $r->print($message);

Removed from v.1.156  
changed lines
  Added in v.1.196


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.