/*
 *  Source machine generated by GadToolsBox V2.0
 *  which is (c) Copyright 1991-1993 Jaba Development
 *
 *  GUI Designed by : -- Unnamed --
 */

#include <exec/types.h>
#include <intuition/intuition.h>
#include <intuition/classes.h>
#include <intuition/classusr.h>
#include <intuition/imageclass.h>
#include <intuition/gadgetclass.h>
#include <libraries/gadtools.h>
#include <graphics/displayinfo.h>
#include <graphics/gfxbase.h>
//#include <proto/exec.h>
//#include <proto/intuition.h>
//#include <proto/gadtools.h>
//#include <proto/graphics.h>
//#include <proto/utility.h>
//#include <proto/dos.h>
#include <string.h>
#include <stdio.h>
#include <dos/dos.h>
//#include <proto/asl.h>
#include <libraries/asl.h>
#include <clib/asl_protos.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/graphics_protos.h>
#include <clib/utility_protos.h>
#include <clib/dos_protos.h>
#include <dos/dostags.h>

#include "EngClock_Prefs.h"

#define PREFS_FILE "s:engclock.prefs"
#define VERS 1 /* Version for backwards compat */
#define ID "EngCPrefs"
#define ENGLISH 1
#define FRENCH 2
#define SPANISH 3

short displevel(int code);
short drawspecial(void);
BOOL handlepgadgets(int iaddress, int code);
short writeprefs(void);
char *callasl(struct Window *win, char *title, char *initialdir);
void adaptlanguage(void);
void convertdate(int code);
int prefsgui(void);

BPTR handle2;
BOOL exit_flag2=FALSE;
char buffer[400];

extern struct Window *win_p;
extern struct TextAttr font1;
extern struct Screen *pubscreen;
extern char *publister(void);
extern void msg(char *msg);
extern void getdate(void);
extern int language;
extern BOOL locale;

extern struct Library *AslBase;
extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase *GfxBase;
extern struct Library *UtilityBase;
extern struct Library *GadToolsBase;
extern struct Library *DiskfontBase;
extern struct Library *IFFParseBase;
extern struct Library *DataTypesBase;
extern struct Library *TranslatorBase;
extern struct Library *DOSBase;

char time1[50], time2[50];

int preset=1; /* Current preset for alarm events */

struct IntuiText level_text= {
   1,0,JAM1,295,134,&font1,NULL,NULL };


struct Event {
	BOOL used;
	int type;	/* Type of event */
	int hours;	/* Time of event */
	int minutes;
	int timecode;
	char message[256];
	int day;
	int month;
	int year;
	BOOL enabledate;
	int freq;
};

extern struct {
/* Prefs structure used for preferences file format */

   char header[10];  /* I.D. Header */
   int vers;         /* Version of preferences file */
   int x;            /* X dimension of window when saved */
   int y;            /* Y dimension of window when saved */
   int width;        /* Width of window when saved */
   int height;       /* Height of window when saved */
   int planguage;    /* Language selected (menu) when saved, low pri */
   int just;         /* Justification of text, 0=Left, 1=Centre, 2=Right */
   short date;       /* Display date?, 0 = No, 1=Yes */
   short wtf;	     /* Window to front ? */
   int time_col[8];
   int date_col[8];
   short autoadjust;       /* Use automatic adjustment on window ? */
   char backdrop[256];  /* Backdrop image */
   char pub[139];			/* Default public screen */
	char accent[256];		/* Language file for tRanslate */
	char tkey[100];
	char hkey[100];
	struct Event events[11];  /* For the alarm! */

}prefs;

int current_mode=2; /* Current selected colour mode */

APTR                   VisualInfo = NULL;
struct Window         *Project0Wnd = NULL;
struct Gadget         *Project0GList = NULL;
struct Gadget         *Project0Gadgets[27];
extern Class          *initGet( void );
struct IClass         *getClass = NULL;
struct _Object        *getImage = NULL;
UWORD                  Project0Left = 0;
UWORD                  Project0Top = 0;
UWORD                  Project0Width = 560;
UWORD                  Project0Height = 245;
UBYTE                 *Project0Wdt = (UBYTE *)"EngClock Prefs";

UBYTE *Lang0Labels[] = {
	(UBYTE *)"English",
	(UBYTE *)"Français",
	(UBYTE *)"Español",
	NULL };

UBYTE *Just0Labels[] = {
	(UBYTE *)"Left",
	(UBYTE *)"Centre",
	(UBYTE *)"Right",
	NULL };

UBYTE *Type0Labels[] = {
	(UBYTE *)"Requester",
	(UBYTE *)"IFF-8SVX Sound",
	(UBYTE *)"AmigaDOS Command",
	(UBYTE *)"Speech",
	NULL };

struct TextAttr topaz8 = {
	( STRPTR )"topaz.font", 8, 0x00, 0x01 };

struct IntuiText Project0IText[] = {
	1, 0, JAM1,213, 6, &topaz8, (UBYTE *)"Language:-", &Project0IText[1],
	1, 0, JAM1,20, 6, &topaz8, (UBYTE *)"Justification:-", &Project0IText[2],
	1, 0, JAM1,378, 6, &topaz8, (UBYTE *)"Alarm Settings:-", NULL };

