void ex(void);

extern near char *__procname="EngPrefs_8.5";
extern near long __stack=16876;

#define MOD_PATH "modules/"

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <libraries/triton.h>

#include <proto/exec.h>
#include <proto/triton.h>
#include <proto/langmod.h>
#include <proto/datatypes.h>
#include <proto/locale.h>
#include <proto/dos.h>
#include <proto/asl.h>
#include <proto/utility.h>
#include <proto/intuition.h>
#include <intuition/intuition.h>
#include <datatypes/datatypes.h>
#include <datatypes/datatypesclass.h>
#include <datatypes/pictureclass.h>
#include <utility/utility.h>

#include "prefs.h"

struct Prefs prefs;
struct Prefs copy_of_prefs;

struct Catalog *catalog;

struct IntuiText msg_text={
      1,0,JAM1,16,9,NULL,NULL,NULL };

struct IntuiText ok_text={
      1,0,JAM1,16,9,NULL,NULL,NULL };

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

char buffer[400];

struct Language *chosen_lang;
struct Language *available_lang;
BOOL locale=TRUE;

short writeprefs(void);
short readprefs(void);
char *callasl(struct Window *win, char *title, char *initialdir, char *pat, BOOL ignore);
void cleanup(char *text);
void redotime(void);
void setpreset(int pre);
void changewgts(void);
void arexx(void);
void sendcommand(char *command);
long identify(char *fname);
void fontsel(void);
void msg(char *msg);
void magic(struct TagItem *a, int magicnumber, ULONG data);
void localise(void);
/* Locale.o */
extern void dissupported_languages(struct Language *a);
extern struct Language *supported_languages(char *dir);
extern short getlocale(void);
/* END */

BPTR handle2;

int preset=1; /* Current preset for alarm events */
int current_mode=1; /* Current selected colour mode */

struct TR_Project *main_win, *lang_win, *text_win, *system_win, *alarm_win, *alarm_win2, *system_win2;
struct Library *LangModBase;  /* The hook into the modular system */

struct Screen *scr;

#include "gui.h"

