#!/usr/local/bin/perl -w -I./
#***********************************************************************
#                                                                       
#   Confidential Trade Secret.                                          
#   Copyright (c) 2001 Paul Rubin, Roswell, GA                          
#   as an unpublished work.  All rights reserved.                       
#                                                                       
#   This program is owned by Paul Rubin and                             
#   contains information that is a confidential trade secret            
#   to the company.                                                     
#                                                                       
# **********************************************************************
#              
#     Program: FlexSearch.pl $Id: //depot/Inetpub/wwwroot/cgi-bin/FlexSearch.pl#3 $
#              
#     Written: Thursday July 31, 1997
#             
#     Purpose: This program maintains and searches databases and merges
#              selected records with html output pages
#              
#       Notes: 
#              
# Last Update: $Change: 13 $ $Revision: #3 $ $DateTime: 2002/02/15 07:08:49 $ $Author: Paul $ 
#
#==========================================================================

use strict;
use FlexConfig;
use FlexData;
use FlexDefTmpl;
use FlexTemplate;

$MAIN::SessionFile = "FlexSearch.log";
$MAIN::UsersFile = "Users.dat";
#    <expiration time[10]>\t<user[16]>\t<ip address[15]>\t<login time[24]> [69/70]
$MAIN::SessionSize = 69 + $MAIN::CRLF;

#==========================================================================
# Initialize cgi resources
#==========================================================================

$|=1;

use CGI qw(:all);
use CGI::Carp qw(fatalsToBrowser confess carp croak);
import_names('cgi');

print header(
#         -nph=>1,
         -status=>"200 Ok",
         -type=>"text/html"
      );


ReadConfig();

#==========================================================================
# Data Base Search Procedure
#==========================================================================


