/* netPanel.c 
 *
 *  defines the GUIFront characteristics of the net panel 
 */
  
#include <stdio.h>  
#include <intuition/gadgetclass.h>
#include <exec/memory.h>
#include <clib/exec_protos.h>
#include <clib/asl_protos.h>
#include <libraries/asl.h>

#include "amiCheck.h"
#include "regGadget.h"
#include "dataBase.h"
#include "netPanel.h"
#include <string.h>

#define NETCREDIT	0
#define NETDEBIT	1
#define NETCURR		0
#define NETSTATE	1

#define SUMSIZE 	(AMNTSIZE+8)

/* prototypes */
BOOL NetHandleGadget(struct IntuiMessage *);
BOOL NetInit(void);
void NetDisableGads(BOOL);
netNode *NetAddNode(netNode *);
void NetFreeList(void);
BOOL NetSave (char *);
BOOL NetLoad (char *);
void NetUpdateLocal(netNode *);
void NetWorth(void);

static char ltax[SUMSIZE],cbal[SUMSIZE],sbal[SUMSIZE];
static char repdebit[SUMSIZE],repcredit[SUMSIZE],networth[SUMSIZE],nettax[SUMSIZE];
static char sumtype;
static char fname[100];
static char localnetbal=0;

struct TagItem netinserttags[] =
{
	ASL_Hail, (ULONG)"Select Account File:",
	ASL_OKText,"OK",
	ASL_CancelText,"Cancel",
	ASL_File, (ULONG)"",
	ASL_Pattern, (ULONG)filePattern, /*"#?.AC",*/
	ASL_Dir, (ULONG)"PROGDIR:",
	ASL_FuncFlags, FILF_PATGAD,
	TAG_DONE,
};

struct FileRequester *netinsertASL = NULL;
WORD netEntries;
struct Window *netWin;
struct List netList;
ExtErrorData NetExtData;
GUIFront *netGUI;
WORD netlistActive;
char nettitle[100];
UBYTE netdecimal;

/* quick configure of some gadgets */

STRPTR accountlabels[] =
{
	"Credit",
	"Debit",
	NULL,
};

STRPTR netreportlabels[] =
{
	"Current",
	"Statement",
	NULL,
};

struct TagItem netCycleTags[] =
{
	{GTCY_Labels, accountlabels},
	{TAG_DONE},
};

struct TagItem netrepCycleTags[] =
{
	{GTCY_Labels, netreportlabels},
	{TAG_DONE},
};


/* define gadgetspec */
GadgetSpec NETgadgetspecs[] = 
{
	{LISTVIEW_KIND,20,8, {0,0,0,0,NULL,NULL,GID_NETLIST,
		PLACETEXT_ABOVE},ListView,GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Open", NULL, GID_NETOPEN,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Save", NULL, GID_NETSAVE,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"Save _As", NULL, GID_NETSAVEAS,         
                PLACETEXT_IN}, NULL, GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Insert", NULL, GID_NETNEW,         
                PLACETEXT_IN}, NULL, GS_DefaultTags | GS_NoHeightExtend},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Remove", NULL, GID_NETREMOVE,         
                PLACETEXT_IN}, NULL, GS_DefaultTags | GS_NoHeightExtend},

	{CYCLE_KIND,0,1, {0,0,0,0,"_Type",NULL,GID_NETTYPE,
		PLACETEXT_LEFT},netCycleTags,GS_DefaultTags | GS_NoHeightExtend},

	{TEXT_KIND,0,0,{0,0,0,0,"Curr Bal:",NULL,GID_NETCBAL,
		PLACETEXT_LEFT},TxtZero,GS_DefaultTags},

	{TEXT_KIND,0,0,{0,0,0,0,"Balance:",NULL,GID_NETSBAL,
		PLACETEXT_LEFT},TxtZero,GS_DefaultTags},

	{CYCLE_KIND,0,1, {0,0,0,0,"_Global Type",NULL,GID_NETREPTYPE,
		PLACETEXT_LEFT},netrepCycleTags,GS_DefaultTags | GS_NoHeightExtend},

	{TEXT_KIND,0,0,{0,0,0,0,"Debits:",NULL,GID_NETREPDEBIT,
		PLACETEXT_LEFT},TxtZero,GS_DefaultTags},

	{TEXT_KIND,0,0,{0,0,0,0,"Credits:",NULL,GID_NETREPCREDIT,
		PLACETEXT_LEFT},TxtZero,GS_DefaultTags},

	{TEXT_KIND,0,0,{0,0,0,0,"Summary:",NULL,GID_NETWORTH,
		PLACETEXT_LEFT},TxtZero,GS_DefaultTags},

        {BUTTON_KIND,0,0,{0,0,0,0,"_Cancel", NULL, GID_NETCANCEL,        
                PLACETEXT_IN}, NULL, GS_DefaultTags},

	{TEXT_KIND,0,0,{0,0,0,0,"Tax Deduct:",NULL,GID_NETTAX,
		PLACETEXT_LEFT},TxtZero,GS_DefaultTags},

	{TEXT_KIND,0,0,{0,0,0,0,"Balance:",NULL,GID_NETTOTAL,
		PLACETEXT_LEFT},TxtZero,GS_DefaultTags},

	{TEXT_KIND,0,0,{0,0,0,0,"Tax Deduct:",NULL,GID_NETLOCALTAX,
		PLACETEXT_LEFT},TxtZero,GS_DefaultTags},

	{CYCLE_KIND,0,1, {0,0,0,0,"_Local Type",NULL,GID_NETACCBAL,
		PLACETEXT_LEFT},netrepCycleTags,GS_DefaultTags | GS_NoHeightExtend},

};

