--- loncom/interface/lonmsgdisplay.pm	2007/05/02 01:33:49	1.72
+++ loncom/interface/lonmsgdisplay.pm	2007/05/02 19:56:34	1.73
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines for messaging display
 #
-# $Id: lonmsgdisplay.pm,v 1.72 2007/05/02 01:33:49 albertel Exp $
+# $Id: lonmsgdisplay.pm,v 1.73 2007/05/02 19:56:34 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -390,6 +390,9 @@ sub renamefolder {
     if ($env{'form.renamed'} eq '') {
         return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is an invalid name.',$folder,$newname);
     }
+    if (defined($permfolders{$folder})) {
+        return &mt('The folder "[_1]" may not be renamed as it is a folder provided by the system.',$folder);
+    }
     if (defined($permfolders{$newname})) {
         return &mt('The folder "[_1]" may not be renamed to "[_2]" as the new name you requested is reserved for folders provided automatically by the system.',$folder,$newname);
     }
@@ -1279,6 +1282,12 @@ will be forwarded to the recipient(s) yo
 		    &mt('Show re-usable messages').'</a><br />';
 	    }
 	}
+        my $jscript = &Apache::loncommon::check_uncheck_jscript();
+        $r->print(<<"ENDREPSCRIPT");
+<script type="text/javascript">
+$jscript
+</script>
+ENDREPSCRIPT
     }
     my $citation=&displayresource(%content);
     my ($can_grp_broadcast,$viewgrps,$editgrps);
@@ -1318,6 +1327,22 @@ will be forwarded to the recipient(s) yo
 		      '<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) {
+                    my $replyall = qq|
+ <span class="LC_nobreak">
+      <input type="button" value="check all"
+        onclick="javascript:checkAll(document.compemail.replying_cc)" />
+        &nbsp;&nbsp;
+      <input type="button" value="uncheck all"
+        onclick="javascript:uncheckAll(document.compemail.replying_cc)" />
+ </span>
+|;
+                    my $cclist = join(' ',@ccs);
+                    $r->print('<tr><td>'.&mt('Reply to other recipients').':<br />'.$replyall.'</td><td>'.$cclist.'</td></tr>');
+                }
+            }
 	} else {
             $r->print(&recipient_input_row($defdom,%lt));
         }
@@ -1437,10 +1462,13 @@ ENDREC
 
 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>
-<input type="text" size="50" name="additionalrec" /></td></tr>
+<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>
 ENDADD
     return $output;
 }
@@ -1984,7 +2012,6 @@ sub displaymessage {
     }
     my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);
     my %content=&Apache::lonmsg::unpackagemsg($message{$msgid});
-
     my $counter=0;
     $r->print('<pre>');
     my $escmsgid=&escape($msgid);
@@ -2039,16 +2066,22 @@ sub displaymessage {
 	}
 	$r->print('</tr></table>');
     }
