F:\WEBSITES\testbed\zipped\yabb_svn_new\branches\2.5.2\cgi-bin\yabb2\Sources\MoveSplitSplice.pl F:\WEBSITES\testbed\zipped\yabb_svn_new\trunk\cgi-bin\yabb2\Sources\MoveSplitSplice.pm
############################################################################### ###############################################################################
# MoveSplitSplice.pl                                                          # # MoveSplitSplice.pm                                                          #
  # $Date: 01.05.16 $                                                           #
############################################################################### ###############################################################################
# YaBB: Yet another Bulletin Board                                            # # YaBB: Yet another Bulletin Board                                            #
# Open-Source Community Software for Webmasters                               # # Open-Source Community Software for Webmasters                               #
# Version:        YaBB 2.5.2                                                  # # Version:        YaBB 2.6.12                                                 #
# Packaged:       October 21, 2012                                            # # Packaged:       January 5, 2016                                             #
# Distributed by: http://www.yabbforum.com                                    # # Distributed by: http://www.yabbforum.com                                    #
# =========================================================================== # # =========================================================================== #
# Copyright (c) 2000-2012 YaBB (www.yabbforum.com) - All Rights Reserved.     # # Copyright (c) 2000-2016 YaBB (www.yabbforum.com) - All Rights Reserved.     #
# Software by:  The YaBB Development Team                                     # # Software by:  The YaBB Development Team                                     #
#               with assistance from the YaBB community.                      # #               with assistance from the YaBB community.                      #
############################################################################### ###############################################################################
  use CGI::Carp qw(fatalsToBrowser);
  our $VERSION = '2.6.12';
   
$movesplitspliceplver = 'YaBB 2.5.2 $Revision: 1.0 $'; $movesplitsplicepmver = 'YaBB 2.6.12 $Revision: 1710 $';
if ($action eq 'detailedversion') { return 1; } if ( $action eq 'detailedversion' ) { return 1; }
   
&LoadLanguage('MoveSplitSplice');  LoadLanguage('MoveSplitSplice'); 
   