/* set up array of pointers to our specs */
GadgetSpec *NET_NetSpecs[] =
{
        &NETgadgetspecs[0],
        &NETgadgetspecs[1],
        &NETgadgetspecs[2],
        &NETgadgetspecs[3],
        &NETgadgetspecs[4],
        &NETgadgetspecs[5],
        &NETgadgetspecs[6],
        &NETgadgetspecs[7],
        &NETgadgetspecs[8],
        &NETgadgetspecs[9],
	&NETgadgetspecs[10],
	&NETgadgetspecs[11],	
	&NETgadgetspecs[12],
	&NETgadgetspecs[13],
	&NETgadgetspecs[14],
	&NETgadgetspecs[15],
	&NETgadgetspecs[16],
	&NETgadgetspecs[17],
	NULL,
};


/* define the layout of this panel */
ULONG NET_NetPanel[] =
{
   GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,

   GUIL_HorizGroup, 1,
        GUIL_Flags, GUILF_PropShare | GUILF_EqualHeight,
	GUIL_FrameType, GUILFT_Recess,

	GUIL_VertGroup,1,
		GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,
		GUIL_FrameType, GUILFT_Ridge,
		GUIL_FrameHeadline, "Accounts",

		GUIL_VertGroup,0,
			GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,
			GUIL_GadgetSpecID, GID_NETLIST,

			GUIL_HorizGroup,1,
				GUIL_Flags, GUILF_EqualShare | GUILF_EqualWidth,

				GUIL_GadgetSpecID, GID_NETNEW,
			 	GUIL_GadgetSpecID, GID_NETREMOVE,
			TAG_DONE,
		TAG_DONE,

		GUIL_GadgetSpecID, GID_NETTYPE,
	TAG_DONE,

	GUIL_VertGroup,1,
		GUIL_Flags , GUILF_PropShare | GUILF_EqualWidth,

		GUIL_VertGroup,0,
			GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_LabelAlign,
			GUIL_FrameType, GUILFT_Ridge,
			GUIL_FrameHeadline, "Account Info",

			GUIL_GadgetSpecID, GID_NETACCBAL,
			GUIL_GadgetSpecID, GID_NETSBAL,
			GUIL_GadgetSpecID, GID_NETLOCALTAX,
		TAG_DONE,

		GUIL_VertGroup,0,
			GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_LabelAlign,
			GUIL_FrameType, GUILFT_Ridge,
			GUIL_FrameHeadline, "Summary",
			
			GUIL_GadgetSpecID, GID_NETREPTYPE,
			GUIL_GadgetSpecID, GID_NETREPDEBIT,
			GUIL_GadgetSpecID, GID_NETREPCREDIT,
			GUIL_GadgetSpecID, GID_NETWORTH,
			GUIL_GadgetSpecID, GID_NETTAX,
		TAG_DONE,
	TAG_DONE,
        
        
    TAG_DONE,
    
    GUIL_HorizGroup,1,
        GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
        
	   GUIL_GadgetSpecID, GID_NETSAVE,
	   GUIL_GadgetSpecID, GID_NETSAVEAS,
           GUIL_GadgetSpecID, GID_NETOPEN,
           GUIL_GadgetSpecID, GID_NETCANCEL,
           
    TAG_DONE,   
           
TAG_DONE,
};


