--- loncom/interface/lonmsgdisplay.pm	2006/04/08 06:58:28	1.2
+++ loncom/interface/lonmsgdisplay.pm	2006/04/25 19:45:50	1.12
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines for messaging display
 #
-# $Id: lonmsgdisplay.pm,v 1.2 2006/04/08 06:58:28 albertel Exp $
+# $Id: lonmsgdisplay.pm,v 1.12 2006/04/25 19:45:50 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -172,7 +172,7 @@ sub scrollbuttons {
 
 sub statuschange {
     my ($msgid,$newstatus,$folder)=@_;
-    my $suffix=&foldersuffix($folder);
+    my $suffix=&Apache::lonmsg::foldersuffix($folder);
     my %status=&Apache::lonnet::get('email_status'.$suffix,[$msgid]);
     if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; }
     unless ($status{$msgid}) { $status{$msgid}='new'; }
@@ -184,8 +184,9 @@ sub statuschange {
 	&Apache::lonnet::put('email_status'.$suffix,{$msgid => $newstatus});
     }
     if ($newstatus eq 'deleted') {
-       &movemsg(&Apache::lonnet::unescape($msgid),$folder,'trash');
-   }
+	return &movemsg($msgid,$folder,'trash');
+    }
+    return ;
 }
 
 # ============================================================= Make new folder
@@ -204,21 +205,55 @@ sub makefolder {
 sub movemsg {
     my ($msgid,$srcfolder,$trgfolder)=@_;
     if ($srcfolder eq 'new') { $srcfolder=''; }
-    my $srcsuffix=&foldersuffix($srcfolder);
-    my $trgsuffix=&foldersuffix($trgfolder);
+    my $srcsuffix=&Apache::lonmsg::foldersuffix($srcfolder);
+    my $trgsuffix=&Apache::lonmsg::foldersuffix($trgfolder);
+    if ($srcsuffix eq $trgsuffix) {
+	return (0,&mt('Message not moved, Attempted to move message to the same folder as it already is in.'));
+    }
 
 # Copy message
     my %message=&Apache::lonnet::get('nohist_email'.$srcsuffix,[$msgid]);
-    &Apache::lonnet::put('nohist_email'.$trgsuffix,{$msgid => $message{$msgid}});
+    if (!exists($message{$msgid}) || $message{$msgid} eq '') {
+	if (&Apache::slotrequest::network_error(%message)) {
+	    return (0,&mt('Message not moved, A network error occurred.'));
+	} else {
+	    return (0,&mt('Message not moved as the message is no longer in the source folder.'));
+	}
+    }
+
+    my $result =&Apache::lonnet::put('nohist_email'.$trgsuffix,
+				     {$msgid => $message{$msgid}});
+    if (&Apache::slotrequest::network_error($result)) {
+	return (0,&mt('Message not moved, A network error occurred.'));
+    }
 
 # Copy status
     unless ($trgfolder eq 'trash') {
-	my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$msgid]);
-	&Apache::lonnet::put('email_status'.$trgsuffix,{$msgid => $status{$msgid}});
+       	my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$msgid]);
+	# a non-existant status is the mark of an unread msg
+	if (&Apache::slotrequest::network_error(%status)) {
+	    return (0,&mt('Message copied to new folder but status was not, A network error occurred.'));
+	}
+	my $result=&Apache::lonnet::put('email_status'.$trgsuffix,
+					{$msgid => $status{$msgid}});
+	if (&Apache::slotrequest::network_error($result)) {
+	    return (0,&mt('Message copied to new folder but status was not, A network error occurred.'));
+	}
     }
+
 # Delete orginals
-    &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);
-    &Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]);
+    my $result_del_msg = 
+	&Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);
+    my $result_del_stat =
+	&Apache::lonnet::del('email_status'.$srcsuffix,[$msgid]);
+    if (&Apache::slotrequest::network_error($result_del_msg)) {
+	return (0,&mt('Message copied, but unable to delete the original from the source folder.'));
+    }
+    if (&Apache::slotrequest::network_error($result_del_stat)) {
+	return (0,&mt('Message copied, but unable to delete the original status from the source folder.'));
+    }
+
+    return (1);
 }
 
 # ======================================================= Display a course list
