package My_GenericFunctions;

use strict;
use Data::Dumper;
use HTTP::Headers;
use Digest::MD5 qw(md5 md5_hex md5_base64);
use Cache::Memcached;
use XML::Simple;

our %ua;
our %cache;

 
#--------------------------------------------------------------------------------------------------
sub new
{
  my $pclass = shift; 
  my $pdbhMain = shift;
  my $pGLOBALS = shift;
  my $self = {
    dbh=>$pdbhMain,
    GLOBALS=>$pGLOBALS,
    logger=>Log::Log4perl->get_logger()
  };
  bless $self, $pclass;
  $self->{logger}->info("::GenericFunctions::Instance Started");
  return $self;
}

#--------------------------------------------------------------------------------------------------
sub xml_friendly
{
  my $this=shift;
  my $msg = shift;

  return(internal_xml_friendly($msg));
}

#--------------------------------------------------------------------------------------------------
sub internal_xml_friendly
{
  #my $this=shift;
  my ($msg) = @_;
  my $loop=0;
  my $rep;
  my $repchar;

  $msg =~ s/\&/\&amp;/ig;
  $msg =~ s/\"/\\\'/ig;
  $msg =~ s/\</\&lt;/ig; #break the xml
  $msg =~ s/\>/\&gt;/ig; #break the xml

  for($loop=1;$loop<32;$loop++)
  {
    if($loop==10 || $loop==13)
    {
    }
    else
    {
      $rep = "&#$loop;";
      $repchar = chr($loop);
      $msg =~ s/$repchar/$rep/ig;
    }
  }

  for($loop=128;$loop<256;$loop++)
  {
    if ($loop != 223)
    {
      $rep = "&#$loop;";
      $repchar = chr($loop);
      $msg =~ s/$repchar/$rep/ig;
    }
  }

  return($msg);
}

#--------------------------------------------------------------------------------------------------
sub return_error
{
  my $this=shift;
  my($msg,$messageLevel) = shift;
  
  return(internal_return_error($msg,$messageLevel));
}
#--------------------------------------------------------------------------------------------------
sub internal_return_error
{
  #my $this=shift;
  my($msg,$messageLevel) = @_;
  my $returnval;
  my $levelText="";
  if($msg eq "")
  {
    $msg = "System Error.  Please Try Again Later.";
  }
  if(defined($messageLevel))
  {
    if($messageLevel eq "warn")
    {
      $levelText="warning";
    }
    else
    {
      $levelText="critical";
    }
  }
  else
  {
    $levelText="critical";
  }
 
  $returnval =  "<\?xml  version=\"1.0\"\?>";
  $returnval.=  "\n<api>";
  $returnval.=  "\n<status>false</status>\n<error_description>".internal_xml_friendly($msg)."</error_description>";
  $returnval.=  "\n<message_level>".internal_xml_friendly($levelText)."</message_level>";
  $returnval.=  "\n</api>";

  my $logger = Log::Log4perl->get_logger();
  for(my $i=0;$i<5;$i++)
  {
    if((caller($i))[0] ne "")
    {
      $logger->info((caller($i))[0],"||".(caller($i))[1]."||Line:".(caller($i))[2]."||".(caller($i))[3]."||");
    }
  }
  
  return $returnval;
}

