[LON-CAPA-cvs] cvs: loncom /interface lonfeedback.pm

albertel lon-capa-cvs@mail.lon-capa.org
Mon, 15 Nov 2004 21:35:38 -0000


This is a MIME encoded message

--albertel1100554538
Content-Type: text/plain

albertel		Mon Nov 15 16:35:38 2004 EDT

  Modified files:              
    /loncom/interface	lonfeedback.pm 
  Log:
  - even more better encrypturl support in discussions
  
  
--albertel1100554538
Content-Type: text/plain
Content-Disposition: attachment; filename="albertel-20041115163538.txt"

Index: loncom/interface/lonfeedback.pm
diff -u loncom/interface/lonfeedback.pm:1.132 loncom/interface/lonfeedback.pm:1.133
--- loncom/interface/lonfeedback.pm:1.132	Sun Nov 14 02:54:41 2004
+++ loncom/interface/lonfeedback.pm	Mon Nov 15 16:35:37 2004
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Feedback
 #
-# $Id: lonfeedback.pm,v 1.132 2004/11/14 07:54:41 albertel Exp $
+# $Id: lonfeedback.pm,v 1.133 2004/11/15 21:35:37 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -68,7 +68,7 @@
 }
 
 sub list_discussion {
-    my ($mode,$status,$symb)=@_;
+    my ($mode,$status,$ressymb)=@_;
     my $outputtarget=$ENV{'form.grade_target'};
     if (defined($ENV{'form.export'})) {
 	if($ENV{'form.export'}) {
@@ -86,21 +86,17 @@
 	$crs.='_'.$ENV{'request.course.sec'};
     }                 
     $crs=~s/\_/\//g;
-    unless ($symb) {
-	$symb=&Apache::lonnet::symbread();
-    }
-    unless ($symb) { return ''; }
+    unless ($ressymb) {	$ressymb=&Apache::lonnet::symbread(); }
+    unless ($ressymb) { return ''; }
+    $ressymb=&wrap_symb($ressymb);
+    my $encsymb=&Apache::lonenc::check_encrypt($ressymb);
+    my $viewgrades=(&Apache::lonnet::allowed('vgr',$crs)
+		  && ($ressymb=~/\.(problem|exam|quiz|assess|survey|form)$/));
+    
     my %usernamesort = ();
     my %namesort =();
     my %subjectsort = ();
-# backward compatibility (bulletin boards used to be 'wrapped')
-    my $ressymb=$symb;
-    if ($mode eq 'board') {
-        unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {
-            $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|;
-        }
-    }
-    $ressymb=&Apache::lonenc::check_encrypt($ressymb);
+
 # Get discussion display settings for this discussion
     my $lastkey = $ressymb.'_lastread';
     my $showkey = $ressymb.'_showonlyunread';
@@ -125,7 +121,6 @@
 # Retain identification of "NEW" posts identified in last display, if continuing 'previous' browsing of posts.
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['previous','sortposts','rolefilter','statusfilter','sectionpick','totposters']);
     my $sortposts = $ENV{'form.sortposts'};
-    my $rolefilter = $ENV{'form.rolefilter'};
     my $statusfilter = $ENV{'form.statusfilter'};
     my $sectionpick = $ENV{'form.sectionpick'};
     my $totposters = $ENV{'form.totposters'};
@@ -137,11 +132,12 @@
             $prevread = $dischash{$lastkey};
         }
     }
+	  &Apache::lonnet::logthis("\n last read r symb ".$lastkey);
 
 # Get information about students and non-students in course for filtering display of posts
     my %roleshash = ();
     my %roleinfo = ();
