#//////////////////////////////////////////////////////////////////////////////////////////////////////
# GNULEDGER-SRC
#
#
#
# Copyright (c) 2001-2002 GnuLedger Project
#
#
#/////////////////////////////////////////////////////////////////////////////////////////////////////
# MAIN PROGRAM: Here is the body of the program.
# -------------
#
sub startup {

	%ENV = @_;
        &initenv;
        &doinitcheck;
        &initobj;
        &getvar;
	&dbconnection('connect', 1, $var{'GLBUSR'}, $var{'GLBPASS'}, $var{'DB'});
	&selectmode;


}





#/////////////////////////////////////////// SUBROUTINES //////////////////////////////////////////////
# DBCONNECTION: Manages connections to the databases
# ------------  
#              
sub dbconnection {

	($Command, $Instance, $Db_User, $Db_Pass, $Db) = @_;

	if ($Command eq 'connect'){

		$var{"dbh-$Instance"} = DBI->connect("DBI:$var{'DB_TYPE'}:$Db:$var{'SQL_SERVER'}", 
					              $Db_User, 
					              $Db_Pass) || die $DBI::errstr;
	} 

	elsif ($Command eq 'disconnect') {
		$var{"dbh-$Instance"} -> disconnect;
	}

}

# DOINITCHECK: Checks to make sure that required variables have been setup correctly.
# -----------
#
sub doinitcheck {

	if ($var{'GLBPASS'} eq '')			{push (@Missing, 'Global Password (GLBPASS)');}
	if ($var{'SERVER_NAME'} eq '')			{push (@Missing, 'Server name (SERVER_NAME)');}
	if ($var{'LOCATION'} eq '')			{push (@Missing, 'Script location (LOCATION)');}
	if ($var{'SCRNAME'} eq '')			{push (@Missing, 'Main script name (SCRNAME)');}
	if ($var{'TEMPLATE_DIR'} eq '')			{push (@Missing, 'HTML Template directory (TEMPLATE_DIR)');}
	if ($var{'DB'} eq '')				{push (@Missing, 'Database name (DB)');}	
	if ($var{'DB_TYPE'} eq '')			{push (@Missing, 'Database type [ex. mysql, pg, oracle, etc.] (DB_TYPE)');}	
	if ($var{'GLBUSR'} eq '')			{push (@Missing, 'Global User (GLBUSR)');}	
	if ($var{'CURRENT_VERSION'} eq '')		{push (@Missing, 'GnuLedger Version Number (CURRENT_VERSION)');}	
	if ($var{'SQL_DIR'} eq '')			{push (@Missing, 'SQL Statement directory (SQL_DIR)');}	
	if ($var{'HTTPD_ROOT'} eq '')			{push (@Missing, 'Apache/HTTPD root directory (HTTPD_ROOT)');}	
	if ($var{'HELP_DIR'} eq '')			{push (@Missing, 'GnuLedger help directory (HELP_DIR)');}	
	if (@Missing > 0){
		print "Content-type: text/html\n\n";
		$var{'HTML'} = "$var{'TEMPLATE_DIR'}" . "_altheader.html";
		$var{'TITLE'} = "GnuLedger: Failed initial checks";
		&GL_HTML::PrintHTML;
		for ($i=0; $i<4; $i++){
			print "&nbsp;<br>";
		}	
		print '<font face="Arial" size="3"><b><center>';
		print "GnuLedger $var{'CURRENT_VERSION'} cannot run because the following items need your attention:<p></b>\n";
		print '</center><ul><ul><ul>';
		foreach $Item (@Missing){
			print "<li>$Item";
		}
		print "</ul></ul></ul>\n";
		print "<ul><ul>";
		print "\n<p>To correct this, please edit the GNULEDGER.pm module and modify the required values of %var,<br>\n";
		print " or run the GnuLedger setup utility (./Setup/setup). After you have corrected these problems, please<br>\n";
		print " hit your browser's refresh button.\n";
		print "</center>\n";
		for ($i=0; $i<10; $i++){
			print "&nbsp;<br>";
		}		
	
		$var{'HTML'} = "$var{'TEMPLATE_DIR'}" . "_footer.html";
		&GL_HTML::PrintHTML;
		exit;
	}
}

