#include <intuition/intuition.h>
#include <proto/intuition.h>
#include "term.h"

#define REQWIDTH  440
#define REQHEIGHT 100

USHORT chip RadioOnData[] = {

	/* Plane 0 */
	0xf81f, 
	0xc7e3, 
	0xbc3d, 
	0x700e, 
	0x700e, 
	0x700e, 
	0xbc3d, 
	0xc7e3, 
	0xf81f, 

	0 };

USHORT chip RadioOffData[] = {

	/* Plane 0 */
	0xf81f, 
	0xc7e3, 
	0xbffd, 
	0x7ffe, 
	0x7ffe, 
	0x7ffe, 
	0xbffd, 
	0xc7e7, 
	0xf81f, 

	0 };

struct Image RadioOff =
{
	0,-1,16,9,1,RadioOffData,1,0,NULL
};

struct Image RadioOn = 
{
	0,-1,16,9,1,RadioOnData,1,0,NULL
};

struct IntuiText ReqText =
{
	2,1,JAM2,160,10,NULL,"Enter File",NULL, 
};

struct IntuiText TextOK =
{
	2,1,JAM2,0,0,NULL,"OK",NULL, 
};

struct IntuiText TextProto[] =
{
	{2,1,JAM2,18,0,NULL,"Xmodem",NULL}, 
	{2,1,JAM2,18,0,NULL,"Xmodem-CRC",NULL}, 
	{2,1,JAM2,18,0,NULL,"WXmodem",NULL}, 
	{2,1,JAM2,18,0,NULL,"Zmodem",NULL}, 
};

struct Gadget GadgetOK =
{
	NULL,					/* Next Gadget */
	200, 80, 40, 10,
	GADGHNONE,
	RELVERIFY|ENDGADGET,
	BOOLGADGET|REQGADGET,
	NULL, NULL,
	&TextOK,
	NULL,
	NULL,
	1000,
	NULL,
};

struct Gadget GadgetXModem =
{
	&GadgetOK,				/* Next Gadget */
	10, 20, 16, 9,
	GADGHIMAGE|GADGIMAGE,
	GADGIMMEDIATE|TOGGLESELECT,
	BOOLGADGET|REQGADGET,
	(APTR)&RadioOff, (APTR)&RadioOn,
	&TextProto[0],
	1,
	NULL,
	1002,
	NULL,
};

struct Gadget GadgetXModemCRC =
{
	&GadgetXModem,				/* Next Gadget */
	10, 30, 16, 9,
	GADGHIMAGE|GADGIMAGE,
	GADGIMMEDIATE|TOGGLESELECT,
	BOOLGADGET|REQGADGET,
	(APTR)&RadioOff, (APTR)&RadioOn,
	&TextProto[1],
	1,
	NULL,
	1003,
	NULL,
};

struct Gadget GadgetWXModem =
{
	&GadgetXModemCRC,			/* Next Gadget */
	10, 40, 16, 9,
	GADGHIMAGE|GADGIMAGE|SELECTED,
	GADGIMMEDIATE|TOGGLESELECT,
	BOOLGADGET|REQGADGET,
	(APTR)&RadioOff, (APTR)&RadioOn,
	&TextProto[2],
	1,
	NULL,
	1004,
	NULL,
};

struct Gadget GadgetZModem =
{
	&GadgetWXModem,				/* Next Gadget */
	10, 50, 16, 9,
	GADGHIMAGE|GADGIMAGE|GADGDISABLED,
	GADGIMMEDIATE|TOGGLESELECT,
	BOOLGADGET|REQGADGET,
	(APTR)&RadioOff, (APTR)&RadioOn,
	&TextProto[3],
	1,
	NULL,
	1005,
	NULL,
};

char FileBuffer[32];
struct StringInfo InfoFileName = 
{
	FileBuffer,
	NULL,
	0,
	sizeof(FileBuffer),
	0,
	
	0, 0, 0, 0, 0,                /* Intuition managed */
	NULL,
	0,
	NULL,
};

struct Gadget GadgetFileName =
{
	&GadgetOK,				/* Next Gadget */
	100, 40, 200, 10,
	GADGHCOMP,
	GADGIMMEDIATE,
	STRGADGET|REQGADGET,
	NULL, NULL,
	NULL,
	NULL,
	(APTR)&InfoFileName,
	1001,
	NULL,
};

