/* enterPanel.c 
 *
 *  defines the GUIFront characteristics of the data-entry panel 
 */
 
#include <stdio.h>  
#include <intuition/gadgetclass.h>
#include <clib/intuition_protos.h>
#include "amiCheck.h"
#include "dataBase.h"
#include "enterPanel.h"
#include "qdatePanel.h"
#include "qmemoPanel.h"
#include "qnamePanel.h"
#include "qamntPanel.h"
#include "regGadget.h"
#include <string.h>


void EntryInit(BOOL, entryNode *, BOOL *);
BOOL EntryHandleGadget(struct IntuiMessage *);
BOOL EntryGoodbye(struct IntuiMessage *, entryNode *); 
BOOL skipped;

BOOL *deleteit;
ExtErrorData enterExtData;
entryNode 	newnode, *entryretval;
GUIFront *entryGUI;
static char amntstr[AMNTSIZE];
WORD catactive;
struct Window *myWin;

/* define gadgetspec */
GadgetSpec EPgadgetspecs[] = 
{

        {STRING_KIND,50,1,{0,0,0,0,"_Name",NULL,GID_EPNAME, /* 50 */
                PLACETEXT_LEFT}, strNameTags,GS_DefaultTags},
 
        {STRING_KIND,50,1,{0,0,0,0,"_Memo",NULL,GID_EPMEMO,
                PLACETEXT_LEFT}, strMemoTags,GS_DefaultTags},
 
        {STRING_KIND,10,1,{0,0,0,0,"_Amount",NULL,GID_EPAMNT, /* 10 */
                PLACETEXT_LEFT}, strAmntTags,GS_DefaultTags},
 
        {STRING_KIND,10,1,{0,0,0,0,"_Date",NULL,GID_EPDATE,
                PLACETEXT_LEFT}, strDateTags,GS_DefaultTags},
        

        {CHECKBOX_KIND,0,1,{0,0,0,0,"Mark _Printed",NULL,GID_EPPRINTED,
                PLACETEXT_RIGHT}, NULL,GS_DefaultTags},

        {CHECKBOX_KIND,0,1,{0,0,0,0,"_Tax Deductible",NULL,GID_EPTAX,
                PLACETEXT_RIGHT}, NULL,GS_DefaultTags},

        {CHECKBOX_KIND,0,1,{0,0,0,0,"Mark _Voided",NULL,GID_EPVOIDED,
                PLACETEXT_RIGHT}, NULL,GS_DefaultTags},

	
        {LISTVIEW_KIND, 30,1,{0,0,0,0,NULL,NULL,GID_EPCATEGORY,
                PLACETEXT_LEFT}, ListView, GS_DefaultTags},

        {INTEGER_KIND,9,1,{0,0,0,0,"Ch_eck", NULL, GID_EPNUMBER, /* 9 */
                PLACETEXT_LEFT}, strCheckTags, GS_DefaultTags },
                
        {BUTTON_KIND,0,0,{0,0,0,0,"_OK", NULL, GID_EPOK, 
                PLACETEXT_IN}, NULL, GS_DefaultTags},
                
        {BUTTON_KIND,0,0,{0,0,0,0,"_Skip", NULL, GID_EPSKIP, 
                PLACETEXT_IN}, NULL, GS_DefaultTags}, 
                
        {BUTTON_KIND,0,0,{0,0,0,0,"_Cancel", NULL, GID_EPCANCEL, 
                PLACETEXT_IN}, NULL, GS_DefaultTags},

	{TEXT_KIND,0,0,{0,0,0,0,"Type",NULL,GID_EPTEMPLATE,
		PLACETEXT_LEFT},TxtBorder,GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Remove", NULL, GID_EPREMOVE, 
                PLACETEXT_IN}, NULL, GS_DefaultTags},

        {GETALT_KIND, 0,0,{0,0,0,0,NULL,NULL,GID_EPDATELIST,
                PLACETEXT_LEFT}, MiscButton, GS_DefaultTags }, 

        {GETALT_KIND, 0,0,{0,0,0,0,NULL,NULL,GID_EPMEMOLIST,
                PLACETEXT_LEFT}, MiscButton, GS_DefaultTags }, 

        {GETALT_KIND, 0,0,{0,0,0,0,NULL,NULL,GID_EPNAMELIST,
                PLACETEXT_LEFT}, MiscButton, GS_DefaultTags },

        {GETALT_KIND, 0,0,{0,0,0,0,NULL,NULL,GID_EPAMNTLIST,
                PLACETEXT_LEFT}, MiscButton, GS_DefaultTags },
 
        {CHECKBOX_KIND,0,1,{0,0,0,0,"Mark C_leared",NULL,GID_EPCLEARED,
                PLACETEXT_RIGHT}, NULL,GS_DefaultTags},  

	{STRING_KIND,0,0,{0,0,0,0,"Date Cleared",NULL,GID_EPCLEARDATE,
		PLACETEXT_LEFT},strDateTags,GS_DefaultTags},

        {GETALT_KIND, 0,0,{0,0,0,0,NULL,NULL,GID_EPCLEARDATEQ,
                PLACETEXT_LEFT}, MiscButton, GS_DefaultTags },

	{TEXT_KIND,0,0,{0,0,0,0,"% Budgeted",NULL,GID_EPBUDGETED,
		PLACETEXT_LEFT},TxtBorder,GS_DefaultTags},

        {GETALT_KIND, 0,0,{0,0,0,0,NULL,NULL,GID_EPBUDGET,
                PLACETEXT_LEFT}, MiscButton, GS_DefaultTags },

        {BUTTON_KIND,0,0,{0,0,0,0,"Address...", NULL, GID_EPADDRESS, 
                PLACETEXT_IN}, NULL, GS_DefaultTags},
};

