Diff for /loncom/interface/lonmsg.pm between versions 1.114 and 1.140

version 1.114, 2004/11/11 20:41:53 version 1.140, 2005/04/07 06:56:23
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>'.      my $result='<sendername>'.$env{'user.name'}.'</sendername>'.
            '<senderdomain>'.$ENV{'user.domain'}.'</senderdomain>'.             '<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 226  sub sendemail { Line 226  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)=@_;      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 252  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);
 }  }
 # ============================================================= 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 346  sub all_url_author_res_msg { Line 352  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 359  sub user_crit_msg_raw { Line 366  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 370  sub user_crit_msg_raw { Line 377  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(
       '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 397  sub user_crit_msg_raw { Line 410  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 420  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 423  sub user_crit_received { Line 436  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 434  sub user_crit_received { Line 447  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 444  sub user_crit_received { Line 457  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 463  sub user_normal_msg_raw { Line 478  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);
     }      }
     &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 493  sub user_normal_msg_raw { Line 514  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 525  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 527  sub folderlist { Line 549  sub folderlist {
                               'critical' => &mt('Critical'),                                '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 />'.
       ($folder!~/^(new|critical)/?      '<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 />'.
     '</form>';     &mt('Messages [_1] through [_2] of [_3]',$first,$finish,$total).'</form>';
 }  }
   
 # =============================================================== Folder suffix  # =============================================================== Folder suffix
Line 580  sub makefolder { Line 612  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 589  sub movemsg { Line 620  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 607  sub discourse { Line 635  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 643  sub discourse { Line 671  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 661  ENDDISHEADER Line 689  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 669  ENDDISHEADER Line 705  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');
         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 684  ENDDISHEADER Line 720  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) {
         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').'" />'.
             '<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 742  sub sortedmessages { Line 777  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 789  sub disnew { Line 824  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 831  TABLEHEAD Line 866  TABLEHEAD
         foreach my $msg (@newmsgs) {          foreach my $msg (@newmsgs) {
             $r->print(<<"ENDLINK");              $r->print(<<"ENDLINK");
 <tr bgcolor="#FFBB77">  <tr bgcolor="#FFBB77">
 <td><a href="/adm/email?display=$msg->{'msgid'}">$lt{'op'}</a></td>  <td><a href="/adm/email?dismode=new&display=$msg->{'msgid'}">$lt{'op'}</a></td>
 ENDLINK  ENDLINK
             foreach ('sendtime','from','fromdom','shortsub') {              foreach ('sendtime','from','fromdom','shortsub') {
                 $r->print("<td>$msg->{$_}</td>");                  $r->print("<td>$msg->{$_}</td>");
             }              }
             $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 907  ENDDISHEADER Line 942  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(&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>');      $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 956  ENDDISHEADER Line 1000  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>'.
                       $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'}.'" />');
     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>');
     }      }
 $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 998  $r->print('<p><input type="submit" name= Line 1043  $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 1028  sub compout { Line 1074  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 1036  sub compout { Line 1083  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',[$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 1057  sub compout { Line 1106  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 1070  sub compout { Line 1122  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.='<label><input type="checkbox" name="storebasecomment" />'.&mt('Store message for re-use').
       '</label> <a href="/adm/email?showcommentbaseurl='.
       &Apache::lonnet::escape($content{'baseurl'}).'" target="comments">'.
       &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 1093  sub compout { Line 1154  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 1111  $latexHelp Line 1172  $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'}" /><hr />  <input type="submit" name="cancel" value="$lt{'ca'}" /><hr />
 $citation  $citation
Line 1153  ENDUPLOAD Line 1215  ENDUPLOAD
   
 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))) {
Line 1178  sub retrieve_instructor_comments { Line 1240  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) {
Line 1208  sub disfacetoface { Line 1270  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 1228  $content{'sendername'}.'@'. Line 1290  $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 1236  sub facetoface { Line 1298  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 1257  sub facetoface { Line 1319  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 1268  $stdbrws Line 1330  $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 1301  ENDBFORM Line 1363  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 1342  sub examblock { Line 1404  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 1371  sub blockstore { Line 1434  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 1389  sub blockstore { Line 1452  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 1439  sub get_blockdates { Line 1502  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 1458  sub display_blocker_status { Line 1521  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 1493  END Line 1556  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 1524  sub display_addblocker_table { Line 1587  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 1546  sub display_addblocker_table { Line 1609  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 1567  sub blockcheck { Line 1630  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 1584  sub blockcheck { Line 1647  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 1622  sub build_block_table { Line 1685  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 1708  sub displaymessage { Line 1771  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 1735  sub displaymessage { Line 1798  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 />'.&displayresource(%content).'</p>');        '</pre><hr />'.&displayresource(%content).'</p>');
Line 1749  sub displayresource { Line 1814  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 1779  sub displayresource { Line 1844  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>');
     if ($baseurl) {      if ($baseurl) {
  $r->print("<base href=\"http://$ENV{'SERVER_NAME'}/$baseurl\" />");   $r->print("<base href=\"http://$ENV{'SERVER_NAME'}/$baseurl\" />");
     }      }
Line 1800  sub printheader { Line 1867  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(&Apache::lonxml::xmlbegin().'<head>'.
         &Apache::lonxml::fontsettings().'</head><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 1817  sub handler { Line 2022  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'}) {
         &Apache::lonnet::put('email_status',{'recnewemail'=>0});          &Apache::lonnet::put('email_status',{'recnewemail'=>0});
     }      }
   
Line 1837  sub handler { Line 2041  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);
     }      }
   
 # --------------------------------------------------------------------- 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
   
     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);
     } 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 1872  sub handler { Line 2094  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'});   &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;
  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);
  &disall($r,$folder);   &disall($r,$folder);
     } 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 1903  sub handler { Line 2127  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'});
     } 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'}) {
  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*)*$/) {   &disall($r,$folder);
     $r->print('<br /><font color="green">'.&mt('Completed.').'</font>');      } elsif ($env{'form.newfolder'}) {
     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')  
       );  
  }  
     } elsif ($ENV{'form.newfolder'}) {  
  &printheader($r,'','New Folder');   &printheader($r,'','New Folder');
  &makefolder($ENV{'form.newfolder'});   &makefolder($env{'form.newfolder'});
  &disall($r,$ENV{'form.newfolder'});   &Apache::loncommunicate::menu($r);
    &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(&Apache::loncommon::endbodytag().'</html>');
     return OK;      return OK;
 }  }
 # ================================================= Main program, reset counter  # ================================================= Main program, reset counter

Removed from v.1.114  
changed lines
  Added in v.1.140


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