F:\WEBSITES\testbed\zipped\yabb_svn_new\branches\2.5.2\cgi-bin\yabb2\Admin\Attachments.pl F:\WEBSITES\testbed\zipped\yabb_svn_new\trunk\cgi-bin\yabb2\Admin\Attachments.pm
############################################################################### ###############################################################################
# Attachments.pl                                                              # # Attachments.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';
   
$attachmentsplver = 'YaBB 2.5.2 $Revision: 1.0 $'; $attachmentspmver = 'YaBB 2.6.12 $Revision: 1710 $';
if ($action eq 'detailedversion') { return 1; } if ( $action eq 'detailedversion' ) { return 1; }
   
sub Attachments { sub Attachments {
   &is_admin_or_gmod;     is_admin_or_gmod(); 
   
   fopen(AMS, "$vardir/attachments.txt");     fopen( AMS, "$vardir/attachments.txt" ); 
   my @attachments = <AMS>;    my @attachments = <AMS>;
   fclose(AMS);    fclose(AMS);
   
   my $attachment_space = 0;    my $attachment_space = 0;
   foreach (@attachments) {    foreach (@attachments) {
       $attachment_space += (split /\|/, $_, 7)[5];         $attachment_space += NumberFormat( ( split /\|/xsm, $_, 7 )[5] ); 
   }    }
   
   my $remaining_space;    my $remaining_space;
   if (!$dirlimit) {    if ( !$dirlimit ) {
       $remaining_space = "$fatxt{'23'}";        $remaining_space = "$fatxt{'23'}";
   } else {     } 
       $remaining_space = ($dirlimit - $attachment_space) . " KB";     else { 
   }         $remaining_space = NumberFormat( ( $dirlimit - $attachment_space ) ) . ' KB'; 
     }
   fopen(FILE, "$vardir/oldestattach.txt");  
   $maxdaysattach = <FILE>;     fopen( FILE, "$vardir/oldestattach.txt" ); 
   fclose(FILE);     $maxdaysattach = <FILE>; 
     fclose(FILE);
   fopen(FILE, "$vardir/maxattachsize.txt");  
   $maxsizeattach = <FILE>;     fopen( FILE, "$vardir/oldestpmattach.txt" ); 
   fclose(FILE);     $pmMaxDaysAttach = <FILE>; 
     fclose(FILE);
   my $totalattachnum = @attachments;  
   $yymain .= qq~     fopen( FILE, "$vardir/maxattachsize.txt" ); 
<table border="0" width="70%" cellspacing="1" cellpadding="3" class="bordercolor" align="center">     $maxsizeattach = <FILE>; 
<tr>    fclose(FILE); 
<td class="titlebg">  
<img src="$imagesdir/xx.gif" alt="" />     fopen( FILE, "$vardir/maxpmattachsize.txt" ); 
<b>$fatxt{'24'}</b></td>     $pmMaxSizeAttach = <FILE>; 
</tr><tr>     fclose(FILE); 
<td class="windowbg"><br /><span class="small">$fatxt{'25'}</span><br /><br /></td>  
</tr><tr>     fopen( PMATTACHLOG, "$vardir/pm.attachments" ); 
<td width="460" class="catbg"><b>$fatxt{'26'}</b></td>     my @pmAttachments = <PMATTACHLOG>; 
</tr><tr>     fclose(PMATTACHLOG); 
<td class="windowbg" height="21">  
<b>$fatxt{'27'}</b><br /></td>     my $pmAttachmentSpace = 0; 
</tr><tr>     foreach (@pmAttachments) { 
<td class="windowbg2">         $pmAttachmentSpace += NumberFormat( ( split /\|/xsm, $_, 4 )[2] ); 
<table border="0" cellpadding="3" cellspacing="0"><tr>     } 
<td><span class="small"><b>$fatxt{'28'}</b></span></td>  
<td><span class="small">$totalattachnum</span></td>     my $pmRemainingSpace; 
</tr><tr>     if ( !$pmDirLimit ) { 
<td><span class="small"><b>$fatxt{'29'}</b></span></td>         $pmRemainingSpace = "$fatxt{'23a'}"; 
<td><span class="small">$attachment_space KB</span><br /></td>     } 
</tr><tr>     else { 
<td><span class="small"><b>$fatxt{'30'}</b></span></td>         $pmRemainingSpace = NumberFormat( ( $pmDirLimit - $pmAttachmentSpace ) ) . ' KB'; 
<td><span class="small">$remaining_space</span></td>     } 
</tr>  
</table><br />     my $totalattachnum = @attachments; 
</td>     my $pmTotalAttachNum = @pmAttachments; 
</tr><tr>      $yymain .= qq~ 
<td class="windowbg" height="21">  <div class="bordercolor rightboxdiv"> 
<b>$fatxt{'31'}</b><br /></td>  <table class="border-space pad-cell"> 
</tr><tr>     <tr> 
<td class="windowbg2">         <td class="titlebg">$admin_img{'xx'} <b>$fatxt{'24'}</b></td> 
<table border="0" cellpadding="3" cellspacing="0">     </tr><tr> 
<tr>         <td class="windowbg"> 
<form action="$adminurl?action=removeoldattachments" method="post">             <div class="pad-more small">$fatxt{'25'}</div> 
<td><span class="small">$fatxt{'32'}</span></td>         </td> 
<td><span class="small"><input type="text" name="maxdaysattach" size="2" value="$maxdaysattach" /> $fatxt{'58'}&nbsp;</span></td>     </tr><tr> 
<td><input type="submit" value="$admin_txt{'32'}" class="button" /></td>         <td class="catbg"><b>$fatxt{'26'}</b></td> 
</form>     </tr><tr> 
</tr><tr>         <td class="windowbg att_h_a"> 
<form action="$adminurl?action=removebigattachments" method="post">             <b>$fatxt{'27'}</b> 
<td><span class="small">$fatxt{'33'}</span></td>         </td> 
<td><span class="small"><input type="text" name="maxsizeattach" size="2" value="$maxsizeattach" /> KB&nbsp;</span></td>     </tr><tr> 
<td><input type="submit" value="$admin_txt{'32'}" class="button" /></td>         <td class="windowbg2"> 
</form>             <table class="left pad-cell" style="margin-bottom:.5em"> 
</tr><tr>                 <tr> 
<td colspan="3"><span class="small" style="font-weight: bold;"><a href="$adminurl?action=manageattachments2">$fatxt{'31a'}</a></span> | <span class="small" style="font-weight: bold;"><a href="$adminurl?action=rebuildattach">$fatxt{'63'}</a></span></td>                     <td class="small"><b>$fatxt{'28'}</b></td> 
</tr>                     <td class="small">$totalattachnum</td> 
                 </tr><tr>
                     <td class="small"><b>$fatxt{'29'}</b></td>
                     <td class="small">$attachment_space KB<br /></td>
                 </tr><tr>
                     <td class="small"><b>$fatxt{'30'}</b></td>
                     <td class="small">$remaining_space</td>
                 </tr><tr>
                     <td colspan="2"><hr /></td>
                 </tr><tr>
                     <td class="small"><b>$fatxt{'28a'}</b></td>
                     <td class="small">$pmTotalAttachNum</td>
                 </tr><tr>
                     <td class="small"><b>$fatxt{'29a'}</b></td>
                     <td class="small">$pmAttachmentSpace KB<br /></td>
                 </tr><tr>
                     <td class="small"><b>$fatxt{'30a'}</b></td>
                     <td class="small">$pmRemainingSpace</td>
                 </tr>
             </table>
         </td>
     </tr><tr>
         <td class="windowbg att_h_a">
             <b>$fatxt{'31'}</b>
         </td>
     </tr><tr>
         <td class="windowbg2">
             <form action="$adminurl?action=removeoldattachments" method="post">
             <table class="pad-cell left" style="min-width:30%">
                 <colgroup>
                     <col style="width:60%" />
                     <col style="width:20%" span="2" />
                 </colgroup>
                 <tr>
                     <td class="small">$fatxt{'32'}</td>
                     <td class="small"><input type="text" name="maxdaysattach" size="2" value="$maxdaysattach" /> $fatxt{'58'}&nbsp;</td>
                     <td><input type="submit" value="$admin_txt{'32'}" class="button" /></td>
                 </tr>
             </table>
             </form>
             <form action="$adminurl?action=removebigattachments" method="post">
             <table class="pad-cell left" style="min-width:30%">
                 <colgroup>
                     <col style="width:60%" />
                     <col style="width:20%" span="2" />
                 </colgroup>
                 <tr>
                     <td><span class="small">$fatxt{'33'}</span></td>
                     <td><span class="small"><input type="text" name="maxsizeattach" size="2" value="$maxsizeattach" /> KB&nbsp;</span></td>
                     <td><input type="submit" value="$admin_txt{'32'}" class="button" /></td>
                 </tr><tr>
                     <td colspan="3">
                         <span class="small bold"><a href="$adminurl?action=manageattachments2">$fatxt{'31a'}</a></span> | <span class="small bold"><a href="$adminurl?action=rebuildattach">$fatxt{'63'}</a></span>
                     </td>
                 </tr>
             </table>
             </form>
         </td>
     </tr><tr>
         <td class="windowbg att_h_a">
             <b>$fatxt{'31b'}</b>
         </td>
     </tr><tr>
         <td class="windowbg2">
             <form action="$adminurl?action=removeoldpmattachments" method="post">
             <table class="pad-cell left" style="min-width:30%">
                 <colgroup>
                     <col style="width:60%" />
                     <col style="width:20%" span="2" />
                 </colgroup>
                 <tr>
                     <td><span class="small">$fatxt{'32a'}</span></td>
                     <td><span class="small"><input type="text" name="pmmaxdaysattach" size="2" value="$pmMaxDaysAttach" /> $fatxt{'58'}&nbsp;</span></td>
                     <td><input type="submit" value="$admin_txt{'32'}" class="button" /></td>
                 </tr>
             </table>
             </form>
             <form action="$adminurl?action=removebigpmattachments" method="post">
             <table class="pad-cell left" style="min-width:30%">
                 <colgroup>
                     <col style="width:60%" />
                     <col style="width:20%" span="2" />
                 </colgroup>
                 <tr>
                     <td><span class="small">$fatxt{'33a'}</span></td>
                     <td><span class="small"><input type="text" name="pmmaxsizeattach" size="2" value="$pmMaxSizeAttach" /> KB&nbsp;</span></td>
                     <td><input type="submit" value="$admin_txt{'32'}" class="button" /></td>
                 </tr><tr>
                     <td colspan="3">
                         <span class="small bold"><a href="$adminurl?action=managepmattachments2">$fatxt{'31c'}</a></span> | <span class="small bold"><a href="$adminurl?action=rebuildpmattach">$fatxt{'63a'}</a></span>
                     </td>
                 </tr>
             </table>
             </form>
         </td>
     </tr>
</table> </table>
</td>  </div>~; 
</tr>  
</table>~;     $yytitle     = "$fatxt{'36'}"; 
     $action_area = 'manageattachments';
   $yytitle = "$fatxt{'36'}";     AdminTemplate(); 
   $action_area = "manageattachments";     return; 
   &AdminTemplate;  
} }
   