/* set up array of pointers to our specs */
GadgetSpec *EP_EnterSpecs[] =
{
        &EPgadgetspecs[0],
        &EPgadgetspecs[1],
        &EPgadgetspecs[2],
        &EPgadgetspecs[3],
        &EPgadgetspecs[4],
        &EPgadgetspecs[5],
        &EPgadgetspecs[6],
        &EPgadgetspecs[7],
        &EPgadgetspecs[8],
        &EPgadgetspecs[9],
        &EPgadgetspecs[10],
        &EPgadgetspecs[11],
	&EPgadgetspecs[12],
	&EPgadgetspecs[13],
	&EPgadgetspecs[14],
	&EPgadgetspecs[15],
	&EPgadgetspecs[16],
	&EPgadgetspecs[17],
	&EPgadgetspecs[18],
	&EPgadgetspecs[19],
	&EPgadgetspecs[20],
	&EPgadgetspecs[21],
	&EPgadgetspecs[22],
	&EPgadgetspecs[23],
        NULL,
};


/* define the layout of this panel */
ULONG EP_EnterPanel[] =
{
   GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,
      
   GUIL_HorizGroup, 1,
        GUIL_Flags, GUILF_PropShare, /* | GUILF_LabelAlign,*/
        GUIL_FrameType, GUILFT_Recess,
        
                GUIL_VertGroup,1,
			GUIL_HorizGroup,1,
				GUIL_VertGroup,1,
                        		GUIL_Flags, GUILF_LabelAlign | GUILF_EqualWidth,

					GUIL_GadgetSpecID, GID_EPTEMPLATE,
                                   
                        		GUIL_HorizGroup, 2,
                                		GUIL_Flags,GUILF_EqualSize,

						GUIL_GadgetSpecID, GID_EPNUMBER,
						
						GUIL_HorizGroup,0,
							GUIL_GadgetSpecID, GID_EPDATE,
							GUIL_GadgetSpecID, GID_EPDATELIST,
						TAG_DONE,

						GUIL_HorizGroup,0,
							GUIL_GadgetSpecID, GID_EPAMNT,
							GUIL_GadgetSpecID, GID_EPAMNTLIST,
						TAG_DONE,
                        		TAG_DONE, 
  
					GUIL_HorizGroup,0,
	                      			GUIL_GadgetSpecID, GID_EPNAME,
						GUIL_GadgetSpecID, GID_EPNAMELIST,
					TAG_DONE,

					GUIL_HorizGroup,0,
                        			GUIL_GadgetSpecID, GID_EPMEMO,
						GUIL_GadgetSpecID, GID_EPMEMOLIST,
					TAG_DONE,
				TAG_DONE,

			TAG_DONE,
        
			GUIL_HorizGroup, 1,
				GUIL_Flags, GUILF_PropShare | GUILF_EqualHeight,
				
				GUIL_VertGroup,1,
					GUIL_FrameType, GUILFT_Ridge,
					GUIL_Flags, GUILF_LabelAlign | GUILF_EqualWidth,
					GUIL_FrameHeadline, " Misc",
#if 1
              				GUIL_GadgetSpecID, GID_EPCATEGORY,
#endif
#if 0

					GUIL_VertGroup,1,
						GUIL_Flags, GUILF_LabelAlign | GUILF_EqualWidth,
						GUIL_HorizGroup,0,
							GUIL_GadgetSpecID, GID_EPCLEARDATE,
							GUIL_GadgetSpecID, GID_EPCLEARDATEQ,
						TAG_DONE,
		
						GUIL_HorizGroup, 0, 
							GUIL_GadgetSpecID, GID_EPBUDGETED,
							GUIL_GadgetSpecID, GID_EPBUDGET,
						TAG_DONE,
					TAG_DONE,
	
					GUIL_GadgetSpecID, GID_EPADDRESS,
#endif
				TAG_DONE,
               	
				GUIL_VertGroup, 1,
					GUIL_FrameType, GUILFT_Ridge,
					GUIL_FrameHeadline, "Flags",
					GUIL_GadgetSpecID, GID_EPCLEARED,
					GUIL_GadgetSpecID, GID_EPTAX,
					GUIL_GadgetSpecID, GID_EPVOIDED,
                			GUIL_GadgetSpecID, GID_EPPRINTED,
                      			
				TAG_DONE,

			TAG_DONE,

		TAG_DONE,   
    TAG_DONE,
    
    GUIL_HorizGroup,1,
        GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
        
           GUIL_GadgetSpecID, GID_EPOK,
	   GUIL_GadgetSpecID, GID_EPREMOVE,
           GUIL_GadgetSpecID, GID_EPSKIP,
           GUIL_GadgetSpecID, GID_EPCANCEL,
           
    TAG_DONE,
                  
TAG_DONE,
};


