--- loncom/interface/lonmsg.pm	2004/06/02 20:40:07	1.102
+++ loncom/interface/lonmsg.pm	2004/09/10 08:42:21	1.107
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Routines for messaging
 #
-# $Id: lonmsg.pm,v 1.102 2004/06/02 20:40:07 raeburn Exp $
+# $Id: lonmsg.pm,v 1.107 2004/09/10 08:42:21 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -201,10 +201,12 @@ sub unpackagemsg {
 # ======================================================= Get info out of msgid
 
 sub unpackmsgid {
-    my $msgid=&Apache::lonnet::unescape(shift);
+    my ($msgid,$folder)=@_;
+    $msgid=&Apache::lonnet::unescape($msgid);
+    my $suffix=&foldersuffix($folder);
     my ($sendtime,$shortsubj,$fromname,$fromdomain)=split(/\:/,
                           &Apache::lonnet::unescape($msgid));
-    my %status=&Apache::lonnet::get('email_status',[$msgid]);
+    my %status=&Apache::lonnet::get('email_status'.$suffix,[$msgid]);
     if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; }
     unless ($status{$msgid}) { $status{$msgid}='new'; }
     return ($sendtime,$shortsubj,$fromname,$fromdomain,$status{$msgid});
@@ -219,10 +221,14 @@ sub sendemail {
     my $msg = new Mail::Send;
     $msg->to($to);
     $msg->subject('[LON-CAPA] '.$subject);
+    my %oldENV=%ENV;
+    undef(%ENV);
     if (my $fh = $msg->open()) {
 	print $fh $body;
 	$fh->close;
     }
+    %ENV=%oldENV;
+    undef(%oldENV);
 }
 
 # ==================================================== Send notification emails
@@ -494,20 +500,77 @@ sub user_normal_msg {
 }
 
 
+# ============================================================ List all folders
+
+sub folderlist {
+    my $folder=shift;
+    my @allfolders=&Apache::lonnet::getkeys('email_folders');
+    if ($allfolders[0]=~/^error:/) { @allfolders=(); }
+    return '<form method="post" action="/adm/email">'.
+	'<input type="submit" value="'.&mt('View Folder').'" />'.
+	&Apache::loncommon::select_form($folder,'folder',
+			     ('' => &mt('INBOX'),'trash' => &mt('TRASH'),
+			      'sent' => &mt('Sent Messages'),
+			      map { $_ => $_ } @allfolders)).
+	'<a href="/adm/email?critical=display">'.
+	    &mt('View Critical Messages').'</a>'.
+        '</form>';
+}
+# =============================================================== Folder suffix
+
+sub foldersuffix {
+    my $folder=shift;
+    unless ($folder) { return ''; }
+    return '_'.&Apache::lonnet::escape($folder);
+}
+
 # =============================================================== Status Change
 
 sub statuschange {
-    my ($msgid,$newstatus)=@_;
-    my %status=&Apache::lonnet::get('email_status',[$msgid]);
+    my ($msgid,$newstatus,$folder)=@_;
+    my $suffix=&foldersuffix($folder);
+    my %status=&Apache::lonnet::get('email_status'.$suffix,[$msgid]);
     if ($status{$msgid}=~/^error\:/) { $status{$msgid}=''; }
     unless ($status{$msgid}) { $status{$msgid}='new'; }
     unless (($status{$msgid} eq 'replied') || 
             ($status{$msgid} eq 'forwarded')) {
-	&Apache::lonnet::put('email_status',{$msgid => $newstatus});
+	&Apache::lonnet::put('email_status'.$suffix,{$msgid => $newstatus});
     }
     if (($newstatus eq 'deleted') || ($newstatus eq 'new')) {
-	&Apache::lonnet::put('email_status',{$msgid => $newstatus});
+	&Apache::lonnet::put('email_status'.$suffix,{$msgid => $newstatus});
+    }
+}
+
+# ============================================================= Make new folder
+
+sub makefolder {
+    my ($newfolder)=@_;
+    &Apache::lonnet::put('email_folders',{$newfolder => time});
+}
+
+# ======================================================== Move between folders
+
+sub movemsg {
+    my ($msgid,$srcfolder,$trgfolder)=@_;
+    my $unmsgid=&Apache::lonnet::unescape($msgid);
+    my $srcsuffix=&foldersuffix($srcfolder);
+    my $trgsuffix=&foldersuffix($trgfolder);
+
+# Copy message
+    my %message=&Apache::lonnet::get('nohist_email'.$srcsuffix,[$msgid]);
+    &Apache::lonnet::put('nohist_email'.$trgsuffix,{$msgid => $message{$msgid}});
+
+# Copy status
+    my %status=&Apache::lonnet::get('email_status'.$srcsuffix,[$unmsgid]);
+    &Apache::lonnet::put('email_status'.$trgsuffix,{$unmsgid => $status{$unmsgid}});
+# See if was deleted -> becomes "read" in trash
+    my $currentstatus=(&unpackmsgid($status{$unmsgid}));
+    if ($currentstatus eq 'deleted') {
+	&statuschange($msgid,'read',$trgfolder);
     }
+# Delete orginals
+    &Apache::lonnet::del('nohist_email'.$srcsuffix,[$msgid]);
+    &Apache::lonnet::del('email_status'.$srcsuffix,[$unmsgid]);
 }
 
 # ======================================================= Display a course list
