F:\WEBSITES\testbed\zipped\yabb_svn_new\branches\2.5.2\cgi-bin\yabb2\Admin\ManageBoards.pl F:\WEBSITES\testbed\zipped\yabb_svn_new\trunk\cgi-bin\yabb2\Admin\ManageBoards.pm
############################################################################### ###############################################################################
# ManageBoards.pl                                                             # # ManageBoards.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';
   
$manageboardsplver = 'YaBB 2.5.2 $Revision: 1.0 $'; $manageboardspmver = 'YaBB 2.6.12 $Revision: 1710 $';
if ($action eq 'detailedversion') { return 1; } if ( $action eq 'detailedversion' ) { return 1; }
  $admin_images = "$yyhtml_root/Templates/Admin/default";
   
sub ManageBoards { sub ManageBoards {
   &is_admin_or_gmod;     is_admin_or_gmod(); 
   &LoadBoardControl;     LoadBoardControl(); 
   unless ($mloaded == 1) { require "$boardsdir/forum.master"; }     get_forum_master(); 
   if ($INFO{'action'} eq 'managecats') {    if ( $INFO{'action'} eq 'managecats' ) {
       $colspan = qq~colspan="2"~;         $colspan = q~colspan="2"~; 
       $add = $admin_txt{'47'};        $add     = $admin_txt{'47'};
       $act = 'catscreen';        $act     = 'catscreen';
       $manage = qq~<a href="$adminurl?action=reordercats"><img src="$imagesdir/reorder.gif" alt="$admin_txt{'829'}" title="$admin_txt{'829'}" border="0" style="vertical-align: middle;" /></a> &nbsp;<b>$admin_txt{'49'}</b>~;         $manage = 
       $managedescr = $admin_txt{'678'};  qq~<a href="$adminurl?action=reordercats"><img src="$admin_img{'reorder'}" alt="$admin_txt{'829'}" title="$admin_txt{'829'}" /></a> &nbsp;<b>$admin_txt{'49'}</b>~; 
       $act2 = 'addcat';         $managedescr = $admin_txt{'678'}; 
       $action_area = 'managecats';         $act2        = 'addcat'; 
   } else {         $action_area = 'managecats'; 
       $colspan = qq~colspan="4"~;     } 
       $add = $admin_txt{'50'};     else { 
       $act = 'boardscreen';         $colspan = q~colspan="4"~; 
       $manage = qq~<img src="$imagesdir/cat.gif" alt="" border="0" style="vertical-align: middle;" /> &nbsp;<b>$admin_txt{'51'}</b>~;         $add     = $admin_txt{'50'}; 
       $managedescr = $admin_txt{'677'};         $act     = 'boardscreen'; 
       $act2 = 'addboard';         $manage = 
       $action_area = 'manageboards';  qq~$admin_img{'cat_img'} &nbsp;<b>$admin_txt{'51'}</b>~; 
   }         $managedescr = $admin_txt{'677'}; 
   $yymain .= qq~         $act2        = 'addboard'; 
<script language="JavaScript1.2" type="text/javascript">         $action_area = 'manageboards'; 
   <!--         ## find bad boards 
       function checkSubmit(where){         my @dupedbrds = (); 
           var something_checked = false;         my @mylist = (); 
           for (i=0; i<where.elements.length; i++){         while( ( $key, $value ) = each %cat ) { 
               if(where.elements[i].type == "checkbox"){             @mylist = split /,/xsm, $value; 
                   if(where.elements[i].checked == true){             push @dupedbrds, @mylist; 
                       something_checked = true;         } 
                   }         while( ( $key, $value ) = each %subboard ) { 
               }             @mylist = split /[|]/xsm, $value; 
           }             push @dupedbrds, @mylist; 
           if(something_checked == true){         } 
               if (where.baction[1].checked == false){         my %dup_counts; 
                   return true;         for (@dupedbrds) { $dup_counts{$_}++ }; 
               }         my @chkbrds = grep { $dup_counts{$_} > 1 } keys %dup_counts; 
               if (confirm("$admin_txt{'617'}")) {         @chkbrds = sort(@chkbrds); 
                   return true;         if (@chkbrds) { 
               } else {             $managedescr .= qq~<br />$admin_txt{'dupbrd'} @chkbrds<br />$admin_txt{'dupbrdlnk'}~; 
                   return false;         } 
               }    }
           } else {     $yymain .= qq~<script type="text/javascript"> 
               alert("$admin_txt{'5'}");         function checkSubmit(where){ 
               return false;            var something_checked = false;
           }             for (i=0; i<where.elements.length; i++){ 
       }                 if(where.elements[i].type == "checkbox"){ 
   //-->                     if(where.elements[i].checked === true){ 
</script>                         something_checked = true; 
<form name="whattodo" action="$adminurl?action=$act" onSubmit="return checkSubmit(this);" method="post">                     } 
<div class="bordercolor" style="padding: 0px; width: 99%; margin-left: 0px; margin-right: auto;">                 } 
  <table width="100%" cellspacing="1" cellpadding="4">             } 
    <tr valign="middle">             if(something_checked === true){ 
      <td align="left" class="titlebg" $colspan>                 if (where.baction[1].checked === false){ 
        $manage                     return true; 
      </td>                 } 
    </tr>                 if (confirm("$admin_txt{'617'}")) { 
    <tr align="center" valign="middle">                     return true; 
      <td align="left" class="windowbg2" $colspan><br />                 } else { 
         $managedescr<br /><br />                     return false; 
      </td>                 } 
    </tr>             } else { 
~;                 alert("$admin_txt{'5'}"); 
   foreach $catid (@categoryorder) {                 return false; 
       @bdlist = split(/,/, $cat{$catid});             } 
       ($curcatname, $catperms) = split(/\|/, $catinfo{"$catid"});         } 
       &ToChars($curcatname);  
         function editSingle(board) {
       if ($INFO{"action"} eq "managecats") {             var where = document.getElementById("whattodo"); 
           $tempcolspan = "";             for (i=0; i<where.elements.length; i++){ 
           $tempclass   = "windowbg2";                 if(where.elements[i].type == "checkbox"){ 
           $temphrefclass = "";                     if(where.elements[i].getAttribute("name") == board){ 
       } else {                         where.elements[i].checked = true; 
           $tempcolspan = qq~colspan="4"~;                     } else { 
           $tempclass   = "catbg";                         where.elements[i].checked = false; 
           $temphrefclass = qq~class="catbg a"~;                     } 
       }                }
             }
       $yymain .= qq~             document.getElementById("baction").checked = true; 
    <tr valign="middle">             where.submit(); 
      <td align="left" height="25" class="$tempclass" valign="middle" $tempcolspan>         } 
       <a href="$adminurl?action=reorderboards;item=$catid" $temphrefclass><img src="$imagesdir/reorder.gif" alt="$admin_txt{'832'}" title="$admin_txt{'832'}" border="0" style="vertical-align: middle;" /></a> &nbsp;<b>$curcatname</b>  
      </td>         function delSingle(board) { 
~;             var where = document.getElementById("whattodo"); 
       if ($INFO{"action"} eq "managecats") {             for (i=0; i<where.elements.length; i++){ 
           $yymain .= qq~                 if(where.elements[i].type == "checkbox"){ 
       <td class="windowbg" height="25" width="10%" align="center"><input type="checkbox" name="yitem_$catid" value="1" /></td>~;                     if(where.elements[i].getAttribute("name") == board){ 
       }                         where.elements[i].checked = true; 
                     } else {
       $yymain .= qq~                         where.elements[i].checked = false; 
    </tr>~;                     } 
       unless ($INFO{"action"} eq "managecats") {                 } 
           foreach $curboard (@bdlist) {             } 
               ($boardname, $boardperms, $boardview) = split(/\|/, $board{$curboard});             document.getElementById("delme").checked = true; 
               $boardname =~ s/\&quot\;/&#34;/g;             if (confirm("$admin_txt{'617'}")) { 
               &ToChars($boardname);                 where.submit(); 
               $descr = ${$uid.$curboard}{'description'};             } 
               $descr =~ s~\<br />~\n~g;         } 
               my $bicon = "";         </script> 
               if(${$uid.$curboard}{'pic'}) { $bicon = ${$uid.$curboard}{'pic'}; }         <form name="whattodo" id="whattodo" action="$adminurl?action=$act" onsubmit="return checkSubmit(this);" method="post" enctype="multipart/form-data"> 
               if ($bicon =~ /\//i) { $bicon = qq~ <img src="$bicon" alt="" border="0" /> ~; }             <div class="rightboxdiv"> 
               elsif ($bicon) { $bicon = qq~ <img src="$imagesdir/$bicon" alt="" border="0" /> ~; }                 <table class="bordercolor border-space pad-cell" style="margin-bottom: .5em;"> 
               if (${$uid.$curboard}{'ann'} == 1)  { $bicon = qq~ <img src="$imagesdir/ann.gif" alt="$admin_txt{'64g'}" title="$admin_txt{'64g'}" border="0" />~; }                     <tr> 
               if (${$uid.$curboard}{'rbin'} == 1) { $bicon = qq~ <img src="$imagesdir/recycle.gif" alt="$admin_txt{'64i'}" title="$admin_txt{'64i'}" border="0" />~; }                         <td class="titlebg" $colspan>$manage</td> 
               $convertstr = $descr;                     </tr><tr> 
               unless($convertstr =~ /<.+?>/) { # Don't cut it if there's HTML in it.                         <td class="windowbg2" $colspan> 
                   $convertcut = 60;                             <div class="pad-more">$managedescr</div> 
                   &CountChars;                         </td> 
               }                     </tr> 
               my $descr = $convertstr;                 </table>~; 
               &ToChars($descr);     for my $catid (@categoryorder) { 
               if ($cliped) { $descr .= "..."; }         @bdlist = split /,/xsm, $cat{$catid}; 
               $yymain .= qq~         ( $curcatname, $catperms, undef, $catpic ) = split /\|/xsm, $catinfo{$catid}; 
 <tr>         ToChars($curcatname); 
   <td class="windowbg" width="25%" align="left">$boardname</td>         $temppic = q{}; 
   <td class="windowbg" width="65%" align="left">$descr</td>         if ( $INFO{'action'} eq 'managecats' ) { 
   <td class="windowbg" width="5%" align="center">$bicon</td>             $tempcolspan   = q{}; 
   <td class="titlebg" width="5%" align="center"><input type="checkbox" name="yitem_$curboard" value="1" /></td>             $tempclass     = 'windowbg2'; 
 </tr>             $temphrefclass = q{}; 
~;         } 
           }         else { 
       }             $tempcolspan   = q~colspan="4"~; 
   }             $tempclass     = 'catbg'; 
             if ( $catpic ) {
   $yymain .= qq~                 $temppic = qq~<div style="float:right; margin-right: 10%"><img src="$yyhtml_root/Templates/Forum/default/$catpic" id="brd_img_resize" alt="$catid" /></div>~; 
     <tr>             } 
     <td class="catbg" width="100%" align="center" valign="middle" $colspan> <label for="baction">$admin_txt{'52'}</label>             $temphrefclass = q~class="catbg a"~; 
       <input type="radio" name="baction" id="baction" value="edit" checked="checked" /> $admin_txt{'53'}         } 
       <input type="radio" name="baction" value="delme" /> $admin_txt{'54'}  
       <input type="submit" value="$admin_txt{'32'}" class="button" /></td>         $yymain .= qq~ 
      </tr>                 <table class="bordercolor borderstyle border-space pad-cell" style="margin-bottom: .5em;"> 
</table>                     <tr> 
</div>                         <td class="$tempclass" style="height:25px" $tempcolspan> 
</form>                             <a href="$adminurl?action=reorderboards;item=$catid" $temphrefclass><img src="$admin_img{'reorder'}" alt="$admin_txt{'832'}" title="$admin_txt{'832'}" /></a> &nbsp;<b>$curcatname</b>$temppic</td>~; 
<br />         if ( $INFO{'action'} eq 'managecats' ) { 
<form name="diff" action="$adminurl?action=$act2" method="post">             $yymain .= qq~ 
<div class="bordercolor" style="padding: 0px; width: 99%; margin-left: 0px; margin-right: auto;">                         <td class="windowbg center" style="height:25px; width: 10%"><input type="checkbox" name="yitem_$catid" value="1" /></td>~; 
  <table width="100%" cellspacing="1" cellpadding="4">         } 
 <tr>  
   <td class="catbg" align="center" valign="middle"><label for="amount"><b>$add: </b></label>         $yymain .= q~ 
   <input type="text" name="amount" id="amount" value="3" size="2" maxlength="2" />                     </tr> 
   <input type="submit" value="$admintxt{'45'}" class="button" />                 </table>~; 
   </td>         if ( $INFO{'action'} ne 'managecats' ) { 
 </tr>             my $indent = -3; 
  </table>             @tmplt = (); 
</div>  
</form>             for my $curtemplate ( sort keys %templateset ){ 
~;                 @templatelst = split /\|/xsm, $templateset{$curtemplate}; 
   $yytitle = "$admintxt{'a4_title'}";                 push @tmplt, $curtemplate; 
   &AdminTemplate;             } 
             my $tmpwidth2 = 90 - $indent;
             my $tmpwidth3 = 5;
             # recursive loop to display all sub boards
   
             *show_boards = sub {
                 my @brdlist = @_;
                 $indent += 3;
                 for my $curboard (@brdlist) {
                     ( $boardname, $boardperms, $boardview ) =
                       split /\|/xsm, $board{$curboard};
                     $boardname =~ s/\&quot\;/&\x2334;/gxsm;
                     ToChars($boardname);
                     $descr = ${ $uid . $curboard }{'description'};
                     $descr =~ s/\<br \/>/\n/gsm;
                     my $bicon = q{};
                     fopen( BRDPIC, "<$boardsdir/brdpics.db" );
                     my @brdpics = <BRDPIC>;
                     fclose( BRDPIC);
                     chomp @brdpics;
                     for (@brdpics) {
                         my ( $brdnm, $style, $brdpic ) = split /[|]/xsm, $_;
                         if ( $brdnm eq $curboard ) {
                             for my $x ( 0 .. $#tmplt ) {
                                 if ( $style eq $tmplt[$x] ) {
                                     if ( $brdpic =~ /\//ixsm ) {
                                         $bicon .= qq~$style: <img src="$brdpic" id="brd_img_resize" alt="" style="margin-bottom:.5em" /><br />~;
                                     }
                                     else {
                                         @mytempst = split /\|/xsm, $templateset{$style};
                                         $myimgfolder = $mytempst[1];
                                         $bicon .= qq~$style: <img src="$yyhtml_root/Templates/Forum/$myimgfolder/Boards/$brdpic" id="brd_img_resize" alt="" style="margin-bottom:.5em" /><br />~;
                                     }
                                     $tmpwidth2 = 80 - $indent;
                                     $tmpwidth3 = 15;
                                 }
                             }
                         }
                     }
                     if ( ${ $uid . $curboard }{'ann'} == 1 ) {
                         $bicon =
  qq~ <img src="$imagesdir/ann.png" alt="$admin_txt{'64g'}" title="$admin_txt{'64g'}" />~;
                         $tmpwidth2 = 90 - $indent;
                         $tmpwidth3 = 5;
                     }
                     if ( ${ $uid . $curboard }{'rbin'} == 1 ) {
                         $bicon =
  qq~ <img src="$imagesdir/recycle.png" alt="$admin_txt{'64i'}" title="$admin_txt{'64i'}" />~;
                         $tmpwidth2 = 90 - $indent;
                         $tmpwidth3 = 5;
                     }
                     $convertstr = $descr;
                     if ( $convertstr !~ /<.+?>/xsm )
                     {    # Don't cut it if there's HTML in it.
                         $convertcut = 60;
                         CountChars();
                     }
                     my $descr = $convertstr;
                     ToChars($descr);
                     if ($cliped) { $descr .= q{...}; }
   
                     my $tmpwidth  = 100 - $indent;
   
                     my @children = split /\|/xsm, $subboard{$curboard};
   
                     $reorder_subs =
                       @children > 0
                       ? qq~                                <a href="$adminurl?action=reorderboards;item=$curboard;subboards=1"><img src="$admin_images/reorder_sub.png" alt="$admin_txt{'252'}" title="$admin_txt{'252'}" /></a>~
                       : q{};
   
                     my $del_txt  = $admin_txt{'251'};
                     my $edit_txt = $admin_txt{'253'};
                     if ( ${ $uid . $curboard }{'parent'} ) {
                         $del_txt  =~ s/{(.*?)}/$admin_txt{'254'}$1/gxsm;
                         $edit_txt =~ s/{(.*?)}/$admin_txt{'254'}$1/gxsm;
                     }
                     else {
                         $del_txt  =~ s/{(.*?)}/$1/gxsm;
                         $edit_txt =~ s/{(.*?)}/$1/gxsm;
                     }
   
                     $yymain .= q~
                 <table class="bordercolor borderstyle border-space pad-cell" style="margin-bottom: .5em; margin-left:~
                       . $indent . q~%; width:~ . $tmpwidth . q~%">
                     <colgroup>
                         <col style="width: ~ . $tmpwidth2 . q~%" />
                         <col style="width: ~ . $tmpwidth3 . qq~%" />
                         <col style="width: 5%" />
                     </colgroup>
                     <tr>
                         <td class="windowbg2">
                             <b>$boardname</b>
                             <div style="position:relative; display:inline; float:right;">
                                 <a href="$adminurl?action=addboard;parent=$curboard;category=$catid"><img src="$admin_images/add_sub.png" alt="$admin_txt{'250'}" title="$admin_txt{'250'}" /></a>
                                 <a href="javascript:editSingle('yitem_$curboard')"><img src="$admin_images/edit_sub.png" alt="$edit_txt" title="$edit_txt" /></a>
                                 <a href="javascript:delSingle('yitem_$curboard')"><img src="$admin_images/delete_sub.png" alt="$del_txt" title="$del_txt" /></a>
  ~ . $reorder_subs . qq~
                             </div>
                         </td>
                         <td class="windowbg2 center">$bicon</td>
                         <td class="titlebg center"><input type="checkbox" name="yitem_$curboard" value="1" /></td>
                     </tr><tr>
                         <td class="windowbg" colspan="3">$descr</td>
                     </tr>
                 </table>~;
                     if ( $subboard{$curboard} ) { show_boards(@children); }
                 }
                 $indent -= 3;
             };
             show_boards(@bdlist);
         }
     }
   
     $yymain .= qq~
                 <table class="bordercolor borderstyle border-space pad-cell" style="margin-bottom: .5em;">
                     <tr>
                         <td class="catbg center" $colspan> <label for="baction">$admin_txt{'52'}</label>
                             <input type="radio" name="baction" id="baction" value="edit" checked="checked" /> $admin_txt{'53'}
                             <input type="radio" name="baction" id="delme" value="delme" /> $admin_txt{'54'}
                             <input type="submit" value="$admin_txt{'32'}" class="button" />
                         </td>
                     </tr>
                 </table>
             </div>
         </form>
         <form name="diff" id="diff" action="$adminurl?action=$act2" method="post" accept-charset="$yymycharset">
             <div class="bordercolor rightboxdiv">
                 <table class="border-space pad-cell">
                     <tr>
                         <th class="titlebg">$admin_img{'cat_img'} $add</th>
                     </tr><tr>
                         <td class="catbg center">
                             <label for="amount"><b>$add: </b></label>
                             <input type="text" name="amount" id="amount" value="3" size="2" maxlength="2" />
                             <input type="submit" value="$admintxt{'45'}" class="button" />
                         </td>
                     </tr>
                 </table>
             </div>
         </form>~;
     $yytitle = "$admintxt{'a4_title'}";
     AdminTemplate();
     return;
} }
   