/****************************************************************
* EntryGUI()
*
*	creates gui for this panel
****************************************************************/
entryNode *EntryGUI(char *title, BOOL scripted, entryNode *editnode, BOOL *del)
{
 BOOL noreply,done = FALSE;
 UWORD ordinal;
 categoryNode *cat;
 ULONG signal;
     
   AmiLock();

		
		GF_SetGUIAttr(entryGUI, GUI_OpenGUI, TRUE, TAG_DONE);
		/* grab window */
	 	GF_GetGUIAttr(entryGUI,GUI_Window,&myWin,TAG_DONE);
		SetWindowTitles(myWin,title,(UBYTE *)-1);
		EntryInit(scripted, editnode, del);

#if 0
		/* map keys to quickwindows */
		GF_SetAliasKey(entryGUI,0x0f ,GID_EPDATELIST);
		GF_SetAliasKey(entryGUI,0x1d ,GID_EPAMNTLIST);
		GF_SetAliasKey(entryGUI,0x1e ,GID_EPNAMELIST);
		GF_SetAliasKey(entryGUI,0x1f ,GID_EPMEMOLIST);
#endif


                /* Process input events */
                while (!done)
                {
                    struct IntuiMessage *imsg;

                    /* Wait for an event to occur */

                    signal = GF_Wait(guiapp,AmigaGuideSignal(agc));
		    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))
                    {
			noreply = TRUE;
                        switch (imsg->Class) {
				case IDCMP_REFRESHWINDOW:
					RegRefresh(TRUE);
					break;

                                case IDCMP_CLOSEWINDOW:
					entryretval = NULL;
                                        done = TRUE;
                                        break;

				case IDCMP_RAWKEY:
					if (GF_ProcessListView(entryGUI,EP_EnterSpecs[GID_EPCATEGORY],
					    imsg,&ordinal)) {
						catactive = ordinal;
						cat = (categoryNode *)DataOrd2Node(&categories,catactive);
						strncpy(newnode.category,cat->node.ln_Name,CATNAMESIZE);
					}
					else AmiHelpKey(imsg,ENTRY_PANEL);
					break;

				case IDCMP_GADGETUP:
					done=EntryHandleGadget(imsg);
					noreply = FALSE;
					break;
                        }
                                     
			catactive = ordinal;                              
                        if (noreply) GF_ReplyIMsg(imsg);
                    }
                }

#if 1
   GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPCATEGORY]->gs_Gadget,
		GTLV_Labels, ~0,
		TAG_DONE);
#endif

   GF_SetGUIAttr(entryGUI, GUI_OpenGUI, FALSE, TAG_DONE);            
   AmiUnlock();
  
 return (entryretval);
}

