	INTEGER*4 FUNCTION TIMEKEY( string,bin_val )
C
	IMPLICIT INTEGER*4 (A-Z)
	CHARACTER*(*) string
	INTEGER*4 bin_val(2)
C
C+/TIMEKEY
C
C Functional Description:
C	Check for absolute time specified by a keyword.  The recognized
C	keywords and their meanings are:
C
C		YESTERDAY	00:00 AM of the previous day
C		TODAY		00:00 AM of the current day
C		TOMORROW	midnight of the current day (00:00 AM tomorrow)
C		THISMONTH	first day of the current month (00:00 AM)
C		NEXTMONTH	first day of the next month (00:00 AM)
C		LASTMONTH	first day of the previous month (00:00 AM)
C		THISYEAR	January 1st of the current year (00:00 AM)
C		THISWEEK	0000 AM on the last Monday (start of this week)
C		NEXTWEEK	0000 AM on the next Monday (next week start)
C		LASTWEEK	0000 AM on the last Monday of a full week
C
C Input Parameters:
C	string - character string compared against the literal keywords.
C		 Abbreviations are not check for.
C
C Implicit Inputs:
C	NONE
C
C Output Parameters:
C	TIMEKEY - returns 1 if keyword match found, else 0.
C	bin_val - quadword in which the absolute time is returned.
C
C Implicit Outputs:
C	NONE
C
C Condition Codes Signalled:
C	NONE
C
C Side Effects:
C	NONE
C
C-
	CHARACTER*24 work
	INTEGER*2 work_s
	INTEGER*2 tincr(2)
	INTEGER*4 days
	INTEGER*4 secs_per_day, ticks_per_sec
	PARAMETER (secs_per_day = 24*60*60, ticks_per_sec = 10*1000*1000)
C
	TIMEKEY = 1
	IF (string .EQ. 'YESTERDAY') THEN
C
C YESTERDAY seen, return absolute time of 00:00 AM yesterday.
C
	    CALL SYS$ASCTIM(work_s, work,, )
	    work(13:23) = '00:00:00.00'		!To get 00 AM today
	    CALL SYS$BINTIM(work(1:work_s), bin_val)
	    CALL MTH_QUAD_EMUL(secs_per_day, ticks_per_sec, tincr)
	    CALL MTH_QUAD_SUB(bin_val, tincr, bin_val)	!Minus 1 day
	    ELSE IF (string .EQ. 'TODAY') THEN
C
C TODAY seen, return absolute time of 00:00 AM on this day
C
	    CALL SYS$ASCTIM(work_s, work,, )
	    work(13:23) = '00:00:00.00'		!To get 00 AM today
	    CALL SYS$BINTIM(work(1:work_s), bin_val)
	    ELSE IF (string .EQ. 'TOMORROW') THEN
C
C TOMORROW seen, return absolute time of 00:00 AM tomorrow morning.
C
	    CALL SYS$ASCTIM(work_s, work,, )
	    work(13:23) = '00:00:00.00'		!To get 00 AM today
	    CALL SYS$BINTIM(work(1:work_s), bin_val)
	    CALL MTH_QUAD_EMUL(secs_per_day, ticks_per_sec, tincr)
	    CALL MTH_QUAD_ADD(bin_val, tincr, bin_val)	!Minus 1 day
	    ELSE IF (string .EQ. 'THISMONTH') THEN
C
C THISMONTH seen, return absolute time of 00:00 AM on the 1st of the month.
C
	    CALL SYS$ASCTIM(work_s, work,, )
	    work(13:23) = '00:00:00.00'		!To get 00 AM today
	    work(1:2) = ' 1'			!First day of month
	    CALL SYS$BINTIM(work(1:work_s), bin_val)
	    ELSE IF (string .EQ. 'THISYEAR') THEN