# INITOBJ: Creates/initalizes our objects/variables that we will be using..
# -------
#
sub initobj {

        &initenv; # Believe it or not, this is here for a reason. Trust me on it.
    
        $var{'CurrencyFormat'} 		= new Number::Format (-thousands_sep => ',',
                                                              -decimal_point => '.',
                                                              -decimal_digits => 2,
                                                              -int_curr_symbol => '$');

        $var{'BalanceFormat'} 		= new Number::Format (-decimal_digits => 2);

	$RetVal 			= &GL_MODULES::act_getmodules;
	@Modules 			= split(/:/, $RetVal);

	foreach $Module (@Modules){
		$var{"$Module"} 	= 'N';
	}

	$RetVal 			= &GL_MODULES::act_getactivemodules;

	@ActiveModules = split(/:/, $RetVal);

	foreach $Module (@ActiveModules){
		$var{"$Module"} 	= 'Y';
	}

	$var{'pane'} 			=  0;
	$var{'LOGINBOX'} 		= "$var{'TEMPLATE_DIR'}" . "_loginbox.html";

        if ($var{'FLASH'} == 1){
		$var{'HEADER'} 		= "$var{'TEMPLATE_DIR'}" . "_header-flash.html";		
	} else {
		$var{'HEADER'} 		= "$var{'TEMPLATE_DIR'}" . "_header.html";
	}

        if ($var{'FLASH'} == 1){
		$var{'ALT_HEADER'} 	= "$var{'TEMPLATE_DIR'}" . "_altheader-flash.html";		
	} else {
		$var{'ALT_HEADER'} 	= "$var{'TEMPLATE_DIR'}" . "_altheader.html";
	}
	
	$var{'CSS_IN'}			= "$var{'TEMPLATE_DIR'}" . "interface.css";
        $var{'FOOTER'} 			= "$var{'TEMPLATE_DIR'}" . "_footer.html";
        $var{'REGLINE'} 		= "$var{'TEMPLATE_DIR'}" . "_registerline.html";
	$var{'MSGBOX'} 			= "$var{'TEMPLATE_DIR'}" . "_clearbox.html";
	$var{'SUMMTABLEHEAD'} 		= "$var{'TEMPLATE_DIR'}" . "_summtablehead.html";
	$var{'SUMMROW'} 		= "$var{'TEMPLATE_DIR'}" . "_summrow.html";
	$var{'SUMMTABLEFOOT'} 		= "$var{'TEMPLATE_DIR'}" . "_summtablefoot.html";
	$var{'BLNKROW'} 		= "$var{'TEMPLATE_DIR'}" . "_blankrow.html";
	$var{'REGISTERTABLEHEAD'} 	= "$var{'TEMPLATE_DIR'}" . "_registertableheader.html";
	$var{'REGISTERTABLEFOOT'} 	= "$var{'TEMPLATE_DIR'}" . "_registertablefooter.html";
	$var{'REGISTER_ROW'} 		= "$var{'TEMPLATE_DIR'}" . "_registerline.html";
	$var{'REGISTER_COMMANDS'}	= "$var{'TEMPLATE_DIR'}" . "_registercommands.html";
	$var{'CREATE_BOX'} 		= "$var{'TEMPLATE_DIR'}" . "_createaccount.html";
	$var{'DELETE_BOX'}		= "$var{'TEMPLATE_DIR'}" . "_deleteacct.html";
	$var{'RETURN_BUTTON'} 		= "$var{'TEMPLATE_DIR'}" . "_returnbutton.html";
	$var{'REGISTER_BUTTON'} 	= "$var{'TEMPLATE_DIR'}" . "_registerbutton.html";
	$var{'ADD_COMMAND'}		= "$var{'TEMPLATE_DIR'}" . "_addcommand.html";
	$var{'ADDTRANSHEAD'}		= "$var{'TEMPLATE_DIR'}" . "_addtranshead.html";
	$var{'ADDTRANSFOOT'} 		= "$var{'TEMPLATE_DIR'}" . "_addtransfoot.html";
	$var{'EDIT_BOX'} 		= "$var{'TEMPLATE_DIR'}" . "_edittrans.html";
	$var{'EDIT_FOOT'}		= "$var{'TEMPLATE_DIR'}" . "_edittransfoot.html";
	$var{'ADM_RETURN'} 		= "$var{'TEMPLATE_DIR'}" . "_admreturnbutton.html";
	$var{'TYPE_BOX'}		= "$var{'TEMPLATE_DIR'}" . "_addtype.html";
	$var{'DELETETYPEBOX'}		= "$var{'TEMPLATE_DIR'}" . "_deletetype.html";
	$var{'SIDE_PANE'}		= "$var{'TEMPLATE_DIR'}" . "_sidepane.html";
	$var{'END_PANE'}		= "$var{'TEMPLATE_DIR'}" . "_endpane.html";
	$var{'DELETECONFIRM_BOX'} 	= "$var{'TEMPLATE_DIR'}" . "_deleteconfirm.html";
	$var{'DATEFIELD'} 		= "$var{'TEMPLATE_DIR'}" . "_datefield.html";
	$var{'SEARCHFIELD'} 		= "$var{'TEMPLATE_DIR'}" . "_searchfield.html";
	$var{'SEARCHTABLEHEAD'} 	= "$var{'TEMPLATE_DIR'}" . "_searchtablehead.html";
	$var{'SEARCHRESULT_ROW'} 	= "$var{'TEMPLATE_DIR'}" . "_searchresultrow.html";
	$var{'ADDUSERBOX'} 		= "$var{'TEMPLATE_DIR'}" . "_adduserbox.html";
	$var{'DELETEUSERBOX'}		= "$var{'TEMPLATE_DIR'}" . "_deleteuserbox.html";
	$var{'DELETEUSERFOOT'}		= "$var{'TEMPLATE_DIR'}" . "_deleteuserfoot.html";
	$var{'IMPORTFROMDB_BOX'}	= "$var{'TEMPLATE_DIR'}" . "_importfromdb.html";
	$var{'IMPORTTABLE_BOX'}		= "$var{'TEMPLATE_DIR'}" . "_importtablelist.html";
	$var{'EXPORT_BOX'}		= "$var{'TEMPLATE_DIR'}" . "_exportbox.html";
	$var{'UPLOAD_BOX'}		= "$var{'TEMPLATE_DIR'}" . "_uploadbox.html";
	$var{'UPLOAD_MANAGER'}		= "$var{'TEMPLATE_DIR'}" . "_uploadmanager.html";
	$var{'PLAIN_FOOTER'}		= "$var{'TEMPLATE_DIR'}" . "_plainfooter.html";
	$var{'ADD_INV'}			= "$var{'TEMPLATE_DIR'}" . "_additem.html";			
	$var{'ADD_VEND'}		= "$var{'TEMPLATE_DIR'}" . "_addvend.html";
	$var{'INVTABLEHEAD'}		= "$var{'TEMPLATE_DIR'}" . "_invtablehead.html";
	$var{'INVTABLEFOOT'}		= "$var{'TEMPLATE_DIR'}" . "_invtablefoot.html";
	$var{'INV_ROW'}			= "$var{'TEMPLATE_DIR'}" . "_invline.html";
}





