--- loncom/interface/lonmsg.pm	2003/07/25 01:18:04	1.58
+++ loncom/interface/lonmsg.pm	2003/12/30 22:45:59	1.76
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines for messaging
 #
-# $Id: lonmsg.pm,v 1.58 2003/07/25 01:18:04 bowersj2 Exp $
+# $Id: lonmsg.pm,v 1.76 2003/12/30 22:45:59 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -25,23 +25,8 @@
 #
 # http://www.lon-capa.org/
 #
-#
-# (Routines to control the menu
-#
-# (TeX Conversion Module
-#
-# 05/29/00,05/30 Gerd Kortemeyer)
-#
-# 10/05 Gerd Kortemeyer)
-#
-# 10/19,10/20,10/30,
-# 02/06/01 Gerd Kortemeyer
-# 07/27 Guy Albertelli
-# 07/27,07/28,07/30,08/03,08/06,08/08,08/09,08/10,8/13,8/15,
-# 10/1,11/5 Gerd Kortemeyer
-# YEAR=2002
-# 1/1,3/18 Gerd Kortemeyer
-#
+
+
 package Apache::lonmsg;
 
 =pod
@@ -115,6 +100,10 @@ use Apache::loncommon();
 use Apache::lontexconvert();
 use HTML::Entities();
 use Mail::Send;
+use Apache::lonlocal;
+
+# Querystring component with sorting type
+my $sqs;
 
 # ===================================================================== Package
 