sub RemoveOldAttachments { sub RemoveOldAttachments {
   &is_admin_or_gmod;     is_admin_or_gmod(); 
   
   my $maxdaysattach = $FORM{'maxdaysattach'} || $INFO{'maxdaysattach'};    my $maxdaysattach = $FORM{'maxdaysattach'} || $INFO{'maxdaysattach'};
   if ($maxdaysattach !~ /^[0-9]+$/) { &admin_fatal_error("only_numbers_allowed"); }     if ( $maxdaysattach !~ /^[0-9]+$/xsm ) { 
         fatal_error('only_numbers_allowed');
     }
   
     # Set up the multi-step action
     $time_to_jump = time() + $max_process_time;
   
     automaintenance('on');
   
     opendir ATT, $uploaddir
       || fatal_error( 'cannot_open', "$uploaddir", 1 );
     my @attachments = sort grep { /\w+$/xsm } readdir ATT;
     closedir ATT;
     my $info;
     if ( !@attachments ) {
         fopen( ATT, ">$vardir/attachments.txt" )
           || fatal_error( 'cannot_open', "$vardir/attachments.txt", 1 );
         print {ATT} q{} or croak "$croak{'print'} ATT";
         fclose(ATT);
   
         $info = qq~<br /><i>$fatxt{'48'}.</i>~;
     }
     else {
         fopen( AML, "$vardir/attachments.txt" );
         foreach (@attachmentstxt) {
             my @line = split /\|/xsm, $_;
             $att{ $line[7] } = $line[0];
         }
   
         if ( !exists $INFO{'next'} ) { unlink "$vardir/rem_old_attach.tmp"; }
   
         my %rem_attachments;
         for my $aa ( ( $INFO{'next'} || 0 ) .. ( @attachments - 1 ) ) {
   
             # -M => Script start time minus file modification time, in days.
             my $age = sprintf '%.2f', -M "$uploaddir/$attachments[$aa]";
             if ( $age <= $maxdaysattach ) {
   
                 # If the attachment is not too old
                 $info .= qq~<br />$attachments[$aa] = $age $admin_txt{'122'}.~;
   
             }
             elsif ( exists $att{ $attachments[$aa] } ) {
                 $rem_attachments{ $att{ $attachments[$aa] } } .=
                   $rem_attachments{ $att{ $attachments[$aa] } }
                   ? "|$attachments[$aa]" 
                   : $attachments[$aa];
                 $info .=
  qq~<br /><i>$attachments[$aa]</i> $fatxt{'1'} = $age $admin_txt{'122'}.~;
             }
   
             if ( $time_to_jump < time() && ( $aa + 1 ) < @attachments ) {
   
             # save the $info of this run until the end of 'RemoveOldAttachments'
                 fopen( FILE, ">>$vardir/rem_old_attach.tmp" )
                   || fatal_error( 'cannot_open',
                     "$vardir/rem_old_attach.tmp", 1 );
                 print $info or croak "$croak{'print'} rem_old_attach";
                 fclose(FILE);
   
                 $yySetLocation =
  qq~$adminurl?action=removeoldattachments;maxdaysattach=$maxdaysattach;next=~
                   . ( $aa + 1 - RemoveAttachments( \%rem_attachments ) );
                 redirectexit();
             }
         }
         RemoveAttachments( \%rem_attachments );
     }
   
     automaintenance('off');
   
     $yymain .= qq~<b>$fatxt{'32'} $maxdaysattach $fatxt{'58'}.</b><br />~;
   
     fopen( FILE, "$vardir/rem_old_attach.tmp" );
   
     #    $yymain .= join( q{}, <FILE> ) . $info;
     $yymain .= do { local $INPUT_RECORD_SEPARATOR = undef; <FILE> }
       . $info;
     fclose(FILE);
     unlink "$vardir/rem_old_attach.tmp";
   
     fopen( FILE, ">$vardir/oldestattach.txt" );
     print {FILE} $maxdaysattach or croak "$croak{'print'} oldestattach";
     fclose(FILE);
   
     $yytitle     = "$fatxt{'34'} $maxdaysattach";
     $action_area = 'removeoldattachments';
     AdminTemplate();
     return;
  }
   
   # Set up the multi-step action  sub RemoveBigAttachments { 
   $time_to_jump = time() + $max_process_time;     is_admin_or_gmod(); 
   
   &automaintenance('on');     my $maxsizeattach = $FORM{'maxsizeattach'} || $INFO{'maxsizeattach'}; 
     if ( $maxsizeattach !~ /^[0-9]+$/xsm ) {
   opendir(ATT, $uploaddir) || &admin_fatal_error('cannot_open', "$uploaddir", 1);         fatal_error('only_numbers_allowed'); 
   my @attachments = sort( grep(/\w+$/, readdir(ATT)) );     } 
   closedir(ATT);  
     # Set up the multi-step action
   fopen(AML, "$vardir/attachments.txt");     $time_to_jump = time() + $max_process_time; 
   my @attachmentstxt = <AML>;  
   fclose(AML);     automaintenance('on'); 
   
   my (%att,@line);     opendir ATT, $uploaddir 
   foreach (@attachmentstxt) {       || fatal_error( 'cannot_open', "$uploaddir", 1 ); 
       @line = split(/\|/, $_);     my @attachments = sort grep { /\w+$/xsm } readdir ATT; 
       $att{$line[7]} = $line[0];     closedir ATT; 
   }     my %filelist = (); 
     foreach my $i (@attachments) {
   my $info;         $filelist{$i} = 1; 
   if (!@attachments) {     } 
       fopen(ATT, ">$vardir/attachments.txt") || &admin_fatal_error("cannot_open","$vardir/attachments.txt", 1);  
       print ATT '';     fopen( FILE, "$vardir/attachments.txt" ); 
       fclose(ATT);     @attachmentstxt = <FILE>; 
     fclose(FILE);
       $info = qq~<br /><i>$fatxt{'48'}.</i>~;  
     my ( %att, @line );
   } else {    foreach (@attachmentstxt) {
       unlink("$vardir/rem_old_attach.tmp") unless exists $INFO{'next'};         @line = split /\|/xsm, $_; 
         if ( $filelist{$line[7]} ) {
       my %rem_attachments;             $att{ $line[7] } = $line[0]; 
       for (my $a = ($INFO{'next'} || 0); $a < @attachments; $a++) {         } 
           # -M => Script start time minus file modification time, in days.     } 
           my $age = sprintf("%.2f", -M "$uploaddir/$attachments[$a]");  
           if ($age <= $maxdaysattach) {     my $info; 
               # If the attachment is not too old     if ( !@attachments ) { 
               $info .= qq~<br />$attachments[$a] = $age $admin_txt{'122'}.~;         fopen( ATT, ">$vardir/attachments.txt" ) 
           || fatal_error( 'cannot_open', "$vardir/attachments.txt", 1 );
           } elsif (exists $att{$attachments[$a]}) {         print {ATT} q{} or croak "$croak{'print'} ATT"; 
               $rem_attachments{$att{$attachments[$a]}} .= $rem_attachments{$att{$attachments[$a]}} ? "|$attachments[$a]" : $attachments[$a];         fclose(ATT); 
               $info .= qq~<br /><i>$attachments[$a]</i> $fatxt{'1'} = $age $admin_txt{'122'}.~;  
           }         $info = qq~<br /><i>$fatxt{'48'}.</i>~; 
     }
           if ($time_to_jump < time() && ($a + 1) < @attachments) {    else {
               # save the $info of this run until the end of 'RemoveOldAttachments'         if ( !exists $INFO{'next'} ) { unlink "$vardir/rem_big_attach.tmp"; } 
               fopen(FILE, ">>$vardir/rem_old_attach.tmp") || &admin_fatal_error('cannot_open', "$vardir/rem_old_attach.tmp", 1);  
               print $info;         my (%rem_attachments); 
               fclose(FILE);         for my $aa ( ( $INFO{'next'} || 0 ) .. ( @attachments - 1 ) ) { 
             my $size = sprintf '%.2f',
               $yySetLocation = qq~$adminurl?action=removeoldattachments;maxdaysattach=$maxdaysattach;next=~ . ($a + 1 - &RemoveAttachments(\%rem_attachments));               ( ( -s "$uploaddir/$attachments[$aa]" ) / 1024 ); 
               &redirectexit;             if ( $size <= $maxsizeattach ) { 
           }  
       }                 # If the attachment is not too big 
                 $info .= qq~<br />$attachments[$aa] = $size KB~;
       &RemoveAttachments(\%rem_attachments);  
   }            }
             elsif ( exists $att{ $attachments[$aa] } ) {
   &automaintenance('off');                 $rem_attachments{ $att{ $attachments[$aa] } } .= 
                   $rem_attachments{ $att{ $attachments[$aa] } }
   $yymain .= qq~<b>$fatxt{'32'} $maxdaysattach $fatxt{'58'}.</b><br />~;                   ? "|$attachments[$aa]" 
                   : $attachments[$aa];
   fopen(FILE, "$vardir/rem_old_attach.tmp");                 $info .= 
   $yymain .= join('', <FILE>) . $info;                   qq~<br /><i>$attachments[$aa]</i> $fatxt{'1'} = $size KB~; 
   fclose(FILE);             } 
   unlink("$vardir/rem_old_attach.tmp");             if ( $time_to_jump < time() && ( $aa + 1 ) < @attachments ) { 
   
   fopen(FILE, ">$vardir/oldestattach.txt");             # save the $info of this run until the end of 'RemoveBigAttachments' 
   print FILE $maxdaysattach;                 fopen( FILE, ">>$vardir/rem_big_attach.tmp" ) 
   fclose(FILE);                   || fatal_error( 'cannot_open', 
                     "$vardir/rem_big_attach.tmp", 1 );
   $yytitle     = "$fatxt{'34'} $maxdaysattach";                 print $info or croak "$croak{'print'} rem_big_attach"; 
   $action_area = "removeoldattachments";                 fclose(FILE); 
   &AdminTemplate;  
                 $yySetLocation =
  qq~$adminurl?action=removebigattachments;maxsizeattach=$maxsizeattach;next=~
                   . ( $aa + 1 - RemoveAttachments( \%rem_attachments ) );
                 redirectexit();
             }
         }
   
         RemoveAttachments( \%rem_attachments );
     }
   
     $yymain .= qq~<b>$fatxt{'33'} $maxsizeattach KB.</b><br />~;
   
     fopen( FILE, "$vardir/rem_big_attach.tmp" );
   
     #    $yymain .= join( q{}, <FILE> ) . $info;
     $yymain .= do { local $INPUT_RECORD_SEPARATOR = undef; <FILE> }
       . $info;
     fclose(FILE);
     unlink "$vardir/rem_big_attach.tmp";
   
     fopen( FILE, ">$vardir/maxattachsize.txt" );
     print {FILE} $maxsizeattach or croak "$croak{'print'} FILE";
     fclose(FILE);
   
     automaintenance('off');
   
     $yytitle     = "$fatxt{'35'} $maxsizeattach KB";
     $action_area = 'removebigattachments';
     AdminTemplate();
     return;
} }
   
