/*****************************************************************************/

#include <iocslib.h>
#include "defines.h"
#include "skey.h"

/*****************************************************************************/

int DaySel(year,month,day,ys,ye,xy,mode,getchs)
/* 日選択 */
int *year,*month,*day,ys,ye,mode,(*getchs)();
unchar xy[31*2];
/* mode BIT0 : 0=休日ok , 1=休日not */
/*      BIT1 : reserve */
{
int ret,de,d,i,c,yr,mn,dy;
int cur,cnt,gx,gy,fhol;
int fystop;
	cur=curmode(0);
	de=month_end(*year,*month); /* この月の最終日を得る */
	d=*day-1; /* 1〜 -> 0〜 */
	fystop=(ys>=1 && ys<=12)||(ye>=1 && ye<=12);
	do {
		gx=xy[d*2];
		fhol=gy=xy[d*2+1];
		gy&=~(BIT7|BIT6);
		fhol&=BIT7|BIT6; /* 休日フラグ */
		B_LOCATE(gx,gy);
		CurBlink(gx,gy,8*2,16,B_KEYSNS); /* 日の２桁のみブリンク */
		ret=0;
		c=getchs(0);
		if ((c&0xff)==CR) {
			if ((mode&BIT0) && fhol) {
				beep();
				while (B_KEYSNS()) getchs(0); /* キーボードバッファークリア */
				continue;
			}
			break; /* [RET]/[ENT] */
		}
		cnt=1;
		yr=*year; /* 変化前の年月日を記録 */
		mn=*month;
		dy=d;
		switch (c) {
		    case SKesc: /* 中止 */
			ret=-1;
			continue;
		
		    case SKrdown: /* -1月 */
			if (--(*month)<=0) {
			    *month=12;
		    case SKrdown|SKopt1: /* -1年:ちょっと危険なcaseである */
			    (*year)--;
			}
			break;
		
		    case SKrup: /* +1月 */
			if (++(*month)>12) {
			    *month=1;
		    case SKrup|SKopt1: /* +1年:ちょっと危険なcaseである */
			    (*year)++;
			}
			break;
		
		    case SKdown: /* +1週 */
			cnt=7;
		    case SKright: /* +1日 */
			for (i=0;i<cnt;i++) {
			    if (++d>=de) {
				if (++(*month)>12) {
				    *month=1;
				    (*year)++;
				}
				d=0;
			    }
			}
			break;
		
		    case SKup: /* -1週 */
			cnt=7;
		    case SKleft: /* -1日 */
			for (i=0;i<cnt;i++) {
			    if (--d<0) {
				if (--(*month)<=0) {
				    *month=12;
				    (*year)--;
				}
				/* 次の月の最終日になる */
				d=month_end(*year,*month)-1;
			    }
			}
			break;
		}
		/* 最終日を越えるときは最終日に設定する */
		de=month_end(*year,*month);
		if (d>=de) d=de-1;
		/* 年変更判定＆年範囲判定 */
		if (*year!=yr) {
		    if (fystop||(ys>12 && *year<ys)||(ye>12 && *year>ye)) goto NONSET;
		    else ret=2;
		    continue;
		}
		/* 月変更判定＆月範囲判定 */
		/* 月範囲があるときは年移動はできない */
		if (*month!=mn) {
		    if ((ys>=1 && ys<=12 && *month<ys)||(ye>=1 && ye<=12 && *month>ye)) {
		      NONSET:;
			beep();
			while (B_KEYSNS()) getchs(0); /* キーボードバッファークリア */
			*year=yr;
			*month=mn;
			d=dy;
		    } else ret=1;
		}
	} while (!ret);
	*day=d+1;
	curmode(cur);
	/* -1=ESC , 0=RET , 1=month change , 2=year change */
	return(ret);
}

/*****************************************************************************/
