Diff for /loncom/interface/lonfeedback.pm between versions 1.303 and 1.327

version 1.303, 2010/11/19 20:32:38 version 1.327, 2012/01/07 03:01:11
Line 135  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 281  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='';  
   
     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,$prevread,$sortposts,$encsymb,$target,$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 297  sub list_discussion { Line 296  sub list_discussion {
     my $copyresult;      my $copyresult;
   
     my $function = &Apache::loncommon::get_users_function();      my $function = &Apache::loncommon::get_users_function();
     my $color = &Apache::loncommon::designparm($function.'.tabbg',  
                                                     $env{'user.domain'});  
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
         'cuse' => 'Current discussion settings',          'cuse' => 'My settings for this discussion',
         'allposts' => 'All posts',          'allposts' => 'All posts',
         'unread' => 'New posts only',          'unread' => 'New posts only',
         'unmark' => 'Unread only',          'unmark' => 'Unread only',
Line 442  imscp_v1p1.xsd http://www.imsglobal.org/ Line 439  imscp_v1p1.xsd http://www.imsglobal.org/
    }     }
             |);              |);
     $discussion.='<form name="readchoices" method="post" action="/adm/feedback?chgreads='.$ressymb.'" >'.      $discussion.='<form name="readchoices" method="post" action="/adm/feedback?chgreads='.$ressymb.'" >'.
                          "\n".'<table class="LC_discussion">';                           "\n".'<table width="100%" class="LC_discussion">';
             $discussion .= &action_links_bar($colspan,$ressymb,$visible,              $discussion .= &action_links_bar($colspan,$ressymb,$visible,
                                              $newpostsflag,$group,                                               $newpostsflag,$group,
                                              $prevread,$markondisp);                                               $prevread,$markondisp);
Line 505  imscp_v1p1.xsd http://www.imsglobal.org/ Line 502  imscp_v1p1.xsd http://www.imsglobal.org/
         my $thisdepth=$depth[$alldiscussion{$post}];          my $thisdepth=$depth[$alldiscussion{$post}];
                 if ($outputtarget ne 'tex' && $outputtarget ne 'export') {                  if ($outputtarget ne 'tex' && $outputtarget ne 'export') {
     for (1..$thisdepth) {      for (1..$thisdepth) {
  $discussion.='<td>&nbsp;&nbsp;&nbsp;</td>';   $discussion.='<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>';
     }      }
  }   }
         my $colspan=$maxdepth-$thisdepth+1;          my $colspan=$maxdepth-$thisdepth+1;