#--------------------------------------------------------------------------------------------------
sub return_error_with_debug
{
  my $this=shift;
  my($msg,$messageLevel,$mdebug) = @_;
  
  #my $logger = Log::Log4perl->get_logger();
  #$logger->info("DEBUG1 $mdebug");
  
  return(internal_return_error_with_debug($msg,$messageLevel,$mdebug));
}
#--------------------------------------------------------------------------------------------------
sub internal_return_error_with_debug
{
  #my $this=shift;
  my($msg,$messageLevel,$debug) = @_;
  my $returnval;
  my $levelText="";
  if($msg eq "")
  {
    $msg = "System Error.  Please Try Again Later.";
  }
  if(defined($messageLevel))
  {
    if($messageLevel eq "warn")
    {
      $levelText="warning";
    }
    else
    {
      $levelText="critical";
    }
  }
  else
  {
    $levelText="critical";
  }
 
  $returnval =  "<\?xml  version=\"1.0\"\?>";
  $returnval.=  "\n<api>";
  $returnval.=  "\n<status>false</status>\n<error_description>".internal_xml_friendly($msg)."</error_description>";
  $returnval.=  "\n<message_level>".internal_xml_friendly($levelText)."</message_level>";
  $returnval.=  "\n<debug>".internal_xml_friendly($debug)."</debug>";
  $returnval.=  "\n</api>";

  my $logger = Log::Log4perl->get_logger();
  for(my $i=0;$i<5;$i++)
  {
    if((caller($i))[0] ne "")
    {
      $logger->info((caller($i))[0],"||".(caller($i))[1]."||Line:".(caller($i))[2]."||".(caller($i))[3]."||");
    }
  }
  
  return $returnval;
}

#--------------------------------------------------------------------------------------------------
sub check_fk_pk_col($)
{
  my $this=shift;
  my($msg) = @_;

  return(internal_check_fk_pk_col($msg));
}
#--------------------------------------------------------------------------------------------------
sub internal_check_fk_pk_col($)
{
  my($msg) = @_;
  my $allowed_chars="0123456789abcdef";
  my $loop=0;
  
  for($loop=0;$loop<length($msg);$loop++)
  {
    if(index($allowed_chars,substr($msg,$loop,1))==-1)
    {
      return(1);
    }
  }
  
  return(0);
}

#######################################################################################################################################
sub ShowXML()
{
 my $this=shift;
 my ($xml,$depth) = @_;

 return(internal_ShowXML($xml,$depth));
}

#######################################################################################################################################
sub internal_ShowXML($$)
{
 my ($xml,$depth) = @_;
 my $loop=0;
 my $spacer;

 my $logger= Log::Log4perl->get_logger();
 
 for(my $x=0;$x<$depth;$x++) {$spacer.= "\t";}
 
 $logger->info("$spacer|Start");

 while(my ($key,$value) = each(%$xml))
 {

  $logger->info( "$spacer|$key | $value");
  if(ref($value) eq "HASH")
  {
    internal_ShowXML($value,$depth+1);
  }
  elsif(ref($value) eq "ARRAY")
  {
    $loop=0;
    do
    {

      $logger->info( "$spacer|$key $loop | ".$value->[$loop]."");
      if(ref($value->[$loop]) eq "HASH")
      {
        internal_ShowXML($value->[$loop],$depth+1);
      }
    }while(defined($value->[++$loop]));
  }
 }
 $logger->info( "$spacer|End");
}

#--------------------------------------------------------------------------------------------------
sub CheckMemCacheResponse($$)
{
 my $this=shift;
 my ($receivedXML,$saveresponse) = @_;
 
 return(internal_CheckMemCacheResponse($receivedXML,$saveresponse));
}

#--------------------------------------------------------------------------------------------------
sub internal_CheckMemCacheResponse($$)
{
  my ($receivedXML,$saveresponse) = @_;
 
  my $logger= Log::Log4perl->get_logger();
 
  #$logger->info("load $receivedXML $saveresponse");
  if($saveresponse ne "")
  {
    my $req = md5_hex($receivedXML);
    my $memd = new Cache::Memcached {'servers' => [ "127.0.0.1:11211"],'debug' => 0,};
    my $check_val = $memd->get($req);
    $memd->disconnect_all;
    
    if(!defined($check_val))
    { 
      $logger->info("NO CACHED RESPONSE");
      return("");
    }
    else
    {
      $logger->info("CACHED RESPONSE"); 
      return($check_val);   
    }
  }
}

