F:\WEBSITES\testbed\zipped\yabb_svn_new\branches\2.5.2\cgi-bin\yabb2\Sources\DateTime.pl F:\WEBSITES\testbed\zipped\yabb_svn_new\trunk\cgi-bin\yabb2\Sources\DateTime.pm
############################################################################### ###############################################################################
# DateTime.pl                                                                 # # DateTime.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.                      #
############################################################################### ###############################################################################
  no warnings qw(uninitialized once redefine);
$datetimeplver = 'YaBB 2.5.2 $Revision: 1.0 $';  use CGI::Carp qw(fatalsToBrowser); 
  use English qw(-no_match_vars);
  use Time::Local;
  our $VERSION = '2.6.12';
   
  $datetimepmver = 'YaBB 2.6.12 $Revision: 1651 $';
   
  @days_rfc = qw( Sun Mon Tue Wed Thu Fri Sat );
     # for RFC compliant feed time
  @months_rfc = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
   
sub calcdifference {    # Input: $date1 $date2 sub calcdifference {    # Input: $date1 $date2
   $result = int( $date2 / 86400 ) - int( $date1 / 86400 );    $result = int( $date2 / 86400 ) - int( $date1 / 86400 );
     return $result;
} }
   
sub timetostring { sub toffs {
   my $thedate = $_[0];     my ($mydate, $forum_default) = @_; 
   return 0 if !$thedate;     my $toffs = 0; 
   if ( !$maintxt{'107'} ) { $maintxt{'107'} = "at"; }  
   
   # find out what timezone is to be used.     if ( $iamguest || $forum_default || !${ $uid . $username }{'user_tz'} ) { 
   if ($iamguest) {         $tzname = $default_tz || 'UTC'; 
       $toffs = $timeoffset;  
       $toffs +=  
         ( localtime( $thedate + ( 3600 * $toffs ) ) )[8] ? $dstoffset : 0;  
   }    }
   else {    else {
       $toffs = ${ $uid . $username }{'timeoffset'};         $tzname = ${ $uid . $username }{'user_tz'}; 
       $toffs +=  
         ( localtime( $thedate + ( 3600 * $toffs ) ) )[8]  
         ? ${ $uid . $username }{'dsttimeoffset'}  
         : 0;  
   }    }
   
     eval {
           require DateTime;
           require DateTime::TimeZone;
     };
     if( !$EVAL_ERROR ) {
         DateTime->import();
         DateTime::TimeZone->import();
         if ( $tzname eq 'local' ) {
             $tzname = 'UTC';
         }
         my $tz = DateTime::TimeZone->new(name => $tzname);
         my $now = DateTime->from_epoch( 'epoch' => $mydate );
         $toffs = $tz->offset_for_datetime($now);
     }
     elsif ( $EVAL_ERROR ) {
         if ( $tzname eq 'local' ) {
             $toffs = $timeoffset;
             $toffs +=
               ( localtime( $mydate + ( 3600 * $toffs ) ) )[8] ? $dstoffset : 0;
             $toffs = 3600 * $toffs;
         }
         else { $toffs = 0; }
     }
     else { $toffs = 0; }
   
     return $toffs;
  }
   
  sub timetostring {
     my ($thedate) = @_;
     return 0 if !$thedate;
     if ( !$maintxt{'107'} ) { $maintxt{'107'} = 'at'; }
     my $toffs = 0;
     if ($enabletz) {
         $toffs = toffs($thedate);
     }
     my $newtime =  $thedate + $toffs;
   
   ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, undef ) =    ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, undef ) =
     gmtime( $thedate + ( 3600 * $toffs ) );      gmtime( $newtime );
   $sec  = sprintf( "%02d", $sec );     $sec  = sprintf '%02d', $sec; 
   $min  = sprintf( "%02d", $min );     $min  = sprintf '%02d', $min; 
   $hour = sprintf( "%02d", $hour );     $hour = sprintf '%02d', $hour; 
   $mday = sprintf( "%02d", $mday );     $mday = sprintf '%02d', $mday; 
   $mon_num  = $mon + 1;    $mon_num  = $mon + 1;
   $mon_num  = sprintf( "%02d", $mon_num );     $mon_num  = sprintf '%02d', $mon_num; 
   $year     = 1900 + $year;    $year     = 1900 + $year;
   $saveyear = ( $year % 100 );    $saveyear = ( $year % 100 );
   $saveyear = sprintf( "%02d", $saveyear );     $saveyear = sprintf '%02d', $saveyear; 
   return "$mon_num/$mday/$saveyear $maintxt{'107'} $hour\:$min\:$sec";    return "$mon_num/$mday/$saveyear $maintxt{'107'} $hour\:$min\:$sec";
} }
   
# generic string-to-time converter # generic string-to-time converter
   