/*********************************************************************
* EntryInit()
*
*	Initializes this panel
**********************************************************************/
void EntryInit(BOOL scripted, entryNode *edit, BOOL *del)
{
 char strdate[DATESIZE];
 templateNode *curr;
 entryNode *data;

 /* grab window */
 GF_GetGUIAttr(entryGUI,GUI_Window,&myWin,TAG_DONE);

 deleteit = del;
 *deleteit = FALSE;

 GF_SetGadgetAttrs(entryGUI,EP_EnterSpecs[GID_EPSKIP]->gs_Gadget,
	GA_Disabled,!scripted,
	TAG_DONE);

 if (edit == NULL) {
	GF_SetGadgetAttrs(entryGUI,EPgadgetspecs[GID_EPREMOVE].gs_Gadget,
		GA_Disabled,TRUE,
		TAG_DONE);

	/* copy template in */
  	curr = (templateNode *)DataOrd2Node(&templates,amntState.currTemplate);
	data = &curr->template;
 }
 else {
	GF_SetGadgetAttrs(entryGUI,EPgadgetspecs[GID_EPREMOVE].gs_Gadget,
		GA_Disabled,FALSE,
		TAG_DONE);

	data = edit;
 }

 memcpy(&newnode,data,sizeof(entryNode));
 
 DataBuildAmnt(FALSE,&data->amount,amntstr);
  
  /* update gfx */
  if (data->type != CHECKTYPE) 
	GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPNUMBER]->gs_Gadget,
		GA_Disabled,TRUE,
		TAG_DONE);
  else { 
	if (edit == NULL) {
  		GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPNUMBER]->gs_Gadget,
			GTIN_Number, amntState.currCheckNumber,
			GA_Disabled, FALSE,
			TAG_DONE); 
		newnode.check = amntState.currCheckNumber;
	}
	else 
		GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPNUMBER]->gs_Gadget,
			GTIN_Number, data->check,
			GA_Disabled, FALSE,
			TAG_DONE); 
  }
 
  GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPNAME]->gs_Gadget,
	GTST_String,data->name,
	TAG_DONE);

  GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPMEMO]->gs_Gadget,
	GTST_String,data->memo,
	TAG_DONE);

  GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPAMNT]->gs_Gadget,
	GTST_String,amntstr,
	TAG_DONE);

  GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPPRINTED]->gs_Gadget,
	GTCB_Checked,(data->flags & PRINTED)?1:0,
	GA_Disabled, (data->type != CHECKTYPE)?TRUE:FALSE,
	TAG_DONE);

  GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPCLEARED]->gs_Gadget,
	GTCB_Checked,(data->flags & CLEARED)?1:0,
	TAG_DONE);

  GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPVOIDED]->gs_Gadget,
	GTCB_Checked,(data->flags & VOIDED)?1:0,
	GA_Disabled, (data->type != CHECKTYPE)?TRUE:FALSE,
	TAG_DONE);

  GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPTAX]->gs_Gadget,
		GTCB_Checked,(data->flags & TAXDEDUCT)?1:0,
		TAG_DONE);

  catactive=DataNode2Ord(&categories,data->category);
#if 1
  GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPCATEGORY]->gs_Gadget,
		GTLV_Labels, &categories,
		GTLV_Selected, catactive,
		GTLV_MakeVisible, catactive,
		TAG_DONE);
#endif

  if (edit == NULL) {
  	/* stuff in current date */
 	memcpy(&newnode.date,&currDate,sizeof(dateType));
  }
  else {
	/* stuff in old date */
	memcpy(&newnode.date,&edit->date,sizeof(dateType));
  }
  DataBuildDate(&newnode.date,strdate);
  GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPDATE]->gs_Gadget,
	GTST_String,strdate,
	TAG_DONE);
  
 if (edit != NULL)
		curr =  (templateNode *)DataOrd2Node(&templates,edit->type);

   GF_SetGadgetAttrs (entryGUI, EP_EnterSpecs[GID_EPTEMPLATE]->gs_Gadget,
		GTTX_Text,curr->tempname,
		TAG_DONE);

  entryretval = NULL;
 skipped = FALSE;
}

