/************** AMICHECK main driver ****************/

/* Include everything */
#define INTUI_V36_NAMES_ONLY
#include <dos.h>  /* let us use the WBarg stuff */
#include <stdio.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <intuition/gadgetclass.h>
#include <clib/intuition_protos.h>
#include <clib/graphics_protos.h>
#include <devices/inputevent.h>
#include <clib/keymap_protos.h>
#include <string.h>
#include <clib/asl_protos.h>
#include <libraries/asl.h>
#include <fcntl.h>
#include <clib/icon_protos.h>
#include <intuition/pointerclass.h>
#include <intuition/classusr.h>
#include <clib/utility_protos.h>
#include <libraries/guifront.h>

#include <dos/dostags.h>

#include "amiCheck.h"
#include "mainPanel.h"
#include "regGadget.h"
#include "libraries.h"
#include "enterPanel.h"
#include "seltempPanel.h"
#include "dataBase.h"
#include "edittempPanel.h"
#include "filterPanel.h"
#include "sortPanel.h"
#include "acctPanel.h"
#include "reconcilePanel.h"
#include "searchPanel.h"
#include "categoryPanel.h"
#include "statsPanel.h"
#include "newtempPanel.h"
#include "reportPanel.h"
#include "scriptPanel.h"
#include "analysisPanel.h"
#include "formPanel.h"
#include "netPanel.h"
#include "qdatePanel.h"
#include "qmemoPanel.h"
#include "memoPanel.h"
#include "namePanel.h"
#include "amntPanel.h"
#include "qnamePanel.h"
#include "qamntPanel.h"
#include "impexp.h"
#include "printPanel.h"
#include "groupPanel.h"
#include "arexx.h"
#include "budgetPanel.h"

AMIGAGUIDECONTEXT agc = NULL;
struct NewAmigaGuide newAG = {NULL};

static const char *VersionString = "\0$VER:" ACVERSION " " __AMIGADATE__;

STRPTR AC_AppID       = "amiCheck";

STRPTR AC_Version     = ACVERSION,
       AC_LongDesc    = "Checkbook Software",
       AC_Author      = "Douglas M. Dyer",
	AC_Date	      = __AMIGADATE__;

STRPTR AC_WindowTitle = "amiCheck";
STRPTR AC_Title		= "amiCheck " ACVERSION " " __AMIGADATE__;

#define DEFAULT_FILEPATTERN	"#?.AC"
#define DEFAULT_IMPORTPATTERN	"#?.txt"
#define DEFAULT_SCRIPTPATTERN	"#?.ACscript"
#define DEFAULT_NETPATTERN	"#?.ACnet"

/* Library bases */
struct Library *GUIFrontBase;

/* Imported from the main panel module */

extern STRPTR AC_Version,
              AC_LongDesc,
              AC_Author,
              AC_Date;

extern STRPTR AC_WindowTitle;
extern STRPTR AC_AppID;

extern AC_InitialOrientation;

/* globals */
char currStr[AMNTSIZE+1];
char stateStr[AMNTSIZE+1];
char filtStr[AMNTSIZE+1];
char filePattern[FILEPATTERN_SIZE];
char importPattern[FILEPATTERN_SIZE];
char scriptPattern[FILEPATTERN_SIZE];
char netPattern[FILEPATTERN_SIZE];

/* global help links */
__far char *guideLinks[] = {
	"LINK MAIN_PANEL",
	"LINK SELTEMP_PANEL",
	"LINK NEWTEMP_PANEL",
	"LINK EDITTEMP_PANEL",
	"LINK FILTER_PANEL",
	"LINK SORT_PANEL",
	"LINK ANALYSIS_PANEL",
	"LINK FORMS_PANEL",
	"LINK ENTRY_PANEL",
	"LINK RECONCILE_PANEL",
	"LINK ACCOUNT_PANEL",
	"LINK SEARCH_PANEL",
	"LINK CAT_PANEL",
	"LINK STATS_PANEL",
	"LINK REPORT_PANEL",
	"LINK SCRIPT_PANEL",
	"LINK QUICKMEMO_PANEL",
	"LINK QUICKDATE_PANEL",
	"LINK QUICKNAME_PANEL",
	"LINK QUICKAMNT_PANEL",
	"LINK MEMO_PANEL",
	"LINK AMNT_PANEL",
	"LINK NAME_PANEL",
	"LINK NET_PANEL",
	"LINK PRINT_PANEL",
	"LINK GROUP_PANEL",
	"LINK AREXX_PANEL",
   };

UBYTE dclicktype = 0;
BOOL amigaguide = FALSE;
BOOL bootfile = FALSE;
BOOL layoutwarn = TRUE;
BOOL batchmode = FALSE;
GUIFrontApp *guiapp;
GUIFront *gui;
ExtErrorData exterr;
struct InputEvent ie;
struct Menu *menuStrip = NULL;
extern BOOL skipped;
char currFile[FILESIZE] = "";
char currNode[FILESIZE];
char *iconPath = "PROGDIR:AC_Icons/";
char *guidePath = "PROGDIR:documents/amiCheck.guide";
char arexxTemp[FILESIZE];
BOOL autosort = FALSE;
BOOL alldisabled=FALSE;
BOOL seldone = FALSE;
BOOL simpleRefresh = FALSE;
ULONG amiAslHeight = 200L;

char amiWindowTitle[100];
char *quitstr = "Are you sure you want to quit amiCheck?\nAll changes to the current account will be lost.";
char *newstr =  "Are you sure you want to start a new account?\nAll changes to the current account will be lost.";
char *openstr = "Are you sure you want to open an account?\nAll changes to the current account will be lost.";
BOOL FALLBACK = FALSE;

struct NewMenu amiMenu[] =
{
 {NM_TITLE, "File", 		0,0,0,0,},
 {NM_ITEM, "New...",		"N",0,0,0,},
 {NM_ITEM, NM_BARLABEL, 	0,0,0,0,},
 {NM_ITEM, "Open...", 		"O", 0,0,0,},
 {NM_ITEM, "Save",    		"S", 0,0,0,},
 {NM_ITEM, "Save and Exit",	"X", 0,0,0,},
 {NM_ITEM, "Save As...", 	"A",0,0,0,},
 {NM_ITEM, NM_BARLABEL,		0,0,0,0,},
 {NM_ITEM, "Import",		0,0,0,0,},
 {NM_SUB,  "Ascii Format...",	0,0,0,0,},
 {NM_ITEM, "Export",		0,0,0,0,},
 {NM_SUB,  "Ascii Format...",	0,0,0,0,},
 {NM_ITEM, NM_BARLABEL, 	0,0,0,0,},
 {NM_ITEM, "Reconcile...",	";",0,0,0,},
 {NM_ITEM, NM_BARLABEL, 	0,0,0,0,},
 {NM_ITEM, "Print Checks...", 	"P",0,0,0,},
 {NM_ITEM, NM_BARLABEL, 	0,0,0,0,},
 {NM_ITEM, "About", 		0,0,0,0,},
 {NM_SUB,  "Third Parties...",	0,0,0,0,},
 {NM_SUB,  "amiCheck...",	0,0,0,0,},
 {NM_ITEM, NM_BARLABEL, 	0,0,0,0,},
 {NM_ITEM, "Quit", 		"Q",0,0,0,},


 {NM_TITLE, "Search",		0,0,0,0,},
 {NM_ITEM, "Search...",		"[",0,0,0,},
 {NM_ITEM, "Search Again",	"]",0,0,0,},
 {NM_ITEM, NM_BARLABEL,		0,0,0,0,},
 {NM_ITEM, "Jump to Selected",	"J",NM_ITEMDISABLED,0,0,},

 {NM_TITLE, "Edit", 		0,0,0,0,},
 {NM_ITEM, "Quick Transaction", 0,0,0,0,},
 {NM_SUB, "Check...", 		"C",0,0,0,},
 {NM_SUB, "Withdrawal...", 	"W",0,0,0,},
 {NM_SUB, "Deposit...", 	"D",0,0,0,},
 {NM_SUB, "Script...", 		"P",0,0,0,},
 {NM_SUB, "Use Template...",	"U",0,0,0,},
 {NM_ITEM, "Duplicate Entry...","E",0,0,0,},
 {NM_ITEM, "Batch Mode", 	"B", CHECKIT | MENUTOGGLE,0,0,},
 {NM_ITEM, NM_BARLABEL,		0,0,0,0,},
 {NM_ITEM, "Clear",		"/",NM_ITEMDISABLED,0,0,},
 {NM_ITEM, "Unclear",		"\\",NM_ITEMDISABLED,0,0,},
 {NM_ITEM, NM_BARLABEL, 	0,0,0,0,},
 {NM_ITEM, "Apply Order...",	0,0,0,0,},
 {NM_ITEM, "Move Entry",	0,NM_ITEMDISABLED,0,0,},
 {NM_ITEM, "Unfilter Item",	"L",NM_ITEMDISABLED,0,0,},
 {NM_ITEM, "Range Actions",	0,NM_ITEMDISABLED,0,0,},
 {NM_SUB, "Clear All...",	0,0,0,0,},
 {NM_SUB, "Unclear All...",	0,0,0,0,},
 {NM_SUB, NM_BARLABEL, 		0,0,0,0,},
 {NM_SUB, "Mark All Deducible...",	0,0,0,0,},
 {NM_SUB, "Mark All Non-Deductible...",	0,0,0,0,},
 {NM_SUB, "Mark All Printed...",0,0,0,0,},
 {NM_SUB, "Mark All Unprinted...",	0,0,0,0,},
 {NM_SUB, NM_BARLABEL, 		0,0,0,0,},
 {NM_SUB, "Void All...",	0,0,0,0,},
 {NM_SUB, "Unvoid All...",	0,0,0,0,},
 {NM_SUB, NM_BARLABEL, 		0,0,0,0,},
 {NM_SUB, "Remove All...",	0,0,0,0,},

 {NM_ITEM, NM_BARLABEL,		0,0,0,0,},
 {NM_ITEM, "Account Info...",	"I",0,0,0,},
 {NM_ITEM, "Quick Data", 	0,0,0,0,},
 {NM_SUB, "Memo Editor...", 	0,0,0,0,},
 {NM_SUB, "Payee Editor...", 	0,0,0,0,},
 {NM_SUB, "Amounts Editor...", 	0,0,0,0,},


 {NM_TITLE, "Utility",		0,0,0,0,},
 {NM_ITEM, "Report Generator...",	"R",0,0,0,},
 {NM_ITEM, NM_BARLABEL, 	0,0,0,0,},
 {NM_ITEM, "Script Editor...",	0,0,0,0,},
 {NM_ITEM, NM_BARLABEL, 	0,0,0,0,},
 {NM_ITEM, "Net Worth...",	"T",0,0,0,},

 {NM_TITLE, "ARexx",		0,NM_ITEMDISABLED,0,0,},
 {NM_ITEM, "Assign Macros...",	"M",0,0,0,},
 {NM_ITEM, NM_BARLABEL, 	0,0,0,0,},
 {NM_ITEM, arexxMacros[0].macroname, 	"1",0,0,0,},
 {NM_ITEM, arexxMacros[1].macroname, 	"2",0,0,0,},
 {NM_ITEM, arexxMacros[2].macroname,	"3",0,0,0,},
 {NM_ITEM, arexxMacros[3].macroname, 	"4",0,0,0,},
 {NM_ITEM, arexxMacros[4].macroname, 	"5",0,0,0,},
 {NM_ITEM, arexxMacros[5].macroname, 	"6",0,0,0,},
 {NM_ITEM, arexxMacros[6].macroname, 	"7",0,0,0,},
 {NM_ITEM, arexxMacros[7].macroname, 	"8",0,0,0,},
 {NM_ITEM, arexxMacros[8].macroname, 	"9",0,0,0,},
 {NM_ITEM, arexxMacros[9].macroname, 	"0",0,0,0,},
 {NM_ITEM, "Other...", 	0,0,0,0,},

#if 0
 {NM_ITEM, NM_BARLABEL, 	0,0,0,0,},
 {NM_ITEM, "Start Recording", 	0,NM_ITEMDISABLED,0,0,},
 {NM_ITEM, "Stop Recording...",	0,NM_ITEMDISABLED,0,0,},
#endif
 {NM_ITEM, NM_BARLABEL, 	0,NM_ITEMDISABLED,0,0,},
 {NM_ITEM, "Open CommandShell",	0,0,0,0,},
 {NM_ITEM, "Close CommandShell",0,0,0,0,},


 {NM_TITLE, "Preferences",	0,0,0,0,},
 {NM_ITEM, "Window",		0,0,0,0,},
 {NM_SUB, "Show Memos",		"=",CHECKIT | MENUTOGGLE,0,0,},
 {NM_ITEM, "Double Click",	0,0,0,0,},
 {NM_SUB, "Edit Transaction",	0,CHECKIT | MENUTOGGLE, ~1,0,},
 {NM_SUB, "Toggle Clear",	0,CHECKIT | MENUTOGGLE, ~2,0,},
 {NM_SUB, "Unfilter",		0,CHECKIT | MENUTOGGLE, ~4,0,},
 {NM_ITEM, "Date Format",	0,0,0,0,},
 {NM_SUB, "12/31/99",		0,CHECKIT | MENUTOGGLE, ~1,0,},
 {NM_SUB, "31/12/99",		0,CHECKIT | MENUTOGGLE, ~2,0,},
 {NM_SUB, "DEC-31-99",		0,CHECKIT | MENUTOGGLE, ~4,0,},
 {NM_SUB, "31-DEC-99",		0,CHECKIT | MENUTOGGLE, ~8,0,},
 {NM_ITEM, NM_BARLABEL, 	0,0,0,0,},
 {NM_ITEM, "Check Forms...",	"F",0,0,0,},