void main(int argc, char **argv) {

	char *tmp2=NULL;
	char olddir[200];
	char stuff[200];
	
	int i;

	BPTR thandle;   /* temp handle */
	BOOL alter=TRUE;


	if(argc > 2 || argc<0) {
		msg("Worng arguments!");
		return;
	}
	
	if(argc==2) 
		if(!(strcmp(argv[1],"SLOW")))
			alter=FALSE;
	
	
	catalog=OpenCatalog(0,"engprefs.catalog",0);
	
	readprefs();
	memcpy(&copy_of_prefs,&prefs,sizeof(struct Prefs));
	magic(systemtags,0x7651,(ULONG)prefs.hkey);
	magic(systemtags,0x7652,(ULONG)prefs.tkey);

	localise();
	
	if(!(available_lang=supported_languages(MOD_PATH)))
		cleanup("No supported languages!\n");
		
	getlocale();
	
	if(1) {
		char name[100];
		char tmp[80];
		char m[100];
		
		strcpy(name,MOD_PATH);
		sprintf(tmp,"%s.langmod",chosen_lang->name);
		strcat(name,tmp);
	
		LangModBase=OpenLibrary(name,0);
		
		if(!LangModBase) { sprintf(m,"%s failed to open!\n",name); msg(m); }
	
	}

	if(!TR_OpenTriton(TRITON20VERSION,
			TRCA_Name,"EngPrefs",
			TRCA_Version,"0.0",TAG_END)) {
		printf("Unable to open triton.library!\n");
		return;
	}

	if(!(scr=LockPubScreen(NULL)))
		cleanup("Couldn't lock default public screen!\n");

	/* Set up some tags before allocating anything....*/


	if(main_win=TR_OpenProject(Application,maintags)) {
		BOOL flag=0;
		struct TR_Message *msg;
		
		while(!flag) {
			char tmp[300];
			char tmp_pub[50];
			TR_Wait(Application,0);
			while(msg=TR_GetMsg(Application)) {
				switch(msg->trm_Class) {
					case TRMS_CLOSEWINDOW:
						if(msg->trm_Project==main_win) {
							sendcommand("RESET");
							flag=1;
						} else {

							if(msg->trm_Project==lang_win) {
								lang_win=0;
								strcpy(prefs.planguage.name,copy_of_prefs.planguage.name);
								strcpy(prefs.accent,copy_of_prefs.accent);
							}
							if(msg->trm_Project==text_win) {
								text_win=0;
								prefs.just=copy_of_prefs.just;
								prefs.autoadjust=copy_of_prefs.autoadjust;
								if(1) {
									int i;
									for(i=0; i<8; i++) {
										prefs.date_col[i]=copy_of_prefs.date_col[i];
										prefs.time_col[i]=copy_of_prefs.time_col[i];
									}
								}
							}
							if(msg->trm_Project==system_win && !system_win2) {
								system_win=0;
								prefs.wtf=copy_of_prefs.wtf;
								prefs.date=copy_of_prefs.date;
								strcpy(prefs.pub,copy_of_prefs.pub);
								strcpy(prefs.hkey,copy_of_prefs.hkey);
								strcpy(prefs.tkey,copy_of_prefs.tkey);
								strcpy(prefs.backdrop,copy_of_prefs.backdrop);
							}
							if(msg->trm_Project==alarm_win && !alarm_win2) {
								alarm_win=0; 
								memcpy(&prefs.events,&copy_of_prefs.events,sizeof(struct Event)*10);
							}

							if(msg->trm_Project==alarm_win2)
								alarm_win2=0;
							if(msg->trm_Project==system_win2) {
								system_win2=0;
							}
								
							TR_CloseProject(msg->trm_Project);
							arexx();
						}
						
					break;
					case TRMS_ACTION:
						switch(msg->trm_ID) {
							
							case 1: // Lang
								if(!lang_win) { lang_win=TR_OpenProject(Application,langtags); changewgts(); }
							break;
							case 2: // Text
								if(!text_win) { text_win=TR_OpenProject(Application,texttags); changewgts(); }
							break;
							case 3: // Alarm
								if(!alarm_win) { alarm_win=TR_OpenProject(Application,alarmtags); changewgts(); }
								setpreset(1);
							break;
							case 4: // System
								if(!system_win) { system_win=TR_OpenProject(Application,systemtags); changewgts(); }
							break;
							case 44: // Main OK
								writeprefs();
								sendcommand("RESET");
								flag=1;
							break;
							case 45: // Main Cancel
								sendcommand("RESET");
								flag=1;
							break;
							
							case 6: // Get new language
								tmp2=callasl(0,GetCatalogStr(catalog,59,"Pick a language"),"modules/","#?.langmod",1);
						
								if(tmp2) {
									char testname[500];

							
									if(strlen(tmp2) > 8)
										tmp2[strlen(tmp2)-8]=0;
									else
										strcpy(tmp2,"");

									sprintf(prefs.planguage.name,"%s",tmp2);
									sprintf(testname,"modules/%s.langmod",tmp2);

									thandle=Open(testname,MODE_OLDFILE);
									if(!thandle) {
										DisplayBeep(NULL);
										strcpy(prefs.planguage.name,"");
									}
									if(thandle) Close(thandle);	
								}
								if(1) {
									char space[200];
									sprintf(space,"LANG %s",prefs.planguage.name);
									sendcommand(space);
								}
								TR_SetAttribute(lang_win,5,TRAT_Text,(ULONG)prefs.planguage.name);
							break;
							case 8: // Get new accent
							
								tmp2=callasl(0,GetCatalogStr(catalog,60,"Pick a file for the accent"),"locale:accents","#?.accent",0);
								if(tmp2) {
									sprintf(prefs.accent,"%s",tmp2);
									thandle=Open(prefs.accent,MODE_OLDFILE);
									if(!thandle) {
										DisplayBeep(NULL);
										strcpy(prefs.accent,"");
									}
									if(thandle) Close(thandle);	
								}
								if(1) {
									char space[200];
									sprintf(space,"ACCENT %s",prefs.accent);
									sendcommand(space);
								}
								TR_SetAttribute(lang_win,7,TRAT_Text,(ULONG)prefs.accent);
							break;
							case 9: //OK Lang
								memcpy(&copy_of_prefs,&prefs,sizeof(struct Prefs));
								TR_CloseProject(lang_win);
								lang_win=0;
							break;
							case 10: //Cancel lang
								strcpy(prefs.planguage.name,copy_of_prefs.planguage.name);
								strcpy(prefs.accent,copy_of_prefs.accent);
								TR_CloseProject(lang_win);
								lang_win=0;
								arexx();
							break;

							
							
							case 16: //OK text						
								memcpy(&copy_of_prefs,&prefs,sizeof(struct Prefs));
								TR_CloseProject(text_win);
								text_win=0;
							break;
							case 17: //Cancel text
								prefs.just=copy_of_prefs.just;
								prefs.autoadjust=copy_of_prefs.autoadjust;
								if(1) {
									int i;
									for(i=0; i<8; i++) {
										prefs.date_col[i]=copy_of_prefs.date_col[i];
										prefs.time_col[i]=copy_of_prefs.time_col[i];
									}
								}
								TR_CloseProject(text_win);
								text_win=0;
								arexx();
							break;

							case 48: // Alarm: Get new param
								if(!alarm_win2) alarm_win2=TR_OpenProject(Application,alarmtags2);
							break;
							case 46: // NP Ok
								strcpy(prefs.events[preset].message,tmp);
								if(prefs.events[preset].type==1) { // Sound 
									if(identify(prefs.events[preset].message)!=GID_SOUND) {
										DisplayBeep(NULL);
										strcpy(prefs.events[preset].message,"");
									}
								}
								TR_SetAttribute(alarm_win,27,TRAT_Text,(ULONG)prefs.events[preset].message);
								TR_CloseProject(alarm_win2);
								alarm_win2=0;
							break;
							case 47: // NP Cancel
								TR_CloseProject(alarm_win2);
								alarm_win2=0;
							break;
							
							case 29: // OK alarm
								memcpy(&copy_of_prefs,&prefs,sizeof(struct Prefs));
								TR_CloseProject(alarm_win);
								alarm_win=0;
							break;
							
							case 30: // Cancel alarm
								memcpy(&prefs.events,&copy_of_prefs.events,sizeof(struct Event)*10);
								TR_CloseProject(alarm_win);	
								alarm_win=0;
								arexx();
							break;
							
							case 43: // CAncel system
								// Copy all system settings from backup
								prefs.wtf=copy_of_prefs.wtf;
								prefs.date=copy_of_prefs.date;
								strcpy(prefs.pub,copy_of_prefs.pub);
								strcpy(prefs.hkey,copy_of_prefs.hkey);
								strcpy(prefs.tkey,copy_of_prefs.tkey);
								strcpy(prefs.backdrop,copy_of_prefs.backdrop);
								TR_CloseProject(system_win);
								system_win=0;
								arexx();
							break;
							
							case 42: // OK sys
								TR_CloseProject(system_win);
								system_win=0;
							break;


							case 32: // Get new pub screen
								// Set up publist

								publist=LockPubScreenList();
								UnlockPubScreenList();
								
								systemtags2[15].ti_Data=(ULONG)publist;
									
								if(!system_win2) system_win2=TR_OpenProject(Application,systemtags2);
							break;
							
							case 52: // Pub ok
								strcpy(prefs.pub,tmp_pub);
								TR_SetAttribute(system_win,31,TRAT_Text,(ULONG)prefs.pub);
								TR_CloseProject(system_win2);
								system_win2=0;
								if(1) {
									char space[200];
									sprintf(space,"SCREEN %s",prefs.pub);
									sendcommand(space);
								}
							break;
							case 53: // Pub cancel
								TR_CloseProject(system_win2);
								system_win2=0;
							break;

							case 34: // Get new backdrop
								// What was the old dir?
								strcpy(olddir,"");
								strcpy(stuff,prefs.backdrop);
								for(i=strlen(stuff); i>-1; i--) {
									if(stuff[i]=='/') {
										stuff[i]=NULL;
										strcpy(olddir,stuff);
										stuff[i]='/';
										break;
									}		
								}
								// Did that work?
								if(!(strcmp(olddir,""))) {
									// Ok, lets try :
									for(i=strlen(stuff); i>-1; i--) {
										if(stuff[i]==':') {
											stuff[i+1]=NULL;
											strcpy(olddir,stuff);
											stuff[i]='/';
										}		
									}
								}
								tmp2=callasl(0,GetCatalogStr(catalog,57,"Pick a file for the backdrop"),olddir,"~(#?.info)",0);
								if(tmp2) {
									sprintf(prefs.backdrop,"%s",tmp2);
									thandle=Open(prefs.backdrop,MODE_OLDFILE);
									if(!thandle) {
										DisplayBeep(NULL);
										strcpy(prefs.backdrop,"");
									}
									if(thandle) Close(thandle);	
									TR_SetAttribute(system_win,33,TRAT_Text,(ULONG)prefs.backdrop);
								}
								if(1) {
									char space[200];
									sprintf(space,"PICCY %s",prefs.backdrop);
									sendcommand(space);
								}	
							break;
							
							case 36: // Get new font 
								fontsel();
								TR_SetAttribute(system_win,35,TRAT_Text,(ULONG)prefs.fontname);
								TR_SetAttribute(system_win,37,TRAT_Value,(ULONG)prefs.fontsize);
								if(1) {
									char space[200];
									sprintf(space,"FONT %s %d %d",prefs.fontname,prefs.fontsize,prefs.fontstyle);
									sendcommand(space);
								}
							break;

							
							default:
							break;
						}
					break;
					case TRMS_NEWVALUE:
						switch(msg->trm_ID) {

							case 11: //Just
								prefs.just=msg->trm_Data;
								switch(prefs.just) {
									case 0:
										sendcommand("LEFT");
									break;
									case 1:
										sendcommand("CENTRE");
									break;
									case 2:
									default:
										sendcommand("RIGHT");	
									break;
								}
							break;
							case 12: //AA
								prefs.autoadjust=msg->trm_Data;
								if(prefs.autoadjust) sendcommand("AUTO ON"); else sendcommand("AUTO OFF");
							break;

							case 13: // Screen Depth
								current_mode=msg->trm_Data;
								TR_SetAttribute(text_win,14,TRAT_Value,(ULONG)prefs.time_col[current_mode]);
								TR_SetAttribute(text_win,15,TRAT_Value,(ULONG)prefs.date_col[current_mode]);
							break;
							
							case 14: // Time col
								prefs.time_col[current_mode]=msg->trm_Data;
								if(current_mode==scr->BitMap.Depth) {
									char space[200];
									sprintf(space,"TIMECOL %d",prefs.time_col[current_mode]);
									sendcommand(space);
								}
							break;
							case 15: // Date col
								prefs.date_col[current_mode]=msg->trm_Data;
								if(current_mode==scr->BitMap.Depth) {
									char space[200];
									sprintf(space,"DATECOL %d",prefs.date_col[current_mode]);
									sendcommand(space);
								}
							break;
							case 18: // Event no.
								preset=msg->trm_Data;
								if(alter) setpreset(preset);
							break;
							case 19: // Event enabled 
								prefs.events[preset].used=msg->trm_Data;
							break;
							case 20: // Day
								prefs.events[preset].day=msg->trm_Data;
								if(alter) redotime();
							break;
							case 21: // Month
								prefs.events[preset].month=msg->trm_Data;
								if(alter) redotime();
							break;
							case 22: // Year
								prefs.events[preset].year=msg->trm_Data;
								if(alter) redotime();
							break;
							case 23: // Hour
								prefs.events[preset].hours=msg->trm_Data;
								if(alter) redotime();
							break;
							case 24: // Minute
								prefs.events[preset].minutes=msg->trm_Data;
								if(alter) redotime();
							break;
							case 25: // Freq
								prefs.events[preset].freq=msg->trm_Data;
							break;
							case 26: // Type
								prefs.events[preset].type=msg->trm_Data;
							break;
							case 49: // NP String
								strcpy(tmp,(char *)msg->trm_Data);
							break;
							
							case 51: // PubList strigng
								strcpy(tmp_pub,(char *)msg->trm_Data);
							break;
							
							case 50: // PubList listview
								if(1) {
									int i;
									struct Node *a=publist->lh_Head;
									for(i=0; i<msg->trm_Data; i++)
										a=a->ln_Succ;
									strcpy(tmp_pub,a->ln_Name);
								}
							break;
							
							case 38: // WHotkey string
								strcpy(prefs.hkey,(char *)msg->trm_Data);	
							break;
							
							case 39: // THotkey string
								strcpy(prefs.tkey,(char *)msg->trm_Data);	
							break;
							
							case 40: // Display date
								prefs.date=msg->trm_Data;
								if(prefs.date) sendcommand("DATE ON"); else sendcommand("DATE OFF");
							break;
							
							case 41: // WTF
								prefs.wtf=msg->trm_Data;
							break;
							
							
							default:
							break;
							
						}
					break;
					default:
					break;
				}
				TR_ReplyMsg(msg);
			}
		}
		
		if(lang_win) TR_CloseProject(lang_win);
		if(text_win) TR_CloseProject(text_win);
		if(alarm_win) TR_CloseProject(alarm_win);
		if(alarm_win2) TR_CloseProject(alarm_win2);
		if(system_win) TR_CloseProject(system_win);
		if(system_win2) TR_CloseProject(system_win2);
		
		TR_CloseProject(main_win);
	} else
		printf("Couldn't create app!\n");

	end:

	
	TR_CloseTriton();
	//cleanup("All done!\n");
	cleanup(NULL);

}