-    if ($rolefilter) {
+    if ($ENV{'form.rolefilter'}) {
         %roleshash = &Apache::lonnet::dump('nohist_userroles',$ENV{'course.'.$ENV{'request.course.id'}.'.domain'},$ENV{'course.'.$ENV{'request.course.id'}.'.num'});
         foreach (keys %roleshash) {
             my ($role,$uname,$udom,$sec) = split/:/,$_;
@@ -204,8 +200,6 @@
     $visit ++;
 
     my $seeid=&Apache::lonnet::allowed('rin',$crs);
-    my $viewgrades=(&Apache::lonnet::allowed('vgr',$crs)
-	&& ($symb=~/\.(problem|exam|quiz|assess|survey|form)$/));
     my @discussionitems=();
     my %shown = ();
     my @posteridentity=();
@@ -231,7 +225,7 @@
     $discinfo{$visitkey} = $visit;
 
     &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
-    &build_posting_display(\%usernamesort,\%subjectsort,\%namesort,\%notshown,\%newitem,\%dischash,\%shown,\%alldiscussion,\%imsitems,\%imsfiles,\%roleinfo,\@discussionitems,\@replies,\@depth,\@posters,\$maxdepth,\$visible,\$newpostsflag,\$current,$status,$viewgrades,$seeid,$prevread,$sortposts,$ressymb,$target,$readkey,$showunmark,$showonlyunread,$totposters,$rolefilter,$sectionpick,$statusfilter,$toggkey,$outputtarget);
+    &build_posting_display(\%usernamesort,\%subjectsort,\%namesort,\%notshown,\%newitem,\%dischash,\%shown,\%alldiscussion,\%imsitems,\%imsfiles,\%roleinfo,\@discussionitems,\@replies,\@depth,\@posters,\$maxdepth,\$visible,\$newpostsflag,\$current,$status,$viewgrades,$seeid,$prevread,$sortposts,$encsymb,$target,$readkey,$showunmark,$showonlyunread,$totposters,$ENV{'form.rolefilter'},$sectionpick,$statusfilter,$toggkey,$outputtarget);
 
     my $discussion='';
     my $manifestfile;
@@ -361,7 +355,8 @@
    }
 </script>
             |;
-	    $discussion.='<form name="readchoices" method="post" action="/adm/feedback?chgreads='.$ressymb.'"><table bgcolor="#AAAAAA" cellpadding="2" cellspacing="2" border="0">';
+	    #FIXME need a <form back here for indiviaual red toggling
+	    $discussion.='<form><table bgcolor="#AAAAAA" cellpadding="2" cellspacing="2" border="0">';
 	    $discussion .='<tr><td bgcolor="#DDDDBB" colspan="'.$colspan.'">'.
 		'<table border="0" width="100%" bgcolor="#DDDDBB"><tr>';
 	    if ($visible>2) {
@@ -567,7 +562,8 @@
              </td>
             </tr>
            </table>
-           <br /><br /></form>
+           <br /><br />
+	   </form>
 END
         } 
         if ($outputtarget eq 'export') {
@@ -693,8 +689,8 @@
 
     my @original=();
     my @index=();
-
-    my %contrib=&Apache::lonnet::restore($ressymb,$ENV{'request.course.id'},
+    my $symb=&Apache::lonenc::check_decrypt($ressymb);
+    my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},
 			  $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
 			  $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
 
@@ -986,6 +982,7 @@
                                     $$shown{$idx} = 1;
                                 } else {
                                     foreach my $role (@{$$roleinfo{$poster}}) {
+					&Apache::lonnet::logthis("\n rolematch $rolematch\nrole $role");
                                         if ($role =~ m/^$rolematch$/) {
                                             $$shown{$idx} = 1;
                                             last;
@@ -1480,10 +1477,7 @@
 
 sub print_display_options {
     my ($r,$symb,$previous,$dispchgA,$dispchgB,$markchg,$toggchg,$feedurl) = @_;
- # backward compatibility (bulletin boards used to be 'wrapped')
-    if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
-        $feedurl=~s|^/adm/wrapper||;
-    }
+    &dewrapper(\$feedurl);
 
     my $function = &Apache::loncommon::get_users_function();
     my $tabcolor = &Apache::loncommon::designparm($function.'.tabbg',
@@ -1681,10 +1675,8 @@
 
 sub print_sortfilter_options {
     my ($r,$symb,$previous,$feedurl) = @_;
- # backward compatibility (bulletin boards used to be 'wrapped')
-    if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
-        $feedurl=~s|^/adm/wrapper||;
-    }
+
+    &dewrapper(\$feedurl);
     my @sections = ();
     my $section_sel = '';
     my $numsections = 0;
@@ -1820,17 +1812,9 @@
 
 sub print_showposters {
     my ($r,$symb,$previous,$feedurl,$sortposts) = @_;
- # backward compatibility (bulletin boards used to be 'wrapped')
-    if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
-        $feedurl=~s|^/adm/wrapper||;
-    }
+
 # backward compatibility (bulletin boards used to be 'wrapped')
-    my $ressymb=$symb;
-    if ($ressymb =~ /bulletin___\d+___/) {
-        unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {
-            $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|;
-        }
-    }
+    my $ressymb=&wrap_symb($symb);
     my $crs='/'.$ENV{'request.course.id'};
     if ($ENV{'request.course.sec'}) {
         $crs.='_'.$ENV{'request.course.sec'};
@@ -2014,10 +1998,8 @@
   my $userpicktag = '';
   my $qrystr = '';
   my $prevtag = '';
- # backward compatibility (bulletin boards used to be 'wrapped')
-  if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
-      $feedurl=~s|^/adm/wrapper||;
-  }
+
+  &dewrapper(\$feedurl);
   if ($feedurl=~/^\/adm\//) { $feedurl.='?register=1' };
   if ($previous > 0) {
       $qrystr = 'previous='.$previous;
@@ -2751,11 +2733,10 @@
   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
          ['hide','unhide','deldisc','postdata','preview','replydisc','editdisc','threadedon','threadedoff','onlyunread','allposts','onlyunmark','previous','markread','markonread','markondisp','toggoff','toggon','modifydisp','changes','navtime','navmaps','navurl','sortfilter','sortposts','applysort','rolefilter','statusfilter','sectionpick','posterlist','userpick','attach','origpage','currnewattach','deloldattach','keepold','allversions','export']);
   if ($ENV{'form.discsymb'}) {
-      my $symb = $ENV{'form.discsymb'};
+      my ($symb,$feedurl) = &get_feedurl_and_clean_symb($ENV{'form.discsymb'});
       my $readkey = $symb.'_read';
-      my %readinghash = ();
       my $chgcount = 0;
-      %readinghash = &Apache::lonnet::get('nohist_'.$ENV{'request.course.id'}.'_discuss',[$readkey],$ENV{'user.domain'},$ENV{'user.name'});
+      my %readinghash = &Apache::lonnet::get('nohist_'.$ENV{'request.course.id'}.'_discuss',[$readkey],$ENV{'user.domain'},$ENV{'user.name'});
       foreach my $key (keys %ENV) {
           if ($key =~ m/^form\.postunread_(\d+)/) {
               if ($readinghash{$readkey} =~ /\.$1\./) {
@@ -2770,21 +2751,19 @@
           }
       }
       if ($chgcount > 0) {
-          &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%readinghash,$ENV{'user.domain'},$ENV{'user.name'});
+          &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',
+			  \%readinghash,$ENV{'user.domain'},$ENV{'user.name'});
       }
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
-      my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
-      my $previous=$ENV{'form.previous'};
-      my $feedurl = &Apache::lonnet::clutter($url);
-      &redirect_back($r,$feedurl,&mt('Marked postings read/unread').'<br />','0','0','',$previous,'','','',);
+      &redirect_back($r,$feedurl,&mt('Marked postings read/unread').'<br />',
+		     '0','0','',$ENV{'form.previous'},'','','',);
       return OK;
   }
   if ($ENV{'form.allversions'}) {
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
-      my $bodytag=&Apache::loncommon::bodytag('Discussion Post Versions',
-                                          '','');
+      my $bodytag=&Apache::loncommon::bodytag('Discussion Post Versions');
       $r->print (<<END);
 <html>
 <head>
@@ -2797,14 +2776,10 @@
       if ($ENV{'request.course.sec'}) {
           $crs.='_'.$ENV{'request.course.sec'};
       }
-      $crs=~s/\_/\//g;
+      $crs=~s|_|/|g;
       my $seeid=&Apache::lonnet::allowed('rin',$crs);
       my ($symb,$idx)=split(/\:\:\:/,$ENV{'form.allversions'});
-      my $ressymb=$symb;
-      &Apache::lonenc::check_decrypt(\$ressymb);
-      unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {
-          $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|;
-      }
+      ($symb)=&get_feedurl_and_clean_symb($symb);
       if ($idx > 0) {
           my %messages = ();
           my %subjects = ();
@@ -2812,91 +2787,50 @@
           my %allattachments = ();
           my %imsfiles = ();
           my ($screenname,$plainname);
-          my %contrib=&Apache::lonnet::restore($ressymb,$ENV{'request.course.id'},
-               $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
-               $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
-          my $discussion = &get_post_contents(\%contrib,$idx,$seeid,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname);
-          $r->print($discussion);
+          my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},
+                           $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
+                           $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+          $r->print(&get_post_contents(\%contrib,$idx,$seeid,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname));
       }
       return OK;
   }
   if ($ENV{'form.posterlist'}) {
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
-      my $symb=$ENV{'form.posterlist'};
-      my $sortposts = $ENV{'form.sortposts'};
-      my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
-      my $previous=$ENV{'form.previous'};
-      my $feedurl = &Apache::lonnet::clutter($url);
- # backward compatibility (bulletin boards used to be 'wrapped')
-      if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
-          $feedurl=~s|^/adm/wrapper||;
-      }
-      &print_showposters($r,$symb,$previous,$feedurl,$sortposts);
+      my ($symb,$feedurl)=&get_feedurl_and_clean_symb($ENV{'form.applysort'});
+      &print_showposters($r,$symb,$ENV{'form.previous'},$feedurl,
+			 $ENV{'form.sortposts'});
       return OK;
   }
   if ($ENV{'form.userpick'}) {
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
-      my $symb=$ENV{'form.userpick'};
-      my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
-      my $previous=$ENV{'form.previous'};
-# backward compatibility (bulletin boards used to be 'wrapped')
-      my $ressymb=$symb;
-      &Apache::lonenc::check_decrypt(\$ressymb);
-      unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {
-          $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|;
-      }
-      my $sort=$ENV{'form.sortposts'};
-      my @posters = ();
-      if (ref($ENV{'form.stuinfo'}) eq 'ARRAY') {
-          @posters = $ENV{'form.stuinfo'};
-      } else {
-          $posters[0] = $ENV{'form.stuinfo'};
-      }
+      my @posters = &Apache::loncommon::get_env_multiple('form.stuinfo');
+      my ($symb,$feedurl)=&get_feedurl_and_clean_symb($ENV{'form.userpick'});
       my $numpicks = @posters;
-      if (defined($ENV{'form.userpick'})) {
-          my %discinfo = ();
-          $discinfo{$ressymb.'_userpick'} = join('&',@posters);
-          &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
-      }
-      my $feedurl = &Apache::lonnet::clutter($url);
- # backward compatibility (bulletin boards used to be 'wrapped')
-      if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
-          $feedurl=~s|^/adm/wrapper||;
-      }
-      &redirect_back($r,$feedurl,&mt('Changed sort/filter').'<br />','0','0','',$previous,$sort,'','','',$numpicks);
+      my %discinfo;
+      $discinfo{$symb.'_userpick'} = join('&',@posters);
+      &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',
+			   \%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
+      &redirect_back($r,$feedurl,&mt('Changed sort/filter').'<br />','0','0',
+		     '',$ENV{'form.previous'},$ENV{'form.sortposts'},'','','',
+		     $numpicks);
       return OK;
   }
   if ($ENV{'form.applysort'}) {
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
-      my $symb=$ENV{'form.applysort'};
-      my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
-      my $previous=$ENV{'form.previous'};
-      my $sort = $ENV{'form.sortposts'};
-      my $rolefilter = $ENV{'form.rolefilter'};
-      my $statusfilter = $ENV{'form.statusfilter'};
-      my $secpick = $ENV{'form.sectionpick'};
-      my $feedurl = &Apache::lonnet::clutter($url);
- # backward compatibility (bulletin boards used to be 'wrapped')
-      if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
-          $feedurl=~s|^/adm/wrapper||;
-      }
-      &redirect_back($r,$feedurl,&mt('Changed sort/filter').'<br />','0','0','',$previous,$sort,$rolefilter,$statusfilter,$secpick);
+      my ($symb,$feedurl)=&get_feedurl_and_clean_symb($ENV{'form.applysort'});
+      &redirect_back($r,$feedurl,&mt('Changed sort/filter').'<br />','0','0',
+		     '',$ENV{'form.previous'},$ENV{'form.sortposts'},
+		     $ENV{'form.rolefilter'},$ENV{'form.statusfilter'},
+		     $ENV{'form.secpick'});
       return OK;
   } elsif ($ENV{'form.sortfilter'}) {
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
-      my $symb=$ENV{'form.sortfilter'};
-      my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
-      my $previous=$ENV{'form.previous'};
-      my $feedurl = &Apache::lonnet::clutter($url);
- # backward compatibility (bulletin boards used to be 'wrapped')
-      if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
-          $feedurl=~s|^/adm/wrapper||;
-      }
-      &print_sortfilter_options($r,$symb,$previous,$feedurl);
+      my ($symb,$feedurl)=&get_feedurl_and_clean_symb($ENV{'form.sortfilter'});
+      &print_sortfilter_options($r,$symb,$ENV{'form.previous'},$feedurl);
       return OK;
   } elsif ($ENV{'form.navtime'}) {
       my %discinfo = ();
@@ -2912,9 +2846,7 @@
       }
       my $numitems = @resources;
       my $feedurl = '/adm/navmaps';
-      if ($ENV{'form.navurl'}) {
-          $feedurl .= '?'.$ENV{'form.navurl'};
-      }
+      if ($ENV{'form.navurl'}) { $feedurl .= '?'.$ENV{'form.navurl'}; }
       my %lt = &Apache::lonlocal::texthash(
           'mnpa' => 'Marked "New" posts as read in a total of',
           'robb' => 'resources/bulletin boards.',
@@ -2934,7 +2866,8 @@
       }
       my $textline = "<b>$lt{'mnpa'} $numitems $lt{'robb'}</b>";
       if ($numitems > 0) {
-          &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
+          &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',
+			     \%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
       } else {
           $textline = "<b>$lt{'twnp'}</b>";
       }
@@ -2960,65 +2893,51 @@
   } elsif ($ENV{'form.modifydisp'}) {
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
-      my $symb=$ENV{'form.modifydisp'};
-      my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
-      my $previous=$ENV{'form.previous'};
-      my ($dispchgA,$dispchgB,$markchg,$toggchg) = split/_/,$ENV{'form.changes'};
-      my $feedurl = &Apache::lonnet::clutter($url);
- # backward compatibility (bulletin boards used to be 'wrapped')  
-      if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
-          $feedurl=~s|^/adm/wrapper||;
-      }
-      &print_display_options($r,$symb,$previous,$dispchgA,$dispchgB,$markchg,$toggchg,$feedurl);
+      my ($symb,$feedurl)=&get_feedurl_and_clean_symb($ENV{'form.modifydisp'});
+      my ($dispchgA,$dispchgB,$markchg,$toggchg) = 
+	  split(/_/,$ENV{'form.changes'});
+      &print_display_options($r,$symb,$ENV{'form.previous'},$dispchgA,
+			     $dispchgB,$markchg,$toggchg,$feedurl);
       return OK;
-  } elsif (($ENV{'form.markondisp'}) || ($ENV{'form.markonread'}) || ($ENV{'form.allposts'}) || ($ENV{'form.onlyunread'}) || $ENV{'form.onlyunmark'} || $ENV{'form.toggoff'} || $ENV{'form.toggon'} ) {
+  } elsif ($ENV{'form.markondisp'} || $ENV{'form.markonread'} ||
+	   $ENV{'form.allposts'}   || $ENV{'form.onlyunread'} ||
+	   $ENV{'form.onlyunmark'} || $ENV{'form.toggoff'}    ||
+	   $ENV{'form.toggon'} ) {
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
-      my $previous=$ENV{'form.previous'};
-      my ($map,$ind,$url);
+      my $feedurl;
       if ( ($ENV{'form.toggoff'}) || ($ENV{'form.toggon'}) ) {
-# ------------------------------ Modify setting for read/unread toggle for each post 
+# ------------------------ Modify setting for read/unread toggle for each post 
           my $symb=$ENV{'form.toggoff'}?$ENV{'form.toggoff'}:$ENV{'form.toggon'};
-          my $ressymb = $symb;
-          ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
-	  &Apache::lonenc::check_decrypt(\$ressymb);
-          unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {
-              $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|;
-          }
-          my %discinfo = ();
-          my $toggkey = $ressymb.'_readtoggle';
-          if ($ENV{'form.toggon'}) {
-              $discinfo{$toggkey} = 1;
-          } elsif ($ENV{'form.toggoff'}) {
-              $discinfo{$toggkey} = 0;
-          }
-          &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
+	  ($symb,$feedurl)=&get_feedurl_and_clean_symb($symb);
+          my %discinfo;
+          $discinfo{$symb.'_readtoggle'}=1;
+          if ($ENV{'form.toggoff'}) { $discinfo{$symb.'_readtoggle'}=0; }
+          &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',
+			     \%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
       }
       if (($ENV{'form.markondisp'}) || ($ENV{'form.markonread'})) {
-# ---------------------- Modify setting for identification of 'NEW' posts in this discussion
+# --------- Modify setting for identification of 'NEW' posts in this discussion
           my $symb=$ENV{'form.markondisp'}?$ENV{'form.markondisp'}:$ENV{'form.markonread'};
-          my $ressymb = $symb;
-          ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
-	  &Apache::lonenc::check_decrypt(\$ressymb);
-          unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {
-              $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|;
-          }
-          my %discinfo = ();
-          my $lastkey = $ressymb.'_lastread';
-          my $ondispkey = $ressymb.'_markondisp';
+	  ($symb,$feedurl)=&get_feedurl_and_clean_symb($symb);
+          my %discinfo;
+          my $lastkey = $symb.'_lastread';
+          my $ondispkey = $symb.'_markondisp';
           if ($ENV{'form.markondisp'}) {
               $discinfo{$lastkey} = time;
               $discinfo{$ondispkey} = 1;
           } elsif ($ENV{'form.markonread'}) {
-              if ( $previous > 0 ) {
-                  $discinfo{$lastkey} = $previous;
+              if ( $ENV{'form.previous'} > 0 ) {
+                  $discinfo{$lastkey} = $ENV{'form.previous'};
               }
               $discinfo{$ondispkey} = 0;
           }
-          &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
+          &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',
+			     \%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
       }
-      if (($ENV{'form.allposts'}) || ($ENV{'form.onlyunread'}) || ($ENV{'form.onlyunmark'}) ) {
-# ----------------------------------------------------------------- Modify display setting for this discussion 
+      if ($ENV{'form.allposts'} || $ENV{'form.onlyunread'} ||
+	  $ENV{'form.onlyunmark'}) {
+# --------------------------------- Modify display setting for this discussion 
           my $symb;
           if ($ENV{'form.allposts'}) {
               $symb = $ENV{'form.allposts'};
@@ -3027,134 +2946,114 @@
           } else {
               $symb = $ENV{'form.onlyunmark'};
           }
-          my $ressymb = $symb;
-          ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
-	  &Apache::lonenc::check_decrypt(\$ressymb);
-          unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {
-              $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|;
-          }
-          my %discinfo = ();
+	  ($symb,$feedurl)=&get_feedurl_and_clean_symb($symb);
+          my %discinfo;
           if ($ENV{'form.allposts'}) {
-              $discinfo{$ressymb.'_showonlyunread'} = 0;
-              $discinfo{$ressymb.'_showonlyunmark'} = 0;
+              $discinfo{$symb.'_showonlyunread'} = 0;
+              $discinfo{$symb.'_showonlyunmark'} = 0;
           } elsif ($ENV{'form.onlyunread'}) {
-              $discinfo{$ressymb.'_showonlyunread'} = 1;
+              $discinfo{$symb.'_showonlyunread'} = 1;
           } else {
-              $discinfo{$ressymb.'_showonlyunmark'} = 1;
+              $discinfo{$symb.'_showonlyunmark'} = 1;
           }
-          &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
-      }
-      if (($ENV{'form.markonread'}) || ($ENV{'form.allposts'}) || ($ENV{'form.onlyunread'}) || ($ENV{'form.onlyunmark'}) ||($ENV{'form.toggoff'}) || ($ENV{'form.toggon'}) ) {
-          &redirect_back($r,&Apache::lonnet::clutter($url),&mt('Changed display status').'<br />','0','0','',$previous);
-      } else {
-          &redirect_back($r,&Apache::lonnet::clutter($url),&mt('Changed display status').'<br />','0','0');
+          &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',
+			     \%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
       }
+      my $previous=$ENV{'form.previous'};
+      if ($ENV{'form.markondisp'}) { $previous=undef; }
+      &redirect_back($r,$feedurl,&mt('Changed display status').'<br />',
+		     '0','0','',$previous);
       return OK;
   } elsif ($ENV{'form.markread'}) {
-# ----------------------------------------------------------------- Mark new posts not NEW 
+# ----------------------------------------------------- Mark new posts not NEW 
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
-      my $symb=$ENV{'form.markread'};
-      my $ressymb = $symb;
-      my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
-      &Apache::lonenc::check_decrypt(\$ressymb);
-      unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {
-          $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|;
-      }
-      my %discinfo = ();
-      my $lastkey = $ressymb.'_lastread';
-      $discinfo{$lastkey} = time;
-      &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
-      &redirect_back($r,&Apache::lonnet::clutter($url),&mt('Changed reading status').'<br />','0','0');
+      my ($symb,$feedurl)=&get_feedurl_and_clean_symb($ENV{'form.markread'});
+      &Apache::lonnet::logthis("\n last read w symb ".$symb);
+      my %discinfo;
+      $discinfo{$symb.'_lastread'} = time;
+      &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',
+			   \%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
+      &redirect_back($r,$feedurl,&mt('Changed reading status').'<br />',
+		     '0','0');
       return OK;
   } elsif (($ENV{'form.hide'}) || ($ENV{'form.unhide'})) {
 # ----------------------------------------------------------------- Hide/unhide
-    &Apache::loncommon::content_type($r,'text/html');
-    $r->send_http_header;
+      &Apache::loncommon::content_type($r,'text/html');
+      $r->send_http_header;
 
-    my $entry=$ENV{'form.hide'}?$ENV{'form.hide'}:$ENV{'form.unhide'};
+      my $entry=$ENV{'form.hide'}?$ENV{'form.hide'}:$ENV{'form.unhide'};
+      my ($symb,$idx)=split(/\:\:\:/,$entry);
+      ($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb);
 
-    my ($symb,$idx)=split(/\:\:\:/,$entry);
-    my ($map,$ind,$url)=&Apache::lonnet::decode_symb($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 %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},
-                     $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
-		     $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+      my $currenthidden=$contrib{'hidden'};
+      my $currentstudenthidden=$contrib{'studenthidden'};
 
-        
-    my $currenthidden=$contrib{'hidden'};
-    my $currentstudenthidden=$contrib{'studenthidden'};
+      my $crs='/'.$ENV{'request.course.id'};
+      if ($ENV{'request.course.sec'}) {
+	  $crs.='_'.$ENV{'request.course.sec'};
+      }
+      $crs=~s/\_/\//g;
+      my $seeid=&Apache::lonnet::allowed('rin',$crs);
 
-    my $crs='/'.$ENV{'request.course.id'};
-    if ($ENV{'request.course.sec'}) {
-        $crs.='_'.$ENV{'request.course.sec'};
-    }
-    $crs=~s/\_/\//g;
-    my $seeid=&Apache::lonnet::allowed('rin',$crs);
-    
-    if ($ENV{'form.hide'}) {
-	$currenthidden.='.'.$idx.'.';
-        unless ($seeid) {
-            $currentstudenthidden.='.'.$idx.'.';
-        }
-    } else {
-        $currenthidden=~s/\.$idx\.//g;
-    }
-    my %newhash=('hidden' => $currenthidden);
-    if ( ($ENV{'form.hide'}) && (!$seeid) ) {
-        $newhash{'studenthidden'} = $currentstudenthidden;
-    }
+      if ($ENV{'form.hide'}) {
+	  $currenthidden.='.'.$idx.'.';
+	  unless ($seeid) {
+	      $currentstudenthidden.='.'.$idx.'.';
+	  }
+      } else {
+	  $currenthidden=~s/\.$idx\.//g;
+      }
+      my %newhash=('hidden' => $currenthidden);
+      if ( ($ENV{'form.hide'}) && (!$seeid) ) {
+	  $newhash{'studenthidden'} = $currentstudenthidden;
+      }
 
-    &Apache::lonnet::store(\%newhash,$symb,$ENV{'request.course.id'},
-                     $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
-		     $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+      &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),
-       &mt('Changed discussion status').'<br />','0','0','',$ENV{'form.previous'});
+      &redirect_back($r,$feedurl,&mt('Changed discussion status').'<br />',
+		     '0','0','',$ENV{'form.previous'});
   } elsif (($ENV{'form.threadedon'}) || ($ENV{'form.threadedoff'})) {
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
+      my $symb;
       if ($ENV{'form.threadedon'}) {
+	  $symb=$ENV{'form.threadedon'};
 	  &Apache::lonnet::put('environment',{'threadeddiscussion' => 'on'});
 	  &Apache::lonnet::appenv('environment.threadeddiscussion' => 'on');
       } else {
+	  $symb=$ENV{'form.threadedoff'};
  	  &Apache::lonnet::del('environment',['threadeddiscussion']);
 	  &Apache::lonnet::delenv('environment\.threadeddiscussion');
       }
-      my $symb=$ENV{'form.threadedon'}?$ENV{'form.threadedon'}:$ENV{'form.threadedoff'};
-      my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
-      &redirect_back($r,&Apache::lonnet::clutter($url),
-		     &mt('Changed discussion view mode').'<br />','0','0','',$ENV{'form.previous'});
+      my ($symb,$feedurl)=&get_feedurl_and_clean_symb($symb);
+      &redirect_back($r,$feedurl,&mt('Changed discussion view mode').'<br />',
+		     '0','0','',$ENV{'form.previous'});
   } elsif ($ENV{'form.deldisc'}) {
 # --------------------------------------------------------------- Hide for good
-    &Apache::loncommon::content_type($r,'text/html');
-    $r->send_http_header;
-
-    my $entry=$ENV{'form.deldisc'};
-
-    my ($symb,$idx)=split(/\:\:\:/,$entry);
-    my ($map,$ind,$url)=&Apache::lonnet::decode_symb($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::loncommon::content_type($r,'text/html');
+      $r->send_http_header;
 
+      my ($symb,$idx)=split(/\:\:\:/,$ENV{'form.deldisc'});
+      ($symb,my $feedurl)=&get_feedurl_and_clean_symb($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 %newhash=('deleted' => $contrib{'deleted'}.".$idx.");
     &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),
-       &mt('Changed discussion status').'<br />','0','0','',$ENV{'form.previous'});
+                          $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
+		          $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+    &redirect_back($r,$feedurl,&mt('Changed discussion status').'<br />',
+		   '0','0','',$ENV{'form.previous'});
   } elsif ($ENV{'form.preview'}) {
 # -------------------------------------------------------- User wants a preview
-      $r->content_type('text/html');
+      &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
       &show_preview($r);
   } elsif ($ENV{'form.attach'}) {
@@ -3162,9 +3061,7 @@
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
       &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['subject','comment','addnewattach','delnewattach','timestamp','numoldver','idx','anondiscuss','discuss']);
-      my @currnewattach = ();
-      my @currdelold = ();
-      my @keepold = ();
+      my (@currnewattach,@currdelold,@keepold);
       &process_attachments(\@currnewattach,\@currdelold,\@keepold);
       if (exists($ENV{'form.addnewattach.filename'})) {
           unless (length($ENV{'form.addnewattach'})>131072) {
@@ -3173,36 +3070,24 @@
               push @currnewattach, $newattachment;
           }
       }
-      my $attachmenturls = '';
+      my $attachmenturls;
+      my ($symb) = &get_feedurl_and_clean_symb($ENV{'form.attach'});
       my $idx = $ENV{'form.idx'};
-      my $symb = $ENV{'form.attach'};
       if ($idx) {
           my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},
                          $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
                          $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
           $attachmenturls = $contrib{$idx.':attachmenturl'};
       }
