--- loncom/interface/lonmsgdisplay.pm	2007/05/02 19:56:34	1.73
+++ loncom/interface/lonmsgdisplay.pm	2007/12/08 00:25:14	1.83
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines for messaging display
 #
-# $Id: lonmsgdisplay.pm,v 1.73 2007/05/02 19:56:34 raeburn Exp $
+# $Id: lonmsgdisplay.pm,v 1.83 2007/12/08 00:25:14 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -737,12 +737,27 @@ $content{'sendername'}.':'.
             '<br />'.&mt('Subject').': '.$content{'subject'}.
             '<br /><pre>'.
               &Apache::lontexconvert::msgtexconverted($content{'message'}).
-            '</pre><small>'.
-&mt('You have to confirm that you received this message. After confirmation, this message will be moved to your regular inbox').
-            '</small><br />'.
-            '<input type="submit" name="rec_'.$key.'" value="'.&mt('Confirm Receipt').'" />'.
-            '<input type="submit" name="reprec_'.$key.'" '.
-                  'value="'.&mt('Confirm Receipt and Reply').'" />';
+            '</pre><small>';
+        my ($rec_button,$reprec_button);
+        $rec_button = &mt('Move to Inbox');
+        if (!$content{'noreplies'}) {
+            $reprec_button = &mt('Move to Inbox/Compose reply');
+        }
+        if ($content{'sendback'}) {
+            $rec_button = &mt('Confirm Receipt');
+            if (!$content{'noreplies'}) {
+                $reprec_button = &mt('Confirm Receipt and Reply');
+            }
+            $result .= &mt('You have to confirm that you have received this message before you can view other pages. After confirmation, this message will be moved to your regular inbox');
+        } else {
+            $result .= &mt('Access to other pages will be prevented until you have moved the message to your inbox.'); 
+        }
+        $result .= '</small><br />'.
+            '<input type="submit" name="rec_'.$key.'" value="'.$rec_button.'" />';
+        if (!$content{'noreplies'}) {
+            $result .= '<input type="submit" name="reprec_'.$key.'" '.
+                  'value="'.$reprec_button.'" />';
+        }
     }
     # Check to see if there were any messages.
     if ($result eq '') {
@@ -877,8 +892,7 @@ sub get_course_desc {
 
 sub disall {
     my ($r,$folder,$msgstatus)=@_;
-    my %saveable = ('folder'    => 'scalar',
-		    'msgstatus' => 'scalar',
+    my %saveable = ('msgstatus' => 'scalar',
 		    'sortedby'  => 'scalar',
 		    'interdis'  => 'scalar',
 		    );
@@ -915,16 +929,6 @@ sub disfolder {
 <script type="text/javascript">
     $jscript
 
-    function checkfoldermove() {
-        if (document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value == 'markedmove') {
-            if (document.disall.movetofolder.options[document.disall.movetofolder.selectedIndex].value == "") {
-                alert("$lt{'sede'}");
-                return;
-            }
-        }
-        return; 
-    }
-
     function validate_checkedaction() {
         document.disall.markedaction.value = document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value;
         if (document.disall.checkedaction.options[document.disall.checkedaction.selectedIndex].value == 'markedmove') {
@@ -1096,7 +1100,7 @@ ENDDISHEADER
   '<input type="button" onclick="javascript:uncheckAll(document.disall.delmark)" value="'.&mt('Uncheck All').'" />'."\n".
   '<input type="hidden" name="sortedby" value="'.$env{'form.sortedby'}.'" /></td><td>&nbsp;</td>'."\n".
   '<td align="center"><b>'.&mt('Action').'</b><br />'."\n".
-  '  <select name="checkedaction" onchange="javascript:checkfoldermove()">'."\n");
+  '  <select name="checkedaction">'."\n");
 
     if ($folder ne 'trash') {
         $r->print('    <option value="markeddel">'.&mt('Delete').'</option>'."\n");
@@ -1209,6 +1213,8 @@ will be forwarded to the recipient(s) yo
     my %lt=&Apache::lonlocal::texthash('us'  => 'Username',
 				       'do'  => 'Domain',
 				       'ad'  => 'Additional Recipients',
+                                       'rt'  => 'Reply to',
+                                       'ar'  => 'Allow replies',
 				       'sb'  => 'Subject',
 				       'ca'  => 'Cancel',
 				       'ma'  => 'Mail',
@@ -1319,14 +1325,36 @@ ENDREPSCRIPT
     } 
     if (($broadcast ne 'group') && ($broadcast ne 'upload')) {
 	if ($replying) {
-	    $r->print('<tr><td colspan="2">'.&mt('Replying to').' '.
-		      &Apache::loncommon::aboutmewrapper(
+            if ($content{'noreplies'}) {
+                $r->print('<tr><td>'.&mt('This message was designated by the sender not to allow replies.').'</td></tr></table></form>');
+                return;
+            }
+            $r->print('<tr><td colspan="2">'.&mt('Replying to').' ');
+            if ($content{'replytoaddr'}) {
+                my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
+                if ($replytoname ne '' && $replytodom ne '') {
+                    $r->print(&Apache::loncommon::plainname($replytoname,
+                                 $replytodom).' ('.$replytoname.':'.
+                                 $replytodom.')');
+                    $r->print('<input type="hidden" name="recuname" value="'.
+                          $replytoname.'" />'.
+                          '<input type="hidden" name="recdomain" value="'.
+                          $replytodom.'" /></td></tr>');
+
+                } else {
+                    $r->print(&mt('The sender did not designate a reply to address for this message.').'</td></tr></table>');
+                    return;
+                }
+            } else {
+	        $r->print(&Apache::loncommon::aboutmewrapper(
 							 &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('.
 		      $content{'sendername'}.':'.
-		      $content{'senderdomain'}.')'.
-		      '<input type="hidden" name="recuname" value="'.$content{'sendername'}.'" />'.
-		      '<input type="hidden" name="recdomain" value="'.$content{'senderdomain'}.'" />'.
-		      '</td></tr>');
+		      $content{'senderdomain'}.')');
+                $r->print('<input type="hidden" name="recuname" value="'.
+		          $content{'sendername'}.'" />'.
+		          '<input type="hidden" name="recdomain" value="'.
+                          $content{'senderdomain'}.'" /></td></tr>');
+            }
             if ($content{'recipid'}) {
                 my @ccs = &retrieve_cc_recips('replying',%content);
                 if (@ccs > 0) {
@@ -1379,6 +1407,11 @@ $latexHelp.
     } elsif ($broadcast ne 'upload') {
         $subj_size = '50';
         $r->print(&additional_rec_row(\%lt));
+        if (&Apache::lonnet::allowed('srm',$env{'request.course.id'})
+            || &Apache::lonnet::allowed('srm',$env{'request.course.id'}.
+                                        '/'.$env{'request.course.sec'})) {
+            $r->print(&reply_to_row(\%lt));
+        }
         $r->print(&msg_subject_row($dissub,\%lt,$subj_size));
         $r->print(<<"ENDCOMP");
 </table>
@@ -1453,22 +1486,30 @@ sub recipient_input_row {
       &Apache::loncommon::selectstudent_link('compemail','recuname',
                                              'recdomain');
     my $output = <<"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{'do'}:</td>
-<td>$domform</td></tr>
+<tr><td colspan="2"><span class="LC_nobreak">$lt{'us'}:&nbsp;<input type="text" size="12" name="recuname" value="$env{'form.recname'}" />&nbsp;$lt{'do'}:&nbsp;$domform&nbsp;&nbsp;$selectlink</span></td></tr>
 ENDREC
     return $output;
 }
 
+sub reply_to_row {
+    my ($lt) = @_;
+    my $radioyes = &mt('Yes');
+    my $radiono = &mt('No');
+    my $output = <<"ENDREP";
+<tr><td colspan="2"><span class="LC_nobreak">$lt->{'ar'}:<label><input type="radio" name="can_reply" value="Y" checked="checked" />$radioyes</label>&nbsp;&nbsp;<label><input type="radio" name="can_reply" value="N" />$radiono</label></span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="LC_nobreak">$lt->{'rt'}:&nbsp;<input type="text" size="25" name="reply_to_addr" value="$env{'user.name'}:$env{'user.domain'}" /></span></td></tr>
+ENDREP
+    return $output;
+}
+
 sub additional_rec_row {
     my ($lt) = @_;
     my $cc = &mt('Cc:');
     my $bcc = &mt('Bcc:'); 
     my $output = <<"ENDADD";
 <tr><td>$lt->{'ad'} :<br /><tt>username:domain,username:domain, ...
-</tt></td><td>&nbsp;<span class="span.LC_nobreak">$cc 
-<input type="text" size="50" name="additionalrec_cc" /></nospan><br />
-<span class="span.LC_nobreak">$bcc <input type="text" size="50" name="additionalrec_bcc" /></nospan></td></tr>
+</tt></td><td>&nbsp;<span class="LC_nobreak">$cc 
+<input type="text" size="50" name="additionalrec_cc" /></span><br />
+<span class="LC_nobreak">$bcc <input type="text" size="50" name="additionalrec_bcc" /></span></td></tr>
 ENDADD
     return $output;
 }
@@ -1486,7 +1527,7 @@ sub submit_button_row {
 
 sub msg_subject_row {
     my ($dissub,$lt,$subj_size,$extra) = @_;
-    my $output = '<tr><td>'.$lt->{'sb'}.':</td><td><input type="text" size="'.
+    my $output = '<tr><td colspan="2">'.$lt->{'sb'}.':&nbsp;<input type="text" size="'.
                  $subj_size.'" name="subject" value="'.$dissub.'" />'.$extra.
                  '</td></tr>';
     return $output;
@@ -2022,15 +2063,33 @@ sub displaymessage {
 	$counter++;
     }
     $r->print('</pre>');
+
+    my $see_anonymous;
+    my $from_student = 0;
+    if ($env{'request.course.id'} eq $content{'courseid'}) {
+	my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+	my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+	my $username = $content{'sendername'}.':'.$content{'senderdomain'};
+	my %classlist_entry =
+	    &Apache::lonnet::get('classlist',[$username],$cdom,$cnum);
+	if (exists($classlist_entry{$username})) {
+	    $from_student = 1;
+	    $see_anonymous = &Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
+	}
+    }
+
+
     my $number_of_messages = scalar(@messages); #subtract 1 for last index
 # start output
     &printheader($r,'/adm/email?display='.&escape($msgid),'Display a Message','',$content{'baseurl'});
     my %courseinfo=&Apache::lonnet::coursedescription($content{'courseid'});
 # Functions
-    $r->print('<table border="2" width="100%"><tr bgcolor="#FFFFAA"><td>'.&mt('Functions').':</td>'.
-	      '<td><a href="/adm/email?replyto='.&escape($msgid).$sqs.
-	      '"><b>'.&mt('Reply').'</b></a></td>'.
-	      '<td><a href="/adm/email?forward='.&escape($msgid).$sqs.
+    $r->print('<table border="2" width="100%"><tr bgcolor="#FFFFAA"><td>'.&mt('Functions').':</td>');
+    if (!$content{'noreplies'}) {
+        $r->print('<td><a href="/adm/email?replyto='.&escape($msgid).$sqs.
+	          '"><b>'.&mt('Reply').'</b></a></td>');
+    }
+    $r->print('<td><a href="/adm/email?forward='.&escape($msgid).$sqs.
 	      '"><b>'.&mt('Forward').'</b></a></td>'.
 	      '<td><a href="/adm/email?markunread='.&escape($msgid).$sqs.
 	      '"><b>'.&mt('Mark Unread').'</b></a></td>'.
@@ -2054,6 +2113,7 @@ sub displaymessage {
         $symb=&Apache::lonnet::symbread($content{'baseurl'});
     }
     if ($env{'user.adv'}) {
+	my $adv_actions;
 	$r->print('<table border="2" width="100%"><tr bgcolor="#FFAAAA"><td>'.&mt('Currently available actions (will open extra window)').':</td>');
 	if (&Apache::lonnet::allowed('vgr',$env{'request.course.id'})) {
 		$r->print('<td><b>'.&Apache::loncommon::track_student_link(&mt('View recent activity'),$content{'sendername'},$content{'senderdomain'},'check').'</b></td>');
@@ -2074,7 +2134,7 @@ sub displaymessage {
                &Apache::loncommon::plainname($content{'recuser'}[$i],
                                       $content{'recdomain'}[$i]),
                   $content{'recuser'}[$i],$content{'recdomain'}[$i]).
-           ' ('.$content{'recuser'}[$i].' at '.$content{'recdomain'}[$i].') ';
+           ' ('.$content{'recuser'}[$i].' '.&mt('at').' '.$content{'recdomain'}[$i].') ';
         }
     }
     $tolist = join(', ',@recipients);
@@ -2093,20 +2153,42 @@ sub displaymessage {
     if (defined($content{'baseurl'})) {
         $baseurl = &Apache::lonenc::check_encrypt($content{'baseurl'});
     }
-    $r->print(&Apache::loncommon::student_image_tag($content{'senderdomain'},$content{'sendername'}));
+    if ($from_student && $see_anonymous ) {
+	$r->print(&Apache::loncommon::student_image_tag($content{'senderdomain'},$content{'sendername'}));
+    }
+
     $r->print('<br /><b>'.&mt('Subject').':</b> '.$content{'subject'});
     if ($folder eq 'sent') {
         $r->print('<br /><b>'.&mt('To').':</b> '.$tolist);
+        if ($content{'replytoaddr'}) {
+            my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
+            if ($replytoname ne '' && $replytodom ne '') {
+                $r->print('<br /><b>'.&mt('Reply To').':</b> '.
+                          $replytoname.' '.&mt('at').' '.$replytodom);
+            }
+        }
     } else {
         $r->print('<br /><b>'.&mt('From').':</b> '.
 	      &Apache::loncommon::aboutmewrapper(
 						 &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),
-						 $content{'sendername'},$content{'senderdomain'}).' ('.
-	      $content{'sendername'}.' at '.
-	      $content{'senderdomain'}.') ');
-        if ($cclist) {
-            $r->print('<br /><b>'.&mt('Cc').':</b> '.$cclist);
-        }
+						 $content{'sendername'},$content{'senderdomain'}));
+        if ($content{'noreplies'}) {
+            $r->print(' ('.&mt('No replies to sender').')'); 
+        } else {
+            if ($content{'replytoaddr'}) {
+                my ($replytoname,$replytodom) = split(/:/,$content{'replytoaddr'});
+                if ($replytoname ne '' && $replytodom ne '') {
+                    $r->print('<br /><b>'.&mt('Reply To').':</b> '.
+                              $replytoname.' '.&mt('at').' '.$replytodom);
+                }
+            } else {
+                $r->print(' ('.$content{'sendername'}.' '.&mt('at').' '.
+                          $content{'senderdomain'}.') ');
+            }
+            if ($cclist) {
+                $r->print('<br /><b>'.&mt('Cc').':</b> '.$cclist);
+            }
+        } 
     }
     if ($content{'courseid'}) {
         $r->print('<br /><b>'.&mt($crstype).':</b> '.$courseinfo{'description'});
@@ -2182,12 +2264,16 @@ sub retrieve_cc_recips {
                      ($ccdom eq $env{'user.domain'}))) {
                     my $showcc ='<span class="LC_nobreak">';
                     if ($context eq 'replying') { 
-                        $showcc = '<label><input type="checkbox" name="replying_cc" value="'.$cc.'">';
+                        $showcc = '<label><input type="checkbox" name="replying_cc" value="'.$cc.'" />';
                     }
                     $showcc .= &Apache::loncommon::aboutmewrapper(
                                        &Apache::loncommon::plainname($ccname,
-                                         $ccdom),$ccname,$ccdom).'</label></span>';
-                    push (@ccs,$showcc);
+                                         $ccdom),$ccname,$ccdom);
+		    if ($context eq 'replying') {
+			$showcc .='</label>';
+		    }
+		    $showcc .= '</span>';
+		    push(@ccs,$showcc);
                 }
             }
         }
@@ -2515,7 +2601,7 @@ sub sendoffmail {
                            \@recudoms);
                     }
                 } else {
-                    &Apache::lonnet::logthis('Failed to create record of critical, broadcast or archived message in '.$env{'course.'.$env{'request.course.id'}.'.num'}.' at '.$env{'course.'.$env{'request.course.id'}.'.domain'}.' - no msgid generated');
+                    &Apache::lonnet::logthis('Failed to create record of critical, broadcast or archived message in '.$env{'course.'.$env{'request.course.id'}.'.num'}.' '&mt('at').' '.$env{'course.'.$env{'request.course.id'}.'.domain'}.' - no msgid generated');
                 }
             } else {
                 my $stamp = time;
@@ -2632,16 +2718,19 @@ sub handler {
 	&printheader($r,'','Confirmed Receipt');
 	my $replying = 0;
 	foreach my $envkey (keys(%env)) {
-	    if ($envkey=~/^form\.rec\_(.*)$/) {
-		$r->print('<b>'.&mt('Confirming Receipt').':</b> '.
-			  &Apache::lonmsg::user_crit_received($1).'<br>');
-	    }
-	    if ($envkey=~/^form\.reprec\_(.*)$/) {
-		my $msgid=$1;
-		$r->print('<b>'.&mt('Confirming Receipt').':</b> '.
-			  &Apache::lonmsg::user_crit_received($msgid).'<br>');
-		&compout($r,'','','',$msgid);
-		$replying = 1;
+	    if ($envkey=~/^form\.(rep)?rec\_(.*)$/) {
+                my $repchk = $1;
+       		my $msgid = $2;
+		$r->print('<b>'.&mt('Confirming Receipt').':</b> ');
+		my $result = &Apache::lonmsg::user_crit_received($msgid);
+                if ($result =~ /trans:\s+ok/) {
+                    &statuschange($msgid,'read');
+                }
+                $r->print($result.'<br />');
+                if ($repchk eq 'rep') {
+		    &compout($r,'','','',$msgid);
+		    $replying = 1;
+                }
 	    }
 	}
 	if (!$replying) {