F:\WEBSITES\testbed\zipped\yabb_svn_new\branches\2.5.2\cgi-bin\yabb2\Admin\NewSettings.pl F:\WEBSITES\testbed\zipped\yabb_svn_new\trunk\cgi-bin\yabb2\Admin\NewSettings.pm
############################################################################### ###############################################################################
# NewSettings.pl                                                              # # NewSettings.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 strict;
  use CGI::Carp qw(fatalsToBrowser);
  our $VERSION = '2.6.12';
   
$newsettingsplver = 'YaBB 2.5.2 $Revision: 1.5 $'; $newsettingspmver = 'YaBB 2.6.12 $Revision: 1710 $';
if ($action eq 'detailedversion') { return 1; } if ( $action eq 'detailedversion' ) { return 1; }
   
# Figure out what tabset to use, depending on the page= parameter. # Figure out what tabset to use, depending on the page= parameter.
my %settings_dispatch = ( my %settings_dispatch = (
   news => "$admindir/Settings_News.pl",     news        => "$admindir/Settings_News.pm", 
   main => "$admindir/Settings_Main.pl",     main        => "$admindir/Settings_Main.pm", 
   advanced => "$admindir/Settings_Advanced.pl",     advanced    => "$admindir/Settings_Advanced.pm", 
   security => "$admindir/Settings_Security.pl",     security    => "$admindir/Settings_Security.pm", 
   antispam => "$admindir/Settings_Antispam.pl",     antispam    => "$admindir/Settings_Antispam.pm", 
   maintenance => "$admindir/Settings_Maintenance.pl",     maintenance => "$admindir/Settings_Maintenance.pm", 
   
   ### BOARDMOD SETTINGS ANCHOR ###    ### BOARDMOD SETTINGS ANCHOR ###
   ### ADD BEFORE THESE LINES   ###    ### ADD BEFORE THESE LINES   ###
); );
   
my $page = $INFO{'page'}; my $page = $INFO{'page'};
# 'eval' because NewSettings.pl can be called by Sources/TabMenu.pl  
eval{ require $settings_dispatch{$page}; };  
   
sub settings {  # 'eval' because NewSettings.pm can be called by Sources/TabMenu.pm 
   &is_admin_or_gmod;  eval { require $settings_dispatch{$page}; }; 
   
   $yytitle = $page eq 'main' ? $admin_txt{'222'} : ($page eq 'advanced' ? $admin_txt{'223'} : ($page eq 'security' ? $admintxt{'a3_title'} : ($page eq 'antispam' ? $admintxt{'a3_sub4'} : ($page eq 'maintenance' ? $admintxt{'a7_title'} : $admintxt{'a2_sub1'}))));  
   
   my @requireorder; # an array for the correct order of the requirements  sub settings { 
   my %requirements; # an hash that says "Y is required by X"     is_admin_or_gmod(); 
   
   $yymain .= qq~     $yytitle = 
  <a name="top"></a>       $page eq 'main' ? $admin_txt{'222'} 
  <div class="bordercolor" style="padding: 0px; width: 99%; margin-left: 0px; margin-right: auto;">       : ( 
  <table width="100%" cellspacing="1" cellpadding="4">         $page eq 'advanced' ? $admin_txt{'223'} 
    <tr valign="middle">         : ( 
      <td align="left" class="titlebg">             $page eq 'security' ? $admintxt{'a3_title'} 
        <b>$yytitle</b>             : ( 
      </td>                 $page eq 'antispam' ? $admintxt{'a3_sub4'} 
    </tr>                 : ( 
    <tr valign="middle">                       $page eq 'maintenance' ? $admintxt{'a7_title'} 
      <td align="left" class="windowbg2"><br />                     : $admintxt{'a2_sub1'} 
       $admin_txt{'347'}                 ) 
      </td>             ) 
    </tr>         ) 
 </table>       ); 
 </div>  
 <br />     my @requireorder;    # an array for the correct order of the requirements 
 <form action="$adminurl?action=newsettings2;page=$page" onsubmit="undisableAll(this);" method="post">     my %requirements;    # a hash that says "Y is required by X" 
 <ul id="navlist">  
     $yymain .= qq~
     <div class="bordercolor rightboxdiv">
         <table class="border-space pad-cell" style="margin-bottom:.5em">
             <tr>
                 <td class="titlebg"><b>$yytitle</b></td>
             </tr><tr>
                 <td class="windowbg2">
                     <div class="pad-more">$admin_txt{'347'}</div>
                 </td>
             </tr>
         </table>
     </div>
  <form action="$adminurl?action=newsettings2;page=$page" onsubmit="undisableAll(this); savealert()" method="post" enctype="multipart/form-data" accept-charset="$yymycharset">
     <ul id="navlist">
~; ~;
   my $i = 0;    my $i = 0;
   foreach my $tab (@settings) {    foreach my $tab (@settings) {
       $tab->{'name'} =~ s/ /&nbsp;/g;         $tab->{'name'} =~ s/ /&nbsp;/gsm; 
       # The &nbsp;'s are for Konqueror, and also to add a little more padding.  
       $yymain .= qq~    <li id="button_$tab->{'id'}" onclick="changeToTab('$tab->{'id'}'); return false;">&nbsp;<a href="#tab_$tab->{'id'}">$tab->{'name'}</a>&nbsp;</li>         # The &nbsp;'s are for Konqueror, and also to add a little more padding. 
         $yymain .=
  qq~                <li id="button_$tab->{'id'}" onclick="changeToTab('$tab->{'id'}'); return false;">&nbsp;<a href="#tab_$tab->{'id'}">$tab->{'name'}</a>&nbsp;</li>
~; ~;
   }    }
   $yymain .= q~  </ul>~;    $yymain .= q~  </ul>~;
   
   foreach my $tab (@settings) {    foreach my $tab (@settings) {
       $yymain .= qq~        $yymain .= qq~
 <div class="bordercolor" style="padding: 0px; width: 99%; margin-left: 0px; margin-right: auto;">     <div class="bordercolor borderstyle rightboxdiv"> 
   <table width="100%" cellspacing="1" cellpadding="4" class="section" id="tab_$tab->{'id'}">        <table class="section" style="border-collapse:separate; border-spacing: 1px;" id="tab_$tab->{'id'}">
    <tr>             <colgroup> 
      <td style="text-align: left;" class="titlebg" colspan="2">                 <col span="2" style="width: 50%" /> 
        <a name="tab_$tab->{'id'}"></a><img src="$imagesdir/preferences.gif" alt="" border="0" /> <b>$tab->{'name'}</b>             </colgroup> 
        <span style="float: right;" class="js_remove_me"><a href="#top"><b>$settings_txt{'top'}</b></a></span>             <tr> 
                 <td class="titlebg padd-cell" colspan="2">
                     $admin_img{'prefimg'} <b>$tab->{'name'}</b>
          <span style="float: right;" class="js_remove_me"><a href="#"><b>$settings_txt{'top'}</b></a></span>
      </td>       </td>
    </tr>~;     </tr>~;
   
       foreach my $item (@{$tab->{'items'}}) {        foreach my $item ( @{ $tab->{'items'} } ) {
           if($item->{'header'}) {            if ( $item->{'header'} ) {
               $yymain .= qq~                 $yymain .= qq~<tr> 
    <tr>          <td class="catbg padd-cell" colspan="2"><span class="small">$item->{'header'}</span></td> 
      <td style="text-align: left;" class="catbg" colspan="2">  
        <span class="small">$item->{'header'}</span>  
      </td>  
    </tr>~;     </tr>~;
           }            }
           elsif($item->{'two_rows'} && $item->{'input_html'}) {            elsif ( $item->{'two_rows'} && $item->{'input_html'} ) {
               $yymain .= qq~                 $yymain .= qq~<tr> 
    <tr style="text-align: left;">                 <td class="windowbg2 padd-cell" colspan="2">$item->{'description'}</td> 
      <td style="width: 50%;" class="windowbg2" colspan="2">             </tr><tr> 
        $item->{'description'}                 <td class="windowbg2 padd-cell" colspan="2">$item->{'input_html'}</td> 
      </td>  
    </tr>  
    <tr style="text-align: left;">  
      <td style="width: 50%;" class="windowbg2" colspan="2">  
        $item->{'input_html'}  
      </td>  
    </tr>~;     </tr>~;
           }            }
           elsif($item->{'input_html'}) {            elsif ( $item->{'input_html'} ) {
               $yymain .= qq~                 $yymain .= qq~<tr> 
    <tr style="text-align: left;">                 <td class="windowbg2 vtop padd-cell">$item->{'description'}</td> 
      <td style="width: 50%;" class="windowbg2" valign="top">                 <td class="windowbg2 vtop padd-cell">$item->{'input_html'}</td> 
        $item->{'description'}  
      </td>  
      <td style="width: 50%;" class="windowbg2" valign="top">  
        $item->{'input_html'}  
      </td>  
    </tr>~;     </tr>~;
           }            }
   
           # Handle settings that require other settings            # Handle settings that require other settings
           if ($item->{'depends_on'} && $item->{'name'}) {            if ( $item->{'depends_on'} && $item->{'name'} ) {
               foreach my $require (@{$item->{'depends_on'}}) {                foreach my $require ( @{ $item->{'depends_on'} } ) {
                   # This is somewhat messy, but it works well.  
                   # We strip off the possible options: inverse, equal, and not equal  # This is somewhat messy, but it works well. 
                   # Then we attach those to this current option in the detailed string for requirements  # We strip off the possible options: inverse, equal, and not equal 
                   # While this data does not really belong with the value, it transfers nicely.  # Then we attach those to this current option in the detailed string for requirements 
                   # We then remove it and reuse it later.  # While this data does not really belong with the value, it transfers nicely. 
                   my($inverse, $realname, $remainder) = $require =~ m/(\(?\!?)(\w+)(.*)/;  # We then remove it and reuse it later. 
                   push(@requireorder, $realname) unless $requirements{$realname};                     my ( $inverse, $realname, $remainder ) = 
                   push(@{$requirements{$realname}}, $inverse . $item->{'name'} . $remainder);                       $require =~ m{(\(?\!?)(\w+)(.*)}xsm; 
               }                     if ( !$requirements{$realname} ) { 
           }                         push @requireorder, $realname; 
       }                    }
                     push
                       @{ $requirements{$realname} },
                       $inverse . $item->{'name'} . $remainder;
                 }
             }
         }
   
       $yymain .= qq~         $yymain .= q~ 
  </table>   </table>
 </div>~;  </div>~;
   }    }
   
   # The old method isn't quite good enough. # The old method isn't quite good enough.
   # So we build a hash with the Javascript logic needed to determine if this item should be enabled. # So we build a hash with the Javascript logic needed to determine if this item should be enabled.
   # When in doubt, generate some code :) # When in doubt, generate some code :)
   my %requirejs;    my %requirejs;
   
   my $dependicies = '';     my $dependicies = q{}; 
   my $onloadevents;    my $onloadevents;
   foreach my $ritem (@requireorder) {    foreach my $ritem (@requireorder) {
       $dependicies .= qq~        $dependicies .= qq~
   function handleDependent_$ritem() {    function handleDependent_$ritem() {
       var isChecked = document.getElementsByName("$ritem")[0].checked;        var isChecked = document.getElementsByName("$ritem")[0].checked;
       var itemValue = document.getElementsByName("$ritem")[0].value;\n~;        var itemValue = document.getElementsByName("$ritem")[0].value;\n~;
   
       foreach my $require (@{$requirements{$ritem}}) {        foreach my $require ( @{ $requirements{$ritem} } ) {
           # && or ||, ( and )  
           my $AndOr = $require =~ s/\)// ? ')' : '';             # && or ||, ( and ) 
           $AndOr   .= $require =~ s/\|\|// ? ' ||' : ' &&';             my $AndOr = $require =~ s/\)//xsm ? ')' : q{}; 
           my $C     = $require =~ s/\(// ? '(' : '';             $AndOr .= $require =~ s/\|\|//xsm ? ' ||' : ' &&'; 
           # Is false             my $C = $require =~ s/\(//xsm ? '(' : q{}; 
           if ($require =~ s/^\!//) {  
               $requirejs{$require} .= qq~$C\!document.getElementsByName("$ritem")[0].checked$AndOr ~;             # Is false 
           }             if ( $require =~ s/^\!//xsm ) { 
           # Is equal to                 $requirejs{$require} .= 
           elsif ($require =~ s/\=\=(.*)$//) {  qq~$C\!document.getElementsByName("$ritem")[0].checked$AndOr ~; 
               $requirejs{$require} .= qq~$C\document.getElementsByName("$ritem")[0].value == '$1'$AndOr ~;             } 
           }  
           # Is not equal to            # Is equal to
           elsif ($require =~ s/\!\=(.*)$//) {            elsif ( $require =~ s/\=\=(.*)$//xsm ) {
               $requirejs{$require} .= qq~$C\document.getElementsByName("$ritem")[0].value != '$1'$AndOr ~;                 $requirejs{$require} .= 
           }  qq~$C\document.getElementsByName("$ritem")[0].value == '$1'$AndOr ~; 
           # Is true             } 
           else {  
               $requirejs{$require} .= qq~$C\document.getElementsByName("$ritem")[0].checked$AndOr ~;             # Is not equal to 
           }             elsif ( $require =~ s/\!\=(.*)$//xsm ) { 
           $dependicies .= qq~        checkDependent("$require");\n~;                 $requirejs{$require} .= 
       }  qq~$C\document.getElementsByName("$ritem")[0].value != '$1'$AndOr ~; 
       $dependicies .= qq~    };             } 
   document.getElementsByName("$ritem")[0].onclick = handleDependent_$ritem;  
   document.getElementsByName("$ritem")[0].onkeyup = handleDependent_$ritem;             # Is true 
             else {
                 $requirejs{$require} .=
                   qq~$C\document.getElementsByName("$ritem")[0].checked$AndOr ~;
             }
             $dependicies .= qq~        checkDependent("$require");\n~;
         }
         $dependicies .= qq~ }
     document.getElementsByName("$ritem")[0].onclick = handleDependent_$ritem;
     document.getElementsByName("$ritem")[0].onkeyup = handleDependent_$ritem;
~; ~;
       $onloadevents .= qq~handleDependent_$ritem(); ~;        $onloadevents .= qq~handleDependent_$ritem(); ~;
   }    }
   
   # Hidden "feature": jump directly to a tab by default via the URL bar.    # Hidden "feature": jump directly to a tab by default via the URL bar.
   $INFO{'tab'} =~ s/\W//g;     $INFO{'tab'} =~ s/\W//gxsm; 
   $default_tab = $INFO{'tab'} || $settings[0]->{'id'};    $default_tab = $INFO{'tab'} || $settings[0]->{'id'};
   $yymain .= qq~    $yymain .= qq~
 <div class="bordercolor" style="padding: 0px; width: 99%; margin-top: 1em; margin-left: 0px; margin-right: auto;">  <div class="bordercolor rightboxdiv" style="margin: .5em auto 0 0"> 
  <table width="100%" cellspacing="1" cellpadding="4">     <table class="border-space pad-cell"> 
    <tr valign="middle">         <tr> 
      <td align="left" class="titlebg" colspan="2">             <td class="titlebg">$admin_img{'prefimg'} <b>$admin_txt{'10'}</b></td> 
        <img src="$imagesdir/preferences.gif" alt="" border="0" /> <b>$admin_txt{'10'}</b>         </tr><tr> 
      </td>             <td class="catbg center"> 
    </tr>                 <input class="button" type="submit" value="$admin_txt{'10'}" /> 
    <tr align="center" valign="middle">             </td> 
      <td align="center" class="catbg" colspan="2">         </tr> 
        <input class="button" type="submit" value="$admin_txt{'10'}" />  
      </td>  
    </tr>  
  </table>   </table>
 </div>  </div>
 </form>  </form>
 <script type="text/javascript">  <script type="text/javascript">
 <!--     function getElementsByClass(searchClass,node,tag) { 
   function getElementsByClass(searchClass,node,tag) {         var classElements = new Array(); 
       var classElements = new Array();         if ( node === null || node === undefined ) 
       if ( node == null )             node = document; 
           node = document;         if ( tag === null || tag === undefined ) 
       if ( tag == null )             tag = '*'; 
           tag = '*';         var els = node.getElementsByTagName(tag); 
       var els = node.getElementsByTagName(tag);         var elsLen = els.length; 
       var elsLen = els.length;         var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|\$)'); 
       var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|\$)');         for (i = 0, j = 0; i < elsLen; i++) { 
       for (i = 0, j = 0; i < elsLen; i++) {            if ( pattern.test(els[i].className) ) {
           if ( pattern.test(els[i].className) ) {                 classElements[j] = els[i]; 
               classElements[j] = els[i];                 j++; 
               j++;             } 
           }        }
       }         return classElements; 
       return classElements;     } 
   }     function changeToTab(tab) { 
   function changeToTab(tab) {         var elements = getElementsByClass('section'); 
       var elements = getElementsByClass('section');         var i; 
       var i;         for(i = 0; i < elements.length; i++) { 
       for(i = 0; i < elements.length; i++) {            if(elements[i].id == 'tab_' + tab) {
           if(elements[i].id == 'tab_' + tab) {                 elements[i].style.display = ''; 
               elements[i].style.display = '';             } 
           }             else { 
           else {                 elements[i].style.display = 'none'; 
               elements[i].style.display = 'none';             } 
           }        }
       }         var elm = getElementsByClass('curtab')[0]; 
       var elm = getElementsByClass('curtab')[0];         if(elm) { 
       if(elm) {             elm.className = ''; 
           elm.className = '';         } 
       }         document.getElementById('button_' + tab).className = 'curtab'; 
       document.getElementById('button_' + tab).className = 'curtab';     } 
   }     var removables = getElementsByClass('js_remove_me'); 
   var removables = getElementsByClass('js_remove_me');     var i; 
   var i;     for(i = 0; i < removables.length; i++) { 
   for(i = 0; i < removables.length; i++) {         removables[i].innerHTML = ''; 
       removables[i].innerHTML = '';     } 
   }     changeToTab('$default_tab'); // Focus default tab 
   changeToTab('$default_tab'); // Focus default tab     function checkDependent(eid) { 
   function checkDependent(eid) {         var elm = document.getElementsByName(eid)[0];\n~; 
       var elm = document.getElementsByName(eid)[0];\n~;  
     # Loop through each item that depends on something else
       # Loop through each item that depends on something else     foreach my $name ( keys %requirejs ) { 
       foreach my $name (keys(%requirejs)) {         my $logic = $requirejs{$name}; 
           my $logic = $requirejs{$name};         $logic =~ s/ (&&|\|\|) $//sm; 
           $logic    =~ s/ (&&|\|\|) $//;         $yymain .= qq~ 
           $yymain .= qq~         if (eid == "$name" && ($logic)) { 
       if (eid == "$name" && ($logic)) {             elm.disabled = false; 
           elm.disabled = false;         } else if (eid == "$name") { 
       } else if (eid == "$name") {             elm.disabled = true; 
           elm.disabled = true;         }\n~; 
       }\n~;     } 
       }  
   
   $yymain.= qq~    $yymain .= qq~
   }    }