-      &modify_attachments($r,\@currnewattach,\@currdelold,$symb,$idx,$attachmenturls);
-  } elsif ($ENV{'form.chgreads'}) {
-      &Apache::loncommon::content_type($r,'text/html');
-      $r->send_http_header;
-      my ($map,$ind,$url)=&Apache::lonnet::decode_symb($ENV{'form.chgreads'});
-      &redirect_back($r,&Apache::lonnet::clutter($url),
-       &mt('Changed read status').'<br />','0','0');
+      &modify_attachments($r,\@currnewattach,\@currdelold,$symb,$idx,
+			  $attachmenturls);
   } elsif ($ENV{'form.export'}) {
       &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;
-      my $symb=$ENV{'form.export'};
-      my $mode;
+      my ($symb,$feedurl) = &get_feedurl_and_clean_symb($ENV{'form.export'});
+      my $mode='board';
       my $status='OPEN';
-      my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
       my $previous=$ENV{'form.previous'};
-      my $feedurl = &Apache::lonnet::clutter($url);
- # backward compatibility (bulletin boards used to be 'wrapped')
-      if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
-          $mode = 'board';
-          $feedurl=~s|^/adm/wrapper||;
-      }
       if ($feedurl =~ /\.(problem|exam|quiz|assess|survey|form|library)$/) {
           $mode='problem';
           $status=$Apache::inputtags::status[-1];
@@ -3211,72 +3096,81 @@
       my $bodytag=&Apache::loncommon::bodytag('Resource Feedback and Discussion');
       $r->print($bodytag.$discussion);                                     
       return OK;
+      #FIXME deleted CHGREADS needs to be readded
   } else {
 # ------------------------------------------------------------- Normal feedback
-  my $feedurl=$ENV{'form.postdata'};
-  $feedurl=~s/^http\:\/\///;
-  $feedurl=~s/^$ENV{'SERVER_NAME'}//;
-  $feedurl=~s/^$ENV{'HTTP_HOST'}//;
-  $feedurl=~s/\?.+$//;
+      my $feedurl=$ENV{'form.postdata'};
+      $feedurl=~s/^http\:\/\///;
+      $feedurl=~s/^$ENV{'SERVER_NAME'}//;
+      $feedurl=~s/^$ENV{'HTTP_HOST'}//;
+      $feedurl=~s/\?.+$//;
 
-  my $symb;
-  if ($ENV{'form.replydisc'}) {
-      $symb=(split(/\:\:\:/,$ENV{'form.replydisc'}))[0];
-      my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb);
-      $feedurl=&Apache::lonnet::clutter($url);
-  } elsif ($ENV{'form.editdisc'}) {
-      $symb=(split(/\:\:\:/,$ENV{'form.editdisc'}))[0];
-      my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb);
-      $feedurl=&Apache::lonnet::clutter($url);
-  } elsif ($ENV{'form.origpage'}) {
-      $symb=""; 
-  } else {
-      $symb=&Apache::lonnet::symbread($feedurl);
-  }
-  unless ($symb) {
-      $symb=$ENV{'form.symb'};
-      if ($symb) {
+      my $symb;
+      if ($ENV{'form.replydisc'}) {
+	  $symb=(split(/\:\:\:/,$ENV{'form.replydisc'}))[0];
+	  my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb);
+	  $feedurl=&Apache::lonnet::clutter($url);
+      } elsif ($ENV{'form.editdisc'}) {
+	  $symb=(split(/\:\:\:/,$ENV{'form.editdisc'}))[0];
 	  my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb);
-          $feedurl=&Apache::lonnet::clutter($url);
+	  $feedurl=&Apache::lonnet::clutter($url);
+      } elsif ($ENV{'form.origpage'}) {
+	  $symb=""; 
+      } else {
+	  $symb=&Apache::lonnet::symbread($feedurl);
+      }
+      unless ($symb) {
+	  $symb=$ENV{'form.symb'};
+	  if ($symb) {
+	      my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb);
+	      $feedurl=&Apache::lonnet::clutter($url);
+	  }
+      }
+      &Apache::lonenc::check_decrypt(\$symb);
+      my $goahead=1;
+      if ($feedurl=~/\.(problem|exam|quiz|assess|survey|form)$/) {
+	  unless ($symb) { $goahead=0; }
+      }
+      # backward compatibility (bulletin boards used to be 'wrapped')
+      if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
+	  $feedurl=~s|^/adm/wrapper||;
+      }
+      if (!$goahead) {
+          # Ambiguous Problem Resource
+	  $r->internal_redirect('/adm/ambiguous');
+	  return OK;
       }