 {NM_END, NULL, 0,0,0,0,},
};

/* "flexible" menu arrangement aid */
#define FILETITLE	0
#define SEARCHTITLE	1
#define EDITTITLE	2
#define UTILITYTITLE	3
#define AREXXTITLE	4
#define PREFSTITLE	5

#define FILENEW		0
#define FILEOPEN	2
#define FILESAVE	3
#define FILESAVEEXIT	4
#define FILESAVEAS	5
#define FILEIMPORT	7
#define FILEEXPORT	8
#define FILERECON	10
#define FILEPRINT	12
#define FILEABOUT	14
#define FILEABOUTAC	1
#define FILEABOUTPART	0
#define FILEQUIT	17

#define FILEIMPASCII	0
#define FILEEXPASCII	0

#define SEARCHSEARCH	0
#define SEARCHAGAIN	1
#define SEARCHJUMP	3

#define EDITQUICK	0
#define EDITQCHECK	0
#define EDITQWITHDRAWAL	1
#define EDITQDEPOSIT	2
#define EDITQSCRIPT	3
#define EDITQTEMPLATE	4
#define EDITDUPLICATE	1
#define EDITBATCH	2
#define EDITCLEAR	4
#define EDITUNCLEAR	5
#define EDITAPPLYSORT	7
#define EDITMOVE	8
#define EDITUNFILT	9
#define EDITRANGE	10
#define EDITRANGECLR	0
#define EDITRANGEUCL	1
#define EDITRANGEDED	3
#define EDITRANGEUND	4
#define EDITRANGEPR	5
#define EDITRANGEUPR	6
#define EDITRANGEVD	8
#define EDITRANGEUVD	9
#define EDITRANGERM	11
#define EDITACCT	12
#define EDITDATA	13
#define EDITDMEMO	0
#define EDITDNAME	1
#define EDITDAMNT	2


#define UTILITYREPORT	0
#define UTILITYSCRIPT	2
#define UTILITYNET	4

#define AREXXASSIGN	0
#define AREXXM1		2
#define AREXXM2		3
#define AREXXM3		4
#define AREXXM4		5
#define AREXXM5		6
#define AREXXM6		7
#define AREXXM7		8
#define AREXXM8		9
#define AREXXM9		10
#define AREXXM10	11
#define AREXXOTHER	12

#if 0
#define AREXXBEGINREC	14
#define AREXXENDREC	15
#endif

#define AREXXOPENCMD	14
#define AREXXCLOSECMD	15


#define PREFSWINDOW	0
#define PREFSWINDOWMEMO	0
#define PREFSDCLICK	1
#define PREFSDCLICKE	0
#define PREFSDCLICKC	1
#define PREFSDCLICKU	2
#define PREFSDATE	2
#define PREFSDATE1	0
#define PREFSDATE2	1
#define PREFSDATE3	2
#define PREFSDATE4	3
#define PREFSFORM	4

UWORD __chip busyPointer37[] =
{
	0x0000,0x0000,

	0x0400,0x07c0,
	0x0000,0x07c0,
	0x0100,0x0380,
	0x0000,0x07e0,
	0x07c0,0x1ff8,
	0x1ff0,0x3fec,
	0x3ff8,0x7fde,
	0x3ff8,0x7fbe,
	0x7ffc,0xff7f,
	0x7efc,0xffff,
	0x7ffc,0xffff,
	0x3ff8,0x7ffe,
	0x3ff8,0x7ffe,
	0x1ff0,0x3ffc,
	0x07c0,0x1ff8,
	0x0000,0x07e0,

	0x0000,0x0000,
};

UWORD __chip movePointer37[] =
{
	0x0000,0x0000,

	0x0180,0x0180,
	0x0f80,0x0e00,
	0xfffc,0xf07c,
	0x7ffc,0x8000,
	0x0f80,0xf07c,
	0x0180,0x0e00,
	0x0000,0x0180,

	0x0000,0x0000,
};

UWORD __chip movePointer39[2][7] = {
{
	0x0180,
	0x0f80,
	0xfffc,
	0x7ffc,
	0x0f80,
	0x0180,
	0x0000,
},
{
	0x0180,
	0x0e00,
	0xf07c,
	0x8000,
	0xf07c,
	0x0e00,
	0x0180,
},
};

struct BitMap ptrBM;
APTR moveObj;
BOOL OS39 = TRUE, moveActive = FALSE;
filterNode *moveNode;
WORD moveRow = -1;

BOOL amidone;

struct TagItem *aslTagList;

struct TagItem scriptloadtags[] =
{
	ASL_Hail, (ULONG)"Select Script File:",
	ASL_File, (ULONG)"",
	ASL_Dir, (ULONG)"PROGDIR:macros",
	ASL_Pattern, (ULONG)scriptPattern, /*"#?.ACscript",*/
	ASL_FuncFlags, FILF_PATGAD,
	TAG_DONE,
};

struct TagItem scriptsavetags[] =
{
	ASL_Hail, (ULONG)"Save Script As:",
	ASL_File, (ULONG)"untitled.ACscript",
	ASL_Pattern,(ULONG)"~(#?.info)",
	ASL_FuncFlags,	FILF_SAVE,
	ASL_Dir, (ULONG)"PROGDIR:macros",
	TAG_DONE,
};

struct TagItem rexxtags[] =
{
	ASL_Hail, (ULONG)"Select ARexx Macro:",
	ASL_File, (ULONG)"",
	ASL_FuncFlags, FILF_PATGAD,
	ASL_Dir, (ULONG)"PROGDIR:macros",
	TAG_DONE,
};

struct TagItem loadtags[] =
{
	ASL_Hail, (ULONG)"Open Account:",
	ASL_File, (ULONG)"",
	ASL_Pattern,(ULONG)filePattern, /*"#?.AC",*/
	ASL_FuncFlags, FILF_PATGAD,
	ASL_Dir, (ULONG)"PROGDIR:",
	TAG_DONE,
};

struct TagItem savetags[] =
{
	ASL_Hail, (ULONG)"Save Account As:",
	ASL_File, (ULONG)"untitled.AC",
	ASL_Pattern,(ULONG)"~(#?.info)",
	ASL_Dir, (ULONG)"PROGDIR:",
	ASL_FuncFlags,	FILF_SAVE,
	TAG_DONE,
};

struct TagItem impasciitags[] =
{
	ASL_Hail, (ULONG)"Import ASCII:",
	ASL_File, (ULONG)"",
	ASL_Pattern,(ULONG)importPattern, /*"#?.txt",*/
	ASL_FuncFlags, FILF_PATGAD,
	ASL_Dir, (ULONG)"PROGDIR:",
	TAG_DONE,
};

struct TagItem expasciitags[] =
{
	ASL_Hail, (ULONG)"Export Filter as ASCII:",
	ASL_File, (ULONG)"untitled.txt",
	ASL_Pattern,(ULONG)"~(#?.info)",
	ASL_Dir, (ULONG)"PROGDIR:",
	ASL_FuncFlags,	FILF_SAVE,
	TAG_DONE,
};

struct TagItem devtags[] =
{
	ASL_Hail, (ULONG)"Select Output Device:",
	/*ASL_File, (ULONG)"",*/
	ASL_Pattern,(ULONG)"~(#?.info)",
	/*ASL_Dir, (ULONG)"PROGDIR:",*/
	ASL_FuncFlags,	FILF_SAVE,
	TAG_DONE,
};

struct TagItem reporttags[] = {
	ASL_Hail, (ULONG)"Save Report To:",
	ASL_File, (ULONG)"untitled.ACreport",
	ASL_Pattern,(ULONG)"#?.ACreport",
	ASL_Dir, (ULONG)"PROGDIR:",
	ASL_FuncFlags,	FILF_SAVE,
	TAG_DONE,
};


struct TagItem netloadtags[] =
{
	ASL_Hail, (ULONG)"Select Summary  File:",
	ASL_File, (ULONG)"",
	ASL_Pattern, (ULONG)netPattern, /*"#?.ACnet",*/
	ASL_Dir, (ULONG)"PROGDIR:",
	ASL_FuncFlags, FILF_PATGAD,
	TAG_DONE,
};

struct TagItem netsavetags[] =
{
	ASL_Hail, (ULONG)"Save Summary As:",
	ASL_File, (ULONG)"untitled.ACnet",
	ASL_Pattern,(ULONG)"#?.ACnet",
	ASL_Dir, (ULONG)"PROGDIR:",
	ASL_FuncFlags,	FILF_SAVE,
	TAG_DONE,
};

struct Window *amiWindow;
struct FileRequester *impasciiASL = NULL, *expasciiASL = NULL;
struct FileRequester *scriptASL = NULL, *devASL = NULL, *reportASL = NULL;
struct FileRequester *loadASL = NULL, *scriptsaveASL = NULL;
struct FileRequester *saveASL = NULL, *netloadASL = NULL, *netsaveASL = NULL;
struct FileRequester *otherRexxASL = NULL;

/* prototypes */
BOOL AmiInit(void);
void AmiShutdown(void);
void AmiSetupMemo(void);
void AmiHandleGadget(struct IntuiMessage *);
void AmiHandleScript(void);
void AmiEditEntry(void);
void AmiProcessRawkeys(struct IntuiMessage *);
void AmiRangeMark(long);
BOOL AmiHandleMenu(struct IntuiMessage *);
BOOL AmiAsk(char *);
void AmiAbout(void);
void AmiAboutPart(void);
void AmiHandleGadgetDown(struct IntuiMessage *);
void AmiSearchFail(void);
BOOL AmiAllocRequesters(void);
void AmiResetBals(void);
void AmiDisableAll(BOOL);
void AmiParseCmd(int, char **);
BOOL AmiOpenGUI(void);
void AmiCloseGUI(void);
void AmiMoveRestore(void);
void AmiMoveActive(void);
void AmiCheckRenumber(char,long);
void AmiLocalMsg(struct IntuiMessage *);
void AmiSetupDclick(void);
void AmiSetupDate(void);
void AmiDuplicateEntry(void);
void AmiToggleClear(void);
void AmiArexxMenu(void);
void AmiApplySort(void);
LONG AmiBaseHelp(void);
void AmiBaseLink(char *);
void AmiHelpMsg(void);
void AmiRunMacro(char *fname);

/* Code */
/*********************************************************************************/
main(int argc, char **argv)
{
 ULONG signal, sigmask;

 seltempGUI = edittempGUI = newGUI = filterGUI = sortGUI = analGUI = formGUI = NULL;
 entryGUI = recGUI = acctGUI =  searchGUI = catGUI = statGUI = repGUI = scriptGUI = NULL;
 qdateGUI = qmemoGUI = qamntGUI = qnameGUI = memoGUI = amntGUI = nameGUI = netGUI = NULL;
 printGUI = groupGUI = arexxGUI = NULL;


   /* support either command or tooltypes or wbench */
    if (argc == 0) {
		argc = _WBArgc;
		argv = _WBArgv;
    }

    AmiParseCmd(argc,argv);

    sprintf(amiWindowTitle,AC_WindowTitle);

    /* Attempt to open library */
    if (GUIFrontBase = OpenLibrary(GUIFRONTNAME, GUIFRONTVERSION))
    {
        /* Create our application anchor structure */

        if (guiapp = GF_CreateGUIApp(AC_AppID,
            GFA_Version,    AC_Version,
            GFA_LongDesc,   AC_LongDesc,
            GFA_Author,     AC_Author,
            GFA_Date,       AC_Date,
            TAG_DONE))
        {

            /* Create a gui for our application */
	   TRYLABEL:
            if (gui = GF_CreateGUI(guiapp, AC_MainPanel,AC_MainSpecs,
                GUI_InitialOrientation, AC_InitialOrientation,
                GUI_ExtendedError,      &exterr,
                GUI_WindowTitle,        amiWindowTitle,
                GUI_OpenGUI,            TRUE,
                GUI_ExtraIDCMP,         IDCMP_RAWKEY|IDCMP_ACTIVEWINDOW|IDCMP_REFRESHWINDOW,
		GUI_NewMenu,		amiMenu,
		GUI_ScreenTitle,	AC_Title,
                TAG_DONE))
            {
                amidone = FALSE;

           	DataListInit();

	        /* initialize application interface */
	        if (!amidone && AmiInit() != TRUE) amidone = TRUE;

		if (AmigaGuideBase != NULL) {
			amigaguide = TRUE;
			AmiBaseHelp();
		}

	        AmiLock();

		/* open panels */
		if (!amidone && AmiOpenGUI() != TRUE) amidone = TRUE;
		if (!amidone && DataInit() != TRUE) amidone = TRUE;
		if (!amidone && AnalysisSetup() != TRUE) amidone = TRUE;

		if (!amidone) GF_GetGUIAttr(gui,GUI_MenuStrip, &menuStrip, TAG_DONE);
		if (menuStrip == NULL) amidone = TRUE;

		if (!amidone && EasyRexxBase != NULL) {
			if (axOpen() == FALSE) amidone = TRUE;
			sigmask = ER_SIGNAL(axContext);
			OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,NOITEM,NOSUB));
			sprintf(arexxTemp,"T:%s",axContext->portname);
		}
		else 	{
			sigmask = 0;
			axContext = NULL;
			OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,NOITEM,NOSUB));
		}