#--------------------------------------------------------------------------------------------------
sub SaveMemCacheResponse($$$)
{
 my $this=shift;
 my ($receivedXML,$resp,$saveresponse) = @_;
 
 return(internal_SaveMemCacheResponse($receivedXML,$resp,$saveresponse));
}
#--------------------------------------------------------------------------------------------------
sub internal_SaveMemCacheResponse($$$)
{
  my ($receivedXML,$resp,$saveresponse) = @_;
 
  my $logger= Log::Log4perl->get_logger();
 
  #$logger->info("save $receivedXML $resp");
  if($saveresponse ne "")
  {
    my $req = md5_hex($receivedXML);
    my $memd = new Cache::Memcached {'servers' => [ "127.0.0.1:11211"],'debug' => 0,};
    $memd->set($req, $resp, $saveresponse);

    $logger->info("SAVED TO CACHE");
    
    $memd->disconnect_all;
  }
  else
  {
    $logger->info("NOT SAVED TO CACHE");
  } 
}

#--------------------------------------------------------------------------------------------------
sub SendSMS($$)
{
  my $thi1=shift;
  my $this=shift;
  my ($AGENCY_id,$to,$message) = @_;

	#DV TODO 
	
	return(0);
}
#--------------------------------------------------------------------------------------------------
sub SendEmail($$)
{
  my $thi1=shift;
  my $this=shift;
  my ($to,$from,$subject,$message) = @_;
  my $cmd;
  
  open(OUTFILE,"> /tmp/email");
  print OUTFILE "$message";
  
  $this->{logger}->info($message);
  $cmd = "/bin/cat /tmp/email | /usr/bin/sendEmail -t \"".$to."\" -f \"".$from."\" -u '$subject' ";
  $this->{logger}->info($cmd);
  `$cmd`; 
  
  close(OUTFILE);

	return();	
}

#--------------------------------------------------------------------------------------------------
sub GetSystemGlobals($$)
{
  my $thi1=shift;
  my $this=shift;
  
  return(InternalGetSystemGlobals($this));  
}

#--------------------------------------------------------------------------------------------------
sub InternalGetSystemGlobals($)
{
  my $this=shift;
  my $RETURNDATA;
  my $logger = Log::Log4perl->get_logger();
  my $statement ="";
  my $sth;
  my @row;
  
  $statement = "select setting_name,setting_value from tSYSTEM_SETTINGS";
  $this->{logger}->info($statement);
  $sth = $this->{dbh}->prepare("$statement");
  $sth->execute;
  while(@row = $sth->fetchrow_array)
  {
    $RETURNDATA->{$row[0]}=$row[1];
  }
  
  return($RETURNDATA);  
}


#--------------------------------------------------------------------------------------------------
sub GetPlatformGlobals($$$)
{
  my $thi1=shift;
  my $this=shift;
  my ($tAGENCY) = @_;
  
  return(InternalGetPlatformGlobals($this,$tAGENCY));  
}

#--------------------------------------------------------------------------------------------------
sub InternalGetPlatformGlobals($$)
{
  my $this=shift;
  my ($tAGENCY_id) = @_;
  my $RETURNDATA;
  my $logger = Log::Log4perl->get_logger();
  my $statement ="";
  my $sth;
  my @row;

  $statement = "select domain from tAGENCY where id=$tAGENCY_id";
  $this->{logger}->info($statement);
  $sth = $this->{dbh}->prepare("$statement");
  $sth->execute;
  while(@row = $sth->fetchrow_array)
  {
    $RETURNDATA->{"domain"}=$row[0];
  }
  
  $statement = "select (select value from tAGENCY_SETTING_TYPES where id=tAGENCY_SETTING_TYPES_id),value from tAGENCY_SETTINGS where tAGENCY_id=$tAGENCY_id";
  $this->{logger}->info($statement);
  $sth = $this->{dbh}->prepare("$statement");
  $sth->execute;
  while(@row = $sth->fetchrow_array)
  {
    $RETURNDATA->{$row[0]}=$row[1];
  }
  
  return($RETURNDATA);  
}

#--------------------------------------------------------------------------------------------------
sub GetUserGlobals($$$)
{
  my $thi1=shift;
  my $this=shift;
  my ($tUSER_id) = @_;
  
  return(InternalGetUserGlobals($this,$tUSER_id));  
}

