Diff for /loncom/interface/lonfeedback.pm between versions 1.287 and 1.290.2.7.2.3

version 1.287, 2010/01/25 02:27:09 version 1.290.2.7.2.3, 2012/03/09 15:09:39
Line 49  use LONCAPA; Line 49  use LONCAPA;
   
 sub discussion_open {  sub discussion_open {
     my ($status,$symb)=@_;      my ($status,$symb)=@_;
   # Advanced roles can always discuss
     if ($env{'request.role.adv'}) { return 1; }      if ($env{'request.role.adv'}) { return 1; }
   # Get discussion closing date
       my $close=&Apache::lonnet::EXT('resource.0.discussend',$symb);
   # If it is defined and in the future, the instructor wants this discussion to be open
       if (defined($close) && $close ne '' && $close > time) {
           return 1;
       }
   # It was not explicitly open, check if the problem is available.
   # 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;
     }      }
     my $close=&Apache::lonnet::EXT('resource.0.discussend',$symb);  # 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 317  sub list_discussion { Line 326  sub list_discussion {
         'dpwn' => 'Deleted posts will no longer be visible to you and other students',          'dpwn' => 'Deleted posts will no longer be visible to you and other students',
         'bwco' => 'but will continue to be visible to your instructor',          'bwco' => 'but will continue to be visible to your instructor',
         'depo' => 'Deleted posts will no longer be visible to you or anyone else.',          'depo' => 'Deleted posts will no longer be visible to you or anyone else.',
           'discussions' => 'DISCUSSIONS'
     );      );
   
     my $currdisp = $lt{'allposts'};      my $currdisp = $lt{'allposts'};