/*		GF_SetAliasKey(gui,0x40,GID_GETSELTYPE);*/

		AmiArexxMenu();

		if (!amidone && bootfile)
			AmiOpen(currFile,TRUE);

		/* set up showMenu check */
		if (!amidone) AmiSetupMemo();

		if (!amidone) AmiSetupDclick();

		if (!amidone) AmiSetupDate();

		AmiUnlock();

		if (amidone)     {
			AmiAnnounce("Failed to initialize application:\nTry a smaller font?\nTry more overscan?\nTry a proportional font (ie:helvetica)?");
		}
		else if (FALLBACK && layoutwarn)
			AmiAnnounce("Font did not fit properly:\nCompromised window layout.\n(cosmetic warning only)");


		/* Process input events */
                while (!amidone || (axContext && ER_SAFETOQUIT(axContext)==FALSE))
                {
                    struct IntuiMessage *imsg;

                    /* Wait for an event to occur */

                    signal = GF_Wait(guiapp,ER_SIGNAL(axContext) | AmigaGuideSignal(agc));

		    /* AREXX message? */
		    ER_SETSIGNALS(axContext,signal);
		    if (signal & ER_SIGNAL(axContext)) {
			amidone = axHandle(axContext);
			continue;
		    }

		    /* Amigaguide message? */
		    else if (signal & AmigaGuideSignal(agc)) {
			AmiHelpMsg();
			continue;
		    }

                    /* We only bother to listen for CLOSEWINDOW events.
                     * Of course, in a real application, you would be
                     * examining the Class field for IDCMP_GADGETUP
                     * messages and act accordingly.
                     */

                    while (imsg = GF_GetIMsg(guiapp))
                    {
			if (imsg->IDCMPWindow->UserData == seltempGUI) {
				if (selWin != NULL)
					seldone = SelTempMsg(imsg);
			}
			else	if (imsg->IDCMPWindow->UserData == gui) {
				AmiLocalMsg(imsg);
			}

                        GF_ReplyIMsg(imsg);
                    }

		    if (seldone == TRUE) {
			GF_SetGUIAttr(seltempGUI, GUI_OpenGUI, FALSE, TAG_DONE);
			selWin = NULL;
			seldone = FALSE;
		    }
                }

                /* We're done with the GUI, so free it. GF_DestroyGUIApp
                 * actually does this for us, but it still looks nicer if
                 * we do it manually (I think :-)
                 */
		AmiLock();
		if (amigaguide && agc) CloseAmigaGuide(agc);
		DataFreeAll();
	        AmiShutdown();
		AmiUnlock();
		if (EasyRexxBase != NULL) {
			axClose();
			remove(arexxTemp);
		}
	        GF_DestroyGUI(gui);
		LibClose();
            }
            else {
            	Printf("Unable to create GUI (Error data: %ld.%ld)\n", exterr.ee_ErrorCode, exterr.ee_ErrorData);

		/* attempt to fall back */
		if (AC_MainPanel[21] == GUILF_EqualShare) {
			AC_MainPanel[21] = GUILF_PropShare;
			FALLBACK = TRUE;
			goto TRYLABEL;
		}
	    }

            /* Destroy application anchor structure */
            GF_DestroyGUIApp(guiapp);
        }
        else
            PutStr("Unable to open guifront.library\n");

        CloseLibrary(GUIFrontBase);
    }
    else
        PutStr("Requires guifront.library V37+\n");

}

/**********************************************************
* AmiLocalMsg()
*
*	Handles messages from afar
***********************************************************/
void AmiLocalMsg(struct IntuiMessage *imsg)
{
    switch (imsg->Class) {

                           case IDCMP_RAWKEY:
					AmiProcessRawkeys(imsg);
					break;

			   case IDCMP_MENUPICK:
					amidone = AmiHandleMenu(imsg);
					break;

                           case IDCMP_GADGETDOWN:
					AmiHandleGadgetDown(imsg);
					break;

			   case IDCMP_MOUSEMOVE:
					RegMoveList(&filtered,imsg->Code);
					RegRefresh(FALSE);
					break;

                           case IDCMP_CLOSEWINDOW:
                                        amidone = AmiAsk(quitstr);
					break;

                           case IDCMP_GADGETUP:
					AmiHandleGadget(imsg);
                                        break;

			   case IDCMP_REFRESHWINDOW:
					RegRefresh(TRUE);
					break;

                           default:
                                        RegRefresh(TRUE);
                                        break;
                        }
}

/**********************************************************
* AmiInit()
*
*	Initialize basic variables and images
***********************************************************/
BOOL AmiInit(void)
{
 char buffer[50];
 PrefsHandle *ph;

	OS39 = TRUE;
        if (LibOpen(39L) != TRUE) {
		if (LibOpen(37L) != TRUE)
			return (FALSE);
		OS39 = FALSE;
	}

	GF_GetGUIAttr(gui,GUI_Window,&amiWindow,TAG_DONE);

        if (RegInit() != TRUE) return (FALSE);
	if (AmiAllocRequesters() != TRUE) return (FALSE);

	GF_LockPrefsList();
		for (ph = GF_FirstPrefsNode(); ph != NULL; ph = GF_NextPrefsNode(ph)) {
			GF_CopyAppID(ph,buffer);
			if (strcmpi(buffer,AC_AppID) == 0)
				break;
		}
		if (ph == NULL)
			buffer[0]=0;

		GF_GetPrefsAttr (buffer,
			PRF_SimpleRefresh, &simpleRefresh,
			TAG_DONE);

	GF_UnlockPrefsList();

	if (simpleRefresh)
		simpleRefresh = TRUE;


	/* otherwise, */
	AmiDisableAll(TRUE);

  if (OS39) {
	InitBitMap(&ptrBM,2,16,7);
	ptrBM.Planes[0] = (char *)movePointer39[0];
	ptrBM.Planes[1] = (char *)movePointer39[1];
	moveObj = NewObject(NULL,POINTERCLASS,
		POINTERA_XOffset,0,
		POINTERA_YOffset,-3,
		POINTERA_XResolution, POINTERXRESN_HIRES,
		POINTERA_YResolution, POINTERYRESN_HIGHASPECT,
		POINTERA_BitMap, &ptrBM,
		TAG_DONE);
  }

        return (TRUE);
}

/**********************************************************
* AmiShutdown()
*
*	Quitting the application
**********************************************************/
void AmiShutdown(void)
{
	if (OS39) {
		/*printf("os39 specifics\n");*/
		DisposeObject(moveObj);
	}

	AmiCloseGUI();
	if (scriptASL) FreeAslRequest(scriptASL);
	if (loadASL) FreeAslRequest(loadASL);
 	if (saveASL) FreeAslRequest(saveASL);
 	if (impasciiASL) FreeAslRequest(impasciiASL);
 	if (expasciiASL) FreeAslRequest(expasciiASL);
	if (otherRexxASL) FreeAslRequest(otherRexxASL);

	if (aslTagList) FreeTagItems(aslTagList);

	RegFreeAll();
	AnalysisFree();
}

/*********************************************************
* AmiHandleGadget()
*
*	Handle gadget activity of this panel
**********************************************************/
void AmiHandleGadget( struct IntuiMessage *imsg)
{
 struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
 /*UWORD code = imsg->Code; */

 if (moveActive)
	AmiMoveRestore();

 switch (gad->GadgetID) {

	case GID_ANALYSIS:
		if (AnalysisGUI())
			AmiDisableSel(FALSE);
		break;

	case GID_SORT:
		if (SortGUI() == TRUE) {
			AmiLock();
			/*DataRebuildFilters();*/
			if (!IsListEmpty(&sortfields))
				DataSortFilter((filterNode *)filtered.mlh_Head,
					       (filterNode *)filtered.mlh_TailPred,
					       (sortNode *)sortfields.lh_Head);
			else DataRebuildFilters();
			RegNewFilter();
			AmiUnlock();
		}
		break;

	case GID_GETSELTYPE:
		SelTempGUI();
		AmiNewTemp();
		break;

	case GID_STATS:
		StatGUI();
		break;

	case GID_BUDGET:
		CatGUI();
		break;

	case GID_NEWTYPE:
		EditTempGUI();

		/* update type field */
		AmiNewTemp();
		break;

	case GID_FILTER:
		if (FilterGUI() == TRUE) {
			AmiLock();
			memcpy(&filterControl, &currFilter, sizeof(filterSetting));
			DataRebuildFilters();
			if (autosort == TRUE && !IsListEmpty(&sortfields))
				DataSortFilter((filterNode *)filtered.mlh_Head,
					       (filterNode *)filtered.mlh_TailPred,
					       (sortNode *)sortfields.lh_Head);
			RegNewFilter();
			DataFilterBalance(&filtered);
			DataBuildBal(usrAccount.decimal,&filtAmnt,filtStr);
			AmiUpdateFilt(filtStr);
			AmiUnlock();
		}
		break;

	case GID_EDIT:
		AmiEditEntry();
		break;

#if 0
	case GID_RECONCILE:
		ReconcileGUI();
		break;
#endif

	 }
}

/******************************************************************
* AmiEnterData()
*
*	Called by seltemp
*******************************************************************/
void AmiEnterData(void)
{
 entryNode *entry;
 filterNode *filt;
 BOOL del;

		if (amntState.currTemplate == SCRIPTTYPE)
			AmiHandleScript();
		else do {
			entry = EntryGUI("Enter New Transaction",FALSE, NULL, &del);
			if (entry != NULL) {
				DataAddEntry(entry,&entries, &filt);

				/* update curr balance */
				if (!(entry->flags & VOIDED)) {
					DataUpdateBal(entry->type, &entry->amount,
						&amntState.currAmnt,currStr);
					AmiUpdateCurr(currStr);
				}

				if (filt != NULL) {
					RegAddEntry(filt);
					if ( !(entry->flags & VOIDED)) {
						DataUpdateBal(entry->type, &entry->amount,
							&filtAmnt,filtStr);
						AmiUpdateFilt(filtStr);
					}
					AmiDisableSel(TRUE);
				}

				memcpy(&currDate,&entry->date,sizeof(dateType));
				currCentury = entry->date.year/100;
			}

		} while (entry != NULL && batchmode);

 return;
}

/*******************************************************************
* AmiHandleScript()
*
*	scripting engine
********************************************************************/
void AmiHandleScript(void)
{
char fname[FILESIZE], line[FILESIZE];
FILE *scr;
BOOL del = FALSE;
entryNode *entry;
filterNode *filt;

 /* open requester */
 AmiLock();

 if (AmiGetFile(gui,scriptASL,fname,FILESIZE)) {

	if ( !(scr = fopen(fname,"r")) ) {
		AmiAnnounce("Could not open script file.");
		return;
 	}

	/*while (fscanf(scr,"%s",line) != EOF) */
	while (fgets(line,FILESIZE-1,scr) != NULL) {
		/* remove \n */
		if (strlen(line)>0)
			line[strlen(line)-1]=0;

		amntState.currTemplate = DataNode2Ord(&templates,line);

		entry = EntryGUI("Enter New Transaction", TRUE, NULL, &del);
		if (entry != NULL && !skipped) {
			DataAddEntry(entry,&entries, &filt);

			/* update curr balance */
			if (!(entry->flags & VOIDED)) {
				DataUpdateBal(entry->type, &entry->amount,
					&amntState.currAmnt, currStr);
				AmiUpdateCurr(currStr);
			}

			if (filt != NULL) {
				if ( !(entry->flags & VOIDED)) {
					DataUpdateBal(entry->type, &entry->amount,
						&filtAmnt, filtStr);
					AmiUpdateFilt(filtStr);

				}
				RegAddEntry(filt);
			}

			memcpy(&currDate,&entry->date,sizeof(dateType));
			currCentury = entry->date.year/100;
		}

		/* if enter data was canceled (not skipped), quit script */
		if (entry == NULL && !skipped)
			break;
	}
 	/* close file */
	fclose(scr);

 	/* return curr template to script type */
	amntState.currTemplate = SCRIPTTYPE;
 }
 AmiUnlock();

}

/*********************************************************************
* AmiNewTemp
*
*	Opens user template selection panel
*********************************************************************/
void AmiNewTemp(void)
{
templateNode *temp;

 /* update type field */
 temp = (templateNode *)DataOrd2Node(&templates,amntState.currTemplate);
 GF_SetGadgetAttrs(gui,gadgetspecs[GID_SELTYPE].gs_Gadget,
	GTTX_Text,temp->tempname,
  	TAG_DONE);
}