-    my $tolist;
-    my @recipients = ();
-    for (my $i=0; $i<@{$content{'recuser'}}; $i++) {
-        $recipients[$i] =  &Apache::loncommon::aboutmewrapper(
-           &Apache::loncommon::plainname($content{'recuser'}[$i],
+    my ($tolist,$cclist);
+    my (@recipients,@ccs);
+    if (ref($content{'recuser'}) eq 'ARRAY') {
+        for (my $i=0; $i<@{$content{'recuser'}}; $i++) {
+            $recipients[$i] =  &Apache::loncommon::aboutmewrapper(
+               &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],$content{'recdomain'}[$i]).
+           ' ('.$content{'recuser'}[$i].' at '.$content{'recdomain'}[$i].') ';
+        }
     }
     $tolist = join(', ',@recipients);
+    if ($content{'recipid'}) {
+        @ccs = &retrieve_cc_recips('display',%content);
+        $cclist = join(', ',@ccs);
+    }
     my ($restitle,$baseurl,$refers_to);
     if (defined($content{'resource_title'})) {
         $restitle = $content{'resource_title'};
@@ -2061,17 +2094,27 @@ sub displaymessage {
         $baseurl = &Apache::lonenc::check_encrypt($content{'baseurl'});
     }
     $r->print(&Apache::loncommon::student_image_tag($content{'senderdomain'},$content{'sendername'}));
-    $r->print('<br /><b>'.&mt('Subject').':</b> '.$content{'subject'}.
-	      ($folder ne 'sent'?'<br /><b>'.&mt('From').':</b> '.
+    $r->print('<br /><b>'.&mt('Subject').':</b> '.$content{'subject'});
+    if ($folder eq 'sent') {
+        $r->print('<br /><b>'.&mt('To').':</b> '.$tolist);
+    } 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'}.') ':'<br /><b>'.&mt('To').':</b> '.
-              $tolist).
-	      ($content{'courseid'}?'<br /><b>'.&mt($crstype).':</b> '.$courseinfo{'description'}.
-	       ($content{'coursesec'}?' ('.&mt('Section').': '.$content{'coursesec'}.')':''):'').
-	      '<br /><b>'.&mt('Time').':</b> '.$content{'time'});
+	      $content{'senderdomain'}.') ');
+        if ($cclist) {
+            $r->print('<br /><b>'.&mt('Cc').':</b> '.$cclist);
+        }
+    }
+    if ($content{'courseid'}) {
+        $r->print('<br /><b>'.&mt($crstype).':</b> '.$courseinfo{'description'});
+        if ($content{'coursesec'}) {
+            $r->print(' ('.&mt('Section').': '.$content{'coursesec'}.')');
+        }
+    }
+    $r->print('<br /><b>'.&mt('Time').':</b> '.$content{'time'});
     if ($baseurl) {
         if (defined($content{'courseid'}) && defined($env{'request.course.id'})) {
             if ($content{'courseid'} eq $env{'request.course.id'}) {
@@ -2124,6 +2167,34 @@ sub displaymessage {
     return;
 }
 
+sub retrieve_cc_recips {
+    my ($context,%content) = @_; 
+    my %reciphash =
+         &Apache::lonnet::get('nohist_emailrecip',[$content{'recipid'}],
+                              $content{'senderdomain'},$content{'sendername'});
+    my $recipinfo = $reciphash{$content{'recipid'}};
+    my @ccs;
+    if (ref($recipinfo) eq 'HASH') {
+        if (ref($recipinfo->{'cc'}) eq 'HASH') {
+            foreach my $cc (sort(keys(%{$recipinfo->{'cc'}}))) {
+                my ($ccname,$ccdom) = split(/:/,$cc);
+                if (!(($ccname eq $env{'user.name'}) &&
+                     ($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 .= &Apache::loncommon::aboutmewrapper(
+                                       &Apache::loncommon::plainname($ccname,
+                                         $ccdom),$ccname,$ccdom).'</label></span>';
+                    push (@ccs,$showcc);
+                }
+            }
+        }
+    }
+    return @ccs;
+}
+
 # =========================================================== Show the citation
 
 sub displayresource {
@@ -2271,7 +2342,7 @@ sub sendoffmail {
 	    &Apache::loncommon::get_env_multiple('form.selectedusers_forminput');
 	my $mode = $env{'form.sendmode'};
 
-	my %toaddr;
+	my (%toaddr,$cc,$bcc);
 	if (@to) {
 	    foreach my $dest (@to) {
 		my ($user,$domain) = split(/:/, $dest);
@@ -2301,17 +2372,38 @@ sub sendoffmail {
 	} else {
 	    if (($env{'form.recuname'} ne '') && ($env{'form.recdomain'} ne '')) {
 		$toaddr{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
+                $cc->{$env{'form.recuname'}.':'.$env{'form.recdomain'}}='';
 	    }
 	}
-	if ($env{'form.additionalrec'}) {
-	    foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec'})) {
+	if ($env{'form.additionalrec_cc'}) {
+	    foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_cc'})) {
 		my ($auname,$audom)=split(/:/,$rec);
 		if (($auname ne "") && ($audom ne "")) {
-		    $toaddr{$auname.':'.$audom}='';
+                    $toaddr{$auname.':'.$audom}='';
+		    $cc->{$auname.':'.$audom}='';
 		}
 	    }
 	}
-
+        if ($env{'form.additionalrec_bcc'}) {
+            foreach my $rec (split(/\s*,\s*/,$env{'form.additionalrec_bcc'})) {
+                my ($auname,$audom)=split(/:/,$rec);
+                if (($auname ne "") && ($audom ne "")) {
+                    $toaddr{$auname.':'.$audom}='';
+                    $bcc->{$auname.':'.$audom}='';
+                }
+            }
+        }
+        if ($env{'form.replying_cc'}) {
+            my @ccreplies = 
+                &Apache::loncommon::get_env_multiple('form.replying_cc');
+            foreach my $rec (@ccreplies) {
+                my ($auname,$audom)=split(/:/,$rec);
+                if (($auname ne "") && ($audom ne "")) {
+                    $toaddr{$auname.':'.$audom}='';
+                    $cc->{$auname.':'.$audom}='';
+                }
+            }
+        }
         my $savemsg;
         my $msgtype;
         my %sentmessage;
@@ -2327,12 +2419,24 @@ sub sendoffmail {
         } else {
             $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});
         }
+        my %reciphash = (
+                           cc => $cc,
+                           bcc => $bcc,
+                        ); 
+        my ($recipid,$recipstatus) = 
+            &Apache::lonmsg::store_recipients($msgsubj,$env{'user.name'},
+                                       $env{'user.domain'},\%reciphash);
+        if ($recipstatus ne 'ok') {
+            &Apache::lonnet::logthis('Failed to store Bcc and Cc recipients for '.$env{'user.name'}.':'.$env{'user.domain'});
+        }  
         my @recusers;
         my @recudoms;
 	foreach my $address (sort(keys(%toaddr))) {
 	    my ($recuname,$recdomain)=split(/\:/,$address);
             my $msgtxt = $savemsg;
-	    if ($toaddr{$address}) { $msgtxt.='<hr />'.$toaddr{$address}; }
+            if ($toaddr{$address}) {
+	        $msgtxt.='<hr />'.$toaddr{$address};
+            }
 	    my @thismsg;
 	    if ($msgtype eq 'critical') {
 		$r->print(&mt('Sending critical message').' '.
@@ -2343,7 +2447,7 @@ sub sendoffmail {
 						   $env{'form.sendbck'},
 						   $env{'form.permanent'},
 						   \$sentmessage{$address},
-                                                   $nosentstore);
+                                                   $nosentstore,$recipid);
 	    } else {
 		$r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': ');
 		@thismsg=
@@ -2354,7 +2458,7 @@ sub sendoffmail {
 						     $env{'form.permanent'},
 						     \$sentmessage{$address},
                                                      undef,undef,undef,
-                                                     $nosentstore);
+                                                     $nosentstore,$recipid);
             }
 	    $msg_status{$recuname.':'.$recdomain}=join(' ',@thismsg);
 	    if ($msg_status{$recuname.':'.$recdomain} =~ /(ok|con_delayed)/) {