#--------------------------------------------------------------------------------------------------
sub InternalGetUserGlobals($$)
{
  my $this=shift;
  my ($tUSER_id) = @_;
  my $RETURNDATA;
  my $logger = Log::Log4perl->get_logger();
  my $statement ="";
  my $sth;
  my @row;

  $statement = "select (select value from tUSER_PROFILE_TYPES where id=tUSER_PROFILE_TYPES_id),value from tUSER_PROFILE where tUSER_id=$tUSER_id";
  $this->{logger}->info($statement);
  $sth = $this->{dbh}->prepare("$statement");
  $sth->execute;
  while(@row = $sth->fetchrow_array)
  {
    $RETURNDATA->{$row[0]}=$row[1];
  }
  
  return($RETURNDATA);  
}



#--------------------------------------------------------------------------------------------------
sub do_api_request($$)
{
  my $this=shift;
  my ($api_url, $api_request) = @_;
  
  my %request;
  my $response;
  my $responseText;
  my $responseHash;
  my $logger=Log::Log4perl->get_logger();
  #$logger->info("do_api_request|$api_url|$api_request");
  
  if(!defined($request{"$api_url"}))
  {
    #$logger->info("do_api_request|new|$api_url|$api_request");
  
    $ua{"$api_url"} = new LWP::UserAgent;

    $cache{"$api_url"} = LWP::ConnCache->new;
    $ua{"$api_url"}->conn_cache( $cache{"$api_url"} );

    $request{"$api_url"} = HTTP::Request->new('GET',"$api_url");
  }

  $request{"$api_url"}->content("$api_request");
  

  $logger->info("$api_url|".$api_request . "");

  $response = $ua{"$api_url"}->request($request{"$api_url"});
  
    $responseText = $response->content;

    $logger->info("".$responseText . "");
  
  if($response->is_success)
  {
    $responseText = $response->content;

    #$logger->info("".$responseText . "");

    eval
    {
     $responseHash = XMLin($responseText,SuppressEmpty => undef);
    };
   
    if($@) { $responseHash = ""; }  
  }
  
  return $responseHash;
}

#--------------------------------------------------------------------------------------------------
sub do_api_request_soap($$$)
{
  my $this=shift;
  my ($api_url, $api_request) = @_;
  
  my %request;
  my $response;
  my $responseText;
  my $responseHash;
  my $logger=Log::Log4perl->get_logger();
  #$logger->info("do_api_request|$api_url|$api_request");
  
  if(!defined($request{"$api_url"}))
  {
    #$logger->info("do_api_request|new|$api_url|$api_request");
  
    $ua{"$api_url"} = new LWP::UserAgent;

#     $ua{"$api_url"}->proxy( ['http'], 'http://192.168.11.10:8080' );
#     $ua{"$api_url"}->proxy( ['https'], 'http://192.168.11.10:8080' );
        
    $cache{"$api_url"} = LWP::ConnCache->new;
    $ua{"$api_url"}->conn_cache( $cache{"$api_url"} );

    my $headers = HTTP::Headers->new('Content-Type' => 'application/soap+xml; charset=utf-8');  
    $request{"$api_url"} = HTTP::Request->new('POST',"$api_url",$headers);
  }

  $request{"$api_url"}->content("$api_request");
  

  $logger->info("$api_url|".$api_request . "");

  $response = $ua{"$api_url"}->request($request{"$api_url"});

  $responseText = $response->content;

  $logger->info("".$responseText . "");
  
  if($response->is_success)
  {
    #$logger->info("".$responseText . "");

    eval
    {
     $responseHash = XMLin($responseText,SuppressEmpty => undef);
    };
   
    if($@) {$logger->info("".$@ . "");  $responseHash = ""; }  
  }
  
  return $responseHash;
}
#--------------------------------------------------------------------------------------------------
sub do_api_request_json($$)
{
  my $this=shift;
  my ($api_url, $api_request) = @_;
  
  my %request;
  my $response;
  my $responseText;
  my $responseHash;
  my $logger=Log::Log4perl->get_logger();
  #$logger->info("do_api_request|$api_url|$api_request");
  
  if(!defined($request{"$api_url"}))
  {
    #$logger->info("do_api_request|new|$api_url|$api_request");
  
    $ua{"$api_url"} = new LWP::UserAgent;
    
    #$ua{"$api_url"}->proxy( ['http'], 'http://192.168.11.10:8080' );
    #$ua{"$api_url"}->proxy( ['https'], 'http://192.168.11.10:8080' );

    $cache{"$api_url"} = LWP::ConnCache->new;
    $ua{"$api_url"}->conn_cache( $cache{"$api_url"} );

    $request{"$api_url"} = HTTP::Request->new('GET',"$api_url");
  }

  $request{"$api_url"}->content("$api_request");
  

  $logger->info("$api_url|".$api_request . "");

  $response = $ua{"$api_url"}->request($request{"$api_url"});
  
    $responseText = $response->content;

    $logger->info("".$responseText . "");
  
  if($response->is_success)
  {
    $responseText = $response->content;

    #$logger->info("".$responseText . "");

    eval
    {
     $responseHash = decode_json($responseText);
    };
   
    if($@) { $responseHash = ""; }  
  }
  
  return $responseHash;
}