Line 563  imscp_v1p1.xsd http://www.imsglobal.org/ Line 560  imscp_v1p1.xsd http://www.imsglobal.org/
  unless ($outputtarget eq 'tex' || $outputtarget eq 'export') {   unless ($outputtarget eq 'tex' || $outputtarget eq 'export') {
             my $colspan=$maxdepth+1;              my $colspan=$maxdepth+1;
             $discussion .= <<END;              $discussion .= <<END;
             <tr bgcolor="#FFFFFF">              <tr>
              <td colspan="$colspan" class="LC_disc_action_links_bar">               <td colspan="$colspan">
               <table class="LC_disc_action_table">                <table width="100%">
                <tr>                 <tr>
                 <td align="left">                  <td class="LC_disc_action_left">
                  <table border="0" cellpadding="0" cellspacing="4">                      <font size="-1"><b>$lt{'cuse'}</b>:&nbsp;
                   <tr>  
                    <td>  
                     <font size="-1"><b>$lt{'cuse'}</b>:</font></td>  
                    <td>&nbsp;</td>  
                    <td><font size="-1">  
 END  END
             if ($newpostsflag) {              if ($newpostsflag) {
                 $discussion .=                   $discussion .= 
Line 590  END Line 582  END
                 }                  }
             }              }
             $discussion .= <<END;              $discussion .= <<END;
                    </font></td>                     &nbsp;&nbsp;<b><a href="$chglink">$lt{'chgt'}</a></b></font>
                    <td>&nbsp;</td>  
                    <td align="left">  
                     <font size="-1"><b><a href="$chglink">$lt{'chgt'}</a>?</b></font>  
                    </td>  
                   </tr>  
                  </table>  
                 </td>                  </td>
 END  END
             if ($sortposts) {              if ($sortposts) {
Line 605  END Line 591  END
                 my %status_types = ();                  my %status_types = ();
                 &sort_filter_names(\%sort_types,\%role_types,\%status_types,$crstype);                  &sort_filter_names(\%sort_types,\%role_types,\%status_types,$crstype);
   
                 $discussion .= '<td><font size="-1"><b>'.&mt('Sorted by').'</b>: '.$sort_types{$sortposts}.'<br />';                  $discussion .= '<td class="LC_disc_action_right"><font size="-1"><b>'.&mt('Sorted by').'</b>: '.$sort_types{$sortposts}.'<br />';
                 if (defined($env{'form.totposters'})) {                  if (defined($env{'form.totposters'})) {
                     $discussion .= &mt('Posts by').':';                      $discussion .= &mt('Posts by').':';
                     if ($totposters > 0) {                      if ($totposters > 0) {
Line 640  END Line 626  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 660  END Line 647  END
             $discussion .= &action_links_bar($colspan,$ressymb,$visible,              $discussion .= &action_links_bar($colspan,$ressymb,$visible,
                                              $newpostsflag,$group,                                               $newpostsflag,$group,
                                              $prevread,$markondisp);                                               $prevread,$markondisp);
             $discussion .= "              $discussion .= "</table></form>\n";
            </table>  
            <br /><br /></form>\n";  
         }           } 
         if ($outputtarget eq 'export') {          if ($outputtarget eq 'export') {
             if ($manifestok) {              if ($manifestok) {
Line 724  END Line 709  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$})) {
                     $discussion .=                      $discussion .=
  &postingform_display($mode,$ressymb,$now,$subject,   &postingform_display($mode,$ressymb,$now,$subject,
      $comment,$outputtarget,$attachnum,       $comment,$outputtarget,$attachnum,
Line 755  END Line 741  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);
                 if (defined($close) && $close ne '' && $close < time) {                  if (defined($close) && $close ne '' && $close < time) {
Line 771  END Line 757  END
     return $discussion;      return $discussion;
 }  }
   
   
   sub discussion_link {
      my ($ressymb,$linktext,$cmd,$item,$flag,$prev,$adds)=@_;
      my $link='/adm/feedback?inhibitmenu=yes&modal=yes&'.$cmd.'='.&escape($ressymb).':::'.$item;
      if ($flag) { $link .= '&amp;previous='.$prev; }
      if ($adds) { $link .= $adds; }
      my $width=600;
      my $height=600;
      if (($cmd eq 'hide') || ($cmd eq 'unhide') || ($cmd eq 'like') || ($cmd eq 'unlike')) {
          $width=300;
          $height=200;
      }
      return &Apache::loncommon::modal_link($link,$linktext,$width,$height);
   }
   
   
 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 794  sub send_message_link { Line 796  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) = @_;
     my $discussion = '<tr><td class="LC_disc_action_links_bar" colspan="'.$colspan.'">'.      my $discussion = '<tr><td colspan="'.$colspan.'">'.
                      '<table width="100%" class="LC_disc_action_table"><tr>'.                       '<table width="100%"><tr>'.
                      '<td class="LC_disc_action_left">';                       '<td class="LC_disc_action_left">';
     my $escsymb=&escape($ressymb);      my $escsymb=&escape($ressymb);
     if ($visible) {      if ($visible) {
Line 810  sub action_links_bar { Line 812  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 .= '<br />';
     }      }
     $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>&nbsp;&nbsp;</td>';      $discussion .= '">'.&mt('Export').'</a>';
       if (&Apache::lonnet::allowed('rin',$env{'request.course.id'})) {
           $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';
             $discussion .= &group_args($group);              $discussion .= &group_args($group);
             $discussion .= '">'.              $discussion .= '">'.
                            &mt('Preferences on what is marked as NEW').                             &mt('My general preferences on what is marked as NEW').
                            '</a><br /><a href="/adm/feedback?markread=1&amp;symb='.$escsymb;                             '</a><br /><a href="/adm/feedback?markread=1&amp;symb='.$escsymb;
             $discussion .= &group_args($group);              $discussion .= &group_args($group);
             $discussion .= '">'.&mt('Mark NEW posts no longer new').'</a></td>';              $discussion .= '">'.&mt('Mark NEW posts no longer new').'</a></td>';
Line 921  ENDDISCUSS Line 935  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,$prevread,$sortposts,$ressymb,$target,$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'});
   # And these are the likes/unlikes
       my %likes=&Apache::lonnet::dump('disclikes',
                             $env{'course.'.$env{'request.course.id'}.'.domain'},
                             $env{'course.'.$env{'request.course.id'}.'.num'},
                             '^'.$symb.':');
       my $thisuser=$env{'user.name'}.':'.$env{'user.domain'};
   # Array with likes to figure out averages, etc.
       my @theselikes=();
   # 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'}:''));
   
     if ((@{$grouppick} == 0) || (grep(/^all$/,@{$grouppick}))) {      if ((@{$grouppick} == 0) || (grep(/^all$/,@{$grouppick}))) {
         $skip_group_check = 1;          $skip_group_check = 1;
     }      }
   # Deletions and hiddens are just lists. Split them up into a hash for quicker lookup
     my (%deletions,%hiddens);      my (%deletions,%hiddens);
     if ($contrib{'deleted'}) {      if ($contrib{'deleted'}) {
        my $deleted = $contrib{'deleted'};         my $deleted = $contrib{'deleted'};
Line 950  sub build_posting_display { Line 974  sub build_posting_display {
        $hidden =~ s/\.$//;         $hidden =~ s/\.$//;
        %hiddens = map { $_ => 1 } (split(/\.\./,$hidden));         %hiddens = map { $_ => 1 } (split(/\.\./,$hidden));
     }      }
   # Versions if store/restore are used to actually store the messages. 
     if ($contrib{'version'}) {      if ($contrib{'version'}) {
         my $oldest = $contrib{'1:timestamp'};          my $oldest = $contrib{'1:timestamp'};
         if ($prevread eq '0') {          if ($prevread eq '0') {
Line 960  sub build_posting_display { Line 985  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;
         }           }
   # 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}) && (!$seeid)) || ($deletions{$idx}) || (!$contrib{$idx.':message'})) {
                   push(@theselikes,$likes{$symb.':'.$idx.':likes'});
               }
           }
   # 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
           my $oneplus=$ave+$stddev;
           my $twoplus=$ave+2.*$stddev;
           my $oneminus=$ave-$stddev;
           my $twominus=$ave-2.*$stddev;
   #            &Apache::lonnet::logthis(join(',',@theselikes)." Ave $ave StdDev $stddev $twominus $oneminus $oneplus $twoplus");
   #
   # 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'});
             next if ($contrib{$idx.':hidden'});              next if ($contrib{$idx.':hidden'});
   # If we get here, we are actually going to display the message - we don't know where and we don't know if we display
   # previous edits, but it counts as one entry
             my $posttime = $contrib{$idx.':timestamp'};              my $posttime = $contrib{$idx.':timestamp'};
             if ($prevread <= $posttime) {              if ($prevread <= $posttime) {
                 $$newpostsflag = 1;                  $$newpostsflag = 1;
Line 1092  sub build_posting_display { Line 1154  sub build_posting_display {
                                 @{$$namesort{$lastname}{$firstname}} = ("$idx");                                  @{$$namesort{$lastname}{$firstname}} = ("$idx");
                             }                              }
                             if ($outputtarget ne 'tex') {                              if ($outputtarget ne 'tex') {
                                   unless ($likes{$symb.':'.$idx.':likers'}=~/\,\Q$thisuser\E\,/) {
                                       $sender.='&nbsp;'.&discussion_link($symb,&mt('Like'),'like',$idx,$$newpostsflag,$prevread,&group_args($group));
                                   }
                                   unless ($likes{$symb.':'.$idx.':unlikers'}=~/\,\Q$thisuser\E\,/) {
                                       $sender.='&nbsp;'.&discussion_link($symb,&mt('Unlike'),'unlike',$idx,$$newpostsflag,$prevread,&group_args($group));
                                   }
                                   my $thislikes=$likes{$symb.':'.$idx.':likes'};
                                   if ($thislikes>0) { 
                                       $sender.='&nbsp;('.&mt("[_1] likes",$thislikes).')';
                                   } elsif ($thislikes<0) {
                                       $sender.='&nbsp;('.&mt("[_1] unlikes",abs($thislikes)).')';
                                   }
                                 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) {  
                                             $sender .= '&amp;previous='.$prevread;  
                                         }  
         $sender .= &group_args($group);  
                                         $sender .= '" '.$target.'>'.&mt('Edit').'</a>';  
                                       
                                         unless ($seeid) {                                          unless ($seeid) {
                                             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')";
Line 1112  sub build_posting_display { Line 1180  sub build_posting_display {
         if ($seeid) {          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 1164  sub build_posting_display { Line 1223  sub build_posting_display {
             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) {
Line 1288  sub build_posting_display { Line 1338  sub build_posting_display {
                         unless ($$notshown{$idx} == 1) {                          unless ($$notshown{$idx} == 1) {
                             if ($prevread > 0 && $prevread <= $posttime) {                              if ($prevread > 0 && $prevread <= $posttime) {
                                 $$newitem{$idx} = 1;                                  $$newitem{$idx} = 1;
                                 $$discussionitems[$idx] .= '                                  $$discussionitems[$idx] .= '<font color="#FF0000"><b>'.&mt('NEW').'&nbsp;&nbsp;</b></font>';
                                   <table border="0" width="100%">  
                                   <tr><td align="left"><font color="#FF0000"><b>'.&mt('NEW').'&nbsp;</b></font></td>';  
                             } else {                              } else {
                                 $$newitem{$idx} = 0;                                  $$newitem{$idx} = 0;
                                 $$discussionitems[$idx] .= '  
                                   <table border="0" width="100%">  
                                   <tr><td align="left">&nbsp;</td>';  
                             }                              }
                             $$discussionitems[$idx] .= '<td align="left">&nbsp;&nbsp;'.                              $$discussionitems[$idx] .= '<b>'.$subject.'</b>&nbsp;&nbsp;'.
                                 '<b>'.$subject.'</b>&nbsp;&nbsp;'.  
                                 $sender.' '.$vgrlink.' ('.                                  $sender.' '.$vgrlink.' ('.
                                 &Apache::lonlocal::locallocaltime($posttime).')</td>';                                  &Apache::lonlocal::locallocaltime($posttime).')';
                             if ($$dischash{$toggkey}) {                              if ($$dischash{$toggkey}) {
                                 $$discussionitems[$idx].='<td align="right">&nbsp;&nbsp;'.                                  $$discussionitems[$idx].='&nbsp;&nbsp;'.$ctlink;
                                   $ctlink.'</td>';                              }
   # 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";
                             }                              }
                             $$discussionitems[$idx].= '</tr></table><blockquote>'.                              $$discussionitems[$idx].= '<br /><blockquote>'.
                                     $message.'</blockquote>';                                      "<div style='font-size:$likesize%'>".
                                       $message.
                                       '</div></blockquote>';
                             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 ($seeid) {                                  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 1326  sub build_posting_display { Line 1383  sub build_posting_display {
                                     $$discussionitems[$idx] .= '<b>'.$version.'.</b> - '.&Apache::lonlocal::locallocaltime($postversions[$i]).'  ';                                      $$discussionitems[$idx] .= '<b>'.$version.'.</b> - '.&Apache::lonlocal::locallocaltime($postversions[$i]).'  ';
                                 }                                  }
                             }                              }
   # end of unless ($$notshown ...)
                         }                          }
   # end of if ($message) ...
                     }                      }
   # end of the else-branch of target being export
                 }                  }
   # end of unless hidden or deleted
             }              }
   # end of the loop over all discussion entries
  }   }
   # end of "if there actually are any discussions
     }      }
   # end of subroutine "build_posting_display" 
 }  }
   
 sub filter_regexp {  sub filter_regexp {
Line 1669  END Line 1733  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 1727  END Line 1791  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 1739  END Line 1803  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 1759  END Line 1827  END
 END  END
   }    }
   $r->print(<<END);    $r->print(<<END);
 $options<hr />  $options
 $quote  $quote
 <p>$lt{'myqu'}  <p>$lt{'myqu'}
 $textareaheader  $textareaheader
Line 2194  END Line 2262  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 2259  $start_page Line 2327  $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 2296  sub print_showposters { Line 2365  sub print_showposters {
     my $group = $env{'form.group'};      my $group = $env{'form.group'};
     my $ressymb = &wrap_symb($symb);      my $ressymb = &wrap_symb($symb);
     if (($group ne '') &&      if (($group ne '') &&
         ($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$|)) {
         if (&check_group_priv($group,'dgp') eq 'ok') {          if (&check_group_priv($group,'dgp') eq 'ok') {
             $seeid = 1;              $seeid = 1;
         }          }
Line 2384  END Line 2453  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 2569  sub redirect_back { Line 2639  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{'form.modal'}) {
         $parms{'add_entries'}={'onLoad' => 'document.forms.reldt.submit()'};
     } 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 2678  sub screen_header { Line 2750  sub screen_header {
     }      }
     if (($env{'request.course.id'}) && (!$env{'form.sendmessageonly'})) {      if (($env{'request.course.id'}) && (!$env{'form.sendmessageonly'})) {
         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 $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         my $realsymb = $symb;          my $realsymb = $symb;
         if ($symb=~/^bulletin___/) {          if ($symb=~/^bulletin___/) {
             my $filename=(&Apache::lonnet::decode_symb($symb))[2];              my $filename=(&Apache::lonnet::decode_symb($symb))[2];
Line 2687  sub screen_header { Line 2761  sub screen_header {
         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'}:'')) || (($group ne '') && (&check_group_priv($group,'pgd') eq 'ok')))) {        ($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')))) {
     $discussoptions='<label><input type="radio" name="discuss" value="nonanon" checked="checked" /> '.      $discussoptions='<label><input type="radio" name="discuss" value="nonanon" checked="checked" /> '.
  $contribdisc.   $contribdisc.
         '</label><br /><label><input type="radio" name="discuss" value="anon" /> '.          '</label><br /><label><input type="radio" name="discuss" value="anon" /> '.
Line 2701  sub screen_header { Line 2776  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 2810  sub send_msg { Line 2885  sub send_msg {
  }   }
     }      }
   
   # Records of number of feedback messages are kept under the "symb" called "_feedback"
     my %record=&Apache::lonnet::restore('_feedback');  # There are two entries within the framework of a course:
     my ($temp)=keys(%record);  # - the URLs for which feedback was provided
     unless ($temp=~/^error\:/) {  # - the total number of contributions
  my %newrecord=();      if ($sendsomething) {
  $newrecord{'resource'}=$feedurl;          my %record=&getfeedbackrecords();
  $newrecord{'subnumber'}=$record{'subnumber'}+1;          my ($temp)=keys(%record);
  unless (&Apache::lonnet::cstore(\%newrecord,'_feedback') eq 'ok') {          unless ($temp=~/^error\:/) {
     $status.='<br />'.&mt('Not registered').'<br />';      my %newrecord=();
  }      $newrecord{'resource'}=$feedurl;
       $newrecord{'subnumber'}=$record{'subnumber'}+1;
       unless (&Apache::lonnet::cstore(\%newrecord,'_feedback') eq 'ok') {
           $status.='<br />'.&mt('Not registered').'<br />';
       }
           }
     }      }
       
     return ($status,$sendsomething);      return ($status,$sendsomething);
 }  }
   
   # Routine to get the complete feedback records
   
   sub getfeedbackrecords {
       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('_feedback',$course,$udom,$uname);
       return %record;
   }
   
   # Routine to get feedback statistics
   
   sub getfeedbackstats {
       my %record=&getfeedbackrecords(@_);
       return ($record{'subnumber'},$record{'points'},$record{'totallikes'});
   }
   
   # Store feedback credit
   
   sub storefeedbackpoints {
       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,'_feedback');
   }
   
   # 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');
   }
   
   
 sub adddiscuss {  sub adddiscuss {
     my ($symb,$email,$anon,$attachmenturl,$subject,$group)=@_;      my ($symb,$email,$anon,$attachmenturl,$subject,$group)=@_;
     my $status='';      my $status='';
Line 2834  sub adddiscuss { Line 2966  sub adddiscuss {
  $filename=~s|^adm/wrapper/||;   $filename=~s|^adm/wrapper/||;
  $realsymb=&Apache::lonnet::symbread($filename);   $realsymb=&Apache::lonnet::symbread($filename);
     }      }
       my ($cnum,$cdom);
       if ($env{'request.course.id'}) {
           $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
           $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       }
     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')))) {           (($group ne '') && (&check_group_priv($group,'pgd') eq 'ok') && 
            ($symb =~ m{^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$})))) {
   
     my %contrib=('message'      => $email,      my %contrib=('message'      => $email,
                  'sendername'   => $env{'user.name'},                   'sendername'   => $env{'user.name'},
Line 2917  sub adddiscuss { Line 3055  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=&Apache::lonnet::restore('_discussion');      my %record=&getdiscussionrecords();
     my ($temp)=keys(%record);      my ($temp)=keys(%record);
     unless ($temp=~/^error\:/) {      unless ($temp=~/^error\:/) {
        my %newrecord=();         my %newrecord=();
Line 2932  sub adddiscuss { Line 3070  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(@_);
       return ($record{'subnumber'},$record{'points'},$record{'totallikes'});
   }
   
   
   # 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');
   }
   
   # Store discussion "likes"
   
   sub storediscussionlikes {
       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=&getdiscussionrecords($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,'_discussion');
   }
   
 sub get_discussion_info {  sub get_discussion_info {
     my ($idx,%contrib) = @_;      my ($idx,%contrib) = @_;
     my $changelast = 0;      my $changelast = 0;
Line 3095  END Line 3287  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 3458  sub handler { Line 3652  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'},
          ['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']);           ['like','unlike','modal','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']);
   my $group = $env{'form.group'};    my $group = $env{'form.group'};
   my %attachmax = (    my %attachmax = (
                     text => &mt('(128 KB max size)'),                      text => &mt('(128 KB max size)'),
Line 3509  sub handler { Line 3703  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'};        my $crs='/'.$env{'request.course.id'};
       if ($env{'request.course.sec'}) {        if ($env{'request.course.sec'}) {
Line 3732  ENDREDIR Line 3927  ENDREDIR
      '0','0','','',$env{'form.previous'},undef,undef,undef,       '0','0','','',$env{'form.previous'},undef,undef,undef,
                      undef,undef,undef,$group);                       undef,undef,undef,$group);
       return OK;        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);
   #
   # 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 %contrib=&Apache::lonnet::dump('disclikes',
                                           $env{'course.'.$env{'request.course.id'}.'.domain'},
                                           $env{'course.'.$env{'request.course.id'}.'.num'},
                                           '^'.$prefix);
   # Get all who like or unlike this
         my $currentlikers=$contrib{$prefix.'likers'};
         my $currentunlikers=$contrib{$prefix.'unlikers'};
   # Get the current "likes" count
         my $likes=$contrib{$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 $thisuser=$env{'user.name'}.':'.$env{'user.domain'};
         if ($env{'form.like'}) {
             if ($currentlikers=~/\,\Q$thisuser\E\,/) {
                 $alreadyflag=1;
             } else {
                 if ($currentunlikers=~/\,\Q$thisuser\E\,/) {
                     $currentunlikers=~s/\,\Q$thisuser\E\,//g;
                 } else {
                     $currentlikers.=','.$thisuser.',';
                 }
                 $likes++;
             } 
         } else {
             if ($currentunlikers=~/\,\Q$thisuser\E\,/) {
                 $alreadyflag=1;
             } else {
                 if ($currentlikers=~/\,\Q$thisuser\E\,/) {
                     $currentlikers=~s/\,\Q$thisuser\E\,//g;
                 } else {
                     $currentunlikers.=','.$thisuser.',';
                 }
                 $likes--;
             } 
         }
         my $result;
   # $alreadyflag would be 1 if they tried to double-like or double-unlike
         unless ($alreadyflag) {
             my %newhash=($prefix.'likes'    => $likes,
                          $prefix.'likers'   => $currentlikers,
                          $prefix.'unlikers' => $currentunlikers);
   # Store data in db-file "disclikes"
             if (&Apache::lonnet::put('disclikes',
                                      \%newhash,
                                      $env{'course.'.$env{'request.course.id'}.'.domain'},
                                      $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {
   # Also store with the person who posted the liked/unliked entry
                 if ($env{'form.like'}) {
                     &storediscussionlikes(1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'});
                     $result=&mt("Registered 'Like'");
                 } else {
                     &storediscussionlikes(-1,$contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'});
                     $result=&mt("Registered 'Unlike'");
                 }
             } else {
   # Oops, something went wrong
                 $result=&mt("Failed to register vote");
             }
         }
         &redirect_back($r,$feedurl,$result.'<br />',
                        '0','0','','',$env{'form.previous'},undef,undef,undef,
                        undef,undef,undef,$group);
         return OK;
   } elsif ($env{'form.cmd'}=~/^(threadedoff|threadedon)$/) {    } elsif ($env{'form.cmd'}=~/^(threadedoff|threadedon)$/) {
       my ($symb,$feedurl)=&get_feedurl_and_clean_symb($env{'form.symb'});        my ($symb,$feedurl)=&get_feedurl_and_clean_symb($env{'form.symb'});
       if ($env{'form.cmd'} eq 'threadedon') {        if ($env{'form.cmd'} eq 'threadedon') {
Line 3804  ENDREDIR Line 4074  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 3815  ENDREDIR Line 4085  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'});
         $r->print(&Apache::loncommon::start_page('Undelete all deleted discussion entries'));
         if (&Apache::lonnet::allowed('rin',$env{'request.course.id'})) {
              if (&Apache::lonnet::store({'deleted' => ''},$symb,$env{'request.course.id'},
                        $env{'course.'.$env{'request.course.id'}.'.domain'},
                        $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') {
                  $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Undeleted all entries")));
              } else {
                  $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Failed to undelete entries"),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 3844  ENDREDIR Line 4132  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) {

Removed from v.1.303  
changed lines
  Added in v.1.327


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