long identify(char *fname) {
	struct DataType *dtn;
	struct DataTypeHeader *dth;
	BPTR lock;
	long it_is;

	it_is=0;

	if(lock=Lock(fname, ACCESS_READ)) {
		if (dtn = ObtainDataTypeA(DTST_FILE, (APTR)lock, NULL)) {
			dth = dtn->dtn_Header;
			it_is=dth->dth_GroupID; // GID_PICTURE OR GID_SOUND
			ReleaseDataType(dtn);
		}
		UnLock(lock);
	}
	
	return(it_is);
}


void fontsel(void) {
	struct FontRequester *fr;
	struct TagItem tags[] = {
		ASLFO_TitleText, NULL,
		ASLFO_DoStyle, TRUE,
		ASLFO_MaxHeight, NULL,
		ASLFO_MinHeight, 1,
		TAG_DONE
	};

	tags[0].ti_Data=(ULONG)GetCatalogStr(catalog,54,"Choose Font");
	tags[2].ti_Data=(ULONG)scr->Height;

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

	if(!AslRequest(fr,NULL)) {
		FreeAslRequest(fr);
		return;
	}
	
	// We now have some font information

	strcpy(prefs.fontname,fr->fo_TAttr.tta_Name);
	prefs.fontstyle=fr->fo_TAttr.tta_Style;
	prefs.fontsize=fr->fo_TAttr.tta_YSize;
	
	FreeAslRequest(fr);

}