/****************************************************
* NetGUI ()
*
*	Creates the GUI for the Net panel.
*****************************************************/
void NetGUI(void)
{
 BOOL done = FALSE;
 BOOL noreply;
 UWORD ordinal;
 ULONG signal;
 netNode *net;
     
 AmiLock();

 	GF_SetGUIAttr(netGUI, GUI_OpenGUI, TRUE, TAG_DONE);
 	/* grab window */
 	GF_GetGUIAttr(netGUI,GUI_Window,&netWin,TAG_DONE);
	if (!NetInit())
		done = TRUE;


                /* 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:
					done = TRUE;
                                        break;

				case IDCMP_RAWKEY:
					AmiHelpKey(imsg,NET_PANEL);
					if (IsListEmpty(&netList))
						break;
					if (GF_ProcessListView(netGUI,NET_NetSpecs[GID_NETLIST],
						imsg,&ordinal)) {
							if (netlistActive == -1)
								NetDisableGads(FALSE);
							netlistActive = ordinal;
							net = (netNode*)DataOrd2Node(&netList,ordinal);
							NetUpdateLocal(net);
							GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETTYPE].gs_Gadget,
								GTCY_Active, net->actype,
								TAG_DONE);
					}
					break;

				case IDCMP_GADGETUP:
					noreply = FALSE;
					done=NetHandleGadget(imsg);
					break;
                        }
                                     
                              
                        if (noreply) GF_ReplyIMsg(imsg);
                    }
                }

   GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETLIST].gs_Gadget,
			GTLV_Labels, ~0,
			TAG_DONE);

   NetFreeList();
   GF_SetGUIAttr(netGUI, GUI_OpenGUI, FALSE, TAG_DONE);
   AmiUnlock();
  return;
}

/***************************************************
* NetHandleGadget()
*
*	Handles gadget events for this panel
****************************************************/
BOOL  NetHandleGadget(struct IntuiMessage *imsg)
{
 BOOL done = FALSE;
 struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
 UWORD code = imsg->Code;
 netNode *net,*nett,netw;
 char response[200];


 switch (gad->GadgetID) {

	case GID_NETACCBAL:
		localnetbal = code;
		if (netlistActive != -1) {
			net = (netNode *)DataOrd2Node(&netList,netlistActive);
			NetUpdateLocal(net);
		}
		break;
	
	case GID_NETLIST:
		if (netlistActive == -1)
			NetDisableGads(FALSE);

		netlistActive = code;
		net = (netNode *)DataOrd2Node(&netList,netlistActive);
		NetUpdateLocal(net);
		GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETTYPE].gs_Gadget,
			GTCY_Active, net->actype,
			TAG_DONE);	
		break;

	case GID_NETREPTYPE:
		sumtype = code;
		NetWorth();
		break;

	case GID_NETTYPE:
		net = (netNode *)DataOrd2Node(&netList,netlistActive);
		net->actype = code;
		GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETTYPE].gs_Gadget,
			GTCY_Active, net->actype,
			TAG_DONE);	
		NetWorth();
		break;

	case GID_NETNEW:
		GF_LockGUI(netGUI);
		if (AmiGetFile(netGUI,loadASL,fname,100)) {
			sprintf(response,"Account already loaded:[%s]\n",fname);
			if (DataIsUnique(netGUI,&netList,fname,TRUE,response) == TRUE) {


			if (DataSummarize(fname,&netw) != TRUE) {
				DisplayBeep(netWin->WScreen);
				AmiAnnounce("Encountered trouble trying to read account file.");
			}
			else {
				/* convert over to our format */
				if (netw.balances.decimal != usrAccount.decimal) {
					DataBalConvert( &netw.balances.taxdeductcurr,
						netw.balances.decimal,usrAccount.decimal);
					DataBalConvert( &netw.balances.taxdeductstate,
						netw.balances.decimal,usrAccount.decimal);
					DataBalConvert( &netw.balances.currAmnt,
						netw.balances.decimal,usrAccount.decimal);
					DataBalConvert( &netw.balances.stateAmnt,
						netw.balances.decimal,usrAccount.decimal);
				}

				if (netEntries == 0) {
					GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETSAVEAS].gs_Gadget,
						GA_Disabled, FALSE,
						TAG_DONE);
				}

				GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETLIST].gs_Gadget,
					GTLV_Labels, ~0,
					TAG_DONE);

				netw.actype = NETCREDIT;
				NetAddNode(&netw);							
				netEntries++;

				GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETLIST].gs_Gadget,
					GTLV_Labels, &netList,
					GTLV_Selected, netlistActive,
					TAG_DONE);	

				NetWorth();
			}
			}

		}
		GF_UnlockGUI(netGUI);

		break;

	case GID_NETSAVE:
		if (NetSave(fname) != TRUE) {
			DisplayBeep(netWin->WScreen);
			AmiAnnounce("Encountered trouble trying to save net file.");
		}
		break;
	
	case GID_NETSAVEAS:
		GF_LockGUI(netGUI);
		if (AmiGetFile(netGUI,netsaveASL,fname,100)) {

			if (NetSave(fname) != TRUE) {
				DisplayBeep(netWin->WScreen);
				AmiAnnounce("Encountered trouble trying to save net file.");
			}

			DataAttachIcon(iconPath,"AC_NetWorth",fname);
			GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETSAVE].gs_Gadget,
				GA_Disabled, FALSE,
				TAG_DONE);

			sprintf(nettitle,"Net Worth Analysis: %s",netsaveASL->fr_File);
			SetWindowTitles(netWin,nettitle,(UBYTE *)-1);
		}
		GF_UnlockGUI(netGUI);

		break;

	case GID_NETOPEN:
		GF_LockGUI(netGUI);
		if (AmiGetFile(netGUI,netloadASL,fname,100)) {

			GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETLIST].gs_Gadget,
				GTLV_Labels, ~0,
				TAG_DONE);

			NetFreeList();
			sprintf(nettitle,"Net Worth Analysis: %s",netloadASL->fr_File);
			SetWindowTitles(netWin,nettitle,(UBYTE *)-1);
			
			if (NetLoad(fname) != TRUE) {
				DisplayBeep(netWin->WScreen);
				AmiAnnounce("Encountered trouble trying to load net file.");
			}

			GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETSAVE].gs_Gadget,
				GA_Disabled, FALSE,
				TAG_DONE);

			GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETSAVEAS].gs_Gadget,
				GA_Disabled, FALSE,
				TAG_DONE);

			GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETLIST].gs_Gadget,
				GTLV_Labels, &netList,
				GTLV_Selected, ~0,
				TAG_DONE);

			netlistActive = -1;
			memset(&netw,0,sizeof(netNode));
			NetUpdateLocal(&netw);
			NetWorth();
			NetDisableGads(TRUE);
		}
		GF_UnlockGUI(netGUI);
		break;

	case GID_NETREMOVE:
		/* detach and modify list */
		GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETLIST].gs_Gadget,
			GTLV_Labels, ~0,
			TAG_DONE);
			
		net = (netNode *)DataOrd2Node(&netList,netlistActive);

		if (net->node.ln_Succ == (struct Node *)&netList.lh_Tail) 
			netlistActive--;

		Remove(net);
		FreeVec(net);
							
		GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETLIST].gs_Gadget,
			GTLV_Labels, &netList,
			GTLV_Selected, (IsListEmpty(&netList))?~0:netlistActive,
			TAG_DONE);		

		if (netlistActive == -1) {
			memset(&netw,0,sizeof(netNode));
			NetUpdateLocal(&netw);
		}
		else	{
			nett = (netNode *)DataOrd2Node(&netList,netlistActive);
			NetUpdateLocal(nett);
			GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETTYPE].gs_Gadget,
				GTCY_Active, nett->actype,
				TAG_DONE);	
		}

		if (IsListEmpty(&netList))
			NetDisableGads(TRUE);

		netEntries--;
		NetWorth();
		break;

	case GID_NETCANCEL:
		done = TRUE;
		break;

 }

 GF_ReplyIMsg(imsg);
 return (done);
}