sub stringtotime { sub stringtotime {
   unless ( $_[0] ) { return 0; }     my ($spvar) = @_; 
   require Time::Local;     if ( !$spvar ) { return 0; } 
   import Time::Local 'timelocal';     $splitvar = $spvar; 
   $splitvar = $_[0];  
   
# receive standard format yabb date/time string. # receive standard format yabb date/time string.
# allow for oddities thrown up from y1 , with full year / single digit day/month # allow for oddities thrown up from y1 , with full year / single digit day/month
   $splitvar =~     my $amonth = 1; 
     m~(\d{1,2})\/(\d{1,2})\/(\d{2,4}).*?(\d{1,2})\:(\d{1,2})\:(\d{1,2})~;     my $aday   = 1; 
   $amonth = int($1) || 1;     my $ayear  = 0; 
   $aday   = int($2) || 1;     my $ahour  = 0; 
   $ayear  = int($3) || 0;    my $amin   = 0;
   $ahour  = int($4) || 0;    my $asec   = 0;
   $amin   = int($5) || 0;  
   $asec   = int($6) || 0;     if ( $splitvar =~ 
         m/(\d{1,2})\/(\d{1,2})\/(\d{2,4}).*?(\d{1,2})\:(\d{1,2})\:(\d{1,2})/sm )
     {
         $amonth = int $1;
         $aday   = int $2;
         $ayear  = int $3;
         $ahour  = int $4;
         $amin   = int $5;
         $asec   = int $6;
     }
     elsif ( $splitvar =~ m/(\d{1,2})\/(\d{1,2})\/(\d{2,4})/sm ) {
         $amonth = int $1;
         $aday   = int $2;
         $ayear  = int $3;
         $ahour  = 0;
         $amin   = 0;
         $asec   = 0;
     }
   
   # Uses 1904 and 2036 as the default dates, as both are leap years.    # Uses 1904 and 2036 as the default dates, as both are leap years.
   # If we used the real extremes (1901 and 2038) - there would be problems    # If we used the real extremes (1901 and 2038) - there would be problems
   # As timelocal dies if you provide 29th Feb as a date in a non-leap year    # As time dies if you provide 29th Feb as a date in a non-leap year
   # Using leap years as the default years prevents this from happening.    # Using leap years as the default years prevents this from happening.
   
   if    ( $ayear >= 36 && $ayear <= 99 ) { $ayear += 1900; }    if    ( $ayear >= 36 && $ayear <= 99 ) { $ayear += 1900; }
   elsif ( $ayear >= 00 && $ayear <= 35 ) { $ayear += 2000; }    elsif ( $ayear >= 00 && $ayear <= 35 ) { $ayear += 2000; }
   if    ( $ayear < 1904 ) { $ayear = 1904; }    if    ( $ayear < 1904 ) { $ayear = 1904; }
   elsif ( $ayear > 2036 ) { $ayear = 2036; }    elsif ( $ayear > 2036 ) { $ayear = 2036; }
   
   if    ( $amonth < 1 )  { $amonth = 0; }    if    ( $amonth < 1 )  { $amonth = 0; }
   elsif ( $amonth > 12 ) { $amonth = 11; }    elsif ( $amonth > 12 ) { $amonth = 11; }
   else                   { --$amonth; }    else                   { --$amonth; }
   
   if ( $amonth == 3 || $amonth == 5 || $amonth == 8 || $amonth == 10 ) {    if ( $amonth == 3 || $amonth == 5 || $amonth == 8 || $amonth == 10 ) {
       $max_days = 30;        $max_days = 30;
   }    }
   elsif ( $amonth == 1 && $ayear % 4 == 0 ) { $max_days = 29; }    elsif ( $amonth == 1 && $ayear % 4 == 0 ) { $max_days = 29; }
   elsif ( $amonth == 1 && $ayear % 4 != 0 ) { $max_days = 28; }    elsif ( $amonth == 1 && $ayear % 4 != 0 ) { $max_days = 28; }
   else                                      { $max_days = 31; }    else                                      { $max_days = 31; }
   if ( $aday > $max_days ) { $aday = $max_days; }    if ( $aday > $max_days ) { $aday = $max_days; }
   
   if    ( $ahour < 1 )  { $ahour = 0; }    if    ( $ahour < 1 )  { $ahour = 0; }
   elsif ( $ahour > 23 ) { $ahour = 23; }    elsif ( $ahour > 23 ) { $ahour = 23; }
   if    ( $amin < 1 )   { $amin  = 0; }    if    ( $amin < 1 )   { $amin  = 0; }
   elsif ( $amin > 59 )  { $amin  = 59; }    elsif ( $amin > 59 )  { $amin  = 59; }
   if    ( $asec < 1 )   { $asec  = 0; }    if    ( $asec < 1 )   { $asec  = 0; }
   elsif ( $asec > 59 )  { $asec  = 59; }    elsif ( $asec > 59 )  { $asec  = 59; }
   
   return ( timelocal( $asec, $amin, $ahour, $aday, $amonth, $ayear ) );    return ( timegm( $asec, $amin, $ahour, $aday, $amonth, $ayear ) );
} }
   