void cleanup(char *text) {

	if(LangModBase) CloseLibrary(LangModBase);
	if(catalog) CloseCatalog(catalog);
	if(available_lang) dissupported_languages(available_lang);
	
	if(text)
		printf("%s\n",text);

	exit(0);
}

char *callasl(struct Window *win, char *title, char *initialdir, char *pat, BOOL ignore) {
	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
	};

	tags[0].ti_Data=(ULONG)title;
	tags[1].ti_Data=(ULONG)pat;
	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!");
		return(0);
	}

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

	if(!ignore) {
		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);
	} else
		strcpy(buffer,fr->rf_File);

	FreeAslRequest(fr);

	return(&buffer[0]);
}


char str[200];

void redotime(void) {
	char str[200];
	ULONG err;
	struct EngTime etime;
	struct ClockData clock;
	ULONG t;

	clock.hour=prefs.events[preset].hours;
	clock.sec=0;
	clock.min=prefs.events[preset].minutes;
	clock.year=prefs.events[preset].year;
	clock.mday=prefs.events[preset].day;
	clock.month=prefs.events[preset].month;
	clock.wday=0;
	
	t=Date2Amiga(&clock);
	Amiga2Date(t,&clock);
	
	etime.hours=clock.hour;
	etime.seconds=0;
	etime.minutes=clock.min;
	etime.years=clock.year;
	etime.days=clock.mday;
	etime.months=clock.month;
	etime.wday=clock.wday;
	
	// Set up str from langmodbase
	
	if(LangModBase) 
		ECM_GetDateStr((UBYTE *)&str,200,&err,&etime);
	else
		strcpy(str,"Date string unavailable!");
	
	TR_SetAttribute(alarm_win,28,TRAT_Text,(ULONG)str);
	
}