@@ -140,7 +129,7 @@ sub packagemsg {
     my $result='<sendername>'.$ENV{'user.name'}.'</sendername>'.
            '<senderdomain>'.$ENV{'user.domain'}.'</senderdomain>'.
            '<subject>'.$subject.'</subject>'.
-	   '<time>'.localtime($now).'</time>'.
+	   '<time>'.&Apache::lonlocal::locallocaltime($now).'</time>'.
 	   '<servername>'.$ENV{'SERVER_NAME'}.'</servername>'.
            '<host>'.$ENV{'HTTP_HOST'}.'</host>'.
 	   '<client>'.$ENV{'REMOTE_ADDR'}.'</client>'.
@@ -183,9 +172,9 @@ sub unpackagemsg {
     if ($content{'attachmenturl'}) {
        my ($fname,$ft)=($content{'attachmenturl'}=~/\/(\w+)\.(\w+)$/);
        if ($notoken) {
-	   $content{'message'}.='<p>Attachment: <tt>'.$fname.'.'.$ft.'</tt>';
+	   $content{'message'}.='<p>'.&mt('Attachment').': <tt>'.$fname.'.'.$ft.'</tt>';
        } else {
-	   $content{'message'}.='<p>Attachment: <a href="'.
+	   $content{'message'}.='<p>'.&mt('Attachment').': <a href="'.
 	       &Apache::lonnet::tokenwrapper($content{'attachmenturl'}).
 	       '"><tt>'.$fname.'.'.$ft.'</tt></a>';
        }
@@ -209,14 +198,15 @@ sub unpackmsgid {
 sub sendemail {
     my ($to,$subject,$body)=@_;
     $body=
-    "*** This is an automatic message generated by the LON-CAPA system.\n".
-    "*** Please do not reply to this address.\n\n".$body;
+    "*** ".&mt('This is an automatic message generated by the LON-CAPA system.')."\n".
+    "*** ".&mt('Please do not reply to this address.')."\n\n".$body;
     my $msg = new Mail::Send;
     $msg->to($to);
     $msg->subject('[LON-CAPA] '.$subject);
-    my $fh = $msg->open('smtp',Server => 'localhost');
-    print $fh $body;
-    $fh->close;
+    if (my $fh = $msg->open('smtp',Server => 'localhost')) {
+	print $fh $body;
+	$fh->close;
+    }
 }
 
 # ==================================================== Send notification emails
@@ -279,6 +269,45 @@ sub author_res_msg {
     return 'no_host';
 }
 
+# =========================================== Retrieve author resource messages
+
+sub retrieve_author_res_msg {
+    my $url=shift;
+    $url=&Apache::lonnet::declutter($url);
+    my ($domain,$author)=($url=~/^(\w+)\/(\w+)\//);
+    my %errormsgs=&Apache::lonnet::dump('nohist_res_msgs',$domain,$author);
+    my $msgs='';
+    foreach (keys %errormsgs) {
+	if ($_=~/^\Q$url\E\_\d+$/) {
+	    my %content=&unpackagemsg($errormsgs{$_});
+	    $msgs.='<p><img src="/adm/lonMisc/bomb.gif" /><b>'.
+		$content{'time'}.'</b>: '.$content{'message'}.
+		'<br /></p>';
+	}
+    } 
+    return $msgs;     
+}
+
+
+# =============================== Delete all author messages related to one URL
+
+sub del_url_author_res_msg {
+    my $url=shift;
+    $url=&Apache::lonnet::declutter($url);
+}
+
+# ================= Return hash with URLs for which there is a resource message
+
+sub all_url_author_res_msg {
+    my ($author,$domain)=@_;
+    my %returnhash=();
+    foreach (&Apache::lonnet::getkeys('nohist_res_msgs',$domain,$author)) {
+	$_=~/^(.+)\_\d+/;
+	$returnhash{$1}=1;
+    }
+    return %returnhash;
+}
+
 # ================================================== Critical message to a user
 
 sub user_crit_msg_raw {
@@ -359,10 +388,10 @@ sub user_crit_received {
     my %contents=&unpackagemsg($message{$msgid},1);
     my $status='rec: '.($contents{'sendback'}?
      &user_normal_msg($contents{'sendername'},$contents{'senderdomain'},
-                     'Receipt: '.$ENV{'user.name'}.' at '.$ENV{'user.domain'},
-                     'User '.$ENV{'user.name'}.' at '.$ENV{'user.domain'}.
+                     &mt('Receipt').': '.$ENV{'user.name'}.' at '.$ENV{'user.domain'},
+                     &mt('User').' '.$ENV{'user.name'}.' '.&mt('at').' '.$ENV{'user.domain'}.
                      ' acknowledged receipt of message'."\n".'   "'.
-                     $contents{'subject'}.'"'."\n".'dated '.
+                     $contents{'subject'}.'"'."\n".&mt('dated').' '.
                      $contents{'time'}.".\n"
                      ):'no msg req');
     $status.=' trans: '.
@@ -466,6 +495,9 @@ sub discourse {
 		   $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
 		   $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
     my $now=time;
+    my %lt=&Apache::lonlocal::texthash('cfa' => 'Check for All',
+            'cfs' => 'Check for Section/Group',
+            'cfn' => 'Check for None');
     $r->print(<<ENDDISHEADER);
 <input type=hidden name=sendmode value=group>
 <script>
@@ -497,12 +529,25 @@ sub discourse {
         }
     }
 </script>
-<input type=button onClick="checkall()" value="Check for All">&nbsp;
-<input type=button onClick="checksec()" value="Check for Section/Group">
+<input type=button onClick="checkall()" value="$lt{'cfa'}">&nbsp;
+<input type=button onClick="checksec()" value="$lt{'cfs'}">
 <input type=text size=5 name=chksec>&nbsp;
-<input type=button onClick="uncheckall()" value="Check for None">
+<input type=button onClick="uncheckall()" value="$lt{'cfn'}">
 <p>
 ENDDISHEADER
+    my %coursepersonnel=
+       &Apache::lonnet::get_course_adv_roles();
+    foreach my $role (sort keys %coursepersonnel) {
+       foreach (split(/\,/,$coursepersonnel{$role})) {
+	   my ($puname,$pudom)=split(/\:/,$_);
+	   $r->print(
+             '<br /><input type="checkbox" name="send_to_&&&&&&_'.
+             $puname.':'.$pudom.'" /> '.
+		     &Apache::loncommon::plainname($puname,
+                          $pudom).' ('.$_.'), <i>'.$role.'</i>');
+	}
+    }
+
     foreach (sort keys %courselist) {
         my ($end,$start)=split(/\:/,$courselist{$_});
         my $active=1;
@@ -529,7 +574,7 @@ ENDDISHEADER
 
 sub discrit {
     my $r=shift;
-    my $header = '<h1><font color=red>Critical Messages</font></h1>'.
+    my $header = '<h1><font color=red>'.&mt('Critical Messages').'</font></h1>'.
         '<form action=/adm/email method=post>'.
         '<input type=hidden name=confirm value=true>';
     my %what=&Apache::lonnet::dump('critical');
@@ -538,22 +583,23 @@ sub discrit {
         my %content=&unpackagemsg($what{$_});
         next if ($content{'senderdomain'} eq '');
         $content{'message'}=~s/\n/\<br\>/g;
-        $result.='<hr>From: <b>'.
+        $result.='<hr>'.&mt('From').': <b>'.
 &Apache::loncommon::aboutmewrapper(
  &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('.
 $content{'sendername'}.'@'.
             $content{'senderdomain'}.') '.$content{'time'}.
-            '<br>Subject: '.$content{'subject'}.
+            '<br>'.&mt('Subject').': '.$content{'subject'}.
             '<br><blockquote>'.
               &Apache::lontexconvert::msgtexconverted($content{'message'}).
             '</blockquote>'.
-            '<input type=submit name="rec_'.$_.'" value="Confirm Receipt">'.
+            '<input type=submit name="rec_'.$_.'" value="'.&mt('Confirm Receipt').'">'.
             '<input type=submit name="reprec_'.$_.'" '.
-                  'value="Confirm Receipt and Reply">';
+                  'value="'.&mt('Confirm Receipt and Reply').'">';
     }
     # Check to see if there were any messages.
     if ($result eq '') {
-        $result = "<h2>You have no critical messages.</h2>";
+        $result = "<h2>".&mt('You have no critical messages.')."</h2>".
+	    '<a href="/adm/roles">'.&mt('Select a course').'</a>';
     } else {
         $r->print($header);
     }
@@ -575,30 +621,84 @@ sub comprep {
  &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('.
 $content{'sendername'}.'@'.
             $content{'senderdomain'}.')';
-      my $subject='Re: '.$content{'subject'};
+      my $subject=&mt('Re').': '.$content{'subject'};
       my $dispcrit='';
       if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {
 	 my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message");
          $dispcrit=
- '<input type=checkbox name=critmsg> Send as critical message ' . $crithelp . 
+ '<input type=checkbox name=critmsg> '.&mt('Send as critical message').' ' . $crithelp . 
  '<br>'.
- '<input type=checkbox name=sendbck> Send as critical message ' .
- ' and return receipt' . $crithelp . '<p>';
+ '<input type=checkbox name=sendbck> '.&mt('Send as critical message').' ' .
+ &mt('and return receipt') . $crithelp . '<p>';
       }
+    my %lt=&Apache::lonlocal::texthash(
+				   'to' => 'To',
+				   'sb' => 'Subject',
+				   'sr' => 'Send Reply',
+				   'ca' => 'Cancel'
+				   );
       $r->print(<<"ENDREPLY");
-<form action="/adm/email" method=post>
-<input type=hidden name=sendreply value="$msgid">
-To: $torepl<br />
-Subject: <input type=text size=50 name=subject value="$subject"><p>
-<textarea name=message cols=84 rows=10 wrap=hard>
+<form action="/adm/email" method="post">
+<input type="hidden" name="sendreply" value="$msgid">
+$lt{'to'}: $torepl<br />
+$lt{'sb'}: <input type="text" size=50 name="subject" value="$subject"><p>
+<textarea name="message" cols="84" rows="10" wrap="hard">
 $quotemsg
-</textarea><p>
+</textarea></p><br />
 $dispcrit
-<input type=submit value="Send Reply">
+<input type="submit" name="send" value="$lt{'sr'}" />
+<input type="submit" name="cancel" value="$lt{'ca'}"/ >
 </form>
 ENDREPLY
 }
 
+sub sortedmessages {
+    my @messages = &Apache::lonnet::getkeys('nohist_email');
+    #unpack the varibles and repack into temp for sorting
+    my @temp;
+    foreach (@messages) {
+	my $msgid=&Apache::lonnet::escape($_);
+	my ($sendtime,$shortsubj,$fromname,$fromdomain,$status)=
+	    &Apache::lonmsg::unpackmsgid($msgid);
+	my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status,
+		     $msgid);
+	push @temp ,\@temp1;
+    }
+    #default sort
+    @temp = sort  {$a->[0] <=> $b->[0]} @temp;    
+    if ($ENV{'form.sortedby'} eq "date"){
+        @temp = sort  {$a->[0] <=> $b->[0]} @temp;    
+    }
+    if ($ENV{'form.sortedby'} eq "revdate"){
+    	@temp = sort  {$b->[0] <=> $a->[0]} @temp; 
+    }
+    if ($ENV{'form.sortedby'} eq "user"){
+	@temp = sort  {lc($a->[2]) cmp lc($b->[2])} @temp;
+    }
+    if ($ENV{'form.sortedby'} eq "revuser"){
+	@temp = sort  {lc($b->[2]) cmp lc($a->[2])} @temp;
+    }
+    if ($ENV{'form.sortedby'} eq "domain"){
+        @temp = sort  {$a->[3] cmp $b->[3]} @temp;
+    }
+    if ($ENV{'form.sortedby'} eq "revdomain"){
+        @temp = sort  {$b->[3] cmp $a->[3]} @temp;
+    }
+    if ($ENV{'form.sortedby'} eq "subject"){
+        @temp = sort  {lc($a->[1]) cmp lc($b->[1])} @temp;
+    }
+    if ($ENV{'form.sortedby'} eq "revsubject"){
+        @temp = sort  {lc($b->[1]) cmp lc($a->[1])} @temp;
+    }
+    if ($ENV{'form.sortedby'} eq "status"){
+        @temp = sort  {$a->[4] cmp $b->[4]} @temp;
+    }
+    if ($ENV{'form.sortedby'} eq "revstatus"){
+        @temp = sort  {$b->[4] cmp $a->[4]} @temp;
+    }
+    return @temp;
+}
+
 # ======================================================== Display all messages
 
 sub disall {
@@ -624,40 +724,66 @@ sub disall {
     }
 </script>
 ENDDISHEADER
-   $r->print(
- '<h1>Display All Messages</h1><form method=post name=disall '.
- 'action="/adm/email">'.
-     '<table border=2><tr><th colspan=2>&nbsp</th><th>Date</th>'.
-     '<th>Username</th><th>Domain</th><th>Subject</th><th>Status</th></tr>');
-    foreach (sort split(/\&/,&Apache::lonnet::reply('keys:'.
-					$ENV{'user.domain'}.':'.
-                                        $ENV{'user.name'}.':nohist_email',
-                                        $ENV{'user.home'}))) {
-        my ($sendtime,$shortsubj,$fromname,$fromdomain,$status)=
-	    &Apache::lonmsg::unpackmsgid($_);
+    $r->print('<h1>'.&mt('Display All Messages').'</h1><form method=post name=disall '.
+	      'action="/adm/email">'.
+	      '<table border=2><tr><th colspan=2>&nbsp</th><th>');
+    if ($ENV{'form.sortedby'} eq "revdate") {
+	$r->print('<a href = "?sortedby=date">'.&mt('Date').'</a></th>');
+    } else {
+	$r->print('<a href = "?sortedby=revdate">'.&mt('Date').'</a></th>');
+    }
+    $r->print('<th>');
+    if ($ENV{'form.sortedby'} eq "revuser") {
+	$r->print('<a href = "?sortedby=user">'.&mt('Username').'</a>');
+    } else {
+	$r->print('<a href = "?sortedby=revuser">'.&mt('Username').'</a>');
+    }
+    $r->print('</th><th>');
+    if ($ENV{'form.sortedby'} eq "revdomain") {
+	$r->print('<a href = "?sortedby=domain">'.&mt('Domain').'</a>');
+    } else {
+	$r->print('<a href = "?sortedby=revdomain">'.&mt('Domain').'</a>');
+    }
+    $r->print('</th><th>');
+    if ($ENV{'form.sortedby'} eq "revsubject") {
+	$r->print('<a href = "?sortedby=subject">'.&mt('Subject').'</a>');
+    } else {
+    	$r->print('<a href = "?sortedby=revsubject">'.&mt('Subject').'</a>');
+    }
+    $r->print('</th><th>');
+    if ($ENV{'form.sortedby'} eq "revstatus") {
+	$r->print('<a href = "?sortedby=status">'.&mt('Status').'</th>');
+    } else {
+     	$r->print('<a href = "?sortedby=revstatus">'.&mt('Status').'</th>');
+    }
+    $r->print('</tr>');
+    my @temp=sortedmessages();
+    foreach (@temp){
+	my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID)= @$_;
 	if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) {
 	    if ($status eq 'new') {
 		$r->print('<tr bgcolor="#FFBB77">');
 	    } elsif ($status eq 'read') {
 		$r->print('<tr bgcolor="#BBBB77">');
 	    } elsif ($status eq 'replied') {
-		$r->print('<tr bgcolor="#AAAA88">');
+		$r->print('<tr bgcolor="#AAAA88">'); 
 	    } else {
 		$r->print('<tr bgcolor="#99BBBB">');
 	    }
-	    $r->print('<td><a href="/adm/email?display='.$_.
-		      '">Open</a></td><td><a href="/adm/email?markdel='.$_.
-		      '">Delete</a><input type=checkbox name="delmark_'.$_.'"></td>'.
-		      '<td>'.localtime($sendtime).'</td><td>'.
+	    $r->print('<td><a href="/adm/email?display='.$origID.$sqs. 
+		      '">'.&mt('Open').'</a></td><td><a href="/adm/email?markdel='.$origID.$sqs.
+		      '">'.&mt('Delete').'</a><input type=checkbox name="delmark_'.$origID.'"></td>'.
+		      '<td>'.&Apache::lonlocal::locallocaltime($sendtime).'</td><td>'.
 		      $fromname.'</td><td>'.$fromdomain.'</td><td>'.
 		      &Apache::lonnet::unescape($shortsubj).'</td><td>'.
                       $status.'</td></tr>');
 	}
-    }
+    }   
     $r->print('</table><p>'.
-              '<a href="javascript:checkall()">Check All</a>&nbsp;'.
-              '<a href="javascript:uncheckall()">Uncheck All</a><p>'.
-              '<input type=submit name="markeddel" value="Delete Checked">'.
+              '<a href="javascript:checkall()">'.&mt('Check All').'</a>&nbsp;'.
+              '<a href="javascript:uncheckall()">'.&mt('Uncheck All').'</a><p>'.
+	      '<input type="hidden" name="sortedby" value="'.$ENV{'form.sortedby'}.'" />'.
+              '<input type=submit name="markeddel" value="'.&mt('Delete Checked').'">'.
               '</form></body></html>');
 }
 
@@ -668,25 +794,32 @@ sub compout {
       my $dispcrit='';
     my $dissub='';
     my $dismsg='';
-    my $func='Send New';
-      if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {
+    my $func=&mt('Send New');
+    my %lt=&Apache::lonlocal::texthash('us' => 'Username',
+				       'do' => 'Domain',
+				       'ad' => 'Additional Recipients',
+				       'sb' => 'Subject',
+				       'ca' => 'Cancel',
+				       'ma' => 'Mail');
+
+    if (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {
 	 my $crithelp = Apache::loncommon::help_open_topic("Course_Critical_Message");
          $dispcrit=
- '<input type=checkbox name=critmsg> Send as critical message ' . $crithelp . 
+ '<input type="checkbox" name="critmsg"> '.&mt('Send as critical message').' ' . $crithelp . 
  '<br>'.
- '<input type=checkbox name=sendbck> Send as critical message ' .
- ' and return receipt' . $crithelp . '<p>';
+ '<input type="checkbox" name="sendbck"> '.&mt('Send as critical message').'  ' .
+ &mt('and return receipt') . $crithelp . '<p>';
       }
     if ($forwarding) {
-       $dispcrit.='<input type=hidden name=forwid value="'.
+       $dispcrit.='<input type="hidden" name="forwid" value="'.
 	   $forwarding.'">';
-       $func='Forward';
+       $func=&mt('Forward');
       my %message=&Apache::lonnet::get('nohist_email',[$forwarding]);
       my %content=&unpackagemsg($message{$forwarding});
 
-       $dissub='Forwarding: '.$content{'subject'};
-       $dismsg='Forwarded message from '.
-	   $content{'sendername'}.' at '.$content{'senderdomain'};
+       $dissub=&mt('Forwarding').': '.$content{'subject'};
+       $dismsg=&mt('Forwarded message from').' '.
+	   $content{'sendername'}.' '.&mt('at').' '.$content{'senderdomain'};
     }
     my $defdom=$ENV{'user.domain'};
     if ($ENV{'form.recdom'}) { $defdom=$ENV{'form.recdom'}; }
@@ -701,24 +834,25 @@ sub compout {
 	    ('compemail','recuname','recdomain');
        $r->print(<<"ENDREC");
 <table>
-<tr><td>Username:</td><td><input type=text size=12 name=recuname value="$ENV{'form.recname'}"></td><td rowspan="2">$selectlink</td></tr>
-<tr><td>Domain:</td>
+<tr><td>$lt{'us'}:</td><td><input type="text" size="12" name="recuname" value="$ENV{'form.recname'}"></td><td rowspan="2">$selectlink</td></tr>
+<tr><td>$lt{'do'}:</td>
 <td>$domform</td></tr>
 ENDREC
     }
     my $latexHelp = Apache::loncommon::helpLatexCheatsheet();
     if ($broadcast ne 'upload') {
        $r->print(<<"ENDCOMP");
-<tr><td>Additional Recipients<br><tt>username\@domain,username\@domain, ...
+<tr><td>$lt{'ad'}<br /><tt>username\@domain,username\@domain, ...
 </tt></td><td>
-<input type=text size=50 name=additionalrec></td></tr>
-<tr><td>Subject:</td><td><input type=text size=50 name=subject value="$dissub">
+<input type="text" size="50" name="additionalrec"></td></tr>
+<tr><td>$lt{'sb'}:</td><td><input type="text" size="50" name="subject" value="$dissub">
 </td></tr></table>
 $latexHelp
-<textarea name=message cols=80 rows=10 wrap=hard>$dismsg
-</textarea><p>
+<textarea name="message" cols="80" rows="10" wrap="hard">$dismsg
+</textarea></p><br />
 $dispcrit
-<input type=submit value="$func Mail">
+<input type="submit" name="send" value="$func $lt{'ma'}" />
+<input type="submit" name="cancel" value="$lt{'ca'}" />
 ENDCOMP
     } else { # $broadcast is 'upload'
 	$r->print(<<ENDUPLOAD);
@@ -771,15 +905,15 @@ sub disfacetoface {
         next if ($content{'senderdomain'} eq '');
         $content{'message'}=~s/\n/\<br\>/g;
         if ($content{'subject'}=~/^Record/) {
-	    $result.='<h3>Record</h3>';
+	    $result.='<h3>'.&mt('Record').'</h3>';
         } else {
-            $result.='<h3>Sent Message</h3>';
+            $result.='<h3>'.&mt('Sent Message').'</h3>';
             %content=&unpackagemsg($content{'message'});
             $content{'message'}=
                 '<b>Subject: '.$content{'subject'}.'</b><br />'.
 		$content{'message'};
         }
-        $result.='By: <b>'.
+        $result.=&mt('By').': <b>'.
 &Apache::loncommon::aboutmewrapper(
  &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('.
 $content{'sendername'}.'@'.
@@ -865,7 +999,7 @@ sub handler {
 
 # ----------------------------------------------------------- Set document type
 
-  $r->content_type('text/html');
+  &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;
 
   return OK if $r->header_only;
@@ -874,8 +1008,8 @@ sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
         ['display','replyto','forward','markread','markdel','markunread',
          'sendreply','compose','sendmail','critical','recname','recdom',
-         'recordftf']);
-
+         'recordftf','sortedby']);
+    $sqs='&sortedby='.$ENV{'form.sortedby'};
 # ------------------------------------------------------ They checked for email
   &Apache::lonnet::put('email_status',{'recnewemail'=>0});
 # --------------------------------------------------------------- Render Output
@@ -889,6 +1023,20 @@ sub handler {
       &statuschange($msgid,'read');
       my %message=&Apache::lonnet::get('nohist_email',[$msgid]);
       my %content=&unpackagemsg($message{$msgid});
+# info to generate "next" and "previous" buttons
+      my @messages=&sortedmessages();
+      my $counter=0;
+      $r->print('<pre>');
+      my $escmsgid=&Apache::lonnet::escape($msgid);
+      foreach (@messages) {
+ 	  if ($_->[5] eq $escmsgid){
+ 	      last;
+ 	  }
+ 	  $counter++;
+      }
+      $r->print('</pre>');
+      my $number_of_messages = scalar(@messages); #subtract 1 for last index
+# start output
       $r->print('<html><head><title>EMail and Messaging</title>');
       if (defined($content{'baseurl'})) {
 	  $r->print("<base href=\"http://$ENV{'SERVER_NAME'}/$content{'baseurl'}\" />");
@@ -896,47 +1044,58 @@ sub handler {
       $r->print(&Apache::loncommon::studentbrowser_javascript().
 		'</head>'.
 		&Apache::loncommon::bodytag('EMail and Messages'));
-      $r->print('<b>Subject:</b> '.$content{'subject'}.
-             '<br><b>From:</b> '.
+      $r->print('<b>'.&mt('Subject').':</b> '.$content{'subject'}.
+             '<br><b>'.&mt('From').':</b> '.
 &Apache::loncommon::aboutmewrapper(
 &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),
 $content{'sendername'},$content{'senderdomain'}).' ('.
                                  $content{'sendername'}.' at '.
                                  $content{'senderdomain'}.') '.
-             '<br><b>Time:</b> '.$content{'time'}.'<p>'.
-             '<table border=2><tr bgcolor="#FFFFAA"><td>Functions:</td>'.
-           '<td><a href="/adm/email?replyto='.&Apache::lonnet::escape($msgid).
-             '"><b>Reply</b></a></td>'.
-           '<td><a href="/adm/email?forward='.&Apache::lonnet::escape($msgid).
-             '"><b>Forward</b></a></td>'.
-        '<td><a href="/adm/email?markunread='.&Apache::lonnet::escape($msgid).
-             '"><b>Mark Unread</b></a></td>'.
-        '<td><a href="/adm/email?markdel='.&Apache::lonnet::escape($msgid).
+             '<br><b>'.&mt('Time').':</b> '.$content{'time'}.'<p>'.
+             '<table border=2><tr bgcolor="#FFFFAA"><td>'.&mt('Functions').':</td>'.
+           '<td><a href="/adm/email?replyto='.&Apache::lonnet::escape($msgid).$sqs.
+             '"><b>'.&mt('Reply').'</b></a></td>'.
+           '<td><a href="/adm/email?forward='.&Apache::lonnet::escape($msgid).$sqs.
+             '"><b>'.&mt('Forward').'</b></a></td>'.
+        '<td><a href="/adm/email?markunread='.&Apache::lonnet::escape($msgid).$sqs.
+             '"><b>'.&mt('Mark Unread').'</b></a></td>'.
+        '<td><a href="/adm/email?markdel='.&Apache::lonnet::escape($msgid).$sqs.
              '"><b>Delete</b></a></td>'.
-        '<td><a href="/adm/email"><b>Display all Messages</b></a></td>'.
-             '</tr></table><p><pre>'.
+		'<td><a href="/adm/email?sortedby='.$ENV{'form.sortedby'}.
+		'"><b>'.&mt('Display all Messages').'</b></a></td>');
+      if ($counter > 0){
+ 	  $r->print('<td><a href="/adm/email?display='.$messages[$counter-1]->[5].$sqs.
+           '"><b>'.&mt('Previous').'</b></a></td>');
+       }
+       if ($counter < $number_of_messages - 1){
+ 	  $r->print('<td><a href="/adm/email?display='.$messages[$counter+1]->[5].$sqs.
+           '"><b>'.&mt('Next').'</b></a></td>');
+       }
+       $r->print('</tr></table><p><pre>'.
              &Apache::lontexconvert::msgtexconverted($content{'message'}).
              '</pre><hr>'.$content{'citation'});
   } elsif ($ENV{'form.replyto'}) {
       &comprep($r,$ENV{'form.replyto'});
   } elsif ($ENV{'form.sendreply'}) {
-      my $msgid=$ENV{'form.sendreply'};
-      my %message=&Apache::lonnet::get('nohist_email',[$msgid]);
-      my %content=&unpackagemsg($message{$msgid},1);
-      &statuschange($msgid,'replied');
-      if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) && 
-          (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) {
-         $r->print('Sending critical: '.
-                &user_crit_msg($content{'sendername'},
-                                 $content{'senderdomain'},
-                                 &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),
-                                 &Apache::lonfeedback::clear_out_html($ENV{'form.message'}),
-                                 $ENV{'form.sendbck'}));
-      } else {
-         $r->print('Sending: '.&user_normal_msg($content{'sendername'},
-                                 $content{'senderdomain'},
-                                 &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),
-                                 &Apache::lonfeedback::clear_out_html($ENV{'form.message'})));
+      if ($ENV{'form.send'}) {
+	  my $msgid=$ENV{'form.sendreply'};
+	  my %message=&Apache::lonnet::get('nohist_email',[$msgid]);
+	  my %content=&unpackagemsg($message{$msgid},1);
+	  &statuschange($msgid,'replied');
+	  if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) && 
+	      (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) {
+	      $r->print(&mt('Sending critical message').': '.
+			&user_crit_msg($content{'sendername'},
+				       $content{'senderdomain'},
+				       &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),
+				       &Apache::lonfeedback::clear_out_html($ENV{'form.message'}),
+				       $ENV{'form.sendbck'}));
+	  } else {
+	      $r->print(&mt('Sending').': '.&user_normal_msg($content{'sendername'},
+							     $content{'senderdomain'},
+							     &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),
+							     &Apache::lonfeedback::clear_out_html($ENV{'form.message'})));
+	  }
       }
       if ($ENV{'form.displayedcrit'}) {
           &discrit($r);
@@ -983,64 +1142,75 @@ $content{'sendername'},$content{'senderd
   } elsif ($ENV{'form.recordftf'}) {
       &facetoface($r,$ENV{'form.recordftf'});
   } elsif ($ENV{'form.sendmail'}) {
-      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'};
-      }
-      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}='';
-          }
+      my $sendstatus='';
+      if ($ENV{'form.send'}) {
+	  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'};
+	  }
+	  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{$_}; }    
+	      if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) && 
+		  (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) {
+		  $r->print(&mt('Sending critical message').' ...');
+                  $sendstatus.=' '.&user_crit_msg($recuname,$recdomain,
+					   &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),
+					   $msgtxt,
+					   $ENV{'form.sendbck'});
+	      } else {
+		  $r->print(&mt('Sending').' ...');
+                  $sendstatus.=' '.&user_normal_msg($recuname,$recdomain,
+				                         &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),
+							 $msgtxt,
+							 $content{'citation'});
+	      }
+	      $r->print('<br />');
+	  }
       }
-    foreach (keys %toaddr) {
-      my ($recuname,$recdomain)=split(/\:/,$_);
-      my $msgtxt=&Apache::lonfeedback::clear_out_html($ENV{'form.message'});
-      if ($toaddr{$_}) { $msgtxt.='<hr>'.$toaddr{$_}; }    
-      if ((($ENV{'form.critmsg'}) || ($ENV{'form.sendbck'})) && 
-          (&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}))) {
-         $r->print('Sending critical: '.
-                &user_crit_msg($recuname,$recdomain,
-               &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),
-                                 $msgtxt,
-                                 $ENV{'form.sendbck'}));
+      if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) {
+	  if ($ENV{'form.displayedcrit'}) {
+	      &discrit($r);
+	  } else {
+	      &disall($r);
+	  }
       } else {
-         $r->print('Sending: '.&user_normal_msg($recuname,$recdomain,
-              &Apache::lonfeedback::clear_out_html($ENV{'form.subject'}),
-                                 $msgtxt,
-                                 $content{'citation'}));
-      }
-      $r->print('<br>');
-    }
-      if ($ENV{'form.displayedcrit'}) {
-          &discrit($r);
-      } else {
-	  &disall($r);
+	  $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')
+		    );
       }
   } else {
       &disall($r);
@@ -1059,9 +1229,10 @@ BEGIN {
 
 =back
 
-=end
+=cut
+
+1; 
 
-1;
 __END__