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

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


extern text(struct Window *, char *, int, int); 
void getdate(char *, char *, char *, char *);
int GetDateStr(char *, char *, int *, int *, int *, int *);
int GetDateStr2(char *, char *, int, int, int, int *);
void dayx(int, char *);
int FindDay(int, int, int, int *);
void PrintTime(struct Window *);
void GetDate(char *);


char *days[]={"Sunday",
	      "Monday",
	      "Tuesday",
	      "Wednesday",
	      "Thursday",
	      "Friday",
	      "Saturday"};
	      
char *monthstring[]={"January",
	       "Febuary",
	       "March",
	       "April",
	       "May",
	       "June",
	       "July",
	       "August",
	       "September",
	       "October",
	       "November",
	       "Decmber"};
	       	
extern int WindowSize;

int GetDateStr2(char *Date ,char *DateStr, int d, int m, int y, int *daynum)
{
        char day[8];
	int z,leap, dd, mm, yy;

        *daynum = 4;
        dd=d; mm=m; yy=y; 
	z = FindDay(d,m,y, &leap);
	
	*daynum = z;
	dayx(dd,day);
	
	sprintf(DateStr,"%s %d%s %s %d                                ", days[z], dd,day, monthstring[mm-1], yy);
	DateStr[48]='\0';
	sprintf(Date,"%d-%d-%d",mm,dd,yy);
	
	return leap;
}

void dayx(int dd, char *day)
{
	 if(dd==1 || dd==21 || dd==31 ) sprintf(day,"st");
	else if(dd==2 || dd==22) sprintf(day,"nd");
        else if(dd==3 || dd==23) sprintf(day,"rd");
	else  sprintf(day,"th");
}

int GetDateStr(char *date, char *datestr, int *dd, int *mm, int *yy, int *daynum)
{	
	char day[8],mon[4],yr[8];
	int ddd,d,mmm,m,yyy,y,z,leap;
	
	getdate(date,day,mon,yr);  
	
	d = ddd =  atoi(day);
	m = mmm =  atoi(mon);	
	y = yyy =  atoi(yr);
	
	*dd=d;
	*mm=m;
	*yy=y+1900;
	
	z = FindDay(d,m,y, &leap);
	z=z+1;
	if(z == 7) z=0;   /* z = day of week, where 0=Sunday 6=saturday */
	
	*daynum = z;
	dayx(ddd,day);
	sprintf(datestr,"%s %d%s %s %d", days[z],ddd, day, monthstring[mmm-1], *yy);
	
	return leap;
}

int FindDay(int d, int m, int y, int *leap)
{
	int z;
	char year[10];
	
	if( y % 4 == 0 && y % 100 != 0)
	{
		*leap=1;
	}
	else
	{
		*leap=0;
	}
	sprintf(year,"%d",y);
	if(year[2]=='0' && year[3]=='0') *leap=1;
	
	if( m==1 || m==2)
	{ 
	  	m=m+12;
		if( *leap == 1 )
		{
			d=d-2;
		}
		else
		{
			d=d-1;
		}
	}
	z = (1+d+(m*2)+(3*(m+1)/5)+y+y/4-y/100+y/400) % 7 ;

	return z;
}
	
void getdate(char *date, char *d, char *m, char *y)
{
	*m++=*date++;
	*m++=*date++;
	*m='\0';
	
	*date++;
	*d++=*date++;
	*d++=*date++;
	*d='\0';
	
	*date++;
	*y++=*date++;
	*y++=*date++;
	*y++=*date++;
	*y='\0';
}

void PrintTime(struct Window *Win)
{
        char d[8],time[13];

	getclk(d);
	stptime(time,2,&d[4]);
	
	/*time[5]='\0';           remove seconds */
	
        if(WindowSize) text(Win,time,16,114);
	else text(Win,time,365,7);
}

void GetDate(char *date)
{
	
        char d[8];

	getclk(d);
	stpdate(date,3,&d[1]);
}