void changewgts(void) {

	/* magic(langtags,0x7643,(ULONG)prefs.planguage.name);
	magic(langtags,0x7648,(ULONG)prefs.accent);

	magic(systemtags,0x7644,(ULONG)prefs.wtf);
	magic(systemtags,0x7645,(ULONG)prefs.date);
	magic(systemtags,0x7649,(ULONG)prefs.pub);
	magic(systemtags,0x7650,(ULONG)prefs.backdrop); */


	/* magic(systemtags,0x7653,(ULONG)prefs.fontname);
	magic(systemtags,0x7654,(ULONG)prefs.fontsize);

	magic(texttags,0x7646,(ULONG)prefs.just);
	magic(texttags,0x7647,(ULONG)prefs.autoadjust); */
	
	if(lang_win) {
		TR_SetAttribute(lang_win,5,TRAT_Text,(ULONG)prefs.planguage.name);
		TR_SetAttribute(lang_win,7,TRAT_Text,(ULONG)prefs.accent);
	}
	
	if(system_win) {
		TR_SetAttribute(system_win,41,TRAT_Value,(ULONG)prefs.wtf);
		TR_SetAttribute(system_win,40,TRAT_Value,(ULONG)prefs.date);
		TR_SetAttribute(system_win,31,TRAT_Text,(ULONG)prefs.pub);
		TR_SetAttribute(system_win,33,TRAT_Text,(ULONG)prefs.backdrop);
		
		TR_SetAttribute(system_win,35,TRAT_Text,(ULONG)prefs.fontname);
		TR_SetAttribute(system_win,37,TRAT_Value,(ULONG)prefs.fontsize);
	}
	
	if(alarm_win) {
		
	}

	current_mode=scr->BitMap.Depth;
	preset=1;
	
	if(text_win) {
		TR_SetAttribute(text_win,11,TRAT_Value,(ULONG)prefs.just);
		TR_SetAttribute(text_win,12,TRAT_Value,(ULONG)prefs.autoadjust);
		TR_SetAttribute(text_win,13,TRAT_Value,(ULONG)current_mode);
		TR_SetAttribute(text_win,14,TRAT_Value,(ULONG)prefs.time_col[current_mode]);
		TR_SetAttribute(text_win,15,TRAT_Value,(ULONG)prefs.date_col[current_mode]);
	}
	

	

	/* magic(texttags,0x7642,current_mode);

	magic(texttags,0x7655,(ULONG)prefs.time_col[current_mode]);
	magic(texttags,0x7656,(ULONG)prefs.date_col[current_mode]); */
	
	setpreset(1);
}

