/************************************************************************/
/* QCal V1.0. Written by Malcolm McDonald.  29/06/90.                   */
/*                                                                      */
/************************************************************************/


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

#define MAX_ENTRY_NUMBER 1000
     
typedef struct 
{
	char Date[8+1];
	char Line1[50+1];
	char Line2[50+1];
}CALENDAR;


void SetupFile(void);
void CloseFile(void);
void Purge(void);
void NextEntry(void);
void PrevEntry(void);
void PrintEntry(void);
void AddEntry(void);
int FindReplaceE(void);
void Sort(void);
void DelEntry(void);
void shift(void);
int Insert(CALENDAR *);
void Get_Which(char *);
void FindEntry(void);
void ChangeDate(void);
void ReadFile(void);
void write_file(void);
void NewFile(void);
void info(void);


CALENDAR *calendar[MAX_ENTRY_NUMBER+1];
extern char DateIndex[];
extern struct Window *WindowOne;
extern int day,month,year;
extern int tday,tmonth,tyear;
extern int next_prev, find_entry;
extern unsigned char StringBuffer[];
extern unsigned char StringBuffer2[];
int EntryCount=0,current=0,save_file=0;



void SetupFile()
{
	ReadFile();
}

void CloseFile()
{
	if(save_file)
	{
		if(EntryCount != 0)
		{
			write_file();
		}
		else
		{
			NewFile();
		}
	}
	save_file=0;
}

void Purge()
{
	char dstr[15];
	register int i=1,m,y,cmp;
	int savecurrent;
	long dd;
	
	savecurrent=current;
	m=tmonth-1;
	y=tyear;
	if(m < 1)
	{
		m=12;
		y=y-1;
	}
	dd=(y*10000)+(m*100)+tday;
	sprintf(dstr,"%d",dd);
	
	while((cmp=strcmp(dstr,calendar[i]->Date)) >= 1 && i <= EntryCount-1)
	{
		if(cmp >= 1)
		{
			current=i;
			free(calendar[i]);
			shift();
			i--;
		}
		i++;
	}
	current=savecurrent;
}

void NextEntry()
{
	int i=1,cmp;
	
	if(next_prev)
	{
		current++;
		if(current > EntryCount)
		{
			current=EntryCount;
		}
		else
		{
			ChangeDate();
		}
		find_entry=0;
	}
	else
	{
		if(EntryCount != 0)
		{
	 		while((cmp=strcmp(calendar[i]->Date,DateIndex)) < 0 && i < EntryCount ) 
			{
				i++;
			}
			if(cmp >= 0)
			{
				current=i;
				ChangeDate();
				PrintEntry();
				next_prev=1;
				find_entry=0;
			}
		}	
	}
}

void PrevEntry()
{
	int i,cmp;
	
	if(next_prev)
	{
		current--;
	
		if(EntryCount == 0)
		{
			current=0;
		}
		else
		{
			if(current < 1) current=1;
			ChangeDate();
		}
	}
	else
	{
		i=EntryCount;
		if(EntryCount != 0)
		{
	 		while((cmp=strcmp(calendar[i]->Date,DateIndex)) > 0 && i >= 1 ) 
			{
				i--;
			}
			if(cmp <= 0 && i >= 1)
			{
				current=i;
				ChangeDate();
				PrintEntry();
				next_prev=1;
				find_entry=0;
			}
		}	
	}
}

void PrintEntry()
{
	if(EntryCount ==0)
	{
		strcpy(StringBuffer,"");
		strcpy(StringBuffer2,"");
	}
	else
	{
		strcpy(StringBuffer,calendar[current]->Line1);
		strcpy(StringBuffer2,calendar[current]->Line2);
	}
}

void AddEntry()
{
	CALENDAR add_entry;
	int found;
	long t,x;

	if((found = FindReplaceE() ) != 0 )
	{
		if( EntryCount+1 <= MAX_ENTRY_NUMBER )
		{
			strcpy(add_entry.Date, DateIndex);
	                strcpy(add_entry.Line1,StringBuffer);
			strcpy(add_entry.Line2,StringBuffer2);
			if((Insert(&add_entry)) ==0)
			{
				Sort();
				save_file=1;
			}
		}
		else
		{
			text(WindowOne," MAXIMUM NUMBER OF ENTRY'S REACHED       ",18,126);	
			t=time(&x)+2;
			while(t > time(&x));
		}
	}
	else
	{
		strcpy(calendar[current]->Date, DateIndex);
		strcpy(calendar[current]->Line1,StringBuffer);
		strcpy(calendar[current]->Line2,StringBuffer2);
		save_file=1;
	}
}

