--- loncom/interface/lonfeedback.pm	2002/10/25 13:57:28	1.35
+++ loncom/interface/lonfeedback.pm	2003/02/18 15:47:40	1.41
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Feedback
 #
-# $Id: lonfeedback.pm,v 1.35 2002/10/25 13:57:28 www Exp $
+# $Id: lonfeedback.pm,v 1.41 2003/02/18 15:47:40 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -183,16 +183,16 @@ sub screen_header {
     $options= 
       '<p><input type=checkbox name=author> Feedback to resource author';
   }
-  if ($ENV{'course.'.$ENV{'request.course.id'}.'.question.email'}) {
+  if (&feedback_available(1)) {
     $options.=
     '<br><input type=checkbox name=question> Question about resource content';
   }
-  if ($ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'}) {
+  if (&feedback_available(0,1)) {
     $options.=
       '<br><input type=checkbox name=course> '.
 	'Question/Comment/Feedback about course content';
   }
-  if ($ENV{'course.'.$ENV{'request.course.id'}.'.policy.email'}) {
+  if (&feedback_available(0,0,1)) {
     $options.=
       '<br><input type=checkbox name=policy> '.
 	'Question/Comment/Feedback about course policy';
@@ -226,15 +226,29 @@ sub resource_output {
 }
 
 sub clear_out_html {
-  my $message=$ENV{'form.comment'};
-  $message=~s/\<\/*m\s*\>//g;
-  $message=~s/\</\&lt\;/g;
-  $message=~s/\>/\&gt\;/g;
+  my ($message,$override)=@_;
+  my $cid=$ENV{'request.course.id'};
+  if (($ENV{"course.$cid.allow_limited_html_in_feedback"} =~ m/yes/i) ||
+      ($override)) {
+      # allows <B> <I> <P> <A> <LI> <OL> <UL> <EM> <BR> <TT> <STRONG> 
+      # <BLOCKQUOTE> <DIV .*> <DIV> <IMG>
+      my %html=(B=>1, I=>1, P=>1, A=>1, LI=>1, OL=>1, UL=>1, EM=>1,
+		BR=>1, TT=>1, STRONG=>1, BLOCKQUOTE=>1, DIV=>1, IMG=>1);
+
+      $message =~ s/\<(\/?\s*(\w+)[^\>\<]*)/
+	  {($html{uc($2)}&(length($1)<1000))?"\<$1":"\&lt;$1"}/ge;
+      $message =~ s/(\<?\s*(\w+)[^\<\>]*)\>/
+	  {($html{uc($2)}&(length($1)<1000))?"$1\>":"$1\&gt;"}/ge;
+  } else {
+      $message=~s/\<\/*m\s*\>//g;
+      $message=~s/\</\&lt\;/g;
+      $message=~s/\>/\&gt\;/g;
+  }
   return $message;
 }
 
 sub assemble_email {
-  my ($feedurl,$message,$prevattempts,$usersaw)=@_;
+  my ($feedurl,$message,$prevattempts,$usersaw,$useranswer)=@_;
   my $email=<<"ENDEMAIL";
 Refers to <a href="$feedurl">$feedurl</a>
 
@@ -246,51 +260,80 @@ $prevattempts
 <p><hr>
 <h2>Original screen output (if applicable)</h2>
 $usersaw
+<h2>Correct Answer(s) (if applicable)</h2>
+$useranswer
 ENDCITE
   return ($email,$citations);
 }
 
 sub secapply {
     my $rec=shift;
-    return $rec;
+    my $defaultflag=shift;
+    $rec=~s/\s+//g;
+    $rec=~s/\@/\:/g;
+    my ($adr,$sections)=($rec=~/^([^\(]+)\(([^\)]+)\)/);
+    if ($sections) {
+	foreach (split(/\;/,$sections)) {
+            if (($_ eq $ENV{'request.course.sec'}) ||
+                ($defaultflag && ($_ eq '*'))) {
+                return $adr; 
+            }
+        }
+    } else {
+       return $rec;
+    }
+    return '';
 }
 
 sub decide_receiver {
-  my ($feedurl) = @_;
+  my ($feedurl,$author,$question,$course,$policy,$defaultflag) = @_;
   my $typestyle='';
   my %to=();
-  if ($ENV{'form.author'}) {
+  if ($ENV{'form.author'}||$author) {
     $typestyle.='Submitting as Author Feedback<br>';
     $feedurl=~/^\/res\/(\w+)\/(\w+)\//;
     $to{$2.':'.$1}=1;
   }
-  if ($ENV{'form.question'}) {
+  if ($ENV{'form.question'}||$question) {
     $typestyle.='Submitting as Question<br>';
     foreach (split(/\,/,
 		   $ENV{'course.'.$ENV{'request.course.id'}.'.question.email'})
 	     ) {
-	if (my $rec=&secapply($_)) { $to{$rec}=1; }
+	my $rec=&secapply($_,$defaultflag);
+        if ($rec) { $to{$rec}=1; }
     } 
   }
-  if ($ENV{'form.course'}) {
+  if ($ENV{'form.course'}||$course) {
     $typestyle.='Submitting as Comment<br>';
     foreach (split(/\,/,
 		   $ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'})
 	     ) {
-	if (my $rec=&secapply($_)) { $to{$rec}=1; }
+	my $rec=&secapply($_,$defaultflag);
+        if ($rec) { $to{$rec}=1; }
     } 
   }
-  if ($ENV{'form.policy'}) {
+  if ($ENV{'form.policy'}||$policy) {
     $typestyle.='Submitting as Policy Feedback<br>';
     foreach (split(/\,/,
 		   $ENV{'course.'.$ENV{'request.course.id'}.'.policy.email'})
 	     ) {
-	if (my $rec=&secapply($_)) { $to{$rec}=1; }
+	my $rec=&secapply($_,$defaultflag);
+        if ($rec) { $to{$rec}=1; }
     } 
   }
+  if ((scalar(%to) eq '0') && (!$defaultflag)) {
+     ($typestyle,%to)=
+	 &decide_receiver($feedurl,$author,$question,$course,$policy,1);
+  }
   return ($typestyle,%to);
 }
 
+sub feedback_available {
+    my ($question,$course,$policy)=@_;
+    my ($typestyle,%to)=&decide_receiver('',0,$question,$course,$policy);
+    return scalar(%to);
+}
+
 sub send_msg {
   my ($feedurl,$email,$citations,%to)=@_;
   my $status='';
@@ -299,7 +342,7 @@ sub send_msg {
     if ($_) {
       my $declutter=&Apache::lonnet::declutter($feedurl);
       unless (&Apache::lonmsg::user_normal_msg(split(/\:/,$_),
-               'Feedback ['.$declutter.']',$email,$citations)=~/ok/) {
+               'Feedback ['.$declutter.']',$email,$citations,$feedurl)=~/ok/) {
 	$status.='<br>Error sending message to '.$_.'<br>';
       } else {
 	$sendsomething++;
@@ -395,7 +438,7 @@ sub handler {
 # --------------------------- Get query string for limited number of parameters
 
    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
-                                       ['hide','unhide','postdata','preview']);
+                             ['hide','unhide','deldisc','postdata','preview']);
 
   if (($ENV{'form.hide'}) || ($ENV{'form.unhide'})) {
 # ----------------------------------------------------------------- Hide/unhide
@@ -427,6 +470,33 @@ sub handler {
 
     &redirect_back($r,&Apache::lonnet::clutter($url),
        'Changed discussion status<p>','0','0');
+  } elsif ($ENV{'form.deldisc'}) {
+# --------------------------------------------------------------- Hide for good
+    $r->content_type('text/html');
+    $r->send_http_header;
+
+    my $entry=$ENV{'form.deldisc'};
+
+    my ($symb,$idx)=split(/\:\:\:/,$entry);
+    my ($map,$ind,$url)=split(/\_\_\_/,$symb);
+
+    my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},
+                     $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
+		     $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+
+        
+    my $currentdeleted=$contrib{'deleted'};
+    
+    $currentdeleted.='.'.$idx.'.';
+
+    my %newhash=('deleted' => $currentdeleted);
+
+    &Apache::lonnet::store(\%newhash,$symb,$ENV{'request.course.id'},
+                     $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
+		     $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+
+    &redirect_back($r,&Apache::lonnet::clutter($url),
+       'Changed discussion status<p>','0','0');
   } elsif ($ENV{'form.preview'}) {
 # -------------------------------------------------------- User wants a preview
       &show_preview($r);
@@ -482,13 +552,18 @@ sub handler {
 # Get output from resource
       my $usersaw=&resource_output($feedurl);
 
+# Get resource answer
+      my $useranswer=&Apache::loncommon::get_student_answers(
+                       $symb,$ENV{'user.name'},$ENV{'user.domain'},
+		       $ENV{'request.course.id'});
+
 # Filter HTML out of message (could be nasty)
-      my $message=&clear_out_html;
+      my $message=&clear_out_html($ENV{'form.comment'});
 
 # Assemble email
       my ($email,$citations)=&assemble_email($feedurl,$message,$prevattempts,
-          $usersaw);
-
+          $usersaw,$useranswer);
+ 
 # Who gets this?
       my ($typestyle,%to) = &decide_receiver($feedurl);