sub timeformat { sub timeformat {
   my $oldformat     = $_[0];     my ( $oldformat, $dontusetoday, $use_rfc, $forum_default, $lower ) = @_; 
   my $dontusetoday  = $_[1];  
   my $use_rfc       = $_[2];     # use forum default time and format 
   my $forum_default = $_[3];    # use forum default time and format  
   
   $mytimeselected =    $mytimeselected =
     ( $forum_default || !${ $uid . $username }{'timeselect'} )      ( $forum_default || !${ $uid . $username }{'timeselect'} )
     ? $timeselected      ? $timeselected
     : ${ $uid . $username }{'timeselect'};      : ${ $uid . $username }{'timeselect'};
   
   chomp $oldformat;    chomp $oldformat;
   return if !$oldformat;    return if !$oldformat;
   
   @days_rfc = ( 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' )  
     ;                           # for RFC compliant feed time  
   @months_rfc = (  
       'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',  
       'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'   
   );  
   
   # find out what timezone is to be used.    # find out what timezone is to be used.
   if ( $iamguest || $forum_default ) {     my $toffs = 0; 
       $toffs = $timeoffset;     if ( $enabletz) { 
       $toffs +=         $toffs = toffs($oldformat, $forum_default); 
         ( localtime( $oldformat + ( 3600 * $toffs ) ) )[8] ? $dstoffset : 0;  
   }  
   else {  
       $toffs = ${ $uid . $username }{'timeoffset'};  
       $toffs +=  
         ( localtime( $oldformat + ( 3600 * $toffs ) ) )[8]  
         ? ${ $uid . $username }{'dsttimeoffset'}  
         : 0;  
   }    }
     my $mynewtime =  $oldformat + $toffs;
   
   my (    my (
       $newsecond, $newminute,  $newhour,    $newday, $newmonth,        $newsecond, $newminute,  $newhour,    $newday, $newmonth,
       $newyear,   $newweekday, $newyearday, undef         $newyear,   $newweekday, $newyearday, $newoff 
   ) = gmtime( $oldformat + ( 3600 * $toffs ) );    ) = gmtime( $mynewtime );
   $newmonth++;    $newmonth++;
   $newyear += 1900;    $newyear += 1900;
   
   # Calculate number of full weeks this year    # Calculate number of full weeks this year
   $newweek = int( ( $newyearday + 1 - $newweekday ) / 7 ) + 1;    $newweek = int( ( $newyearday + 1 - $newweekday ) / 7 ) + 1;
   
   # Add 1 if today isn't Saturday    # Add 1 if today isn't Saturday
   if ( $newweekday < 6 ) { $newweek = $newweek + 1; }    if ( $newweekday < 6 ) { $newweek = $newweek + 1; }
   $newweek = sprintf( "%02d", $newweek );     $newweek = sprintf '%02d', $newweek; 
   
   if ($use_rfc) {    if ($use_rfc) {
       $shortday = $days_rfc[$newweekday];        $shortday = $days_rfc[$newweekday];
   }    }
   else {    else {
       $shortday = $days_short[$newweekday];        $shortday = $days_short[$newweekday];
   }    }
   
   $longday      = $days[$newweekday];    $longday      = $days[$newweekday];
   $newmonth     = sprintf( "%02d", $newmonth );     $newmonth     = sprintf '%02d', $newmonth; 
   $newshortyear = ( $newyear % 100 );    $newshortyear = ( $newyear % 100 );
   $newshortyear = sprintf( "%02d", $newshortyear );     $newshortyear = sprintf '%02d', $newshortyear; 
   if ( $mytimeselected != 4 && $mytimeselected != 8 ) {    if ( $mytimeselected != 4 && $mytimeselected != 8 ) {
       $newday = sprintf( "%02d", $newday );         $newday = sprintf '%02d', $newday; 
   }    }
   $newhour   = sprintf( "%02d", $newhour );     $newhour   = sprintf '%02d', $newhour; 
   $newminute = sprintf( "%02d", $newminute );     $newminute = sprintf '%02d', $newminute; 
   $newsecond = sprintf( "%02d", $newsecond );     $newsecond = sprintf '%02d', $newsecond; 
   
   $newtime = $newhour . ":" . $newminute . ":" . $newsecond;    $newtime = $newhour . q{:} . $newminute . q{:} . $newsecond;
   
   ( undef, undef, undef, undef, undef, $yy, undef, $yd, undef ) =    ( undef, undef, undef, undef, undef, $yy, undef, $yd, undef ) =
     gmtime( $date + ( 3600 * $toffs ) );      gmtime( $date + $toffs );
   $yy += 1900;    $yy += 1900;
   
   $daytxt = undef;    # must be a global variable    $daytxt = undef;    # must be a global variable
   unless ($dontusetoday) {    if ( !$dontusetoday ) {
       if ( $yd == $newyearday && $yy == $newyear ) {        if ( $yd == $newyearday && $yy == $newyear ) {
   
           # today            # today
           $daytxt = qq~<b>$maintxt{'769'}</b>~;            $daytxt = qq~<b>$maintxt{'769'}</b>~;
             if ( $lower && $maintxt{'769l'} ) {
                 $daytxt = qq~<b>$maintxt{'769l'}</b>~;
             }
       }        }
       elsif (        elsif (
           ( ( $yd - 1 ) == $newyearday && $yy == $newyear )            ( ( $yd - 1 ) == $newyearday && $yy == $newyear )
           || (   $yd == 0            || (   $yd == 0
               && $newday == 31                && $newday == 31
               && $newmonth == 12                && $newmonth == 12
               && ( $yy - 1 ) == $newyear )                && ( $yy - 1 ) == $newyear )
         )          )
       {        {
   
           # yesterday || yesterday, over a year end.            # yesterday || yesterday, over a year end.
           $daytxt = qq~<b>$maintxt{'769a'}</b>~;            $daytxt = qq~<b>$maintxt{'769a'}</b>~;
             if ( $lower && $maintxt{'769al'} ) {
                 $daytxt = qq~<b>$maintxt{'769al'}</b>~;
             }
       }        }
   }    }
   
   if ( !$maintxt{'107'} ) { $maintxt{'107'} = $admin_txt{'107'}; }    if ( !$maintxt{'107'} ) { $maintxt{'107'} = $admin_txt{'107'}; }
     my @timform = (
   if ( $mytimeselected == 7 ) {         q{}, 
       $mytimeformat = ${ $uid . $username }{'timeformat'};         time_1( $daytxt, $newday, $newmonth, $newyear, $newtime ), 
       if ( $mytimeformat =~ m/hh/ ) { $hourstyle = 12; }         time_2( $daytxt, $newday, $newmonth, $newyear, $newtime ), 
       if ( $mytimeformat =~ m/HH/ ) { $hourstyle = 24; }         time_3( $daytxt, $newday, $newmonth, $newyear, $newtime ), 
       $mytimeformat =~ s/\@/$maintxt{'107'}/g;         time_4( $daytxt, $newday, $newmonth, $newyear, $newhour, $newminute, $lower ), 
       $mytimeformat =~ s/mm/$newminute/g;         time_5( $daytxt, $newday, $newmonth, $newyear, $newhour, $newminute ), 
       $mytimeformat =~ s/ss/$newsecond/g;         time_6( $daytxt, $newday, $newmonth, $newyear, $newhour, $newminute ), 
       $mytimeformat =~ s/ww/$newweek/g;         q{}, 
         time_8( $daytxt, $newday, $newmonth, $newyear, $newhour, $newminute ),
       if ( $mytimeformat =~ m/\+/ ) {     ); 
           if ( $newday > 10 && $newday < 20 ) {    foreach my $i ( 1 .. 8 ) {
               $dayext = "<sup>$timetxt{'4'}</sup>";         if ( $mytimeselected == $i ) { 
           }             $newformat = $timform[$i]; 
           elsif ( $newday % 10 == 1 ) {  
               $dayext = "<sup>$timetxt{'1'}</sup>";  
           }  
           elsif ( $newday % 10 == 2 ) {  
               $dayext = "<sup>$timetxt{'2'}</sup>";  
           }  
           elsif ( $newday % 10 == 3 ) {  
               $dayext = "<sup>$timetxt{'3'}</sup>";  
           }  
           else {  
               $dayext = "<sup>$timetxt{'4'}</sup>";  
           }  
       }        }
       if ( $hourstyle == 12 ) {     } 
           $ampm = $newhour > 11 ? 'pm' : 'am';     return $newformat; 
           $newhour2 = $newhour % 12 || 12;  } 
           $mytimeformat =~ s/hh/$newhour2/g;  
           $mytimeformat =~ s/\#/$ampm/g;  
       }  
       elsif ( $hourstyle == 24 ) {  
           $mytimeformat =~ s/HH/$newhour/g;  
       }  
       if ( $daytxt eq '' ) {  
           $mytimeformat =~ s/YYYY/$newyear/g;  
           $mytimeformat =~ s/YY/$newshortyear/g;  
           $mytimeformat =~ s/SDT/$shortday/g;  
           $mytimeformat =~ s/LDT/$longday/g;  
           $mytimeformat =~ s/DD/$newday/g;  
           $mytimeformat =~ s/D/$newday/g;  
           $mytimeformat =~ s/\+/$dayext/g;  
           if ( $mytimeformat =~ m/MM/ ) {  
   
               if ($use_rfc) { sub timeformatcal {
                   $mytimeformat =~ s/MM/$months_rfc[$newmonth-1]/g;     my ( $mynewtime, $usetoday ) = @_; 
               }  
               else { $mytimeformat =~ s/MM/$months[$newmonth-1]/g; }     # use forum default time and format 
           }  
           elsif ( $mytimeformat =~ m/M/ ) {  
               $mytimeformat =~ s/M/$newmonth/g;  
           }  
       }  
       else {  
           $mytimeformat =~ s/SDT/$shortday/g;  
           $mytimeformat =~ s/LDT/$longday/g;  
           $mytimeformat =~ s/DD/$daytxt/g;  
           $mytimeformat =~ s/D/$daytxt/g;  
           $mytimeformat =~ s/YY//g;  
           $mytimeformat =~ s/M//g;  
           $mytimeformat =~ s/\/\///g;  
           $mytimeformat =~ s/\+//g;  
       }  
       if ( $newisdst && ${ $uid . $username }{'dsttimeoffset'} != 0 ) {  
           $mytimeformat =~ s/\*/$maintxt{'dst'}/g;  
       }  
       else {  
           $mytimeformat =~ s/\*//g;  
       }  
   
       # Timezones  
       my $timezone = ${ $uid . $username }{'timeoffset'};  
       my $sign     = '+';  
       if ( $timezone < 0 ) { $sign = '-'; }  
       $timezone = $sign . sprintf( "%04u", abs($timezone) * 100 );  
       $mytimeformat =~ s/zzz/$timezone/g;  
       $mytimeformat =~ s/  / /g;  
       $mytimeformat =~ s/[\n\r]//g;  
   
       $newformat = $mytimeformat;     $mytimeselected = 
       ( $forum_default || !${ $uid . $username }{'timeselect'} )
       ? $timeselected
       : ${ $uid . $username }{'timeselect'};
   
     chomp $mynewtime;
     return if !$mynewtime;
   
     # find out what timezone is to be used.
     my $toffs = 0;
     my (
         $newsecond, $newminute,  $newhour,    $newday, $newmonth,
         $newyear,   $newweekday, $newyearday, $newoff
     ) = gmtime( $mynewtime );
     $newmonth++;
     $newyear += 1900;
   
     # Calculate number of full weeks this year
     $newweek = int( ( $newyearday + 1 - $newweekday ) / 7 ) + 1;
   
     # Add 1 if today isn't Saturday
     if ( $newweekday < 6 ) { $newweek = $newweek + 1; }
     $newweek = sprintf '%02d', $newweek;
   
     if ($use_rfc) {
         $shortday = $days_rfc[$newweekday];
   }    }
   elsif ( $mytimeselected == 1 ) {    else {
       $newformat =         $shortday = $days_short[$newweekday]; 
         $daytxt  
         ? qq~$daytxt $maintxt{'107'} $newtime~  
         : qq~$newmonth/$newday/$newshortyear $maintxt{'107'} $newtime~;  
   }    }
   elsif ( $mytimeselected == 2 ) {  
       $newformat =     $longday      = $days[$newweekday]; 
         $daytxt     $newmonth     = sprintf '%02d', $newmonth; 
         ? qq~$daytxt $maintxt{'107'} $newtime~     $newshortyear = ( $newyear % 100 ); 
         : qq~$newday.$newmonth.$newshortyear $maintxt{'107'} $newtime~;     $newshortyear = sprintf '%02d', $newshortyear; 
     if ( $mytimeselected != 4 && $mytimeselected != 8 ) {
         $newday = sprintf '%02d', $newday;
   }    }
   elsif ( $mytimeselected == 3 ) {     $newhour   = sprintf '%02d', $newhour; 
       $newformat =     $newminute = sprintf '%02d', $newminute; 
         $daytxt     $newsecond = sprintf '%02d', $newsecond; 
         ? qq~$daytxt $maintxt{'107'} $newtime~  
         : qq~$newday.$newmonth.$newyear $maintxt{'107'} $newtime~;     $newtime = $newhour . q{:} . $newminute . q{:} . $newsecond; 
   
     if ( $enabletz) {
         $toffs = toffs($date);
   }    }
   elsif ( $mytimeselected == 4 || $mytimeselected == 8 ) {     ( undef, undef, undef, undef, undef, $yy, undef, $yd, undef ) = 
       $ampm = $newhour > 11 ? 'pm' : 'am';       gmtime( $date + $toffs ); 
       $newhour2 = $newhour % 12 || 12;     $yy += 1900; 
       if   ($use_rfc) { $newmonth2 = $months_rfc[ $newmonth - 1 ]; }     $daytxt = undef;    # must be a global variable 
       else            { $newmonth2 = $months[ $newmonth - 1 ]; }     if ( $usetoday == 1 ) { 
       if ( $newday > 10 && $newday < 20 ) {         $myleap = IsLeap($yy); 
           $newday2 = "<sup>$timetxt{'4'}</sup>";         if ( $yd == $newyearday && $yy == $newyear ) { 
       }  
       elsif ( $newday % 10 == 1 ) {             # today 
           $newday2 = "<sup>$timetxt{'1'}</sup>";             $daytxt = qq~<b>$maintxt{'769'}</b>~; 
       }  
       elsif ( $newday % 10 == 2 ) {         } 
           $newday2 = "<sup>$timetxt{'2'}</sup>";         elsif ( 
       }             ( ( $yd - 1 ) == $newyearday && $yy == $newyear ) 
       elsif ( $newday % 10 == 3 ) {             || (   $yd == 0 
           $newday2 = "<sup>$timetxt{'3'}</sup>";                 && $newday == 31 
       }                 && $newmonth == 12 
       else {                 && ( $yy - 1 ) == $newyear ) 
           $newday2 = "<sup>$timetxt{'4'}</sup>";           ) 
       }         { 
       if ( $mytimeselected == 4 ) {  
           $newformat =             # yesterday || yesterday, over a year end. 
             $daytxt             $daytxt = qq~<b>$maintxt{'769a'}</b>~; 
             ? qq~$daytxt $maintxt{'107'} $newhour2:$newminute$ampm~         } 
             : qq~$newmonth2 $newday$newday2, $newyear $maintxt{'107'} $newhour2:$newminute$ampm~;         elsif ( 
       }             ( ( $yd + 1 ) == $newyearday && $yy == $newyear ) 
       else {             || (   $yd == ( 365 + $myleap ) 
           $newformat =                 && $newday == 1 
             $daytxt                 && $newmonth == 0 
             ? qq~$daytxt $maintxt{'107'} $newhour2:$newminute$ampm~                 && ( $yy + 1 ) == $newyear ) 
             : qq~$newday$newday2 $newmonth2, $newyear $maintxt{'107'} $newhour2:$newminute$ampm~;           ) 
       }         { 
   }  
   elsif ( $mytimeselected == 5 ) {             # tomorrow || tomorrow, over a year end. 
       $ampm = $newhour > 11 ? 'pm' : 'am';             $daytxt = qq~<b>$maintxt{'769b'}</b>~; 
       $newhour2 = $newhour % 12 || 12;         } 
       $newformat =  
         $daytxt  
         ? qq~$daytxt $maintxt{'107'} $newhour2:$newminute$ampm~  
         : qq~$newmonth/$newday/$newshortyear $maintxt{'107'} $newhour2:$newminute$ampm~;  
   }    }
   elsif ( $mytimeselected == 6 ) {  
       if   ($use_rfc) { $newmonth2 = $months_rfc[ $newmonth - 1 ]; }    if ( !$maintxt{'107'} ) { $maintxt{'107'} = $admin_txt{'107'}; }
       else            { $newmonth2 = $months[ $newmonth - 1 ]; }     my @timform = ( 
       $newformat =         q{}, 
         $daytxt         time_1( $daytxt, $newday, $newmonth, $newyear, $newtime ), 
         ? qq~$daytxt $maintxt{'107'} $newhour:$newminute~         time_2( $daytxt, $newday, $newmonth, $newyear, $newtime ), 
         : qq~$newday. $newmonth2 $newyear $maintxt{'107'} $newhour:$newminute~;         time_3( $daytxt, $newday, $newmonth, $newyear, $newtime ), 
         time_4( $daytxt, $newday, $newmonth, $newyear, $newhour, $newminute ),
         time_5( $daytxt, $newday, $newmonth, $newyear, $newhour, $newminute ),
         time_6( $daytxt, $newday, $newmonth, $newyear, $newhour, $newminute ),
         q{},
         time_8( $daytxt, $newday, $newmonth, $newyear, $newhour, $newminute ),
     );
     foreach my $i ( 1 .. 8 ) {
         if ( $mytimeselected == $i ) {
             $newformat = $timform[$i];
         }
   }    }
   $newformat;     $newformat = dtonly($newformat); 
     return $newformat;
} }
   
sub CalcAge { sub CalcAge {
   &timetostring($date);     my ( $user, $act ) = @_; 
   my ( $usermonth, $userday, $useryear, $act );  
   my $user = $_[0];     timetostring($date); 
   my $act  = $_[1];     my ( $usermonth, $userday, $useryear ); 
   
   if ( ${ $uid . $user }{'bday'} ne '' ) {    if ( ${ $uid . $user }{'bday'} ne q{} ) {
       ( $usermonth, $userday, $useryear ) =        ( $usermonth, $userday, $useryear ) =
         split( /\//, ${ $uid . $user }{'bday'} );           split /\//xsm, ${ $uid . $user }{'bday'}; 
   
       if ( $act eq "calc" ) {        if ( $act eq 'calc' ) {
           if ( length( ${ $uid . $user }{'bday'} ) <= 2 ) {            if ( length( ${ $uid . $user }{'bday'} ) <= 2 ) {
               $age = ${ $uid . $user }{'bday'};                $age = ${ $uid . $user }{'bday'};
           }            }
           else {            else {
               $age = $year - $useryear;                $age = $year - $useryear;
               if ( $usermonth > $mon_num                if ( $usermonth > $mon_num
                   || ( $usermonth == $mon_num && $userday > $mday ) )                    || ( $usermonth == $mon_num && $userday > $mday ) )
               {                {
                   --$age;                    --$age;
               }                }
           }            }
       }        }
       if ( $act eq "parse" ) {        if ( $act eq 'parse' ) {
           if ( length( ${ $uid . $user }{'bday'} ) <= 2 ) { return; }            if ( length( ${ $uid . $user }{'bday'} ) <= 2 ) { return; }
           $umonth = $usermonth;            $umonth = $usermonth;
           $uday   = $userday;            $uday   = $userday;
           $uyear  = $useryear;            $uyear  = $useryear;
       }        }
       if ( $act eq "isbday" ) {        if ( $act eq 'isbday' ) {
           if ( $usermonth == $mon_num && $userday == $mday ) {            if ( $usermonth == $mon_num && $userday == $mday ) {
               $isbday = "yes";                 $isbday = 'yes'; 
           }            }
       }        }
   }    }
   else {    else {
       $age    = "";         $age    = q{}; 
       $isbday = "";         $isbday = q{}; 
   }    }
     return;
} }
   
sub NumberFormat { sub NumberFormat {
   my ( $decimal, $fraction ) = split( /\./, $_[0] );     my ($inp) = @_; 
     my ( $decimal, $fraction ) = split /\./xsm, $inp;
   my $tmpforumformat = $forumnumberformat || 1;    my $tmpforumformat = $forumnumberformat || 1;
   my $numberformat = ${ $uid . $username }{'numberformat'} || $tmpforumformat;    my $numberformat = ${ $uid . $username }{'numberformat'} || $tmpforumformat;
   if ( $numberformat == 1 ) {     my @septor = 
       $separator = "";       ( [ q{}, q{}, q{,}, q{.}, q{ }, ], [ q{.}, q{,}, q{.}, q{,}, q{,}, ], ); 
       $decimalpt = ".";  
   }     foreach my $i ( 0 .. 4 ) { 
   elsif ( $numberformat == 2 ) {         $dra = $septor[0]->[$i]; 
       $separator = "";         $drb = $septor[1]->[$i]; 
       $decimalpt = ",";         if ( $numberformat == ( $i + 1 ) ) { 
   }             $separator = $dra; 
   elsif ( $numberformat == 3 ) {             $decimalpt = $drb; 
       $separator = ",";         } 
       $decimalpt = ".";  
   }  
   elsif ( $numberformat == 4 ) {  
       $separator = ".";  
       $decimalpt = ",";  
   }  
   elsif ( $numberformat == 5 ) {  
       $separator = " ";  
       $decimalpt = ",";  
   }    }
   if ( $decimal =~ m/\d{4,}/ ) {    if ( $decimal =~ m/\d{4,}/sm ) {
       $decimal = reverse $decimal;        $decimal = reverse $decimal;
       $decimal =~ s/(\d{3})/$1$separator/g;         $decimal =~ s/(\d{3})/$1$separator/gsm; 
       $decimal = reverse $decimal;        $decimal = reverse $decimal;
       $decimal =~ s/^(\.|\,| )//;         $decimal =~ s/^(\.|\,| )//sm; 
   }    }
   $newnumber = $decimal;    $newnumber = $decimal;
   if ($fraction) {    if ($fraction) {
       $newnumber .= "$decimalpt$fraction";        $newnumber .= "$decimalpt$fraction";
   }    }
   return $newnumber;    return $newnumber;
  }
   
  sub time_1 {
     my ( $daytxt, $newday, $newmonth, $newyear, $newtime ) = @_;
     $newformat =
       $daytxt
       ? qq~$daytxt $maintxt{'107'} $newtime~
       : qq~$newmonth/$newday/$newshortyear $maintxt{'107'} $newtime~;
   
     return $newformat;
  }
   
  sub time_2 {
     my ( $daytxt, $newday, $newmonth, $newyear, $newtime ) = @_;
     $newformat =
       $daytxt
       ? qq~$daytxt $maintxt{'107'} $newtime~
       : qq~$newday.$newmonth.$newshortyear $maintxt{'107'} $newtime~;
   
     return $newformat;
  }
   
  sub time_3 {
     my ( $daytxt, $newday, $newmonth, $newyear, $newtime ) = @_;
     $newformat =
       $daytxt
       ? qq~$daytxt $maintxt{'107'} $newtime~
       : qq~$newday.$newmonth.$newyear $maintxt{'107'} $newtime~;
   
     return $newformat;
  }
   
  sub time_4 {
     my ( $daytxt, $newday, $newmonth, $newyear, $newhour, $newminute, $lower ) = @_;
     $ampm = $newhour > 11 ? 'pm' : 'am';
     $newhour2 = $newhour % 12 || 12;
     if ( !@months_m ) { @months_m = @months; }
     if   ($use_rfc) { $newmonth2 = $months_rfc[ $newmonth - 1 ]; }
     elsif ( $lower ) { $newmonth2 = $months_m[ $newmonth - 1 ]; }
     else             { $newmonth2 = $months[ $newmonth - 1 ]; }
     $newday2 = "$timetxt{'4'}";
     if ( $newday > 10 && $newday < 20 ) {
         $newday2 = "$timetxt{'4'}";
     }
     else {
         foreach my $i ( 1 .. 3 ) {
             if ( $newday % 10 == $i ) {
                 $newday2 = qq~$timetxt{$i}~;
             }
         }
     }
     $newformat =
           $daytxt
           ? qq~$daytxt $maintxt{'107'} $newhour2:$newminute$ampm~
           : qq~$newmonth2$maintxt{'770'} $newday$newday2, $newyear $maintxt{'107'} $newhour2:$newminute$ampm~;
   
     return $newformat;
  }
   
  sub time_5 {
     my ( $daytxt, $newday, $newmonth, $newyear, $newhour, $newminute ) = @_;
     $ampm = $newhour > 11 ? 'pm' : 'am';
     $newhour2 = $newhour % 12 || 12;
     $newformat =
       $daytxt
       ? qq~$daytxt $maintxt{'107'} $newhour2:$newminute$ampm~
       : qq~$newmonth/$newday/$newshortyear $maintxt{'107'} $newhour2:$newminute$ampm~;
   
     return ($newformat);
  }
   
  sub time_6 {
     my ( $daytxt, $newday, $newmonth, $newyear, $newhour, $newminute ) = @_;
     if   ($use_rfc) { $newmonth2 = $months_rfc[ $newmonth - 1 ]; }
     elsif ( @months_m )            { $newmonth2 = $months_m[ $newmonth - 1 ]; }
     else            { $newmonth2 = $months[ $newmonth - 1 ]; }
     $newformat =
       $daytxt
       ? qq~$daytxt $maintxt{'107'} $newhour:$newminute~
       : qq~$newday. $newmonth2$maintxt{'770a'} $newyear $maintxt{'107'} $newhour:$newminute~;
   
     return $newformat;
  }
   
  sub time_8 {
     my ( $daytxt, $newday, $newmonth, $newyear, $newhour, $newminute ) = @_;
     $ampm = $newhour > 11 ? 'pm' : 'am';
     $newhour2 = $newhour % 12 || 12;
     if   ($use_rfc) { $newmonth2 = $months_rfc[ $newmonth - 1 ]; }
     elsif ( @months_m )            { $newmonth2 = $months_m[ $newmonth - 1 ]; }
     else            { $newmonth2 = $months[ $newmonth - 1 ]; }
     $newday2 = "$timetxt{'4'}";
     if ( $newday > 10 && $newday < 20 ) {
         $newday2 = "$timetxt{'4'}";
     }
     else {
         foreach my $i ( 1 .. 3 ) {
             if ( $newday % 10 == $i ) {
                 $newday2 = qq~$timetxt{$i}~;
             }
         }
     }
     $newformat =
       $daytxt
       ? qq~$daytxt $maintxt{'107'} $newhour2:$newminute$ampm~
       : qq~$newday$newday2 $newmonth2$maintxt{'770a'}, $newyear $maintxt{'107'} $newhour2:$newminute$ampm~;
   
     return $newformat;
  }
   
  sub dtonly {
     my ($newformat) = @_;
     if ( $newformat =~ m/\A(.*?)\s*$maintxt{'107'}\s*(.*?)\Z/ism ) {
         $dateonly = $1;
     }
   
     return ($dateonly);
  }
   
  sub tmonly {
     my ($newformat) = @_;
     if ( $newformat =~ m/\A(.*?)\s*$maintxt{'107'}\s*(.*?)\Z/ism ) {
         $timeonly = $2;
     }
   
     return ($timeonly);
  }
   
  sub bdayno_year {
     my ($newformat) = @_;
     $date_noyear = $newformat;
     if ( $mytimeselected == 4 || $mytimeselected == 8 ) {
         ( $date_noyear, undef ) = split /\,/xsm, $newformat;
     }
     elsif ( $mytimeselected == 1 || $mytimeselected == 5 ) {
         @date_noyear = split /\//xsm, $newformat;
         $date_noyear = qq~$date_noyear[0]~ . q{/} . qq~$date_noyear[1]~;
     }
     elsif ( $mytimeselected == 2 || $mytimeselected == 3 ) {
         @date_noyear = split /[.]/xsm, $newformat;
         $date_noyear = qq~$date_noyear[0]~ . q{/} . qq~$date_noyear[1]~;
     }
     elsif ( $mytimeselected == 6 ) {
         @date_noyear = split / /sm, $newformat;
         $date_noyear = qq~$date_noyear[0] $date_noyear[1]~;
     }
   
     return ($date_noyear);
  }
   
  sub IsLeap {  
    my ($year ) = @_;
    return 0 if $year % 4;
    return 1 if $year % 100;
    return 0 if $year % 400;
    return 1;
  }
   
  sub ctbtime {
     my (
         $newsecond, $newminute,  $newhour,    $newday, $newmonth,
         $newyear,   $newweekday, $newyearday, $newoff
     ) = gmtime( $date );
     $newyear += 1900;
     $shortday = $days_rfc[$newweekday];
     $shortmon = $months_rfc[$newmonth];
     $newhour   = sprintf '%02d', $newhour;
     $newminute = sprintf '%02d',