/*************************************************
* AmiProcessRawkeys
*
*	Process the rawkeys into ansi
**************************************************/
void AmiProcessRawkeys(struct IntuiMessage *imsg)
{
static BOOL upevent = FALSE;
static BOOL renum = FALSE;
static long upval;
static BOOL shift = FALSE, ctrl = FALSE;


if (moveActive)
	AmiMoveRestore();


/* check renumber scheme */
if (renum && upevent && imsg->Code > 0x0 && imsg->Code < 0xA){
	if (upval == (0x4f | 0x80)) {
		AmiCheckRenumber(0,imsg->Code);
	}

	else if (upval == (0x4e | 0x80)) {
		AmiCheckRenumber(1,imsg->Code);
	}

	renum = FALSE;
	return;
}

if (upevent && imsg->Code != upval)
	return;


upevent = FALSE;
renum = FALSE;

/* for now, use raw keys */
switch (imsg->Code) {
	case 0x40:
		if (!alldisabled) {
			SelTempGUI();
			AmiNewTemp();
		}
		break;

	case 0xe1:
	case 0xe0:
		shift = FALSE;
		break;

	case 0x61:
	case 0x60:
		shift = TRUE;
		break;

	case 0xe3:
		ctrl = FALSE;
		break;

	case 0x63:
		ctrl = TRUE;
		break;

	case 0x4f:
		upevent = renum = TRUE;
		upval = imsg->Code | 0x80;
		break;

	case 0x4e:
		upevent = renum = TRUE;
		upval = imsg->Code | 0x80;
		break;

	case 0x4c:

		upevent = TRUE;
		upval = imsg->Code | 0x80;
		if (shift)
			RegKeyScroll(SHIFTUP);
		else if (ctrl)
			RegKeyScroll(CTRLUP);
		else
			RegKeyScroll(UP);
		break;

	case 0x4d:
		upevent = TRUE;
		upval = imsg->Code | 0x80;

		if (shift)
			RegKeyScroll(SHIFTDOWN);
		else if (ctrl)
			RegKeyScroll(CTRLDOWN);
		else
			RegKeyScroll(DOWN);
		break;

	case HELP_KEY:
		AmiBaseLink(guideLinks[MAIN_PANEL]);
		break;
}

#if 0
UBYTE buffer[9];
struct InputEvent ie;
APTR *eventptr;

ie.ie_Class = IECLASS_RAWKEY;
ie.ie_Code = imsg->Code;
ie.ie_Qualifier = imsg->Qualifier;
eventptr = imsg->IAddress;
ie.ie_EventAddress = *eventptr;

x=MapRawKey(&ie, buffer, 8, NULL);
if (x == -1)
	return;
else if (x) {
	buffer[x]=0;
	printf("MAPS TO:[%s]:",buffer);
	for (y=0;y<x;y++)
		printf(" %x",buffer[y]);
	printf("\n");
}
#endif
}

/*******************************************************
* AmiDuplicateEntry()
*
*	Duplicate and edit current transaction
********************************************************/
void AmiDuplicateEntry(void)
{
 filterNode *find, *filt;
 entryNode *entry, orig;
 BOOL del;

 find = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
 if (find == NULL) return;
 memcpy(&orig,find->entry,sizeof(entryNode));

 /* raise panel */
 do {
	if (orig.type == CHECKTYPE)
		orig.check = amntState.currCheckNumber;

 	entry = EntryGUI("Duplicated Transaction",FALSE,&orig, &del);

	if (entry != NULL) {
		DataAddEntry(entry,&entries, &filt);

		/* update curr balance */
		if (!(entry->flags & VOIDED)) {
			DataUpdateBal(entry->type, &entry->amount, &amntState.currAmnt,currStr);
			AmiUpdateCurr(currStr);
		}

		if (filt != NULL) {
			RegAddEntry(filt);
			if ( !(entry->flags & VOIDED)) {
				DataUpdateBal(entry->type, &entry->amount, &filtAmnt, filtStr);
				AmiUpdateFilt(filtStr);
			}
			AmiDisableSel(TRUE);
		}

		memcpy(&currDate,&entry->date,sizeof(dateType));
		memcpy(&orig.date,&entry->date,sizeof(dateType));
		currCentury = entry->date.year/100;
	}

 } while (entry != NULL && batchmode);
}

/*******************************************************
* AmiEditEntry()
*
*	Edits an entry by poping up entry panel
********************************************************/
void AmiEditEntry(void)
{
 BOOL del;
 amountType amount;
 UBYTE type, flag;
 filterNode *find;
 entryNode *edit, *entry;

	find = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
        edit = find->entry;

		/* lets remove its amount */
		amount = edit->amount;
		type = edit->type;
		flag = edit->flags;

		if ( !(flag & VOIDED) ) {
			if (edit->type != DEPOSITTYPE ) {
				DataUpdateBal(DEPOSITTYPE,&edit->amount, &amntState.currAmnt,currStr);
				DataUpdateBal(DEPOSITTYPE,&edit->amount, &filtAmnt, filtStr);
			}
			else {
				DataUpdateBal(CHECKTYPE,&edit->amount,&amntState.currAmnt,currStr);
				DataUpdateBal(CHECKTYPE,&edit->amount,&filtAmnt, filtStr);
			}
		}
		else amount = 0;

		/* raise panel */
		entry = EntryGUI("Edit Transaction",FALSE,edit, &del);
		if (entry != NULL ) {
			memcpy( ((char *)edit)+sizeof(struct MinNode),
				((char *)entry)+sizeof(struct MinNode),
				sizeof(entryNode)-sizeof(struct MinNode));

			if (DataTestFilter(edit,&filterControl)) {
				RegRedrawSel(find);
				if ( !(edit->flags & VOIDED))
					DataUpdateBal(type,&edit->amount, &filtAmnt, filtStr);
			}

			else {
				DataRemoveFilter(find);
				RegRemoveSel();
			}

			if ( !(edit->flags & VOIDED) )
				DataUpdateBal(type,&edit->amount, &amntState.currAmnt, currStr);

			AmiUpdateCurr(currStr);
			AmiUpdateFilt(filtStr);

			memcpy(&currDate,&entry->date,sizeof(dateType));
			currCentury = entry->date.year/100;
		}
		else {
			if (del == TRUE) {
				DataRemoveEntry(edit,find);
				amiChangedItems = TRUE;
				RegRemoveSel();
				if ( !(flag & VOIDED) ) {
					AmiUpdateCurr(currStr);
					AmiUpdateFilt(filtStr);
				}
			}

			else {
			/* oops, stick the old one back in! */
			if ( !(flag & VOIDED) )
				DataUpdateBal(type,&amount, &amntState.currAmnt, currStr);
				DataUpdateBal(type,&amount, &filtAmnt, filtStr);
			}
		}
}