sub Split_Splice {  get_template('Display'); 
   if (!$staff) { &fatal_error("split_splice_not_allowed"); }  
   &Split_Splice_2 if $FORM{'ss_submit'} || $INFO{'ss_submit'};  
   
   $output = qq~<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">  
<head>  
<title>$sstxt{'1'}</title>  
<meta http-equiv="Content-Type" content="text/html; charset=$yycharset" />  
<link rel="stylesheet" href="$forumstylesurl/$usestyle.css" type="text/css" />  
   
</head>  sub Split_Splice { 
<body>     if ( !$staff ) { fatal_error('split_splice_not_allowed'); } 
<a name="pagetop">&nbsp;</a><br />     if ( $FORM{'ss_submit'} || $INFO{'ss_submit'} ) { Split_Splice_2(); } 
<div id="maincontainer">  
<div id="container">  
<br />  
<br />~;  
   
   my $curboard  = $INFO{'board'};  
   my $curthread = $INFO{'thread'};  
   unless (exists $FORM{'oldposts'}) { $FORM{'oldposts'} = $INFO{'oldposts'}; }  
   unless (exists $FORM{'leave'})    { $FORM{'leave'} = $INFO{'leave'}; }  
   if     (exists $INFO{'newinfo'})  { $FORM{'newinfo'} = $INFO{'newinfo'}; }  
   my $newcat    = $FORM{'newcat'} || $INFO{'newcat'};  
   my $newboard  = $FORM{'newboard'} || $INFO{'newboard'};  
   unless (exists $FORM{'newthread'}) { $FORM{'newthread'} = $INFO{'newthread'}; }  
   my $newthread = $FORM{'newthread'} || "new";  
   unless (exists $FORM{'newthread_subject'}) { $FORM{'newthread_subject'} = $INFO{'newthread_subject'}; }  
   unless (exists $FORM{'position'})          { $FORM{'position'} = $INFO{'position'}; }  
   
   require "$sourcedir/YaBBC.pl";  
   &LoadCensorList;  
   
   # Get posts of current thread  
   unless (ref($thread_arrayref{$curthread})) {  
       fopen(FILE, "$datadir/$curthread.txt");  
       @{$thread_arrayref{$curthread}} = <FILE>;  
       fclose(FILE);  
   }  
   my @messages = @{$thread_arrayref{$curthread}};  
   
   my ($counter,$size1);  
   for ($counter = 0; $counter < @messages; $counter++) {  
       $message = (split(/\|/, $messages[$counter], 10))[8];  
       ($message, undef) = &Split_Splice_Move($message,1);  
       &DoUBBC;  
   
       $convertstr = $message;  
       $convertcut = 50;  
       &CountChars;  
       $message = $convertstr;  
       $message .= " ..." if $cliped;  
   
       &ToChars($message);  
       $message =~ s/<(p|br|div).*?>/ /g;  
       $message =~ s/<.*?>//g; # remove HTML-tags  
       $message = &Censor($message);  
   
       $messages[$counter] = qq~<option value="$counter" ~ . ($FORM{'oldposts'} =~ /\b$counter\b/ ? q~selected="selected"~ : '') . qq~>~ . ($counter ? "$sstxt{'40'} $counter" : $sstxt{'41'}) . qq~: $message</option>\n~;  
   }  
   @messages = reverse(@messages) if ($ttsureverse && ${$uid.$username}{'reversetopic'}) || $ttsreverse;  
   my $postlist = ($FORM{'oldposts'} eq "all" ? qq~<option value="all" selected="selected">$sstxt{'26'}</option>\n~ : qq~<option value="all">$sstxt{'26'}</option>\n~) . join('', @messages);  
   $size1 = @messages + 1;  
   $size1 = $size1 > 10 ? 10 : $size1; # maximum size of multiselect field  
   
   # List of options of what, if anything, to leave in place of the posts moved  
   my @leaveopts = ($sstxt{'11'}, $sstxt{'12'}, $sstxt{'13'});  
   for ($counter = 0; $counter < @leaveopts; $counter++) {  
       $leavelist .= qq~<option value="$counter" ~ . ($FORM{'leave'} == $counter ? q~selected="selected"~ : '') . qq~>$leaveopts[$counter]</option>\n~;  
   }  
   
   # Get categories and make the current one the default selection  
   my $catlist = qq~<option value="cats" >$sstxt{'28'}</option>\n~;  
   foreach (@categoryorder) {  
       my ($catname, $catperms) = split(/\|/, $catinfo{$_}, 3);  
       next if !&CatAccess($catperms);  
       $catlist .= qq~<option value="$_" ~ . ($newcat eq $_ ? q~selected="selected"~ : '') . qq~>$catname</option>\n~;  
   }  
   
   # Get boards and make the current one the default selection  
   $boardlist = qq~<option value="boards" >$sstxt{'29'}</option>\n~;  
   foreach (split (/,/, $cat{$newcat})) {  
       my ($boardname, $boardperms) = split(/\|/, $board{$_}, 3);  
       my $access = &AccessCheck($_, '', $boardperms);  
       next if !$iamadmin && $access ne "granted" && $boardview != 1;  
       $boardlist .= qq~<option value="$_" ~ . ($newboard eq $_ ? q~selected="selected"~ : '') . qq~>$boardname</option>\n~;  
   }  
   
   # Get threads and make the current one the default selection  
   my ($threadlist,$threadids,$positionlist);  
   if ($cat{$newcat} =~ /\b$newboard\b/) {  
       fopen(FILE, "$boardsdir/$newboard.txt");  
       my @threads = <FILE>;  
       fclose(FILE);  
   
       $threadlist = qq~<option value="new">$sstxt{'30'}</option>\n~;  
       my $threadid;  
       foreach (@threads) {  
           ($threadid, $message, undef) = split(/\|/, $_, 3);  
           next if $curthread eq $threadid;  
           $threadids .= "$threadid,";  
   
           ($message, undef) = &Split_Splice_Move($message,$threadid);  
           &DoUBBC;  
   
           $convertstr = $message;  
           $convertcut = 50;  
           &CountChars;  
           $message = $convertstr;  
           $message .= " ..." if $cliped;  
   
           &ToChars($message);  
           $message =~ s/<(p|br|div).*?>/ /g;  
           $message =~ s/<.*?>//g; # remove HTML-tags  
           $message = &Censor($message);  
   
           $threadlist .= qq~<option value="$threadid" ~ . ($newthread eq $threadid ? q~selected="selected"~ : '') . qq~>$message</option>\n~;  
       }  
   
       # Get new thread posts to select splice site  
       if ($FORM{'newthread'} ne "new") {  
           unless (ref($thread_arrayref{$newthread})) {  
               fopen(FILE, "$datadir/$newthread.txt");  
               @{$thread_arrayref{$newthread}} = <FILE>;  
               fclose(FILE);  
           }  
           @messages = @{$thread_arrayref{$newthread}};  
   
           for ($counter = 0; $counter < @messages; $counter++) {  
               $message = (split(/[\|]/, $messages[$counter], 10))[8];  
               ($message, undef) = &Split_Splice_Move($message,1);  
               &DoUBBC;  
   
               $convertstr = $message;  
               $convertcut = 50;  
               &CountChars;  
               $message = $convertstr;  
               $message .= " ..." if $cliped;  
   
               &ToChars($message);  
               $message =~ s/<(p|br|div).*?>/ /g;  
               $message =~ s/<.*?>//g; # remove HTML-tags  
               $message = &Censor($message);  
   
               $messages[$counter] = qq~<option value="$counter">~ . ($counter ? "$sstxt{'40'} $counter" : $sstxt{'41'}) . qq~: $message</option>\n~;  
           }  
           @messages = reverse(@messages) if ($ttsureverse && ${$uid.$username}{'reversetopic'}) || $ttsreverse;  
           $positionlist = qq~<option value="end">$sstxt{'31'}</option>\n~;  
           $positionlist .= qq~<option value="begin">$sstxt{'32'}</option>\n~ . join('', @messages);  
           if ($FORM{'position'} && $newthread == $FORM{'old_position_thread'}) {  
               $positionlist =~ s/(value="$FORM{'position'}")/$1 selected="selected"/;  
           }  
       }  
   }  
   
   $output .= qq~  
<script language="JavaScript1.2" src="$yyhtml_root/ubbc.js" type="text/javascript"></script>  
<form action="$scripturl?action=split_splice;board=$currentboard;thread=$INFO{'thread'}" method="post" name="split_splice" onsubmit="return submitproc()">  
<input type="hidden" name="formsession" value="$formsession" />  
<table border="0" cellspacing="1" cellpadding="8" class="bordercolor" align="center" width="90%">  
   <tr>  
       <td class="titlebg"><img src="$defaultimagesdir/admin_move_split_splice.gif" alt="$sstxt{'1'}" /> <b>$sstxt{'1'}</b></td>  
   </tr><tr>  
       <td class="catbg"><b>$sstxt{'2'}:</b></td>  
   </tr><tr>  
       <td class="windowbg"><b>$sstxt{'3'}</b></td>  
   </tr><tr>  
       <td class="windowbg2">  
           <label for="oldposts">$sstxt{'14'}<br />  
           <select name="oldposts" id="oldposts" size="$size1" multiple="multiple">$postlist</select><br />  
           <span class="small">$sstxt{'14a'}</span></label>  
       </td>  
   </tr><tr>  
       <td class="windowbg"><b>$sstxt{'4'}</b></td>  
   </tr><tr>  
       <td class="windowbg2">  
           <label for="leave">$sstxt{'15'}</label><br />  
           <select name="leave" id="leave">$leavelist</select>  
       </td>  
   </tr><tr>  
       <td class="catbg"><b>$sstxt{'5'}:</b></td>  
   </tr><tr>  
       <td class="windowbg"><b>$sstxt{'6'}</b></td>  
   </tr><tr>  
       <td class="windowbg2">  
           <label for="newcat">$sstxt{'16'}</label><br />  
           <select name="newcat" id="newcat" onchange="document.split_splice.submit();">$catlist</select>  
       </td>  
   </tr><tr>  
       <td class="windowbg"><b>$sstxt{'7'}</b></td>  
   </tr><tr>  
       <td class="windowbg2">  
           <label for="newboard">$sstxt{'17'}</label><br />  
           <select name="newboard" id="newboard" onchange="document.split_splice.submit();">$boardlist</select>  
       </td>  
   </tr><tr>  
       <td class="windowbg"><b>$sstxt{'8'}</b></td>  
   </tr><tr>  
       <td class="windowbg2">  
           <label for="newthread">$sstxt{'18'}</label><br />  
           <select name="newthread" id="newthread" onchange="document.split_splice.submit();">$threadlist</select>  
       </td>  
   </tr>~;  
   
   if ($newthread eq "new" || !$threadlist || $threadids !~ /\b$newthread\b/){  
       $output .= qq~<tr>  
       <td class="windowbg"><b>$sstxt{'9'}</b></td>  
   </tr><tr>  
       <td class="windowbg2">  
           <label for="newthread_subject">$sstxt{'20'}</label><br />  
           <input type="text" name="newthread_subject" id="newthread_subject" size="50" value="$FORM{'newthread_subject'}" />  
           <input type="hidden" name="position" value="$FORM{'position'}" />  
           <input type="hidden" name="old_position_thread" value="$FORM{'old_position_thread'}" />  
       </td>  
   </tr>~;  
   
   } else {  
       $output .= qq~<tr>  
       <td class="windowbg"><b>$sstxt{'10'}</b></td>  
   </tr><tr>  
       <td class="windowbg2">  
           <label for="position">$sstxt{'19'}</label><br />  
           <select name="position" id="position">$positionlist</select>  
           <input type="hidden" name="newthread_subject" value="$FORM{'newthread_subject'}" />  
           <input type="hidden" name="old_position_thread" value="$newthread" />  
       </td>  
   </tr>~;  
   }  
   
   $output .= qq~<tr>  
       <td class="windowbg"><b>$sstxt{'4'}</b></td>  
   </tr><tr>  
       <td class="windowbg2">  
           <input type="checkbox" name="newinfo" id="newinfo" value="1"~ . ($FORM{'newinfo'} ? ' checked="checked"' : '') . qq~ /> <label for="newinfo">$sstxt{'15a'}</label>  
       </td>  
   </tr><tr>  
       <td class="catbg" align="center"><input type="submit" name="ss_submit" value="$sstxt{'24'}" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="reset" value="$sstxt{'25'}" /></td>  
   </tr>  
</table>  
</form>  
<br />  
<br />  
</div>  
</div>  
</body>  
</html>~;  
   
   &print_output_header;     my $curboard  = $INFO{'board'}; 
   &print_HTML_output_and_finish;     my $curthread = $INFO{'thread'}; 
     if ( !exists $FORM{'oldposts'} ) { $FORM{'oldposts'} = $INFO{'oldposts'}; }
     if ( !exists $FORM{'leave'} )    { $FORM{'leave'}    = $INFO{'leave'}; }
     if ( exists $INFO{'newinfo'} )   { $FORM{'newinfo'}  = $INFO{'newinfo'}; }
     my $newcat   = $FORM{'newcat'}   || $INFO{'newcat'};
     my $newboard = $FORM{'newboard'} || $INFO{'newboard'};
     if ( !exists $FORM{'newthread'} ) {
         $FORM{'newthread'} = $INFO{'newthread'};
     }
     my $newthread = $FORM{'newthread'} || 'new';
     if ( !exists $FORM{'newthread_subject'} ) {
         $FORM{'newthread_subject'} = $INFO{'newthread_subject'};
     }
     if ( !exists $FORM{'position'} ) { $FORM{'position'} = $INFO{'position'}; }
   
     require Sources::YaBBC;
     LoadCensorList();
   
     # Get posts of current thread
     if ( !ref $thread_arrayref{$curthread} ) {
         fopen( FILE, "$datadir/$curthread.txt" );
         @{ $thread_arrayref{$curthread} } = <FILE>;
         fclose(FILE);
     }
     my @messages = @{ $thread_arrayref{$curthread} };
   
     my ( $counter, $size1 );
     for my $counter ( 0 .. $#messages ) {
         $message = ( split /\|/xsm, $messages[$counter], 10 )[8];
         ( $message, undef ) = Split_Splice_Move( $message, 1 );
         DoUBBC();
   
         $convertstr = $message;
         $convertstr =~ s/<(p|br|div).*?>/ /gxsm;
         $convertstr =~ s/<.*?>//gxsm;              # remove HTML-tags
         $convertcut = 50;
         CountChars();
         $message = $convertstr;
         if ($cliped) { $message .= ' ...'; }
   
         ToChars($message);
         $message = Censor($message);
   
         $messages[$counter] = qq~<option value="$counter" ~
           . (
             $FORM{'oldposts'} =~ /\b$counter\b/xsm
             ? q~selected="selected"~
             : q{}
           )
           . q~>~
           . ( $counter ? "$sstxt{'40'} $counter" : $sstxt{'41'} )
           . qq~: $message</option>\n~;
     }
     if ( ( $ttsureverse && ${ $uid . $username }{'reversetopic'} )
         || $ttsreverse )
     {
         @messages = reverse @messages;
     }
     my $postlist = (
         $FORM{'oldposts'} eq 'all' 
         ? qq~<option value="all" selected="selected">$sstxt{'26'}</option>\n~
         : qq~<option value="all">$sstxt{'26'}</option>\n~
     ) . join q{}, @messages;
     $size1 = @messages + 1;
     $size1 = $size1 > 10 ? 10 : $size1;    # maximum size of multiselect field
   
     # List of options of what, if anything, to leave in place of the posts moved
     my @leaveopts = ( $sstxt{'11'}, $sstxt{'12'}, $sstxt{'13'} );
     for my $counter ( 0 .. $#leaveopts ) {
         $leavelist .=
             qq~<option value="$counter" ~
           . ( $FORM{'leave'} == $counter ? q~selected="selected"~ : q{} )
           . qq~>$leaveopts[$counter]</option>\n~;
     }
   
     # Get categories and make the current one the default selection
     my $catlist = qq~<option value="cats" >$sstxt{'28'}</option>\n~;
     foreach (@categoryorder) {
         my ( $catname, $catperms ) = split /\|/xsm, $catinfo{$_}, 3;
         next if !CatAccess($catperms);
         $catlist .=
             qq~<option value="$_" ~
           . ( $newcat eq $_ ? q~selected="selected"~ : q{} )
           . qq~>$catname</option>\n~;
     }
   
     # Get boards and make the current one the default selection
     $boardlist = qq~<option value="boards">$sstxt{'29'}</option>\n~;
     my $indent = -2;
   
     *get_subboards = sub {
         my @x = @_;
         $indent += 2;
         foreach my $childbd (@x) {
             my $dash;
             if ( $indent > 0 ) { $dash = q{-}; }
             my ( $boardname, $boardperms ) = split /\|/xsm, $board{$childbd}, 3;
             ToChars($boardname);
             my $access = AccessCheck( $_, q{}, $boardperms );
             next if !$iamadmin && $access ne 'granted' && $boardview != 1;
   
             my $bdnopost =
               ( ${ $uid . $childbd }{'canpost'} || !$subboard{$childbd} )
               ? q{}
               : q~ class="nopost"~;
             $boardlist .=
                 qq~<option$bdnopost value="$childbd" ~
               . ( $newboard eq $childbd ? q~selected="selected"~ : q{} ) . q~>~
               . ( '&nbsp;' x $indent )
               . ( $dash x ( $indent / 2 ) )
               . qq~&nbsp;$boardname</option>\n~;
   
             if ( $subboard{$childbd} ) {
                 get_subboards( split /\|/xsm, $subboard{$childbd} );
             }
         }
         $indent -= 2;
         return;
     };
     get_subboards( split /,/xsm, $cat{$newcat} );
   
     # Get threads and make the current one the default selection
     my ( $threadlist, $threadids, $positionlist );
     fopen( FILE, "$boardsdir/$newboard.txt" );
     my @threads = <FILE>;
     fclose(FILE);
   
     $threadlist = qq~<option value="new">$sstxt{'30'}</option>\n~;
     my $threadid;
     foreach (@threads) {
         ( $threadid, $message, undef ) = split /\|/xsm, $_, 3;
         next if $curthread eq $threadid;
         $threadids .= "$threadid,";
   
         ( $message, undef ) = Split_Splice_Move( $message, $threadid );
         DoUBBC();
   
         $convertstr = $message;
         $convertcut = 50;
         CountChars();
         $message = $convertstr;
         if ($cliped) { $message .= ' ...'; }
   
         ToChars($message);
         $message =~ s/<(p|br|div).*?>/ /gxsm;
         $message =~ s/<.*?>//gxsm;              # remove HTML-tags
         $message = Censor($message);
   
         $threadlist .=
             qq~<option value="$threadid" ~
           . ( $newthread eq $threadid ? q~selected="selected"~ : q{} )
           . qq~>$message</option>\n~;
     }
   
     # Get new thread posts to select splice site
     if ( $FORM{'newthread'} ne 'new' ) {
         if ( !ref $thread_arrayref{$newthread} ) {
             fopen( FILE, "$datadir/$newthread.txt" );
             @{ $thread_arrayref{$newthread} } = <FILE>;
             fclose(FILE);
         }
         @messages = @{ $thread_arrayref{$newthread} };
   
         for my $counter ( 0 .. $#messages ) {
             $message = ( split /[\|]/xsm, $messages[$counter], 10 )[8];
             ( $message, undef ) = Split_Splice_Move( $message, 1 );
             DoUBBC();
   
             $convertstr = $message;
             $convertcut = 50;
             CountChars();
             $message = $convertstr;
             if ($cliped) { $message .= ' ...'; }
   
             ToChars($message);
             $message =~ s/<(p|br|div).*?>/ /gxsm;
             $message =~ s/<.*?>//gxsm;              # remove HTML-tags
             $message = Censor($message);
   
             $messages[$counter] =
                 qq~<option value="$counter">~
               . ( $counter ? "$sstxt{'40'} $counter" : $sstxt{'41'} )
               . qq~: $message</option>\n~;
         }
         if ( ( $ttsureverse && ${ $uid . $username }{'reversetopic'} )
             || $ttsreverse )
         {
             @messages = reverse @messages;
         }
         $positionlist = qq~<option value="end">$sstxt{'31'}</option>\n~;
         $positionlist .=
           qq~<option value="begin">$sstxt{'32'}</option>\n~;
         $positionlist .= join q{}, @messages;
         if (   $FORM{'position'}
             && $newthread == $FORM{'old_position_thread'} )
         {
             $positionlist =~
               s/(value="$FORM{'position'}")/$1 selected="selected"/xsm;
         }
     }
   
     if (   $newthread eq 'new' 
         || !$threadlist
         || $threadids !~ /\b$newthread\b/xsm )
     {
         $my_output = $mymove_output_a;
         $my_output =~ s/{yabb newthread_subject}/$FORM{'newthread_subject'}/sm;
         $my_output =~ s/{yabb position}/$FORM{'position'}/sm;
         $my_output =~
           s/{yabb old_position_thread}/$FORM{'old_position_thread'}/sm;
     }
     else {
         $my_output = $mymove_output_b;
         $my_output =~ s/{yabb positionlist}/$positionlist/sm;
         $my_output =~ s/{yabb newthread_subject}/$FORM{'newthread_subject'}/sm;
         $my_output =~ s/{yabb newthread}/$newthread/sm;
     }
   
     $my_checked = $FORM{'newinfo'} ? ' checked="checked"' : q{};
   
     $output = $mymove_top;
     $output =~ s/{yabb formsession}/$formsession/sm;
     $output =~ s/{yabb postlist}/$postlist/sm;
     $output =~ s/{yabb leavelist}/$leavelist/sm;
     $output =~ s/{yabb catlist}/$catlist/sm;
     $output =~ s/{yabb boardlist}/$boardlist/sm;
     $output =~ s/{yabb threadlist}/$threadlist/sm;
     $output =~ s/{yabb my_output}/$my_output/sm;
     $output =~ s/{yabb my_checked}/$my_checked/sm;
     $output =~ s/{yabb size1}/$size1/sm;
   
     print_output_header();
     print_HTML_output_and_finish();
     return;
} }
   
