Diff for /loncom/interface/lonfeedback.pm between versions 1.357 and 1.389

version 1.357, 2012/06/17 15:30:37 version 1.389, 2022/01/18 17:33:13
Line 44  use HTML::LCParser(); Line 44  use HTML::LCParser();
 #use HTML::Tidy::libXML;  #use HTML::Tidy::libXML;
 use Apache::lonspeller();  use Apache::lonspeller();
 use Apache::longroup;  use Apache::longroup;
 use Cwd;  use Archive::Zip qw( :ERROR_CODES );
 use LONCAPA;  use LONCAPA qw(:DEFAULT :match);
   
 sub discussion_open {  sub discussion_open {
     my ($status,$symb)=@_;      my ($status,$symb)=@_;
Line 118  sub list_discussion { Line 118  sub list_discussion {
             $outputtarget = 'export';              $outputtarget = 'export';
         }          }
     }      }
       my ($nofooter,$nodisclink,$nofdbklink);
     if (not &discussion_visible($status)) {      if (not &discussion_visible($status)) {
         if ($mode ne 'board') {          if ($mode ne 'board') {
             &Apache::lonenc::check_encrypt(\$ressymb);               ($nofooter,$nodisclink,$nofdbklink) = &check_menucoll();
             return '<br /><div class="LC_feedback_link">'.&send_message_link($ressymb)."</div>";              if ($nofooter || $nofdbklink) {
                   return '<br />';
               } else {
                   &Apache::lonenc::check_encrypt(\$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 130  sub list_discussion { Line 136  sub list_discussion {
         }          }
     }      }
   
     my ($blocked,$blocktext) =       unless ($outputtarget eq 'export') {
         &Apache::loncommon::blocking_status('boards');          ($nofooter,$nodisclink,$nofdbklink) = &check_menucoll();
     if ($blocked) {      }
         $blocktext = '<br /><div class="LC_feedback_link"><span class="LC_feedback_link">'.$blocktext."</span>";  
         &Apache::lonenc::check_encrypt(\$ressymb);      unless ($nofooter) {
         if ($mode ne 'board') {          my ($blocked,$blocktext) = 
             $blocktext.=&send_message_link($ressymb).'</div>';              &Apache::loncommon::blocking_status('boards');
         }else{          if ($blocked) {
             $blocktext.="</div>";              my $footer = '<br /><div class="LC_feedback_link">';
               unless ($nodisclink) {
                   $footer .= '<span class="LC_feedback_link">'.$blocktext.'</span>';
               }
               &Apache::lonenc::check_encrypt(\$ressymb);
               if ($mode ne 'board') {
                   unless ($nofdbklink) {
                       $footer.=&send_message_link($ressymb);
                   }
               }
               $footer.='</div>';
               return $footer;
         }          }
         return $blocktext;   
     }      }
   
     my @bgcols = ("LC_disc_old_item","LC_disc_new_item");      my @bgcols = ("LC_disc_old_item","LC_disc_new_item");
Line 336  sub list_discussion { Line 352  sub list_discussion {
         'aner' => 'An error occurred opening the manifest file.',          'aner' => 'An error occurred opening the manifest file.',
         'difo' => 'Discussion for',          'difo' => 'Discussion for',
         'aerr' => 'An error occurred opening the export file for posting',          'aerr' => 'An error occurred opening the export file for posting',
           'discussions' => 'DISCUSSIONS'
       );
       my %js_lt = &Apache::lonlocal::texthash(
         'aysu' => 'Are you sure you want to delete this post?',          'aysu' => 'Are you sure you want to delete this post?',
         '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'  
     );      );
       &js_escape(\%js_lt);
   
     my $currdisp = $lt{'allposts'};      my $currdisp = $lt{'allposts'};
     my $currmark = $lt{'onmark'};      my $currmark = $lt{'onmark'};
Line 447  imscp_v1p1.xsd http://www.imsglobal.org/ Line 466  imscp_v1p1.xsd http://www.imsglobal.org/
            prevparm = "&amp;previous="+previous             prevparm = "&amp;previous="+previous
        }         }
        if (caller == 'studentdelete') {         if (caller == 'studentdelete') {
            if (confirm("$lt{'aysu'}\\n$lt{'dpwn'},\\n$lt{'bwco'}")) {             if (confirm("$js_lt{'aysu'}\\n$js_lt{'dpwn'},\\n$js_lt{'bwco'}")) {
                document.location.href = "/adm/feedback?hide="+symbparm+prevparm+groupparm                 document.location.href = "/adm/feedback?hide="+symbparm+prevparm+groupparm
            }             }
        } else {         } else {
            if (caller == 'seeiddelete') {             if (caller == 'seeiddelete') {
                if (confirm("$lt{'aysu'}\\n$lt{'depo'}")) {                 if (confirm("$js_lt{'aysu'}\\n$js_lt{'depo'}")) {
                    document.location.href = "/adm/feedback?deldisc="+symbparm+prevparm+groupparm                     document.location.href = "/adm/feedback?deldisc="+symbparm+prevparm+groupparm
                }                 }
            }             }
Line 468  imscp_v1p1.xsd http://www.imsglobal.org/ Line 487  imscp_v1p1.xsd http://www.imsglobal.org/
             my $numhidden = keys(%notshown);              my $numhidden = keys(%notshown);
             if ($numhidden > 0) {              if ($numhidden > 0) {
                 my $colspan = $maxdepth+1;                  my $colspan = $maxdepth+1;
                 $discussion.="\n".'<tr><td bgcolor="#CCCCCC" colspan="'.$colspan.'">'.                  $discussion.="\n".'<tr><td bgcolor="#CCCCCC" colspan="'.$colspan.'">';
                          '<a href="/adm/feedback?allposts=1&amp;symb='.$escsymb;                  my $href = '/adm/feedback?allposts=1&amp;symb='.$escsymb;
                 if ($newpostsflag) {                  if ($newpostsflag) {
                     $discussion .= '&amp;previous='.$prevread;                      $href .= '&amp;previous='.$prevread;
                 }                  }
  $discussion .= &group_args($group);   $href .= &group_args($group);
                 $discussion .= '">'.&mt('Show all posts').'</a> '.&mt('to display').' '.  
                          $numhidden.' ';  
                 if ($showunmark) {                  if ($showunmark) {
                     $discussion .= &mt('posts previously marked read');                      $discussion .= &mt('[_1]Show all posts[_2] to display [quant,_3,post] previously marked read',
                                          '<a href="'.$href.'">','</a>',$numhidden);
                 } else {                  } else {
                     $discussion .= &mt('previously viewed posts');                      $discussion .= &mt('[_1]Show all posts[_2] to display [quant,_3,post] previously viewed',
                                          '<a href="'.$href.'">','</a>',$numhidden);
                 }                  }
                 $discussion .= '<br/></td></tr>';                  $discussion .= '<br/></td></tr>';
             }              }
Line 562  imscp_v1p1.xsd http://www.imsglobal.org/ Line 581  imscp_v1p1.xsd http://www.imsglobal.org/
                     my $postingfile;                      my $postingfile;
                     my $postingfilename = $tempexport.'/'.$postfilename;                      my $postingfilename = $tempexport.'/'.$postfilename;
                     if ($postingfile = Apache::File->new('>'.$postingfilename)) {                      if ($postingfile = Apache::File->new('>'.$postingfilename)) {
                         print $postingfile '<html><head><title>Discussion Post</title></head><body>'.                          print $postingfile '<html><head><title>'.&mt('Discussion Post').'</title></head><body>'.
                                            $imsitems{$alldiscussion{$post}}{'title'}.' '.                                             $imsitems{$alldiscussion{$post}}{'title'}.' '.
                                            $imsitems{$alldiscussion{$post}}{'sender'}.                                             $imsitems{$alldiscussion{$post}}{'sender'}.
                                            $imsitems{$alldiscussion{$post}}{'timestamp'}.'<br /><br />'.                                             $imsitems{$alldiscussion{$post}}{'timestamp'}.'<br /><br />'.
Line 671  END Line 690  END
                                              $newpostsflag,$group,                                               $newpostsflag,$group,
                                              $prevread,$markondisp,$seehidden);                                               $prevread,$markondisp,$seehidden);
             $discussion .= "</table></form>\n";              $discussion .= "</table></form>\n";
         }           }
         if ($outputtarget eq 'export') {          if ($outputtarget eq 'export') {
             if ($manifestok) {              if ($manifestok) {
                 while ($currdepth > 0) {                  while ($currdepth > 0) {
Line 693  END Line 712  END
   
 #Create zip file in prtspool  #Create zip file in prtspool
   
                     my $imszipfile = '/prtspool/'.                      if (($env{'user.name'} =~ /^$match_username$/)
                     $env{'user.name'}.'_'.$env{'user.domain'}.'_'.                          && ($env{'user.domain'} =~ /^$match_domain$/)) {
                          time.'_'.rand(1000000000).'.zip';                          my $now = time();
                     my $cwd = &getcwd();                           my $imszipfile = '/prtspool/'.
                     my $imszip = '/home/httpd/'.$imszipfile;                                        join('_',$env{'user.name'},$env{'user.domain'},$now).
                     chdir $tempexport;                                        '_'.rand(1000000000).'.zip';
                     open(OUTPUT, "zip -r $imszip *  2> /dev/null |");                          my $zip = Archive::Zip->new();
                     close(OUTPUT);                          $zip->addTree($tempexport);
                     chdir $cwd;                          my $imszip = '/home/httpd/'.$imszipfile;
                     $discussion .= &mt('Download the zip file from [_1]Discussion Posting Archive','<a href="'.$imszipfile.'">').'</a><br />';                          if ($zip->writeToFileNamed($imszip) == AZ_OK) {
                     if ($copyresult) {                              $discussion .= &mt('Download the zip file from [_1]Discussion Posting Archive[_2]',
                         $discussion .= &mt('The following errors occurred during export').' - <br />'.$copyresult;                                             '<a href="'.$imszipfile.'">','</a>').'<br />';
                           } else {
                               $discussion .=  &mt('Failed to create zip file').'<br />';
                           }
                           if ($copyresult) {
                               $discussion .= '<span class="LC_error">'.
                                              &mt('The following errors occurred during export:').
                                              '</span><br />'.$copyresult;
                           }
                       } else {
                           $discussion .= '<p class="LC_error">'.
                                          &mt('Unfortunately you will not be able to retrieve an archive of the discussion posts at this time, because there was a problem creating the zip file.').'</p>';
                     }                      }
                 }                  }
             } else {              } else {
                 $discussion .= '<br />'.&mt('Unfortunately you will not be able to retrieve an archive of the discussion posts at this time, because there was a problem creating a manifest file.').'<br />';                  $discussion .= '<p class="LC_error">'.
                                  &mt('Unfortunately you will not be able to retrieve an archive of the discussion posts at this time, because there was a problem creating a manifest file.').'</p>';
             }              }
             return $discussion;              return $discussion;
         }          }
Line 759  END Line 790  END
                           &mt('This discussion is closed.').'</span>';                            &mt('This discussion is closed.').'</span>';
         }          }
     } elsif ($outputtarget ne 'tex') {      } elsif ($outputtarget ne 'tex') {
         $discussion.='<div class="LC_feedback_link">';          unless ($nofooter) {
         if (&discussion_open($status) &&              $discussion.='<div class="LC_feedback_link">';
             &Apache::lonnet::allowed('pch',              unless ($nodisclink) {
            $env{'request.course.id'}.                  if (&discussion_open($status) &&
         ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {                      &Apache::lonnet::allowed('pch',
             $discussion.= &send_feedback_link($ressymb);                     $env{'request.course.id'}.
             if ($env{'request.role.adv'}) {                  ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
                 my $close = &Apache::lonnet::EXT('resource.0.discussend',$ressymb);                      $discussion.= &send_feedback_link($ressymb);
                 my $canvote = &Apache::lonnet::EXT('resource.0.discussvote',$ressymb);                      if ($env{'request.role.adv'}) {
                 if (defined($close) && $close ne '' && $close < time) {                          my $close = &Apache::lonnet::EXT('resource.0.discussend',$ressymb);
                     if ($canvote eq 'notended') {                          my $canvote = &Apache::lonnet::EXT('resource.0.discussvote',$ressymb);
                         $discussion .= '&nbsp;'.&mt('(Posting and voting closed for [_1] roles)',                          if (defined($close) && $close ne '' && $close < time) {
                                                     &Apache::lonnet::plaintext('st',$crstype));                              if ($canvote eq 'notended') {
                     } else {                                  $discussion .= '&nbsp;'.&mt('(Posting and voting closed for [_1] roles)',
                         $discussion .= '&nbsp;'.&mt('(Closed for [_1] roles)',                                                              &Apache::lonnet::plaintext('st',$crstype));
                                                     &Apache::lonnet::plaintext('st',$crstype));                              } else {
                                   $discussion .= '&nbsp;'.&mt('(Closed for [_1] roles)',
                                                               &Apache::lonnet::plaintext('st',$crstype));
                               }
                           }
                     }                      }
           } else {
                       $discussion.= '<span class="LC_feedback_link">'.&mt('This discussion is closed.').'</span>';
                 }                  }
             }              }
  } else {              unless ($nofdbklink) {
             $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 check_menucoll {
       my ($nofooter,$nodisclink,$nofdbklink);
       my ($menucoll,$deeplinkmenu,$menuref) = &Apache::loncommon::menucoll_in_effect();
       if ($menucoll) {
           if (ref($menuref) eq 'HASH') {
               if ($menuref->{'foot'} eq 'n') {
                   $nofooter = 1;
               } else {
                   unless ($menuref->{'disc'}) {
                       $nodisclink = 1;
                   }
                   unless ($menuref->{'fdbk'}) {
                       $nofdbklink = 1;
                   }
               }
           }
       }
       return ($nofooter,$nodisclink,$nofdbklink);
   }
   
 sub can_see_hidden {  sub can_see_hidden {
     my ($mode,$ressymb,$feedurl,$group,$cdom,$cnum,$crs) = @_;      my ($mode,$ressymb,$feedurl,$group,$cdom,$cnum,$crs) = @_;
     my $seehidden;      my $seehidden;
Line 840  sub send_feedback_link { Line 898  sub send_feedback_link {
                  &discussion_link($ressymb,                   &discussion_link($ressymb,
                     '<img alt="" class="LC_noBorder" src="'.                      '<img alt="" class="LC_noBorder" src="'.
                     &Apache::loncommon::lonhttpdurl('/adm/lonMisc/chat.gif').                      &Apache::loncommon::lonhttpdurl('/adm/lonMisc/chat.gif').
                     '" border="0" /><span class="LC_menubuttons_inline_text">'.&mt('Post Discussion').'</span>',                      '" /><span class="LC_menubuttons_inline_text">'.&mt('Post Discussion').'</span>',
                     'replydisc').                      'replydisc').
            '</span>';             '</span>';
 }  }
Line 851  sub send_message_link { Line 909  sub send_message_link {
                  &discussion_link($ressymb,                   &discussion_link($ressymb,
                     '<img alt="" class="LC_noBorder" src="'.                      '<img alt="" class="LC_noBorder" src="'.
                     &Apache::loncommon::lonhttpdurl('/res/adm/pages/feedback.png').                      &Apache::loncommon::lonhttpdurl('/res/adm/pages/feedback.png').
                     '" border="0" /><span class="LC_menubuttons_inline_text">'.&mt('Send Feedback').'</span>',                      '" /><span class="LC_menubuttons_inline_text">'.&mt('Send Feedback').'</span>',
                     'sendmessageonly').                      'sendmessageonly').
                  '</span>';                   '</span>';
     return $output;      return $output;
Line 926  sub postingform_display { Line 984  sub postingform_display {
         $currnewattach,$currdelold,$group,$crstype) = @_;          $currnewattach,$currdelold,$group,$crstype) = @_;
     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',
              'title' => 'Title',               'title' => 'Title',
              'podi' => 'Post Discussion',               'podi' => 'Post Discussion',
              'poan' => 'Post Anonymous Discussion',               'poan' => 'Post Anonymous Discussion',
Line 945  sub postingform_display { Line 1003  sub postingform_display {
             }              }
         }          }
     }      }
       my $postanon;
       if (&Apache::lonnet::allowed('pac',$env{'request.course.id'}.
          ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
           $postanon = '<input type="submit" name="anondiscuss" value="'.$lt{'poan'}.'" />';
       }
     $postingform .= (<<ENDDISCUSS);      $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" />  $postanon<input type="hidden" name="symb" value="$ressymb" />
 <input type="hidden" name="sendit" value="true" />  <input type="hidden" name="sendit" value="true" />
 <input type="hidden" name="timestamp" value="$now" />  <input type="hidden" name="timestamp" value="$now" />
 <a name="newpost"></a>  <a name="newpost"></a>
Line 1056  sub build_posting_display { Line 1119  sub build_posting_display {
                      &filter_regexp($rolefilter,$sectionpick,$statusfilter);                       &filter_regexp($rolefilter,$sectionpick,$statusfilter);
             $rolematch = $roleregexp.':'.$secregexp.':'.$statusregexp;              $rolematch = $roleregexp.':'.$secregexp.':'.$statusregexp;
         }          }
           my %votestyle;
         if ($seeid || $canvote) {          if ($seeid || $canvote) {
 # We need to go through this twice, first to get the likes/dislikes, then to actually build the display  # 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++) {              for (my $id=1;$id<=$contrib{'version'};$id++) {
Line 1101  sub build_posting_display { Line 1165  sub build_posting_display {
             $twoplus=$ave+2.*$stddev;              $twoplus=$ave+2.*$stddev;
             $oneminus=$ave-$stddev;              $oneminus=$ave-$stddev;
             $twominus=$ave-2.*$stddev;              $twominus=$ave-2.*$stddev;
               if ($#theselikes>1) {
                   foreach my $class ('twoplus','oneplus','zero','oneminus','twominus') {
                       my $fontstyle = $env{'course.'.$env{'request.course.id'}.'.discussion_post_fonts_'.$class};
                       if ($fontstyle ne '') {
                           my ($size,$weight,$style,$other) = split(/,/,$fontstyle);
                           if ($size ne '') {
                               $votestyle{$class} .= 'font-size: '.$size.';';
                           }
                           if ($weight ne '') {
                               $votestyle{$class} .= 'font-weight: '.$weight.';';
                           }
                           if ($style ne '') {
                               $votestyle{$class} .= 'font-style: '.$style.';';
                           }
                           if ($other ne '') {
                               $votestyle{$class} .= $other;
                           }
                           if ($votestyle{$class} ne '') {
                               $votestyle{$class} = 'style="'.$votestyle{$class}.'"';
                           }
                       }
                   }
               }
         }          }
 #  #
 # This is now the real loop. Go through all entries, pick up what we need  # This is now the real loop. Go through all entries, pick up what we need
Line 1254  sub build_posting_display { Line 1341  sub build_posting_display {
                                 if (&editing_allowed($escsymb.':::'.$idx,$group)) {                                  if (&editing_allowed($escsymb.':::'.$idx,$group)) {
                                     if (($env{'user.domain'} eq $contrib{$idx.':senderdomain'}) && ($env{'user.name'} eq $contrib{$idx.':sendername'})) {                                      if (($env{'user.domain'} eq $contrib{$idx.':senderdomain'}) && ($env{'user.name'} eq $contrib{$idx.':sendername'})) {
                                         $sender.=' '.                                          $sender.=' '.
                                          &discussion_link($symb,&mt('Edit'),'editdisc',$idx,$$newpostsflag,$prevread,&group_args($group));                                           &discussion_link($ressymb,&mt('Edit'),'editdisc',$idx,$$newpostsflag,$prevread,&group_args($group));
                                         unless ($seehidden) {                                          unless ($seehidden) {
                                             my $grpargs = &group_args($group);                                              my $grpargs = &group_args($group);
                                             $sender.=" <a href=\"javascript:verifydelete('studentdelete','$escsymb','$idx','$$newpostsflag','$prevread','$grpargs')";                                              $sender.=" <a href=\"javascript:verifydelete('studentdelete','$escsymb','$idx','$$newpostsflag','$prevread','$grpargs')";
Line 1266  sub build_posting_display { Line 1353  sub build_posting_display {
             if ($hiddens{$idx}) {              if ($hiddens{$idx}) {
                                         unless ($studenthidden) {                                          unless ($studenthidden) {
                             $sender.=' '.                              $sender.=' '.
                                             &discussion_link($symb,&mt('Make Visible'),'unhide',$idx,$$newpostsflag,$prevread,&group_args($group));                                              &discussion_link($ressymb,&mt('Make Visible'),'unhide',$idx,$$newpostsflag,$prevread,&group_args($group));
                                         }                                          }
             } else {              } else {
                                         $sender.=' '.                                          $sender.=' '.
                                          &discussion_link($symb,&mt('Hide'),'hide',$idx,$$newpostsflag,$prevread,&group_args($group));                                           &discussion_link($ressymb,&mt('Hide'),'hide',$idx,$$newpostsflag,$prevread,&group_args($group));
             }              }
                                     my $grpargs = &group_args($group);                                      my $grpargs = &group_args($group);
             $sender.=               $sender.= 
Line 1309  sub build_posting_display { Line 1396  sub build_posting_display {
                                 if (($group ne '') &&                                   if (($group ne '') && 
                                     (&check_group_priv($group,'pgd') eq 'ok')) {                                      (&check_group_priv($group,'pgd') eq 'ok')) {
                                      $sender.=' '.                                       $sender.=' '.
                                          &discussion_link($symb,&mt('Reply'),'replydisc',$idx,$$newpostsflag,$prevread,&group_args($group));                                           &discussion_link($ressymb,&mt('Reply'),'replydisc',$idx,$$newpostsflag,$prevread,&group_args($group));
                                 } elsif (&Apache::lonnet::allowed('pch',                                   } elsif (&Apache::lonnet::allowed('pch', 
      $env{'request.course.id'}.       $env{'request.course.id'}.
      ($env{'request.course.sec'}?'/'.       ($env{'request.course.sec'}?'/'.
                                       $env{'request.course.sec'}:''))) {                                        $env{'request.course.sec'}:''))) {
              $sender.=' '.               $sender.=' '.
                                          &discussion_link($symb,&mt('Reply'),'replydisc',$idx,$$newpostsflag,$prevread);                                           &discussion_link($ressymb,&mt('Reply'),'replydisc',$idx,$$newpostsflag,$prevread);
                                 }                                  }
                             }                              }
             if ($viewgrades) {              if ($viewgrades) {
Line 1436  sub build_posting_display { Line 1523  sub build_posting_display {
                                 $$discussionitems[$idx].='&nbsp;&nbsp;'.$ctlink;                                  $$discussionitems[$idx].='&nbsp;&nbsp;'.$ctlink;
                             }                              }
                             my $thislikes=$likes{$symb.':'.$idx.':likes'};                              my $thislikes=$likes{$symb.':'.$idx.':likes'};
                             my $likesize="100";                              my $likestyle;
                             if ($seeid || $canvote) {                              if ($seeid || $canvote) {
 # Figure out size based on likes  # Figure out size based on likes
                                   my $class = 'zero';
                                 my $thislikes=$likes{$symb.':'.$idx.':likes'};                                  my $thislikes=$likes{$symb.':'.$idx.':likes'};
                                 if ($thislikes>$twoplus) {                                  if ($thislikes>$twoplus) {
                                     $likesize="200";                                      $class = 'twoplus';
                                 } elsif ($thislikes>$oneplus) {                                  } elsif ($thislikes>$oneplus) {
                                     $likesize="150";                                      $class = 'oneplus';
                                 }                                  }
                                 if ($thislikes<$twominus) {                                  if ($thislikes<$twominus) {
                                     $likesize="50";                                      $class = 'twominus';
                                 } elsif ($thislikes<$oneminus) {                                  } elsif ($thislikes<$oneminus) {
                                     $likesize="75";                                      $class = 'oneminus';
                                 }                                  }
                                   $likestyle = $votestyle{$class};
                             }                              }
 # Actually glue in the message itself  # Actually glue in the message itself
                             $$discussionitems[$idx].= '<br /><blockquote>'.                              $$discussionitems[$idx].= '<br /><blockquote>'.
                                     "<div style='font-size:$likesize%'>".                                      "<div $likestyle>".
                                     $message.                                      $message.
                                     '</div></blockquote>';                                      '</div></blockquote>';
                             if ($canvote) {                              if ($canvote) {
Line 1470  sub build_posting_display { Line 1559  sub build_posting_display {
                                     } else {                                      } else {
                                         $novote = &mt('No voting for hidden posts.');                                          $novote = &mt('No voting for hidden posts.');
                                     }                                      }
                                       &html_escape(\$novote);
                                     $$discussionitems[$idx].=                                      $$discussionitems[$idx].=
                                         '<a href="javascript:alert('."'$novote'".');" style="text-decoration: none;">'.                                          '<a href="javascript:alert('."'$novote'".');" style="text-decoration: none;">'.
                                         '<img border="0" src="/res/adm/pages/thumbsup_novote.png" alt="'.$novote.'" />&nbsp;'.                                          '<img border="0" src="/res/adm/pages/thumbsup_novote.png" alt="'.$novote.'" />&nbsp;'.
Line 1479  sub build_posting_display { Line 1569  sub build_posting_display {
                                     if ($userlikes{$idx}) {                                      if ($userlikes{$idx}) {
                                         $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsup_gray.png" alt="'.&mt('You like this posting').'" />';                                          $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsup_gray.png" alt="'.&mt('You like this posting').'" />';
                                     } else {                                      } 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"));                                          $$discussionitems[$idx].='&nbsp;'.&discussion_link($ressymb,'<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}) {                                      if ($userunlikes{$idx}) {
                                         $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsdown_gray.png" alt="'.&mt('You unlike this posting').'" />';                                          $$discussionitems[$idx].='<img border="0" src="/res/adm/pages/thumbsdown_gray.png" alt="'.&mt('You unlike this posting').'" />';
                                     } else {                                      } 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"));                                          $$discussionitems[$idx].='&nbsp;'.&discussion_link($ressymb,'<img border="0" src="/res/adm/pages/thumbsdown.png" alt="'.&mt('Unlike').'" />','unlike',$idx,$$newpostsflag,$prevread,&group_args($group),&mt("Unlike this posting"));
                                     }                                      }
                                 }                                  }
                             }                              }
Line 1502  sub build_posting_display { Line 1592  sub build_posting_display {
                                 $$discussionitems[$idx] .= '&nbsp;&nbsp;'.&mt('This post has been edited by the author.');                                  $$discussionitems[$idx] .= '&nbsp;&nbsp;'.&mt('This post has been edited by the author.');
                                 if ($seehidden) {                                  if ($seehidden) {
                                     $$discussionitems[$idx] .= '&nbsp;&nbsp;'.                                      $$discussionitems[$idx] .= '&nbsp;&nbsp;'.
                                          &discussion_link($symb,&mt('Display all versions'),'allversions',$idx,$$newpostsflag,$prevread,&group_args($group));                                           &discussion_link($ressymb,&mt('Display all versions'),'allversions',$idx,$$newpostsflag,$prevread,&group_args($group));
                                 }                                  }
                                 $$discussionitems[$idx].='<br/>'.&mt('Earlier version(s) were posted on: ');                                  $$discussionitems[$idx].='<br/>'.&mt('Earlier version(s) were posted on: ');
                                 if ($contrib{$idx.':history'} =~ m/:/) {                                  if ($contrib{$idx.':history'} =~ m/:/) {
Line 1734  sub mail_screen { Line 1824  sub mail_screen {
   
   my %lt = &Apache::lonlocal::texthash(    my %lt = &Apache::lonlocal::texthash(
             'myqu' => 'Question/comment/feedback:',              'myqu' => 'Question/comment/feedback:',
             'title' => 'Title',  
             'reta' => 'Retained attachments',              'reta' => 'Retained attachments',
             'atta' => 'Attachment',              'atta' => 'Attachment',
            );             );
   if($env{'form.editdisc'} || $env{'form.replydisc'}){    if ($env{'form.editdisc'} || $env{'form.replydisc'}){
     %lt = &Apache::lonlocal::texthash(        $lt{'myqu'} = &mt('Post Discussion');
             'myqu' => 'Post Discussion',  
     );  
   }    }
   my $restitle = &get_resource_title($caller_symb,$feedurl);    my $restitle = &get_resource_title($caller_symb,$feedurl);
   my $quote='';    my $quote='';
Line 1870  END Line 1957  END
   my $latexHelp=&Apache::loncommon::helpLatexCheatsheet(undef,undef,1,($env{'form.modal'}?'popup':0));    my $latexHelp=&Apache::loncommon::helpLatexCheatsheet(undef,undef,1,($env{'form.modal'}?'popup':0));
   my $send=&mt('Send');    my $send=&mt('Send');
   my $alert = &mt('Please select a feedback type.');    my $alert = &mt('Please select a feedback type.');
     &js_escape(\$alert);
   my $js= <<END;    my $js= <<END;
 <script type="text/javascript">  <script type="text/javascript">
 //<!--  //<!--
Line 1907  END Line 1995  END
     $anonscript      $anonscript
 //-->  //-->
 </script>  </script>
   <script type="text/javascript" src="/res/adm/includes/file_upload.js"></script>
 END  END
   
   my ($textareaheader,$textareaclass);    my ($textareaheader,$textareaclass);
Line 1926  END Line 2015  END
   
   my %onload = ('onload' => 'window.focus();setposttype();');    my %onload = ('onload' => 'window.focus();setposttype();');
   my %parms=('add_entries' => \%onload);    my %parms=('add_entries' => \%onload);
   if ($env{'form.modal'} ne 'yes') { 'bread_crumbs' => $brcrum }    if ($env{'form.modal'} ne 'yes') { $parms{'bread_crumbs'} = $brcrum; }
   my $start_page=    my $start_page=
       &Apache::loncommon::start_page('Resource Feedback and Discussion',$js,\%parms);        &Apache::loncommon::start_page('Resource Feedback and Discussion',$js,\%parms);
   
Line 2014  END Line 2103  END
     } else {      } else {
         $r->print(<<END);          $r->print(<<END);
 <p>  <p>
 $lt{'atta'} $attachmaxtext: <input type="file" name="attachment" />  $lt{'atta'} $attachmaxtext: <input type="file" name="attachment" class="LC_flUpload" />
   <input type="hidden" id="LC_free_space" value="131072" />
 </p>  </p>
 END  END
     }      }
Line 2025  END Line 2115  END
         $r->print('<input type="hidden" name="ref" value="'.$env{'form.ref'}.'" />');          $r->print('<input type="hidden" name="ref" value="'.$env{'form.ref'}.'" />');
     }      }
     $r->print(<<END);      $r->print(<<END);
 <input type="hidden" name="sendit" value="1" />  <input type="hidden" name="sendit" value="1" /><br /><br />
 <input type="button" value="$send" onclick='gosubmit();' />  <input type="button" value="$send" onclick='gosubmit();' />
 </form>  </form>
 END  END
Line 2103  sub print_display_options { Line 2193  sub print_display_options {
         'yhni' => 'You have not indicated that you wish to change any of the discussion settings',          'yhni' => 'You have not indicated that you wish to change any of the discussion settings',
         'ywbr' => 'You will be returned to the previous page if you click OK.'          'ywbr' => 'You will be returned to the previous page if you click OK.'
     );      );
       my %js_lt = &Apache::lonlocal::texthash(
           'yhni' => 'You have not indicated that you wish to change any of the discussion settings',
           'ywbr' => 'You will be returned to the previous page if you click OK.'
       );
       &js_escape(\%js_lt);
   
     my $dispchangeA = $lt{'unread'};      my $dispchangeA = $lt{'unread'};
     my $dispchangeB = $lt{'unmark'};      my $dispchangeB = $lt{'unmark'};
Line 2196  function setDisp() { Line 2291  function setDisp() {
     if (chktotal > 0) {       if (chktotal > 0) { 
         document.modifydisp.submit()          document.modifydisp.submit()
     } else {      } else {
         if(confirm("$lt{'yhni'}. \\n$lt{'ywbr'}"))      {          if(confirm("$js_lt{'yhni'}. \\n$js_lt{'ywbr'}"))      {
             if (prev > 0) {              if (prev > 0) {
                 location.href = "$feedurl?previous=$previous"                  location.href = "$feedurl?previous=$previous"
             } else {              } else {
Line 2556  sub print_showposters { Line 2651  sub print_showposters {
     my $table_start =&Apache::loncommon::start_data_table();      my $table_start =&Apache::loncommon::start_data_table();
     $r->print(<<END);      $r->print(<<END);
 $start_page  $start_page
  <form name="pickpostersform" method="post">   <form name="pickpostersform" method="post" action="">
  <br />   <br />
     $table_start      $table_start
       <tr>        <tr>
Line 2656  sub get_post_attachments { Line 2751  sub get_post_attachments {
         $$attachments{'0'}{'filename'} = $attachmenturls;          $$attachments{'0'}{'filename'} = $attachmenturls;
         $$attachments{'0'}{'0'} = 'n';          $$attachments{'0'}{'0'} = 'n';
     }      }
   
     return;      return;
 }  }
   
 sub fail_redirect {  sub fail_redirect {
   my ($r,$feedurl) = @_;    my ($r,$feedurl,$delay) = @_;
   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,    my %parms=('only_body'   => 1);
    {'redirect'  => [2,$feedurl],    if ($delay !~ /^\d+(|\.\d+)$/) {
     'only_body' => 1,}));        $delay = 0;
     }
     if ($env{'form.modal'}) {
         my $onload = 'document.forms.reldt.submit()';
         if ($delay) {
             my $js_delay = int(1000 * $delay);
             $onload = "setTimeout(function(){
                        document.forms.reldt.submit();
                        },$js_delay);";
         }
         $parms{'add_entries'}={'onload' => $onload};
     } else {
         $parms{'redirect'}=[$delay,$feedurl];
     }
     $r->print(&Apache::loncommon::start_page('Feedback not sent',undef,\%parms));
     my $windowname = 'loncapaclient';
     if ($env{'request.lti.login'}) {
        $windowname .= 'lti';
     }
   $r->print(<<ENDFAILREDIR);    $r->print(<<ENDFAILREDIR);
 <img align="right" src="$logo" />  <img align="right" src="$logo" />
 <b>$lt{'sorr'}</b>  <p class="LC_warning">$lt{'sorr'}</p>
   <form name="reldt" action="$feedurl" target="$windowname">
   </form>
 ENDFAILREDIR  ENDFAILREDIR
   $r->print(&Apache::loncommon::end_page());    $r->print(&Apache::loncommon::end_page());
 }  }
   
 sub redirect_back {  sub redirect_back {
   my ($r,$feedurl,$typestyle,$sendsomething,$sendposts,$blog,$status,$previous,$sort,$rolefilter,$statusfilter,$sectionpick,$grouppick,$numpicks,$group,$toolarge) = @_;    my ($r,$feedurl,$typestyle,$sendsomething,$sendposts,$blog,$status,$previous,$sort,
         $rolefilter,$statusfilter,$sectionpick,$grouppick,$numpicks,$group,$toolarge,$delay) = @_;
   my $sorttag = '';    my $sorttag = '';
   my $roletag = '';    my $roletag = '';
   my $statustag = '';    my $statustag = '';
Line 2777  sub redirect_back { Line 2892  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 %parms=('only_body'   => 1);    my %parms=('only_body'   => 1);
     if ($delay !~ /^\d+(|\.\d+)$/) {
         $delay = 0;
     }
   if ($env{'form.modal'}) {    if ($env{'form.modal'}) {
       $parms{'add_entries'}={'onLoad' => 'document.forms.reldt.submit()'};        my $onload = 'document.forms.reldt.submit()';
         if ($delay) {
             my $js_delay = int(1000 * $delay);
             $onload = "setTimeout(function(){
                           document.forms.reldt.submit();
                        },$js_delay);";
         }
         $parms{'add_entries'}={'onload' => $onload};
   } else {    } else {
       $parms{'redirect'}=[0,$feedurl];        $parms{'redirect'}=[$delay,$feedurl];
   }    }
   my $start_page=    my $start_page=
       &Apache::loncommon::start_page('Feedback sent',undef,\%parms);        &Apache::loncommon::start_page('Feedback sent',undef,\%parms);
   my $end_page = &Apache::loncommon::end_page();    my $end_page = &Apache::loncommon::end_page();
     my $windowname = 'loncapaclient';
     if ($env{'request.lti.login'}) {
        $windowname .= 'lti';
     }
   $r->print(<<ENDREDIR);    $r->print(<<ENDREDIR);
 $start_page  $start_page
 <img align="right" src="$logo" />  <img align="right" src="$logo" />
Line 2793  $typestyle Line 2922  $typestyle
 $blog  $blog
 $toolarge  $toolarge
 <font color="red">$status</font>  <font color="red">$status</font>
 <form name="reldt" action="$feedurl" target="loncapaclient">  <form name="reldt" action="$feedurl" target="$windowname">
 $prevtag  $prevtag
 $sorttag  $sorttag
 $statustag  $statustag
Line 2808  ENDREDIR Line 2937  ENDREDIR
 }  }
   
 sub no_redirect_back {  sub no_redirect_back {
   my ($r,$feedurl) = @_;    my ($r,$feedurl,$delay) = @_;
   my $nofeed=&mt('Sorry, no feedback possible on this resource ...');    my $nofeed=&mt('Sorry, no feedback possible on this resource ...');
      my $form_for_modal;
   my %onload;    my %parms=('only_body'   => 1,
                'bgcolor'     => '#FFFFFF',);
   my %body_options = ('only_body'   => 1,    if ($delay !~ /^\d+(|\.\d+)$/) {
       'bgcolor'     => '#FFFFFF',        $delay = 0;
       'add_entries' => \%onload,);    }
     if ($env{'form.modal'}) {
   if ($feedurl !~ m{^/adm/feedback}) {         if (($feedurl !~ m{^/adm/feedback}) && ($feedurl ne '')) {
       $body_options{'redirect'} = [2,$feedurl];            my $onload = 'document.forms.reldt.submit()';
             if ($delay) {
                 my $js_delay = int(1000 * $delay);
                 $onload = "setTimeout(function(){
                            document.forms.reldt.submit();
                            },$js_delay);";
             }
             $parms{'add_entries'}={'onload' => $onload};
             my $windowname = 'loncapaclient';
             if ($env{'request.lti.login'}) {
                 $windowname .= 'lti';
             }
             $form_for_modal = <<ENDFORM;
   <form name="reldt" action="$feedurl" target="$windowname">
   </form>
   ENDFORM
         }
     } else {
         if (($feedurl !~ m{^/adm/feedback}) && ($feedurl ne '')) {
             $parms{'redirect'}=[$delay,$feedurl];
         }
   }    }
    
   my $start_page=    my $start_page=
       &Apache::loncommon::start_page('Feedback not sent',undef,        &Apache::loncommon::start_page('Feedback not sent',undef,
      \%body_options);       \%parms);
         
   my $end_page = &Apache::loncommon::end_page();    my $end_page = &Apache::loncommon::end_page();
   
   &Apache::lonenc::check_encrypt(\$feedurl);  
   my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');    my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
   $r->print (<<ENDNOREDIRTWO);    $r->print (<<ENDNOREDIRTWO);
 $start_page  $start_page
 <img align="right" src="$logo" />  <img align="right" src="$logo" />
 <b>$nofeed</b>  <b>$nofeed</b>
 <br />  <br />
   $form_for_modal
 $end_page  $end_page
 ENDNOREDIRTWO  ENDNOREDIRTWO
 }  }
   
 sub screen_header {  sub screen_header {
     my ($feedurl,$symb,$group) = @_;      my ($feedurl,$symb,$group) = @_;
     my $crscontent = &mt('Question/Comment/Feedback about course content');      my %default = &Apache::lonlocal::texthash (
     my $crspolicy = &mt('Question/Comment/Feedback about course policy');                      question => 'Question about resource content',
                       comment => 'Question/Comment/Feedback about course content',
                       policy => 'Question/Comment/Feedback about course policy',
                     );  
     my $contribdisc = &mt('Contribution to course discussion of resource');      my $contribdisc = &mt('Contribution to course discussion of resource');
     my $anoncontrib = &mt('Anonymous contribution to course discussion of resource');      my $anoncontrib = &mt('Anonymous contribution to course discussion of resource');
     my $namevis = &mt('name only visible to course faculty');      my $namevis = &mt('name only visible to course faculty');
Line 2848  sub screen_header { Line 3001  sub screen_header {
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
         $crstype = &Apache::loncommon::course_type();          $crstype = &Apache::loncommon::course_type();
         if ($crstype eq 'Community') {          if ($crstype eq 'Community') {
             $crscontent = &mt('Question/Comment/Feedback about community content');              $default{'comment'} = &mt('Question/Comment/Feedback about community content');
             $crspolicy = &mt('Question/Comment/Feedback about community policy');              $default{'policy'} = &mt('Question/Comment/Feedback about community policy'); 
             $contribdisc = &mt('Contribution to community discussion of resource');              $contribdisc = &mt('Contribution to community discussion of resource');
             $anoncontrib = &mt('Anonymous contribution to community discussion of resource');              $anoncontrib = &mt('Anonymous contribution to community discussion of resource');
             $namevis = &mt('name only visible to community facilitators');              $namevis = &mt('name only visible to community facilitators');
Line 2857  sub screen_header { Line 3010  sub screen_header {
     }      }
     my $msgoptions='';      my $msgoptions='';
     my $discussoptions='';      my $discussoptions='';
       my $checkradio = '';
       my $blockblog;
       my (%fdbkoptions,%discoptions);
     unless (($env{'form.replydisc'}) || ($env{'form.editdisc'})) {      unless (($env{'form.replydisc'}) || ($env{'form.editdisc'})) {
  if (($feedurl=~/^\/res\//) && ($feedurl!~/^\/res\/adm/) && ($env{'user.adv'})) {          if (($feedurl=~/^\/res\//) && ($feedurl!~/^\/res\/adm/) && ($env{'user.adv'})) {
     $msgoptions=               $fdbkoptions{'author'} = 1;
  '<label><input type="radio" name="discuss" value="author" /> '.          }
  &mt('Feedback to resource author').'</label><br />';          if (&feedback_available(1)) {
  }              $fdbkoptions{'question'} = 1;
         my %optionhash=();          }
         foreach my $type ('question','comment','policy') {          if (&feedback_available(0,1)) {
     $optionhash{$type}=$env{'course.'.$env{'request.course.id'}.'.'.$type.'.email.text'};              $fdbkoptions{'course'} = 1;
  }          }
  if (&feedback_available(1)) {          if (&feedback_available(0,0,1)) {
     $msgoptions.=              $fdbkoptions{'policy'} = 1;
  '<label><input type="radio" name="discuss" value="question" /> '.          }
  ($optionhash{'question'}?$optionhash{'question'}:&mt('Question about resource content')).'</label><br />';  
  }  
  if (&feedback_available(0,1)) {  
     $msgoptions.=  
  '<label><input type="radio" name="discuss" value="course" /> '.  
  ($optionhash{'comment'}?$optionhash{'comment'}:$crscontent).  
  '</label><br />';  
  }  
  if (&feedback_available(0,0,1)) {  
     $msgoptions.=  
  '<label><input type="radio" name="discuss" value="policy" /> '.  
  ($optionhash{'policy'}?$optionhash{'policy'}:$crspolicy).  
  '</label><br />';  
  }  
     }      }
     if (($env{'request.course.id'}) && (!$env{'form.sendmessageonly'})) {      if (($env{'request.course.id'}) && (!$env{'form.sendmessageonly'})) {
         my ($blocked,$blocktext) = &Apache::loncommon::blocking_status('boards');          my ($blocked,$blocktext) = &Apache::loncommon::blocking_status('boards');
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};          my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         my $realsymb = &get_realsymb($symb);          my $realsymb = &get_realsymb($symb);
         if (!$blocked && &discussion_open(undef,$realsymb) &&           if (!$blocked && &discussion_open(undef,$realsymb) &&
     (&Apache::lonnet::allowed('pch',              (&Apache::lonnet::allowed('pch',
       $env{'request.course.id'}.                                        $env{'request.course.id'}.
       ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')) ||                                         ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')) ||
             (($group ne '') && ($symb =~ m{^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$}) && (&check_group_priv($group,'pgd') eq 'ok')))) {              (($group ne '') && ($symb =~ m{^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$}) && (&check_group_priv($group,'pgd') eq 'ok')))) {
     $discussoptions='<label><input type="radio" name="discuss" value="nonanon" checked="checked" /> '.              $discoptions{'nonanon'} = 1;
  $contribdisc.              if (&Apache::lonnet::allowed('pac',$env{'request.course.id'}.
         '</label><br /><label><input type="radio" name="discuss" value="anon" /> '.                 ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
  $anoncontrib.                  $discoptions{'anon'} = 1;
  ' <i>('.$namevis.')</i></label> '.              }
  '<a href="/adm/preferences?action=changescreenname">'.&mt('Change Screenname').'</a>';              $blockblog = &Apache::loncommon::blocking_status('blogs');
             my $blockblog = &Apache::loncommon::blocking_status('blogs');          }
             if (!$blockblog) {      }
                 $discussoptions.= &add_blog_checkbox($crstype);      my $total = scalar(keys(%fdbkoptions)) + scalar(keys(%discoptions));
             }      return if (!$total);
       if ($total == 1) {
           $checkradio = ' checked="checked"';
       }
       if (keys(%fdbkoptions)) {
           if ($fdbkoptions{'author'}) {
       $msgoptions =
    '<label><input type="radio" name="discuss" value="author"'.$checkradio.' /> '.
    &mt('Feedback to resource author').'</label><br />';
    }
           foreach my $item ('question','comment','policy') {
               my $type = $item;
               if ($item eq 'comment') {
                   $type = 'course';
               }
               my $optionhash=$env{'course.'.$env{'request.course.id'}.'.'.$item.'.email.text'};
               if ($fdbkoptions{$type}) {
                   $msgoptions .=
                       '<label><input type="radio" name="discuss" value="'.$type.'"'.$checkradio.' />'.
                       ($optionhash?$optionhash:$default{$item}).'</label><br />'; 
       }
           }
       }
       if (keys(%discoptions)) {
           if ($discoptions{'nonanon'}) {
               $discussoptions='<label><input type="radio" name="discuss" value="nonanon" checked="checked" /> '.
                               $contribdisc.
                               '</label>';
           }
           if ($discoptions{'anon'}) {
               $discussoptions .= '<br /><label><input type="radio" name="discuss" value="anon"'.$checkradio.' /> '.
                                  $anoncontrib.
                                  ' <i>('.$namevis.')</i></label> '.
                                  '<a href="/adm/preferences?action=changescreenname">'.&mt('Change Screenname').'</a>';
           }
           if (!$blockblog) {
               $discussoptions.= &add_blog_checkbox($crstype);
         }          }
     }      }
     if ($msgoptions) {      if ($msgoptions) {
Line 2992  sub feedback_available { Line 3170  sub feedback_available {
 }  }
   
 sub send_msg {  sub send_msg {
     my ($title,$feedurl,$email,$citations,$attachmenturl,$symb,%to)=@_;      my ($title,$feedurl,$email,$citations,$attachmenturl,$symb,$clientip,%to)=@_;
     my $status='';      my $status='';
     my $sendsomething=0;      my $sendsomething=0;
       my $delay; 
       my $senthide;
       my %setters;
       my ($startblock,$endblock,$triggerblock,$by_ip,$blockdom) =
           &Apache::loncommon::blockcheck(\%setters,'com',$clientip);
       if ($by_ip) {
           $senthide = 1;
       }
     my $restitle = &get_resource_title($symb,$feedurl);      my $restitle = &get_resource_title($symb,$feedurl);
     if ($title=~/^Error/) { $title=&mt('Feedback').': '.$title; }      if ($title=~/^Error/) { $title=&mt('Feedback').': '.$title; }
     unless ($title=~/\w/) { $title=&mt('Feedback'); }      unless ($title=~/\w/) { $title=&mt('Feedback'); }
Line 3008  sub send_msg { Line 3194  sub send_msg {
     } else {      } else {
  unless (&Apache::lonmsg::user_normal_msg($user,$domain,   unless (&Apache::lonmsg::user_normal_msg($user,$domain,
  $title.' ['.$restitle.']',$email,$citations,$feedurl,   $title.' ['.$restitle.']',$email,$citations,$feedurl,
  $attachmenturl,undef,undef,$symb,$restitle)=~/ok/) {   $attachmenturl,undef,undef,$symb,$restitle,undef,
                                                            undef,undef,undef,$senthide)=~/ok/) {
     $status.='<br />'.&mt('Error sending message to').' '.$key.'<br />';      $status.='<br />'.&mt('Error sending message to').' '.$key.'<br />';
  } else {   } else {
     $sendsomething++;      $sendsomething++;
Line 3016  sub send_msg { Line 3203  sub send_msg {
     }      }
  }   }
     }      }
       if ($sendsomething && $senthide) {
           if ($by_ip) {
               my $showdom = &Apache::lonnet::domain($blockdom);
               if ($showdom eq '') {
                   $showdom = $blockdom;
               }
               $delay = 4;
               $status.='<br />'.&mt("Message content of feedback you send to instructor(s) from your current IP address: [_1] will be unavailable in your 'Sent' folder.",$clientip).
                        '<ul><li>'.
                        &mt('This does not affect delivery of feedback to your instructor(s).').
                        '</li><li>'.
                        &mt('Note: some types of communication functionality are blocked for certain IP address(es).').
                        '</li><li>'.
                        &mt('This restriction was set by an administrator in the [_1] LON-CAPA domain.',
                            $showdom).
                        '</li></ul><br />';
           }
       }
   
 # Records of number of feedback messages are kept under the "symb" called "_feedback"  # Records of number of feedback messages are kept under the "symb" called "_feedback"
 # There are two entries within the framework of a course:  # There are two entries within the framework of a course:
Line 3033  sub send_msg { Line 3238  sub send_msg {
     }      }
         }          }
     }      }
     return ($status,$sendsomething);      return ($status,$sendsomething,$delay);
 }  }
   
 # Routine to get the complete feedback records  # Routine to get the complete feedback records
Line 3123  sub adddiscuss { Line 3328  sub adddiscuss {
     if (($symb) && ($email)) {      if (($symb) && ($email)) {
         my $now = time;          my $now = time;
         if ($env{'form.editdisc'}) {          if ($env{'form.editdisc'}) {
             $contrib{'ip'}=$ENV{'REMOTE_ADDR'};              $contrib{'ip'}=&Apache::lonnet::get_requestor_ip();
             $contrib{'host'}=$Apache::lonnet::perlvar{'lonHostID'};              $contrib{'host'}=$Apache::lonnet::perlvar{'lonHostID'};
             $contrib{'timestamp'} = $now;              $contrib{'timestamp'} = $now;
             $contrib{'history'} = '';              $contrib{'history'} = '';
Line 3458  sub modify_attachments { Line 3663  sub modify_attachments {
    document.modattachments.submit();     document.modattachments.submit();
  }   }
 </script>   </script> 
   <script type="text/javascript" src="/res/adm/includes/file_upload.js"></script>
 END  END
   
     # Breadcrumbs      # Breadcrumbs
     my $brcrum = [{'href' => '',      my $brcrum = [{'href' => '',
                    'text' => 'Discussion Post Attachments'}];                     'text' => 'Discussion Post Attachments'}];
     my %parms=('only_body' => 1);      my %parms=('only_body' => 1);
     if ($env{'form.modal'} ne 'yes') { 'bread_crumbs' => $brcrum }      if ($env{'form.modal'} ne 'yes') { $parms{'bread_crumbs'} = $brcrum; }
   
     my $start_page =       my $start_page = 
  &Apache::loncommon::start_page('Discussion Post Attachments',$js,\%parms);   &Apache::loncommon::start_page('Discussion Post Attachments',$js,\%parms);
Line 3499  END Line 3705  END
     $r->print('<b>'.$subject.'</b>');      $r->print('<b>'.$subject.'</b>');
     $r->print(&Apache::lonhtmlcommon::row_closure());      $r->print(&Apache::lonhtmlcommon::row_closure());
     $r->print(&Apache::lonhtmlcommon::row_title($lt{'adda'}));      $r->print(&Apache::lonhtmlcommon::row_title($lt{'adda'}));
     $r->print('<input type="file" name="addnewattach" /><input type="button" name="upload" value="Upload" onclick="this.form.submit()" />  '.$attachmaxtext);      $r->print('<input type="file" name="addnewattach" class="LC_flUpload" />'
           .'<input type="hidden" id="LC_free_space" value="131072" />'
           .'<input type="button" name="upload" value="Upload" '
           .'onclick="this.form.submit()" />  '.$attachmaxtext);
     if(($idx)||(ref($currnewattach) eq 'ARRAY') && (@{$currnewattach} > 0)){      if(($idx)||(ref($currnewattach) eq 'ARRAY') && (@{$currnewattach} > 0)){
         $r->print(&Apache::lonhtmlcommon::row_closure());          $r->print(&Apache::lonhtmlcommon::row_closure());
         $r->print(&Apache::lonhtmlcommon::row_title(&mt('Attachments')));          $r->print(&Apache::lonhtmlcommon::row_title(&mt('Attachments')));
Line 3840  sub handler { Line 4049  sub handler {
           my $symb=(split(/\:\:\:/,$env{'form.editdisc'}))[0];            my $symb=(split(/\:\:\:/,$env{'form.editdisc'}))[0];
           my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb);            my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb);
           my $feedurl=&Apache::lonnet::clutter($url);            my $feedurl=&Apache::lonnet::clutter($url);
           &redirect_back($r,$feedurl,&mt('Editing not permitted').'<br />',                     '0','0','','',$env{'form.previous'},undef,undef,undef,            &redirect_back($r,$feedurl,&mt('Editing not permitted').'<br />',
                     undef,undef,undef,$group);                           '0','0','','',$env{'form.previous'},undef,undef,undef,
                            undef,undef,undef,$group);
           return OK;            return OK;
       }        }
   }     } 
Line 3882  sub handler { Line 4092  sub handler {
                      'text' => 'Discussion Post Versions'}];                       'text' => 'Discussion Post Versions'}];
               
       my %parms=();        my %parms=();
       if ($env{'form.modal'} ne 'yes') { 'bread_crumbs' => $brcrum }        if ($env{'form.modal'} ne 'yes') { $parms{'bread_crumbs'} = $brcrum; }
   
       $r->print(&Apache::loncommon::start_page('Discussion Post Versions',undef,\%parms));        $r->print(&Apache::loncommon::start_page('Discussion Post Versions',undef,\%parms));
   
Line 3955  sub handler { Line 4165  sub handler {
       my $feedurl = '/adm/navmaps';        my $feedurl = '/adm/navmaps';
       if ($env{'form.navurl'}) { $feedurl .= '?'.$env{'form.navurl'}; }        if ($env{'form.navurl'}) { $feedurl .= '?'.$env{'form.navurl'}; }
       my %lt = &Apache::lonlocal::texthash(        my %lt = &Apache::lonlocal::texthash(
           'mnpa' => 'Marked "New" posts as read in a total of',  
           'robb' => 'resources/bulletin boards.',  
           'twnp' => 'There are currently no resources or discussion boards with unread discussion postings.'            'twnp' => 'There are currently no resources or discussion boards with unread discussion postings.'
       );               );       
       foreach my $res (@resources) {        foreach my $res (@resources) {
Line 3965  sub handler { Line 4173  sub handler {
           my $lastkey = $ressymb.'_lastread';            my $lastkey = $ressymb.'_lastread';
           $discinfo{$lastkey} = $env{'form.navtime'};            $discinfo{$lastkey} = $env{'form.navtime'};
       }        }
       my $textline = "<b>$lt{'mnpa'} $numitems $lt{'robb'}</b>";        my $textline = '<b>'.
                        &mt('Marked "New" posts as read in a total of [_1] resources/discussion boards.',
                            $numitems).
                        '</b>';
       if ($numitems > 0) {        if ($numitems > 0) {
           &Apache::lonnet::put('nohist_'.$env{'request.course.id'}.'_discuss',            &Apache::lonnet::put('nohist_'.$env{'request.course.id'}.'_discuss',
      \%discinfo,$env{'user.domain'},$env{'user.name'});       \%discinfo,$env{'user.domain'},$env{'user.name'});
Line 3983  sub handler { Line 4194  sub handler {
   'only_body'   => 1,    'only_body'   => 1,
   'add_entries' => \%onload});    'add_entries' => \%onload});
       my $end_page = &Apache::loncommon::end_page();        my $end_page = &Apache::loncommon::end_page();
         my $windowname = 'loncapaclient';
         if ($env{'request.lti.login'}) {
             $windowname .= 'lti';
         }
       $r->print (<<ENDREDIR);        $r->print (<<ENDREDIR);
 $start_page  $start_page
 <img align="right" src="$logo" />  <img align="right" src="$logo" />
 $textline  $textline
 <form name="reldt" action="$feedurl" target="loncapaclient">  <form name="reldt" action="$feedurl" target="$windowname">
 </form>  </form>
 <br />  <br />
 $end_page  $end_page
Line 4047  ENDREDIR Line 4262  ENDREDIR
       unless (($seehidden) || (&editing_allowed($env{'form.hide'},$group))) {        unless (($seehidden) || (&editing_allowed($env{'form.hide'},$group))) {
           &redirect_back($r,$feedurl,&mt('Hiding not permitted').'<br />',            &redirect_back($r,$feedurl,&mt('Hiding not permitted').'<br />',
                          '0','0','','',$env{'form.previous'},'','','','',                           '0','0','','',$env{'form.previous'},'','','','',
                          undef,undef,$group,);                           undef,undef,$group);
           return OK;            return OK;
       }        }
   
Line 4396  ENDREDIR Line 4611  ENDREDIR
                                                 $cdom,$cnum);                                                  $cdom,$cnum);
           $contrib{'deleted'} =~ s/^\.//;            $contrib{'deleted'} =~ s/^\.//;
           $contrib{'deleted'} =~ s/\.$//;            $contrib{'deleted'} =~ s/\.$//;
             my $confirm_msg;
           if ($contrib{'deleted'} ne '') {            if ($contrib{'deleted'} ne '') {
               if (&Apache::lonnet::store({'deleted' => ''},$symb,$env{'request.course.id'},                if (&Apache::lonnet::store({'deleted' => ''},$symb,$env{'request.course.id'},
                                           $cdom,$cnum) eq 'ok') {                                            $cdom,$cnum) eq 'ok') {
Line 4423  ENDREDIR Line 4639  ENDREDIR
                                             $uname,$udom,$env{'request.course.id'},                                              $uname,$udom,$env{'request.course.id'},
                                             'undelete');                                              'undelete');
                   }                    }
                   $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Undeleted all entries")));                    $confirm_msg = &Apache::lonhtmlcommon::confirm_success(&mt("Undeleted all entries"));
               } else {                } else {
                   $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("Failed to undelete entries"),1));                    $confirm_msg = &Apache::lonhtmlcommon::confirm_success(&mt("Failed to undelete entries"),1);
               }                }
           } else {            } else {
               $r->print(&Apache::lonhtmlcommon::confirm_success(&mt("No entries to undelete"),1));                $confirm_msg = &Apache::lonhtmlcommon::confirm_success(&mt("No entries to undelete"),1);
           }            }
           $r->print("<br /><a href='$feedurl'>".&mt("Return and reload")."</a>");            $r->print(
                 '<br />'
                .&Apache::loncommon::confirmwrapper($confirm_msg)
                .&Apache::lonhtmlcommon::actionbox(
                     ["<a href='$feedurl'>".&mt("Return and reload")."</a>"])
             );
       }        }
       $r->print(&Apache::loncommon::end_page());        $r->print(&Apache::loncommon::end_page());
       return OK;        return OK;
Line 4473  ENDREDIR Line 4694  ENDREDIR
   $r->internal_redirect('/adm/ambiguous');    $r->internal_redirect('/adm/ambiguous');
   return OK;    return OK;
       }        }
         if ($feedurl eq '') {
             &Apache::loncommon::content_type($r,'text/html');
             $r->send_http_header;
             &no_redirect_back($r);
             return OK;
         }
 # Go ahead with feedback, no ambiguous reference  # Go ahead with feedback, no ambiguous reference
       unless (        unless (
   (    (
Line 4482  ENDREDIR Line 4709  ENDREDIR
   ($env{'request.course.id'} && ($feedurl!~m:^/adm:))    ($env{'request.course.id'} && ($feedurl!~m:^/adm:))
   ||    ||
   ($env{'request.course.id'} && ($symb=~/^bulletin\_\_\_/))    ($env{'request.course.id'} && ($symb=~/^bulletin\_\_\_/))
             ||
             (($env{'request.course.id'}) && ($feedurl =~ /ext\.tool$/))
   ) {    ) {
   &Apache::loncommon::content_type($r,'text/html');    &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;    $r->send_http_header;
 # Unable to give feedback  # Unable to give feedback
           &Apache::lonenc::check_encrypt(\$feedurl);            &Apache::lonenc::check_encrypt(\$feedurl);
   &no_redirect_back($r,$feedurl);    &no_redirect_back($r,$feedurl,2);
   return OK;    return OK;
       }        }
 # --------------------------------------------------- Print login screen header  # --------------------------------------------------- Print login screen header
Line 4507  ENDREDIR Line 4736  ENDREDIR
   if ($options) {    if ($options) {
       &mail_screen($r,$feedurl,$options,$symb,$attachmax{'text'});        &mail_screen($r,$feedurl,$options,$symb,$attachmax{'text'});
   } else {    } else {
       &fail_redirect($r,$feedurl);        &fail_redirect($r,$feedurl,1);
   }    }
   return OK;    return OK;
       }        }
Line 4573  ENDREDIR Line 4802  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 $clientip = &Apache::lonnet::get_requestor_ip($r);
       $feedurl,$email,$citations,        my ($status,$numsent,$delay)=&send_msg(&clear_out_html($env{'form.subject'}),
       $attachmenturl,$usersymb,%to);               $feedurl,$email,$citations,
                $attachmenturl,$usersymb,$clientip,%to);
   
 # Discussion? Store that.  # Discussion? Store that.
       my $numpost=0;        my $numpost=0;
Line 4583  ENDREDIR Line 4813  ENDREDIR
      && $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'});    my $subject = &clear_out_html($env{'form.subject'});
   my $anonmode=($env{'form.discuss'} eq 'anon' || $env{'form.anondiscuss'} );            my $anonmode;
             if (&Apache::lonnet::allowed('pac',$env{'request.course.id'}.
                ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
         $anonmode=($env{'form.discuss'} eq 'anon' || $env{'form.anondiscuss'} );
             }
   $typestyle.=&adddiscuss($symb,$message,$anonmode,$attachmenturl,    $typestyle.=&adddiscuss($symb,$message,$anonmode,$attachmenturl,
   $subject,$group);    $subject,$group);
   $numpost++;    $numpost++;
Line 4606  ENDREDIR Line 4840  ENDREDIR
       }        }
       
 # Receipt screen and redirect back to where came from  # Receipt screen and redirect back to where came from
       &redirect_back($r,$feedurl,$typestyle,$numsent,$numpost,$blog,$status,$env{'form.previous'},undef,undef,undef,undef,undef,undef,$group,$toolarge);        &redirect_back($r,$feedurl,$typestyle,$numsent,$numpost,$blog,$status,$env{'form.previous'},
                        undef,undef,undef,undef,undef,undef,$group,$toolarge,$delay);
   }    }
   return OK;    return OK;
 }  }

Removed from v.1.357  
changed lines
  Added in v.1.389


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