/******************************************************
* AmiHandleMenu()
*
*	process menu selections
*******************************************************/
BOOL AmiHandleMenu(struct IntuiMessage *imsg)
{
 BOOL done = FALSE, donemenu = FALSE;
 UWORD menunum;
 UWORD row;
 UWORD title, item, sub;
 amountType amount;
 struct MenuItem *menu;
 char fname[FILESIZE+15];
 filterNode *filt;

  menunum = imsg->Code;
  while ( (menunum != MENUNULL) && (!donemenu) ) {
	menu  = ItemAddress(menuStrip,menunum);
  	title = MENUNUM(menunum);
	item = ITEMNUM(menunum);
	sub = SUBNUM(menunum);

	if (title == FILETITLE) {
		AmiMoveRestore();
		switch (item) {
			case FILENEW:
				if (AmiAsk(newstr)) {

					if (AcctGUI("New Account",TRUE) == TRUE) {
						amntState.currTemplate = CHECKTYPE;
						AmiNewTemp();
						seldone = TRUE;
						SelTempStrip();

						AmiLock();
						DataFreeAll();
						DataInit(); /* zeros out stuff! */


						AmiDisableSel(TRUE);
						RegNewFilter();
						AmiArexxMenu();

						memcpy(&usrAccount, &tempAcct, sizeof(accntState));

						DataUpdateBal(DEPOSITTYPE,&usrAccount.beginAmount,
							&amntState.currAmnt, currStr);
						AmiUpdateCurr(currStr);

						amntState.currCheckNumber = usrAccount.checknumber-1;
						sprintf(currFile,"%s","untitled.AC");
						sprintf(amiWindowTitle,"%s: %s",AC_WindowTitle,currFile);
						SetWindowTitles(amiWindow,amiWindowTitle,(UBYTE *)-1);
						AmiDisableAll(FALSE);
						OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
						OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
						DataBuildBal(usrAccount.decimal,&amntState.currAmnt,currStr);
						DataBuildBal(usrAccount.decimal,&amntState.stateAmnt,stateStr);
						DataBuildBal(usrAccount.decimal,&filtAmnt,filtStr);
						AmiUpdateCurr(currStr);
						AmiUpdateState(stateStr);
						AmiUpdateFilt(filtStr);
						amiChangedItems = TRUE;
						AmiUnlock();
					}
				}
				break;

			case FILEOPEN:
				AmiOpen(NULL,FALSE);
				break;

			case FILESAVEEXIT:
				if (AmiSave(NULL,FALSE))
					done = TRUE;
				break;

			case FILESAVE:
				AmiSave(NULL,FALSE);
				break;

			case FILESAVEAS:
				AmiSave(NULL,TRUE);
				break;

			case FILEPRINT:
				PrintGUI();
				break;

			case FILEIMPORT:
				switch (sub) {
					case FILEIMPASCII:

						if (selRow == -1) {
							if (!DataQuery(gui,"Items will be appended to\nthe bottom of the database.",
									"OK|Cancel")) {
								break;
							}
						}
						else {
							if (!DataQuery(gui,"Items will be appended under\nthe selected transaction.",
									"OK|Cancel")) {
								break;
							}
						}

						AmiLock();
						if (AmiGetFile(gui,impasciiASL,fname,FILESIZE)) {
								if (ImportAscii(fname) != TRUE)
									AmiAnnounce("Problem importing file.");
						}
						AmiUnlock();

					break;
				}
				break;

			case FILEEXPORT:
				switch (sub) {
					case FILEEXPASCII:
						AmiLock();
						if (AmiGetFile(gui,expasciiASL,fname,FILESIZE)) {
								if (ExportAscii(fname) != TRUE)
									AmiAnnounce("Problem exporting file.");
						}
						AmiUnlock();

						break;
				}
				break;


			case FILERECON:
				ReconcileGUI();
				break;

			case FILEABOUT:
				switch (sub) {
					case FILEABOUTAC:
						AmiAbout();
					break;

					case FILEABOUTPART:
						AmiAboutPart();
					break;
				}
				break;

			case FILEQUIT:
				done = AmiAsk(quitstr);
				break;
		}
	}

	else if (title == SEARCHTITLE) {
		AmiMoveRestore();

		switch (item) {
			case SEARCHSEARCH:
				if (SearchGUI(&row)) {
					row = DataSearchFilter(&filtered,&searchControl);
					if (row == -1) {
						/* announce to user of search failure */
						AmiSearchFail();
					}
					else {
						searchControl.lastrow = selRow = row;
						RegMoveToSel(&filtered);
						AmiDisableSel(FALSE);
					}
				}
				break;

			case SEARCHAGAIN:
				row = DataSearchFilter(&filtered,&searchControl);
				if (row == -1) {
					/* announce to user of search failure */
					AmiSearchFail();
				}
				else {
					searchControl.lastrow = selRow = row;
					RegMoveToSel(&filtered);
				}
				break;

			case SEARCHJUMP:
				if (selRow != -1)
					RegMoveToSel(&filtered);
				break;
		}
	}

	else if (title == EDITTITLE) {
		switch (item) {
			case EDITDATA:
				AmiMoveRestore();
				switch (sub) {
					case EDITDMEMO:
						MemoGUI();
						break;

					case EDITDAMNT:
						AmntGUI();
						break;

					case EDITDNAME:
						NameGUI();
						break;
				}
				break;

			case EDITQUICK:
				AmiMoveRestore();
				switch (sub) {
					case EDITQCHECK:
						amntState.currTemplate = CHECKTYPE;
						AmiNewTemp();
						AmiEnterData();
						break;

					case EDITQWITHDRAWAL:
						amntState.currTemplate = WITHDRAWALTYPE;
						AmiNewTemp();
						AmiEnterData();
						break;

					case EDITQDEPOSIT:
						amntState.currTemplate = DEPOSITTYPE;
						/* update type field */
						AmiNewTemp();
						AmiEnterData();
						break;

					case EDITQTEMPLATE:
						AmiEnterData();
						break;

					case EDITQSCRIPT:
						amntState.currTemplate = SCRIPTTYPE;
						AmiNewTemp();
						AmiEnterData();
						break;
				}
				break;

			case EDITBATCH:
				AmiMoveRestore();
				batchmode = !batchmode;
				break;

			case EDITCLEAR:
				AmiMoveRestore();
				filt = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
				filt->entry->flags |= CLEARED;

				amount = filt->entry->amount;

				if (DataTestFilter(filt->entry,&filterControl))
					RegRedrawSel(filt);
				else 	{
					if ( !(filt->entry->flags & VOIDED)) {
						DataUpdateBal(
							(filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
							&amount, &filtAmnt, filtStr);
						AmiUpdateFilt(filtStr);
					}
					DataRemoveFilter(filt);
					RegRemoveSel();
				}
				amiChangedItems = TRUE;
				break;

			case EDITUNCLEAR:
				AmiMoveRestore();
				filt = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
				filt->entry->flags &= ~CLEARED;

				amount = filt->entry->amount;

				if (DataTestFilter(filt->entry,&filterControl))
					RegRedrawSel(filt);
				else	{
					if ( !(filt->entry->flags & VOIDED)) {
						DataUpdateBal(
							(filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
							&amount, &filtAmnt, filtStr);
						AmiUpdateFilt(filtStr);
					}
					DataRemoveFilter(filt);
					RegRemoveSel();
				}
				amiChangedItems = TRUE;
				break;

			case EDITDUPLICATE:
				AmiMoveRestore();
				AmiDuplicateEntry();
				break;

			case EDITMOVE:
				if (moveActive) {
					AmiMoveRestore();
				}
				else	{
					ActivateWindow(amiWindow);
					AmiMoveActive();
				}
				break;

			case EDITAPPLYSORT:
				AmiApplySort();
				break;

			case EDITUNFILT:
				AmiMoveRestore();
				AmiLock();
				filt = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
				amount = filt->entry->amount;
				if ( !(filt->entry->flags & VOIDED)) {
					DataUpdateBal(
						(filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
						&amount, &filtAmnt, filtStr);
					AmiUpdateFilt(filtStr);
				}
				DataRemoveFilter(filt);
				RegRemoveSel();
				AmiUnlock();
				break;

			case EDITRANGE:
				AmiMoveRestore();
				AmiRangeMark(sub);
				break;

			case EDITACCT:
				AmiMoveRestore();
				if (AcctGUI("Account Information",FALSE) == TRUE) {
					amount = 0;
					DataUpdateBal(DEPOSITTYPE,&amount,
						&amntState.currAmnt,currStr);
					AmiUpdateCurr(currStr);
				}
				break;


		}
	}

	else if (title == UTILITYTITLE) {
		AmiMoveRestore();
		switch (item) {
			case UTILITYREPORT:
				ReportGUI();
				break;

			case UTILITYSCRIPT:
				ScriptGUI();
				break;

			case UTILITYNET:
				NetGUI();
				break;
		}
	}

	else if (title == AREXXTITLE) {
		AmiMoveRestore();
		switch (item) {
			case AREXXASSIGN:
				if (ArexxGUI())
					AmiArexxMenu();
				break;

			case AREXXM1:
				AmiRunMacro(arexxMacros[0].macrofile);
				break;

			case AREXXM2:
				AmiRunMacro(arexxMacros[1].macrofile);
				break;

			case AREXXM3:
				AmiRunMacro(arexxMacros[2].macrofile);
				break;

			case AREXXM4:
				AmiRunMacro(arexxMacros[3].macrofile);
				break;

			case AREXXM5:
				AmiRunMacro(arexxMacros[4].macrofile);
				break;

			case AREXXM6:
				AmiRunMacro(arexxMacros[5].macrofile);
				break;

			case AREXXM7:
				AmiRunMacro(arexxMacros[6].macrofile);
				break;

			case AREXXM8:
				AmiRunMacro(arexxMacros[7].macrofile);
				break;

			case AREXXM9:
				AmiRunMacro(arexxMacros[8].macrofile);
				break;

			case AREXXM10:
				AmiRunMacro(arexxMacros[9].macrofile);
				break;

			case AREXXOTHER:

				AmiLock();
				if (AmiGetFile(gui,otherRexxASL,fname,FILESIZE)) {
 					AmiUnlock();
					AmiRunMacro(fname);
				}
				else {
					AmiUnlock();
				}

				break;

#if 0
			case AREXXBEGINREC:
				break;

			case AREXXENDREC:
				break;
#endif

			case AREXXOPENCMD:
				axOpenCmd();
				break;

			case AREXXCLOSECMD:
				axCloseCmd();
				break;
		}
	}

	else if (title == PREFSTITLE) {
		AmiMoveRestore();
		switch (item) {
			case PREFSWINDOW:
				switch (sub) {
					case PREFSWINDOWMEMO:
						RegSwapMemo();
						break;
				}
				break;

			case PREFSDCLICK:
				switch (sub) {
					case PREFSDCLICKE:
						dclicktype = 0;
						break;

					case PREFSDCLICKC:
						dclicktype=1;
						break;

					case PREFSDCLICKU:
						dclicktype=2;
						break;

				}
				break;

			case PREFSDATE:
				switch (sub) {
					case PREFSDATE1:
						dateFormat = DATE_MMDDYY;
						RegResetOffsets(1);
						RegRedrawFilter(0);
						QDateNewFormat();
						break;
					case PREFSDATE2:
						dateFormat = DATE_DDMMYY;
						RegResetOffsets(1);
						RegRedrawFilter(0);
						QDateNewFormat();
						break;
					case PREFSDATE3:
						dateFormat = DATE_DEC_12;
						RegResetOffsets(1);
						RegRedrawFilter(0);
						QDateNewFormat();
						break;
					case PREFSDATE4:
						dateFormat = DATE_12_DEC;
						RegResetOffsets(1);
						RegRedrawFilter(0);
						QDateNewFormat();
						break;
				}
				break;

			case PREFSFORM:
				FormGUI();
				break;
		}
	}

	menunum = menu->NextSelect;
 }

 return (done);
}

/********************************************************************
* AmiApplySort()
*
*	Enforce current order of filter
*********************************************************************/
void AmiApplySort(void)
{
 filterNode *filt = NULL;
 entryNode *last = NULL;

 AmiLock();
 if (!DataQuery(gui,"This will affect all filtered entries.\nAre you sure?","OK|Cancel")) {
	AmiUnlock();
	return;
 }

 while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {

	/* first entry will be our "top" */
	if (last != NULL) {
		Remove((struct Node *)filt->entry);
		Insert((struct List *)&entries,(struct Node *)filt->entry,(struct Node *)last);
	}

	last = filt->entry;
 }

 AmiUnlock();
}

/*********************************************************************
* AmiRangeMark()
*
*	Mark all filtered transactions
**********************************************************************/
void AmiRangeMark(long item)
{
 filterNode *filt = NULL;
 amountType amount;

 /* verify! */
 AmiLock();
 if (!DataQuery(gui,"This will affect all filtered entries.\nAre you sure?","OK|Cancel")) {
	AmiUnlock();
	return;
 }

 switch (item) {
 	case EDITRANGECLR:
		while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL)
			filt->entry->flags |= CLEARED;
		break;

 	case EDITRANGEUCL:
		while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL)
			filt->entry->flags &= ~CLEARED;
		break;

 	case EDITRANGEDED:
		while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL)
			filt->entry->flags |= TAXDEDUCT;
		break;

 	case EDITRANGEUND:
		while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL)
			filt->entry->flags &= ~TAXDEDUCT;
		break;

 	case EDITRANGEPR:
		while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
			if (filt->entry->type != CHECKTYPE)
				continue;

			filt->entry->flags |= PRINTED;
		}
		break;

 	case EDITRANGEUPR:
		while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
			if (filt->entry->type != CHECKTYPE)
				continue;

			filt->entry->flags &= ~PRINTED;
		}
		break;

 	case EDITRANGEVD:
		while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {

			if (filt->entry->type != CHECKTYPE)
				continue;

			amount = filt->entry->amount;
			if ( !(filt->entry->flags & VOIDED)) {
				DataUpdateBal(
					(filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
					&amount, &amntState.currAmnt, currStr);
			}
				filt->entry->flags |= VOIDED;
		}
		break;

 	case EDITRANGEUVD:
		while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,(struct Node *)filt)) != NULL) {
			if (filt->entry->type != CHECKTYPE)
				continue;

			amount = filt->entry->amount;
			if ((filt->entry->flags & VOIDED)) {
				DataUpdateBal(
					(filt->entry->type==DEPOSITTYPE)?DEPOSITTYPE:WITHDRAWALTYPE,
					&amount, &amntState.currAmnt, currStr);
			}
			filt->entry->flags &= ~VOIDED;
		}
		break;

 	case EDITRANGERM:
		while ( (filt = (filterNode *)DataGetNext((struct List *)&filtered,NULL)) != NULL) {
			amount = filt->entry->amount;
			if ( !(filt->entry->flags & VOIDED)) {
				DataUpdateBal(
					(filt->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
					&amount, &amntState.currAmnt, currStr);
			}
			DataRemoveEntry(filt->entry,filt);
		}
		break;
 }

 amiChangedItems = TRUE;
 DataUpdateFilters(&filtered);
 if (autosort == TRUE && !IsListEmpty(&sortfields))
	DataSortFilter((filterNode *)filtered.mlh_Head,
		       (filterNode *)filtered.mlh_TailPred,
		       (sortNode *)sortfields.lh_Head);
 RegNewFilter();
 DataFilterBalance(&filtered);
 DataBuildBal(usrAccount.decimal, &filtAmnt,filtStr);
 AmiUpdateFilt(filtStr);
 AmiUpdateCurr(currStr);
 AmiUnlock();
}

/*********************************************************************
* AmiToggleClear()
*
*	Toggles the clear flag of transaction
**********************************************************************/
void AmiToggleClear(void)
{
 filterNode *find;

 find = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
 find->entry->flags ^= CLEARED;

 if (DataTestFilter(find->entry,&filterControl))
	RegRedrawSel(find);

 else {
	if ( !(find->entry->flags & VOIDED))
		DataUpdateBal((find->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
				&find->entry->amount, &filtAmnt, filtStr);

	DataRemoveFilter(find);
	RegRemoveSel();
	AmiUpdateFilt(filtStr);
 }
}

/**********************************************************************
* AmiSearchFail()
*
*	Prompt user with search failure
***********************************************************************/
void AmiSearchFail(void)
{
 struct EasyStruct es;
 char *str = "No search matches found.";

 es.es_StructSize = sizeof(struct EasyStruct);
 es.es_Flags = 0;
 es.es_Title = "amiCheck NOTICE:";
 es.es_TextFormat = str;
 es.es_GadgetFormat = "OK";
 AmiLock();
 GF_EasyRequest(gui,amiWindow,&es,NULL);
 AmiUnlock();
}

/**********************************************************************
* AmiAboutPart()
*
*	About information! third party support
***********************************************************************/
void AmiAboutPart(void)
{
 struct EasyStruct es;
 char str[220];

 sprintf(str,"A big thankyou to the following\nquality third-party support:\nEasyRexx © 1994,1995 Ketil Hunn\nGuiFront © 1994 Michael Berg\n");
 es.es_StructSize = sizeof(struct EasyStruct);
 es.es_Flags = 0;
 es.es_Title = "About Third Parties:";
 es.es_TextFormat = str;
 es.es_GadgetFormat = "OK";
 AmiLock();
 GF_EasyRequest(gui,amiWindow,&es,NULL);
 AmiUnlock();

}

/**********************************************************************
* AmiAbout()
*
*	About information!
***********************************************************************/
void AmiAbout(void)
{
 struct EasyStruct es;
 char str[220];

 sprintf(str,"%s %s\nCopyright © 1995 Douglas M. Dyer\ndyer@alx.sticomet.com\n\nCheckbook software for the Amiga® computer\n\nPrinter Checks:\n1-800-336-4168  Acct#Q00305",
	AC_AppID,AC_Version);

 es.es_StructSize = sizeof(struct EasyStruct);
 es.es_Flags = 0;
 es.es_Title = "About amiCheck:";
 es.es_TextFormat = str;
 es.es_GadgetFormat = "OK";
 AmiLock();
 GF_EasyRequest(gui,amiWindow,&es,NULL);
 AmiUnlock();

}

/*********************************************************************
* AmiAnnounce()
*
*	Announce using a requester
**********************************************************************/
void AmiAnnounce(char *str)
{
 struct EasyStruct es;

 es.es_StructSize = sizeof(struct EasyStruct);
 es.es_Flags = 0;
 es.es_Title = "amiCheck NOTICE:";
 es.es_TextFormat = str;
 es.es_GadgetFormat = "OK";
 AmiLock();
 GF_EasyRequest(gui,amiWindow,&es,NULL);
 AmiUnlock();

}

/**********************************************************************
* AmiAsk()
*
*	ok/cancel requester
***********************************************************************/
BOOL AmiAsk(char *str)
{
 struct EasyStruct es;
 BOOL val = TRUE;

 if ( amiChangedItems == TRUE) {
	es.es_StructSize = sizeof(struct EasyStruct);
	es.es_Flags = 0;
	es.es_Title = "amiCheck NOTICE:";
	es.es_TextFormat = str;
	es.es_GadgetFormat = "OK|Save First|Cancel";
	AmiLock();
	val = GF_EasyRequest(gui,amiWindow,&es,NULL);
	AmiUnlock();

	/* save first if asked! */
 	if (val == 2) {
		if (AmiSave(NULL,FALSE))
			val--;
 	}
 }

 return (val);
}


/************************************************************
* AmiDisableSel()
*
*	Disables items that are not needed when no item
*	is selected.
*************************************************************/
void AmiDisableSel(BOOL dis)
{
 UWORD menunum1, menunum2, menunum3, menunum4, menunum5, menunum6;
 static BOOL disit = FALSE;

 if (dis == disit)
	return;

 disit = dis;

 /* disable menu items */
 menunum1 = FULLMENUNUM(EDITTITLE,EDITCLEAR,NOSUB);
 menunum2 = FULLMENUNUM(EDITTITLE,EDITUNCLEAR,NOSUB);
 menunum3 = FULLMENUNUM(EDITTITLE,EDITMOVE,NOSUB);
 menunum4 = FULLMENUNUM(SEARCHTITLE,SEARCHJUMP,NOSUB);
 menunum5 = FULLMENUNUM(EDITTITLE,EDITUNFILT,NOSUB);
 menunum6 = FULLMENUNUM(EDITTITLE,EDITDUPLICATE,NOSUB);
 if (dis) {
	OffMenu(amiWindow, menunum1);
	OffMenu(amiWindow, menunum2);
	OffMenu(amiWindow, menunum3);
	OffMenu(amiWindow, menunum4);
	OffMenu(amiWindow, menunum5);
	OffMenu(amiWindow, menunum6);
 }
 else {
	OnMenu(amiWindow, menunum1);
	OnMenu(amiWindow, menunum2);
	OnMenu(amiWindow, menunum3);
	OnMenu(amiWindow, menunum4);
	OnMenu(amiWindow, menunum5);
	OnMenu(amiWindow, menunum6);
 }

 /* disable edit button */
 GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_EDIT]->gs_Gadget,
		GA_Disabled,dis,
		TAG_DONE);

 if (dis)
 	AmiMoveRestore();
}

