Diff for /loncom/interface/lonfeedback.pm between versions 1.109 and 1.115

version 1.109, 2004/07/29 18:21:44 version 1.115, 2004/08/10 18:25:53
Line 36  use Apache::loncommon(); Line 36  use Apache::loncommon();
 use Apache::lontexconvert();  use Apache::lontexconvert();
 use Apache::lonlocal; # must not have ()  use Apache::lonlocal; # must not have ()
 use Apache::lonhtmlcommon();  use Apache::lonhtmlcommon();
   use HTML::LCParser();
 use Apache::lonspeller();  use Apache::lonspeller();
   
 sub discussion_open {  sub discussion_open {
Line 65  sub discussion_visible { Line 66  sub discussion_visible {
   
 sub list_discussion {  sub list_discussion {
     my ($mode,$status,$symb)=@_;      my ($mode,$status,$symb)=@_;
   
     my $outputtarget=$ENV{'form.grade_target'};      my $outputtarget=$ENV{'form.grade_target'};
     if (not &discussion_visible($status)) { return ''; }      if (not &discussion_visible($status)) { return ''; }
     my @bgcols = ("#cccccc","#eeeeee");      my @bgcols = ("#cccccc","#eeeeee");
Line 96  sub list_discussion { Line 96  sub list_discussion {
 # Get discussion display settings for this discussion  # Get discussion display settings for this discussion
     my $lastkey = $ressymb.'_lastread';      my $lastkey = $ressymb.'_lastread';
     my $showkey = $ressymb.'_showonlyunread';      my $showkey = $ressymb.'_showonlyunread';
       my $markkey = $ressymb.'_showonlyunmark',
     my $visitkey = $ressymb.'_visit';      my $visitkey = $ressymb.'_visit';
     my $ondispkey = $ressymb.'_markondisp';      my $ondispkey = $ressymb.'_markondisp';
     my $userpickkey = $ressymb.'_userpick';      my $userpickkey = $ressymb.'_userpick';
     my %dischash = &Apache::lonnet::get('nohist_'.$ENV{'request.course.id'}.'_discuss',[$lastkey,$showkey,$visitkey,$ondispkey,$userpickkey],$ENV{'user.domain'},$ENV{'user.name'});      my $toggkey = $ressymb.'_readtoggle';
       my $readkey = $ressymb.'_read';
   
       my %dischash = &Apache::lonnet::get('nohist_'.$ENV{'request.course.id'}.'_discuss',[$lastkey,$showkey,$markkey,$visitkey,$ondispkey,$userpickkey,$toggkey,$readkey],$ENV{'user.domain'},$ENV{'user.name'});
     my %discinfo = ();      my %discinfo = ();
     my $showonlyunread = 0;      my $showonlyunread = 0;
       my $showunmark = 0; 
     my $markondisp = 0;      my $markondisp = 0;
     my $prevread = 0;      my $prevread = 0;
     my $previous = 0;      my $previous = 0;
Line 176  sub list_discussion { Line 181  sub list_discussion {
         $showonlyunread = $dischash{$showkey};          $showonlyunread = $dischash{$showkey};
     }      }
   
       if (defined($dischash{$markkey})) {
           $showunmark = $dischash{$markkey};
       }
   
     if (defined($dischash{$visitkey})) {      if (defined($dischash{$visitkey})) {
         $visit = $dischash{$visitkey};          $visit = $dischash{$visitkey};
     }      }
Line 205  sub list_discussion { Line 214  sub list_discussion {
     $ENV{'environment.remote'} eq 'off' ) {      $ENV{'environment.remote'} eq 'off' ) {
  $target='target="LONcom"';   $target='target="LONcom"';
     }      }
       
     my $now = time;      my $now = time;
     $discinfo{$visitkey} = $visit;      $discinfo{$visitkey} = $visit;
   
Line 260  sub list_discussion { Line 269  sub list_discussion {
                 }                  }
  my ($message,$subject);   my ($message,$subject);
           if ($idx > 0) {            if ($idx > 0) {
                     if ($contrib{$idx.':message'} =~ /.*::::\Q$numoldver\E::::(.+?)$/si) {                      if ($contrib{$idx.':message'} =~ /^<version num="0">/) {
                         $message = $1;                          my %versions = (); 
                           &get_post_versions(\%versions,$contrib{$idx.':message'},$numoldver);
                           $message = &HTML::Entities::decode($versions{$numoldver});
                     } else {                      } else {
                         $message = $contrib{$idx.':message'};                          $message = $contrib{$idx.':message'};
                     }                      }
Line 272  sub list_discussion { Line 283  sub list_discussion {
  $message=~s/\n/\<br \/\>/g;   $message=~s/\n/\<br \/\>/g;
  $message=&Apache::lontexconvert::msgtexconverted($message);   $message=&Apache::lontexconvert::msgtexconverted($message);
           if ($idx > 0) {            if ($idx > 0) {
                     if ($contrib{$idx.':subject'} =~ /.*::::\Q$numoldver\E::::(.+?)$/si) {                      if ($contrib{$idx.':subject'} =~ /^<version num="0"/) {
                         $subject = $1;                          my %versions = ();
                           &get_post_versions(\%versions,$contrib{$idx.':subject'},$numoldver);
                           $subject = &HTML::Entities::decode($versions{$numoldver});
                     } else {                      } else {
                         $subject = $contrib{$idx.':subject'};                          $subject = $contrib{$idx.':subject'};
                     }                      }
Line 285  sub list_discussion { Line 298  sub list_discussion {
                     $subject=&Apache::lontexconvert::msgtexconverted($subject);                      $subject=&Apache::lontexconvert::msgtexconverted($subject);
                 }                  }
  if ($attachmenturls) {   if ($attachmenturls) {
                     my @attachments = ();                      my %attachments = ();
                     my %currattach = ();                      my %currattach = ();
                     &extract_attachments($attachmenturls,$idx,$numoldver,\$message,\@attachments,\%currattach);                      &extract_attachments($attachmenturls,$idx,$numoldver,\$message,\%attachments,\%currattach);
  }   }
  if ($message) {   if ($message) {
     if ($hidden) {      if ($hidden) {
Line 434  sub list_discussion { Line 447  sub list_discussion {
  $vgrlink=&Apache::loncommon::submlink('Submissions',   $vgrlink=&Apache::loncommon::submlink('Submissions',
             $contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'},$symb);              $contrib{$idx.':sendername'},$contrib{$idx.':senderdomain'},$symb);
     }      }
                       my $ctlink;
                       if ($dischash{$readkey}=~/\.$idx\./) { 
                           $ctlink = '<b>'.&mt('Mark unread').'?</b>&nbsp;<input type="checkbox" name="postunread_'.$idx.'" />';
                       } else {
                           $ctlink = '<b>'.&mt('Mark read').'?</b>&nbsp;<input type="checkbox" name="postread_'.$idx.'" />';
                       }
 #figure out at what position this needs to print  #figure out at what position this needs to print
     my $thisindex=$idx;      my $thisindex=$idx;
     if ( (($ENV{'environment.threadeddiscussion'}) && (($sortposts eq '') || ($sortposts eq 'ascdate'))) || ($sortposts eq 'thread')) {      if ( (($ENV{'environment.threadeddiscussion'}) && (($sortposts eq '') || ($sortposts eq 'ascdate'))) || ($sortposts eq 'thread')) {
Line 445  sub list_discussion { Line 464  sub list_discussion {
                     my $spansize = 2;                      my $spansize = 2;
                     if ($showonlyunread && $prevread > $posttime) {                      if ($showonlyunread && $prevread > $posttime) {
                         $notshown{$idx} = 1;                          $notshown{$idx} = 1;
                       } elsif ($showunmark && $dischash{$readkey}=~/\.$idx\./) {
                           $notshown{$idx} = 1;
                     } else {                      } else {
 # apply filters  # apply filters
                         my $uname = $contrib{$idx.':sendername'};                          my $uname = $contrib{$idx.':sendername'};
Line 508  sub list_discussion { Line 529  sub list_discussion {
                         $discussionitems[$idx] .= '<td align ="left">&nbsp;&nbsp;'.                          $discussionitems[$idx] .= '<td align ="left">&nbsp;&nbsp;'.
                             '<b>'.$subject.'</b>&nbsp;&nbsp;'.                              '<b>'.$subject.'</b>&nbsp;&nbsp;'.
                             $sender.'</b> '.$vgrlink.' ('.                              $sender.'</b> '.$vgrlink.' ('.
                             &Apache::lonlocal::locallocaltime($posttime).')</td></tr>'.                              &Apache::lonlocal::locallocaltime($posttime).')</td>';
                             '</table><blockquote>'.$message.'</blockquote></p>';                          if ($dischash{$toggkey}) {
                               $discussionitems[$idx].='<td align="right">&nbsp;&nbsp;'.
                                 $ctlink.'</td>';
                           }
                           $discussionitems[$idx].= '</tr></table><blockquote>'.$message.'</blockquote></p>';
                         if ($contrib{$idx.':history'}) {                          if ($contrib{$idx.':history'}) {
                             my @postversions = ();                              my @postversions = ();
                             $discussionitems[$idx] .= '<br />'.&mt('This post has been edited by the author.');                              $discussionitems[$idx] .= '<br />'.&mt('This post has been edited by the author.');
Line 542  sub list_discussion { Line 567  sub list_discussion {
         'cuse' => 'Current discussion settings',          'cuse' => 'Current discussion settings',
         'allposts' => 'All posts',          'allposts' => 'All posts',
         'unread' => 'New posts only',          'unread' => 'New posts only',
           'unmark' => 'Unread only',
         'ondisp' => 'Once displayed',          'ondisp' => 'Once displayed',
         'onmark' => 'Once marked read',          'onmark' => 'Once marked not NEW',
           'toggoff' => 'Off',
           'toggon' => 'On',
         'disa' => 'Posts to be displayed',          'disa' => 'Posts to be displayed',
         'npce' => 'Posts cease to be marked "NEW"',          'npce' => 'Posts cease to be marked "NEW"',
           'epcb' => 'Each post can be toggled read/unread', 
         'chgt' => 'Change',          'chgt' => 'Change',
         'disp' => 'Display',          'disp' => 'Display',
         'nolo' => 'Not new',          'nolo' => 'Not new',
           'togg' => 'Toggle read/unread',
     );      );
   
     my $currdisp = $lt{'allposts'};      my $currdisp = $lt{'allposts'};
     my $currmark = $lt{'onmark'};      my $currmark = $lt{'onmark'};
       my $currtogg = $lt{'toggoff'};
     my $dispchange = $lt{'unread'};      my $dispchange = $lt{'unread'};
     my $markchange = $lt{'ondisp'};      my $markchange = $lt{'ondisp'};
       my $toggchange = $lt{'toggon'};
     my $chglink = '/adm/feedback?modifydisp='.$ressymb;      my $chglink = '/adm/feedback?modifydisp='.$ressymb;
     my $displink = 'onlyunread';      my $displinkA = 'onlyunread';
       my $displinkB = 'onlyunmark';
     my $marklink = 'markondisp';      my $marklink = 'markondisp';
       my $togglink = 'toggon';
   
     if ($markondisp) {      if ($markondisp) {
         $currmark = $lt{'ondisp'};          $currmark = $lt{'ondisp'};
Line 568  sub list_discussion { Line 602  sub list_discussion {
     if ($showonlyunread) {      if ($showonlyunread) {
         $currdisp = $lt{'unread'};          $currdisp = $lt{'unread'};
         $dispchange = $lt{'allposts'};          $dispchange = $lt{'allposts'};
         $displink = 'allposts';          $displinkA = 'allposts';
     }      }
   
       if ($showunmark) {
           $currdisp = $lt{'unmark'};
           $dispchange = $lt{'unmark'};
           $displinkA='allposts';
           $displinkB='onlyunread';
           $showonlyunread = 0;
       }
   
       if ($dischash{$toggkey}) {
           $currtogg = $lt{'toggon'};
           $toggchange = $lt{'toggoff'};
           $togglink = 'toggoff';
       } 
         
     $chglink .= '&changes='.$displink.'_'.$marklink;      $chglink .= '&changes='.$displinkA.'_'.$displinkB.'_'.$marklink.'_'.$togglink;
   
     if ($newpostsflag) {      if ($newpostsflag) {
         $chglink .= '&previous='.$prevread;          $chglink .= '&previous='.$prevread;
Line 595  sub list_discussion { Line 643  sub list_discussion {
    }     }
 </script>  </script>
             |;              |;
     $discussion.='<table bgcolor="#AAAAAA" cellpadding="2" cellspacing="2" border="0">';      $discussion.='<form name="readchoices" method="post" action="/adm/feedback?chgreads='.$symb.'"><table bgcolor="#AAAAAA" cellpadding="2" cellspacing="2" border="0">';
     $discussion .='<tr><td bgcolor="#DDDDBB" colspan="'.$colspan.'">'.      $discussion .='<tr><td bgcolor="#DDDDBB" colspan="'.$colspan.'">'.
  '<table border="0" width="100%" bgcolor="#DDDDBB"><tr>';   '<table border="0" width="100%" bgcolor="#DDDDBB"><tr>';
     if ($visible>2) {      if ($visible>2) {
Line 625  sub list_discussion { Line 673  sub list_discussion {
             $discussion .= '">'.&mt('Export').'?</a>&nbsp;&nbsp;</td>';              $discussion .= '">'.&mt('Export').'?</a>&nbsp;&nbsp;</td>';
     if ($newpostsflag) {      if ($newpostsflag) {
  if (!$markondisp) {   if (!$markondisp) {
     $discussion .='<td align="right"><a href="/adm/feedback?markread='.$ressymb.'">'.&mt('Mark new posts as read').'</a>&nbsp;&nbsp;';      $discussion .='<td align="right"><a href="/adm/feedback?markread='.$ressymb.'">'.&mt('Mark NEW posts no longer new').'</a>&nbsp;&nbsp;';
  } else {   } else {
     $discussion .= '<td>&nbsp;</td>';      $discussion .= '<td>&nbsp;</td>';
  }   }
Line 634  sub list_discussion { Line 682  sub list_discussion {
     }      }
     $discussion .= '</tr></table></td></tr>';      $discussion .= '</tr></table></td></tr>';
  } else {   } else {
     $discussion.='\vskip 0 mm\noindent\makebox[2 cm][b]{\hrulefill}'.      $discussion.='<tex>\vskip 0 mm\noindent\makebox[2 cm][b]{\hrulefill}'.
                          '\textbf{DISCUSSIONS}\makebox[2 cm][b]{\hrulefill}'.                           '\textbf{DISCUSSIONS}\makebox[2 cm][b]{\hrulefill}'.
                          '\vskip 0 mm\noindent\textbf{'.$lt{'cuse'}.'}:\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.'}';                           '\noindent\textbf{'.$lt{'npce'}.'}: \textit{'.$currmark.'}</tex>';
  }   }
         my $numhidden = keys %notshown;          my $numhidden = keys %notshown;
         if ($numhidden > 0) {          if ($numhidden > 0) {
Line 649  sub list_discussion { Line 697  sub list_discussion {
                 $discussion .= '&previous='.$prevread;                  $discussion .= '&previous='.$prevread;
             }              }
             $discussion .= '">'.&mt('Show all posts').'</a> '.&mt('to display').' '.              $discussion .= '">'.&mt('Show all posts').'</a> '.&mt('to display').' '.
                          $numhidden.' '.&mt('previously viewed posts').                           $numhidden.' ';
                          '<br/></td></tr>';              if ($showunmark) {
                   $discussion .= &mt('posts previously marked read');
               } else {
                   $discussion .= &mt('previously viewed posts');
               }
               $discussion .= '<br/></td></tr>';
         }          }
   
 # Choose sort mechanism  # Choose sort mechanism
Line 686  sub list_discussion { Line 739  sub list_discussion {
             unless ( ($notshown{$alldiscussion{$_}} eq '1') || ($shown{$alldiscussion{$_}} == 0) ) {              unless ( ($notshown{$alldiscussion{$_}} eq '1') || ($shown{$alldiscussion{$_}} == 0) ) {
                 if ($outputtarget ne 'tex') {                  if ($outputtarget ne 'tex') {
     $discussion.="\n<tr>";      $discussion.="\n<tr>";
  } else {  
     $discussion.='\vskip 0 mm\noindent\makebox[2 cm][b]{\hrulefill}';  
  }   }
         my $thisdepth=$depth[$alldiscussion{$_}];          my $thisdepth=$depth[$alldiscussion{$_}];
                 if ($outputtarget ne 'tex') {                  if ($outputtarget ne 'tex') {
Line 711  sub list_discussion { Line 762  sub list_discussion {
     $discussionitems[$alldiscussion{$_}]=~s/<\/td><td([^>]*)>/$threadinsert<\/td><td TeXwidth="65 mm" align="left">/;      $discussionitems[$alldiscussion{$_}]=~s/<\/td><td([^>]*)>/$threadinsert<\/td><td TeXwidth="65 mm" align="left">/;
     $discussionitems[$alldiscussion{$_}]=~s/<a([^>]+)>(Edit|Hide|Delete|Reply|Submissions)<\/a>//g;      $discussionitems[$alldiscussion{$_}]=~s/<a([^>]+)>(Edit|Hide|Delete|Reply|Submissions)<\/a>//g;
                     $discussionitems[$alldiscussion{$_}]=~s/(<b>|<\/b>|<\/a>|<a([^>]+)>)//g;                      $discussionitems[$alldiscussion{$_}]=~s/(<b>|<\/b>|<\/a>|<a([^>]+)>)//g;
       
                     #FIXME xmlparse can't be safely called from inside xmlparse      $discussionitems[$alldiscussion{$_}]='<tex>\vskip 0 mm\noindent\makebox[2 cm][b]{\hrulefill}</tex>'.$discussionitems[$alldiscussion{$_}];
                     #   due to the global variables that are use, the safe      $discussion.=$discussionitems[$alldiscussion{$_}];
                     #   space etc. I expect this has unforseen issues that  
                     #   need resolving.  
       
                     $discussion.=&Apache::lonxml::xmlparse('','tex',$discussionitems[$alldiscussion{$_}]);  
  }   }
     }      }
         }          }
  if ($outputtarget ne 'tex') {   if ($outputtarget ne 'tex') {
             my $colspan=$maxdepth+1;              my $colspan=$maxdepth+1;
             $discussion .= <<END;               $discussion .= <<END;
             <tr bgcolor="#FFFFFF">              <tr bgcolor="#FFFFFF">
              <td colspan="$colspan" valign="top">               <td colspan="$colspan" valign="top">
               <table border="0" bgcolor="#FFFFFF" width="100%" cellspacing="2" cellpadding="2">                <table border="0" bgcolor="#FFFFFF" width="100%" cellspacing="2" cellpadding="2">
Line 734  sub list_discussion { Line 781  sub list_discussion {
                    <td>                     <td>
                     <font size="-1"><b>$lt{'cuse'}</b>:</td>                      <font size="-1"><b>$lt{'cuse'}</b>:</td>
                    <td>&nbsp;</td>                     <td>&nbsp;</td>
                      <td><font size="-1">
 END  END
             if ($newpostsflag) {              if ($newpostsflag) {
                 $discussion .=                   $discussion .= 
                    '<td><font size="-1">1.&nbsp;'.$lt{'disp'}.'&nbsp;-&nbsp;<i>'.$currdisp.'</i>&nbsp;&nbsp;2.&nbsp;'.$lt{'nolo'}.'&nbsp;-&nbsp;<i>'.$currmark.'</i></font></td>';                     '1.&nbsp;'.$lt{'disp'}.'&nbsp;-&nbsp;<i>'.$currdisp.'</i>&nbsp;&nbsp;2.&nbsp;'.$lt{'nolo'}.'&nbsp;-&nbsp;<i>'.$currmark.'</i>';
                   if ($dischash{$toggkey}) {
                      $discussion .= '&nbsp;&nbsp;3.&nbsp;'.$lt{'togg'}.'&nbsp;-&nbsp;<i>'.$currtogg.'</i>';
                   }
             } else {              } else {
                 $discussion .=                  if ($dischash{$toggkey}) {
                    '<td><font size="-1">'.$lt{'disp'}.'&nbsp;-&nbsp;<i>'.$currdisp.'</i></font></td>';                     $discussion .= '1.&nbsp;'.$lt{'disp'}.'&nbsp;-&nbsp;<i>'.$currdisp.'</i>&nbsp;2.&nbsp;'.$lt{'togg'}.'&nbsp;-&nbsp;<i>'.$currtogg.'</i>';
                   } else {
                       $discussion .=
                            $lt{'disp'}.'&nbsp;-&nbsp;<i>'.$currdisp.'</i>';
                   }
             }              }
             $discussion .= <<END;              $discussion .= <<END;
                      </font></td>
                    <td>&nbsp;</td>                     <td>&nbsp;</td>
                    <td>                     <td>
                     <font size="-1"><b><a href="$chglink">$lt{'chgt'}</a>?</font></b></td>                      <font size="-1"><b><a href="$chglink">$lt{'chgt'}</a>?</font></b>
                      </td>
                   </tr>                    </tr>
                  </table>                   </table>
                 </td>                  </td>
   END
               if ($dischash{$toggkey}) {
                   my $storebutton = &mt('Store read/unread changes');
                   $discussion.='<td align="right">'.
                 '<input type="hidden" name="discsymb" value="'.$ressymb.'">'."\n".
                 '<input type="button" name="readoptions" value="'.$storebutton.'"'.
                 ' onClick="this.form.submit();">'."\n".
                 '</td>';
               }
               $discussion .= (<<END);
                </tr>                 </tr>
               </table>                </table>
              </td>               </td>
             </tr>              </tr>
            </table>             </table>
            <br /><br />             <br /><br /></form>
 END  END
  }          } 
     }      }
     if ($discussiononly) {      if ($discussiononly) {
         my $now = time;          my $now = time;
Line 828  ENDDISCUSS Line 895  ENDDISCUSS
     }      }
  }   }
     }      }
    return $discussion;      return $discussion;
 }  }
   
 sub mail_screen {  sub mail_screen {
Line 852  sub mail_screen { Line 919  sub mail_screen {
   my @currnewattach = ();    my @currnewattach = ();
   my @currdelold = ();    my @currdelold = ();
   my @keepold = ();    my @keepold = ();
   my @attachments = ();    my %attachments = ();
   my %currattach = ();    my %currattach = ();
   my $attachnum = 0;    my $attachnum = 0;
   my $anonchk = (<<END);    my $anonchk = (<<END);
Line 898  END Line 965  END
    $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},     $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
    $ENV{'course.'.$ENV{'request.course.id'}.'.num'});     $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
       unless (($contrib{'hidden'}=~/\.$idx\./) || ($contrib{'deleted'}=~/\.$idx\./)) {        unless (($contrib{'hidden'}=~/\.$idx\./) || ($contrib{'deleted'}=~/\.$idx\./)) {
             if ($contrib{$idx.':history'}) {
                 if ($contrib{$idx.':history'} =~ /:/) {
                     my @oldversions = split/:/,$contrib{$idx.':history'};
                     $numoldver = @oldversions;
                 } else {
                     $numoldver = 1;
                 }
             }
           if ($ENV{'form.replydisc'}) {            if ($ENV{'form.replydisc'}) {
               if ($contrib{$idx.':history'}) {                if ($contrib{$idx.':history'}) {
                   if ($contrib{$idx.':history'} =~ /:/) {                    if ($contrib{$idx.':history'} =~ /:/) {
Line 909  END Line 984  END
               }                }
               my $message;                my $message;
               if ($idx > 0) {                if ($idx > 0) {
                   if ($contrib{$idx.':message'} =~ /::::\Q$numoldver\E::::(.+?)$/si) {                    if ($contrib{$idx.':message'} =~ /^<version num="0"/) {
                       $message = $1;                        my %versions = ();
                         &get_post_versions(\%versions,$contrib{$idx.':message'},$numoldver);
                         $message = &HTML::Entities::decode($versions{$numoldver});
                   } else {                    } else {
                       $message = $contrib{$idx.':message'};                        $message = $contrib{$idx.':message'};
                   }                    }
Line 920  END Line 997  END
       $message=~s/\n/\<br \/\>/g;        $message=~s/\n/\<br \/\>/g;
       $quote='<blockquote>'.&Apache::lontexconvert::msgtexconverted($message).'</blockquote>';        $quote='<blockquote>'.&Apache::lontexconvert::msgtexconverted($message).'</blockquote>';
               if ($idx > 0) {                if ($idx > 0) {
                   if ($contrib{$idx.':subject'} =~ /::::\Q$numoldver\E::::(.+?)$/si) {                    if ($contrib{$idx.':subject'} =~ /^<version num="0"/) {
                       $subject = $1;                        my %versions = ();
                         &get_post_versions(\%versions,$contrib{$idx.':subject'},$numoldver);
                         $subject = &HTML::Entities::decode($versions{$numoldver});
                   } else {                    } else {
                       $subject = $contrib{$idx.':subject'};                        $subject = $contrib{$idx.':subject'};
                   }                    }
Line 930  END Line 1009  END
               $subject = &HTML::Entities::encode($subject,'<>&"');                $subject = &HTML::Entities::encode($subject,'<>&"');
           } else {            } else {
               $attachmenturls = $contrib{$idx.':attachmenturl'};                $attachmenturls = $contrib{$idx.':attachmenturl'};
               if ($contrib{$idx.':message'} =~ /.*::::(\d+)::::(.*?)$/si) {                if ($contrib{$idx.':message'} =~ /^<version num="0">/) {
                   $numoldver = $1;                    my %versions = ();
                   $comment = $2;                    &get_post_versions(\%versions,$contrib{$idx.':message'},$numoldver);
                     $comment = $versions{$numoldver};
               } else {                } else {
                   $comment = $contrib{$idx.':message'};                    $comment = &HTML::Entities::encode($contrib{$idx.':message'},'<>&"');
               }                }
               $comment = &HTML::Entities::encode($comment,'<>&"');                if ($contrib{$idx.':subject'} =~ /<version num="0">/) {
               if ($contrib{$idx.':subject'} =~ /.*::::\d+::::(.+?)$/si) {                    my %versions = ();
                   $subject = $1;                    &get_post_versions(\%versions,$contrib{$idx.':subject'},$numoldver);
                     $subject = $versions{$numoldver}; 
               } else {                } else {
                   $subject = $contrib{$idx.':subject'};                    $subject = &HTML::Entities::encode($contrib{$idx.':subject'},'<>&"');
               }                }
               $subject = &HTML::Entities::encode($subject,'<>&"');  
               if (defined($contrib{$idx.':replyto'})) {                if (defined($contrib{$idx.':replyto'})) {
                   $parentmsg = $contrib{$idx.':replyto'};                    $parentmsg = $contrib{$idx.':replyto'};
               }                }
Line 1077  END Line 1157  END
         }          }
         if ($ENV{'form.editdisc'}) {          if ($ENV{'form.editdisc'}) {
             if ($attachmenturls) {              if ($attachmenturls) {
                 &extract_attachments($attachmenturls,$idx,$numoldver,\$attachmsg,\@attachments,\%currattach,\@currdelold);                  &extract_attachments($attachmenturls,$idx,$numoldver,\$attachmsg,\%attachments,\%currattach,\@currdelold);
                 $attachnum = scalar(keys %currattach);                  $attachnum = scalar(keys %currattach);
                 foreach (keys %currattach) {                  foreach (keys %currattach) {
                     $r->print('<input type="hidden" name="keepold" value="'.$_.'" />'."\n");                      $r->print('<input type="hidden" name="keepold" value="'.$_.'" />'."\n");
Line 1137  END Line 1217  END
 }  }
   
 sub print_display_options {  sub print_display_options {
     my ($r,$symb,$previous,$dispchg,$markchg,$feedurl) = @_;      my ($r,$symb,$previous,$dispchgA,$dispchgB,$markchg,$toggchg,$feedurl) = @_;
  # backward compatibility (bulletin boards used to be 'wrapped')   # backward compatibility (bulletin boards used to be 'wrapped')
     if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {      if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
         $feedurl=~s|^/adm/wrapper||;          $feedurl=~s|^/adm/wrapper||;
Line 1157  sub print_display_options { Line 1237  sub print_display_options {
         'deff' => 'Default for all discussions',          'deff' => 'Default for all discussions',
         'prca' => 'Preferences can be set for this discussion that determine ....',          'prca' => 'Preferences can be set for this discussion that determine ....',
         'whpo' => 'Which posts are displayed when you display this bulletin board or resource, and',          'whpo' => 'Which posts are displayed when you display this bulletin board or resource, and',
         'unwh' => 'Under what circumstances posts are identfied as "New."',          'unwh' => 'Under what circumstances posts are identified as "NEW", and',
           'wipa' => 'Whether individual posts can be marked as read/unread',
         'allposts' => 'All posts',          'allposts' => 'All posts',
         'unread' => 'New posts only',          'unread' => 'New posts only',
           'unmark' => 'Posts not marked read',
         'ondisp' => 'Once displayed',          'ondisp' => 'Once displayed',
         'onmark' => 'Once marked as read',          'onmark' => 'Once marked not NEW ',
           'toggon' => 'Shown',
           'toggoff' => 'Not shown',
         'disa' => 'Posts displayed?',          'disa' => 'Posts displayed?',
         'npmr' => 'New posts cease to be identified as "New"?',          'npmr' => 'New posts cease to be identified as "NEW"?',
           'dotm' => 'Option to mark each post as read/unread?',  
         'chgt' => 'Change to ',          'chgt' => 'Change to ',
         'mkdf' => 'Set to ',          'mkdf' => 'Set to ',
         'yhni' => 'You have not indicated that you wish to change either 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 $dispchange = $lt{'unread'};      my $dispchangeA = $lt{'unread'};
       my $dispchangeB = $lt{'unmark'};
     my $markchange = $lt{'ondisp'};      my $markchange = $lt{'ondisp'};
       my $toggchange = $lt{'toggon'};
     my $currdisp = $lt{'allposts'};      my $currdisp = $lt{'allposts'};
     my $currmark = $lt{'onmark'};      my $currmark = $lt{'onmark'};
     my $discdisp = 'allposts';      my $discdisp = 'allposts';
     my $discmark = 'onmark';      my $discmark = 'onmark';
       my $currtogg = $lt{'toggoff'};
       my $disctogg = 'toggoff';
                                                                                                                                                                               
     if ($dispchg eq 'allposts') {      if ($dispchgA eq 'allposts') {
         $dispchange = $lt{'allposts'};          $dispchangeA = $lt{'allposts'};
         $currdisp = $lt{'unread'};          $currdisp = $lt{'unread'};
         $discdisp = 'unread';          $discdisp = 'unread';
     }      }
                                                                                         
     if ($markchg eq 'markonread') {      if ($markchg eq 'markonread') {
         $markchange = $lt{'onmark'};          $markchange = $lt{'onmark'};
         $currmark = $lt{'ondisp'};          $currmark = $lt{'ondisp'};
         $discmark = 'ondisp';          $discmark = 'ondisp';
     }      }
   
       if ($dispchgB eq 'onlyunread') {
           $dispchangeB = $lt{'unread'};
           $currdisp = $lt{'unmark'};
           $discdisp = 'unmark';
       }
       if ($toggchg eq 'toggoff') {
           $toggchange = $lt{'toggoff'};
           $currtogg = $lt{'toggon'};
           $disctogg = 'toggon';
       }
     $r->print(<<END);      $r->print(<<END);
 <html>  <html>
 <head>  <head>
 <title>$lt{'dido'}</title>  <title>$lt{'dido'}</title>
 <meta http-equiv="pragma" content="no-cache" />  <meta http-equiv="pragma" content="no-cache" />
 <script>  <script>
   function discdispChk(caller) {
       var disctogg = '$toggchg'
       if (caller == 0) {
           if (document.modifydisp.discdisp[0].checked == true) {
               if (document.modifydisp.discdisp[1].checked == true) {
                   document.modifydisp.discdisp[1].checked = false
               }
           }
       }
       if (caller == 1) {
           if (document.modifydisp.discdisp[1].checked == true) {
               if (document.modifydisp.discdisp[0].checked == true) {
                   document.modifydisp.discdisp[0].checked = false
               }
               if (disctogg == 'toggon') {
                   document.modifydisp.disctogg.checked = true
               }
               if (disctogg == 'toggoff') {
                   document.modifydisp.disctogg.checked = false
               }
           }
       }
       if (caller == 2) {
           var dispchgB = '$dispchgB'
           if (disctogg == 'toggoff') {
               if (document.modifydisp.disctogg.checked == true) {
                   if (dispchgB == 'onlyunmark') {
                       document.modifydisp.discdisp[1].checked = false
                   }
               }
           }
       }  
   }
   
 function setDisp() {  function setDisp() {
     var prev = "$previous"      var prev = "$previous"
     var chktotal = 0      var chktotal = 0
     if (document.modifydisp.discdisp.checked == true) {      if (document.modifydisp.discdisp[0].checked == true) {
         document.modifydisp.$dispchg.value = "$symb"          document.modifydisp.$dispchgA.value = "$symb"
           chktotal ++
       }
       if (document.modifydisp.discdisp[1].checked == true) {
           document.modifydisp.$dispchgB.value = "$symb"
         chktotal ++          chktotal ++
     }      }
     if (document.modifydisp.discmark.checked == true) {      if (document.modifydisp.discmark.checked == true) {
         document.modifydisp.$markchg.value = "$symb"          document.modifydisp.$markchg.value = "$symb"
         chktotal ++          chktotal ++
     }      }
       if (document.modifydisp.disctogg.checked == true) {
           document.modifydisp.$toggchg.value = "$symb"
           chktotal ++
       }
     if (chktotal > 0) {       if (chktotal > 0) { 
         document.modifydisp.submit()          document.modifydisp.submit()
     } else {      } else {
Line 1221  function setDisp() { Line 1363  function setDisp() {
 </head>  </head>
 $bodytag  $bodytag
 <form name="modifydisp" method="post" action="/adm/feedback">  <form name="modifydisp" method="post" action="/adm/feedback">
 $lt{'sdpf'}<br/> $lt{'prca'}  <ol><li>$lt{'whpo'}</li><li>$lt{'unwh'}</li></ol>  $lt{'sdpf'}<br/> $lt{'prca'}  <ol><li>$lt{'whpo'}</li><li>$lt{'unwh'}</li><li>$lt{'wipa'}</li></ol>
 <br />  <br />
 <table border="0" cellpadding="0" cellspacing="0">  <table border="0" cellpadding="0" cellspacing="0">
  <tr>   <tr>
Line 1238  $lt{'sdpf'}<br/> $lt{'prca'}  <ol><li>$l Line 1380  $lt{'sdpf'}<br/> $lt{'prca'}  <ol><li>$l
        <tr bgcolor="#dddddd">         <tr bgcolor="#dddddd">
        <td>$lt{'disa'}</td>         <td>$lt{'disa'}</td>
        <td>$lt{$discdisp}</td>         <td>$lt{$discdisp}</td>
        <td><input type="checkbox" name="discdisp" />&nbsp;$lt{'chgt'} "$dispchange"</td>         <td><input type="checkbox" name="discdisp" onClick="discdispChk('0')" />&nbsp;$lt{'chgt'} "$dispchangeA"
              <br />
              <input type="checkbox" name="discdisp" onClick="discdispChk('1')" />&nbsp;$lt{'chgt'} "$dispchangeB"
          </td>
       </tr><tr bgcolor="#eeeeee">        </tr><tr bgcolor="#eeeeee">
        <td>$lt{'npmr'}</td>         <td>$lt{'npmr'}</td>
        <td>$lt{$discmark}</td>         <td>$lt{$discmark}</td>
        <td><input type="checkbox" name="discmark" />$lt{'chgt'} "$markchange"</td>         <td><input type="checkbox" name="discmark" />$lt{'chgt'} "$markchange"</td>
         </tr><tr bgcolor="#dddddd">
          <td>$lt{'dotm'}</td>
          <td>$lt{$disctogg}</td>
          <td><input type="checkbox" name="disctogg" onClick="discdispChk('2')" />$lt{'chgt'} "$toggchange"</td>
       </tr>        </tr>
      </table>       </table>
     </td>      </td>
Line 1254  $lt{'sdpf'}<br/> $lt{'prca'}  <ol><li>$l Line 1403  $lt{'sdpf'}<br/> $lt{'prca'}  <ol><li>$l
 <br />  <br />
 <br />  <br />
 <input type="hidden" name="previous" value="$previous" />  <input type="hidden" name="previous" value="$previous" />
 <input type="hidden" name="$dispchg" value=""/>  <input type="hidden" name="$dispchgA" value=""/>
   <input type="hidden" name="$dispchgB" value=""/>
 <input type="hidden" name="$markchg" value=""/>  <input type="hidden" name="$markchg" value=""/>
   <input type="hidden" name="$toggchg" value="" />
 <input type="button" name="sub" value="Store Changes" onClick="javascript:setDisp()" />  <input type="button" name="sub" value="Store Changes" onClick="javascript:setDisp()" />
 <br />  <br />
 <br />  <br />
Line 1513  END Line 1664  END
 END  END
 }  }
   
 sub fail_redirect {  sub get_post_versions {
       my ($versions,$incoming,$numver) = @_;
       my $p = HTML::LCParser->new(\$incoming);
       my $done = 0;                                                                       
       while ( (my $token = $p->get_tag("version")) && (!$done)) {
           my $num = $token->[1]{num};
           my $text = $p->get_text("/version");
           if (defined($numver)) {
               if ($num == $numver) {
                   $$versions{$numver}=$text;
                   $done = 1;
               }
           } else {
               $$versions{$num}=$text;
           }
       }
       return;
   }
   
   sub get_post_attachments {
       my ($attachments,$attachmenturls) = @_;
       my $num;
       my $p = HTML::LCParser->new(\$attachmenturls);
       while (my $token = $p->get_tag("attachment","filename","post"))  {
           if ($token->[0] eq "attachment") {
               $num = $token->[1]{id};
               %{$$attachments{$num}} =();
           } elsif ($token->[0] eq "filename") {
               $$attachments{$num}{'filename'} = $p->get_text("/filename");
           } elsif ($token->[0] eq "post") {
               my $id = $token->[1]{id};
               $$attachments{$num}{$id} = $p->get_text("/post");
           }
       }
       return;
   }
   
   sub fail_redirect {;
   my ($r,$feedurl) = @_;    my ($r,$feedurl) = @_;
   if ($feedurl=~/^\/adm\//) { $feedurl.='?register=1' };    if ($feedurl=~/^\/adm\//) { $feedurl.='?register=1' };
   $r->print (<<ENDFAILREDIR);    $r->print (<<ENDFAILREDIR);
Line 1856  sub adddiscuss { Line 2044  sub adddiscuss {
             $contrib{'history'} = '';              $contrib{'history'} = '';
             my $numoldver = 0;              my $numoldver = 0;
             my ($oldsymb,$oldidx)=split(/\:\:\:/,$ENV{'form.editdisc'});              my ($oldsymb,$oldidx)=split(/\:\:\:/,$ENV{'form.editdisc'});
               $oldsymb=~s|(bulletin___\d+___)adm/wrapper/|$1|;
 # get timestamp for last post and history  # get timestamp for last post and history
             my %oldcontrib=&Apache::lonnet::restore($oldsymb,$ENV{'request.course.id'},              my %oldcontrib=&Apache::lonnet::restore($oldsymb,$ENV{'request.course.id'},
                      $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},                       $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
Line 1874  sub adddiscuss { Line 2063  sub adddiscuss {
             }              }
             my $numnewver = $numoldver + 1;              my $numnewver = $numoldver + 1;
             if (defined($oldcontrib{$oldidx.':subject'})) {              if (defined($oldcontrib{$oldidx.':subject'})) {
                 if ($oldcontrib{$oldidx.':subject'} =~ /::::\d+::::/) {                  if ($oldcontrib{$oldidx.':subject'} =~ /^<version num="0">/) {
                     $contrib{'subject'} = $oldcontrib{$oldidx.':subject'}.'::::'.$numnewver.'::::'.$contrib{'subject'};                      $contrib{'subject'} = '<version num="'.$numnewver.'">'.&HTML::Entities::encode($contrib{'subject'},'<>&"').'</version>';
                       $contrib{'subject'} = $oldcontrib{$oldidx.':subject'}.$contrib{'subject'};
                 } else {                  } else {
                      $contrib{'subject'} = '::::0::::'.$oldcontrib{$oldidx.':subject'}.'::::1::::'.$contrib{'subject'};                      $contrib{'subject'} = '<version num="0">'.&HTML::Entities::encode($oldcontrib{$oldidx.':subject'},'<>&"').'</version><version num="1">'.&HTML::Entities::encode($contrib{'subject'},'<>&"').'</version>';
                 }                  }
             }               } 
             if (defined($oldcontrib{$oldidx.':message'})) {              if (defined($oldcontrib{$oldidx.':message'})) {
                 if ($oldcontrib{$oldidx.':message'} =~ /::::\d+::::/) {                  if ($oldcontrib{$oldidx.':message'} =~ /^<version num="0">/) {
                     $contrib{'message'} = $oldcontrib{$oldidx.':message'}.'::::'.$numnewver.'::::'.$contrib{'message'};                      $contrib{'message'} = '<version num="'.$numnewver.'">'.&HTML::Entities::encode($contrib{'message'},'<>&"').'</version>';
                       $contrib{'message'} = $oldcontrib{$oldidx.':message'}.$contrib{'message'};
                 } else {                  } else {
                     $contrib{'message'} = '::::0::::'.$oldcontrib{$oldidx.':message'}.'::::1::::'.$contrib{'message'};                      $contrib{'message'} = '<version num="0">'.&HTML::Entities::encode($oldcontrib{$oldidx.':message'},'<>&"').'</version><version num="1">'.&HTML::Entities::encode($contrib{'message'},'<>&"').'</version>';
                 }                  }
             }              }
             $contrib{'history'} .= $oldcontrib{$oldidx.':timestamp'};              $contrib{'history'} .= $oldcontrib{$oldidx.':timestamp'};
Line 1962  sub modify_attachments { Line 2153  sub modify_attachments {
     my $bodytag=&Apache::loncommon::bodytag('Discussion Post Attachments',      my $bodytag=&Apache::loncommon::bodytag('Discussion Post Attachments',
                                           '','');                                            '','');
     my $msg = '';      my $msg = '';
     my @attachments = ();      my %attachments = ();
     my %currattach = ();      my %currattach = ();
     if ($idx) {      if ($idx) {
         &extract_attachments($attachmenturls,$idx,$numoldver,\$msg,\@attachments,\%currattach,$currdelold);          &extract_attachments($attachmenturls,$idx,$numoldver,\$msg,\%attachments,\%currattach,$currdelold);
     }      }
     $r->print(<<END);      $r->print(<<END);
 <html>  <html>
Line 1990  END Line 2181  END
             my @currold = keys %currattach;              my @currold = keys %currattach;
             if (@currold > 0) {              if (@currold > 0) {
                 $r->print("The following attachments were part of the most recent saved version of this posting.<br />Check the checkboxes for any you wish to remove<br />\n");                    $r->print("The following attachments were part of the most recent saved version of this posting.<br />Check the checkboxes for any you wish to remove<br />\n");  
                 foreach (@currold) {                  foreach my $id (@currold) {
                     my $id = $_;                      my $attachurl = &HTML::Entities::decode($attachments{$id}{'filename'}); 
                     $attachments[$id] =~ m#/([^/]+)$#;                      $attachurl =~ m#/([^/]+)$#;
                     $r->print('<input type="checkbox" name="deloldattach" value="'.$_.'" />&nbsp;'.$1.'<br />'."\n");                      $r->print('<input type="checkbox" name="deloldattach" value="'.$id.'" />&nbsp;'.$1.'<br />'."\n");
                 }                  }
                 $r->print("<br />");                  $r->print("<br />");
             }              }
Line 2126  ENDATTACH Line 2317  ENDATTACH
   
 sub extract_attachments {  sub extract_attachments {
     my ($attachmenturls,$idx,$numoldver,$message,$attachments,$currattach,$currdelold) = @_;      my ($attachmenturls,$idx,$numoldver,$message,$attachments,$currattach,$currdelold) = @_;
     if ($attachmenturls =~ m/::::\d+:[\.yn\d]+::::/) {      if ($attachmenturls =~ m/^<attachment id="0">/) {
         @{$attachments} = split/::::\d+:[\.yn\d]+::::/,$attachmenturls;          &get_post_attachments($attachments,$attachmenturls);
         shift @{$attachments};          foreach my $id (sort keys %{$attachments}) {
         my $searchstr = '::::';              if (exists($$attachments{$id}{$numoldver})) {
         for (my $i=0; $i<@{$attachments}; $i++) {                  if (defined($currdelold)) {
             if ($attachmenturls =~ m#^\Q$searchstr\E(\d+)(:[\.yn\d]+)::::#) {                      if (@{$currdelold} > 0) {
                 my $info = $1.$2;                          unless (grep/^$id$/,@{$currdelold}) {
                 my $attachid = $1-1;                              $$currattach{$id} = $$attachments{$id}{$numoldver}; 
                 $searchstr .= $info.'::::'.$$attachments[$i].'::::';  
                 if ($info =~ /\.$numoldver([yn])\./) {  
                     if (defined($currdelold)) {  
                         if (@{$currdelold} > 0) {  
                             unless (grep/^$attachid$/,@{$currdelold}) {  
                                 my $id = $i;  
                                 $$currattach{$id} = $1;  
                             }  
                         } else {  
                             my $id = $i;  
                             $$currattach{$id} = $1;  
                         }                          }
                     } else {                      } else {
                         my $id = $i;                          $$currattach{$id} = $$attachments{$id}{$numoldver};
                         $$currattach{$id} = $1;  
                     }                      }
                   } else {
                       $$currattach{$id} = $$attachments{$id}{$numoldver};
                 }                  }
             }              }
         }          }
         my @attached = (sort { $a <=> $b } keys %{$currattach});          my @attached = (sort { $a <=> $b } keys %{$currattach});
         if (@attached == 1) {          if (@attached == 1) {
             my $id = $attached[0];              my $id = $attached[0];
             $$attachments[$attached[0]]=~m|/([^/]+)$|;              my $attachurl = &HTML::Entities::decode($$attachments{$id}{'filename'});
             $$message.='<br /><a href="'.$$attachments[$id].'"><tt>'.              $attachurl=~m|/([^/]+)$|;
               $$message.='<br /><a href="'.$attachurl.'"><tt>'.
             $1.'</tt></a><br />';              $1.'</tt></a><br />';
             &Apache::lonnet::allowuploaded('/adm/feedback',              &Apache::lonnet::allowuploaded('/adm/feedback',
                                    $$attachments[$id]);                                     $attachurl);
         } elsif (@attached > 1) {          } elsif (@attached > 1) {
             $$message.='<ol>';              $$message.='<ol>';
             foreach (@attached) {              foreach (@attached) {
                 my $id = $_;                  my $id = $_;
                   my $attachurl = &HTML::Entities::decode($$attachments{$id}{'filename'});
                 my ($fname)                  my ($fname)
                   =($$attachments[$id]=~m|/([^/]+)$|);                    =($attachurl=~m|/([^/]+)$|);
                 $$message .= '<li><a href="'.$$attachments[$id].                  $$message .= '<li><a href="'.$attachurl.
                   '"><tt>'.                    '"><tt>'.
                   $fname.'</tt></a></li>';                    $fname.'</tt></a></li>';
                 &Apache::lonnet::allowuploaded('/adm/feedback',                  &Apache::lonnet::allowuploaded('/adm/feedback',
                                  $$attachments[$id]);                                   $attachurl);
             }              }
             $$message .= '</ol><br />';              $$message .= '</ol><br />';
         }          }
Line 2182  sub extract_attachments { Line 2365  sub extract_attachments {
            ': <a href="'.$attachmenturls.             ': <a href="'.$attachmenturls.
            '"><tt>'.             '"><tt>'.
            $fname.'</tt></a></p>';             $fname.'</tt></a></p>';
            $$attachments[0] = $attachmenturls;             $$attachments{0} = $attachmenturls;
            $$currattach{'0'} = 'n';             $$currattach{'0'} = 'n';
            &Apache::lonnet::allowuploaded('/adm/feedback',             &Apache::lonnet::allowuploaded('/adm/feedback',
                              $attachmenturls);                               $attachmenturls);
Line 2193  sub construct_attachmenturl { Line 2376  sub construct_attachmenturl {
     my ($currnewattach,$keepold,$symb,$idx)=@_;      my ($currnewattach,$keepold,$symb,$idx)=@_;
     my $oldattachmenturl;      my $oldattachmenturl;
     my $newattachmenturl;      my $newattachmenturl;
     my $startnum = 1;      my $startnum = 0;
     my $currver = 0;      my $currver = 0;
     if (($ENV{'form.editdisc'}) && ($idx)) {      if (($ENV{'form.editdisc'}) && ($idx)) {
         my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},          my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},
Line 2211  sub construct_attachmenturl { Line 2394  sub construct_attachmenturl {
             $currver = 1;              $currver = 1;
         }          }
         if ($oldattachmenturl) {          if ($oldattachmenturl) {
             if ($oldattachmenturl =~ m/::::\d+:[\.yn\d]+::::/) {              if ($oldattachmenturl =~ m/^<attachment id="0">/) {
                 my @attachments = split/::::\d+:[\.yn\d]+::::/,$oldattachmenturl;                  my %attachments = ();
                 shift @attachments;                  my $prevver = $currver-1;
                 $startnum += @attachments;                  &get_post_attachments(\%attachments,$oldattachmenturl);
                 my $searchstr = '::::';                  my $numattach = keys %attachments;
                 $newattachmenturl = '::::';                  $startnum += $numattach;
                 for (my $i=0; $i<@attachments; $i++) {                  foreach my $num (sort {$a <=> $b} keys %attachments) {
                     if ($oldattachmenturl =~ m#^\Q$searchstr\E(\d+)(:[\.yn\d]+)::::#) {                      $newattachmenturl .= '<attachment id="'.$num.'"><filename>'.$attachments{$num}{'filename'}.'</filename>';
                         my $attachid = $1 - 1;                      foreach (sort {$a <=> $b} keys %{$attachments{$num}}) { 
                         $searchstr .= $1.$2.'::::'.$attachments[$i].'::::';                          $newattachmenturl .= '<post id="'.$_.'">'.$attachments{$num}{$_}.'</post>';
                         $newattachmenturl .= $1.$2;  
                         if (grep/^$attachid$/,@{$keepold}) {  
                             $newattachmenturl .= '.'.$currver.'n.';  
                         }  
                         $newattachmenturl .= '::::'.$attachments[$i].'::::';  
                     }                      }
                       if (grep/^$num$/,@{$keepold}) {
                           $newattachmenturl .= '<post id="'.$currver.'">'.$attachments{$num}{$prevver}.'</post>';
                       }
                       $newattachmenturl .= '</attachment>';
                 }                  }
                 $newattachmenturl =~ s/::::$//;  
             } else {              } else {
                 $newattachmenturl = '::::1:.0n.';                  $newattachmenturl = '<attachment id="0"><filename>'.&HTML::Entities::encode($oldattachmenturl).'<post id="0">n</post>';
                 unless (grep/^0$/,@{$keepold}) {                  unless (grep/^0$/,@{$keepold}) {
                     $newattachmenturl .= '.1n.';                      $newattachmenturl .= '<post id="1">n</post>';
                 }                  }
                 $newattachmenturl .= '::::'.$oldattachmenturl;                  $newattachmenturl .= '</attachment>';
                 $startnum ++;                  $startnum ++;
             }              }
         }          }
     }      }
     for (my $i=0; $i<@{$currnewattach}; $i++) {      for (my $i=0; $i<@{$currnewattach}; $i++) {
         my $attachnum = $startnum + $i;          my $attachnum = $startnum + $i;
         $newattachmenturl .= '::::'.$attachnum.':.'.$currver.'n.::::'.$$currnewattach[$i];          $newattachmenturl .= '<attachment id="'.$attachnum.'"><filename>'.&HTML::Entities::encode($$currnewattach[$i]).'</filename><post id="'.$currver.'">n</post></attachment>';
     }      }
     return $newattachmenturl;       return $newattachmenturl; 
 }  }
Line 2257  sub handler { Line 2438  sub handler {
 # --------------------------- Get query string for limited number of parameters  # --------------------------- Get query string for limited number of parameters
   
   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},    &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
          ['hide','unhide','deldisc','postdata','preview','replydisc','editdisc','threadedon','threadedoff','onlyunread','allposts','previous','markread','markonread','markondisp','modifydisp','changes','navmaps','navurl','sortfilter','sortposts','applysort','rolefilter','statusfilter','sectionpick','posterlist','userpick','attach','origpage','currnewattach','deloldattach','keepold','allversions']);           ['hide','unhide','deldisc','postdata','preview','replydisc','editdisc','threadedon','threadedoff','onlyunread','allposts','onlyunmark','previous','markread','markonread','markondisp','toggoff','toggon','modifydisp','changes','navmaps','navurl','sortfilter','sortposts','applysort','rolefilter','statusfilter','sectionpick','posterlist','userpick','attach','origpage','currnewattach','deloldattach','keepold','allversions']);
     if ($ENV{'form.discsymb'}) {
         my $symb = $ENV{'form.discsymb'};
         my $readkey = $symb.'_read';
         my %readinghash = ();
         my $chgcount = 0;
         %readinghash = &Apache::lonnet::get('nohist_'.$ENV{'request.course.id'}.'_discuss',[$readkey],$ENV{'user.domain'},$ENV{'user.name'});
         foreach my $key (keys %ENV) {
             if ($key =~ m/^form\.postunread_(\d+)/) {
                 if ($readinghash{$readkey} =~ /\.$1\./) {
                     $readinghash{$readkey} =~ s/\.$1\.//;
                     $chgcount ++;
                 }
             } elsif ($key =~ m/^form\.postread_(\d+)/) {
                 unless ($readinghash{$readkey} =~ /\.$1\./) {
                     $readinghash{$readkey} .= '.'.$1.'.';
                     $chgcount ++;
                 }
             }
         }
         if ($chgcount > 0) {
             &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%readinghash,$ENV{'user.domain'},$ENV{'user.name'});
         }
         &Apache::loncommon::content_type($r,'text/html');
         $r->send_http_header;
         my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
         my $previous=$ENV{'form.previous'};
         my $feedurl = &Apache::lonnet::clutter($url);
         &redirect_back($r,$feedurl,&mt('Marked postings read/unread').'<br />','0','0','',$previous,'','','',);
         return OK;
     }
   if ($ENV{'form.allversions'}) {    if ($ENV{'form.allversions'}) {
       &Apache::loncommon::content_type($r,'text/html');        &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;        $r->send_http_header;
Line 2289  END Line 2500  END
           if ($contrib{$idx.':history'}) {            if ($contrib{$idx.':history'}) {
               my $attachmenturls = $contrib{$idx.':attachmenturl'};                my $attachmenturls = $contrib{$idx.':attachmenturl'};
               my @postversions = ();                my @postversions = ();
                 my %messages = ();
                 my %subjects = ();
               if ($contrib{$idx.':history'} =~ m/:/) {                if ($contrib{$idx.':history'} =~ m/:/) {
                   @postversions = split/:/,$contrib{$idx.':history'};                    @postversions = split/:/,$contrib{$idx.':history'};
               } else {                } else {
                   @postversions = ("$contrib{$idx.':history'}");                    @postversions = ("$contrib{$idx.':history'}");
               }                }
               if (@postversions > 0) {                if (@postversions > 0) {
                     &get_post_versions(\%messages,$contrib{$idx.':message'});
                     &get_post_versions(\%subjects,$contrib{$idx.':subject'});
                   push @postversions,$contrib{$idx.':timestamp'};                    push @postversions,$contrib{$idx.':timestamp'};
                   my $screenname=&Apache::loncommon::screenname(                    my $screenname=&Apache::loncommon::screenname(
                                             $contrib{$idx.':sendername'},                                              $contrib{$idx.':sendername'},
Line 2315  END Line 2530  END
                   for (my $i=0; $i<@postversions; $i++) {                    for (my $i=0; $i<@postversions; $i++) {
                       my ($timesent,$message,$subject,$attachmsg);                        my ($timesent,$message,$subject,$attachmsg);
                       $timesent = &Apache::lonlocal::locallocaltime($postversions[$i]);                        $timesent = &Apache::lonlocal::locallocaltime($postversions[$i]);
                       if ($i == @postversions-1) {                        $message=&HTML::Entities::decode($messages{$i});
                           ($message)=($contrib{$idx.':message'} =~ /.*::::\Q$i\E::::(.+?)$/si);                        $subject=&HTML::Entities::decode($subjects{$i});
                           ($subject)=($contrib{$idx.':subject'} =~ /.*::::\Q$i\E::::(.+?)$/si);  
                       } else {   
                           ($message)=($contrib{$idx.':message'} =~ /::::\Q$i\E::::(.+?)::::/si);  
                           ($subject)=($contrib{$idx.':subject'} =~ /::::\Q$i\E::::(.+?)::::/si);  
                       }  
                       $message=~s/\n/\<br \/\>/g;                        $message=~s/\n/\<br \/\>/g;
                       $message=&Apache::lontexconvert::msgtexconverted($message);                        $message=&Apache::lontexconvert::msgtexconverted($message);
                       $subject=~s/\n/\<br \/\>/g;                        $subject=~s/\n/\<br \/\>/g;
                       $subject=&Apache::lontexconvert::msgtexconverted($subject);                        $subject=&Apache::lontexconvert::msgtexconverted($subject);
                       if ($attachmenturls) {                        if ($attachmenturls) {
                           my @attachments = ();                            my %attachments = ();
                           my %currattach = ();                            my %currattach = ();
                           &extract_attachments($attachmenturls,$idx,$i,\$attachmsg,\@attachments,\%currattach);                            &extract_attachments($attachmenturls,$idx,$i,\$attachmsg,\%attachments,\%currattach);
                       }                        }
                       if ($attachmsg) {                        if ($attachmsg) {
                           $attachmsg = '<br />Attachments:'.$attachmsg.'<br />';                            $attachmsg = '<br />Attachments:'.$attachmsg.'<br />';
Line 2478  ENDREDIR Line 2688  ENDREDIR
       my $symb=$ENV{'form.modifydisp'};        my $symb=$ENV{'form.modifydisp'};
       my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);        my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
       my $previous=$ENV{'form.previous'};        my $previous=$ENV{'form.previous'};
       my ($dispchg,$markchg) = split/_/,$ENV{'form.changes'};        my ($dispchgA,$dispchgB,$markchg,$toggchg) = split/_/,$ENV{'form.changes'};
       my $feedurl = &Apache::lonnet::clutter($url);        my $feedurl = &Apache::lonnet::clutter($url);
  # backward compatibility (bulletin boards used to be 'wrapped')     # backward compatibility (bulletin boards used to be 'wrapped')  
       if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {        if ($feedurl=~m|^/adm/wrapper/adm/.*/bulletinboard$|) {
           $feedurl=~s|^/adm/wrapper||;            $feedurl=~s|^/adm/wrapper||;
       }        }
       &print_display_options($r,$symb,$previous,$dispchg,$markchg,$feedurl);        &print_display_options($r,$symb,$previous,$dispchgA,$dispchgB,$markchg,$toggchg,$feedurl);
       return OK;        return OK;
   } elsif (($ENV{'form.markondisp'}) || ($ENV{'form.markonread'}) || ($ENV{'form.allposts'}) || ($ENV{'form.onlyunread'}) ) {    } elsif (($ENV{'form.markondisp'}) || ($ENV{'form.markonread'}) || ($ENV{'form.allposts'}) || ($ENV{'form.onlyunread'}) || $ENV{'form.onlyunmark'} || $ENV{'form.toggoff'} || $ENV{'form.toggon'} ) {
       &Apache::loncommon::content_type($r,'text/html');        &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;        $r->send_http_header;
       my $previous=$ENV{'form.previous'};        my $previous=$ENV{'form.previous'};
       my ($map,$ind,$url);        my ($map,$ind,$url);
         if ( ($ENV{'form.toggoff'}) || ($ENV{'form.toggon'}) ) {
   # ------------------------------ Modify setting for read/unread toggle for each post 
             my $symb=$ENV{'form.toggoff'}?$ENV{'form.toggoff'}:$ENV{'form.toggon'};
             my $ressymb = $symb;
             ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
             unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {
                 $ressymb=~s|(bulletin___\d+___)|$1adm/wrapper|;
             }
             my %discinfo = ();
             my $toggkey = $ressymb.'_readtoggle';
             if ($ENV{'form.toggon'}) {
                 $discinfo{$toggkey} = 1;
             } elsif ($ENV{'form.toggoff'}) {
                 $discinfo{$toggkey} = 0;
             }
             &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
         }
       if (($ENV{'form.markondisp'}) || ($ENV{'form.markonread'})) {        if (($ENV{'form.markondisp'}) || ($ENV{'form.markonread'})) {
 # ---------------------- Modify setting for identification of 'NEW' posts in this discussion  # ---------------------- Modify setting for identification of 'NEW' posts in this discussion
           my $symb=$ENV{'form.markondisp'}?$ENV{'form.markondisp'}:$ENV{'form.markonread'};            my $symb=$ENV{'form.markondisp'}?$ENV{'form.markondisp'}:$ENV{'form.markonread'};
Line 2513  ENDREDIR Line 2740  ENDREDIR
           }            }
           &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});            &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
       }        }
       if (($ENV{'form.allposts'}) || ($ENV{'form.onlyunread'})) {        if (($ENV{'form.allposts'}) || ($ENV{'form.onlyunread'}) || ($ENV{'form.onlyunmark'}) ) {
 # ----------------------------------------------------------------- Modify display setting for this discussion   # ----------------------------------------------------------------- Modify display setting for this discussion 
           my $symb=$ENV{'form.allposts'}?$ENV{'form.allposts'}:$ENV{'form.onlyunread'};            my $symb;
             if ($ENV{'form.allposts'}) {
                 $symb = $ENV{'form.allposts'};
             } elsif ($ENV{'form.onlyunread'}) {
                 $symb = $ENV{'form.onlyunread'};
             } else {
                 $symb = $ENV{'form.onlyunmark'};
             }
           my $ressymb = $symb;            my $ressymb = $symb;
           ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);            ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb);
           unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {            unless ($ressymb =~ m|bulletin___\d+___adm/wrapper|) {
Line 2524  ENDREDIR Line 2758  ENDREDIR
           my %discinfo = ();            my %discinfo = ();
           if ($ENV{'form.allposts'}) {            if ($ENV{'form.allposts'}) {
               $discinfo{$ressymb.'_showonlyunread'} = 0;                $discinfo{$ressymb.'_showonlyunread'} = 0;
                 $discinfo{$ressymb.'_showonlyunmark'} = 0;
           } elsif ($ENV{'form.onlyunread'}) {            } elsif ($ENV{'form.onlyunread'}) {
               $discinfo{$ressymb.'_showonlyunread'} = 1;                $discinfo{$ressymb.'_showonlyunread'} = 1;
             } else {
                 $discinfo{$ressymb.'_showonlyunmark'} = 1;
           }            }
           &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});            &Apache::lonnet::put('nohist_'.$ENV{'request.course.id'}.'_discuss',\%discinfo,$ENV{'user.domain'},$ENV{'user.name'});
       }        }
       if (($ENV{'form.markonread'}) || ($ENV{'form.allposts'}) || ($ENV{'form.onlyunread'}) ) {        if (($ENV{'form.markonread'}) || ($ENV{'form.allposts'}) || ($ENV{'form.onlyunread'}) || ($ENV{'form.onlyunmark'}) ||($ENV{'form.toggoff'}) || ($ENV{'form.toggon'}) ) {
           &redirect_back($r,&Apache::lonnet::clutter($url),&mt('Changed display status').'<br />','0','0','',$previous);            &redirect_back($r,&Apache::lonnet::clutter($url),&mt('Changed display status').'<br />','0','0','',$previous);
       } else {        } else {
           &redirect_back($r,&Apache::lonnet::clutter($url),&mt('Changed display status').'<br />','0','0');            &redirect_back($r,&Apache::lonnet::clutter($url),&mt('Changed display status').'<br />','0','0');
       }        }
       return OK;        return OK;
   } elsif ($ENV{'form.markread'}) {    } elsif ($ENV{'form.markread'}) {
 # ----------------------------------------------------------------- Mark new posts as read  # ----------------------------------------------------------------- Mark new posts not NEW 
       &Apache::loncommon::content_type($r,'text/html');        &Apache::loncommon::content_type($r,'text/html');
       $r->send_http_header;        $r->send_http_header;
       my $symb=$ENV{'form.markread'};        my $symb=$ENV{'form.markread'};
Line 2667  ENDREDIR Line 2904  ENDREDIR
           $attachmenturls = $contrib{$idx.':attachmenturl'};            $attachmenturls = $contrib{$idx.':attachmenturl'};
       }        }
       &modify_attachments($r,\@currnewattach,\@currdelold,$symb,$idx,$attachmenturls);        &modify_attachments($r,\@currnewattach,\@currdelold,$symb,$idx,$attachmenturls);
     } elsif ($ENV{'form.chgreads'}) {
         &Apache::loncommon::content_type($r,'text/html');
         $r->send_http_header;
         my ($map,$ind,$url)=&Apache::lonnet::decode_symb($ENV{'form.chgreads'});
         &redirect_back($r,&Apache::lonnet::clutter($url),
          &mt('Changed read status').'<br />','0','0');
   } else {    } else {
 # ------------------------------------------------------------- Normal feedback  # ------------------------------------------------------------- Normal feedback
   my $feedurl=$ENV{'form.postdata'};    my $feedurl=$ENV{'form.postdata'};
Line 2757  ENDREDIR Line 3000  ENDREDIR
           my @deloldattach = ();            my @deloldattach = ();
           my @keepold = ();            my @keepold = ();
           &process_attachments(\@currnewattach,\@deloldattach,\@keepold);            &process_attachments(\@currnewattach,\@deloldattach,\@keepold);
             $symb=~s|(bulletin___\d+___)adm/wrapper/|$1|;
           $attachmenturl=&construct_attachmenturl(\@currnewattach,\@keepold,$symb,$idx);            $attachmenturl=&construct_attachmenturl(\@currnewattach,\@keepold,$symb,$idx);
       } elsif ($ENV{'form.attachment.filename'}) {        } elsif ($ENV{'form.attachment.filename'}) {
   unless (length($ENV{'form.attachment'})>131072) {    unless (length($ENV{'form.attachment'})>131072) {

Removed from v.1.109  
changed lines
  Added in v.1.115


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