Diff for /loncom/interface/lonmsgdisplay.pm between versions 1.27 and 1.49

version 1.27, 2006/05/17 14:58:28 version 1.49, 2006/12/07 21:21:04
Line 126  use Apache::loncommunicate; Line 126  use Apache::loncommunicate;
 use Apache::lonfeedback;  use Apache::lonfeedback;
 use Apache::lonrss();  use Apache::lonrss();
 use Apache::lonselstudent();  use Apache::lonselstudent();
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
   
 # Querystring component with sorting type  # Querystring component with sorting type
 my $sqs;  my $sqs;
Line 136  my $interdis; Line 138  my $interdis;
   
 sub folderlist {  sub folderlist {
     my $folder=shift;      my $folder=shift;
     my @allfolders=&Apache::lonnet::getkeys('email_folders');      my %lt = &Apache::lonlocal::texthash(
     if ($allfolders[0]=~/^error:/) { @allfolders=(); }                  actn => 'Action',
     return '<form method="post" action="/adm/email">'.                  fold => 'Folder',
  &mt('Folder').': '.                  show => 'Show',
  &Apache::loncommon::select_form($folder,'folder',                  go   => 'Go',
      ('' => &mt('INBOX'),'trash' => &mt('TRASH'),      );
       'new' => &mt('New Messages Only'),  
                               'critical' => &mt('Critical'),      my %actions = &Apache::lonlocal::texthash(
       'sent' => &mt('Sent Messages'),                                  view => 'View Folder',
       map { $_ => $_ } @allfolders)).                                  rename => 'Rename Folder',
       ' '.&mt('Show').                                  delete => 'Delete Folder',
       '<select name="interdis">'.      );
       join("\n",map { '<option value="'.$_.'"'.      $actions{'select_form_order'} = ['view','rename','delete'];
  ($_==$interdis?' selected="selected"':'').'>'.$_.'</option>' }  
    (10,20,50,100,200)).'</select>'.      my %permfolders = &get_permanent_folders();
    '<input type="submit" value="'.&mt('View Folder').'" /><br />'.      my $permlist = join("','",sort(keys(%permfolders)));
       my ($permlistkeys,$permlistvals);
       foreach my $key (sort(keys(%permfolders))) {
           $permlistvals .= $permfolders{$key}."','";
           $permlistkeys .= $key."','";
       }
       $permlistvals =~ s/','$//;
       $permlistkeys =~ s/','$//;
       my %gotfolders = &Apache::lonmsg::get_user_folders();
       my %userfolders;
   
       foreach my $key (keys(%gotfolders)) {
           $userfolders{$key} = $key;
       }
       my @userorder = sort(keys(%userfolders));
       my %formhash = (%permfolders,%userfolders);
       my $folderlist = join("','",@userorder);
       $folderlist .= "','".$permlistvals;
   
       $formhash{'select_form_order'} = ['','critical','new',@userorder,'sent','trash'];
       my $output = qq|<script type="text/javascript">
   function folder_choice(targetform,caller) {
       var permfolders_keys = new Array('$permlistkeys');
       var permfolders_vals = new Array('$permlistvals');
       var allfolders = new Array('$folderlist');
       if (caller == 'change') {
           if (targetform.folderaction.options[targetform.folderaction.selectedIndex].value == 'rename') {
               for (var i=0; i<permfolders_keys.length; i++) {
                   if (permfolders_keys[i] == targetform.folder.value) {
                       alert("The '"+permfolders_vals[i]+"' folder may not be renamed as it is a mail folder provided by the system.");
                       return;
                   }
               }
               var foldername=prompt('New Name for Folder','New Name');
               if (foldername) {
                   targetform.renamed.value=foldername;
                   for (var i=0; i<allfolders.length; i++) {
                       if (allfolders[i] == foldername) {
                           alert("The folder may not be renamed '"+foldername+"' as this name is already in use for a system-provided or user-defined folder.");
                           return;
                       }
                   }
                   targetform.submit();
               }
           }
           else {
               targetform.submit();
           }
       }
       if (caller == 'new') {
           var newname=targetform.newfolder.value;
           if (newname) {
               for (var i=0; i<allfolders.length; i++) {
                   if (allfolders[i] == newname) {
                       alert("The new folder may not be named '"+newname+"' as this name is already in use for a system-provided or user-defined folder.");
                       return;
                   }
               }
               targetform.submit();
           }
       }
   }
   </script>|;
       $output .= '
   <form method="post" action="/adm/email" name="folderlist">
   <table border="0" cellspacing="2" cellpadding="2">
    <tr>
     <td align="left">
      <table border="0" cellspacing="2" cellpadding="2">
       <tr>
        <td align="center"><b>'.$lt{'fold'}.'</b><br />'."\n".
            &Apache::loncommon::select_form($folder,'folder',%formhash).'
        </td>
        <td align="center"><b>'.$lt{'show'}.'</b><br />
         <select name="interdis">'.
             join("\n",map { '<option value="'.$_.'"'.
         ($_==$interdis?' selected="selected"':'').'>'.$_.'</option>' 
    }
          (10,20,50,100,200)).'</select>
        </td>
        <td align="center"><b>'.$lt{'actn'}.'</b><br />'.
            &Apache::loncommon::select_form('view','folderaction',%actions).'
        </td><td><br />'.
       '<input type="button" value="'.$lt{'go'}.'" onClick="javascript:folder_choice(this.form,'."'change'".');" />
        </td>
       </tr>
      </table>
     </td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
     <td align="right">
      <table><tr><td><br />
       <input type="button" value="'.&mt('Make New Folder').
       '" onClick="javascript:folder_choice(this.form,'."'new'".');" /></td>'.
       '<td align="center"><b>'.&mt('New Folder').'</b><br />'.
       '<input type="text" size="15" name="newfolder" value="" />
       </td></tr></table>
     </td>
    </tr>
   </table>'."\n".
     '<input type="hidden" name="sortedby" value="'.$env{'form.sortedby'}.'" />'.      '<input type="hidden" name="sortedby" value="'.$env{'form.sortedby'}.'" />'.
       ($folder=~/^(new|critical)/?'</form>':'');      '<input type="hidden" name="renamed" value="" />'.
           ($folder=~/^(new|critical)/?'</form>':'');
       return $output;
   }
   
   sub get_permanent_folders {
       my %permfolders = 
    &Apache::lonlocal::texthash(''         => 'INBOX',
       'trash'    => 'TRASH',
       'new'      => 'New Messages Only',
       'critical' => 'Critical',
       'sent'     => 'Sent Messages',
       );
       return %permfolders;
 }  }
   
 sub scrollbuttons {  sub scrollbuttons {
Line 193  sub statuschange { Line 305  sub statuschange {
 # ============================================================= Make new folder  # ============================================================= Make new folder
   
 sub makefolder {  sub makefolder {
     my ($newfolder)=@_;      my ($newfolder) = @_;
     if (($newfolder eq 'sent')      my %permfolders = &get_permanent_folders();
      || ($newfolder eq 'critical')      my %userfolders = &Apache::lonmsg::get_user_folders();
      || ($newfolder eq 'trash')      my ($outcome,$warning);
      || ($newfolder eq 'new')) { return; }      if (defined($userfolders{$newfolder})) {
     &Apache::lonnet::put('email_folders',{$newfolder => time});          return &mt('The folder name: "[_1]" is already in use for an existing folder.',$newfolder);
       }
       foreach my $perm (keys(%permfolders)) {
           if ($permfolders{$perm} eq $newfolder) {
               return &mt('The folder name: "[_1]" is already used for one of the folders automatically generated by the system.',$newfolder);
           }
       } 
       if (&get_msgfolder_lock() eq 'ok') {
           my %counter_hash = &Apache::lonnet::get('email_folders',["\0".'idcount']);
           my $lastcount = $counter_hash{"\0".'idcount'};
           my $folder_id = $lastcount + 1;
           while (defined($userfolders{$folder_id})) {
               $folder_id ++;
           }
           my %folderinfo = ( id      => $folder_id,
                              created => time, );
           $outcome =  
       &Apache::lonnet::put('email_folders',{$newfolder => \%folderinfo,
     "\0".'idcount' => $folder_id});
           my $releaseresult = &release_msgfolder_lock();
           if ($releaseresult ne 'ok') {
               $warning = $releaseresult;
           }
       } else {
           $outcome = 
       &mt('Error - could not obtain lock on email folders record.');
       }
       return ($outcome,$warning);
   }
   
   # ============================================================= Delete folder
   
   sub deletefolder {
       my ($folder)=@_;
       my %permfolders = &get_permanent_folders();
       if (defined($permfolders{$folder})) {
           return &mt('The folder [_1] may not be deleted',$folder); 
       }
       my %userfolders = &Apache::lonmsg::get_user_folders();
       if (!defined($userfolders{$folder})) {
           return &mt('The folder [_1] does not exist so deletion is not required.',
                      $folder);
       }
       # check folder is empty;
       my $suffix=&Apache::lonmsg::foldersuffix($folder);
       my @messages = &Apache::lonnet::getkeys('nohist_email'.$suffix);
       if (@messages > 0) {
           return &mt('The folder [_1] contains messages so it may not be deleted.').
                  '<br />'.
                  &mt('Delete or move the messages to a different folder first.');
       }
       my $delresult = &Apache::lonnet::del('email_folders',[$folder]);
       return $delresult;
   }
   
   sub renamefolder {
       my ($folder) = @_;
       my $newname = $env{'form.renamed'};
       my %permfolders = &get_permanent_folders();
       if ($env{'form.renamed'} eq '') {
           return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is an invalid name.',$folder,$newname);
       }
       if (defined($permfolders{$newname})) {
           return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is reserved for folders provided automatically by the system.',$folder,$newname);
       }
       my %userfolders = &Apache::lonmsg::get_user_folders();
       if (defined($userfolders{$newname})) {
           return &mt('The folder "[_1]" may not be renamed to "[_2]" because the new name you requested is already being used for an existing folder.',$folder,$newname);
       }
       if (!defined($userfolders{$folder})) {
           return &mt('The folder "[_1]" could not be renamed to "[_2]" because the folder does not exist.',$folder,$newname);
       }
       my %folderinfo;
       if (ref($userfolders{$folder}) eq 'HASH') {
           %folderinfo = %{$userfolders{$folder}};
       } else {
           %folderinfo = ( id      => $folder,
                           created => $userfolders{$folder},);
       }
       my $outcome =
        &Apache::lonnet::put('email_folders',{$newname => \%folderinfo});
       if ($outcome eq 'ok') {
           $outcome = &Apache::lonnet::del('email_folders',[$folder]);
       }
       return $outcome;
   }
   
   sub get_msgfolder_lock {
       # get lock for mail folder counter.
       my $lockhash = { "\0".'lock_counter' => time, };
       my $tries = 0;
       my $gotlock = &Apache::lonnet::newput('email_folders',$lockhash);
       while (($gotlock ne 'ok') && $tries <3) {
           $tries ++;
           sleep(1);
           $gotlock = &Apache::lonnet::newput('email_folders',$lockhash);
       }
       return $gotlock;
   }
   
   sub release_msgfolder_lock {
       #  remove lock
       my @del_lock = ("\0".'lock_counter');
       my $dellockoutcome=&Apache::lonnet::del('email_folders',\@del_lock);
       if ($dellockoutcome ne 'ok') {
           return ('<br />'.&mt('Warning: failed to release lock for counter').'<br />');
       } else {
           return 'ok';
       }
 }  }
   
   
 # ======================================================== Move between folders  # ======================================================== Move between folders
   
 sub movemsg {  sub movemsg {
Line 215  sub movemsg { Line 436  sub movemsg {
 # Copy message  # Copy message
     my %message=&Apache::lonnet::get('nohist_email'.$srcsuffix,[$msgid]);      my %message=&Apache::lonnet::get('nohist_email'.$srcsuffix,[$msgid]);
     if (!exists($message{$msgid}) || $message{$msgid} eq '') {      if (!exists($message{$msgid}) || $message{$msgid} eq '') {
  if (&Apache::slotrequest::network_error(%message)) {   if (&Apache::lonnet::error(%message)) {
     return (0,&mt('Message not moved, A network error occurred.'));      return (0,&mt('Message not moved, A network error occurred.'));
  } else {   } else {
     return (0,&mt('Message not moved as the message is no longer in the source folder.'));      return (0,&mt('Message not moved as the message is no longer in the source folder.'));
Line 224  sub movemsg { Line 445  sub movemsg {
   
     my $result =&Apache::lonnet::put('nohist_email'.$trgsuffix,      my $result =&Apache::lonnet::put('nohist_email'.$trgsuffix,
      {$msgid => $message{$msgid}});       {$msgid => $message{$msgid}});
     if (&Apache::slotrequest::network_error($result)) {      if (&Apache::lonnet::error($result)) {
  return (0,&mt('Message not moved, A network error occurred.'));   return (0,&mt('Message not moved, A network error occurred.'));
     }      }
   
Line 232  sub movemsg { Line 453  sub movemsg {
     unless ($trgfolder eq 'trash') {      unless ($trgfolder eq 'trash') {
         my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$msgid]);          my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$msgid]);
  # a non-existant status is the mark of an unread msg   # a non-existant status is the mark of an unread msg
  if (&Apache::slotrequest::network_error(%status)) {   if (&Apache::lonnet::error(%status)) {
     return (0,&mt('Message copied to new folder but status was not, A network error occurred.'));      return (0,&mt('Message copied to new folder but status was not, A network error occurred.'));
  }   }
  my $result=&Apache::lonnet::put('email_status'.$trgsuffix,   my $result=&Apache::lonnet::put('email_status'.$trgsuffix,
  {$msgid => $status{$msgid}});   {$msgid => $status{$msgid}});
  if (&Apache::slotrequest::network_error($result)) {   if (&Apache::lonnet::error($result)) {
     return (0,&mt('Message copied to new folder but status was not, A network error occurred.'));      return (0,&mt('Message copied to new folder but status was not, A network error occurred.'));
  }   }
     }      }
Line 247  sub movemsg { Line 468  sub movemsg {
  &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);   &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);
     my $result_del_stat =      my $result_del_stat =
  &Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]);   &Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]);
     if (&Apache::slotrequest::network_error($result_del_msg)) {      if (&Apache::lonnet::error($result_del_msg)) {
  return (0,&mt('Message copied, but unable to delete the original from the source folder.'));   return (0,&mt('Message copied, but unable to delete the original from the source folder.'));
     }      }
     if (&Apache::slotrequest::network_error($result_del_stat)) {      if (&Apache::lonnet::error($result_del_stat)) {
  return (0,&mt('Message copied, but unable to delete the original status from the source folder.'));   return (0,&mt('Message copied, but unable to delete the original status from the source folder.'));
     }      }
   
Line 264  sub discourse { Line 485  sub discourse {
     my ($course_personnel,      my ($course_personnel,
  $current_members,   $current_members,
  $expired_members,   $expired_members,
  $future_members) = &Apache::lonselstudent::get_people_in_class();   $future_members) = 
       &Apache::lonselstudent::get_people_in_class($env{'request.course.sec'});
     unshift @$current_members, (@$course_personnel);      unshift @$current_members, (@$course_personnel);
     my %defaultUsers;      my %defaultUsers;
       
       $result .= '<input type="hidden" name="sendmode" value="group" />'."\n";
   
     $result = &Apache::lonselstudent::render_student_list($current_members,      $result .= &Apache::lonselstudent::render_student_list($current_members,
   "compemail",     "compemail",
   "current",     "current",
   \%defaultUsers,     \%defaultUsers,
   1,"selectedusers",1);     1,"selectedusers",1);
   
       $result .= &Apache::lonselstudent::render_student_list($expired_members,
      "compemail",
      "expired",
      \%defaultUsers,
      1, "selectedusers",0);
       $result .= &Apache::lonselstudent::render_student_list($future_members,
      "compemail",
      "future",
      \%defaultUsers,
      1, "selectedusers", 0);
       return $result;
   }
   
   sub disgroup {
       my ($cdom,$cnum,$group,$viewgrps,$editgrps) = @_;
       my $result;
       #  Needs to be in a course
       if (!($env{'request.course.fn'})) {
           $result = &mt('Error: you must have a course role selected to be able to send a broadcast message to a group in the course.');
           return $result;
       }
       if ($cdom eq '' || $cnum eq '') {
           $result = &mt('Error: could not determine domain or number of course');
           return $result;
       }
       my ($memberinfo,$numitems) =
                    &Apache::longroup::group_memberlist($cdom,$cnum,$group,{},[]);
       my @statustypes = ('active');
       if ($viewgrps || $editgrps) {
           push(@statustypes,('future','previous'));
       }
       if (keys(%{$memberinfo}) == 0) {
           $result = &mt('As this group has no members, there are no '.
                         'recipients to select.');
           return $result;
       } else {
           $result = &mt('Select message recipients from the group members listed below.<br />');  
           my %Sortby = (
                            active   => {},
                            previous => {},
                            future   => {},
                        );
           my %lt = &Apache::lonlocal::texthash(
                                        'name'     => 'Name',
                                        'usnm'     => 'Username',
                                        'doma'     => 'Domain',
                                        'active'   => 'Active Members',
                                        'previous' => 'Former Members',
                                        'future'   => 'Future Members',
                                       );
           foreach my $user (sort(keys(%{$memberinfo}))) {
               my $status = $$memberinfo{$user}{status};
               if ($env{'form.'.$status.'.sortby'} eq 'fullname') {
                   push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user);
               } elsif ($env{'form.'.$status.'.sortby'} eq 'username') {
                   push(@{$Sortby{$status}{$$memberinfo{$user}{uname}}},$user);
               } elsif ($env{'form.'.$status.'.sortby'} eq 'domain') {
                   push(@{$Sortby{$status}{$$memberinfo{$user}{udom}}},$user);
               } else {
                   push(@{$Sortby{$status}{$$memberinfo{$user}{fullname}}},$user);
               }
           }
           $result .= &group_check_uncheck();
           $result .= '<table border="0" cellspacing="8" cellpadding="2">'.
                      '<tr>';
           foreach my $status (@statustypes)  {
               if (ref($numitems) eq 'HASH') {
                   if ((defined($$numitems{$status})) && ($$numitems{$status})) {
                       $result.='<td valign="top">'.
                                '<fieldset><legend><b>'.$lt{$status}.
                                '</b></legend><nobr>'.
                                '<input type="button" value="check all" '.
                                'onclick="javascript:toggleAll('."'".$status."','check'".')" />'.
                                '&nbsp;&nbsp;'.
                                '<input type="button" value="uncheck all" '.
                                'onclick="javascript:toggleAll('."'".$status."','uncheck'".')" />'.
                                '</nobr></fieldset><br />'.
                                &Apache::loncommon::start_data_table().
                                &Apache::loncommon::start_data_table_header_row();
                       $result .= "<th>$lt{'name'}</a></th>".
                                  "<th>$lt{'usnm'}</a></th>".
                                  "<th>$lt{'doma'}</a></th>".
                       &Apache::loncommon::end_data_table_header_row();
                       foreach my $key (sort(keys(%{$Sortby{$status}}))) {
                           foreach my $user (@{$Sortby{$status}{$key}}) {
                               $result .=
                                   &Apache::loncommon::start_data_table_row().
                                   '<td><input type="checkbox" '.
                                   'name="selectedusers_forminput" value="'.
                                   $user.':'.$status.'" />'.
                                   $$memberinfo{$user}{'fullname'}.'</td>'.
                                   '<td>'.$$memberinfo{$user}{'uname'}.'</td>'.
                                   '<td>'.$$memberinfo{$user}{'udom'}.'</td>'.
                                   &Apache::loncommon::end_data_table_row();
                           }
                       }
                       $result .= &Apache::loncommon::end_data_table();
                   }
               }
               $result .= '</td><td>&nbsp;&nbsp;</td>';
           }
           $result .= '</tr></table>';
       }
     return $result;      return $result;
 }  }
   
   sub group_check_uncheck {
       my $output = qq|
   <script type="text/javascript">
   function toggleAll(caller,action) {
       var pattern = new RegExp(":"+caller+"\$");
       if (typeof(document.compemail.selectedusers_forminput.length)=="undefined") {
           if (document.compemail.selectedusers_forminput.value.match(pattern)) {
               if (action == 'check') {
                   document.groupmail.selectedusers_forminput.checked = true;
               } else {
                   document.groupmail.selectedusers_forminput.checked = false;
               }
           }
       } else {
           for (var i=0; i<document.compemail.selectedusers_forminput.length; i++) {
               if (document.compemail.selectedusers_forminput[i].value.match(pattern)) {
                   if (action == 'check') {
                       document.compemail.selectedusers_forminput[i].checked = true;
                   } else {
                       document.compemail.selectedusers_forminput[i].checked = false;
                   }
               }
           }
       }
   }
   </script>
       |;
   }
   
   sub groupmail_header {
       my ($action,$group,$cdom,$cnum) = @_;
       my ($description,$refarg);
       if (!$cdom || !$cnum) {
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       }
       if (exists($env{'form.ref'})) {
           $refarg = 'ref='.$env{'form.ref'};
       }
       if (!$group) {
           $group = $env{'form.group'};
       }
       if ($group eq '') {
           return  '';
       } else {
           my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$group);
           if (defined($curr_groups{$group})) {
               my %groupinfo =
                       &Apache::longroup::get_group_settings($curr_groups{$group});
               $description = &unescape($groupinfo{'description'});
           }
       }
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       if ($refarg) {
           &Apache::lonhtmlcommon::add_breadcrumb
               ({href=>"/adm/coursegroups",
                 text=>"Groups",
                 title=>"View course groups"});
       }
       &Apache::lonhtmlcommon::add_breadcrumb
           ({href=>"/adm/$cdom/$cnum/$group/smppg?$refarg",
             text=>"Group: $description",
             title=>"Go to group's home page"},
            {href=>"/adm/email?compose=group&amp;group=".
                   "$env{'form.group'}&amp;$refarg",
             text=>"Send a Message in a Group",
             title=>"Compose Group Email Message"},);
       if ($action eq 'sending') {
               &Apache::lonhtmlcommon::add_breadcrumb
                            ({text=>"Messages being sent.",
                              title=>"Messages sent"},);
       }
       my $groupheader = &Apache::loncommon::start_page('Group Email');
       $groupheader .= &Apache::lonhtmlcommon::breadcrumbs
                   ('Group - '.$env{'form.group'}.' Email');
       return $groupheader;
   }
   
   sub groupmail_sent {
       my ($group,$cdom,$cnum) = @_;
       my $refarg;
       if (exists($env{'form.ref'})) {
           $refarg = 'ref='.$env{'form.ref'};
       }
       my $output .= '<br /><br /><a href="/adm/email?compose=group&amp;group='.
                     $group.'&amp;'.$refarg.'">'.
                     &mt('Send another group email').'</a>'.'&nbsp;&nbsp;&nbsp;'.
                     '<a href="/adm/'.$cdom.'/'.$cnum.'/'.$group.'/smppg?'.
                     $refarg.'">'. &mt('Return to group page').'</a>';
       return $output;
   }
   
 # ==================================================== Display Critical Message  # ==================================================== Display Critical Message
   
 sub discrit {  sub discrit {
Line 286  sub discrit { Line 705  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 (sort keys %what) {      foreach my $key (sort(keys(%what))) {
         my %content=&Apache::lonmsg::unpackagemsg($what{$_});          my %content=&Apache::lonmsg::unpackagemsg($what{$key});
         next if ($content{'senderdomain'} eq '');          next if ($content{'senderdomain'} eq '');
         $result.='<hr />'.&mt('From').': <b>'.          $result.='<hr />'.&mt('From').': <b>'.
 &Apache::loncommon::aboutmewrapper(  &Apache::loncommon::aboutmewrapper(
Line 300  $content{'sendername'}.':'. Line 719  $content{'sendername'}.':'.
             '</pre><small>'.              '</pre><small>'.
 &mt('You have to confirm that you received this message. After confirmation, this message will be moved to your regular inbox').  &mt('You have to confirm that you received this message. After confirmation, this message will be moved to your regular inbox').
             '</small><br />'.              '</small><br />'.
             '<input type="submit" name="rec_'.$_.'" value="'.&mt('Confirm Receipt').'" />'.              '<input type="submit" name="rec_'.$key.'" value="'.&mt('Confirm Receipt').'" />'.
             '<input type="submit" name="reprec_'.$_.'" '.              '<input type="submit" name="reprec_'.$key.'" '.
                   'value="'.&mt('Confirm Receipt and Reply').'" />';                    'value="'.&mt('Confirm Receipt and Reply').'" />';
     }      }
     # Check to see if there were any messages.      # Check to see if there were any messages.
Line 320  sub sortedmessages { Line 739  sub sortedmessages {
     my ($blocked,$startblock,$endblock,$numblocked,$folder) = @_;      my ($blocked,$startblock,$endblock,$numblocked,$folder) = @_;
     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
     my @temp;      my @temp;
     my %descriptions;      my %descriptions;
Line 333  sub sortedmessages { Line 753  sub sortedmessages {
     }      }
   
     foreach my $msgid (@messages) {      foreach my $msgid (@messages) {
  my $esc_msgid=&Apache::lonnet::escape($msgid);   my $esc_msgid=&escape($msgid);
  my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid)=   my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid)=
     &Apache::lonmsg::unpackmsgid($esc_msgid,$folder,undef,      &Apache::lonmsg::unpackmsgid($esc_msgid,$folder,undef,
  \%status_cache);   \%status_cache);
Line 423  sub get_course_desc { Line 843  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);                $description = $courseinfo{'description'};                  my %courseinfo=&Apache::lonnet::coursedescription($fromcid);
                 $description = $courseinfo{'description'};                  $description = $courseinfo{'description'};
             }              }
             $$descriptions{$fromcid} = $description;              $$descriptions{$fromcid} = $description;
Line 449  sub disnew { Line 869  sub disnew {
     my @msgids = sort(&Apache::lonnet::getkeys('nohist_email'));      my @msgids = sort(&Apache::lonnet::getkeys('nohist_email'));
     my @newmsgs;      my @newmsgs;
     my %setters = ();      my %setters = ();
     my $startblock = 0;  
     my $endblock = 0;  
     my %blocked = ();      my %blocked = ();
     my $numblocked = 0;      my $numblocked = 0;
     # Check for blocking of display because of scheduled online exams.      # Check for blocking of display because of scheduled online exams.
     &blockcheck(\%setters,\$startblock,\$endblock);      my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');
     my %status_cache =       my %status_cache = 
  &Apache::lonnet::get('email_status',\@msgids);   &Apache::lonnet::get('email_status',\@msgids);
     my %descriptions;      my %descriptions;
     foreach (@msgids) {      foreach my $id (@msgids) {
  my $msgid=&Apache::lonnet::escape($_);   my $msgid=&escape($id);
         my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=          my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=
     &Apache::lonmsg::unpackmsgid($msgid,undef,undef,\%status_cache);      &Apache::lonmsg::unpackmsgid($msgid,undef,undef,\%status_cache);
         if (defined($sendtime) && $sendtime!~/error/) {          if (defined($sendtime) && $sendtime!~/error/) {
Line 468  sub disnew { Line 886  sub disnew {
             $sendtime = &Apache::lonlocal::locallocaltime($sendtime);              $sendtime = &Apache::lonlocal::locallocaltime($sendtime);
             if ($status eq 'new') {              if ($status eq 'new') {
                 if ($numsendtime >= $startblock && ($numsendtime <= $endblock && $endblock > 0) ) {                  if ($numsendtime >= $startblock && ($numsendtime <= $endblock && $endblock > 0) ) {
                     $blocked{$_} = 'ON';                      $blocked{$id} = 'ON';
                     $numblocked ++;                      $numblocked ++;
                 } else {                  } else {
                     push @newmsgs, {                       push(@newmsgs, { 
                         msgid    => $msgid,                          msgid    => $msgid,
                         sendtime => $sendtime,                          sendtime => $sendtime,
                         shortsub => $shortsubj,                          shortsub => $shortsubj,
                         from     => $fromname,                          from     => $fromname,
                         fromdom  => $fromdom,                          fromdom  => $fromdom,
                         course   => $description                           course   => $description, 
                         }      });
                 }                  }
             }              }
         }          }
Line 486  sub disnew { Line 904  sub disnew {
     if ($#newmsgs >= 0) {      if ($#newmsgs >= 0) {
         $r->print(<<TABLEHEAD);          $r->print(<<TABLEHEAD);
 <h2>$lt{'nm'}</h2>  <h2>$lt{'nm'}</h2>
 <table class="LC_mail_list"><tr><th>&nbsp</th>  <table class="LC_mail_list"><tr><th>&nbsp;</th>
 <th>$lt{'da'}</th><th>$lt{'us'}</th><th>$lt{'do'}</th><th>$lt{'su'}</th><th>$lt{'co'}</th></tr>  <th>$lt{'da'}</th><th>$lt{'us'}</th><th>$lt{'do'}</th><th>$lt{'su'}</th><th>$lt{'co'}</th></tr>
 TABLEHEAD  TABLEHEAD
         foreach my $msg (@newmsgs) {          foreach my $msg (@newmsgs) {
             $r->print(<<"ENDLINK");              $r->print(<<"ENDLINK");
 <tr class="LC_mail_new">  <tr class="LC_mail_new">
 <td><a href="/adm/email?dismode=new&display=$msg->{'msgid'}">$lt{'op'}</a></td>  <td><a href="/adm/email?dismode=new&amp;display=$msg->{'msgid'}">$lt{'op'}</a></td>
 ENDLINK  ENDLINK
             foreach ('sendtime','from','fromdom','shortsub','course') {              foreach my $item ('sendtime','from','fromdom','shortsub','course') {
                 $r->print("<td>$msg->{$_}</td>");                  $r->print("<td>$msg->{$item}</td>");
             }              }
             $r->print("</td></tr>");              $r->print("</tr>");
         }          }
         $r->print('</table>');          $r->print('</table>');
     } elsif ($numblocked == 0) {      } elsif ($numblocked == 0) {
Line 506  ENDLINK Line 924  ENDLINK
     if ($numblocked > 0) {      if ($numblocked > 0) {
         my $beginblock = &Apache::lonlocal::locallocaltime($startblock);          my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
         my $finishblock = &Apache::lonlocal::locallocaltime($endblock);          my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
         if ($numblocked == 1) {          $r->print('<h3>'.&mt('You have [quant,_1,blocked unread message,blocked unread messages].',$numblocked).'</h3>'."\n".
             $r->print("<h3>".&mt('You have').' '.$numblocked.' '.&mt('blocked unread message').".</h3>");                   &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).'<br />'."\n".
             $r->print(&mt('This message is not viewable because').' ');                   &Apache::loncommon::build_block_table($startblock,$endblock,
         } else {                                                         \%setters));
             $r->print("<h3>".&mt('You have').' '.$numblocked.' '.&mt('blocked unread messages').".</h3>");  
             $r->print(&mt('These').' '.$numblocked.' '.&mt('messages are not viewable because '));  
         }  
         $r->print(  
 &mt('display of LON-CAPA messages sent to you by other students between').' '.$beginblock.' '.&mt('and').' '.$finishblock.' '.&mt('is currently being blocked because of online exams').'.');  
         &build_block_table($r,$startblock,$endblock,\%setters);  
     }      }
 }  }
   
Line 540  sub disfolder { Line 952  sub disfolder {
     my ($r,$folder)=@_;      my ($r,$folder)=@_;
     my %blocked = ();      my %blocked = ();
     my %setters = ();      my %setters = ();
     my $startblock;  
     my $endblock;  
     my $numblocked = 0;      my $numblocked = 0;
     &blockcheck(\%setters,\$startblock,\$endblock);      my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');
     $r->print(<<ENDDISHEADER);      $r->print(<<ENDDISHEADER);
 <script type="text/javascript">  <script type="text/javascript">
     function checkall() {      function checkall() {
Line 558  sub disfolder { Line 968  sub disfolder {
     function uncheckall() {      function uncheckall() {
  for (i=0; i<document.forms.disall.elements.length; i++) {   for (i=0; i<document.forms.disall.elements.length; i++) {
             if               if 
           (document.forms.disall.elements[i].name.indexOf('delmark_')==0) {            (document.forms.disall.elements[i].name.indexof('delmark_')==0) {
       document.forms.disall.elements[i].checked=false;        document.forms.disall.elements[i].checked=false;
             }              }
         }          }
Line 566  sub disfolder { Line 976  sub disfolder {
 </script>  </script>
 ENDDISHEADER  ENDDISHEADER
     my $fsqs='&folder='.$folder;      my $fsqs='&folder='.$folder;
     my @temp=sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder);      my @temp=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder);
     my $totalnumber=$#temp+1;      my $totalnumber=$#temp+1;
     unless ($totalnumber>0) {      unless ($totalnumber>0) {
  $r->print('<h2>'.&mt('Empty Folder').'</h2>');   $r->print('<h2>'.&mt('Empty Folder').'</h2>');
Line 583  ENDDISHEADER Line 993  ENDDISHEADER
     if ($lastdis>$#temp) { $lastdis=$#temp; }      if ($lastdis>$#temp) { $lastdis=$#temp; }
     $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber));      $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber));
     $r->print('<form method="post" name="disall" action="/adm/email">'.      $r->print('<form method="post" name="disall" action="/adm/email">'.
       '<table class="LC_mail_list"><tr><th colspan="3">&nbsp</th><th>');        '<table class="LC_mail_list"><tr><th colspan="3">&nbsp;</th><th>');
     if ($env{'form.sortedby'} eq "revdate") {      if ($env{'form.sortedby'} eq "revdate") {
  $r->print('<a href = "?sortedby=date'.$fsqs.'">'.&mt('Date').'</a></th>');   $r->print('<a href = "?sortedby=date'.$fsqs.'">'.&mt('Date').'</a></th>');
     } else {      } else {
Line 642  ENDDISHEADER Line 1052  ENDDISHEADER
     $dis_name   = join('<br />',@{$recv_name});      $dis_name   = join('<br />',@{$recv_name});
     $dis_domain = join('<br />',@{$recv_domain});      $dis_domain = join('<br />',@{$recv_domain});
  } else {   } else {
     my $msg_id  = &Apache::lonnet::unescape($origID);      my $msg_id  = &unescape($origID);
     my %message = &Apache::lonnet::get('nohist_email'.$suffix,      my %message = &Apache::lonnet::get('nohist_email'.$suffix,
        [$msg_id]);         [$msg_id]);
     my %content = &Apache::lonmsg::unpackagemsg($message{$msg_id});      my %content = &Apache::lonmsg::unpackagemsg($message{$msg_id});
Line 661  ENDDISHEADER Line 1071  ENDDISHEADER
  } elsif ($status eq 'deleted') {   } elsif ($status eq 'deleted') {
 # purge  # purge
     my ($result,$msg) =       my ($result,$msg) = 
  &movemsg(&Apache::lonnet::unescape($origID),$folder,'trash');   &movemsg(&unescape($origID),$folder,'trash');
           
  }   }
     }         }   
Line 674  ENDDISHEADER Line 1084  ENDDISHEADER
       '<p><input type="submit" name="markeddel" value="'.&mt('Delete Checked').'" /></p>');        '<p><input type="submit" name="markeddel" value="'.&mt('Delete Checked').'" /></p>');
     }      }
     $r->print('<p><input type="submit" name="markedmove" value="'.&mt('Move Checked to Folder').'" />');      $r->print('<p><input type="submit" name="markedmove" value="'.&mt('Move Checked to Folder').'" />');
     my @allfolders=&Apache::lonnet::getkeys('email_folders');      my %gotfolders = &Apache::lonmsg::get_user_folders();
     if ($allfolders[0]=~/^error:/) { @allfolders=(); }      my %userfolders;
       foreach my $key (keys(%gotfolders)) {
           $userfolders{$key} = $key;
       }
     $r->print(      $r->print(
  &Apache::loncommon::select_form('','movetofolder',   &Apache::loncommon::select_form('','movetofolder',
      ( map { $_ => $_ } @allfolders))                  %userfolders));
       );  
     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'}.'" /></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'}.'" /></form>');
     if ($numblocked > 0) {      if ($numblocked > 0) {
         my $beginblock = &Apache::lonlocal::locallocaltime($startblock);          my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
         my $finishblock = &Apache::lonlocal::locallocaltime($endblock);          my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
         $r->print('<br /><br />'.          $r->print('<br /><br />'.
                   $numblocked.' '.&mt('message(s) is/are not viewable because display of LON-CAPA messages sent to you by other students between').' '.$beginblock.' '.&mt('and').' '.$finishblock.' '.&mt('is currently being blocked because of online exams.'));                    &mt('[_1,quant,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));
         &build_block_table($r,$startblock,$endblock,\%setters);          $r->print(&Apache::loncommon::build_block_table($startblock,$endblock,
                                                           \%setters));
     }      }
 }  }
   
Line 696  ENDDISHEADER Line 1109  ENDDISHEADER
 sub compout {  sub compout {
     my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode)=@_;      my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode)=@_;
     my $suffix=&Apache::lonmsg::foldersuffix($folder);      my $suffix=&Apache::lonmsg::foldersuffix($folder);
       my ($cdom,$cnum,$group,$refarg);
     if ($broadcast eq 'individual') {      if (exists($env{'form.group'})) {
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           $group = $env{'form.group'};
           my $action = 'composing';
           $r->print(&groupmail_header($action,$group,$cdom,$cnum));
       } elsif ($broadcast eq 'individual') {
  &printheader($r,'/adm/email?compose=individual',   &printheader($r,'/adm/email?compose=individual',
      'Send a Message');       'Send a Message');
     } elsif ($broadcast) {      } elsif ($broadcast) {
Line 705  sub compout { Line 1124  sub compout {
      'Broadcast Message');       'Broadcast Message');
     } elsif ($forwarding) {      } elsif ($forwarding) {
  &Apache::lonhtmlcommon::add_breadcrumb   &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"/adm/email?display=".&Apache::lonnet::escape($forwarding),          ({href=>"/adm/email?display=".&escape($forwarding),
           text=>"Display Message"});            text=>"Display Message"});
  &printheader($r,'/adm/email?forward='.&Apache::lonnet::escape($forwarding),   &printheader($r,'/adm/email?forward='.&escape($forwarding),
      'Forwarding a Message');       'Forwarding a Message');
     } elsif ($replying) {      } elsif ($replying) {
  &Apache::lonhtmlcommon::add_breadcrumb   &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"/adm/email?display=".&Apache::lonnet::escape($replying),          ({href=>"/adm/email?display=".&escape($replying),
           text=>"Display Message"});            text=>"Display Message"});
  &printheader($r,'/adm/email?replyto='.&Apache::lonnet::escape($replying),   &printheader($r,'/adm/email?replyto='.&escape($replying),
      'Replying to a Message');       'Replying to a Message');
     } elsif ($replycrit) {      } elsif ($replycrit) {
  $r->print('<h3>'.&mt('Replying to a Critical Message').'</h3>');   $r->print('<h3>'.&mt('Replying to a Critical Message').'</h3>');
Line 763  sub compout { Line 1182  sub compout {
  $dismsg=&mt('Forwarded message from').' '.   $dismsg=&mt('Forwarded message from').' '.
     $content{'sendername'}.' '.&mt('at').' '.$content{'senderdomain'};      $content{'sendername'}.' '.&mt('at').' '.$content{'senderdomain'};
  if ($content{'baseurl'}) {   if ($content{'baseurl'}) {
     $disbase='<input type="hidden" name="baseurl" value="'.&Apache::lonnet::escape($content{'baseurl'}).'" />';      $disbase='<input type="hidden" name="baseurl" value="'.&escape($content{'baseurl'}).'" />';
  }   }
     }      }
     if ($replying) {      if ($replying) {
Line 779  sub compout { Line 1198  sub compout {
  $dismsg=~s/\f/\n/g;   $dismsg=~s/\f/\n/g;
  $dismsg=~s/\n+/\n\> /g;   $dismsg=~s/\n+/\n\> /g;
  if ($content{'baseurl'}) {   if ($content{'baseurl'}) {
     $disbase='<input type="hidden" name="baseurl" value="'.&Apache::lonnet::escape($content{'baseurl'}).'" />';      $disbase='<input type="hidden" name="baseurl" value="'.&escape($content{'baseurl'}).'" />';
     if ($env{'user.adv'}) {      if ($env{'user.adv'}) {
  $disbase.='<label><input type="checkbox" name="storebasecomment" />'.&mt('Store message for re-use').   $disbase.='<label><input type="checkbox" name="storebasecomment" />'.&mt('Store message for re-use').
     '</label> <a href="/adm/email?showcommentbaseurl='.      '</label> <a href="/adm/email?showcommentbaseurl='.
     &Apache::lonnet::escape($content{'baseurl'}).'" target="comments">'.      &escape($content{'baseurl'}).'" target="comments">'.
     &mt('Show re-usable messages').'</a><br />';      &mt('Show re-usable messages').'</a><br />';
     }      }
  }   }
     }      }
     my $citation=&displayresource(%content);      my $citation=&displayresource(%content);
       my ($can_grp_broadcast,$viewgrps,$editgrps);
     if ($env{'form.recdom'}) { $defdom=$env{'form.recdom'}; }      if ($env{'form.recdom'}) { $defdom=$env{'form.recdom'}; }
     if ($env{'form.text'}) { $dismsg=$env{'form.text'}; }      if ($env{'form.text'}) { $dismsg=$env{'form.text'}; }
     if ($env{'form.subject'}) { $dissub=$env{'form.subject'}; }      if ($env{'form.subject'}) { $dissub=$env{'form.subject'}; }
     $r->print(      $r->print(
                 '<form action="/adm/email"  name="compemail" method="post"'.                  '<form action="/adm/email"  name="compemail" method="post"'.
                 ' enctype="multipart/form-data">'."\n".                  ' enctype="multipart/form-data">'."\n".
                 '<input type="hidden" name="sendmail" value="on" />'."\n".                  '<input type="hidden" name="sendmail" value="on" />'."\n");
                 '<table>');      if ($broadcast eq 'group' && $env{'form.group'} ne '') {
     unless (($broadcast eq 'group') || ($broadcast eq 'upload')) {          $can_grp_broadcast = 
                   &Apache::lonnet::allowed('sgb',$env{'request.course.id'}.'/'.
                                            $group);
           $viewgrps = 
                  &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.
                  ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
           $editgrps = 
                  &Apache::lonnet::allowed('mdg',$env{'request.course.id'}.
                  ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
           if ($viewgrps || $editgrps || $can_grp_broadcast) {
               $r->print(&disgroup($cdom,$cnum,$group,$viewgrps,$editgrps));
           }
       }
       $r->print('<table>');
       if (($broadcast eq 'group') && ($group ne '') && 
           (!$can_grp_broadcast && !$viewgrps && !$editgrps)) {
           $r->print(&recipient_input_row($cdom,%lt));
       } 
       if (($broadcast ne 'group') && ($broadcast ne 'upload')) {
  if ($replying) {   if ($replying) {
     $r->print('<tr><td colspan="2">'.&mt('Replying to').' '.      $r->print('<tr><td colspan="2">'.&mt('Replying to').' '.
       &Apache::loncommon::aboutmewrapper(        &Apache::loncommon::aboutmewrapper(
Line 808  sub compout { Line 1246  sub compout {
       '<input type="hidden" name="recdomain" value="'.$content{'senderdomain'}.'" />'.        '<input type="hidden" name="recdomain" value="'.$content{'senderdomain'}.'" />'.
       '</td></tr>');        '</td></tr>');
  } else {   } else {
     my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain');              $r->print(&recipient_input_row($defdom,%lt));
     my $selectlink=&Apache::loncommon::selectstudent_link  
     ('compemail','recuname','recdomain');  
     $r->print(<<"ENDREC");  
 <tr><td>$lt{'us'}:</td><td><input type="text" size="12" name="recuname" value="$env{'form.recname'}" /></td><td rowspan="2">$selectlink</td></tr>  
 <tr><td>$lt{'do'}:</td>  
 <td>$domform</td></tr>  
 ENDREC  
         }          }
     }      }
     my $latexHelp = Apache::loncommon::helpLatexCheatsheet();      my $latexHelp = Apache::loncommon::helpLatexCheatsheet();
     if ($broadcast ne 'upload') {      if ($broadcast ne 'upload') {
        $r->print(<<"ENDCOMP");         $r->print(<<"ENDCOMP");
 <tr><td>$lt{'ad'}<br /><tt>username\@domain,username\@domain, ...  <tr><td>$lt{'ad'}<br /><tt>username:domain,username:domain, ...
 </tt></td><td>  </tt></td><td>
 <input type="text" size="50" name="additionalrec" /></td></tr>  <input type="text" size="50" name="additionalrec" /></td></tr>
 <tr><td>$lt{'sb'}:</td><td><input type="text" size="50" name="subject" value="$dissub" />  <tr><td>$lt{'sb'}:</td><td><input type="text" size="50" name="subject" value="$dissub" />
Line 837  $disbase Line 1268  $disbase
 <input type="submit" name="cancel" value="$lt{'ca'}" /><hr />  <input type="submit" name="cancel" value="$lt{'ca'}" /><hr />
 $citation  $citation
 ENDCOMP  ENDCOMP
           if (exists($env{'form.ref'})) {
               $r->print('<input type="hidden" name="ref" value="'.
                         $env{'form.ref'}.'" />');
           }
           if (exists($env{'form.group'})) {
               $r->print('<input type="hidden" name="group" value="'.
                         $env{'form.group'}.'" />');
           }
     } else { # $broadcast is 'upload'      } else { # $broadcast is 'upload'
  $r->print(<<ENDUPLOAD);   $r->print(<<ENDUPLOAD);
 <input type="hidden" name="sendmode" value="upload" />  <input type="hidden" name="sendmode" value="upload" />
Line 851  Subject: <input type="text" size="50" na Line 1290  Subject: <input type="text" size="50" na
 <p>  <p>
 The file format for the uploaded portion of the message is:  The file format for the uploaded portion of the message is:
 <pre>  <pre>
 username1\@domain1: text  username1:domain1: text
 username2\@domain2: text  username2:domain2: text
 username3\@domain1: text  username3:domain1: text
 </pre>  </pre>
 </p>  </p>
 <p>  <p>
 The messages will be assembled from all lines with the respective   The messages will be assembled from all lines with the respective 
 <tt>username\@domain</tt>, and appended to the general message text.</p>  <tt>username:domain</tt>, and appended to the general message text.</p>
 <p>  <p>
 <input type="file" name="upfile" size="40" /></p><p>  <input type="file" name="upfile" size="40" /></p><p>
 $dispcrit  $dispcrit
Line 866  $dispcrit Line 1305  $dispcrit
 ENDUPLOAD  ENDUPLOAD
     }      }
     if ($broadcast eq 'group') {      if ($broadcast eq 'group') {
        &discourse($r);         if ($group eq '') {
        my $studentsel = &discourse();             my $studentsel = &discourse();
        $r->print($studentsel);             $r->print($studentsel);
          }
       }
       if ($env{'form.displayedcrit'}) {
    $r->print('<input type="hidden" name="displayedcrit" value="true" />');
     }      }
     $r->print('</form>'.      $r->print('</form>'.
       &Apache::lonfeedback::generate_preview_button('compemail','message').        &Apache::lonfeedback::generate_preview_button('compemail','message').
Line 877  ENDUPLOAD Line 1320  ENDUPLOAD
   
 # ---------------------------------------------------- Display all face to face  # ---------------------------------------------------- Display all face to face
   
   sub recipient_input_row {
       my ($dom,%lt) = @_;
       my $domform = &Apache::loncommon::select_dom_form($dom,'recdomain');
       my $selectlink=
         &Apache::loncommon::selectstudent_link('compemail','recuname',
                                                'recdomain');
       my $output = <<"ENDREC";
   <tr><td>$lt{'us'}:</td><td><input type="text" size="12" name="recuname" value="$env{'form.recname'}" /></td><td rowspan="2">$selectlink</td></tr>
   <tr><td>$lt{'do'}:</td>
   <td>$domform</td></tr>
   ENDREC
       return $output;
   }
   
 sub retrieve_instructor_comments {  sub retrieve_instructor_comments {
     my ($user,$domain)=@_;      my ($user,$domain)=@_;
     my $target=$env{'form.grade_target'};      my $target=$env{'form.grade_target'};
     if (! $env{'request.course.id'}) { return; }      if (! $env{'request.course.id'}) { return; }
     if (! &Apache::lonnet::allowed('srm',$env{'request.course.id'})      if (! &Apache::lonnet::allowed('dff',$env{'request.course.id'})
  && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.   && ! &Apache::lonnet::allowed('dff',$env{'request.course.id'}.
       '/'.$env{'request.course.sec'})) {        '/'.$env{'request.course.sec'})) {
  return;   return;
     }      }
Line 891  sub retrieve_instructor_comments { Line 1348  sub retrieve_instructor_comments {
  $env{'course.'.$env{'request.course.id'}.'.num'},   $env{'course.'.$env{'request.course.id'}.'.num'},
                          '%255b'.$user.'%253a'.$domain.'%255d');                           '%255b'.$user.'%253a'.$domain.'%255d');
     my $result='';      my $result='';
     foreach (sort(keys(%records))) {      foreach my $key (sort(keys(%records))) {
         my %content=&Apache::lonmsg::unpackagemsg($records{$_});          my %content=&Apache::lonmsg::unpackagemsg($records{$key});
         next if ($content{'senderdomain'} eq '');          next if ($content{'senderdomain'} eq '');
         next if ($content{'subject'} !~ /^Record/);          next if ($content{'subject'} !~ /^Record/);
  # &Apache::lonfeedback::newline_to_br(\$content{'message'});   # &Apache::lonfeedback::newline_to_br(\$content{'message'});
Line 908  sub disfacetoface { Line 1365  sub disfacetoface {
     my ($r,$user,$domain)=@_;      my ($r,$user,$domain)=@_;
     my $target=$env{'form.grade_target'};      my $target=$env{'form.grade_target'};
     unless ($env{'request.course.id'}) { return; }      unless ($env{'request.course.id'}) { return; }
     if  (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})      if  (!&Apache::lonnet::allowed('dff',$env{'request.course.id'})
  && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.   && ! &Apache::lonnet::allowed('dff',$env{'request.course.id'}.
        '/'.$env{'request.course.sec'})) {         '/'.$env{'request.course.sec'})) {
  $r->print('Not allowed');   $r->print('Not allowed');
  return;   return;
Line 919  sub disfacetoface { Line 1376  sub disfacetoface {
  $env{'course.'.$env{'request.course.id'}.'.num'},   $env{'course.'.$env{'request.course.id'}.'.num'},
                          '%255b'.$user.'%253a'.$domain.'%255d');                           '%255b'.$user.'%253a'.$domain.'%255d');
     my $result='';      my $result='';
     foreach (sort keys %records) {      foreach my $key (sort(keys(%records))) {
         my %content=&Apache::lonmsg::unpackagemsg($records{$_});          my %content=&Apache::lonmsg::unpackagemsg($records{$key});
         next if ($content{'senderdomain'} eq '');          next if ($content{'senderdomain'} eq '');
  &Apache::lonfeedback::newline_to_br(\$content{'message'});   &Apache::lonfeedback::newline_to_br(\$content{'message'});
         if ($content{'subject'}=~/^Record/) {          if ($content{'subject'}=~/^Record/) {
Line 929  sub disfacetoface { Line 1386  sub disfacetoface {
             $result .='<h3>'.&mt('Broadcast Message').'</h3>';              $result .='<h3>'.&mt('Broadcast Message').'</h3>';
             if ($content{'subject'}=~/^Broadcast\./) {              if ($content{'subject'}=~/^Broadcast\./) {
                 if (defined($content{'coursemsgid'})) {                  if (defined($content{'coursemsgid'})) {
                     my $crsmsgid = &Apache::lonnet::escape($content{'coursemsgid'});                      my $crsmsgid = &escape($content{'coursemsgid'});
                     my $broadcast_message = &general_message($crsmsgid);                      my $broadcast_message = &general_message($crsmsgid);
                     $content{'message'} = '<b>'.&mt('Subject').': '.$content{'message'}.'</b><br />'.$broadcast_message;                      $content{'message'} = '<b>'.&mt('Subject').': '.$content{'message'}.'</b><br />'.$broadcast_message;
                 } else {                  } else {
Line 942  sub disfacetoface { Line 1399  sub disfacetoface {
         } else {          } else {
             $result.='<h3>'.&mt('Critical Message').'</h3>';              $result.='<h3>'.&mt('Critical Message').'</h3>';
             if (defined($content{'coursemsgid'})) {              if (defined($content{'coursemsgid'})) {
                 my $crsmsgid=&Apache::lonnet::escape($content{'coursemsgid'});                  my $crsmsgid=&escape($content{'coursemsgid'});
                 my $critical_message = &general_message($crsmsgid);                  my $critical_message = &general_message($crsmsgid);
                 $content{'message'} = '<b>'.&mt('Subject').': '.$content{'message'}.'</b><br />'.$critical_message;                  $content{'message'} = '<b>'.&mt('Subject').': '.$content{'message'}.'</b><br />'.$critical_message;
             } else {              } else {
Line 963  $content{'sendername'}.':'. Line 1420  $content{'sendername'}.':'.
      }       }
     # Check to see if there were any messages.      # Check to see if there were any messages.
     if ($result eq '') {      if ($result eq '') {
           my $lctype = lc(&Apache::loncommon::course_type());
  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 course.")."</b></p>");      $r->print("<p><b>".&mt('No notes, face-to-face discussion records, critical messages, or broadcast messages in this [_1].',$lctype)."</b></p>");
  } else {   } else {
     $r->print('\textbf{'.&mt("No notes, face-to-face discussion records, critical messages or broadcast messages in this course.").'}\\\\');      $r->print('\textbf{'.&mt('No notes, face-to-face discussion records, critical messages or broadcast messages in this [_1].',$lctype).'}\\\\');
  }   }
     } else {      } else {
        $r->print($result);         $r->print($result);
Line 989  sub general_message { Line 1447  sub general_message {
   
 sub facetoface {  sub facetoface {
     my ($r,$stage)=@_;      my ($r,$stage)=@_;
     if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})      if (!&Apache::lonnet::allowed('dff',$env{'request.course.id'})
  && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.   && ! &Apache::lonnet::allowed('dff',$env{'request.course.id'}.
       '/'.$env{'request.course.sec'})) {        '/'.$env{'request.course.sec'})) {
  $r->print('Not allowed');   $r->print('Not allowed');
  return;   return;
     }      }
       my $crstype = &Apache::loncommon::course_type();
       my $leaders = ($crstype eq 'Group') ? 'coordinators and leaders'
                                           : 'faculty and staff';
     &printheader($r,      &printheader($r,
  '/adm/email?recordftf=query',   '/adm/email?recordftf=query',
  "User Notes, Face-to-Face, Critical Messages, Broadcast Messages");   "User Notes, Face-to-Face, Critical Messages, Broadcast Messages");
Line 1012  sub facetoface { Line 1473  sub facetoface {
  ('stdselect','recuname','recdomain');   ('stdselect','recuname','recdomain');
     my %lt=&Apache::lonlocal::texthash('user' => 'Username',      my %lt=&Apache::lonlocal::texthash('user' => 'Username',
        'dom' => 'Domain',         'dom' => 'Domain',
        'head' => 'User Notes, Records of Face-To-Face Discussions, Critical Messages, and Broadcast Messages in Course',         'head' => "User Notes, Records of Face-To-Face Discussions, Critical Messages, and Broadcast Messages in $crstype",
        'subm' => 'Retrieve discussion and message records',         'subm' => 'Retrieve discussion and message records',
        'newr' => 'New Record (record is visible to course faculty and staff)',         'newr' => 'New Record (record is visible to '.lc($crstype).' '.$leaders.')',
        'post' => 'Post this Record');         'post' => 'Post this Record');
     $r->print(<<"ENDTREC");      $r->print(<<"ENDTREC");
 <h3>$lt{'head'}</h3>  <h3>$lt{'head'}</h3>
Line 1035  ENDTREC Line 1496  ENDTREC
         ($env{'form.recdomain'}) && ($env{'form.recuname'})) {          ($env{'form.recdomain'}) && ($env{'form.recuname'})) {
         chomp($env{'form.newrecord'});          chomp($env{'form.newrecord'});
         if ($env{'form.newrecord'}) {          if ($env{'form.newrecord'}) {
            my $recordtxt = $env{'form.newrecord'};      &Apache::lonmsg::store_instructor_comment($env{'form.newrecord'},
            &Apache::lonmsg::user_normal_msg_raw(        $env{'form.recuname'},
             $env{'course.'.$env{'request.course.id'}.'.num'},        $env{'form.recdomain'});
             $env{'course.'.$env{'request.course.id'}.'.domain'},  
             &mt('Record').  
      ' ['.$env{'form.recuname'}.':'.$env{'form.recdomain'}.']',  
     $recordtxt);  
         }          }
         $r->print('<h3>'.&Apache::loncommon::plainname($env{'form.recuname'},          $r->print('<h3>'.&Apache::loncommon::plainname($env{'form.recuname'},
      $env{'form.recdomain'}).'</h3>');       $env{'form.recdomain'}).'</h3>');
Line 1067  ENDBFORM Line 1524  ENDBFORM
 sub examblock {  sub examblock {
     my ($r,$action) = @_;      my ($r,$action) = @_;
     unless ($env{'request.course.id'}) { return;}      unless ($env{'request.course.id'}) { return;}
     if (!&Apache::lonnet::allowed('srm',$env{'request.course.id'})      if (!&Apache::lonnet::allowed('dcm',$env{'request.course.id'})
  && ! &Apache::lonnet::allowed('srm',$env{'request.course.id'}.   && ! &Apache::lonnet::allowed('dcm',$env{'request.course.id'}.
       '/'.$env{'request.course.sec'})) {        '/'.$env{'request.course.sec'})) {
  $r->print('Not allowed');   $r->print('Not allowed');
  return;   return;
     }      }
       my $usertype = (&Apache::loncommon::course_type() eq 'Group') ? 'members'
                                                             : 'students';
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
             'comb' => 'Communication Blocking',              'comb' => 'Communication Blocking',
             'cbds' => 'Communication blocking during scheduled exams',              'cbds' => 'Communication blocking during scheduled exams',
             'desc' => 'You can use communication blocking to prevent students enrolled in this course from displaying LON-CAPA messages sent by other students during an online exam. As blocking of communication could potentially interrupt legitimate communication between students who are also both enrolled in a different LON-CAPA course, please be careful that you select the correct start and end times for your scheduled exam when setting or modifying these parameters.',              'desc' => "You can use communication blocking to prevent $usertype enrolled in this course from displaying LON-CAPA messages sent by other $usertype during an online exam. As blocking of communication could potentially interrupt legitimate communication between $usertype who are also both enrolled in a different LON-CAPA course, please be careful that you select the correct start and end times for your scheduled exam when setting or modifying these parameters.",
              'mecb' => 'Modify existing communication blocking periods',               'mecb' => 'Modify existing communication blocking periods',
              'ncbc' => 'No communication blocks currently stored'               'ncbc' => 'No communication blocks currently stored'
     );      );
Line 1085  sub examblock { Line 1544  sub examblock {
             'dura' => 'Duration',              'dura' => 'Duration',
             'setb' => 'Set by',              'setb' => 'Set by',
             'even' => 'Event',              'even' => 'Event',
               'blck' => 'Blocked?',
             'actn' => 'Action',              'actn' => 'Action',
             'star' => 'Start',              'star' => 'Start',
             'endd' => 'End'              'endd' => 'End'
Line 1141  sub blockstore { Line 1601  sub blockstore {
     my $addtotal = 0;      my $addtotal = 0;
     my %blocking = ();      my %blocking = ();
     $r->print('<h3>'.$lt{'head'}.'</h3>');      $r->print('<h3>'.$lt{'head'}.'</h3>');
     foreach (keys %env) {      foreach my $envkey (keys(%env)) {
         if ($_ =~ m/^form\.modify_(\w+)$/) {          if ($envkey =~ m/^form\.modify_(\d+)$/) {
             $adds{$1} = $1;              $adds{$1} = $1;
             $removals{$1} = $1;              $removals{$1} = $1;
             $modtotal ++;              $modtotal ++;
         } elsif ($_ =~ m/^form\.cancel_(\d+)$/) {          } elsif ($envkey =~ m/^form\.cancel_(\d+)$/) {
             $cancels{$1} = $1;              $cancels{$1} = $1;
             unless ( defined($removals{$1}) ) {              unless ( defined($removals{$1}) ) {
                 $removals{$1} = $1;                  $removals{$1} = $1;
                 $canceltotal ++;                  $canceltotal ++;
             }              }
         } elsif ($_ =~ m/^form\.add_(\d+)$/) {          } elsif ($envkey =~ m/^form\.add_(\d+)$/) {
             $adds{$1} = $1;              $adds{$1} = $1;
             $addtotal ++;              $addtotal ++;
         }          } 
     }      }
   
     foreach (keys %removals) {      foreach my $key (keys(%removals)) {
         my $hashkey = $env{'form.key_'.$_};          my $hashkey = $env{'form.key_'.$key};
         &Apache::lonnet::del('comm_block',["$hashkey"],          &Apache::lonnet::del('comm_block',["$hashkey"],
                          $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'}
                          );                           );
     }      }
     foreach (keys %adds) {      foreach my $key (keys(%adds)) {
         unless ( defined($cancels{$_}) ) {          unless ( defined($cancels{$key}) ) {
             my ($newstart,$newend) = &get_dates_from_form($_);              my ($newstart,$newend) = &get_dates_from_form($key);
             my $newkey = $newstart.'____'.$newend;              my $newkey = $newstart.'____'.$newend;
             $blocking{$newkey} = $env{'user.name'}.':'.$env{'user.domain'}.':'.$env{'form.title_'.$_};              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) {      if ($addtotal + $modtotal > 0) {
Line 1220  sub get_blockdates { Line 1685  sub get_blockdates {
     }      }
 }  }
   
   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 {  sub display_blocker_status {
     my ($r,$records,$ltext) = @_;      my ($r,$records,$ltext) = @_;
     my $parmcount = 0;      my $parmcount = 0;
Line 1228  sub display_blocker_status { Line 1707  sub display_blocker_status {
         'modi' => 'Modify',          'modi' => 'Modify',
         'canc' => 'Cancel',          'canc' => 'Cancel',
     );      );
       my ($typeorder,$types) = &blocktype_text();
     $r->print(&Apache::loncommon::start_data_table());      $r->print(&Apache::loncommon::start_data_table());
     $r->print(<<"END");      $r->print(<<"END");
   <tr>    <tr>
     <th>$$ltext{'dura'}</th>      <th>$ltext->{'dura'}</th>
     <th>$$ltext{'setb'}</th>      <th>$ltext->{'setb'}</th>
     <th>$$ltext{'even'}</th>      <th>$ltext->{'even'}</th>
     <th>$$ltext{'actn'}?</th>      <th>$ltext->{'blck'}</th>
       <th>$ltext->{'actn'}?</th>
   </tr>    </tr>
 END  END
     foreach my $record (sort(keys(%{$records}))) {      foreach my $record (sort(keys(%{$records}))) {
Line 1245  END Line 1726  END
         my $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.$parmcount,$start,$onchange);          my $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.$parmcount,$start,$onchange);
         my $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.$parmcount,$end,$onchange);          my $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.$parmcount,$end,$onchange);
   
  my ($setuname,$setudom,$title) =    my ($setuname,$setudom,$title,$blocks) = 
     &parse_block_record($$records{$record});      &Apache::loncommon::parse_block_record($$records{$record});
  $title = &HTML::Entities::encode($title,'"<>&');   $title = &HTML::Entities::encode($title,'"<>&');
         my $settername = &Apache::loncommon::plainname($setuname,$setudom);          my $settername = 
              &Apache::loncommon::aboutmewrapper(
                              &Apache::loncommon::plainname($setuname,$setudom),
                              $setuname,$setudom);
         $r->print(&Apache::loncommon::start_data_table_row());          $r->print(&Apache::loncommon::start_data_table_row());
         $r->print(<<"END");          $r->print(<<"END");
         <td>$$ltext{'star'}:&nbsp;$startform<br/>$$ltext{'endd'}:&nbsp;&nbsp;$endform</td>          <td>$ltext->{'star'}:&nbsp;$startform<br/>$ltext->{'endd'}:&nbsp;&nbsp;$endform</td>
         <td>$settername</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><input type="text" name="title_$parmcount" size="15" value="$title" /><input type="hidden" name="key_$parmcount" value="$record" /></td>
           <td>
   END
           foreach my $block (@{$typeorder}) {
               my $blockstatus = '';
               if ($blocks->{$block} eq 'on') {
                   $blockstatus = 'checked="true"';
               }
               $r->print('<label><input type="checkbox" name="'.$block.'_'.$parmcount.'" '.$blockstatus.' value="1" />'.$types->{$block}.'</label><br />');
           }
           $r->print(<<"END");
           </td>      
         <td><label>$lt{'modi'}?&nbsp;<input type="checkbox" name="modify_$parmcount" /></label><br /><label>$lt{'canc'}?&nbsp;&nbsp;<input type="checkbox" name="cancel_$parmcount" /></label>          <td><label>$lt{'modi'}?&nbsp;<input type="checkbox" name="modify_$parmcount" /></label><br /><label>$lt{'canc'}?&nbsp;&nbsp;<input type="checkbox" name="cancel_$parmcount" /></label>
 END  END
         $r->print(&Apache::loncommon::end_data_table_row());          $r->print(&Apache::loncommon::end_data_table_row());
Line 1267  END Line 1762  END
     return $parmcount;      return $parmcount;
 }  }
   
 sub parse_block_record {  
     my ($record) = @_;  
     my ($setuname,$setudom,$title);  
     my @data = split(/:/,$record,3);  
     if (scalar(@data) eq 2) {  
  $title = $data[1];  
  ($setuname,$setudom) = split(/@/,$data[0]);  
     } else {  
  ($setuname,$setudom,$title) = @data;  
     }  
     return ($setuname,$setudom,$title);  
 }  
   
 sub display_addblocker_table {  sub display_addblocker_table {
     my ($r,$parmcount,$ltext) = @_;      my ($r,$parmcount,$ltext) = @_;
     my $start = time;      my $start = time;
Line 1294  sub display_addblocker_table { Line 1776  sub display_addblocker_table {
         'exam' => 'e.g., Exam 1',          'exam' => 'e.g., Exam 1',
         'addn' => 'Add new communication blocking periods'          'addn' => 'Add new communication blocking periods'
     );      );
       my ($typeorder,$types) = &blocktype_text();
     $r->print(<<"END");      $r->print(<<"END");
 <h4>$lt{'addn'}</h4>   <h4>$lt{'addn'}</h4> 
 END  END
     $r->print(&Apache::loncommon::start_data_table());      $r->print(&Apache::loncommon::start_data_table());
     $r->print(<<"END");      $r->print(<<"END");
    <tr>     <tr>
      <th>$$ltext{'dura'}</th>       <th>$ltext->{'dura'}</th>
      <th>$$ltext{'even'} $lt{'exam'}</th>       <th>$ltext->{'even'} $lt{'exam'}</th>
      <th>$$ltext{'actn'}?</th>       <th>$ltext->{'blck'}</th>
        <th>$ltext->{'actn'}?</th>
    </tr>     </tr>
 END  END
    $r->print(&Apache::loncommon::start_data_table_row());      $r->print(&Apache::loncommon::start_data_table_row());
     $r->print(<<"END");      $r->print(<<"END");
      <td>$$ltext{'star'}:&nbsp;$startform<br />$$ltext{'endd'}:&nbsp;&nbsp;$endform</td>       <td>$ltext->{'star'}:&nbsp;$startform<br />$ltext->{'endd'}:&nbsp;&nbsp;$endform</td>
      <td><input type="text" name="title_$parmcount" size="15" value="" /></td>       <td><input type="text" name="title_$parmcount" size="15" value="" /></td>
        <td>
   END
       foreach my $block (@{$typeorder}) {
           $r->print('<label><input type="checkbox" name="'.$block.'_'.$parmcount.'" value="1" />'.$types->{$block}.'</label><br />');
        }
        $r->print(<<"END");
        </td> 
      <td><label>$lt{'addb'}?&nbsp;<input type="checkbox" name="add_$parmcount" value="1" /></label></td>       <td><label>$lt{'addb'}?&nbsp;<input type="checkbox" name="add_$parmcount" value="1" /></label></td>
 END  END
     $r->print(&Apache::loncommon::end_data_table_row());      $r->print(&Apache::loncommon::end_data_table_row());
Line 1316  END Line 1807  END
     return;      return;
 }  }
   
 sub blockcheck {  sub blocktype_text {
     my ($setters,$startblock,$endblock) = @_;      my %types = &Apache::lonlocal::texthash(
     # Retrieve active student roles and active course coordinator/instructor roles          'com' => 'Messaging',
     my %live_courses =          'chat' => 'Chat',
  map { $_ => 1} &Apache::loncommon::findallcourses();          'boards' => 'Discussion',
     # FIXME should really probe for apriv, but ::allowed can only probe the           'port' => 'Portfolio',
     #       currently active role          'groups' => 'Groups',
     my %staff_of =          'blogs' => 'Blogs',
  map { $_ => 1} &Apache::loncommon::findallcourses(['cc','in']);  
   
     # Retrieve blocking times and identity of blocker for active courses  
     # for students.  
     return if (!%live_courses);  
   
     foreach my $course (keys(%live_courses)) {  
  my $cdom = $env{'course.'.$course.'.domain'};  
  my $cnum = $env{'course.'.$course.'.num'};  
   
  # if they are a staff member and are currently not playing student  
  next if ( $staff_of{$course}   
   && ($env{'request.role'} !~ m{^st\./$cdom/$cnum}));  
   
  $setters->{$course} = {};  
  $setters->{$course}{'staff'} = [];  
  $setters->{$course}{'times'} = [];  
  my %records = &Apache::lonnet::dump('comm_block',$cdom,$cnum);  
  foreach my $record (keys %records) {  
     my ($start,$end) = ($record =~ m/^(\d+)____(\d+)$/);  
     if ($start <= time && $end >= time) {  
  my ($staff_name,$staff_dom,$title) =   
     &parse_block_record($records{$record});  
  push(@{$$setters{$course}{'staff'}}, [$staff_name,$staff_dom]);  
  push(@{$$setters{$course}{'times'}}, [$start,$end]);  
  if ( ($$startblock == 0) || ($$startblock > $1) ) {  
     $$startblock = $1;  
  }  
  if ( ($$endblock == 0) || ($$endblock < $2) ) {  
     $$endblock = $2;  
  }  
     }  
  }  
     }  
 }  
   
 sub build_block_table {  
     my ($r,$startblock,$endblock,$setters) = @_;  
     my %lt = &Apache::lonlocal::texthash(  
         'cacb' => 'Currently active communication blocks',  
         'cour' => 'Course',  
         'dura' => 'Duration',  
         'blse' => 'Block set by'  
     );      );
     $r->print(<<"END");      my $typeorder = ['com','chat','boards','port','groups','blogs'];
 <br /><br />$lt{'cacb'}:<br /><br />      return ($typeorder,\%types);
 END  
     $r->print(&Apache::loncommon::start_data_table());  
     $r->print(<<"END");  
 <tr>  
  <th>$lt{'cour'}</th>  
  <th>$lt{'dura'}</th>  
  <th>$lt{'blse'}</th>  
 </tr>  
 END  
     foreach my $course (keys(%{$setters})) {  
         my %courseinfo=&Apache::lonnet::coursedescription($course);  
         for (my $i=0; $i<@{$$setters{$course}{staff}}; $i++) {  
             my ($uname,$udom) = @{$$setters{$course}{staff}[$i]};  
             my $fullname = &Apache::loncommon::plainname($uname,$udom);  
             my ($openblock,$closeblock) = @{$$setters{$course}{times}[$i]};  
             $openblock = &Apache::lonlocal::locallocaltime($openblock);  
             $closeblock= &Apache::lonlocal::locallocaltime($closeblock);  
             $r->print(&Apache::loncommon::start_data_table_row().  
       '<td>'.$courseinfo{'description'}.'</td>'.  
                       '<td>'.$openblock.' to '.$closeblock.'</td>'.  
                       '<td>'.$fullname.' ('.$uname.':'.$udom.  
                       ')</td>'.  
        &Apache::loncommon::end_data_table_row());  
         }  
     }  
     $r->print(&Apache::loncommon::end_data_table());  
 }  }
   
 # ----------------------------------------------------------- Display a message  # ----------------------------------------------------------- Display a message
Line 1405  sub displaymessage { Line 1827  sub displaymessage {
     my $suffix=&Apache::lonmsg::foldersuffix($folder);      my $suffix=&Apache::lonmsg::foldersuffix($folder);
     my %blocked = ();      my %blocked = ();
     my %setters = ();      my %setters = ();
     my $startblock = 0;  
     my $endblock = 0;  
     my $numblocked = 0;      my $numblocked = 0;
       my $crstype = &Apache::loncommon::course_type();
   
 # 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
     &blockcheck(\%setters,\$startblock,\$endblock);      my ($startblock,$endblock) = &Apache::loncommon::blockcheck(\%setters,'com');
     my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder);      my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder);
     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'));
Line 1423  sub displaymessage { Line 1845  sub displaymessage {
   
     my $counter=0;      my $counter=0;
     $r->print('<pre>');      $r->print('<pre>');
     my $escmsgid=&Apache::lonnet::escape($msgid);      my $escmsgid=&escape($msgid);
     foreach (@messages) {      foreach (@messages) {
  if ($_->[5] eq $escmsgid){   if ($_->[5] eq $escmsgid){
     last;      last;
Line 1433  sub displaymessage { Line 1855  sub displaymessage {
     $r->print('</pre>');      $r->print('</pre>');
     my $number_of_messages = scalar(@messages); #subtract 1 for last index      my $number_of_messages = scalar(@messages); #subtract 1 for last index
 # start output  # start output
     &printheader($r,'/adm/email?display='.&Apache::lonnet::escape($msgid),'Display a Message','',$content{'baseurl'});      &printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','',$content{'baseurl'});
     my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'});      my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'});
 # Functions  # Functions
     $r->print('<table border="2" width="100%"><tr bgcolor="#FFFFAA"><td>'.&mt('Functions').':</td>'.      $r->print('<table border="2" width="100%"><tr bgcolor="#FFFFAA"><td>'.&mt('Functions').':</td>'.
       '<td><a href="/adm/email?replyto='.&Apache::lonnet::escape($msgid).$sqs.        '<td><a href="/adm/email?replyto='.&escape($msgid).$sqs.
       '"><b>'.&mt('Reply').'</b></a></td>'.        '"><b>'.&mt('Reply').'</b></a></td>'.
       '<td><a href="/adm/email?forward='.&Apache::lonnet::escape($msgid).$sqs.        '<td><a href="/adm/email?forward='.&escape($msgid).$sqs.
       '"><b>'.&mt('Forward').'</b></a></td>'.        '"><b>'.&mt('Forward').'</b></a></td>'.
       '<td><a href="/adm/email?markunread='.&Apache::lonnet::escape($msgid).$sqs.        '<td><a href="/adm/email?markunread='.&escape($msgid).$sqs.
       '"><b>'.&mt('Mark Unread').'</b></a></td>'.        '"><b>'.&mt('Mark Unread').'</b></a></td>'.
       '<td><a href="/adm/email?markdel='.&Apache::lonnet::escape($msgid).$sqs.        '<td><a href="/adm/email?markdel='.&escape($msgid).$sqs.
       '"><b>'.&mt('Delete').'</b></a></td>'.        '"><b>'.&mt('Delete').'</b></a></td>'.
       '<td><a href="/adm/email?'.$sqs.        '<td><a href="/adm/email?'.$sqs.
       ($env{'form.dismode'} eq 'new'?'&folder=new':'').        ($env{'form.dismode'} eq 'new'?'&folder=new':'').
Line 1489  sub displaymessage { Line 1911  sub displaymessage {
       $content{'sendername'}.' at '.        $content{'sendername'}.' at '.
       $content{'senderdomain'}.') ':'<br /><b>'.&mt('To').':</b> '.        $content{'senderdomain'}.') ':'<br /><b>'.&mt('To').':</b> '.
               $tolist).                $tolist).
       ($content{'courseid'}?'<br /><b>'.&mt('Course').':</b> '.$courseinfo{'description'}.        ($content{'courseid'}?'<br /><b>'.&mt($crstype).':</b> '.$courseinfo{'description'}.
        ($content{'coursesec'}?' ('.&mt('Group/Section').': '.$content{'coursesec'}.')':''):'').         ($content{'coursesec'}?' ('.&mt('Section').': '.$content{'coursesec'}.')':''):'').
       '<br /><b>'.&mt('Time').':</b> '.$content{'time'}.        '<br /><b>'.&mt('Time').':</b> '.$content{'time'}.
       ($content{'baseurl'}?'<br /><b>'.&mt('Refers to').':</b> <a href="'.$content{'baseurl'}.'">'.        ($content{'baseurl'}?'<br /><b>'.&mt('Refers to').':</b> <a href="'.$content{'baseurl'}.'">'.
        $content{'baseurl'}.' ('.&Apache::lonnet::gettitle($content{'baseurl'}).')</a>':'').         $content{'baseurl'}.' ('.&Apache::lonnet::gettitle($content{'baseurl'}).')</a>':'').
Line 1542  sub header { Line 1964  sub header {
           
     my $extra = &Apache::loncommon::studentbrowser_javascript();      my $extra = &Apache::loncommon::studentbrowser_javascript();
     if ($baseurl) {      if ($baseurl) {
  $extra .= "<base href=\"http://$ENV{'SERVER_NAME'}/$baseurl\" />";   $extra .= "<base href=\"".&Apache::lonnet::absolute_url()."/$baseurl\" />";
     }      }
     $r->print(&Apache::loncommon::start_page('Communication and Messages',      $r->print(&Apache::loncommon::start_page('Communication and Messages',
      $extra));    $extra));
     $r->print(&Apache::lonhtmlcommon::breadcrumbs      $r->print(&Apache::lonhtmlcommon::breadcrumbs
       (($title?$title:'Communication and Messages')));        (($title?$title:'Communication and Messages')));
   
 }  }
   
 # ---------------------------------------------------------------- Print header  # ---------------------------------------------------------------- Print header
Line 1567  sub storecomment { Line 1988  sub storecomment {
     my ($r)=@_;      my ($r)=@_;
     my $msgtxt=&Apache::lonfeedback::clear_out_html($env{'form.message'});      my $msgtxt=&Apache::lonfeedback::clear_out_html($env{'form.message'});
     my $cleanmsgtxt='';      my $cleanmsgtxt='';
     foreach (split(/[\n\r]/,$msgtxt)) {      foreach my $line (split(/[\n\r]/,$msgtxt)) {
  unless ($_=~/^\s*(\>|\&gt\;)/) {   unless ($line=~/^\s*(\>|\&gt\;)/) {
     $cleanmsgtxt.=$_."\n";      $cleanmsgtxt.=$line."\n";
  }   }
     }      }
     my $key=&Apache::lonnet::escape($env{'form.baseurl'}).'___'.time;      my $key=&escape($env{'form.baseurl'}).'___'.time;
     &Apache::lonnet::put('nohist_stored_comments',{ $key => $cleanmsgtxt });      &Apache::lonnet::put('nohist_stored_comments',{ $key => $cleanmsgtxt });
 }  }
   
 sub storedcommentlisting {  sub storedcommentlisting {
     my ($r)=@_;      my ($r)=@_;
     my %msgs=&Apache::lonnet::dump('nohist_stored_comments',undef,undef,      my %msgs=&Apache::lonnet::dump('nohist_stored_comments',undef,undef,
        '^'.&Apache::lonnet::escape(&Apache::lonnet::escape($env{'form.showcommentbaseurl'})));         '^'.&escape(&escape($env{'form.showcommentbaseurl'})));
     $r->print(&Apache::loncommon::start_page('Stored Comment Listing',undef,      $r->print(&Apache::loncommon::start_page('Stored Comment Listing',undef,
      {'onlybody' => 1}));       {'onlybody' => 1}));
     if ((keys %msgs)[0]=~/^error\:/) {      if ((keys %msgs)[0]=~/^error\:/) {
  $r->print(&mt('No stored comments yet.'));   $r->print(&mt('No stored comments yet.'));
     } else {      } else {
  my $found=0;   my $found=0;
  foreach (sort keys %msgs) {   foreach my $key (sort(keys(%msgs))) {
     $r->print("\n".$msgs{$_}."<hr />");      $r->print("\n".$msgs{$key}."<hr />");
     $found=1;      $found=1;
  }   }
  unless ($found) {   unless ($found) {
Line 1604  sub sendoffmail { Line 2025  sub sendoffmail {
     my $sendstatus='';      my $sendstatus='';
     my %specialmsg_status;      my %specialmsg_status;
     my $numspecial = 0;      my $numspecial = 0;
       my ($cdom,$cnum,$group);
       if (exists($env{'form.group'})) {
           $group = $env{'form.group'};
       }
       if (exists($env{'request.course.id'})) {
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       }
     if ($env{'form.send'}) {      if ($env{'form.send'}) {
  &printheader($r,'','Messages being sent.');          if ($group eq '') {
       &printheader($r,'','Messages being sent.');
           } else {
               $r->print(&groupmail_header('sending',$group));
           }
  $r->rflush();   $r->rflush();
  my %content=();   my %content=();
  undef %content;   undef %content;
Line 1624  sub sendoffmail { Line 2057  sub sendoffmail {
     &statuschange($msgid,'replied',$folder);      &statuschange($msgid,'replied',$folder);
  }   }
   
  my $to = $env{'form.selectedusers.forminput'};   my @to =
       &Apache::loncommon::get_env_multiple('form.selectedusers_forminput');
  my $mode = $env{'form.sendmode'};   my $mode = $env{'form.sendmode'};
   
  my %toaddr;   my %toaddr;
  if ($to) {   if (@to) {
     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 $address = $user.":".$domain; # How the code below expects it.      my $address = $user.":".$domain; # How the code below expects it.
Line 1646  sub sendoffmail { Line 2080  sub sendoffmail {
     }      }
  } elsif ($env{'form.sendmode'} eq 'upload') {   } elsif ($env{'form.sendmode'} eq 'upload') {
     foreach my $line (split(/[\n\r\f]+/,$env{'form.upfile'})) {      foreach my $line (split(/[\n\r\f]+/,$env{'form.upfile'})) {
  my ($rec,$txt)=split(/\s*\:\s*/,$line);                  my ($rec,$txt) = ($line =~ /^([^:]+:[^:]+):(.*)$/);
  if ($txt) {   if ($txt) {
     $rec=~s/\@/\:/;                      $rec =~ s/^\s+//;
                       $rec =~ s/\s+$//;
     $toaddr{$rec}.=$txt."\n";      $toaddr{$rec}.=$txt."\n";
  }   }
     }      }
Line 1658  sub sendoffmail { Line 2093  sub sendoffmail {
     }      }
  }   }
  if ($env{'form.additionalrec'}) {   if ($env{'form.additionalrec'}) {
     foreach (split(/\,/,$env{'form.additionalrec'})) {      foreach my $rec (split(/\,/,$env{'form.additionalrec'})) {
  my ($auname,$audom)=split(/\@/,$_);   my ($auname,$audom)=split(/:/,$rec);
  if (($auname ne "") && ($audom ne "")) {   if (($auname ne "") && ($audom ne "")) {
     $toaddr{$auname.':'.$audom}='';      $toaddr{$auname.':'.$audom}='';
  }   }
Line 1729  sub sendoffmail { Line 2164  sub sendoffmail {
                 $subj_prefix = 'Broadcast.';                  $subj_prefix = 'Broadcast.';
             }              }
             my ($specialmsgid,$specialresult);              my ($specialmsgid,$specialresult);
             my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};              my $course_str = &escape('['.$cnum.':'.$cdom.']');
             my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
             my $course_str = &Apache::lonnet::escape('['.$cnum.':'.$cdom.']');  
   
             if ($numspecial) {              if ($numspecial) {
                 $specialresult = &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,$subj_prefix.                  $specialresult = &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,$subj_prefix.
                     ' '.$course_str,$savemsg,undef,undef,undef,                      ' '.$course_str,$savemsg,undef,undef,undef,
                     undef,undef,\$specialmsgid);                      undef,undef,\$specialmsgid);
                 $specialmsgid = &Apache::lonnet::unescape($specialmsgid);                  $specialmsgid = &unescape($specialmsgid);
             }              }
             if ($specialresult eq 'ok') {              if ($specialresult eq 'ok') {
                 my $record_sent;                  my $record_sent;
                 my @recusers;                  my @recusers;
                 my @recudoms;                  my @recudoms;
                 my ($stamp,$crssubj,$msgname,$msgdom,$msgcount,$context,$pid) =                  my ($stamp,$crssubj,$msgname,$msgdom,$msgcount,$context,$pid) =
     split(/\:/,&Apache::lonnet::unescape($specialmsgid));      split(/\:/,&unescape($specialmsgid));
   
                 foreach my $recipient (sort(keys(%toaddr))) {                  foreach my $recipient (sort(keys(%toaddr))) {
                     if ($specialmsg_status{$recipient} eq 'ok') {                      if ($specialmsg_status{$recipient} eq 'ok') {
Line 1786  sub sendoffmail { Line 2219  sub sendoffmail {
  $r->print('<br /><span class="LC_success">'.&mt('Completed.').'</span>');   $r->print('<br /><span class="LC_success">'.&mt('Completed.').'</span>');
  if ($env{'form.displayedcrit'}) {   if ($env{'form.displayedcrit'}) {
     &discrit($r);      &discrit($r);
           }
           if ($group ne '') {
               $r->print(&groupmail_sent($group,$cdom,$cnum)); 
  } else {   } else {
     &Apache::loncommunicate::menu($r);      &Apache::loncommunicate::menu($r);
  }   }
Line 1812  sub handler { Line 2248  sub handler {
         ['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','block','folder','startdis','interdis',
  'showcommentbaseurl','dismode','group','subject','text']);   'showcommentbaseurl','dismode','group','subject','text','ref']);
     $sqs='&sortedby='.$env{'form.sortedby'};      $sqs='&sortedby='.$env{'form.sortedby'};
   
 # ------------------------------------------------------ They checked for email  # ------------------------------------------------------ They checked for email
Line 1834  sub handler { Line 2270  sub handler {
     unless ($folder) {       unless ($folder) { 
  $folder='';    $folder=''; 
     } else {      } else {
  $sqs.='&folder='.&Apache::lonnet::escape($folder);   $sqs.='&folder='.&escape($folder);
     }      }
 # ------------------------------------------------------------ Get Display Mode  # ------------------------------------------------------------ Get Display Mode
   
Line 1842  sub handler { Line 2278  sub handler {
     unless ($dismode) {       unless ($dismode) { 
  $dismode='';    $dismode=''; 
     } else {      } else {
  $sqs.='&dismode='.&Apache::lonnet::escape($dismode);   $sqs.='&amp;dismode='.&escape($dismode);
     }      }
   
 # --------------------------------------------------------------------- Display  # --------------------------------------------------------------------- Display
Line 1878  sub handler { Line 2314  sub handler {
  &compout($r,'',$env{'form.replyto'},undef,undef,$folder,$dismode);   &compout($r,'',$env{'form.replyto'},undef,undef,$folder,$dismode);
     } elsif ($env{'form.confirm'}) {      } elsif ($env{'form.confirm'}) {
  &printheader($r,'','Confirmed Receipt');   &printheader($r,'','Confirmed Receipt');
  foreach (keys %env) {   my $replying = 0;
     if ($_=~/^form\.rec\_(.*)$/) {   foreach my $envkey (keys(%env)) {
       if ($envkey=~/^form\.rec\_(.*)$/) {
  $r->print('<b>'.&mt('Confirming Receipt').':</b> '.   $r->print('<b>'.&mt('Confirming Receipt').':</b> '.
   &Apache::lonmsg::user_crit_received($1).'<br>');    &Apache::lonmsg::user_crit_received($1).'<br>');
     }      }
     if ($_=~/^form\.reprec\_(.*)$/) {      if ($envkey=~/^form\.reprec\_(.*)$/) {
  my $msgid=$1;   my $msgid=$1;
  $r->print('<b>'.&mt('Confirming Receipt').':</b> '.   $r->print('<b>'.&mt('Confirming Receipt').':</b> '.
   &Apache::lonmsg::user_crit_received($msgid).'<br>');    &Apache::lonmsg::user_crit_received($msgid).'<br>');
  &compout($r,'','','',$msgid);   &compout($r,'','','',$msgid);
    $replying = 1;
     }      }
  }   }
  &discrit($r);   if (!$replying) {
       &discrit($r);
    }
     } elsif ($env{'form.critical'}) {      } elsif ($env{'form.critical'}) {
  &printheader($r,'','Displaying Critical Messages');   &printheader($r,'','Displaying Critical Messages');
  &discrit($r);   &discrit($r);
Line 1912  sub handler { Line 2352  sub handler {
  foreach my $key (keys(%env)) {   foreach my $key (keys(%env)) {
     if ($key=~/^form\.delmark_(.*)$/) {      if ($key=~/^form\.delmark_(.*)$/) {
  my ($result,$msg) =   my ($result,$msg) =
     &movemsg(&Apache::lonnet::unescape($1),$folder,      &movemsg(&unescape($1),$folder,
      $env{'form.movetofolder'});       $env{'form.movetofolder'});
  if ($result) {   if ($result) {
     $total++;      $total++;
Line 1939  sub handler { Line 2379  sub handler {
  foreach my $key (keys(%env)) {   foreach my $key (keys(%env)) {
     if ($key=~/^form\.delmark_(.*)$/) {      if ($key=~/^form\.delmark_(.*)$/) {
  my ($result,$msg) =    my ($result,$msg) = 
     &statuschange(&Apache::lonnet::unescape($1),'deleted',      &statuschange(&unescape($1),'deleted',
   $folder);    $folder);
  if ($result) {   if ($result) {
     $total++;      $total++;
Line 1976  sub handler { Line 2416  sub handler {
  &sendoffmail($r,$folder);   &sendoffmail($r,$folder);
  if ($env{'form.storebasecomment'}) {   if ($env{'form.storebasecomment'}) {
     &storecomment($r);      &storecomment($r);
  }          }
  if (($env{'form.rsspost'}) && ($env{'request.course.id'})) {   if (($env{'form.rsspost'}) && ($env{'request.course.id'})) {
     &Apache::lonrss::addentry($env{'course.'.$env{'request.course.id'}.'.num'},          &Apache::lonrss::addentry($env{'course.'.$env{'request.course.id'}.'.num'},
       $env{'course.'.$env{'request.course.id'}.'.domain'},        $env{'course.'.$env{'request.course.id'}.'.domain'},
       'Course_Announcements',        'Course_Announcements',
       $env{'form.subject'},        $env{'form.subject'},
       $env{'form.message'},'/adm/communicate','public');        $env{'form.message'},'/adm/communicate','public');
  }   }
  &disall($r,($folder?$folder:$dismode));   if ((!exists($env{'form.group'})) && (!$env{'form.displayedcrit'})) {
       &disall($r,($folder?$folder:$dismode));
    }
     } elsif ($env{'form.newfolder'}) {      } elsif ($env{'form.newfolder'}) {
  &printheader($r,'','New Folder');   &printheader($r,'','New Folder');
  &makefolder($env{'form.newfolder'});          my $showfolder = $env{'form.newfolder'};
  &Apache::loncommunicate::menu($r);   my ($makeresult,$warning) = &makefolder($env{'form.newfolder'});
  &disall($r,$env{'form.newfolder'});          if ($makeresult eq 'ok') {
               $r->print(&mt('Mail folder "[_1]" created.',$showfolder).'<br />');
           } else {
               $r->print(&mt('Creation failed.').' '.$makeresult.'<br />'.
                         $warning);
               $showfolder = $folder;
           }
           &Apache::loncommunicate::menu($r);
    &disall($r,$showfolder);
     } elsif ($env{'form.showcommentbaseurl'}) {      } elsif ($env{'form.showcommentbaseurl'}) {
  &storedcommentlisting($r);   &storedcommentlisting($r);
       } elsif ($env{'form.folderaction'} eq 'delete') {
           &printheader($r,'','Deleted Folder');
           my $showfolder = '';
           my $delresult = &deletefolder($folder);
           if ($delresult eq 'ok') {
               $r->print(&mt('Mail folder "[_1]" deleted.',$folder).'<br />');
           } else {
               $r->print(&mt('Deletion failed.').' '.$delresult.'<br />');
               $showfolder = $folder;
           }
           &Apache::loncommunicate::menu($r);
           &disall($r,$showfolder);
       } elsif ($env{'form.folderaction'} eq 'rename') {
           &printheader($r,'','Renamed Folder');
           my $showfolder = $env{'form.renamed'};
           my $renresult = &renamefolder($folder);
           if ($renresult eq 'ok') {
               $r->print(&mt('Mail folder "[_1]" renamed "[_2]".',$folder,$showfolder).'<br />');
           } else {
               $r->print(&mt('Renaming failed.').' '.$renresult.'<br />');
               $showfolder = $folder;
           }
           &Apache::loncommunicate::menu($r);
           &disall($r,$showfolder);
     } else {      } else {
  &printheader($r,'','Display All Messages');   &printheader($r,'','Display All Messages');
  &Apache::loncommunicate::menu($r);    &Apache::loncommunicate::menu($r);
  &disall($r,($folder?$folder:$dismode));   &disall($r,($folder?$folder:$dismode));
     }      }
     $r->print(&Apache::loncommon::end_page());      $r->print(&Apache::loncommon::end_page());
Line 2012  sub handler { Line 2486  sub handler {
   
 __END__  __END__
   
   
   
   
   
   
   

Removed from v.1.27  
changed lines
  Added in v.1.49


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