#include <exec/memory.h>
#include <libraries/dosextens.h>
#include <exec/devices.h>
#include <intuition/intuitionbase.h>
#include <graphics/gfxbase.h>
#include <hardware/cia.h>
#include <stdio.h>

struct FileList {
	char fl_filename[31];
	int fl_filetype;
};

/* Image-Ed Image generation */

/* Start of Image data */
USHORT MoveDownUpImageData[]={
	/* Plane 0 */
	0xffe0, 0x8020, 0x8e20, 0x8e20, 0x8e20, 0x8e20, 0xbfa0, 0x9f20, 
	0x8e20, 0x8420, 0x8020, 0xffe0, 0x0000
};
/* End of Image data */

struct Image MoveDownUpImage={
	0,0, /* LeftEdge, TopEdge */
	12,13,1, /* Width, Height, Depth */
	&MoveDownUpImageData[0], /* ImageData */
	0x1,0x0, /* PlanePick, PlaneOnOff */
	NULL /* Next Image */
};

/* Start of Image data */
USHORT MoveUpUpImageData[]={
	/* Plane 0 */
	0xffe0, 0x8020, 0x8420, 0x8e20, 0x9f20, 0xbfa0, 0x8e20, 0x8e20, 
	0x8e20, 0x8e20, 0x8020, 0xffe0, 0x0000
};
/* End of Image data */

struct Image MoveUpUpImage={
	0,0, /* LeftEdge, TopEdge */
	12,13,1, /* Width, Height, Depth */
	&MoveUpUpImageData[0], /* ImageData */
	0x1,0x0, /* PlanePick, PlaneOnOff */
	NULL /* Next Image */
};

/* Start of Image data */
USHORT MoveDownDownImageData[]={
	/* Plane 0 */
	0xffe0, 0xffe0, 0xf1e0, 0xf1e0, 0xf1e0, 0xf1e0, 0xc060, 0xe0e0, 
	0xf1e0, 0xfbe0, 0xffe0, 0xffe0, 0x0000
};
/* End of Image data */

struct Image MoveDownDownImage={
	0,0, /* LeftEdge, TopEdge */
	12,13,1, /* Width, Height, Depth */
	&MoveDownDownImageData[0], /* ImageData */
	0x1,0x0, /* PlanePick, PlaneOnOff */
	NULL /* Next Image */
};

/* Start of Image data */
USHORT MoveUpDownImageData[]={
	/* Plane 0 */
	0xffe0, 0xffe0, 0xfbe0, 0xf1e0, 0xe0e0, 0xc060, 0xf1e0, 0xf1e0, 
	0xf1e0, 0xf1e0, 0xffe0, 0xffe0, 0x0000
};
/* End of Image data */

struct Image MoveUpDownImage={
	0,0, /* LeftEdge, TopEdge */
	12,13,1, /* Width, Height, Depth */
	&MoveUpDownImageData[0], /* ImageData */
	0x1,0x0, /* PlanePick, PlaneOnOff */
	NULL /* Next Image */
};

/* End of Image-Ed Image generation */

#define MOVEUP 10
#define MOVEDOWN 11
#define UPDOWN 12
#define PATH 13
#define FILE 14
#define PARENT 15
#define OKAY 16
#define CANCEL 17

struct Gadget MoveUpGadget={
	NULL,250,25,12,13,GADGHIMAGE|GADGIMAGE,RELVERIFY|GADGIMMEDIATE,BOOLGADGET,
	(APTR)&MoveUpUpImage,(APTR)&MoveUpDownImage,NULL,NULL,NULL,MOVEUP,NULL};

struct Gadget MoveDownGadget={
	&MoveUpGadget,250,113,12,13,GADGHIMAGE|GADGIMAGE,RELVERIFY|GADGIMMEDIATE,
	BOOLGADGET,(APTR)&MoveDownUpImage,(APTR)&MoveDownDownImage,NULL,NULL,NULL,
	MOVEDOWN,NULL};

struct PropInfo UDInfo={
	AUTOKNOB|FREEVERT,0,0,0,0xffff};
struct Image UDImage;
struct Gadget UDGadget={
	&MoveDownGadget,250,38,11,74,GADGHNONE|GADGIMAGE,
	RELVERIFY|GADGIMMEDIATE,PROPGADGET,(APTR)&UDImage,
	NULL,NULL,NULL,(APTR)&UDInfo,UPDOWN,NULL};

short PathXYBorder[]={
	-2,-1,253,-1,253,10,-2,10,-2,-1};
struct Border PathBorder={
	-1,-1,1,0,JAM1,5,PathXYBorder,NULL};
char pathdobuffer[256],pathundobuffer[256];
struct StringInfo PathInfo={
	pathdobuffer,pathundobuffer,0,256,0};
struct Gadget PathGadget={
	&UDGadget,8,14,250,9,GADGHCOMP,TOGGLESELECT|RELVERIFY,STRGADGET,
	(APTR)&PathBorder,NULL,NULL,NULL,(APTR)&PathInfo,PATH,NULL};
char filedobuffer[31],fileundobuffer[31];
struct StringInfo FileInfo={
	filedobuffer,fileundobuffer,0,31,0};
struct Gadget FileSGadget={
	&PathGadget,8,128,250,9,GADGHCOMP,TOGGLESELECT|RELVERIFY,STRGADGET,
	(APTR)&PathBorder,NULL,NULL,NULL,(APTR)&FileInfo,FILE,NULL};