int FindReplaceE()
{
	int cmp=1,i=0;
	
	if(EntryCount != 0)
	{
	 	while((cmp=strcmp(calendar[i]->Date,DateIndex)) != 0 && i <= EntryCount ) 
		{
			i++;
		}
		if(cmp == 0)
		{
			current=i;
		}
	}
	return cmp;
}

void Sort()
{
	CALENDAR *temp;
	register int i=1,true=1,cmp;
	
	i=EntryCount;
	while(true)
	{
		true=0;
		while(i >= 2 )
		{
			cmp=strcmp(calendar[i-1]->Date,calendar[i]->Date);
			if( cmp > 0 )
			{
				temp=calendar[i];
				calendar[i]=calendar[i-1];
				calendar[i-1]=temp;
				true=1;
			}
			i--;
		}
		i=EntryCount;
	}
}

void DelEntry()
{
	if(current != 0)
	{
		free(calendar[current]);
		shift();
	}
	save_file=1;
}
void shift()
{
	int i;
	
	for(i=current; i <= EntryCount; i++)
	{
		calendar[i]=calendar[i+1];
	} 
	EntryCount--;
	current=0;
	PrintEntry();
}

int Insert(CALENDAR *in_entry)
{
	CALENDAR *new_entry;
	int rc;
	long t,x;

	if((new_entry=(CALENDAR *) malloc(sizeof(CALENDAR))) != NULL)
	{
        	strcpy(new_entry->Date,in_entry->Date);
		strcpy(new_entry->Line1,in_entry->Line1);
		strcpy(new_entry->Line2,in_entry->Line2);
 		EntryCount++;
 		calendar[EntryCount]=new_entry;
		current=EntryCount;
		rc=0;
	}
	else
	{
		text(WindowOne," OUT OF MEMORY                           ",18,126);	
		t=time(&x)+2;
		while(t > time(&x));
		rc=1;
	}
	return rc;
}

void Get_Which(char *W_Day)
{
	char FirstD[15],LastD[15],d[10],temp[15];
	register i,dd,cmp;
	
	sprintf(FirstD,"%d",(year*10000)+(month*100));
	sprintf(LastD,"%d",(year*10000)+((month+1)*100));
	for(i=0; i<=32; i++) W_Day[i]='0';
	i=1;
	while((cmp=strcmp(calendar[i]->Date,FirstD)) < 0 && i <= EntryCount ) 
	{
		i++;
	}
	while( i <= EntryCount && (cmp=strcmp(calendar[i]->Date,LastD)) <0 )
	{
		strcpy(temp,calendar[i]->Date);
		d[0]=temp[6];
		d[1]=temp[7];
		d[2]='\0';
		dd=atoi(d);
		W_Day[dd]='1';
		i++;
	}
}
  
void FindEntry()
{
	int cmp,i=0;
	
	if(EntryCount != 0)
	{
	 	while((cmp=strcmp(calendar[i]->Date,DateIndex)) != 0 && i <= EntryCount ) 
		{
			i++;
		}
	
		if(cmp == 0)
		{
			current=i;
			PrintEntry();
			next_prev=1;
		}
		else
		{
			strcpy(StringBuffer,"");
			strcpy(StringBuffer2,"");
			current=0;
			next_prev=0;
		}
	}
}

void ChangeDate()
{
	char date[15],d[4],m[4],y[6];
	
	strcpy(date,calendar[current]->Date);
	y[0]=date[0];
	y[1]=date[1];
	y[2]=date[2];
	y[3]=date[3];
	y[4]='\0';
	m[0]=date[4];
	m[1]=date[5];
	m[2]='\0';
	d[0]=date[6];
	d[1]=date[7];
	d[2]='\0';
	year=atoi(y);
	month=atoi(m);
	day=atoi(d);
}

void ReadFile()
{
	FILE *file_in;
	CALENDAR LoadEntry;

	file_in = fopen("QCal.dat", "rb");
	if(file_in != NULL)
	{
		while(fread(&LoadEntry, sizeof(CALENDAR), 1, file_in) == 1)
		{
			while((Insert(&LoadEntry)) != 0);
		}
		fclose(file_in);
	}
}

void write_file()
{
	FILE *file_out;
	int i=0;

	file_out = fopen("QCal.dat", "wb");
	if(file_out != NULL)
	{
		do
		{
			i++;
			fwrite(calendar[i], sizeof(CALENDAR),1,file_out);
			
		}while(i != EntryCount);
		fclose(file_out);
	}
}

void NewFile()
{
	FILE	*file_out;
	
	file_out = fopen("QCal.dat", "wb");
	if(file_out != NULL)
	{
		fclose(file_out);
	}
}

void info()
{
	text(WindowOne,"                    QCal V1.0                      ",18,126);
	text(WindowOne,"           Written by Malcolm McDonald.            ",18,136);
	text(WindowOne,"                                                   ",18,146);
}