/************************************************************
* AmiDisableAll()
*
*	Disables all items - no account
*************************************************************/
void AmiDisableAll(BOOL dis)
{
 alldisabled = dis;

 /* turn off the other stuff if this is all off */
 if (dis)
	AmiDisableSel(TRUE);

 /* disable gadgets */
 if (dis == TRUE)
   GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_TREND]->gs_Gadget,
		GA_Disabled,dis,
		TAG_DONE);

 GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_GETSELTYPE]->gs_Gadget,
		GA_Disabled,dis,
		TAG_DONE);

 /*
 GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_ENTERTYPE]->gs_Gadget,
		GA_Disabled,dis,
		TAG_DONE);
 */

 GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_NEWTYPE]->gs_Gadget,
		GA_Disabled,dis,
		TAG_DONE);

 GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_FILTER]->gs_Gadget,
		GA_Disabled,dis,
		TAG_DONE);

 GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_STATS]->gs_Gadget,
		GA_Disabled,dis,
		TAG_DONE);

 GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_BUDGET]->gs_Gadget,
		GA_Disabled,dis,
		TAG_DONE);

 GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_ANALYSIS]->gs_Gadget,
		GA_Disabled,dis,
		TAG_DONE);

 GF_SetGadgetAttrs(gui,AC_MainSpecs[GID_SORT]->gs_Gadget,
		GA_Disabled,dis,
		TAG_DONE);


 /* disable menu items */
 if (dis) {
	OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEAS,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITQUICK,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITBATCH,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITAPPLYSORT,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(SEARCHTITLE,SEARCHSEARCH,NOSUB));
 	OffMenu(amiWindow,FULLMENUNUM(SEARCHTITLE,SEARCHAGAIN,NOSUB));
 	OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITRANGE,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITACCT,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(UTILITYTITLE,UTILITYREPORT,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(PREFSTITLE,PREFSFORM,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITDATA,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEIMPORT,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEEXPORT,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEPRINT,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(FILETITLE,FILERECON,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXASSIGN,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM1,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM2,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM3,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM4,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM5,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM6,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM7,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM8,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM9,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM10,NOSUB));

	/* "never" turn these off */
#if 0
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXOTHER,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXOPENCMD,NOSUB));
	OffMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXCLOSECMD,NOSUB));
#endif
 }
 else {
	OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEAS,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITQUICK,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITBATCH,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITAPPLYSORT,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(SEARCHTITLE,SEARCHSEARCH,NOSUB));
 	OnMenu(amiWindow,FULLMENUNUM(SEARCHTITLE,SEARCHAGAIN,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITACCT,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(UTILITYTITLE,UTILITYREPORT,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITRANGE,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(EDITTITLE,EDITDATA,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILERECON,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(PREFSTITLE,PREFSFORM,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEPRINT,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEIMPORT,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILEEXPORT,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXASSIGN,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM1,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM2,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM3,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM4,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM5,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM6,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM7,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM8,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM9,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXM10,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXOTHER,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXOPENCMD,NOSUB));
	OnMenu(amiWindow,FULLMENUNUM(AREXXTITLE,AREXXCLOSECMD,NOSUB));
 }
}

/*********************************************************
* AmiHandleGadgetDown()
*
*	Handle those down buttons
**********************************************************/
void AmiHandleGadgetDown(struct IntuiMessage *imsg)
{
 struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
 UWORD code = imsg->Code;
 filterNode *node;
 amountType amount;

 switch (gad->GadgetID) {
	case GID_REGFIELD:
		if (RegHitTest(imsg->Micros, imsg->Seconds, imsg->MouseX,imsg->MouseY)) {
			if (dclicktype == 1)
				AmiToggleClear();

			else if (dclicktype == 2) {
				node = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
				amount = node->entry->amount;
				if ( !(node->entry->flags & VOIDED)) {
					DataUpdateBal(
						(node->entry->type==DEPOSITTYPE)?WITHDRAWALTYPE:DEPOSITTYPE,
						&amount, &filtAmnt, filtStr);
					AmiUpdateFilt(filtStr);
				}
				DataRemoveFilter(node);
				RegRemoveSel();
			}

			else	AmiEditEntry();
		}
		break;

	case GID_REGVSCROL:
		RegMoveList(&filtered,code);
		RegRefresh(FALSE);
		break;

 }
}

/**********************************************************
* AmiAllocRequesters()
*
*	Alocates and sets up asl requestors for both loads and
*	one saveas
***********************************************************/
BOOL AmiAllocRequesters(void)
{

 /* allocate the generic tag list */
 aslTagList = AllocateTagItems(5);
 if (aslTagList) {
	aslTagList[0].ti_Tag = 	ASL_Window;
	aslTagList[0].ti_Data = (unsigned long)amiWindow;
	aslTagList[1].ti_Tag = ASL_Height;
	aslTagList[1].ti_Data = amiAslHeight;
	aslTagList[2].ti_Tag = ASL_OKText;
	aslTagList[2].ti_Data = (unsigned long)"OK";
	aslTagList[3].ti_Tag = ASL_CancelText;
	aslTagList[3].ti_Data = (unsigned long)"Cancel";
	aslTagList[4].ti_Tag = TAG_DONE;
 }
 else return (FALSE);

 scriptASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
		scriptloadtags);
 if (scriptASL == NULL)
	return (FALSE);

 scriptsaveASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
		scriptsavetags);
 if (scriptsaveASL == NULL)
	return (FALSE);

 otherRexxASL =  (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
		rexxtags);
 if (otherRexxASL == NULL)
	return (FALSE);

 loadASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
		loadtags);
 if (loadASL == NULL)
	return (FALSE);

 saveASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
		savetags);
 if (saveASL == NULL)
	return (FALSE);

 impasciiASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
		impasciitags);
 if (impasciiASL == NULL)
	return (FALSE);

 expasciiASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
		expasciitags);
 if (expasciiASL == NULL)
	return (FALSE);

 netsaveASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
		netsavetags);
 if (netsaveASL == NULL)
	return (FALSE);

 netloadASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
		netloadtags);
 if (netloadASL == NULL)
	return (FALSE);

 reportASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
		reporttags);
 if (reportASL == NULL)
	return (FALSE);

 devASL = (struct FileRequester *)AllocAslRequest(ASL_FileRequest,
		devtags);
 if (devASL == NULL)
	return (FALSE);

 return (TRUE);
}

/****************************************************************
* AmiUpdateFilt()
*
*	Updates the Filter balance field
*****************************************************************/
void AmiUpdateFilt(char *str)
{
 strcpy(filtStr,str);
 GF_SetGadgetAttrs(gui,gadgetspecs[GID_RUNBAL].gs_Gadget,
	GTTX_Text,filtStr,
	TAG_DONE);
}

/****************************************************************
* AmiUpdateCurr()
*
*	Updates the curr balance field
*****************************************************************/
void AmiUpdateCurr(char *str)
{
 strcpy(currStr,str);
 GF_SetGadgetAttrs(gui,gadgetspecs[GID_CURRBAL].gs_Gadget,
	GTTX_Text,currStr,
	TAG_DONE);
}

/****************************************************************
* AmiUpdateState()
*
*	Updates the Statement balance field
*****************************************************************/
void AmiUpdateState(char *str)
{
 strcpy(stateStr,str);
 GF_SetGadgetAttrs(gui,gadgetspecs[GID_STATBAL].gs_Gadget,
	GTTX_Text,stateStr,
	TAG_DONE);
}

/*******************************************************************************
* AmiParseCmd()
*
*	Parse the input tooltypes and parameters
********************************************************************************/
void AmiParseCmd(int argc, char **argv)
{
 char *ptr;
 ULONG rows;
 char dtype[80];

 strcpy(filePattern,DEFAULT_FILEPATTERN);
 strcpy(importPattern,DEFAULT_IMPORTPATTERN);
 strcpy(scriptPattern,DEFAULT_SCRIPTPATTERN);
 strcpy(netPattern,DEFAULT_NETPATTERN);

#if 0
 if (argc==0) {
	sprintf(iconPath,"AC_Icons/");
	sprintf(guidePath,"documents/amiCheck.guide");
	return;
 }
 else {
	ptr = PathPart(argv[0]);
	if (ptr != NULL) {
		if (*ptr == '/')
			*(ptr+1) = NULL;
		else *ptr = NULL;

		sprintf(iconPath,"%sAC_Icons/",argv[0]);
		sprintf(guidePath,"%sdocuments/amiCheck.guide",argv[0]);
	}
	else {
		sprintf(iconPath,"AC_Icons/");
		sprintf(guidePath,"documents/amiCheck.guide");
	}
 }

#endif

 while (argc>1) {
	/* templaterows */
	if (strnicmp(argv[argc-1],"TEMPLATEROWS",strlen("TEMPLATEROWS") ) == 0) {
		ptr = strchr(argv[argc-1],'=');
		if (ptr != NULL) {
			sscanf(ptr+1,"%d",&rows);
			if (rows < 5) rows = 5;
			SP_SelTempSpecs[GID_SPTEMPLIST]->gs_MinHeight = rows;
		}
	}

	/* aslheight */
	else if (strnicmp(argv[argc-1],"ASLHEIGHT",strlen("ASLHEIGHT") ) == 0) {
		ptr = strchr(argv[argc-1],'=');
		if (ptr != NULL) {
			sscanf(ptr+1,"%u",&amiAslHeight);
		}
	}

	/* numcols */
	else if (strnicmp(argv[argc-1],"NUMCOLS",strlen("NUMCOLS") ) == 0) {
		ptr = strchr(argv[argc-1],'=');
		if (ptr != NULL) {
			sscanf(ptr+1,"%d",&rows);
			if (rows < 5) rows = 5;
			gadgetspecs[GID_REGFIELD].gs_MinWidth = rows;
		}
	}

	/* numrows */
	else if (strnicmp(argv[argc-1],"NUMROWS",strlen("NUMROWS") ) == 0) {
		ptr = strchr(argv[argc-1],'=');
		if (ptr != NULL) {
			sscanf(ptr+1,"%d",&rows);
			if (rows < 5) rows = 5;
			gadgetspecs[GID_REGFIELD].gs_MinHeight = rows;
		}
	}

	/* layout change warning */
	else if (strnicmp(argv[argc-1],"NOLAYOUTWARN",strlen("NOLAYOUTWARN") ) == 0) {
		layoutwarn = FALSE;
	}

	/* autosort flag */
	else if (strnicmp(argv[argc-1],"AUTOSORT",strlen("AUTOSORT") ) == 0) {
		autosort = TRUE;
	}

	/* show memo flag */
	else if (strnicmp(argv[argc-1],"SHOWMEMO",strlen("SHOWMEMO") ) == 0) {
		showMemo = TRUE;
	}

	/* DCLICK flag */
	else if (strnicmp(argv[argc-1],"DCLICK",strlen("DCLICK") ) == 0) {
		dclicktype = 0;
		ptr = strchr(argv[argc-1],'=');
		if (ptr != NULL) {
			sscanf(ptr+1,"%s",dtype);
			if (strnicmp(dtype,"CLEAR",strlen("CLEAR")) == 0)
				dclicktype = 1;
			else if (strnicmp(dtype,"UNFILT",strlen("UNFILT")) == 0)
				dclicktype = 2;
			else if (strnicmp(dtype,"EDIT",strlen("EDIT")) == 0)
				dclicktype = 0;
		}
	}

	/* DATE flag */
	else if (strnicmp(argv[argc-1],"DATE",strlen("DATE") ) == 0) {
		dateFormat = DATE_MMDDYY;
		ptr = strchr(argv[argc-1],'=');
		if (ptr != NULL) {
			sscanf(ptr+1,"%s",dtype);
			if (strnicmp(dtype,"FORMAT1",strlen("FORMAT1")) == 0)
				dateFormat = DATE_MMDDYY;
			else if (strnicmp(dtype,"FORMAT2",strlen("FORMAT2")) == 0)
				dateFormat = DATE_DDMMYY;
			else if (strnicmp(dtype,"FORMAT3",strlen("FORMAT3")) == 0)
				dateFormat = DATE_DEC_12;
			else if (strnicmp(dtype,"FORMAT4",strlen("FORMAT4")) == 0)
				dateFormat = DATE_12_DEC;
		}
	}

	/* LOAD pattern */
	else  if (strnicmp(argv[argc-1],"LOADPATTERN",strlen("LOADPATTERN") ) == 0) {
		ptr = strchr(argv[argc-1],'=');
		if (ptr != NULL) {
			sscanf(ptr+1,"%s",dtype);
			if (strlen(dtype) < FILEPATTERN_SIZE) {
				strcpy(filePattern,dtype);
			}
		}
	}

	/* IMPORT pattern */
	else  if (strnicmp(argv[argc-1],"IMPORTPATTERN",strlen("IMPORTPATTERN") ) == 0) {
		ptr = strchr(argv[argc-1],'=');
		if (ptr != NULL) {
			sscanf(ptr+1,"%s",dtype);
			if (strlen(dtype) < FILEPATTERN_SIZE) {
				strcpy(importPattern,dtype);
			}
		}
	}

	/* SCRIPT pattern */
	else  if (strnicmp(argv[argc-1],"SCRIPTPATTERN",strlen("SCRIPTPATTERN") ) == 0) {
		ptr = strchr(argv[argc-1],'=');
		if (ptr != NULL) {
			sscanf(ptr+1,"%s",dtype);
			if (strlen(dtype) < FILEPATTERN_SIZE) {
				strcpy(scriptPattern,dtype);
			}
		}
	}

	/* NET pattern */
	else  if (strnicmp(argv[argc-1],"NETPATTERN",strlen("NETPATTERN") ) == 0) {
		ptr = strchr(argv[argc-1],'=');
		if (ptr != NULL) {
			sscanf(ptr+1,"%s",dtype);
			if (strlen(dtype) < FILEPATTERN_SIZE) {
				strcpy(netPattern,dtype);
			}
		}
	}

	/* is it a tooltype comment or file name? */
	else if ( (char)*argv[argc-1] != '(' && !bootfile) {
		/* assume it to be a file */
		strcpy(currFile, argv[argc-1]);
		bootfile = TRUE;
	}
	argc--;
 }
}