void setpreset(int pre) {

	if(alarm_win) {
		TR_SetAttribute(alarm_win,19,TRAT_Value,(ULONG)prefs.events[pre].used);
		TR_SetAttribute(alarm_win,20,TRAT_Value,(ULONG)prefs.events[pre].day);
		TR_SetAttribute(alarm_win,21,TRAT_Value,(ULONG)prefs.events[pre].month);
		TR_SetAttribute(alarm_win,22,TRAT_Value,(ULONG)prefs.events[pre].year);
		TR_SetAttribute(alarm_win,23,TRAT_Value,(ULONG)prefs.events[pre].hours);
		TR_SetAttribute(alarm_win,24,TRAT_Value,(ULONG)prefs.events[pre].minutes);
		TR_SetAttribute(alarm_win,25,TRAT_Value,(ULONG)prefs.events[pre].freq);
		TR_SetAttribute(alarm_win,26,TRAT_Value,(ULONG)prefs.events[pre].type);

		TR_SetAttribute(alarm_win,27,TRAT_Text,(ULONG)prefs.events[pre].message);

	}
	redotime();
}

short writeprefs(void) {
   int bytes;                         

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

   prefs.vers=VERS; /* Current version of prefs file format */
   strcpy(prefs.header,"ENGPREFS"); /* Header */

   /* 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);
}

short readprefs(void) {
   int bytes=0, i;

   handle2=Open(PREFS_FILE,MODE_OLDFILE);
   if(!handle2) {
      /* Preferences file NOT found, so set default settings... */
      strcpy(prefs.planguage.name,"english");
      for(i=0; i<8; i++) {
         prefs.date_col[i]=1;
         prefs.time_col[i]=1;
      }
      prefs.just=0;
		for(i=0; i<11; i++) {
			prefs.events[i].used=FALSE;
			prefs.events[i].type=0;
			prefs.events[i].hours=1;
			prefs.events[i].minutes=0;
			prefs.events[i].timecode=1;
			strcpy(prefs.events[i].message,"");
			prefs.events[i].day=1;
			prefs.events[i].month=1;
			prefs.events[i].year=1995;
   	}
		prefs.date=FALSE;
		prefs.wtf=FALSE;
		prefs.autoadjust=FALSE;
		strcpy(prefs.backdrop,"");
		strcpy(prefs.pub,"");
		strcpy(prefs.accent,"locale:accents/english.accent");
		strcpy(prefs.hkey,"CONTROL ALT e");
		strcpy(prefs.tkey,"HELP");
      return(0);
   }
   /* If not returned by now, preferences file is open! */

   bytes=FRead(handle2,(char *)&prefs,1,sizeof(prefs));
   if(bytes!=sizeof(prefs)) {
      /* Error reading prefs file */
      DisplayBeep(NULL);
      /* Set the default settings */

		strcpy(prefs.planguage.name,"english");

      for(i=0; i<8; i++) {
         prefs.date_col[i]=1;
         prefs.time_col[i]=1;
      }
      prefs.just=0;
		for(i=0; i<11; i++) {
			prefs.events[i].used=FALSE;
			prefs.events[i].type=0;
			prefs.events[i].hours=1;
			prefs.events[i].minutes=0;
			prefs.events[i].timecode=1;
			strcpy(prefs.events[i].message,"");
			prefs.events[i].day=1;
			prefs.events[i].month=1;
			prefs.events[i].year=1995;
   	}
		prefs.date=FALSE;
		prefs.wtf=FALSE;
		prefs.autoadjust=FALSE;
		strcpy(prefs.backdrop,"");
		strcpy(prefs.pub,"");
		strcpy(prefs.accent,"locale:accents/english.accent");
		strcpy(prefs.hkey,"CONTROL ALT e");
		strcpy(prefs.tkey,"HELP");
	}
   if(strcmp(prefs.header,"ENGPREFS")) {
   	DisplayBeep(NULL);
   	msg("Error: Corrupt preferences header!");
   }
   Close(handle2);
   return(0);
}

void arexx(void) {
	// Previews the changes in the window by setting everything according to
	// prefs structure as it stands at the point of execution
	
	char space[200];

	if(!FindPort("ENG_REXX")) return;

	switch(prefs.just) {
		case 0:
			sendcommand("LEFT");
		break;
		case 1:
			sendcommand("CENTRE");
		break;
		case 2:
		default:
			sendcommand("RIGHT");	
		break;
	}
	
	if(prefs.autoadjust) sendcommand("AUTO ON"); else sendcommand("AUTO OFF");
	if(prefs.date) sendcommand("DATE ON"); else sendcommand("DATE OFF");
	
	sprintf(space,"LANG %s",prefs.planguage.name);
	sendcommand(space);

	sprintf(space,"ACCENT %s",prefs.accent);
	sendcommand(space);
	
	sprintf(space,"PICCY %s",prefs.backdrop);
	sendcommand(space);
	
	sprintf(space,"DATECOL %d",prefs.date_col[current_mode]);
	sendcommand(space);
	
	sprintf(space,"TIMECOL %d",prefs.time_col[current_mode]);
	sendcommand(space);

	sprintf(space,"SCREEN %s",prefs.pub);
	sendcommand(space);
	
	Delay(25);

	sprintf(space,"FONT %s %d %d",prefs.fontname,prefs.fontsize,prefs.fontstyle);
	sendcommand(space);
	
}