# GETVAR: Gets the data passed to the program from the form on the webpage. It determines whether the data
# ------  is passed via a GET or POST, then grabs the data.
#
sub getvar {


	if ($ENV{'REQUEST_METHOD'} eq 'POST'){
		my(@pairs,$buffer,$value,$name,$pair);
	        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
       		@pairs = split(/&/, $buffer);
       
     		foreach $pair (@pairs) { 
			my $handled = 0;
              		($name, $value) = split(/=/, $pair);
               		$value =~ tr/+/ /;
               		$value = uri_unescape($value);
               		$value =~ s/\r//g;
               		$value =~ s/\cM/\n/g;
			$value =~ s/%20/_/g;
			if ($name eq 'modules'){
				$var{'modules'} .= "$value:";
				$handled = 1;
			} 
			
			if ($name eq 'transnum'){
				$var{"$name"} .= "$value:";
				$handled = 1;
			}

			if ($name eq 'accountsallowed'){
				$var{'acctsallowed'} .= "$value:";
				$handled = 1;
			}

			if ($name eq 'tbl_list'){
				$var{'tbl_list'} .= "$value:";
				$handled = 1;
			}
			
			if ($handled != 1){
	               		$var{"$name"} = $value;
			}
       		}		
	} 

	
	elsif ($ENV{'REQUEST_METHOD'} eq 'GET') {
	        $WholeString = $ENV{'QUERY_STRING'};
        	@Pairs = split(/&/, $WholeString);
        	foreach $Pair(@Pairs){
               		($Field, $Data) = split(/=/, $Pair);
                	$var{"$Field"} = $Data;
        	}
	}
	if (($var{'user'} eq '') || ($var{'pass'} eq '')){
		($var{'user'}, $var{'pass'}) = split(/:/, &GL_MODE::act_getcookievals, 2);
	}

	$var{'browser'} = $ENV{'HTTP_USER_AGENT'};
}



