/****************************************
 * BootMenu v2.1                        *
 * by Volker Stürzl                     *
 * v1.0 [vs]01.04.90                    *
 * v1.1 [vs]04.05.90                    *
 * v2.0 [vs]20.12.90                    *
 * v2.1 [vs]23.02.91                    *
 ****************************************/

#define MAXFILES 16L
#define MAXPATH 30L

char *CLI_Template = "Dir";
char *CLI_Help = "Usage: BootMenu [Directory]";
UBYTE Liste[MAXFILES][MAXPATH],Pfad[MAXPATH+11] = "BOOT:",Temp[MAXPATH];
UBYTE Datum[10],Zeit[10],Gruss[14],Morgen[14] = "Guten Morgen!";
UBYTE Tag[11] = "Guten Tag!",Abend[13] = "Guten Abend!",Nacht[12] = "Gute Nacht!";
int Anzahl;
struct DateStamp DatumStamp;
struct DateTime DatumZeit;
struct RastPort *BMRastPort;
struct Window *BMWindow;

#include "BMTexte.h"
#include "BMGadgets.h"

struct NewWindow BMNewWindow =
{
	0,0,
	640,256,
	0,1,
	CLOSEWINDOW | GADGETUP,
	WINDOWCLOSE | NOCAREREFRESH | ACTIVATE | RMBTRAP,
	&BMGadget1,
	NULL,
	(UBYTE *)"BootMenu v2.1",
	NULL,NULL,
	0,0,
	0,0,
	WBENCHSCREEN
};

void CloseAll(code)
long code;
{
	void DisplayBeep(),CloseWindow();

	if(code) DisplayBeep(NULL);
	if(BMWindow) CloseWindow(BMWindow);
	exit(code);
}

void OpenAll()
{
	struct Window *OpenWindow();

	if(!(BMWindow=OpenWindow(&BMNewWindow)))
		CloseAll(RETURN_FAIL);
	BMRastPort=BMWindow->RPort;
}

void Scan()
{
	struct FileInfoBlock *FInfo,*ArpAllocMem();
	struct FileLock *Lock,*ArpLock();
	register int i,k;

	if(!(FInfo=ArpAllocMem((long)sizeof(struct FileInfoBlock),MEMF_CHIP | MEMF_CLEAR)))
		CloseAll(RETURN_FAIL);
	if(!(Lock=ArpLock(Pfad,ACCESS_READ)))
		CloseAll(RETURN_FAIL);
	if(!(Examine(Lock,FInfo)))
		CloseAll(RETURN_FAIL);
	while(ExNext(Lock,FInfo)&&Anzahl<MAXFILES)
	{
		if(FInfo->fib_DirEntryType<0)
		{
			strcpy(Liste[Anzahl],FInfo->fib_FileName);
			Anzahl++;
		}
	}
	if(Anzahl==0) CloseAll(RETURN_ERROR);
	for(i=0;i<Anzahl-1;i++)
	{
		for(k=i+1;k<Anzahl;k++)
		{
			if(Strcmp(Liste[i],Liste[k])>0)
			{
				strcpy(Temp,Liste[k]);
				strcpy(Liste[k],Liste[i]);
				strcpy(Liste[i],Temp);
			}
		}
	}
}

void main(argc,argv)
int argc;
char **argv;
{
	BOOL Ende=FALSE;
	UWORD GadgetID;
	long Stunde;
	struct Gadget *GadgetPtr;
	struct IntuiMessage *Message,*GetMsg();

	if(argc==2) strcpy(Pfad,argv[1]);
	DateStamp(&DatumStamp);
	DatumZeit.dat_Stamp=DatumStamp;
	DatumZeit.dat_Format=FORMAT_CDN;
	DatumZeit.dat_Flags=0;
	DatumZeit.dat_StrDay=NULL;
	DatumZeit.dat_StrDate=(BYTE *)Datum;
	DatumZeit.dat_StrTime=(BYTE *)Zeit;
	StamptoStr(&DatumZeit);
	Stunde=(DatumStamp.ds_Minute)/60L;
	if((Stunde>3L) && (Stunde<=11L)) strcpy(Gruss,Morgen);
	if((Stunde>11L) && (Stunde<=17L)) strcpy(Gruss,Tag);
	if((Stunde>17L) && (Stunde<=23L)) strcpy(Gruss,Abend);
	if((Stunde>23L) || (Stunde<=3L)) strcpy(Gruss,Nacht);
	Scan();
	OpenAll();
	PrintIText(BMRastPort,&Titel1,240L,27L);
	do
	{
		WaitPort(BMWindow->UserPort);
		Message=(struct IntuiMessage *)GetMsg(BMWindow->UserPort);
		switch(Message->Class)
		{
			case CLOSEWINDOW:	Ende=TRUE;
						break;
			case GADGETUP:	GadgetPtr=(struct Gadget *)Message->IAddress;
					GadgetID=GadgetPtr->GadgetID;
					if(GadgetID<=Anzahl)
					{
						TackOn(Pfad,Liste[GadgetID-1]);
						SyncRun("Execute",Pfad,NULL,NULL);
						Ende=TRUE;
					}
					break;
		}
		ReplyMsg(Message);
	}
	while(Ende==FALSE);
	CloseAll(RETURN_OK);
}