/***************************************************
* EntryHandleGadget()
*
*	Handles gadget events for this panel
****************************************************/
BOOL EntryHandleGadget(struct IntuiMessage *imsg)
{
 categoryNode *cat;
 nameNode *dn;
 amntNode *da;
 memoNode *dm;
 struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
 UWORD code = imsg->Code;
 BOOL done = FALSE;
 struct EasyStruct es;
 struct Window *win = NULL;
 static char newamntstr[AMNTSIZE], newdatestr[DATESIZE];

 switch (gad->GadgetID) {
	case GID_EPDATELIST:
		if (QDateGUI(((struct StringInfo *)(EP_EnterSpecs[GID_EPDATE]->gs_Gadget)->SpecialInfo)->Buffer)) {
			memcpy(&newnode.date,&edate,sizeof(dateType));
			DataBuildDate(&edate,newdatestr);

			GF_SetGadgetAttrs(entryGUI,EP_EnterSpecs[GID_EPDATE]->gs_Gadget,
				GTST_String,newdatestr,
				TAG_DONE);
		}
		break;

	case GID_EPMEMOLIST:
		if (QMemoGUI(entryGUI)) {
			dm=(memoNode*)DataOrd2Node(&memolist,qmemoSel);
			strcpy(newnode.memo,dm->memoStr);
			GF_SetGadgetAttrs(entryGUI,EP_EnterSpecs[GID_EPMEMO]->gs_Gadget,
				GTST_String,newnode.memo,
				TAG_DONE);
		}
		break;

	case GID_EPNAMELIST:
		if (QNameGUI(entryGUI)) {
			dn=(nameNode*)DataOrd2Node(&namelist,qnameSel);
			strcpy(newnode.name,dn->nameStr);
			GF_SetGadgetAttrs(entryGUI,EP_EnterSpecs[GID_EPNAME]->gs_Gadget,
				GTST_String,newnode.name,
				TAG_DONE);
		}
		break;

	case GID_EPAMNTLIST:
		if (QAmntGUI(entryGUI)) {
			da=(amntNode*)DataOrd2Node(&amntlist,qamntSel);
			strcpy(newamntstr,da->amntStr);
			GF_SetGadgetAttrs(entryGUI,EP_EnterSpecs[GID_EPAMNT]->gs_Gadget,
				GTST_String,newamntstr,
				TAG_DONE);
		}
		break;

	case GID_EPCATEGORY:
		catactive = code;
		cat = (categoryNode *)DataOrd2Node(&categories,catactive);
		strncpy(newnode.category,cat->node.ln_Name,CATNAMESIZE);
		break;

	case GID_EPNAME:
		strncpy(newnode.name,((struct StringInfo *)gad->SpecialInfo)->Buffer, STRINGSIZE);
		break;

	case GID_EPMEMO:
		strncpy(newnode.memo,((struct StringInfo *)gad->SpecialInfo)->Buffer, STRINGSIZE);
		break;

	case GID_EPAMNT:
		/* special case return early.... activated gadget */
		if (!DataVerifyAmnt(((struct StringInfo*)gad->SpecialInfo)->Buffer,newamntstr) ) {
			DisplayBeep(myWin->WScreen);
			DataAnnounceAmount(entryGUI);
			GF_ReplyIMsg(imsg);
			DataSitNSpin(EP_EnterSpecs[GID_EPAMNT]->gs_Gadget,myWin);
		  	return (done);
		}
 		else {
			DataStoreAmnt(&newnode.amount,newamntstr );
			DataBuildAmnt(FALSE,&newnode.amount,newamntstr);
			GF_SetGadgetAttrs(entryGUI,EP_EnterSpecs[GID_EPAMNT]->gs_Gadget,
				GTST_String,newamntstr,
				TAG_DONE);
		}
		break;
	
	case GID_EPDATE:
		/* special case return early.... activated gadget */
		if (!DataVerifyDate(((struct StringInfo*)gad->SpecialInfo)->Buffer,newdatestr) ) {
			DisplayBeep(myWin->WScreen);
			DataAnnounceDate(entryGUI);
			GF_ReplyIMsg(imsg);
			DataSitNSpin(EP_EnterSpecs[GID_EPDATE]->gs_Gadget,myWin);
		 	return (done);
		}
 		else {
			DataStoreDate(&newnode.date,newdatestr );
			GF_SetGadgetAttrs(entryGUI,EP_EnterSpecs[GID_EPDATE]->gs_Gadget,
				GTST_String,newdatestr,
				TAG_DONE);
		}
		break;
	
	case GID_EPVOIDED:
		if (code)
			newnode.flags |= VOIDED;
		else	newnode.flags &= ~VOIDED;
		break;

	case GID_EPCLEARED:
		if (code)
			newnode.flags |= CLEARED;
		else	newnode.flags &= ~CLEARED;
		break;

	case GID_EPPRINTED:
		if (code)
			newnode.flags |= PRINTED;
		else	newnode.flags &= ~PRINTED;
		break;

	case GID_EPTAX:
		if (code)
			newnode.flags |= TAXDEDUCT;
		else	newnode.flags &= ~TAXDEDUCT;
		break;

	case GID_EPNUMBER:
		newnode.check =(UWORD)((struct StringInfo*)gad->SpecialInfo)->LongInt;
		break;

	case GID_EPSKIP:
		skipped = TRUE;
		/* fall through */
	case GID_EPCANCEL:
		entryretval = NULL;
		done=TRUE;
		break;

	case GID_EPREMOVE:
		/* why don't we first make _sure_ */
		es.es_StructSize = sizeof(struct EasyStruct);
		es.es_Flags = 0;
		es.es_Title = "amiCheck NOTICE:";
		es.es_TextFormat = "Are you sure you wish\nto delete this transaction?";
		es.es_GadgetFormat = "OK|Cancel";

		GF_GetGUIAttr(gui,
			GUI_Window,&win,
			TAG_DONE);
		
		GF_LockGUI(entryGUI);
		if (GF_EasyRequest(gui,win,&es,NULL) != FALSE) {

			*deleteit = TRUE;
			entryretval = NULL;
			done = TRUE;
		}
		GF_UnlockGUI(entryGUI);
		break;

	case GID_EPOK:
		if (EntryGoodbye(imsg, &newnode)) {
			amiChangedItems = TRUE;
			if (newnode.type == CHECKTYPE)
				amntState.currCheckNumber = newnode.check + 1;
			entryretval = &newnode;
			done = TRUE;
			QDateAdd(&newnode.date);
		}
		else return (FALSE);
		break;

 }

 GF_ReplyIMsg(imsg);
 return (done);
}

