Diff for /loncom/interface/lonfeedback.pm between versions 1.132 and 1.133

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

Removed from v.1.132  
changed lines
  Added in v.1.133


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>