$dependicies $dependicies
   window.onload = function(){ $onloadevents};    window.onload = function(){ $onloadevents};
   function undisableAll(node) {    function undisableAll(node) {
       var elements = document.getElementsByTagName("input");        var elements = document.getElementsByTagName("input");
       for(var i = 0; i < elements.length; i++) {        for(var i = 0; i < elements.length; i++) {
           elements[i].disabled = false;            elements[i].disabled = false;
       }        }
       var elements = document.getElementsByTagName("textarea");        elements = document.getElementsByTagName("textarea");
       for(var i = 0; i < elements.length; i++) {        for( i = 0; i < elements.length; i++) {
           elements[i].disabled = false;            elements[i].disabled = false;
       }        }
       var elements = document.getElementsByTagName("select");        elements = document.getElementsByTagName("select");
       for(var i = 0; i < elements.length; i++) {        for( i = 0; i < elements.length; i++) {
           elements[i].disabled = false;            elements[i].disabled = false;
       }        }
   }    }
 // -->  
 </script>~;  </script>~;
   
   $action_area = "newsettings;page=$page";    $action_area = "newsettings;page=$page";
   &AdminTemplate;     AdminTemplate(); 
     return;
} }
   
sub ischecked { sub ischecked {
   # Return a ref so we can be used like ${ischecked($var)} inside a string     my ($inp) = @_; 
   return \' checked="checked"' if $_[0];  
   return \'';     # Return a ref so we can be used like ${ischecked($var)} inside a string 
     return \' checked="checked"' if $inp;
     return \q{};
} }
   
sub isselected { sub isselected {
   # Return a ref so we can be used like ${isselected($var)} inside a string     my ($inp) = @_; 
   return \' selected="selected"' if $_[0];  
   return \'';     # Return a ref so we can be used like ${isselected($var)} inside a string 
     return \' selected="selected"' if $inp;
     return \q{};
} }
   
# Regexes. Will be used like this: $var =~ /^(?:$regexes{'a'}|$regexes{'b'}|$regexes{'c'})$/ || die; # Regexes. Will be used like this: $var =~ /^(?:$regexes{'a'}|$regexes{'b'}|$regexes{'c'})$/ || die;
my %regexes = ( my %regexes = (
boolean     => '.*', # anything. True is not 0 and defined, false is 0/undefined     boolean => 
number      => '\d+', # just numbers       q{.*},    # anything. True is not 0 and defined, false is 0/undefined 
fullnumber  => '(?:\+|\-|)[\d\.]+', # optional sign, plus numbers and decimal     number     => '\d+',               # just numbers 
hexadecimal => '#?[0-9a-fA-F]+', # optional "#" (for hex color codes), plus hex characters     fullnumber => '(?:\+|\-|)[\d\.]+', # optional sign, plus numbers and decimal 
alpha       => '[a-zA-Z]+', # Letters     hexadecimal => '#?[0-9a-fA-F]+', 
text        => '[^\n\r]+', # Anything but newlines  
fulltext    => '(?s).+', # Anything, including newlines     # optional "#" (for hex color codes), plus hex characters 
null        => '', # Use this if something can be false, in addition to the normal valid characters (not needed for boolean)     alpha    => '[a-zA-Z]+',           # Letters 
     text     => '[^\n\r]+',            # Anything but newlines
     fulltext => '(?s).+',              # Anything, including newlines
     null     => q{},
   
  # Use this if something can be false, in addition to the normal valid characters (not needed for boolean)
); );
   
# Preserve the traditional "2" name as well as the nicer SaveSettings. # Preserve the traditional "2" name as well as the nicer SaveSettings.
sub settings2 { sub settings2 {
   &is_admin_or_gmod;     is_admin_or_gmod(); 
   
   # Load/Verify the settings    # Load/Verify the settings
   foreach my $tab (@settings) {    foreach my $tab (@settings) {
       foreach my $item (@{$tab->{'items'}}) {        foreach my $item ( @{ $tab->{'items'} } ) {
           # Get the value  
           my $name = $item->{'name'} || next; # Skip non-items             # Get the value 
           $settings{$name} = $FORM{$name};             my $name = $item->{'name'} || next;    # Skip non-items 
           $settings{$name} = '' unless defined $settings{$name};             $settings{$name} = $FORM{$name}; 
             if ( !defined $settings{$name} ) { $settings{$name} = q{}; }
           $settings{$name} =~ s/^\s+//;  
           $settings{$name} =~ s/\s+$//;             $settings{$name} =~ s/^\s+//xsm; 
             $settings{$name} =~ s/\s+$//xsm;
           # Validate it  
           if ($item->{'validate'}) {             # Validate it 
               # Handle numbers/nulls better (empty string is 0)             if ( $item->{'validate'} ) { 
               if ($item->{'validate'} =~ /null/ && $item->{'validate'} =~ /number/) {  
                   $settings{$name} ||= 0;                 # Handle numbers/nulls better (empty string is 0) 
               }                 if (   $item->{'validate'} =~ /null/sm 
                     && $item->{'validate'} =~ /number/sm )
               # Handle text/nulls better (empty string is empty string :)                 { 
               if ($item->{'validate'} =~ /null/ && $item->{'validate'} =~ /text/) {                     $settings{$name} ||= 0; 
                   $settings{$name} ||= '';                 } 
               }  
                 # Handle text/nulls better (empty string is empty string :)
               # Piece together the patterns. It only needs to validate 1 pattern, but the pattern must be the whole string.                 if (   $item->{'validate'} =~ /null/sm 
               my $pattern = '^(?:' . join('|', @regexes{split(/,/, $item->{'validate'})}) . ')$';                     && $item->{'validate'} =~ /text/sm ) 
               &admin_fatal_error('invalid_value', qq~$name ($item->{'description'})~) unless $settings{$name} =~ /$pattern/;                 { 
                     $settings{$name} ||= q{};
               # Set numeric options to 0 if they are null                 } 
               if ($item->{'validate'} eq 'boolean') {  
                   $settings{$name} = $settings{$name} ? 1 : 0;  # Piece together the patterns. It only needs to validate 1 pattern, but the pattern must be the whole string. 
               }                 my $pattern = '^(?:' 
           }                   . join( q{|}, @regexes{ split /,/xsm, $item->{'validate'} } ) 
       }                   . ')$'; 
   }                 if ( $settings{$name} !~ /$pattern/sm ) { 
                     fatal_error( 'invalid_value',
   # Save them, as according to this type of settings                         qq~$name ($item->{'description'})~ ); 
   # This subroutine resides in the file that is loaded in the hash at the top of the file.                 } 
   &SaveSettings(%settings);  
                 # Set numeric options to 0 if they are null
   # Redirect.                 if ( $item->{'validate'} eq 'boolean' ) { 
   $yySetLocation = "$adminurl?action=newsettings;page=$page";                     $settings{$name} = $settings{$name} ? 1 : 0; 
   &redirectexit;                 } 
             }
         }
     }
   
  # Save them, as according to this type of settings
  # This subroutine resides in the file that is loaded in the hash at the top of the file.
     SaveSettings(%settings);
     $yySetLocation = "$adminurl?action=newsettings;page=$page";
     redirectexit();
     return;
} }
   