sub BoardScreen { sub BoardScreen {
   &is_admin_or_gmod;     is_admin_or_gmod(); 
   unless ($mloaded == 1) { require "$boardsdir/forum.master"; }     get_forum_master(); 
   $i = 0;    $i = 0;
   while ($_ = each(%FORM)) {    while ( $_ = each %FORM ) {
       if ($FORM{$_} && $_ =~ /^yitem_(.+)$/) {        if ( $FORM{$_} && $_ =~ /^yitem_(.+)$/xsm ) {
           $editboards[$i] = $1;            $editboards[$i] = $1;
           $i++;            $i++;
       }        }
   }    }
   $i = 1;    $i = 1;
   foreach $thiscat (@categoryorder) {    for my $thiscat (@categoryorder) {
       @theboards = split(/,/, $cat{$thiscat});         my @catboards = split /,/xsm, $cat{$thiscat}; 
       for (my $z = 0; $z < @theboards; $z++) {  
           for (my $j = 0; $j < @editboards; $j++) {         # make an array of all sub boards recursively 
               if ($editboards[$j] eq $theboards[$z]) {        *recursive_boards = sub {
                   $editbrd[$i] = $theboards[$z];             my @x = @_; 
                   $i++;             push @theboards, @x; 
                   splice(@editboards,$j,1);             for my $childbd (@x) { 
                   last;                 if ( $subboard{$childbd} ) { 
               }                     recursive_boards( split /\|/xsm, $subboard{$childbd} ); 
           }                }
       }            }
   }         }; 
   if    ($FORM{'baction'} eq "edit")  { &AddBoards(@editbrd); }         recursive_boards(@catboards); 
   elsif ($FORM{'baction'} eq "delme") {  
       shift(@editbrd);         for my $z ( 0 .. ( @theboards - 1 ) ) { 
       if (!$mloaded) { require "$boardsdir/forum.master"; }             my $found = 0; 
       foreach my $bd (@editbrd) {            for my $j ( 0 .. ( @editboards - 1 ) ) {
           # Remove Board form category it belongs to                 if ( $editboards[$j] eq $theboards[$z] ) { 
           $category = ${$uid.$bd}{'cat'};                     $editbrd[$i] = $theboards[$z]; 
           @bdlist = split(/,/, $cat{$category});                     $found = 1; 
           my $c = 0;                     $i++; 
           foreach (@bdlist) {                     splice @editboards, $j, 1; 
               if ($_ eq $bd) { splice(@bdlist, $c, 1); last; }                     last; 
               $c++;                 } 
           }            }
           $cat{$category} = join(',', &undupe(@bdlist));         } 
           delete $board{$bd};     } 
           $yymain .= qq~$admin_txt{'55'}$bd <br />~;     if ( $FORM{'baction'} eq 'edit' ) { AddBoards(@editbrd); } 
       }     elsif ( $FORM{'baction'} eq 'delme' ) { 
         shift @editbrd;
       # Actual deleting         get_forum_master(); 
       &DeleteBoards(@editbrd);         for my $bd (@editbrd) { 
       &Write_ForumMaster;  
  # Remove Board form category it belongs to unless it's a sub board, then it's not in the cat list
   } else {            if ( !${ $uid . $bd }{'parent'} ) {
       &admin_fatal_error("no_action","$FORM{'baction'}");                 $category = ${ $uid . $bd }{'cat'}; 
   }                 @bdlist = split /,/xsm, $cat{$category}; 
                 my $c = 0;
   $action_area = "manageboards";                 for (@bdlist) { 
   &AdminTemplate;                     if ( $_ eq $bd ) { splice @bdlist, $c, 1; last; } 
                     $c++;
                 }
                 $cat{$category} = join q{,}, undupe(@bdlist);
             }
             else
             { # if it has a parent, remove it from its parent's child board list
                 my @bdlist =
                   split /\|/xsm, $subboard{ ${ $uid . $bd }{'parent'} };
   
                 # Remove Board from old parent board
                 my $k = 0;
                 for (@bdlist) {
                     if ( $bd eq $_ ) { splice @bdlist, $k, 1; }
                     $k++;
                 }
                 $subboard{ ${ $uid . $bd }{'parent'} } = join q{|}, @bdlist;
             }
   
  # remove the $subboard{} hash that contains children list, since it's a parent board and move children up
             if ( $subboard{$bd} ) {
                 for my $childbd ( split /\|/xsm, $subboard{$bd} ) {
   
  # if this one has a parent board, move its children up to that, otherwise to category.
                     if ( ${ $uid . $bd }{'parent'} ) {
                         if ( $subboard{ ${ $uid . $bd }{'parent'} } ) {
                             $subboard{ ${ $uid . $bd }{'parent'} } .=
                               qq~|$childbd~;
                         }
                         else {
                             $subboard{ ${ $uid . $bd }{'parent'} } = $childbd;
                         }
                         ${ $uid . $childbd }{'parent'} =
                           ${ $uid . $bd }{'parent'};
                     }
                     else {
                         $cat{ ${ $uid . $bd }{'cat'} } .= ",$childbd";
                         ${ $uid . $childbd }{'parent'} = q{};
                     }
                     push @del_updateparent, $childbd;
                 }
                 delete $subboard{$bd};
             }
             delete $board{$bd};
             $yymain .= qq~$admin_txt{'55'}$bd <br />~;
         }
   
         # Actual deleting
         DeleteBoards(@editbrd);
         Write_ForumMaster();
     }
     else {
         fatal_error( 'no_action', "$FORM{'baction'}" );
     }
   
     $action_area = 'manageboards';
     AdminTemplate();
     return;
} }
   