/****************************************************
* NetInit()
*
*	Set up some globals
*****************************************************/
BOOL NetInit(void)
{
 amountType zero = 0;
 
 netdecimal = usrAccount.decimal;

 sprintf(nettitle,"Net Worth Analysis: untitled.ACnet");
 SetWindowTitles(netWin,nettitle,(UBYTE *)-1);

 NewList (&netList);

 netlistActive = -1;
 netEntries = 0;

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETLIST].gs_Gadget,
			GTLV_Labels, &netList,
			GTLV_Selected,~0,
			TAG_DONE);

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETSAVE].gs_Gadget,
	GA_Disabled, TRUE,
	TAG_DONE);

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETSAVEAS].gs_Gadget,
	GA_Disabled, TRUE,
	TAG_DONE);

 sumtype = NETSTATE;
 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETREPTYPE].gs_Gadget,
	GTCY_Active, sumtype,
	TAG_DONE);

 localnetbal = NETSTATE;
 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETACCBAL].gs_Gadget,
	GTCY_Active, localnetbal,
	TAG_DONE);

 NetDisableGads(TRUE);

 /* clear out text gadgets */
 DataBuildAmnt(TRUE,&zero,cbal);
 DataBuildAmnt(TRUE,&zero,sbal);
 DataBuildAmnt(TRUE,&zero,ltax);
 DataBuildAmnt(TRUE,&zero,repdebit);
 DataBuildAmnt(TRUE,&zero,repcredit);
 DataBuildAmnt(TRUE,&zero,networth);
 DataBuildAmnt(TRUE,&zero,nettax);