@@ -313,7 +348,7 @@ ENDDISHEADER
 
 sub discrit {
     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">'.
         '<input type="hidden" name="confirm" value="true" />';
     my %what=&Apache::lonnet::dump('critical');
@@ -357,18 +392,30 @@ sub sortedmessages {
     my %descriptions;
     my %status_cache = 
 	&Apache::lonnet::get('email_status'.&Apache::lonmsg::foldersuffix($folder),\@messages);
-    foreach (@messages) {
-	my $msgid=&Apache::lonnet::escape($_);
+
+    my $get_received;
+    if ($folder eq 'sent' 
+	&& ($env{'form.sortedby'} =~ m/^(rev)?(user|domain)$/)) {
+	$get_received = 1;
+    }
+
+    foreach my $msgid (@messages) {
+	my $esc_msgid=&Apache::lonnet::escape($msgid);
 	my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$fromcid)=
-	    &Apache::lonmsg::unpackmsgid($msgid,$folder,undef,
+	    &Apache::lonmsg::unpackmsgid($esc_msgid,$folder,undef,
 					 \%status_cache);
         my $description = &get_course_desc($fromcid,\%descriptions);
 	my @temp1 = ($sendtime,$shortsubj,$fromname,$fromdomain,$status,
-		     $msgid,$description);
+		     $esc_msgid,$description);
+	if ($get_received) {
+	    my %message = &Apache::lonnet::get('nohist_email'.$suffix,
+					       [$msgid]);
+	    my %content = &Apache::lonmsg::unpackagemsg($message{$msgid});
+	    push(@temp1,$content{'recuser'},$content{'recdomain'});
+	}
         # Check whether message was sent during blocking period.
         if ($sendtime >= $startblock && ($sendtime <= $endblock && $endblock > 0) ) {
-            my $escid = &Apache::lonnet::unescape($msgid);
-            $$blocked{$escid} = 'ON';
+            $$blocked{$msgid} = 'ON';
             $$numblocked ++;
         } else { 
             push @temp ,\@temp1;
@@ -383,16 +430,32 @@ sub sortedmessages {
     	@temp = sort  {$b->[0] <=> $a->[0]} @temp; 
     }
     if ($env{'form.sortedby'} eq "user"){
-	@temp = sort  {lc($a->[2]) cmp lc($b->[2])} @temp;
+	if ($get_received) {
+	    @temp = sort  {lc($a->[7][0]) cmp lc($b->[7][0])} @temp;
+	} else {
+	    @temp = sort  {lc($a->[2])    cmp lc($b->[2])}    @temp;
+	}
     }
     if ($env{'form.sortedby'} eq "revuser"){
-	@temp = sort  {lc($b->[2]) cmp lc($a->[2])} @temp;
+	if ($get_received) {
+	    @temp = sort  {lc($b->[7][0]) cmp lc($a->[7][0])} @temp;
+	} else {
+	    @temp = sort  {lc($b->[2])    cmp lc($a->[2])}    @temp;
+	}
     }
     if ($env{'form.sortedby'} eq "domain"){
-        @temp = sort  {$a->[3] cmp $b->[3]} @temp;
+	if ($get_received) {
+	    @temp = sort  {$a->[8][0] cmp $b->[8][0]} @temp;
+	} else {
+	    @temp = sort  {$a->[3]    cmp $b->[3]}    @temp;
+	}
     }
     if ($env{'form.sortedby'} eq "revdomain"){
-        @temp = sort  {$b->[3] cmp $a->[3]} @temp;
+	if ($get_received) {
+	    @temp = sort  {$b->[8][0] cmp $a->[8][0]} @temp;
+	} else {
+	    @temp = sort  {$b->[3]    cmp $a->[3]}    @temp;
+	}
     }
     if ($env{'form.sortedby'} eq "subject"){
         @temp = sort  {lc($a->[1]) cmp lc($b->[1])} @temp;
@@ -478,7 +541,7 @@ sub disnew {
                     push @newmsgs, { 
                         msgid    => $msgid,
                         sendtime => $sendtime,
-                        shortsub => &Apache::lonnet::unescape($shortsubj),
+                        shortsub => $shortsubj,
                         from     => $fromname,
                         fromdom  => $fromdom,
                         course   => $description 
@@ -490,13 +553,12 @@ sub disnew {
     if ($#newmsgs >= 0) {
         $r->print(<<TABLEHEAD);
 <h2>$lt{'nm'}</h2>
-<table border=2><tr><th>&nbsp</th>
+<table class="LC_mail_list"><tr><th>&nbsp</th>
 <th>$lt{'da'}</th><th>$lt{'us'}</th><th>$lt{'do'}</th><th>$lt{'su'}</th><th>$lt{'co'}</th></tr>
 TABLEHEAD
         foreach my $msg (@newmsgs) {
             $r->print(<<"ENDLINK");
-<tr class="new" bgcolor="#FFBB77" onMouseOver="javascript:style.backgroundColor='#DD9955'" 
-onMouseOut="javascript:style.backgroundColor='#FFBB77'">
+<tr class="LC_mail_new">
 <td><a href="/adm/email?dismode=new&display=$msg->{'msgid'}">$lt{'op'}</a></td>
 ENDLINK
             foreach ('sendtime','from','fromdom','shortsub','course') {
@@ -588,7 +650,7 @@ ENDDISHEADER
     if ($lastdis>$#temp) { $lastdis=$#temp; }
     $r->print(&scrollbuttons($startdis,$number,$firstdis,$lastdis,$totalnumber));
     $r->print('<form method="post" name="disall" action="/adm/email">'.
-	      '<table border=2><tr><th colspan="3">&nbsp</th><th>');
+	      '<table class="LC_mail_list"><tr><th colspan="3">&nbsp</th><th>');
     if ($env{'form.sortedby'} eq "revdate") {
 	$r->print('<a href = "?sortedby=date'.$fsqs.'">'.&mt('Date').'</a></th>');
     } else {
@@ -625,29 +687,49 @@ ENDDISHEADER
      	$r->print('<a href = "?sortedby=revstatus'.$fsqs.'">'.&mt('Status').'</a></th>');
     }
     $r->print("</tr>\n");
+
+    my $suffix = &Apache::lonmsg::foldersuffix($folder);
     for (my $n=$firstdis;$n<=$lastdis;$n++) {
-	my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID,$description)= @{$temp[$n]};
+	my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID,
+	    $description,$recv_name,$recv_domain)= 
+		@{$temp[$n]};
 	if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) {
 	    if ($status eq 'new') {
-		$r->print('<tr bgcolor="#FFBB77" onMouseOver="javascript:style.backgroundColor=\'#DD9955\'"  onMouseOut="javascript:style.backgroundColor=\'#FFBB77\'">');
+		$r->print('<tr class="LC_mail_new">');
 	    } elsif ($status eq 'read') {
-		$r->print('<tr bgcolor="#BBBB77" onMouseOver="javascript:style.backgroundColor=\'#999944\'"  onMouseOut="javascript:style.backgroundColor=\'#BBBB77\'">');
+		$r->print('<tr class="LC_mail_read">');
 	    } elsif ($status eq 'replied') {
-		$r->print('<tr bgcolor="#AAAA88" onMouseOver="javascript:style.backgroundColor=\'#888855\'"  onMouseOut="javascript:style.backgroundColor=\'#AAAA88\'">'); 
+		$r->print('<tr class="LC_mail_replied">'); 
 	    } else {
-		$r->print('<tr bgcolor="#99BBBB" onMouseOver="javascript:style.backgroundColor=\'#669999\'"  onMouseOut="javascript:style.backgroundColor=\'#99BBBB\'">');
+		$r->print('<tr class="LC_mail_other">');
+	    }
+	    my ($dis_name,$dis_domain) = ($fromname,$fromdomain);
+	    if ($folder eq 'sent') {
+		if (defined($recv_name) && !defined($recv_domain)) {
+		    $dis_name   = join('<br />',@{$recv_name});
+		    $dis_domain = join('<br />',@{$recv_domain});
+		} else {
+		    my $msg_id  = &Apache::lonnet::unescape($origID);
+		    my %message = &Apache::lonnet::get('nohist_email'.$suffix,
+						       [$msg_id]);
+		    my %content = &Apache::lonmsg::unpackagemsg($message{$msg_id});
+		    $dis_name   = join('<br />',@{$content{'recuser'}});
+		    $dis_domain = join('<br />',@{$content{'recdomain'}});
+		}
 	    }
 	    $r->print('<td><input type="checkbox" name="delmark_'.$origID.'" /></td><td><a href="/adm/email?display='.$origID.$sqs. 
 		      '">'.&mt('Open').'</a></td><td>'.
 		      ($folder ne 'trash'?'<a href="/adm/email?markdel='.$origID.$sqs.
 		      '">'.&mt('Delete'):'&nbsp').'</a></td>'.
 		      '<td>'.&Apache::lonlocal::locallocaltime($sendtime).'</td><td>'.
-		      $fromname.'</td><td>'.$fromdomain.'</td><td>'.
-		      &Apache::lonnet::unescape($shortsubj).'</td><td>'.
+		      $dis_name.'</td><td>'.$dis_domain.'</td><td>'.
+		      $shortsubj.'</td><td>'.
                       $description.'</td><td>'.$status.'</td></tr>'."\n");
 	} elsif ($status eq 'deleted') {
 # purge
-	    &movemsg(&Apache::lonnet::unescape($origID),$folder,'trash');
+	    my ($result,$msg) = 
+		&movemsg(&Apache::lonnet::unescape($origID),$folder,'trash');
+	    
 	}
     }   
     $r->print("</table>\n<p>".
@@ -1666,7 +1748,8 @@ sub sendoffmail {
         my $savemsg;
         my $msgtype;
         my %sentmessage;
-        my $msgsubj=&Apache::lonfeedback::clear_out_html($env{'form.subject'});
+        my $msgsubj=&Apache::lonfeedback::clear_out_html($env{'form.subject'},
+							 undef,1);
         if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) &&
             (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
 	     || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
@@ -1682,29 +1765,32 @@ sub sendoffmail {
 	    my ($recuname,$recdomain)=split(/\:/,$_);
             my $msgtxt = $savemsg;
 	    if ($toaddr{$_}) { $msgtxt.='<hr />'.$toaddr{$_}; }
-	    my $thismsg;
+	    my @thismsg;
 	    if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) && 
 		(&Apache::lonnet::allowed('srm',$env{'request.course.id'})
 		 || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
 					     '/'.$env{'request.course.sec'}))) {
 		$r->print(&mt('Sending critical message').' '.$recuname.'@'.$recdomain.': ');
-		$thismsg=&Apache::lonmsg::user_crit_msg($recuname,$recdomain,$msgsubj,$msgtxt,
+		@thismsg=&Apache::lonmsg::user_crit_msg($recuname,$recdomain,$msgsubj,$msgtxt,
 				$env{'form.sendbck'},$env{'form.permanent'},
                                                              \$sentmessage{$_});
 	    } else {
 		$r->print(&mt('Sending').' '.$recuname.'@'.$recdomain.': ');
-		$thismsg=&Apache::lonmsg::user_normal_msg($recuname,$recdomain,$msgsubj,$msgtxt,
+		@thismsg=&Apache::lonmsg::user_normal_msg($recuname,$recdomain,$msgsubj,$msgtxt,
 					  $content{'citation'},undef,undef,$env{'form.permanent'},\$sentmessage{$_});
             }
 	    if (($env{'request.course.id'}) && (($msgtype eq 'critical') || 
                                          ($env{'form.sendmode'} eq 'group'))) {
-	        $specialmsg_status{$recuname.':'.$recdomain}  = $thismsg;
-                if ($thismsg eq 'ok') {
-                    $numspecial ++;
-                }
+	        $specialmsg_status{$recuname.':'.$recdomain} =
+		    join(' ',@thismsg);
+		foreach my $result (@thismsg) {
+		    if ($result eq 'ok') {
+			$numspecial++;
+		    }
+		}
 	    }
-	    $r->print($thismsg.'<br />');
-	    $sendstatus.=' '.$thismsg;
+	    $r->print(join(' ',@thismsg).'<br />');
+	    $sendstatus.=' '.join(' ',@thismsg);
 	}
         if (($env{'request.course.id'}) && (($env{'form.sendmode'} eq 'group')
                                               || ($msgtype eq 'critical'))) {
@@ -1768,17 +1854,15 @@ sub sendoffmail {
 	&printheader($r,'','No messages sent.'); 
     }
     if ($sendstatus=~/^(\s*(?:ok|con_delayed)\s*)*$/) {
-	$r->print('<br /><font color="green">'.&mt('Completed.').'</font>');
+	$r->print('<br /><span class="LC_success">'.&mt('Completed.').'</span>');
 	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')
-		  );
+	$r->print('<p><span class="LC_error">'.&mt('Could not deliver message').'</span> '.
+		  &mt('Please use the browser "Back" button and correct the recipient addresses').'</p>');
     }
 }
 
@@ -1885,32 +1969,67 @@ sub handler {
 	&compout($r,$env{'form.forward'},undef,undef,undef,$folder);
     } elsif ($env{'form.markdel'}) {
 	&printheader($r,'','Deleted Message');
-	&statuschange($env{'form.markdel'},'deleted',$folder);
+	my ($result,$msg) = 
+	    &statuschange($env{'form.markdel'},'deleted',$folder);
+	if (!$result) {
+	    $r->print('<p class="LC_error">'.
+		      &mt('Failed to delete the message.').'</p>'.
+		      '<p class="LC_error">'.$msg."</p>\n");
+	}
 	&Apache::loncommunicate::menu($r);
 	&disall($r,($folder?$folder:$dismode));
     } elsif ($env{'form.markedmove'}) {
-	my $total=0;
-	foreach (keys %env) {
-	    if ($_=~/^form\.delmark_(.*)$/) {
-		&movemsg(&Apache::lonnet::unescape($1),$folder,
-			 $env{'form.movetofolder'});
-		$total++;
+	my ($total,$failed,@failed_msg)=(0,0);
+	foreach my $key (keys(%env)) {
+	    if ($key=~/^form\.delmark_(.*)$/) {
+		my ($result,$msg) =
+		    &movemsg(&Apache::lonnet::unescape($1),$folder,
+			     $env{'form.movetofolder'});
+		if ($result) {
+		    $total++;
+		} else {
+		    $failed++;
+		    push(@failed_msg,$msg);
+		}
 	    }
 	}
 	&printheader($r,'','Moved Messages');
-	$r->print('Moved '.$total.' message(s)<p>');
+	if ($failed) {
+	    $r->print('<p class="LC_error">
+                          '.&mt('Failed to move [_1] message(s)',$failed).
+		      '</p>');
+	    $r->print('<p class="LC_error">'.
+		      join("</p>\n<p class=\"LC_error\">",@failed_msg).
+		      "</p>\n");
+	}
+	$r->print(&mt('Moved [_1] message(s)',$total).'<p>');
 	&Apache::loncommunicate::menu($r);
 	&disall($r,($folder?$folder:$dismode));
     } elsif ($env{'form.markeddel'}) {
-	my $total=0;
-	foreach (keys %env) {
-	    if ($_=~/^form\.delmark_(.*)$/) {
-		&statuschange(&Apache::lonnet::unescape($1),'deleted',$folder);
-		$total++;
+	my ($total,$failed,@failed_msg)=(0,0);
+	foreach my $key (keys(%env)) {
+	    if ($key=~/^form\.delmark_(.*)$/) {
+		my ($result,$msg) = 
+		    &statuschange(&Apache::lonnet::unescape($1),'deleted',
+				  $folder);
+		if ($result) {
+		    $total++;
+		} else {
+		    $failed++;
+		    push(@failed_msg,$msg);
+		}
 	    }
 	}
 	&printheader($r,'','Deleted Messages');
-	$r->print('Deleted '.$total.' message(s)<p>');
+	if ($failed) {
+	    $r->print('<p class="LC_error">
+                          '.&mt('Failed to delete [_1] message(s)',$failed).
+		      '</p>');
+	    $r->print('<p class="LC_error">'.
+		      join("</p>\n<p class=\"LC_error\">",@failed_msg).
+		      "</p>\n");
+	}
+	$r->print(&mt('Deleted [_1] message(s)',$total).'<p>');
 	&Apache::loncommunicate::menu($r);
 	&disall($r,($folder?$folder:$dismode));
     } elsif ($env{'form.markunread'}) {