@@ -607,13 +670,13 @@ sub discrit {
         my %content=&unpackagemsg($what{$_});
         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::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).'</b> ('.
 $content{'sendername'}.'@'.
             $content{'senderdomain'}.') '.$content{'time'}.
-            '<br>'.&mt('Subject').': '.$content{'subject'}.
-            '<br><blockquote>'.
+            '<br />'.&mt('Subject').': '.$content{'subject'}.
+            '<br /><blockquote>'.
               &Apache::lontexconvert::msgtexconverted($content{'message'}).
             '</blockquote><small>'.
 &mt('You have to confirm that you received this message. After confirmation, this message will be moved to your regular inbox').
@@ -625,17 +688,19 @@ $content{'sendername'}.'@'.
     # Check to see if there were any messages.
     if ($result eq '') {
         $result = "<h2>".&mt('You have no critical messages.')."</h2>".
-	    '<a href="/adm/roles">'.&mt('Select a course').'</a>';
+	    '<a href="/adm/roles">'.&mt('Select a course').'</a><br />'.
+            '<a href="/adm/email">'.&mt('Communicate').'</a>';
     } else {
         $r->print($header);
     }
     $r->print($result);
-    $r->print('<input type=hidden name="displayedcrit" value="true"></form>');
+    $r->print('<input type=hidden name="displayedcrit" value="true" /></form>');
 }
 
 sub sortedmessages {
-    my ($blocked,$startblock,$endblock,$numblocked) = @_;
-    my @messages = &Apache::lonnet::getkeys('nohist_email');
+    my ($blocked,$startblock,$endblock,$numblocked,$folder) = @_;
+    my $suffix=&foldersuffix($folder);
+    my @messages = &Apache::lonnet::getkeys('nohist_email'.$suffix);
     #unpack the varibles and repack into temp for sorting
     my @temp;
     foreach (@messages) {
@@ -691,7 +756,7 @@ sub sortedmessages {
 # ======================================================== Display all messages
 
 sub disall {
-    my $r=shift;
+    my ($r,$folder)=@_;
     my %blocked = ();
     my %setters = ();
     my $startblock;
@@ -719,9 +784,10 @@ sub disall {
     }
 </script>
 ENDDISHEADER
-    $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>');
+    $r->print('<h2>'.&mt('Display All Messages').'</h2>'.
+	      &folderlist($folder).
+	      '<form method="post" name="disall" action="/adm/email">'.
+	      '<table border=2><tr><th colspan="3">&nbsp</th><th>');
     if ($ENV{'form.sortedby'} eq "revdate") {
 	$r->print('<a href = "?sortedby=date">'.&mt('Date').'</a></th>');
     } else {
@@ -752,7 +818,7 @@ ENDDISHEADER
      	$r->print('<a href = "?sortedby=revstatus">'.&mt('Status').'</th>');
     }
     $r->print('</tr>');
-    my @temp=sortedmessages(\%blocked,$startblock,$endblock,\$numblocked);
+    my @temp=sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder);
     foreach (@temp){
 	my ($sendtime,$shortsubj,$fromname,$fromdomain,$status,$origID)= @$_;
 	if (($status ne 'deleted') && defined($sendtime) && $sendtime!~/error/) {
@@ -765,21 +831,35 @@ ENDDISHEADER
 	    } else {
 		$r->print('<tr bgcolor="#99BBBB">');
 	    }
-	    $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>'.
+	    $r->print('<td></a><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').'</td>'.
 		      '<td>'.&Apache::lonlocal::locallocaltime($sendtime).'</td><td>'.
 		      $fromname.'</td><td>'.$fromdomain.'</td><td>'.
 		      &Apache::lonnet::unescape($shortsubj).'</td><td>'.
                       $status.'</td></tr>');
+	} elsif ($status eq 'deleted') {
+# purge
+	    &movemsg($origID,$folder,'trash');
 	}
     }   
     $r->print('</table><p>'.
-              '<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>');
+  '<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'}.'" />');
+    if ($folder ne 'trash') {
+	$r->print(
+	      '<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').'" />');
+    my @allfolders=&Apache::lonnet::getkeys('email_folders');
+    if ($allfolders[0]=~/^error:/) { @allfolders=(); }
+    $r->print(
+	&Apache::loncommon::select_form('','movetofolder',
+			     ( map { $_ => $_ } @allfolders))
+	      );
+    $r->print('<input type="hidden" name="folder" value="'.$folder.'" /></form>');
     if ($numblocked > 0) {
         my $beginblock = &Apache::lonlocal::locallocaltime($startblock);
         my $finishblock = &Apache::lonlocal::locallocaltime($endblock);
@@ -787,7 +867,6 @@ ENDDISHEADER
                   $numblocked.' '.&mt('message(s) is/are not viewable because display of LON-CAPA messages sent to you by other students between').' '.$beginblock.' '.&mt('and').' '.$finishblock.' '.&mt('is currently being blocked because of online exams.'));
         &build_block_table($r,$startblock,$endblock,\%setters);
     }