UWORD Project0GTypes[] = {
	SLIDER_KIND,
	BUTTON_KIND,
	BUTTON_KIND,
	SLIDER_KIND,
	SLIDER_KIND,
	CHECKBOX_KIND,
	MX_KIND,
	MX_KIND,
	CHECKBOX_KIND,
	CHECKBOX_KIND,
	STRING_KIND,
	STRING_KIND,
	GENERIC_KIND,
	GENERIC_KIND,
	SLIDER_KIND,
	TEXT_KIND,
	TEXT_KIND,
	SLIDER_KIND,
	CYCLE_KIND,
	STRING_KIND,
	CHECKBOX_KIND,
	BUTTON_KIND,
	GENERIC_KIND,
	STRING_KIND,
	GENERIC_KIND,
	STRING_KIND,
	STRING_KIND
};

struct NewGadget Project0NGad[] = {
	89, 123, 184, 11, (UBYTE *)"Colours", NULL, GD_ColourSlider, PLACETEXT_LEFT, NULL, NULL,
	9, 226, 106, 14, (UBYTE *)"Save", NULL, GD_But_Use, PLACETEXT_IN, NULL, NULL,
	438, 226, 106, 14, (UBYTE *)"Use", NULL, GD_But_Cancel, PLACETEXT_IN, NULL, NULL,
	111, 105, 102, 13, (UBYTE *)"Time Colour", NULL, GD_Time_Colour, PLACETEXT_LEFT, NULL, NULL,
	113, 89, 100, 13, (UBYTE *)"Date Colour", NULL, GD_Date_Colour, PLACETEXT_LEFT, NULL, NULL,
	164, 72, 26, 11, (UBYTE *)"Display Date", NULL, GD_Check_Date, PLACETEXT_RIGHT, NULL, NULL,
	278, 21, 17, 9, NULL, NULL, GD_Lang, PLACETEXT_LEFT, NULL, NULL,
	19, 23, 17, 9, NULL, NULL, GD_Just, PLACETEXT_RIGHT, NULL, NULL,
	16, 61, 26, 11, (UBYTE *)"Auto adjust", NULL, GD_Check_Auto, PLACETEXT_RIGHT, NULL, NULL,
	164, 59, 26, 11, (UBYTE *)"WindowToFront", NULL, GD_WinFront, PLACETEXT_RIGHT, NULL, NULL,
	118, 141, 162, 14, (UBYTE *)"Public Screen", NULL, GD_Pub, PLACETEXT_LEFT, NULL, NULL,
	76, 159, 203, 14, (UBYTE *)"Backdrop", NULL, GD_Back, PLACETEXT_LEFT, NULL, NULL,
	282, 141, 20, 14, NULL, NULL, GD_Pub_Get, 0, NULL, NULL,
	282, 159, 20, 14, NULL, NULL, GD_Asl_Get, 0, NULL, NULL,
	387, 33, 106, 11, (UBYTE *)"Event number", NULL, GD_A_Preset, PLACETEXT_ABOVE, NULL, NULL,
	334, 73, 201, 13, (UBYTE *)"Time of event", NULL, GD_Time1, PLACETEXT_ABOVE, NULL, NULL,
	334, 87, 201, 13, NULL, NULL, GD_Time2, 0, NULL, NULL,
	333, 103, 201, 12, NULL, NULL, GD_Time_Set, 0, NULL, NULL,
	335, 131, 201, 15, (UBYTE *)"Type of event", NULL, GD_Type, PLACETEXT_ABOVE, NULL, NULL,
	334, 162, 185, 14, (UBYTE *)"Parameter", NULL, GD_Msg, PLACETEXT_ABOVE, NULL, NULL,
	339, 47, 26, 11, (UBYTE *)"Enable Event", NULL, GD_Enable, PLACETEXT_RIGHT, NULL, NULL,
	480,47, 60,11,(UBYTE *)"Date",NULL,GD_Date,PLACETEXT_IN,NULL,NULL,
	524,162,20,14,NULL,NULL,GD_GetParam,0,NULL,NULL,
	134,183,384,14,(UBYTE *)"Accent Filename",NULL,GD_Accent,PLACETEXT_LEFT,NULL,NULL,
	524,183,20,14,NULL,NULL,GD_GetAccent,0,NULL,NULL,
	126,202,150,14,(UBYTE *)"Window hotkey",NULL,GD_HotKey,PLACETEXT_LEFT,NULL,NULL,
	392,202,150,14,(UBYTE *)"Talky hotkey",NULL,GD_TalkKey,PLACETEXT_LEFT,NULL,NULL
	
};

