Diff for /loncom/interface/lonfeedback.pm between versions 1.290.2.7.2.4 and 1.313

version 1.290.2.7.2.4, 2012/04/30 03:51:40 version 1.313, 2012/01/03 01:51:00
Line 58  sub discussion_open { Line 58  sub discussion_open {
         return 1;          return 1;
     }      }
 # It was not explicitly open, check if the problem is available.  # It was not explicitly open, check if the problem is available.
 # If the problem is not available, close the discussion  # If the problem is not available, close the discussion 
     if (defined($status) &&      if (defined($status) &&
         !($status eq 'CAN_ANSWER' || $status eq 'CANNOT_ANSWER'   !($status eq 'CAN_ANSWER' || $status eq 'CANNOT_ANSWER'
           || $status eq 'OPEN')) {    || $status eq 'OPEN')) {
         return 0;   return 0;
     }      }
 # The problem is available, but check if the instructor explictly closed discussion  # The problem is available, but check if the instructor explictly closed discussion
     if (defined($close) && $close ne '' && $close < time) {      if (defined($close) && $close ne '' && $close < time) {
         return 0;   return 0;
     }      }
     return 1;      return 1;
 }  }
Line 82  sub discussion_visible { Line 82  sub discussion_visible {
     return 1;      return 1;
 }  }
   
 sub discussion_vote_available {  
     my ($status,$symb)=@_;  
     my $canvote=&Apache::lonnet::EXT('resource.0.discussvote',$symb);  
     if ((lc($canvote) eq 'yes') ||  
         ((lc($canvote) eq 'notended') && (&discussion_open($status,$symb)))) {  
         return 1;  
     }  
 }  
   
 sub get_realsymb {  
     my ($symb) = @_;  
     my $realsymb = $symb;  
     if ($symb=~/^bulletin___/) {  
         my $filename=(&Apache::lonnet::decode_symb($symb))[2];  
         $filename=~s{^adm/wrapper/}{};  
         $realsymb=&Apache::lonnet::symbread($filename);  
     }  
     return $realsymb;  
 }  
   
 sub list_discussion {  sub list_discussion {
     my ($mode,$status,$ressymb,$imsextras,$group)=@_;      my ($mode,$status,$ressymb,$imsextras,$group)=@_;
     unless ($ressymb) { $ressymb=&Apache::lonnet::symbread(); }      unless ($ressymb) { $ressymb=&Apache::lonnet::symbread(); }
Line 155  sub list_discussion { Line 135  sub list_discussion {
     $crs=~s/\_/\//g;      $crs=~s/\_/\//g;
     my $encsymb=&Apache::lonenc::check_encrypt($ressymb);      my $encsymb=&Apache::lonenc::check_encrypt($ressymb);
     my $viewgrades=(&Apache::lonnet::allowed('vgr',$crs)      my $viewgrades=(&Apache::lonnet::allowed('vgr',$crs)
   && ($ressymb=~/\.(problem|exam|quiz|assess|survey|form|task)$/));    && ($ressymb=~/$LONCAPA::assess_re/));
           
     my %usernamesort = ();      my %usernamesort = ();
     my %namesort =();      my %namesort =();
Line 277  sub list_discussion { Line 257  sub list_discussion {
     $visit ++;      $visit ++;
   
     my $seeid;      my $seeid;
     if (&Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {      if (($group ne '') && ($mode eq 'board') && 
         $seeid = 1;          ($ressymb =~ m|^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$|)) {
           if (&check_group_priv($group,'dgp') eq 'ok') {
               $seeid = 1;
           }
       } else {
           $seeid=&Apache::lonnet::allowed('rin',$crs);
     }      }
     my $seehidden = &can_see_hidden($mode,$ressymb,undef,$group,$cdom,$cnum,$crs);  
 # Is voting on discussions available  
     my $realsymb = &get_realsymb($ressymb);  
     my $canvote = &discussion_vote_available($status,$realsymb);  
   
     my @discussionitems=();      my @discussionitems=();
     my %shown = ();      my %shown = ();
     my @posteridentity=();      my @posteridentity=();
Line 301  sub list_discussion { Line 281  sub list_discussion {
     my $maxdepth=0;      my $maxdepth=0;
     my %anonhash=();      my %anonhash=();
     my $anoncnt=0;      my $anoncnt=0;
     my $target='';  
     unless ($env{'browser.interface'} eq 'textual' ||  
     $env{'environment.remote'} eq 'off' ) {  
  $target='target="LONcom"';  
     }  
   
     my $now = time;      my $now = time;
     $discinfo{$visitkey} = $visit;      $discinfo{$visitkey} = $visit;
   
     &Apache::lonnet::put('nohist_'.$cid.'_discuss',\%discinfo,$env{'user.domain'},$env{'user.name'});      &Apache::lonnet::put('nohist_'.$cid.'_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,$seehidden,$canvote,$prevread,$sortposts,$encsymb,$readkey,$showunmark,$showonlyunread,$totposters,\@rolefilter,\@sectionpick,\@grouppick,$classgroups,$statusfilter,$toggkey,$outputtarget,\%anonhash,$anoncnt,$group);      &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,$readkey,$showunmark,$showonlyunread,$totposters,\@rolefilter,\@sectionpick,\@grouppick,$classgroups,$statusfilter,$toggkey,$outputtarget,\%anonhash,$anoncnt,$group);
   
     my $discussion='';      my $discussion='';
     my $manifestfile;      my $manifestfile;
Line 445  imscp_v1p1.xsd http://www.imsglobal.org/ Line 420  imscp_v1p1.xsd http://www.imsglobal.org/
             }              }
  } else {   } else {
             my $colspan=$maxdepth+1;              my $colspan=$maxdepth+1;
 #JW  
             $discussion.= &Apache::lonhtmlcommon::scripttag(qq|              $discussion.= &Apache::lonhtmlcommon::scripttag(qq|
    function verifydelete (caller,symb,idx,newflag,previous,groupparm) {     function verifydelete (caller,symb,idx,newflag,previous,groupparm) {
        var symbparm = symb+':::'+idx         var symbparm = symb+':::'+idx
Line 470  imscp_v1p1.xsd http://www.imsglobal.org/ Line 444  imscp_v1p1.xsd http://www.imsglobal.org/
                          "\n".'<table class="LC_discussion">';                           "\n".'<table class="LC_discussion">';
             $discussion .= &action_links_bar($colspan,$ressymb,$visible,              $discussion .= &action_links_bar($colspan,$ressymb,$visible,
                                              $newpostsflag,$group,                                               $newpostsflag,$group,
                                              $prevread,$markondisp,$seehidden);                                               $prevread,$markondisp);
             my $escsymb=&escape($ressymb);              my $escsymb=&escape($ressymb);
             my $numhidden = keys(%notshown);              my $numhidden = keys(%notshown);
             if ($numhidden > 0) {              if ($numhidden > 0) {
Line 665  END Line 639  END
                     if ($filterchoice) {                      if ($filterchoice) {
                         $discussion .= '<b>'.&mt('Filters').'</b>:&nbsp;'.$filterchoice;                          $discussion .= '<b>'.&mt('Filters').'</b>:&nbsp;'.$filterchoice;
                     }                      }
                     $discussion .= '</font></td>';  
                 }                  }
                   $discussion .= '</font></td>';
   
             }              }
             if ($dischash{$toggkey}) {              if ($dischash{$toggkey}) {
                 my $storebutton = &mt('Save read/unread changes');                  my $storebutton = &mt('Save read/unread changes');
Line 684  END Line 659  END
 END  END
             $discussion .= &action_links_bar($colspan,$ressymb,$visible,              $discussion .= &action_links_bar($colspan,$ressymb,$visible,
                                              $newpostsflag,$group,                                               $newpostsflag,$group,
                                              $prevread,$markondisp,$seehidden);                                               $prevread,$markondisp);
             $discussion .= "              $discussion .= "
            </table>             </table>
            <br /><br /></form>\n";             <br /><br /></form>\n";
Line 748  END Line 723  END
             }              }
         }          }
  if ((&discussion_open($status)) && ($outputtarget ne 'tex')) {   if ((&discussion_open($status)) && ($outputtarget ne 'tex')) {
             if (($group ne '') && ($mode eq 'board')) {              if (($group ne '') && ($mode eq 'board')) {  
                 if ((&check_group_priv($group,'pgd') eq 'ok') &&                  if ((&check_group_priv($group,'pgd') eq 'ok') && 
                    ($ressymb =~ m{^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$})) {                     ($ressymb =~ m{^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$})) {
                     $discussion .=                      $discussion .=
  &postingform_display($mode,$ressymb,$now,$subject,   &postingform_display($mode,$ressymb,$now,$subject,
Line 761  END Line 736  END
                 if (&Apache::lonnet::allowed('pch',$env{'request.course.id'}.                  if (&Apache::lonnet::allowed('pch',$env{'request.course.id'}.
                     ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {                      ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
   
                     $discussion.=              $discussion.= 
                         &postingform_display($mode,$ressymb,$now,$subject,          &postingform_display($mode,$ressymb,$now,$subject,
                                              $comment,$outputtarget,$attachnum,       $comment,$outputtarget,$attachnum,
                                              $currnewattach,$currdelold,'',$crstype);       $currnewattach,$currdelold,'',$crstype);
                 } else {                  } else {
                     $discussion.= '<span class="LC_feedback_link">'.                      $discussion.= '<span class="LC_feedback_link">'.
                                   &mt('This discussion is closed.').'</span>';                                    &mt('This discussion is closed.').'</span>';
Line 781  END Line 756  END
             &Apache::lonnet::allowed('pch',              &Apache::lonnet::allowed('pch',
            $env{'request.course.id'}.             $env{'request.course.id'}.
         ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {          ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
     $discussion.= &send_feedback_link($ressymb,$target);              $discussion.= &send_feedback_link($ressymb);
             if ($env{'request.role.adv'}) {              if ($env{'request.role.adv'}) {
                 my $close = &Apache::lonnet::EXT('resource.0.discussend',$ressymb);                  my $close = &Apache::lonnet::EXT('resource.0.discussend',$ressymb);
                 my $canvote = &Apache::lonnet::EXT('resource.0.discussvote',$ressymb);  
                 if (defined($close) && $close ne '' && $close < time) {                  if (defined($close) && $close ne '' && $close < time) {
                     if ($canvote eq 'notended') {                      $discussion .= '&nbsp;'.&mt('(Closed for [_1] roles)',
                         $discussion .= '&nbsp;'.&mt('(Posting and voting closed for [_1] roles)',                                                  &Apache::lonnet::plaintext('st',$crstype));
                                                     &Apache::lonnet::plaintext('st',$crstype));   
                     } else {  
                         $discussion .= '&nbsp;'.&mt('(Closed for [_1] roles)',  
                                                     &Apache::lonnet::plaintext('st',$crstype));  
                     }  
                 }                  }
             }              }
         } else {   } else {
             $discussion.= '<span class="LC_feedback_link">'.&mt('This discussion is closed.').'</span>';              $discussion.= '<span class="LC_feedback_link">'.&mt('This discussion is closed.').'</span>';
         }          }
  $discussion.= &send_message_link($ressymb).'</div>';   $discussion.= &send_message_link($ressymb).'</div>';
Line 803  END Line 772  END
     return $discussion;      return $discussion;
 }  }
   
 sub can_see_hidden {  
     my ($mode,$ressymb,$feedurl,$group,$cdom,$cnum,$crs) = @_;  
     my $seehidden;  
     if ($env{'request.course.id'}) {  
         unless ($cdom ne '' && $cnum ne '') {  
             $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
             $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
         }  
         if ($crs eq '') {  
             $crs = '/'.$env{'request.course.id'};  
             if ($env{'request.course.sec'}) {  
                 $crs.='_'.$env{'request.course.sec'};  
             }  
             $crs=~s{_}{/}g;  
         }  
         if ($mode eq '') {  
             $mode='board';  
             if ($feedurl =~ /$LONCAPA::assess_re/) {  
                 $mode='problem';  
             }  
         }  
         if (($group ne '') && ($mode eq 'board') &&  
             ($ressymb =~ m{^bulletin___\d+\Q___adm/wrapper/adm/$cdom/$cnum/\E\d+/bulletinboard$})) {  
             if (&check_group_priv($group,'dgp') eq 'ok') {  
                 $seehidden = 1;  
             }  
         } else {  
             $seehidden=&Apache::lonnet::allowed('rin',$crs);  
         }  
     }  
     return $seehidden;  
 }  
   
 sub discussion_link {  sub discussion_link {
     my ($ressymb,$linktext,$cmd,$item,$flag,$prev,$adds,$title) = @_;     my ($ressymb,$linktext,$cmd,$item,$flag,$prev,$adds)=@_;
     my $link = '<a href="/adm/feedback?'.$cmd.'='.&escape($ressymb).':::'.$item;     my $link='/adm/feedback?inhibitmenu=yes&modal=yes&'.$cmd.'='.&escape($ressymb).':::'.$item;
     if ($flag) { $link .= '&amp;previous='.$prev; }     if ($flag) { $link .= '&amp;previous='.$prev; }
     if ($adds) { $link .= $adds; }     if ($adds) { $link .= $adds; }
     $link .= '"';     return &Apache::loncommon::modal_link($link,$linktext,600,600);
     if ($title) { $link .= ' title="'.$title.'"'; }  
     $link .= '>'.$linktext.'</a>';  
     return $link;  
 }  }
   
   
 sub send_feedback_link {  sub send_feedback_link {
     my ($ressymb,$target) = @_;      my ($ressymb) = @_;
     my $output = '<span class="LC_feedback_link">'.      return '<span class="LC_feedback_link">'.
                  ' <a href="/adm/feedback?replydisc='.                   &discussion_link($ressymb,
                  &escape($ressymb).':::" '.$target.'>'.                      '<img alt="" class="LC_noBorder" src="'.
                  '<img alt="" class="LC_noBorder" src="'.                      &Apache::loncommon::lonhttpdurl('/adm/lonMisc/chat.gif').
                  &Apache::loncommon::lonhttpdurl('/adm/lonMisc/chat.gif').                      '" border="0" /><span class="LC_menubuttons_inline_text">'.&mt('Post Discussion').'</span>',
                  '" border="0" /><span class="LC_menubuttons_inline_text">'.&mt('Post Discussion').'</span></a></span>';                      'replydisc').
     return $output;             '</span>';
 }  }
   
 sub send_message_link {  sub send_message_link {
Line 869  sub send_message_link { Line 804  sub send_message_link {
 }  }
   
 sub action_links_bar {  sub action_links_bar {
     my ($colspan,$ressymb,$visible,$newpostsflag,$group,$prevread,$markondisp,      my ($colspan,$ressymb,$visible,$newpostsflag,$group,$prevread,$markondisp) = @_;
         $seehidden) = @_;  
     my $discussion = '<tr><td class="LC_disc_action_links_bar" colspan="'.$colspan.'">'.      my $discussion = '<tr><td class="LC_disc_action_links_bar" colspan="'.$colspan.'">'.
                      '<table width="100%" class="LC_disc_action_table"><tr>'.                       '<table width="100%" class="LC_disc_action_table"><tr>'.
                      '<td class="LC_disc_action_left">';                       '<td class="LC_disc_action_left">';
Line 887  sub action_links_bar { Line 821  sub action_links_bar {
             $discussion .= '&amp;previous='.$prevread;              $discussion .= '&amp;previous='.$prevread;
         }          }
         $discussion .= &group_args($group);          $discussion .= &group_args($group);
         $discussion .='">'.&mt('Chronological View').'</a>&nbsp;&nbsp;          $discussion .='">'.&mt('Chronological View').'</a>&nbsp;&nbsp;';
                        <a href="/adm/feedback?cmd=sortfilter&amp;symb='.$escsymb;  
           my $otherviewurl='/adm/feedback?cmd=sortfilter&amp;symb='.$escsymb.'&amp;inhibitmenu=yes&amp;modal=yes';
         if ($newpostsflag) {          if ($newpostsflag) {
             $discussion .= '&amp;previous='.$prevread;              $otherviewurl .= '&amp;previous='.$prevread;
         }          }
         $discussion .= &group_args($group);          $otherviewurl .= &group_args($group);
         $discussion .='">'.&mt('Sorting/Filtering options').'</a>'.('&nbsp;' x2);          $discussion .= &Apache::loncommon::modal_link($otherviewurl,&mt('Other Views ...'),800,340);
           $discussion .=('&nbsp;' x2);
     }      }
     $discussion .='<a href="/adm/feedback?export='.$escsymb;      $discussion .='<a href="/adm/feedback?export='.$escsymb;
     if ($newpostsflag) {      if ($newpostsflag) {
         $discussion .= '&amp;previous='.$prevread;          $discussion .= '&amp;previous='.$prevread;
     }      }
     $discussion .= &group_args($group);      $discussion .= &group_args($group);
     $discussion .= '">'.&mt('Export').'</a>';      $discussion .= '">'.&mt('Export').'?</a>&nbsp;&nbsp;</td>';
     if ($seehidden) {  
         $discussion .= '&nbsp;&nbsp;';  
         $discussion .='<a href="/adm/feedback?undeleteall='.$escsymb;  
         if ($newpostsflag) {  
             $discussion .= '&amp;previous='.$prevread;  
         }  
         $discussion .= &group_args($group);  
         $discussion .= '">'.&mt('Undelete all deleted entries').'</a>';  
     }  
     $discussion.='</td>';  
     if ($newpostsflag) {      if ($newpostsflag) {
         if (!$markondisp) {          if (!$markondisp) {
             $discussion .='<td class="LC_disc_action_right"><a href="/adm/preferences?action=changediscussions';              $discussion .='<td class="LC_disc_action_right"><a href="/adm/preferences?action=changediscussions';
Line 985  ENDDISCUSS Line 911  ENDDISCUSS
     }      }
     $postingform .= "</form>\n";      $postingform .= "</form>\n";
     $postingform .= &generate_attachments_button('',$attachnum,$ressymb,      $postingform .= &generate_attachments_button('',$attachnum,$ressymb,
                                                  $now,$currnewattach,                                                       $now,$currnewattach,
                                                  $currdelold,'',$mode,                                                       $currdelold,'',$mode,
                                                  $blockblog);                                                       $blockblog);
     if ((ref($currnewattach) eq 'ARRAY') && (@{$currnewattach} > 0)) {      if ((ref($currnewattach) eq 'ARRAY') && (@{$currnewattach} > 0)) {
         $newattachmsg = '<br /><b>'.$lt{'newa'}.'</b><br />';          $newattachmsg = '<br /><b>'.$lt{'newa'}.'</b><br />';
         if (@{$currnewattach} > 1) {          if (@{$currnewattach} > 1) {
             $newattachmsg .= '<ol>';               $newattachmsg .= '<ol>';
             foreach my $item (@{$currnewattach}) {               foreach my $item (@{$currnewattach}) {
                 $item =~ m#.*/([^/]+)$#;                  $item =~ m#.*/([^/]+)$#;
                 $newattachmsg .= '<li><a href="'.$item.'">'.$1.'</a></li>'."\n";                  $newattachmsg .= '<li><a href="'.$item.'">'.$1.'</a></li>'."\n";
             }               }
             $newattachmsg .= '</ol>'."\n";               $newattachmsg .= '</ol>'."\n";
         } else {           } else {
             $$currnewattach[0] =~ m#.*/([^/]+)$#;               $$currnewattach[0] =~ m#.*/([^/]+)$#;
             $newattachmsg .= '<a href="'.$$currnewattach[0].'">'.$1.'</a><br />'."\n";               $newattachmsg .= '<a href="'.$$currnewattach[0].'">'.$1.'</a><br />'."\n";
         }           }
     }      }
     $postingform .= $newattachmsg;      $postingform .= $newattachmsg;
     $postingform .= &generate_preview_button();      $postingform .= &generate_preview_button();
Line 1008  ENDDISCUSS Line 934  ENDDISCUSS
 }  }
   
 sub build_posting_display {  sub build_posting_display {
     my ($usernamesort,$subjectsort,$namesort,$notshown,$newitem,$dischash,$shown,$alldiscussion,$imsitems,$imsfiles,$roleinfo,$discussionitems,$replies,$depth,$posters,$maxdepth,$visible,$newpostsflag,$current,$status,$viewgrades,$seeid,$seehidden,$canvote,$prevread,$sortposts,$ressymb,$readkey,$showunmark,$showonlyunread,$totposters,$rolefilter,$sectionpick,$grouppick,$classgroups,$statusfilter,$toggkey,$outputtarget,$anonhash,$anoncnt,$group) = @_;      my ($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,$readkey,$showunmark,$showonlyunread,$totposters,$rolefilter,$sectionpick,$grouppick,$classgroups,$statusfilter,$toggkey,$outputtarget,$anonhash,$anoncnt,$group) = @_;
     my @original=();      my @original=();
     my @index=();      my @index=();
     my $skip_group_check = 0;      my $skip_group_check = 0;
     my $symb=&Apache::lonenc::check_decrypt($ressymb);      my $symb=&Apache::lonenc::check_decrypt($ressymb);
     my $escsymb=&escape($ressymb);      my $escsymb=&escape($ressymb);
 # These are the discussion contributions  
     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'});
     my (%likes,%userlikes,%userunlikes,@theselikes,$oneplus,$twoplus,$oneminus,$twominus);  
 # And these are the likes/unlikes  
     my $thisuser=$env{'user.name'}.':'.$env{'user.domain'};  
     if ($seeid || $canvote) {  
         %likes=&Apache::lonnet::dump('disclikes',  
                           $env{'course.'.$env{'request.course.id'}.'.domain'},  
                           $env{'course.'.$env{'request.course.id'}.'.num'},  
                           '^'.$symb.':');  
 # Array with likes to figure out averages, etc.  
         @theselikes=();  
 # Hashes containing likes and unlikes for this user.  
         %userlikes=();  
         %userunlikes=();  
     }  
 # Is the user allowed to see the real name behind anonymous postings?  
     my $see_anonymous =       my $see_anonymous = 
  &Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));   &Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
   
Line 1062  sub build_posting_display { Line 973  sub build_posting_display {
             ($skiptest,$roleregexp,$secregexp,$statusregexp) =               ($skiptest,$roleregexp,$secregexp,$statusregexp) = 
                      &filter_regexp($rolefilter,$sectionpick,$statusfilter);                       &filter_regexp($rolefilter,$sectionpick,$statusfilter);
             $rolematch = $roleregexp.':'.$secregexp.':'.$statusregexp;              $rolematch = $roleregexp.':'.$secregexp.':'.$statusregexp;
         }          } 
         if ($seeid || $canvote) {  
 # We need to go through this twice, first to get the likes/dislikes, then to actually build the display  
             for (my $id=1;$id<=$contrib{'version'};$id++) {  
                 my $idx=$id;  
                 next if ($contrib{$idx.':deleted'});  
                 next if ($contrib{$idx.':hidden'});  
                 unless ((($hiddens{$idx}) && (!$seehidden)) || ($deletions{$idx}) || (!$contrib{$idx.':message'})) {  
                     if ($likes{$symb.':'.$idx.':likes'} ne '') {  
                         push(@theselikes,$likes{$symb.':'.$idx.':likes'});  
                         if (ref($likes{$symb.':'.$idx.':likers'}) eq 'HASH') {  
                             if (exists($likes{$symb.':'.$idx.':likers'}{$thisuser})) {  
                                 $userlikes{$idx} = 1;  
                             }  
                         }  
                         if (ref($likes{$symb.':'.$idx.':unlikers'}) eq 'HASH') {  
                             if (exists($likes{$symb.':'.$idx.':unlikers'}{$thisuser})) {  
                                 $userunlikes{$idx} = 1;  
                             }  
                         }  
                     }  
                 }  
             }  
 # Figure out average likes and standard deviation if there are enough   
 # discussions to warrant that  
             my $ave=0;  
             my $stddev=10000;  
             if ($#theselikes>1) {  
                 my $sum=0;  
                 my $num=$#theselikes+1;  
                 foreach my $thislike (@theselikes) {  
                     $sum+=$thislike;  
                 }  
                 $ave=$sum/$num;  
                 my $sumsq=0;  
                 foreach my $thislike (@theselikes) {  
                    $sumsq+=($thislike-$ave)*($thislike-$ave);  
                 }  
                 $stddev=sqrt($sumsq/$num);  
             }  
 # Now we know the average likes $ave and the standard deviation $stddev  
 # Get the boundaries for markup  
             $oneplus=$ave+$stddev;  
             $twoplus=$ave+2.*$stddev;  
             $oneminus=$ave-$stddev;  
             $twominus=$ave-2.*$stddev;  
         }  
 #  
 # This is now the real loop. Go through all entries, pick up what we need  
 #  
  for (my $id=1;$id<=$contrib{'version'};$id++) {   for (my $id=1;$id<=$contrib{'version'};$id++) {
     my $idx=$id;      my $idx=$id;
             next if ($contrib{$idx.':deleted'});              next if ($contrib{$idx.':deleted'});
Line 1144  sub build_posting_display { Line 1006  sub build_posting_display {
     } else {      } else {
  $$replies[$$depth[$idx]]=1;   $$replies[$$depth[$idx]]=1;
     }      }
             unless ((($hiddens{$idx}) && (!$seehidden)) || ($deletions{$idx})) {              unless ((($hiddens{$idx}) && (!$seeid)) || ($deletions{$idx})) {
  $$visible++;   $$visible++;
                 if ($contrib{$idx.':history'}) {                  if ($contrib{$idx.':history'}) {
                     if ($contrib{$idx.':history'} =~ /:/) {                      if ($contrib{$idx.':history'} =~ /:/) {
Line 1159  sub build_posting_display { Line 1021  sub build_posting_display {
                 my %subjects = ();                  my %subjects = ();
                 my %attachtxt = ();                  my %attachtxt = ();
                 my %allattachments = ();                  my %allattachments = ();
                 my ($screenname,$plainname,$showaboutme);                  my ($screenname,$plainname);
                 my $sender = &mt('Anonymous');                  my $sender = &mt('Anonymous');
 # Anonymous users getting number within a discussion  # Anonymous users getting number within a discussion
 # Since idx is in static order, this should give the same sequence every time.   # Since idx is in static order, this should give the same sequence every time. 
Line 1169  sub build_posting_display { Line 1031  sub build_posting_display {
     $$anonhash{$key}=&mt('Anonymous').' '.$anoncnt;      $$anonhash{$key}=&mt('Anonymous').' '.$anoncnt;
  }   }
                 my ($message,$subject,$vgrlink,$ctlink);                  my ($message,$subject,$vgrlink,$ctlink);
                 &get_post_contents(\%contrib,$idx,$seeid,$seehidden,$outputtarget,\%messages,\%subjects,\%allattachments,\%attachtxt,$imsfiles,\$screenname,\$plainname,\$showaboutme,$numoldver);                  &get_post_contents(\%contrib,$idx,$seeid,$outputtarget,\%messages,\%subjects,\%allattachments,\%attachtxt,$imsfiles,\$screenname,\$plainname,$numoldver);
   
   
 # Set up for sorting by subject  # Set up for sorting by subject
Line 1199  sub build_posting_display { Line 1061  sub build_posting_display {
                             }                              }
                         }                          }
         if (!$contrib{$idx.':anonymous'} || $see_anonymous) {          if (!$contrib{$idx.':anonymous'} || $see_anonymous) {
                             if ($showaboutme) {      $sender=&Apache::loncommon::aboutmewrapper(
                                 $sender = &Apache::loncommon::aboutmewrapper(   $plainname,
                                               $plainname,   $contrib{$idx.':sendername'},
                                               $contrib{$idx.':sendername'},   $contrib{$idx.':senderdomain'}).' ('.
                                               $contrib{$idx.':senderdomain'});   $contrib{$idx.':sendername'}.':'.
                             } else {   $contrib{$idx.':senderdomain'}.')';
                                 $sender = $plainname;  
                             }  
                             if ($see_anonymous) {  
                                 $sender .= ' ('.$contrib{$idx.':sendername'}.':'.  
                                            $contrib{$idx.':senderdomain'}.')';  
                             }  
                             $sender = '<b>'.$sender.'</b>';                              $sender = '<b>'.$sender.'</b>';
     if ($contrib{$idx.':anonymous'}) {      if ($contrib{$idx.':anonymous'}) {
         $sender.=' <font color="red"><b>['.$$anonhash{$key}.']</b></font> '.          $sender.=' <font color="red"><b>['.$$anonhash{$key}.']</b></font> '.
Line 1251  sub build_posting_display { Line 1107  sub build_posting_display {
                             if ($outputtarget ne 'tex') {                              if ($outputtarget ne 'tex') {
                                 if (&editing_allowed($escsymb.':::'.$idx,$group)) {                                  if (&editing_allowed($escsymb.':::'.$idx,$group)) {
                                     if (($env{'user.domain'} eq $contrib{$idx.':senderdomain'}) && ($env{'user.name'} eq $contrib{$idx.':sendername'})) {                                      if (($env{'user.domain'} eq $contrib{$idx.':senderdomain'}) && ($env{'user.name'} eq $contrib{$idx.':sendername'})) {
                                         $sender.=' <a href="/adm/feedback?editdisc='.                                          $sender.=' '.
                                              $escsymb.':::'.$idx;                                           &discussion_link($symb,&mt('Edit'),'editdisc',$idx,$$newpostsflag,$prevread,&group_args($group));
                                         if ($$newpostsflag) {                                          unless ($seeid) {
                                             $sender .= '&amp;previous='.$prevread;  
                                         }  
         $sender .= &group_args($group);  
                                         $sender .= '" '.$target.'>'.&mt('Edit').'</a>';  
                                       
                                         unless ($seehidden) {  
                                             my $grpargs = &group_args($group);                                              my $grpargs = &group_args($group);
                                             $sender.=" <a href=\"javascript:verifydelete('studentdelete','$escsymb','$idx','$$newpostsflag','$prevread','$grpargs')";                                              $sender.=" <a href=\"javascript:verifydelete('studentdelete','$escsymb','$idx','$$newpostsflag','$prevread','$grpargs')";
                                             $sender .= '">'.&mt('Delete').'</a>';                                              $sender .= '">'.&mt('Delete').'</a>';
                                         }                                          }
                                     }                                      }
                                 }                                  }
                                 if ($seehidden) {          if ($seeid) {
             if ($hiddens{$idx}) {              if ($hiddens{$idx}) {
                                         unless ($studenthidden) {                                          unless ($studenthidden) {
                     $sender.=' <a href="/adm/feedback?unhide='.                              $sender.=' '.
                     $escsymb.':::'.$idx;                                              &discussion_link($symb,&mt('Make Visible'),'unhide',$idx,$$newpostsflag,$prevread,&group_args($group));
                                             if ($$newpostsflag) {  
                                                 $sender .= '&amp;previous='.$prevread;  
                                             }  
                                             $sender .= '">'.&mt('Make Visible').'</a>';  
                                         }                                          }
             } else {              } else {
         $sender.=' <a href="/adm/feedback?hide='.                                          $sender.=' '.
             $escsymb.':::'.$idx;                                           &discussion_link($symb,&mt('Hide'),'hide',$idx,$$newpostsflag,$prevread,&group_args($group));
                                         if ($$newpostsflag) {  
                                             $sender .= '&amp;previous='.$prevread;  
                                         }  
         $sender .= &group_args($group);  
                                         $sender .= '">'.&mt('Hide').'</a>';  
             }              }
                                     my $grpargs = &group_args($group);                                      my $grpargs = &group_args($group);
             $sender.=               $sender.= 
Line 1291  sub build_posting_display { Line 1132  sub build_posting_display {
                                     $sender .= &mt('Delete').'</a>';                                      $sender .= &mt('Delete').'</a>';
                                 }                                  }
                             }                              }
         } else {                          } else {
     if ($screenname) {      if ($screenname) {
         $sender='<i>'.$screenname.'</i>';          $sender='<i>'.$screenname.'</i>';
     } else {      } else {
Line 1318  sub build_posting_display { Line 1159  sub build_posting_display {
                             }                              }
         }          }
                         if ($outputtarget ne 'tex') {                          if ($outputtarget ne 'tex') {
                             if (&discussion_open($status)) {              if (&discussion_open($status)) {
                                 if (($group ne '') &&                                   if (($group ne '') && 
                                     (&check_group_priv($group,'pgd') eq 'ok')) {                                      (&check_group_priv($group,'pgd') eq 'ok')) {
                                      $sender.=' <a href="/adm/feedback?replydisc='.                                       $sender.=' '.
                                               $escsymb.':::'.$idx;                                           &discussion_link($symb,&mt('Reply'),'replydisc',$idx,$$newpostsflag,$prevread,&group_args($group));
                                     if ($$newpostsflag) {  
                                         $sender .= '&amp;previous='.$prevread;  
                                     }  
                                     $sender .= &group_args($group);  
                                     $sender .= '" '.$target.'>'.&mt('Reply').'</a>';  
                                 } elsif (&Apache::lonnet::allowed('pch',                                   } elsif (&Apache::lonnet::allowed('pch', 
      $env{'request.course.id'}.       $env{'request.course.id'}.
      ($env{'request.course.sec'}?'/'.       ($env{'request.course.sec'}?'/'.
                                       $env{'request.course.sec'}:''))) {                                        $env{'request.course.sec'}:''))) {
              $sender.=' <a href="/adm/feedback?replydisc='.               $sender.=' '.
                       $escsymb.':::'.$idx;                                           &discussion_link($symb,&mt('Reply'),'replydisc',$idx,$$newpostsflag,$prevread);
                                     if ($$newpostsflag) {  
                                         $sender .= '&amp;previous='.$prevread;  
                                     }  
                                     $sender .= '" '.$target.'>'.&mt('Reply').'</a>';  
                                 }                                  }
                             }                              }
                             if ($viewgrades) {              if ($viewgrades) {
         $vgrlink=&Apache::loncommon::submlink(&mt('Submissions'),          $vgrlink=&Apache::loncommon::submlink(&mt('Submissions'),
                                 $contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'},$ressymb);                                  $contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'},$ressymb);
             }              }
                             if ($$dischash{$readkey}=~/\.$idx\./) {                              if ($$dischash{$readkey}=~/\.$idx\./) { 
                                 $ctlink = '<label><b>'.&mt('Mark unread').'?</b>&nbsp;<input type="checkbox" name="postunread_'.$idx.'" /></label>';                                  $ctlink = '<label><b>'.&mt('Mark unread').'?</b>&nbsp;<input type="checkbox" name="postunread_'.$idx.'" /></label>';
                             } else {                              } else {
                                 $ctlink = '<label><b>'.&mt('Mark read').'?</b>&nbsp;<input type="checkbox" name="postread_'.$idx.'" /></label>';                                  $ctlink = '<label><b>'.&mt('Mark read').'?</b>&nbsp;<input type="checkbox" name="postread_'.$idx.'" /></label>';
Line 1387  sub build_posting_display { Line 1219  sub build_posting_display {
                 } else {                  } else {
                     if ($message) {                      if ($message) {
                         my $spansize = 2;                          my $spansize = 2;
                         my ($uname,$udom);  
                         if ($showonlyunread && $prevread > $posttime) {                          if ($showonlyunread && $prevread > $posttime) {
                             $$notshown{$idx} = 1;                              $$notshown{$idx} = 1;
                         } elsif ($showunmark && $$dischash{$readkey}=~/\.$idx\./) {                          } elsif ($showunmark && $$dischash{$readkey}=~/\.$idx\./) {
                             $$notshown{$idx} = 1;                              $$notshown{$idx} = 1;
                         } else {                          } else {
 # apply filters  # apply filters
                             $uname = $contrib{$idx.':sendername'};                              my $uname = $contrib{$idx.':sendername'};
                             $udom = $contrib{$idx.':senderdomain'};                              my $udom = $contrib{$idx.':senderdomain'};
                             my $poster = $uname.':'.$udom;                              my $poster = $uname.':'.$udom;
                             if ($env{'form.totposters'} ne '') {                              if ($env{'form.totposters'} ne '') {
                                 if ($totposters == 0) {                                  if ($totposters == 0) {
Line 1463  sub build_posting_display { Line 1294  sub build_posting_display {
                                 $$discussionitems[$idx].='<td align="right">&nbsp;&nbsp;'.                                  $$discussionitems[$idx].='<td align="right">&nbsp;&nbsp;'.
                                   $ctlink.'</td>';                                    $ctlink.'</td>';
                             }                              }
                             if ($seeid || $canvote) {  
 # Figure out size based on likes  
                                 my $thislikes=$likes{$symb.':'.$idx.':likes'};  
                                 my $likesize="100";  
                                 if ($thislikes>$twoplus) {  
                                     $likesize="200";  
                                 } elsif ($thislikes>$oneplus) {  
                                     $likesize="150";  
                                 }  
                                 if ($thislikes<$twominus) {  
                                     $likesize="50";  
                                 } elsif ($thislikes<$oneminus) {  
                                     $likesize="75";  
                                 }  
                             }  
 # Actually glue in the message itself  
                             $$discussionitems[$idx].= '</tr></table><blockquote>'.                              $$discussionitems[$idx].= '</tr></table><blockquote>'.
                                     "<div style='font-size:$likesize%'>".                                      $message.'</blockquote>';
                                     $message.  
                                     '</div></blockquote>';  
                             if ($canvote) {  
                                 my $ownpost;  
                                 if (($uname eq $env{'user.name'}) &&  
                                     ($udom eq $env{'user.domain'})) {  
                                     $ownpost = 1;  
                                 }  
 # Put in the like and unlike buttons  
                                 if ($ownpost || (($hiddens{$idx}) && ($seehidden))) {  
                                     my $novote;  
                                     if ($ownpost) {  
                                         $novote = &mt('No voting for your own posts.');  
                                     } else {  
                                         $novote = &mt('No voting for hidden posts.');  
                                     }  
                                     $$discussionitems[$idx].=  
                                         '<a href="javascript:alert('."'$novote'".');" style="text-decoration: none;">'.  
                                         '<img border="0" src="/res/adm/pages/thumbsup_novote.png" alt="'.$novote.'" />&nbsp;'.  
                                         '<img border="0" src="/res/adm/pages/thumbsdown_novote.png" alt="'.$novote.'" /></a>';  
                                 } else {  
                                     if ($userlikes{$idx}) {  
                                         $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsup_gray.png" alt="'.&mt('You like this posting').'" />';  
                                     } else {  
                                         $$discussionitems[$idx].='&nbsp;'.&discussion_link($symb,'<img border="0" src="/res/adm/pages/thumbsup.png" alt="'.&mt('Like').'" />','like',$idx,$$newpostsflag,$prevread,&group_args($group),&mt("Like this posting"));   
                                     }  
                                     if ($userunlikes{$idx}) {  
                                         $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsdown_gray.png" alt="'.&mt('You unlike this posting').'" />';  
                                     } else {  
                                         $$discussionitems[$idx].='&nbsp;'.&discussion_link($symb,'<img border="0" src="/res/adm/pages/thumbsdown.png" alt="'.&mt('Unlike').'" />','unlike',$idx,$$newpostsflag,$prevread,&group_args($group),&mt("Unlike this posting"));  
                                     }  
                                 }  
                             }  
                             if ($seeid || $canvote) {  
                                 my $thislikes=$likes{$symb.':'.$idx.':likes'};  
                                 if ($thislikes>0) {  
                                     $$discussionitems[$idx].='&nbsp;('.&mt("[_1] likes",$thislikes).')';  
                                 } elsif ($thislikes<0) {  
                                     $$discussionitems[$idx].='&nbsp;('.&mt("[_1] unlikes",abs($thislikes)).')';  
                                 }  
                             }  
 # If there is any history to this post, inform the reader  
                             if ($contrib{$idx.':history'}) {                              if ($contrib{$idx.':history'}) {
                                 my @postversions = ();                                  my @postversions = ();
                                 $$discussionitems[$idx] .= &mt('This post has been edited by the author.');                                  $$discussionitems[$idx] .= &mt('This post has been edited by the author.');
                                 if ($seehidden) {                                  if ($seeid) {
                                     $$discussionitems[$idx] .= '&nbsp;&nbsp;<a href="/adm/feedback?allversions='.$escsymb.':::'.$idx;                                      $$discussionitems[$idx] .= '&nbsp;&nbsp;'.
     $$discussionitems[$idx] .= &group_args($group);                                           &discussion_link($symb,&mt('Display all versions'),'allversions',$idx,$$newpostsflag,$prevread,&group_args($group));
                                     $$discussionitems[$idx] .= '">'.&mt('Display all versions').'</a>';  
                                 }                                  }
                                 $$discussionitems[$idx].='<br/>'.&mt('Earlier version(s) were posted on: ');                                  $$discussionitems[$idx].='<br/>'.&mt('Earlier version(s) were posted on: ');
                                 if ($contrib{$idx.':history'} =~ m/:/) {                                  if ($contrib{$idx.':history'} =~ m/:/) {
Line 1606  sub filter_regexp { Line 1378  sub filter_regexp {
   
   
 sub get_post_contents {  sub get_post_contents {
     my ($contrib,$idx,$seeid,$seehidden,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$showaboutme,$numver) = @_;      my ($contrib,$idx,$seeid,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$numver) = @_;
     my $discussion = '';      my $discussion = '';
     my $start=$numver;      my $start=$numver;
     my $end=$numver + 1;      my $end=$numver + 1;
     %{$$imsfiles{$idx}}=();      %{$$imsfiles{$idx}}=();
     if ($type eq 'allversions') {      if ($type eq 'allversions') {
        unless($seehidden) {         unless($seeid) {
            $discussion=&mt('You do not have privileges to view all versions of posts.').' '.&mt('Please select a different role.');             $discussion=&mt('You do not have privileges to view all versions of posts.').' '.&mt('Please select a different role.');
            return $discussion;             return $discussion;
        }          } 
Line 1624  sub get_post_contents { Line 1396  sub get_post_contents {
                                         $$contrib{$idx.':sendername'},                                          $$contrib{$idx.':sendername'},
                                         $$contrib{$idx.':senderdomain'});                                          $$contrib{$idx.':senderdomain'});
     $$screenname=$$contrib{$idx.':screenname'};      $$screenname=$$contrib{$idx.':screenname'};
     $$showaboutme = &Apache::lonnet::usertools_access($$contrib{$idx.':sendername'},  
                                                       $$contrib{$idx.':senderdomain'},      my $sender=&Apache::loncommon::aboutmewrapper(
                                                       'aboutme');  
     my $sender = $$plainname;  
     if ($$showaboutme) {  
         $sender = &Apache::loncommon::aboutmewrapper(  
                                  $$plainname,                                   $$plainname,
                                  $$contrib{$idx.':sendername'},                                   $$contrib{$idx.':sendername'},
                                  $$contrib{$idx.':senderdomain'});                                   $$contrib{$idx.':senderdomain'}).' ('.
     }                                   $$contrib{$idx.':sendername'}.':'.
     if ($seeid) {                                   $$contrib{$idx.':senderdomain'}.')';
         $sender .= ' ('.$$contrib{$idx.':sendername'}.':'.  
                    $$contrib{$idx.':senderdomain'}.')';  
     }  
     my $attachmenturls = $$contrib{$idx.':attachmenturl'};      my $attachmenturls = $$contrib{$idx.':attachmenturl'};
     my @postversions = ();      my @postversions = ();
     if ($type eq 'allversions' || $type eq 'export') {      if ($type eq 'allversions' || $type eq 'export') {
Line 1822  END Line 1587  END
    $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'});
       unless (($contrib{'hidden'}=~/\.$idx\./) || ($contrib{'deleted'}=~/\.$idx\./)) {        unless (($contrib{'hidden'}=~/\.$idx\./) || ($contrib{'deleted'}=~/\.$idx\./)) {
           my $numoldver = 0;  
           if ($contrib{$idx.':history'}) {            if ($contrib{$idx.':history'}) {
               if ($contrib{$idx.':history'} =~ /:/) {                if ($contrib{$idx.':history'} =~ /:/) {
                   my @oldversions = split(/:/,$contrib{$idx.':history'});                    my @oldversions = split(/:/,$contrib{$idx.':history'});
Line 1831  END Line 1595  END
                   $numoldver = 1;                    $numoldver = 1;
               }                }
           }            }
           if ($idx > 0) {            if ($env{'form.replydisc'}) {
               my (%msgversions,%subversions,$htmldecode);                if ($contrib{$idx.':history'}) {
               $htmldecode = 0;                    if ($contrib{$idx.':history'} =~ /:/) {
               if ($env{'form.replydisc'}) {                        my @oldversions = split(/:/,$contrib{$idx.':history'});
                   $htmldecode = 1;                        $numoldver = @oldversions;
                     } else {
                         $numoldver = 1;
                     }
               }                }
               &get_post_versions(\%msgversions,$contrib{$idx.':message'},0,$numoldver);                if ($idx > 0) {
               &get_post_versions(\%subversions,$contrib{$idx.':subject'},$htmldecode,                    my %msgversions = ();
                                  $numoldver);                    &get_post_versions(\%msgversions,$contrib{$idx.':message'},0,$numoldver);
               $subject = $subversions{$numoldver};  
               if ($env{'form.replydisc'}) {  
                   $quote = $msgversions{$numoldver};                    $quote = $msgversions{$numoldver};
                   $subject = &HTML::Entities::encode(&mt('Re: ').$subject,'<>&"');  
               } else {  
                   $comment = $msgversions{$numoldver};  
               }                }
           }                if ($idx > 0) {
           if ($env{'form.editdisc'}) {                    my %subversions = ();
                     &get_post_versions(\%subversions,$contrib{$idx.':subject'},1,$numoldver);
                     $subject = &mt('Re: ').$subversions{$numoldver};
                 }
                 $subject = &HTML::Entities::encode($subject,'<>&"');
             } else {
               $attachmenturls = $contrib{$idx.':attachmenturl'};                $attachmenturls = $contrib{$idx.':attachmenturl'};
                 if ($idx > 0) {
                     my %msgversions = ();
                     &get_post_versions(\%msgversions,$contrib{$idx.':message'},0,$numoldver);
                     $comment = $msgversions{$numoldver};
                     my %subversions = ();
                     &get_post_versions(\%subversions,$contrib{$idx.':subject'},0,$numoldver);
                     $subject = $subversions{$numoldver}; 
                 }
               if (defined($contrib{$idx.':replyto'})) {                if (defined($contrib{$idx.':replyto'})) {
                   $parentmsg = $contrib{$idx.':replyto'};                    $parentmsg = $contrib{$idx.':replyto'};
               }                }
Line 1882  END Line 1657  END
       $comment = &unescape($env{'form.comment'});        $comment = &unescape($env{'form.comment'});
       &process_attachments(\@currnewattach,\@currdelold,\@keepold);        &process_attachments(\@currnewattach,\@currdelold,\@keepold);
   }    }
   my $latexHelp=&Apache::loncommon::helpLatexCheatsheet(undef,undef,1);    my $latexHelp=&Apache::loncommon::helpLatexCheatsheet(undef,undef,1,($env{'form.modal'}?'popup':0));
   my $send=&mt('Send');    my $send=&mt('Send');
   my $alert = &mt('Please select a feedback type.');    my $alert = &mt('Please select a feedback type.');
   my $js= <<END;    my $js= <<END;
Line 1940  END Line 1715  END
                  'text' => 'Resource Feedback and Discussion'}];                   'text' => 'Resource Feedback and Discussion'}];
   
   my %onload = ('onload' => 'window.focus();setposttype();');    my %onload = ('onload' => 'window.focus();setposttype();');
     my %parms=('add_entries' => \%onload);
     if ($env{'form.modal'} ne 'yes') { 'bread_crumbs' => $brcrum }
   my $start_page=    my $start_page=
       &Apache::loncommon::start_page('Resource Feedback and Discussion',$js,        &Apache::loncommon::start_page('Resource Feedback and Discussion',$js,\%parms);
                                      {'add_entries' => \%onload,  
                                       'bread_crumbs' => $brcrum,});  
   
   if ($quote ne '') {    if ($quote ne '') {
       $quote = &HTML::Entities::decode($quote);        $quote = &HTML::Entities::decode($quote);
Line 1952  END Line 1727  END
       }        }
       $quote='<blockquote>'.&Apache::lontexconvert::msgtexconverted($quote).'</blockquote>';        $quote='<blockquote>'.&Apache::lontexconvert::msgtexconverted($quote).'</blockquote>';
   }    }
     my $header='';
     unless ($env{'form.modal'}) {
        $header="<h2><tt>$restitle</tt></h2>";
     }
   $r->print(<<END);    $r->print(<<END);
 $start_page  $start_page
 <h2><tt>$restitle</tt></h2>  $header
 <form action="/adm/feedback" method="post" name="mailform"  <form action="/adm/feedback" method="post" name="mailform"
 enctype="multipart/form-data">  enctype="multipart/form-data">
 $prevtag  $prevtag
 <input type="hidden" name="postdata" value="$feedurl" />  <input type="hidden" name="postdata" value="$feedurl" />
   <input type="hidden" name="modal" value="$env{'form.modal'}" />
 END  END
   if ($env{'form.replydisc'}) {    if ($env{'form.replydisc'}) {
       $r->print(<<END);        $r->print(<<END);
Line 1972  END Line 1751  END
 END  END
   }    }
   $r->print(<<END);    $r->print(<<END);
 $options<hr />  $options
 $quote  $quote
 <p>$lt{'myqu'}  <p>$lt{'myqu'}
 $textareaheader  $textareaheader
Line 1983  $latexHelp Line 1762  $latexHelp
 <p>  <p>
 $lt{'title'}: <input type="text" name="subject" size="30" value="$subject" /></p>  $lt{'title'}: <input type="text" name="subject" size="30" value="$subject" /></p>
 <p>  <p>
 <textarea name="comment" id="comment" cols="60" rows="10"  $textareaclass>$comment  <textarea name="comment" id="comment" cols="60" rows="10" $textareaclass>$comment
 </textarea></p>  </textarea></p>
 END  END
     if ( ($env{'form.editdisc'}) || ($env{'form.replydisc'}) ) {      if ( ($env{'form.editdisc'}) || ($env{'form.replydisc'}) ) {
Line 2407  END Line 2186  END
 $start_page  $start_page
 <form name="modifyshown" method="post" action="/adm/feedback">  <form name="modifyshown" method="post" action="/adm/feedback">
 <b>$lt{'diso'}</b><br/> $lt{'prca'}  <b>$lt{'diso'}</b><br/> $lt{'prca'}
 <br /><br />  <br />
 <table border="0">  <table border="0">
  <tr>   <tr>
   <th>$lt{'soor'}</th>    <th>$lt{'soor'}</th>
Line 2472  $start_page Line 2251  $start_page
  </tr>   </tr>
 </table>  </table>
 <br />  <br />
 <br />  <input type="hidden" name="inhibitmenu" value="$env{'form.inhibitmenu'}" />
   <input type="hidden" name="modal" value="$env{'form.modal'}" />
 <input type="hidden" name="previous" value="$previous" />  <input type="hidden" name="previous" value="$previous" />
 <input type="hidden" name="applysort" value="$symb" />  <input type="hidden" name="applysort" value="$symb" />
 <input type="button" name="sub" value="$lt{'stor'}" onclick="verifyFilter()" />  <input type="button" name="sub" value="$lt{'stor'}" onclick="verifyFilter()" />
Line 2498  sub print_showposters { Line 2278  sub print_showposters {
     $r->send_http_header;      $r->send_http_header;
   
     &Apache::lonenc::check_encrypt(\$symb);      &Apache::lonenc::check_encrypt(\$symb);
       my $crs='/'.$env{'request.course.id'};
       if ($env{'request.course.sec'}) {
           $crs.='_'.$env{'request.course.sec'};
       }
       $crs=~s/\_/\//g;
       my $seeid;
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $group = $env{'form.group'};      my $group = $env{'form.group'};
     my $ressymb = &wrap_symb($symb);      my $ressymb = &wrap_symb($symb);
     my $seehidden = &can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum);      if (($group ne '') &&
           ($ressymb =~ m|^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$|)) {
           if (&check_group_priv($group,'dgp') eq 'ok') {
               $seeid = 1;
           }
       } else {
           $seeid=&Apache::lonnet::allowed('rin',$crs);
       }
     my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},      my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},
                                          $cdom,$cnum);                                           $cdom,$cnum);
     my %namesort = ();      my %namesort = ();
Line 2518  sub print_showposters { Line 2311  sub print_showposters {
         for (my $idx=1;$idx<=$contrib{'version'};$idx++) {          for (my $idx=1;$idx<=$contrib{'version'};$idx++) {
             my $hidden=($contrib{'hidden'}=~/\.$idx\./);              my $hidden=($contrib{'hidden'}=~/\.$idx\./);
             my $deleted=($contrib{'deleted'}=~/\.$idx\./);              my $deleted=($contrib{'deleted'}=~/\.$idx\./);
             unless ((($hidden) && (!$seehidden)) || ($deleted)) {              unless ((($hidden) && (!$seeid)) || ($deleted)) {
                 if ((!$contrib{$idx.':anonymous'}) || (&Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')))) {                  if ((!$contrib{$idx.':anonymous'}) || (&Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')))) {
                     my %names = &Apache::lonnet::get('environment',['firstname','lastname'],$contrib{$idx.':senderdomain'},$contrib{$idx.':sendername'});                      my %names = &Apache::lonnet::get('environment',['firstname','lastname'],$contrib{$idx.':senderdomain'},$contrib{$idx.':sendername'});
                     my $lastname = $names{'lastname'};                      my $lastname = $names{'lastname'};
Line 2584  END Line 2377  END
     $r->print(<<END);      $r->print(<<END);
 <br />  <br />
 <input type="hidden" name="sortposts" value="$sortposts" />  <input type="hidden" name="sortposts" value="$sortposts" />
   <input type="hidden" name="modal" value="$env{'form.modal'}" />
 <input type="hidden" name="userpick" value="$symb" />  <input type="hidden" name="userpick" value="$symb" />
 <input type="button" name="store" value="Display posts" onclick="javascript:document.pickpostersform.submit()" />  <input type="button" name="store" value="Display posts" onclick="javascript:document.pickpostersform.submit()" />
 </form>  </form>
Line 2769  sub redirect_back { Line 2563  sub redirect_back {
   }     } 
   &Apache::lonenc::check_encrypt(\$feedurl);    &Apache::lonenc::check_encrypt(\$feedurl);
   my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');    my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
   my %onload;    my %parms=('only_body'   => 1);
   if ($env{'environment.remote'} ne 'off') {    if ($env{'form.modal'}) {
       $onload{'onload'} =        $parms{'add_entries'}={'onLoad' => 'document.forms.reldt.submit()'};
   "if (window.name!='loncapaclient') { this.document.reldt.submit(); self.window.close(); }";    } else {
         $parms{'redirect'}=[0,$feedurl];
   }    }
   my $start_page=    my $start_page=
       &Apache::loncommon::start_page('Feedback sent',undef,        &Apache::loncommon::start_page('Feedback sent',undef,\%parms);
      {'redirect'    => [0,$feedurl],  
       'only_body'   => 1,  
       'add_entries' => \%onload});  
   my $end_page = &Apache::loncommon::end_page();    my $end_page = &Apache::loncommon::end_page();
   $r->print(<<ENDREDIR);    $r->print(<<ENDREDIR);
 $start_page  $start_page
Line 2807  sub no_redirect_back { Line 2599  sub no_redirect_back {
   my $nofeed=&mt('Sorry, no feedback possible on this resource ...');    my $nofeed=&mt('Sorry, no feedback possible on this resource ...');
     
   my %onload;    my %onload;
   if ($env{'environment.remote'} ne 'off') {  
       $onload{'onload'} =   
   "if (window.name!='loncapaclient') { self.window.close(); }";  
   }  
   
   my %body_options = ('only_body'   => 1,    my %body_options = ('only_body'   => 1,
       'bgcolor'     => '#FFFFFF',        'bgcolor'     => '#FFFFFF',
       'add_entries' => \%onload,);        'add_entries' => \%onload,);
   
   if ($feedurl !~ m{^/adm/feedback}) {     if ($feedurl !~ m{^/adm/feedback}) { 
       $body_options{'redirect'} = [2,$feedurl];        $body_options{'rediect'} = [2,$feedurl];
   }    }
   my $start_page=    my $start_page=
       &Apache::loncommon::start_page('Feedback not sent',undef,        &Apache::loncommon::start_page('Feedback not sent',undef,
Line 2888  sub screen_header { Line 2676  sub screen_header {
         my ($blocked,$blocktext) = &Apache::loncommon::blocking_status('boards');          my ($blocked,$blocktext) = &Apache::loncommon::blocking_status('boards');
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         my $realsymb = &get_realsymb($symb);          my $realsymb = $symb;
           if ($symb=~/^bulletin___/) {
               my $filename=(&Apache::lonnet::decode_symb($symb))[2];
               $filename=~s|^adm/wrapper/||;
               $realsymb=&Apache::lonnet::symbread($filename);
           }
         if (!$blocked && &discussion_open(undef,$realsymb) &&           if (!$blocked && &discussion_open(undef,$realsymb) && 
     (&Apache::lonnet::allowed('pch',      (&Apache::lonnet::allowed('pch',
      $env{'request.course.id'}.        $env{'request.course.id'}.
      ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')) ||        ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')) || 
             (($group ne '') && ($symb =~ m{^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$}) && (&check_group_priv($group,'pgd') eq 'ok')))) {              (($group ne '') && ($symb =~ m{^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$}) && (&check_group_priv($group,'pgd') eq 'ok')))) {
     $discussoptions='<label><input type="radio" name="discuss" value="nonanon" checked="checked" /> '.      $discussoptions='<label><input type="radio" name="discuss" value="nonanon" checked="checked" /> '.
  $contribdisc.   $contribdisc.
Line 2907  sub screen_header { Line 2700  sub screen_header {
         }          }
     }      }
     if ($msgoptions) {      if ($msgoptions) {
         $msgoptions='<h2><img src="'.&Apache::loncommon::lonhttpdurl('/res/adm/pages/feedback.png').'" />'          $msgoptions='<tr><th><img src="'.&Apache::loncommon::lonhttpdurl('/res/adm/pages/feedback.png').'" />'
                    .' '.&mt('Send Feedback').'</h2><p>'.&Apache::lonhtmlcommon::coursepreflink(&mt('Feedback Settings'),'feedback').'</p>'                     .'<br />'.&mt('Send Feedback').'<br />'.&Apache::lonhtmlcommon::coursepreflink(&mt('Feedback Settings'),'feedback').'</th>'.
                    .$msgoptions;                     '<td>'.$msgoptions.'</td></tr>';
     }      }
     if ($discussoptions) {       if ($discussoptions) { 
  $discussoptions='<h2><img src="'.&Apache::loncommon::lonhttpdurl('/adm/lonMisc/chat.gif').'" alt="" />'   $discussoptions='<tr><th><img src="'.&Apache::loncommon::lonhttpdurl('/adm/lonMisc/chat.gif').'" alt="" />'
                         .' '.&mt('Discussion Contributions').'</h2><p>'.&Apache::lonhtmlcommon::coursepreflink(&mt('Discussion Settings'),'discussion').'</p>'                          .'<br />'.&mt('Discussion Contributions').'<br />'.&Apache::lonhtmlcommon::coursepreflink(&mt('Discussion Settings'),'discussion').'</th>'.
                         .$discussoptions;                          '<td>'.$discussoptions.'</td></tr>';
     }      }
     return $msgoptions.$discussoptions;      return  &Apache::loncommon::start_data_table().$msgoptions.$discussoptions.&Apache::loncommon::end_data_table();
 }  }
   
 sub resource_output {  sub resource_output {
Line 2944  sub clear_out_html { Line 2737  sub clear_out_html {
       # <BLOCKQUOTE> <DIV .*> <DIV> <IMG> <M> <SPAN> <H1> <H2> <H3> <H4> <SUB>        # <BLOCKQUOTE> <DIV .*> <DIV> <IMG> <M> <SPAN> <H1> <H2> <H3> <H4> <SUB>
       # <SUP> <TABLE> <TR> <TD> <TH> <TBODY>        # <SUP> <TABLE> <TR> <TD> <TH> <TBODY>
       %html=(B=>1, I=>1, P=>1, A=>1, LI=>1, OL=>1, UL=>1, EM=>1,        %html=(B=>1, I=>1, P=>1, A=>1, LI=>1, OL=>1, UL=>1, EM=>1,
              BR=>1, TT=>1, STRONG=>1, BLOCKQUOTE=>1, PRE=>1, DIV=>1, IMG=>1,       BR=>1, TT=>1, STRONG=>1, BLOCKQUOTE=>1, PRE=>1, DIV=>1, IMG=>1,
              M=>1, CHEM=>1, ALGEBRA=>1, SUB=>1, SUP=>1, SPAN=>1,       M=>1, CHEM=>1, ALGEBRA=>1, SUB=>1, SUP=>1, SPAN=>1,  
      H1=>1, H2=>1, H3=>1, H4=>1, H5=>1, H6=>1,        H1=>1, H2=>1, H3=>1, H4=>1, H5=>1, H6=>1, 
      TABLE=>1, TR=>1, TD=>1, TH=>1, TBODY=>1);       TABLE=>1, TR=>1, TD=>1, TH=>1, TBODY=>1);
   }    }
Line 3031  sub send_msg { Line 2824  sub send_msg {
     return ($status,$sendsomething);      return ($status,$sendsomething);
 }  }
   
 # Store feedback "likes"  
   
 sub storefeedbacklikes {  
     my ($likes,$uname,$udom,$course)=@_;  
     unless ($likes) { $likes=0; }  
     if ($likes>0) { $likes=1; }  
     if ($likes<0) { $likes=-1; }  
     unless ($uname) { $uname=$env{'user.name'}; }  
     unless ($udom)  { $udom=$env{'user.domain'}; }  
     unless ($course) { $course=$env{'request.course.id'}; }  
     my %record=&getfeedbackrecords($uname,$udom,$course);  
     my $totallikes=$record{'totallikes'};  
     $totallikes+=$likes;  
     my %newrecord=('likes_user'   => $env{'user.name'},  
                    'likes_domain' => $env{'user.domain'},  
                    'likes' => $likes,  
                    'totallikes' => $totallikes);  
     return &Apache::lonnet::cstore(\%newrecord,'_feedback',$course,$udom,$uname);  
 }  
   
 sub adddiscuss {  sub adddiscuss {
     my ($symb,$email,$anon,$attachmenturl,$subject,$group)=@_;      my ($symb,$email,$anon,$attachmenturl,$subject,$group)=@_;
     my $status='';      my $status='';
     my $realsymb = &get_realsymb($symb);      my $realsymb;
       if ($symb=~/^bulletin___/) {
    my $filename=(&Apache::lonnet::decode_symb($symb))[2];
    $filename=~s|^adm/wrapper/||;
    $realsymb=&Apache::lonnet::symbread($filename);
       }
     my ($cnum,$cdom);      my ($cnum,$cdom);
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
         $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     }      }
     my $realsymb;  
     if (&discussion_open(undef,$realsymb) &&      if (&discussion_open(undef,$realsymb) &&
         (&Apache::lonnet::allowed('pch',$env{'request.course.id'}.   (&Apache::lonnet::allowed('pch',$env{'request.course.id'}.
          ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')) ||           ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')) || 
          (($group ne '') && (&check_group_priv($group,'pgd') eq 'ok') &&           (($group ne '') && (&check_group_priv($group,'pgd') eq 'ok') && 
          ($symb =~ m{^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$})))) {           ($symb =~ m{^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$})))) {
   
     my %contrib=('message'      => $email,      my %contrib=('message'      => $email,
Line 3145  sub adddiscuss { Line 2922  sub adddiscuss {
                      $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 %record=&getdiscussionrecords();      my %record=&Apache::lonnet::restore('_discussion');
     my ($temp)=keys(%record);      my ($temp)=keys(%record);
     unless ($temp=~/^error\:/) {      unless ($temp=~/^error\:/) {
        my %newrecord=();         my %newrecord=();
Line 3153  sub adddiscuss { Line 2930  sub adddiscuss {
        $newrecord{'subnumber'}=$record{'subnumber'}+1;         $newrecord{'subnumber'}=$record{'subnumber'}+1;
        $status.='<br />'.&mt('Registering').': '.         $status.='<br />'.&mt('Registering').': '.
                &Apache::lonnet::cstore(\%newrecord,'_discussion');                 &Apache::lonnet::cstore(\%newrecord,'_discussion');
        &updatekarma();  
     }      }
     } else {      } else {
  $status.='Failed.';   $status.='Failed.';
Line 3161  sub adddiscuss { Line 2937  sub adddiscuss {
     return $status.'<br />';         return $status.'<br />';   
 }  }
   
 # Routine to get the complete discussion records  
   
 sub getdiscussionrecords {  
     my ($uname,$udom,$course)=@_;  
     unless ($uname) { $uname=$env{'user.name'}; }  
     unless ($udom)  { $udom=$env{'user.domain'}; }  
     unless ($course) { $course=$env{'request.course.id'}; }  
     my %record=&Apache::lonnet::restore('_discussion',$course,$udom,$uname);  
     return %record;  
 }  
   
 # Routine to get discussion statistics  
   
 sub getdiscussionstats {  
     my %record=&getdiscussionrecords(@_);  
     my $totalvotes = $record{'totallikes'} + $record{'totalunlikes'};  
     return ($record{'subnumber'},$record{'points'},$record{'totallikes'},$totalvotes);  
 }  
   
 # Calculate discussion karma  
   
 sub calcdiscussionkarma {  
     my ($subs,$pts,$likes,$votes)=&getdiscussionstats(@_);  
     my $karma=0;  
     if ($votes>0) {  
         $karma=int(.1+5.*(1.-exp(-$subs/10.))*$likes/$votes);  
         if ($karma<0) { $karma=0; }  
         if ($karma>5) { $karma=5; }  
     }  
     return $karma;  
 }  
   
 # Update karma  
   
 sub updatekarma {  
     my ($uname,$udom,$course)=@_;  
     unless ($uname) { $uname=$env{'user.name'}; }  
     unless ($udom)  { $udom=$env{'user.domain'}; }  
     unless ($course) { $course=$env{'request.course.id'}; }  
     my $karma=&calcdiscussionkarma($uname,$udom,$course);  
     &Apache::lonnet::cstore({ 'karma' => $karma },'_discussion',$course,$udom,$uname);  
     &Apache::lonnet::do_cache_new('karma',$uname.':'.$udom.':'.$course,$karma,3600);  
     return $karma;  
 }  
   
 # Retrieve karma  
   
 sub userkarma {  
     my ($uname,$udom,$course)=@_;  
     unless ($uname) { $uname=$env{'user.name'}; }  
     unless ($udom)  { $udom=$env{'user.domain'}; }  
     unless ($course) { $course=$env{'request.course.id'}; }  
     my $hashkey=$uname.':'.$udom.':'.$course;  
     my ($karma,$cached)=&Apache::lonnet::is_cached_new('karma',$hashkey);  
     if ($cached) {  
         return $karma;  
     }  
     my %userdisc=&getdiscussionrecords($uname,$udom,$course);  
     $karma=$userdisc{'karma'};  
     &Apache::lonnet::do_cache_new('karma',$hashkey,$karma,3600);  
     return $karma;  
 }  
   
 # Store discussion credit  
   
 sub storediscussionpoints {  
     my ($points,$uname,$udom,$course)=@_;  
     unless ($points) { $points=0; }  
     unless ($uname) { $uname=$env{'user.name'}; }  
     unless ($udom)  { $udom=$env{'user.domain'}; }  
     unless ($course) { $course=$env{'request.course.id'}; }  
     my %record=('grader_user'   => $env{'user.name'},  
                 'grader_domain' => $env{'user.domain'},  
                 'points' => $points);  
     return &Apache::lonnet::cstore(\%record,'_discussion',$course,$udom,$uname);  
 }  
   
 # Store discussion "likes"  
   
 sub storediscussionlikes {  
     my ($chglikes,$chgunlikes,$uname,$udom,$course,$context)=@_;  
     unless ($uname) { $uname=$env{'user.name'}; }  
     unless ($udom)  { $udom=$env{'user.domain'}; }  
     unless ($course) { $course=$env{'request.course.id'}; }  
     my %record=&getdiscussionrecords($uname,$udom,$course);  
     my $totallikes=$record{'totallikes'};  
     my $totalunlikes=$record{'totalunlikes'};  
     $totallikes += $chglikes;  
     $totalunlikes += $chgunlikes;  
     my %newrecord=('likes_user'   => $env{'user.name'},  
                    'likes_domain' => $env{'user.domain'},  
                    'totallikes'   => $totallikes,  
                    'totalunlikes' => $totalunlikes,  
                    'context'      => $context);  
     my $status=&Apache::lonnet::cstore(\%newrecord,'_discussion',$course,$udom,$uname);  
     if ($status eq 'ok') {  
         &updatekarma($uname,$udom,$course);  
     }  
     return $status;  
 }  
   
 sub get_discussion_info {  sub get_discussion_info {
     my ($idx,%contrib) = @_;      my ($idx,%contrib) = @_;
     my $changelast = 0;      my $changelast = 0;
Line 3425  END Line 3100  END
     # Breadcrumbs      # Breadcrumbs
     my $brcrum = [{'href' => '',      my $brcrum = [{'href' => '',
                    'text' => 'Discussion Post Attachments'}];                     'text' => 'Discussion Post Attachments'}];
       my %parms=();
       if ($env{'form.modal'} ne 'yes') { 'bread_crumbs' => $brcrum }
   
     my $start_page =       my $start_page = 
  &Apache::loncommon::start_page('Discussion Post Attachments',$js,   &Apache::loncommon::start_page('Discussion Post Attachments',$js,\%parms);
                                    {'bread_crumbs' => $brcrum,});  
   
     my $orig_subject = &unescape($env{'form.subject'});      my $orig_subject = &unescape($env{'form.subject'});
     my $subject=&clear_out_html($orig_subject);      my $subject=&clear_out_html($orig_subject);
Line 3788  sub handler { Line 3465  sub handler {
 # --------------------------- Get query string for limited number of parameters  # --------------------------- Get query string for limited number of parameters
   
   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
          ['like','unlike','hide','unhide','deldisc','undeleteall','postdata','preview','replydisc','editdisc','cmd','symb','onlyunread','allposts','onlyunmark','previous','markread','markonread','markondisp','toggoff','toggon','modifydisp','changes','navtime','navmaps','navurl','sortposts','applysort','rolefilter','statusfilter','sectionpick','groupick','posterlist','userpick','attach','origpage','currnewattach','deloldattach','keepold','allversions','export','sendmessageonly','group','ref']);           ['modal','hide','unhide','deldisc','postdata','preview','replydisc','editdisc','cmd','symb','onlyunread','allposts','onlyunmark','previous','markread','markonread','markondisp','toggoff','toggon','modifydisp','changes','navtime','navmaps','navurl','sortposts','applysort','rolefilter','statusfilter','sectionpick','groupick','posterlist','userpick','attach','origpage','currnewattach','deloldattach','keepold','allversions','export','sendmessageonly','group','ref']);
   my $group = $env{'form.group'};    my $group = $env{'form.group'};
   my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};  
   my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};  
   my %attachmax = (    my %attachmax = (
                     text => &mt('(128 KB max size)'),                      text => &mt('(128 KB max size)'),
                     num  => 131072,                      num  => 131072,
                   );                    );
   if ($env{'form.editdisc'}) {    if ($env{'form.editdisc'}) {
       if (!(&editing_allowed($env{'form.editdisc'},$group))) {        if (!(&editing_allowed($env{'form.editdisc'},$env{'form.group'}))) {
           my $symb=(split(/\:\:\:/,$env{'form.editdisc'}))[0];            my $symb=(split(/\:\:\:/,$env{'form.editdisc'}))[0];
           my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb);            my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb);
           my $feedurl=&Apache::lonnet::clutter($url);            my $feedurl=&Apache::lonnet::clutter($url);
Line 3841  sub handler { Line 3516  sub handler {
       # Breadcrumbs        # Breadcrumbs
       my $brcrum = [{'href' => '',        my $brcrum = [{'href' => '',
                      'text' => 'Discussion Post Versions'}];                       'text' => 'Discussion Post Versions'}];
         
         my %parms=();
         if ($env{'form.modal'} ne 'yes') { 'bread_crumbs' => $brcrum }
   
       $r->print(&Apache::loncommon::start_page('Discussion Post Versions',undef,        $r->print(&Apache::loncommon::start_page('Discussion Post Versions',undef,\%parms));
                                                {'bread_crumbs' => $brcrum,})  
       );  
   
         my $crs='/'.$env{'request.course.id'};
         if ($env{'request.course.sec'}) {
             $crs.='_'.$env{'request.course.sec'};
         }
         $crs=~s|_|/|g;
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my ($symb,$idx)=split(/\:\:\:/,$env{'form.allversions'});        my ($symb,$idx)=split(/\:\:\:/,$env{'form.allversions'});
       ($symb, my $feedurl)=&get_feedurl_and_clean_symb($symb);        ($symb)=&get_feedurl_and_clean_symb($symb);
       my $ressymb = &wrap_symb($symb);        my $ressymb = &wrap_symb($symb);
         my $group = $env{'form.group'};
       my $seeid;        my $seeid;
       if (&Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {        if (($group ne '') && (($ressymb =~ m|^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$|))) {
           $seeid = 1;            if (&check_group_priv($group,'dgp') eq 'ok') {
                 $seeid = 1;
             }
         } else {
             $seeid = &Apache::lonnet::allowed('rin',$crs);
       }        }
       my $seehidden = &can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum);  
       if ($idx > 0) {        if ($idx > 0) {
           my %messages = ();            my %messages = ();
           my %subjects = ();            my %subjects = ();
           my %attachmsgs = ();            my %attachmsgs = ();
           my %allattachments = ();            my %allattachments = ();
           my %imsfiles = ();            my %imsfiles = ();
           my ($screenname,$plainname,$showaboutme);            my ($screenname,$plainname);
           my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},            my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},
                                                $cdom,$cnum);                             $env{'course.'.$env{'request.course.id'}.'.domain'},
           $r->print(&get_post_contents(\%contrib,$idx,$seeid,$seehidden,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname,\$showaboutme));                             $env{'course.'.$env{'request.course.id'}.'.num'});
             $r->print(&get_post_contents(\%contrib,$idx,$seeid,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname));
       }        }
       $r->print(&Apache::loncommon::end_page());        $r->print(&Apache::loncommon::end_page());
       return OK;        return OK;
Line 3936  sub handler { Line 3624  sub handler {
       $r->send_http_header;        $r->send_http_header;
       my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');        my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
       my %onload;        my %onload;
       if ($env{'environment.remote'} ne 'off') {  
   $onload{'onload'} =  
       "if (window.name!='loncapaclient') { this.document.reldt.submit(); self.window.close(); }";  
       }  
   
       my $start_page=        my $start_page=
   &Apache::loncommon::start_page('New posts marked as read',undef,    &Apache::loncommon::start_page('New posts marked as read',undef,
Line 4005  ENDREDIR Line 3689  ENDREDIR
       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);        my ($symb,$idx)=split(/\:\:\:/,$entry);
       ($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb);        ($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb);
       my $ressymb = &wrap_symb($symb);  
   
       my $seehidden = &can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum);        my $crs='/'.$env{'request.course.id'};
       unless (($seehidden) || (&editing_allowed($env{'form.hide'},$group))) {        if ($env{'request.course.sec'}) {
           &redirect_back($r,$feedurl,&mt('Hiding not permitted').'<br />',            $crs.='_'.$env{'request.course.sec'};
                          '0','0','','',$env{'form.previous'},'','','','',        }
                          undef,undef,$group,);        $crs=~s/\_/\//g;
         my $seeid=&Apache::lonnet::allowed('rin',$crs);
   
         if ($env{'form.hide'} && !$seeid && !(&editing_allowed($env{'form.hide'},$env{'form.group'}))) {
             &redirect_back($r,$feedurl,&mt('Deletion not permitted').'<br />',                 '0','0','','',$env{'form.previous'},'','','','',
                    undef,undef,$group,);
           return OK;            return OK;
       }        }
   
       my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},        my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},
                                            $cdom,$cnum);                            $env{'course.'.$env{'request.course.id'}.'.domain'},
             $env{'course.'.$env{'request.course.id'}.'.num'});
   
       my $currenthidden=$contrib{'hidden'};        my $currenthidden=$contrib{'hidden'};
       my $currentstudenthidden=$contrib{'studenthidden'};        my $currentstudenthidden=$contrib{'studenthidden'};
   
       if ($env{'form.hide'}) {        if ($env{'form.hide'}) {
   $currenthidden.='.'.$idx.'.';    $currenthidden.='.'.$idx.'.';
   unless ($seehidden) {    unless ($seeid) {
       $currentstudenthidden.='.'.$idx.'.';        $currentstudenthidden.='.'.$idx.'.';
   }    }
       } else {        } else {
   $currenthidden=~s/\.$idx\.//g;    $currenthidden=~s/\.$idx\.//g;
       }        }
       my %newhash=('hidden' => $currenthidden);        my %newhash=('hidden' => $currenthidden);
       if ( ($env{'form.hide'}) && (!$seehidden) ) {        if ( ($env{'form.hide'}) && (!$seeid) ) {
   $newhash{'studenthidden'} = $currentstudenthidden;    $newhash{'studenthidden'} = $currentstudenthidden;
       }        }
       if ($env{'form.hide'}) {        if ($env{'form.hide'}) {
Line 4039  ENDREDIR Line 3728  ENDREDIR
           ($changelast,$newlast) = &get_discussion_info($idx,%contrib);            ($changelast,$newlast) = &get_discussion_info($idx,%contrib);
           if ($changelast) {            if ($changelast) {
               &Apache::lonnet::put('discussiontimes',{$symb => $newlast},                &Apache::lonnet::put('discussiontimes',{$symb => $newlast},
                                    $cdom,$cnum);                       $env{'course.'.$env{'request.course.id'}.'.domain'},
                        $env{'course.'.$env{'request.course.id'}.'.num'});
           }            }
       }        }
       my $result;        &Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'},
       if (&Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'},                             $env{'course.'.$env{'request.course.id'}.'.domain'},
                                  $cdom,$cnum) eq 'ok') {     $env{'course.'.$env{'request.course.id'}.'.num'});
           my $prefix=$symb.':'.$idx.':';  
           my %likes=&Apache::lonnet::dump('disclikes',$cdom,$cnum,  
                                           '^'.$prefix);  
           my ($totallikes,$totalunlikes);  
           if (ref($likes{$prefix.'likers'}) eq 'HASH') {  
               $totallikes = scalar(keys(%{$likes{$prefix.'likers'}}));  
           }  
           if (ref($likes{$prefix.'unlikers'}) eq 'HASH') {  
               $totalunlikes = scalar(keys(%{$likes{$prefix.'unlikers'}}));  
           }  
           if ($totallikes || $totalunlikes) {  
               my ($chglikes,$chgunlikes,$context);  
               if ($env{'form.hide'}) {  
                   $chglikes = -1 * $totallikes;  
                   $chgunlikes = -1 * $totalunlikes;  
                   $context = 'hide';  
               } else {  
                   $chglikes = $totallikes;  
                   $chgunlikes = $totalunlikes;  
                   $context = 'unhide';  
               }  
               &storediscussionlikes($chglikes,$chgunlikes,  
                                     $contrib{$idx.':sendername'},  
                                     $contrib{$idx.':senderdomain'},  
                                     $env{'request.course.id'},  
                                     $context);  
   
           }        &redirect_back($r,$feedurl,&mt('Changed discussion status').'<br />',
           $result = &mt('Changed discussion status');       '0','0','','',$env{'form.previous'},undef,undef,undef,
       } else {  
           $result = &mt('Discussion status unchanged');  
       }  
       &redirect_back($r,$feedurl,$result.'<br />','0','0','','',  
                      $env{'form.previous'},undef,undef,undef,  
                      undef,undef,undef,$group);  
       return OK;  
   } elsif (($env{'form.like'}) || ($env{'form.unlike'})) {  
 # ----------------------------------------------------------------- Like/unlike  
       my $entry=$env{'form.like'}?$env{'form.like'}:$env{'form.unlike'};  
       my ($symb,$idx)=split(/\:\:\:/,$entry);  
       ($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb);  
       my $result;  
       if ($idx > 0) {  
           my $realsymb = &get_realsymb($symb);  
           my $status='OPEN';  
           if ($Apache::lonhomework::parsing_a_problem ||  
               $Apache::lonhomework::parsing_a_task) {  
               $status=$Apache::inputtags::status[-1];  
           }  
           if (&discussion_vote_available($status,$realsymb)) {  
               my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},  
                                                    $cdom,$cnum);  
               my $ownpost;  
               if (($contrib{$idx.':sendername'} eq $env{'user.name'}) &&  
                   ($contrib{$idx.':senderdomain'} eq $env{'user.domain'})) {  
                   $ownpost = 1;  
               }  
               if ($ownpost || $contrib{$idx.':hidden'} || $contrib{$idx.':deleted'}) {  
                   $result = &mt('Vote not registered.').' ';  
               }  
               if ($ownpost) {  
                   $result .= &mt('No voting for your own posts.');  
               } elsif ($contrib{$idx.':hidden'}) {  
                   $result .= &mt('No voting for hidden posts.');  
               } elsif ($contrib{$idx.':deleted'}) {  
                   $result .= &mt('No voting for deleted posts.');  
               } else {  
 #  
 # Likes and unlikes are in db-file "disclikes" of the course  
 # The prefix is the $symb to identify the resource discussion,  
 # and the $idx to identify the entry  
 #  
                   my $prefix=$symb.':'.$idx.':';  
                   my %likes=&Apache::lonnet::dump('disclikes',$cdom,$cnum,  
                                                   '^'.$prefix);  
   
 # Get current like or unlike status for the $idx for this user.  
                   my $thisuser=$env{'user.name'}.':'.$env{'user.domain'};  
                   my ($userlikes,$userunlikes);  
                   if (ref($likes{$prefix.'likers'}) eq 'HASH') {  
                       if (exists($likes{$prefix.'likers'}{$thisuser})) {  
                           $userlikes = 1;  
                       }  
                   }  
                   if (ref($likes{$prefix.'unlikers'}) eq 'HASH') {  
                       if (exists($likes{$prefix.'unlikers'}{$thisuser})) {  
                           $userunlikes = 1;  
                       }  
                   }  
 # Get the current "likes" count  
                   my $likescount=$likes{$prefix.'likes'};  
 # Find out if they already voted  
 # Users cannot like a post twice, or unlike it twice.  
 # They can change their mind, though.  
                   my $alreadyflag=0;  
                   my $votetype;  
                   if ($env{'form.like'}) {  
                       if ($userlikes) {  
                           $alreadyflag=1;  
                       } elsif ($userunlikes) {  
                           delete($likes{$prefix.'unlikers'}{$thisuser});  
                           $votetype = 'switch';  
                           $likescount++;  
                       } else {  
                           if (ref($likes{$prefix.'likers'}) eq 'HASH') {  
                               $likes{$prefix.'likers'}{$thisuser} = 1;  
                           } else {  
                               $likes{$prefix.'likers'} = {$thisuser => 1};  
                           }  
                           $likescount++;  
                       }  
                   } else {  
                       if ($userunlikes) {  
                           $alreadyflag=1;  
                       } elsif ($userlikes) {  
                           delete($likes{$prefix.'likers'}{$thisuser});  
                           $votetype = 'switch';  
                           $likescount--;  
                       } else {  
                           if (ref($likes{$prefix.'unlikers'}) eq 'HASH') {  
                               $likes{$prefix.'unlikers'}{$thisuser} = 1;  
                           } else {  
                               $likes{$prefix.'unlikers'} = {$thisuser => 1};  
                           }  
                           $likescount--;  
                       }  
                   }  
 # $alreadyflag would be 1 if they tried to double-like or double-unlike  
                   if ($alreadyflag) {  
                       if ($env{'form.like'}) {  
                           $result= &mt("'Like' already registered");  
                       } else {  
                           $result= &mt("'Unlike' already registered");  
                       }  
                   } else {  
                       my %newhash=($prefix.'likes'    => $likescount,  
                                    $prefix.'likers'   => $likes{$prefix.'likers'},  
                                    $prefix.'unlikers' => $likes{$prefix.'unlikers'});  
 # Store data in db-file "disclikes"  
                       if (&Apache::lonnet::put('disclikes',\%newhash,$cdom,$cnum) eq 'ok') {  
 # Also store with the person who posted the liked/unliked entry  
                           my ($chglike,$chgunlike);  
                           if ($env{'form.like'}) {  
                               if ($votetype eq 'switch') {  
                                   $chglike = 0;  
                                   $chgunlike = -1;  
                               } else {  
                                   $chglike = 1;  
                                   $chgunlike = 0;  
                               }  
                               &storediscussionlikes($chglike,$chgunlike,  
                                                     $contrib{$idx.':sendername'},  
                                                     $contrib{$idx.':senderdomain'},  
                                                     $env{'request.course.id'},'like');  
                               $result=&mt("Registered 'Like'");  
                           } else {  
                               if ($votetype eq 'switch') {  
                                   $chglike = -1;  
                                   $chgunlike = 0;  
                               } else {  
                                   $chglike = 0;  
                                   $chgunlike = 1;  
                               }  
                              &storediscussionlikes($chglike,$chgunlike,  
                                                    $contrib{$idx.':sendername'},  
                                                    $contrib{$idx.':senderdomain'},  
                                                    $env{'request.course.id'},'unlike');  
                              $result=&mt("Registered 'Unlike'");  
                           }  
                       } else {  
 # Oops, something went wrong  
                           $result=&mt("Failed to register vote");  
                       }  
                   }  
               }  
           } else {  
               $result=&mt('Voting unavailable for this discussion');  
           }  
       } else {  
           $result=&mt('Invalid post number');  
       }  
       &redirect_back($r,$feedurl,$result.'<br />',  
                      '0','0','','',$env{'form.previous'},undef,undef,undef,  
                      undef,undef,undef,$group);                       undef,undef,undef,$group);
       return OK;        return OK;
   } elsif ($env{'form.cmd'}=~/^(threadedoff|threadedon)$/) {    } elsif ($env{'form.cmd'}=~/^(threadedoff|threadedon)$/) {
Line 4247  ENDREDIR Line 3757  ENDREDIR
 # --------------------------------------------------------------- Hide for good  # --------------------------------------------------------------- Hide for good
       my ($symb,$idx)=split(/\:\:\:/,$env{'form.deldisc'});        my ($symb,$idx)=split(/\:\:\:/,$env{'form.deldisc'});
       ($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb);        ($symb,my $feedurl)=&get_feedurl_and_clean_symb($symb);
       my $ressymb=&wrap_symb($symb);  
       unless (&can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum)) {  
           &redirect_back($r,$feedurl,&mt('Deletion not permitted').'<br />',  
                          '0','0','','',$env{'form.previous'},'','','','',  
                          undef,undef,$group);  
           return OK;  
       }  
       my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},        my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},
                                            $cdom,$cnum);                            $env{'course.'.$env{'request.course.id'}.'.domain'},
             $env{'course.'.$env{'request.course.id'}.'.num'});
       my ($changelast,$newlast) = &get_discussion_info($idx,%contrib);        my ($changelast,$newlast) = &get_discussion_info($idx,%contrib);
       if ($changelast) {        if ($changelast) {
           &Apache::lonnet::put('discussiontimes',{$symb => $newlast},            &Apache::lonnet::put('discussiontimes',{$symb => $newlast},
                                $cdom,$cnum);                     $env{'course.'.$env{'request.course.id'}.'.domain'},                   $env{'course.'.$env{'request.course.id'}.'.num'});
       }        }
       my %newhash=('deleted' => $contrib{'deleted'}.".$idx.");        my %newhash=('deleted' => $contrib{'deleted'}.".$idx.");
         &Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'},
       my $result;     $env{'course.'.$env{'request.course.id'}.'.domain'},
       if (&Apache::lonnet::store(\%newhash,$symb,$env{'request.course.id'},     $env{'course.'.$env{'request.course.id'}.'.num'});
                              $cdom,$cnum) eq 'ok') {        &redirect_back($r,$feedurl,&mt('Changed discussion status').'<br />',
           $result = &mt('Changed discussion status');       '0','0','','',$env{'form.previous'},undef,undef,undef,
           my $prefix=$symb.':'.$idx.':';  
           my %likes=&Apache::lonnet::dump('disclikes',$cdom,$cnum,  
                                           '^'.$prefix);  
           my ($totallikes,$totalunlikes);  
           if (ref($likes{$prefix.'likers'}) eq 'HASH') {  
               $totallikes = scalar(keys(%{$likes{$prefix.'likers'}}));  
           }  
           if (ref($likes{$prefix.'unlikers'}) eq 'HASH') {  
               $totalunlikes = scalar(keys(%{$likes{$prefix.'unlikers'}}));  
           }  
           if ($totallikes || $totalunlikes) {  
               my $chglikes = -1 * $totallikes;  
               my $chgunlikes = -1 * $totalunlikes;  
               &storediscussionlikes($chglikes,$chgunlikes,  
                                     $contrib{$idx.':sendername'},  
                                     $contrib{$idx.':senderdomain'},  
                                     $env{'request.course.id'},  
                                     'delete');  
           }  
       } else {  
           $result = &mt('Discussion status unchanged');  
       }  
       &redirect_back($r,$feedurl,$result.'<br />','0','0','','',  
                      $env{'form.previous'},undef,undef,undef,  
                      undef,undef,undef,$group);                       undef,undef,undef,$group);
       return OK;        return OK;
   } elsif ($env{'form.preview'}) {    } elsif ($env{'form.preview'}) {
Line 4318  ENDREDIR Line 3798  ENDREDIR
       my $idx = $env{'form.idx'};        my $idx = $env{'form.idx'};
       if ($idx) {        if ($idx) {
           my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},            my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},
                                                $cdom,$cnum);                           $env{'course.'.$env{'request.course.id'}.'.domain'},
                            $env{'course.'.$env{'request.course.id'}.'.num'});
           $attachmenturls = $contrib{$idx.':attachmenturl'};            $attachmenturls = $contrib{$idx.':attachmenturl'};
       }        }
       &modify_attachments($r,\@currnewattach,\@currdelold,$symb,$idx,        &modify_attachments($r,\@currnewattach,\@currdelold,$symb,$idx,
Line 4331  ENDREDIR Line 3812  ENDREDIR
       my $mode='board';        my $mode='board';
       my $status='OPEN';        my $status='OPEN';
       my $previous=$env{'form.previous'};        my $previous=$env{'form.previous'};
       if ($feedurl =~ /\.(problem|exam|quiz|assess|survey|form|library|task)$/) {        if ($feedurl =~ /$LONCAPA::assess_re/) {
           $mode='problem';            $mode='problem';
           $status=$Apache::inputtags::status[-1];            $status=$Apache::inputtags::status[-1];
       }        }
Line 4342  ENDREDIR Line 3823  ENDREDIR
   &Apache::loncommon::end_page();    &Apache::loncommon::end_page();
       $r->print($start_page.$discussion.$end_page);        $r->print($start_page.$discussion.$end_page);
       return OK;        return OK;
   } elsif ($env{'form.undeleteall'}) {  
       &Apache::loncommon::content_type($r,'text/html');  
       $r->send_http_header;  
       my ($symb,$feedurl) = &get_feedurl_and_clean_symb($env{'form.undeleteall'});  
       my $ressymb=&wrap_symb($symb);  
       $r->print(&Apache::loncommon::start_page('Undelete all deleted discussion entries'));  
       if (&can_see_hidden('',$ressymb,$feedurl,$group,$cdom,$cnum)) {  
           my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},  
                                                 $cdom,$cnum);  
           $contrib{'deleted'} =~ s/^\.//;  
           $contrib{'deleted'} =~ s/\.$//;  
           if ($contrib{'deleted'} ne '') {  
               if (&Apache::lonnet::store({'deleted' => ''},$symb,$env{'request.course.id'},  
                                           $cdom,$cnum) eq 'ok') {  
                   my %likes=&Apache::lonnet::dump('disclikes',$cdom,$cnum,'^'.$symb.':');  
                   my @ids = split(/\.\./,$contrib{'deleted'});  
                   my (%chglikes,%chgunlikes);  
                   foreach my $idx (@ids) {  
                       my $uname = $contrib{$idx.':sendername'};  
                       my $udom = $contrib{$idx.':senderdomain'};  
                       my ($totallikes,$totalunlikes);  
                       if (ref($likes{$symb.':'.$idx.':likers'}) eq 'HASH') {  
                           $totallikes = scalar(keys(%{$likes{$symb.':'.$idx.':likers'}}));  
                       }  
                       if (ref($likes{$symb.':'.$idx.':unlikers'}) eq 'HASH') {  
                           $totalunlikes = scalar(keys(%{$likes{$symb.':'.$idx.':unlikers'}}));  
                       }  
                       if ($totallikes || $totalunlikes) {  
                           $chglikes{$uname.':'.$udom} += $totallikes;  
                           $chgunlikes{$uname.':'.$udom} += $totalunlikes;  
                       }  
                   }  
                   foreach my $user (keys(%chglikes)) {  
                       my ($uname,$udom) = split(/:/,$user);  
                       &storediscussionlikes($chglikes{$user},$chgunlikes{$user},  
                                             $uname,$udom,$env{'request.course.id'},  
                                             'undelete');  
                   }  
                   $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Undeleted all entries")));  
               } else {  
                   $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Failed to undelete entries"),1));  
               }  
           } else {  
               $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("No entries to undelete"),1));  
           }  
           $r->print("<br /><a href='$feedurl'>".&mt("Return and reload")."</a>");  
       }  
       $r->print(&Apache::loncommon::end_page());  
       return OK;  
   } else {    } else {
 # ------------------------------------------------------------- Normal feedback  # ------------------------------------------------------------- Normal feedback
       my $feedurl=$env{'form.postdata'};        my $feedurl=$env{'form.postdata'};
Line 4405  ENDREDIR Line 3837  ENDREDIR
       } elsif ($env{'form.editdisc'}) {        } elsif ($env{'form.editdisc'}) {
   $symb=(split(/\:\:\:/,$env{'form.editdisc'}))[0];    $symb=(split(/\:\:\:/,$env{'form.editdisc'}))[0];
       } elsif ($env{'form.origpage'}) {        } elsif ($env{'form.origpage'}) {
   $symb="";    $symb=""; 
       } else {        } else {
   $symb=&Apache::lonnet::symbread($feedurl);    $symb=&Apache::lonnet::symbread($feedurl);
       }        }
Line 4420  ENDREDIR Line 3852  ENDREDIR
           &dewrapper(\$feedurl);            &dewrapper(\$feedurl);
       }        }
       my $goahead=1;        my $goahead=1;
       if ($feedurl=~/\.(problem|exam|quiz|assess|survey|form|task)$/) {        if ($feedurl=~/$LONCAPA::assess_re/) {
   unless ($symb) { $goahead=0; }    unless ($symb) { $goahead=0; }
       }        }
       if (!$goahead) {        if (!$goahead) {
Line 4519  ENDREDIR Line 3951  ENDREDIR
           $override = 1;            $override = 1;
       }        }
       my $message=&clear_out_html($env{'form.comment'},$override);        my $message=&clear_out_html($env{'form.comment'},$override);
          
   
 # Assemble email  # Assemble email
       my ($email,$citations)=&assemble_email($message,$prevattempts,        my ($email,$citations)=&assemble_email($message,$prevattempts,
Line 4585  sub wrap_symb { Line 4016  sub wrap_symb {
     }      }
     return $ressymb;      return $ressymb;
 }  }
   
 sub dewrapper {  sub dewrapper {
     my ($feedurl)=@_;      my ($feedurl)=@_;
     if ($$feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {      if ($$feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
Line 4739  None Line 4169  None
   
 =item discussion_visible()  =item discussion_visible()
   
 =item discussion_vote_available()  
   
 =item get_realsymb()  
   
 =item list_discussion()  =item list_discussion()
   
 =item can_see_hidden()  
   
 =item discussion_link()  
   
 =item send_feedback_link()  =item send_feedback_link()
   
 =item send_message_link()  =item send_message_link()

Removed from v.1.290.2.7.2.4  
changed lines
  Added in v.1.313


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.