#--------------------------------------------------------------------------------------------------
sub do_api_request_json_post($$)
{
  my $this=shift;
  my ($api_url, $api_request) = @_;
  
  my %request;
  my $response;
  my $responseText;
  my $responseHash;
  my $logger=Log::Log4perl->get_logger();
  #$logger->info("do_api_request|$api_url|$api_request");
  
  if(!defined($request{"$api_url"}))
  {
    #$logger->info("do_api_request|new|$api_url|$api_request");
  
    $ua{"$api_url"} = new LWP::UserAgent;
    
    #$ua{"$api_url"}->proxy( ['http'], 'http://192.168.11.10:8080' );
    #$ua{"$api_url"}->proxy( ['https'], 'http://192.168.11.10:8080' );

    $cache{"$api_url"} = LWP::ConnCache->new;
    $ua{"$api_url"}->conn_cache( $cache{"$api_url"} );

#     my $headers = HTTP:Headers('Content-Type' => 'application/x-www-form-urlencoded');  
    $request{"$api_url"} = HTTP::Request->new('POST',"$api_url");
  }

  $request{"$api_url"}->content("$api_request");
  

  $logger->info("$api_url|".$api_request . "");

  
  $response = $ua{"$api_url"}->request($request{"$api_url"});

#   $logger->info("".Dumper($ua{"$api_url"}));
#   $logger->info("".Dumper($request{"$api_url"}));
  
  $responseText = $response->content;

  $logger->info("".$responseText . "");
  
  if($response->is_success)
  {
    $responseText = $response->content;

    #$logger->info("".$responseText . "");

    eval
    {
     $responseHash = decode_json($responseText);
    };
   
    if($@) { $responseHash = ""; }  
  }
  
  return $responseHash;
}