# SELECTMODE: Selects the function to perform based on information from the web interface.
# ----------
#
sub selectmode {

	$Mode = $var{"mode"};
	
	if ($Mode eq 'addtranbox'){
			&GL_MODE::act_doauth(1);
			if ($var{'ENT'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to add transactions.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;				
			}
			&GL_MODE::disp_addtranbox;
	}

	elsif ($Mode eq 'addtransaction'){

			&GL_MODE::act_doauth(1);

			if ($var{'ENT'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to add transactions.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}

			&GL_FUNC::func_addtransaction;	
			if ($var{'transfer'} ne 'None'){

				$var{'holding'} = $var{'acct'};
				$var{'acct'} = $var{'transfer'};
				$var{'transfer'} = $var{'holding'};
				$var{'mode'} = 'transfertransaction';

				if($var{'dw'} eq 'w'){
					$var{'dw'} = 'd';
				} else {
					$var{'dw'} = 'w';
				}
				&GL_FUNC::func_addtransaction;
				$var{'acct'} = $var{'holding'};
			}
		
	                $var{'MSG'} = "Your transaction has been added.";
			$var{'mode'} = 'register';
        	        &GL_GENERALLEDGER::disp_register($var{'regmode'});
	}

	elsif ($Mode eq 'addtype'){
			&GL_MODE::act_doauth(1);
			if ($var{'ADM'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to add account types.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
			&GL_FUNC::func_addtype;
			$var{'mode'} = 'showsumm';
			&GL_GENERALLEDGER::disp_acct;
	}

	elsif ($Mode eq 'adduser'){

			&GL_MODE::act_doauth(1);
			if ($var{'ADM'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to add users.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}

			&GL_FUNC::func_adduser;
			$var{'mode'} = 'showsumm';
			&GL_GENERALLEDGER::disp_acct;
	}

	elsif ($Mode eq 'adduserbox'){
			&GL_MODE::act_doauth(1);

			if ($var{'ADM'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to add users.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
			&GL_MODE::disp_adduserbox;
	}

	elsif ($Mode eq 'adminscreen'){
			&GL_MODE::act_doauth(1);

			if ($var{'ADM'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to administer this system.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
			&GL_MODE::disp_adminscreen;
	}

	elsif ($Mode eq 'configmodules'){
			&GL_MODE::act_doauth(1);
			if ($var{'ADM'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to configure modules.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
			my @Modules = split (/:/, $var{'modules'});
			open (MODULES, ">./modules");
			foreach my $Module (@Modules){
				print MODULES "$Module\n";
			}
			close(MODULES);
			$var{'mode'} = 'showsumm';
			&GL_GENERALLEDGER::disp_acct;
	}

	elsif ($Mode eq 'configmodulesbox'){
			&GL_MODE::act_doauth(1);
			if ($var{'ADM'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to configure modules.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
			&GL_MODE::disp_configmodulesbox;
	}

	elsif ($Mode eq 'createaccount'){

			&GL_MODE::act_doauth(1);
			if ($var{'ENT'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to create accounts.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}			
			$var{'acct'} =~ s/'/^/gi;
			$var{'acct'} =~ s/-/_/gi;
			$var{'acct'} =~ s/ /_/gi;
			&GL_FUNC::func_createaccount;
			$var{'mode'} = 'showsumm';
			&GL_GENERALLEDGER::disp_acct;
	}

	elsif ($Mode eq 'createbox') {
			&GL_MODE::act_doauth(1);
			if ($var{'ENT'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to create accounts.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
			&GL_MODE::disp_createbox;
	}

	elsif ($Mode eq 'deleteaccount'){
			&GL_MODE::act_doauth(1);
			&GL_FUNC::func_deleteaccount;
			$var{'mode'} = 'showsumm';
			&GL_GENERALLEDGER::disp_acct;
	}

	elsif ($Mode eq 'deletebox') {
			&GL_MODE::act_doauth(1);
			if ($var{'REM'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to delete accounts.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
			&GL_MODE::disp_deletebox;
	}

	elsif ($Mode eq 'deletetransaction'){
			&GL_MODE::act_doauth(1);
			$var{'mode'} = 'register';
			$var{'description'} =~ s/'/^/gi;
			$var{'tacct'} = $var{'acct'};
			$var{'tacct'} =~ s/_/ /gi;
		
			$var{'ttransfer'} = $var{'transfer'};
			$var{'ttransfer'} =~ s/_/ /gi;
			if (($var{'transfer'} eq 'None') && ($var{'sure'} eq 'YES')){
				&GL_FUNC::func_deletetransaction;
				$var{'MSG'} = 'Successfully deleted transaction from ' . $var{'tacct'} . ".";
				$var{'mode'} = 'register';
				&GL_GENERALLEDGER::disp_register($var{'regmode'});
			} 
			elsif (($var{'transfer'} eq 'None') && ($var{'sure'} eq 'NO')){
				$var{'MSG'} = 'Cancelled deletion!';
				$var{'mode'} = 'register';
				&GL_GENERALLEDGER::disp_register($var{'regmode'});
			}

			if (($var{'transfer'} ne 'None') && ($var{'sure'} eq 'YES')){
				&GL_FUNC::func_deletetransaction;
				$var{'holding'} = $var{'acct'};
				$var{'acct'} = $var{'transfer'};
				&GL_FUNC::func_deletetransaction;
				$var{'acct'} = $var{'holding'};
				$var{'MSG'} = 'Successfully deleted transaction from ' . $var{'tacct'} . ' and ' . $var{'ttransfer'} . ".";
				$var{'mode'} = 'register';
				&GL_GENERALLEDGER::disp_register($var{'regmode'});
			} 
			elsif (($var{'transfer'} ne 'None') && ($var{'sure'} eq 'NO')) {
				$var{'MSG'} = "Cancelled deletion!";
				$var{'mode'} = 'register';
				&GL_GENERALLEDGER::disp_register($var{'regmode'});
			}
	}


	elsif ($Mode eq 'deletetransconfirm'){
			&GL_MODE::act_doauth(1);
			if ($var{'REM'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to delete transactions.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
			&GL_MODE::disp_deleteconfirm;
	}


	elsif ($Mode eq 'deletetype'){
			&GL_MODE::act_doauth(1);
			if ($var{'ADM'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to delete account types.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
			&GL_FUNC::func_deletetype;
			$var{'mode'} = 'showsumm';
			&GL_GENERALLEDGER::disp_acct;
	}


	elsif ($Mode eq 'deletetypebox'){
			&GL_MODE::act_doauth(1);

			if ($var{'ADM'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to delete account types.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
			&GL_MODE::disp_deletetypebox;
	}


	elsif ($Mode eq 'deleteuser'){
			&GL_MODE::act_doauth(1);
			if ($var{'ADM'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to delete users.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}

			if (($var{'sure'} ne 'Y') || ($var{'deluser'} eq 'none')){
				$var{'MSG'} = 'Deletion cancelled!';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
		
			$var{'SQL_STAT'} = 'deleteuser';
			$Query = &GL_FUNC::func_getsqlstat;
			$Cursor = $var{'dbh-1'} -> prepare($Query);
			$Cursor -> execute;
			$Cursor -> finish;
			$var{'MSG'} = "Successfully deleted user $var{'deluser'}";
			$var{'mode'} = 'showsumm';
			&GL_GENERALLEDGER::disp_acct;
			
	}

	elsif ($Mode eq 'deleteuserbox'){
			&GL_MODE::act_doauth(1);

			if ($var{'ADM'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to delete users.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
			
			&GL_MODE::disp_deleteuserbox;
	}


	elsif ($Mode eq 'download'){
		print "Content-type: application/x-gtar\n";
		print "Location: http://$var{'SERVER_NAME'}/$var{'file'}\n\n";
	}

	elsif ($Mode eq 'editbox') {
	        	$var{'description'} =~ tr/+/ /;    
        		$var{'description'} =~ s/%2C/,/;
        		$var{'description'} =~ s/%24c/\$/;
        		$var{'description'} =~ s/%26/\&/;
        		$var{'description'} =~ s/%2F/\//;
        		$var{'description'} =~ s/%27/^/;
        		$var{'description'} =~ s/%20/ /gi;
			&GL_MODE::act_doauth(1);
			if ($var{'EDT'} ne 'Y'){
				$var{'MSG'} = 'You do not have permission to edit transactions.';
				$var{'mode'} = 'showsumm';
				&GL_GENERALLEDGER::disp_acct;
			}
			&GL_MODE::disp_editbox;
	}


	elsif ($Mode eq 'edittransaction'){
			&GL_MODE::act_doauth(1);
			if ($var{'EDT'} ne 'Y'){
				$var{'mode'} = 'showsumm';
				$var{'MSG'} = 'You do not have permission to edit transactions.';
				&GL_GENERALLEDGER::showsumm;
			}
			&GL_FUNC::func_edittransaction;			
			$var{'mode'} = 'register';
			&GL_GENERALLEDGER::disp_register($var{'regmode'});
	}

	elsif ($Mode eq 'exportdbbox'){
			&GL_MODE::act_doauth(1);
			if ($var{'EDT'} ne 'Y'){
				$var{'mode'} = 'showsumm';
				$var{'MSG'} = 'You do not have permission to export accounts.';
				&GL_GENERALLEDGER::showsumm;
			}	
			
			&GL_MODE::disp_exportbox;
	}

	elsif ($Mode eq 'exporttables'){
			&GL_MODE::act_doauth(1);
			if ($var{'EDT'} ne 'Y'){
				$var{'mode'} = 'showsumm';
				$var{'MSG'} = 'You do not have permission to export accounts.';
				&GL_GENERALLEDGER::showsumm;
			}	
			&GL_FUNC::func_export;
			$var{'mode'} = 'showsumm';
			&GL_GENERALLEDGER::disp_acct;
	}		

	elsif ($Mode eq 'glclean'){
			&GL_MODE::act_doauth(1);
			if ($var{'ADM'} ne 'Y'){
				$var{'mode'} = 'showsumm';
				$var{'MSG'} = 'You do not have permission to clean the system directory.';
				&GL_GENERALLEDGER::showsumm;
			}	
			system ("rm -rf Working/*.upl Working/*.note Working/*.qif Working/*.csv Working/*.txt Working/*.tds");
			system ("rm -rf $var{'HTTPD_ROOT'}/Working/*");
			$var{'MSG'} = "Successfully cleaned the system directory.";
			$var{'mode'} = 'showsumm';	
			&GL_GENERALLEDGER::disp_acct;
	}				


	elsif ($Mode eq 'helparea'){
			&GL_MODE::act_doauth(1);
			&GL_MODE::disp_helparea;
	}


	elsif ($Mode eq 'helpsys') {
			&GL_MODE::act_doauth(1);
			&GL_HELP::disp_help;
	}

	elsif ($Mode eq 'importdbbox'){
			&GL_MODE::act_doauth(1);
			if ($var{'ADM'} ne 'Y'){
				$var{'mode'} = 'showsumm';
				$var{'MSG'} = 'You do not have permission to import tables';
				&GL_GENERALLEDGER::disp_acct;
			}
			&GL_MODE::disp_importdbbox;
	}

	elsif ($Mode eq 'importfrommanager'){
			&GL_MODE::act_doauth(1);
			if ($var{'ADM'} ne 'Y'){
				$var{'mode'} = 'showsumm';
				$var{'MSG'} = 'You do not have permission to import tables';
				&GL_GENERALLEDGER::disp_acct;
			}
			
			&GL_FUNC::func_importfrommanager;

	}

	elsif ($Mode eq 'importshowtables'){

			&GL_MODE::act_doauth(1);
			if ($var{'ADM'} ne 'Y'){
				$var{'mode'} = 'showsumm';
				$var{'MSG'} = 'You do not have permission to import tables';
				&GL_GENERALLEDGER::disp_acct;
			}
			if ($var{'import_file'} eq 'void'){
				&GL_MODE::disp_tablebox;
			} else {
				&GL_MODE::disp_uploadbox;
			}
	}

	elsif ($Mode eq 'importtables'){
			&GL_MODE::act_doauth(1);
     		if ($var{'ADM'} ne 'Y'){
				$var{'mode'} = 'showsumm';
				$var{'MSG'} = 'You do not have permission to import tables';
				&GL_GENERALLEDGER::disp_acct;
			}
			
			&GL_FUNC::func_import;
			$var{'mode'} = 'showsumm';
			$var{'MSG'} = 'Table(s) were imported successfully.';
			&GL_GENERALLEDGER::disp_acct;	
	}

	elsif ($Mode eq 'inventory'){
			
			# This will disconnect and kick us into the inventory module
			# per the method developed in GL_XML.
			&GL_MODE::act_doauth(1); 
			&dbconnection('disconnect', 1);
			&GL_INVENTORY::load_subsystem;
	}


	elsif ($Mode eq 'login') {
			&GL_MODE::act_doauth(0);
			$var{'mode'} = 'showsumm';
			&GL_GENERALLEDGER::disp_acct;
	} 


	elsif ($Mode eq 'logout'){
		
		print "Set-Cookie: gnuledgerpass=; expires=Sat Aug 14 09:36:27 GMT 1900\n";
		print "Set-Cookie: gnuledgeruser=; expires=Sat Aug 14 09:36:27 GMT 1900\n";
		$var{'TITLE'} = "GnuLedger: Logout";
		print "Content-type: text/html\n\n";

		$var{'HTML'} = $var{'ALT_HEADER'};
		&GL_HTML::PrintHTML;

		for ($i=0; $i<4; $i++){
			print "&nbsp;<br>";
		}

		print "<font face=\"Arial\" size=3>You have been successfully logged out.<br>\n
			Click <a href=\"$var{'FULL_PATH'}?mode=\">here</a> to log back in.<br>";
		for ($i=0; $i<12; $i++){
			print "&nbsp;<br>";
		}

		&GL_MODE::disp_footer;
	}


	elsif ($Mode eq 'reconcile'){
		&GL_MODE::act_doauth(1);
		@Trans = split(/:/, $var{'transnum'});
		@Ref_Trans = split(/:/, $var{'transnumlist'});
		
		foreach $Trans (@Trans){

			$var{'dorec'} = 1;
			$var{'transnum'} = $Trans;			
			&GL_FUNC::func_reconcile;
		}

		foreach $Ref_Trans (@Ref_Trans){
			
			$var{'dorec'} = 0;
			foreach $Trans (@Trans){

				if ($Ref_Trans eq $Trans){
					$var{'dorec'} = 1;
				}
			}

			$var{'transnum'} = $Ref_Trans;			
			&GL_FUNC::func_reconcile;
		}

		$var{'mode'} = 'register';
		&GL_GENERALLEDGER::disp_register($var{'regmode'});
	}


	elsif ($Mode eq 'regisbydate'){

		$var{'date1'} = "$var{'yr'}-$var{'mo'}-$var{'dy'}";
		$var{'date2'} = "$var{'yr2'}-$var{'mo2'}-$var{'dy2'}";
		$var{'regmode'} = 0;
		&GL_MODE::act_setprefs;
		&GL_MODE::act_doauth(1);	

		$var{'tacct'} = $var{'acct'};
		$var{'tacct'} =~ s/_/ /gi;
		$var{'date1'} = "$var{'yr'}-$var{'mo'}-$var{'dy'}";
		$var{'date2'} = "$var{'yr2'}-$var{'mo2'}-$var{'dy2'}";
		$var{'MSG'} = "Displaying register for $var{'tacct'} between $var{'date1'} and $var{'date2'}";
		$var{'regmode'} = 0;	
		$var{'mode'} = 'register';
		&GL_GENERALLEDGER::disp_register(0);	
	}

	
	elsif ($Mode eq 'register'){
		&GL_MODE::act_doauth(1);	

		$var{'tacct'} = $var{'acct'};
		$var{'tacct'} =~ s/_/ /gi;
		$var{'MSG'} = "Displaying register for $var{'tacct'}.";
		&GL_GENERALLEDGER::disp_register($var{'regmode'});
	}

	elsif ($Mode eq 'reports'){
		&GL_MODE::act_doauth(1);
		&GL_REPORTS::rep_balancesheet;
	}

	elsif ($Mode eq 'resetregister'){
		$var{'regmode'} = 1;
		&GL_MODE::act_setprefs;
		&GL_MODE::act_doauth(1);

                $var{'tacct'} = $var{'acct'};
                $var{'tacct'} =~ s/_/ /gi;
                $var{'MSG'} = "Displaying all transactions for $var{'tacct'}";
		$var{'regmode'} = 1;
		$var{'mode'} = 'register';
                &GL_GENERALLEDGER::disp_register(1);
	}


	elsif ($Mode eq 'resetviewbyreconcile'){
		if (($var{'date1'} ne '') && ($var{'date2'} ne '')){
			$var{'regmode'} = 0;
			&GL_MODE::act_setprefs;
			&GL_MODE::act_doauth(1);
			$var{'regmode'} = 0;
			$var{'mode'} = 'register';
			&GL_GENERALLEDGER::disp_register($var{'regmode'});
		} else {
			$var{'regmode'} = 1;
			&GL_MODE::act_setprefs;
			&GL_MODE::act_doauth(1);
			$var{'regmode'} = 1;
			$var{'mode'} = 'register';
			&GL_GENERALLEDGER::disp_register($var{'regmode'});
		}
	}


	elsif ($Mode eq 'search'){
		&GL_MODE::act_doauth(1);
		$var{'searchstring'} .= "%";
		&GL_MODE::disp_searchresults;
	}


	elsif ($Mode eq 'showsumm'){
		&GL_MODE::act_doauth(1);
		&GL_GENERALLEDGER::disp_acct;
	}


	elsif ($Mode eq 'typebox'){
		&GL_MODE::act_doauth(1);
		if ($var{'ADM'} ne 'Y'){
			$var{'MSG'} = 'You do not have permission to add account types.';
			$var{'mode'} = 'showsumm';
			&GL_GENERALLEDGER::disp_acct;
		}

		&GL_MODE::disp_typebox;
	}


	elsif ($Mode eq 'updatedisplay'){

		$var{'showdisplay'} = $var{'val'};
		&GL_MODE::act_setprefs;
		&GL_MODE::act_doauth(1);
		$var{'showdisplay'} = $var{'val'};
		$var{'mode'} = 'register';
		&GL_GENERALLEDGER::disp_register($var{'regmode'});
	}


	elsif ($Mode eq 'updatesearch'){

		$var{'showsearch'} = $var{'val'};

		&GL_MODE::act_setprefs;
		&GL_MODE::act_doauth(1);
		$var{'showsearch'} = $var{'val'};
		if (($var{'origmode'} eq 'showsumm') || ($var{'origmode'} eq 'login') || ($var{'origmode'} eq 'search')){
			$var{'mode'} = 'showsumm';
			&GL_GENERALLEDGER::disp_acct;
		}	

		elsif (($var{'origmode'} eq 'register') || ($var{'origmode'} eq 'edittransaction')){
			$var{'mode'} = 'register';
			&GL_GENERALLEDGER::disp_register($var{'regmode'});
		}
	}

	elsif ($Mode eq 'uploadmanager'){
		&GL_MODE::act_doauth(1);
		if ($var{'ADM'} ne 'Y'){
			$var{'MSG'} = 'You do not have permission to import accounts.';
			$var{'mode'} = 'showsumm';
			&GL_GENERALLEDGER::disp_acct;
		}

		&GL_MODE::disp_uploadmanager;
	}

	elsif ($Mode eq 'viewbyreconcile'){
		
		$var{'regmode'} = 2;
		&GL_MODE::act_setprefs;
		&GL_MODE::act_doauth(1);
		$var{'regmode'} = 2;
		$var{'mode'} = 'register';
		&GL_GENERALLEDGER::disp_register($var{'regmode'});
	}

	elsif ($Mode eq 'wap'){

		# Move control from GNULEDGER.pm into GL_WAP.pm

		&dbconnection('disconnect', 1);
		&GL_WAP::load_subsystem;
	}

	elsif ($Mode eq 'xmlsys'){

		# This will kick us out of the regular GnuLedger and into the XML subsystem.
		# XML support is on a list of things to do.
		&dbconnection ('disconnect', 1);
		&GL_XML::xml_loadsys (%var);
	}

	elsif ($Mode eq '') {

		$ckexists = &GL_MODE::act_chkcookie;
		if ($ckexists == 1) {
			&GL_MODE::act_doauth(1);
			&GL_GENERALLEDGER::disp_acct;
		} else {
			&GL_HTML::ContentHeader;
			&GL_MODE::disp_loginbox;
		}

	}

# Uncomment this to turn Debug on:
#	&GL_HTML::DebugVar;
	&dbconnection ('disconnect', 1);
	exit;
}



# URI_UNESCAPE: Takes out/translates the "garbage" in a POST... 
# ------------
#
sub uri_unescape {

        my($code) = $_[0];
        $code =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        return $code;
        
}
