webtools - Full featured WEB Development Tools (compare with Php language) in Perl syntax


WebTools documentation Contained in the WebTools distribution.

Index


Code Index:

NAME

Top

webtools - Full featured WEB Development Tools (compare with Php language) in Perl syntax

DESCRIPTION

Top

This package is written in pure Perl and its main purpose is: to help all Web developers. It brings in self many features of modern Web developing:

  -  Grabs best of Php but in Perl syntax.
  -  Embedded Perl into HTML files.
  -  Buffered output.
  -  Easy reading input forms and cookies using global variables.
  -  Flat files database support.
  -  MySQL/MS Access support.
  -  Full Sessions support (via flat files or via DB)
  -  Easy User support (SignIn / SignUp)
  -  Cookies support.
  -  Attached variables.
  -  Html/SQL templates and variables.
  -  Mail functions (plain/html mails/uploads)
  -  Upload/download functions via Perl scripts.
  -  DES III encription/decription in MIME style
  and more...

SYNOPSIS

Top

 Follow example show session capabilities, when WebTools is configured with 
 Flat file session support(default):

 <?perl 

    $sid = session_start();

    %h = read_hash('myhash');

    if($h{'city'} ne "Pleven")
      {
       print "<B>New session started!</B>";
       %h = (city=>"Pleven",country=>"Bulgaria");
       $reg_data = register_var('hash','myhash',%h);
       # $reg_data .= register_var('scalar','scl_name',$cnt);
       # $reg_data .= register_var('array',''arrname',@arr);
       session_register($reg_data);
      }
    else
      {
       print "Current session is: <B>$sid</B> <BR> and registrated data are:<BR>";
       print "Country: <B>".$h{'country'}."</B><BR>";
       print "City: <B>".$h{'city'}."</B><BR>";
       session_destroy();
       print "Session Destroyed!";
      }
    Header(type=>'content',val=>'text/html; charset=Windows-1251');
    # SURPRISE: We send header after html data??? (Is Php capable of this? ;-)
 ?>

 Above code can be saved in 'htmls' directory under 'test.whtml' file name and you can
 run it in browser location with follow line:
 http://your_host.com/cgi-bin/webtools/process.cgi?file=test.whtml




 


 Code below show how easy is to send e-mails with WebTools
 (Don't forget to set $debug_mail = 'off' in config.pl)
 <?perl 

    require 'mail.pl';

    $to   = 'some@where.com';
    $from = 'me@myhost.com';
    $subject = 'Test';
    $body = 'Hello there!';

    $orginal_filename = $uploaded_original_file_names{'myupload'};
    # 'myupload' is name of input field in html form.

    $fn = $uploaded_files{'myupload'};

    set_mail_attachment($orginal_filename,$fn);

    send_mail($from,$to,$subject,$body);
    print 'Mail sent!';
 ?>

 Above code can be saved in 'htmls' directory under 'mail.whtml' file name and you can
 run it in browser location with follow line:
 http://your_host.com/cgi-bin/webtools/process.cgi?file=mail.whtml




Specifications and examples
 Please read HELP.doc and see all examples in docs/examples directory


WebTools documentation Contained in the WebTools distribution.

package webtools;
####################################################
# Perl`s WEB module
####################################################
###########################################
# BEGIN Section start here
###########################################
BEGIN {
use vars qw($VERSION $INTERNALVERSION @ISA @EXPORT);
    $VERSION = "1.27";
    $INTERNALVERSION = "1";
    @ISA = qw(Exporter);
    @EXPORT = 
     qw(
        %sess_cookies %SESREG %SESREG_TYPES $sys_cookie_accepted 
        session_start session_destroy session_register 
        $session_started session_clear_expired session_id 
        read_scalar read_array read_hash register_var unregister_var exists_var 
        session_id_adder href_sid_adder action_sid_adder 
        new_session session_expire_update update_var 
        session_set_id_name session_id_name session_ip_restrict 
        session_expiration session_cookie_path 
        convert_ses_time GetCurrentSID 
        
        GetCookies SetCookies  SetCookieExpDate SetCookiePath SetCookieDomain SetSecureCookie 
        GetCompressedCookies SetCompressedCookies delete_cookie write_cookie read_cookie 
        $cookie_path_cgi $cookie_domain_cgi $cookie_exp_date_cgi $secure_cookie_cgi 
        
        SignUpUser SignInUser 
        
        sql_query sql_fetchrow sql_affected_rows sql_inserted_id hideerror sql_select_db 
        sql_num_rows sql_quote sql_connect sql_disconnect $sql_host $sql_user test_connect 
        sql_data_seek sql_errmsg sql_errno load_database_driver $sql_pass $sql_database_sessions 
        $sql_sessions_table DB_OnDestroy DB_OnExit $system_database_handle 
        
        Header read_form read_form_array read_var href_adder action_adder 
        attach_var detach_var 
        encode_separator decode_separator 
        StartUpInit RunScript set_script_timeout flush_print set_printing_mode DestroyScript 
        ClearBuffer ClearHeader Load_and_Parse_script $print_header_buffer $print_flush_buffer 
        r_str rand_srand b_print Parse_Form exists_insensetive set_ignore_termination 
        get_ignore_termination global_variables_dump_style $sys_ignore_term 
        *SESSIONSTDOUT $reg_buffer $global_variables_dump set_variables_dump 
        $sentcontent $apacheshtdocs %SIGNALS $loaded_functions 
        $sys_OS $sys_CRLF $sys_EBCDIC $sys_config_pl_loaded 
       );

 require Exporter;
 
 use Errors::Errors;
 $Errors::Errors::sys_ERROR = Errors::Errors->new(); # Create one global error object
 
 use globexport;
 use stdouthandle;

 #################################
 # PLEASE DO NOT MODIFY ANYTHING!
 # Please see file config.pl !!!
 #################################
 $| = 1;                               # Flush imediatly!   
 $webtools::sentcontent = 0;           # Show whether Send_Content() where called!
 $webtools::session_started = 0;       # Show whether session_start were started!
 %webtools::attached_vars = ();        # The variables that we will store
 $webtools::reg_buffer = '';           # Contain register session file!
 %webtools::SESREG = ();
 %webtools::SESREG_TYPES = ();
 %webtools::SESREG_VAR = ();
 $webtools::print_flush_buffer = '';
 $webtools::print_header_buffer = '';
 $webtools::new_session_were_started = 0; # Default we are in old session!
 $webtools::sess_header_flushed = 0;      # Header Is not still flushed!
 $webtools::cookie_path_cgi = '/';
 $webtools::secure_cookie_cgi = '0';
 %webtools::SIGNALS = ();
 $webtools::flag_onFlush_Event = 0;
 $webtools::syspre_process_counter = 0;
 $webtools::sys_cookie_accepted = 0;
 $webtools::sys_header_warnings = 0;
 $webtools::sys_ignore_term = 1;
 $webtools::sys__subs__ = {};
 
 tie(*SESSIONSTDOUT,'stdouthandle');
 select(SESSIONSTDOUT);

 ################################################################
 # Needed definitions
 ################################################################
 my $sys_local_sess_id = ''; # This is current session ID!!!
 @webtools::l_charset = ('085wOxVz1S','lZXa6M9RTk','FbHQvcjdmP','dQPpgALNqE','YDJ7CNG3yi',
               'mzk5l2F0xs','ThQPjd2OfR','G3YJK7IeWC','b4Zmol8SuM','jd9XvcHQa6',
               'sjyiDd21rB','RThpFALgNq');
 ################################################################
 my $sys_w_id = $ENV{HTTP_COOKIE} || $ENV{COOKIE};
  my @cookies = split(/;/s,$sys_w_id);
  my $l;
  foreach $l (@cookies)
   {
    if($l ne '') 
      {
       my ($n,$v) = split(/=/s,$l);
       $n =~ s/ //sg;
       if (!exists($webtools::sess_cookies{$n}))
         {
          $webtools::sess_cookies{$n} = $v;
          }
      }
   }

###########################################        
  $webtools::system_database_handle = undef;   # That is current opened DB Handler!
  $webtools::system_database_handle_flat   = undef;
  $webtools::system_database_handle_mysql  = undef;
  $webtools::system_database_handle_access = undef;
  $webtools::usystem_database_handle_flat   = undef;
  $webtools::usystem_database_handle_mysql  = undef;
  $webtools::usystem_database_handle_access = undef;
  
}

sub AUTOLOAD
{
 my $name = $webtools::AUTOLOAD;
 $name =~ s/.*://;   # Strip fully-qualified portion
 unless (exists $webtools::sys__subs__->{$name})
   {
    print "<font face='Verdana' size='2'><B>Error: Can't access function '$name' in ".__PACKAGE__." module!</B></font>";
    exit;
   }
my $ref = $webtools::sys__subs__->{$name};
&$ref(@_);
}

###########################################
# Functions start here
###########################################
sub PathMaker 
 {
  my $pth = (-e $_[0]) ? $_[0] : $_[1];
  if($pth ne '')
  {
    eval ("use lib \'$pth\';"); return($pth);
  }
 }
###########################################
# On start up makes some profit things :-)
###########################################
sub StartUpInit
{
 $Errors::Errors::sys_ERROR->install('onterm',\&On_Term_Event);
 my $add = PathMaker('./modules/additionals','./additionals');
 $webtools::loaded_functions = 0;
 $webtools::global_variables_dump = 0;
 $webtools::global_variables_dump_style = 'layer';
 if(!($webtools::loaded_functions & 128)){require "$library_path"."utl.pl";}
 require "$library_path"."cookie.pl";
 ###################################################################
 require $driver_path.'sess_flat.pl';  # Must be placed before any require on db drivers!
 #####################################################################
 #  ###   ###     ###   ####   #####  #   #  #####  ####             #
 #  #  #  #  #    #  #  #   #    #    #   #  #      #   #            #
 #  #  #  ####    #  #  ####     #    #   #  #####  ####             #
 #  #  #  #  #    #  #  #  #     #     # #   #      #  #             #
 #  ###   ###     ###   #  ##  #####    #    #####  #  ##            #
 #####################################################################
 if($db_support eq 'db_mysql') { require $driver_path.'db_mysql.pl'; $webtools::loaded_functions = $webtools::loaded_functions | 1;}
 if($db_support eq 'db_access') { require $driver_path.'db_access.pl'; $webtools::loaded_functions = $webtools::loaded_functions | 2;}
 if($db_support eq 'db_flat') { require $driver_path.'db_flat.pl'; $webtools::loaded_functions = $webtools::loaded_functions | 4;}
 # TODO: more lines and more db engines
}
##########################################
# When process.cgi exit...
##########################################
sub DestroyScript
{
 my $sys_destroy_db_code = 'if($webtools::db_support ne "") {DB_OnExit($webtools::system_database_handle);}';
 eval $sys_destroy_db_code;
 if($webtools::global_variables_dump and ($webtools::debugging =~ m/^on$/sig)) {printDump($webtools::global_variables_dump_style);}
 $Errors::Errors::sys_ERROR->exit('');
 1;
}
####################################################################
# High level functions...
####################################################################
sub session_start
{
 my ($dbh,$newv) = @_;
 session_clear_expired($dbh); # Clear all expired sessions!
 my $sid = Get_Old_SID($dbh); # Try to find old session ID!
 if ($newv)
  {
   local $sys_local_sess_id = $sid;
   session_destroy($dbh);     # Remove previous session if user resubmit login form!
   $sid = '';
  }
 $sys_local_sess_id = $sid;
 
 my $sid_time;
 if ($sid eq '')              # Old sessions present?
   {
    $new_session_were_started = 1;
    $sid_time = time();       # Get current time (in ticks)
    $sid_time -= 286521037;   # Try to hide what we doing :-)
    $sid_time = convert_ses_time($sid_time,9);
    rand_srand();             # Reset random generator
    $sid = $sid_time.r_str($charset,$rand_sid_length);  # Create SID string!
    $sys_local_sess_id = $sid;
    if (!insert_sessions_row ($dbh)) { return (0); }
   }
 else
   {   
     $new_session_were_started = 0;
     if(open_session_file($dbh))
       {
        $reg_buffer = load_session_data($dbh);
        if($reg_buffer eq undef) {$reg_buffer = '';}
        save_session_data($reg_buffer,$dbh);            # Here is a place where we automaticly transffer reged data!
        close_session_file($dbh);
       }
     else { return (0); }
     load_registred_vars($reg_buffer);
   }  
 $session_started = 1;
 my $sess = $sess_cookies{$l_sid};
 if($sess eq $sys_local_sess_id) {$sys_cookie_accepted = 1;}
 else {$sys_cookie_accepted = 0;}
 return($sid);          # Return new(old) SID!
}
sub session_register
{
  my ($buffer,$dbh) = @_;
  if (!$session_started)
     {
      if(!session_start($dbh))
        {
         return(0);
        }
     }
  if(open_session_file($dbh))
    {
      my $r = save_session_data($buffer,$dbh);
      close_session_file($dbh);
      if(!$r){ return(0); }
    }
  else { return(0); }
  return(1);
}
sub session_destroy
{
  my ($dbh) = @_;
  if($sys_local_sess_id eq '') {$sys_local_sess_id = Get_Old_SID($dbh);}
  if($sys_cookie_accepted) # If browser accepts cookies...
   {
    delete_cookie($l_sid);   # That send empty cookie to broser...and browser delete it!
   }
  if(open_session_file($dbh))
    {
      $session_started = 0;
      my $rez = delete_sessions_row($dbh);
      $sys_local_sess_id = '';
      return($rez);
    }
  else { $sys_local_sess_id = ''; return(0); }
}
sub session_id
{
  return($sys_local_sess_id);
}
sub session_set_id_name
{
  $l_sid = shift(@_);
}
sub session_ip_restrict
{
  my ($rmd) = shift(@_);
  if($sess_force_flat eq 'off') ###DB###
  {
  if($rmd or ($rmd =~ m/^on$/i)) { $ip_restrict_mode = 'on'; }
  else { $ip_restrict_mode = 'off'; }
  }
  else
  {
   ###FLAT###
   $ip_restrict_mode = 'off';
  }
}
sub set_script_timeout
{
  $cgi_script_timeout = shift(@_);
  SetCGIScript_Timeout();
}	
sub session_id_name
{
  return($l_sid);
}
sub new_session
{
 return($new_session_were_started);
}
sub session_id_adder   # Add SID ident to all links and forms in source!
{
 my ($source) = @_;
 my $sid = $sys_local_sess_id;
 my $src = href_sid_adder($source,$sid);
 return(action_sid_adder($src,$sid));
}
sub attach_var 
  {
    my ($name,$value) = @_;
    $attached_vars{$name} = $value;
    return (1);
  }
sub detach_var 
  {
    my ($name) = @_;

    if ( exists $attached_vars{$name} )
      {
      	delete $attached_vars{$name};
      }
    if ( exists $sess_cookies{$name} ) { delete_cookie($name); }
    return (1); 	
  }

sub session_expiration
{
  return($sesstimead);
}
sub session_cookie_path
{
  return($cookie_path_cgi);
}

sub register_var
{
  my ($type,$name,@val) = @_;
  my $sp;
  my $reg_buffer = '';
  if ($type eq 'scalar')
    {
     $sp = $uni_sep.'<scalar>:'.$name.':';
     ($val) = @val;
     $reg_buffer = $sp.encode_separator($val,$uni_esc,$uni_gr_sep,$uni_sep);
    }
  if ($type eq 'array')
    {
     $sp = $uni_sep.'<array>:'.$name.':';
     $reg_buffer = $sp;
     my $size = $#val+1;
     $reg_buffer .= "$size".":";
     foreach $scl (@val)
        { 
         $reg_buffer .= $uni_sep."<scalar_a>:".encode_separator($scl,$uni_esc,$uni_gr_sep,$uni_sep);
        }
    }
  if ($type eq 'hash')
    {
     my $h = $val[0];
     my %val = ();
     my $res = ref($h);
     if ($res eq 'HASH'){%val = %$h; @val = %val;}
     else { %val = @val;}
     $sp = $uni_sep.'<hash>:'.$name.':';
     $reg_buffer = $sp;
     my $size = int((scalar @val) / 2);
     $reg_buffer .= "$size".":";
     my $key;
     foreach $key (keys %val)
       { 
        $reg_buffer .= $uni_sep."<scalar_h>:".encode_separator($key,$uni_esc,$uni_gr_sep,$uni_sep).":".encode_separator($val{$key},$uni_esc,$uni_gr_sep,$uni_sep);
       }
    }    	
  return($reg_buffer);
}
sub unregister_var
{
 my ($name,$buffer) = @_;
 
 my $sp = $uni_sep_t;
 if($buffer =~ s/$sp\<scalar\>\:$name\:(.*?)$sp/$uni_sep/s)
   {
     return($buffer);    
   }
 elsif($buffer =~ s/$sp\<scalar\>\:$name\:(.*)//s)
       {
         return($buffer);
       }
 $sp = $uni_sep_t.'(<array>:|<hash>:)'.$name.':';
 my $ps = $uni_sep_t.'<scalar>:';
 my $ps1 = $uni_sep.'<scalar>:';
 my $pa = $uni_sep_t.'<array>:';
 my $pa1 = $uni_sep.'<array>:';
 my $ph = $uni_sep_t.'<hash>:';
 my $ph1 = $uni_sep.'<hash>:';
 if(!($buffer =~ s/$sp(\d{1,})\:(.*?)$ps/$ps1/s))
   {
    if(!($buffer =~ s/$sp(\d{1,})\:(.*?)$pa/$pa1/s))
      {
      	if(!($buffer =~ s/$sp(\d{1,})\:(.*?)$ph/$ph1/s))
          {
           $buffer =~ s/$sp(\d{1,})\:(.*)//s;
          }
      }
   }
 return($buffer);  
}
sub update_var  # Set new value for (not)exists variable (rigistrated)!
{
 my ($type,$name,$buffer,@val) = @_;
 $buffer = unregister_var($name,$buffer);
 $buffer .= register_var($type,$name,@val);
 return($buffer);
}
sub exists_var  # Check wether given var exists!
{
 my ($type,$name,$buffer) = @_;
 if($buffer =~ m/$uni_sep_t\<$type\>\:$name\:/s) {return (1);}
 return(0);
}
sub read_scalar   # Read one scalar from DB (registrated only)
{
  my ($name) = @_;
  return ($SESREG{$name});
}
sub read_array   # Read one array from DB (registrated only)
{
  my ($name) = @_;
  my  $ptr = $SESREG{$name};
  my  @a = @$ptr;
  return(@a);
}
sub read_hash   # Read one hash from DB (registrated only)
{
  my ($name) = @_;
  my  $ptr = $SESREG{$name};
  my  %h = %$ptr;
  return(%h);
}
sub read_form   # Read one scalar from form (browser)
{
  my ($name) = @_;
  if($parsedform) { return ($formdatah{$name}); }
}
sub read_form_array  # Read one scalar from form (browser) but via normal array.
{
  my ($numb) = @_;
  my $kv = $formdataa[$numb];
  my $null = "\0";
  my $kv = m/^(.*?)$null(.*)$/s;
  my @res = ($1,$2);
  return ($res);
}
sub read_var  # Read one scalar from broser (via cookie or just via link/form... - no matter :-)))
{
 my ($name) = @_;
 my $pg = $formdatah{$name};
 my $c = $sess_cookies{$name};
 if(!(exists($formdatah{$name}))) { $pg = '';}
 if(!(exists($sess_cookies{$name}))) {$c = '';}
 my $r;
 if($cpg_priority =~ m/^cookie$/si)
   {
     $r = $pg;
     if (exists($sess_cookies{$name})) { return($c); }
     return($r);
   }
  else
   {
     $r = $c;
     if (exists($formdatah{$name})) { return($pg); }
     return($r);
   }
}


sub encode_separator
  {
    my ($str, $escape, $row_sep, $col_sep) = @_;

    my $esc_hex = uc($escape.join('',unpack("Hh", $escape x 2)));
    my $row_hex = uc($escape.join('',unpack("Hh",$row_sep x 2)));
    my $col_hex = uc($escape.join('',unpack("Hh",$col_sep x 2)));
    
    $escape = quotemeta($escape);
    $row_sep = quotemeta($row_sep);
    $col_sep = quotemeta($col_sep);
    
    $str =~ s/$escape/$esc_hex/gsi;
    $str =~ s/$row_sep/$row_hex/gsi;  
    $str =~ s/$col_sep/$col_hex/gsi;
    return($str);
  }

sub decode_separator
  {
    my ($enstr, $escape, $row_sep, $col_sep) = @_;

    my $esc_hex = uc($escape.join('',unpack("Hh", $escape x 2)));
    my $row_hex = uc($escape.join('',unpack("Hh",$row_sep x 2)));
    my $col_hex = uc($escape.join('',unpack("Hh",$col_sep x 2)));
    
    $enstr =~ s/$esc_hex/$escape/gsi;
    $enstr =~ s/$row_hex/$row_sep/gsi;  
    $enstr =~ s/$col_hex/$col_sep/gsi;
    return($enstr);
  }

sub set_printing_mode
{
 my ($flag) = shift(@_);
 my $old = $webtools::var_printing_mode;
 if ($flag eq 'buffered')
   {
    $webtools::var_printing_mode = 'buffered';
   }
 else {
 	if($old eq 'buffered')
 	 {
 	  flush_print();
 	 }
 	$webtools::var_printing_mode = '';
       }
 return($old);
}

sub flush_print     # Flush all data (header and body), coz they are never had been printed!
{
 my ($clear) = @_;
 if($clear == 1) { $sess_header_flushed = 1; return;}
 my $oldslcthnd = CORE::select(STDOUT);           # Select real output handler
 $i = 0;
 if ($flag_onFlush_Event == 0)
 {
  $flag_onFlush_Event = 1;
  if(exists($webtools::SIGNALS{'OnFlush'}))
     {
       eval {
      	     my $OnEvent_code = $webtools::SIGNALS{'OnFlush'};
      	     &$OnEvent_code;
       	    };
       $flag_onFlush_Event = 0;
      }
 }
 if(!$sess_header_flushed)      # If Header was not flushed...
 {
  $| = 1;
  if(!$is and !($sys_stdouthandle_header and $sys_stdouthandle_content_ok))
   {
    $print_header_buffer = "X-Powered-By: WebTools/1.27\n".$print_header_buffer; # Print version of this tool.
   }
  if ((!$sys_cookie_accepted) and ($sys_local_sess_id ne ''))
   {
    if($sess_cookie ne 'sesstime')
      {
       if(new_session()){
         write_cookie($l_sid,$sys_local_sess_id,'',$cookie_path_cgi);
        }
      }
     else
      {
       if(new_session()){
        write_cookie($l_sid,$sys_local_sess_id,$sesstimead,$cookie_path_cgi);
       }
      }
    $print_flush_buffer = session_id_adder($print_flush_buffer);
   }
  if (scalar(%attached_vars)) # Add attached variables to get/post/cookie
       { 
         while ( my ($name,$value) = each( %attached_vars) )
           {      
            if(!(exists $sess_cookies{$name}) or ($sess_cookies{$name} ne $value))
              {
               write_cookie($name,$value);
               $print_flush_buffer = href_adder($print_flush_buffer,$name,$value);
               $print_flush_buffer = action_adder($print_flush_buffer,$name,$value);
              }
           }
       }
  if((!($print_header_buffer =~ m/Content\-type\:(.+)/is)) and (!($print_header_buffer =~ m/Status:( *?)204/is)))
   {
    if(!$is and !($sys_stdouthandle_header and $sys_stdouthandle_content_ok))
     {
      Header(type=>'content');  # Well we forgot to send content-type
     }
   }
  my $sys_print_res;
  my $sys_data;

  while($sys_data = substr($print_header_buffer,0,2048))
    {
      substr($print_header_buffer,0,2048,'');
      $sys_print_res = print ($sys_data);
      if($sys_print_res eq undef) {onExit();exit;}
    }
    
  $sys_print_res = print ("\n");
  if($sys_print_res eq undef) {onExit();exit;}
  
  $print_header_buffer = '';
  $sess_header_flushed = 1;
 }
 #print $print_flush_buffer;  # Just Print It!
 my $sys_data = '';
 while($sys_data = substr($print_flush_buffer,0,2048))
    {
      substr($print_flush_buffer,0,2048,'');
      my $sys_print_res = print ($sys_data);
      if($sys_print_res eq undef) {onExit();exit;}
    }
 $print_flush_buffer = '';
 if($webtools::sys_header_warnings > 0)
  {
   CORE::print('<BR><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'."\n<BR>");
   CORE::print("<B>Warnings Note: <font color='red'>WebTools is unable to use sessions/cookies till 'non-buffered' print mode is forced ");
   CORE::print("or any headers are sent after body!\n<BR></font></B></font><BR>");
  }
 select($oldslcthnd);
}
sub ClearBuffer
{
 $print_flush_buffer = '';
}
sub ClearHeader
{
 $print_header_buffer = '';
 $sess_header_flushed = 0;
 $sentcontent = 0;
}
sub GetCurrentSID
{
 return(Get_Old_SID(shift(@_)));
}
########################################################################
# Low level function...
########################################################################
sub Get_Old_SID
{
 my ($dbh) = @_;
 my $sid;
 my $ip = $ENV{'REMOTE_ADDR'}; # Get remote IP address
 if (read_var($l_sid) ne undef)
   {
    $sid = read_var($l_sid);
    if (!check_sid($sid))
      {
        $sid = '';
      }
    else
     {
      if($sess_force_flat eq 'off') ###DB###
      {
       my $r_q = '';
       if($ip_restrict_mode =~ m/^on$/i)
        {
         $r_q = " and IP = \'$ip\'";    # Restrict session on IP!
        }
       my $q = "select S_ID from $sql_sessions_table where S_ID = \'$sid\'".$r_q;
       my $res = sql_query($q,$dbh);
       if ($res ne undef)
        {
         ($my_sid) = sql_fetchrow($res);
         if($my_sid eq $sid) { return($sid); }
         return('');
        }
       else { delete_cookie($l_sid); return(''); }
      }
      else
      {
       ###FLAT###
       my $res = find_SF_File($tmp,$sid);
       if ($res ne '')
        {
         return($sid);
        }
       else { delete_cookie($l_sid); return(''); }
      }
     }  
   }
 else { $sid = ''; }
 return($sid);
}
sub r_char
{
 my ($s) = @_;
 $l = length($s);
 $p = rand($l-1);
 return(substr($s,$p,1));
}
sub r_str
{
 my ($cs,$l) = @_;
 my $rs = "";
 for($i=0;$i<$l;$i++)
  {
   $rs .= r_char($cs);
  }
 return($rs);  
}
sub rand_srand()
{
 srand();
}
sub check_sid
{
 my ($sid) = @_;
 if($sid =~ m/^[0-9A-Za-z]*$/i)
  {
   return(1);
  }
 else { return(0);}
}
sub Header
{
  my %arg = @_;
  my $type = $arg{'type'};
  my $val = $arg{'val'};
  local $oldstd;
  
  my $is = $webtools::var_printing_mode eq 'buffered' ? 1 : 0;
  if(!$is)
   {
     if($stdouthandle::sys_stdouthandle_header or $stdouthandle::sys_stdouthandle_print_text)
      {
       local $oldHand = select(STDOUT);
       CORE::print('<BR><font face="Verdana, Arial, Helvetica, sans-serif" size="2">'."<B>Warning:</B>\n<BR>");
       CORE::print("You are in non-buffered print mode and header is already sent!\n</font><BR>");
       CORE::print("<B>Hint: <font color='red'>Send header before body (or force 'buffered' print mode)!</font></B><BR>");
       CORE::print("<B>Raw data:</B>");
       select($oldHand);
       $webtools::sys_header_warnings ++;
      }
     if(!$stdouthandle::sys_stdouthandle_header and !$stdouthandle::sys_stdouthandle_print_text)
      {
      	if(($type =~ m/Content/si) or ($type =~ m/Location/si) or ($type =~ m/Status/si) or
      	   ($val =~ m/Content\-type\:/si) or ($val =~ m/Location\:/si) or ($val =~ m/Status\:/si))
          {
           $stdouthandle::sys_stdouthandle_content_ok = 1;
          }
        else {$stdouthandle::sys_stdouthandle_content_ok = 0;}
       }
   }
  if(!$is) {$oldstd = select(STDOUT);}
  if (exists($arg{'type'}))
    {
      if ($type =~ m/content/is)
        {
         if(!$sentcontent)
          {
           $sentcontent = 1;
           if($is) {$print_header_buffer .= "Content-type: ";}
           else { CORE::print "Content-type: ";}
           if (exists($arg{'val'}))
             {
             if($is) {$print_header_buffer .= $val."\n";}
             else { CORE::print $val."\n";}
             }
           else
             {
              if($is) {$print_header_buffer .= "text/html\n";}
              else { CORE::print "text/html\n";}
             }
          }
        }
      if ($type =~ m/cookie/is)
        {
         $print_header_buffer .= "Set-Cookie: ";
         if (exists($arg{'val'}))
           {
	     if (!($val =~ m/(;| )path ?=.*$/is))
              {
              	if($is) {$print_header_buffer .= $val."; path=$cookie_path_cgi\n";}
                else { CORE::print $val."; path=$cookie_path_cgi\n";}
              }
             else
              {
               if($is) {$print_header_buffer .= $val."\n"; }
               else { CORE::print $val."\n"; }
              }
           }
         else 
           {
            if($is) {$print_header_buffer .= "\n";}
            else { CORE::print "\n"; }
           }
        }
      if ($type =~ m/raw/is)
        {
         if (exists($arg{'val'}))
           {
            if($is) {$print_header_buffer .= $val;}
            else { CORE::print $val; }
           }
        }
      if ($type =~ m/modified/is)
        {
         $print_header_buffer .= "Last-modified: ";
         if (exists($arg{'val'}))
           {
             my $expi = expires($val);
             if($is) {$print_header_buffer .= $expi."\n";}
             else { CORE::print $expi."\n";}
           }
         else {
               my $expi = expires('-1m');
               if($is) {$print_header_buffer .= $expi."\n";}
               else { CORE::print $expi."\n";}
              }
        }
      if ($type =~ m/MIME/is)
        {
         if($is) {$print_header_buffer .= "MIME-version: ";}
         else { CORE::print "MIME-version: ";}
         if (exists($arg{'val'}))
           {
             if($is) {$print_header_buffer .= $val."\n";}
             else { CORE::print $val."\n";}
           }
         else 
           {
            if($is) {$print_header_buffer .= "1.0\n";}
            else { CORE::print "1.0\n";}
           }
        }
      if ($type =~ m/window/is)
        {
         if($is) {$print_header_buffer .= "Window-target: ";}
         else { CORE::print "Window-target: ";}
         if (exists($arg{'val'}))
           {
             if($is) {$print_header_buffer .= $val."\n";}
             else { CORE::print $val."\n";}
           }
         else {
                if($is) {$print_header_buffer .= "\n";}
                else { CORE::print "\n";}
              }
        }
      if ($type =~ m/Pragma/is)
        {
         if($is) {$print_header_buffer .= "Pragma: ";}
         else { CORE::print "Pragma: ";}
         if (exists($arg{'val'}))
           {
             if($is) {$print_header_buffer .= $val."\n";}
             else { CORE::print $val."\n";}
           }
         else { 
         	if($is) {$print_header_buffer .= "no-cache\n";}
         	else { CORE::print "no-cache\n";}
              }
        }
      if ($type =~ m/Expires/is)
        {
         if($is) {$print_header_buffer .= "Expires: ";}
         else { CORE::print "Expires: ";}
         if (exists($arg{'val'}))
           {
             my $expi = expires($val);
             if($is) {$print_header_buffer .= $expi."\n";}
             else { CORE::print $expi."\n";}
           }
         else {
         	my $expi = expires('-1m');
                if($is) {$print_header_buffer .= $expi."\n";}
                else { CORE::print $expi."\n";}
              }
        }
      if ($type =~ m/Referrer/is)
        {
         if($is) {$print_header_buffer .= "Referrer: ";}
         else { CORE::print "Referrer: ";}
         if (exists($arg{'val'}))
           {
             if($is) {$print_header_buffer .= $val."\n";}
             else { CORE::print $val."\n";}
           }
         else {
         	if($is) {$print_header_buffer .= "\n";}
         	else { CORE::print "\n";}
               }
        }
    }
  if(!$is) {select($oldstd);}
  return(1);
}
sub href_sid_adder
{
 my ($source,$sid) = @_;
 my ($name,$value) = ($l_sid,$sid);
 my $url;
 my $src = $source;
 my $match = $source;
    $source = '';
 my $after,$before,this;
 if($session_started)
 {
  if(!($src =~ s! *href *?= *?(\'|\")?(.*?)(\'|\"|\>\ )?!do{
        $match =~ m/( *href *?= *?)(\'|\"|)(.*?)(\'|\"|\ |\>)/is;
        $url = $3;   #Matched string
        $before = $`;
        $after = $';
        $this = $&;
        if($url =~ m/.*?\.(cgi|pl).*/is)
          {
            if ($url =~ s/(.*?\?.*)/$1\&$name\=$value/is)
                {
                }
            else
                {
                  $url =~ s/(.*)/$1\?$name\=$value/is;
                }
          }
            $this =~ s/( *?href *?= *?)(\'|\"|)(.*?)(\'|\"| |>)/$1$2$url$4/is;
        
            $source .= $before.$this;
            $match = $after;
      };!isge)) { return($src); } 
   $source .= $after;
 }
 else { return($src); } 
   return($source); 
} 
sub href_adder
{
 my ($source,$name,$value) = @_;
 my $url;
 my $src = $source;
 my $match = $source;
    $source = '';
 my $after,$before,this;
 
  if(!($src =~ s! *href *?= *?(\'|\")?(.*?)(\'|\"|\>\ )?!do{
        $match =~ m/( *href *?= *?)(\'|\"|)(.*?)(\'|\"|\ |\>)/is;
        $url = $3;   #Matched string
        $before = $`;
        $after = $';
        $this = $&;
        if($url =~ m/.*?\.(cgi|pl).*/is)
          {
            if ($url =~ s/(.*?\?.*)/$1\&$name\=$value/is){}
            else
                {
                  $url =~ s/(.*)/$1\?$name\=$value/is;
                }
          }
            $this =~ s/( *?href *?= *?)(\'|\"|)(.*?)(\'|\"| |>)/$1$2$url$4/is;
        
            $source .= $before.$this;
            $match = $after;
      };!isge)) { return($src); } 
   $source .= $after;
 
 
   return($source); 
}
sub action_sid_adder
{
 my ($source,$sid) = @_;
 my ($name,$value) = ($l_sid,$sid);
 my $url;
 my $src = $source;
 my $match = $source;
    $source = '';
 my $after,$before,this,$cntr;
 $cntr = 0;
 if($session_started)
 {
    $src =~ s!\ +action *?= *?(\'|\")?(.*?)(\'|\")?!do{
        $match =~ m/\ +(action *?= *?)(\'|\"|)(.*?)(\'|\"|\ |\>)/is;
        $url = $3;   #Matched string
        $before = $`;
        $after = $';
        $this = $&;
        $cntr++;
        if ($url =~ s/(.*?\?.*)/$1\&$name\=$value/is){}
        else
            {
              $url =~ s/(.*)/$1\?$name\=$value/is;
            }
        
        $this =~ s/(\ +action *?= *?)(\'|\"|)(.*?)(\'|\"|\ |\>)/$1$2$url$4/is;
        
        $source .= $before.$this;
        $match = $after;
      };!isge;
   $source .= $after;
   if($cntr == 0) { return ($src); }
 }
 else { return($src); }   
   return($source);
}
sub action_adder
{
 my ($source,$name,$value) = @_;
 my $url;
 my $src = $source;
 my $match = $source;
    $source = '';
 my $after,$before,this;
 my $cntr = 0;
 
    $src =~ s!\ +action *?= *?(\'|\")?(.*?)(\'|\")?!do{
        $match =~ m/\ +(action *?= *?)(\'|\"|)(.*?)(\'|\"|\ |\>)/is;
        $url = $3;   #Matched string
        $before = $`;
        $after = $';
        $this = $&;
        $cntr++;
        if ($url =~ s/(.*?\?.*)/$1\&$name\=$value/is)
            {
            }
        else
            {
              $url =~ s/(.*)/$1\?$name\=$value/is;
            }
        
        $this =~ s/(\ +action *?= *?)(\'|\"|)(.*?)(\'|\"|\ |\>)/$1$2$url$4/is;
        
        $source .= $before.$this;
        $match = $after;
      };!isge;
   $source .= $after;
   if($cntr == 0) { return ($src); }
    
   return($source);
}
sub delete_sessions_row
{
  my ($dbh) = @_;
  my $sid = $sys_local_sess_id;
  my $ip = $ENV{'REMOTE_ADDR'}; # Get remote IP address
  my $r_q = '';
  if($sess_force_flat eq 'off') ###DB###
  {
   if($ip_restrict_mode =~ m/^on$/i)
    {
     $r_q = " and IP = \'$ip\'";    # Restrict session on IP!
    }
   my $res = sql_query("delete from $sql_sessions_table where S_ID = \'$sid\'".$r_q,$dbh);
   if ($res ne undef)
     {
      return(1);
     }
  }
 else
  {
   ###FLAT###
   return(destroy_SF_File($tmp,$sid));
  }
 return(0);
}
sub open_session_file
{
  my ($dbh) = @_;
  my $sid = $sys_local_sess_id;
  my $ip = $ENV{'REMOTE_ADDR'}; # Get remote IP address
  my $r_q = '';
  if($ip_restrict_mode =~ m/^on$/i)
   {
    $r_q = " and IP = \'$ip\'";    # Restrict session on IP!
   }
  my $q = "update $sql_sessions_table set FLAG = \'1\' where S_ID = \'$sid\' and FLAG = \'0\'".$r_q;
  my $c = $wait_for_open / $wait_attempt; 
  my $i;
  for ($i=0;$i<$wait_attempt;$i++)
    {
     my $re;
     if($sess_force_flat eq 'off') ###DB###
      {
       $re = sql_query($q,$dbh);
       if($re ne undef) {return(1);}
      }
     else
      {
       ###FLAT###
       $re = osetflag_SF_File($tmp,$sid);
       if($re == -1) {$re = undef;}
       else {return(1);} # File can be opened!
      }
     select(undef,undef,undef,$c);
    }
  onLockedFileErrorEvent();
  return(0);   # Sorry, at this moment file can`t be opened!
}
sub close_session_file 
{
  my ($dbh) = @_;
  my $sid = $sys_local_sess_id;
  my $ip = $ENV{'REMOTE_ADDR'}; # Get remote IP address
  my $r_q = '';
  if($ip_restrict_mode =~ m/^on$/i)
   {
    $r_q = " and IP = \'$ip\'";    # Restrict session on IP!
   }
  my $q = "update $sql_sessions_table set FLAG = \'0\' where S_ID = \'$sid\'".$r_q;

  if($sess_force_flat eq 'off') ###DBD###
   {
    if (sql_query($q,$dbh) ne undef) { return(1); }
    return(0);
   }
  else
  {
   ###FLAT###
   $re = csetflag_SF_File($tmp,$sid);
   return(1);
  }
}

sub load_registred_vars
{
  my ($buffer) = @_;
  my $c = 0,$i = 0;
  my $a_name,$s_name,$h_name,$val;
  my @a_data = ();
  my @h_data = ();
  my @pars = split(/$uni_sep_t/s,$buffer);
  foreach $line (@pars)
   { 
    if ($c == 0)
     {
      if ($line =~ m/\<array\>\:(.*?)\:(\d{1,})\:(.*)/s)
        {
         $c = $2;
         $a_name = $1;
         $val = '';
         @a_data = ();
        }
      if ($line =~ m/\<hash\>\:(.*?)\:(\d{1,})\:(.*)/s)
        {
         $c = $2;
         $h_name = $1;
         $val = '';
         @h_data = ();
        }
      if ($line =~ m/\<scalar\>\:(.*?)\:(.*)/s)
        {
         $s_name = $1;
         $val = $2;
         make_scalar_from($s_name,decode_separator($val,$uni_esc,$uni_gr_sep,$uni_sep));
        }
     }
    else
     {
       if ($line =~ m/\<scalar_a\>\:(.*)/s)
         {
          my $scl = decode_separator($1,$uni_esc,$uni_gr_sep,$uni_sep);
          push (@a_data,$scl);
          $c --;
          if (!$c) { make_array_from($a_name,@a_data); }
         }
       if ($line =~ m/\<scalar_h\>\:(.*?)\:(.*)/s)
         {
          my $n = $1;
          my $v = $2;
          my $n = decode_separator($n,$uni_esc,$uni_gr_sep,$uni_sep);
          my $v = decode_separator($v,$uni_esc,$uni_gr_sep,$uni_sep);
          push (@h_data,$n);push (@h_data,$v);
          $c --;
          if (!$c) { make_hash_from($h_name,@h_data); }
         }
     } 
   }
}
sub make_scalar_from
{
 my ($s_name,$val) = @_;
 $SESREG{$s_name} = $val;
 $SESREG_TYPES{$s_name} = 's';
}
sub make_array_from
{
 my ($a_name,@a_data) = @_;
 $SESREG{$a_name} = \@a_data;
 $SESREG_TYPES{$a_name} = 'a';
}
sub make_hash_from
{
 my ($h_name,%h_data) = @_;
 $SESREG{$h_name} = \%h_data;
 $SESREG_TYPES{$h_name} = 'h';
}
sub save_session_data   # ($session_ID,$buffer,$database_handler) // Save into DB DATA field
{
 my ($buffer,$dbh) = @_;
 my $sid = $sys_local_sess_id;
 my $ip = $ENV{'REMOTE_ADDR'}; # Get remote IP address
 my $r_q = '';
 if($sess_force_flat eq 'off') ###DB###
 {
  if($ip_restrict_mode =~ m/^on$/i)
    {
     $r_q = " and IP = \'$ip\'";    # Restrict session on IP!
    }
  my $buf = sql_quote($buffer,$dbh);
   
  my $q = "update $sql_sessions_table set DATA = $buf where S_ID = \'$sid\'".$r_q;
  if (sql_query($q,$dbh) ne undef) { return(1); }
 }
 else
 {
  ###FLAT###
  write_SF_File($tmp,$sid,$buffer);
  return(1);
 }
 return(0);
}
sub load_session_data   # ($session_ID,$database_handler) // Load DATA from table
{
 my ($dbh) = @_;
 my $sid = $sys_local_sess_id;
 my $ip = $ENV{'REMOTE_ADDR'}; # Get remote IP address
 my $r_q = '';
 my @arr = ();
 if($sess_force_flat eq 'off') ###DB###
 {
  if($ip_restrict_mode =~ m/^on$/i)
    {
     $r_q = " and IP = \'$ip\'";    # Restrict session on IP!
    }
  my $q = "select DATA from $sql_sessions_table where S_ID = \'$sid\'".$r_q;
  my $res = sql_query($q,$dbh);
  if ($res eq undef) { return(undef); }
  @arr = sql_fetchrow($res);
 }
 else
 {
  ###FLAT###
  return(read_SF_File($tmp,$sid));
 }
 return($arr[0]);     # Return DATA field
}
sub read_redirected_script_file
{
 my $p_file_name_N00 = '';
 my $sys_pre_load_redirected_file = '';
 
 if(exists($ENV{'PATH_TRANSLATED'}))
   {
    my $rurl = $ENV{'PATH_TRANSLATED'};
    if(($rurl ne '') && (-e $rurl))
     {
      local * REDIRECTEDFILE;
      if(open(REDIRECTEDFILE, $rurl))
       {
       	if(binmode (REDIRECTEDFILE))
       	 {
       	  my $cnt = read(REDIRECTEDFILE,$sys_pre_load_redirected_file,-s REDIRECTEDFILE);
       	  if($cnt)
       	   {
       	    close (REDIRECTEDFILE);
       	    $sys_pre_load_redirected_file =~ s/\r\n/\n/sg;
       	    if(!($sys_pre_load_redirected_file =~ m/\n$/s)) {$sys_pre_load_redirected_file .= "\n";}
       	    ###################################
       	    # Parse Reditected File
       	    ###################################
       	    my $sys_value = '';
       	    my $sys_key   = '';
       	    
       	    if($sys_pre_load_redirected_file =~ m/\$REDIRECT\_OPTIONS\ {0,}\{(\'|\")?file(\'|\")?\}\ {0,}\=\ {0,}(\'|\")?([^\'\"\;\n]{1,})(\'|\")?\;{0,}\n/si)
       	     {
       	      $sys_value = $4;
       	      if($sys_value ne '') {$p_file_name_N001 = $sys_value;}
       	     }
     	    else
       	     {
       	      my $rurlZ = $rurl;
       	      $rurlZ =~ s/\\/\//sg;
       	      if($rurlZ =~ m/(.*)\/(.*)$/s)
       	        {
       	         $p_file_name_N001 = $2;
       	        }
       	     }
       	    if($sys_pre_load_redirected_file =~ m/\$REDIRECT\_OPTIONS\ {0,}\{(\'|\")?home(\'|\")?\}\ {0,}\=\ {0,}(\'|\")?([^\'\"\;\n]{1,})(\'|\")?\;{0,}\n/si)
       	     {
       	      $sys_value = $4;
       	      if($sys_value ne '') { chdir $sys_value; }
       	     }
       	   }
       	  else {close (REDIRECTEDFILE);}
       	 }
       	else {close (REDIRECTEDFILE);}
       }
     }
   }
 return($p_file_name_N001);
}
sub RunScript
{
 my $sys_loaded_src = 0;
 my $p_file_name_N001 = read_form('file');
 if($p_file_name_N001 eq '') { $p_file_name_N001 = read_redirected_script_file(); }
 $p_file_name_N001 =~ m/^(.*?)\./si;
 my $sys_RS_p_file_name = $1;
 if($globexport::sys_script_cached_source eq '')
 {
 if(($perl_html_dir eq '') or ($perl_html_dir =~ m/^(\\|\/)$/si))
   {
    print "<BR><h3><B><font color='red'>Security hole!!!</font> Your default script direcotry (htmls) is leaved empty or<BR>";
    print " it is pointed to your ROOT directory! <BR>";
    print "Script abort immediately!</h3></B>";
    die ':QUIT:';
   }
 $p_file_name_N001 = read_form('file');
 if($p_file_name_N001 eq '') { $p_file_name_N001 = read_redirected_script_file(); }
 $p_file_checked_done_N001 = 0;
 if ($p_file_name_N001 =~ m/^[A-Za-z0-9-_.\/]*$/is)
   {
    if (!($p_file_name_N001 =~ m/\.\./i) and (!($p_file_name_N001 =~ m/\.\//i))) {
       if (($p_file_name_N001 =~ m/\.html$/i) or ($p_file_name_N001 =~ m/\.htm$/i) or ($p_file_name_N001 =~ m/\.cgi$/i) or
           ($p_file_name_N001 =~ m/\.whtml$/i) or ($p_file_name_N001 =~ m/\.cgihtml$/i))
         {
          $p_file_name_N001 =~ m/^(.*)\.(.*)$/i;
          my $body = $1;
          my $ext = $2;
          my $exname;
          if($treat_htmls_ext[0] ne '')
           {
            if(!(-e $perl_html_dir.$p_file_name_N001))
             {
              foreach $exname (@treat_htmls_ext)
               {
                if(-e $perl_html_dir.$body.'.'.$exname)
                 {
                  $p_file_name_N001 = $body.'.'.$exname;
                  last;
                 }
                else
                 {
               	  if($exname =~ m/^$ext$/i) {last;}
                 }
              }
             }
           }
          $p_file_checked_done_N001 = 1;
         }      
       }
   }
 if ($p_file_checked_done_N001)   
  {
    if(!open(FILE_H_OPEN_N001,$perl_html_dir.$p_file_name_N001))
      {
       Header(type => 'content');
       $print_flush_buffer = '';
       flush_print();
       print "<br><font color='red'><h2>Error: Incorrect request($perl_html_dir$p_file_name_N001)!</h2></font>";
       onExit('withOutDB');
       exit;
      }
    binmode(FILE_H_OPEN_N001);
    read(FILE_H_OPEN_N001,$p_file_buf_N001,(-s FILE_H_OPEN_N001));
    close (FILE_H_OPEN_N001);
    $sys_loaded_src = 1;
    $globexport::sys_script_cached_source = $p_file_buf_N001;
   }
  }
 else
  {
   $sys_loaded_src = 1;
   $p_file_buf_N001 = $globexport::sys_script_cached_source;
  }
 if($sys_loaded_src)
  {
   @globexport::sys_pre_defined_vars = ();
   $globexport::sys_script_cached_source =~ s/\n[\ \t]{1,}(\<\!\-\-\#onActivate\>)(.*?)(\<\/\#onActivate\-\-\>)/\n$1$2$3/sig;
   $globexport::sys_script_cached_source =~ s/(\<\!\-\-\#onActivate\>)(.*?)(\<\/\#onActivate\-\-\>)[\ \t]{1,}/$1$2$3/sig;
   $globexport::sys_script_cached_source =~ s/(\r\n|\n)(\<\!\-\-\#onActivate\>)(.*?)(\<\/\#onActivate\-\-\>)/$2$3$4/sig;
   $globexport::sys_script_cached_source =~ s/(\<\!\-\-\#onActivate\>)(.*?)(\<\/\#onActivate\-\-\>)(\r\n|\n)/$1$2$3/sig;
   my $sys_bkp = $globexport::sys_script_cached_source;
   $sys_bkp =~ s/(\<\!\-\-\#onActivate\>)(.*?)(\<\/\#onActivate\-\-\>)/do{
          push(@sys_pre_defined_vars,$2);
        };/sgioe;
   # Clear tags
   $globexport::sys_script_cached_source =~ s/(\<\!\-\-\#onActivate\>)(.*?)(\<\/\#onActivate\-\-\>)//sig;
   $p_file_buf_N001 = $globexport::sys_script_cached_source;
   my $sys_str;
   # WARNNING: Follow iterative loop change configuration variables (in this script)!
   foreach $sys_str (@globexport::sys_pre_defined_vars)
    {
      # Parse confing constants
      $sys_str =~ s/\#(.*?)(\r\n|\n)/$2/sgi;
      eval $sys_str;
      my $codeerr = $@;
      if($@ ne '')
       {
        Header(type => 'content');
        $print_flush_buffer = '';
        flush_print();
        print "<br><font color='red'><h3>Perl Subsystem: Syntax error in Activate section of <font color='blue'>$p_file_name_N001</font> !</h3>";
        $codeerr =~ s/\r\n/\n/sg;
        $codeerr =~ s/\n/<BR>/sgi;
        my $res = $webtools::debugging eq 'on' ? "<br>$codeerr</font>" : "";
        print $res;
        onExit('withOutDB');
        exit;
       }
    }
   StartUpInit();
   $p_file_buf_N001 =~ s/\<\!\-\- PERL:(.*?)(\<\?perl.*?\?\>.*?)\/\/\-\-\>(\r\n|\n)?/$2/gsio;
   $p_file_buf_N001 =~ s/\<\!\-\- PERL:(.*?)\/\/\-\-\>(\r\n|\n)?//gsio;
   $p_file_buf_N001 = pre_process_templates($p_file_buf_N001);  # Process all build-in templates
   
   # Remove all the COMMENTS!!! That will reduce perl computing and printing!                
   ExecuteHTMLfile($p_file_name_N001,$p_file_buf_N001);
   onExit();
   if(exists($webtools::SIGNALS{'OnExit'}))
     {
      eval {
      	    my $OnExit_code = $webtools::SIGNALS{'OnExit'};
      	    &$OnExit_code;
      	   };
     }
  }
 else
  {
   Header(type => 'content');
   $print_flush_buffer = '';
   flush_print();
   print "<br><font color='red'><h2>Error: Invalid file request!</h2></font>";
   onExit('withOutDB');
   exit;
  }
}
sub ExecuteHTMLfile
{
 my ($f_name,$sys_p_buf_N001) = @_;
 my @h_N001 = ();
 my @html_N001 = split(/\<\?perl/is,$sys_p_buf_N001);
 my $sys_a_N001;
 my $error_locator_N001 = 1;
 my $sys_all_code_in_one = "\n";
 foreach $sys_l_N001 (@html_N001)
  {
   $sys_l_N001 =~ s/(.*)\?\>(\r\n|\n)?//is;
   push(@h_N001,$sys_l_N001);
  }
 my @code_N001 = ();
 $sys_p_buf_N001 =~ s/\<\?perl *(.*?)\?\>/do{
    $sys_a_N001 = $1;
    if ($sys_a_N001 ne '') { push(@code_N001,$sys_a_N001); }
  };/isge;
 my $i_N001 = 0;
 foreach $sys_l_N001 (@h_N001)
  {
    chomp($sys_l_N001);
    if($sys_l_N001 ne '')
      {
       $sys_l_N001 =~ s/\|/\\\|/sgo;
       my $sys_cpy_l_N001 = $sys_l_N001;
       $sys_cpy_l_N001 =~ s!\\\\\|!do{
                      $sys_l_N001 =~ s%\\\\\|%\\\\\\\\\\\|%so;
                  };!sgeo;
       $sys_all_code_in_one .= 'if ($var_printing_mode eq "buffered"){$print_flush_buffer .= q|'.$sys_l_N001.'|;} else {print q|'.$sys_l_N001.'|;}'."\n";
      }
    my $cd_N001 = $code_N001[$i_N001]; $i_N001++;
    $sys_all_code_in_one .= $cd_N001;
  }
 $sys_all_code_in_one .= "\n".'$error_locator_N001 = 0;';
 SetCGIScript_Timeout();
 eval $sys_all_code_in_one;
 my $cd = $@;
 my $codeerr = $cd;
 if($error_locator_N001)
   {
    onExit();
    if($cd =~ m/\:QUIT\:(.*)/i) 
      {
       if(exists($webtools::SIGNALS{'OnError'}))
         {
          eval {
      	        my $OnEvent_code = $webtools::SIGNALS{'OnError'};
      	        &$OnEvent_code($1);
      	       };
         }
       return;
      }
    if($cd =~ m/\:EXIT\:(.*)/i) 
      {
       return;
      }
    Header(type => 'content');
    $print_flush_buffer = '';
    flush_print();
    print "<br><font color='red'><h3>Perl Subsystem: Syntax error in code(<font color='blue'>$f_name</font>)!</h3>";
    $codeerr =~ s/\r\n/\n/sg;
    $codeerr =~ s/\n/<BR>/sgi;
    my $res = $debugging eq 'on' ? "<br>$codeerr</font>" : "";
    print $res;
    exit;
   }
}
sub b_print # Only for backware compatibility!
{
  my ($p) = @_;
  $print_flush_buffer .= $p;
}

###########################################
# Cookies
###########################################
sub read_cookie   # Read one scalar from cookie
{
 my ($name) = @_;
 return($sess_cookies{$name});
}
sub write_cookie
{
 my ($name,$value,$expires,$path,$domain) = @_;
 SetCookieExpDate($expires) if($expires ne '');
 SetCookiePath($path) if($path ne '');
 SetCookieDomain($domain) if($domain ne '');
 my $cuky = SetCookies($name,$value);
 Header(type=>'raw',val=>$cuky);
 return(1);
}
sub delete_cookie
{
 my ($name) = @_;
 my $expires = '-1d';
 SetCookieExpDate($expires);
 my $cuky = SetCookies($name,'');
 Header(type=>'raw',val=>$cuky); # Expires data is -1 minute!
 return(1);
}

########################################################
sub Default_CGI_Script_ALARM_SUB
 {
  my $obj    = shift;
  my $what   = shift;
  if(exists($webtools::SIGNALS{'OnTimeOut'}))
     {
      eval {
      	    my $OnEvent_code = $webtools::SIGNALS{'OnTimeOut'};
      	    &$OnEvent_code;
      	   };
     }
  else
   {
    ClearHeader();
    ClearBuffer(); 
    Header(type=>'content');
    print "<center><B>Error: Script timeout (liftime of script run out)!</B></center>\n";
   }
  CORE::exit;
 }
sub SetCGIScript_Timeout
{
 if((defined($cgi_script_timeout)) and ($cgi_script_timeout != 0) and ($cgi_script_timeout > 1))
  {
   $Errors::Errors::sys_ERROR->install('onTimeout',\&Default_CGI_Script_ALARM_SUB);
my $script_time_eval = << "TIME_EVAL_TERMINATOR";
   alarm($cgi_script_timeout);
TIME_EVAL_TERMINATOR
   eval $script_time_eval;
  }
}

sub save_database_handlers
{
 my $current = $webtools::db_support;
 if($current =~ m/^db_mysql$/si)
    {
     $webtools::system_database_handle_mysql  = $webtools::system_database_handle;
    }
  if($current =~ m/^db_flat$/si)
    {
     $webtools::system_database_handle_flat  = $webtools::system_database_handle;
    }
  if($current =~ m/^db_access$/si)
    {
     $webtools::system_database_handle_access  = $webtools::system_database_handle;
    }
   $webtools::system_database_handle = undef;
}
##########################################################################
# Load (reload) database driver
# PROTO: load_database_driver($driver);
# where: $driver can be: 'mysql','flat','access', 'sess_flat' and 'none'
##########################################################################
sub load_database_driver
{
 my $new_driver = shift;
 
 my $current = $webtools::db_support;
 
 if($new_driver =~ m/^flat$/si)
  {
   &save_database_handlers();
   if($webtools::system_database_handle_flat ne undef)
    {
     $webtools::system_database_handle = $webtools::system_database_handle_flat;
    }
   if(!($webtools::loaded_functions & 4))
    {
     require $driver_path.'db_flat.pl';
     $webtools::loaded_functions = $webtools::loaded_functions | 4;
    }
   else
    {
     $webtools::sys__subs__->{'DB_OnExit'} = \&flat_DB_OnExit;
     $webtools::sys__subs__->{'hideerror'} = \&flat_hideerror;
     $webtools::sys__subs__->{'sql_connect'} = \&flat_sql_connect;
     $webtools::sys__subs__->{'sql_connect2'} = \&flat_sql_connect2;
     $webtools::sys__subs__->{'test_connect'} = \&flat_test_connect;
     $webtools::sys__subs__->{'sql_disconnect'} = \&flat_sql_disconnect;
     $webtools::sys__subs__->{'sql_query'} = \&flat_sql_query;
     $webtools::sys__subs__->{'sql_fetchrow'} = \&flat_sql_fetchrow;
     $webtools::sys__subs__->{'sql_affected_rows'} = \&flat_sql_affected_rows;
     $webtools::sys__subs__->{'sql_inserted_id'} = \&flat_sql_inserted_id;
     $webtools::sys__subs__->{'sql_create_db'} = \&flat_sql_create_db;
     $webtools::sys__subs__->{'sql_drop_db'} = \&flat_sql_drop_db;
     $webtools::sys__subs__->{'sql_select_db'} = \&flat_sql_select_db;
     $webtools::sys__subs__->{'sql_num_fields'} = \&flat_sql_num_fields;
     $webtools::sys__subs__->{'sql_num_rows'} = \&flat_sql_num_rows;
     $webtools::sys__subs__->{'sql_data_seek'} = \&flat_sql_data_seek;
     $webtools::sys__subs__->{'sql_errmsg'} = \&flat_sql_errmsg;
     $webtools::sys__subs__->{'sql_errno'} = \&flat_sql_errno;
     $webtools::sys__subs__->{'sql_quote'} = \&flat_sql_quote;
     $webtools::sys__subs__->{'unsupported_types'} = \&flat_sql_unsupported_types;
     $webtools::sys__subs__->{'session_clear_expired'} = \&flat_session_clear_expired;
     $webtools::sys__subs__->{'session_expire_update'} = \&flat_session_expire_update;
     $webtools::sys__subs__->{'insert_sessions_row'} = \&flat_insert_sessions_row;
     $webtools::sys__subs__->{'DB_OnDestroy'} = \&flat_DB_OnDestroy;
     $webtools::sys__subs__->{'SignUpUser'} = \&flat_SignUpUser;
     $webtools::sys__subs__->{'SignInUser'} = \&flat_SignInUser;
    }
  }
 if($new_driver =~ m/^mysql$/si)
  {
   &save_database_handlers();
   if($webtools::system_database_handle_mysql ne undef)
    {
     $webtools::system_database_handle = $webtools::system_database_handle_mysql;
    }
   if(!($webtools::loaded_functions & 1))
    {
     require $driver_path.'db_mysql.pl';
     $webtools::loaded_functions = $webtools::loaded_functions | 1;
    }
   else
    {
     $webtools::sys__subs__->{'DB_OnExit'} = \&mysql_DB_OnExit;
     $webtools::sys__subs__->{'hideerror'} = \&mysql_hideerror;
     $webtools::sys__subs__->{'sql_connect'} = \&mysql_sql_connect;
     $webtools::sys__subs__->{'test_connect'} = \&mysql_test_connect;
     $webtools::sys__subs__->{'sql_disconnect'} = \&mysql_sql_disconnect;
     $webtools::sys__subs__->{'sql_query'} = \&mysql_sql_query;
     $webtools::sys__subs__->{'sql_fetchrow'} = \&mysql_sql_fetchrow;
     $webtools::sys__subs__->{'sql_affected_rows'} = \&mysql_sql_affected_rows;
     $webtools::sys__subs__->{'sql_inserted_id'} = \&mysql_sql_inserted_id;
     $webtools::sys__subs__->{'sql_create_db'} = \&mysql_sql_create_db;
     $webtools::sys__subs__->{'sql_drop_db'} = \&mysql_sql_drop_db;
     $webtools::sys__subs__->{'sql_select_db'} = \&mysql_sql_select_db;
     $webtools::sys__subs__->{'sql_num_fields'} = \&mysql_sql_num_fields;
     $webtools::sys__subs__->{'sql_num_rows'} = \&mysql_sql_num_rows;
     $webtools::sys__subs__->{'sql_data_seek'} = \&mysql_sql_data_seek;
     $webtools::sys__subs__->{'sql_errmsg'} = \&mysql_sql_errmsg;
     $webtools::sys__subs__->{'sql_errno'} = \&mysql_sql_errno;
     $webtools::sys__subs__->{'sql_quote'} = \&mysql_sql_quote;
     $webtools::sys__subs__->{'unsupported_types'} = \&mysql_sql_unsupported_types;
     $webtools::sys__subs__->{'session_clear_expired'} = \&mysql_session_clear_expired;
     $webtools::sys__subs__->{'session_expire_update'} = \&mysql_session_expire_update;
     $webtools::sys__subs__->{'insert_sessions_row'} = \&mysql_insert_sessions_row;
     $webtools::sys__subs__->{'DB_OnDestroy'} = \&mysql_DB_OnDestroy;
     $webtools::sys__subs__->{'SignUpUser'} = \&mysql_SignUpUser;
     $webtools::sys__subs__->{'SignInUser'} = \&mysql_SignInUser;
    }
  }
 if($new_driver =~ m/^access$/si)
  {
   &save_database_handlers();
   if($webtools::system_database_handle_access ne undef)
    {
     $webtools::system_database_handle = $webtools::system_database_handle_access;
    }
   if(!($webtools::loaded_functions & 2))
    {
     require $driver_path.'db_access.pl';
     $webtools::loaded_functions = $webtools::loaded_functions | 2;
    }
   else
    {
     $webtools::sys__subs__->{'DB_OnExit'} = \&access_DB_OnExit;
     $webtools::sys__subs__->{'hideerror'} = \&access_hideerror;
     $webtools::sys__subs__->{'sql_connect'} = \&access_sql_connect;
     $webtools::sys__subs__->{'sql_connect2'} = \&access_sql_connect2;
     $webtools::sys__subs__->{'test_connect'} = \&access_test_connect;
     $webtools::sys__subs__->{'sql_disconnect'} = \&access_sql_disconnect;
     $webtools::sys__subs__->{'sql_query'} = \&access_sql_query;
     $webtools::sys__subs__->{'sql_fetchrow'} = \&access_sql_fetchrow;
     $webtools::sys__subs__->{'sql_affected_rows'} = \&access_sql_affected_rows;
     $webtools::sys__subs__->{'sql_inserted_id'} = \&access_sql_inserted_id;
     $webtools::sys__subs__->{'sql_create_db'} = \&access_sql_create_db;
     $webtools::sys__subs__->{'sql_drop_db'} = \&access_sql_drop_db;
     $webtools::sys__subs__->{'sql_select_db'} = \&access_sql_select_db;
     $webtools::sys__subs__->{'sql_num_fields'} = \&access_sql_num_fields;
     $webtools::sys__subs__->{'sql_num_rows'} = \&access_sql_num_rows;
     $webtools::sys__subs__->{'sql_data_seek'} = \&access_sql_data_seek;
     $webtools::sys__subs__->{'sql_errmsg'} = \&access_sql_errmsg;
     $webtools::sys__subs__->{'sql_errno'} = \&access_sql_errno;
     $webtools::sys__subs__->{'sql_quote'} = \&access_sql_quote;
     $webtools::sys__subs__->{'unsupported_types'} = \&access_sql_unsupported_types;
     $webtools::sys__subs__->{'session_clear_expired'} = \&access_session_clear_expired;
     $webtools::sys__subs__->{'session_expire_update'} = \&access_session_expire_update;
     $webtools::sys__subs__->{'insert_sessions_row'} = \&access_insert_sessions_row;
     $webtools::sys__subs__->{'DB_OnDestroy'} = \&access_DB_OnDestroy;
     $webtools::sys__subs__->{'SignUpUser'} = \&access_SignUpUser;
     $webtools::sys__subs__->{'SignInUser'} = \&access_SignInUser;
    }
  }
 if($new_driver =~ m/^sess_flat$/si)
  {
   if(!($webtools::loaded_functions & 16))
    {
     require $driver_path.'sess_flat.pl';
     $webtools::loaded_functions = $webtools::loaded_functions | 16;
    }
   else
    {
     if($sess_force_flat =~ m/^on$/si)
      {
       $webtools::sys__subs__->{'session_clear_expired'} = \&sess_flat_session_clear_expired;
       $webtools::sys__subs__->{'session_expire_update'} = \&sess_flat_session_expire_update;
       $webtools::sys__subs__->{'insert_sessions_row'} = \&sess_flat_insert_sessions_row;
       $webtools::sys__subs__->{'DB_OnDestroy'} = \&sess_flat_DB_OnDestroy;
      }
    }
   }
 if($new_driver =~ m/^none$/si)
  {
   &save_database_handlers();
   
   $webtools::sys__subs__->{'DB_OnExit'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'hideerror'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_connect'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_connect2'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'test_connect'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_disconnect'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_query'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_fetchrow'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_affected_rows'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_inserted_id'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_create_db'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_drop_db'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_select_db'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_num_fields'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_num_rows'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_data_seek'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_errmsg'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_errno'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'sql_quote'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'unsupported_types'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'session_clear_expired'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'session_expire_update'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'insert_sessions_row'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'DB_OnDestroy'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'SignUpUser'} = \&none_DB_Empty_Sub;
   $webtools::sys__subs__->{'SignInUser'} = \&none_DB_Empty_Sub;
  }
 return(1);
}
sub none_DB_Empty_Sub
{
 return(1);
}
##########################################################################
sub base_rand_maker
{
 my ($n) = @_;
 srand($n);
 my $i = rand(12);
 my $load = $l_charset[$i];
 return(substr($load,$n,1))
}
sub convert_ses_time
{
 my ($cs,$l) = @_;
 my $rs = "";
 for($i=0;$i<$l;$i++)
  {
   $n = substr($cs,$i,1);
   $rs .= base_rand_maker($n);
  }
 return($rs);
}
sub DieAlert
 {
  ClearBuffer();
  ClearHeader();
  print '<font color="red"><B><h2>'.shift().'</h2></B></font>';
  fush_print();
  exit;
 }
############################################
# Parse Form
############################################
sub Parse_Form
{
 return (1);
}
#####################################################################
# User Defined Functions
#####################################################################

#####################################################################
sub onExit
{ 
  my $todo = shift;
  # now we are going to erase all the files uploaded on the server ...
  my $delete_uploaded_files = << 'EVAL_TERMINATOR';
  while ( my ($file_name,$full_path_to_file) = each( %uploaded_files) )
    {
      if (-e $full_path_to_file)
        {
          unlink ($full_path_to_file); 
        }
    }
 if($todo ne 'withOutDB')
  {
   if($webtools::db_support ne "") {DB_OnDestroy($webtools::system_database_handle);}
  }
EVAL_TERMINATOR
 eval $delete_uploaded_files;
 return(1);
}

sub onLockedFileErrorEvent
{
 Header(type => 'content');
 $print_flush_buffer = '';
 flush_print();
 print "<br><font color='red'><h3>Error: Server is too busy! Please press Ctrl+R after few seconds (20-30)</h3></font>";
 onExit();
 exit;
}

sub set_ignore_termination
{
 $webtools::sys_ignore_term = shift;
}
sub get_ignore_termination
{
 return($webtools::sys_ignore_term);
}

sub On_Term_Event
     {
      my $obj   = shift;
      my $err   = shift;
      my $name  = shift;
      # User hit STOP button or...admin shutdown Apache server :-)
      if(!$webtools::sys_ignore_term)
       {
        if(exists($webtools::SIGNALS{'OnTerm'}))
           {
            eval {
      	          my $OnEvent_code = $webtools::SIGNALS{'OnTerm'};
      	          &$OnEvent_code;
      	         };
           }
       }
      if(!$webtools::sys_ignore_term)
       {
  	if($webtools::system_database_handle ne undef)
  	  {
  	   my $q =<<'THAT_TERM_SIG_STR';
  	   DB_OnExit($webtools::system_database_handle);
  	   $webtools::system_database_handle = undef;
  	   $usystem_database_handle = undef;
THAT_TERM_SIG_STR
  	   eval $q;
  	  }
  	eval {onExit();};
        CORE::exit;
       }
  }

##########################################################
# Case insensetive list function "exists"
# PROTO: ($status,[$key,$value]) = exists_insensetive(
#        $lookup_key,%hash);
##########################################################
sub exists_insensetive
{
 my $lookup = uc(shift);
 my @data = @_;
 my %hash = @_;
 my $i = 0;
 my $k;
 foreach $k (@data)
  {
   $i++;
   if($i % 2)
    {
     if($lookup eq uc($k))
      {
       return(('1',$k,$hash{$k}));  # Return '1',$key,$value
      }
    }
  }
 return((0,'','')); # Not found
}

sub set_variables_dump
{
 my $dmp = shift(@_);
 my $style = shift(@_) || 'layer';
 if ($dmp =~ m/^(YES|ON|OK|Y|TRUE|DONE|1)$/si)
  {
   $webtools::global_variables_dump = 1;
   eval 'require "dump.pl";';
  }
 else
  {
   $webtools::global_variables_dump = 0;
  }
 $webtools::global_variables_dump_style = $style;
}

# Follow code process all supported INLINE tags for fast code writings!
sub pre_process_templates ($)
{
 my $sys_temp_buffer = shift(@_);
 local *SYS_PRE_PROCESS_TEMPLATES_FILE;
 my $sys_binlinet = '\<\!\-\-\©INLINE\©\>';   # <!--©INLINE©>
 my $sys_einlinet = '\<\/\©INLINE\©\-\-\>';   # </©INLINE©-->
 my $sys_binlinep = '\<\!\-\-\©INPERL\©\>';   # <!--©INPERL©>
 my $sys_einlinep = '\<\/\©INPERL\©\-\-\>';   # </©INPERL©-->
 
 my $sys_binlinet_new = '\%\%\%INLINE\%\%\%';   # %%%INLINE%%%
 my $sys_einlinet_new = '\%\%\%\/INLINE\%\%\%'; # %%%/INLINE%%%
 my $sys_binlinep_new = '\%\%\%INPERL\%\%\%';   # %%%INPERL%%%
 my $sys_einlinep_new = '\%\%\%\/INPERL\%\%\%'; # %%%/INPERL%%%
 
 my $sys_include_file = '\<\!\-\-\©INCLUDE\©(.*?)\©\-\-\>';     # <!--©INCLUDE©file.ext©-->
 my $sys_include_file_new = '\<\!\-\-\%INCLUDE\%(.*?)\%\-\-\>'; # <!--%INCLUDE%file.ext%-->
 my $sys_include_file_new2 = '\%\%\%INCLUDE\%(.*?)\%\%\%';      # %%%INCLUDE%file.ext%%%
 
 my $work_buffer = $sys_temp_buffer;
 
 $sys_temp_buffer =~ s#$sys_include_file#do{
        my $sys_prd_template;
        if(open(SYS_PRE_PROCESS_TEMPLATES_FILE,$1))
          {
            binmode(SYS_PRE_PROCESS_TEMPLATES_FILE);
            local $/ = undef;
            read(SYS_PRE_PROCESS_TEMPLATES_FILE,$sys_prd_template,(-s SYS_PRE_PROCESS_TEMPLATES_FILE));
            $sys_prd_template =~ s/\r\n/\n/gs;
            $sys_prd_template =~ s/\<\!\-\- PERL:(.*?)(\<\?perl.*?\?\>.*?)\/\/\-\-\>\n?/$2/gsi;
            $sys_prd_template =~ s/\<\!\-\- PERL:(.*?)\/\/\-\-\>\n?//gsi;
            close(SYS_PRE_PROCESS_TEMPLATES_FILE);
          }
        else {$sys_prd_template = '';}
        $work_buffer =~ s/$sys_include_file/$sys_prd_template/si;
      };#sgie;
 
 $sys_temp_buffer = $work_buffer;
 
 $sys_temp_buffer =~ s#$sys_include_file_new#do{
        my $sys_prd_template;
        if(open(SYS_PRE_PROCESS_TEMPLATES_FILE,$1))
          {
            binmode(SYS_PRE_PROCESS_TEMPLATES_FILE);
            local $/ = undef;
            read(SYS_PRE_PROCESS_TEMPLATES_FILE,$sys_prd_template,(-s SYS_PRE_PROCESS_TEMPLATES_FILE));
            $sys_prd_template =~ s/\r\n/\n/gs;
            $sys_prd_template =~ s/\<\!\-\- PERL:(.*?)(\<\?perl.*?\?\>.*?)\/\/\-\-\>\n?/$2/gsi;
            $sys_prd_template =~ s/\<\!\-\- PERL:(.*?)\/\/\-\-\>\n?//gsi;
            close(SYS_PRE_PROCESS_TEMPLATES_FILE);
          }
        else {$sys_prd_template = '';}
        $work_buffer =~ s/$sys_include_file_new/$sys_prd_template/si;
      };#sgie;
 
 $sys_temp_buffer = $work_buffer;
 
 $sys_temp_buffer =~ s#$sys_include_file_new2#do{
        my $sys_prd_template;
        if(open(SYS_PRE_PROCESS_TEMPLATES_FILE,$1))
          {
            binmode(SYS_PRE_PROCESS_TEMPLATES_FILE);
            local $/ = undef;
            read(SYS_PRE_PROCESS_TEMPLATES_FILE,$sys_prd_template,(-s SYS_PRE_PROCESS_TEMPLATES_FILE));
            $sys_prd_template =~ s/\r\n/\n/gs;
            $sys_prd_template =~ s/\<\!\-\- PERL:(.*?)(\<\?perl.*?\?\>.*?)\/\/\-\-\>\n?/$2/gsi;
            $sys_prd_template =~ s/\<\!\-\- PERL:(.*?)\/\/\-\-\>\n?//gsi;
            close(SYS_PRE_PROCESS_TEMPLATES_FILE);
          }
        else {$sys_prd_template = '';}
        $work_buffer =~ s/$sys_include_file_new2/$sys_prd_template/si;
      };#sgie;
 
 $sys_temp_buffer = $work_buffer;
 $sys_temp_buffer =~ s#$sys_binlinet(.*?)$sys_einlinet#do{
        my $sys_prd_template = sys_make_template_code($1,'h');
        $work_buffer =~ s/$sys_binlinet(.*?)$sys_einlinet/$sys_prd_template/si;
      };#sgie;
 
 $sys_temp_buffer = $work_buffer;
 $sys_temp_buffer =~ s#$sys_binlinep(.*?)$sys_einlinep#do{
        my $sys_prd_template = sys_make_template_code($1,'p');
        $work_buffer =~ s/$sys_binlinep(.*?)$sys_einlinep/$sys_prd_template/si;
      };#sgie;
 
 $sys_temp_buffer = $work_buffer;
 $sys_temp_buffer =~ s#$sys_binlinet_new(.*?)$sys_einlinet_new#do{
        my $sys_prd_template = sys_make_template_code($1,'h');
        $work_buffer =~ s/$sys_binlinet_new(.*?)$sys_einlinet_new/$sys_prd_template/si;
      };#sgie;
 
 $sys_temp_buffer = $work_buffer;
 $sys_temp_buffer =~ s#$sys_binlinep_new(.*?)$sys_einlinep_new#do{
        my $sys_prd_template = sys_make_template_code($1,'p');
        $work_buffer =~ s/$sys_binlinep_new(.*?)$sys_einlinep_new/$sys_prd_template/si;
      };#sgie;
 
 return($work_buffer);
}

# This sub process all supported form INLINE template formats
sub sys_make_template_code
{
 my $sys_my_pre_process_tempf = shift(@_);
 my $sys_my_pre_process_ph_b = "<?perl \n";
 my $sys_my_pre_process_ph_e = "\n?>";
 my $sys_my_pre_process_print = "print ";
 $syspre_process_counter++;
 
 if($_[0] eq 'p')
   {
    $sys_my_pre_process_ph_b = "\n";
    $sys_my_pre_process_ph_e = "\n";
    $sys_my_pre_process_print = '$_ = ';
   }
 
 # ----- Make code for simple TEMPLATES -----
 # example: <§TEMPLATE:7:$val:§>
 if($sys_my_pre_process_tempf =~ m/\<\§TEMPLATE\:(\d{1,})\:(.*?)\:\§\>/si)
  {
   my $sys_my_pre_process_num = $1;
   my $sys_my_pre_process_val = $2;
   if($sys_my_pre_process_val =~ m/^(\$|\@|\%)/s)
     {
      $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.$sys_my_pre_process_print.'('.$sys_my_pre_process_val.');'.$sys_my_pre_process_ph_e;
     }
   else
     {
      $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.$sys_my_pre_process_print."('".$sys_my_pre_process_val."');".$sys_my_pre_process_ph_e;
     }
   return($sys_my_pre_process_sys_code);
  }
 
 # ----- Make code for simple TEMPLATES -----
 # example: %%TEMPLATE:7:$val:%%
 if($sys_my_pre_process_tempf =~ m/\%\%TEMPLATE\:(\d{1,})\:(.*?)\:\%\%/si)
  {
   my $sys_my_pre_process_num = $1;
   my $sys_my_pre_process_val = $2;
   if($sys_my_pre_process_val =~ m/^(\$|\@|\%)/s)
     {
      $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.$sys_my_pre_process_print.'('.$sys_my_pre_process_val.');'.$sys_my_pre_process_ph_e;
     }
   else
     {
      $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.$sys_my_pre_process_print."('".$sys_my_pre_process_val."');".$sys_my_pre_process_ph_e;
     }
   return($sys_my_pre_process_sys_code);
  }
 
 # ----- Make code for simple TEMPLATES -----
 # example: ??TEMPLATE:7:$val:??
 if($sys_my_pre_process_tempf =~ m/\?\?TEMPLATE\:(\d{1,})\:(.*?)\:\?\?/si)
  {
   my $sys_my_pre_process_num = $1;
   my $sys_my_pre_process_val = $2;
   if($sys_my_pre_process_val =~ m/^(\$|\@|\%)/s)
     {
      $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.$sys_my_pre_process_print.'('.$sys_my_pre_process_val.');'.$sys_my_pre_process_ph_e;
     }
   else
     {
      $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.$sys_my_pre_process_print."('".$sys_my_pre_process_val."');".$sys_my_pre_process_ph_e;
     }
   return($sys_my_pre_process_sys_code);
  }

 # ----- Make code for XREADER -----
 if($sys_my_pre_process_tempf =~ m/\<XREADER:.+?\:(.*?)\:(.*?)\>/si)
  {
    my $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.q# my $rztl_sconn;
          if(($webtools::system_database_handle eq undef) and ($webtools::db_support ne ''))
                {
                    $rztl_sconn = sql_connect(); 
                }
          if(!($webtools::loaded_functions & 8)) {eval 'require $library_path.'."'xreader.pl';";}
          xreader_dbh($rztl_sconn);#;
     
   $sys_my_pre_process_tmp_eval = '$sys_my_pre_process_val_N_'.$syspre_process_counter.' = $sys_my_pre_process_tempf;';
   eval $sys_my_pre_process_tmp_eval;
   
   $sys_my_pre_process_sys_code .= "\n".$sys_my_pre_process_print.'sys_run_time_process_xread('.'$sys_my_pre_process_val_N_'.$syspre_process_counter.');'.$sys_my_pre_process_ph_e;
   return($sys_my_pre_process_sys_code);
  }
 # ----- Make code for XREADER -----
 if($sys_my_pre_process_tempf =~ m/\%\%XREADER:.+?\:(.*?)\:(.*?)\%\%/si)
  {
    my $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.q# my $rztl_sconn;
          if(($webtools::system_database_handle eq undef) and ($webtools::db_support ne ''))
                {
                    $rztl_sconn = sql_connect(); 
                }
          if(!($webtools::loaded_functions & 8)) {eval 'require $library_path.'."'xreader.pl';";}
          xreader_dbh($rztl_sconn);#;
     
   $sys_my_pre_process_tmp_eval = '$sys_my_pre_process_val_N_'.$syspre_process_counter.' = $sys_my_pre_process_tempf;';
   eval $sys_my_pre_process_tmp_eval;
   
   $sys_my_pre_process_sys_code .= "\n".$sys_my_pre_process_print.'sys_run_time_process_xread('.'$sys_my_pre_process_val_N_'.$syspre_process_counter.');'.$sys_my_pre_process_ph_e;
   return($sys_my_pre_process_sys_code);
  }
  
 # ----- Make code for SQL Templates -----
 if($sys_my_pre_process_tempf =~ m/\<S\©L\:\d{1,}\:(.*?)\:.+?\:.+?\:.+?\:.+?\:S\©L\>/si)
  {
    my $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.q# my $rztl_sconn;
          if(($webtools::system_database_handle eq undef) and ($webtools::db_support ne ''))
                {
                    $rztl_sconn = sql_connect(); 
                    if($rztl_sconn eq undef) { print '?C?'; exit(-1);}
                }
          if(!($webtools::loaded_functions & 8)) {eval 'require $library_path.'."'xreader.pl';";}
          xreader_dbh($rztl_sconn);#;

   $sys_my_pre_process_tmp_eval = '$sys_my_pre_process_val_N_'.$syspre_process_counter.' = $sys_my_pre_process_tempf;';
   eval $sys_my_pre_process_tmp_eval;
   
   $sys_my_pre_process_sys_code .= "\n".$sys_my_pre_process_print.'sys_run_time_process_sql('.'$sys_my_pre_process_val_N_'.$syspre_process_counter.');'.$sys_my_pre_process_ph_e;
   return($sys_my_pre_process_sys_code);
  }
 # ----- Make code for SQL Templates -----
 if($sys_my_pre_process_tempf =~ m/\%\%SQL\:\d{1,}\:(.*?)\:.+?\:.+?\:.+?\:.+?\:SQL\%\%/si)
  {
    my $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.q# my $rztl_sconn;
          if(($webtools::system_database_handle eq undef) and ($webtools::db_support ne ''))
                {
                    $rztl_sconn = sql_connect(); 
                    if($rztl_sconn eq undef) { print '?C?'; exit(-1);}
                }
          if(!($webtools::loaded_functions & 8)) {eval 'require $library_path.'."'xreader.pl';";}
          xreader_dbh($rztl_sconn);#;

   $sys_my_pre_process_tmp_eval = '$sys_my_pre_process_val_N_'.$syspre_process_counter.' = $sys_my_pre_process_tempf;';
   eval $sys_my_pre_process_tmp_eval;
   
   $sys_my_pre_process_sys_code .= "\n".$sys_my_pre_process_print.'sys_run_time_process_sql('.'$sys_my_pre_process_val_N_'.$syspre_process_counter.');'.$sys_my_pre_process_ph_e;
   return($sys_my_pre_process_sys_code);
  }
  
 # ----- Make code for SQLVAR Templates -----
 if($sys_my_pre_process_tempf =~ m/\<S\©LVAR\:(.+?)\:S\©L\>/si)
  {
    my $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.q# my $rztl_sconn;
          if(($webtools::system_database_handle eq undef) and ($webtools::db_support ne ''))
                {
                    $rztl_sconn = sql_connect(); 
                    if($rztl_sconn eq undef) { print '?C?'; exit(-1);}
                }
          if(!($webtools::loaded_functions & 8)) {eval 'require $library_path.'."'xreader.pl';";}
          xreader_dbh($rztl_sconn);#;

   $sys_my_pre_process_tmp_eval = '$sys_my_pre_process_val_N_'.$syspre_process_counter.' = $sys_my_pre_process_tempf;';
   eval $sys_my_pre_process_tmp_eval;
   
   $sys_my_pre_process_sys_code .= "\n".$sys_my_pre_process_print.'sys_run_time_process_sqlvar('.'$sys_my_pre_process_val_N_'.$syspre_process_counter.');'.$sys_my_pre_process_ph_e;
   return($sys_my_pre_process_sys_code);
  }
 # ----- Make code for SQLVAR Templates -----
 if($sys_my_pre_process_tempf =~ m/\%\%SQLVAR\:(.+?)\%\%/si)
  {
    my $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.q# my $rztl_sconn;
          if(($webtools::system_database_handle eq undef) and ($webtools::db_support ne ''))
                {
                    $rztl_sconn = sql_connect(); 
                    if($rztl_sconn eq undef) { print '?C?'; exit(-1);}
                }
          if(!($webtools::loaded_functions & 8)) {eval 'require $library_path.'."'xreader.pl';";}
          xreader_dbh($rztl_sconn);#;

   $sys_my_pre_process_tmp_eval = '$sys_my_pre_process_val_N_'.$syspre_process_counter.' = $sys_my_pre_process_tempf;';
   eval $sys_my_pre_process_tmp_eval;
   
   $sys_my_pre_process_sys_code .= "\n".$sys_my_pre_process_print.'sys_run_time_process_sqlvar('.'$sys_my_pre_process_val_N_'.$syspre_process_counter.');'.$sys_my_pre_process_ph_e;
   return($sys_my_pre_process_sys_code);
  }
  
 # ----- Make code for MENUSELECT -----
 if($sys_my_pre_process_tempf =~ m/\<MENUSELECT\:\$(.*?)\:(.*?)\:\$(.*?)\:\$(.*?)\:\$(.*?)\:\$(.*?)\:\>/si)
  {
    my $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.q# my $rztl_sconn;
          if(($webtools::system_database_handle eq undef) and ($webtools::db_support ne ''))
                {
                    $rztl_sconn = sql_connect();
                }
          if(!($webtools::loaded_functions & 8)) {eval 'require $library_path.'."'xreader.pl';";}
          xreader_dbh($rztl_sconn);#;

   $sys_my_pre_process_tmp_eval = '$sys_my_pre_process_val_N_'.$syspre_process_counter.' = $sys_my_pre_process_tempf;';
   eval $sys_my_pre_process_tmp_eval;
   
   $sys_my_pre_process_sys_code .= "\n".$sys_my_pre_process_print.'sys_run_time_process_menuselect('.'$sys_my_pre_process_val_N_'.$syspre_process_counter.');'.$sys_my_pre_process_ph_e;
   return($sys_my_pre_process_sys_code);
  }
 
 # ----- Make code for MENUSELECT -----
 if($sys_my_pre_process_tempf =~ m/\%\%MENUSELECT\:\$(.*?)\:(.*?)\:\$(.*?)\:\$(.*?)\:\$(.*?)\:\$(.*?)\:\%\%/si)
  {
    my $sys_my_pre_process_sys_code = $sys_my_pre_process_ph_b.q# my $rztl_sconn;
          if(($webtools::system_database_handle eq undef) and ($webtools::db_support ne ''))
                {
                    $rztl_sconn = sql_connect();
                }
          if(!($webtools::loaded_functions & 8)) {eval 'require $library_path.'."'xreader.pl';";}
          xreader_dbh($rztl_sconn);#;

   $sys_my_pre_process_tmp_eval = '$sys_my_pre_process_val_N_'.$syspre_process_counter.' = $sys_my_pre_process_tempf;';
   eval $sys_my_pre_process_tmp_eval;
   
   $sys_my_pre_process_sys_code .= "\n".$sys_my_pre_process_print.'sys_run_time_process_menuselect('.'$sys_my_pre_process_val_N_'.$syspre_process_counter.');'.$sys_my_pre_process_ph_e;
   return($sys_my_pre_process_sys_code);
  }
 
 return('<?perl print "?Err?"; ?>');
}


# That sub process XREAD template in run-time and it is a part of INLINE feature.
# example: <XREADER:1:bestbuy.jhtml:$first_param,$second_param>
sub sys_run_time_process_xread
{
 my $sys_my_pre_process_tempf = shift(@_);
 if($sys_my_pre_process_tempf =~ m/\<XREADER:(.+?)\:(.*?)\:(.*?)\>/si)
  {
   my $sys_my_pre_process_numb = $1;
   my $sys_my_pre_process_file = $2;
   my $sys_my_pre_process_vals = $3;
   if($sys_my_pre_process_numb =~ m/^\$(.*)$/s)
    {
     my $sys_temp_ev1 = '$sys_my_pre_process_numb = $'.$1.';';
     eval $sys_temp_ev1;
    }
   if($sys_my_pre_process_file =~ m/^\$(.*)$/s)
    {
     my $sys_temp_ev1 = '$sys_my_pre_process_file = $'.$1.';';
     eval $sys_temp_ev1;
    }
   my @sys_my_pre_process_aval = split('\,',$sys_my_pre_process_vals);
   my @sys_my_pre_process_all = ();
   foreach $sys_my_pre_process_aself (@sys_my_pre_process_aval)
    {
     if($sys_my_pre_process_aself =~ m/^(\$|\@|\%)/s)
      {
       my $sys_my_pre_process_eval = 'push (@sys_my_pre_process_all,'.$sys_my_pre_process_aself.');';
       eval $sys_my_pre_process_eval;
      }
     else
      {
       my $sys_my_pre_process_eval = 'push (@sys_my_pre_process_all,'."'".$sys_my_pre_process_aself."'".');';
       eval $sys_my_pre_process_eval;
      }
    }
   $sys_my_pre_process_sys_code = xreader($sys_my_pre_process_numb,$sys_my_pre_process_file,@sys_my_pre_process_all);
   return($sys_my_pre_process_sys_code);
  }
 if($sys_my_pre_process_tempf =~ m/\%\%XREADER:(.+?)\:(.*?)\:(.*?)\%\%/si)
  {
   my $sys_my_pre_process_numb = $1;
   my $sys_my_pre_process_file = $2;
   my $sys_my_pre_process_vals = $3;
   if($sys_my_pre_process_numb =~ m/^\$(.*)$/s)
    {
     my $sys_temp_ev1 = '$sys_my_pre_process_numb = $'.$1.';';
     eval $sys_temp_ev1;
    }
   if($sys_my_pre_process_file =~ m/^\$(.*)$/s)
    {
     my $sys_temp_ev1 = '$sys_my_pre_process_file = $'.$1.';';
     eval $sys_temp_ev1;
    }
   my @sys_my_pre_process_aval = split('\,',$sys_my_pre_process_vals);
   my @sys_my_pre_process_all = ();
   foreach $sys_my_pre_process_aself (@sys_my_pre_process_aval)
    {
     if($sys_my_pre_process_aself =~ m/^(\$|\@|\%)/s)
      {
       my $sys_my_pre_process_eval = 'push (@sys_my_pre_process_all,'.$sys_my_pre_process_aself.');';
       eval $sys_my_pre_process_eval;
      }
     else
      {
       my $sys_my_pre_process_eval = 'push (@sys_my_pre_process_all,'."'".$sys_my_pre_process_aself."'".');';
       eval $sys_my_pre_process_eval;
      }
    }
   $sys_my_pre_process_sys_code = xreader($sys_my_pre_process_numb,$sys_my_pre_process_file,@sys_my_pre_process_all);
   return($sys_my_pre_process_sys_code);
  }
}

# That sub process SQL template in run-time and it is a part of INLINE feature.
# example: <S©L:1:"select USER,ID from demo_users where id=1;":1:1:1:1:S©L>
sub sys_run_time_process_sql
{
 my $sys_my_pre_process_tempf = shift(@_);
 if($sys_my_pre_process_tempf =~ m/(\<S\©L\:\d{1,}\:)(.*?)(\:.+?\:.+?\:.+?\:.+?\:)S\©L\>/si)
  {
   my $sys_my_pre_process_beg  = $1;
   my $sys_my_pre_process_data = $2;
   my $sys_my_pre_process_end  = $3;
   my @sys_my_pre_a = split(/\:/,$sys_my_pre_process_end);
   my $sys_line;
   $sys_my_pre_process_end = ':';
   foreach $sys_line (@sys_my_pre_a)
    {
     if($sys_line ne '')
      {
       if($sys_line =~ m/^\$(.*)$/s)
        {
         my $sys_temp_ev1 = '$sys_my_pre_process_end .= $'.$1.".':'".';';
         eval $sys_temp_ev1;
        }
       else {$sys_my_pre_process_end .= $sys_line.":";}
      }
    }
   $sys_my_pre_process_end .= 'S©L>';
   my $sys_my_pre_process_tmp  = 0;
   my $sys_pre_process_replce = '';
  
   if($sys_my_pre_process_data =~ m/([\ \']{0,})\$(.*?)([\'\ \;\"])/si)
     {
      my $sys_pre_process_tmp_1 = $1;
      my $sys_pre_process_tmp_2 = $2;
      my $sys_pre_process_tmp_3 = $3;
      my $sys_pre_process_tmp_4 = '$sys_pre_process_replce = $'.$sys_pre_process_tmp_2.';';
      eval $sys_pre_process_tmp_4;
      $sys_pre_process_replce = $sys_pre_process_tmp_1.$sys_pre_process_replce.$sys_pre_process_tmp_3;
      $sys_my_pre_process_data =~ s/([\ \']{0,})\$(.*?)([\'\ \;\"])/$sys_pre_process_replce/si;
     }
   $sys_my_pre_process_tempf = $sys_my_pre_process_beg.$sys_my_pre_process_data.$sys_my_pre_process_end;
   print $sys_my_pre_process_tempf;
   return(_mem_xreader($sys_my_pre_process_tempf));
  }
 if($sys_my_pre_process_tempf =~ m/(\%\%SQL\:\d{1,}\:)(.*?)(\:.+?\:.+?\:.+?\:.+?\:)SQL\%\%/si)
  {
   my $sys_my_pre_process_beg  = $1;
   my $sys_my_pre_process_data = $2;
   my $sys_my_pre_process_end  = $3;
   my @sys_my_pre_a = split(/\:/,$sys_my_pre_process_end);
   my $sys_line;
   $sys_my_pre_process_end = ':';
   foreach $sys_line (@sys_my_pre_a)
    {
     if($sys_line ne '')
      {
       if($sys_line =~ m/^\$(.*)$/s)
        {
         my $sys_temp_ev1 = '$sys_my_pre_process_end .= $'.$1.".':'".';';
         eval $sys_temp_ev1;
        }
       else {$sys_my_pre_process_end .= $sys_line.":";}
      }
    }
   $sys_my_pre_process_end .= 'SQL%%';
   my $sys_my_pre_process_tmp  = 0;
   my $sys_pre_process_replce = '';
  
   if($sys_my_pre_process_data =~ m/([\ \']{0,})\$(.*?)([\'\ \;\"])/si)
     {
      my $sys_pre_process_tmp_1 = $1;
      my $sys_pre_process_tmp_2 = $2;
      my $sys_pre_process_tmp_3 = $3;
      my $sys_pre_process_tmp_4 = '$sys_pre_process_replce = $'.$sys_pre_process_tmp_2.';';
      eval $sys_pre_process_tmp_4;
      $sys_pre_process_replce = $sys_pre_process_tmp_1.$sys_pre_process_replce.$sys_pre_process_tmp_3;
      $sys_my_pre_process_data =~ s/([\ \']{0,})\$(.*?)([\'\ \;\"])/$sys_pre_process_replce/si;
     }
   $sys_my_pre_process_tempf = $sys_my_pre_process_beg.$sys_my_pre_process_data.$sys_my_pre_process_end;
   print $sys_my_pre_process_tempf;
   return(_mem_xreader($sys_my_pre_process_tempf));
  }
}

# That sub process SQLVAR template's variables in run-time and it is a part of INLINE feature.
# example: <S©LVAR:1:S©L>
sub sys_run_time_process_sqlvar
{
 my $sys_my_pre_process_tempf = shift(@_);
 if($sys_my_pre_process_tempf =~ m/(\<S\©LVAR)(\:.*?\:)(S\©L\>)/si)
  {
   my $sys_my_pre_process_beg  = $1;
   my $sys_my_pre_process_data = $2;
   my $sys_my_pre_process_end  = $3;
   my $sys_my_pre_process_tmp  = 0;
   my $sys_pre_process_replce = '';
  
   if($sys_my_pre_process_data =~ m/(\:)\$(.*?)(\:)/si)
     {
      my $sys_pre_process_tmp_1 = $1;
      my $sys_pre_process_tmp_2 = $2;
      my $sys_pre_process_tmp_3 = $3;
      my $sys_pre_process_tmp_4 = '$sys_pre_process_replce = $'.$sys_pre_process_tmp_2.';';
      eval $sys_pre_process_tmp_4;
      $sys_pre_process_replce = $sys_pre_process_tmp_1.$sys_pre_process_replce.$sys_pre_process_tmp_3;
      $sys_my_pre_process_data =~ s/(\:)\$(.*?)(\:)/$sys_pre_process_replce/si;
     }
   $sys_my_pre_process_tempf = $sys_my_pre_process_beg.$sys_my_pre_process_data.$sys_my_pre_process_end;
   return(_mem_xreader($sys_my_pre_process_tempf));
  }
 if($sys_my_pre_process_tempf =~ m/(\%\%SQLVAR)(\:.*?)(\%\%)/si)
  {
   my $sys_my_pre_process_beg  = $1;
   my $sys_my_pre_process_data = $2;
   my $sys_my_pre_process_end  = $3;
   my $sys_my_pre_process_tmp  = 0;
   my $sys_pre_process_replce = '';
  
   if($sys_my_pre_process_data =~ m/(\:)\$(.*?)$/si)
     {
      my $sys_pre_process_tmp_1 = $1;
      my $sys_pre_process_tmp_2 = $2;
      my $sys_pre_process_tmp_4 = '$sys_pre_process_replce = $'.$sys_pre_process_tmp_2.';';
      eval $sys_pre_process_tmp_4;
      $sys_pre_process_replce = $sys_pre_process_tmp_1.$sys_pre_process_replce;
      $sys_my_pre_process_data =~ s/(\:)\$(.*?)$/$sys_pre_process_replce/si;
     }
   $sys_my_pre_process_tempf = $sys_my_pre_process_beg.$sys_my_pre_process_data.$sys_my_pre_process_end;
   return(_mem_xreader($sys_my_pre_process_tempf));
  }
}

# That sub process MENUSELECT template in run-time and it is a part of INLINE feature.
# exmp: <MENUSELECT:$SOURCE:"SELECT MenuState FROM MyTable WHERE Condition1 = $C1 AND ...":\@DB_VALUES:\@TEMPLATE_NUMBERS:\@HTML_VALUES:$dbh:>
sub sys_run_time_process_menuselect
{
 my $sys_my_pre_process_tempf = shift(@_);
 if($sys_my_pre_process_tempf =~ m/\<MENUSELECT\:\$(.*?)\:\$(.*?)\:\$(.*?)\:\$(.*?)\:\$(.*?)\:\$(.*?)\:\>/si)
  {
   my $sys_my_pre_process_src  = $1;
   my $sys_my_pre_process_sql  = $2;
   my $sys_my_pre_process_dbv  = $3;
   my $sys_my_pre_process_tem  = $4;
   my $sys_my_pre_process_htm  = $5;
   my $sys_my_pre_process_dbh  = $6;
   my $sys_pre_process_replce = '';

   my $sys_my_pre_process_tmp = '$sys_my_pre_process_src = $'.$sys_my_pre_process_src.';';
   eval $sys_my_pre_process_tmp;
   $sys_my_pre_process_tmp = '$sys_my_pre_process_dbv = $'.$sys_my_pre_process_dbv.';';
   eval $sys_my_pre_process_tmp;
   $sys_my_pre_process_tmp = '$sys_my_pre_process_tem = $'.$sys_my_pre_process_tem.';';
   eval $sys_my_pre_process_tmp;
   $sys_my_pre_process_tmp = '$sys_my_pre_process_htm = $'.$sys_my_pre_process_htm.';';
   eval $sys_my_pre_process_tmp;
   $sys_my_pre_process_tmp = '$sys_my_pre_process_sql = $'.$sys_my_pre_process_sql.';';
   eval $sys_my_pre_process_tmp;
   $sys_my_pre_process_tmp = '$sys_my_pre_process_dbh = $'.$sys_my_pre_process_dbh.';';
   eval $sys_my_pre_process_tmp;

   if(($sys_my_pre_process_dbh eq '') or ($sys_my_pre_process_dbh eq undef))
      {$sys_my_pre_process_dbh = $webtools::system_database_handle;}
   
   my @sys_my_pre_process_dbv_a  = @$sys_my_pre_process_dbv;
   my @sys_my_pre_process_tem_a  = @$sys_my_pre_process_tem;
   my @sys_my_pre_process_htm_a  = @$sys_my_pre_process_htm;

   $sys_my_pre_process_src = MenuSelect($sys_my_pre_process_src,$sys_my_pre_process_sql,$sys_my_pre_process_dbv,
                                        $sys_my_pre_process_tem,$sys_my_pre_process_htm,$sys_my_pre_process_dbh);
   return($sys_my_pre_process_src);
  }
 if($sys_my_pre_process_tempf =~ m/\%\%MENUSELECT\:\$(.*?)\:\$(.*?)\:\$(.*?)\:\$(.*?)\:\$(.*?)\:\$(.*?)\:\%\%/si)
  {
   my $sys_my_pre_process_src  = $1;
   my $sys_my_pre_process_sql  = $2;
   my $sys_my_pre_process_dbv  = $3;
   my $sys_my_pre_process_tem  = $4;
   my $sys_my_pre_process_htm  = $5;
   my $sys_my_pre_process_dbh  = $6;
   my $sys_pre_process_replce = '';

   my $sys_my_pre_process_tmp = '$sys_my_pre_process_src = $'.$sys_my_pre_process_src.';';
   eval $sys_my_pre_process_tmp;
   $sys_my_pre_process_tmp = '$sys_my_pre_process_dbv = $'.$sys_my_pre_process_dbv.';';
   eval $sys_my_pre_process_tmp;
   $sys_my_pre_process_tmp = '$sys_my_pre_process_tem = $'.$sys_my_pre_process_tem.';';
   eval $sys_my_pre_process_tmp;
   $sys_my_pre_process_tmp = '$sys_my_pre_process_htm = $'.$sys_my_pre_process_htm.';';
   eval $sys_my_pre_process_tmp;
   $sys_my_pre_process_tmp = '$sys_my_pre_process_sql = $'.$sys_my_pre_process_sql.';';
   eval $sys_my_pre_process_tmp;
   $sys_my_pre_process_tmp = '$sys_my_pre_process_dbh = $'.$sys_my_pre_process_dbh.';';
   eval $sys_my_pre_process_tmp;

   if(($sys_my_pre_process_dbh eq '') or ($sys_my_pre_process_dbh eq undef))
      {$sys_my_pre_process_dbh = $webtools::system_database_handle;}
   
   my @sys_my_pre_process_dbv_a  = @$sys_my_pre_process_dbv;
   my @sys_my_pre_process_tem_a  = @$sys_my_pre_process_tem;
   my @sys_my_pre_process_htm_a  = @$sys_my_pre_process_htm;

   $sys_my_pre_process_src = MenuSelect($sys_my_pre_process_src,$sys_my_pre_process_sql,$sys_my_pre_process_dbv,
                                        $sys_my_pre_process_tem,$sys_my_pre_process_htm,$sys_my_pre_process_dbh);
   return($sys_my_pre_process_src);
  }
}

1;  # Well done...
__END__