/********************************************************************************
* AmiOpenGUI()
*
*	open all guis in system
*
*********************************************************************************/
BOOL AmiOpenGUI(void)
{

 seltempGUI =  GF_CreateGUI(guiapp, SP_SelTempPanel,SP_SelTempSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Templates",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)FALSE,
		GUI_ExtraIDCMP,		(ULONG)IDCMP_RAWKEY,
		GUI_NewMenu,		amiMenu,
		GUI_ScreenTitle,	AC_Title,
                TAG_DONE);
 if (seltempGUI == NULL)
	return (FALSE);

 edittempGUI = GF_CreateGUI(guiapp, TP_EditTempPanel,TP_EditTempSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Edit Template List",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)IDCMP_RAWKEY,
		GUI_ScreenTitle,	AC_Title,
                TAG_DONE);
 if (edittempGUI == NULL)
	return (FALSE);

 newGUI = GF_CreateGUI(guiapp, NP_EnterPanel,NP_EnterSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)NULL,
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
		GUI_ScreenTitle,	AC_Title,
                TAG_DONE);
 if (newGUI == NULL)
	return (FALSE);

 filterGUI = GF_CreateGUI(guiapp, FP_FilterPanel,FP_FilterSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Edit Filter Settings",
                GUI_OpenGUI,            (ULONG)FALSE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ScreenTitle,	AC_Title,
                TAG_DONE);
 if (filterGUI == NULL)
	return (FALSE);

 sortGUI = GF_CreateGUI(guiapp, SRP_SortPanel,SRP_SortSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Register Sort",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)IDCMP_RAWKEY,
		GUI_ScreenTitle,	AC_Title,
                TAG_DONE);
 if (sortGUI == NULL)
	return (FALSE);

 entryGUI = GF_CreateGUI(guiapp, EP_EnterPanel,EP_EnterSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)NULL,
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
		GUI_ScreenTitle,	AC_Title,
                TAG_DONE);
 if (entryGUI == NULL)
	return (FALSE);

 recGUI = GF_CreateGUI(guiapp, RCP_RecPanel,RCP_RecSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Reconciliation",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
		GUI_ScreenTitle,	AC_Title,
                TAG_DONE);
 if (recGUI == NULL)
	return (FALSE);

 acctGUI = GF_CreateGUI(guiapp, ACP_AcctPanel,ACP_AcctSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)NULL,
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
	  	GUI_ExtraIDCMP,		(ULONG)IDCMP_ACTIVEWINDOW,
		GUI_ScreenTitle,	AC_Title,
                TAG_DONE);
 if (acctGUI == NULL)
	return (FALSE);

 searchGUI = GF_CreateGUI(guiapp, SEP_SearchPanel,SEP_SearchSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Register Search ",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
		TAG_DONE);
 if (searchGUI == NULL)
	return (FALSE);

 catGUI = GF_CreateGUI(guiapp, CP_CatPanel,CP_CatSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Edit Category List",
                GUI_OpenGUI,            (ULONG)FALSE,
	        GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_RAWKEY | IDCMP_ACTIVEWINDOW),
		GUI_ScreenTitle,	AC_Title,
                TAG_DONE);
 if (catGUI == NULL)
	return (FALSE);

 statGUI = GF_CreateGUI(guiapp, STP_StatPanel,STP_StatSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Register Statistics ",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)FALSE,
		GUI_ExtraIDCMP,		(ULONG)IDCMP_RAWKEY,
		GUI_ScreenTitle,	AC_Title,
                TAG_DONE);
 if (statGUI == NULL)
	return (FALSE);

 repGUI = GF_CreateGUI(guiapp, REP_ReportPanel,REP_ReportSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Report Generator",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)IDCMP_ACTIVEWINDOW,
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (repGUI == NULL)
	return (FALSE);

 scriptGUI = GF_CreateGUI(guiapp, SCP_ScriptPanel,SCP_ScriptSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Script Editor ",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (scriptGUI == NULL)
	return (FALSE);

 groupGUI = GF_CreateGUI(guiapp, GRP_GroupPanel,GRP_GroupSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Group Editor ",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (groupGUI == NULL)
	return (FALSE);

 analGUI = GF_CreateGUI(guiapp, AN_MainPanel,AN_MainSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Graphical Analysis",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)FALSE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (analGUI == NULL)
	return (FALSE);

 qdateGUI = GF_CreateGUI(guiapp, QD_DatePanel,QD_DateSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Dates",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (qdateGUI == NULL)
	return (FALSE);

 qmemoGUI = GF_CreateGUI(guiapp, QM_MemoPanel,QM_MemoSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Memos",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)FALSE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (qmemoGUI == NULL)
	return (FALSE);

 memoGUI = GF_CreateGUI(guiapp, M_MemoPanel,M_MemoSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Quick-Memo Editor",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (memoGUI == NULL)
	return (FALSE);

 qnameGUI = GF_CreateGUI(guiapp, QN_NamePanel,QN_NameSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Payees",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)FALSE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (qnameGUI == NULL)
	return (FALSE);

 qamntGUI = GF_CreateGUI(guiapp, QA_AmntPanel,QA_AmntSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Amounts",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)FALSE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (qamntGUI == NULL)
	return (FALSE);

 nameGUI = GF_CreateGUI(guiapp, N_NamePanel,N_NameSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Quick-Payee Editor",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (nameGUI == NULL)
	return (FALSE);

 amntGUI = GF_CreateGUI(guiapp, A_AmntPanel,A_AmntSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Quick-Amount Editor",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (amntGUI == NULL)
	return (FALSE);

 formGUI = GF_CreateGUI(guiapp, FP_FormPanel,FP_FormSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Check Forms ",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)IDCMP_ACTIVEWINDOW,
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (formGUI == NULL)
	return (FALSE);

 netGUI = GF_CreateGUI(guiapp, NET_NetPanel,NET_NetSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Net Worth Analysis",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (netGUI == NULL)
	return (FALSE);

 printGUI = GF_CreateGUI(guiapp, PR_PrintPanel,PR_PrintSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Print Checks",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (printGUI == NULL)
	return (FALSE);

 arexxGUI = GF_CreateGUI(guiapp, AX_ArexxPanel,AX_ArexxSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Assign Macros",
                GUI_OpenGUI,            (ULONG)FALSE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (arexxGUI == NULL)
	return (FALSE);

#if 0
 budgetGUI = GF_CreateGUI(guiapp, BP_BudgetPanel,BP_BudgetSpecs,
                GUI_InitialOrientation, (ULONG)GUIL_VertGroup,
                GUI_WindowTitle,        (ULONG)"Budget Distribution",
                GUI_OpenGUI,            (ULONG)TRUE,
                GUI_Backfill,           (ULONG)TRUE,
		GUI_ExtraIDCMP,		(ULONG)(IDCMP_ACTIVEWINDOW | IDCMP_RAWKEY),
		GUI_ScreenTitle,	AC_Title,
             	TAG_DONE);
 if (budgetGUI == NULL)
	return (FALSE);
#endif

 return (TRUE);
}

/********************************************************************************
* AmiCloseGUI()
*
*	Destroys guis
*
*********************************************************************************/
void AmiCloseGUI(void)
{
 selWin = NULL;
if (seltempGUI) GF_DestroyGUI(seltempGUI);
if (edittempGUI) GF_DestroyGUI(edittempGUI);
if (newGUI) GF_DestroyGUI(newGUI);
if (filterGUI) GF_DestroyGUI(filterGUI);
if (sortGUI) GF_DestroyGUI(sortGUI);
if (entryGUI) GF_DestroyGUI(entryGUI);
if (recGUI) GF_DestroyGUI(recGUI);
if (acctGUI) GF_DestroyGUI(acctGUI);
if (searchGUI) GF_DestroyGUI(searchGUI);
if (catGUI) GF_DestroyGUI(catGUI);
if (statGUI) GF_DestroyGUI(statGUI);
if (repGUI) GF_DestroyGUI(repGUI);
if (scriptGUI) GF_DestroyGUI(scriptGUI);
if (groupGUI) GF_DestroyGUI(groupGUI);
if (analGUI) GF_DestroyGUI(analGUI);
if (formGUI) GF_DestroyGUI(formGUI);
if (netGUI) GF_DestroyGUI(netGUI);
if (qdateGUI) GF_DestroyGUI(qdateGUI);
if (qmemoGUI) GF_DestroyGUI(qmemoGUI);
if (memoGUI) GF_DestroyGUI(memoGUI);
if (nameGUI) GF_DestroyGUI(nameGUI);
if (amntGUI) GF_DestroyGUI(amntGUI);
if (qamntGUI) GF_DestroyGUI(qamntGUI);
if (qnameGUI) GF_DestroyGUI(qnameGUI);
if (printGUI) GF_DestroyGUI(printGUI);
if (arexxGUI) GF_DestroyGUI(arexxGUI);
#if 0
if (budgetGUI) GF_DestroyGUI(budgetGUI);
#endif
}

/********************************************************
* AmiMoveSwap()
*
*	Move the selected item!
*********************************************************/
void AmiMoveSwap(void)
{
 filterNode *ftemp;
 entryNode *etemp, *entemp;
 UWORD eord, enord;

 if (!moveActive || selRow == -1)
	return;

 ftemp = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
 if (ftemp != moveNode) {

	/* move the template nodes first */
	Remove((struct Node *)moveNode);
	if (selRow > moveRow)
		Insert( (struct List *)&filtered,(struct Node *)moveNode, (struct Node *)ftemp);
	else 	Insert( (struct List *)&filtered,(struct Node *)moveNode, (struct Node *)ftemp->node.mln_Pred);

	/* swap the ACTUAL ENTRY NODE */
	etemp = moveNode->entry;
	entemp = ftemp->entry;
	eord = DataFindNode( (struct List *)&entries, (struct Node *)etemp);
 	enord = DataFindNode( (struct List *)&entries, (struct Node *)entemp);
	Remove((struct Node *)etemp);

	if (enord > eord)
		Insert( (struct List *)&entries,(struct Node *)etemp, (struct Node *)entemp);
	else	Insert( (struct List *)&entries,(struct Node *)etemp, (struct Node *)entemp->node.mln_Pred);

	/* display changes */
	RegMoveList(&filtered,regTopRow);
	RegRefresh(FALSE);
/*
	RegRedrawRow(moveNode);
	RegRedrawSel(entemp);
*/

	amiChangedItems = TRUE;
 }

 AmiMoveRestore();
}

/********************************************************
* AmiMoveActive()
*
*	activates mouse ptr and move state
*********************************************************/
void AmiMoveActive(void)
{
 moveActive = TRUE;
 moveNode = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
 moveRow = selRow;
 if (!OS39)
	SetPointer(amiWindow,movePointer37,7,14,0,-3);
 else
	SetWindowPointer(amiWindow,
		WA_Pointer,moveObj,
		TAG_DONE);
}


/********************************************************
* AmiMoveRestore()
*
*	restores mouse ptr and move state
*********************************************************/
void AmiMoveRestore(void)
{

 moveActive = FALSE;
 moveNode = NULL;
 if (!OS39)
	ClearPointer(amiWindow);
 else {
	/*printf("os39 specific\n");*/
	SetWindowPointer(amiWindow,
		WA_Pointer,NULL,
		TAG_DONE);
 }
}

/********************************************************
* AmiUnlock()
*
*	Unlocks amicheck, supplies normal pointer
*********************************************************/
void AmiUnlock()
{

 GF_UnlockGUI(gui);
 if (selWin != NULL)
	GF_UnlockGUI(seltempGUI);

 if (!OS39)
	ClearPointer(amiWindow);
 else {
	/*printf("os39 specific\n");*/
	SetWindowPointer(amiWindow,
		WA_Pointer,NULL,
		WA_BusyPointer,FALSE,
		TAG_DONE);
 }
}

/********************************************************
* AmiLock()
*
*	locks amicheck, supplies wait pointer
*********************************************************/
void AmiLock()
{

 GF_LockGUI(gui);

 if (selWin != NULL)
	GF_LockGUI(seltempGUI);

 if (!OS39)
	SetPointer(amiWindow,busyPointer37,16,16,-5,0);
 else {
	/*printf("os39 specific\n");*/
	SetWindowPointer(amiWindow,
		WA_Pointer,NULL,
		WA_BusyPointer,TRUE,
		WA_PointerDelay,FALSE,
		TAG_DONE);
 }
}

/**********************************************************************
* AmiCheckRenumber()
*
* renumber a check quickly -+ 1-9
***********************************************************************/
void AmiCheckRenumber(char op, long amnt)
{
 filterNode *filt;

 if (selRow == -1)
	return;

 filt = (filterNode *)DataOrd2Node((struct List *)&filtered,selRow);
 if (filt->entry->type != CHECKTYPE)
	return;

 switch (op) {
	case 0:
		if (filt->entry->check >= amnt) {
			filt->entry->check -= amnt;
			RegRedrawSel(filt);
			amiChangedItems = TRUE;
			amntState.currCheckNumber = filt->entry->check+1;
		}
		break;
	case 1:	;
		if (filt->entry->check + amnt < filt->entry->check)
			break;
		filt->entry->check += amnt;
		RegRedrawSel(filt);
		amiChangedItems = TRUE;
		amntState.currCheckNumber = filt->entry->check+1;
		break;
 }
}

/**********************************************************************************
* AmiSetupMemo()
*
* 	Inits the show memo check in the menu to the tooltype
***********************************************************************************/
void AmiSetupMemo(void)
{
 struct MenuItem *menu;

 menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSWINDOW,PREFSWINDOWMEMO));
 menu->Flags &= ~CHECKED;
 if (showMemo) menu->Flags |= CHECKED;
 ResetMenuStrip(amiWindow,menuStrip);
}


/**********************************************************************************
* AmiSetupDclick()
*
* 	Inits the check in the dclick to the tooltype
***********************************************************************************/
void AmiSetupDclick(void)
{
 struct MenuItem *menu;

 switch (dclicktype) {
	case 1:
	 	menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDCLICK,PREFSDCLICKC));
 		menu->Flags |= CHECKED;
 		ResetMenuStrip(amiWindow,menuStrip);
		break;

	case 2:
	 	menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDCLICK,PREFSDCLICKU));
 		menu->Flags |= CHECKED;
 		ResetMenuStrip(amiWindow,menuStrip);
		break;

	default:
 		menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDCLICK,PREFSDCLICKE));
 		menu->Flags |= CHECKED;
 		ResetMenuStrip(amiWindow,menuStrip);
		break;
 }
}

/**********************************************************************************
* AmiSetupDate()
*
* 	Inits the check in the date to the tooltype
***********************************************************************************/
void AmiSetupDate(void)
{
 struct MenuItem *menu;

 switch (dateFormat) {
	case DATE_DEC_12:
	 	menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDATE,PREFSDATE2));
 		menu->Flags |= CHECKED;
 		ResetMenuStrip(amiWindow,menuStrip);
		break;

	case DATE_12_DEC:
	 	menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDATE,PREFSDATE3));
 		menu->Flags |= CHECKED;
 		ResetMenuStrip(amiWindow,menuStrip);
		break;

	default:
 		menu = ItemAddress(menuStrip,FULLMENUNUM(PREFSTITLE,PREFSDATE,PREFSDATE1));
 		menu->Flags |= CHECKED;
 		ResetMenuStrip(amiWindow,menuStrip);
		break;
 }
}

/**************************************************************************************
* AmiArexxMenu()
*
*	Sets up macro labels in menu
***************************************************************************************/
void AmiArexxMenu(void)
{
 int x;
 struct MenuItem *menu;

 for (x=0;x<MAXMACROS;x++) {
 	menu = ItemAddress(menuStrip, FULLMENUNUM(AREXXTITLE,AREXXM1+x,NOSUB));
	ResetMenuStrip(amiWindow,menuStrip);
 }

/*sprintf(arexxMacros[2].macroname,"now at %d\n",entryCount);*/
}

/**************************************************************************
* AmiSave()
*
*	Save the application
****************************************************************************/
BOOL AmiSave(char *fname, BOOL saveas)
{
BOOL ret = TRUE;

AmiLock();

/* is this a new file? */
if (saveas) {
	if (fname != NULL) {
		strcpy(currFile, fname);
		stcgfn(currNode, currFile);
	}
	else {
		if (AmiGetFile(gui,saveASL,currFile,FILESIZE) == 0) {
			ret = FALSE;
			goto FINISHED;
		}

		strcpy(currNode, saveASL->fr_File);
	}
}


if (DataSaveFile(currFile, saveas) == FALSE) {
		AmiAnnounce("Encountered trouble trying to save file.");
}
else {
	if (saveas) {
		DataAttachIcon(iconPath,"AC_Account",currFile);
		sprintf(amiWindowTitle,"%s: %s",AC_WindowTitle,	currNode);
		SetWindowTitles(amiWindow,amiWindowTitle,(UBYTE *)-1);
		OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
		OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));
	}

	amiChangedItems = FALSE;
}

FINISHED:

AmiUnlock();
return ret;
}

