Diff for /loncom/interface/lonmsg.pm between versions 1.109 and 1.133

version 1.109, 2004/09/28 14:12:40 version 1.133, 2005/02/02 21:35:16
Line 90  also has a student role in the course, A Line 90  also has a student role in the course, A
   
 Users can ask LON-CAPA to forward messages to conventional e-mail  Users can ask LON-CAPA to forward messages to conventional e-mail
 addresses on their B<PREF> screen, but generally, LON-CAPA messages  addresses on their B<PREF> screen, but generally, LON-CAPA messages
 are much more useful then traditional email can be made to be, even  are much more useful than traditional email can be made to be, even
 with HTML support.  with HTML support.
   
 Right now, this document will cover just how to send a message, since  Right now, this document will cover just how to send a message, since
Line 239  sub sendemail { Line 239  sub sendemail {
 # ==================================================== Send notification emails  # ==================================================== Send notification emails
   
 sub sendnotification {  sub sendnotification {
     my ($to,$touname,$toudom,$subj,$crit)=@_;      my ($to,$touname,$toudom,$subj,$crit,$text)=@_;
     my $sender=$ENV{'environment.firstname'}.' '.$ENV{'environment.lastname'};      my $sender=$ENV{'environment.firstname'}.' '.$ENV{'environment.lastname'};
       unless ($sender=~/\w/) { 
    $sender=$ENV{'user.name'}.'@'.$ENV{'user.domain'};
       }
     my $critical=($crit?' critical':'');      my $critical=($crit?' critical':'');
       $text=~s/\&lt\;/\</gs;
       $text=~s/\&gt\;/\>/gs;
       $text=~s/\<\/*[^\>]+\>//gs;
     my $url='http://'.      my $url='http://'.
       $Apache::lonnet::hostname{&Apache::lonnet::homeserver($touname,$toudom)}.        $Apache::lonnet::hostname{&Apache::lonnet::homeserver($touname,$toudom)}.
       '/adm/email?username='.$touname.'&domain='.$toudom;        '/adm/email?username='.$touname.'&domain='.$toudom;
Line 250  You received a$critical message from $se Line 256  You received a$critical message from $se
   
  $subj   $subj
   
   === Excerpt ============================================================
   $text
   ========================================================================
   
 Use  Use
   
  $url   $url
   
 to access this message.  to access the full message.
 ENDMSG  ENDMSG
     &sendemail($to,'New'.$critical.' message from '.$sender,$body);      &sendemail($to,'New'.$critical.' message from '.$sender,$body);
 }  }
Line 346  sub all_url_author_res_msg { Line 356  sub all_url_author_res_msg {
 # ================================================== Critical message to a user  # ================================================== Critical message to a user
   
 sub user_crit_msg_raw {  sub user_crit_msg_raw {
     my ($user,$domain,$subject,$message,$sendback)=@_;      my ($user,$domain,$subject,$message,$sendback,$toperm)=@_;
 # Check if allowed missing  # Check if allowed missing
     my $status='';      my $status='';
     my $msgid='undefined';      my $msgid='undefined';
     unless (($message)&&($user)&&($domain)) { $status='empty'; };      unless (($message)&&($user)&&($domain)) { $status='empty'; };
       my $text=$message;
     my $homeserver=&Apache::lonnet::homeserver($user,$domain);      my $homeserver=&Apache::lonnet::homeserver($user,$domain);
     if ($homeserver ne 'no_host') {      if ($homeserver ne 'no_host') {
        ($msgid,$message)=&packagemsg($subject,$message);         ($msgid,$message)=&packagemsg($subject,$message);
Line 370  sub user_crit_msg_raw { Line 381  sub user_crit_msg_raw {
        $status='no_host';         $status='no_host';
     }      }
 # Notifications  # Notifications
     my %userenv = &Apache::lonnet::get('environment',['critnotification'],      my %userenv = &Apache::lonnet::get('environment',['critnotification',
                                                         'permanentemail'],
                                        $domain,$user);                                         $domain,$user);
     if ($userenv{'critnotification'}) {      if ($userenv{'critnotification'}) {
       &sendnotification($userenv{'critnotification'},$user,$domain,$subject,1);        &sendnotification($userenv{'critnotification'},$user,$domain,$subject,1,
    $text);
       }
       if ($toperm && $userenv{'permanentemail'}) {
         &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,1,
    $text);
     }      }
 # Log this  # Log this
     &Apache::lonnet::logthis(      &Apache::lonnet::logthis(
Line 397  sub user_crit_msg_raw { Line 414  sub user_crit_msg_raw {
 =cut  =cut
   
 sub user_crit_msg {  sub user_crit_msg {
     my ($user,$domain,$subject,$message,$sendback)=@_;      my ($user,$domain,$subject,$message,$sendback,$toperm)=@_;
     my $status='';      my $status='';
     my %userenv = &Apache::lonnet::get('environment',['msgforward'],      my %userenv = &Apache::lonnet::get('environment',['msgforward'],
                                        $domain,$user);                                         $domain,$user);
Line 407  sub user_crit_msg { Line 424  sub user_crit_msg {
  my ($forwuser,$forwdomain)=split(/\:/,$_);   my ($forwuser,$forwdomain)=split(/\:/,$_);
          $status.=           $status.=
    &user_crit_msg_raw($forwuser,$forwdomain,$subject,$message,     &user_crit_msg_raw($forwuser,$forwdomain,$subject,$message,
                 $sendback).' ';                  $sendback,$toperm).' ';
        }         }
     } else {       } else { 
  $status=&user_crit_msg_raw($user,$domain,$subject,$message,$sendback);   $status=&user_crit_msg_raw($user,$domain,$subject,$message,$sendback,$toperm);
     }      }
     return $status;      return $status;
 }  }
Line 444  sub user_crit_received { Line 461  sub user_crit_received {
 # ======================================================== Normal communication  # ======================================================== Normal communication
   
 sub user_normal_msg_raw {  sub user_normal_msg_raw {
     my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl)=@_;      my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,
    $toperm)=@_;
 # Check if allowed missing  # Check if allowed missing
     my $status='';      my $status='';
     my $msgid='undefined';      my $msgid='undefined';
       my $text=$message;
     unless (($message)&&($user)&&($domain)) { $status='empty'; };      unless (($message)&&($user)&&($domain)) { $status='empty'; };
     my $homeserver=&Apache::lonnet::homeserver($user,$domain);      my $homeserver=&Apache::lonnet::homeserver($user,$domain);
     if ($homeserver ne 'no_host') {      if ($homeserver ne 'no_host') {
Line 471  sub user_normal_msg_raw { Line 490  sub user_normal_msg_raw {
        $status='no_host';         $status='no_host';
     }      }
 # Notifications  # Notifications
     my %userenv = &Apache::lonnet::get('environment',['notification'],      my %userenv = &Apache::lonnet::get('environment',['notification',
                                                         'permanentemail'],
                                        $domain,$user);                                         $domain,$user);
     if ($userenv{'notification'}) {      if ($userenv{'notification'}) {
  &sendnotification($userenv{'notification'},$user,$domain,$subject,0);   &sendnotification($userenv{'notification'},$user,$domain,$subject,0,
     $text);
       }
       if ($toperm && $userenv{'permanentemail'}) {
         &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,0,
    $text);
     }      }
     &Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'},      &Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'},
                          $ENV{'user.home'},                           $ENV{'user.home'},
Line 493  sub user_normal_msg_raw { Line 518  sub user_normal_msg_raw {
 =cut  =cut
   
 sub user_normal_msg {  sub user_normal_msg {
     my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl)=@_;      my ($user,$domain,$subject,$message,$citation,$baseurl,$attachmenturl,
    $toperm)=@_;
     my $status='';      my $status='';
     my %userenv = &Apache::lonnet::get('environment',['msgforward'],      my %userenv = &Apache::lonnet::get('environment',['msgforward'],
                                        $domain,$user);                                         $domain,$user);
Line 503  sub user_normal_msg { Line 529  sub user_normal_msg {
  my ($forwuser,$forwdomain)=split(/\:/,$_);   my ($forwuser,$forwdomain)=split(/\:/,$_);
          $status.=           $status.=
   &user_normal_msg_raw($forwuser,$forwdomain,$subject,$message,    &user_normal_msg_raw($forwuser,$forwdomain,$subject,$message,
        $citation,$baseurl,$attachmenturl).' ';         $citation,$baseurl,$attachmenturl,$toperm).' ';
        }         }
     } else {       } else { 
  $status=&user_normal_msg_raw($user,$domain,$subject,$message,   $status=&user_normal_msg_raw($user,$domain,$subject,$message,
      $citation,$baseurl,$attachmenturl);       $citation,$baseurl,$attachmenturl,$toperm);
     }      }
     return $status;      return $status;
 }  }
Line 523  sub folderlist { Line 549  sub folderlist {
  &mt('Folder').': '.   &mt('Folder').': '.
  &Apache::loncommon::select_form($folder,'folder',   &Apache::loncommon::select_form($folder,'folder',
      ('' => &mt('INBOX'),'trash' => &mt('TRASH'),       ('' => &mt('INBOX'),'trash' => &mt('TRASH'),
         'new' => &mt('New Messages Only'),
                                 'critical' => &mt('Critical'),
       'sent' => &mt('Sent Messages'),        'sent' => &mt('Sent Messages'),
       map { $_ => $_ } @allfolders)).        map { $_ => $_ } @allfolders)).
       ' '.&mt('Show').' '.        ' '.&mt('Show').
     &Apache::loncommon::select_form($interdis,'interdis',        '<select name="interdis">'.
 (' 10' => '10', ' 20' => '20', ' 50' => '50', '100' => '100', '200' => '200')).        join("\n",map { '<option value="'.$_.'"'.
    ($_==$interdis?' selected="selected"':'').'>'.$_.'</option>' }
      (10,20,50,100,200)).'</select>'.
    '<input type="submit" value="'.&mt('View Folder').'" /><br />'.     '<input type="submit" value="'.&mt('View Folder').'" /><br />'.
       '<input type="hidden" name="sortedby" value="'.$ENV{'form.sortedby'}.'" />'.
         ($folder=~/^(new|critical)/?'</form>':'');
   }
   
   sub scrollbuttons {
       my ($start,$maxdis,$first,$finish,$total)=@_;
       unless ($total>0) { return ''; }
       $start++; $maxdis++;$first++;$finish++;
       return 
    '<input type="submit" name="firstview" value="'.&mt('First').'" />'.     '<input type="submit" name="firstview" value="'.&mt('First').'" />'.
    '<input type="submit" name="prevview" value="'.&mt('Previous').'" />'.     '<input type="submit" name="prevview" value="'.&mt('Previous').'" />'.
    '<input type="text" size="5" name="startdis" value="'.$startdis.'" />'.     '<input type="text" size="5" name="startdis" value="'.$start.'" onChange="this.form.submit()" /> of '.$maxdis.
    '<input type="submit" name="nextview" value="'.&mt('Next').'" />'.     '<input type="submit" name="nextview" value="'.&mt('Next').'" />'.
    '<input type="submit" name="lastview" value="'.&mt('Last').'" />'.     '<input type="submit" name="lastview" value="'.&mt('Last').'" /><br />'.
  '<a href="/adm/email?critical=display'.$sqs.'">'.     &mt('Messages [_1] through [_2] of [_3]',$first,$finish,$total).'</form>';
     &mt('View Critical Messages').'</a>'.  
     '</form>';  
 }  }
   
 # =============================================================== Folder suffix  # =============================================================== Folder suffix
Line 568  sub statuschange { Line 605  sub statuschange {
   
 sub makefolder {  sub makefolder {
     my ($newfolder)=@_;      my ($newfolder)=@_;
       if (($newfolder eq 'sent')
        || ($newfolder eq 'critical')
        || ($newfolder eq 'trash')
        || ($newfolder eq 'new')) { return; }
     &Apache::lonnet::put('email_folders',{$newfolder => time});      &Apache::lonnet::put('email_folders',{$newfolder => time});
 }  }
   
Line 575  sub makefolder { Line 616  sub makefolder {
   
 sub movemsg {  sub movemsg {
     my ($msgid,$srcfolder,$trgfolder)=@_;      my ($msgid,$srcfolder,$trgfolder)=@_;
     my $unmsgid=&Apache::lonnet::unescape($msgid);  
     my $srcsuffix=&foldersuffix($srcfolder);      my $srcsuffix=&foldersuffix($srcfolder);
     my $trgsuffix=&foldersuffix($trgfolder);      my $trgsuffix=&foldersuffix($trgfolder);
   
Line 584  sub movemsg { Line 624  sub movemsg {
     &Apache::lonnet::put('nohist_email'.$trgsuffix,{$msgid => $message{$msgid}});      &Apache::lonnet::put('nohist_email'.$trgsuffix,{$msgid => $message{$msgid}});
   
 # Copy status  # Copy status
     my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$unmsgid]);      unless ($trgfolder eq 'trash') {
     &Apache::lonnet::put('email_status'.$trgsuffix,{$unmsgid => $status{$unmsgid}});   my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$msgid]);
 # See if was deleted -> becomes "read" in trash   &Apache::lonnet::put('email_status'.$trgsuffix,{$msgid => $status{$msgid}});
     my $currentstatus=(&unpackmsgid($status{$unmsgid}),$srcfolder);  
     if ($currentstatus eq 'deleted') {  
  &statuschange($msgid,'read',$trgfolder);  
     }      }
 # Delete orginals  # Delete orginals
     &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);      &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);
     &Apache::lonnet::del('email_status'.$srcsuffix,[$unmsgid]);      &Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]);
 }  }
   
 # ======================================================= Display a course list  # ======================================================= Display a course list
Line 655  ENDDISHEADER Line 692  ENDDISHEADER
                       '<td>('.$_.'),</td><td><i>'.$role.'</i></td></tr>');                        '<td>('.$_.'),</td><td><i>'.$role.'</i></td></tr>');
         }          }
     }      }
     $r->print('</table><p><table>');      $r->print('</table><table>');
     while (my ($student,$info) = each(%$classlist)) {      while (my ($student,$info) = each(%$classlist)) {
         my ($sname,$sdom,$status,$fullname,$section) =          my ($sname,$sdom,$status,$fullname,$section) =
             (@{$info}[&Apache::loncoursedata::CL_SNAME(),              (@{$info}[&Apache::loncoursedata::CL_SNAME(),
Line 663  ENDDISHEADER Line 700  ENDDISHEADER
                       &Apache::loncoursedata::CL_STATUS(),                        &Apache::loncoursedata::CL_STATUS(),
                       &Apache::loncoursedata::CL_FULLNAME(),                        &Apache::loncoursedata::CL_FULLNAME(),
                       &Apache::loncoursedata::CL_SECTION()]);                        &Apache::loncoursedata::CL_SECTION()]);
         # next if ($status ne 'Active');          next if ($status ne 'Active');
         my $key = 'send_to_&&&'.$section.'&&&'.$student;          my $key = 'send_to_&&&'.$section.'&&&_'.$student;
         if (! defined($fullname) || $fullname eq '') { $fullname = $sname; }          if (! defined($fullname) || $fullname eq '') { $fullname = $sname; }
         $r->print('<tr><td><label>'.          $r->print('<tr><td><label>'.
                   qq{<input type="checkbox" name="$key">}.('&nbsp;'x2).                    qq{<input type="checkbox" name="$key">}.('&nbsp;'x2).
                   $fullname.'</td><td>'.$sname.'@'.$sdom.'</td><td>'.$section.                    $fullname.'</td><td>'.$sname.'@'.$sdom.'</td><td>'.$section.
                   '</td></tr>');                    '</td></tr>');
     }      }
     $r->print('</table></p>');      $r->print('</table>');
 }  }
   
 # ==================================================== Display Critical Message  # ==================================================== Display Critical Message
Line 686  sub discrit { Line 723  sub discrit {
     foreach (sort keys %what) {      foreach (sort keys %what) {
         my %content=&unpackagemsg($what{$_});          my %content=&unpackagemsg($what{$_});
         next if ($content{'senderdomain'} eq '');          next if ($content{'senderdomain'} eq '');
         $content{'message'}=~s/\n/\<br\>/g;  
         $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 /><blockquote>'.              '<br /><pre>'.
               &Apache::lontexconvert::msgtexconverted($content{'message'}).                &Apache::lontexconvert::msgtexconverted($content{'message'}).
             '</blockquote><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_'.$_.'" value="'.&mt('Confirm Receipt').'">'.
Line 770  sub sortedmessages { Line 806  sub sortedmessages {
     return @temp;      return @temp;
 }  }
   
   # ======================================================== Display new messages
   
   
   sub disnew {
       my $r=shift;
       my %lt=&Apache::lonlocal::texthash(
          'nm' => 'New Messages',
          'su' => 'Subject',
          'da' => 'Date',
          'us' => 'Username',
          'op' => 'Open',
          'do' => 'Domain'
          );
       my @msgids = sort split(/\&/,&Apache::lonnet::reply
                               ('keys:'.$ENV{'user.domain'}.':'.
                                $ENV{'user.name'}.':nohist_email',
                                $ENV{'user.home'}));
       my @newmsgs;
       my %setters = ();
       my $startblock = 0;
       my $endblock = 0;
       my %blocked = ();
       my $numblocked = 0;
       # Check for blocking of display because of scheduled online exams.
       &blockcheck(\%setters,\$startblock,\$endblock);
       foreach (@msgids) {
           my ($sendtime,$shortsubj,$fromname,$fromdom,$status)=
       &Apache::lonmsg::unpackmsgid($_);
           if (defined($sendtime) && $sendtime!~/error/) {
               my $numsendtime = $sendtime;
               $sendtime = &Apache::lonlocal::locallocaltime($sendtime);
               if ($status eq 'new') {
                   if ($numsendtime >= $startblock && ($numsendtime <= $endblock && $endblock > 0) ) {
                       $blocked{$_} = 'ON';
                       $numblocked ++;
                   } else {
                       push @newmsgs, { 
                           msgid    => $_,
                           sendtime => $sendtime,
                           shortsub => &Apache::lonnet::unescape($shortsubj),
                           from     => $fromname,
                           fromdom  => $fromdom 
                           }
                   }
               }
           }
       }
       if ($#newmsgs >= 0) {
           $r->print(<<TABLEHEAD);
   <h2>$lt{'nm'}</h2>
   <table border=2><tr><th>&nbsp</th>
   <th>$lt{'da'}</th><th>$lt{'us'}</th><th>$lt{'do'}</th><th>$lt{'su'}</th></tr>
   TABLEHEAD
           foreach my $msg (@newmsgs) {
               $r->print(<<"ENDLINK");
   <tr bgcolor="#FFBB77">
   <td><a href="/adm/email?dismode=new&display=$msg->{'msgid'}">$lt{'op'}</a></td>
   ENDLINK
               foreach ('sendtime','from','fromdom','shortsub') {
                   $r->print("<td>$msg->{$_}</td>");
               }
               $r->print("</td></tr>");
           }
           $r->print('</table></body></html>');
       } elsif ($numblocked == 0) {
           $r->print("<h3>".&mt('You have no unread messages')."</h3>");
       }
       if ($numblocked > 0) {
           my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
           my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
           if ($numblocked == 1) {
               $r->print("<h3>".&mt('You have').' '.$numblocked.' '.&mt('blocked unread message').".</h3>");
               $r->print(&mt('This message is not viewable because').' ');
           } else {
               $r->print("<h3>".&mt('You have').' '.$numblocked.' '.&mt('blocked unread messages').".</h3>");
               $r->print(&mt('These').' '.$numblocked.' '.&mt('messages are not viewable because '));
           }
           $r->print(
   &mt('display of LON-CAPA messages sent to you by other students between').' '.$beginblock.' '.&mt('and').' '.$finishblock.' '.&mt('is currently being blocked because of online exams').'.');
           &build_block_table($r,$startblock,$endblock,\%setters);
       }
   }
   
   
 # ======================================================== Display all messages  # ======================================================== Display all messages
   
 sub disall {  sub disall {
     my ($r,$folder)=@_;      my ($r,$folder)=@_;
       $r->print(&folderlist($folder));
       if ($folder eq 'new') {
    &disnew($r);
       } elsif ($folder eq 'critical') {
    &discrit($r);
       } else {
    &disfolder($r,$folder);
       }
   }
   
   # ============================================================ Display a folder
   
   sub disfolder {
       my ($r,$folder)=@_;
     my %blocked = ();      my %blocked = ();
     my %setters = ();      my %setters = ();
     my $startblock;      my $startblock;
Line 804  ENDDISHEADER Line 938  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;
     my $number=int($totalnumber/$interdis)+1;      unless ($totalnumber>0) {
    $r->print('<h2>'.&mt('Empty Folder').'</h2>');
    return;
       }
       unless ($interdis) {
    $interdis=20;
       }
       my $number=int($totalnumber/$interdis);
       if (($startdis<0) || ($startdis>$number)) { $startdis=$number; }
     my $firstdis=$interdis*$startdis;      my $firstdis=$interdis*$startdis;
     if ($firstdis>$#temp) { $firstdis=$#temp-$interdis+1; }      if ($firstdis>$#temp) { $firstdis=$#temp-$interdis+1; }
     my $lastdis=$firstdis+$interdis-1;      my $lastdis=$firstdis+$interdis-1;
     if ($lastdis>$#temp) { $lastdis=$#temp; }      if ($lastdis>$#temp) { $lastdis=$#temp; }
     $r->print('<h2>'.&mt('Display All Messages').'</h2>'.      $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber));
       &folderlist($folder).      $r->print('<form method="post" name="disall" action="/adm/email">'.
       '<form method="post" name="disall" action="/adm/email">'.  
       '<table border=2><tr><th colspan="3">&nbsp</th><th>');        '<table border=2><tr><th colspan="3">&nbsp</th><th>');
     if ($ENV{'form.sortedby'} eq "revdate") {      if ($ENV{'form.sortedby'} eq "revdate") {
  $r->print('<a href = "?sortedby=date'.$fsqs.'">'.&mt('Date').'</a></th>');   $r->print('<a href = "?sortedby=date'.$fsqs.'">'.&mt('Date').'</a></th>');
Line 842  ENDDISHEADER Line 983  ENDDISHEADER
     } else {      } else {
       $r->print('<a href = "?sortedby=revstatus'.$fsqs.'">'.&mt('Status').'</th>');        $r->print('<a href = "?sortedby=revstatus'.$fsqs.'">'.&mt('Status').'</th>');
     }      }
     $r->print('</tr>');      $r->print("</tr>\n");
     for (my $n=$firstdis;$n<=$lastdis;$n++) {      for (my $n=$firstdis;$n<=$lastdis;$n++) {
  my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID)= @{$temp[$n]};   my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID)= @{$temp[$n]};
  if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) {   if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) {
Line 862  ENDDISHEADER Line 1003  ENDDISHEADER
       '<td>'.&Apache::lonlocal::locallocaltime($sendtime).'</td><td>'.        '<td>'.&Apache::lonlocal::locallocaltime($sendtime).'</td><td>'.
       $fromname.'</td><td>'.$fromdomain.'</td><td>'.        $fromname.'</td><td>'.$fromdomain.'</td><td>'.
       &Apache::lonnet::unescape($shortsubj).'</td><td>'.        &Apache::lonnet::unescape($shortsubj).'</td><td>'.
                       $status.'</td></tr>');                        $status."</td></tr>\n");
  } elsif ($status eq 'deleted') {   } elsif ($status eq 'deleted') {
 # purge  # purge
     &movemsg(&Apache::lonnet::unescape($origID),$folder,'trash');      &movemsg(&Apache::lonnet::unescape($origID),$folder,'trash');
  }   }
     }         }   
     $r->print('</table><p>'.      $r->print("</table>\n<p>".
   '<a href="javascript:checkall()">'.&mt('Check All').'</a>&nbsp;'.    '<a href="javascript:checkall()">'.&mt('Check All').'</a>&nbsp;'.
   '<a href="javascript:uncheckall()">'.&mt('Uncheck All').'</a></p>'.    '<a href="javascript:uncheckall()">'.&mt('Uncheck All').'</a></p>'.
   '<input type="hidden" name="sortedby" value="'.$ENV{'form.sortedby'}.'" />');    '<input type="hidden" name="sortedby" value="'.$ENV{'form.sortedby'}.'" />');
Line 876  ENDDISHEADER Line 1017  ENDDISHEADER
  $r->print(   $r->print(
       '<p><input type="submit" name="markeddel" value="'.&mt('Delete Checked').'" /></p>');        '<p><input type="submit" name="markeddel" value="'.&mt('Delete Checked').'" /></p>');
     }      }
 $r->print('<p><input type="submit" name="markedmove" value="'.&mt('Move Checked to Folder').'" />');      $r->print('<p><input type="submit" name="markedmove" value="'.&mt('Move Checked to Folder').'" />');
     my @allfolders=&Apache::lonnet::getkeys('email_folders');      my @allfolders=&Apache::lonnet::getkeys('email_folders');
     if ($allfolders[0]=~/^error:/) { @allfolders=(); }      if ($allfolders[0]=~/^error:/) { @allfolders=(); }
     $r->print(      $r->print(
  &Apache::loncommon::select_form('','movetofolder',   &Apache::loncommon::select_form('','movetofolder',
      ( map { $_ => $_ } @allfolders))       ( map { $_ => $_ } @allfolders))
       );        );
     $r->print('<input type="hidden" name="folder" value="'.$folder.'" /></form>');      my $postedstartdis=$startdis+1;
       $r->print('<input type="hidden" name="folder" value="'.$folder.'" /><input type="hidden" name="startdis" value="'.$postedstartdis.'" /><input type="hidden" name="interdis" value="'.$ENV{'form.interdis'}.'" /></form>');
     if ($numblocked > 0) {      if ($numblocked > 0) {
         my $beginblock = &Apache::lonlocal::locallocaltime($startblock);          my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
         my $finishblock = &Apache::lonlocal::locallocaltime($endblock);          my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
Line 897  $r->print('<p><input type="submit" name= Line 1039  $r->print('<p><input type="submit" name=
   
 sub compout {  sub compout {
     my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder)=@_;      my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder)=@_;
       my $suffix=&foldersuffix($folder);
   
     if ($broadcast eq 'individual') {      if ($broadcast eq 'individual') {
  &printheader($r,'/adm/email?compose=individual',   &printheader($r,'/adm/email?compose=individual',
Line 927  sub compout { Line 1070  sub compout {
     my $dispcrit='';      my $dispcrit='';
     my $dissub='';      my $dissub='';
     my $dismsg='';      my $dismsg='';
       my $disbase='';
     my $func=&mt('Send New');      my $func=&mt('Send New');
     my %lt=&Apache::lonlocal::texthash('us' => 'Username',      my %lt=&Apache::lonlocal::texthash('us' => 'Username',
        'do' => 'Domain',         'do' => 'Domain',
Line 939  sub compout { Line 1083  sub compout {
  my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message");   my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message");
          $dispcrit=           $dispcrit=
  '<input type="checkbox" name="critmsg" /> '.&mt('Send as critical message').' ' . $crithelp .    '<input type="checkbox" name="critmsg" /> '.&mt('Send as critical message').' ' . $crithelp . 
  '<br>'.   '<br />'.
  '<input type="checkbox" name="sendbck" /> '.&mt('Send as critical message').'  ' .   '<input type="checkbox" name="sendbck" /> '.&mt('Send as critical message').'  ' .
  &mt('and return receipt') . $crithelp . '<p>';   &mt('and return receipt') . $crithelp . 
    '<br /><input type="checkbox" name="permanent" /> '.
   &mt('Send copy to permanent email address (if known)').'<p>';
      }       }
     my %message;      my %message;
     my %content;      my %content;
     my $defdom=$ENV{'user.domain'};      my $defdom=$ENV{'user.domain'};
     if ($forwarding) {      if ($forwarding) {
  %message=&Apache::lonnet::get('nohist_email',[$forwarding]);   %message=&Apache::lonnet::get('nohist_email'.$suffix,[$forwarding]);
  %content=&unpackagemsg($message{$forwarding},$folder);   %content=&unpackagemsg($message{$forwarding},$folder);
  $dispcrit.='<input type="hidden" name="forwid" value="'.   $dispcrit.='<input type="hidden" name="forwid" value="'.
     $forwarding.'" />';      $forwarding.'" />';
Line 956  sub compout { Line 1102  sub compout {
  $dissub=&mt('Forwarding').': '.$content{'subject'};   $dissub=&mt('Forwarding').': '.$content{'subject'};
  $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'}) {
       $disbase='<input type="hidden" name="baseurl" value="'.&Apache::lonnet::escape($content{'baseurl'}).'" />';
    }
     }      }
     if ($replying) {      if ($replying) {
  %message=&Apache::lonnet::get('nohist_email',[$replying]);   %message=&Apache::lonnet::get('nohist_email'.$suffix,[$replying]);
  %content=&unpackagemsg($message{$replying},$folder);   %content=&unpackagemsg($message{$replying},$folder);
  $dispcrit.='<input type="hidden" name="replyid" value="'.   $dispcrit.='<input type="hidden" name="replyid" value="'.
     $replying.'" />';      $replying.'" />';
Line 969  sub compout { Line 1118  sub compout {
  $dismsg=~s/\r/\n/g;   $dismsg=~s/\r/\n/g;
  $dismsg=~s/\f/\n/g;   $dismsg=~s/\f/\n/g;
  $dismsg=~s/\n+/\n\> /g;   $dismsg=~s/\n+/\n\> /g;
    if ($content{'baseurl'}) {
       $disbase='<input type="hidden" name="baseurl" value="'.&Apache::lonnet::escape($content{'baseurl'}).'" />';
       if ($ENV{'user.adv'}) {
    $disbase.='<input type="checkbox" name="storebasecomment" />'.&mt('Store message for re-use').
       ' <a href="/adm/email?showcommentbaseurl='.
       &Apache::lonnet::escape($content{'baseurl'}).'" target="comments">'.
       &mt('Show re-usable messages').'</a><br />';
       }
    }
     }      }
       my $citation=&displayresource(%content);
     if ($ENV{'form.recdom'}) { $defdom=$ENV{'form.recdom'}; }      if ($ENV{'form.recdom'}) { $defdom=$ENV{'form.recdom'}; }
       $r->print(        $r->print(
                 '<form action="/adm/email"  name="compemail" method="post"'.                  '<form action="/adm/email"  name="compemail" method="post"'.
Line 1009  $latexHelp Line 1168  $latexHelp
 <textarea name="message" cols="80" rows="15" wrap="hard">$dismsg  <textarea name="message" cols="80" rows="15" wrap="hard">$dismsg
 </textarea></p><br />  </textarea></p><br />
 $dispcrit  $dispcrit
   $disbase
 <input type="submit" name="send" value="$func $lt{'ma'}" />  <input type="submit" name="send" value="$func $lt{'ma'}" />
 <input type="submit" name="cancel" value="$lt{'ca'}" />  <input type="submit" name="cancel" value="$lt{'ca'}" /><hr />
   $citation
 ENDCOMP  ENDCOMP
     } else { # $broadcast is 'upload'      } else { # $broadcast is 'upload'
  $r->print(<<ENDUPLOAD);   $r->print(<<ENDUPLOAD);
Line 1105  sub disfacetoface { Line 1266  sub disfacetoface {
  &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('.   &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('.
 $content{'sendername'}.'@'.  $content{'sendername'}.'@'.
             $content{'senderdomain'}.') '.$content{'time'}.              $content{'senderdomain'}.') '.$content{'time'}.
             '<br /><blockquote>'.              '<br /><pre>'.
               &Apache::lontexconvert::msgtexconverted($content{'message'}).                &Apache::lontexconvert::msgtexconverted($content{'message'}).
       '</blockquote>';        '</pre>';
      }       }
     # Check to see if there were any messages.      # Check to see if there were any messages.
     if ($result eq '') {      if ($result eq '') {
Line 1605  sub displaymessage { Line 1766  sub displaymessage {
       '"><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='.&Apache::lonnet::escape($msgid).$sqs.
       '"><b>Delete</b></a></td>'.        '"><b>Delete</b></a></td>'.
       '<td><a href="/adm/email?sortedby='.$ENV{'form.sortedby'}.        '<td><a href="/adm/email?'.$sqs.
       '&folder='.&Apache::lonnet::escape($folder).        ($ENV{'form.dismode'} eq 'new'?'&folder=new':'').
       '"><b>'.&mt('Display all Messages').'</b></a></td>');        '"><b>'.&mt('Back to Folder Display').'</b></a></td>');
     if ($counter > 0){      if ($counter > 0){
  $r->print('<td><a href="/adm/email?display='.$messages[$counter-1]->[5].$sqs.   $r->print('<td><a href="/adm/email?display='.$messages[$counter-1]->[5].$sqs.
   '"><b>'.&mt('Previous').'</b></a></td>');    '"><b>'.&mt('Previous').'</b></a></td>');
Line 1632  sub displaymessage { Line 1793  sub displaymessage {
       ($content{'courseid'}?'<br /><b>'.&mt('Course').':</b> '.$courseinfo{'description'}.        ($content{'courseid'}?'<br /><b>'.&mt('Course').':</b> '.$courseinfo{'description'}.
        ($content{'coursesec'}?' ('.&mt('Group/Section').': '.$content{'coursesec'}.')':''):'').         ($content{'coursesec'}?' ('.&mt('Group/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'}.' ('.&Apache::lonnet::gettitle($content{'baseurl'}).')</a>':'').
       '<p><pre>'.        '<p><pre>'.
       &Apache::lontexconvert::msgtexconverted($content{'message'},1).        &Apache::lontexconvert::msgtexconverted($content{'message'},1).
       '</pre><hr />'.$content{'citation'}.'</p>');        '</pre><hr />'.&displayresource(%content).'</p>');
     return;         return;   
 }  }
   
   # =========================================================== Show the citation
   
   sub displayresource {
       my %content=@_;
   #
   # If the recipient is in the same course that the message was sent from and
   # has sufficient privileges, show "all details," else show citation
   #
       if (($ENV{'request.course.id'} eq $content{'courseid'})
        && (&Apache::lonnet::allowed('vgr',$content{'courseid'}))) {
    my $symb=&Apache::lonnet::symbread($content{'baseurl'});
   # Could not get a symb, give up
    unless ($symb) { return $content{'citation'}; }
   # Have a symb, can render
    return '<h2>'.&mt('Current attempts of student (if applicable)').'</h2>'.
       &Apache::loncommon::get_previous_attempt($symb,
        $content{'sendername'},
        $content{'senderdomain'},
        $content{'courseid'}).
       '<hr /><h2>'.&mt('Current screen output (if applicable)').'</h2>'.
       &Apache::loncommon::get_student_view($symb,
    $content{'sendername'},
    $content{'senderdomain'},
    $content{'courseid'}).
       '<h2>'.&mt('Correct Answer(s) (if applicable)').'</h2>'.
       &Apache::loncommon::get_student_answers($symb,
       $content{'sendername'},
       $content{'senderdomain'},
       $content{'courseid'});
       } else {
    return $content{'citation'};
       }
   }
   
 # ================================================================== The Header  # ================================================================== The Header
   
 sub header {  sub header {
Line 1663  sub printheader { Line 1860  sub printheader {
     &header($r,$title,$baseurl);      &header($r,$title,$baseurl);
 }  }
   
   # ------------------------------------------------------------ Store the comment
   
   sub storecomment {
       my ($r)=@_;
       my $msgtxt=&Apache::lonfeedback::clear_out_html($ENV{'form.message'});
       my $cleanmsgtxt='';
       foreach (split(/[\n\r]/,$msgtxt)) {
    unless ($_=~/^\s*(\>|\&gt\;)/) {
       $cleanmsgtxt.=$_."\n";
    }
       }
       my $key=&Apache::lonnet::escape($ENV{'form.baseurl'}).'___'.time;
       &Apache::lonnet::put('nohist_stored_comments',{ $key => $cleanmsgtxt });
   }
   
   sub storedcommentlisting {
       my ($r)=@_;
       my %msgs=&Apache::lonnet::dump('nohist_stored_comments',undef,undef,
          '^'.&Apache::lonnet::escape(&Apache::lonnet::escape($ENV{'form.showcommentbaseurl'})));
       $r->print('<html><body>');
       if ((keys %msgs)[0]=~/^error\:/) {
    $r->print(&mt('No stored comments yet.'));
       } else {
    my $found=0;
    foreach (sort keys %msgs) {
       $r->print("\n".$msgs{$_}."<hr />");
       $found=1;
    }
    unless ($found) {
       $r->print(&mt('No stored comments yet for this resource.'));
    }
       }
   }
   
   # ---------------------------------------------------------------- Send an email
   
   sub sendoffmail {
       my ($r,$folder)=@_;
       my $suffix=&foldersuffix($folder);
       my $sendstatus='';
       if ($ENV{'form.send'}) {
    &printheader($r,'','Messages being sent.');
    $r->rflush();
    my %content=();
    undef %content;
    if ($ENV{'form.forwid'}) {
       my $msgid=$ENV{'form.forwid'};
       my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);
       %content=&unpackagemsg($message{$msgid},1);
       &statuschange($msgid,'forwarded',$folder);
       $ENV{'form.message'}.="\n\n-- Forwarded message --\n\n".
    $content{'message'};
    }
    if ($ENV{'form.replyid'}) {
       my $msgid=$ENV{'form.replyid'};
       my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);
       %content=&unpackagemsg($message{$msgid},1);
       &statuschange($msgid,'replied',$folder);
    }
    my %toaddr=();
    undef %toaddr;
    if ($ENV{'form.sendmode'} eq 'group') {
       foreach (keys %ENV) {
    if ($_=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {
       $toaddr{$1}='';
    }
       }
    } elsif ($ENV{'form.sendmode'} eq 'upload') {
       foreach (split(/[\n\r\f]+/,$ENV{'form.upfile'})) {
    my ($rec,$txt)=split(/\s*\:\s*/,$_);
    if ($txt) {
       $rec=~s/\@/\:/;
       $toaddr{$rec}.=$txt."\n";
    }
       }
    } else {
       $toaddr{$ENV{'form.recuname'}.':'.$ENV{'form.recdomain'}}='';
    }
    if ($ENV{'form.additionalrec'}) {
       foreach (split(/\,/,$ENV{'form.additionalrec'})) {
    my ($auname,$audom)=split(/\@/,$_);
    $toaddr{$auname.':'.$audom}='';
       }
    }
   
    foreach (keys %toaddr) {
       my ($recuname,$recdomain)=split(/\:/,$_);
               my $msgtxt;
               if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) &&
                   (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) {
                   $msgtxt=&Apache::lonfeedback::clear_out_html($ENV{'form.message'},1);
               } else {  
           $msgtxt=&Apache::lonfeedback::clear_out_html($ENV{'form.message'});
               }
       if ($toaddr{$_}) { $msgtxt.='<hr />'.$toaddr{$_}; }
       my $thismsg;    
       if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) && 
    (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) {
    $r->print(&mt('Sending critical message').' '.$recuname.'@'.$recdomain.': ');
    $thismsg=&user_crit_msg($recuname,$recdomain,
    &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),
    $msgtxt,
    $ENV{'form.sendbck'},$ENV{'form.permanent'});
       } else {
    $r->print(&mt('Sending').' '.$recuname.'@'.$recdomain.': ');
    $thismsg=&user_normal_msg($recuname,$recdomain,
     &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),
     $msgtxt,
     $content{'citation'},undef,undef,$ENV{'form.permanent'});
    if (($ENV{'request.course.id'}) && ($ENV{'form.sendmode'} eq 'group')) {
       &user_normal_msg_raw(
    $ENV{'course.'.$ENV{'request.course.id'}.'.num'},
    $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
    'Broadcast ['.$recuname.':'.$recdomain.']',
    $msgtxt);
    }
       }
       $r->print($thismsg.'<br />');
       $sendstatus.=' '.$thismsg;
    }
       } else {
    &printheader($r,'','No messages sent.'); 
       }
       if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) {
    $r->print('<br /><font color="green">'.&mt('Completed.').'</font>');
    if ($ENV{'form.displayedcrit'}) {
       &discrit($r);
    } else {
       &Apache::loncommunicate::menu($r);
    }
       } else {
    $r->print(
     '<h2><font color="red">'.&mt('Could not deliver message').'</font></h2>'.
     &mt('Please use the browser "Back" button and correct the recipient addresses')
     );
       }
   }
   
 # ===================================================================== Handler  # ===================================================================== Handler
   