sub Split_Splice_2 { sub Split_Splice_2 {
   if (!$staff && $INFO{'newboard'} ne $binboard) { &fatal_error("split_splice_not_allowed"); }     if ( !$staff && $INFO{'newboard'} ne $binboard ) { 
         fatal_error('split_splice_not_allowed');
   my $curboard       = $INFO{'board'};     } 
   my $curthreadid    = $INFO{'thread'};  
   my $movingposts    = exists $INFO{'oldposts'} ? $INFO{'oldposts'} : $FORM{'oldposts'};     my $curboard    = $INFO{'board'}; 
   $FORM{'oldposts'}  = $movingposts;     my $curthreadid = $INFO{'thread'}; 
   my $leavemess      = exists $INFO{'leave'} ? $INFO{'leave'} : $FORM{'leave'};     my $movingposts = 
   my $forcenewinfo   = exists $INFO{'newinfo'} ? $INFO{'newinfo'} : $FORM{'newinfo'};       exists $INFO{'oldposts'} ? $INFO{'oldposts'} : $FORM{'oldposts'}; 
   my $newcat         = exists $INFO{'newcat'} ? $INFO{'newcat'} : $FORM{'newcat'};     $FORM{'oldposts'} = $movingposts; 
   my $newboard       = exists $INFO{'newboard'} ? $INFO{'newboard'} : $FORM{'newboard'};     my $leavemess = exists $INFO{'leave'} ? $INFO{'leave'} : $FORM{'leave'}; 
   my $newthreadid    = exists $INFO{'newthread'} ? $INFO{'newthread'} : $FORM{'newthread'};     my $forcenewinfo = 
   $FORM{'newthread'} = $newthreadid;       exists $INFO{'newinfo'} ? $INFO{'newinfo'} : $FORM{'newinfo'}; 
   my $newthreadsub   = exists $INFO{'newthread_subject'} ? $INFO{'newthread_subject'} : $FORM{'newthread_subject'};     my $newcat = exists $INFO{'newcat'} ? $INFO{'newcat'} : $FORM{'newcat'}; 
   my $newposition    = exists $INFO{'position'} ? $INFO{'position'} : $FORM{'position'};     my $newboard = 
   $FORM{'position'}  = $newposition;       exists $INFO{'newboard'} ? $INFO{'newboard'} : $FORM{'newboard'}; 
     my $newthreadid =
   # Error messages if something is not filled out right       exists $INFO{'newthread'} ? $INFO{'newthread'} : $FORM{'newthread'}; 
   &fatal_error('',"$sstxt{'22b'} $sstxt{'23'} $sstxt{'50'}") if $movingposts eq '';     $FORM{'newthread'} = $newthreadid; 
   &fatal_error('',"$sstxt{'22'}") if $newcat eq 'cats';     my $newthreadsub = 
   &fatal_error('',"$sstxt{'22a'}") if $newboard eq 'boards';       exists $INFO{'newthread_subject'} 
   &fatal_error('',"$sstxt{'51'} $sstxt{'50'}") if -e "$datadir/$curthreadid.poll" && -e "$datadir/$newthreadid.poll";       ? $INFO{'newthread_subject'} 
       : $FORM{'newthread_subject'};
   my (@postnum,@utdcurthread,@utdnewthread,$i);     my $newposition = 
   my $linkcount = 0;       exists $INFO{'position'} ? $INFO{'position'} : $FORM{'position'}; 
     $FORM{'position'} = $newposition;
   # Get current thread posts  
   unless (ref($thread_arrayref{$curthreadid})) {     # Error messages if something is not filled out right 
       fopen(FILE, "$datadir/$curthreadid.txt");     if ( $movingposts eq q{} ) { 
       @{$thread_arrayref{$curthreadid}} = <FILE>;         fatal_error( q{}, "$sstxt{'22b'} $sstxt{'23'} $sstxt{'50'}" ); 
       fclose(FILE);     } 
   }    if ( $newcat   eq 'cats' )   { fatal_error( q{}, "$sstxt{'22'}" ); }
   my @curthread = @{$thread_arrayref{$curthreadid}};     if ( $newboard eq 'boards' ) { fatal_error( q{}, "$sstxt{'22a'}" ); } 
   &MessageTotals("load", $curthreadid);     if ( -e "$datadir/$curthreadid.poll" && -e "$datadir/$newthreadid.poll" ) { 
         fatal_error( q{}, "$sstxt{'51'} $sstxt{'50'}" );
   # Store post numbers to be moved in array     } 
   if ((split(/\, /, $movingposts, 2))[0] eq "all") { @postnum = (0 .. $#curthread); }  
   else { @postnum = sort {$a <=> $b} split(/\, /, $movingposts); } # sort numerically ascending because may be reversed!     my ( @postnum, @utdcurthread, @utdnewthread, $i ); 
     my $linkcount = 0;
   # Check to see if current thread was the latest post for the board and if the last post was selected to change  
   &BoardTotals("load", $curboard);     # Get current thread posts 
   if(${$curthreadid}{'lastpostdate'} == ${$uid.$curboard}{'lastposttime'} && $leavemess == 2 && $postnum[$#postnum] == $#curthread) {    if ( !ref $thread_arrayref{$curthreadid} ) {
       $newest_post = 1;         fopen( FILE, "$datadir/$curthreadid.txt" ); 
   }         @{ $thread_arrayref{$curthreadid} } = <FILE>; 
         fclose(FILE);
   # Move selected posts to a brand new thread     } 
   if ($newthreadid eq "new") {     my @curthread = @{ $thread_arrayref{$curthreadid} }; 
       # Find a valid random ID for new thread.     MessageTotals( 'load', $curthreadid ); 
       $newthreadid = (split(/\|/, $curthread[$postnum[0]], 5))[3] + 1;  
       while (-e "$datadir/$newthreadid.txt") { $newthreadid++; }     # Store post numbers to be moved in array 
     if ( ( split /\, /sm, $movingposts, 2 )[0] eq 'all' ) {
       foreach (@postnum) {         @postnum = ( 0 .. $#curthread ); 
           if ($newthreadsub || $leavemess == 1) { # insert new subject name || add 'no_postcount' into copies     } 
               my @x = split(/\|/, $curthread[$_]);     else { 
               if ($newthreadsub) { $x[0] = $_ == $postnum[0] ? $newthreadsub : qq~$sstxt{'21'} $newthreadsub~; }         @postnum = sort { $a <=> $b } split /\, /sm, $movingposts; 
               if ($leavemess == 1) { $x[5] = 'no_postcount'; }     }    # sort numerically ascending because may be reversed! 
               push(@utdnewthread, join('|', @x));  
           } else {  # Check to see if current thread was the latest post for the board and if the last post was selected to change 
               push(@utdnewthread, $curthread[$_]);     BoardTotals( 'load', $curboard ); 
           }     if ( 
       }         ${$curthreadid}{'lastpostdate'} == ${ $uid . $curboard }{'lastposttime'} 
         && $leavemess == 2
   # Place selected posts in existing thread at selected position         && $postnum[-1] == $#curthread ) 
   } else {    {
       # Get existing thread posts         $newest_post = 1; 
       unless (ref($thread_arrayref{$newthreadid})) {     } 
           fopen(FILE, "$datadir/$newthreadid.txt");  
           @{$thread_arrayref{$newthreadid}} = <FILE>;     # Move selected posts to a brand new thread 
           fclose(FILE);     if ( $newthreadid eq 'new' ) { 
       }  
       my @newthread = @{$thread_arrayref{$newthreadid}};         # Find a valid random ID for new thread. 
       &MessageTotals("load", $newthreadid);         $newthreadid = ( split /\|/xsm, $curthread[ $postnum[0] ], 5 )[3] + 1; 
         while ( -e "$datadir/$newthreadid.txt" ) { $newthreadid++; }
       if    ($newposition eq "end")   { $newposition = $#newthread; }  
       elsif ($newposition eq "begin") {        foreach (@postnum) {
           foreach (@postnum) {             if ( $newthreadsub || $leavemess == 1 ) 
               if ($leavemess == 1) { # add 'no_postcount' into copies            {    # insert new subject name || add 'no_postcount' into copies
                   my @x = split(/\|/, $curthread[$_]);                 my @x = split /\|/xsm, $curthread[$_]; 
                   $x[5] = 'no_postcount';                 if ($newthreadsub) { 
                   push(@utdnewthread, join('|', @x));                     $x[0] = 
               } else {                         $_ == $postnum[0] 
                   push(@utdnewthread, $curthread[$_]);                       ? $newthreadsub 
               }                       : qq~$sstxt{'21'} $newthreadsub~; 
           }                }
           $newposition = -1;                 if ( $leavemess == 1 ) { $x[5] = 'no_postcount'; } 
       }                 push @utdnewthread, join q{|}, @x; 
       for ($i = 0; $i < @newthread; $i++){             } 
           push (@utdnewthread, $newthread[$i]);             else { 
           if ($newposition == $i) {                 push @utdnewthread, $curthread[$_]; 
               foreach (@postnum) {             } 
                   if ($leavemess == 1) { # add 'no_postcount' into copies         } 
                       my @x = split(/\|/, $curthread[$_]);  
                       $x[5] = 'no_postcount';         # Place selected posts in existing thread at selected position 
                       push(@utdnewthread, join('|', @x));     } 
                   } else {    else {
                       push(@utdnewthread, $curthread[$_]);  
                   }         # Get existing thread posts 
               }         if ( !ref $thread_arrayref{$newthreadid} ) { 
               $linkcount = $i + 1;             fopen( FILE, "$datadir/$newthreadid.txt" ); 
           }             @{ $thread_arrayref{$newthreadid} } = <FILE>; 
       }             fclose(FILE); 
   }        }
         my @newthread = @{ $thread_arrayref{$newthreadid} };
   # Remove or copy selected posts from current thread         MessageTotals( 'load', $newthreadid ); 
   if ($#postnum == $#curthread && $leavemess != 1){  
       if ($newboard ne $binboard) {         if ( $newposition eq 'end' ) { $newposition = $#newthread; } 
           my ($tmpsub,$tmpmessage);         elsif ( $newposition eq 'begin' ) { 
           my $hidename = &cloak($username);             foreach (@postnum) { 
           ($tmpsub, undef) = split(/\|/, $curthread[0], 2);                 if ( $leavemess == 1 ) {    # add 'no_postcount' into copies 
           if ($curboard eq $newboard) {                     my @x = split /\|/xsm, $curthread[$_]; 
               $tmpmessage = qq~[m by=$hidename dest=$newthreadid/$linkcount#$linkcount]~;                     $x[5] = 'no_postcount'; 
               $tmpsub = qq~[m by=$hidename dest=$newthreadid]: '$tmpsub'~;                     push @utdnewthread, join q{|}, @x; 
           } else {                 } 
               $tmpmessage = qq~[m by=$hidename destboard=$newboard dest=$newthreadid/$linkcount#$linkcount]~;                 else { 
               $tmpsub = qq~[m by=$hidename destboard=$newboard dest=$newthreadid]: '$tmpsub'~;                     push @utdnewthread, $curthread[$_]; 
           }                }
           &FromChars($tmpmessage);             } 
           $utdcurthread[0] = qq~$tmpsub|${$uid.$username}{'realname'}|${$uid.$username}{'email'}|$date|$username|no_postcount||$user_ip|$tmpmessage||||\n~;             $newposition = -1; 
         }
           eval { require "$datadir/movedthreads.cgi" };         for my $i ( 0 .. $#newthread ) { 
           $moved_file{$curthreadid} = $newthreadid;             push @utdnewthread, $newthread[$i]; 
           delete $moved_file{$newthreadid};             if ( $newposition == $i ) { 
           &save_moved_file;                 foreach (@postnum) { 
           $leavemess = 0;                     if ( $leavemess == 1 ) {    # add 'no_postcount' into copies 
       } else {                         my @x = split /\|/xsm, $curthread[$_]; 
           $leavemess = 2;                         $x[5] = 'no_postcount'; 
           $forcenewinfo = 1;                         push @utdnewthread, join q{|}, @x; 
       }                    }
                     else {
   } elsif ($leavemess != 1) {                         push @utdnewthread, $curthread[$_]; 
       $leavemess = 2 if $newboard eq $binboard;                     } 
       for ($i = 0; $i < @curthread; $i++){                 } 
           if ($movingposts =~ /\b$i\b/){                 $linkcount = $i + 1; 
               if ($leavemess == 0 && $i == $postnum[$#postnum]){             } 
                   my $tmpsub;         } 
                   ($tmpsub, undef) = split(/\|/, $curthread[$i], 2);     } 
                   push (@utdcurthread, qq~$tmpsub|${$uid.$username}{'realname'}|${$uid.$username}{'email'}|$date|$username|no_postcount||$user_ip|[split] [link=$scripturl?num=$newthreadid/$linkcount#$linkcount][splithere][/link][splithere_end]||||\n~);  
               }     # Remove or copy selected posts from current thread 
           } else {    if ( $#postnum == $#curthread && $leavemess != 1 ) {
               push (@utdcurthread, $curthread[$i]);         if ( $newboard ne $binboard ) { 
           }             my ( $tmpsub, $tmpmessage ); 
       }             my $hidename = cloak($username); 
             ( $tmpsub, undef ) = split /\|/xsm, $curthread[0], 2;
   } else { @utdcurthread = @curthread; }             if ( $curboard eq $newboard ) { 
                 $tmpmessage =
   if ($forcenewinfo) {                   qq~[m by=$hidename dest=$newthreadid/$linkcount#$linkcount]~; 
       my ($boardtitle,$tmpsub,$tmpmessage);                 $tmpsub = qq~[m by=$hidename dest=$newthreadid]: '$tmpsub'~; 
       ($boardtitle, undef) = split(/\|/, $board{$curboard}, 2);             } 
       $tmpmessage = ($#postnum == $#utdnewthread ? "[b][movedhere]" : "[b][postsmovedhere1] " . @postnum . " [postsmovedhere2]") . " [i]$boardtitle\[/i] [move by] [i]${$uid.$username}{'realname'}\[/i].[/b]";             else { 
       &FromChars($tmpmessage);                 $tmpmessage = 
       ($tmpsub, undef, undef, undef, undef, undef, undef) = split(/\|/, $utdnewthread[0], 7);  qq~[m by=$hidename destboard=$newboard dest=$newthreadid/$linkcount#$linkcount]~; 
       splice(@utdnewthread, ($linkcount + @postnum), 0,qq~$sstxt{'21'} $tmpsub|${$uid.$username}{'realname'}|${$uid.$username}{'email'}|$date|$username|no_postcount||$user_ip|$tmpmessage||||\n~);                 $tmpsub = 
   }  qq~[m by=$hidename destboard=$newboard dest=$newthreadid]: '$tmpsub'~; 
             }
   if (@utdcurthread) {             FromChars($tmpmessage); 
       for ($i = 0; $i < @utdcurthread; $i++) { # sort post numbers             $utdcurthread[0] = 
           my @x = split(/\|/, $utdcurthread[$i]);  qq~$tmpsub|${$uid.$username}{'realname'}|${$uid.$username}{'email'}|$date|$username|no_postcount||$user_ip|$tmpmessage||||\n~; 
           $x[6] = $i;  
           $utdcurthread[$i] = join('|', @x);             if ( eval { require Variables::Movedthreads; 1 } ) { 
       }                 $moved_file{$curthreadid} = $newthreadid; 
       # Update current thread                 delete $moved_file{$newthreadid}; 
       fopen(FILE, ">$datadir/$curthreadid.txt");                 save_moved_file(); 
       print FILE @utdcurthread;                 $leavemess = 0; 
       fclose(FILE);             } 
   } else {         } 
       require "$sourcedir/RemoveTopic.pl";         else { 
       my $moveit = $INFO{'moveit'};             $leavemess    = 2; 
       $INFO{'moveit'} = 1;            $forcenewinfo = 1;
       &RemoveThread;         } 
       $INFO{'moveit'} = $moveit;     } 
   }     elsif ( $leavemess != 1 ) { 
         if ( $newboard eq $binboard ) { $leavemess = 2; }
   for ($i = 0; $i < @utdnewthread; $i++) { # sort post numbers         for my $i ( 0 .. $#curthread ) { 
       my @x = split(/\|/, $utdnewthread[$i]);             if ( $movingposts =~ /\b$i\b/xsm ) { 
       $x[6] = $i;                 if ( $leavemess == 0 && $i == $postnum[-1] ) { 
       $utdnewthread[$i] = join('|', @x);                     my $tmpsub; 
   }                     ( $tmpsub, undef ) = split /\|/xsm, $curthread[$i], 2; 
   # Update new thread                     push @utdcurthread, 
   fopen(FILE, ">$datadir/$newthreadid.txt");  qq~$tmpsub|${$uid.$username}{'realname'}|${$uid.$username}{'email'}|$date|$username|no_postcount||$user_ip|[split] [link=$scripturl?num=$newthreadid/$linkcount#$linkcount][splithere][/link][splithere_end]||||\n~; 
   print FILE @utdnewthread;                 } 
   fclose(FILE);             } 
             else {
   # Update the .rlog files of the users                 push @utdcurthread, $curthread[$i]; 
   my ($reply,$ms,$mn,$md,$mu,$mnp,$mi,%mu,%curthreadusersdate,%curthreaduserscount,%newthreadusersdate,%newthreaduserscount,%BoardTotals);             } 
   $reply = 0;         } 
   foreach (@utdcurthread) { # $subject|$name|$email|$date|$username|$icon|0|$user_ip|$message|$ns|||$fixfile  
       ($ms, $mn, undef, $md, $mu, $mnp, undef, $mi, undef) = split(/\|/, $_, 9);     } 
       $BoardTotals{$curthreadid} = [$md,$mu,$reply,$ms,$mn,$mi] if ${$BoardTotals{$curthreadid}}[0] <= $md;     else { @utdcurthread = @curthread; } 
       $reply++;  
       next if $mnp eq 'no_postcount';     if ($forcenewinfo) { 
       $curthreadusersdate{$mu} = $md if $curthreadusersdate{$mu} < $md;         my ( $boardtitle, $tmpsub, $tmpmessage ); 
       $curthreaduserscount{$mu}++;         ( $boardtitle, undef ) = split /\|/xsm, $board{$curboard}, 2; 
       $mu{$mu} = 1;         $tmpmessage = ( 
   }             $#postnum == $#utdnewthread 
   $reply = 0;             ? '[b][movedhere]' 
   foreach (@utdnewthread) {             : '[b][postsmovedhere1] ' . @postnum . ' [postsmovedhere2]' 
       ($ms, $mn, undef, $md, $mu, $mnp, undef, $mi, undef) = split(/\|/, $_, 9);           ) 
       $BoardTotals{$newthreadid} = [$md,$mu,$reply,$ms,$mn,$mi] if ${$BoardTotals{$newthreadid}}[0] <= $md;           . " [i]$boardtitle\[/i] [move by] [i]${$uid.$username}{'realname'}\[/i].[/b]"; 
       $reply++;         FromChars($tmpmessage); 
       next if $mnp eq 'no_postcount';         ( $tmpsub, undef, undef, undef, undef, undef, undef ) = 
       $newthreadusersdate{$mu} = $md if $newthreadusersdate{$mu} < $md;           split /\|/xsm, $utdnewthread[0], 7; 
       $newthreaduserscount{$mu}++;         splice @utdnewthread, ( $linkcount + @postnum ), 0, 
       $mu{$mu} = 1;  qq~$sstxt{'21'} $tmpsub|${$uid.$username}{'realname'}|${$uid.$username}{'email'}|$date|$username|no_postcount||$user_ip|$tmpmessage||||\n~; 
   }    }
   foreach $mu (keys %mu) {  
       &Recent_Load($mu);     if (@utdcurthread) { 
       delete $recent{$curthreadid};         for my $i ( 0 .. $#utdcurthread ) {    # sort post numbers 
       delete $recent{$newthreadid};             my @x = split /\|/xsm, $utdcurthread[$i]; 
       if ($curthreaduserscount{$mu}) {             $x[6] = $i; 
           ${$recent{$curthreadid}}[0] = $curthreaduserscount{$mu};             $utdcurthread[$i] = join q{|}, @x; 
           ${$recent{$curthreadid}}[1] = $curthreadusersdate{$mu};         } 
       }  
       if ($newthreaduserscount{$mu}) {         # Update current thread 
           ${$recent{$newthreadid}}[0] = $newthreaduserscount{$mu};         fopen( FILE, ">$datadir/$curthreadid.txt" ); 
           ${$recent{$newthreadid}}[1] = $newthreadusersdate{$mu};         print {FILE} @utdcurthread or croak "$croak{'print'} FILE"; 
       }         fclose(FILE); 
       &Recent_Save($mu);     } 
   }     else { 
         require Sources::RemoveTopic;
   # For: Mark threads/boards as read         my $moveit = $INFO{'moveit'}; 
   &getlog;         $INFO{'moveit'} = 1; 
   my $boardlog = 1;         RemoveThread(); 
   # Mark new thread as read because you will be directed there at the end         $INFO{'moveit'} = $moveit; 
   delete $yyuserlog{"$newthreadid--unread"};     } 
   $yyuserlog{$newthreadid} = $date;  
     for my $i ( 0 .. $#utdnewthread ) {    # sort post numbers
   # Update .ctb, tags=>(board replies views lastposter lastpostdate threadstatus repliers)         my @x = split /\|/xsm, $utdnewthread[$i]; 
   # curthread         $x[6] = $i; 
   ${$curthreadid}{'replies'} = $#utdcurthread;         $utdnewthread[$i] = join q{|}, @x; 
   ${$curthreadid}{'lastpostdate'} = ${$BoardTotals{$curthreadid}}[0];     } 
   ${$curthreadid}{'lastposter'}   = ${$BoardTotals{$curthreadid}}[1] eq 'Guest' ? "Guest-${$BoardTotals{$curthreadid}}[4]" : ${$BoardTotals{$curthreadid}}[1];  
   # newthread     # Update new thread 
   ${$newthreadid}{'replies'} = $#utdnewthread;     fopen( FILE, ">$datadir/$newthreadid.txt" ); 
   ${$newthreadid}{'lastpostdate'} = ${$BoardTotals{$newthreadid}}[0];     print {FILE} @utdnewthread or croak "$croak{'print'} FILE"; 
   ${$newthreadid}{'lastposter'}   = ${$BoardTotals{$newthreadid}}[1] eq 'Guest' ? "Guest-${$BoardTotals{$newthreadid}}[4]" : ${$BoardTotals{$newthreadid}}[1];     fclose(FILE); 
   if ($FORM{'newthread'} eq 'new') {  
       ${$newthreadid}{'board'} = $newboard;     # Update the .rlog files of the users 
       ${$newthreadid}{'views'} = $#postnum == $#curthread ? ${$curthreadid}{'views'} : ($INFO{'ss_submit'} ? 1 : 0);     my ( 
       ${$newthreadid}{'threadstatus'} = ${$curthreadid}{'threadstatus'};         $reply,               $ms,                 $mn, 
       ${$curthreadid}{'views'} = $#postnum == $#curthread && $leavemess != 1 ? 0 : ${$curthreadid}{'views'};         $md,                  $mu,                 $mnp, 
   } else {         $mi,                  %mu,                 %curthreadusersdate, 
       ${$newthreadid}{'views'} += int(${$curthreadid}{'views'} / @curthread * @postnum);         %curthreaduserscount, %newthreadusersdate, %newthreaduserscount, 
   }         %BoardTotals 
     );
   # Update current message index     $reply = 0; 
   fopen(BOARD, "+<$boardsdir/$curboard.txt", 1);     foreach (@utdcurthread) 
   my @curmessindex = <BOARD>;     { # $subject|$name|$email|$date|$username|$icon|0|$user_ip|$message|$ns|||$fixfile 
   truncate BOARD, 0;         ( $ms, $mn, undef, $md, $mu, $mnp, undef, $mi, undef ) = 
   seek BOARD, 0, 0;           split /\|/xsm, $_, 9; 
         if ( ${ $BoardTotals{$curthreadid} }[0] <= $md ) {
   my $old_mstate;             $BoardTotals{$curthreadid} = [ $md, $mu, $reply, $ms, $mn, $mi ]; 
   for ($i = 0; $i < @curmessindex; $i++) {         } 
       my ($mnum, $msub, $mname, $memail, $mdate, $mreplies, $musername, $micon, $mstate) = split(/\|/, $curmessindex[$i]);         $reply++; 
       $boardlog = 0 if $mdate > $yyuserlog{$curboard}; # For: Mark boards as read         next if $mnp eq 'no_postcount'; 
       if ($mnum == $curthreadid) {        if ( $curthreadusersdate{$mu} < $md ) {
           chomp $mstate;             $curthreadusersdate{$mu} = $md; 
           if ($#postnum == $#curthread && $leavemess != 1) { # thread was moved         } 
               my $hidename = &cloak($username);         $curthreaduserscount{$mu}++; 
               if ($curboard eq $newboard) {         $mu{$mu} = 1; 
                   $msub = qq~[m by=$hidename dest=$newthreadid]: '$msub'~;     } 
               } else {     $reply = 0; 
                   $msub = qq~[m by=$hidename destboard=$newboard dest=$newthreadid]: '$msub'~;     foreach (@utdnewthread) { 
               }         ( $ms, $mn, undef, $md, $mu, $mnp, undef, $mi, undef ) = 
               $mname = ${$uid.$username}{'realname'};           split /\|/xsm, $_, 9; 
               $memail = ${$uid.$username}{'email'};         if ( ${ $BoardTotals{$newthreadid} }[0] <= $md ) { 
               $mreplies = 0;             $BoardTotals{$newthreadid} = [ $md, $mu, $reply, $ms, $mn, $mi ]; 
               $musername = $username;         } 
               # alter message icon to 'exclamation' to match status 'lm'         $reply++; 
               $micon = 'exclamation' if $micon ne 'no_postcount';        next if $mnp eq 'no_postcount';
               # thread status - (a)nnoumcement, (h)idden, (l)ocked, (m)oved and (s)ticky         if ( $newthreadusersdate{$mu} < $md ) { 
               $old_mstate = $mstate;             $newthreadusersdate{$mu} = $md; 
               if ($curboard eq $annboard && $mstate !~ /a/i) { $mstate .= "a"; }        }
               if ($mstate !~ /l/i) { $mstate .= "l"; }         $newthreaduserscount{$mu}++; 
               if ($mstate !~ /m/i) { $mstate .= "m"; }         $mu{$mu} = 1; 
               ${$curthreadid}{'threadstatus'} = $mstate;     } 
           } else {    foreach my $mu ( keys %mu ) {
               ($msub, $mname, $memail, undef, $musername, $micon, undef) = split(/\|/, $utdcurthread[0], 7);         Recent_Load($mu); 
               $mreplies = ${$curthreadid}{'replies'};         delete $recent{$curthreadid}; 
           }         delete $recent{$newthreadid}; 
           $curmessindex[$i] = qq~$mnum|$msub|$mname|$memail|${$curthreadid}{'lastpostdate'}|$mreplies|$musername|$micon|$mstate\n~;         if ( $curthreaduserscount{$mu} ) { 
           ${$BoardTotals{$mnum}}[6] = $mstate;             ${ $recent{$curthreadid} }[0] = $curthreaduserscount{$mu}; 
             ${ $recent{$curthreadid} }[1] = $curthreadusersdate{$mu};
       } elsif ($mnum == $newthreadid) {         } 
           chomp $mstate;         if ( $newthreaduserscount{$mu} ) { 
           if ($FORM{'position'} eq 'begin') {             ${ $recent{$newthreadid} }[0] = $newthreaduserscount{$mu}; 
               ($msub, $mname, $memail, undef, $musername, $micon, undef) = split(/\|/, $utdnewthread[0], 7);             ${ $recent{$newthreadid} }[1] = $newthreadusersdate{$mu}; 
           }        }
           $yyThreadLine = $curmessindex[$i] = qq~$mnum|$msub|$mname|$memail|${$newthreadid}{'lastpostdate'}|${$newthreadid}{'replies'}|$musername|$micon|$mstate\n~;         Recent_Save($mu); 
           ${$BoardTotals{$mnum}}[6] = $mstate;     } 
           if (($enable_notifications == 1 || $enable_notifications == 3) && (-e "$boardsdir/$curboard.mail" || -e "$datadir/$newthreadid.mail")) {  
               require "$sourcedir/Post.pl";     # For: Mark threads/boards as read 
               $currentboard = $curboard;     getlog(); 
               $msub = &Censor($msub);     my $boardlog = 1; 
               &ReplyNotify($newthreadid, $msub, ${$newthreadid}{'replies'});  
           }     # Mark new thread as read because you will be directed there at the end 
       }     delete $yyuserlog{"$newthreadid--unread"}; 
   }     $yyuserlog{$newthreadid} = $date; 
   if ($curboard eq $newboard && $FORM{'newthread'} eq 'new') {  
       my ($msub,$mname,$memail,$musername,$micon);  # Update .ctb, tags=>(board replies views lastposter lastpostdate threadstatus repliers) 
       ($msub, $mname, $memail, undef, $musername, $micon, undef) = split(/\|/, $utdnewthread[0], 7);  # curthread 
       if ($old_mstate !~ /0/i) { $old_mstate .= "0"; }     ${$curthreadid}{'replies'}      = $#utdcurthread; 
       $yyThreadLine = qq~$newthreadid|$msub|$mname|$memail|${$newthreadid}{'lastpostdate'}|${$newthreadid}{'replies'}|$musername|$micon|$old_mstate\n~;     ${$curthreadid}{'lastpostdate'} = ${ $BoardTotals{$curthreadid} }[0]; 
       unshift (@curmessindex, $yyThreadLine);     ${$curthreadid}{'lastposter'} = 
       ${$BoardTotals{$newthreadid}}[6] = $old_mstate;       ${ $BoardTotals{$curthreadid} }[1] eq 'Guest' 
       if (($enable_notifications == 1 || $enable_notifications == 3) && -e "$boardsdir/$newboard.mail") {       ? "Guest-${$BoardTotals{$curthreadid}}[4]" 
           require "$sourcedir/Post.pl";       : ${ $BoardTotals{$curthreadid} }[1]; 
           $currentboard = $curboard;  
           $msub = &Censor($msub);     # newthread 
           &NewNotify($newthreadid, $msub);     ${$newthreadid}{'replies'}      = $#utdnewthread; 
       }     ${$newthreadid}{'lastpostdate'} = ${ $BoardTotals{$newthreadid} }[0]; 
   }     ${$newthreadid}{'lastposter'} = 
   print BOARD sort { (split(/\|/,$b,6))[4] <=> (split(/\|/,$a,6))[4] } @curmessindex;       ${ $BoardTotals{$newthreadid} }[1] eq 'Guest' 
   fclose(BOARD);       ? "Guest-${$BoardTotals{$newthreadid}}[4]" 
       : ${ $BoardTotals{$newthreadid} }[1];
   $yyuserlog{$curboard} = $date if $boardlog; # For: Mark boards as read     if ( $FORM{'newthread'} eq 'new' ) { 
         ${$newthreadid}{'board'} = $newboard;
   # Update new message index if needed         ${$newthreadid}{'views'} = 
   if ($curboard ne $newboard) {           $#postnum == $#curthread 
       $boardlog = 1; # For: Mark boards as read           ? ${$curthreadid}{'views'} 
           : ( $INFO{'ss_submit'} ? 1 : 0 );
       fopen(BOARD, "+<$boardsdir/$newboard.txt", 1);         ${$newthreadid}{'threadstatus'} = ${$curthreadid}{'threadstatus'}; 
       seek BOARD, 0, 0;         ${$curthreadid}{'views'}        = $#postnum == $#curthread 
       my @newmessindex = <BOARD>;           && $leavemess != 1 ? 0 : ${$curthreadid}{'views'}; 
       truncate BOARD, 0;     } 
       seek BOARD, 0, 0;     else { 
         ${$newthreadid}{'views'} +=
       if ($FORM{'newthread'} eq 'new') {           int( ${$curthreadid}{'views'} / @curthread * @postnum ); 
           # For: Mark boards as read     } 
           foreach (@newmessindex) {  
               $boardlog = 0 if (split(/\|/, $_, 6))[4] > $yyuserlog{$newboard};     # Update current message index 
               last if !$boardlog;     fopen( BOARD, "<$boardsdir/$curboard.txt", 1 ); 
           }     my @curmessindex = <BOARD>; 
     fclose( BOARD );
           my ($msub,$mname,$memail,$musername,$micon);  
           ($msub, $mname, $memail, undef, $musername, $micon, undef) = split(/\|/, $utdnewthread[0], 7);     my $old_mstate; 
           if ($old_mstate =~ /a/i) {    for my $i ( 0 .. $#curmessindex ) {
               if ($newboard ne $annboard) { $old_mstate =~ s/a//gi; }         my ( 
           } elsif ($newboard eq $annboard) {             $mnum,     $msub,      $mname, $memail, $mdate, 
               $old_mstate .= "a";             $mreplies, $musername, $micon, $mstate 
           }         ) = split /\|/xsm, $curmessindex[$i]; 
           if ($old_mstate !~ /0/i) { $old_mstate .= "0"; }         if ( $mdate > $yyuserlog{$curboard} ) { 
           $yyThreadLine = qq~$newthreadid|$msub|$mname|$memail|${$newthreadid}{'lastpostdate'}|${$newthreadid}{'replies'}|$musername|$micon|$old_mstate\n~;             $boardlog = 0; 
           unshift (@newmessindex, $yyThreadLine);         }    # For: Mark boards as read 
           ${$BoardTotals{$newthreadid}}[6] = $old_mstate;         if ( $mnum == $curthreadid ) { 
           if (($enable_notifications == 1 || $enable_notifications == 3) && -e "$boardsdir/$newboard.mail") {             chomp $mstate; 
               require "$sourcedir/Post.pl";             if ( $#postnum == $#curthread && $leavemess != 1 ) 
               $currentboard = $newboard;             {    # thread was moved 
               $msub = &Censor($msub);                 my $hidename = cloak($username); 
               &NewNotify($newthreadid, $msub);                 if ( $curboard eq $newboard ) { 
           }                     $msub = qq~[m by=$hidename dest=$newthreadid]: '$msub'~; 
                 }
       } else {                else {
           for ($i = 0; $i < @newmessindex; $i++) {                     $msub = 
               my ($mnum, $msub, $mname, $memail, $mdate, $mreplies, $musername, $micon, $mstate) = split(/\|/, $newmessindex[$i]);  qq~[m by=$hidename destboard=$newboard dest=$newthreadid]: '$msub'~; 
               $boardlog = 0 if $mdate > $yyuserlog{$newboard}; # For: Mark boards as read                 } 
               if ($mnum == $newthreadid) {                 $mname     = ${ $uid . $username }{'realname'}; 
                   chomp $mstate;                 $memail    = ${ $uid . $username }{'email'}; 
                   if ($FORM{'position'} eq 'begin') {                 $mreplies  = 0; 
                       ($msub, $mname, $memail, undef, $musername, $micon, undef) = split(/\|/, $utdnewthread[0], 7);                 $musername = $username; 
                   }  
                   $yyThreadLine = $newmessindex[$i] = qq~$mnum|$msub|$mname|$memail|${$newthreadid}{'lastpostdate'}|${$newthreadid}{'replies'}|$musername|$micon|$mstate\n~;                 # alter message icon to 'exclamation' to match status 'lm' 
                   ${$BoardTotals{$mnum}}[6] = $mstate;                 if ( $micon ne 'no_postcount' ) { $micon = 'exclamation'; } 
               }  
           }       # thread status - (a)nnoumcement, (h)idden, (l)ocked, (m)oved and (s)ticky 
           if (($enable_notifications == 1 || $enable_notifications == 3) && (-e "$boardsdir/$newboard.mail" || -e "$datadir/$newthreadid.mail")) {                 $old_mstate = $mstate; 
               require "$sourcedir/Post.pl";                 if ( $curboard eq $annboard && $mstate !~ /a/ism ) { 
               $currentboard = $newboard;                     $mstate .= 'a'; 
               $msub = &Censor($msub);                 } 
               &ReplyNotify($newthreadid, $msub, ${$newthreadid}{'replies'});                 if ( $mstate !~ /l/ism ) { $mstate .= 'l'; } 
           }                if ( $mstate !~ /m/ism ) { $mstate .= 'm'; }
       }                 ${$curthreadid}{'threadstatus'} = $mstate; 
       print BOARD sort { (split /\|/,$b,6)[4] <=> (split /\|/,$a,6)[4] } @newmessindex;             } 
       fclose(BOARD);             else { 
                 ( $msub, $mname, $memail, undef, $musername, $micon, undef ) =
       $yyuserlog{$newboard} = $date if $boardlog; # For: Mark boards as read                   split /\|/xsm, $utdcurthread[0], 7; 
   }                 $mreplies = ${$curthreadid}{'replies'}; 
             }
   &MessageTotals("update", $curthreadid) if @utdcurthread;             $curmessindex[$i] = 
   &MessageTotals("update", $newthreadid);  qq~$mnum|$msub|$mname|$memail|${$curthreadid}{'lastpostdate'}|$mreplies|$musername|$micon|$mstate\n~; 
             ${ $BoardTotals{$mnum} }[6] = $mstate;
   # update current board totals  
   # BoardTotals- tags => (board threadcount messagecount lastposttime lastposter lastpostid lastreply lastsubject lasticon lasttopicstate)         } 
   #&BoardTotals("load", $curboard); - Load this at top now to detect if newest board post is being moved - Unilat         elsif ( $mnum == $newthreadid ) { 
   if (${$BoardTotals{$curthreadid}}[6] =~ /m/) { # Moved-Info thread             chomp $mstate; 
       if ($curboard ne $newboard) {            if ( $FORM{'position'} eq 'begin' ) {
           ${$uid.$curboard}{'threadcount'}--;                 ( $msub, $mname, $memail, undef, $musername, $micon, undef ) = 
           ${$uid.$curboard}{'messagecount'} -= @postnum;                   split /\|/xsm, $utdnewthread[0], 7; 
       }            }
       &BoardSetLastInfo($curboard,\@curmessindex);             $yyThreadLine = $curmessindex[$i] = 
   } else {  qq~$mnum|$msub|$mname|$memail|${$newthreadid}{'lastpostdate'}|${$newthreadid}{'replies'}|$musername|$micon|$mstate\n~; 
       if ($FORM{'newthread'} eq 'new' && $curboard eq $newboard) { ${$uid.$curboard}{'threadcount'}++; }             ${ $BoardTotals{$mnum} }[6] = $mstate; 
       if ($leavemess == 0) {             if ( 
           if ($curboard ne $newboard) { ${$uid.$curboard}{'messagecount'} -= $#postnum; }                 ( $enable_notifications == 1 || $enable_notifications == 3 ) 
           else { ${$uid.$curboard}{'messagecount'} += ($forcenewinfo ? 2 : 1); }                 && (   -e "$boardsdir/$curboard.mail" 
       } elsif ($leavemess == 1 && $curboard eq $newboard) {                     || -e "$datadir/$newthreadid.mail" ) 
           ${$uid.$curboard}{'messagecount'} += $#postnum + ($forcenewinfo ? 1 : 0);               ) 
       } elsif ($leavemess == 2 && $curboard ne $newboard && @utdcurthread) {            {
           ${$uid.$curboard}{'messagecount'} -= @postnum;                 require Sources::Post; 
       }                 $currentboard = $curboard; 
       if ($newest_post || (((${$uid.$curboard}{'threadcount'} == 1 && @utdcurthread) || ${$BoardTotals{$curthreadid}}[0] >= ${$uid.$curboard}{'lastposttime'}) && ($curboard ne $newboard || ${$BoardTotals{$curthreadid}}[0] >= ${$BoardTotals{$newthreadid}}[0]))) {                 $msub         = Censor($msub); 
           ${$uid.$curboard}{'lastposttime'}   = ${$BoardTotals{$curthreadid}}[0];                 ReplyNotify( $newthreadid, $msub, ${$newthreadid}{'replies'} ); 
           ${$uid.$curboard}{'lastposter'}     = ${$BoardTotals{$curthreadid}}[1] eq 'Guest' ? "Guest-${$BoardTotals{$curthreadid}}[4]" : ${$BoardTotals{$curthreadid}}[1];             } 
           ${$uid.$curboard}{'lastpostid'}     = $curthreadid;         } 
           ${$uid.$curboard}{'lastreply'}      = ${$BoardTotals{$curthreadid}}[2]--;     } 
           ${$uid.$curboard}{'lastsubject'}    = ${$BoardTotals{$curthreadid}}[3];     if ( $curboard eq $newboard && $FORM{'newthread'} eq 'new' ) { 
           ${$uid.$curboard}{'lasticon'}       = ${$BoardTotals{$curthreadid}}[5];         my ( $msub, $mname, $memail, $musername, $micon ); 
           ${$uid.$curboard}{'lasttopicstate'} = ${$BoardTotals{$curthreadid}}[6];         ( $msub, $mname, $memail, undef, $musername, $micon, undef ) = 
       } elsif (${$BoardTotals{$newthreadid}}[0] >= ${$uid.$curboard}{'lastposttime'} && $curboard eq $newboard) {           split /\|/xsm, $utdnewthread[0], 7; 
           ${$uid.$curboard}{'lastposttime'}   = ${$BoardTotals{$newthreadid}}[0];         if ( $old_mstate !~ /0/ism ) { $old_mstate .= '0'; } 
           ${$uid.$curboard}{'lastposter'}     = ${$BoardTotals{$newthreadid}}[1] eq 'Guest' ? "Guest-${$BoardTotals{$newthreadid}}[4]" : ${$BoardTotals{$newthreadid}}[1];         $yyThreadLine = 
           ${$uid.$curboard}{'lastpostid'}     = $newthreadid;  qq~$newthreadid|$msub|$mname|$memail|${$newthreadid}{'lastpostdate'}|${$newthreadid}{'replies'}|$musername|$micon|$old_mstate\n~; 
           ${$uid.$curboard}{'lastreply'}      = ${$BoardTotals{$newthreadid}}[2]--;         unshift @curmessindex, $yyThreadLine; 
           ${$uid.$curboard}{'lastsubject'}    = ${$BoardTotals{$newthreadid}}[3];         ${ $BoardTotals{$newthreadid} }[6] = $old_mstate; 
           ${$uid.$curboard}{'lasticon'}       = ${$BoardTotals{$newthreadid}}[5];         if ( ( $enable_notifications == 1 || $enable_notifications == 3 ) 
           ${$uid.$curboard}{'lasttopicstate'} = ${$BoardTotals{$newthreadid}}[6];             && -e "$boardsdir/$newboard.mail" ) 
       }         { 
       &BoardSetLastInfo($curboard,\@curmessindex);             require Sources::Post; 
   }             $currentboard = $curboard; 
             $msub         = Censor($msub);
   # update new board totals if needed             NewNotify( $newthreadid, $msub ); 
   if ($curboard ne $newboard) {         } 
       &BoardTotals("load", $newboard);     } 
       if ($FORM{'newthread'} eq 'new') { ${$uid.$newboard}{'threadcount'}++; }     fopen( BOARD, ">$boardsdir/$curboard.txt", 1 ); 
       ${$uid.$newboard}{'messagecount'} += @postnum + ($forcenewinfo ? 1 : 0);     print {BOARD} reverse 
       if (${$uid.$newboard}{'threadcount'} == 1 || ${$BoardTotals{$newthreadid}}[0] >= ${$uid.$newboard}{'lastposttime'}) {       sort { ( split /\|/xsm, $a, 6 )[4] <=> ( split /\|/xsm, $b, 6 )[4] } 
           ${$uid.$newboard}{'lastposttime'}   = ${$BoardTotals{$newthreadid}}[0];       @curmessindex 
           ${$uid.$newboard}{'lastposter'}     = ${$BoardTotals{$newthreadid}}[1] eq 'Guest' ? "Guest-${$BoardTotals{$newthreadid}}[4]" : ${$BoardTotals{$newthreadid}}[1];       or croak "$croak{'print'} BOARD"; 
           ${$uid.$newboard}{'lastpostid'}     = $newthreadid;     fclose( BOARD ); 
           ${$uid.$newboard}{'lastreply'}      = ${$BoardTotals{$newthreadid}}[2]--;  
           ${$uid.$newboard}{'lastsubject'}    = ${$BoardTotals{$newthreadid}}[3];     if ($boardlog) { 
           ${$uid.$newboard}{'lasticon'}       = ${$BoardTotals{$newthreadid}}[5];         $yyuserlog{$curboard} = $date; 
           ${$uid.$newboard}{'lasttopicstate'} = ${$BoardTotals{$newthreadid}}[6];     }    # For: Mark boards as read 
       }  
       &BoardTotals("update", $newboard);     # Update new message index if needed 
   }     if ( $curboard ne $newboard ) { 
         $boardlog = 1;    # For: Mark boards as read
   # now fix all attachments.txt info  
   my $attachments;         fopen( BOARD, "+<$boardsdir/$newboard.txt", 1 ); 
   for ($i = $postnum[0]; $i < @curthread; $i++){ # see if old thread had attachments         seek BOARD, 0, 0; 
       $attachments = (split(/\|/, $curthread[$i]))[12];         my @newmessindex = <BOARD>; 
       chomp $attachments;         truncate BOARD, 0; 
       if ($attachments) {         seek BOARD, 0, 0; 
           $attachments = 1;  
           last;         if ( $FORM{'newthread'} eq 'new' ) { 
       }  
   }             # For: Mark boards as read 
   if (!$attachments) { # see if new thread has attachments             foreach (@newmessindex) { 
       for ($i = $linkcount; $i < @utdnewthread; $i++){                 if ( ( split /\|/xsm, $_, 6 )[4] > $yyuserlog{$newboard} ) { 
           $attachments = (split(/\|/, $utdnewthread[$i]))[12];                     $boardlog = 0; 
           chomp $attachments;                 } 
           if ($attachments) {                 last if !$boardlog; 
               $attachments = 2;             } 
               last;  
           }             my ( $msub, $mname, $memail, undef, $musername, $micon, undef ) = 
       }               split /\|/xsm, $utdnewthread[0], 7; 
   }             if ( $old_mstate =~ /a/ism ) { 
   if ($attachments) {                 if ( $newboard ne $annboard ) { $old_mstate =~ s/a//gism; } 
       my ($attid,$attachmentname,$downloadscount,@newattachments,%attachments,$mreplies,$msub,$mname,$mdate,$mfn);             } 
       fopen(ATM, "+<$vardir/attachments.txt", 1) || &fatal_error("cannot_open","$vardir/attachments.txt", 1);             elsif ( $newboard eq $annboard ) { 
       seek ATM, 0, 0;                 $old_mstate .= 'a'; 
       while (<ATM>) {             } 
           ($attid, undef, undef, undef, undef, undef, undef, $attachmentname, $downloadscount) = split(/\|/, $_);             if ( $old_mstate !~ /0/ism ) { $old_mstate .= '0'; } 
           push(@newattachments, $_) if ($attid != $curthreadid && $attid != $newthreadid) || ($attid == $curthreadid && $attachments != 1);             $yyThreadLine = 
           chomp $downloadscount;  qq~$newthreadid|$msub|$mname|$memail|${$newthreadid}{'lastpostdate'}|${$newthreadid}{'replies'}|$musername|$micon|$old_mstate\n~; 
           $attachments{$attachmentname} = $downloadscount;             unshift @newmessindex, $yyThreadLine; 
       }             ${ $BoardTotals{$newthreadid} }[6] = $old_mstate; 
             if ( ( $enable_notifications == 1 || $enable_notifications == 3 )
       $mreplies = 0;                 && -e "$boardsdir/$newboard.mail" ) 
       if ($attachments == 1) {            {
           foreach (@utdcurthread) { # fix new old thread attachments                 require Sources::Post; 
               ($msub, $mname, undef, $mdate, undef, undef, undef, undef, undef, undef, undef, undef, $mfn) = split(/\|/, $_);                 $currentboard = $newboard; 
               chomp $mfn;                 $msub         = Censor($msub); 
               foreach (split(/,/, $mfn)) {                 NewNotify( $newthreadid, $msub ); 
                   if (-e "$uploaddir/$_") {             } 
                       my $asize = int((-s "$uploaddir/$_") / 1024) || 1;         } 
                       push (@newattachments, qq~$curthreadid|$mreplies|$msub|$mname|$curboard|$asize|$mdate|$_|~ . ($attachments{$_} || 0) . qq~\n~);         else { 
                   }             for my $i ( 0 .. $#newmessindex ) { 
               }                 my ( 
               $mreplies++;                     $mnum,     $msub,      $mname, $memail, $mdate, 
           }                     $mreplies, $musername, $micon, $mstate 
       }                 ) = split /\|/xsm, $newmessindex[$i]; 
                 if ( $mdate > $yyuserlog{$newboard} ) {
       $mreplies = 0;                    $boardlog = 0;
       foreach (@utdnewthread) { # fix new thread attachments                 }    # For: Mark boards as read 
           ($msub, $mname, undef, $mdate, undef, undef, undef, undef, undef, undef, undef, undef, $mfn) = split(/\|/, $_);                 if ( $mnum == $newthreadid ) { 
           chomp $mfn;                     chomp $mstate; 
           foreach (split(/,/, $mfn)) {                    if ( $FORM{'position'} eq 'begin' ) {
               if (-e "$uploaddir/$_") {                         ( 
                   my $asize = int((-s "$uploaddir/$_") / 1024) || 1;                             $msub, $mname, $memail, undef, $musername, $micon, 
                   push (@newattachments, qq~$newthreadid|$mreplies|$msub|$mname|$newboard|$asize|$mdate|$_|~ . ($attachments{$_} || 0) . qq~\n~);                             undef 
               }                         ) = split /\|/xsm, $utdnewthread[0], 7; 
           }                    }
           $mreplies++;                     $yyThreadLine = $newmessindex[$i] = 
       }  qq~$mnum|$msub|$mname|$memail|${$newthreadid}{'lastpostdate'}|${$newthreadid}{'replies'}|$musername|$micon|$mstate\n~; 
                     ${ $BoardTotals{$mnum} }[6] = $mstate;
       truncate ATM, 0;                 } 
       seek ATM, 0, 0;             } 
       print ATM sort { (split(/\|/,$a,8))[6] <=> (split(/\|/,$b,8))[6] } @newattachments;             if ( 
       fclose(ATM);                 ( $enable_notifications == 1 || $enable_notifications == 3 ) 
   }                 && (   -e "$boardsdir/$newboard.mail" 
                     || -e "$datadir/$newthreadid.mail" )
   if ($#postnum == $#curthread) {               ) 
       if (-e "$datadir/$curthreadid.poll") {            {
           rename("$datadir/$curthreadid.poll", "$datadir/$newthreadid.poll");                 require Sources::Post; 
       }                 $currentboard = $newboard; 
       if (-e "$datadir/$curthreadid.polled") {                 $msub         = Censor($msub); 
           rename("$datadir/$curthreadid.polled", "$datadir/$newthreadid.polled");                 ReplyNotify( $newthreadid, $msub, ${$newthreadid}{'replies'} ); 
       }            }
       if (-e "$datadir/$curthreadid.mail") {         } 
           rename("$datadir/$curthreadid.mail", "$datadir/$newthreadid.mail");         print {BOARD} reverse 
           require "$sourcedir/Notify.pl";           sort { ( split /\|/xsm, $a, 6 )[4] <=> ( split /\|/xsm, $b, 6 )[4] } 
           &ManageThreadNotify("load", $newthreadid);           @newmessindex 
           my ($u,%t);           or croak "$croak{'print'} BOARD"; 
           foreach $u (keys %thethread) {         fclose(BOARD); 
               &LoadUser($u);  
               foreach (split(/,/, ${$uid.$u}{'thread_notifications'})) {        if ($boardlog) {
                   $t{$_} = 1;             $yyuserlog{$newboard} = $date; 
               }         }    # For: Mark boards as read 
               delete $t{$curthreadid};     } 
               $t{$newthreadid} = 1;  
               ${$uid.$u}{'thread_notifications'} = join(',', keys %t);     if (@utdcurthread) { MessageTotals( 'update', $curthreadid ); } 
               &UserAccount($u);     MessageTotals( 'update', $newthreadid ); 
               undef %t;  
           }  # update current board totals 
       }  # BoardTotals- tags => (board threadcount messagecount lastposttime lastposter lastpostid lastreply lastsubject lasticon lasttopicstate) 
   }  #&BoardTotals("load", $curboard); - Load this at top now to detect if newest board post is being moved - Unilat 
     if ( ${ $BoardTotals{$curthreadid} }[6] =~ /m/sm ) {    # Moved-Info thread
   # Mark current thread as read         if ( $curboard ne $newboard ) { 
   delete $yyuserlog{"$curthreadid--unread"};             ${ $uid . $curboard }{'threadcount'}--; 
   &dumplog($curthreadid); # Save threads/boards as read             ${ $uid . $curboard }{'messagecount'} -= @postnum; 
         }
   chomp $yyThreadLine;         BoardSetLastInfo( $curboard, \@curmessindex ); 
     }
   if ($INFO{'moveit'} == 1) {    else {
       $currentboard = $curboard;         if ( $FORM{'newthread'} eq 'new' && $curboard eq $newboard ) { 
       return;             ${ $uid . $curboard }{'threadcount'}++; 
   }        }
   if ($INFO{'ss_submit'}) {        if ( $leavemess == 0 ) {
       $currentboard = $newboard;             if ( $curboard ne $newboard ) { 
       $INFO{'num'} = $INFO{'thread'} = $FORM{'threadid'} = $curnum = $newthreadid;                 ${ $uid . $curboard }{'messagecount'} -= $#postnum; 
       &redirectinternal;             } 
   }             else { 
   if ($debug == 1 or ($debug == 2 && $iamadmin)) {                 ${ $uid . $curboard }{'messagecount'} += 
       require "$sourcedir/Debug.pl";                   ( $forcenewinfo ? 2 : 1 ); 
       &Debug;             } 
       $yydebug = qq~\n- $#utdnewthread<br />\n- @utdnewthread<br />\n- ${$newthreadid}{'lastpostdate'}<br />\n- ${$newthreadid}{'lastposter'}<br />\n- \$enable_notifications == $enable_notifications<br />\n- \$attachments = $attachments<br />\n<a href="javascript:load_thread($newthreadid,$linkcount);">continue</a>\n$yydebug~;         } 
   }         elsif ( $leavemess == 1 && $curboard eq $newboard ) { 
             ${ $uid . $curboard }{'messagecount'} +=
   &print_output_header;               $#postnum + ( $forcenewinfo ? 1 : 0 ); 
         }
   $output = qq~<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">         elsif ( $leavemess == 2 && $curboard ne $newboard && @utdcurthread ) { 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">             ${ $uid . $curboard }{'messagecount'} -= @postnum; 
         }
         if (
             $newest_post
             || (
                 (
                     (
                         ${ $uid . $curboard }{'threadcount'} == 1
                         && @utdcurthread
                     )
                     || ${ $BoardTotals{$curthreadid} }[0] >=
                     ${ $uid . $curboard }{'lastposttime'}
                 )
                 && ( $curboard ne $newboard
                     || ${ $BoardTotals{$curthreadid} }[0] >=
                     ${ $BoardTotals{$newthreadid} }[0] )
             )
           )
         {
             ${ $uid . $curboard }{'lastposttime'} =
               ${ $BoardTotals{$curthreadid} }[0];
             ${ $uid . $curboard }{'lastposter'} =
               ${ $BoardTotals{$curthreadid} }[1] eq 'Guest' 
               ? "Guest-${$BoardTotals{$curthreadid}}[4]" 
               : ${ $BoardTotals{$curthreadid} }[1];
             ${ $uid . $curboard }{'lastpostid'} = $curthreadid;
             ${ $uid . $curboard }{'lastreply'} =
               ${ $BoardTotals{$curthreadid} }[2]--;
             ${ $uid . $curboard }{'lastsubject'} =
               ${ $BoardTotals{$curthreadid} }[3];
             ${ $uid . $curboard }{'lasticon'} =
               ${ $BoardTotals{$curthreadid} }[5];
             ${ $uid . $curboard }{'lasttopicstate'} =
               ${ $BoardTotals{$curthreadid} }[6];
         }
         elsif ( ${ $BoardTotals{$newthreadid} }[0] >=
             ${ $uid . $curboard }{'lastposttime'}
             && $curboard eq $newboard )
         {
             ${ $uid . $curboard }{'lastposttime'} =
               ${ $BoardTotals{$newthreadid} }[0];
             ${ $uid . $curboard }{'lastposter'} =
               ${ $BoardTotals{$newthreadid} }[1] eq 'Guest' 
               ? "Guest-${$BoardTotals{$newthreadid}}[4]" 
               : ${ $BoardTotals{$newthreadid} }[1];
             ${ $uid . $curboard }{'lastpostid'} = $newthreadid;
             ${ $uid . $curboard }{'lastreply'} =
               ${ $BoardTotals{$newthreadid} }[2]--;
             ${ $uid . $curboard }{'lastsubject'} =
               ${ $BoardTotals{$newthreadid} }[3];
             ${ $uid . $curboard }{'lasticon'} =
               ${ $BoardTotals{$newthreadid} }[5];
             ${ $uid . $curboard }{'lasttopicstate'} =
               ${ $BoardTotals{$newthreadid} }[6];
         }
         BoardSetLastInfo( $curboard, \@curmessindex );
     }
   
     # update new board totals if needed
     if ( $curboard ne $newboard ) {
         BoardTotals( 'load', $newboard );
         if ( $FORM{'newthread'} eq 'new' ) {
             ${ $uid . $newboard }{'threadcount'}++;
         }
         ${ $uid . $newboard }{'messagecount'} +=
           @postnum + ( $forcenewinfo ? 1 : 0 );
         if (   ${ $uid . $newboard }{'threadcount'} == 1
             || ${ $BoardTotals{$newthreadid} }[0] >=
             ${ $uid . $newboard }{'lastposttime'} )
         {
             ${ $uid . $newboard }{'lastposttime'} =
               ${ $BoardTotals{$newthreadid} }[0];
             ${ $uid . $newboard }{'lastposter'} =
               ${ $BoardTotals{$newthreadid} }[1] eq 'Guest' 
               ? "Guest-${$BoardTotals{$newthreadid}}[4]" 
               : ${ $BoardTotals{$newthreadid} }[1];
             ${ $uid . $newboard }{'lastpostid'} = $newthreadid;
             ${ $uid . $newboard }{'lastreply'} =
               ${ $BoardTotals{$newthreadid} }[2]--;
             ${ $uid . $newboard }{'lastsubject'} =
               ${ $BoardTotals{$newthreadid} }[3];
             ${ $uid . $newboard }{'lasticon'} =
               ${ $BoardTotals{$newthreadid} }[5];
             ${ $uid . $newboard }{'lasttopicstate'} =
               ${ $BoardTotals{$newthreadid} }[6];
         }
         BoardTotals( 'update', $newboard );
     }
   
     # now fix all attachments.txt info
     my $attachments;
     for my $i ( $postnum[0] .. $#curthread )
     {    # see if old thread had attachments
         $attachments = ( split /\|/xsm, $curthread[$i] )[12];
         chomp $attachments;
         if ($attachments) {
             $attachments = 1;
             last;
         }
     }
     if ( !$attachments ) {    # see if new thread has attachments
         for my $i ( $linkcount .. $#utdnewthread ) {
             $attachments = ( split /\|/xsm, $utdnewthread[$i] )[12];
             chomp $attachments;
             if ($attachments) {
                 $attachments = 2;
                 last;
             }
         }
     }
     if ($attachments) {
         my ( @newattachments, %attachments );
         fopen( ATM, "<$vardir/attachments.txt", 1 )
           or fatal_error( 'cannot_open', "$vardir/attachments.txt", 1 );
         my @attach = <ATM>;
         fclose(ATM);
         for (@attach) {
             my (
                 $attid, undef, undef, undef, undef, undef, undef,
                 $attachmentname, $downloadscount
             ) = split /\|/xsm, $_;
             if (   ( $attid != $curthreadid && $attid != $newthreadid )
                 || ( $attid == $curthreadid && $attachments != 1 ) )
             {
                 push @newattachments, $_;
             }
             chomp $downloadscount;
             $attachments{$attachmentname} = $downloadscount;
         }
   
         my $mreplies = 0;
         if ( $attachments == 1 ) {
             foreach (@utdcurthread) {    # fix new old thread attachments
                 my (
                     $msub, $mname, undef, $mdate, undef, undef, undef,
                     undef, undef,  undef, undef,  undef, $mfn
                 ) = split /\|/xsm, $_;
                 chomp $mfn;
                 foreach ( split /,/xsm, $mfn ) {
                     if ( -e "$uploaddir/$_" ) {
                         my $asize = int( ( -s "$uploaddir/$_" ) / 1024 )
                           || 1;
                         push @newattachments,
  qq~$curthreadid|$mreplies|$msub|$mname|$curboard|$asize|$mdate|$_|~
                           . ( $attachments{$_} || 0 ) . qq~\n~;
                     }
                 }
                 $mreplies++;
             }
         }
   
         $mreplies = 0;
         foreach (@utdnewthread) {    # fix new thread attachments
             my (
                 $msub, $mname, undef, $mdate, undef, undef, undef,
                 undef, undef,  undef, undef,  undef, $mfn
             ) = split /\|/xsm, $_;
             chomp $mfn;
             foreach ( split /,/xsm, $mfn ) {
                 if ( -e "$uploaddir/$_" ) {
                     my $asize = int( ( -s "$uploaddir/$_" ) / 1024 ) || 1;
                     push @newattachments,
  qq~$newthreadid|$mreplies|$msub|$mname|$newboard|$asize|$mdate|$_|~
                       . ( $attachments{$_} || 0 ) . qq~\n~;
                 }
             }
             $mreplies++;
         }
         fopen( FATM, ">$vardir/attachments.txt" )
           or fatal_error( 'cannot_open', "$vardir/attachments.txt" );
             print {FATM}
             sort { ( split /\|/xsm, $a, 8 )[6] <=> ( split /\|/xsm, $b, 8 )[6] }
             @newattachments or croak "$croak{'print'} ATM";
         fclose(FATM);
     }
   
     if ( $#postnum == $#curthread ) {
         if ( -e "$datadir/$curthreadid.poll" ) {
             rename
               "$datadir/$curthreadid.poll",
               "$datadir/$newthreadid.poll";
         }
         if ( -e "$datadir/$curthreadid.polled" ) {
             rename
               "$datadir/$curthreadid.polled",
               "$datadir/$newthreadid.polled";
         }
         if ( -e "$datadir/$curthreadid.mail" ) {
             rename
               "$datadir/$curthreadid.mail",
               "$datadir/$newthreadid.mail";
             require Sources::Notify;
             ManageThreadNotify( 'load', $newthreadid );
             my (%t);
             foreach my $u ( keys %thethread ) {
                 LoadUser($u);
                 foreach ( split /,/xsm, ${ $uid . $u }{'thread_notifications'} )
                 {
                     $t{$_} = 1;
                 }
                 delete $t{$curthreadid};
                 $t{$newthreadid} = 1;
                 ${ $uid . $u }{'thread_notifications'} = join q{,}, keys %t;
                 UserAccount($u);
                 undef %t;
             }
         }
     }
   
     # Mark current thread as read
     delete $yyuserlog{"$curthreadid--unread"};
     dumplog($curthreadid);    # Save threads/boards as read
   
     chomp $yyThreadLine;
   
     if ( $INFO{'moveit'} == 1 ) {
         $currentboard = $curboard;
         return;
     }
     if ( $INFO{'ss_submit'} ) {
         $currentboard = $newboard;
         $INFO{'num'} = $INFO{'thread'} = $FORM{'threadid'} = $curnum =
           $newthreadid;
         redirectinternal();
     }
     if ( $debug == 1 or ( $debug == 2 && $iamadmin ) ) {
         require Sources::Debug;
         Debug();
         $yydebug =
  qq~\n- $#utdnewthread<br />\n- @utdnewthread<br />\n- ${$newthreadid}{'lastpostdate'}<br />\n- ${$newthreadid}{'lastposter'}<br />\n- \$enable_notifications == $enable_notifications<br />\n- \$attachments = $attachments<br />\n<a href="javascript:load_thread($newthreadid,$linkcount);">continue</a>\n$yydebug~;
     }
   
     print_output_header();
   
     $output =
  qq~<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="$abbr_lang" lang="$abbr_lang">
<head> <head>
<title>$sstxt{'1'}</title> <title>$sstxt{'1'}</title>
<meta http-equiv="Content-Type" content="text/html; charset=$yycharset" /> <meta http-equiv="Content-Type" content="text/html; charset=$yymycharset" />
<script language="JavaScript1.2" type="text/javascript"> <script type="text/javascript">
<!--    function load_thread(threadid,replies) { 
   function load_thread(threadid,replies) {         try{ 
       try{             if (typeof(opener.document) == 'object') throw '1'; 
           if (typeof(opener.document) == 'object') throw '1';             else throw '0'; 
           else throw '0';         } catch (e) { 
       } catch (e) {             if (replies > 0 || ~ 
           if (replies > 0 || ~ . ((($ttsureverse && ${$uid.$username}{'reversetopic'}) || $ttsreverse) ? 1 : 0) . qq~ == 1) replies = '/' + replies + '#' + replies;       . ( 
           else replies = '';         ( 
           if (e == 1) {             ( $ttsureverse && ${ $uid . $username }{'reversetopic'} ) 
               opener.focus();               || $ttsreverse 
               opener.location.href='$scripturl?num=' + threadid + replies;         ) ? 1 : 0 
               self.close();       ) 
           } else {       . qq~ == 1) replies = '/' + replies + '#' + replies; 
               location.href='$scripturl?num=' + threadid + replies;             else replies = ''; 
           }             if (e == 1) { 
       }                 opener.focus(); 
   }                 opener.location.href='$scripturl?num=' + threadid + replies; 
// -->                 self.close(); 
             } else {
                 location.href='$scripturl?num=' + threadid + replies;
             }
         }
     }
</script> </script>
</head> </head>
<body onload="load_thread($newthreadid,$linkcount);"> <body onload="load_thread($newthreadid,$linkcount);">
&nbsp;$yydebug &nbsp;$yydebug
</body> </body>
</html>~; </html>~;
   
   &print_HTML_output_and_finish;     print_HTML_output_and_finish(); 
     return;
} }
   
1; 1;