#==========================================================================
# SearchOperation
#==========================================================================
# 
# Purpose:    This is the procedure that process the search operation
#             
# Algorithm:  while search fields
#                if range not empty
#                   replace low and high with range 
#                if low or high and low != any
#                   while low contains items
#                      lookup records and add to list
#                   merge records to master list
#                if result contains data save to holder
#             if result empty and softsearch
#                restore last partial result (holder)
#             if result empty 
#                output no record template
#             if result one record
#                output single record template
#             else 
#                output multi record template
#
# Notes:      Add ability to do suppress or other on 'softsearch' necessary
#
# Format:     SearchOperation();
#             
#--------------------------------------------------------------------------
sub SearchOperation
{
   push(@MAIN::CallStack, "SearchOperation");
   my $session = shift;
   my @reclist;
   my $template;
   my $datafile = param("DataFile");

   if (!defined($datafile))
   {
      AdminError( "SearchOperation", "No DataFile Specified");
   }

	my ($searchData, $searchString) = buildSearchData();

   Search($datafile, $searchData, \@reclist, param("SoftSearch"));

   # if result list empty
   if ($#reclist == -1)

   {
      # output no record page
      if ((($template = param("NoRecordTemplate")) eq "Default") || !defined($template))
         { print DefaultNoRecordPage(); }
      else
         { print ReadTemplate($template); }
   }
   else
   {
      # if one record in list
      if ($#reclist == 0)
      {
         # load single record template
         if ((($template = param("SingleRecordTemplate")) eq "Default") || !defined($template))
            { $template = DefaultSingleTemplate($datafile, $session); }
         else
            { $template = ReadTemplate($template); }
      }
      else
      {
         # load multi record template
         if ((($template = param("MultiRecordTemplate")) eq "Default") || !defined($template))
            { $template = DefaultMultiTemplate($datafile, $session); }
         else
            { $template = ReadTemplate($template); }
      }

      # process template
      print HTMLTemplateProcess($template, $datafile, \@reclist, $session, $searchString);

   }

   print end_html();
   pop(@MAIN::CallStack);
   exit 0;

}


#==========================================================================
# NoRequestTest
#==========================================================================
# 
# Purpose:    This tests the need for and executes the administrative
#             login
#             
# Algorithm:  when a script is executed directly, the request mode is
#             get, but there is no query_string, and there are no argv's
#             
#--------------------------------------------------------------------------

sub NoRequestTest
{
   if ($ENV{"REQUEST_METHOD"} eq "GET" && $ENV{"QUERY_STRING"} eq '' &&
         $#ARGV == -1 )
   {
      my $link;

      $link = url();
      #remove commands
      $link =~ s/\?.+//;
      $link =~ s/FlexSearch/FlexAdmin/i;

      #if we get here we need to execute the login.
      print start_html("FlexSearch NO REQUEST MADE");

      $link =~ /(FlexAdmin\..+)$/;
      if (-e $1) 
         { print "<br><br><hr><a href=\"$link\">Administrative Login</a><hr>\n" };

      print "For information about flex products, click the icon below\n";
      print TagLine();
      print end_html();
      exit 0;
   }
}


#==========================================================================
# OperationMode
#==========================================================================
# 
# Purpose:    Check the operation parameter and determine what action to 
#             take,  the give priority to the most common options
#             
#--------------------------------------------------------------------------

sub OperationMode
{
   push(@MAIN::CallStack, "OperationMode");
   my $command = param("Operation");
   my $session = param("Session");
   my $user;
   my %user_record;
   my @list1;
   my $URL;
   my $rec;
   my $level;
   my $backlink;

   #print dump();

   $URL = $ENV{"HTTP_REFERER"};
   $URL =~ s/http:\/\///;
   $URL = substr($URL, 0, index($URL, "/"));

   if (index($MAIN::Config{"BaseURL"}, $URL) < 0)
   {
		#double check the page (SSI pages linked from external sources)
	   $URL = $ENV{"SCRIPT_URI"};
	   $URL =~ s/http:\/\///;
	   $URL = substr($URL, 0, index($URL, "/"));
	   if (index($MAIN::Config{"BaseURL"}, $URL) < 0) {
#print EnvDump();
#print dump();
	      AdminError("FlexSearch", "Invalid Referrer");
		}
   }
   if ($command eq "Search")
   {
      SearchOperation();
   }
   elsif ($command eq "Login")
   {
      AuthorizeLogin();
   }
   elsif ($command eq "SendMail")
   {
      SendMail($session);
   }
   elsif ($command eq "TemplateProcess")
   {
      @list1 = param("Record_Number");
      print HTMLTemplateProcess(ReadTemplate(param("TemplateFile")), param("DataFile"), \@list1);
      print end_html();
      exit 0;
   }
   elsif ($command eq "FormMerge")
   {
      print FormMerge(ReadTemplate(param("TemplateFile")), $session);
      print end_html();
      exit 0;
   }
   # Secure Functions
   elsif ($session)
   {
      ($session, $user) = SessionManage($session);
      if ($session == 0)
      {
         #session is expired
         print start_html("FlexSearch Login");
         print "<Center>Your Login has been timed out by the server, Please Re-enter</center></p>";
         print LoginForm($user, param("Password"));
         print TagLine();
         print end_html();
         exit 0;
      }
      $URL = self_url();
      $URL =~ s/http:\/\///;
      $URL = substr($URL, 0, index($URL, "/"));

      # find the user in the user file
      ($rec) = IndexLookup($MAIN::UsersFile, 'User', $user, "" , ".");
      ReadRecordHash (\%user_record, $MAIN::UsersFile, $rec, ".");

      if ($command eq "ConfigEdit")
      {
         ConfigEdit($session, $user_record{'Level'});
      }

      if (index($MAIN::Config{"BaseURL"}, $URL) < 0)
      {

#print "\n base: " . $MAIN::Config{"BaseURL"} . "<br>";
#print "\n URL: $URL<br>";

         param("Message", "Invalid Refering URL License Invalid");
         print ConfigEditForm(1, $session, $user_record{'Level'});
         exit 0;
      }

      if ($MAIN::Config{"LicenseExp"} < time())
      {
         param("Message", "License Expired");
         print ConfigEditForm($session, 0, $user_record{'Level'});
         exit 0;
      }

      if (($MAIN::Config{"LicenseExp"} - time()) < 2678400)
      {
         param ("Message", "Your License Expires in less than 30 days!");
      }
   
      if ($command eq "MainMenu")
      {
         print MainMenu($session, $user_record{'Level'});
         print end_html();
         exit 0;
      }

      if ($command eq "DatabaseMenu")
      {
         print DatabaseMenu($session, $user_record{'Level'});
         print end_html();
         exit 0;
      }

         #database specific operations
         elsif ($command eq "DefaultSearchForm")
         {
            DefaultSearchForm(param("DataFile"));
         }
         elsif ($command eq "SearchEditForm")
         {
            DefaultSearchForm(param("DataFile"), $session);
         }
         elsif ($command eq "DefaultSingleTemplate")
         {
            print DefaultSingleTemplate(param("DataFile"));
            print end_html();
            exit 0;
         }
         elsif ($command eq "DefaultMultiTemplate")
         {
            print DefaultMultiTemplate(param("DataFile"));
            print end_html();
            exit 0;
         }
         elsif ($command eq "DefaultEditTemplate")
         {
            print DefaultSingleTemplate(param("DataFile"), $session);
            print end_html();
            exit 0;
         }
         elsif ($command eq "DefaultRecordManagerTemplate")
         {
            print DefaultMultiTemplate(param("DataFile"), $session);
            print end_html();
            exit 0;
         }
         if ($command eq "EditSearch")
         {
            SearchOperation($session);
         }
         if ($command eq "Edit")
         {
            EditRecord($session, $user_record{'Level'});
            if ($backlink = param("BackLink")) 
            {
               ProcessBacklink($backlink, "Record Updated Successfully");
            }
            else 
            {
               # no back link return to database menu
               print DatabaseMenu($session, $level);
            }

            exit 0;

         }
         if ($command eq "DeleteDataRecord")
         {
            DeleteDataRecord($session, $user_record{'Level'});
            if ($backlink = param("BackLink")) 
            {
               ProcessBacklink($backlink, "Record Deleted<br>DataFile Reindexed");
            }
            else 
            {
               # no back link return to database menu
               print DatabaseMenu($session, $level);
            }

            exit 0;

         }
         elsif ($command eq "AddDataRecord")
         {
            $list1[0] = -1;
            print HTMLTemplateProcess(DefaultSingleTemplate(param("DataFile"), $session),
               param("DataFile"), \@list1, $session);
            print end_html();
            exit 0;
         }
         elsif ($command eq "EditFieldNames")
         {
            $list1[0] = 0;
            print HTMLTemplateProcess(DefaultSingleTemplate(param("DataFile"), $session),
               param("DataFile"), \@list1, $session);
            print end_html();
            exit 0;
         }
         elsif ($command eq "EditFileConfig")
         {

         }
         elsif ($command eq "DeleteDataFile")
         {
            DeleteDataFile($session, $user_record{'Level'});
            print DatabaseMenu($session, $level);
            exit 0;
         }
         elsif ($command eq "RepairDataFile")
         {
            RepairDataFile($session, $user_record{'Level'});
            print DatabaseMenu($session, $level);
            exit 0;
         }

         # General database operations
         elsif ($command eq "UploadDataForm")
         {
            UploadDataForm($session, $user_record{'Level'});
         }
         elsif ($command eq "UploadDataFile")
         {
            UploadDataFile($session, $user_record{'Level'});
            print DatabaseMenu($session, $level);
            exit 0;
         }
         elsif ($command eq "CreateDataForm")
         {

         }
         elsif ($command eq "CreateDataFile")
         {

         }

      elsif (($command eq "TemplateMenu"))
      {
         print TemplateMenu($session, $user_record{'Level'});
         print end_html();
         exit 0;
      }
         # template specific
         elsif ($command eq "ViewTemplate")
         {
            print ReadTemplate(param("TemplateFile"));
            exit 0;
         }
         elsif ($command eq "EditTemplateForm")
         {
            EditTemplateForm($session, $user_record{'Level'});
         }
         elsif ($command eq "EditTemplateFile")
         {
            EditTemplateFile($session, $user_record{'Level'});
            print TemplateMenu($session, $level);
            exit 0
         }
         elsif ($command eq "DeleteTemplate")
         {
            DeleteTemplate($session, $user_record{'Level'});
            print TemplateMenu($session, $level);
            exit 0;
         }

         #general Template
         elsif ($command eq "UploadTemplateForm")
         {
            UploadTemplateForm($session, $user_record{'Level'});
         }
         elsif ($command eq "UploadTemplateFile")
         {
            UploadTemplateFile($session, $user_record{'Level'});
         }
         elsif ($command eq "CreateTemplateForm")
         {
            EditTemplateForm($session, $user_record{'Level'});
         }

      elsif (($command eq "StaticPageMenu"))
      {
         print StaticPageMenu($session, $user_record{'Level'});
         print end_html();
         exit 0;
      }
         # StaticPage specific
         elsif ($command eq "EditStaticPageForm")
         {
            EditStaticPageForm($session, $user_record{'Level'});
         }
         elsif ($command eq "EditStaticPageFile")
         {
            EditStaticPageFile($session, $user_record{'Level'});
            print StaticPageMenu($session, $level);
            exit 0
         }
         elsif ($command eq "DeleteStaticPage")
         {
            DeleteStaticPage($session, $user_record{'Level'});
            print StaticPageMenu($session, $level);
            exit 0;
         }

         #general StaticPage
         elsif ($command eq "UploadStaticPageForm")
         {
            UploadStaticPageForm($session, $user_record{'Level'});
            print StaticPageMenu($session, $level);
            exit 0;
         }
         elsif ($command eq "UploadStaticPage")
         {
            UploadStaticPage($session, $user_record{'Level'});
         }
         elsif ($command eq "CreateStaticPageForm")
         {
            EditStaticPageForm($session, $user_record{'Level'});
         }

      elsif (($command eq "ImageMenu"))
      {
         print ImageMenu($session, $user_record{'Level'});
         print end_html();
         exit 0;
      }
         # Image specific
         elsif ($command eq "DeleteImage")
         {
            DeleteImage($session, $user_record{'Level'});
            print ImageMenu($session, $level);
            exit 0;
         }
         elsif ($command eq "UploadImageForm")
         {
            UploadImageForm($session, $user_record{'Level'});
         }
         elsif ($command eq "UploadImage")
         {
            UploadImage($session, $user_record{'Level'});
            print ImageMenu($session, $level);
            exit 0;
         }

      elsif ($command eq "UserEditTable" )
      {
         print UserEditTable($session, $user_record{'Level'});
         exit 0;
      }
      elsif ($command eq "UserEditForm" )
      {
         print UserEditForm($session, $user_record{'Level'});
         exit 0;
      }
      elsif ($command eq "UserEdit" )
      {
         UserEdit($session, $user_record{'Level'});
         exit 0;
      }
      elsif ($command eq "DeleteUser" )
      {
         DeleteUser($session, $user_record{'Level'});
      }

      elsif ($command eq "ConfigEditForm" )
      {
         print ConfigEditForm($session, 0, $user_record{'Level'});
         exit 0;
      }
   }
   else 
   {
      print start_html("FlexSearch Operation Failed");
      print "\n<h1>FlexSearch Operation Failed</h1>";
      print h1("Operation \"$command\" is unknown");
   }

}



#==========================================================================
# open window script
#==========================================================================
# 
# Purpose:    Just a copy from elseware
#             
#--------------------------------------------------------------------------
#<SCRIPT>
#window.open("remotind.htm","newwindow","toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,width=290,height=370");
#</SCRIPT>

#start the CGI reply

if ($ENV{"CONTENT_LENGTH"} > 20000) { $MAIN::ShowStatus = 1 }

#print start_html();
#print "\ncontent_length:" . param("CONTENT_LENGTH") . "| > 20000:" . (param("CONTENT_LENGTH") > 20000) . "|<br>";

#AdminTest();
NoRequestTest();

#print EnvDump();


OperationMode();

#if we get here the operation did not complete


print EnvDump();

print dump();

print end_html();


__END__



=head1 NAME

FlexSearch - provide framework User generated Database Searches

=head1 SYNOPSIS

   FlexSearch.pl

=head1 DESCRIPTION

This programs supports...

=head1 COPYRIGHT


Copyright (c) 1997 Paul Rubin, Roswell, GA.    
as an unpublished work.  All rights reserved.  

Do not copy or redistribute this in source or compiled 
form with out express written permission from the 
Author.  For Additional Information contact (Paul@Rubin.net)


=cut