Line 368  sub list_discussion { Line 378  sub list_discussion {
 # Print the discusssion  # Print the discusssion
         if ($outputtarget eq 'tex') {          if ($outputtarget eq 'tex') {
             $discussion.='<tex>{\tiny \vskip 0 mm\noindent\makebox[2 cm][b]{\hrulefill}'.              $discussion.='<tex>{\tiny \vskip 0 mm\noindent\makebox[2 cm][b]{\hrulefill}'.
                          '\textbf{DISCUSSIONS}\makebox[2 cm][b]{\hrulefill}'.                           '\textbf{'.$lt{'discussions'}.'}\makebox[2 cm][b]{\hrulefill}\vskip 0 mm'.
                          '\vskip 0 mm\noindent\textbf{'.$lt{'cuse'}.'}:\vskip 0 mm'.  
                          '\noindent\textbf{'.$lt{'disa'}.'}: \textit{'.$currdisp.'}\vskip 0 mm'.                           '\noindent\textbf{'.$lt{'disa'}.'}: \textit{'.$currdisp.'}\vskip 0 mm'.
                          '\noindent\textbf{'.$lt{'npce'}.'}: \textit{'.$currmark.'}}</tex>';                           '\noindent\textbf{'.$lt{'npce'}.'}: \textit{'.$currmark.'}}</tex>';
         } elsif ($outputtarget eq 'export') {          } elsif ($outputtarget eq 'export') {
Line 514  imscp_v1p1.xsd http://www.imsglobal.org/ Line 523  imscp_v1p1.xsd http://www.imsglobal.org/
  $threadinsert='<br /><strong>Reply: '.$thisdepth.'</strong>';   $threadinsert='<br /><strong>Reply: '.$thisdepth.'</strong>';
     }      }
     $discussionitems[$alldiscussion{$post}]=~s/<\/td><td([^>]*)>/$threadinsert<\/td><td TeXwidth="65 mm" align="left">/;      $discussionitems[$alldiscussion{$post}]=~s/<\/td><td([^>]*)>/$threadinsert<\/td><td TeXwidth="65 mm" align="left">/;
     $discussionitems[$alldiscussion{$post}]=~s/<a([^>]+)>(Edit|Hide|Delete|Reply|Submissions)<\/a>//g;  
                     $discussionitems[$alldiscussion{$post}]=~s/(<b>|<\/b>|<\/a>|<a([^>]+)>)//g;                      $discussionitems[$alldiscussion{$post}]=~s/(<b>|<\/b>|<\/a>|<a([^>]+)>)//g;
   
     $discussionitems[$alldiscussion{$post}]='<tex>\vskip 0 mm\noindent\makebox[2 cm][b]{\hrulefill}</tex>'.$discussionitems[$alldiscussion{$post}];      $discussionitems[$alldiscussion{$post}]='<tex>\vskip 0 mm\noindent\makebox[2 cm][b]{\hrulefill}</tex>'.$discussionitems[$alldiscussion{$post}];
Line 719  END Line 727  END
                 $attachnum += @{$currnewattach};                  $attachnum += @{$currnewattach};
             }              }
         }          }
  if (&discussion_open($status)) {   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 729  END Line 738  END
      $group,$crstype);       $group,$crstype);
                 }                  }
             } else {              } else {
         $discussion.=                   if (&Apache::lonnet::allowed('pch',$env{'request.course.id'}.
     &postingform_display($mode,$ressymb,$now,$subject,                      ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
  $comment,$outputtarget,$attachnum,  
  $currnewattach,$currdelold,'',$crstype);                      $discussion.=
                           &postingform_display($mode,$ressymb,$now,$subject,
                                                $comment,$outputtarget,$attachnum,
                                                $currnewattach,$currdelold,'',$crstype);
                   } else {
                       $discussion.= '<span class="LC_feedback_link">'.
                                     &mt('This discussion is closed.').'</span>';
                   }
             }              }
  }   }
     } else {          if (!(&discussion_open($status)) && ($outputtarget ne 'tex')) {
               $discussion.= '<span class="LC_feedback_link">'.
                             &mt('This discussion is closed.').'</span>';
           }
       } elsif ($outputtarget ne 'tex') {
         $discussion.='<div class="LC_feedback_link">';          $discussion.='<div class="LC_feedback_link">';
         if (&discussion_open($status) &&          if (&discussion_open($status) &&
             &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'}:''))) {
     if ($outputtarget ne 'tex') {      $discussion.= &send_feedback_link($ressymb,$target);
  $discussion.= &send_feedback_link($ressymb,$target);              if ($env{'request.role.adv'}) {
                   my $close = &Apache::lonnet::EXT('resource.0.discussend',$ressymb);
                   if (defined($close) && $close ne '' && $close < time) {
                       $discussion .= '&nbsp;'.&mt('(Closed for [_1] roles)',
                                                   &Apache::lonnet::plaintext('st',$crstype));
                   }
             }              }
  }          } else {
         if ($outputtarget ne 'tex') {              $discussion.= '<span class="LC_feedback_link">'.&mt('This discussion is closed.').'</span>';
     $discussion.= &send_message_link($ressymb);  
         }          }
         $discussion.='</div>';   $discussion.= &send_message_link($ressymb).'</div>';
     }      }
     return $discussion;      return $discussion;
 }  }
   
   sub discussion_link {
       my ($ressymb,$linktext,$cmd,$item,$flag,$prev,$adds,$title) = @_;
       my $link = '<a href="/adm/feedback?'.$cmd.'='.&escape($ressymb).':::'.$item;
       if ($flag) { $link .= '&amp;previous='.$prev; }
       if ($adds) { $link .= $adds; }
       $link .= '"';
       if ($title) { $link .= ' title="'.$title.'"'; }
       $link .= '>'.$linktext.'</a>';
       return $link;
   }
   
 sub send_feedback_link {  sub send_feedback_link {
     my ($ressymb,$target) = @_;      my ($ressymb,$target) = @_;
     my $output = '<span class="LC_feedback_link">'.      my $output = '<span class="LC_feedback_link">'.
Line 769  sub send_message_link { Line 804  sub send_message_link {
     my $output = '<span class="LC_message_link">'.      my $output = '<span class="LC_message_link">'.
                  '  <a href="/adm/feedback?sendmessageonly=1&amp;symb='.                   '  <a href="/adm/feedback?sendmessageonly=1&amp;symb='.
                  &escape($ressymb).'"><img alt="" class="LC_noBorder" src="'.                   &escape($ressymb).'"><img alt="" class="LC_noBorder" src="'.
                  &Apache::loncommon::lonhttpdurl('/res/adm/pages/com.png').                   &Apache::loncommon::lonhttpdurl('/res/adm/pages/feedback.png').
                  '" border="0" /><span class="LC_menubuttons_inline_text">'.&mt('Send Feedback').'</span></a></span>';                   '" border="0" /><span class="LC_menubuttons_inline_text">'.&mt('Send Feedback').'</span></a></span>';
     return $output;      return $output;
 }  }
Line 780  sub action_links_bar { Line 815  sub action_links_bar {
                      '<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">';
     my $escsymb=&escape($ressymb);      my $escsymb=&escape($ressymb);
     if ($visible>2) {      if ($visible) {
         $discussion .= '<a href="/adm/feedback?cmd=threadedon&amp;symb='.$escsymb;          $discussion .= '<a href="/adm/feedback?cmd=threadedon&amp;symb='.$escsymb;
         if ($newpostsflag) {          if ($newpostsflag) {
             $discussion .= '&amp;previous='.$prevread;              $discussion .= '&amp;previous='.$prevread;
Line 839  sub postingform_display { Line 874  sub postingform_display {
     if ($crstype eq 'Community') {      if ($crstype eq 'Community') {
         $lt{'note'} = &mt('Note: in anonymous discussion, your name is visible only to community facilitators');          $lt{'note'} = &mt('Note: in anonymous discussion, your name is visible only to community facilitators');
     }      }
     my $postingform = (<<ENDDISCUSS);      my ($postingform,$textareaclass);
       if (&Apache::lonhtmlcommon::htmlareabrowser()) {
           $postingform = &Apache::lonhtmlcommon::htmlareaselectactive();
           $textareaclass = 'class="LC_richDefaultOff"';
           if ($env{'request.course.id'}) {
               unless (($env{'course.'.$env{'request.course.id'}.'.allow_limited_html_in_feedback'} =~ /^\s*yes\s*$/i) || ($env{'form.sendmessageonly'})) {
                   undef($textareaclass);
               }
           }
       }
       $postingform .= (<<ENDDISCUSS);
 <form action="/adm/feedback" method="post" name="mailform" enctype="multipart/form-data"> <input type="submit" name="discuss" value="$lt{'podi'}" />  <form action="/adm/feedback" method="post" name="mailform" enctype="multipart/form-data"> <input type="submit" name="discuss" value="$lt{'podi'}" />
 <input type="submit" name="anondiscuss" value="$lt{'poan'}" /> <input type="hidden" name="symb" value="$ressymb" />  <input type="submit" name="anondiscuss" value="$lt{'poan'}" /> <input type="hidden" name="symb" value="$ressymb" />
 <input type="hidden" name="sendit" value="true" />  <input type="hidden" name="sendit" value="true" />
Line 847  sub postingform_display { Line 892  sub postingform_display {
 <br /><a name="newpost"></a>  <br /><a name="newpost"></a>
 <font size="1">$lt{'note'}</font><br />  <font size="1">$lt{'note'}</font><br />
 <b>$lt{'title'}:</b>&nbsp;<input type="text" name="subject" value="$subject" size="30" /><br /><br />  <b>$lt{'title'}:</b>&nbsp;<input type="text" name="subject" value="$subject" size="30" /><br /><br />
 <textarea name="comment" cols="80" rows="14" >$comment</textarea>  <textarea name="comment" cols="80" rows="14" id="comment" $textareaclass>$comment</textarea>
 ENDDISCUSS  ENDDISCUSS
     if ($env{'form.origpage'}) {      if ($env{'form.origpage'}) {
         $postingform .= '<input type="hidden" name="origpage" value="'.          $postingform .= '<input type="hidden" name="origpage" value="'.
Line 869  ENDDISCUSS Line 914  ENDDISCUSS
         $postingform .= &add_blog_checkbox($crstype);          $postingform .= &add_blog_checkbox($crstype);
     }      }
     $postingform .= "</form>\n";      $postingform .= "</form>\n";
     if ($outputtarget ne 'tex') {      $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";  
             } else {  
                 $$currnewattach[0] =~ m#.*/([^/]+)$#;  
                 $newattachmsg .= '<a href="'.$$currnewattach[0].'">'.$1.'</a><br />'."\n";  
             }              }
               $newattachmsg .= '</ol>'."\n";
           } else {
               $$currnewattach[0] =~ m#.*/([^/]+)$#;
               $newattachmsg .= '<a href="'.$$currnewattach[0].'">'.$1.'</a><br />'."\n";
         }          }
         $postingform .= $newattachmsg;  
         $postingform .= &generate_preview_button();  
     }      }
       $postingform .= $newattachmsg;
       $postingform .= &generate_preview_button();
     return $postingform;      return $postingform;
 }  }
   
Line 901  sub build_posting_display { Line 944  sub build_posting_display {
     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=();
   # Hashes containing likes and unlikes for this user.
       my %userlikes=();
       my %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'}:''));
   
     if ((@{$grouppick} == 0) || (grep(/^all$/,@{$grouppick}))) {      if ((@{$grouppick} == 0) || (grep(/^all$/,@{$grouppick}))) {
         $skip_group_check = 1;          $skip_group_check = 1;
     }      }
       my (%deletions,%hiddens);
       if ($contrib{'deleted'}) {
          my $deleted = $contrib{'deleted'};
          $deleted =~ s/^\.//;
          $deleted =~ s/\.$//;
          %deletions = map { $_ => 1 } (split(/\.\./,$deleted));
       }
       if ($contrib{'hidden'}) {
          my $hidden = $contrib{'hidden'};
          $hidden =~ s/^\.//;
          $hidden =~ s/\.$//;
          %hiddens = map { $_ => 1 } (split(/\.\./,$hidden));
       }
     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 921  sub build_posting_display { Line 989  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'})) {
                   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
           my $oneplus=$ave+$stddev;
           my $twoplus=$ave+2.*$stddev;
           my $oneminus=$ave-$stddev;
           my $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.':hidden'});
             my $posttime = $contrib{$idx.':timestamp'};              my $posttime = $contrib{$idx.':timestamp'};
             if ($prevread <= $posttime) {              if ($prevread <= $posttime) {
                 $$newpostsflag = 1;                  $$newpostsflag = 1;
             }              }
     my $hidden=($contrib{'hidden'}=~/\.$idx\./);  
             my $studenthidden=($contrib{'studenthidden'}=~/\.$idx\./);              my $studenthidden=($contrib{'studenthidden'}=~/\.$idx\./);
     my $deleted=($contrib{'deleted'}=~/\.$idx\./);  
     my $origindex='0.';      my $origindex='0.';
             my $numoldver=0;              my $numoldver=0;
     if ($contrib{$idx.':replyto'}) {      if ($contrib{$idx.':replyto'}) {
Line 954  sub build_posting_display { Line 1069  sub build_posting_display {
     } else {      } else {
  $$replies[$$depth[$idx]]=1;   $$replies[$$depth[$idx]]=1;
     }      }
     unless ((($hidden) && (!$seeid)) || ($deleted)) {              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 969  sub build_posting_display { Line 1084  sub build_posting_display {
                 my %subjects = ();                  my %subjects = ();
                 my %attachtxt = ();                  my %attachtxt = ();
                 my %allattachments = ();                  my %allattachments = ();
                 my ($screenname,$plainname);                  my ($screenname,$plainname,$showaboutme);
                 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 979  sub build_posting_display { Line 1094  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,$outputtarget,\%messages,\%subjects,\%allattachments,\%attachtxt,$imsfiles,\$screenname,\$plainname,$numoldver);                  &get_post_contents(\%contrib,$idx,$seeid,$outputtarget,\%messages,\%subjects,\%allattachments,\%attachtxt,$imsfiles,\$screenname,\$plainname,\$showaboutme,$numoldver);
   
   
 # Set up for sorting by subject  # Set up for sorting by subject
Line 988  sub build_posting_display { Line 1103  sub build_posting_display {
                     $message.=$attachtxt{$numoldver};                      $message.=$attachtxt{$numoldver};
                     $subject=$subjects{$numoldver};                      $subject=$subjects{$numoldver};
                     if ($message) {                      if ($message) {
           if ($hidden) {            if ($hiddens{$idx}) {
     $message='<font color="#888888">'.$message.'</font>';      $message='<font color="#888888">'.$message.'</font>';
                             if ($studenthidden) {                              if ($studenthidden) {
                                 $message .='<br /><br />Deleted by poster (student).';                                  $message .='<br /><br />Deleted by poster (student).';
Line 1009  sub build_posting_display { Line 1124  sub build_posting_display {
                             }                              }
                         }                          }
         if (!$contrib{$idx.':anonymous'} || $see_anonymous) {          if (!$contrib{$idx.':anonymous'} || $see_anonymous) {
     $sender=&Apache::loncommon::aboutmewrapper(                              if ($showaboutme) {
  $plainname,                                  $sender = &Apache::loncommon::aboutmewrapper(
  $contrib{$idx.':sendername'},                                                $plainname,
  $contrib{$idx.':senderdomain'}).' ('.                                                $contrib{$idx.':sendername'},
  $contrib{$idx.':sendername'}.':'.                                                $contrib{$idx.':senderdomain'});
  $contrib{$idx.':senderdomain'}.')';                              } else {
                                   $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 1052  sub build_posting_display { Line 1173  sub build_posting_display {
                             } else {                              } else {
                                 @{$$namesort{$lastname}{$firstname}} = ("$idx");                                  @{$$namesort{$lastname}{$firstname}} = ("$idx");
                             }                              }
                             if (&editing_allowed($escsymb.':::'.$idx,$group)) {                              if ($outputtarget ne 'tex') {
                                 if (($env{'user.domain'} eq $contrib{$idx.':senderdomain'}) && ($env{'user.name'} eq $contrib{$idx.':sendername'})) {                                  if (&editing_allowed($escsymb.':::'.$idx,$group)) {
                                     $sender.=' <a href="/adm/feedback?editdisc='.                                      if (($env{'user.domain'} eq $contrib{$idx.':senderdomain'}) && ($env{'user.name'} eq $contrib{$idx.':sendername'})) {
                                          $escsymb.':::'.$idx;                                          $sender.=' <a href="/adm/feedback?editdisc='.
                                     if ($$newpostsflag) {                                               $escsymb.':::'.$idx;
                                         $sender .= '&amp;previous='.$prevread;                                          if ($$newpostsflag) {
                                     }                                              $sender .= '&amp;previous='.$prevread;
     $sender .= &group_args($group);                                          }
                                     $sender .= '" '.$target.'>'.&mt('Edit').'</a>';          $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')";
                                         $sender .= '">'.&mt('Delete').'</a>';                                              $sender .= '">'.&mt('Delete').'</a>';
                                           }
                                     }                                      }
                                 }                                  }
                             }                                   if ($seeid) {
     if ($seeid) {              if ($hiddens{$idx}) {
         if ($hidden) {                                          unless ($studenthidden) {
                                     unless ($studenthidden) {                      $sender.=' <a href="/adm/feedback?unhide='.
                 $sender.=' <a href="/adm/feedback?unhide='.                      $escsymb.':::'.$idx;
                 $escsymb.':::'.$idx;                                              if ($$newpostsflag) {
                                                   $sender .= '&amp;previous='.$prevread;
                                               }
                                               $sender .= '">'.&mt('Make Visible').'</a>';
                                           }
               } else {
           $sender.=' <a href="/adm/feedback?hide='.
               $escsymb.':::'.$idx;
                                         if ($$newpostsflag) {                                          if ($$newpostsflag) {
                                             $sender .= '&amp;previous='.$prevread;                                              $sender .= '&amp;previous='.$prevread;
                                         }                                          }
                                         $sender .= '">'.&mt('Make Visible').'</a>';          $sender .= &group_args($group);
                                     }                                          $sender .= '">'.&mt('Hide').'</a>';
         } else {              }
     $sender.=' <a href="/adm/feedback?hide='.                                      my $grpargs = &group_args($group);
         $escsymb.':::'.$idx;              $sender.= 
                                     if ($$newpostsflag) {                                          " <a href=\"javascript:verifydelete('seeiddelete','$escsymb','$idx','$$newpostsflag','$prevread','$grpargs')\">";
                                         $sender .= '&amp;previous='.$prevread;                                      $sender .= &mt('Delete').'</a>';
                                     }                                  }
     $sender .= &group_args($group);  
                                     $sender .= '">'.&mt('Hide').'</a>';  
         }  
                                 my $grpargs = &group_args($group);  
         $sender.=   
                                     " <a href=\"javascript:verifydelete('seeiddelete','$escsymb','$idx','$$newpostsflag','$prevread','$grpargs')\">";  
                                 $sender .= &mt('Delete').'</a>';  
                             }                              }
         } else {          } else {
     if ($screenname) {      if ($screenname) {
Line 1119  sub build_posting_display { Line 1242  sub build_posting_display {
                                 @{$$namesort{'__anon'}{'__anon'}} = ("$idx");                                  @{$$namesort{'__anon'}{'__anon'}} = ("$idx");
                             }                              }
         }          }
         if (&discussion_open($status)) {                          if ($outputtarget ne 'tex') {
                             if (($group ne '') &&                               if (&discussion_open($status)) {
                                 (&check_group_priv($group,'pgd') eq 'ok')) {                                  if (($group ne '') && 
                                  $sender.=' <a href="/adm/feedback?replydisc='.                                      (&check_group_priv($group,'pgd') eq 'ok')) {
                                           $escsymb.':::'.$idx;                                       $sender.=' <a href="/adm/feedback?replydisc='.
                                 if ($$newpostsflag) {                                                $escsymb.':::'.$idx;
                                     $sender .= '&amp;previous='.$prevread;                                      if ($$newpostsflag) {
                                 }                                          $sender .= '&amp;previous='.$prevread;
                                 $sender .= &group_args($group);                                      }
                                 $sender .= '" '.$target.'>'.&mt('Reply').'</a>';                                      $sender .= &group_args($group);
                             } elsif (&Apache::lonnet::allowed('pch',                                       $sender .= '" '.$target.'>'.&mt('Reply').'</a>';
  $env{'request.course.id'}.                                  } elsif (&Apache::lonnet::allowed('pch', 
  ($env{'request.course.sec'}?'/'.       $env{'request.course.id'}.
                                   $env{'request.course.sec'}:''))) {       ($env{'request.course.sec'}?'/'.
          $sender.=' <a href="/adm/feedback?replydisc='.                                        $env{'request.course.sec'}:''))) {
                   $escsymb.':::'.$idx;               $sender.=' <a href="/adm/feedback?replydisc='.
                                 if ($$newpostsflag) {                        $escsymb.':::'.$idx;
                                     $sender .= '&amp;previous='.$prevread;                                      if ($$newpostsflag) {
                                           $sender .= '&amp;previous='.$prevread;
                                       }
                                       $sender .= '" '.$target.'>'.&mt('Reply').'</a>';
                                 }                                  }
                                 $sender .= '" '.$target.'>'.&mt('Reply').'</a>';  
                             }                              }
                         }                              if ($viewgrades) {
         if ($viewgrades) {          $vgrlink=&Apache::loncommon::submlink(&mt('Submissions'),
         $vgrlink=&Apache::loncommon::submlink('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>';                              }
                         }                          }
                     }                      }
 #figure out at what position this needs to print  #figure out at what position this needs to print
Line 1165  sub build_posting_display { Line 1290  sub build_posting_display {
                 if ($outputtarget eq 'export') {                  if ($outputtarget eq 'export') {
                     %{$$imsitems{$idx}} = ();                      %{$$imsitems{$idx}} = ();
                     $$imsitems{$idx}{'isvisible'}='true';                      $$imsitems{$idx}{'isvisible'}='true';
                     if ($hidden) {                      if ($hiddens{$idx}) {
                         $$imsitems{$idx}{'isvisible'}='false';                          $$imsitems{$idx}{'isvisible'}='false';
                     }                      }
                     $$imsitems{$idx}{'title'}=$subjects{$numoldver};                      $$imsitems{$idx}{'title'}=$subjects{$numoldver};
Line 1247  sub build_posting_display { Line 1372  sub build_posting_display {
                                 $$newitem{$idx} = 1;                                  $$newitem{$idx} = 1;
                                 $$discussionitems[$idx] .= '                                  $$discussionitems[$idx] .= '
                                   <table border="0" width="100%">                                    <table border="0" width="100%">
                                   <tr><td align="left"><font color="#FF0000"><b>'.&mt('NEW').'</b></font></td>';                                    <tr><td align="left"><font color="#FF0000"><b>'.&mt('NEW').'&nbsp;</b></font></td>';
                             } else {                              } else {
                                 $$newitem{$idx} = 0;                                  $$newitem{$idx} = 0;
                                 $$discussionitems[$idx] .= '                                  $$discussionitems[$idx] .= '
Line 1256  sub build_posting_display { Line 1381  sub build_posting_display {
                             }                              }
                             $$discussionitems[$idx] .= '<td align="left">&nbsp;&nbsp;'.                              $$discussionitems[$idx] .= '<td align="left">&nbsp;&nbsp;'.
                                 '<b>'.$subject.'</b>&nbsp;&nbsp;'.                                  '<b>'.$subject.'</b>&nbsp;&nbsp;'.
                                 $sender.$vgrlink.' ('.                                  $sender.' '.$vgrlink.' ('.
                                 &Apache::lonlocal::locallocaltime($posttime).')</td>';                                  &Apache::lonlocal::locallocaltime($posttime).')</td>';
                             if ($$dischash{$toggkey}) {                              if ($$dischash{$toggkey}) {
                                 $$discussionitems[$idx].='<td align="right">&nbsp;&nbsp;'.                                  $$discussionitems[$idx].='<td align="right">&nbsp;&nbsp;'.
                                   $ctlink.'</td>';                                    $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";
                               }
   # Actually glue in the message itself
                             $$discussionitems[$idx].= '</tr></table><blockquote>'.                              $$discussionitems[$idx].= '</tr></table><blockquote>'.
                                     $message.'</blockquote>';                                      "<div style='font-size:$likesize%'>".
                                       $message.
                                       '</div></blockquote>';
   # Put in the like and unlike buttons
                               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"));
                               }
                               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 ($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.');
Line 1347  sub filter_regexp { Line 1505  sub filter_regexp {
   
   
 sub get_post_contents {  sub get_post_contents {
     my ($contrib,$idx,$seeid,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$numver) = @_;      my ($contrib,$idx,$seeid,$type,$messages,$subjects,$allattachments,$attachtxt,$imsfiles,$screenname,$plainname,$showaboutme,$numver) = @_;
     my $discussion = '';      my $discussion = '';
     my $start=$numver;      my $start=$numver;
     my $end=$numver + 1;      my $end=$numver + 1;
Line 1365  sub get_post_contents { Line 1523  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'},
     my $sender=&Apache::loncommon::aboutmewrapper(                                                        $$contrib{$idx.':senderdomain'},
                                                         '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'}.':'.      }
                                  $$contrib{$idx.':senderdomain'}.')';      if ($seeid) {
           $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 1668  END Line 1833  END
 </script>  </script>
 END  END
   
     my ($textareaheader,$textareaclass);
     if (&Apache::lonhtmlcommon::htmlareabrowser()) {
         $textareaheader = &Apache::lonhtmlcommon::htmlareaselectactive();
         $textareaclass = 'class="LC_richDefaultOff"';
         if ($env{'request.course.id'}) {
             unless (($env{'course.'.$env{'request.course.id'}.'.allow_limited_html_in_feedback'} =~ /^\s*yes\s*$/i) || ($env{'form.sendmessageonly'})) {
                 undef($textareaclass);
             }
         }
     }
   
   # Breadcrumbs    # Breadcrumbs
   my $brcrum = [{'href' => '',    my $brcrum = [{'href' => '',
                  'text' => 'Resource Feedback and Discussion'}];                   'text' => 'Resource Feedback and Discussion'}];
Line 1707  END Line 1883  END
   $r->print(<<END);    $r->print(<<END);
 $options<hr />  $options<hr />
 $quote  $quote
 <p>$lt{'myqu'}</p>  <p>$lt{'myqu'}
   $textareaheader
   </p>
 <p>  <p>
 $latexHelp  $latexHelp
 </p>  </p>
 <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">$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 1792  END Line 1970  END
         }          }
     }      }
     $r->print(&generate_preview_button().      $r->print(&generate_preview_button().
               &Apache::lonhtmlcommon::htmlareaselectactive('comment').  
       &Apache::loncommon::end_page());        &Apache::loncommon::end_page());
   
 }  }
Line 2241  sub print_showposters { Line 2418  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 2402  sub fail_redirect { Line 2579  sub fail_redirect {
   my ($r,$feedurl) = @_;    my ($r,$feedurl) = @_;
   if ($feedurl=~/^\/adm\//) { $feedurl.='?register=1' };    if ($feedurl=~/^\/adm\//) { $feedurl.='?register=1' };
   my %lt = &Apache::lonlocal::texthash(    my %lt = &Apache::lonlocal::texthash(
                  'sorr' => 'Sorry, no recipients  ...',                   'sorr' => 'Sorry, no recipients ...',
   );    );
   my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');    my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
   $r->print(&Apache::loncommon::start_page('Feedback not sent',undef,    $r->print(&Apache::loncommon::start_page('Feedback not sent',undef,
Line 2549  ENDREDIR Line 2726  ENDREDIR
   
 sub no_redirect_back {  sub no_redirect_back {
   my ($r,$feedurl) = @_;    my ($r,$feedurl) = @_;
   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') {    if ($env{'environment.remote'} ne 'off') {
Line 2582  ENDNOREDIRTWO Line 2759  ENDNOREDIRTWO
 }  }
   
 sub screen_header {  sub screen_header {
     my ($feedurl,$symb) = @_;      my ($feedurl,$symb,$group) = @_;
     my $crscontent = &mt('Question/Comment/Feedback about course content');      my $crscontent = &mt('Question/Comment/Feedback about course content');
     my $crspolicy = &mt('Question/Comment/Feedback about course policy');      my $crspolicy = &mt('Question/Comment/Feedback about course policy');
     my $contribdisc = &mt('Contribution to course discussion of resource');      my $contribdisc = &mt('Contribution to course discussion of resource');
Line 2631  sub screen_header { Line 2808  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');
         if (!$blocked && &discussion_open(undef,$symb) &&           my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     &Apache::lonnet::allowed('pch',          my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           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) && 
       (&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')))) {
     $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 2648  sub screen_header { Line 2834  sub screen_header {
         }          }
     }      }
     if ($msgoptions) {      if ($msgoptions) {
         $msgoptions='<h2><img src="'.&Apache::loncommon::lonhttpdurl('/res/adm/pages/com.png').'" />'          $msgoptions='<h2><img src="'.&Apache::loncommon::lonhttpdurl('/res/adm/pages/feedback.png').'" />'
                    .' '.&mt('Send Feedback').'</h2><p>'.&Apache::lonhtmlcommon::coursepreflink(&mt('Feedback Settings'),'feedback').'</p>'                     .' '.&mt('Send Feedback').'</h2><p>'.&Apache::lonhtmlcommon::coursepreflink(&mt('Feedback Settings'),'feedback').'</p>'
                    .$msgoptions;                     .$msgoptions;
     }      }
Line 2674  sub resource_output { Line 2860  sub resource_output {
 }  }
   
 sub clear_out_html {  sub clear_out_html {
   my ($message,$override,$ignore_htmlarea)=@_;    my ($message,$override)=@_;
   if (!$ignore_htmlarea  
       && !&Apache::lonhtmlcommon::htmlareablocked()) { return $message; }  
 # Always allow the <m>-tag  # Always allow the <m>-tag
   my %html=(M=>1);    my %html=(M=>1);
 # Check if more is allowed  # Check if more is allowed
Line 2687  sub clear_out_html { Line 2871  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, DIV=>1, IMG=>1,               BR=>1, TT=>1, STRONG=>1, BLOCKQUOTE=>1, PRE=>1, DIV=>1, IMG=>1,
      M=>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 2774  sub send_msg { Line 2958  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)=@_;      my ($symb,$email,$anon,$attachmenturl,$subject,$group)=@_;
     my $status='';      my $status='';
     my $realsymb;      my $realsymb;
     if ($symb=~/^bulletin___/) {      if ($symb=~/^bulletin___/) {
Line 2783  sub adddiscuss { Line 2987  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') 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 2865  sub adddiscuss { Line 3076  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 2880  sub adddiscuss { Line 3091  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;
   }
   
   # 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'};
       my $totalvotes=$record{'totalvotes'};
       $totallikes+=$likes;
       $totalvotes++;
       my %newrecord=('likes_user'   => $env{'user.name'},
                      'likes_domain' => $env{'user.domain'},
                      'likes' => $likes,
                      'totallikes' => $totallikes,
                      'totalvotes' => $totalvotes);
       my $status=&Apache::lonnet::cstore(\%newrecord,'_discussion',$course,$udom,$uname);
       return $status;
   }
   
 sub get_discussion_info {  sub get_discussion_info {
     my ($idx,%contrib) = @_;      my ($idx,%contrib) = @_;
     my $changelast = 0;      my $changelast = 0;
Line 2936  sub show_preview { Line 3182  sub show_preview {
     &newline_to_br(\$message);      &newline_to_br(\$message);
     $message=&Apache::lonspeller::markeduptext($message);      $message=&Apache::lonspeller::markeduptext($message);
     $message=&Apache::lontexconvert::msgtexconverted($message);      $message=&Apache::lontexconvert::msgtexconverted($message);
     my $subject=&clear_out_html($env{'form.subject'},undef,1);      my $subject=&clear_out_html($env{'form.subject'});
     $subject=~s/\n/\<br \/\>/g;      $subject=~s/\n/\<br \/\>/g;
     $subject=&Apache::lontexconvert::msgtexconverted($subject);      $subject=&Apache::lontexconvert::msgtexconverted($subject);
   
Line 3048  END Line 3294  END
                                    {'bread_crumbs' => $brcrum,});                                     {'bread_crumbs' => $brcrum,});
   
     my $orig_subject = &unescape($env{'form.subject'});      my $orig_subject = &unescape($env{'form.subject'});
     my $subject=&clear_out_html($orig_subject,undef,1);      my $subject=&clear_out_html($orig_subject);
     $subject=~s/\n/\<br \/\>/g;      $subject=~s/\n/\<br \/\>/g;
     $subject=&Apache::lontexconvert::msgtexconverted($subject);      $subject=&Apache::lontexconvert::msgtexconverted($subject);
     my $timestamp=$env{'form.timestamp'};      my $timestamp=$env{'form.timestamp'};
Line 3406  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','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 %attachmax = (    my %attachmax = (
                     text => &mt('(128 KB max size)'),                      text => &mt('(128 KB max size)'),
Line 3487  sub handler { Line 3733  sub handler {
           my %attachmsgs = ();            my %attachmsgs = ();
           my %allattachments = ();            my %allattachments = ();
           my %imsfiles = ();            my %imsfiles = ();
           my ($screenname,$plainname);            my ($screenname,$plainname,$showaboutme);
           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'});
           $r->print(&get_post_contents(\%contrib,$idx,$seeid,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname));            $r->print(&get_post_contents(\%contrib,$idx,$seeid,'allversions',\%messages,\%subjects,\%allattachments,\%attachmsgs,\%imsfiles,\$screenname,\$plainname,\$showaboutme));
       }        }
       $r->print(&Apache::loncommon::end_page());        $r->print(&Apache::loncommon::end_page());
       return OK;        return OK;
Line 3684  ENDREDIR Line 3930  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 current like or unlike status for the $idx for this user.
         my $thisuser=$env{'user.name'}.':'.$env{'user.domain'};
         my ($userlikes,$userunlikes);
         if (ref($contrib{$prefix.'likers'}) eq 'HASH') {
             if (exists($contrib{$prefix.'likers'}{$thisuser})) {
                 $userlikes = 1;
             }
         }
         if (ref($contrib{$prefix.'unlikers'}) eq 'HASH') {
             if (exists($contrib{$prefix.'unlikers'}{$thisuser})) {
                 $userunlikes = 1;
             }
         }
   
   # 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 ($userlikes) {
                 $alreadyflag=1;
             } elsif ($userunlikes) {
                 delete($contrib{$prefix.'unlikers'}{$thisuser});
                 $likes++;
             } else {
                 if (ref($contrib{$prefix.'likers'}) eq 'HASH') {
                     $contrib{$prefix.'likers'}{$thisuser} = 1;
                 } else {
                     $contrib{$prefix.'likers'} = {$thisuser => 1};
                 }
                 $likes++;
             }
         } else {
             if ($userunlikes) {
                 $alreadyflag=1;
             } elsif ($userlikes) {
                 delete($contrib{$prefix.'likers'}{$thisuser});
                 $likes--;
             } else {
                 if (ref($contrib{$prefix.'unlikers'}) eq 'HASH') {
                     $contrib{$prefix.'unlikers'}{$thisuser} = 1;
                 } else {
                     $contrib{$prefix.'unlikers'} = {$thisuser => 1};
                 }
                 $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'   => $contrib{$prefix.'likers'},
                          $prefix.'unlikers' => $contrib{$prefix.'unlikers'});
   # 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 3834  ENDREDIR Line 4174  ENDREDIR
                   return OK;                    return OK;
               }                }
           }            }
   my $options=&screen_header($feedurl,$symb);    my $options=&screen_header($feedurl,$symb,$group);
   if ($options) {    if ($options) {
       &mail_screen($r,$feedurl,$options,$symb,$attachmax{'text'});        &mail_screen($r,$feedurl,$options,$symb,$attachmax{'text'});
   } else {    } else {
Line 3890  ENDREDIR Line 4230  ENDREDIR
           }            }
       }        }
 # Filter HTML out of message (could be nasty)  # Filter HTML out of message (could be nasty)
       my $message=&clear_out_html($env{'form.comment'});        my $override;
         if ($env{'form.discuss'} =~ /^(?:author|question|course|policy)$/) {
             $override = 1;
         }
         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 3900  ENDREDIR Line 4245  ENDREDIR
       my ($typestyle,%to) = &Apache::lonmsg::decide_receiver($feedurl);        my ($typestyle,%to) = &Apache::lonmsg::decide_receiver($feedurl);
   
 # Actually send mail  # Actually send mail
       my ($status,$numsent)=&send_msg(&clear_out_html($env{'form.subject'},        my ($status,$numsent)=&send_msg(&clear_out_html($env{'form.subject'}),
       undef,1),  
       $feedurl,$email,$citations,        $feedurl,$email,$citations,
       $attachmenturl,$usersymb,%to);        $attachmenturl,$usersymb,%to);
   
Line 3910  ENDREDIR Line 4254  ENDREDIR
       if (  ($env{'form.discuss'} ne ''        if (  ($env{'form.discuss'} ne ''
      && $env{'form.discuss'} !~ /^(?:author|question|course|policy)/)       && $env{'form.discuss'} !~ /^(?:author|question|course|policy)/)
    || $env{'form.anondiscuss'} ne '') {     || $env{'form.anondiscuss'} ne '') {
   my $subject = &clear_out_html($env{'form.subject'},undef,1);    my $subject = &clear_out_html($env{'form.subject'});
   my $anonmode=($env{'form.discuss'} eq 'anon' || $env{'form.anondiscuss'} );    my $anonmode=($env{'form.discuss'} eq 'anon' || $env{'form.anondiscuss'} );
   $typestyle.=&adddiscuss($symb,$message,$anonmode,$attachmenturl,    $typestyle.=&adddiscuss($symb,$message,$anonmode,$attachmenturl,
   $subject);    $subject,$group);
   $numpost++;    $numpost++;
       }        }
   
Line 3921  ENDREDIR Line 4265  ENDREDIR
   
       my $blog='';        my $blog='';
       if ($env{'form.blog'}) {        if ($env{'form.blog'}) {
   my $subject = &clear_out_html($env{'form.subject'},undef,1);    my $subject = &clear_out_html($env{'form.subject'});
   $status.=&Apache::lonrss::addentry($env{'user.name'},    $status.=&Apache::lonrss::addentry($env{'user.name'},
     $env{'user.domain'},      $env{'user.domain'},
     'CourseBlog_'.$env{'request.course.id'},      'CourseBlog_'.$env{'request.course.id'},

Removed from v.1.287  
changed lines
  Added in v.1.290.2.7.2.3


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