Diff for /loncom/interface/lonfeedback.pm between versions 1.273.4.7 and 1.296

version 1.273.4.7, 2010/01/25 04:34:37 version 1.296, 2010/06/08 16:56:57
Line 41  use Apache::lonnavmaps; Line 41  use Apache::lonnavmaps;
 use Apache::lonenc();  use Apache::lonenc();
 use Apache::lonrss();  use Apache::lonrss();
 use HTML::LCParser();  use HTML::LCParser();
   #use HTML::Tidy::libXML;
 use Apache::lonspeller();  use Apache::lonspeller();
 use Apache::longroup;  use Apache::longroup;
 use Cwd;  use Cwd;
Line 48  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;
     }      }
Line 91  sub list_discussion { Line 101  sub list_discussion {
     if (not &discussion_visible($status)) {      if (not &discussion_visible($status)) {
         if ($mode ne 'board') {          if ($mode ne 'board') {
             &Apache::lonenc::check_encrypt(\$ressymb);               &Apache::lonenc::check_encrypt(\$ressymb); 
             return '<br />'.&send_message_link($ressymb);              return '<br /><div class="LC_feedback_link">'.&send_message_link($ressymb)."</div>";
         }          }
     }      }
     if ($group ne '' && $mode eq 'board') {      if ($group ne '' && $mode eq 'board') {
Line 103  sub list_discussion { Line 113  sub list_discussion {
     my ($blocked,$blocktext) =       my ($blocked,$blocktext) = 
         &Apache::loncommon::blocking_status('boards');          &Apache::loncommon::blocking_status('boards');
     if ($blocked) {      if ($blocked) {
           $blocktext = '<br /><div class="LC_feedback_link"><span class="LC_feedback_link">'.$blocktext."</span>";
         &Apache::lonenc::check_encrypt(\$ressymb);          &Apache::lonenc::check_encrypt(\$ressymb);
         if ($mode ne 'board') {          if ($mode ne 'board') {
             $blocktext.='<br />'.&send_message_link($ressymb);              $blocktext.=&send_message_link($ressymb).'</div>';
           }else{
               $blocktext.="</div>";
         }          }
         return $blocktext;           return $blocktext; 
     }      }
Line 171  sub list_discussion { Line 184  sub list_discussion {
     my $cnum = $env{'course.'.$cid.'.num'};      my $cnum = $env{'course.'.$cid.'.num'};
     my $crstype = &Apache::loncommon::course_type();      my $crstype = &Apache::loncommon::course_type();
   
   
 # Get information about students and non-students in course for filtering display of posts  # Get information about students and non-students in course for filtering display of posts
     my %roleshash = ();      my %roleshash = ();
     my %roleinfo = ();      my %roleinfo = ();
Line 270  sub list_discussion { Line 282  sub list_discussion {
     my %anonhash=();      my %anonhash=();
     my $anoncnt=0;      my $anoncnt=0;
     my $target='';      my $target='';
     unless ($env{'browser.interface'} eq 'textual' ||  
     $env{'environment.remote'} eq 'off' ) {  
  $target='target="LONcom"';  
     }  
   
     my $now = time;      my $now = time;
     $discinfo{$visitkey} = $visit;      $discinfo{$visitkey} = $visit;
Line 314  sub list_discussion { Line 322  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 365  sub list_discussion { Line 374  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 401  sub list_discussion { Line 409  sub list_discussion {
             if ($manifestfile = Apache::File->new('>'.$manifestfilename)) {              if ($manifestfile = Apache::File->new('>'.$manifestfilename)) {
                 $manifestok=1;                  $manifestok=1;
                 print $manifestfile qq|<?xml version="1.0" encoding="UTF-8"?>                  print $manifestfile qq|<?xml version="1.0" encoding="UTF-8"?>
   
 <manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1" xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2  <manifest xmlns="http://www.imsglobal.org/xsd/imscp_v1p1" xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
 identifier="MANIFEST-$ressymb" xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1   identifier="MANIFEST-$ressymb" xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 
Line 414  imscp_v1p1.xsd http://www.imsglobal.org/ Line 421  imscp_v1p1.xsd http://www.imsglobal.org/
             }              }
  } else {   } else {
             my $colspan=$maxdepth+1;              my $colspan=$maxdepth+1;
             $discussion.= qq|              $discussion.= &Apache::lonhtmlcommon::scripttag(qq|
 <script>  
    function verifydelete (caller,symb,idx,newflag,previous,groupparm) {     function verifydelete (caller,symb,idx,newflag,previous,groupparm) {
        var symbparm = symb+':::'+idx         var symbparm = symb+':::'+idx
        var prevparm = ""         var prevparm = ""
Line 434  imscp_v1p1.xsd http://www.imsglobal.org/ Line 440  imscp_v1p1.xsd http://www.imsglobal.org/
            }             }
        }         }
    }     }
 </script>              |);
             |;  
     $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 class="LC_discussion">';
             $discussion .= &action_links_bar($colspan,$ressymb,$visible,              $discussion .= &action_links_bar($colspan,$ressymb,$visible,
Line 513  imscp_v1p1.xsd http://www.imsglobal.org/ Line 518  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 644  END Line 648  END
                 $discussion.='<td align="right">'.                  $discussion.='<td align="right">'.
               '<input type="hidden" name="discsymb" value="'.$ressymb.'" />'."\n".                '<input type="hidden" name="discsymb" value="'.$ressymb.'" />'."\n".
               '<input type="button" name="readoptions" value="'.$storebutton.'"'.                '<input type="button" name="readoptions" value="'.$storebutton.'"'.
               ' onClick="this.form.submit();" />'."\n".                ' onclick="this.form.submit();" />'."\n".
               '</td>';                '</td>';
             }              }
             $discussion .= (<<END);              $discussion .= (<<END);
Line 743  END Line 747  END
     if ($outputtarget ne 'tex') {      if ($outputtarget ne 'tex') {
  $discussion.= &send_feedback_link($ressymb,$target);   $discussion.= &send_feedback_link($ressymb,$target);
             }              }
  }   } else {
               if ($outputtarget ne 'tex') {
                   $discussion.= &mt('This discussion is closed.');
               }
           }
         if ($outputtarget ne 'tex') {          if ($outputtarget ne 'tex') {
     $discussion.= &send_message_link($ressymb);      $discussion.= &send_message_link($ressymb);
         }          }
Line 757  sub send_feedback_link { Line 765  sub send_feedback_link {
     my $output = '<span class="LC_feedback_link">'.      my $output = '<span class="LC_feedback_link">'.
                  ' <a href="/adm/feedback?replydisc='.                   ' <a href="/adm/feedback?replydisc='.
                  &escape($ressymb).':::" '.$target.'>'.                   &escape($ressymb).':::" '.$target.'>'.
                  '<img alt="" src="'.                   '<img alt="" class="LC_noBorder" src="'.
                  &Apache::loncommon::lonhttpdurl('/adm/lonMisc/chat.gif').                   &Apache::loncommon::lonhttpdurl('/adm/lonMisc/chat.gif').
                  '" border="0" />'.&mt('Post Discussion').'</a></span>';                   '" border="0" /><span class="LC_menubuttons_inline_text">'.&mt('Post Discussion').'</span></a></span>';
     return $output;      return $output;
 }  }
   
Line 767  sub send_message_link { Line 775  sub send_message_link {
     my ($ressymb) = @_;      my ($ressymb) = @_;
     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="" 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" />'.&mt('Send Feedback').'</a></span>';                   '" border="0" /><span class="LC_menubuttons_inline_text">'.&mt('Send Feedback').'</span></a></span>';
     return $output;      return $output;
 }  }
   
Line 788  sub action_links_bar { Line 796  sub action_links_bar {
         $discussion .='">'.&mt('Threaded View').'</a>&nbsp;&nbsp;'.          $discussion .='">'.&mt('Threaded View').'</a>&nbsp;&nbsp;'.
                       '<a href="/adm/feedback?cmd=threadedoff&amp;symb='.$escsymb;                        '<a href="/adm/feedback?cmd=threadedoff&amp;symb='.$escsymb;
         if ($newpostsflag) {          if ($newpostsflag) {
             $discussion .= '&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;                         <a href="/adm/feedback?cmd=sortfilter&amp;symb='.$escsymb;
         if ($newpostsflag) {          if ($newpostsflag) {
             $discussion .= '&previous='.$prevread;              $discussion .= '&amp;previous='.$prevread;
         }          }
         $discussion .= &group_args($group);          $discussion .= &group_args($group);
         $discussion .='">'.&mt('Sorting/Filtering options').'</a>'.('&nbsp;' x2);          $discussion .='">'.&mt('Sorting/Filtering options').'</a>'.('&nbsp;' x2);
     }      }
     $discussion .='<a href="/adm/feedback?export='.$escsymb;      $discussion .='<a href="/adm/feedback?export='.$escsymb;
     if ($newpostsflag) {      if ($newpostsflag) {
         $discussion .= '&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>&nbsp;&nbsp;</td>';
Line 827  sub action_links_bar { Line 835  sub action_links_bar {
 sub postingform_display {  sub postingform_display {
     my ($mode,$ressymb,$now,$subject,$comment,$outputtarget,$attachnum,      my ($mode,$ressymb,$now,$subject,$comment,$outputtarget,$attachnum,
         $currnewattach,$currdelold,$group,$crstype) = @_;          $currnewattach,$currdelold,$group,$crstype) = @_;
       if ($outputtarget eq 'tex') { return ''; }
     my $newattachmsg;      my $newattachmsg;
     my %lt = &Apache::lonlocal::texthash(      my %lt = &Apache::lonlocal::texthash(
               'note' => 'Note: in anonymous discussion, your name is visible only to course faculty',                'note' => 'Note: in anonymous discussion, your name is visible only to course faculty',
Line 846  sub postingform_display { Line 855  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" >$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 868  ENDDISCUSS Line 877  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";               $newattachmsg .= '</ol>'."\n";
             } else {           } else {
                 $$currnewattach[0] =~ m#.*/([^/]+)$#;               $$currnewattach[0] =~ m#.*/([^/]+)$#;
                 $newattachmsg .= '<a href="'.$$currnewattach[0].'">'.$1.'</a><br />'."\n";               $newattachmsg .= '<a href="'.$$currnewattach[0].'">'.$1.'</a><br />'."\n";
             }           }
         }  
         $postingform .= $newattachmsg;  
         $postingform .= &generate_preview_button();  
     }      }
       $postingform .= $newattachmsg;
       $postingform .= &generate_preview_button();
     return $postingform;      return $postingform;
 }  }
   
Line 1022  sub build_posting_display { Line 1029  sub build_posting_display {
     if ($see_anonymous) {      if ($see_anonymous) {
  $sender.=&Apache::loncommon::student_image_tag($contrib{$idx.':senderdomain'},$contrib{$idx.':sendername'});   $sender.=&Apache::loncommon::student_image_tag($contrib{$idx.':senderdomain'},$contrib{$idx.':sendername'});
     }      }
                             $sender = '<b>'.$sender.'</b>';  
 # Set up for sorting by domain, then username  # Set up for sorting by domain, then username
                             unless (defined($$usernamesort{$contrib{$idx.':senderdomain'}})) {                              unless (defined($$usernamesort{$contrib{$idx.':senderdomain'}})) {
                                 %{$$usernamesort{$contrib{$idx.':senderdomain'}}} = ();                                  %{$$usernamesort{$contrib{$idx.':senderdomain'}}} = ();
Line 1052  sub build_posting_display { Line 1058  sub build_posting_display {
                             } else {                              } else {
                                 @{$$namesort{$lastname}{$firstname}} = ("$idx");                                  @{$$namesort{$lastname}{$firstname}} = ("$idx");
                             }                              }
                             if (&editing_allowed($escsymb.':::'.$idx,$group)) {                              if ((&editing_allowed($escsymb.':::'.$idx,$group)) && ($outputtarget ne 'tex')) {
                                 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.=' <a href="/adm/feedback?editdisc='.
                                          $escsymb.':::'.$idx;                                           $escsymb.':::'.$idx;
Line 1069  sub build_posting_display { Line 1075  sub build_posting_display {
                                     }                                      }
                                 }                                  }
                             }                               } 
     if ($seeid) {      if (($seeid) && ($outputtarget ne 'tex')) {
         if ($hidden) {          if ($hidden) {
                                     unless ($studenthidden) {                                      unless ($studenthidden) {
                 $sender.=' <a href="/adm/feedback?unhide='.                  $sender.=' <a href="/adm/feedback?unhide='.
                 $escsymb.':::'.$idx;                  $escsymb.':::'.$idx;
                                         if ($$newpostsflag) {                                          if ($$newpostsflag) {
                                             $sender .= '&previous='.$prevread;                                              $sender .= '&amp;previous='.$prevread;
                                         }                                          }
                                         $sender .= '">'.&mt('Make Visible').'</a>';                                          $sender .= '">'.&mt('Make Visible').'</a>';
                                     }                                      }
Line 1099  sub build_posting_display { Line 1105  sub build_posting_display {
     } else {      } else {
  $sender='<i>'.$$anonhash{$key}.'</i>';   $sender='<i>'.$$anonhash{$key}.'</i>';
     }      }
                               $sender = '<b>'.$sender.'</b>';
 # Set up for sorting by domain, then username for anonymous  # Set up for sorting by domain, then username for anonymous
                             unless (defined($$usernamesort{'__anon'})) {                              unless (defined($$usernamesort{'__anon'})) {
                                 %{$$usernamesort{'__anon'}} = ();                                  %{$$usernamesort{'__anon'}} = ();
Line 1118  sub build_posting_display { Line 1125  sub build_posting_display {
                                 @{$$namesort{'__anon'}{'__anon'}} = ("$idx");                                  @{$$namesort{'__anon'}{'__anon'}} = ("$idx");
                             }                              }
         }          }
         if (&discussion_open($status)) {          if ((&discussion_open($status)) && ($outputtarget ne 'tex')) {
                             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.=' <a href="/adm/feedback?replydisc='.
Line 1135  sub build_posting_display { Line 1142  sub build_posting_display {
          $sender.=' <a href="/adm/feedback?replydisc='.           $sender.=' <a href="/adm/feedback?replydisc='.
                   $escsymb.':::'.$idx;                    $escsymb.':::'.$idx;
                                 if ($$newpostsflag) {                                  if ($$newpostsflag) {
                                     $sender .= '&previous='.$prevread;                                      $sender .= '&amp;previous='.$prevread;
                                 }                                  }
                                 $sender .= '" '.$target.'>'.&mt('Reply').'</a>';                                  $sender .= '" '.$target.'>'.&mt('Reply').'</a>';
                             }                              }
                         }                          }
         if ($viewgrades) {          if (($viewgrades) && ($outputtarget ne 'tex')) {
         $vgrlink=&Apache::loncommon::submlink('Submissions',          $vgrlink=&Apache::loncommon::submlink(&mt('Submissions'),
                             $contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'},$ressymb);                              $contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'},$ressymb);
         }          }
                         if ($$dischash{$readkey}=~/\.$idx\./) {                           if (($$dischash{$readkey}=~/\.$idx\./) && ($outputtarget ne 'tex')) { 
                             $ctlink = '<label><b>'.&mt('Mark unread').'?</b>&nbsp;<input type="checkbox" name="postunread_'.$idx.'" /></label>';                              $ctlink = '<label><b>'.&mt('Mark unread').'?</b>&nbsp;<input type="checkbox" name="postunread_'.$idx.'" /></label>';
                         } else {                          } else {
                             $ctlink = '<label><b>'.&mt('Mark read').'?</b>&nbsp;<input type="checkbox" name="postread_'.$idx.'" /></label>';                              $ctlink = '<label><b>'.&mt('Mark read').'?</b>&nbsp;<input type="checkbox" name="postread_'.$idx.'" /></label>';
Line 1172  sub build_posting_display { Line 1179  sub build_posting_display {
                     $$imsitems{$idx}{'attach'}=$attachtxt{$numoldver};                      $$imsitems{$idx}{'attach'}=$attachtxt{$numoldver};
                     $$imsitems{$idx}{'timestamp'}=$contrib{$idx.':timestamp'};                      $$imsitems{$idx}{'timestamp'}=$contrib{$idx.':timestamp'};
                     $$imsitems{$idx}{'sender'}=$plainname.' ('.                      $$imsitems{$idx}{'sender'}=$plainname.' ('.
                                          $contrib{$idx.':sendername'}.' at '.                                           $contrib{$idx.':sendername'}.':'.
                                          $contrib{$idx.':senderdomain'}.')';                                           $contrib{$idx.':senderdomain'}.')';
                     $$imsitems{$idx}{'isanonymous'}='false';                      $$imsitems{$idx}{'isanonymous'}='false';
                     if ($contrib{$idx.':anonymous'}) {                      if ($contrib{$idx.':anonymous'}) {
Line 1245  sub build_posting_display { Line 1252  sub build_posting_display {
                             if ($prevread > 0 && $prevread <= $posttime) {                              if ($prevread > 0 && $prevread <= $posttime) {
                                 $$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] .= '
                                  <table border="0" width="100%">                                    <table border="0" width="100%">
                                   <tr><td align="left">&nbsp;</td>';                                    <tr><td align="left">&nbsp;</td>';
                             }                              }
                             $$discussionitems[$idx] .= '<td align="left">&nbsp;&nbsp;'.                              $$discussionitems[$idx] .= '<td align="left">&nbsp;&nbsp;'.
Line 1369  sub get_post_contents { Line 1376  sub get_post_contents {
                                  $$plainname,                                   $$plainname,
                                  $$contrib{$idx.':sendername'},                                   $$contrib{$idx.':sendername'},
                                  $$contrib{$idx.':senderdomain'}).' ('.                                   $$contrib{$idx.':senderdomain'}).' ('.
                                  $$contrib{$idx.':sendername'}.' at '.                                   $$contrib{$idx.':sendername'}.':'.
                                  $$contrib{$idx.':senderdomain'}.')';                                   $$contrib{$idx.':senderdomain'}.')';
     my $attachmenturls = $$contrib{$idx.':attachmenturl'};      my $attachmenturls = $$contrib{$idx.':attachmenturl'};
     my @postversions = ();      my @postversions = ();
Line 1667  END Line 1674  END
 </script>  </script>
 END  END
   
     # Breadcrumbs
     my $brcrum = [{'href' => '',
                    'text' => 'Resource Feedback and Discussion'}];
   
   my %onload = ('onload' => 'window.focus();setposttype();');    my %onload = ('onload' => 'window.focus();setposttype();');
   my $start_page=    my $start_page=
       &Apache::loncommon::start_page('Resource Feedback and Discussion',$js,        &Apache::loncommon::start_page('Resource Feedback and Discussion',$js,
      {'add_entries' => \%onload});                                       {'add_entries' => \%onload,
                                         'bread_crumbs' => $brcrum,});
   
   if ($quote ne '') {    if ($quote ne '') {
       $quote = &HTML::Entities::decode($quote);        $quote = &HTML::Entities::decode($quote);
Line 2021  sub print_sortfilter_options { Line 2033  sub print_sortfilter_options {
         $ccrole = 'co';          $ccrole = 'co';
     }      }
     push(@courseroles,$ccrole);      push(@courseroles,$ccrole);
       
     if ($env{'request.course.sec'} !~ /^\s*$/) {  #Restrict section choice to current section       if ($env{'request.course.sec'} !~ /^\s*$/) {  #Restrict section choice to current section 
         @sections = ('all',$env{'request.course.sec'});          @sections = ('all',$env{'request.course.sec'});
         $numvisible = 2;          $numvisible = 2;
Line 2396  sub fail_redirect { Line 2408  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 2447  sub redirect_back { Line 2459  sub redirect_back {
           $userpicktag = '<input type="hidden" name="totposters" value="'.$numpicks.'" />';            $userpicktag = '<input type="hidden" name="totposters" value="'.$numpicks.'" />';
       } else {        } else {
           if (ref($sectionpick) eq 'ARRAY') {            if (ref($sectionpick) eq 'ARRAY') {
               $feedurl .= '&sectionpick=';                $feedurl .= '&amp;sectionpick=';
               $sectag .=  '<input type="hidden" name="sectionpick" value="';                $sectag .=  '<input type="hidden" name="sectionpick" value="';
               foreach my $sec (@{$sectionpick}) {                foreach my $sec (@{$sectionpick}) {
                   $feedurl .= $sec.',';                    $feedurl .= $sec.',';
Line 2461  sub redirect_back { Line 2473  sub redirect_back {
               $sectag = '<input type="hidden" name="sectionpick" value="'.$sectionpick.'" />';                $sectag = '<input type="hidden" name="sectionpick" value="'.$sectionpick.'" />';
           }            }
           if (ref($grouppick) eq 'ARRAY') {            if (ref($grouppick) eq 'ARRAY') {
               $feedurl .= '&grouppick=';                $feedurl .= '&amp;grouppick=';
               $sectag .=  '<input type="hidden" name="grouppick" value="';                $sectag .=  '<input type="hidden" name="grouppick" value="';
               foreach my $grp (@{$grouppick}) {                foreach my $grp (@{$grouppick}) {
                   $feedurl .= $grp.',';                    $feedurl .= $grp.',';
Line 2475  sub redirect_back { Line 2487  sub redirect_back {
               $grptag = '<input type="hidden" name="grouppick" value="'.$grouppick.'" />';                $grptag = '<input type="hidden" name="grouppick" value="'.$grouppick.'" />';
           }            }
           if (ref($rolefilter) eq 'ARRAY') {            if (ref($rolefilter) eq 'ARRAY') {
               $feedurl .= '&rolefilter=';                $feedurl .= '&amp;rolefilter=';
               $roletag .=  '<input type="hidden" name="rolefilter" value="';                $roletag .=  '<input type="hidden" name="rolefilter" value="';
               foreach my $role (@{$rolefilter}) {                foreach my $role (@{$rolefilter}) {
                   $feedurl .= $role.',';                    $feedurl .= $role.',';
Line 2485  sub redirect_back { Line 2497  sub redirect_back {
               $roletag =~ s/,$//;                $roletag =~ s/,$//;
               $roletag .= '" />';                $roletag .= '" />';
           } else {            } else {
               $feedurl .= '&rolefilter='.$rolefilter;                $feedurl .= '&amp;rolefilter='.$rolefilter;
               $roletag = '<input type="hidden" name="rolefilter" value="'.$rolefilter.'" />';                $roletag = '<input type="hidden" name="rolefilter" value="'.$rolefilter.'" />';
           }            }
           $feedurl .= '&amp;statusfilter='.$statusfilter;            $feedurl .= '&amp;statusfilter='.$statusfilter;
Line 2509  sub redirect_back { Line 2521  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 %onload;
   if ($env{'environment.remote'} ne 'off') {  
       $onload{'onload'} =  
   "if (window.name!='loncapaclient') { this.document.reldt.submit(); self.window.close(); }";  
   }  
   my $start_page=    my $start_page=
       &Apache::loncommon::start_page('Feedback sent',undef,        &Apache::loncommon::start_page('Feedback sent',undef,
      {'redirect'    => [0,$feedurl],       {'redirect'    => [0,$feedurl],
Line 2543  ENDREDIR Line 2551  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') {  
       $onload{'onload'} =   
   "if (window.name!='loncapaclient') { self.window.close(); }";  
   }  
   
   my %body_options = ('only_body'   => 1,    my %body_options = ('only_body'   => 1,
       'bgcolor'     => '#FFFFFF',        'bgcolor'     => '#FFFFFF',
Line 2630  sub screen_header { Line 2634  sub screen_header {
      $env{'request.course.id'}.       $env{'request.course.id'}.
      ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {       ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
     $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" /> '.
                 $anoncontrib.   $anoncontrib.
                 ' <i>('.$namevis.')</i></label> '.   ' <i>('.$namevis.')</i></label> '.
   
  '<a href="/adm/preferences?action=changescreenname">'.&mt('Change Screenname').'</a>';   '<a href="/adm/preferences?action=changescreenname">'.&mt('Change Screenname').'</a>';
             my $blockblog = &Apache::loncommon::blocking_status('blogs');              my $blockblog = &Apache::loncommon::blocking_status('blogs');
             if (!$blockblog) {              if (!$blockblog) {
Line 2643  sub screen_header { Line 2646  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 2686  sub clear_out_html { Line 2689  sub clear_out_html {
      M=>1, ALGEBRA=>1, SUB=>1, SUP=>1, SPAN=>1,        M=>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);
   
   }    }
 # Do the substitution of everything that is not explicitly allowed  # Do the substitution of everything that is not explicitly allowed
   $message =~ s/\<(\/?\s*(\w+)[^\>\<]*)/    $message =~ s/\<(\/?\s*(\w+)[^\>\<]*)/
Line 2703  sub assemble_email { Line 2705  sub assemble_email {
              'orig' => 'Original screen output (if applicable)',               'orig' => 'Original screen output (if applicable)',
              'corr' => 'Correct Answer(s) (if applicable)',               'corr' => 'Correct Answer(s) (if applicable)',
   );    );
     if (&Apache::loncommon::course_type() eq 'Community') {
         $lt{'prev'} = &mt('Previous attempts of member (if applicable)');
     }
   my $email=<<"ENDEMAIL";    my $email=<<"ENDEMAIL";
 $message  $message
 ENDEMAIL  ENDEMAIL
Line 2952  sub show_preview { Line 2957  sub show_preview {
 sub contains_block_html {  sub contains_block_html {
     my ($message)=@_;      my ($message)=@_;
     return ($message =~ m{      return ($message =~ m{
         <(br|h1|h2|h3|h4|h5|h6|p|ol|ul|table|pre|address|blockquote|center|div)          <(br|h1|h2|h3|h4|h5|h6|p|ol|ul|table|pre|address|blockquote|center|div) 
           \s*    \s*
          (\w+\=['"]\w+['"])*   (\w+\=['"]\w+['"])*
           \s*    \s*
         (   (
           \s*/>|    \s*/>|
           >.*</\1\s*>    >.*</\1\s*>
         )}xs   )}xs 
     );      );
 }  }
   
   sub tidy_html {
    my ($message)=@_;
   # my $tidy = HTML::Tidy::libXML->new();
   # my $xhtml = $tidy->clean($message, 'utf-8', 1);
   # $xhtml =~ m/<body>(.*)<\/body>/is;
   # my $clean = $1;
   # # remove any empty block-level tags
   # $clean =~ s/<(table|p|div|tbody|blockquote|m|pre|algebra|center|ol|ul|span|h1|h2|h3|h4|h5|h6)\s*\/>//i;
   # $message=$clean;
    return $message;
   }
   
 sub newline_to_br {  sub newline_to_br {
     my ($message)=@_;      my ($message)=@_;
     my $newmessage;      my $newmessage;
Line 3021  sub modify_attachments { Line 3038  sub modify_attachments {
 </script>   </script> 
 END  END
   
       # Breadcrumbs
       my $brcrum = [{'href' => '',
                      'text' => 'Discussion Post Attachments'}];
     my $start_page =       my $start_page = 
  &Apache::loncommon::start_page('Discussion Post Attachments',$js);   &Apache::loncommon::start_page('Discussion Post Attachments',$js,
                                      {'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,undef,1);
Line 3148  sub generate_attachments_button { Line 3169  sub generate_attachments_button {
 <br />  <br />
 <form name="attachment" action="/adm/feedback?attach=$ressymb" method="post">  <form name="attachment" action="/adm/feedback?attach=$ressymb" method="post">
 $lt{'clic'}:&nbsp;<input type="button" value="$att"  $lt{'clic'}:&nbsp;<input type="button" value="$att"
 onClick="if (typeof(document.mailform.onsubmit)=='function') {document.mailform.onsubmit();};this.form.comment.value=escape(document.mailform.comment.value);this.form.subject.value=escape(document.mailform.subject.value);  onclick="if (typeof(document.mailform.onsubmit)=='function') {document.mailform.onsubmit();};this.form.comment.value=escape(document.mailform.comment.value);this.form.subject.value=escape(document.mailform.subject.value);
 END  END
     if (!$blockblog) {      if (!$blockblog) {
         $response .= 'setblogvalue();';          $response .= 'setblogvalue();';
Line 3364  sub sort_filter_names { Line 3385  sub sort_filter_names {
     }      }
     if (ref($status_types) eq 'HASH') {      if (ref($status_types) eq 'HASH') {
         %{$status_types} = (          %{$status_types} = (
                       all     => 'Roles of any status',                       all     => 'Roles of any status',
                       Active  => 'Only active roles',                       Active  => 'Only active roles',
                       Expired => 'Only past roles',                       Expired => 'Only past roles',
                       Future  => 'Only future roles',                       Future  => 'Only future roles',
                     );                     );
     }      }
 }  }
     
 sub handler {  sub handler {
   my $r = shift;    my $r = shift;
   if ($r->header_only) {    if ($r->header_only) {
Line 3431  sub handler { Line 3452  sub handler {
       &Apache::loncommon::no_cache($r);        &Apache::loncommon::no_cache($r);
       $r->send_http_header;        $r->send_http_header;
   
       $r->print(&Apache::loncommon::start_page('Discussion Post Versions'));        # Breadcrumbs
         my $brcrum = [{'href' => '',
                        'text' => 'Discussion Post Versions'}];
   
         $r->print(&Apache::loncommon::start_page('Discussion Post Versions',undef,
                                                  {'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 3535  sub handler { Line 3562  sub handler {
       $r->send_http_header;        $r->send_http_header;
       my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');        my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
       my %onload;        my %onload;
       if ($env{'environment.remote'} ne 'off') {  
   $onload{'onload'} =  
       "if (window.name!='loncapaclient') { this.document.reldt.submit(); self.window.close(); }";  
       }  
   
       my $start_page=        my $start_page=
   &Apache::loncommon::start_page('New posts marked as read',undef,    &Apache::loncommon::start_page('New posts marked as read',undef,
Line 4137  None Line 4160  None
   
 =item newline_to_br()  =item newline_to_br()
   
   =item tidy_html()
   
 =item generate_preview_button()  =item generate_preview_button()
   
 =item modify_attachments()  =item modify_attachments()

Removed from v.1.273.4.7  
changed lines
  Added in v.1.296


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