C
C THISYEAR seen, return absolute time of 00:00 AM on the 1st of January.
C
	    CALL SYS$ASCTIM(work_s, work,, )
	    work(13:23) = '00:00:00.00'		!To get 00 AM today
	    work(1:6) = ' 1-JAN'		!First day of year
	    CALL SYS$BINTIM(work(1:work_s), bin_val)
	    ELSE IF (string .EQ. 'NEXTMONTH') THEN
C
C NEXTMONTH seen, return absolute time of 00:00 AM on the 1st of next month.
C
	    CALL SYS$GETTIM(bin_val)
	    CALL MTH_QUAD_EMUL(32*secs_per_day, ticks_per_sec, tincr)
	    CALL MTH_QUAD_ADD(bin_val, tincr, bin_val)
	    CALL SYS$ASCTIM(work_s, work, bin_val, )
	    work(13:23) = '00:00:00.00'		!To get 00 AM of +32 days
	    work(1:2) = ' 1'			!First day of next month
	    CALL SYS$BINTIM(work(1:work_s), bin_val)
	    ELSE IF (string .EQ. 'LASTMONTH') THEN
C
C LASTMONTH seen, return absolute time of 00:00 AM on the 1st of last month.
C
	    CALL SYS$GETTIM(bin_val)
	    CALL MTH_QUAD_EMUL(32*secs_per_day, ticks_per_sec, tincr)
	    CALL MTH_QUAD_SUB(bin_val, tincr, bin_val)
	    CALL SYS$ASCTIM(work_s, work, bin_val, )
	    work(13:23) = '00:00:00.00'		!To get 00 AM of -32 days
	    work(1:2) = ' 1'			!First day of past month
	    CALL SYS$BINTIM(work(1:work_s), bin_val)
	    ELSE IF (string .EQ. 'THISWEEK') THEN
C
C THISWEEK seen, return absolute time of 00:00 AM on the latest Monday
C
	    CALL SYS$GETTIM(bin_val)
	    CALL LIB$DAY(days, bin_val)
	    days = MOD( MOD(days, 7) + 2, 7)
	    CALL MTH_QUAD_EMUL(days*secs_per_day, ticks_per_sec, tincr)
	    CALL MTH_QUAD_SUB(bin_val, tincr, bin_val)
	    CALL SYS$ASCTIM(work_s, work, bin_val, )
	    work(13:23) = '00:00:00.00'		!To get 00 AM on Monday
	    CALL SYS$BINTIM(work(1:work_s), bin_val)
	    ELSE IF (string .EQ. 'NEXTWEEK') THEN
C
C NEXTWEEK seen, return absolute time of 00:00 AM on the next Monday
C
	    CALL SYS$GETTIM(bin_val)
	    CALL LIB$DAY(days, bin_val)
	    days = 7 - MOD( MOD(days, 7) + 2, 7)
	    CALL MTH_QUAD_EMUL(days*secs_per_day, ticks_per_sec, tincr)
	    CALL MTH_QUAD_ADD(bin_val, tincr, bin_val)
	    CALL SYS$ASCTIM(work_s, work, bin_val, )
	    work(13:23) = '00:00:00.00'		!To get 00 AM on Monday
	    CALL SYS$BINTIM(work(1:work_s), bin_val)
	    ELSE IF (string .EQ. 'LASTWEEK') THEN
C
C LASTWEEK seen, return absolute time of 00:00 AM on the past Monday
C
	    CALL SYS$GETTIM(bin_val)
	    CALL LIB$DAY(days, bin_val)
	    days = 7 + MOD( MOD(days, 7) + 2, 7)
	    CALL MTH_QUAD_EMUL(days*secs_per_day, ticks_per_sec, tincr)
	    CALL MTH_QUAD_SUB(bin_val, tincr, bin_val)
	    CALL SYS$ASCTIM(work_s, work, bin_val, )
	    work(13:23) = '00:00:00.00'		!To get 00 AM on Monday
	    CALL SYS$BINTIM(work(1:work_s), bin_val)
	    ELSE
C
C Not a keyword!
C
	    TIMEKEY = 0
	    ENDIF
C
	RETURN
	END