/*
 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETCBAL].gs_Gadget,
	GTTX_Text,cbal,
	TAG_DONE);
*/

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETSBAL].gs_Gadget,
	GTTX_Text,sbal,
	TAG_DONE);

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETLOCALTAX].gs_Gadget,
	GTTX_Text,ltax,
	TAG_DONE);

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETREPCREDIT].gs_Gadget,
	GTTX_Text,repcredit,
	TAG_DONE);

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETREPDEBIT].gs_Gadget,
	GTTX_Text,repdebit,
	TAG_DONE);

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETWORTH].gs_Gadget,
	GTTX_Text,networth,
	TAG_DONE);

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETTAX].gs_Gadget,
	GTTX_Text,nettax,
	TAG_DONE);


 return (TRUE);
}

/****************************************************
* NetDisableGads()
*
*	Disable/Enable extra gadgets
*****************************************************/
void NetDisableGads(BOOL dis)
{


 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETREMOVE].gs_Gadget,
	GA_Disabled, dis,
	TAG_DONE);

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETTYPE].gs_Gadget,
	GA_Disabled, dis,
	TAG_DONE);

}

/****************************************************
* NetAddNode()
*
*	Add a node to the net list
*****************************************************/
netNode *NetAddNode(netNode *net)
{
 netNode *temp;

 temp = (netNode *)AllocVec(sizeof(netNode),MEMF_CLEAR);
 if (temp == NULL)
	return(NULL);

 memcpy(temp,net,sizeof(netNode));
 temp->node.ln_Name = temp->acname;
 AddTail(&netList,temp);

 return (temp);
}

/*****************************************************
* NetFreeList()
*
*	Free a node 
******************************************************/
void NetFreeList(void)
{
 netNode *temp = (netNode*)netList.lh_Head, *next;

 if (IsListEmpty(&netList))
	return;

 while ( (next=(netNode*)temp->node.ln_Succ)) {
	FreeVec(temp);
	temp = next;
 }
}


/**************************************************************************
* NetSave()
*
*	saves a net file
***************************************************************************/
BOOL NetSave (char *fname)
{
 netNode *temp = (netNode *)netList.lh_Head, *next;
 FILE *file;

 if (IsListEmpty(&netList))
	return(TRUE);

 if ( (file = fopen(fname,"w")) == NULL)
	return (FALSE);

 while ( (next = (netNode *)(temp->node.ln_Succ)) ) {
		fprintf(file,"%s %s",temp->acname, (temp->actype==NETCREDIT)?"CREDIT":"DEBIT");
		if (temp->node.ln_Succ != NULL)
			fprintf(file,"\n");
		temp = next;
 }

 fclose(file);
 return (TRUE);
}

/**************************************************************************
* netLoad()
*
*	Loads a net file
***************************************************************************/
BOOL NetLoad (char *fname)
{
 char fstr[100];
 char type[100];
 char response[200];
 netNode net;
 FILE *file;

 NewList(&netList);
 netEntries = 0;

 if ( (file = fopen(fname,"r")) == NULL)
	return (FALSE);

 while ( fscanf(file,"%s %s",fstr,type) != EOF) {

		sprintf(response,"Account already loaded:[%s]\n",fstr);
		if (DataIsUnique(netGUI,&netList,fstr,TRUE,response) == TRUE) {
		
			if (DataSummarize(fstr,&net) != TRUE) {
				DisplayBeep(netWin->WScreen);
				sprintf(response,"Failed to summarize [%s]\n",fstr);
				AmiAnnounce(response);
			}
			else {
				/* convert the balances to OUR decimal format */
				if (net.balances.decimal != usrAccount.decimal) {
					DataBalConvert( &net.balances.taxdeductcurr,
						net.balances.decimal,usrAccount.decimal);
					DataBalConvert( &net.balances.taxdeductstate,
						net.balances.decimal,usrAccount.decimal);
					DataBalConvert( &net.balances.currAmnt,
						net.balances.decimal,usrAccount.decimal);
					DataBalConvert( &net.balances.stateAmnt,
						net.balances.decimal,usrAccount.decimal);
				}
		
				if (strcmpi(type,"debit") == 0)
					net.actype = NETDEBIT;
				else	net.actype = NETCREDIT;
	
				NetAddNode(&net);

				netEntries++;
			}
		}
 }

 fclose(file);
 return (TRUE);
}