-    $r->print('</body></html>');
 }
 
 # ============================================================== Compose output
@@ -857,8 +936,8 @@ sub compout {
     if ($replying) {
 	%message=&Apache::lonnet::get('nohist_email',[$replying]);
 	%content=&unpackagemsg($message{$replying});
-	$dispcrit.='<input type="hidden" name="forwid" value="'.
-	    $forwarding.'" />';
+	$dispcrit.='<input type="hidden" name="replyid" value="'.
+	    $replying.'" />';
 	$func=&mt('Replying to');
 	
 	$dissub=&mt('Reply').': '.$content{'subject'};       
@@ -945,6 +1024,31 @@ ENDUPLOAD
 
 # ---------------------------------------------------- Display all face to face
 
+sub retrieve_instructor_comments {
+    my ($user,$domain)=@_;
+    my $target=$ENV{'form.grade_target'};
+    if (! $ENV{'request.course.id'}) { return; }
+    if (! &Apache::lonnet::allowed('srm',$ENV{'request.course.id'})) {
+	return;
+    }
+    my %records=&Apache::lonnet::dump('nohist_email',
+			 $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
+			 $ENV{'course.'.$ENV{'request.course.id'}.'.num'},
+                         '%255b'.$user.'%253a'.$domain.'%255d');
+    my $result='';
+    foreach (sort(keys(%records))) {
+        my %content=&unpackagemsg($records{$_});
+        next if ($content{'senderdomain'} eq '');
+        next if ($content{'subject'} !~ /^Record/);
+        # $content{'message'}=~s/\n/\<br\>/g;
+        $result.='Recorded by '.
+            $content{'sendername'}.'@'.$content{'senderdomain'}."\n";
+        $result.=
+            &Apache::lontexconvert::msgtexconverted($content{'message'})."\n";
+     }
+    return $result;
+}
+
 sub disfacetoface {
     my ($r,$user,$domain)=@_;
     my $target=$ENV{'form.grade_target'};
@@ -1433,7 +1537,8 @@ END
 # ----------------------------------------------------------- Display a message
 
 sub displaymessage {
-    my ($r,$msgid)=@_;
+    my ($r,$msgid,$folder)=@_;
+    my $suffix=&foldersuffix($folder);
     my %blocked = ();
     my %setters = ();
     my $startblock = 0;
@@ -1441,16 +1546,17 @@ sub displaymessage {
     my $numblocked = 0;
 # info to generate "next" and "previous" buttons and check if message is blocked
     &blockcheck(\%setters,\$startblock,\$endblock);
-    my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked);
+    my @messages=&sortedmessages(\%blocked,$startblock,$endblock,\$numblocked,$folder);
     if ( $blocked{$msgid} eq 'ON' ) {
         &printheader($r,'/adm/email',&mt('Display a Message'));
         $r->print(&mt('You attempted to display a message that is currently blocked because you are enrolled in one or more courses for which there is an ongoing online exam.'));
         &build_block_table($r,$startblock,$endblock,\%setters);
         return;
     }
-    &statuschange($msgid,'read');
-    my %message=&Apache::lonnet::get('nohist_email',[$msgid]);
+    &statuschange($msgid,'read',$folder);
+    my %message=&Apache::lonnet::get('nohist_email'.$suffix,[$msgid]);
     my %content=&unpackagemsg($message{$msgid});
+
     my $counter=0;
     $r->print('<pre>');
     my $escmsgid=&Apache::lonnet::escape($msgid);
@@ -1476,6 +1582,7 @@ sub displaymessage {
 	      '<td><a href="/adm/email?markdel='.&Apache::lonnet::escape($msgid).$sqs.
 	      '"><b>Delete</b></a></td>'.
 	      '<td><a href="/adm/email?sortedby='.$ENV{'form.sortedby'}.
+	      '&folder='.&Apache::lonnet::escape($folder).
 	      '"><b>'.&mt('Display all Messages').'</b></a></td>');
     if ($counter > 0){
 	$r->print('<td><a href="/adm/email?display='.$messages[$counter-1]->[5].$sqs.
@@ -1544,7 +1651,7 @@ sub handler {
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
         ['display','replyto','forward','markread','markdel','markunread',
          'sendreply','compose','sendmail','critical','recname','recdom',
-         'recordftf','sortedby','block']);
+         'recordftf','sortedby','block','folder']);
     $sqs='&sortedby='.$ENV{'form.sortedby'};
 # ------------------------------------------------------ They checked for email
     unless ($ENV{'form.block'}) {
@@ -1559,10 +1666,19 @@ sub handler {
           text=>"Communication/Messages",
           faq=>12,bug=>'Communication Tools',});
 
+# ------------------------------------------------------------------ Get Folder
+
+    my $folder=$ENV{'form.folder'};
+    unless ($folder) { 
+	$folder=''; 
+    } else {
+	$sqs='&folder='.&Apache::lonnet::escape($folder);
+    }
+
 # --------------------------------------------------------------- Render Output
 
     if ($ENV{'form.display'}) {
-	&displaymessage($r,$ENV{'form.display'});
+	&displaymessage($r,$ENV{'form.display'},$folder);
     } elsif ($ENV{'form.replyto'}) {
 	&compout($r,'',$ENV{'form.replyto'});
     } elsif ($ENV{'form.confirm'}) {
@@ -1587,8 +1703,20 @@ sub handler {
 	&compout($r,$ENV{'form.forward'});
     } elsif ($ENV{'form.markdel'}) {
 	&printheader($r,'','Deleted Message');
-	&statuschange($ENV{'form.markdel'},'deleted');
-	&disall($r);
+	&statuschange($ENV{'form.markdel'},'deleted',$folder);
+	&disall($r,$folder);
+    } elsif ($ENV{'form.markedmove'}) {
+	my $total=0;
+	foreach (keys %ENV) {
+	    if ($_=~/^form\.delmark_(.*)$/) {
+		&movemsg(&Apache::lonnet::unescape($1),$folder,
+			 $ENV{'form.movetofolder'});
+		$total++;
+	    }
+	}
+	&printheader($r,'','Moved Messages');
+	$r->print('Moved '.$total.' message(s)<p>');
+	&disall($r,$folder);
     } elsif ($ENV{'form.markeddel'}) {
 	my $total=0;
 	foreach (keys %ENV) {
@@ -1599,11 +1727,11 @@ sub handler {
 	}
 	&printheader($r,'','Deleted Messages');
 	$r->print('Deleted '.$total.' message(s)<p>');
-	&disall($r);
+	&disall($r,$folder);
     } elsif ($ENV{'form.markunread'}) {
 	&printheader($r,'','Marked Message as Unread');
 	&statuschange($ENV{'form.markunread'},'new');
-	&disall($r);
+	&disall($r,$folder);
     } elsif ($ENV{'form.compose'}) {
 	&compout($r,'','',$ENV{'form.compose'});
     } elsif ($ENV{'form.recordftf'}) {
@@ -1625,6 +1753,12 @@ sub handler {
 		$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') {
@@ -1696,9 +1830,13 @@ sub handler {
 		      &mt('Please use the browser "Back" button and correct the recipient addresses')
 		      );
 	}
+    } elsif ($ENV{'form.newfolder'}) {
+	&printheader($r,'','New Folder');
+	&makefolder($ENV{'form.newfolder'});
+	&disall($r,$ENV{'form.newfolder'});
     } else {
 	&printheader($r,'','Display All Messages');
-	&disall($r);
+	&disall($r,$folder);
     }
     $r->print('</body></html>');
     return OK;