#--------------------------------------------------------------------------------------------------
sub validate_input_field($$$$$)
{
  my $thist=shift;
  #my $logger=Log::Log4perl->get_logger();
  #$logger->info(Dumper(@_));
  my ($this,$field_name, $field_value, $field_type, $field_fk_table) = @_;
  my $statement;
  my $sth;
  my $field_fk_table_db = "";
#   my $logger=Log::Log4perl->get_logger();
#   $logger->info(Dumper($this));
#   $logger->info(Dumper($field_name));
#   $this->{logger}->info("validate_input_field | $field_name, $field_value, $field_type, $field_fk_table");

  if(index($field_fk_table,"::")>-1)
  {
    $field_fk_table_db = substr($field_fk_table,index($field_fk_table,"::")+2).".";
    $field_fk_table = substr($field_fk_table,0,index($field_fk_table,"::"));
  }   
  
  if($field_type eq "EMAIL")
  {
    if(index($field_value,"\@") ==-1)
    {
      return(internal_return_error("Please supply a valid email address format for $field_name (eg xxx\@xxx.xxx)","warn"));
    }
    if(index(substr($field_value,index($field_value,"\@")+1),".")==-1)
    {
      return(internal_return_error("Please supply a valid email address format for $field_name (eg xxx\@xxx.xxx)","warn"));
    }
  }
  elsif($field_type eq "PASSWORD")
  {
    if(length($field_value) < 8)
    {
      return(internal_return_error("Please supply a valid $field_name. Atleast 8 characters long.","warn"));
    }
  }
  elsif($field_type eq "CARD_TYPE")
  {
    if(lc($field_value) ne "visa" && lc($field_value) ne "mastercard")
    {
      return(internal_return_error("Please supply a valid Card Type (Visa/MasterCard)","warn"));
    }  
  }
  elsif($field_type eq "CARD_NUMBER")
  {
    if(length($field_value)<14)
    {
      return(internal_return_error("Please supply a valid Card Number.","warn"));
    }    
  }
  elsif($field_type eq "CARD_OWNER_NAME")
  {
    if(length($field_value)<10)
    {
      return(internal_return_error("Please supply a valid Card Owner Name.","warn"));
    }    
  }
  elsif($field_type eq "CARD_VCS")
  {
    if(length($field_value)!=3)
    {
      return(internal_return_error("Please supply a valid Card VCS.","warn"));
    }    
  }
  elsif($field_type eq "ACCOUNT_BANK")
  {
    if(length($field_value)<4)
    {
      return(internal_return_error("Please supply a valid Bank Name.","warn"));
    }      
  }
  elsif($field_type eq "ACCOUNT_BRANCH")
  {
    if(length($field_value)<4)
    {
      return(internal_return_error("Please supply a valid Branch Code.","warn"));
    }      
  }
  elsif($field_type eq "ACCOUNT_NUMBER")
  {
    if(length($field_value)<10)
    {
      return(internal_return_error("Please supply a valid Account Number.","warn"));
    }      
  }
  elsif($field_type eq "ACCOUNT_TYPE")
  {
    if(lc($field_value) ne "cheque" && lc($field_value) ne "savings")
    {
      return(internal_return_error("Please supply a valid Account Type (cheque/savings)","warn"));
    }    
  }
  elsif($field_type eq "TEXT")
  {
    if(length($field_value) ==0 )
    {
      return(internal_return_error("Please supply a valid $field_name. Atleast 1 characters long.","warn"));
    }
  }
  elsif($field_type eq "MSISDN")
  {
    if(length($field_value) <5 )
    {
      return(internal_return_error("Please supply a valid $field_name. Atleast 5 characters long.","warn"));
    }
    if(substr($field_value,0,1) ne "+")
    {
       return(internal_return_error("Please supply a valid $field_name. Full international format (eg. +27824455664).","warn"));
    }
    if(int(substr($field_value,1)) eq "0")
    {
       return(internal_return_error("Please supply a valid $field_name. Full international format (eg. +27824455664).","warn"));
    }
  }  
  elsif($field_type eq "DATETIME")
  {
    if(length($field_value) !=19 )
    {
      return(internal_return_error("Please supply a valid $field_name. (eg yyyy-mm-dd HH:MM:SS).","warn"));
    }
  }
  elsif($field_type eq "DATE")
  {
    if(length($field_value) !=10 )
    {
      return(internal_return_error("Please supply a valid $field_name. (eg yyyy-mm-dd).","warn"));
    }
  }
  elsif($field_type eq "INT")
  {
    if(int($field_value) ne $field_value)
    {
      return(internal_return_error("Please supply a valid integer $field_name.","warn"));
    }
  }
  elsif($field_type eq "FLOAT")
  {
    if(int($field_value) ==0 )
    {
      return(internal_return_error("Please supply a valid decimal $field_name.","warn"));
    }
  }
  elsif($field_type eq "FILE_EXT")
  {
    if(lc($field_value) eq "png") {}
    elsif(lc($field_value) eq "jpg") {}
    else
    {
      return(internal_return_error("Please supply a valid file extionsion $field_name (eg png/jpg).","warn"));
    }
  }
  elsif($field_type eq "DOMAIN")
  {
    if(index($field_value,".") ==-1)
    {
      return(internal_return_error("Please supply a valid domain format for $field_name (eg xxx.xxx)","warn"));
    }
    if(length($field_value) < 5)
    {
      return(internal_return_error("Please supply a valid domain format for $field_name (eg xxx.xxx)","warn"));
    }
  }  
  elsif($field_type eq "FILEPATH")
  {
    if(index($field_value,"/") ==-1)
    {
      return(internal_return_error("Please supply a valid filepath format for $field_name (eg /xxx/)","warn"));
    }
    if(length($field_value) < 5)
    {
      return(internal_return_error("Please supply a valid filepath format for $field_name (eg /xxx/)","warn"));
    }
  }  
  elsif($field_type eq "BOOL")
  {
    if($field_value ne "0" && $field_value ne "1" )
    {
      return(internal_return_error("Please supply a valid $field_name. (0=No,1=Yes)","warn"));
    }
  }
  elsif($field_type eq "FK")
  {
    if(length($field_value) < 8)
    {
      return(internal_return_error("Please supply a valid value for $field_name.","warn"));
    }
    
    $statement = "select id from $field_fk_table_db$field_fk_table where id=aes_decrypt(0x".$field_value.",'$field_fk_table')";
    $this->{logger}->info("$statement");
    $sth = $this->{dbh}->prepare("$statement");
    $sth->execute;
    if($sth->rows!=1)
    {
      return(internal_return_error("Please supply a valid value for $field_name.","warn"));
    }
  }
  elsif($field_type eq "FKND")
  {
    if(length($field_value) < 8)
    {
      return(internal_return_error("Please supply a valid value for $field_name.","warn"));
    }
    $statement = "select id from $field_fk_table_db$field_fk_table where id=aes_decrypt(0x".$field_value.",'$field_fk_table') and deleted=0";
    $this->{logger}->info("$statement");
    $sth = $this->{dbh}->prepare("$statement");
    $sth->execute;
    if($sth->rows!=1)
    {
      return(internal_return_error("Please supply a valid value for $field_name.","warn"));
    }
  }
  else
  {
    return(internal_return_error("No Validation Written for This field Type $field_type","error"));
  }
  
  return("");
}