/***************************************************************
* AmiOpen()
*
*	Open an application
****************************************************************/
void AmiOpen(char *appfile, BOOL force)
{
char fname[FILESIZE];

if (force || AmiAsk(newstr)) {

	/* open, and change window title */
	AmiLock();
	if (appfile != NULL || AmiGetFile(gui,loadASL,fname,FILESIZE)) {
		AmiDisableSel(TRUE);
		OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVE,NOSUB));
		OnMenu(amiWindow,FULLMENUNUM(FILETITLE,FILESAVEEXIT,NOSUB));

		AmiLock();

		/* file was selected, open it */
		if (appfile != NULL)
			strcpy(fname,appfile);

		seldone = TRUE;
		SelTempStrip();

		amiChangedItems = FALSE;
		DataFreeAll();
		DataInit();

		RegNewFilter();
		AmiResetBals();

		/* insert data */
		if (DataLoadFile(fname) != TRUE) {
			AmiAnnounce("Encountered trouble opening file\n");
		}
		else {
			/* partition out file name */
			if (appfile != NULL) {
				stcgfn(currNode,appfile);
				strcpy(currFile,appfile);
			}
			else	{
				strcpy(currNode,loadASL->fr_File);
				strcpy(currFile,fname);
			}

			sprintf(amiWindowTitle,"%s: %s",AC_WindowTitle,
				currNode);
			SetWindowTitles(amiWindow,amiWindowTitle,(UBYTE *)-1);

			if (autosort == TRUE && !IsListEmpty(&sortfields))
				DataSortFilter((filterNode *)filtered.mlh_Head,
	       				(filterNode *)filtered.mlh_TailPred,
	       				(sortNode *)sortfields.lh_Head);

			AmiArexxMenu();

			RegNewFilter();
			DataFilterBalance(&filtered);
			AmiNewTemp();

			DataBuildBal(usrAccount.decimal,&amntState.currAmnt,currStr);
			DataBuildBal(usrAccount.decimal,&amntState.stateAmnt,stateStr);
			DataBuildBal(usrAccount.decimal,&filtAmnt,filtStr);
			AmiUpdateCurr(currStr);
			AmiUpdateState(stateStr);
			AmiUpdateFilt(filtStr);

			/* enable items */
			AmiDisableAll(FALSE);
		}
		AmiUnlock();
	}
	AmiUnlock();
}

}


/***************************************************
* AmiBaseHelp()
*
*	Initialize the amigaguide context
***************************************************/
LONG AmiBaseHelp(void)
{
 LONG retval = 0L;

  /* Fill in the NewAmigaGuide structure */
  memset(&newAG,0,sizeof(struct NewAmigaGuide));
  newAG.nag_Name = guidePath; /*guidePath;*/
  newAG.nag_Screen = amiWindow->WScreen;
  newAG.nag_BaseName = "amiCheck";

  /* Open the AmigaGuide client */
  if ( !(agc = OpenAmigaGuideAsync(&newAG,
			TAG_DONE))) {

	/* Get the reason for failure */
  	retval = IoErr();
  }

  return (retval);
}


/***************************************************
* AmiBaseLink()
*
*	Jump to a particular context
****************************************************/
void AmiBaseLink(char *link)
{

 if (!amigaguide || agc == NULL)
	return;

 SendAmigaGuideCmd(agc,
	link,
	NULL);
}

/****************************************************
* AmiHelpMsg()
*
*	Handle AmigaGuide messages
*****************************************************/
void AmiHelpMsg(void)
{
 struct AmigaGuideMsg *agm;

 while ( agm = GetAmigaGuideMsg(agc)) {

#if 0
	switch (agm->agm_Type) {

		case ToolCmdReplyID:
			if (agm->agm_Pri_Ret) {
				printf("ERROR!\n");
				printf("reason=%d,str=%s\n",agm->agm_Sec_Ret,agm->agm_Data);
			}
			break;

		case ToolStatusID:
			if (agm->agm_Pri_Ret) {
				printf("Status: ERROR!\n");
				printf("reason=%d,str=%s\n",agm->agm_Sec_Ret,agm->agm_Data);
			}
			break;
	}
#endif
	ReplyAmigaGuideMsg(agm);
 }

}

/**************************************************
* AmiHelpKey()
*
*	Open help link based on key
***************************************************/
void AmiHelpKey(struct IntuiMessage *imsg, ULONG panel)
{

 if (imsg->Code == HELP_KEY && amigaguide){
	AmiBaseLink(guideLinks[panel]);
 }
}

/***********************************************************************
* AmiRunMacro()
*
*	Run a macro given a file name
************************************************************************/
void AmiRunMacro(char *fname)
{
char copybuf[1024];
ULONG bytes=0;
FILE *new = NULL, *orig= NULL;


orig = fopen(fname,"r");
if (orig == NULL) {
	AmiAnnounce("Cannot read macro file.");
	return;
}

/* create temporary file in T: */
if ( (new= fopen(arexxTemp,"wc")) == NULL) {
	AmiAnnounce("Trouble preparing to run macro.");
	return;
}

/* copy stub "address amicheck" to it */
fprintf(new,"/* comment */\nADDRESS %s\n",axContext->portname);

/* insert rest of macro */
while ( (bytes = fread(copybuf,1,1024,orig)))
	fwrite(copybuf,1,bytes,new);

fclose(orig);
fclose(new);

/* execute macro */

/* execute macro */
/*
sprintf(copybuf,"run sys:rexxc/rx %s\n",arexxTemp);
system(copybuf);
*/

sprintf(copybuf,"sys:rexxc/rx %s\n",arexxTemp);
SystemTags(copybuf,
	SYS_Asynch, TRUE,
	TAG_DONE);
#if 0
RunARexxMacro(
	axContext,
	ER_MacroFile, fname,
	TAG_DONE);
#endif
}

/*************************************************************************
* AmiGetFile()
*
*	Get a file from an ASL requester
**************************************************************************/
BOOL AmiGetFile(GUIFront *wgui, struct FileRequester *asl, char *filestore, int storesize)
{
 BOOL retval = FALSE;

 if (asl == NULL || filestore == NULL)
	return FALSE;

 /* lock panel */
 AmiLock();
 GF_LockGUI(wgui);


 if (GF_AslRequest(asl,aslTagList)) {

	if (!DataGetFileName(filestore,storesize,asl->fr_Drawer,asl->fr_File))
		strncpy(filestore,asl->fr_File,storesize);

	retval = TRUE;
 }

 /* unlock panel */
 GF_UnlockGUI(wgui);
 AmiUnlock();

 return (retval);
}

/*******************************************************
* AmiResetBals()
*
*	Reset the balances to zero
********************************************************/
void AmiResetBals(void)
{
 amountType zero = 0;
 char amnt[AMNTSIZE];

 DataInitBal(DEPOSITTYPE,&zero,&amntState.currAmnt);
 DataInitBal(DEPOSITTYPE,&zero,&amntState.stateAmnt);
 DataInitBal(DEPOSITTYPE,&zero,&filtAmnt);

 DataBuildBal(usrAccount.decimal,&amntState.currAmnt,amnt);
 AmiUpdateCurr(amnt);

 DataBuildBal(usrAccount.decimal,&amntState.stateAmnt,amnt);
 AmiUpdateState(amnt);

 DataBuildBal(usrAccount.decimal,&filtAmnt,amnt);
 AmiUpdateFilt(amnt);
}