-  }
-  &Apache::lonenc::check_decrypt(\$symb);
-  my $goahead=1;
-  if ($feedurl=~/\.(problem|exam|quiz|assess|survey|form)$/) {
-      unless ($symb) { $goahead=0; }
-  }
-  # backward compatibility (bulletin boards used to be 'wrapped')
-  if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
-      $feedurl=~s|^/adm/wrapper||;
-  }
-  if ($goahead) {
 # Go ahead with feedback, no ambiguous reference
-    &Apache::loncommon::content_type($r,'text/html');
-    $r->send_http_header;
+      &Apache::loncommon::content_type($r,'text/html');
+      $r->send_http_header;
   
-    if (
-      (
-       ($feedurl=~m:^/res:) && ($feedurl!~m:^/res/adm:)
-      ) 
-      || 
-      ($ENV{'request.course.id'} && ($feedurl!~m:^/adm:))
-      ||
-      ($ENV{'request.course.id'} && ($symb=~/^bulletin\_\_\_/))
-     ) {
+      unless (
+	  (
+	   ($feedurl=~m:^/res:) && ($feedurl!~m:^/res/adm:)
+	   ) 
+	  || 
+	  ($ENV{'request.course.id'} && ($feedurl!~m:^/adm:))
+	  ||
+	  ($ENV{'request.course.id'} && ($symb=~/^bulletin\_\_\_/))
+	  ) {
+# Unable to give feedback
+	  &no_redirect_back($r,$feedurl);
+      }
 # --------------------------------------------------- Print login screen header
-    unless ($ENV{'form.sendit'}) {
-      my $options=&screen_header($feedurl);
-      if ($options) {
-        &mail_screen($r,$feedurl,$options);
-      } else {
-	&fail_redirect($r,$feedurl);
+      unless ($ENV{'form.sendit'}) {
+	  my $options=&screen_header($feedurl);
+	  if ($options) {
+	      &mail_screen($r,$feedurl,$options);
+	  } else {
+	      &fail_redirect($r,$feedurl);
+	  }
+	  return OK;
       }
-    } else {
       
 # Get previous user input
       my $prevattempts=&Apache::loncommon::get_previous_attempt(
-            $symb,$ENV{'user.name'},$ENV{'user.domain'},
-            $ENV{'request.course.id'});
+                                   $symb,$ENV{'user.name'},$ENV{'user.domain'},
+				   $ENV{'request.course.id'});
 
 # Get output from resource
       my $usersaw=&resource_output($feedurl);
@@ -3284,27 +3178,28 @@
 # Get resource answer (need to allow student to view grades for this to work)
       &Apache::lonnet::appenv(('allowed.vgr'=>'F'));
       my $useranswer=&Apache::loncommon::get_student_answers(
-                       $symb,$ENV{'user.name'},$ENV{'user.domain'},
-		       $ENV{'request.course.id'});
+                                   $symb,$ENV{'user.name'},$ENV{'user.domain'},
+		                   $ENV{'request.course.id'});
       &Apache::lonnet::delenv('allowed.vgr');
 # Get attachments, if any, and not too large
       my $attachmenturl='';
-      if (($ENV{'form.origpage'}) || ($ENV{'form.editdisc'}) || ($ENV{'form.replydisc'})) {
-          my ($symb,$idx);
-          if ($ENV{'form.replydisc'}) {
-              ($symb,$idx)=split(/\:\:\:/,$ENV{'form.replydisc'});
-          } elsif ($ENV{'form.editdisc'}) {
-              ($symb,$idx)=split(/\:\:\:/,$ENV{'form.editdisc'});
-          } elsif ($ENV{'form.origpage'}) {
-              $symb = $ENV{'form.symb'};
-          }
+      if (($ENV{'form.origpage'}) || ($ENV{'form.editdisc'}) ||
+	  ($ENV{'form.replydisc'})) {
+	  my ($symb,$idx);
+	  if ($ENV{'form.replydisc'}) {
+	      ($symb,$idx)=split(/\:\:\:/,$ENV{'form.replydisc'});
+	  } elsif ($ENV{'form.editdisc'}) {
+	      ($symb,$idx)=split(/\:\:\:/,$ENV{'form.editdisc'});
+	  } elsif ($ENV{'form.origpage'}) {
+	      $symb = $ENV{'form.symb'};
+	  }
 	  &Apache::lonenc::check_decrypt(\$symb);
-          my @currnewattach = ();
-          my @deloldattach = ();
-          my @keepold = ();
-          &process_attachments(\@currnewattach,\@deloldattach,\@keepold);
-          $symb=~s|(bulletin___\d+___)adm/wrapper/|$1|;
-          $attachmenturl=&construct_attachmenturl(\@currnewattach,\@keepold,$symb,$idx);
+	  my @currnewattach = ();
+	  my @deloldattach = ();
+	  my @keepold = ();
+	  &process_attachments(\@currnewattach,\@deloldattach,\@keepold);
+	  $symb=~s|(bulletin___\d+___)adm/wrapper/|$1|;
+	  $attachmenturl=&construct_attachmenturl(\@currnewattach,\@keepold,$symb,$idx);
       } elsif ($ENV{'form.attachment.filename'}) {
 	  unless (length($ENV{'form.attachment'})>131072) {
 	      $attachmenturl=&Apache::lonnet::userfileupload('attachment',undef,'feedback');
@@ -3315,49 +3210,65 @@
 
 # Assemble email
       my ($email,$citations)=&assemble_email($feedurl,$message,$prevattempts,
-          $usersaw,$useranswer);
+					     $usersaw,$useranswer);
  
 # Who gets this?
       my ($typestyle,%to) = &decide_receiver($feedurl);
 
 # Actually send mail
       my ($status,$numsent)=&send_msg($feedurl,$email,$citations,
-          $attachmenturl,%to);
+				      $attachmenturl,%to);
 
 # Discussion? Store that.
 
       my $numpost=0;
-      if ($ENV{'form.discuss'}) {
-          my $subject = &clear_out_html($ENV{'form.subject'});
-	  $typestyle.=&adddiscuss($symb,$message,0,$attachmenturl,$subject);
-	  $numpost++;
-      }
-
-      if ($ENV{'form.anondiscuss'}) {
-          my $subject = &clear_out_html($ENV{'form.subject'});
-	  $typestyle.=&adddiscuss($symb,$message,1,$attachmenturl,$subject);
+      if ($ENV{'form.discuss'} || $ENV{'form.anondiscuss'}) {
+	  my $subject = &clear_out_html($ENV{'form.subject'});
+	  my $anonmode=(defined($ENV{'form.anondiscuss'}));
+	  $typestyle.=&adddiscuss($symb,$message,$anonmode,$attachmenturl,
+				  $subject);
 	  $numpost++;
       }
-
-
+	  
 # Receipt screen and redirect back to where came from
       &redirect_back($r,$feedurl,$typestyle,$numsent,$numpost,$status,$ENV{'form.previous'});
-
-    }
-   } else {
-# Unable to give feedback
-    &no_redirect_back($r,$feedurl);
-   }
-  } else {
-# Ambiguous Problem Resource
-      if ( &Apache::lonnet::mod_perl_version() == 2 ) {
-	  &Apache::lonnet::cleanenv();
-      }
-      $r->internal_redirect('/adm/ambiguous');
   }
-}
   return OK;
 } 
 
+sub wrap_symb {
+    my ($ressymb)=@_;
+    if ($ressymb =~ /bulletin___\d+___/) {
+        unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {
+            $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|;
+        }
+    }
+    return $ressymb;
+}
+sub dewrapper {
+    my ($feedurl)=@_;
+    if ($$feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
+        $$feedurl=~s|^/adm/wrapper||;
+    }
+}
+
+sub get_feedurl {
+    my ($symb)=@_;
+    my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
+    my $feedurl = &Apache::lonnet::clutter($url);
+    &dewrapper(\$feedurl);
+    return $feedurl;
+}
+
+sub get_feedurl_and_clean_symb {
+    my ($symb)=@_;
+    &Apache::lonenc::check_decrypt(\$symb);
+# backward compatibility (bulletin boards used to be 'wrapped')
+    unless ($symb =~ m|bulletin___\d+___adm/wrapper|) {
+	$symb=~s|(bulletin___\d+___)|$1adm/wrapper|;
+    }
+    my $feedurl = &get_feedurl($symb);
+    return ($symb,$feedurl);
+}
 1;
 __END__

--albertel1100554538--