struct QuickMsg {
	struct Message base;
	char id[20];
	char msg[500];
};

void sendcommand(char *command) {
	struct MsgPort *mp, *rp;
	struct QuickMsg msg;
	
		
	if(!(mp=FindPort("ENG_REXX"))) 	return;
	if(!(rp=CreateMsgPort()))		return;

	memset(&msg,0,sizeof(struct QuickMsg));
	msg.base.mn_Length=sizeof(struct QuickMsg);
	msg.base.mn_ReplyPort=rp;
	strcpy(msg.id,"THIS IS A QUICKMSG!");
	
	strcpy(msg.msg,command);

	PutMsg((struct MsgPort *)mp,(struct Message *)&msg);
	
	WaitPort(rp);

	DeleteMsgPort(rp);
}


void msg(char *msg) {
	msg_text.IText=msg;
	ok_text.IText="Continue";
	AutoRequest(NULL, &msg_text, NULL, &ok_text, (ULONG)NULL, (ULONG)NULL, 320, 100 );
}

void magic(struct TagItem *a, int magicnumber, ULONG data) {
	int count=0;

	struct TagItem *current;

	current=&a[0];

	while(current->ti_Tag!=NULL) {
		
		if(current->ti_Data==magicnumber) {
			current->ti_Data=data;
			return;
		}
		count++;
		current=&a[count];
	}
	
	printf("sorry magic number: 0x%lx was not found!\n",magicnumber);
}