ULONG Project0GTags[] = {
	(GTSL_Max), 7, (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, (TAG_DONE),
	(TAG_DONE),
	(TAG_DONE),
	(GTSL_Max), 1, (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (TAG_DONE),
	(GTSL_Max), 1, (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (TAG_DONE),
	(TAG_DONE),
	(GTMX_Labels), (ULONG)&Lang0Labels[ 0 ], (GTMX_Spacing), 3, (TAG_DONE),
	(GTMX_Labels), (ULONG)&Just0Labels[ 0 ], (GTMX_Spacing), 2, (TAG_DONE),
	(TAG_DONE),
	(TAG_DONE),
	(GTST_MaxChars), 139, (TAG_DONE),
	(GTST_MaxChars), 256, (TAG_DONE),
	(TAG_DONE),
	(TAG_DONE),
	(GTSL_Min), 1, (GTSL_Max), 10, (GTSL_MaxLevelLen), 3, (GTSL_LevelFormat), (ULONG)"%ld", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, (TAG_DONE),
	(GTTX_Border), TRUE, (TAG_DONE),
	(GTTX_Border), TRUE, (TAG_DONE),
	(GTSL_Min),1,(GTSL_Max), 576, (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_RelVerify), TRUE, (TAG_DONE),
	(GTCY_Labels), (ULONG)&Type0Labels[ 0 ], (TAG_DONE),
	(GTST_MaxChars), 256, (TAG_DONE),
	(TAG_DONE),
	(TAG_DONE),
	(TAG_DONE),
	(GTST_MaxChars), 256, (TAG_DONE),
	(TAG_DONE),
	(GTST_MaxChars), 100, (TAG_DONE)
};

int SetupScreen( void )
{
	if ( ! ( VisualInfo = GetVisualInfo( pubscreen, TAG_DONE )))
		return( 2L );

	if ( ! ( getClass = initGet()))
		return( 3L );

	if ( ! ( getImage = NewObject( getClass, NULL, GT_VisualInfo, VisualInfo, TAG_DONE )))
		return( 4L );

	return( 0L );
}

void CloseDownScreen( void )
{
	if ( getImage   ) {
		DisposeObject( getImage );
		getImage = NULL;
	}

	if ( getClass   ) {
		FreeClass( getClass );
		getClass = NULL;
	}

	if ( VisualInfo ) {
		FreeVisualInfo( VisualInfo );
		VisualInfo = NULL;
	}

}

void Project0Render( void )
{
	UWORD		offx, offy;

	offx = Project0Wnd->BorderLeft;
	offy = Project0Wnd->BorderTop;

	PrintIText( Project0Wnd->RPort, Project0IText, offx, offy );
}

int OpenProject0Window( void )
{
	struct NewGadget	ng;
	struct Gadget	*g;
	UWORD		lc, tc;
	UWORD		offx = pubscreen->WBorLeft, offy = pubscreen->WBorTop + pubscreen->RastPort.TxHeight + 1;

	if ( ! ( g = CreateContext( &Project0GList )))
		return( 1L );

	for( lc = 0, tc = 0; lc < Project0_CNT; lc++ ) {

		CopyMem((char * )&Project0NGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));

		ng.ng_VisualInfo = VisualInfo;
		ng.ng_TextAttr   = &topaz8;
		ng.ng_LeftEdge  += offx;
		ng.ng_TopEdge   += offy;

		Project0Gadgets[ lc ] = g = CreateGadgetA((ULONG)Project0GTypes[ lc ], g, &ng, ( struct TagItem * )&Project0GTags[ tc ] );

		if ( Project0GTypes[ lc ] == GENERIC_KIND ) {
			g->Flags             |= GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
			g->Activation        |= GACT_RELVERIFY;
			g->GadgetRender       = (APTR)getImage;
			g->SelectRender       = (APTR)getImage;
		}

		while( Project0GTags[ tc ] ) tc += 2;
		tc++;

		if ( NOT g )
			return( 2L );
	}

	if ( ! ( Project0Wnd = OpenWindowTags( NULL,
				WA_Left,	Project0Left,
				WA_Top,		Project0Top,
				WA_Width,	Project0Width,
				WA_Height,	Project0Height + offy,
				WA_IDCMP,	SLIDERIDCMP|BUTTONIDCMP|CHECKBOXIDCMP|MXIDCMP|STRINGIDCMP|IDCMP_GADGETUP|TEXTIDCMP|CYCLEIDCMP|IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW,
				WA_Flags,	WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_SMART_REFRESH|WFLG_ACTIVATE,
				WA_Gadgets,	Project0GList,
				WA_Title,	Project0Wdt,
				WA_ScreenTitle,	"EngClock Prefs",
				WA_PubScreen,	pubscreen,
				TAG_DONE )))
	return( 4L );

	GT_RefreshWindow( Project0Wnd, NULL );

	Project0Render();

	return( 0L );
}

void CloseProject0Window( void )
{
	if ( Project0Wnd        ) {
		CloseWindow( Project0Wnd );
		Project0Wnd = NULL;
	}

	if ( Project0GList      ) {
		FreeGadgets( Project0GList );
		Project0GList = NULL;
	}
}

int prefsgui(void) {

   ULONG class, code, iaddress, offx, offy;
	struct IntuiMessage *msg2;

   exit_flag2=FALSE;

   SetupScreen();
	adaptlanguage();

   OpenProject0Window();

   displevel(0);
   drawspecial();
   if(prefs.planguage > 0)
      GT_SetGadgetAttrs(Project0Gadgets[GD_Lang],Project0Wnd,NULL,GTMX_Active,prefs.planguage-1,TAG_END);

   GT_SetGadgetAttrs(Project0Gadgets[GD_Just],Project0Wnd,NULL,GTMX_Active,prefs.just,TAG_END);
   GT_SetGadgetAttrs(Project0Gadgets[GD_Time_Colour],Project0Wnd,NULL,GTSL_Level,prefs.time_col[0],TAG_END);
   GT_SetGadgetAttrs(Project0Gadgets[GD_Date_Colour],Project0Wnd,NULL,GTSL_Level,prefs.date_col[0],TAG_END);
   GT_SetGadgetAttrs(Project0Gadgets[GD_Check_Date],Project0Wnd,NULL,GTCB_Checked,prefs.date,TAG_END);
   GT_SetGadgetAttrs(Project0Gadgets[GD_Check_Auto],Project0Wnd,NULL,GTCB_Checked,prefs.autoadjust,TAG_END);
   GT_SetGadgetAttrs(Project0Gadgets[GD_Pub],Project0Wnd,NULL,GTST_String,prefs.pub,TAG_END);
   GT_SetGadgetAttrs(Project0Gadgets[GD_Back],Project0Wnd,NULL,GTST_String,prefs.backdrop,TAG_END);
   GT_SetGadgetAttrs(Project0Gadgets[GD_WinFront],Project0Wnd,NULL,GTCB_Checked,prefs.wtf,TAG_END);

	convertdate(prefs.events[1].timecode);
	GT_SetGadgetAttrs(Project0Gadgets[GD_Time1],Project0Wnd,NULL,GTTX_Text,time1,TAG_END);
	GT_SetGadgetAttrs(Project0Gadgets[GD_Time2],Project0Wnd,NULL,GTTX_Text,time2,TAG_END);
	GT_SetGadgetAttrs(Project0Gadgets[GD_Msg],Project0Wnd,NULL,GTST_String,prefs.events[1].message,TAG_END);
	GT_SetGadgetAttrs(Project0Gadgets[GD_Type],Project0Wnd,NULL,GTCY_Active,prefs.events[1].type,TAG_END);
	GT_SetGadgetAttrs(Project0Gadgets[GD_Time_Set],Project0Wnd,NULL,GTSL_Level,prefs.events[1].timecode,TAG_END);
	GT_SetGadgetAttrs(Project0Gadgets[GD_Enable],Project0Wnd,NULL,GTCB_Checked,prefs.events[1].used,TAG_END);
	GT_SetGadgetAttrs(Project0Gadgets[GD_HotKey],Project0Wnd,NULL,GTST_String,prefs.hkey,TAG_END);
	GT_SetGadgetAttrs(Project0Gadgets[GD_TalkKey],Project0Wnd,NULL,GTST_String,prefs.tkey,TAG_END);

	if(locale) GT_SetGadgetAttrs(Project0Gadgets[GD_Lang],Project0Wnd,NULL,GA_Disabled,TRUE,TAG_END);

	GT_SetGadgetAttrs(Project0Gadgets[GD_Accent],Project0Wnd,NULL,GTST_String,prefs.accent,TAG_END);
   GT_RefreshWindow(Project0Wnd,NULL);                                      

   offx=Project0Wnd->BorderLeft-4;
   offy=Project0Wnd->BorderTop-11;

   SetAPen(Project0Wnd->RPort,prefs.time_col[0]);
   RectFill(Project0Wnd->RPort,241+offx,115+offy,299+offx,125+offy);
   SetAPen(Project0Wnd->RPort,prefs.date_col[0]);
   RectFill(Project0Wnd->RPort,241+offx,99+offy,299+offx,109+offy);
   SetAPen(Project0Wnd->RPort,1);

   while(1) {
      Wait(1<<Project0Wnd->UserPort->mp_SigBit);
      while(msg2=(struct IntuiMessage *)GT_GetIMsg(Project0Wnd->UserPort)) {
         class=msg2->Class;
         code=msg2->Code;
         iaddress=(ULONG)msg2->IAddress;
         GT_ReplyIMsg(msg2);

         switch(class) {
            case CLOSEWINDOW:
               goto cleanup;
            break;
            case GADGETUP:
            case GADGETDOWN:
            case MOUSEMOVE:
               if(!handlepgadgets(iaddress,code))
                  goto cleanup;
               if(exit_flag2)
                  goto cleanup;
            break;
            default:
               //msg("Unknown msg!");
            break;
         }
      }
   }

cleanup:

   CloseProject0Window();
   CloseDownScreen();

   return;
}

BOOL handlepgadgets(int iaddress, int code) {
   struct Gadget *gad;
   struct StringInfo *si;
	char pub[139];
	char *tmp=NULL;
   int cols=2, i=0;
   UWORD offx, offy;
	
	BPTR thandle;   /* temp handle */

   offx=Project0Wnd->BorderLeft-4;
   offy=Project0Wnd->BorderTop-11;

   gad=(struct Gadget *)iaddress;
   si=(struct StringInfo *)gad->SpecialInfo;

   switch(gad->GadgetID) {
      case GD_ColourSlider:
         current_mode=code;
         displevel(code);
         for(i=0; i<code; i++) {
           cols=cols*2;
         }
         GT_SetGadgetAttrs(Project0Gadgets[GD_Time_Colour],Project0Wnd,NULL,GTSL_Max,(cols-1),GTSL_Level,prefs.time_col[code],TAG_END);
         GT_SetGadgetAttrs(Project0Gadgets[GD_Date_Colour],Project0Wnd,NULL,GTSL_Max,(cols-1),GTSL_Level,prefs.date_col[code],TAG_END);
         GT_RefreshWindow(Project0Wnd,NULL);

         SetAPen(Project0Wnd->RPort,prefs.time_col[code]);
         RectFill(Project0Wnd->RPort,241+offx,115+offy,299+offx,125+offy);
         SetAPen(Project0Wnd->RPort,prefs.date_col[code]);
         RectFill(Project0Wnd->RPort,241+offx,99+offy,299+offx,109+offy);
         SetAPen(Project0Wnd->RPort,1);

      break;
      case GD_But_Use:
         writeprefs();
         exit_flag2=TRUE;
         return(0);
     break;
      case GD_But_Cancel:
         exit_flag2=TRUE;
         return(0);
      break;
      case GD_Time_Colour:
         SetAPen(Project0Wnd->RPort,code);
         RectFill(Project0Wnd->RPort,241+offx,115+offy,299+offx,125+offy);
         SetAPen(Project0Wnd->RPort,1);
         prefs.time_col[current_mode]=code;
      break;
      case GD_Date_Colour:
         SetAPen(Project0Wnd->RPort,code);
         RectFill(Project0Wnd->RPort,241+offx,99+offy,299+offx,109+offy);
         SetAPen(Project0Wnd->RPort,1);
         prefs.date_col[current_mode]=code;
      break;
      case GD_Check_Date:
         prefs.date=code;
      break;
		case GD_Pub_Get:
			tmp=NULL;
			tmp=publister();
			if(tmp!=(char *)1234) {
				sprintf(pub,"%s",tmp);
				if(strcmp(pub,"")) {
					strcpy(prefs.pub,pub);
					GT_SetGadgetAttrs(Project0Gadgets[GD_Pub],Project0Wnd,NULL,GTST_String,prefs.pub,TAG_DONE);
					GT_RefreshWindow(Project0Wnd,NULL);
				}
			}
			break;
      case GD_Check_Auto:
         prefs.autoadjust=code;
      break;
		case GD_Date:
			getdate();
		break;
      case GD_Lang:
         prefs.planguage=(code+1);
         language=code+1;
      break;
      case GD_Just:
         prefs.just=code;
      break;
		case GD_WinFront:
			prefs.wtf=code;
		break;
		case GD_Back:
			strcpy(prefs.backdrop,si->Buffer);
			thandle=Open(prefs.backdrop,MODE_OLDFILE);
			if(!thandle) {
				DisplayBeep(NULL);
				strcpy(prefs.backdrop,"");
				GT_SetGadgetAttrs(Project0Gadgets[GD_Back],Project0Wnd,NULL,GTST_String,prefs.backdrop,TAG_END);
            GT_RefreshWindow(Project0Wnd,NULL);
			}
			if(thandle) Close(thandle);
		break;
		case GD_Pub:
			strcpy(prefs.pub,si->Buffer);
 		break;
		case GD_Asl_Get:

			switch(language) {
				case ENGLISH:
				case FRENCH:
					tmp=callasl(Project0Wnd,"Pick a file for the backdrop",NULL);
				break;
				case SPANISH:
					tmp=callasl(Project0Wnd,"Elija una imagen cono fondo",NULL);
				break;
				default:
					tmp=callasl(Project0Wnd,"Pick a file for the backdrop",NULL);
				break;
			}

			if(tmp) {
				sprintf(prefs.backdrop,"%s",tmp);
				thandle=Open(prefs.backdrop,MODE_OLDFILE);
				if(!thandle) {
					DisplayBeep(NULL);
					strcpy(prefs.backdrop,"");
					GT_SetGadgetAttrs(Project0Gadgets[GD_Back],Project0Wnd,NULL,GTST_String,prefs.backdrop,TAG_END);
            	GT_RefreshWindow(Project0Wnd,NULL);
				}
				if(thandle) Close(thandle);	
				GT_SetGadgetAttrs(Project0Gadgets[GD_Back],Project0Wnd,NULL,GTST_String,prefs.backdrop,TAG_END);
         	GT_RefreshWindow(Project0Wnd,NULL);		
			}
		break;
		case GD_A_Preset:
			preset=code;
			convertdate(prefs.events[preset].timecode);
			GT_SetGadgetAttrs(Project0Gadgets[GD_Time1],Project0Wnd,NULL,GTTX_Text,time1,TAG_END);
			GT_SetGadgetAttrs(Project0Gadgets[GD_Time2],Project0Wnd,NULL,GTTX_Text,time2,TAG_END);
			GT_SetGadgetAttrs(Project0Gadgets[GD_Msg],Project0Wnd,NULL,GTST_String,prefs.events[preset].message,TAG_END);
			GT_SetGadgetAttrs(Project0Gadgets[GD_Type],Project0Wnd,NULL,GTCY_Active,prefs.events[preset].type,TAG_END);
			GT_SetGadgetAttrs(Project0Gadgets[GD_Time_Set],Project0Wnd,NULL,GTSL_Level,prefs.events[preset].timecode,TAG_END);
			GT_SetGadgetAttrs(Project0Gadgets[GD_Enable],Project0Wnd,NULL,GTCB_Checked,prefs.events[preset].used,TAG_END);
			GT_RefreshWindow(Project0Wnd,NULL);			
		break;
		case GD_Time_Set:
			/* code 0 = It's just gone one o'clock (am) */
			/* If code is even, It's Just gone
				if code is odd, Its nearly */
			/* Reset */
			prefs.events[preset].hours=0;
			prefs.events[preset].minutes=0;
			prefs.events[preset].timecode=code;

			convertdate(code);
			
			GT_SetGadgetAttrs(Project0Gadgets[GD_Time1],Project0Wnd,NULL,GTTX_Text,time1,TAG_END);
			GT_SetGadgetAttrs(Project0Gadgets[GD_Time2],Project0Wnd,NULL,GTTX_Text,time2,TAG_END);

			GT_RefreshWindow(Project0Wnd,NULL);
		break;
		case GD_Type:
			prefs.events[preset].type=code;
			
		break;
		case GD_Msg:
			strcpy(prefs.events[preset].message,si->Buffer);	
		break;
		case GD_Enable:
			prefs.events[preset].used=code;
		break;
		case GD_GetParam:
			strcpy(prefs.events[preset].message,callasl(Project0Wnd,"Select a file as a parameter for your event",NULL));
			GT_SetGadgetAttrs(Project0Gadgets[GD_Msg],Project0Wnd,NULL,GTST_String,prefs.events[preset].message,TAG_END);
			GT_RefreshWindow(Project0Wnd,NULL);

		break;
		
		case GD_Accent:
			strcpy(prefs.accent,si->Buffer);
			thandle=Open(prefs.accent,MODE_OLDFILE);
			if(!thandle) {
				DisplayBeep(NULL);
				strcpy(prefs.accent,"");
				GT_SetGadgetAttrs(Project0Gadgets[GD_Accent],Project0Wnd,NULL,GTST_String,prefs.accent,TAG_END);
            GT_RefreshWindow(Project0Wnd,NULL);
			}
			if(thandle) Close(thandle);
		break;
		case GD_GetAccent:
			tmp=callasl(Project0Wnd,"Choose your accent","LOCALE:Accents");
			if(tmp) {
				sprintf(prefs.accent,"%s",tmp);
				thandle=Open(prefs.accent,MODE_OLDFILE);
				if(!thandle) {
					DisplayBeep(NULL);
					strcpy(prefs.accent,"");
					GT_SetGadgetAttrs(Project0Gadgets[GD_Accent],Project0Wnd,NULL,GTST_String,prefs.accent,TAG_END);
            	GT_RefreshWindow(Project0Wnd,NULL);
				}
				if(thandle) Close(thandle);	
				GT_SetGadgetAttrs(Project0Gadgets[GD_Accent],Project0Wnd,NULL,GTST_String,prefs.accent,TAG_END);
         	GT_RefreshWindow(Project0Wnd,NULL);		
			}
		break;
		case GD_HotKey:
			strcpy(prefs.hkey,si->Buffer);
		break;
		case GD_TalkKey:
			strcpy(prefs.tkey,si->Buffer);
		break;
 

   }

   return(1);
}

short displevel(int code) {
   UWORD offx, offy;
   int i=0, cols=2;
   char text[5];

   offx=Project0Wnd->BorderLeft-4;
   offy=Project0Wnd->BorderTop-11;

   for(i=0; i<code; i++) {
      cols=cols*2;
   }
   sprintf(text,"%ld",cols);
   level_text.IText=text;
   SetAPen(Project0Wnd->RPort,0);
   RectFill(Project0Wnd->RPort,293+offx,131+offy,320+offx,142+offy);
   SetAPen(Project0Wnd->RPort,1);
   PrintIText(Project0Wnd->RPort,&level_text,offx,offy);

   return(1);
}

short drawspecial(void) {
   UWORD offx, offy;

   offx=Project0Wnd->BorderLeft-4;
   offy=Project0Wnd->BorderTop-11;

   /* Outline to time colour */

   Move(Project0Wnd->RPort,240+offx,98+offy);
   Draw(Project0Wnd->RPort,300+offx,98+offy);

   Move(Project0Wnd->RPort,300+offx,98+offy);
   Draw(Project0Wnd->RPort,300+offx,110+offy);

   Move(Project0Wnd->RPort,300+offx,110+offy);
   Draw(Project0Wnd->RPort,240+offx,110+offy);

   Move(Project0Wnd->RPort,240+offx,110+offy);
   Draw(Project0Wnd->RPort,240+offx,98+offy);

   /* Ouline to date colour */

   Move(Project0Wnd->RPort,240+offx,114+offy);
   Draw(Project0Wnd->RPort,300+offx,114+offy);

   Move(Project0Wnd->RPort,300+offx,114+offy);
   Draw(Project0Wnd->RPort,300+offx,126+offy);

   Move(Project0Wnd->RPort,300+offx,126+offy);
   Draw(Project0Wnd->RPort,240+offx,126+offy);

   Move(Project0Wnd->RPort,240+offx,126+offy);
   Draw(Project0Wnd->RPort,240+offx,114+offy);

   return(1);
}

short writeprefs(void) {
   int bytes;                         

   handle2=Open(PREFS_FILE,MODE_READWRITE);
   if (!handle2) {
      DisplayBeep(0L);
      return(0); }

   /* First update the prefs structure */
   prefs.vers=VERS; /* Current version of prefs file format */
   strcpy(prefs.header,ID); /* Header */
   prefs.x=win_p->LeftEdge;
   prefs.y=win_p->TopEdge;
   prefs.width=win_p->Width;
   prefs.height=win_p->Height;
   /* Note that the planguage element does not need to be updated */
   bytes=FWrite(handle2,(char *)&prefs,1,sizeof(prefs));
   if(bytes!=sizeof(prefs))
      /* File was not written properly! */
      DisplayBeep(NULL);

   Close(handle2);
   return(0);
}


char *callasl(struct Window *win, char *title, char *initialdir) {
	struct FileRequester *fr;
	char buffer2[200];
	struct TagItem tags[] = {
		ASL_Hail,(ULONG)NULL,
		ASL_Pattern,(ULONG)"#?",
		ASL_FuncFlags,FILF_PATGAD,
		ASL_Window,(ULONG)NULL,
		ASL_Dir,(ULONG)NULL,
		TAG_DONE
	};

	if(!(AslBase=OpenLibrary("asl.library",0))) 
		return(NULL);

	tags[0].ti_Data=(ULONG)title;
	tags[3].ti_Data=(ULONG)win;
	tags[4].ti_Data=(ULONG)initialdir;

	fr=(struct FileRequester *)AllocAslRequest(ASL_FileRequest,&tags[0]);
	if(!fr) {
		msg("Unable to open asl requester!");
		CloseLibrary(AslBase);
		return(0);
	}

	if(!AslRequest(fr,NULL)) {
		FreeAslRequest(fr);
		CloseLibrary(AslBase);
		return(0);
	}

	sprintf(buffer,"%s",fr->rf_Dir);
	sprintf(buffer2,"%s",fr->rf_File);

	if(buffer[strlen(buffer)-1]!=':' && buffer[strlen(buffer)-1]!='/' ) {
		/* No device name nor trailing slash */
		if(strcmp(buffer,"")) {
			/* Make sure something is in there */
			strcat(buffer,"/");
		}
	}

	strcat(buffer,buffer2);


	FreeAslRequest(fr);

	CloseLibrary(AslBase);
	return(&buffer[0]);
}


void adaptlanguage(void) {

	switch(language) {
		case ENGLISH:
		break;
		case FRENCH:
			Just0Labels[0]="Gauche";
			Just0Labels[1]="Droit";
			Just0Labels[2]="Centre";
			Type0Labels[0]="Demander";
			Type0Labels[1]="Bruit (IFF)";
			Type0Labels[2]="Ordre (AmigaDOS)";
			Type0Labels[3]="Parole";
			Project0IText[0].IText="Langue";
			Project0IText[1].IText="Justification";
			Project0IText[2].IText="Réveille-matin:-";
			Project0NGad[0].ng_GadgetText="Couleurs";
			Project0NGad[1].ng_GadgetText="Sauver";
			Project0NGad[2].ng_GadgetText="Emploi";
			Project0NGad[3].ng_GadgetText="Couleur(date)";
			Project0NGad[4].ng_GadgetText="Couleur(temp)";
			Project0NGad[5].ng_GadgetText="Date ?";
			Project0NGad[8].ng_GadgetText="Automatique";
			Project0NGad[10].ng_GadgetText="écran (pub)"; 
			Project0NGad[11].ng_GadgetText="Image";
			Project0NGad[9].ng_GadgetText="Fenêtre á face";
			Project0NGad[14].ng_GadgetText="Nombre";
			Project0NGad[15].ng_GadgetText="Temps";
			Project0NGad[18].ng_GadgetText="Type";
			Project0NGad[19].ng_GadgetText="Texte";
			Project0NGad[20].ng_GadgetText="Emploi cas?";
			
		
		break;
		case SPANISH:
			Just0Labels[0]="A la Izquierdo";
			Just0Labels[2]="A la Derecho";
			Just0Labels[1]="Centrado";
			Type0Labels[0]="Petición";
			Type0Labels[1]="Sonido (IFF)";
			Type0Labels[2]="Orden (AmigaDOS)";
			Type0Labels[3]="Habla";	
			Project0IText[0].IText="Lenguaje";
			Project0IText[1].IText="Justificado Texto";
			Project0IText[2].IText="Despertador";
			Project0NGad[0].ng_GadgetText="Nº Colores";
			Project0NGad[1].ng_GadgetText="Guardar";
			Project0NGad[2].ng_GadgetText="Usar";
			Project0NGad[3].ng_GadgetText="Color (Hora)";
			Project0NGad[4].ng_GadgetText="Color (Fecha)";
			Project0NGad[5].ng_GadgetText="Monstrar Fecha";
			Project0NGad[8].ng_GadgetText="Auto Ajuste";
			Project0NGad[10].ng_GadgetText="PantPública";
			Project0NGad[11].ng_GadgetText="Imagen";
			Project0NGad[9].ng_GadgetText="Primer Plano";
			Project0NGad[14].ng_GadgetText="NÚmero";
			Project0NGad[19].ng_GadgetText="Texto";
			Project0NGad[20].ng_GadgetText="Suceso ?";
			Project0NGad[21].ng_GadgetText="Fecha";
			Project0NGad[15].ng_GadgetText="Tiempo";
			Project0NGad[18].ng_GadgetText="Tipo";

			break;

	}

}
void convertdate(int code) {
	int tme,i,hours_count;
	BOOL pm,odd=FALSE;

	tme=(code/2)*2;
			if(code!=tme) 
				strcpy(time1,"Just gone ");
			else {			
				strcpy(time1,"Nearly ");
				odd=TRUE;
				tme++;
			};
		hours_count=1;
		while (tme > 24) {
			tme=tme-24;
			hours_count++;
		}
		if(hours_count==25) hours_count=1;		
		tme=(tme/2)*5;
		if(tme == 60) { tme=0; hours_count++; }

		pm=FALSE;
		if(hours_count > 12) {
			pm=TRUE;
			hours_count+= - 12;
		}
		
		if(hours_count == 12) {
			if(pm) pm=FALSE; else pm=TRUE;
		} 
		if (tme !=0) strcat(time1,engnums[tme]);
		prefs.events[preset].minutes=tme;
		if(odd) prefs.events[preset].minutes+= -2;
		
		if (tme !=0) strcat(time1," ");
		if (tme !=0) {
			if(tme <= 30) 
				strcat(time1,"past ");
			else {
				strcat(time1,"to ");
			}
		}
		/* if(tme>30) prefs.events[preset].hours=hours_count+1;
		else */
		
		prefs.events[preset].hours=hours_count;

		
		if(prefs.events[preset].minutes==-2) {
			prefs.events[preset].hours--;
			prefs.events[preset].minutes=58;
			if(prefs.events[preset].hours==-1) 
				prefs.events[preset].hours=23;
		}
		if(prefs.events[preset].hours==25)
			prefs.events[preset].hours=0;
	
		if(tme>30 && hours_count==12) { 
			hours_count=0;
			prefs.events[preset].hours=0;
		}
	
		if(hours_count==13) {
			hours_count=1;
			prefs.events[preset].hours=1;
		}

		if(tme>30) strcat(time1,engnums[hours_count+1]);
		else
		strcat(time1,engnums[hours_count]);

		if(hours_count==11 && tme>30) {
			if(pm) pm=FALSE;
			else
			pm=TRUE;
		}

		if(!pm) {
			if(hours_count==11) {
				if(tme >30) {
					prefs.events[preset].hours+=12;
				}
				if(hours_count==12) {
					prefs.events[preset].hours+=12;
				}
			}
		}
		if(pm==0 && prefs.events[preset].hours==12) prefs.events[preset].hours=0;
		if(pm) prefs.events[preset].hours+=12;

		if(prefs.events[preset].hours==25) prefs.events[preset].hours=1;
		if(prefs.events[preset].hours==24) prefs.events[preset].hours=0;

 
		
		if(pm) strcat(time1," (pm)"); else strcat(time1," (am)");
		
		
		switch(language) {
			case ENGLISH:
			break;

			case FRENCH:
			strcpy(time1,""); /* Clear out English */
			if(prefs.events[preset].hours>12) {
				pm=TRUE;
				prefs.events[preset].hours+=-12;
			} else 
				pm=FALSE;

			tme=(prefs.events[preset].minutes/5)*5;

         if((prefs.events[preset].minutes-tme)>2)
            strcat(time1,"Bientôt ");

         if(prefs.events[preset].minutes<=32) {
            strcat(time1,engnums[prefs.events[preset].hours]);
         }
         else {
         	if(prefs.events[preset].hours==12) {
               strcat(time1,engnums[1]); }
            else {
         		strcat(time1,engnums[prefs.events[preset].hours+1]);
            }
         }

         strcat(time1," heures");

         if(prefs.events[preset].minutes>2 & prefs.events[preset].minutes<58) {
            strcat(time1," ");
            if(prefs.events[preset].minutes>32)
                  strcat(time1,"moins ");

            if((prefs.events[preset].minutes-tme)<=2) 
               strcat(time1,engnums[(prefs.events[preset].minutes/5)*5]); 
            else 
               strcat(time1,engnums[((prefs.events[preset].minutes/5)+1)*5]); 
         }
         if((prefs.events[preset].minutes-tme)<=2)
            strcat(time1," passées");

			if(pm) {
				prefs.events[preset].hours+=12;
				strcat(time1," (pm)");
			} else 
				strcat(time1," (am)");

			break;

			case SPANISH:
				strcpy(time1,""); /* Clear out English */
		
				if(prefs.events[preset].hours>12) {
					pm=TRUE;
					prefs.events[preset].hours+=-12;
				} else 
					pm=FALSE;

				if(odd) strcpy(time1,"Aproximadamente ");
				tme=(prefs.events[preset].minutes/5)*5;
            if(prefs.events[preset].minutes<=32)
               strcat(time1,engnums[prefs.events[preset].hours]);
            else {
               if(prefs.events[preset].hours==12)
                  strcat(time1,engnums[1]);
               else
                  strcat(time1,engnums[prefs.events[preset].hours+1]);
            }
         if(prefs.events[preset].minutes>2 & prefs.events[preset].minutes<58) {
            if(prefs.events[preset].minutes<=32)
               strcat(time1," y");
            else
               strcat(time1," menos");
            strcat(time1," ");
            if((prefs.events[preset].minutes-tme)<=2) {
               strcat(time1,engnums[(prefs.events[preset].minutes/5)*5]); }
            else {
               strcat(time1,engnums[((prefs.events[preset].minutes/5)+1)*5]); }
         }
			if(pm) {
				prefs.events[preset].hours+=12;
				strcat(time1," (pm)");
			} else 
				strcat(time1," (am)");
			break;
			default:
			break;
		}

	if(strlen(time1) > 23) {
			for(i=0; i<22; i++) {
				time2[i]=time1[24+i];
			}
			time2[i+1]=0L;
		} else
			strcpy(time2,"");

}


/* The meaning of life is simple, its just that I can't think of it at the
moment. */