sub RemoveBigAttachments { sub Attachments2 {
   &is_admin_or_gmod;     is_admin_or_gmod(); 
   
   my $maxsizeattach = $FORM{'maxsizeattach'} || $INFO{'maxsizeattach'};     fopen( AML, "$vardir/attachments.txt" ); 
   if ($maxsizeattach !~ /^[0-9]+$/) { &admin_fatal_error("only_numbers_allowed"); }     my @attachinput = <AML>; 
     fclose(AML);
     my $max = @attachinput;
   
     my $action   = $INFO{'action'};
     my $sort     = $INFO{'sort'} || 6;
     my $newstart = $INFO{'newstart'} || 0;
   
     if ( !$max ) {
         $viewattachments .=
  qq~<tr><td class="windowbg2 padd-cell center" colspan="8"><b><i>$fatxt{'48'}</i></b></td></tr>~;
     }
     else {
         $yymain .= qq~
         <script type="text/javascript">
             function checkAll() {
                 for (var i = 0; i < document.del_attachments.elements.length; i++) {
                     document.del_attachments.elements[i].checked = true;
                 }
             }
             function uncheckAll() {
                 for (var i = 0; i < document.del_attachments.elements.length; i++) {
                     document.del_attachments.elements[i].checked = false;
                 }
             }
         </script>
         <form name="del_attachments" action="$adminurl?action=deleteattachment" method="post" style="display: inline;">~;
   
         my @attachments;
         if ( $sort > 0 ) {    # sort ascending
             if ( $sort == 5 || $sort == 6 || $sort == 8 ) {
                 @attachments = sort {
                     ( split /\|/xsm, $a )[$sort]
                       <=> ( split /\|/xsm, $b )[$sort];
                 } @attachinput;    # sort size, date, count numerically
             }
             elsif ( $sort == 100 ) {
                 @attachments = sort {
                     lc(   ( split /\./xsm, ( split /\|/xsm, $a )[7] )[1] ) cmp
                       lc( ( split /\./xsm, ( split /\|/xsm, $b )[7] )[1] );
                 } @attachinput;    # sort extension lexically
             }
             else {
                 @attachments = sort {
                     lc(   ( split /\|/xsm, $a )[$sort] ) cmp
                       lc( ( split /\|/xsm, $b )[$sort] );
                 } @attachinput;    # sort lexically
             }
         }
         else {                     # sort descending
             if ( $sort == -5 || $sort == -6 || $sort == -8 ) {
                 @attachments = reverse sort {
                     ( split /\|/xsm, $a )[ -$sort ]
                       <=> ( split /\|/xsm, $b )[ -$sort ];
                 } @attachinput;    # sort size, date, count numerically
             }
             elsif ( $sort == -100 ) {
                 @attachments = reverse sort {
                     lc(   ( split /\./xsm, ( split /\|/xsm, $a )[7] )[1] ) cmp
                       lc( ( split /\./xsm, ( split /\|/xsm, $b )[7] )[1] );
                 } @attachinput;    # sort extension lexically
             }
             else {
                 @attachments = reverse sort {
                     lc(   ( split /\|/xsm, $a )[ -$sort ] ) cmp
                       lc( ( split /\|/xsm, $b )[ -$sort ] );
                 } @attachinput;    # sort lexically
             }
         }
   
         $postdisplaynum = 8;
         $newstart       = ( int( $newstart / 25 ) ) * 25;
         $tmpa           = 1;
         if ( $newstart >= ( ( $postdisplaynum - 1 ) * 25 ) ) {
             $startpage = $newstart - ( ( $postdisplaynum - 1 ) * 25 );
             $tmpa = int( $startpage / 25 ) + 1;
         }
         if ( $max >= $newstart + ( $postdisplaynum * 25 ) ) {
             $endpage = $newstart + ( $postdisplaynum * 25 );
         }
         else { $endpage = $max; }
         if ( $startpage > 0 ) {
             $pageindex =
  qq~<a href="$adminurl?action=$action;newstart=0;sort=$sort" class="norm">1</a>&nbsp;...&nbsp;~;
         }
         if ( $startpage == 25 ) {
             $pageindex =
  qq~<a href="$adminurl?action=$action;newstart=0;sort=$sort" class="norm">1</a>&nbsp;~;
         }
         foreach my $counter ( $startpage .. ( $endpage - 1 ) ) {
             if ( $counter % 25 == 0 ) {
                 $pageindex .=
                   $newstart == $counter
                   ? qq~<b>$tmpa</b>&nbsp;~
                   : qq~<a href="$adminurl?action=$action;newstart=$counter;sort=$sort" class="norm">$tmpa</a>&nbsp;~;
                 $tmpa++;
             }
         }
         $lastpn  = int( $max / 25 ) + 1;
         $lastptn = ( $lastpn - 1 ) * 25;
         if ( $endpage < $max - (25) ) { $pageindexadd = q~...&nbsp;~; }
         if ( $endpage != $max ) {
             $pageindexadd .=
  qq~<a href="$adminurl?action=$action;newstart=$lastptn;sort=$sort">$lastpn</a>~;
         }
         $pageindex .= $pageindexadd;
   
         $pageindex =
  qq~<div class="small" style="line-height: 2.5em; float: right; text-align: right; vertical-align: middle;">$fatxt{'64'}: $pageindex</div>~;
   
         $numbegin = ( $newstart + 1 );
         $numend   = ( $newstart + 25 );
         if   ( $numend > $max ) { $numend  = $max; }
         if   ( $max == 0 )      { $numshow = q{}; }
         else                    { $numshow = qq~($numbegin - $numend)~; }
   
         my ( %attach_gif, $ext );
         foreach my $row ( splice @attachments, $newstart, 25 ) {
             chomp $row;
             my (
                 $amthreadid, $amreplies,      $amthreadsub,
                 $amposter,   $amcurrentboard, $amkb,
                 $amdate,     $amfn,           $amcount
             ) = split /\|/xsm, $row;
   
             if ( $amfn =~ /\.(.+?)$/xsm ) {
                 $ext = $1;
             }
             if ( !exists $attach_gif{$ext} ) {
                 $attach_gif{$ext} =
                   ( $ext && -e "$htmldir/Templates/Forum/$useimages/$ext.gif" )
                   ? "$ext.gif" 
                   : 'paperclip.gif';
             }
   
             $amdate = timeformat($amdate);
             $amkb   = NumberFormat($amkb);
             if ( length($amthreadsub) > 30 ) {
                 $amthreadsub = substr( $amthreadsub, 0, 30 ) . q{...};
             }
             my $amfna = $amfn;
             if ( length($amfn) > 30 ) {
                 $amfna = substr( $amfna, 0, 30 ) . q{...};
             }
             $viewattachments .= qq~<tr>
             <td class="windowbg2 center"><input type="checkbox" name="del_$amthreadid" value="$amfn" /></td>
             <td class="windowbg2"><a href="$uploadurl/$amfn" target="_blank">$amfna</a></td>
             <td class="windowbg2 center"><img src="$imagesdir/$attach_gif{$ext}" class="bottom" alt="" /></td>
             <td class="windowbg2 right">$amkb KB</td>
             <td class="windowbg2 center">$amdate</td>
             <td class="windowbg2 right">$amcount</td>
             <td class="windowbg2"><a href="$scripturl?num=$amthreadid/$amreplies#$amreplies" target="_blank">$amthreadsub</a></td>
             <td class="windowbg2 center">$amposter</td>
         </tr>~;
         }
   
         $viewattachments .= qq~<tr>
             <td class="catbg center">
                 <input type="checkbox" name="checkall" id="checkall" value="" onclick="if(this.checked){checkAll();}else{uncheckAll();}" />
             </td>
             <td class="catbg" colspan="7">
                 <div class="small" style="float: left; text-align: left;">
                     &lt;= <label for="checkall">$amv_txt{'38'}</label> &nbsp; <input type="submit" value="$admin_txt{'32'}" class="button" />
                 </div>
         $pageindex
             </td>
         </tr>~;
   
         $yymain .= qq~
         <input type="hidden" name="newstart" value="$newstart" />~;
     }
   
     my $class_sortattach = $sort =~ /7/sm   ? 'catbg' : 'windowbg';
     my $class_sorttype   = $sort =~ /100/sm ? 'catbg' : 'windowbg';
     my $class_sortsize   = $sort =~ /5/sm   ? 'catbg' : 'windowbg';
     my $class_sortdate   = $sort =~ /6/sm   ? 'catbg' : 'windowbg';
     my $class_sorcount   = $sort =~ /8/sm   ? 'catbg' : 'windowbg';
     my $class_sortsubj   = $sort =~ /2/sm   ? 'catbg' : 'windowbg';
     my $class_sortuser   = $sort =~ /3/sm   ? 'catbg' : 'windowbg';
   
     my $rsort;
   
     $yymain .= qq~
  <div class="bordercolor rightboxdiv">
  <table class="border-space pad-cell">
     <colgroup>
         <col style="width:7%" />
         <col style="width:18%" />
         <col style="width:5%" />
         <col style="width:7%" />
         <col style="width:23%" />
         <col style="width:5%" />
         <col style="width:22%" />
         <col style="width:13%" />
     </colgroup>
     <tr>
         <td class="titlebg" colspan="8">
             $admin_img{'xx'}&nbsp;<b>$fatxt{'39'}</b>
         </td>
     </tr><tr>
         <td class="windowbg" colspan="8">
         <div class="pad-more small">$fatxt{'38'}</div>
         </td>
     </tr><tr>
         <td class="titlebg center" colspan="8"><b>$fatxt{'55'}</b></td>
     </tr><tr>
        <td class="catbg att_h_b" colspan="8">
         <div class="small" style="float: left; text-align: left;">$fatxt{'28'} $max $numshow</div>
         $pageindex
         </td>
     </tr><tr class="att_h_b">~;
         $rsort = ( $sort == 7 ? -7 : 7 );
         $yymain .= qq~
         <td class="$class_sortattach center att"><b>$fatxt{'6c'}</b></td>
         <td onclick="location.href='$adminurl?action=manageattachments2;sort=$rsort';" class="$class_sortattach center att">
             <a href="$adminurl?action=manageattachments2;sort=$rsort"><b>$fatxt{'40'}</b></a>
         </td>~;
         $rsort = ( $sort == 100 ? -100 : 100 );
         $yymain .= qq~
         <td onclick="location.href='$adminurl?action=manageattachments2;sort=$rsort';" class="$class_sorttype center att">
             <a href="$adminurl?action=manageattachments2;sort=$rsort"><b>$fatxt{'40a'}</b></a>
         </td>~;
         $rsort = ( $sort == 5 ? -5 : 5 );
         $yymain .= qq~
         <td onclick="location.href='$adminurl?action=manageattachments2;sort=$rsort';" class="$class_sortsize center att">
             <a href="$adminurl?action=manageattachments2;sort=$rsort"><b>$fatxt{'41'}</b></a>
         </td>~;
         $rsort = ( $sort == 6 ? -6 : 6 );
         $yymain .= qq~
         <td onclick="location.href='$adminurl?action=manageattachments2;sort=$rsort';" class="$class_sortdate center att">
             <a href="$adminurl?action=manageattachments2;sort=$rsort"><b>$fatxt{'43'}</b></a>
         </td>~;
         $rsort = ( $sort == 8 ? -8 : 8 );
         $yymain .= qq~
         <td onclick="location.href='$adminurl?action=manageattachments2;sort=$rsort';" class="$class_sorcount center att">
             <a href="$adminurl?action=manageattachments2;sort=$rsort"><b>$fatxt{'41a'}</b></a>
         </td>~;
         $rsort = ( $sort == 2 ? -2 : 2 );
         $yymain .= qq~
         <td onclick="location.href='$adminurl?action=manageattachments2;sort=$rsort';" class="$class_sortsubj center att">
             <a href="$adminurl?action=manageattachments2;sort=$rsort"><b>$fatxt{'44'}</b></a>
         </td>~;
         $rsort = ( $sort == 3 ? -3 : 3 );
         $yymain .= qq~
         <td onclick="location.href='$adminurl?action=manageattachments2;sort=$rsort';" class="$class_sortuser center att">
             <a href="$adminurl?action=manageattachments2;sort=$rsort"><b>$fatxt{'42'}</b></a>
         </td>
     </tr>
     $viewattachments
  </table>
  </div>~;
   
   # Set up the multi-step action     if ($max) { $yymain .= '</form>'; } 
   $time_to_jump = time() + $max_process_time;  
   
   &automaintenance('on');     $yytitle     = "$fatxt{'37'}"; 
     $action_area = 'manageattachments';
   opendir(ATT, $uploaddir) || &admin_fatal_error('cannot_open', "$uploaddir", 1);     AdminTemplate(); 
   my @attachments = sort( grep(/\w+$/, readdir(ATT)) );     return; 
   closedir(ATT);  
   
   fopen(FILE, "$vardir/attachments.txt");  
   @attachmentstxt = <FILE>;  
   fclose(FILE);  
   
   my (%att,@line);  
   foreach (@attachmentstxt) {  
       @line = split(/\|/, $_);  
       $att{$line[7]} = $line[0];  
   }  
   
   my $info;  
   if (!@attachments) {  
       fopen(ATT, ">$vardir/attachments.txt") || &admin_fatal_error("cannot_open","$vardir/attachments.txt", 1);  
       print ATT '';  
       fclose(ATT)