void localise(void) {


	mx1[0]=GetCatalogStr(catalog,16,"Left");
	mx1[1]=GetCatalogStr(catalog,17,"Centre");
	mx1[2]=GetCatalogStr(catalog,18,"Right");

	cy1[0]=GetCatalogStr(catalog,19,"Auto Adjust Off");
	cy1[1]=GetCatalogStr(catalog,20,"Auto Adjust On");

	cy2[0]=GetCatalogStr(catalog,5,"Event Disabled");
	cy2[1]=GetCatalogStr(catalog,6,"Event Enabled");
	
	cy3[0]=GetCatalogStr(catalog,12,"Requester");
	cy3[1]=GetCatalogStr(catalog,13,"Sound Sample");
	cy3[2]=GetCatalogStr(catalog,14,"AmigaDOS Command");
	cy3[3]=GetCatalogStr(catalog,15,"Speech");
	cy3[4]=GetCatalogStr(catalog,58,"Music Module");

	cy4[0]=GetCatalogStr(catalog,7,"Daily");
	cy4[1]=GetCatalogStr(catalog,8,"Once");
	cy4[2]=GetCatalogStr(catalog,9,"Weekly");
	cy4[3]=GetCatalogStr(catalog,10,"Monthly");
	cy4[4]=GetCatalogStr(catalog,11,"Anually");
	cy4[5]=GetCatalogStr(catalog,70,"Weekdays");
	cy4[6]=GetCatalogStr(catalog,71,"Weekends");
	
	magic(maintags,0x555,(ULONG)GetCatalogStr(catalog,21,"EngClock Prefs © Ben Matthew"));

	magic(maintags,0x556,(ULONG)GetCatalogStr(catalog,22,"Language Settings"));
	magic(maintags,0x557,(ULONG)GetCatalogStr(catalog,23,"Text Settings"));
	magic(maintags,0x558,(ULONG)GetCatalogStr(catalog,24,"Alarm Settings"));
	magic(maintags,0x559,(ULONG)GetCatalogStr(catalog,25,"System Settings"));
	magic(maintags,0x591,(ULONG)GetCatalogStr(catalog,63,"Prefs Sections"));
	
	magic(langtags,0x560,(ULONG)GetCatalogStr(catalog,26,"EngClock Language Preferences"));
	magic(langtags,0x561,(ULONG)GetCatalogStr(catalog,27,"Language Used:"));
	magic(langtags,0x562,(ULONG)GetCatalogStr(catalog,28,"Accent when talking"));

	magic(systemtags2,0x563,(ULONG)GetCatalogStr(catalog,30,"EngClock System Preferences"));
	magic(systemtags2,0x597,(ULONG)GetCatalogStr(catalog,68,"Other"));
	magic(systemtags,0x563,(ULONG)GetCatalogStr(catalog,30,"EngClock System Preferences"));
	magic(systemtags,0x564,(ULONG)GetCatalogStr(catalog,31,"Public Screen"));
	magic(systemtags,0x565,(ULONG)GetCatalogStr(catalog,33,"Backdrop"));
	magic(systemtags,0x566,(ULONG)GetCatalogStr(catalog,55,"Font"));
	magic(systemtags,0x567,(ULONG)GetCatalogStr(catalog,56,"Size: "));
	magic(systemtags,0x568,(ULONG)GetCatalogStr(catalog,34,"Window Hotkey"));
	magic(systemtags,0x569,(ULONG)GetCatalogStr(catalog,35,"Talky Hotkey"));
	magic(systemtags,0x570,(ULONG)GetCatalogStr(catalog,36,"WindowToFront"));
	magic(systemtags,0x571,(ULONG)GetCatalogStr(catalog,37,"Display Date"));
	
	magic(alarmtags2,0x572,(ULONG)GetCatalogStr(catalog,38,"EngClock Alarm Preferences"));
	magic(alarmtags2,0x590,(ULONG)GetCatalogStr(catalog,69,"Enter new parameter"));
		
	magic(alarmtags,0x572,(ULONG)GetCatalogStr(catalog,38,"EngClock Alarm Preferences"));
	magic(alarmtags,0x573,(ULONG)GetCatalogStr(catalog,39,"Event: "));
	magic(alarmtags,0x574,(ULONG)GetCatalogStr(catalog,40,"Day: "));
	magic(alarmtags,0x575,(ULONG)GetCatalogStr(catalog,41,"Month: "));
	magic(alarmtags,0x576,(ULONG)GetCatalogStr(catalog,42,"Year: "));
	magic(alarmtags,0x577,(ULONG)GetCatalogStr(catalog,43,"Hour: "));
	magic(alarmtags,0x578,(ULONG)GetCatalogStr(catalog,44,"Minute: "));
	magic(alarmtags,0x579,(ULONG)GetCatalogStr(catalog,45,"Frequency: "));
	magic(alarmtags,0x580,(ULONG)GetCatalogStr(catalog,46,"Event Type: "));
	magic(alarmtags,0x581,(ULONG)GetCatalogStr(catalog,47,"Parameter: "));
	//magic(alarmtags,0x594,(ULONG)GetCatalogStr(catalog,65,"Event Management"));
	magic(alarmtags,0x595,(ULONG)GetCatalogStr(catalog,66,"Time & Date"));
	magic(alarmtags,0x596,(ULONG)GetCatalogStr(catalog,67,"Event settings"));
	
	magic(texttags,0x582,(ULONG)GetCatalogStr(catalog,48,"EngClock Text Preferences"));
	magic(texttags,0x583,(ULONG)GetCatalogStr(catalog,49,"Justification"));
	magic(texttags,0x584,(ULONG)GetCatalogStr(catalog,50,"Screen Depth"));
	magic(texttags,0x585,(ULONG)GetCatalogStr(catalog,51,"Time Colour"));
	magic(texttags,0x586,(ULONG)GetCatalogStr(catalog,52,"Date Colour"));
	magic(texttags,0x593,(ULONG)GetCatalogStr(catalog,64,"Colour Values"));
	
	magic(systemtags2,0x587,(ULONG)GetCatalogStr(catalog,53,"Public screens currently available:"));

	magic(langtags,0x588,(ULONG)GetCatalogStr(catalog,61,"Ok"));
	magic(systemtags,0x588,(ULONG)GetCatalogStr(catalog,61,"Ok"));
	magic(texttags,0x588,(ULONG)GetCatalogStr(catalog,61,"Ok"));
	magic(systemtags2,0x588,(ULONG)GetCatalogStr(catalog,61,"Ok"));
	magic(alarmtags,0x588,(ULONG)GetCatalogStr(catalog,61,"Ok"));
	magic(alarmtags2,0x588,(ULONG)GetCatalogStr(catalog,61,"Ok"));
	magic(maintags,0x588,(ULONG)GetCatalogStr(catalog,61,"Ok"));
	
	magic(langtags,0x589,(ULONG)GetCatalogStr(catalog,62,"Cancel"));
	magic(systemtags,0x589,(ULONG)GetCatalogStr(catalog,62,"Cancel"));
	magic(texttags,0x589,(ULONG)GetCatalogStr(catalog,62,"Cancel"));
	magic(alarmtags,0x589,(ULONG)GetCatalogStr(catalog,62,"Cancel"));
	magic(maintags,0x589,(ULONG)GetCatalogStr(catalog,62,"Cancel"));
	magic(systemtags2,0x589,(ULONG)GetCatalogStr(catalog,62,"Cancel"));
	magic(alarmtags2,0x589,(ULONG)GetCatalogStr(catalog,62,"Cancel"));


}