SHORT BorderCoords[2][5] = 
{
	5,5, 
	REQWIDTH-5, 5,
	REQWIDTH-5, REQHEIGHT-5,
	5, REQHEIGHT-5,
	5,5,
};

struct Border ReqBorder =
{
	0,0,
	0,0,JAM1,
	5, &BorderCoords[0][0],
	NULL,
};

struct Requester FileReq =
{
	NULL,
	100, 50, REQWIDTH, REQHEIGHT,
	0, 0,
	&GadgetOK,
	&ReqBorder,
	&ReqText,
	NULL,
	1,
	NULL,
	{NULL},
	NULL,
	NULL,
	{NULL},
};

void Exclude(struct Gadget *MyGadget, struct Requester *MyRequest
            , struct Window *w)
{
	struct Gadget *GadgetList;
	int cSelected;
	
	if (MyGadget->MutualExclude == 0)
		return;
	cSelected = 0;
	GadgetList = MyRequest->ReqGadget;
	while (GadgetList)
	{
		if ((GadgetList != MyGadget) &&
		    (MyGadget->MutualExclude == GadgetList->MutualExclude) &&
		    (GadgetList->Flags & SELECTED))
		{
		    GadgetList->Flags &= ~SELECTED;
		    cSelected++;
		}
		GadgetList = GadgetList->NextGadget;
	}
	/* If nobody was selected then he must have turned off the only
	 * Selected gadget....Thats a nono
	 */
	if (cSelected == 0)
		MyGadget->Flags |= SELECTED;
	RefreshGadgets(MyRequest->ReqGadget, w, MyRequest);
}

int GetFile(struct Window *w, char **FileName)
{
	int Result, DoRequest;
	struct Gadget *MyGadget;
	struct IntuiMessage *message;
	ULONG  class;
	
	Result = TRUE;
	FileReq.ReqGadget = &GadgetFileName;
	Request(&FileReq, w);
	DoRequest = TRUE;
	while (DoRequest)
	{
		Wait(1L << w->UserPort->mp_SigBit);
		while (message = (struct IntuiMessage *)GetMsg(w->UserPort))
		{
			class = message->Class;
			MyGadget = (struct Gadget *)message->IAddress;
			ReplyMsg((struct Message *)message);
			switch (class)
			{
				case GADGETUP:
				case GADGETDOWN:
				Exclude(MyGadget, &FileReq, w);
				switch (MyGadget->GadgetID)
				{
					case 1000:   /* OK */
					DoRequest = FALSE;
					break;
				}
				break;
				
				case REQSET:
				ActivateGadget(&GadgetFileName, w, &FileReq);
				break;
			}
		}
	}
	*FileName = FileBuffer;
	return Result;
}

int Config(struct Window *w)
{
	int Result, DoRequest;
	struct Gadget *MyGadget;
	struct IntuiMessage *message;
	ULONG  class;
	
	Result = TRUE;
	FileReq.ReqGadget = &GadgetZModem;
	Request(&FileReq, w);
	DoRequest = TRUE;
	while (DoRequest)
	{
		Wait(1L << w->UserPort->mp_SigBit);
		while (message = (struct IntuiMessage *)GetMsg(w->UserPort))
		{
			class = message->Class;
			MyGadget = (struct Gadget *)message->IAddress;
			ReplyMsg((struct Message *)message);
			switch (class)
			{
				case GADGETUP:
				case GADGETDOWN:
				Exclude(MyGadget, &FileReq, w);
				switch (MyGadget->GadgetID)
				{
					case 1000:   /* OK */
					DoRequest = FALSE;
					break;
					
					case 1002:   /* X */
					ProtoInit = NAK;
					break;
					
					case 1003:   /* X-CRC */
					ProtoInit = 'C';
					break;
					
					case 1004:   /* WX */
					ProtoInit = 'W';
					break;
					
					case 1005:   /* Z */
					ProtoInit = 'Z';
					break;
				}
				break;
				
				case REQSET:
				break;
			}
		}
	}
	return Result;
}