Line 1680  sub handler { Line 2014  sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
         ['display','replyto','forward','markread','markdel','markunread',          ['display','replyto','forward','markread','markdel','markunread',
          'sendreply','compose','sendmail','critical','recname','recdom',           'sendreply','compose','sendmail','critical','recname','recdom',
          'recordftf','sortedby','block','folder','startdis','interdis']);           'recordftf','sortedby','block','folder','startdis','interdis',
     $sqs='&sortedby='.$ENV{'form.sortedby'}.   'showcommentbaseurl','dismode']);
  '&startdis='.$ENV{'form.startdis'}.      $sqs='&sortedby='.$ENV{'form.sortedby'};
  '&interdis='.$ENV{'form.interdis'};  
   
 # ------------------------------------------------------ They checked for email  # ------------------------------------------------------ They checked for email
     unless ($ENV{'form.block'}) {      unless ($ENV{'form.block'}) {
Line 1704  sub handler { Line 2037  sub handler {
     unless ($folder) {       unless ($folder) { 
  $folder='';    $folder=''; 
     } else {      } else {
  $sqs='&folder='.&Apache::lonnet::escape($folder);   $sqs.='&folder='.&Apache::lonnet::escape($folder);
     }      }
   
 # --------------------------------------------------------------------- Display  # --------------------------------------------------------------------- Display
   
     $startdis=$ENV{'form.startdis'};      $startdis=$ENV{'form.startdis'};
       $startdis--;
     unless ($startdis) { $startdis=0; }      unless ($startdis) { $startdis=0; }
   
     $interdis=$ENV{'form.interdis'};      $interdis=$ENV{'form.interdis'};
     unless ($interdis) { $interdis=20; }      unless ($interdis) { $interdis=20; }
       $sqs.='&interdis='.$interdis;
   
       if ($ENV{'form.firstview'}) {
    $startdis=0;
       }
       if ($ENV{'form.lastview'}) {
    $startdis=-1;
       }
       if ($ENV{'form.prevview'}) {
    $startdis--;
       }
       if ($ENV{'form.nextview'}) {
    $startdis++;
       }
       my $postedstartdis=$startdis+1;
       $sqs.='&startdis='.$postedstartdis;
   
 # --------------------------------------------------------------- Render Output  # --------------------------------------------------------------- Render Output
   
Line 1739  sub handler { Line 2090  sub handler {
  &printheader($r,'','Displaying Critical Messages');   &printheader($r,'','Displaying Critical Messages');
  &discrit($r);   &discrit($r);
     } elsif ($ENV{'form.forward'}) {      } elsif ($ENV{'form.forward'}) {
  &compout($r,$ENV{'form.forward'});   &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);   &statuschange($ENV{'form.markdel'},'deleted',$folder);
    &Apache::loncommunicate::menu($r);
  &disall($r,$folder);   &disall($r,$folder);
     } elsif ($ENV{'form.markedmove'}) {      } elsif ($ENV{'form.markedmove'}) {
  my $total=0;   my $total=0;
Line 1755  sub handler { Line 2107  sub handler {
  }   }
  &printheader($r,'','Moved Messages');   &printheader($r,'','Moved Messages');
  $r->print('Moved '.$total.' message(s)<p>');   $r->print('Moved '.$total.' message(s)<p>');
    &Apache::loncommunicate::menu($r);
  &disall($r,$folder);   &disall($r,$folder);
     } elsif ($ENV{'form.markeddel'}) {      } elsif ($ENV{'form.markeddel'}) {
  my $total=0;   my $total=0;
Line 1766  sub handler { Line 2119  sub handler {
  }   }
  &printheader($r,'','Deleted Messages');   &printheader($r,'','Deleted Messages');
  $r->print('Deleted '.$total.' message(s)<p>');   $r->print('Deleted '.$total.' message(s)<p>');
    &Apache::loncommunicate::menu($r);
  &disall($r,$folder);   &disall($r,$folder);
     } elsif ($ENV{'form.markunread'}) {      } elsif ($ENV{'form.markunread'}) {
  &printheader($r,'','Marked Message as Unread');   &printheader($r,'','Marked Message as Unread');
  &statuschange($ENV{'form.markunread'},'new');   &statuschange($ENV{'form.markunread'},'new');
    &Apache::loncommunicate::menu($r);
  &disall($r,$folder);   &disall($r,$folder);
     } elsif ($ENV{'form.compose'}) {      } elsif ($ENV{'form.compose'}) {
  &compout($r,'','',$ENV{'form.compose'});   &compout($r,'','',$ENV{'form.compose'});
Line 1778  sub handler { Line 2133  sub handler {
     } elsif ($ENV{'form.block'}) {      } elsif ($ENV{'form.block'}) {
         &examblock($r,$ENV{'form.block'});          &examblock($r,$ENV{'form.block'});
     } elsif ($ENV{'form.sendmail'}) {      } elsif ($ENV{'form.sendmail'}) {
  my $sendstatus='';   &sendoffmail($r,$folder);
  if ($ENV{'form.send'}) {   if ($ENV{'form.storebasecomment'}) {
     &printheader($r,'','Messages being sent.');      &storecomment($r);
     $r->rflush();  
     my %content=();  
     undef %content;  
     if ($ENV{'form.forwid'}) {  
  my $msgid=$ENV{'form.forwid'};  
  my %message=&Apache::lonnet::get('nohist_email',[$msgid]);  
  %content=&unpackagemsg($message{$msgid},1);  
  &statuschange($msgid,'forwarded');  
  $ENV{'form.message'}.="\n\n-- Forwarded message --\n\n".  
     $content{'message'};  
     }  
     if ($ENV{'form.replyid'}) {  
  my $msgid=$ENV{'form.replyid'};  
  my %message=&Apache::lonnet::get('nohist_email',[$msgid]);  
  %content=&unpackagemsg($message{$msgid},1);  
  &statuschange($msgid,'replied');  
     }  
     my %toaddr=();  
     undef %toaddr;  
     if ($ENV{'form.sendmode'} eq 'group') {  
  foreach (keys %ENV) {  
     if ($_=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {  
  $toaddr{$1}='';  
     }  
  }  
     } elsif ($ENV{'form.sendmode'} eq 'upload') {  
  foreach (split(/[\n\r\f]+/,$ENV{'form.upfile'})) {  
     my ($rec,$txt)=split(/\s*\:\s*/,$_);  
     if ($txt) {  
  $rec=~s/\@/\:/;  
  $toaddr{$rec}.=$txt."\n";  
     }  
  }  
     } else {  
  $toaddr{$ENV{'form.recuname'}.':'.$ENV{'form.recdomain'}}='';  
     }  
     if ($ENV{'form.additionalrec'}) {  
  foreach (split(/\,/,$ENV{'form.additionalrec'})) {  
     my ($auname,$audom)=split(/\@/,$_);  
     $toaddr{$auname.':'.$audom}='';  
  }  
     }  
   
     foreach (keys %toaddr) {  
  my ($recuname,$recdomain)=split(/\:/,$_);  
  my $msgtxt=&Apache::lonfeedback::clear_out_html($ENV{'form.message'});  
  if ($toaddr{$_}) { $msgtxt.='<hr />'.$toaddr{$_}; }  
  my $thismsg;      
  if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) &&   
     (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) {  
     $r->print(&mt('Sending critical message').' '.$recuname.'@'.$recdomain.': ');  
     $thismsg=&user_crit_msg($recuname,$recdomain,  
     &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),  
     $msgtxt,  
     $ENV{'form.sendbck'});  
  } else {  
     $r->print(&mt('Sending').' '.$recuname.'@'.$recdomain.': ');  
     $thismsg=&user_normal_msg($recuname,$recdomain,  
       &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),  
       $msgtxt,  
       $content{'citation'});  
                     if (($ENV{'request.course.id'}) && ($ENV{'form.sendmode'} eq 'group')) {  
                         &user_normal_msg_raw(  
                         $ENV{'course.'.$ENV{'request.course.id'}.'.num'},  
                         $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},  
                         'Broadcast ['.$recuname.':'.$recdomain.']',  
                         $msgtxt);  
                     }  
  }  
  $r->print($thismsg.'<br />');  
  $sendstatus.=' '.$thismsg;  
     }  
  } else {  
     &printheader($r,'','No messages sent.');   
  }  
  if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) {  
     $r->print('<br /><font color="green">'.&mt('Completed.').'</font>');  
     if ($ENV{'form.displayedcrit'}) {  
  &discrit($r);  
     } else {  
  &Apache::loncommunicate::menu($r);  
     }  
  } else {  
     $r->print(  
       '<h2><font color="red">'.&mt('Could not deliver message').'</font></h2>'.  
       &mt('Please use the browser "Back" button and correct the recipient addresses')  
       );  
  }   }
    &disall($r,$folder);
     } elsif ($ENV{'form.newfolder'}) {      } elsif ($ENV{'form.newfolder'}) {
  &printheader($r,'','New Folder');   &printheader($r,'','New Folder');
  &makefolder($ENV{'form.newfolder'});   &makefolder($ENV{'form.newfolder'});
    &Apache::loncommunicate::menu($r);
  &disall($r,$ENV{'form.newfolder'});   &disall($r,$ENV{'form.newfolder'});
       } elsif ($ENV{'form.showcommentbaseurl'}) {
    &storedcommentlisting($r);
     } else {      } else {
  &printheader($r,'','Display All Messages');   &printheader($r,'','Display All Messages');
    &Apache::loncommunicate::menu($r);
  &disall($r,$folder);   &disall($r,$folder);
     }      }
     $r->print('</body></html>');      $r->print('</body></html>');

Removed from v.1.109  
changed lines
  Added in v.1.133


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