Diff for /loncom/interface/lonmsgdisplay.pm between versions 1.7 and 1.42

version 1.7, 2006/04/23 03:50:54 version 1.42, 2006/11/23 16:40:17
Line 125  use Apache::lonlocal; Line 125  use Apache::lonlocal;
 use Apache::loncommunicate;  use Apache::loncommunicate;
 use Apache::lonfeedback;  use Apache::lonfeedback;
 use Apache::lonrss();  use Apache::lonrss();
   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 184  sub statuschange { Line 187  sub statuschange {
  &Apache::lonnet::put('email_status'.$suffix,{$msgid => $newstatus});   &Apache::lonnet::put('email_status'.$suffix,{$msgid => $newstatus});
     }      }
     if ($newstatus eq 'deleted') {      if ($newstatus eq 'deleted') {
        &movemsg(&Apache::lonnet::unescape($msgid),$folder,'trash');   return &movemsg($msgid,$folder,'trash');
    }      }
       return ;
 }  }
   
 # ============================================================= Make new folder  # ============================================================= Make new folder
Line 206  sub movemsg { Line 210  sub movemsg {
     if ($srcfolder eq 'new') { $srcfolder=''; }      if ($srcfolder eq 'new') { $srcfolder=''; }
     my $srcsuffix=&Apache::lonmsg::foldersuffix($srcfolder);      my $srcsuffix=&Apache::lonmsg::foldersuffix($srcfolder);
     my $trgsuffix=&Apache::lonmsg::foldersuffix($trgfolder);      my $trgsuffix=&Apache::lonmsg::foldersuffix($trgfolder);
       if ($srcsuffix eq $trgsuffix) {
    return (0,&mt('Message not moved, Attempted to move message to the same folder as it already is in.'));
       }
   
 # Copy message  # Copy message
     my %message=&Apache::lonnet::get('nohist_email'.$srcsuffix,[$msgid]);      my %message=&Apache::lonnet::get('nohist_email'.$srcsuffix,[$msgid]);
     &Apache::lonnet::put('nohist_email'.$trgsuffix,{$msgid => $message{$msgid}});      if (!exists($message{$msgid}) || $message{$msgid} eq '') {
    if (&Apache::lonnet::error(%message)) {
       return (0,&mt('Message not moved, A network error occurred.'));
    } else {
       return (0,&mt('Message not moved as the message is no longer in the source folder.'));
    }
       }
   
       my $result =&Apache::lonnet::put('nohist_email'.$trgsuffix,
        {$msgid => $message{$msgid}});
       if (&Apache::lonnet::error($result)) {
    return (0,&mt('Message not moved, A network error occurred.'));
       }
   
 # Copy status  # Copy status
     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]);
  &Apache::lonnet::put('email_status'.$trgsuffix,{$msgid => $status{$msgid}});   # a non-existant status is the mark of an unread msg
    if (&Apache::lonnet::error(%status)) {
       return (0,&mt('Message copied to new folder but status was not, A network error occurred.'));
    }
    my $result=&Apache::lonnet::put('email_status'.$trgsuffix,
    {$msgid => $status{$msgid}});
    if (&Apache::lonnet::error($result)) {
       return (0,&mt('Message copied to new folder but status was not, A network error occurred.'));
    }
     }      }
   
 # Delete orginals  # Delete orginals
     &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);      my $result_del_msg = 
     &Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]);   &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);
       my $result_del_stat =
    &Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]);
       if (&Apache::lonnet::error($result_del_msg)) {
    return (0,&mt('Message copied, but unable to delete the original from the source folder.'));
       }
       if (&Apache::lonnet::error($result_del_stat)) {
    return (0,&mt('Message copied, but unable to delete the original status from the source folder.'));
       }
   
       return (1);
 }  }
   
 # ======================================================= Display a course list  # ======================================================= Display a course list
   
 sub discourse {  sub discourse {
     my $r=shift;      my $result;
     my $classlist = &Apache::loncoursedata::get_classlist();      my ($course_personnel,
     my $now=time;   $current_members,
     my %lt=&Apache::lonlocal::texthash('cfa' => 'Check All',   $expired_members,
             'cfs' => 'Check Section/Group',   $future_members) = 
             'cfn' => 'Uncheck All');      &Apache::lonselstudent::get_people_in_class($env{'request.course.sec'});
     $r->print(<<ENDDISHEADER);      unshift @$current_members, (@$course_personnel);
 <input type="hidden" name="sendmode" value="group" />      my %defaultUsers;
 <script>      
     function checkall() {      $result .= '<input type="hidden" name="sendmode" value="group" />'."\n";
  for (i=0; i<document.forms.compemail.elements.length; i++) {  
             if       $result .= &Apache::lonselstudent::render_student_list($current_members,
           (document.forms.compemail.elements[i].name.indexOf('send_to_')==0) {     "compemail",
       document.forms.compemail.elements[i].checked=true;     "current",
      \%defaultUsers,
      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">'.
     function checksec() {                     '<tr>';
  for (i=0; i<document.forms.compemail.elements.length; i++) {          foreach my $status (@statustypes)  {
             if               if (ref($numitems) eq 'HASH') {
           (document.forms.compemail.elements[i].name.indexOf                  if ((defined($$numitems{$status})) && ($$numitems{$status})) {
            ('send_to_&&&'+document.forms.compemail.chksec.value+'&&&')==0) {                      $result.='<td valign="top">'.
       document.forms.compemail.elements[i].checked=true;                               '<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;
   }
   
     function uncheckall() {  sub group_check_uncheck {
  for (i=0; i<document.forms.compemail.elements.length; i++) {      my $output = qq|
             if   <script type="text/javascript">
           (document.forms.compemail.elements[i].name.indexOf('send_to_')==0) {  function toggleAll(caller,action) {
       document.forms.compemail.elements[i].checked=false;      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>  </script>
 <input type="button" onClick="checkall()" value="$lt{'cfa'}" />&nbsp;      |;
 <input type="button" onClick="checksec()" value="$lt{'cfs'}" />  }
 <input type="text" size="5" name="chksec" />&nbsp;  
 <input type="button" onClick="uncheckall()" value="$lt{'cfn'}" />  sub groupmail_header {
 <p>      my ($action,$group,$cdom,$cnum) = @_;
 ENDDISHEADER      my ($description,$refarg);
     my %coursepersonnel=&Apache::lonnet::get_course_adv_roles();      if (!$cdom || !$cnum) {
     $r->print('<table>');          $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     foreach my $role (sort keys %coursepersonnel) {          $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         foreach (split(/\,/,$coursepersonnel{$role})) {      }
             my ($puname,$pudom)=split(/\:/,$_);      if (exists($env{'form.ref'})) {
             $r->print('<tr><td><label>'.          $refarg = 'ref='.$env{'form.ref'};
                       '<input type="checkbox" name="send_to_&&&&&&_'.  
                       $puname.':'.$pudom.'" /> '.  
                       &Apache::loncommon::plainname($puname,$pudom).  
                       '</label></td>'.  
                       '<td>('.$_.'),</td><td><i>'.$role.'</i></td></tr>');  
         }  
     }  
     $r->print('</table><table>');  
     my $sort = sub {  
  my $aname=lc($classlist->{$a}[&Apache::loncoursedata::CL_FULLNAME()]);  
  if (!$aname) { $aname=$a; }  
  my $bname=lc($classlist->{$b}[&Apache::loncoursedata::CL_FULLNAME()]);  
  if (!$bname) { $bname=$b; }  
  return $aname cmp $bname;  
     };  
     foreach my $student (sort $sort (keys(%{$classlist}))) {  
  my $info=$classlist->{$student};  
         my ($sname,$sdom,$status,$fullname,$section) =  
             (@{$info}[&Apache::loncoursedata::CL_SNAME(),  
                       &Apache::loncoursedata::CL_SDOM(),  
                       &Apache::loncoursedata::CL_STATUS(),  
                       &Apache::loncoursedata::CL_FULLNAME(),  
                       &Apache::loncoursedata::CL_SECTION()]);  
         next if ($status ne 'Active');  
  next if ($env{'request.course.sec'} &&  
  $section ne $env{'request.course.sec'});  
         my $key = 'send_to_&&&'.$section.'&&&_'.$student;  
         if (! defined($fullname) || $fullname eq '') { $fullname = $sname; }  
         $r->print('<tr><td><label>'.  
                   qq{<input type="checkbox" name="$key" />}.('&nbsp;'x2).  
                   $fullname.'</label></td><td>'.$sname.'@'.$sdom.'</td><td>'.$section.  
                   '</td></tr>');  
     }      }
     $r->print('</table>');      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
Line 318  sub discrit { Line 486  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(
  &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('.   &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('.
 $content{'sendername'}.'@'.  $content{'sendername'}.':'.
             $content{'senderdomain'}.') '.$content{'time'}.              $content{'senderdomain'}.') '.$content{'time'}.
             '<br />'.&mt('Subject').': '.$content{'subject'}.              '<br />'.&mt('Subject').': '.$content{'subject'}.
             '<br /><pre>'.              '<br /><pre>'.
Line 332  $content{'sendername'}.'@'. Line 500  $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 357  sub sortedmessages { Line 525  sub sortedmessages {
     my %descriptions;      my %descriptions;
     my %status_cache =       my %status_cache = 
  &Apache::lonnet::get('email_status'.&Apache::lonmsg::foldersuffix($folder),\@messages);   &Apache::lonnet::get('email_status'.&Apache::lonmsg::foldersuffix($folder),\@messages);
     foreach (@messages) {  
  my $msgid=&Apache::lonnet::escape($_);      my $get_received;
       if ($folder eq 'sent' 
    && ($env{'form.sortedby'} =~ m/^(rev)?(user|domain)$/)) {
    $get_received = 1;
       }
   
       foreach my $msgid (@messages) {
    my $esc_msgid=&escape($msgid);
  my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid)=   my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid)=
     &Apache::lonmsg::unpackmsgid($msgid,$folder,undef,      &Apache::lonmsg::unpackmsgid($esc_msgid,$folder,undef,
  \%status_cache);   \%status_cache);
         my $description = &get_course_desc($fromcid,\%descriptions);          my $description = &get_course_desc($fromcid,\%descriptions);
  my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status,   my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status,
      $msgid,$description);       $esc_msgid,$description);
    if ($get_received) {
       my %message = &Apache::lonnet::get('nohist_email'.$suffix,
          [$msgid]);
       my %content = &Apache::lonmsg::unpackagemsg($message{$msgid});
       push(@temp1,$content{'recuser'},$content{'recdomain'});
    }
         # Check whether message was sent during blocking period.          # Check whether message was sent during blocking period.
         if ($sendtime >= $startblock && ($sendtime <= $endblock && $endblock > 0) ) {          if ($sendtime >= $startblock && ($sendtime <= $endblock && $endblock > 0) ) {
             my $escid = &Apache::lonnet::unescape($msgid);              $$blocked{$msgid} = 'ON';
             $$blocked{$escid} = 'ON';  
             $$numblocked ++;              $$numblocked ++;
         } else {           } else { 
             push @temp ,\@temp1;              push @temp ,\@temp1;
Line 383  sub sortedmessages { Line 563  sub sortedmessages {
     @temp = sort  {$b->[0] <=> $a->[0]} @temp;       @temp = sort  {$b->[0] <=> $a->[0]} @temp; 
     }      }
     if ($env{'form.sortedby'} eq "user"){      if ($env{'form.sortedby'} eq "user"){
  @temp = sort  {lc($a->[2]) cmp lc($b->[2])} @temp;   if ($get_received) {
       @temp = sort  {lc($a->[7][0]) cmp lc($b->[7][0])} @temp;
    } else {
       @temp = sort  {lc($a->[2])    cmp lc($b->[2])}    @temp;
    }
     }      }
     if ($env{'form.sortedby'} eq "revuser"){      if ($env{'form.sortedby'} eq "revuser"){
  @temp = sort  {lc($b->[2]) cmp lc($a->[2])} @temp;   if ($get_received) {
       @temp = sort  {lc($b->[7][0]) cmp lc($a->[7][0])} @temp;
    } else {
       @temp = sort  {lc($b->[2])    cmp lc($a->[2])}    @temp;
    }
     }      }
     if ($env{'form.sortedby'} eq "domain"){      if ($env{'form.sortedby'} eq "domain"){
         @temp = sort  {$a->[3] cmp $b->[3]} @temp;   if ($get_received) {
       @temp = sort  {$a->[8][0] cmp $b->[8][0]} @temp;
    } else {
       @temp = sort  {$a->[3]    cmp $b->[3]}    @temp;
    }
     }      }
     if ($env{'form.sortedby'} eq "revdomain"){      if ($env{'form.sortedby'} eq "revdomain"){
         @temp = sort  {$b->[3] cmp $a->[3]} @temp;   if ($get_received) {
       @temp = sort  {$b->[8][0] cmp $a->[8][0]} @temp;
    } else {
       @temp = sort  {$b->[3]    cmp $a->[3]}    @temp;
    }
     }      }
     if ($env{'form.sortedby'} eq "subject"){      if ($env{'form.sortedby'} eq "subject"){
         @temp = sort  {lc($a->[1]) cmp lc($b->[1])} @temp;          @temp = sort  {lc($a->[1]) cmp lc($b->[1])} @temp;
Line 444  sub disnew { Line 640  sub disnew {
     my %lt=&Apache::lonlocal::texthash(      my %lt=&Apache::lonlocal::texthash(
        'nm' => 'New Messages',         'nm' => 'New Messages',
        'su' => 'Subject',         'su' => 'Subject',
                                        'co' => 'Course',                                         'co' => 'Course/Group',
        'da' => 'Date',         'da' => 'Date',
        'us' => 'Username',         'us' => 'Username',
        'op' => 'Open',         'op' => 'Open',
Line 462  sub disnew { Line 658  sub disnew {
     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 472  sub disnew { Line 668  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 => &Apache::lonnet::unescape($shortsubj),                          shortsub => $shortsubj,
                         from     => $fromname,                          from     => $fromname,
                         fromdom  => $fromdom,                          fromdom  => $fromdom,
                         course   => $description                           course   => $description 
Line 498  TABLEHEAD Line 694  TABLEHEAD
 <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&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("</td></tr>");
         }          }
Line 549  sub disfolder { Line 745  sub disfolder {
     my $numblocked = 0;      my $numblocked = 0;
     &blockcheck(\%setters,\$startblock,\$endblock);      &blockcheck(\%setters,\$startblock,\$endblock);
     $r->print(<<ENDDISHEADER);      $r->print(<<ENDDISHEADER);
 <script>  <script type="text/javascript">
     function checkall() {      function checkall() {
  for (i=0; i<document.forms.disall.elements.length; i++) {   for (i=0; i<document.forms.disall.elements.length; i++) {
             if               if 
Line 562  sub disfolder { Line 758  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 570  sub disfolder { Line 766  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 613  ENDDISHEADER Line 809  ENDDISHEADER
     }      }
     $r->print('</th><th>');      $r->print('</th><th>');
     if ($env{'form.sortedby'} eq "revcourse") {      if ($env{'form.sortedby'} eq "revcourse") {
         $r->print('<a href = "?sortedby=course'.$fsqs.'">'.&mt('Course').'</a>');          $r->print('<a href = "?sortedby=course'.$fsqs.'">'.&mt('Course/Group').'</a>');
     } else {      } else {
         $r->print('<a href = "?sortedby=revcourse'.$fsqs.'">'.&mt('Course').'</a>');          $r->print('<a href = "?sortedby=revcourse'.$fsqs.'">'.&mt('Course/Group').'</a>');
     }      }
     $r->print('</th><th>');      $r->print('</th><th>');
     if ($env{'form.sortedby'} eq "revstatus") {      if ($env{'form.sortedby'} eq "revstatus") {
Line 627  ENDDISHEADER Line 823  ENDDISHEADER
   
     my $suffix = &Apache::lonmsg::foldersuffix($folder);      my $suffix = &Apache::lonmsg::foldersuffix($folder);
     for (my $n=$firstdis;$n<=$lastdis;$n++) {      for (my $n=$firstdis;$n<=$lastdis;$n++) {
  my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID,$description)= @{$temp[$n]};   my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID,
       $description,$recv_name,$recv_domain)= 
    @{$temp[$n]};
  if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) {   if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) {
     if ($status eq 'new') {      if ($status eq 'new') {
  $r->print('<tr class="LC_mail_new">');   $r->print('<tr class="LC_mail_new">');
Line 640  ENDDISHEADER Line 838  ENDDISHEADER
     }      }
     my ($dis_name,$dis_domain) = ($fromname,$fromdomain);      my ($dis_name,$dis_domain) = ($fromname,$fromdomain);
     if ($folder eq 'sent') {      if ($folder eq 'sent') {
  my $msg_id = &Apache::lonnet::unescape($origID);   if (defined($recv_name) && !defined($recv_domain)) {
  my %message=&Apache::lonnet::get('nohist_email'.$suffix,      $dis_name   = join('<br />',@{$recv_name});
  [$msg_id]);      $dis_domain = join('<br />',@{$recv_domain});
  my %content=&Apache::lonmsg::unpackagemsg($message{$msg_id});   } else {
  $dis_name   = join('<br />',@{$content{'recuser'}});      my $msg_id  = &unescape($origID);
  $dis_domain = join('<br />',@{$content{'recdomain'}});      my %message = &Apache::lonnet::get('nohist_email'.$suffix,
          [$msg_id]);
       my %content = &Apache::lonmsg::unpackagemsg($message{$msg_id});
       $dis_name   = join('<br />',@{$content{'recuser'}});
       $dis_domain = join('<br />',@{$content{'recdomain'}});
    }
     }      }
     $r->print('<td><input type="checkbox" name="delmark_'.$origID.'" /></td><td><a href="/adm/email?display='.$origID.$sqs.       $r->print('<td><input type="checkbox" name="delmark_'.$origID.'" /></td><td><a href="/adm/email?display='.$origID.$sqs. 
       '">'.&mt('Open').'</a></td><td>'.        '">'.&mt('Open').'</a></td><td>'.
Line 653  ENDDISHEADER Line 856  ENDDISHEADER
       '">'.&mt('Delete'):'&nbsp').'</a></td>'.        '">'.&mt('Delete'):'&nbsp').'</a></td>'.
       '<td>'.&Apache::lonlocal::locallocaltime($sendtime).'</td><td>'.        '<td>'.&Apache::lonlocal::locallocaltime($sendtime).'</td><td>'.
       $dis_name.'</td><td>'.$dis_domain.'</td><td>'.        $dis_name.'</td><td>'.$dis_domain.'</td><td>'.
       &Apache::lonnet::unescape($shortsubj).'</td><td>'.        $shortsubj.'</td><td>'.
                       $description.'</td><td>'.$status.'</td></tr>'."\n");                        $description.'</td><td>'.$status.'</td></tr>'."\n");
  } elsif ($status eq 'deleted') {   } elsif ($status eq 'deleted') {
 # purge  # purge
     &movemsg(&Apache::lonnet::unescape($origID),$folder,'trash');      my ($result,$msg) = 
    &movemsg(&unescape($origID),$folder,'trash');
       
  }   }
     }         }   
     $r->print("</table>\n<p>".      $r->print("</table>\n<p>".
Line 691  ENDDISHEADER Line 896  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 700  sub compout { Line 911  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 758  sub compout { Line 969  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 774  sub compout { Line 985  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'}; }
       $r->print(      if ($env{'form.text'}) { $dismsg=$env{'form.text'}; }
       if ($env{'form.subject'}) { $dissub=$env{'form.subject'}; }
       $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(
  &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('.   &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('.
       $content{'sendername'}.'@'.        $content{'sendername'}.':'.
       $content{'senderdomain'}.')'.        $content{'senderdomain'}.')'.
       '<input type="hidden" name="recuname" value="'.$content{'sendername'}.'" />'.        '<input type="hidden" name="recuname" value="'.$content{'sendername'}.'" />'.
       '<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();
Line 830  $disbase Line 1055  $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 859  $dispcrit Line 1092  $dispcrit
 ENDUPLOAD  ENDUPLOAD
     }      }
     if ($broadcast eq 'group') {      if ($broadcast eq 'group') {
        &discourse($r);         if ($group eq '') {
              my $studentsel = &discourse();
              $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 868  ENDUPLOAD Line 1107  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'};
Line 882  sub retrieve_instructor_comments { Line 1135  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'});
  $result.='Recorded by '.   $result.='Recorded by '.
             $content{'sendername'}.'@'.$content{'senderdomain'}."\n";              $content{'sendername'}.':'.$content{'senderdomain'}."\n";
         $result.=          $result.=
             &Apache::lontexconvert::msgtexconverted($content{'message'})."\n";              &Apache::lontexconvert::msgtexconverted($content{'message'})."\n";
      }       }
Line 910  sub disfacetoface { Line 1163  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 920  sub disfacetoface { Line 1173  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 933  sub disfacetoface { Line 1186  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 946  sub disfacetoface { Line 1199  sub disfacetoface {
         $result.=&mt('By').': <b>'.          $result.=&mt('By').': <b>'.
 &Apache::loncommon::aboutmewrapper(  &Apache::loncommon::aboutmewrapper(
  &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('.   &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('.
 $content{'sendername'}.'@'.  $content{'sendername'}.':'.
             $content{'senderdomain'}.') '.$content{'time'}.              $content{'senderdomain'}.') '.$content{'time'}.
             '<br /><pre>'.              '<br /><pre>'.
               &Apache::lontexconvert::msgtexconverted($content{'message'}).                &Apache::lontexconvert::msgtexconverted($content{'message'}).
Line 954  $content{'sendername'}.'@'. Line 1207  $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 986  sub facetoface { Line 1240  sub facetoface {
  $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 1003  sub facetoface { Line 1260  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 1026  ENDTREC Line 1283  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 1064  sub examblock { Line 1317  sub examblock {
  $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 1132  sub blockstore { Line 1387  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_(\w+)$/) {
             $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_'.$_};              $blocking{$newkey} = $env{'user.name'}.':'.$env{'user.domain'}.':'.$env{'form.title_'.$key};
         }          }
     }      }
     if ($addtotal + $modtotal > 0) {      if ($addtotal + $modtotal > 0) {
Line 1203  sub get_blockdates { Line 1458  sub get_blockdates {
                          $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'}
                          );                           );
     $$blockcount = keys %{$records};      $$blockcount = keys(%{$records});
                                                                                                                
     foreach (keys %{$records}) {      if ((keys(%{$records}))[0] =~ /^error: 2 /) {
         if ($_ eq 'error: 2 tie(GDBM) Failed while attempting dump') {   $records = {};
             $$blockcount = 0;   $$blockcount = 0;
             last;  
         }  
     }      }
 }  }
   
 sub display_blocker_status {  sub display_blocker_status {
     my ($r,$records,$ltext) = @_;      my ($r,$records,$ltext) = @_;
     my $parmcount = 0;      my $parmcount = 0;
     my @bgcols = ("#eeeeee","#dddddd");    
     my $function = &Apache::loncommon::get_users_function();  
     my $color = &Apache::loncommon::designparm($function.'.tabbg',  
                                                     $env{'user.domain'});  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         'modi' => 'Modify',          'modi' => 'Modify',
         'canc' => 'Cancel',          'canc' => 'Cancel',
     );      );
       $r->print(&Apache::loncommon::start_data_table());
     $r->print(<<"END");      $r->print(<<"END");
 <table border="0" cellpadding="0" cellspacing="0">    <tr>
  <tr>      <th>$$ltext{'dura'}</th>
   <td width="100%" bgcolor="#000000">      <th>$$ltext{'setb'}</th>
    <table width="100%" border="0" cellpadding="1" cellspacing="0">      <th>$$ltext{'even'}</th>
     <tr>      <th>$$ltext{'actn'}?</th>
      <td width="100%" bgcolor="#000000">    </tr>
       <table border="0" cellpadding="3" cellspacing="3" bgcolor="#FFFFFF">  
        <tr bgcolor="$color">  
         <td><b>$$ltext{'dura'}</b></td>  
         <td><b>$$ltext{'setb'}</b></td>  
         <td><b>$$ltext{'even'}</b></td>  
         <td><b>$$ltext{'actn'}?</b></td>  
        </tr>  
 END  END
     foreach (sort keys %{$records}) {      foreach my $record (sort(keys(%{$records}))) {
         my $iter = $parmcount%2;  
         my $onchange = 'onFocus="javascript:window.document.forms['.          my $onchange = 'onFocus="javascript:window.document.forms['.
                        "'blockform'].elements['modify_".$parmcount."'].".                         "'blockform'].elements['modify_".$parmcount."'].".
                        'checked=true;"';                         'checked=true;"';
         my ($start,$end) = split/____/,$_;          my ($start,$end) = split(/____/,$record);
         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 ($setter,$title) = split/:/,$$records{$_};  
         my ($setuname,$setudom) = split/@/,$setter;   my ($setuname,$setudom,$title) = 
       &parse_block_record($$records{$record});
    $title = &HTML::Entities::encode($title,'"<>&');
         my $settername = &Apache::loncommon::plainname($setuname,$setudom);          my $settername = &Apache::loncommon::plainname($setuname,$setudom);
           $r->print(&Apache::loncommon::start_data_table_row());
         $r->print(<<"END");          $r->print(<<"END");
        <tr bgcolor="$bgcols[$iter]">  
         <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="$_" /></td>          <td><input type="text" name="title_$parmcount" size="15" value="$title" /><input type="hidden" name="key_$parmcount" value="$record" /></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>
        </tr>  
 END  END
         $parmcount ++;          $r->print(&Apache::loncommon::end_data_table_row());
           $parmcount++;
     }      }
     $r->print(<<"END");      $r->print(<<"END");
       </table>  
      </td>  
     </tr>  
    </table>  
   </td>  
  </tr>  
 </table>  </table>
 <br />  <br />
 <br />  <br />
Line 1274  END Line 1513  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 1283  sub display_addblocker_table { Line 1535  sub display_addblocker_table {
                    'checked=true;"';                     'checked=true;"';
     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 $function = &Apache::loncommon::get_users_function();  
     my $color = &Apache::loncommon::designparm($function.'.tabbg',  
                                                     $env{'user.domain'});  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         'addb' => 'Add block',          'addb' => 'Add block',
         'exam' => 'e.g., Exam 1',          'exam' => 'e.g., Exam 1',
Line 1293  sub display_addblocker_table { Line 1542  sub display_addblocker_table {
     );      );
     $r->print(<<"END");      $r->print(<<"END");
 <h4>$lt{'addn'}</h4>   <h4>$lt{'addn'}</h4> 
 <table border="0" cellpadding="0" cellspacing="0">  
  <tr>  
   <td width="100%" bgcolor="#000000">  
    <table width="100%" border="0" cellpadding="1" cellspacing="0">  
     <tr>  
      <td width="100%" bgcolor="#000000">  
       <table border="0" cellpadding="3" cellspacing="3" bgcolor="#FFFFFF">  
        <tr bgcolor="#CCCCFF">  
         <td><b>$$ltext{'dura'}</b></td>  
         <td><b>$$ltext{'even'} $lt{'exam'}</b></td>  
         <td><b>$$ltext{'actn'}?</b></td>  
        </tr>  
        <tr bgcolor="#eeeeee">  
         <td>$$ltext{'star'}:&nbsp;$startform<br />$$ltext{'endd'}:&nbsp;&nbsp;$endform</td>  
         <td><input type="text" name="title_$parmcount" size="15" value="" /></td>  
         <td><label>$lt{'addb'}?&nbsp;<input type="checkbox" name="add_$parmcount" value="1" /></label></td>  
        </tr>  
       </table>  
      </td>  
     </tr>  
    </table>  
   </td>  
  </tr>  
 </table>  
 END  END
       $r->print(&Apache::loncommon::start_data_table());
       $r->print(<<"END");
      <tr>
        <th>$$ltext{'dura'}</th>
        <th>$$ltext{'even'} $lt{'exam'}</th>
        <th>$$ltext{'actn'}?</th>
      </tr>
   END
      $r->print(&Apache::loncommon::start_data_table_row());
       $r->print(<<"END");
        <td>$$ltext{'star'}:&nbsp;$startform<br />$$ltext{'endd'}:&nbsp;&nbsp;$endform</td>
        <td><input type="text" name="title_$parmcount" size="15" value="" /></td>
        <td><label>$lt{'addb'}?&nbsp;<input type="checkbox" name="add_$parmcount" value="1" /></label></td>
   END
       $r->print(&Apache::loncommon::end_data_table_row());
       $r->print(&Apache::loncommon::end_data_table());
     return;      return;
 }  }
   
 sub blockcheck {  sub blockcheck {
     my ($setters,$startblock,$endblock) = @_;      my ($setters,$startblock,$endblock) = @_;
     # Retrieve active student roles and active course coordinator/instructor roles      # Retrieve active student roles and active course coordinator/instructor roles
     my @livecses = ();      my %live_courses =
     my @staffcses = ();   map { $_ => 1} &Apache::loncommon::findallcourses();
     $$startblock = 0;      # FIXME should really probe for apriv, but ::allowed can only probe the 
     $$endblock = 0;      #       currently active role
     foreach (keys %env) {      my %staff_of =
         if ($_ =~ m-^user\.role\.(st|cc|in)\./(.+)$-) {   map { $_ => 1} &Apache::loncommon::findallcourses(['cc','in']);
             my $role = $1;  
             my $cse = $2;      # Retrieve blocking times and identity of blocker for active courses
             $cse =~ s|/|_|;      # for students.
             if ($env{$_} =~ m/^(\d*)\.(\d*)$/) {      return if (!%live_courses);
                 unless (($2 > 0 && $2 < time) || ($1 > time)) {  
                     if ($role eq 'st') {      foreach my $course (keys(%live_courses)) {
                         push @livecses, $cse;   my $cdom = $env{'course.'.$course.'.domain'};
                     } else {   my $cnum = $env{'course.'.$course.'.num'};
                         unless (grep/^$cse$/,@staffcses) {  
                             push @staffcses, $cse;   # 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} = {};
         } elsif ($_ =~ m-user\.role\.cr/(\w+)/(\w+)/([^/]+)\./(.+)$- ) {    $setters->{$course}{'staff'} = [];
             my $rolepriv = $env{'user.role..rolesdef_'.$3};   $setters->{$course}{'times'} = [];
         }   my %records = &Apache::lonnet::dump('comm_block',$cdom,$cnum);
     }   foreach my $record (keys(%records)) {
     # Retrieve blocking times and identity of blocker for active courses for students.      my ($start,$end) = ($record =~ m/^(\d+)____(\d+)$/);
     if (@livecses > 0) {      if ($start <= time && $end >= time) {
         foreach my $cse (@livecses) {   my ($staff_name,$staff_dom,$title) = 
             my ($cdom,$crs) = split/_/,$cse;      &parse_block_record($records{$record});
             if ( (grep/^$cse$/,@staffcses) && ($env{'request.role'} !~ m-^st\./$cdom/$crs$-) ) {   push(@{$$setters{$course}{'staff'}}, [$staff_name,$staff_dom]);
                 next;   push(@{$$setters{$course}{'times'}}, [$start,$end]);
             } else {   if ( ($$startblock == 0) || ($$startblock > $1) ) {
                 %{$$setters{$cse}} = ();      $$startblock = $1;
                 @{$$setters{$cse}{'staff'}} = ();   }
                 @{$$setters{$cse}{'times'}} = ();   if ( ($$endblock == 0) || ($$endblock < $2) ) {
                 my %records = &Apache::lonnet::dump('comm_block',$cdom,$crs);      $$endblock = $2;
                 foreach (keys %records) {   }
                     if ($_ =~ m/^(\d+)____(\d+)$/) {      }
                         if ($1 <= time && $2 >= time) {   }
                             my ($staff,$title) = split/:/,$records{$_};  
                             push @{$$setters{$cse}{'staff'}}, $staff;  
                             push @{$$setters{$cse}{'times'}}, $_;  
                             if ( ($$startblock == 0) || ($$startblock > $1) ) {  
                                 $$startblock = $1;  
                             }  
                             if ( ($$endblock == 0) || ($$endblock < $2) ) {  
                                 $$endblock = $2;  
                             }  
                         }  
                     }  
                 }  
             }  
         }  
     }      }
 }  }
   
 sub build_block_table {  sub build_block_table {
     my ($r,$startblock,$endblock,$setters) = @_;      my ($r,$startblock,$endblock,$setters) = @_;
     my $function = &Apache::loncommon::get_users_function();  
     my $color = &Apache::loncommon::designparm($function.'.tabbg',  
                                                     $env{'user.domain'});  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         'cacb' => 'Currently active communication blocks',          'cacb' => 'Currently active communication blocks',
         'cour' => 'Course',          'cour' => 'Course/Group',
         'dura' => 'Duration',          'dura' => 'Duration',
         'blse' => 'Block set by'          'blse' => 'Block set by'
     );       );
     $r->print(<<"END");      $r->print(<<"END");
 <br /<br />$lt{'cacb'}:<br /><br />  <br /><br />$lt{'cacb'}:<br /><br />
 <table border="0" cellpadding="0" cellspacing="0">  
  <tr>  
   <td width="100%" bgcolor="#000000">  
    <table width="100%" border="0" cellpadding="1" cellspacing="0">  
     <tr>  
      <td width="100%" bgcolor="#000000">  
       <table border="0" cellpadding="3" cellspacing="3" bgcolor="#FFFFFF">  
        <tr bgcolor="$color">  
         <td><b>$lt{'cour'}</b></td>  
         <td><b>$lt{'dura'}</b></td>  
         <td><b>$lt{'blse'}</b></td>  
        </tr>  
 END  END
     foreach (keys %{$setters}) {      $r->print(&Apache::loncommon::start_data_table());
         my %courseinfo=&Apache::lonnet::coursedescription($_);      $r->print(<<"END");
         for (my $i=0; $i<@{$$setters{$_}{staff}}; $i++) {  <tr>
             my ($uname,$udom) = split/\@/,$$setters{$_}{staff}[$i];   <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 $fullname = &Apache::loncommon::plainname($uname,$udom);
             my ($openblock,$closeblock) = split/____/,$$setters{$_}{times}[$i];              my ($openblock,$closeblock) = @{$$setters{$course}{times}[$i]};
             $openblock = &Apache::lonlocal::locallocaltime($openblock);              $openblock = &Apache::lonlocal::locallocaltime($openblock);
             $closeblock= &Apache::lonlocal::locallocaltime($closeblock);              $closeblock= &Apache::lonlocal::locallocaltime($closeblock);
             $r->print('<tr><td>'.$courseinfo{'description'}.'</td>'.              $r->print(&Apache::loncommon::start_data_table_row().
         '<td>'.$courseinfo{'description'}.'</td>'.
                       '<td>'.$openblock.' to '.$closeblock.'</td>'.                        '<td>'.$openblock.' to '.$closeblock.'</td>'.
                       '<td>'.$fullname.' ('.$uname.'@'.$udom.                        '<td>'.$fullname.' ('.$uname.':'.$udom.
                       ')</td></tr>');                        ')</td>'.
          &Apache::loncommon::end_data_table_row());
         }          }
     }      }
     $r->print('</table></td></tr></table></td></tr></table>');      $r->print(&Apache::loncommon::end_data_table());
 }  }
   
 # ----------------------------------------------------------- Display a message  # ----------------------------------------------------------- Display a message
Line 1432  sub displaymessage { Line 1654  sub displaymessage {
     my $startblock = 0;      my $startblock = 0;
     my $endblock = 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);      &blockcheck(\%setters,\$startblock,\$endblock);
     my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder);      my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder);
Line 1447  sub displaymessage { Line 1671  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 1457  sub displaymessage { Line 1681  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 1513  sub displaymessage { Line 1737  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 1566  sub header { Line 1790  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
       (undef,($title?$title:'Communication and Messages')));        (($title?$title:'Communication and Messages')));
   
 }  }
   
 # ---------------------------------------------------------------- Print header  # ---------------------------------------------------------------- Print header
Line 1591  sub storecomment { Line 1814  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 1628  sub sendoffmail { Line 1851  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 1647  sub sendoffmail { Line 1882  sub sendoffmail {
     %content=&Apache::lonmsg::unpackagemsg($message{$msgid},1);      %content=&Apache::lonmsg::unpackagemsg($message{$msgid},1);
     &statuschange($msgid,'replied',$folder);      &statuschange($msgid,'replied',$folder);
  }   }
  my %toaddr=();  
  undef %toaddr;   my @to =
  if ($env{'form.sendmode'} eq 'group') {      &Apache::loncommon::get_env_multiple('form.selectedusers_forminput');
     foreach (keys %env) {   my $mode = $env{'form.sendmode'};
  if ($_=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {  
     $toaddr{$1}='';   my %toaddr;
    if (@to) {
       foreach my $dest (@to) {
    my ($user,$domain) = split(/:/, $dest);
    if (($user ne '') && ($domain ne '')) {
       my $address = $user.":".$domain; # How the code below expects it.
       $toaddr{$address} = '';
  }   }
     }      }
    }
   
    if ($env{'form.sendmode'} eq 'group') {
        foreach my $address (keys(%env)) {
    if ($address=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {
       $toaddr{$1}='';
    }
       }
  } elsif ($env{'form.sendmode'} eq 'upload') {   } elsif ($env{'form.sendmode'} eq 'upload') {
     foreach (split(/[\n\r\f]+/,$env{'form.upfile'})) {      foreach my $line (split(/[\n\r\f]+/,$env{'form.upfile'})) {
  my ($rec,$txt)=split(/\s*\:\s*/,$_);   my ($rec,$txt)=split(/\s*\:\s*/,$line);
  if ($txt) {   if ($txt) {
     $rec=~s/\@/\:/;      $rec=~s/\@/\:/;
     $toaddr{$rec}.=$txt."\n";      $toaddr{$rec}.=$txt."\n";
  }   }
     }      }
  } else {   } else {
     $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';      if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) {
    $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
       }
  }   }
  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);
  $toaddr{$auname.':'.$audom}='';   if (($auname ne "") && ($audom ne "")) {
       $toaddr{$auname.':'.$audom}='';
    }
     }      }
  }   }
   
Line 1689  sub sendoffmail { Line 1942  sub sendoffmail {
             $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});              $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});
         }          }
   
  foreach (keys %toaddr) {   foreach my $address (sort(keys(%toaddr))) {
     my ($recuname,$recdomain)=split(/\:/,$_);      my ($recuname,$recdomain)=split(/\:/,$address);
             my $msgtxt = $savemsg;              my $msgtxt = $savemsg;
     if ($toaddr{$_}) { $msgtxt.='<hr />'.$toaddr{$_}; }      if ($toaddr{$address}) { $msgtxt.='<hr />'.$toaddr{$address}; }
     my $thismsg;      my @thismsg;
     if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) &&       if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) && 
  (&Apache::lonnet::allowed('srm',$env{'request.course.id'})   (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
  || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.   || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
      '/'.$env{'request.course.sec'}))) {       '/'.$env{'request.course.sec'}))) {
  $r->print(&mt('Sending critical message').' '.$recuname.'@'.$recdomain.': ');   $r->print(&mt('Sending critical message').' '.$recuname.':'.$recdomain.': ');
  $thismsg=&Apache::lonmsg::user_crit_msg($recuname,$recdomain,$msgsubj,$msgtxt,   @thismsg=
  $env{'form.sendbck'},$env{'form.permanent'},      &Apache::lonmsg::user_crit_msg($recuname,$recdomain,
                                                              \$sentmessage{$_});     $msgsubj,$msgtxt,
      $env{'form.sendbck'},
      $env{'form.permanent'},
      \$sentmessage{$address});
     } else {      } else {
  $r->print(&mt('Sending').' '.$recuname.'@'.$recdomain.': ');   $r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');
  $thismsg=&Apache::lonmsg::user_normal_msg($recuname,$recdomain,$msgsubj,$msgtxt,   @thismsg=
   $content{'citation'},undef,undef,$env{'form.permanent'},\$sentmessage{$_});      &Apache::lonmsg::user_normal_msg($recuname,$recdomain,
        $msgsubj,$msgtxt,
        $content{'citation'},
        undef,undef,
        $env{'form.permanent'},
        \$sentmessage{$address});
             }              }
     if (($env{'request.course.id'}) && (($msgtype eq 'critical') ||       if (($env{'request.course.id'}) && (($msgtype eq 'critical') || 
                                          ($env{'form.sendmode'} eq 'group'))) {                                           ($env{'form.sendmode'} eq 'group'))) {
         $specialmsg_status{$recuname.':'.$recdomain}  = $thismsg;          $specialmsg_status{$recuname.':'.$recdomain} =
                 if ($thismsg eq 'ok') {      join(' ',@thismsg);
                     $numspecial ++;   foreach my $result (@thismsg) {
                 }      if ($result eq 'ok') {
    $numspecial++;
       }
    }
     }      }
     $r->print($thismsg.'<br />');      $sendstatus.=' '.join(' ',@thismsg);
     $sendstatus.=' '.$thismsg;  
  }   }
         if (($env{'request.course.id'}) && (($env{'form.sendmode'} eq 'group')          if (($env{'request.course.id'}) && (($env{'form.sendmode'} eq 'group')
                                               || ($msgtype eq 'critical'))) {                                                || ($msgtype eq 'critical'))) {
Line 1726  sub sendoffmail { Line 1989  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') {
                         my $usersubj = $subj_prefix.'['.$recipient.']';                          my $usersubj = $subj_prefix.'['.$recipient.']';
Line 1753  sub sendoffmail { Line 2015  sub sendoffmail {
                         &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,$subj_prefix.                          &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,$subj_prefix.
                                              ' ['.$recipient.']',$msgsubj,undef,                                               ' ['.$recipient.']',$msgsubj,undef,
                         undef,undef,undef,$usermsgid,undef,undef,$specialmsgid);                          undef,undef,undef,$usermsgid,undef,undef,$specialmsgid);
                         my ($uname,$udom) = split/:/,$recipient;                          my ($uname,$udom) = split(/:/,$recipient);
                         push(@recusers,$uname);                          push(@recusers,$uname);
                         push(@recudoms,$udom);                          push(@recudoms,$udom);
                     }                      }
                 }                  }
                 if (@recusers) {                  if (@recusers) {
                     my $specialmessage;                      my $specialmessage;
                     my $sentsubj = $subj_prefix.' ('.$numspecial.' sent) '.                      my $sentsubj = 
                                                                        $msgsubj;   $subj_prefix.' ('.$numspecial.' sent) '.$msgsubj;
                     $sentsubj = &HTML::Entities::encode($sentsubj,'<>&"');                      $sentsubj = &HTML::Entities::encode($sentsubj,'<>&"');
                     my $sentmsgid =                       my $sentmsgid = 
  &Apache::lonmsg::buildmsgid($stamp,$sentsubj,$msgname,   &Apache::lonmsg::buildmsgid($stamp,$sentsubj,$msgname,
Line 1782  sub sendoffmail { Line 2044  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);
  }   }
     } else {      } else {
  $r->print('<p><span class="LC_error">'.&mt('Could not deliver message').'</span> '.   $r->print('<p><span class="LC_error">'.&mt('Could not deliver message').'</span> '.
   &mt('Please use the browser "Back" button and correct the recipient addresses').'</p>');    &mt('Please use the browser "Back" button and correct the recipient addresses '."($sendstatus)").'</p>');
     }      }
 }  }
   
Line 1808  sub handler { Line 2073  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']);   '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 1830  sub handler { Line 2095  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 1838  sub handler { Line 2103  sub handler {
     unless ($dismode) {       unless ($dismode) { 
  $dismode='';    $dismode=''; 
     } else {      } else {
  $sqs.='&dismode='.&Apache::lonnet::escape($dismode);   $sqs.='&dismode='.&escape($dismode);
     }      }
   
 # --------------------------------------------------------------------- Display  # --------------------------------------------------------------------- Display
Line 1874  sub handler { Line 2139  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 1894  sub handler { Line 2163  sub handler {
  &compout($r,$env{'form.forward'},undef,undef,undef,$folder);   &compout($r,$env{'form.forward'},undef,undef,undef,$folder);
     } elsif ($env{'form.markdel'}) {      } elsif ($env{'form.markdel'}) {
  &printheader($r,'','Deleted Message');   &printheader($r,'','Deleted Message');
  &statuschange($env{'form.markdel'},'deleted',$folder);   my ($result,$msg) = 
       &statuschange($env{'form.markdel'},'deleted',$folder);
    if (!$result) {
       $r->print('<p class="LC_error">'.
         &mt('Failed to delete the message.').'</p>'.
         '<p class="LC_error">'.$msg."</p>\n");
    }
  &Apache::loncommunicate::menu($r);   &Apache::loncommunicate::menu($r);
  &disall($r,($folder?$folder:$dismode));   &disall($r,($folder?$folder:$dismode));
     } elsif ($env{'form.markedmove'}) {      } elsif ($env{'form.markedmove'}) {
  my $total=0;   my ($total,$failed,@failed_msg)=(0,0);
  foreach (keys %env) {   foreach my $key (keys(%env)) {
     if ($_=~/^form\.delmark_(.*)$/) {      if ($key=~/^form\.delmark_(.*)$/) {
  &movemsg(&Apache::lonnet::unescape($1),$folder,   my ($result,$msg) =
  $env{'form.movetofolder'});      &movemsg(&unescape($1),$folder,
  $total++;       $env{'form.movetofolder'});
    if ($result) {
       $total++;
    } else {
       $failed++;
       push(@failed_msg,$msg);
    }
     }      }
  }   }
  &printheader($r,'','Moved Messages');   &printheader($r,'','Moved Messages');
  $r->print('Moved '.$total.' message(s)<p>');   if ($failed) {
       $r->print('<p class="LC_error">
                             '.&mt('Failed to move [_1] message(s)',$failed).
         '</p>');
       $r->print('<p class="LC_error">'.
         join("</p>\n<p class=\"LC_error\">",@failed_msg).
         "</p>\n");
    }
    $r->print(&mt('Moved [_1] message(s)',$total).'<p>');
  &Apache::loncommunicate::menu($r);   &Apache::loncommunicate::menu($r);
  &disall($r,($folder?$folder:$dismode));   &disall($r,($folder?$folder:$dismode));
     } elsif ($env{'form.markeddel'}) {      } elsif ($env{'form.markeddel'}) {
  my $total=0;   my ($total,$failed,@failed_msg)=(0,0);
  foreach (keys %env) {   foreach my $key (keys(%env)) {
     if ($_=~/^form\.delmark_(.*)$/) {      if ($key=~/^form\.delmark_(.*)$/) {
  &statuschange(&Apache::lonnet::unescape($1),'deleted',$folder);   my ($result,$msg) = 
  $total++;      &statuschange(&unescape($1),'deleted',
     $folder);
    if ($result) {
       $total++;
    } else {
       $failed++;
       push(@failed_msg,$msg);
    }
     }      }
  }   }
  &printheader($r,'','Deleted Messages');   &printheader($r,'','Deleted Messages');
  $r->print('Deleted '.$total.' message(s)<p>');   if ($failed) {
       $r->print('<p class="LC_error">
                             '.&mt('Failed to delete [_1] message(s)',$failed).
         '</p>');
       $r->print('<p class="LC_error">'.
         join("</p>\n<p class=\"LC_error\">",@failed_msg).
         "</p>\n");
    }
    $r->print(&mt('Deleted [_1] message(s)',$total).'<p>');
  &Apache::loncommunicate::menu($r);   &Apache::loncommunicate::menu($r);
  &disall($r,($folder?$folder:$dismode));   &disall($r,($folder?$folder:$dismode));
     } elsif ($env{'form.markunread'}) {      } elsif ($env{'form.markunread'}) {
Line 1937  sub handler { Line 2241  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'});   &makefolder($env{'form.newfolder'});
Line 1973  sub handler { Line 2279  sub handler {
   
 __END__  __END__
   
   
   
   
   
   
   

Removed from v.1.7  
changed lines
  Added in v.1.42


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