/*****************************************************
* EntryGoodbye()
*
*	Checks for invalid strings
******************************************************/
BOOL EntryGoodbye(struct IntuiMessage *imsg, entryNode *temp)
{
 char *grab;
 char newamntstr[AMNTSIZE+1];
 char newdatestr[DATESIZE+1];

 /* check for "special" entries */
 grab = ((struct StringInfo *)(EP_EnterSpecs[GID_EPDATE]->gs_Gadget)->SpecialInfo)->Buffer; 
 if (!DataVerifyDate(grab,newdatestr) ) {
	DisplayBeep(myWin->WScreen);
	DataAnnounceDate(entryGUI);
	GF_ReplyIMsg(imsg);
	DataSitNSpin(EP_EnterSpecs[GID_EPDATE]->gs_Gadget,myWin);
  	return (FALSE);
 }
 else {
	DataStoreDate(&temp->date,newdatestr );
 }

 grab = ((struct StringInfo *)(EP_EnterSpecs[GID_EPAMNT]->gs_Gadget)->SpecialInfo)->Buffer;
 if (!DataVerifyAmnt(grab,newamntstr) ) {
	DisplayBeep(myWin->WScreen);
	DataAnnounceAmount(entryGUI);
	GF_ReplyIMsg(imsg);
	DataSitNSpin(EP_EnterSpecs[GID_EPAMNT]->gs_Gadget,myWin);
   	return (FALSE);
 }
 else {
	DataStoreAmnt(&temp->amount,newamntstr );
 }

 /* check for strange amount */
 if (temp->amount == 0) {
	DisplayBeep(myWin->WScreen);
	if (DataQuery(entryGUI,"Amount field is ZERO\nAccept this?", "OK|Cancel") == 0) {
		DataSitNSpin(EP_EnterSpecs[GID_EPAMNT]->gs_Gadget,myWin);
		return (FALSE);
	}
 }



 /* copy over new strings */
 grab = ((struct StringInfo *)(EP_EnterSpecs[GID_EPNAME]->gs_Gadget)->SpecialInfo)->Buffer;
 strncpy(temp->name,grab, STRINGSIZE);

 grab = ((struct StringInfo *)(EP_EnterSpecs[GID_EPMEMO]->gs_Gadget)->SpecialInfo)->Buffer;
 strncpy(temp->memo,grab, STRINGSIZE);

 temp->check= (UWORD)((struct StringInfo *)(EP_EnterSpecs[GID_EPNUMBER]->gs_Gadget)->SpecialInfo)->LongInt;
 return (TRUE);
}