short ParentXYBorder[]={
	0,0,54,0,54,10,0,10,0,0};
struct Border ParentBorder={
	-1,-1,1,0,JAM1,5,ParentXYBorder,NULL};
struct IntuiText ParentText={
	1,0,JAM2,3,1,NULL,(UBYTE *)"PARENT",NULL};
struct Gadget ParentGadget={
	&FileSGadget,106,140,53,9,GADGHCOMP,RELVERIFY,BOOLGADGET,
	(APTR)&ParentBorder,NULL,(APTR)&ParentText,NULL,NULL,PARENT,NULL};
struct IntuiText OkayText={
	1,0,JAM2,11,1,NULL,(UBYTE *)"OKAY",NULL};
struct Gadget OkayGadget={
	&ParentGadget,6,140,53,9,GADGHCOMP,RELVERIFY,BOOLGADGET,
	(APTR)&ParentBorder,NULL,(APTR)&OkayText,NULL,NULL,OKAY,NULL};
struct IntuiText CancelText={
	1,0,JAM2,3,1,NULL,(UBYTE *)"CANCEL",NULL};
struct Gadget CancelGadget={
	&OkayGadget,207,140,53,9,GADGHCOMP,RELVERIFY,BOOLGADGET,
	(APTR)&ParentBorder,NULL,(APTR)&CancelText,NULL,NULL,CANCEL,NULL};

struct IntuiText FileGadgetText[10]={
	{1,0,JAM2,1,1,NULL,(UBYTE *)"",NULL},
	{1,0,JAM2,1,1,NULL,(UBYTE *)"",NULL},
	{1,0,JAM2,1,1,NULL,(UBYTE *)"",NULL},
	{1,0,JAM2,1,1,NULL,(UBYTE *)"",NULL},
	{1,0,JAM2,1,1,NULL,(UBYTE *)"",NULL},
	{1,0,JAM2,1,1,NULL,(UBYTE *)"",NULL},
	{1,0,JAM2,1,1,NULL,(UBYTE *)"",NULL},
	{1,0,JAM2,1,1,NULL,(UBYTE *)"",NULL},
	{1,0,JAM2,1,1,NULL,(UBYTE *)"",NULL},
	{1,0,JAM2,1,1,NULL,(UBYTE *)"",NULL}};

struct Gadget FileGadget[10]={
	{&FileGadget[1],5,25,242,10,GADGHCOMP,RELVERIFY,BOOLGADGET,
	NULL,NULL,(APTR)&FileGadgetText[0],NULL,NULL,0,NULL},
	{&FileGadget[2],5,35,242,10,GADGHCOMP,RELVERIFY,BOOLGADGET,
	NULL,NULL,(APTR)&FileGadgetText[1],NULL,NULL,1,NULL},
	{&FileGadget[3],5,45,242,10,GADGHCOMP,RELVERIFY,BOOLGADGET,
	NULL,NULL,(APTR)&FileGadgetText[2],NULL,NULL,2,NULL},
	{&FileGadget[4],5,55,242,10,GADGHCOMP,RELVERIFY,BOOLGADGET,
	NULL,NULL,(APTR)&FileGadgetText[3],NULL,NULL,3,NULL},
	{&FileGadget[5],5,65,242,10,GADGHCOMP,RELVERIFY,BOOLGADGET,
	NULL,NULL,(APTR)&FileGadgetText[4],NULL,NULL,4,NULL},
	{&FileGadget[6],5,75,242,10,GADGHCOMP,RELVERIFY,BOOLGADGET,
	NULL,NULL,(APTR)&FileGadgetText[5],NULL,NULL,5,NULL},
	{&FileGadget[7],5,85,242,10,GADGHCOMP,RELVERIFY,BOOLGADGET,
	NULL,NULL,(APTR)&FileGadgetText[6],NULL,NULL,6,NULL},
	{&FileGadget[8],5,95,242,10,GADGHCOMP,RELVERIFY,BOOLGADGET,
	NULL,NULL,(APTR)&FileGadgetText[7],NULL,NULL,7,NULL},
	{&FileGadget[9],5,105,242,10,GADGHCOMP,RELVERIFY,BOOLGADGET,
	NULL,NULL,(APTR)&FileGadgetText[8],NULL,NULL,8,NULL},
	{&CancelGadget,5,115,242,10,GADGHCOMP,RELVERIFY,BOOLGADGET,
	NULL,NULL,(APTR)&FileGadgetText[9],NULL,NULL,9,NULL}};

struct NewWindow filewin={
	10,10,266,152,0,1,CLOSEWINDOW|GADGETUP|GADGETDOWN|MOUSEBUTTONS,
	WINDOWCLOSE|ACTIVATE|WINDOWDRAG|RMBTRAP|SMART_REFRESH,
	&FileGadget[0],NULL,"File Requester",NULL,NULL,0,0,0,0,CUSTOMSCREEN};

struct Window *Window;
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct FileList files[1000];
int filecount,oldoffset,offset;
struct IntuiMessage *FMsg;
USHORT vertpot;
char filename[300];
struct DeviceList *devlist;
struct RootNode *rootnode;
struct DosInfo *dosinfo;
struct DosBase *DosBase;
char *devname;
BOOL deviceslisted=FALSE;