sub DeleteBoards { sub DeleteBoards {
   &is_admin_or_gmod;     my @x = @_; 
     is_admin_or_gmod();
   
   fopen(FORUMCONTROL, "+<$boardsdir/forum.control") || &fatal_error("cannot_open","$boardsdir/forum.control", 1);     fopen( FORUMCONTROL, "+<$boardsdir/forum.control" ) 
   seek FORUMCONTROL, 0, 0;       || fatal_error( 'cannot_open', "$boardsdir/forum.control", 1 ); 
   my @oldcontrols = <FORUMCONTROL>;     seek FORUMCONTROL, 0, 0; 
   foreach $board (@_) {     my @oldcontrols = <FORUMCONTROL>; 
       fopen(BOARDDATA, "$boardsdir/$board.txt");     for my $board (@x) { 
       @messages = <BOARDDATA>;         fopen( BOARDDATA, "$boardsdir/$board.txt" ); 
       fclose(BOARDDATA);         @messages = <BOARDDATA>; 
       foreach $curmessage (@messages) {         fclose(BOARDDATA); 
           my ($id, undef) = split(/\|/, $curmessage, 2);         for my $curmessage (@messages) { 
           unlink("$datadir/$id\.txt");             my ( $id, undef ) = split /\|/xsm, $curmessage, 2; 
           unlink("$datadir/$id\.mail");             unlink "$datadir/$id\.txt"; 
           unlink("$datadir/$id\.ctb");             unlink "$datadir/$id\.mail"; 
           unlink("$datadir/$id\.data");             unlink "$datadir/$id\.ctb"; 
           unlink("$datadir/$id\.poll");             unlink "$datadir/$id\.data"; 
           unlink("$datadir/$id\.polled");             unlink "$datadir/$id\.poll"; 
       }             unlink "$datadir/$id\.polled"; 
       for (my $cnt = 0; $cnt < @oldcontrols; $cnt++) {         } 
           my $oldboard;         for my $cnt ( 0 .. ( @oldcontrols - 1 ) ) { 
           (undef, $oldboard, undef) = split(/\|/, $oldcontrols[$cnt], 3);             my $oldboard; 
           $yydebug .= "$cnt   $oldboard \n";             ( undef, $oldboard, undef ) = split /\|/xsm, $oldcontrols[$cnt], 3; 
           if ($oldboard eq $board) {             $yydebug .= "$cnt   $oldboard \n"; 
               $oldcontrols[$cnt] = "";             if ( $oldboard eq $board ) { 
               $yydebug .= "\$board{\"$oldboard\"}";                 $oldcontrols[$cnt] = q{}; 
               delete $board{"$board"};                 $yydebug .= qq~\$board{\"$oldboard\"}~; 
               last;                 delete $board{"$board"}; 
           }                 last; 
       }            }
       unlink("$boardsdir/$board.txt");         } 
       unlink("$boardsdir/$board.ttl");         unlink "$boardsdir/$board.txt"; 
       unlink("$boardsdir/$board.poster");         unlink "$boardsdir/$board.ttl"; 
       unlink("$boardsdir/$board.mail");         unlink "$boardsdir/$board.poster"; 
         unlink "$boardsdir/$board.mail";
       fopen(ATM, "+<$vardir/attachments.txt", 1);         unlink "$boardsdir/$board.exhits"; 
       seek ATM, 0, 0;  
       my @buffer = <ATM>;         fopen( ATM, "+<$vardir/attachments.txt", 1 ); 
       my ($amcurrentboard,$amfn);         seek ATM, 0, 0; 
       for (my $a = 0; $a < @buffer; $a++) {         my @buffer = <ATM>; 
           (undef, undef, undef, undef, $amcurrentboard, undef, undef, $amfn, undef) = split(/\|/, $buffer[$a]);         my ( $amcurrentboard, $amfn ); 
           if ($amcurrentboard eq $board) {        for my $aa ( 0 .. ( @buffer - 1 ) ) {
               $buffer[$a] = '';             ( 
               unlink("$upload_dir/$amfn");                 undef, undef,           undef, 
           }                 undef, $amcurrentboard, undef, 
       }                 undef, $amfn,           undef 
       truncate ATM, 0;             ) = split /\|/xsm, $buffer[$aa]; 
       seek ATM, 0, 0;             if ( $amcurrentboard eq $board ) { 
       print ATM @buffer;                 $buffer[$aa] = q{}; 
       fclose(ATM);                 unlink "$upload_dir/$amfn"; 
             }
       &BoardTotals("delete", $board);         } 
   }         truncate ATM, 0; 
         seek ATM, 0, 0;
   my @boardcontrol = grep { $_; } @oldcontrols;         print {ATM} @buffer or croak "$croak{'print'} ATM"; 
         fclose(ATM);
   truncate FORUMCONTROL, 0;  
   seek FORUMCONTROL, 0, 0;         BoardTotals( 'delete', $board ); 
   print FORUMCONTROL sort(@boardcontrol);     } 
   fclose(FORUMCONTROL);  
     # Update parents for subboards that had a parent deleted.
   fopen(FORUMCONTROL, "$boardsdir/forum.control");     if (@del_updateparent) { 
   @forum_control = <FORUMCONTROL>;         for my $cnt ( 0 .. ( @oldcontrols - 1 ) ) { 
   fclose(FORUMCONTROL);             @newbrd = split /\|/xsm, $oldcontrols[$cnt]; 
             for my $changedboard (@del_updateparent) {
                 if ( $changedboard eq $oldboard ) {
                     $newbrd[18] = ${$uid.$changedboard}{'parent'};
                     $newbrd = join q{|}, @newbrd;
                     $oldcontrols[$cnt] = $newbrd . "\n";
                     last;
                 }
             }
         }
     }
     my @boardcontrol = grep { $_; } @oldcontrols;
   
     truncate FORUMCONTROL, 0;
     seek FORUMCONTROL, 0, 0;
     print {FORUMCONTROL} sort @boardcontrol
       or croak "$croak{'print'} FORUMCONTROL";
     fclose(FORUMCONTROL);
   
     fopen( FORUMCONTROL, "$boardsdir/forum.control" );
     @forum_control = <FORUMCONTROL>;
     fclose(FORUMCONTROL);
     return;
} }
   
sub AddBoards { sub AddBoards {
   my @editboards = @_;    my @editboards = @_;
   &is_admin_or_gmod;     is_admin_or_gmod(); 
   $addtext = $admin_txt{'50'};    $addtext = $admin_txt{'50'};
   if ($INFO{'action'} eq 'boardscreen') { $FORM{'amount'} = $#editboards; $addtext = $admin_txt{'50a'}; }     if ( $INFO{'action'} eq 'boardscreen' ) { 
   unless ($mloaded == 1) { require "$boardsdir/forum.master"; }         $FORM{'amount'} = $#editboards; 
   $yymain .= qq~         $addtext = $admin_txt{'50a'}; 
<script language="JavaScript1.2" type="text/javascript">     } 
<!--    if ( $INFO{'parent'} ) { 
var copyValues = new Array();         $FORM{'amount'} = 1; 
var copyList = new Array();     } 
     get_forum_master();
     LoadBoardControl();
   
  # build recursive drop down of boards in each category for selecting parent board
     *get_subboards = sub {
         my @x = @_;
         $indent += 2;
         for my $childbd (@x) {
             my $dash;
             if ( $indent > 0 ) { $dash = q{-}; }
             ( $chldboardname, undef, undef ) =
               split /\|/xsm, $board{"$childbd"};
             ToChars($chldboardname);
             $catboardlist{$thiscat} .=
                 qq~$childbd|~
               . ( q{ } x $indent )
               . ( $dash x ( $indent / 2 ) )
               . qq~ $chldboardname|~;
             if ( $subboard{$childbd} ) {
                 get_subboards( split /\|/xsm, $subboard{$childbd} );
             }
         }
         $indent -= 2;
     };
     for $thiscat (@categoryorder) {
         # $thiscat cannot be properly localized
         my @catboards = split /\,/xsm, $cat{$thiscat};
         my $indent = -2;
         $catboardlist{$thiscat} = q~||~;
   
         get_subboards(@catboards);
   
         $catboardlist_js .= qq~
             catboardlist['$thiscat'] = "$catboardlist{$thiscat}";
         ~;
     }
   
     $yymain .= qq~<script type="text/javascript">
     var copyValues = new Array();
     var copyList = new Array();
   
     var catboardlist = new Array();
     $catboardlist_js
   
// this function removes an entry from the IM multi-list // this function removes an entry from the IM multi-list
function removeUser(oElement) { function removeUser(oElement) {
   var oList = oElement.options;    var oList = oElement.options;
   var noneSelected = 1;    var noneSelected = 1;
   
   for (var i = 0; i < oList.length; i++) {    for (var i = 0; i < oList.length; i++) {
       if(oList[i].selected) noneSelected = 0;        if(oList[i].selected) noneSelected = 0;
   }    }
   if(noneSelected) return false;    if(noneSelected) return false;
   
   var indexToRemove = oList.selectedIndex;    var indexToRemove = oList.selectedIndex;
   if (confirm("$selector_txt{'remove'}"))    if (confirm("$selector_txt{'remove'}"))
       {oElement.remove(indexToRemove);}        {oElement.remove(indexToRemove);}
} }
// this function forces all users listed in moderators to be selected for processing // this function forces all users listed in moderators to be selected for processing
function selectNames(total) { function selectNames(total) {
   for(var x = 1; x <= total; x++) {    for(var x = 1; x <= total; x++) {
   var oList = document.getElementById('moderators'+x)     var oList = document.getElementById('moderators'+x); 
   for (var i = 0; i < oList.options.length; i++)    for (var i = 0; i < oList.options.length; i++)
       {oList.options[i].selected = true;}        {oList.options[i].selected = true;}
   }    }
} }
// allows copying one or multiple items from moderators list // allows copying one or multiple items from moderators list
function copyNames(num) { function copyNames(num) {
   copyList = new Array();    copyList = new Array();
   copyValues = new Array();    copyValues = new Array();
   var oList = document.getElementById('moderators'+num).options;    var oList = document.getElementById('moderators'+num).options;
   for (var i = 0; i < oList.length; i++) {    for (var i = 0; i < oList.length; i++) {
       if(oList[i].selected == true) {        if(oList[i].selected === true) {
           copyList[copyList.length] = oList[i].text;            copyList[copyList.length] = oList[i].text;
           copyValues[copyValues.length] = oList[i].value;            copyValues[copyValues.length] = oList[i].value;
       }        }
   }    }
} }
// allows pasting from previously copied moderator list items // allows pasting from previously copied moderator list items
function pasteNames(num,total) { function pasteNames(num,total) {
   var found = false;    var found = false;
   var oList = null;    var oList = null;
   var which = 0;    var which = 0;
   if(copyList.length != 0) {    if(copyList.length !== 0) {
       for(var x = 0; x < total; x++) {        for(var x = 0; x < total; x++) {
           which = num + x;            which = num + x;
           oList = document.getElementById('moderators'+which).options;            oList = document.getElementById('moderators'+which).options;
           for (var e = 0; e < copyList.length; e++) {            for (var e = 0; e < copyList.length; e++) {
               found = false;                found = false;
               for (var i = 0; i < oList.length; i++) {                for (var i = 0; i < oList.length; i++) {
                   if(oList[i].value == copyValues[e] || oList[i].text == copyList[e]) {                    if(oList[i].value == copyValues[e] || oList[i].text == copyList[e]) {
                       found = true;                        found = true;
                       break;                        break;
                   }                    }
               }                }
               if(found == false) {                if(found === false) {