#--------------------------------------------------------------------------------------------------
sub execute_and_return_data($$$$$)
{
  my $thist=shift;
  my $this=shift;
  my ($xml,$statement,$main_container,$record_container) = @_;
  my $rxml ="";
  my $sth;
  my @row;
  
#   my $logger=Log::Log4perl->get_logger();
#   $logger->info(Dumper($this));
#   $logger->info(Dumper($xml));
#   $logger->info(Dumper($statement));
#   $logger->info(Dumper($main_container));
#   $logger->info(Dumper($record_container));
  
  $this->{logger}->info("$statement");
  $sth = $this->{dbh}->prepare("$statement");
  $sth->execute;

  my $cols = $sth->{'NUM_OF_FIELDS'};
  
  $rxml .= "<$main_container>";
  while(@row = $sth->fetchrow_array)
  {
    $rxml .= "<$record_container>";
    for(my $x=0;$x<$cols;$x++)
    {
      $rxml .= " <".$sth->{NAME}->[$x].">".internal_xml_friendly($row[$x])."</".$sth->{NAME}->[$x].">\n";
      if(index($sth->{NAME}->[$x],")")>-1) { $this->{logger}->info("Bad Column Name <".$sth->{NAME}->[$x].">"); return("");}
    }
    $rxml .= "</$record_container>";
  }
  $rxml .= "</$main_container>";
  
  return($rxml);
}

#--------------------------------------------------------------------------------------------------
sub return_var_encode($$$)
{
#   my $thist=shift;
  my $this=shift;
  my ($variable,$table_name) = @_;
  my $ret="";
  
  $ret = "hex(aes_encrypt($variable,'$table_name'))";
  
  return($ret);
}

#--------------------------------------------------------------------------------------------------
sub return_var_decode($$$)
{
#   my $thist=shift;
  my $this=shift;
  my ($variable,$table_name) = @_;
  my $ret="";
  
  $ret = "aes_decrypt(0x$variable,'$table_name')";
  
  return($ret);
}

1;