# Subroutine for saving to Settings.pl  # Subroutine for saving to Settings.pm 
sub SaveSettingsTo { sub SaveSettingsTo {
   my $file     = shift;    my $file     = shift;
   my %settings = @_;    my %settings = @_;
   
   # This is why we should use hashes for options to begin with.     # these cannot be reversed per Perl Critic. 
   foreach my $key (keys(%settings)) {  
       $$key = delete($settings{$key});  
       # Sanitize the input using \Q...\E later.  
   }  
   
   if ($codemaxchars > 15) { $codemaxchars = 15; }  
   
   my $setfile;  
   if ($file eq 'Settings.pl') {  
       if ($settings_file_version ne $YaBBversion) { # START upgrade codes  
           # The following is for upgrades from YaBB versions < 2.3 START  
           if ($enable_notifications eq '') { $enable_notifications = $enable_notification ? 3 : 0; }  
           $fix_avatar_img_size ||= 0;  
           $fix_post_img_size ||= 0;  
           $fix_signat_img_size ||= 0;  
           $fix_attach_img_size ||= 0;  
           # The following is for upgrades from YaBB versions < 2.3 END  
   
           # The following is for upgrades from YaBB versions < 2.4 START  
           if (-e "$vardir/membergroups.txt") { require "$vardir/membergroups.txt"; }  
           if (!@nopostorder && -e "$vardir/nopostorder.txt") {  
               fopen(NPORDER, "$vardir/nopostorder.txt");  
               @nopostorder = <NPORDER>;  
               fclose(NPORDER);  
               chomp(@nopostorder);  
           }  
   
           if (-e "$vardir/advsettings.txt") { require "$vardir/advsettings.txt"; }  
           if (-e "$vardir/secsettings.txt") { require "$vardir/secsettings.txt"; }  
   
           if (-e "$vardir/Smilies.txt") {  
               require "$vardir/Smilies.txt";  
               $popback =~ s/[^a-f0-9]//ig;  
               $poptext =~ s/[^a-f0-9]//ig;  
           }  
   
           if (-e "$vardir/template.cfg") { require "$vardir/template.cfg"; }  
           elsif (!%templateset) { # only for upgrade from very old versions  
               opendir(TMPLDIR, "$templatesdir"); my @configs = readdir(TMPLDIR); closedir(TMPLDIR);  
               foreach (@configs) { if (-e "$templatesdir/$_/$_.cfg") { require "$admindir/ManageTemplates.pl"; &UpdateTemplates($_, "new"); } }  
           }  
   
           if (-e "$vardir/Guardian.banned") { require "$vardir/Guardian.banned"; }  
           if (-e "$vardir/Guardian.settings") { require "$vardir/Guardian.settings"; }  
   
           if (-e "$vardir/ban.txt") {  
               fopen(BAN, "$vardir/ban.txt");  
               foreach (<BAN>) {  
                   my ($type, $bannedlist) = split(/\|/, $_, 2);  
                   chomp($bannedlist);  
                   $ip_banlist = $bannedlist if $type =~ /I/i;  
                   $email_banlist = $bannedlist if $type =~ /E/i;  
                   $user_banlist = $bannedlist if $type =~ /U/i;  
               }  
               fclose(BAN);  
           }  
   
           if (-e "$vardir/HelpSettings.txt") { require "$vardir/HelpSettings.txt"; }  
           if (-e "$vardir/BackupSettings.cgi") { require "$vardir/BackupSettings.cgi"; @backup_paths = @paths; }  
   
           if (-e "$vardir/extended_profiles_order.txt") {  
               fopen(EXT_FILE, "$vardir/extended_profiles_order.txt");  
               @ext_prof_order = <EXT_FILE>;  
               fclose(EXT_FILE);  
               chomp(@ext_prof_order);  
           }  
           if (-e "$vardir/extended_profiles_fields.txt") {  
               fopen(EXT_FILE, "$vardir/extended_profiles_fields.txt");  
               @ext_prof_fields = <EXT_FILE>;  
               fclose(EXT_FILE);  
               chomp(@ext_prof_fields);  
           }  
   
           if (-e "$vardir/palette.def") {  
               fopen(DEFPAL, "$vardir/palette.def"); @pallist = <DEFPAL>; fclose(DEFPAL); chomp(@pallist);  
           }  
   
           if (!@AdvancedTabs) {  
               if (-e "$vardir/taborder.txt") {  
                   fopen(TABFILE, "$vardir/taborder.txt");  
                   @AdvancedTabs = <TABFILE>;  
                   fclose(TABFILE);  
                   chomp(@AdvancedTabs);  
               } else { @AdvancedTabs = qw (home help search ml admin revalidatesession login register guestpm mycenter logout); }  
   
               if (fopen(EXTTAB, "$vardir/tabs_ext.def")) {  
                   my %exttabs = map /(.*)\t(.*)/, <EXTTAB>;  
                   fclose(EXTTAB);  
                   for (my $i = 0; $i < @AdvancedTabs; $i++) {  
                       if ($exttabs{$AdvancedTabs[$i]}) {  
                           $exttabs{$AdvancedTabs[$i]} =~ s/"//g;  
                           $AdvancedTabs[$i] .= "|$exttabs{$AdvancedTabs[$i]}";  
                       }  
                   }  
                   chomp(@AdvancedTabs);  
               }  
           }  
           # The following is for upgrades from YaBB versions < 2.4 END  
   
           # The following is for upgrades from YaBB versions < 2.3 START  
           if (-e "$vardir/upgrade_secsettings.txt") { require "$vardir/upgrade_secsettings.txt"; }  
           if (-e "$vardir/upgrade_advsettings.txt") { require "$vardir/upgrade_advsettings.txt"; }  
           if (-e "$vardir/upgrade_Settings.pl") { require "$vardir/upgrade_Settings.pl"; }  
           # The following is for upgrades from YaBB versions < 2.3 END  
       } # END upgrade codes  
   
       # Since these are normally in a hash, fix that here  
       $fadertext       ||= $color{'fadertext'};  
       $faderbackground ||= $color{'faderbg'};  
   
       my $templateset = join('', map { qq~'$_' => "$templateset{$_}",\n~; } keys(%templateset));  
   
       my $ext_prof_order = '"' . join('","', @ext_prof_order) . '"' if @ext_prof_order;  
       my $ext_prof_fields = '"' . join(qq~",\n"~, @ext_prof_fields) . '"' if @ext_prof_fields;  
   
       my $member_groups = "# Static Member Groups\n";  
       foreach (keys %Group)  { $member_groups .= qq~\$Group{'$_'} = '$Group{$_}';\n~; }  
       $member_groups .= "\n# Post independent Member Groups\n";  
       foreach (keys %NoPost) { $member_groups .= qq~\$NoPost{'$_'} = '$NoPost{$_}';\n~; }  
       $member_groups .= "\n# Post dependent Member Groups\n";  
       foreach (keys %Post)   { $member_groups .= qq~\$Post{'$_'} = '$Post{$_}';\n~; }  
   
       my $pallist = '"' . join('","', @pallist) . '"' if @pallist;  
   
       if ($INFO{'page'} eq 'main') {  
           if (!$enable_notifications_N && !$enable_notifications_PM) {  
               $enable_notifications = 0;  
           } elsif ($enable_notifications_N && !$enable_notifications_PM) {  
               $enable_notifications = 1;  
           } elsif (!$enable_notifications_N && $enable_notifications_PM) {  
               $enable_notifications = 2;  
           } elsif ($enable_notifications_N && $enable_notifications_PM) {  
               $enable_notifications = 3;  
           }  
       }  
   
       my $AdvancedTabs = '"' . join('","', @AdvancedTabs) . '"';  
   
       my $SmilieURL = '"' . join('","', @SmilieURL) . '"' if @SmilieURL;  
       my $SmilieCode = '"' . join('","', @SmilieCode) . '"' if @SmilieCode;  
       my $SmilieDescription = '"' . join('","', @SmilieDescription) . '"' if @SmilieDescription;  
       my $SmilieLinebreak = '"' . join('","', @SmilieLinebreak) . '"' if @SmilieLinebreak;  
   
       my $backup_paths = join(' ', @backup_paths);     # This is why we should use hashes for options to begin with. 
     foreach my $key ( keys %settings ) {
         ${$key} = delete $settings{$key};
     }
   
     if ( $codemaxchars > 15 ) { $codemaxchars = 15; }
     my $setfile;
     if ( $file eq 'Settings.pm' ) {
         $fadertext       ||= $color{'fadertext'};
         $faderbackground ||= $color{'faderbg'};
   
         my $templateset = join q{},
           map { qq~'$_' => "$templateset{$_}",\n~; } keys %templateset;
   
         if (@ext_prof_order) {
             $ext_prof_order = q{"} . join( q{","}, @ext_prof_order ) . q{"};
         }
         if (@ext_prof_fields) {
             $ext_prof_fields =
               q{"} . join( qq~",\n"~, @ext_prof_fields ) . q{"};
         }
   
         my $member_groups = "# Static Member Groups\n";
         foreach ( keys %Group ) {
             $member_groups .= qq~\$Group{'$_'} = '$Group{$_}';\n~;
         }
         $member_groups .= "\n# Post independent Member Groups\n";
         foreach ( keys %NoPost ) {
             $member_groups .= qq~\$NoPost{'$_'} = '$NoPost{$_}';\n~;
         }
         $member_groups .= "\n# Post dependent Member Groups\n";
         foreach ( keys %Post ) {
             $member_groups .= qq~\$Post{'$_'} = '$Post{$_}';\n~;
         }
   
         if (@pallist) { $pallist = q{"} . join( q{","}, @pallist ) . q{"}; }
   
         if ( $INFO{'page'} eq 'main' ) {
             if ( !$enable_notifications_N ) {
                 if ( !$enable_notifications_PM ) {
                     $enable_notifications = 0;
                 }
                 elsif ($enable_notifications_PM) {
                     $enable_notifications = 2;
                 }
             }
             elsif ($enable_notifications_N) {
                 if ( !$enable_notifications_PM ) {
                     $enable_notifications = 1;
                 }
                 elsif ($enable_notifications_PM) {
                     $enable_notifications = 3;
                 }
             }
         }
   
         my $AdvancedTabs = q{"} . join( q{","}, @AdvancedTabs ) . q{"};
   
         if (@SmilieURL) {
             $SmilieURL = q{"} . join( q{","}, @SmilieURL ) . q{"};
         }
         if (@SmilieCode) {
             $SmilieCode = q{"} . join( q{","}, @SmilieCode ) . q{"};
         }
         if (@SmilieDescription) {
             $SmilieDescription =
               q{"} . join( q{","}, @SmilieDescription ) . q{"};
         }
         if (@SmilieLinebreak) {
             $SmilieLinebreak = q{"} . join( q{","}, @SmilieLinebreak ) . q{"};
         }
   
       $smtp_server =~ s/^\s+|\s+$//g;         my $backup_paths = join q{ }, @backup_paths; 
   
       $setfile = << "EOF";         $smtp_server =~ s/^\s+|\s+$//gxsm; 
   
         $setfile = << "EOF";
############################################################################### ###############################################################################
# Settings.pl                                                                 # # Settings.pm                                                                 #
############################################################################### ###############################################################################
# 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.                      #
############################################################################### ###############################################################################
   
########## Board Info ########## ########## Board Info ##########
# Note: these settings must be properly changed for YaBB to work # Note: these settings must be properly changed for YaBB to work
   
\$settings_file_version = "$YaBBversion";        # If not equal actual YaBBversion then the updating process is run through  \$settings_file_version = "$YaBBversion"; 
  # If not equal actual YaBBversion then the updating process is run through
\%templateset = (  \$yymycharset = '$yymycharset';                 # character encoding (usually ISO-8859-1 for older forums) 
$templateset);                        # Forum templates settings                                             # or 'UTF-8'; 
   
  \%templateset = ($templateset);             # Forum templates settings
   
  \$maintenance = $maintenance;               # Set to 1 to enable Maintenance mode
  \$rememberbackup = $rememberbackup;         # seconds past since last backup until alert is displayed
  \$maintenancetext = "\Q$maintenancetext\E"; # Admin-defined text for Maintenance mode
   
  \$guestaccess = $guestaccess;               # Set to 0 to disallow guests from doing anything but login or register
   
  \$mbname = "\Q$mbname\E";                   # The name of your YaBB forum
  \$forumstart = "\Q$forumstart\E";           # The start date of your YaBB Forum
  \$Cookie_Length = $Cookie_Length;           # Default minutes to set login cookies to stay for
  \$cookieusername = "\Q$cookieusername\E";   # Name of the username cookie
  \$cookiepassword = "\Q$cookiepassword\E";   # Name of the password cookie
  \$cookiesession_name = "\Q$cookiesession_name\E";   # Name of the Session cookie
  \$cookietsort = "\Q$cookietsort\E";   # Name of the message Index sort cookie
  \$cookieview = "\Q$cookieview\E";           # Name of the Guest Message Limit cookie
  \$cookieviewtime = $cookieviewtime;         # life time for Guest Message Limit cookie
  \$screenlogin = $screenlogin;                # allow members to login using their screen name.
   
  \$regtype = $regtype;                       # 0 = registration closed (only admin can register), 1 = pre registration with admin approval,
                                     # 2 = pre registration and email activation, 3 = open registration
  \$RegAgree = $RegAgree;                     # 0 = Don't show registration agreement, 1 = Show registration agreement before registration form, 2 = Show registration agreement on registration form
  \$imp_email_check = $imp_email_check;    # Set to 1 to enable improved e-mail check
  \$RegReasonSymbols = $RegReasonSymbols;         # Maximum allowed symbols in User reason(s) for registering
  \$preregspan = $preregspan;                 # Time span in hours for users to account activation before cleanup
  \$pwstrengthmeter_scores = "\Q$pwstrengthmeter_scores\E";   # Password-Strength-Meter Scores
  \$pwstrengthmeter_common = "\Q$pwstrengthmeter_common\E";   # Password-Strength-Meter common words
  \$pwstrengthmeter_minchar = $pwstrengthmeter_minchar;   # Password-Strength-Meter minimum characters
  \$emailpassword = $emailpassword;           # 0 - instant registration. 1 - password emailed to new members
  \$emailnewpass = $emailnewpass;             # Set to 1 to email a new password to members if they change their email address
  \$emailwelcome = $emailwelcome;             # Set to 1 to email a welcome message to users even when you have mail password turned off
  \$name_cannot_be_userid = $name_cannot_be_userid;   # Set to 1 to require users to have different usernames and display names
  \$birthday_on_reg = $birthday_on_reg;       # Set to 0: don't ask for birthday on registration
                                             # 1: ask for the birthday, no input required
                                             # 2: ask for the birthday, input required
   
  \$gender_on_reg = $gender_on_reg;           # 0: don't ask for gender on registration
                                             # 1: ask for gender, no input required
                                             # 2: ask for gender, input required
  \$nomailspammer = $nomailspammer;           # 1: send deleted account email
  \$lang = "\Q$lang\E";                       # Default Forum Language
  \$default_template = "\Q$default_template\E";   # Default Forum Template
   
  \$mailprog = "\Q$mailprog\E";               # Location of your sendmail program
  \$smtp_server = "\Q$smtp_server\E";         # Address of your SMTP-Server (for Net::SMTP::TLS, specify the port number with a ":<portnumber>" at the end)
  \$smtp_auth_required = $smtp_auth_required; # Set to 1 if the SMTP server requires Authorisation
  \$authuser = "\Q$authuser\E";               # Username for SMTP authorisation
  \$authpass = "\Q$authpass\E";               # Password for SMTP authorisation
  \$webmaster_email = "\Q$webmaster_email\E"; # Your email address. (eg: \$webmaster_email = q^admin\@host.com^;)
  \$mailtype = $mailtype;                     # Mail program to use: 0 = sendmail, 1 = SMTP, 2 = Net::SMTP, 3 = Net::SMTP::TLS
   
\$maintenance = $maintenance;                # Set to 1 to enable Maintenance mode  \$UseHelp_Perms = $UseHelp_Perms;           # Help Center: 1 == use permissions, 0 == don't use permissions 
\$rememberbackup = $rememberbackup;            # seconds past since last backup until alert is displayed  
\$maintenancetext = "\Q$maintenancetext\E";        # Admin-defined text for Maintenance mode  
   
\$guestaccess = $guestaccess;                # Set to 0 to disallow guests from doing anything but login or register  
   
\$mbname = "\Q$mbname\E";                # The name of your YaBB forum  
\$forumstart = "\Q$forumstart\E";            # The start date of your YaBB Forum  
\$Cookie_Length = $Cookie_Length;            # Default minutes to set login cookies to stay for  
\$cookieusername = "\Q$cookieusername\E";        # Name of the username cookie  
\$cookiepassword = "\Q$cookiepassword\E";        # Name of the password cookie  
\$cookiesession_name = "\Q$cookiesession_name\E";    # Name of the Session cookie  
   
\$regtype = $regtype;                    # 0 = registration closed (only admin can register), 1 = pre registration with admin approval,  
                           # 2 = pre registration and email activation, 3 = open registration  
\$RegAgree = $RegAgree;                    # Set to 1 to display the registration agreement when registering  
\$RegReasonSymbols = $RegReasonSymbols;            # Maximum allowed symbols in User reason(s) for registering  
\$preregspan = $preregspan;                # Time span in hours for users to account activation before cleanup  
\$pwstrengthmeter_scores = "\Q$pwstrengthmeter_scores\E";    # Password-Strength-Meter Scores  
\$pwstrengthmeter_common = "\Q$pwstrengthmeter_common\E";    # Password-Strength-Meter common words  
\$pwstrengthmeter_minchar = $pwstrengthmeter_minchar;    # Password-Strength-Meter minimum characters  
\$emailpassword = $emailpassword;            # 0 - instant registration. 1 - password emailed to new members  
\$emailnewpass = $emailnewpass;                # Set to 1 to email a new password to members if they change their email address  
\$emailwelcome = $emailwelcome;                # Set to 1 to email a welcome message to users even when you have mail password turned off  
\$name_cannot_be_userid = $name_cannot_be_userid;    # Set to 1 to require users to have different usernames and display names  
\$birthday_on_reg = $birthday_on_reg;            # Set to 0: don't ask for birthday on registration  
                           # 1: ask for the birthday, no input required  
                           # 2: ask for the birthday, input required  
   
\$gender_on_reg = $gender_on_reg;            # 0: don't ask for gender on registration  
                           # 1: ask for gender, no input required  
                           # 2: ask for gender, input required  
\$nomailspammer = $nomailspammer;         # 1: send deleted account email  
\$lang = "\Q$lang\E";                    # Default Forum Language  
\$default_template = "\Q$default_template\E";        # Default Forum Template  
   
\$mailprog = "\Q$mailprog\E";                # Location of your sendmail program  
\$smtp_server = "\Q$smtp_server\E";            # Address of your SMTP-Server (for Net::SMTP::TLS, specify the port number with a ":<portnumber>" at the end)  
\$smtp_auth_required = $smtp_auth_required;        # Set to 1 if the SMTP server requires Authorisation  
\$authuser = "\Q$authuser\E";                # Username for SMTP authorisation  
\$authpass = "\Q$authpass\E";                # Password for SMTP authorisation  
\$webmaster_email = "\Q$webmaster_email\E";        # Your email address. (eg: \$webmaster_email = q^admin\@host.com^;)  
\$mailtype = $mailtype;                    # Mail program to use: 0 = sendmail, 1 = SMTP, 2 = Net::SMTP, 3 = Net::SMTP::TLS  
   
\$UseHelp_Perms = $UseHelp_Perms;            # Help Center: 1 == use permissions, 0 == don't use permissions  
   
########## MemberGroups ########## ########## MemberGroups ##########
   
$member_groups $member_groups
\@nopostorder = qw(@nopostorder);            # Order how "Post independent Member Groups" are displayed \@nopostorder = qw(@nopostorder);           # Order how "Post independent Member Groups" are displayed
   
########## Layout ########## ########## Layout ##########
   
\$MenuType = $MenuType;                    # 1 for text menu or anything else for images menu \$MenuType = $MenuType;                     # 1 for text menu or anything else for images menu
\$profilebutton = $profilebutton;            # 1 to show view profile button under post, or 0 for blank \$profilebutton = $profilebutton;           # 1 to show view profile button under post, or 0 for blank
\$usertools = $usertools;                # Allow admin to hide the list of tools that show when clicking a userlink  \$threadtools = $threadtools;               # Enable dropdown for post actions 
\$allow_hide_email = $allow_hide_email;            # Allow users to hide their email from public. Set 0 to disable  \$posttools = $posttools;                   # Enable dropdown for post actions 
\$buddyListEnabled = $buddyListEnabled;            # Enable Buddy List  \$usertools = $usertools;                   # Allow admin to hide the list of tools that show when clicking a userlink 
\$addmemgroup_enabled = $addmemgroup_enabled;        # Enable Users choose additional MemberGroups  \$allow_hide_email = $allow_hide_email;     # Allow users to hide their email from public. Set 0 to disable 
\$showlatestmember = $showlatestmember;            # Set to 1 to display "Welcome Newest Member" on the Board Index  \$user_hide_avatars = $user_hide_avatars;       # Allow users to hide Avatars in threads. Set 0 to disable 
\$shownewsfader = $shownewsfader;            # 1 to allow or 0 to disallow NewsFader javascript  \$user_hide_user_text = $user_hide_user_text;       # Allow users to hide User Text in threads. Set 0 to disable 
\$Show_RecentBar = $Show_RecentBar;            # Set to 1 to display the Recent Post on Board Index  \$user_hide_img = $user_hide_img;       # Allow users to hide Images in threads. Set 0 to disable 
\$showmodify = $showmodify;                # Set to 1 to display "Last modified: Realname - Date" under each message  \$user_hide_attach_img = $user_hide_attach_img;     # Allow users to hide Attached Images in threads. Set 0 to disable 
\$ShowBDescrip = $ShowBDescrip;                # Set to 1 to display board descriptions on the topic (message) index for each board  \$user_hide_signat = $user_hide_signat;         # Allow users to hide User Signatures in threads. Set 0 to disable 
\$showuserpic = $showuserpic;                # Set to 1 to display each member's picture in the message view (by the ICQ.. etc.)  \$user_hide_smilies_row = $user_hide_smilies_row;   # Allow users to hide Smilies row below the Post Message-inputarea. Set 0 to disable 
\$showusertext = $showusertext;                # Set to 1 to display each member's personal text in the message view (by the ICQ.. etc.)  \$editGenderLimit = $editGenderLimit;       # Set a limit on the amount of times that member's can edit their gender 
\$showtopicviewers = $showtopicviewers;            # Set to 1 to display members viewing a topic  \$editAgeLimit = $editAgeLimit;             # Set a limit on the amount of times that member's can edit their birthdate 
\$showtopicrepliers = $showtopicrepliers;        # Set to 1 to display members replying to a topic  \$buddyListEnabled = $buddyListEnabled;     # Enable Buddy List 
\$showgenderimage = $showgenderimage;            # Set to 1 to display each member's gender in the message view (by the ICQ.. etc.)  \$addmemgroup_enabled = $addmemgroup_enabled;   # Enable Users choose additional MemberGroups 
\$showyabbcbutt = $showyabbcbutt;            # Set to 1 to display the yabbc buttons on Posting and IM Send Pages  \$showlatestmember = $showlatestmember;     # Set to 1 to display "Welcome Newest Member" on the Board Index 
\$nestedquotes = $nestedquotes;                # Set to 1 to allow quotes within quotes (0 will filter out quotes within a quoted message)  \$shownewsfader = $shownewsfader;           # 1 to allow or 0 to disallow NewsFader javascript 
\$parseflash = $parseflash;                # Set to 1 to parse the flash tag  \$Show_RecentBar = $Show_RecentBar;         # Set to 1 to display the Recent Post on Board Index 
\$enableclicklog = $enableclicklog;            # Set to 1 to track stats in Clicklog (this may slow your board down)  \$showmodify = $showmodify;                 # Set to 1 to display "Last modified: Realname - Date" under each message 
\$showimageinquote = $showimageinquote;            # Set to 1 to shows images in quotes, 0 displays a link to the image  \$ShowBDescrip = $ShowBDescrip;             # Set to 1 to display board descriptions on the topic (message) index for each board 
  \$showuserpic = $showuserpic;               # Set to 1 to display each member's avatar in the message view (by the ICQ.. etc.)
  \$showusertext = $showusertext;             # Set to 1 to display each member's personal text in the message view (by the ICQ.. etc.)
  \$showtopicviewers = $showtopicviewers;     # Set to 1 to display members viewing a topic
  \$showtopicrepliers = $showtopicrepliers;   # Set to 1 to display members replying to a topic
  \$hide_signat_for_guests = $hide_signat_for_guests; # Set to 1 to hide all signatures for Guests (only Members can see them).
  \$showgenderimage = $showgenderimage;       # Set to 1 to display each member's gender in the message view (by the ICQ.. etc.)
  \$showzodiac = $showzodiac;                     # Set to 1 to display each member's zodiac sign in view profile and message view
  \$showuserage = $showuserage;               # Set to 1 to display each member's age in the message view
  \$showage = $showage;                       # Set to 1 to allow member to hide their age and birthyear (Except from the Administrator.)
  \$showregdate = $showregdate;               # Set to 1 to show date of registration.
  \$showyabbcbutt = $showyabbcbutt;           # Set to 1 to display the yabbc buttons on Posting and IM Send Pages
  \$nestedquotes = $nestedquotes;             # Set to 1 to allow quotes within quotes (0 will filter out quotes within a quoted message)
  \$parseflash = $parseflash;                 # Set to 1 to parse the flash tag
  \$enableclicklog = $enableclicklog;         # Set to 1 to track stats in Clicklog (this may slow your board down)
  \$showimageinquote = $showimageinquote;     # Set to 1 to shows images in quotes, 0 displays a link to the image
  \$enabletopichover = $enabletopichover;     # Set to 1 to enable Topic Hover on Message Index
  \$staff_reason = $staff_reason;             # Set to 1 to enable Reason for Editing for Staff
  \$user_reason = $user_reason;               # Set to 1 to enable Reason for Editing for users
   
\@pallist = ($pallist);                    # color settings of the palette \@pallist = ($pallist);         # color settings of the palette
   
########## Feature Settings ########## ########## Feature Settings ##########
   
\$enable_spell_check = $enable_spell_check;        # Set to 1 if you want to enable SpellChecker. By doing this you agree to the terms of license under that googiespell runs. See: http://orangoo.com/labs/GoogieSpell/License/ and /yabbfiles/googiespell/GPL.txt  \$enable_spell_check = $enable_spell_check; # Set to 1 if you want to enable SpellChecker. By doing this you agree to the terms of license under which googiespell runs. See: /yabbfiles/googiespell/GPL.txt and http://creativecommons.org/licenses/by-nc-sa/3.0/ 
\$enable_ubbc = $enable_ubbc;                # Set to 1 if you want to enable UBBC (Uniform Bulletin Board Code) \$enable_ubbc = $enable_ubbc;               # Set to 1 if you want to enable UBBC (Uniform Bulletin Board Code)
\$enable_news = $enable_news;                # Set to 1 to turn news on, or 0 to set news off \$enable_news = $enable_news;               # Set to 1 to turn news on, or 0 to set news off
\$allowpics = $allowpics;                # set to 1 to allow members to choose avatars in their profile \$allowpics = $allowpics;                   # set to 1 to allow members to choose avatars in their profile
\$upload_useravatar = $upload_useravatar;        # set to 1 to allow members to upload avatars for their profile \$upload_useravatar = $upload_useravatar;   # set to 1 to allow members to upload avatars for their profile
\$upload_avatargroup = "\Q$upload_avatargroup\E";    # membergroups allowed to upload avatars for their profile, '' == all members \$upload_avatargroup = "\Q$upload_avatargroup\E";   # membergroups allowed to upload avatars for their profile, '' == all members
\$avatar_limit = $avatar_limit;                # set to the maximum size of the uploaded avatar, 0 == no limit \$avatar_limit = $avatar_limit;             # set to the maximum size of the uploaded avatar, 0 == no limit
\$avatar_dirlimit = $avatar_dirlimit;            # set to the maximum size of the upload avatar directory, 0 == no limit \$avatar_dirlimit = $avatar_dirlimit;       # set to the maximum size of the upload avatar directory, 0 == no limit
  \$default_avatar = $default_avatar;         # Set to 1 to show a default avatar if the member hasn't added a picture
\$enable_guestposting = $enable_guestposting;        # Set to 0 if do not allow 1 is allow.  \$default_userpic = "\Q$default_userpic\E"; # Set the file name for the default avatar 
\$guest_media_disallowed = $guest_media_disallowed;    # disallow browsing guests to see media files or have clickable auto linked urls in messages.  
\$enable_guestlanguage = $enable_guestlanguage;        # allow browsing guests to select their language - requires more than one language pack! - Set to 0 if do not allow 1 is allow. \$enable_guestposting = $enable_guestposting;   # Set to 0 if do not allow 1 is allow.
  \$guest_media_disallowed = $guest_media_disallowed; # disallow browsing guests to see media files or have clickable auto linked urls in messages.
\$enable_notifications = $enable_notifications;        # - Allow e-mail notification for boards/threads listed in "My Notifications" => value == 1  \$enable_guestlanguage = $enable_guestlanguage; # allow browsing guests to select their language - requires more than one language pack! - Set to 0 if do not allow 1 is allow. 
                           # - Allow e-mail notification when new PM comes in => value == 2  \$enable_guest_view_limit = $enable_guest_view_limit;    # Set to 1 to enable guest topic view limit. 
                           # - value == 0 => both disabled | value == 3 => both enabled  \$guest_view_limit = $guest_view_limit;    # Set the amount of topics guests are allowed to view before they are encouraged to register. 
  \$guest_view_limit_block = $guest_view_limit_block ;    # Set to 1 to block guests viewing topics if they reach the topic view limit. Set to 0 to display a message at the top of the message view.
\$NewNotificationAlert = $NewNotificationAlert;        # enable notification alerts (popup) for new notifications  
\$autolinkurls = $autolinkurls;                # Set to 1 to turn URLs into links, or 0 for no auto-linking.  \$enable_notifications = $enable_notifications; # - Allow e-mail notification for boards/threads listed in "My Notifications" => value == 1 
             # - Allow e-mail notification when new PM comes in => value == 2
\$forumnumberformat = $forumnumberformat;        # Select your preferred output Format for Numbers             # - value == 0 => both disabled | value == 3 => both enabled 
\$timeselected = $timeselected;                # Select your preferred output Format of Time and Date  
\$timecorrection = $timecorrection;            # Set time correction for server time in seconds  \$NewNotificationAlert = $NewNotificationAlert; # enable notification alerts (popup) for new notifications 
\$timeoffset = "\Q$timeoffset\E";                # Time Offset to GMT/UTC (0 for GMT/UTC)  \$autolinkurls = $autolinkurls;             # Set to 1 to turn URLs into links, or 0 for no auto-linking. 
\$dstoffset = $dstoffset;                # Time Offset (for daylight savings time, 0 to disable DST)  
\$dynamic_clock = $dynamic_clock;            # Set to a value enables the dynamic clock at the top of the page  \$forumnumberformat = $forumnumberformat;   # Select your preferred output Format for Numbers 
\$TopAmmount = $TopAmmount;                # No. of top posters to display on the top members list  \$timeselected = $timeselected;             # Select your preferred output Format of Time and Date 
\$maxdisplay = $maxdisplay;                # Maximum of topics to display  \$timecorrection = $timecorrection;         # Set time correction for server time in seconds 
\$maxfavs = $maxfavs;                    # Maximum of favorite topics to save in a profile  \$enabletz = $enabletz;                     # Allow for timezone selection 
\$maxrecentdisplay = $maxrecentdisplay;            # Maximum of topics to display on recent posts by a user (-1 to disable)  \$default_tz = "$default_tz";               # default forum timezone 
\$maxsearchdisplay = $maxsearchdisplay;            # Maximum of messages to display in a search query (-1 to disable search)  \$timeoffset = "\Q$timeoffset\E";           # Time Offset to GMT/UTC (0 for GMT/UTC) 
\$maxmessagedisplay = $maxmessagedisplay;        # Maximum of messages to display  \$dstoffset = $dstoffset;                   # Time Offset (for daylight savings time, 0 to disable DST) 
\$showpageall = $showpageall;                # Disable or Enable show All on page selectors  \$dynamic_clock = $dynamic_clock;           # Set to a value enables the dynamic clock at the top of the page 
\$checkallcaps = $checkallcaps;                # Set to 0 to allow ALL CAPS in posts (subject and message) or set to a value > 0 to open a JS-alert if more characters in ALL CAPS were there.  \$TopAmmount = $TopAmmount;                 # No. of top posters to display on the top members list 
\$set_subjectMaxLength = $set_subjectMaxLength;        # Maximum Allowed Characters in a Posts Subject  \$maxdisplay = $maxdisplay;                 # Maximum of topics to display 
\$MaxMessLen = $MaxMessLen;                # Maximum Allowed Characters in a Posts  \$maxfavs = $maxfavs;                       # Maximum of favorite topics to save in a profile 
\$honeypot = $honeypot;                    # Set to 1 to activate Honeypot spam deterrent  \$maxrecentdisplay = $maxrecentdisplay;     # Maximum of posts to display on recent posts by a user (-1 to disable) 
\$spamfruits = $spamfruits;                    # Set to 1 to activate SpamFruits spam deterrent  \$maxrecentdisplay_t = $maxrecentdisplay_t;     # Maximum of topics to display on recent topics (-1 to disable) 
\$speedpostdetection = $speedpostdetection;        # Set to 1 to detect speedposters and delay their spam actions  \$maxsearchdisplay = $maxsearchdisplay;     # Maximum of messages to display in a search query (-1 to disable search) 
\$spd_detention_time = $spd_detention_time;        # Time in seconds before a speedposting ban is lifted again  \$maxmessagedisplay = $maxmessagedisplay;   # Maximum of messages to display 
\$min_post_speed = $min_post_speed;            # Minimum time in seconds between entering a post form and submitting a post  \$showpageall = $showpageall;               # Disable or Enable show All on page selectors 
\$minlinkpost = $minlinkpost;                # Minimum amount of posts a member needs to post links and images  \$checkallcaps = $checkallcaps;             # Set to 0 to allow ALL CAPS in posts (subject and message) or set to a value > 0 to open a JS-alert if more characters in ALL CAPS were there. 
\$minlinksig = $minlinksig;                # Minimum amount of posts a member needs to create links and images in signature  \$set_subjectMaxLength = $set_subjectMaxLength; # Maximum Allowed Characters in a Posts Subject 
\$minlinkweb = $minlinkweb;                # Minimum amount of posts a member needs to link to a website in their profile  \$MaxMessLen = $MaxMessLen;                 # Maximum Allowed Characters in a Posts 
\$post_speed_count = $post_speed_count;            # Maximum amount of abuses befor a user gets banned  \$AdMaxMessLen = $AdMaxMessLen;             # Maximum Allowed Characters in a Posts for Admins 
\$fontsizemin = $fontsizemin;                # Minimum Allowed Font height in pixels  \$MaxIMMessLen = $MaxIMMessLen;             # Maximum Allowed Characters in a PM 
\$fontsizemax = $fontsizemax;                # Maximum Allowed Font height in pixels  \$AdMaxIMMessLen = $AdMaxIMMessLen;                    # Maximum Allowed Characters in a PM for Admins 
\$MaxSigLen = $MaxSigLen;                # Maximum Allowed Characters in Signatures  \$MaxCalMessLen = $MaxCalMessLen;           # Maximum Allowed Characters in a Cal event 
\$ClickLogTime = $ClickLogTime;                # Time in minutes to log every click to your forum (longer time means larger log file size)  \$AdMaxCalMessLen = $AdMaxCalMessLen;                   # Maximum Allowed Characters in a Cal Event for Admins 
\$max_log_days_old = $max_log_days_old;            # If an entry in the user's log is older than ... days remove it  \$calsplit = $calsplit;                     # Maximum number to be shown on page without breaking into months. 
  \$honeypot = $honeypot;                     # Set to 1 to activate Honeypot spam deterrent
\$maxsteps = $maxsteps;                    # Number of steps to take to change from start color to endcolor  \$spamfruits = $spamfruits;                 # Set to 1 to activate SpamFruits spam deterrent 
\$stepdelay = $stepdelay;                # Time in miliseconds of a single step  \$min_reg_time = $min_reg_time;             # Minimum amount of time to be spent filling out the registration form 
\$fadelinks = $fadelinks;                # Fade links as well as text?  \$speedpostdetection = $speedpostdetection; # Set to 1 to detect speedposters and delay their spam actions 
  \$spd_detention_time = $spd_detention_time; # Time in seconds before a speedposting ban is lifted again
\$defaultusertxt = "\Q$defaultusertxt\E";        # The dafault usertext visible in users posts  \$min_post_speed = $min_post_speed;         # Minimum time in seconds between entering a post form and submitting a post 
\$timeout = $timeout;                    # Minimum time between 2 postings from the same IP  \$minlinkpost = $minlinkpost;               # Minimum amount of posts a member needs to post links and images 
\$HotTopic = $HotTopic;                    # Number of posts needed in a topic for it to be classed as "Hot"  \$minlinksig = $minlinksig;                 # Minimum amount of posts a member needs to create links and images in signature 
\$VeryHotTopic = $VeryHotTopic;                # Number of posts needed in a topic for it to be classed as "Very Hot"  \$minlinkweb = $minlinkweb;                 # Minimum amount of posts a member needs to link to a website in their profile 
  \$post_speed_count = $post_speed_count; # Maximum amount of abuses before a user gets banned
  \$fontsizemin = $fontsizemin;               # Minimum Allowed Font height in pixels
  \$fontsizemax = $fontsizemax;               # Maximum Allowed Font height in pixels
  \$MaxSigLen = $MaxSigLen;                   # Maximum Allowed Characters in Signatures
  \$ClickLogTime = $ClickLogTime;             # Time in minutes to log every click to your forum (longer time means larger log file size)
  \$max_log_days_old = $max_log_days_old; # If an entry in the user's log is older than ... days remove it
   
  \$maxsteps = $maxsteps;                     # Number of steps to take to change from start color to endcolor
  \$stepdelay = $stepdelay;                   # Time in milliseconds of a single step
  \$fadelinks = $fadelinks;                   # Fade links as well as text?
   
  \$defaultusertxt = "\Q$defaultusertxt\E";   # The default user text visible in users posts
  \$timeout = $timeout;                       # Minimum time between 2 postings from the same IP
  \$HotTopic = $HotTopic;                     # Number of posts needed in a topic for it to be classed as "Hot"
  \$VeryHotTopic = $VeryHotTopic;             # Number of posts needed in a topic for it to be classed as "Very Hot"
   
\$barmaxdepend = $barmaxdepend;                # Set to 1 to let bar-max-length depend on top poster or 0 to depend on a number of your choise  \$barmaxdepend = $barmaxdepend;             # Set to 1 to let bar-max-length depend on top poster or 0 to depend on a number of your choice 
\$barmaxnumb = $barmaxnumb;                # Select number of post for max. bar-length in memberlist \$barmaxnumb = $barmaxnumb;                 # Select number of post for max. bar-length in memberlist
\$defaultml = "\Q$defaultml\E"; \$defaultml = "\Q$defaultml\E";
   
\$ML_Allowed = $ML_Allowed;                # allow browse MemberList \$ML_Allowed = $ML_Allowed;                 # allow browse MemberList
  \$showuserpicml = $showuserpicml;           # Set to 1 to display each member's avatar in the member list
  \$group_stars_ml = $group_stars_ml;         # Set to 1 to display group stars in the member list
   
########## Quick Reply configuration ########## ########## Quick Reply configuration ##########
   
\$enable_quickpost = $enable_quickpost;            # Set to 1 if you want to enable the quick post box \$enable_quickpost = $enable_quickpost;     # Set to 1 if you want to enable the quick post box
\$enable_quickreply = $enable_quickreply;        # Set to 1 if you want to enable the quick reply box \$enable_quickreply = $enable_quickreply;   # Set to 1 if you want to enable the quick reply box
\$enable_quickjump = $enable_quickjump;            # Set to 1 if you want to enable the jump to quick reply box \$enable_quickjump = $enable_quickjump;     # Set to 1 if you want to enable the jump to quick reply box
\$enable_markquote = $enable_markquote;            # Set to 1 if you want to enable the mark&quote feature \$enable_markquote = $enable_markquote;     # Set to 1 if you want to enable the mark&quote feature
\$quick_quotelength = $quick_quotelength;        # Set the max length for Quick Quotes \$quick_quotelength = $quick_quotelength;   # Set the max length for Quick Quotes
\$enable_quoteuser = $enable_quoteuser;            # Set to 1 if you want to enable userquote \$enable_quoteuser = $enable_quoteuser;     # Set to 1 if you want to enable userquote
\$quoteuser_color = "\Q$quoteuser_color\E";        # Set the default color of @ in userquote \$quoteuser_color = "\Q$quoteuser_color\E"; # Set the default color of @ in userquote
   
########## MemberPic Settings ########## ########## MemberPic Settings ##########
   
\$max_avatar_width = $max_avatar_width;            # Set maximum pixel width to which the selfselected userpics are resized, 0 disables this limit \$max_avatar_width = $max_avatar_width;     # Set maximum pixel width to which the self-selected avatars are resized, 0 disables this limit
\$max_avatar_height = $max_avatar_height;        # Set maximum pixel height to which the selfselected userpics are resized, 0 disables this limit \$max_avatar_height = $max_avatar_height;   # Set maximum pixel height to which the self-selected avatars are resized, 0 disables this limit
\$fix_avatar_img_size = $fix_avatar_img_size;        # Set to 1 disable the image resize feature and sets the image size to the max_... values. If one of the max_... values is 0 the image is shown in his proportions to the other value. If both are 0 the image is shown at his original size. \$fix_avatar_img_size = $fix_avatar_img_size;   # Set to 1 disable the image resize feature and sets the image size to the max_... values. If one of the max_... values is 0 the image is shown in its proportions to the other value. If both are 0 the image is shown at its original size.
\$max_post_img_width = $max_post_img_width;        # Set maximum pixel width for images, 0 disables this limit \$max_avatarml_width = $max_avatarml_width;         # Set maximum pixel width to which the self-selected avatars in member list are resized, 0 disables this limit
\$max_post_img_height = $max_post_img_height;        # Set maximum pixel height for images, 0 disables this limit \$max_avatarml_height = $max_avatarml_height;       # Set maximum pixel height to which the self-selected avatars in member list are resized, 0 disables this limit
\$fix_post_img_size = $fix_post_img_size;        # Set to 1 disable the image resize feature and sets the image size to the max_... values. If one of the max_... values is 0 the image is shown in his proportions to the other value. If both are 0 the image is shown at his original size. \$fix_avatarml_img_size = $fix_avatarml_img_size;   # Set to 1 disable the image resize feature and sets the image size to the max_... values. If one of the max_... values is 0 the image is shown in its proportions to the other value. If both are 0 the image is shown at its original size.
\$max_signat_img_width = $max_signat_img_width;        # Set maximum pixel width for images in the signature, 0 disables this limit \$max_post_img_width = $max_post_img_width; # Set maximum pixel width for images, 0 disables this limit
\$max_signat_img_height = $max_signat_img_height;    # Set maximum pixel height for images in the signature, 0 disables this limit \$max_post_img_height = $max_post_img_height;   # Set maximum pixel height for images, 0 disables this limit
\$fix_signat_img_size = $fix_signat_img_size;        # Set to 1 disable the image resize feature and sets the image size to the max_... values. If one of the max_... values is 0 the image is shown in his proportions to the other value. If both are 0 the image is shown at his original size. \$fix_post_img_size = $fix_post_img_size;   # Set to 1 disable the image resize feature and sets the image size to the max_... values. If one of the max_... values is 0 the image is shown in its proportions to the other value. If both are 0 the image is shown at its original size.
\$max_attach_img_width = $max_attach_img_width;        # Set maximum pixel width for attached images, 0 disables this limit \$max_signat_img_width = $max_signat_img_width; # Set maximum pixel width for images in the signature, 0 disables this limit
\$max_attach_img_height = $max_attach_img_height;    # Set maximum pixel height for attached images, 0 disables this limit \$max_signat_img_height = $max_signat_img_height;   # Set maximum pixel height for images in the signature, 0 disables this limit
\$fix_attach_img_size = $fix_attach_img_size;        # Set to 1 disable the image resize feature and sets the image size to the max_... values. If one of the max_... values is 0 the image is shown in his proportions to the other value. If both are 0 the image is shown at his original size. \$fix_signat_img_size = $fix_signat_img_size;   # Set to 1 disable the image resize feature and sets the image size to the max_... values. If one of the max_... values is 0 the image is shown in its proportions to the other value. If both are 0 the image is shown at its original size.
\$img_greybox = $img_greybox;                # Set to 0 to disable "greybox" (each image is shown in a new window)  \$max_attach_img_width = $max_attach_img_width; # Set maximum pixel width for attached images, 0 disables this limit 
                           # Set to 1 to enable the attachment and post image "greybox" (one image/page)  \$max_attach_img_height = $max_attach_img_height;   # Set maximum pixel height for attached images, 0 disables this limit 
                           # Set to 2 to enable the attachment and post image "greybox" => attachmet images: (all images/page), post images: (one image/page)  \$fix_attach_img_size = $fix_attach_img_size;   # Set to 1 disable the image resize feature and sets the image size to the max_... values. If one of the max_... values is 0 the image is shown in its proportions to the other value. If both are 0 the image is shown at its original size. 
  \$max_brd_img_width = $max_brd_img_width;                           # Set maximum pixel width to which the Board Images are resized, 0 disables this limit
  \$max_brd_img_height = $max_brd_img_height;                          # Set maximum pixel height to which the Board Images are resized, 0 disables this limit
  \$fix_brd_img_size = $fix_brd_img_size;
  \$img_greybox = $img_greybox;           # Set to 0 to disable "greybox" (each image is shown in a new window)
                             # Set to 1 to enable the attachment and post image "greybox" (one image/page)
                             # Set to 2 to enable the attachment and post image "greybox" => attachment images: (all images/page), post images: (one image/page)
   
########## Extended Profiles ########## ########## Extended Profiles ##########
   
\$extendedprofiles = $extendedprofiles;            # Set to 1 to enabled 'Extended Profiles'. Turn it off (0) to save server load. \$extendedprofiles = $extendedprofiles;     # Set to 1 to enabled 'Extended Profiles'. Turn it off (0) to save server load.
\@ext_prof_order = ($ext_prof_order);            # Order of the extended profile fields. \@ext_prof_order = ($ext_prof_order);       # Order of the extended profile fields.
\@ext_prof_fields = ( \@ext_prof_fields = (
$ext_prof_fields $ext_prof_fields
);                            # Settings of the extended profiles fields. );                      # Settings of the extended profiles fields.
   
  ######################################################################
  # Event Calendar                                                     #
  ######################################################################
   
  ########## Standard Calendar Setting ##########
  \$Show_EventCal = $Show_EventCal;
  \$Show_EventButton = $Show_EventButton;
  \$Show_EventBirthdays = $Show_EventBirthdays;
  \$Show_MiniCalIcons = $Show_MiniCalIcons;
  \$ShowSunday = $ShowSunday;
  \$Show_ColorLinks = $Show_ColorLinks;
  \$No_ShortUbbc = $No_ShortUbbc;
  \$Event_TodayColor = "$Event_TodayColor";
  \$Show_caltoday = $Show_caltoday;
  \$Delete_EventsUntil = $Delete_EventsUntil;
  \$CalShortEvent = $CalShortEvent;
  \$CalEventPerms = qq~$CalEventPerms~;
  \$CalEventMods = qq~$CalEventMods~;
  \$CalEventPrivate = $CalEventPrivate;
  \$CalEventNoName = $CalEventNoName;
  \$Scroll_Events = $Scroll_Events;
  \$DisplayCalEvents = $DisplayCalEvents;
  \$DisplayEvents = $DisplayEvents;
   
  ########## Birthdaylist Setting ##########
  \$Show_BirthdaysList = $Show_BirthdaysList;
  \$Show_BirthdayButton = $Show_BirthdayButton;
  \$Show_BirthdayDate = $Show_BirthdayDate;
  \$Show_BdColorLinks = $Show_BdColorLinks;
  \$Show_BdStarsign = $Show_BdStarsign;
   
  ########## Social Bookmarks settings ##########
  \$en_bookmarks   = $en_bookmarks;  # Enable Social Bookmarks
  \$bm_subcut = $bm_subcut; # Maximum characters in subject
  \$bm_boards = "\Q$bm_boards\E"; # Select the boards which Social Bookmarks will be shown in
   
########## File Settings ########## ########## File Settings ##########
   
\$enable_quota = $enable_quota;                # Set to 1 to enable free HOST size check with command 'quota' on every pageview  \$checkspace = $checkspace;         # Set to 1 to enable any freespace checking (should remain disabled on Windows/IIS servers) 
\$hostusername = "\Q$hostusername\E";            # Username on the above host HDD  \$enable_quota = $enable_quota;         # Set to 1 to enable free HOST size check with command 'quota' on every pageview 
\$findfile_time = $findfile_time;            # Used HOST size check with 'find' every ... minutes  \$hostusername = "\Q$hostusername\E";       # Username on the above host HDD 
\$findfile_root = "\Q$findfile_root\E";            # Used HOST size check with 'find' in this folder -r  \$findfile_time = $findfile_time;       # Used HOST size check with 'find' every ... minutes 
\$findfile_maxsize = $findfile_maxsize;            # Maximum size in KB the above folder is allowed to store  \$findfile_root = "\Q$findfile_root\E";     # Used HOST size check with 'find' in this folder -r 
\$findfile_space = "\Q$findfile_space\E";        # dynamically inserted available space on the user account and timestamp of the last check  \$findfile_maxsize = $findfile_maxsize;     # Maximum size in KB the above folder is allowed to store 
\$enable_freespace_check = $enable_freespace_check;    # Set to 1 to enable the free DISK space check on every pageview  \$findfile_space = "\Q$findfile_space\E";   # dynamically inserted available space on the user account and timestamp of the last check 
  \$enable_freespace_check = $enable_freespace_check; # Set to 1 to enable the free DISK space check on every pageview
\$gzcomp = $gzcomp;                    # GZip compression: 0 = No Compression, 1 = External gzip, 2 = Zlib::Compress  
\$gzforce = $gzforce;                    # Don't try to check whether browser supports GZip  \$gzcomp = $gzcomp;             # GZip compression: 0 = No Compression, 1 = External gzip, 2 = Zlib::Compress 
\$cachebehaviour = $cachebehaviour;            # Browser Cache Control: 0 = No Cache must revalidate, 1 = Allow Caching  \$gzforce = $gzforce;               # Don't try to check whether browser supports GZip 
\$use_flock = $use_flock;                # Set to 0 if your server doesn't support file locking, 1 for Unix/Linux and WinNT and 2 for Windows 95/98/ME  \$cachebehaviour = $cachebehaviour;     # Browser Cache Control: 0 = No Cache must revalidate, 1 = Allow Caching 
  \$use_flock = $use_flock;           # Set to 0 if your server doesn't support file locking, 1 for Unix/Linux and WinNT and 2 for Windows 95/98/ME
\$faketruncation = $faketruncation;            # Enable this option only if YaBB fails with the error:  
                           # "truncate() function not supported on this platform."  \$faketruncation = $faketruncation;     # Enable this option only if YaBB fails with the error: 
                           # 0 to disable, 1 to enable.                             # "truncate() function not supported on this platform." 
                             # 0 to disable, 1 to enable.
   
  \$debug = $debug;               # If set to 1 debug info is added to the template. Tag in template is {yabb debug}
   
  ########## Search Settings ##########
  \$enableguestsearch = $enableguestsearch;       # Set to 1 to enable guests access to advanced search.
  \$enableguestquicksearch = $enableguestquicksearch; # Set to 1 to enable guests access to quick search.
  \$mgqcksearch = "\Q$mgqcksearch\E";
  \$mgadvsearch = "\Q$mgadvsearch\E";
  \$qcksearchtype = "\Q$qcksearchtype\E";
  \$qckage = "\Q$qckage\E";
   
\$debug = $debug;                    # If set to 1 debug info is added to the template. Tag in template is {yabb debug}  
########## Anti-spam Question Settings ########## ########## Anti-spam Question Settings ##########
   
\$en_spam_questions = $en_spam_questions;        # Set to 1 to enable Anti-spam Questions  \$en_spam_questions = $en_spam_questions;        # Set to 1 to enable Anti-spam Questions on registration 
  \$spam_questions_send = $spam_questions_send;    # Set to 1 to enable Anti-spam Questions on forgot password and send topic
  \$spam_questions_gp = $spam_questions_gp;        # Set to 1 to enable Anti-spam Questions for guest posting, guest broadcast message and guest alert moderator
\$spam_questions_case = $spam_questions_case;    # Set to 1 to enable case-sensitive answers \$spam_questions_case = $spam_questions_case;    # Set to 1 to enable case-sensitive answers
   
############################################################################### ###############################################################################
# Advanced Settings (old AdvSettings.txt)                                     # # Advanced Settings                                                           #
############################################################################### ###############################################################################
   
########## RSS Settings ########## ########## RSS Settings ##########
   
\$rss_disabled = $rss_disabled;                # Set to 1 to disable the RSS feed \$rss_disabled = $rss_disabled;         # Set to 1 to disable the RSS feed
\$rss_limit = $rss_limit;                # Maximum number of topics in the feed \$rss_limit = $rss_limit;           # Maximum number of topics in the feed
\$rss_message = $rss_message;                # Message to display in the feed \$rss_message = $rss_message;           # Message to display in the feed
                           # 0: None                            # 0: None
                           # 1: Latest Post                            # 1: Latest Post
                           # 2: Original Post in the topic                            # 2: Original Post in the topic
\$showauthor = $showauthor;                # Show author name \$showauthor = $showauthor;         # Show author name
\$showdate = $showdate;                    # Show post date  \$rssemail = '$rssemail';             # default email if author email not shown 
  \$showdate = $showdate;             # Show post date
   
########## New Member Notification Settings ########## ########## New Member Notification Settings ##########
   
\$new_member_notification = $new_member_notification;            # Set to 1 to enable the new member notification \$new_member_notification = $new_member_notification;       # Set to 1 to enable the new member notification
\$new_member_notification_mail = "\Q$new_member_notification_mail\E";    # Your "New Member Notification"-email address. \$new_member_notification_mail = "\Q$new_member_notification_mail\E";   # Your "New Member Notification"-email address.
   
\$sendtopicmail = $sendtopicmail;            # Set to 0 for send NO topic email to friend \$sendtopicmail = $sendtopicmail;       # Set to 0 for send NO topic email to friend
                           # Set to 1 to send topic email to friend via YaBB                            # Set to 1 to send topic email to friend via YaBB
                           # Set to 2 to send topic email to friend via user program                            # Set to 2 to send topic email to friend via user program
                           # Set to 3 to let user decide between 1 and 2                            # Set to 3 to let user decide between 1 and 2
   
########## In-Thread Multi Delete ########## ########## In-Thread Multi Delete ##########
   
\$mdadmin = $mdadmin; \$mdadmin = $mdadmin;
\$mdglobal = $mdglobal; \$mdglobal = $mdglobal;
  \$mdfmod = $mdfmod;
\$mdmod = $mdmod; \$mdmod = $mdmod;
\$adminbin = $adminbin;                    # Skip recycle bin step for admins and delete directly \$adminbin = $adminbin;             # Skip recycle bin step for admins and delete directly
   
########## Moderation Update ########## ########## Moderation Update ##########
   
\$adminview = $adminview;                # Multi-admin settings for Administrators: 0=none, 1=icons 2=single checkbox 3=multiple checkboxes \$adminview = $adminview;           # Multi-admin settings for Administrators: 0=none, 1=icons 2=single checkbox 3=multiple checkboxes
\$gmodview = $gmodview;                    # Multi-admin settings for Global Moderators: 0=none, 1=icons 2=single checkbox 3=multiple checkboxes \$gmodview = $gmodview;             # Multi-admin settings for Global Moderators: 0=none, 1=icons 2=single checkbox 3=multiple checkboxes
\$modview = $modview;                    # Multi-admin settings for Moderators: 0=none, 1=icons 2=single checkbox 3=multiple checkboxes \$fmodview = $fmodview;             # Multi-admin settings for Mid Moderators: 0=none, 1=icons 2=single checkbox 3=multiple checkboxes
  \$modview = $modview;               # Multi-admin settings for Moderators: 0=none, 1=icons 2=single checkbox 3=multiple checkboxes
   
########## Advanced Memberview Plus ########## ########## Advanced Memberview Plus ##########
   
\$showallgroups = $showallgroups; \$showallgroups = $showallgroups;
\$OnlineLogTime = $OnlineLogTime;            # Time in minutes before Users are removed from the Online Log \$OnlineLogTime = $OnlineLogTime;       # Time in minutes before Users are removed from the Online Log
\$lastonlineinlink = $lastonlineinlink;            # Show "Last online X days and XX:XX:XX hours ago." to all members == 1 \$lastonlineinlink = $lastonlineinlink;     # Show "Last online X days and XX:XX:XX hours ago." to all members == 1
   
########## Polls ########## ########## Polls ##########
   
\$numpolloptions = $numpolloptions;            # Number of poll options \$numpolloptions = $numpolloptions;     # Number of poll options
\$maxpq = $maxpq;                    # Maximum Allowed Characters in a Poll Qestion? \$maxpq = $maxpq;               # Maximum Allowed Characters in a Poll Qestion?
\$maxpo = $maxpo;                    # Maximum Allowed Characters in a Poll Option? \$maxpo = $maxpo;               # Maximum Allowed Characters in a Poll Option?
\$maxpc = $maxpc;                    # Maximum Allowed Characters in a Poll Comment? \$maxpc = $maxpc;               # Maximum Allowed Characters in a Poll Comment?
\$useraddpoll = $useraddpoll;                # Allow users to add polls to existing threads? (1 = yes) \$useraddpoll = $useraddpoll;           # Allow users to add polls to existing threads? (1 = yes)
\$ubbcpolls = $ubbcpolls;                # Allow UBBC tags and smilies in polls? (1 = yes) \$ubbcpolls = $ubbcpolls;           # Allow UBBC tags and smilies in polls? (1 = yes)
   
########## My Center and Private Messaging Features ########## ########## My Center and Personal Messaging Features ##########
   
\$PM_level = $PM_level;                    # minimum user level for private messaging: 0 = off, 1 = members, 2 = mods, 3 = gmod \$PM_level = $PM_level;             # minimum user level for private messaging: 0 = off, 1 = members, 2 = mods, 3 = gmod
\$PMenableGuestButton = $PMenableGuestButton;        # enable 'pm to admin' for guests? 1=yes, 0=no. Appears on the general menu instead of 'my center' \$PMenableGuestButton = $PMenableGuestButton;   # enable 'pm to admin' for guests? 1=yes, 0=no. Appears on the general menu instead of 'my center'
\$PMenableAlertButton = $PMenableAlertButton;        # enable 'alert moderator' button on thread view? 1=yes 0=no. Acts as a broadcast message to mods etc. \$PMenableAlertButton = $PMenableAlertButton;   # enable 'alert moderator' button on thread view? 1=yes 0=no. Acts as a broadcast message to mods etc.
\$PMAlertButtonGuests = $PMAlertButtonGuests;        # enable 'alert moderator' button for Guests \$PMAlertButtonGuests = $PMAlertButtonGuests;   # enable 'alert moderator' button for Guests
\$enable_PMsearch = $enable_PMsearch;            #enable/max returns for PM search - 0 = off / 10 - 50 range for results \$enable_PMsearch = $enable_PMsearch;       # enable/max returns for PM search - 0 = off / 10 - 50 range for results
   
\$send_welcomeim = $send_welcomeim;            # enable auto-welcome message from forum to new member. 1=yes, 0=no \$send_welcomeim = $send_welcomeim;     # enable auto-welcome message from forum to new member. 1=yes, 0=no
\$sendname = "\Q$sendname\E";                # username 'from' for welcome message. Defaults to fa. \$sendname = "\Q$sendname\E";           # username 'from' for welcome message. Defaults to fa.
\$imsubject = "\Q$imsubject\E";                # title of welcome message. \$imsubject = "\Q$imsubject\E";         # title of welcome message.
\$imtext = "\Q$imtext\E";                # message sent to new member \$imtext = "\Q$imtext\E";           # message sent to new member
   
\$numposts = $numposts;                    # Number of posts required to send Instant Messages \$numposts = $numposts;             # Number of posts required to send Instant Messages
\$imspam = $imspam;                    # Percent of Users a user is a allowed to send a message at once \$imspam = $imspam;             # Percent of Users a user is a allowed to send a message at once
   
\$enable_imlimit = $enable_imlimit;            # Set to 1 to enable limitation of incoming and outgoing im messages \$enable_imlimit = $enable_imlimit;     # Set to 1 to enable limitation of incoming and outgoing im messages
\$numibox = $numibox;                    # Number of maximum Messages in the IM-Inbox \$numibox = $numibox;               # Number of maximum Messages in the IM-Inbox
\$numobox = $numobox;                    # Number of maximum Messages in the IM-Outbox \$numobox = $numobox;               # Number of maximum Messages in the IM-Outbox
\$numstore = $numstore;                    # Number of maximum Messages in the Storage box \$numstore = $numstore;             # Number of maximum Messages in the Storage box
\$numdraft = $numdraft;                    # Number of maximum Messages in the draft box \$numdraft = $numdraft;             # Number of maximum Messages in the draft box
   
\$PMenable_cc = $PMenable_cc;                # enable cc for PM posting 1 yes, 0 no \$PMenable_cc = $PMenable_cc;           # enable cc for PM posting 1 yes, 0 no
\$PMenable_bcc = $PMenable_bcc;                # enable bcc for PM posting 1 yes, 0 no \$PMenable_bcc = $PMenable_bcc;         # enable bcc for PM posting 1 yes, 0 no
\$PMenableBm_level = $PMenableBm_level;            # minimum level to send? 0 = off, 1 = mods, 2 = gmod, 3 = admin \$PMenableBm_level = $PMenableBm_level;     # minimum level to send? 0 = off, 1 = mods, 2 = gmod, 3 = admin
   
\$enable_storefolders = $enable_storefolders;        # enable additonal store folders - in/out are default for all \$enable_storefolders = $enable_storefolders;   # enable additonal store folders - in/out are default for all
                           # 0=no > 1 = number, max 25                            # 0=no > 1 = number, max 25
   
\$enable_YaBBBut = $enable_YaBBBut;            # enable YABBC Buttons on post page? 1=yes, 0=no \$enable_YaBBBut = $enable_YaBBBut;     # enable YABBC Buttons on post page? 1=yes, 0=no
\$enable_PMcontrols = $enable_PMcontrols;        # enable extended controls for members? 1=yes, 0=no. If off, use the following instead  
\$enable_PMprev = $enable_PMprev;            # enable preview button  \$enable_PMautoAway = $enable_PMautoAway;   # enable PM 'away' auto reply for inbox. 
\$enable_PMActprev = $enable_PMActprev;            # enable active preview  \$enable_MCaway = $enable_MCaway;       # enable 'away' indicator 0=Off 1=Staff to Staff 2=Staff to all 3=Members 
\$enable_PMviewMess = $enable_PMviewMess;        # enable message body suppress in list view  \$MaxAwayLen = $MaxAwayLen;             # maximum allowed characters in Away message 
  \$enable_MCstatusStealth = $enable_MCstatusStealth; # enable 'stealth' mode for fa/gmods. Allows status label to stay at offline/away for all members viewing.
\$enable_PMautoAway = $enable_PMautoAway;        # enable PM 'away' auto reply for inbox.  \$self_del_user = $self_del_user;           # 1: allow member to delete own account. 
\$enable_MCaway = $enable_MCaway;            # enable 'away' indicator 0=Off 1=Staff to Staff 2=Staff to all 3=Members  
\$MaxAwayLen = $MaxAwayLen;                 # maximum allowed characters in Away message  
\$enable_MCstatusStealth = $enable_MCstatusStealth;    # enable 'stealth' mode for fa/gmods. Allows status label to stay at offline/away for all members viewing.  
\$self_del_user = $self_del_user;               # 1: allow member to delete own account.  
   
########## Topic Summary Cutter ########## ########## Topic Summary Cutter ##########
   
\$cutamount = $cutamount;                # Number of posts to list in topic summary \$cutamount = $cutamount;           # Number of posts to list in topic summary
\$tsreverse = $tsreverse;                # Reverse Topic Summaries in Topic Reply (most recent becomes first) \$tsreverse = $tsreverse;           # Reverse Topic Summaries in Topic Reply (most recent becomes first)
\$ttsreverse = $ttsreverse;                # Reverse Topic Summaries in Topic (most recent becomes first) \$ttsreverse = $ttsreverse;         # Reverse Topic Summaries in Topic (most recent becomes first)
\$ttsureverse = $ttsureverse;                # Reverse Topic Summaries in Topic (most recent becomes first) allowed as user wishes? Yes == 1 \$ttsureverse = $ttsureverse;           # Reverse Topic Summaries in Topic (most recent becomes first) allowed as user wishes? Yes == 1
   
########## Time Lock ########## ########## Time Lock ##########
   
\$tlnomodflag = $tlnomodflag;                # Set to 1 limit time users may modify posts \$tlnomodflag = $tlnomodflag;           # Set to 1 limit time users may modify posts
\$tlnomodtime = $tlnomodtime;                # Time limit on modifying posts (days) \$tlnomodtime = $tlnomodtime;           # Time limit on modifying posts (days)
\$tlnodelflag = $tlnodelflag;                # Set to 1 limit time users may delete posts \$tlnodelflag = $tlnodelflag;           # Set to 1 limit time users may delete posts
\$tlnodeltime = $tlnodeltime;                # Time limit on deleting posts (days) \$tlnodeltime = $tlnodeltime;           # Time limit on deleting posts (days)
\$tllastmodflag = $tllastmodflag;            # Set to 1 allow users to modify posts up to the specified time limit w/o showing "last Edit" message \$tllastmodflag = $tllastmodflag;       # Set to 1 allow users to modify posts up to the specified time limit w/o showing "last Edit" message
\$tllastmodtime = $tllastmodtime;            # Time limit to modify posts w/o triggering "last Edit" message (in minutes) \$tllastmodtime = $tllastmodtime;       # Time limit to modify posts w/o triggering "last Edit" message (in minutes)
   
########## Permalinks ########## ########## Permalinks ##########
   
\$accept_permalink = $accept_permalink;            # Set to 1 to have the board accept permalink alike environment strings \$accept_permalink = $accept_permalink;     # Set to 1 to have the board accept permalink alike environment strings
\$symlink = "\Q$symlink\E";                # The part defined in .htaccess redirection rules that is between domainname and permalink \$symlink = "\Q$symlink\E";         # The part defined in .htaccess redirection rules that is between domainname and permalink
\$perm_spacer = "\Q$perm_spacer\E";            # The character used in the permalink output file that replaces the space. \$perm_spacer = "\Q$perm_spacer\E";     # The character used in the permalink output file that replaces the space.
\$perm_domain = "\Q$perm_domain\E";            # The full domainname (no http://) where the .haccess redirect is set on. \$perm_domain = "\Q$perm_domain\E";     # The full domainname (no http://) where the .haccess redirect is set on.
   
########## bypass post for locked thread ########## ########## bypass post for locked thread ##########
   
\$bypass_lock_perm = "\Q$bypass_lock_perm\E";        # set level of permission - fa / fa+gmod / fa+gmod+mod; '' if disabled \$bypass_lock_perm = "\Q$bypass_lock_perm\E";   # set level of permission - fa / fa+gmod / fa+gmod+mod; '' if disabled
   
########## File Attachment Settings ########## ########## File Attachment Settings ##########
   
\$limit = $limit;                    # Set to the maximum number of kilobytes an attachment can be. Set to 0 to disable the file size check. \$limit = $limit;               # Set to the maximum number of kilobytes an attachment can be. Set to 0 to disable the file size check.
\$dirlimit = $dirlimit;                    # Set to the maximum number of kilobytes the attachment directory can hold. Set to 0 to disable the directory size check. \$dirlimit = $dirlimit;             # Set to the maximum number of kilobytes the attachment directory can hold. Set to 0 to disable the directory size check.
\$overwrite = $overwrite;                # Set to 0 to auto rename attachments if they exist, 1 to overwrite them or 2 to generate an error if the file exists already. \$overwrite = $overwrite;           # Set to 0 to auto rename attachments if they exist, 1 to overwrite them or 2 to generate an error if the file exists already.
\@ext = qw(@ext);                    # The allowed file extensions for file attachements. Variable should be set in the form of "jpg bmp gif" and so on. \@ext = qw(@ext);               # The allowed file extensions for file attachements. Variable should be set in the form of "jpg bmp gif" and so on.
\$checkext = $checkext;                    # Set to 1 to enable file extension checking, set to 0 to allow all file types to be uploaded \$checkext = $checkext;             # Set to 1 to enable file extension checking, set to 0 to allow all file types to be uploaded
\$amdisplaypics = $amdisplaypics;            # Set to 1 to display attached pictures in posts, set to 0 to only show a link to them. \$amdisplaypics = $amdisplaypics;       # Set to 1 to display attached pictures in posts, set to 0 to only show a link to them.
\$allowattach = $allowattach;                # Set to the number of maximum files attaching a post, set to 0 to disable file attaching. \$allowattach = $allowattach;           # Set to the number of maximum files attaching a post, set to 0 to disable file attaching.
\$allowguestattach = $allowguestattach;            # Set to 1 to allow guests to upload attachments, 0 to disable guest attachment uploading. \$allowguestattach = $allowguestattach;     # Set to 1 to allow guests to upload attachments, 0 to disable guest attachment uploading.
  \$allowAttachIM = $allowAttachIM;           # Set the maximum number of file attachments allowed in personal messages, set to 0 to disable file attachments in personal messages.
  \$pmAttachGroups = "\Q$pmAttachGroups\E";   # Member groups allowed to send pm attachments, '' == all members
  \$pmDisplayPics = $pmDisplayPics;           # Set to 1 to display attached pictures in personal messages, set to 0 to only show a link to them.
  \$pmCheckExt = $pmCheckExt;                 # Set to 1 to enable file extension checking on pm attachments, set to 0 to allow all file types to be uploaded
  \@pmAttachExt = qw(@pmAttachExt);           # The allowed file extensions for pm file attachements. Variable should be set in the form of "jpg bmp gif" and so on.
  \$pmFileLimit = $pmFileLimit;               # Set to the maximum number of kilobytes a pm attachment can be. Set to 0 to disable the file size check.
  \$pmDirLimit = $pmDirLimit;                 # Set to the maximum number of kilobytes the pm attachment directory can hold. Set to 0 to disable the directory size check.
  \$pmFileOverwrite = $pmFileOverwrite;       # Set to 0 to auto rename pm attachments if they exist, 1 to overwrite them or 2 to generate an error if the file exists already.
   
########## Error Logger ########## ########## Error Logger ##########
   
\$elmax = $elmax;                    # Max number of log entries before rotation \$elmax = $elmax;               # Max number of log entries before rotation
\$elenable = $elenable;                    # allow for error logging \$elenable = $elenable;             # allow for error logging
\$elrotate = $elrotate;                    # Allow for log rotation \$elrotate = $elrotate;             # Allow for log rotation
   
########## Advanced Tabs ##########  \$maxadminlog = $maxadminlog;               #Maximum number of entries stored in adminlog.txt (oldest entries deleted). 
   
\@AdvancedTabs = ($AdvancedTabs);            # Advanced Tabs order and infos  ########## Advanced Tabs ########## 
  \$addtab_on = $addtab_on;               # show advanced tabs on Forum (For admin only.)
  \@AdvancedTabs = ($AdvancedTabs);       # Advanced Tabs order and infos
   
########## Smilies ########## ########## Smilies ##########
   
\@SmilieURL = ($SmilieURL);                # Additional Smilies URL \@SmilieURL = ($SmilieURL);         # Additional Smilies URL
\@SmilieCode = ($SmilieCode);                # Additional Smilies Code \@SmilieCode = ($SmilieCode);           # Additional Smilies Code
\@SmilieDescription = ($SmilieDescription);        # Additional Smilies Description \@SmilieDescription = ($SmilieDescription); # Additional Smilies Description
\@SmilieLinebreak = ($SmilieLinebreak);            # Additional Smilies Linebreak \@SmilieLinebreak = ($SmilieLinebreak);     # Additional Smilies Linebreak
   
\$smiliestyle = "$smiliestyle";                # smiliestyle \$smiliestyle = "$smiliestyle";         # smiliestyle
\$showadded = "$showadded";                # showadded \$showadded = "$showadded";         # showadded
\$showsmdir = "$showsmdir";                # showsmdir \$showsmdir = "$showsmdir";         # showsmdir
\$detachblock = "$detachblock";                # detachblock \$detachblock = "$detachblock";         # detachblock
\$winwidth = "$winwidth";                # winwidth \$winwidth = "$winwidth";           # winwidth
\$winheight = "$winheight";                # winheight \$winheight = "$winheight";         # winheight
\$popback = "$popback";                    # popback \$popback = "$popback";             # popback
\$poptext = "$poptext";                    # poptext \$poptext = "$poptext";             # poptext
\$showinbox = "$showinbox";                # showinbox \$showinbox = "$showinbox";         # showinbox
\$removenormalsmilies = "$removenormalsmilies";        # removenormalsmilies \$removenormalsmilies = "$removenormalsmilies"; # removenormalsmilies
   
   
   
############################################################################### ###############################################################################
# Security Settings (old SecSettings.txt)                                     # # Security Settings                                                           #
############################################################################### ###############################################################################
   
\$regcheck = $regcheck;                    # Set to 1 if you want to enable automatic flood protection enabled \$regcheck = $regcheck;             # Set to 1 if you want to enable automatic flood protection enabled
\$gpvalid_en = $gpvalid_en;                # Set to 1 if you want to enable validation code on guest posting \$gpvalid_en = $gpvalid_en;         # Set to 1 if you want to enable validation code on guest posting
\$codemaxchars = $codemaxchars;                # Set max length of validation code (15 is max) \$codemaxchars = $codemaxchars;         # Set max length of validation code (15 is max)
\$captchastyle = "\Q$captchastyle\E";            # Set L = lowercase only, U = uppercase only, A = both upper and lowercase letters \$captchastyle = "\Q$captchastyle\E";       # Set L = lowercase only, U = uppercase only, A = both upper and lowercase letters
\$rgb_foreground = "\Q$rgb_foreground\E";        # Set hex RGB value for validation image foreground color  \$captchaStartChars = "\Q$captchaStartChars\E"; # Set extra characters at the start of the validation code 
\$rgb_shade = "\Q$rgb_shade\E";                # Set hex RGB value for validation image shade color  \$captchaEndChars = "\Q$captchaEndChars\E"; # Set extra characters at the end of the validation code 
\$rgb_background = "\Q$rgb_background\E";        # Set hex RGB value for validation image background color \$rgb_foreground = "\Q$rgb_foreground\E";   # Set hex RGB value for validation image foreground color
\$translayer = $translayer;                # Set to 1 background for validation image should be transparent  \$rgb_shade = "\Q$rgb_shade\E";         # Set hex RGB value for validation image shade color 
\$randomizer = $randomizer;                # Set 0 to 3 to create background random noise based on foreground or shade color or both  \$rgb_background = "\Q$rgb_background\E";   # Set hex RGB value for validation image background color 
\$distortion = $distortion;                # Set 1 to distort the captcha image even more  \$translayer = $translayer;         # Set to 1 background for validation image should be transparent 
\$stealthurl = $stealthurl;                # Set to 1 to mask referer url to hosts if a hyperlink is clicked.  \$randomizer = $randomizer;         # Set 0 to 3 to create background random noise based on foreground or shade color or both 
\$do_scramble_id = $do_scramble_id;            # Set to 1 scambles all visible links containing user ID's  \$distortion = $distortion;         # Set 1 to distort the captcha image even more 
\$referersecurity = $referersecurity;            # Set to 1 to activate referer security checking.  \$stealthurl = $stealthurl;         # Set to 1 to mask referer url to hosts if a hyperlink is clicked. 
\$sessions = $sessions;                    # Set to 1 to activate session id protection.  \$do_scramble_id = $do_scramble_id;     # Set to 1 scambles all visible links containing user ID's 
\$show_online_ip_admin = $show_online_ip_admin;        # Set to 1 to show online IP's to admins.  \$referersecurity = $referersecurity;       # Set to 1 to activate referer security checking. 
\$show_online_ip_gmod = $show_online_ip_gmod;        # Set to 1 to show online IP's to global moderators.  \$sessions = $sessions;             # Set to 1 to activate session id protection. 
\$masterkey = "\Q$masterkey\E";                # Seed for encryption of captcha's  \$show_online_ip_admin = $show_online_ip_admin; # Set to 1 to show online IP's to admins. 
  \$show_online_ip_gmod = $show_online_ip_gmod;   # Set to 1 to show online IP's to global moderators.
  \$show_online_ip_fmod = $show_online_ip_fmod;   # Set to 1 to show online IP's to yabb moderators.
  \$ipLookup = $ipLookup;                        # Set to 1 to enable IP Lookup.
  \$masterkey = "\Q$masterkey\E";         # Seed for encryption of captchas
   
############################################################################### ###############################################################################
# Guardian Settings (old Guardian.banned and Guardian.settings)               # # Guardian Settings (old Guardian.banned and Guardian.settings)               #
############################################################################### ###############################################################################
   
\$banned_harvesters = qq~$banned_harvesters~; \$banned_harvesters = qq~$banned_harvesters~;
\$banned_referers = qq~$banned_referers~; \$banned_referers = qq~$banned_referers~;
\$banned_requests = qq~$banned_requests~; \$banned_requests = qq~$banned_requests~;
\$banned_strings = qq~$banned_strings~; \$banned_strings = qq~$banned_strings~;
\$whitelist = qq~$whitelist~; \$whitelist = qq~$whitelist~;
   
\$use_guardian = $use_guardian; \$use_guardian = $use_guardian;
\$use_htaccess = $use_htaccess; \$use_htaccess = $use_htaccess;
   
\$disallow_proxy_on = $disallow_proxy_on; \$disallow_proxy_on = $disallow_proxy_on;
\$referer_on = $referer_on; \$referer_on = $referer_on;
\$harvester_on = $harvester_on; \$harvester_on = $harvester_on;
\$request_on = $request_on; \$request_on = $request_on;
\$string_on = $string_on; \$string_on = $string_on;
\$union_on = $union_on; \$union_on = $union_on;
\$clike_on = $clike_on; \$clike_on = $clike_on;
\$script_on = $script_on; \$script_on = $script_on;
   
\$disallow_proxy_htaccess = $disallow_proxy_htaccess; \$disallow_proxy_htaccess = $disallow_proxy_htaccess;
\$referer_htaccess = $referer_htaccess; \$referer_htaccess = $referer_htaccess;
\$harvester_htaccess = $harvester_htaccess; \$harvester_htaccess = $harvester_htaccess;
\$request_htaccess = $request_htaccess; \$request_htaccess = $request_htaccess;
\$string_htaccess = $string_htaccess; \$string_htaccess = $string_htaccess;
\$union_htaccess = $union_htaccess; \$union_htaccess = $union_htaccess;
\$clike_htaccess = $clike_htaccess; \$clike_htaccess = $clike_htaccess;
\$script_htaccess = $script_htaccess; \$script_htaccess = $script_htaccess;
   
\$disallow_proxy_notify = $disallow_proxy_notify; \$disallow_proxy_notify = $disallow_proxy_notify;
\$referer_notify = $referer_notify; \$referer_notify = $referer_notify;
\$harvester_notify = $harvester_notify; \$harvester_notify = $harvester_notify;
\$request_notify = $request_notify; \$request_notify = $request_notify;
\$string_notify = $string_notify; \$string_notify = $string_notify;
\$union_notify = $union_notify; \$union_notify = $union_notify;
\$clike_notify = $clike_notify; \$clike_notify = $clike_notify;
\$script_notify = $script_notify; \$script_notify = $script_notify;
   
   
   
############################################################################### ###############################################################################
# Banning Settings (old ban.txt)                                              # # Banning Settings Time bans                                                  #
############################################################################### ###############################################################################
   
\$ip_banlist = "\Q$ip_banlist\E";            # IP banlist  \@timeban = qw( d w m p ); 
\$email_banlist = "\Q$email_banlist\E";            # EMAIL banlist  \@bandays = ( 1, 7, 30, 365 ); 
\$user_banlist = "\Q$user_banlist\E";            # USER banlist  
   
   
   
############################################################################### ###############################################################################
# Backup Settings (old BackupSettings.cgi)                                    # # Backup Settings                                                             #
############################################################################### ###############################################################################
   
\@backup_paths = qw($backup_paths); \@backup_paths = qw($backup_paths);
  \$backupprogusr = '$backupprogusr';
  \$backupprogbin = '$backupprogbin';
\$backupmethod = '$backupmethod'; \$backupmethod = '$backupmethod';
\$compressmethod = '$compressmethod'; \$compressmethod = '$compressmethod';
\$backupdir = '$backupdir'; \$backupdir = '$backupdir';
\$lastbackup = $lastbackup; \$lastbackup = $lastbackup;
\$backupsettingsloaded = $backupsettingsloaded; \$backupsettingsloaded = $backupsettingsloaded;
   
  ###############################################################################
  # Mod Settings                                                                #
  ###############################################################################
1; 1;
EOF EOF
     }
     else {
   
         # This should only be seen by developers.
         # If you get this, you messed up.
         croak 'I do not know how to write to this file.';
     }
   
   } else {     WriteSettingsTo( "$vardir/$file", $setfile ); 
       # This should only be seen by developers.     return; 
       # If you get this, then you've typoed $file  
       # or tried to write to one that isn't implemented here.  
       die "I don't know how to write to this file.";  
   }  
   
   WriteSettingsTo("$vardir/$file", $setfile);  
   
   if ($settings_file_version ne $YaBBversion) { # START upgrade codes  
       # The following is for upgrades from YaBB versions < 2.4 START  
       unlink("$vardir/nopostorder.txt") if -e "$vardir/nopostorder.txt";  
       unlink("$vardir/advsettings.txt") if -e "$vardir/advsettings.txt";  
       unlink("$vardir/secsettings.txt") if -e "$vardir/secsettings.txt";  
       unlink("$vardir/membergroups.txt") if -e "$vardir/membergroups.txt";  
       unlink("$vardir/Smilies.txt") if -e "$vardir/Smilies.txt";  
       unlink("$vardir/template.cfg") if -e "$vardir/template.cfg";  
       unlink("$vardir/Guardian.banned") if -e "$vardir/Guardian.banned";  
       unlink("$vardir/Guardian.settings") if -e "$vardir/Guardian.settings";  
       unlink("$vardir/ban.txt") if -e "$vardir/ban.txt";  
       unlink("$vardir/ban_email.txt") if -e "$vardir/ban_email.txt";  
       unlink("$vardir/ban_memname.txt") if -e "$vardir/ban_memname.txt";  
       unlink("$vardir/HelpSettings.txt") if -e "$vardir/HelpSettings.txt";  
       unlink("$vardir/BackupSettings.cgi") if -e "$vardir/BackupSettings.cgi";  
       unlink("$vardir/extended_profiles_order.txt") if -e "$vardir/extended_profiles_order.txt";  
       unlink("$vardir/extended_profiles_fields.txt") if -e "$vardir/extended_profiles_fields.txt";  
       unlink("$vardir/palette.def") if -e "$vardir/palette.def";  
       unlink("$vardir/taborder.txt") if -e "$vardir/taborder.txt";  
       unlink("$vardir/tabs_ext.def") if -e "$vardir/tabs_ext.def";  
       # The following is for upgrades from YaBB versions < 2.4 END  
   
       # The following is for upgrades from YaBB versions < 2.3 START  
       unlink("$vardir/upgrade_secsettings.txt") if -e "$vardir/upgrade_secsettings.txt";  
       unlink("$vardir/upgrade_advsettings.txt") if -e "$vardir/upgrade_advsettings.txt";  
       unlink("$vardir/upgrade_Settings.pl") if -e "$vardir/upgrade_Settings.pl";  
       # The following is for upgrades from YaBB versions < 2.3 END  
   } # END upgrade codes  
} }
   
# Subroutine for writing the common format of settings file # Subroutine for writing the common format of settings file
sub WriteSettingsTo { sub WriteSettingsTo {
   my ($file, $setfile) = @_;    my ( $file, $setfile ) = @_;
   
   # Fix a certain type of syntax error    # Fix a certain type of syntax error
   $setfile =~ s~=\s+;~= 0;~g;     $setfile =~ s/=\s+;/= 0;/gsm; 
   
   # Make it look nicely aligned. The comment starts after 50 Col    # Make it look nicely aligned. The comment starts after 50 Col
   my $filler = ' ' x 50;  
   $setfile =~ s~(.+;)[ \t]+(#.+$)~ $1 . substr($filler,(length $1 < 50 ? length $1 : 49)) . $2 ~gem;     *cut_comment = sub { 
   $setfile =~ s~\t+(#.+$)~$filler$1~gm;         my ( $comment, $length ) = 
   $setfile =~ s~(.+)(#.+$)~ $1 . &cut_comment($1,$2) ~gem;           ( q{}, 150 );    # 120 Col is the max width of page 
         my $var_length = length $_[0];
   sub cut_comment { # line brake of too long comments         while ( $length < $var_length ) { $length += 150; } 
       my ($comment,$length) = ('',120); # 120 Col is the max width of page         foreach ( split / +/sm, $_[1] ) { 
       my $var_length = length($_[0]);             if ( ( $var_length + length($comment) + length $_ ) > $length ) { 
       while ($length < $var_length) { $length += 120; }                 $comment =~ s/ $//sm; 
       foreach (split(/ +/, $_[1])) {                 $comment .= "\n$filler#  $_ "; 
           if (($var_length + length($comment) + length($_)) > $length) {                 $length += 150; 
               $comment =~ s/ $//;             } 
               $comment .= "\n$filler#  $_ ";             else { $comment .= "$_ "; } 
               $length += 120;         } 
           } else { $comment .= "$_ "; }         $comment =~ s/ $//sm; 
       }         return $comment; 
       $comment =~ s/ $//;     }; 
       $comment;     my $filler = q{ } x 50; 
   }     $setfile =~ 
  s/(.+;)[ \t]+(#.+$)/ $1 . substr($filler,(length $1 < 50 ? length $1 : 49)) . $2 /gem;
   # Write it out     $setfile =~ s/\t+(#.+$)/$filler$1/gm; 
   fopen(SETTINGS, ">$file") || &admin_fatal_error('cannot_open', $file, 1);     $setfile =~ s/(.+)(#.+$)/ $1 . cut_comment($1,$2) /gem; 
   print SETTINGS $setfile;  
   fclose(SETTINGS);     # Write it out 
     fopen( SETTINGS, ">$file" ) || fatal_error( 'cannot_open', $file, 1 );
     print {SETTINGS} $setfile or croak "$croak{'print'} SETTINGS";
     fclose(SETTINGS);
     return;
} }
   
1; 1;