/*****************************************************************
* NetWorth
*
* 	Calculate total worth, update graphics
******************************************************************/
void NetWorth(void)
{
 netNode *temp = (netNode*)netList.lh_Head, *next;
 amountType zero = 0;
 balanceType repcr, repdeb, nw, nt;

 DataInitBal(DEPOSITTYPE,&zero,&repcr);
 DataInitBal(DEPOSITTYPE,&zero,&repdeb);
 DataInitBal(DEPOSITTYPE,&zero,&nw);
 DataInitBal(DEPOSITTYPE,&zero,&nt);

 if (IsListEmpty(&netList) != TRUE) {
 	while ( (next=(netNode*)temp->node.ln_Succ)) {
		switch (temp->actype) {
			case NETCREDIT:
				switch (sumtype) {
					case NETCURR:
						DataBalAddBal(netdecimal, &repcr,
							&temp->balances.currAmnt, &repcr);
						DataBalAddBal(netdecimal, &nt,
							&temp->balances.taxdeductcurr, &nt);
						break;

					case NETSTATE:
						DataBalAddBal(netdecimal, &repcr,
							&temp->balances.stateAmnt, &repcr);
						DataBalAddBal(netdecimal, &nt,
							&temp->balances.taxdeductstate, &nt);
						break;
				}
				break;

			case NETDEBIT:
				switch (sumtype) {
					case NETCURR:
						DataBalAddBal(netdecimal, &repdeb,
							&temp->balances.currAmnt, &repdeb);
						DataBalAddBal(netdecimal, &nt,
							&temp->balances.taxdeductcurr, &nt);
						break;

					case NETSTATE:
						DataBalAddBal(netdecimal, &repdeb,
							&temp->balances.stateAmnt, &repdeb);
						DataBalAddBal(netdecimal, &nt,
							&temp->balances.taxdeductstate, &nt);
						break;
				}
				break;
		}
		temp = next;
 	}

	repdeb.neg = !repdeb.neg;
	DataBalAddBal(netdecimal,&nw, &repcr, &repdeb);
	repdeb.neg = !repdeb.neg;
 }

 /* build strings */
 DataBuildBal(netdecimal,&repdeb,repdebit);
 DataBuildBal(netdecimal,&repcr,repcredit);
 DataBuildBal(netdecimal,&nw,networth);
 DataBuildBal(netdecimal,&nt,nettax);

 /* update gadgets */
 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETREPCREDIT].gs_Gadget,
	GTTX_Text,repcredit,
	TAG_DONE);

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETREPDEBIT].gs_Gadget,
	GTTX_Text,repdebit,
	TAG_DONE);

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETWORTH].gs_Gadget,
	GTTX_Text,networth,
	TAG_DONE);

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETTAX].gs_Gadget,
	GTTX_Text,nettax,
	TAG_DONE);
}

/*****************************************************************
* NetUpdateLocal
*
*	Calcs local balances for selected account
******************************************************************/
void NetUpdateLocal(netNode *net)
{

 /* build strings */
 if (localnetbal == NETSTATE) {
	DataBuildBal(netdecimal,&net->balances.stateAmnt,sbal);
	DataBuildBal(netdecimal,&net->balances.taxdeductstate,ltax);
 }
 else	{
	DataBuildBal(netdecimal,&net->balances.currAmnt,sbal);
	DataBuildBal(netdecimal,&net->balances.taxdeductcurr,ltax);
 }

 /* GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETCBAL].gs_Gadget,
	GTTX_Text, cbal,
	TAG_DONE);
 */

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETSBAL].gs_Gadget,
	GTTX_Text, sbal,
	TAG_DONE);

 GF_SetGadgetAttrs(netGUI,NETgadgetspecs[GID_NETLOCALTAX].gs_Gadget,
	GTTX_Text, ltax,
	TAG_DONE);
}
