Diff for /loncom/interface/lonmsg.pm between versions 1.131 and 1.151

version 1.131, 2005/01/30 23:32:29 version 1.151, 2005/06/07 18:19:32
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 104  since lonmsg already implements that fun Line 104  since lonmsg already implements that fun
 =cut  =cut
   
 use strict;  use strict;
 use Apache::lonnet();  use Apache::lonnet;
 use vars qw($msgcount);  use vars qw($msgcount);
 use HTML::TokeParser();  use HTML::TokeParser();
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
Line 140  sub packagemsg { Line 140  sub packagemsg {
     my $partsubj=$subject;      my $partsubj=$subject;
     $partsubj=&Apache::lonnet::escape($partsubj);      $partsubj=&Apache::lonnet::escape($partsubj);
     my $msgid=&Apache::lonnet::escape(      my $msgid=&Apache::lonnet::escape(
            $now.':'.$partsubj.':'.$ENV{'user.name'}.':'.             $now.':'.$partsubj.':'.$env{'user.name'}.':'.
            $ENV{'user.domain'}.':'.$msgcount.':'.$$);             $env{'user.domain'}.':'.$msgcount.':'.
     my $result='<sendername>'.$ENV{'user.name'}.'</sendername>'.             $env{'request.course.id'}.':'.$$);
            '<senderdomain>'.$ENV{'user.domain'}.'</senderdomain>'.      my $result='<sendername>'.$env{'user.name'}.'</sendername>'.
              '<senderdomain>'.$env{'user.domain'}.'</senderdomain>'.
            '<subject>'.$subject.'</subject>'.             '<subject>'.$subject.'</subject>'.
    '<time>'.&Apache::lonlocal::locallocaltime($now).'</time>'.     '<time>'.&Apache::lonlocal::locallocaltime($now).'</time>'.
    '<servername>'.$ENV{'SERVER_NAME'}.'</servername>'.     '<servername>'.$ENV{'SERVER_NAME'}.'</servername>'.
            '<host>'.$ENV{'HTTP_HOST'}.'</host>'.             '<host>'.$ENV{'HTTP_HOST'}.'</host>'.
    '<client>'.$ENV{'REMOTE_ADDR'}.'</client>'.     '<client>'.$ENV{'REMOTE_ADDR'}.'</client>'.
    '<browsertype>'.$ENV{'browser.type'}.'</browsertype>'.     '<browsertype>'.$env{'browser.type'}.'</browsertype>'.
    '<browseros>'.$ENV{'browser.os'}.'</browseros>'.     '<browseros>'.$env{'browser.os'}.'</browseros>'.
    '<browserversion>'.$ENV{'browser.version'}.'</browserversion>'.     '<browserversion>'.$env{'browser.version'}.'</browserversion>'.
            '<browsermathml>'.$ENV{'browser.mathml'}.'</browsermathml>'.             '<browsermathml>'.$env{'browser.mathml'}.'</browsermathml>'.
    '<browserraw>'.$ENV{'HTTP_USER_AGENT'}.'</browserraw>'.     '<browserraw>'.$ENV{'HTTP_USER_AGENT'}.'</browserraw>'.
    '<courseid>'.$ENV{'request.course.id'}.'</courseid>'.     '<courseid>'.$env{'request.course.id'}.'</courseid>'.
    '<coursesec>'.$ENV{'request.course.sec'}.'</coursesec>'.     '<coursesec>'.$env{'request.course.sec'}.'</coursesec>'.
    '<role>'.$ENV{'request.role'}.'</role>'.     '<role>'.$env{'request.role'}.'</role>'.
    '<resource>'.$ENV{'request.filename'}.'</resource>'.     '<resource>'.$env{'request.filename'}.'</resource>'.
            '<msgid>'.$msgid.'</msgid>'.             '<msgid>'.$msgid.'</msgid>'.
    '<recuser>'.$recuser.'</recuser>'.     '<recuser>'.$recuser.'</recuser>'.
    '<recdomain>'.$recdomain.'</recdomain>'.     '<recdomain>'.$recdomain.'</recdomain>'.
Line 209  sub unpackmsgid { Line 210  sub unpackmsgid {
     my ($msgid,$folder)=@_;      my ($msgid,$folder)=@_;
     $msgid=&Apache::lonnet::unescape($msgid);      $msgid=&Apache::lonnet::unescape($msgid);
     my $suffix=&foldersuffix($folder);      my $suffix=&foldersuffix($folder);
     my ($sendtime,$shortsubj,$fromname,$fromdomain)=split(/\:/,      my ($sendtime,$shortsubj,$fromname,$fromdomain,$count,$fromcid)=split(/\:/,
                           &Apache::lonnet::unescape($msgid));                            &Apache::lonnet::unescape($msgid));
     my %status=&Apache::lonnet::get('email_status'.$suffix,[$msgid]);      my %status=&Apache::lonnet::get('email_status'.$suffix,[$msgid]);
     if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; }      if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; }
     unless ($status{$msgid}) { $status{$msgid}='new'; }      unless ($status{$msgid}) { $status{$msgid}='new'; }
     return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid});      return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid},$fromcid);
 }   }
   
   
 sub sendemail {  sub sendemail {
Line 226  sub sendemail { Line 227  sub sendemail {
     my $msg = new Mail::Send;      my $msg = new Mail::Send;
     $msg->to($to);      $msg->to($to);
     $msg->subject('[LON-CAPA] '.$subject);      $msg->subject('[LON-CAPA] '.$subject);
     my %oldENV=%ENV;  
     undef(%ENV);  
     if (my $fh = $msg->open()) {      if (my $fh = $msg->open()) {
  print $fh $body;   print $fh $body;
  $fh->close;   $fh->close;
     }      }
     %ENV=%oldENV;  
     undef(%oldENV);  
 }  }
   
 # ==================================================== Send notification emails  # ==================================================== Send notification emails
   
 sub sendnotification {  sub sendnotification {
     my ($to,$touname,$toudom,$subj,$crit,$text)=@_;      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/) {       unless ($sender=~/\w/) { 
  $sender=$ENV{'user.name'}.'@'.$ENV{'user.domain'};   $sender=$env{'user.name'}.'@'.$env{'user.domain'};
     }      }
     my $critical=($crit?' critical':'');      my $critical=($crit?' critical':'');
     $text=~s/\&lt\;/\</gs;      $text=~s/\&lt\;/\</gs;
Line 271  ENDMSG Line 268  ENDMSG
 # ============================================================= Check for email  # ============================================================= Check for email
   
 sub newmail {  sub newmail {
     if ((time-$ENV{'user.mailcheck.time'})>300) {      if ((time-$env{'user.mailcheck.time'})>300) {
         my %what=&Apache::lonnet::get('email_status',['recnewemail']);          my %what=&Apache::lonnet::get('email_status',['recnewemail']);
         &Apache::lonnet::appenv('user.mailcheck.time'=>time);          &Apache::lonnet::appenv('user.mailcheck.time'=>time);
         if ($what{'recnewemail'}>0) { return 1; }          if ($what{'recnewemail'}>0) { return 1; }
Line 356  sub all_url_author_res_msg { Line 353  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';
Line 370  sub user_crit_msg_raw { Line 367  sub user_crit_msg_raw {
            'put:'.$domain.':'.$user.':critical:'.             'put:'.$domain.':'.$user.':critical:'.
            &Apache::lonnet::escape($msgid).'='.             &Apache::lonnet::escape($msgid).'='.
            &Apache::lonnet::escape($message),$homeserver);             &Apache::lonnet::escape($message),$homeserver);
        if ($ENV{'request.course.id'}) {         if ($env{'request.course.id'}) {
           &user_normal_msg_raw(            &user_normal_msg_raw(
             $ENV{'course.'.$ENV{'request.course.id'}.'.num'},              $env{'course.'.$env{'request.course.id'}.'.num'},
             $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},              $env{'course.'.$env{'request.course.id'}.'.domain'},
             'Critical ['.$user.':'.$domain.']',              'Critical ['.$user.':'.$domain.']',
     $message);      $message);
        }         }
Line 381  sub user_crit_msg_raw { Line 378  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);   $text);
     }      }
       if ($toperm && $userenv{'permanentemail'}) {
         &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,1,
    $text);
       }
 # Log this  # Log this
     &Apache::lonnet::logthis(      &Apache::lonnet::logthis(
       'Sending critical email '.$msgid.        'Sending critical email '.$msgid.
       ', log status: '.        ', log status: '.
       &Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'},        &Apache::lonnet::log($env{'user.domain'},$env{'user.name'},
                          $ENV{'user.home'},                           $env{'user.home'},
       'Sending critical '.$msgid.' to '.$user.' at '.$domain.' with status: '        'Sending critical '.$msgid.' to '.$user.' at '.$domain.' with status: '
       .$status));        .$status));
     return $status;      return $status;
Line 409  sub user_crit_msg_raw { Line 411  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 419  sub user_crit_msg { Line 421  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 435  sub user_crit_received { Line 437  sub user_crit_received {
     my %contents=&unpackagemsg($message{$msgid},1);      my %contents=&unpackagemsg($message{$msgid},1);
     my $status='rec: '.($contents{'sendback'}?      my $status='rec: '.($contents{'sendback'}?
      &user_normal_msg($contents{'sendername'},$contents{'senderdomain'},       &user_normal_msg($contents{'sendername'},$contents{'senderdomain'},
                      &mt('Receipt').': '.$ENV{'user.name'}.' '.&mt('at').' '.$ENV{'user.domain'}.', '.$contents{'subject'},                       &mt('Receipt').': '.$env{'user.name'}.' '.&mt('at').' '.$env{'user.domain'}.', '.$contents{'subject'},
                      &mt('User').' '.$ENV{'user.name'}.' '.&mt('at').' '.$ENV{'user.domain'}.                       &mt('User').' '.$env{'user.name'}.' '.&mt('at').' '.$env{'user.domain'}.
                      ' acknowledged receipt of message'."\n".'   "'.                       ' acknowledged receipt of message'."\n".'   "'.
                      $contents{'subject'}.'"'."\n".&mt('dated').' '.                       $contents{'subject'}.'"'."\n".&mt('dated').' '.
                      $contents{'time'}.".\n"                       $contents{'time'}.".\n"
Line 446  sub user_crit_received { Line 448  sub user_crit_received {
      'nohist_email',{$contents{'msgid'} => $message{$msgid}});       'nohist_email',{$contents{'msgid'} => $message{$msgid}});
     $status.=' del: '.      $status.=' del: '.
      &Apache::lonnet::del('critical',[$contents{'msgid'}]);       &Apache::lonnet::del('critical',[$contents{'msgid'}]);
     &Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'},      &Apache::lonnet::log($env{'user.domain'},$env{'user.name'},
                          $ENV{'user.home'},'Received critical message '.                           $env{'user.home'},'Received critical message '.
                          $contents{'msgid'}.                           $contents{'msgid'}.
                          ', '.$status);                           ', '.$status);
     return $status;      return $status;
Line 456  sub user_crit_received { Line 458  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';
Line 476  sub user_normal_msg_raw { Line 479  sub user_normal_msg_raw {
                          ('email_status',{'recnewemail'=>time},$domain,$user);                           ('email_status',{'recnewemail'=>time},$domain,$user);
 # Into sent-mail folder  # Into sent-mail folder
        $status.=' '.&Apache::lonnet::critical(         $status.=' '.&Apache::lonnet::critical(
            'put:'.$ENV{'user.domain'}.':'.$ENV{'user.name'}.             'put:'.$env{'user.domain'}.':'.$env{'user.name'}.
       ':nohist_email_sent:'.        ':nohist_email_sent:'.
            &Apache::lonnet::escape($msgid).'='.             &Apache::lonnet::escape($msgid).'='.
            &Apache::lonnet::escape($message),$ENV{'user.home'});             &Apache::lonnet::escape($message),$env{'user.home'});
     } else {      } else {
        $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);    $text);
     }      }
     &Apache::lonnet::log($ENV{'user.domain'},$ENV{'user.name'},      if ($toperm && $userenv{'permanentemail'}) {
                          $ENV{'user.home'},        &sendnotification($userenv{'permanentemail'},$user,$domain,$subject,0,
    $text);
       }
       &Apache::lonnet::log($env{'user.domain'},$env{'user.name'},
                            $env{'user.home'},
       'Sending '.$msgid.' to '.$user.' at '.$domain.' with status: '.$status);        'Sending '.$msgid.' to '.$user.' at '.$domain.' with status: '.$status);
     return $status;      return $status;
 }  }
Line 507  sub user_normal_msg_raw { Line 515  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 517  sub user_normal_msg { Line 526  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 547  sub folderlist { Line 556  sub folderlist {
  ($_==$interdis?' selected="selected"':'').'>'.$_.'</option>' }   ($_==$interdis?' selected="selected"':'').'>'.$_.'</option>' }
    (10,20,50,100,200)).'</select>'.     (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'}.'" />'.      '<input type="hidden" name="sortedby" value="'.$env{'form.sortedby'}.'" />'.
       ($folder=~/^(new|critical)/?'</form>':'');        ($folder=~/^(new|critical)/?'</form>':'');
 }  }
   
Line 587  sub statuschange { Line 596  sub statuschange {
     if (($newstatus eq 'deleted') || ($newstatus eq 'new')) {      if (($newstatus eq 'deleted') || ($newstatus eq 'new')) {
  &Apache::lonnet::put('email_status'.$suffix,{$msgid => $newstatus});   &Apache::lonnet::put('email_status'.$suffix,{$msgid => $newstatus});
     }      }
       if ($newstatus eq 'deleted') {
          &movemsg(&Apache::lonnet::unescape($msgid),$folder,'trash');
      }
 }  }
   
 # ============================================================= Make new folder  # ============================================================= Make new folder
Line 604  sub makefolder { Line 616  sub makefolder {
   
 sub movemsg {  sub movemsg {
     my ($msgid,$srcfolder,$trgfolder)=@_;      my ($msgid,$srcfolder,$trgfolder)=@_;
       if ($srcfolder eq 'new') { $srcfolder=''; }
     my $srcsuffix=&foldersuffix($srcfolder);      my $srcsuffix=&foldersuffix($srcfolder);
     my $trgsuffix=&foldersuffix($trgfolder);      my $trgsuffix=&foldersuffix($trgfolder);
   
Line 627  sub discourse { Line 640  sub discourse {
     my $r=shift;      my $r=shift;
     my $classlist = &Apache::loncoursedata::get_classlist();      my $classlist = &Apache::loncoursedata::get_classlist();
     my $now=time;      my $now=time;
     my %lt=&Apache::lonlocal::texthash('cfa' => 'Check for All',      my %lt=&Apache::lonlocal::texthash('cfa' => 'Check All',
             'cfs' => 'Check for Section/Group',              'cfs' => 'Check Section/Group',
             'cfn' => 'Check for None');              'cfn' => 'Uncheck All');
     $r->print(<<ENDDISHEADER);      $r->print(<<ENDDISHEADER);
 <input type="hidden" name="sendmode" value="group" />  <input type="hidden" name="sendmode" value="group" />
 <script>  <script>
Line 663  sub discourse { Line 676  sub discourse {
 </script>  </script>
 <input type="button" onClick="checkall()" value="$lt{'cfa'}" />&nbsp;  <input type="button" onClick="checkall()" value="$lt{'cfa'}" />&nbsp;
 <input type="button" onClick="checksec()" value="$lt{'cfs'}" />  <input type="button" onClick="checksec()" value="$lt{'cfs'}" />
 <input type="text" size="5" name=chksec />&nbsp;  <input type="text" size="5" name="chksec" />&nbsp;
 <input type="button" onClick="uncheckall()" value="$lt{'cfn'}" />  <input type="button" onClick="uncheckall()" value="$lt{'cfn'}" />
 <p>  <p>
 ENDDISHEADER  ENDDISHEADER
Line 681  ENDDISHEADER Line 694  ENDDISHEADER
         }          }
     }      }
     $r->print('</table><table>');      $r->print('</table><table>');
     while (my ($student,$info) = each(%$classlist)) {      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) =          my ($sname,$sdom,$status,$fullname,$section) =
             (@{$info}[&Apache::loncoursedata::CL_SNAME(),              (@{$info}[&Apache::loncoursedata::CL_SNAME(),
                       &Apache::loncoursedata::CL_SDOM(),                        &Apache::loncoursedata::CL_SDOM(),
Line 689  ENDDISHEADER Line 710  ENDDISHEADER
                       &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');
    next if ($env{'request.course.sec'} &&
    $section ne $env{'request.course.sec'});
         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.'</label></td><td>'.$sname.'@'.$sdom.'</td><td>'.$section.
                   '</td></tr>');                    '</td></tr>');
     }      }
     $r->print('</table>');      $r->print('</table>');
Line 704  ENDDISHEADER Line 727  ENDDISHEADER
 sub discrit {  sub discrit {
     my $r=shift;      my $r=shift;
     my $header = '<h1><font color=red>'.&mt('Critical Messages').'</font></h1>'.      my $header = '<h1><font color=red>'.&mt('Critical Messages').'</font></h1>'.
         '<form action=/adm/email method=post>'.          '<form action="/adm/email" method="POST">'.
         '<input type=hidden name=confirm value=true>';          '<input type="hidden" name="confirm" value="true" />';
     my %what=&Apache::lonnet::dump('critical');      my %what=&Apache::lonnet::dump('critical');
     my $result = '';      my $result = '';
     foreach (sort keys %what) {      foreach (sort keys %what) {
Line 722  $content{'sendername'}.'@'. Line 745  $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_'.$_.'" value="'.&mt('Confirm Receipt').'" />'.
             '<input type=submit name="reprec_'.$_.'" '.              '<input type="submit" name="reprec_'.$_.'" '.
                   '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.
     if ($result eq '') {      if ($result eq '') {
Line 746  sub sortedmessages { Line 769  sub sortedmessages {
     my @temp;      my @temp;
     foreach (@messages) {      foreach (@messages) {
  my $msgid=&Apache::lonnet::escape($_);   my $msgid=&Apache::lonnet::escape($_);
  my ($sendtime,$shortsubj,$fromname,$fromdomain,$status)=   my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid)=
     &Apache::lonmsg::unpackmsgid($msgid,$folder);      &Apache::lonmsg::unpackmsgid($msgid,$folder);
  my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status,   my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status,
      $msgid);       $msgid);
Line 761  sub sortedmessages { Line 784  sub sortedmessages {
     }      }
     #default sort      #default sort
     @temp = sort  {$a->[0] <=> $b->[0]} @temp;          @temp = sort  {$a->[0] <=> $b->[0]} @temp;    
     if ($ENV{'form.sortedby'} eq "date"){      if ($env{'form.sortedby'} eq "date"){
         @temp = sort  {$a->[0] <=> $b->[0]} @temp;              @temp = sort  {$a->[0] <=> $b->[0]} @temp;    
     }      }
     if ($ENV{'form.sortedby'} eq "revdate"){      if ($env{'form.sortedby'} eq "revdate"){
     @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;   @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;   @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;          @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;          @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;
     }      }
     if ($ENV{'form.sortedby'} eq "revsubject"){      if ($env{'form.sortedby'} eq "revsubject"){
         @temp = sort  {lc($b->[1]) cmp lc($a->[1])} @temp;          @temp = sort  {lc($b->[1]) cmp lc($a->[1])} @temp;
     }      }
     if ($ENV{'form.sortedby'} eq "status"){      if ($env{'form.sortedby'} eq "status"){
         @temp = sort  {$a->[4] cmp $b->[4]} @temp;          @temp = sort  {$a->[4] cmp $b->[4]} @temp;
     }      }
     if ($ENV{'form.sortedby'} eq "revstatus"){      if ($env{'form.sortedby'} eq "revstatus"){
         @temp = sort  {$b->[4] cmp $a->[4]} @temp;          @temp = sort  {$b->[4] cmp $a->[4]} @temp;
     }      }
     return @temp;      return @temp;
Line 808  sub disnew { Line 831  sub disnew {
        'do' => 'Domain'         'do' => 'Domain'
        );         );
     my @msgids = sort split(/\&/,&Apache::lonnet::reply      my @msgids = sort split(/\&/,&Apache::lonnet::reply
                             ('keys:'.$ENV{'user.domain'}.':'.                              ('keys:'.$env{'user.domain'}.':'.
                              $ENV{'user.name'}.':nohist_email',                               $env{'user.name'}.':nohist_email',
                              $ENV{'user.home'}));                               $env{'user.home'}));
     my @newmsgs;      my @newmsgs;
     my %setters = ();      my %setters = ();
     my $startblock = 0;      my $startblock = 0;
Line 820  sub disnew { Line 843  sub disnew {
     # Check for blocking of display because of scheduled online exams.      # Check for blocking of display because of scheduled online exams.
     &blockcheck(\%setters,\$startblock,\$endblock);      &blockcheck(\%setters,\$startblock,\$endblock);
     foreach (@msgids) {      foreach (@msgids) {
         my ($sendtime,$shortsubj,$fromname,$fromdom,$status)=          my ($sendtime,$shortsubj,$fromname,$fromdom,$status,$fromcid)=
     &Apache::lonmsg::unpackmsgid($_);      &Apache::lonmsg::unpackmsgid($_);
         if (defined($sendtime) && $sendtime!~/error/) {          if (defined($sendtime) && $sendtime!~/error/) {
             my $numsendtime = $sendtime;              my $numsendtime = $sendtime;
Line 857  ENDLINK Line 880  ENDLINK
             }              }
             $r->print("</td></tr>");              $r->print("</td></tr>");
         }          }
         $r->print('</table></body></html>');          $r->print('</table>'.&Apache::loncommon::endbodytag().'</html>');
     } elsif ($numblocked == 0) {      } elsif ($numblocked == 0) {
         $r->print("<h3>".&mt('You have no unread messages')."</h3>");          $r->print("<h3>".&mt('You have no unread messages')."</h3>");
     }      }
Line 942  ENDDISHEADER Line 965  ENDDISHEADER
     $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber));      $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber));
     $r->print('<form method="post" name="disall" action="/adm/email">'.      $r->print('<form method="post" name="disall" action="/adm/email">'.
       '<table 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>');
     } else {      } else {
  $r->print('<a href = "?sortedby=revdate'.$fsqs.'">'.&mt('Date').'</a></th>');   $r->print('<a href = "?sortedby=revdate'.$fsqs.'">'.&mt('Date').'</a></th>');
     }      }
     $r->print('<th>');      $r->print('<th>');
     if ($ENV{'form.sortedby'} eq "revuser") {      if ($env{'form.sortedby'} eq "revuser") {
  $r->print('<a href = "?sortedby=user'.$fsqs.'">'.&mt('Username').'</a>');   $r->print('<a href = "?sortedby=user'.$fsqs.'">'.&mt('Username').'</a>');
     } else {      } else {
  $r->print('<a href = "?sortedby=revuser'.$fsqs.'">'.&mt('Username').'</a>');   $r->print('<a href = "?sortedby=revuser'.$fsqs.'">'.&mt('Username').'</a>');
     }      }
     $r->print('</th><th>');      $r->print('</th><th>');
     if ($ENV{'form.sortedby'} eq "revdomain") {      if ($env{'form.sortedby'} eq "revdomain") {
  $r->print('<a href = "?sortedby=domain'.$fsqs.'">'.&mt('Domain').'</a>');   $r->print('<a href = "?sortedby=domain'.$fsqs.'">'.&mt('Domain').'</a>');
     } else {      } else {
  $r->print('<a href = "?sortedby=revdomain'.$fsqs.'">'.&mt('Domain').'</a>');   $r->print('<a href = "?sortedby=revdomain'.$fsqs.'">'.&mt('Domain').'</a>');
     }      }
     $r->print('</th><th>');      $r->print('</th><th>');
     if ($ENV{'form.sortedby'} eq "revsubject") {      if ($env{'form.sortedby'} eq "revsubject") {
  $r->print('<a href = "?sortedby=subject'.$fsqs.'">'.&mt('Subject').'</a>');   $r->print('<a href = "?sortedby=subject'.$fsqs.'">'.&mt('Subject').'</a>');
     } else {      } else {
     $r->print('<a href = "?sortedby=revsubject'.$fsqs.'">'.&mt('Subject').'</a>');      $r->print('<a href = "?sortedby=revsubject'.$fsqs.'">'.&mt('Subject').'</a>');
     }      }
     $r->print('</th><th>');      $r->print('</th><th>');
     if ($ENV{'form.sortedby'} eq "revstatus") {      if ($env{'form.sortedby'} eq "revstatus") {
  $r->print('<a href = "?sortedby=status'.$fsqs.'">'.&mt('Status').'</th>');   $r->print('<a href = "?sortedby=status'.$fsqs.'">'.&mt('Status').'</a></th>');
     } else {      } else {
       $r->print('<a href = "?sortedby=revstatus'.$fsqs.'">'.&mt('Status').'</th>');        $r->print('<a href = "?sortedby=revstatus'.$fsqs.'">'.&mt('Status').'</a></th>');
     }      }
     $r->print("</tr>\n");      $r->print("</tr>\n");
     for (my $n=$firstdis;$n<=$lastdis;$n++) {      for (my $n=$firstdis;$n<=$lastdis;$n++) {
Line 984  ENDDISHEADER Line 1007  ENDDISHEADER
     } else {      } else {
  $r->print('<tr bgcolor="#99BBBB">');   $r->print('<tr bgcolor="#99BBBB">');
     }      }
     $r->print('<td></a><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>'.
       ($folder ne 'trash'?'<a href="/adm/email?markdel='.$origID.$sqs.        ($folder ne 'trash'?'<a href="/adm/email?markdel='.$origID.$sqs.
       '">'.&mt('Delete'):'&nbsp').'</td>'.        '">'.&mt('Delete'):'&nbsp').'</a></td>'.
       '<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>'.
Line 1000  ENDDISHEADER Line 1023  ENDDISHEADER
     $r->print("</table>\n<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'}.'" />');
     if ($folder ne 'trash') {      if ($folder ne 'trash') {
  $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>');
Line 1013  ENDDISHEADER Line 1036  ENDDISHEADER
      ( map { $_ => $_ } @allfolders))       ( map { $_ => $_ } @allfolders))
       );        );
     my $postedstartdis=$startdis+1;      my $postedstartdis=$startdis+1;
     $r->print('<input type="hidden" name="folder" value="'.$folder.'" /><input type="hidden" name="startdis" value="'.$postedstartdis.'" /><input type="hidden" name="interdis" value="'.$ENV{'form.interdis'}.'" /></form>');      $r->print('<input type="hidden" name="folder" value="'.$folder.'" /><input type="hidden" name="startdis" value="'.$postedstartdis.'" /><input type="hidden" name="interdis" value="'.$env{'form.interdis'}.'" /></form>');
     if ($numblocked > 0) {      if ($numblocked > 0) {
         my $beginblock = &Apache::lonlocal::locallocaltime($startblock);          my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
         my $finishblock = &Apache::lonlocal::locallocaltime($endblock);          my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
Line 1026  ENDDISHEADER Line 1049  ENDDISHEADER
 # ============================================================== Compose output  # ============================================================== Compose output
   
 sub compout {  sub compout {
     my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder)=@_;      my ($r,$forwarding,$replying,$broadcast,$replycrit,$folder,$dismode)=@_;
     my $suffix=&foldersuffix($folder);      my $suffix=&foldersuffix($folder);
   
     if ($broadcast eq 'individual') {      if ($broadcast eq 'individual') {
Line 1067  sub compout { Line 1090  sub compout {
        'ca' => 'Cancel',         'ca' => 'Cancel',
        'ma' => 'Mail');         'ma' => 'Mail');
   
     if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {      if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})) {
  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 .    '<p><label><input type="checkbox" name="critmsg" /> '.&mt('Send as critical message').'</label> ' . $crithelp . 
  '<br>'.   '</p><p>'.
  '<input type="checkbox" name="sendbck" /> '.&mt('Send as critical message').'  ' .   '<label><input type="checkbox" name="sendbck" /> '.&mt('Send as critical message').'  ' .
  &mt('and return receipt') . $crithelp . '<p>';   &mt('and return receipt') . '</label>' . $crithelp . 
    '</p><p><label><input type="checkbox" name="permanent" /> '.
   &mt('Send copy to permanent email address (if known)').'</label></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'.$suffix,[$forwarding]);   %message=&Apache::lonnet::get('nohist_email'.$suffix,[$forwarding]);
  %content=&unpackagemsg($message{$forwarding},$folder);   %content=&unpackagemsg($message{$forwarding},$folder);
Line 1106  sub compout { Line 1131  sub compout {
  $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="'.&Apache::lonnet::escape($content{'baseurl'}).'" />';
     if ($ENV{'user.adv'}) {      if ($env{'user.adv'}) {
  $disbase.='<input type="checkbox" name="storebasecomment" />'.&mt('Store message for re-use').   $disbase.='<label><input type="checkbox" name="storebasecomment" />'.&mt('Store message for re-use').
     ' <a href="/adm/email?showcommentbaseurl='.      '</label> <a href="/adm/email?showcommentbaseurl='.
     &Apache::lonnet::escape($content{'baseurl'}).'" target="comments">'.      &Apache::lonnet::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);
     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"'.
                 ' enctype="multipart/form-data">'."\n".                  ' enctype="multipart/form-data">'."\n".
Line 1136  sub compout { Line 1161  sub compout {
     my $selectlink=&Apache::loncommon::selectstudent_link      my $selectlink=&Apache::loncommon::selectstudent_link
     ('compemail','recuname','recdomain');      ('compemail','recuname','recdomain');
     $r->print(<<"ENDREC");      $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{'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>  <tr><td>$lt{'do'}:</td>
 <td>$domform</td></tr>  <td>$domform</td></tr>
 ENDREC  ENDREC
Line 1151  ENDREC Line 1176  ENDREC
 <tr><td>$lt{'sb'}:</td><td><input type="text" size="50" name="subject" value="$dissub" />  <tr><td>$lt{'sb'}:</td><td><input type="text" size="50" name="subject" value="$dissub" />
 </td></tr></table>  </td></tr></table>
 $latexHelp  $latexHelp
 <textarea name="message" cols="80" rows="15" wrap="hard">$dismsg  <textarea name="message" id="message" cols="80" rows="15" wrap="hard">$dismsg
 </textarea></p><br />  </textarea></p><br />
 $dispcrit  $dispcrit
 $disbase  $disbase
   <input type="hidden" name="folder" value="$folder" />
   <input type="hidden" name="dismode" value="$dismode" />
 <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'}" /><hr />  <input type="submit" name="cancel" value="$lt{'ca'}" /><hr />
 $citation  $citation
Line 1168  ENDCOMP Line 1195  ENDCOMP
 Subject: <input type="text" size="50" name="subject" />  Subject: <input type="text" size="50" name="subject" />
 </p>  </p>
 <p>General message text<br />  <p>General message text<br />
 <textarea name="message" cols="60" rows="10" wrap="hard">$dismsg  <textarea name="message" id="message" cols="60" rows="10" wrap="hard">$dismsg
 </textarea></p>  </textarea></p>
 <p>  <p>
 The file format for the uploaded portion of the message is:  The file format for the uploaded portion of the message is:
Line 1190  ENDUPLOAD Line 1217  ENDUPLOAD
     if ($broadcast eq 'group') {      if ($broadcast eq 'group') {
        &discourse;         &discourse;
     }      }
     $r->print('</form>');      $r->print('</form>'.
         &Apache::lonhtmlcommon::htmlareaselectactive('message'));
 }  }
   
 # ---------------------------------------------------- Display all face to face  # ---------------------------------------------------- Display all face to face
   
 sub retrieve_instructor_comments {  sub retrieve_instructor_comments {
     my ($user,$domain)=@_;      my ($user,$domain)=@_;
     my $target=$ENV{'form.grade_target'};      my $target=$env{'form.grade_target'};
     if (! $ENV{'request.course.id'}) { return; }      if (! $env{'request.course.id'}) { return; }
     if (! &Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {      if (! &Apache::lonnet::allowed('srm',$env{'request.course.id'})) {
  return;   return;
     }      }
     my %records=&Apache::lonnet::dump('nohist_email',      my %records=&Apache::lonnet::dump('nohist_email',
  $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},   $env{'course.'.$env{'request.course.id'}.'.domain'},
  $ENV{'course.'.$ENV{'request.course.id'}.'.num'},   $env{'course.'.$env{'request.course.id'}.'.num'},
                          '%255b'.$user.'%253a'.$domain.'%255d');                           '%255b'.$user.'%253a'.$domain.'%255d');
     my $result='';      my $result='';
     foreach (sort(keys(%records))) {      foreach (sort(keys(%records))) {
         my %content=&unpackagemsg($records{$_});          my %content=&unpackagemsg($records{$_});
         next if ($content{'senderdomain'} eq '');          next if ($content{'senderdomain'} eq '');
         next if ($content{'subject'} !~ /^Record/);          next if ($content{'subject'} !~ /^Record/);
         # $content{'message'}=~s/\n/\<br\>/g;   # &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 1222  sub retrieve_instructor_comments { Line 1250  sub retrieve_instructor_comments {
   
 sub disfacetoface {  sub disfacetoface {
     my ($r,$user,$domain)=@_;      my ($r,$user,$domain)=@_;
     my $target=$ENV{'form.grade_target'};      my $target=$env{'form.grade_target'};
     unless ($ENV{'request.course.id'}) { return; }      unless ($env{'request.course.id'}) { return; }
     unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {      unless (&Apache::lonnet::allowed('srm',$env{'request.course.id'})) {
  return;   return;
     }      }
     my %records=&Apache::lonnet::dump('nohist_email',      my %records=&Apache::lonnet::dump('nohist_email',
  $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},   $env{'course.'.$env{'request.course.id'}.'.domain'},
  $ENV{'course.'.$ENV{'request.course.id'}.'.num'},   $env{'course.'.$env{'request.course.id'}.'.num'},
                          '%255b'.$user.'%253a'.$domain.'%255d');                           '%255b'.$user.'%253a'.$domain.'%255d');
     my $result='';      my $result='';
     foreach (sort keys %records) {      foreach (sort keys %records) {
         my %content=&unpackagemsg($records{$_});          my %content=&unpackagemsg($records{$_});
         next if ($content{'senderdomain'} eq '');          next if ($content{'senderdomain'} eq '');
         $content{'message'}=~s/\n/\<br\>/g;   &Apache::lonfeedback::newline_to_br(\$content{'message'});
         if ($content{'subject'}=~/^Record/) {          if ($content{'subject'}=~/^Record/) {
     $result.='<h3>'.&mt('Record').'</h3>';      $result.='<h3>'.&mt('Record').'</h3>';
         } elsif ($content{'subject'}=~/^Broadcast/) {          } elsif ($content{'subject'}=~/^Broadcast/) {
Line 1272  $content{'sendername'}.'@'. Line 1300  $content{'sendername'}.'@'.
   
 sub facetoface {  sub facetoface {
     my ($r,$stage)=@_;      my ($r,$stage)=@_;
     unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {      unless (&Apache::lonnet::allowed('srm',$env{'request.course.id'})) {
  return;   return;
     }      }
     &printheader($r,      &printheader($r,
Line 1280  sub facetoface { Line 1308  sub facetoface {
  "User Notes, Face-to-Face, Critical Messages, Broadcast Messages");   "User Notes, Face-to-Face, Critical Messages, Broadcast Messages");
 # from query string  # from query string
   
     if ($ENV{'form.recname'}) { $ENV{'form.recuname'}=$ENV{'form.recname'}; }      if ($env{'form.recname'}) { $env{'form.recuname'}=$env{'form.recname'}; }
     if ($ENV{'form.recdom'}) { $ENV{'form.recdomain'}=$ENV{'form.recdom'}; }      if ($env{'form.recdom'}) { $env{'form.recdomain'}=$env{'form.recdom'}; }
   
     my $defdom=$ENV{'user.domain'};      my $defdom=$env{'user.domain'};
 # already filled in  # already filled in
     if ($ENV{'form.recdomain'}) { $defdom=$ENV{'form.recdomain'}; }      if ($env{'form.recdomain'}) { $defdom=$env{'form.recdomain'}; }
 # generate output  # generate output
     my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain');      my $domform = &Apache::loncommon::select_dom_form($defdom,'recdomain');
     my $stdbrws = &Apache::loncommon::selectstudent_link      my $stdbrws = &Apache::loncommon::selectstudent_link
Line 1301  sub facetoface { Line 1329  sub facetoface {
 <form method="post" action="/adm/email" name="stdselect">  <form method="post" action="/adm/email" name="stdselect">
 <input type="hidden" name="recordftf" value="retrieve" />  <input type="hidden" name="recordftf" value="retrieve" />
 <table>  <table>
 <tr><td>$lt{'user'}:</td><td><input type="text" size="12" name="recuname" value="$ENV{'form.recuname'}" /></td>  <tr><td>$lt{'user'}:</td><td><input type="text" size="12" name="recuname" value="$env{'form.recuname'}" /></td>
 <td rowspan="2">  <td rowspan="2">
 $stdbrws  $stdbrws
 <input type="submit" value="$lt{'subm'}" /></td>  <input type="submit" value="$lt{'subm'}" /></td>
Line 1312  $stdbrws Line 1340  $stdbrws
 </form>  </form>
 ENDTREC  ENDTREC
     if (($stage ne 'query') &&      if (($stage ne 'query') &&
         ($ENV{'form.recdomain'}) && ($ENV{'form.recuname'})) {          ($env{'form.recdomain'}) && ($env{'form.recuname'})) {
         chomp($ENV{'form.newrecord'});          chomp($env{'form.newrecord'});
         if ($ENV{'form.newrecord'}) {          if ($env{'form.newrecord'}) {
            &user_normal_msg_raw(             &user_normal_msg_raw(
             $ENV{'course.'.$ENV{'request.course.id'}.'.num'},              $env{'course.'.$env{'request.course.id'}.'.num'},
             $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},              $env{'course.'.$env{'request.course.id'}.'.domain'},
             &mt('Record').              &mt('Record').
      ' ['.$ENV{'form.recuname'}.':'.$ENV{'form.recdomain'}.']',       ' ['.$env{'form.recuname'}.':'.$env{'form.recdomain'}.']',
     $ENV{'form.newrecord'});      $env{'form.newrecord'});
         }          }
         $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>');
         &disfacetoface($r,$ENV{'form.recuname'},$ENV{'form.recdomain'});          &disfacetoface($r,$env{'form.recuname'},$env{'form.recdomain'});
  $r->print(<<ENDRHEAD);   $r->print(<<ENDRHEAD);
 <form method="post" action="/adm/email">  <form method="post" action="/adm/email">
 <input name="recdomain" value="$ENV{'form.recdomain'}" type="hidden" />  <input name="recdomain" value="$env{'form.recdomain'}" type="hidden" />
 <input name="recuname" value="$ENV{'form.recuname'}" type="hidden" />  <input name="recuname" value="$env{'form.recuname'}" type="hidden" />
 ENDRHEAD  ENDRHEAD
         $r->print(<<ENDBFORM);          $r->print(<<ENDBFORM);
 <hr />$lt{'newr'}<br />  <hr />$lt{'newr'}<br />
Line 1345  ENDBFORM Line 1373  ENDBFORM
   
 sub examblock {  sub examblock {
     my ($r,$action) = @_;      my ($r,$action) = @_;
     unless ($ENV{'request.course.id'}) { return;}      unless ($env{'request.course.id'}) { return;}
     unless (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) { $r->print('Not allowed'); }      unless (&Apache::lonnet::allowed('srm',$env{'request.course.id'})) { $r->print('Not allowed'); }
     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',
Line 1386  sub examblock { Line 1414  sub examblock {
         $r->print($lt{'ncbc'}.'<br /><br />');          $r->print($lt{'ncbc'}.'<br /><br />');
     }      }
     &display_addblocker_table($r,$parmcount,\%ltext);      &display_addblocker_table($r,$parmcount,\%ltext);
       my $endbody=&Apache::loncommon::endbodytag();
     $r->print(<<"END");      $r->print(<<"END");
 <br />  <br />
 <input type="hidden" name="blocktotal" value="$blockcount" />  <input type="hidden" name="blocktotal" value="$blockcount" />
 <input type ="submit" value="Save Changes" />  <input type ="submit" value="Save Changes" />
 </form>  </form>
 </body>  $endbody
 </html>  </html>
 END  END
     return;      return;
Line 1415  sub blockstore { Line 1444  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 (keys %env) {
         if ($_ =~ m/^form\.modify_(\w+)$/) {          if ($_ =~ m/^form\.modify_(\w+)$/) {
             $adds{$1} = $1;              $adds{$1} = $1;
             $removals{$1} = $1;              $removals{$1} = $1;
Line 1433  sub blockstore { Line 1462  sub blockstore {
     }      }
   
     foreach (keys %removals) {      foreach (keys %removals) {
         my $hashkey = $ENV{'form.key_'.$_};          my $hashkey = $env{'form.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 (keys %adds) {
         unless ( defined($cancels{$_}) ) {          unless ( defined($cancels{$_}) ) {
             my ($newstart,$newend) = &get_dates_from_form($_);              my ($newstart,$newend) = &get_dates_from_form($_);
             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_'.$_};
         }          }
     }      }
     if ($addtotal + $modtotal > 0) {      if ($addtotal + $modtotal > 0) {
         &Apache::lonnet::put('comm_block',\%blocking,          &Apache::lonnet::put('comm_block',\%blocking,
                      $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'}
                      );                       );
     }      }
     my $chgestotal = $canceltotal + $modtotal + $addtotal;      my $chgestotal = $canceltotal + $modtotal + $addtotal;
Line 1483  sub get_blockdates { Line 1512  sub get_blockdates {
     my ($records,$blockcount) = @_;      my ($records,$blockcount) = @_;
     $$blockcount = 0;      $$blockcount = 0;
     %{$records} = &Apache::lonnet::dump('comm_block',      %{$records} = &Apache::lonnet::dump('comm_block',
                          $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};
                                                                                                                                                                                                                             
Line 1502  sub display_blocker_status { Line 1531  sub display_blocker_status {
     my @bgcols = ("#eeeeee","#dddddd");      my @bgcols = ("#eeeeee","#dddddd");
     my $function = &Apache::loncommon::get_users_function();      my $function = &Apache::loncommon::get_users_function();
     my $color = &Apache::loncommon::designparm($function.'.tabbg',      my $color = &Apache::loncommon::designparm($function.'.tabbg',
                                                     $ENV{'user.domain'});                                                      $env{'user.domain'});
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         'modi' => 'Modify',          'modi' => 'Modify',
         'canc' => 'Cancel',          'canc' => 'Cancel',
Line 1537  END Line 1566  END
        <tr bgcolor="$bgcols[$iter]">         <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="$_" /></td>
         <td>$lt{'modi'}?&nbsp;<input type="checkbox" name="modify_$parmcount"/><br />$lt{'canc'}?&nbsp;&nbsp;<input type="checkbox" name="cancel_$parmcount"/>          <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>         </tr>
 END  END
         $parmcount ++;          $parmcount ++;
Line 1568  sub display_addblocker_table { Line 1597  sub display_addblocker_table {
     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 $function = &Apache::loncommon::get_users_function();
     my $color = &Apache::loncommon::designparm($function.'.tabbg',      my $color = &Apache::loncommon::designparm($function.'.tabbg',
                                                     $ENV{'user.domain'});                                                      $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 1590  sub display_addblocker_table { Line 1619  sub display_addblocker_table {
        </tr>         </tr>
        <tr bgcolor="#eeeeee">         <tr bgcolor="#eeeeee">
         <td>$$ltext{'star'}:&nbsp;$startform<br />$$ltext{'endd'}:&nbsp;&nbsp;$endform</td>          <td>$$ltext{'star'}:&nbsp;$startform<br />$$ltext{'endd'}:&nbsp;&nbsp;$endform</td>
         <td><input type="text" name="title_$parmcount" size="15" value=""/></td>          <td><input type="text" name="title_$parmcount" size="15" value="" /></td>
         <td>$lt{'addb'}?&nbsp;<input type="checkbox" name="add_$parmcount" value="1"/></td>          <td><label>$lt{'addb'}?&nbsp;<input type="checkbox" name="add_$parmcount" value="1" /></label></td>
        </tr>         </tr>
       </table>        </table>
      </td>       </td>
Line 1611  sub blockcheck { Line 1640  sub blockcheck {
     my @staffcses = ();      my @staffcses = ();
     $$startblock = 0;      $$startblock = 0;
     $$endblock = 0;      $$endblock = 0;
     foreach (keys %ENV) {      foreach (keys %env) {
         if ($_ =~ m-^user\.role\.(st|cc|in)\./(.+)$-) {          if ($_ =~ m-^user\.role\.(st|cc|in)\./(.+)$-) {
             my $role = $1;              my $role = $1;
             my $cse = $2;              my $cse = $2;
             $cse =~ s|/|_|;              $cse =~ s|/|_|;
             if ($ENV{$_} =~ m/^(\d*)\.(\d*)$/) {              if ($env{$_} =~ m/^(\d*)\.(\d*)$/) {
                 unless (($2 > 0 && $2 < time) || ($1 > time)) {                  unless (($2 > 0 && $2 < time) || ($1 > time)) {
                     if ($role eq 'st') {                      if ($role eq 'st') {
                         push @livecses, $cse;                          push @livecses, $cse;
Line 1628  sub blockcheck { Line 1657  sub blockcheck {
                 }                  }
             }              }
         } elsif ($_ =~ m-user\.role\.cr/(\w+)/(\w+)/([^/]+)\./(.+)$- ) {           } elsif ($_ =~ m-user\.role\.cr/(\w+)/(\w+)/([^/]+)\./(.+)$- ) { 
             my $rolepriv = $ENV{'user.role..rolesdef_'.$3};              my $rolepriv = $env{'user.role..rolesdef_'.$3};
         }          }
     }      }
     # Retrieve blocking times and identity of blocker for active courses for students.      # Retrieve blocking times and identity of blocker for active courses for students.
     if (@livecses > 0) {      if (@livecses > 0) {
         foreach my $cse (@livecses) {          foreach my $cse (@livecses) {
             my ($cdom,$crs) = split/_/,$cse;              my ($cdom,$crs) = split/_/,$cse;
             if ( (grep/^$cse$/,@staffcses) && ($ENV{'request.role'} !~ m-^st\./$cdom/$crs$-) ) {              if ( (grep/^$cse$/,@staffcses) && ($env{'request.role'} !~ m-^st\./$cdom/$crs$-) ) {
                 next;                  next;
             } else {              } else {
                 %{$$setters{$cse}} = ();                  %{$$setters{$cse}} = ();
Line 1666  sub build_block_table { Line 1695  sub build_block_table {
     my ($r,$startblock,$endblock,$setters) = @_;      my ($r,$startblock,$endblock,$setters) = @_;
     my $function = &Apache::loncommon::get_users_function();      my $function = &Apache::loncommon::get_users_function();
     my $color = &Apache::loncommon::designparm($function.'.tabbg',      my $color = &Apache::loncommon::designparm($function.'.tabbg',
                                                     $ENV{'user.domain'});                                                      $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',
Line 1751  sub displaymessage { Line 1780  sub displaymessage {
       '<td><a href="/adm/email?markunread='.&Apache::lonnet::escape($msgid).$sqs.        '<td><a href="/adm/email?markunread='.&Apache::lonnet::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='.&Apache::lonnet::escape($msgid).$sqs.
       '"><b>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':'').
       '"><b>'.&mt('Back to Folder Display').'</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.
Line 1764  sub displaymessage { Line 1793  sub displaymessage {
   '"><b>'.&mt('Next').'</b></a></td>');    '"><b>'.&mt('Next').'</b></a></td>');
     }      }
     $r->print('</tr></table>');      $r->print('</tr></table>');
       if ($env{'user.adv'}) {
    $r->print('<table border="2" width="100%"><tr bgcolor="#FFAAAA"><td>'.&mt('Currently available actions (will open extra window)').':</td>');
    my $symb=&Apache::lonnet::symbread($content{'baseurl'});      
    if (&Apache::lonnet::allowed('vgr',$env{'request.course.id'})) {
    $r->print('<td><b>'.&Apache::loncommon::track_student_link(&mt('View recent activity'),$content{'sendername'},$content{'senderdomain'},'check').'</b></td>');
       }
    if (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) && $symb) {
       $r->print('<td><b>'.&Apache::loncommon::pprmlink(&mt('Set/Change parameters'),$content{'sendername'},$content{'senderdomain'},$symb,'check').'</b></td>');
    }
    if (&Apache::lonnet::allowed('mgr',$env{'request.course.id'}) && $symb) {
       $r->print('<td><b>'.&Apache::loncommon::pgrdlink(&mt('Set/Change grades'),$content{'sendername'},$content{'senderdomain'},$symb,'check').'</b></td>');
    }
    $r->print('</tr></table>');
       }
     $r->print('<br /><b>'.&mt('Subject').':</b> '.$content{'subject'}.      $r->print('<br /><b>'.&mt('Subject').':</b> '.$content{'subject'}.
       ($folder ne 'sent'?'<br /><b>'.&mt('From').':</b> '.        ($folder ne 'sent'?'<br /><b>'.&mt('From').':</b> '.
       &Apache::loncommon::aboutmewrapper(        &Apache::loncommon::aboutmewrapper(
Line 1795  sub displayresource { Line 1838  sub displayresource {
 # If the recipient is in the same course that the message was sent from and  # If the recipient is in the same course that the message was sent from and
 # has sufficient privileges, show "all details," else show citation  # has sufficient privileges, show "all details," else show citation
 #  #
     if (($ENV{'request.course.id'} eq $content{'courseid'})      if (($env{'request.course.id'} eq $content{'courseid'})
      && (&Apache::lonnet::allowed('vgr',$content{'courseid'}))) {       && (&Apache::lonnet::allowed('vgr',$content{'courseid'}))) {
  my $symb=&Apache::lonnet::symbread($content{'baseurl'});   my $symb=&Apache::lonnet::symbread($content{'baseurl'});
 # Could not get a symb, give up  # Could not get a symb, give up
Line 1825  sub displayresource { Line 1868  sub displayresource {
   
 sub header {  sub header {
     my ($r,$title,$baseurl)=@_;      my ($r,$title,$baseurl)=@_;
     $r->print('<html><head><title>Communication and Messages</title>');      $r->print(&Apache::lonxml::xmlbegin().
         '<head>'.&Apache::lonxml::fontsettings().
         '<title>Communication and Messages</title>'.
         &Apache::lonhtmlcommon::htmlareaheaders());
     if ($baseurl) {      if ($baseurl) {
  $r->print("<base href=\"http://$ENV{'SERVER_NAME'}/$baseurl\" />");   $r->print("<base href=\"http://$ENV{'SERVER_NAME'}/$baseurl\" />");
     }      }
Line 1850  sub printheader { Line 1896  sub printheader {
   
 sub storecomment {  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 (split(/[\n\r]/,$msgtxt)) {
  unless ($_=~/^\s*(\>|\&gt\;)/) {   unless ($_=~/^\s*(\>|\&gt\;)/) {
     $cleanmsgtxt.=$_."\n";      $cleanmsgtxt.=$_."\n";
  }   }
     }      }
     my $key=&Apache::lonnet::escape($ENV{'form.baseurl'}).'___'.time;      my $key=&Apache::lonnet::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'})));         '^'.&Apache::lonnet::escape(&Apache::lonnet::escape($env{'form.showcommentbaseurl'})));
     $r->print('<html><body>');      $r->print(&Apache::lonxml::xmlbegin().'<head>'.
         &Apache::lonxml::fontsettings().'</head><body>');
     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 {
Line 1886  sub sendoffmail { Line 1933  sub sendoffmail {
     my ($r,$folder)=@_;      my ($r,$folder)=@_;
     my $suffix=&foldersuffix($folder);      my $suffix=&foldersuffix($folder);
     my $sendstatus='';      my $sendstatus='';
     if ($ENV{'form.send'}) {      if ($env{'form.send'}) {
  &printheader($r,'','Messages being sent.');   &printheader($r,'','Messages being sent.');
  $r->rflush();   $r->rflush();
  my %content=();   my %content=();
  undef %content;   undef %content;
  if ($ENV{'form.forwid'}) {   if ($env{'form.forwid'}) {
     my $msgid=$ENV{'form.forwid'};      my $msgid=$env{'form.forwid'};
     my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);      my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);
     %content=&unpackagemsg($message{$msgid},1);      %content=&unpackagemsg($message{$msgid},1);
     &statuschange($msgid,'forwarded',$folder);      &statuschange($msgid,'forwarded',$folder);
     $ENV{'form.message'}.="\n\n-- Forwarded message --\n\n".      $env{'form.message'}.="\n\n-- Forwarded message --\n\n".
  $content{'message'};   $content{'message'};
  }   }
  if ($ENV{'form.replyid'}) {   if ($env{'form.replyid'}) {
     my $msgid=$ENV{'form.replyid'};      my $msgid=$env{'form.replyid'};
     my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);      my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);
     %content=&unpackagemsg($message{$msgid},1);      %content=&unpackagemsg($message{$msgid},1);
     &statuschange($msgid,'replied',$folder);      &statuschange($msgid,'replied',$folder);
  }   }
  my %toaddr=();   my %toaddr=();
  undef %toaddr;   undef %toaddr;
  if ($ENV{'form.sendmode'} eq 'group') {   if ($env{'form.sendmode'} eq 'group') {
     foreach (keys %ENV) {      foreach (keys %env) {
  if ($_=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {   if ($_=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {
     $toaddr{$1}='';      $toaddr{$1}='';
  }   }
     }      }
  } elsif ($ENV{'form.sendmode'} eq 'upload') {   } elsif ($env{'form.sendmode'} eq 'upload') {
     foreach (split(/[\n\r\f]+/,$ENV{'form.upfile'})) {      foreach (split(/[\n\r\f]+/,$env{'form.upfile'})) {
  my ($rec,$txt)=split(/\s*\:\s*/,$_);   my ($rec,$txt)=split(/\s*\:\s*/,$_);
  if ($txt) {   if ($txt) {
     $rec=~s/\@/\:/;      $rec=~s/\@/\:/;
Line 1922  sub sendoffmail { Line 1969  sub sendoffmail {
  }   }
     }      }
  } else {   } else {
     $toaddr{$ENV{'form.recuname'}.':'.$ENV{'form.recdomain'}}='';      $toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
  }   }
  if ($ENV{'form.additionalrec'}) {   if ($env{'form.additionalrec'}) {
     foreach (split(/\,/,$ENV{'form.additionalrec'})) {      foreach (split(/\,/,$env{'form.additionalrec'})) {
  my ($auname,$audom)=split(/\@/,$_);   my ($auname,$audom)=split(/\@/,$_);
  $toaddr{$auname.':'.$audom}='';   $toaddr{$auname.':'.$audom}='';
     }      }
Line 1934  sub sendoffmail { Line 1981  sub sendoffmail {
  foreach (keys %toaddr) {   foreach (keys %toaddr) {
     my ($recuname,$recdomain)=split(/\:/,$_);      my ($recuname,$recdomain)=split(/\:/,$_);
             my $msgtxt;              my $msgtxt;
             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'}))) {
                 $msgtxt=&Apache::lonfeedback::clear_out_html($ENV{'form.message'},1);                  $msgtxt=&Apache::lonfeedback::clear_out_html($env{'form.message'},1);
             } else {                } else {  
         $msgtxt=&Apache::lonfeedback::clear_out_html($ENV{'form.message'});          $msgtxt=&Apache::lonfeedback::clear_out_html($env{'form.message'});
             }              }
     if ($toaddr{$_}) { $msgtxt.='<hr />'.$toaddr{$_}; }      if ($toaddr{$_}) { $msgtxt.='<hr />'.$toaddr{$_}; }
     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'}))) {
  $r->print(&mt('Sending critical message').' '.$recuname.'@'.$recdomain.': ');   $r->print(&mt('Sending critical message').' '.$recuname.'@'.$recdomain.': ');
  $thismsg=&user_crit_msg($recuname,$recdomain,   $thismsg=&user_crit_msg($recuname,$recdomain,
  &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),   &Apache::lonfeedback::clear_out_html($env{'form.subject'}),
  $msgtxt,   $msgtxt,
  $ENV{'form.sendbck'});   $env{'form.sendbck'},$env{'form.permanent'});
     } else {      } else {
  $r->print(&mt('Sending').' '.$recuname.'@'.$recdomain.': ');   $r->print(&mt('Sending').' '.$recuname.'@'.$recdomain.': ');
  $thismsg=&user_normal_msg($recuname,$recdomain,   $thismsg=&user_normal_msg($recuname,$recdomain,
   &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),    &Apache::lonfeedback::clear_out_html($env{'form.subject'}),
   $msgtxt,    $msgtxt,
   $content{'citation'});    $content{'citation'},undef,undef,$env{'form.permanent'});
  if (($ENV{'request.course.id'}) && ($ENV{'form.sendmode'} eq 'group')) {   if (($env{'request.course.id'}) && ($env{'form.sendmode'} eq 'group')) {
     &user_normal_msg_raw(      &user_normal_msg_raw(
  $ENV{'course.'.$ENV{'request.course.id'}.'.num'},   $env{'course.'.$env{'request.course.id'}.'.num'},
  $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},   $env{'course.'.$env{'request.course.id'}.'.domain'},
  'Broadcast ['.$recuname.':'.$recdomain.']',   'Broadcast ['.$recuname.':'.$recdomain.']',
  $msgtxt);   $msgtxt);
  }   }
Line 1971  sub sendoffmail { Line 2018  sub sendoffmail {
     }      }
     if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) {      if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) {
  $r->print('<br /><font color="green">'.&mt('Completed.').'</font>');   $r->print('<br /><font color="green">'.&mt('Completed.').'</font>');
  if ($ENV{'form.displayedcrit'}) {   if ($env{'form.displayedcrit'}) {
     &discrit($r);      &discrit($r);
  } else {   } else {
     &Apache::loncommunicate::menu($r);      &Apache::loncommunicate::menu($r);
Line 2002  sub handler { Line 2049  sub handler {
          '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']);
     $sqs='&sortedby='.$ENV{'form.sortedby'};      $sqs='&sortedby='.$env{'form.sortedby'};
   
 # ------------------------------------------------------ They checked for email  # ------------------------------------------------------ They checked for email
     unless ($ENV{'form.block'}) {      unless ($env{'form.block'}) {
         &Apache::lonnet::put('email_status',{'recnewemail'=>0});          &Apache::lonnet::put('email_status',{'recnewemail'=>0});
     }      }
   
Line 2019  sub handler { Line 2066  sub handler {
   
 # ------------------------------------------------------------------ Get Folder  # ------------------------------------------------------------------ Get Folder
   
     my $folder=$ENV{'form.folder'};      my $folder=$env{'form.folder'};
     unless ($folder) {       unless ($folder) { 
  $folder='';    $folder=''; 
     } else {      } else {
  $sqs.='&folder='.&Apache::lonnet::escape($folder);   $sqs.='&folder='.&Apache::lonnet::escape($folder);
     }      }
   # ------------------------------------------------------------ Get Display Mode
   
       my $dismode=$env{'form.dismode'};
       unless ($dismode) { 
    $dismode=''; 
       } else {
    $sqs.='&dismode='.&Apache::lonnet::escape($dismode);
       }
   
 # --------------------------------------------------------------------- Display  # --------------------------------------------------------------------- Display
   
     $startdis=$ENV{'form.startdis'};      $startdis=$env{'form.startdis'};
     $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;      $sqs.='&interdis='.$interdis;
   
     if ($ENV{'form.firstview'}) {      if ($env{'form.firstview'}) {
  $startdis=0;   $startdis=0;
     }      }
     if ($ENV{'form.lastview'}) {      if ($env{'form.lastview'}) {
  $startdis=-1;   $startdis=-1;
     }      }
     if ($ENV{'form.prevview'}) {      if ($env{'form.prevview'}) {
  $startdis--;   $startdis--;
     }      }
     if ($ENV{'form.nextview'}) {      if ($env{'form.nextview'}) {
  $startdis++;   $startdis++;
     }      }
     my $postedstartdis=$startdis+1;      my $postedstartdis=$startdis+1;
Line 2053  sub handler { Line 2108  sub handler {
   
 # --------------------------------------------------------------- Render Output  # --------------------------------------------------------------- Render Output
   
     if ($ENV{'form.display'}) {      if ($env{'form.display'}) {
  &displaymessage($r,$ENV{'form.display'},$folder);   &displaymessage($r,$env{'form.display'},$folder);
     } elsif ($ENV{'form.replyto'}) {      } elsif ($env{'form.replyto'}) {
  &compout($r,'',$ENV{'form.replyto'},undef,undef,$folder);   &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) {   foreach (keys %env) {
     if ($_=~/^form\.rec\_(.*)$/) {      if ($_=~/^form\.rec\_(.*)$/) {
  $r->print('<b>'.&mt('Confirming Receipt').':</b> '.   $r->print('<b>'.&mt('Confirming Receipt').':</b> '.
   &user_crit_received($1).'<br>');    &user_crit_received($1).'<br>');
Line 2072  sub handler { Line 2127  sub handler {
     }      }
  }   }
  &discrit($r);   &discrit($r);
     } elsif ($ENV{'form.critical'}) {      } elsif ($env{'form.critical'}) {
  &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'},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);   &statuschange($env{'form.markdel'},'deleted',$folder);
  &Apache::loncommunicate::menu($r);   &Apache::loncommunicate::menu($r);
  &disall($r,$folder);   &disall($r,($folder?$folder:$dismode));
     } elsif ($ENV{'form.markedmove'}) {      } elsif ($env{'form.markedmove'}) {
  my $total=0;   my $total=0;
  foreach (keys %ENV) {   foreach (keys %env) {
     if ($_=~/^form\.delmark_(.*)$/) {      if ($_=~/^form\.delmark_(.*)$/) {
  &movemsg(&Apache::lonnet::unescape($1),$folder,   &movemsg(&Apache::lonnet::unescape($1),$folder,
  $ENV{'form.movetofolder'});   $env{'form.movetofolder'});
  $total++;   $total++;
     }      }
  }   }
  &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);   &Apache::loncommunicate::menu($r);
  &disall($r,$folder);   &disall($r,($folder?$folder:$dismode));
     } elsif ($ENV{'form.markeddel'}) {      } elsif ($env{'form.markeddel'}) {
  my $total=0;   my $total=0;
  foreach (keys %ENV) {   foreach (keys %env) {
     if ($_=~/^form\.delmark_(.*)$/) {      if ($_=~/^form\.delmark_(.*)$/) {
  &statuschange(&Apache::lonnet::unescape($1),'deleted',$folder);   &statuschange(&Apache::lonnet::unescape($1),'deleted',$folder);
  $total++;   $total++;
Line 2106  sub handler { Line 2161  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);   &Apache::loncommunicate::menu($r);
  &disall($r,$folder);   &disall($r,($folder?$folder:$dismode));
     } 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);   &Apache::loncommunicate::menu($r);
  &disall($r,$folder);   &disall($r,($folder?$folder:$dismode));
     } elsif ($ENV{'form.compose'}) {      } elsif ($env{'form.compose'}) {
  &compout($r,'','',$ENV{'form.compose'});   &compout($r,'','',$env{'form.compose'});
     } elsif ($ENV{'form.recordftf'}) {      } elsif ($env{'form.recordftf'}) {
  &facetoface($r,$ENV{'form.recordftf'});   &facetoface($r,$env{'form.recordftf'});
     } elsif ($ENV{'form.block'}) {      } elsif ($env{'form.block'}) {
         &examblock($r,$ENV{'form.block'});          &examblock($r,$env{'form.block'});
     } elsif ($ENV{'form.sendmail'}) {      } elsif ($env{'form.sendmail'}) {
  &sendoffmail($r,$folder);   &sendoffmail($r,$folder);
  if ($ENV{'form.storebasecomment'}) {   if ($env{'form.storebasecomment'}) {
     &storecomment($r);      &storecomment($r);
  }   }
  &disall($r,$folder);   &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'});
  &Apache::loncommunicate::menu($r);   &Apache::loncommunicate::menu($r);
  &disall($r,$ENV{'form.newfolder'});   &disall($r,$env{'form.newfolder'});
     } elsif ($ENV{'form.showcommentbaseurl'}) {      } elsif ($env{'form.showcommentbaseurl'}) {
  &storedcommentlisting($r);   &storedcommentlisting($r);
     } else {      } else {
  &printheader($r,'','Display All Messages');   &printheader($r,'','Display All Messages');
  &Apache::loncommunicate::menu($r);   &Apache::loncommunicate::menu($r); 
  &disall($r,$folder);   &disall($r,($folder?$folder:$dismode));
     }      }
     $r->print('</body></html>');      $r->print(&Apache::loncommon::endbodytag().'</html>');
     return OK;      return OK;
 }  }
 # ================================================= Main program, reset counter  # ================================================= Main program, reset counter

Removed from v.1.131  
changed lines
  Added in v.1.151


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