!                ********************************
!                *  PROGRAM TO GET DAY OF WEEK  *
!                *         FOR ANY DATE         *
!                *      AND (OPTIONALLY) A      *
!                *    CALENDAR FOR THE YEAR     *
!                *                              *
!                *   BASED UPON BHAIRAV JOSHI   *
!                *    ALGORITHM PUBLISHED IN    *
!                *    1/14/80 COMPUTER WORLD    *
!                *                              *
!                *   THIS IS THE RESULT OF A    *
!                *   STUDY OF THE PRINCIPLES    *
!                *  OF THE GREGORIAN CALENDAR   *
!                *                              *
!                *   DATA PRODUCED SHOULD BE    *
!                *  ACCURATE OVER THE INTERVAL  *
!                *   YEAR ZERO A.D. TO ABOUT    *
!                *          3000 A.D.           *
!                *                              *
!                *  PROGRAMMED BY  E. WILLIAMS  *
!                *      FEBRUARY  17, 1980      *
!                ********************************
!
!  Tidy up displays
!  Allow lower case input
!  Give the option to print immediately, or just make a file
!  11/04/87 Steve Elliott
!
!
MAP1 DAPRMO(12),F
  DAPRMO(1)  = 31 : DAPRMO(2)  = 28 : DAPRMO(3)  = 31 : DAPRMO(4)  = 30
  DAPRMO(5)  = 31 : DAPRMO(6)  = 30 : DAPRMO(7)  = 31 : DAPRMO(8)  = 31
  DAPRMO(9)  = 30 : DAPRMO(10) = 31 : DAPRMO(11) = 30 : DAPRMO(12) = 31
MAP1 DAOFWK(7),S,9
  DAOFWK(1) = "Saturday" : DAOFWK(2) = "Sunday"    : DAOFWK(3) = "Monday"
  DAOFWK(4) = "Tuesday"  : DAOFWK(5) = "Wednesday" : DAOFWK(6) = "Thursday"
  DAOFWK(7) = "Friday"
MAP1 TITLE(4),S,74
  TITLE(1) = "        January                      February                      March"
  TITLE(2) = "         April                         May                          June"
  TITLE(3) = "          July                        August                     September"
  TITLE(4) = "        October                      November                     December"
MAP1 HDR,S,22,"   S  M  T  W  T  F  S"
MAP1 MONTH(3,42),S,2
MAP1 PLINE,S,80," "
MAP1 DECIS,S,3
  !
BEGIN:
  PRINT TAB(-1,0)
  PRINT " This program will give the day of the week for any date" : PRINT
  PRINT  "  and print out a calendar for the entire year if you like" : PRINT
  PRINT " What date would you like to select? (year 0 will end the program)" : PRINT
  !
INPYR:
  YEAR = 0 : MONTH = 0 : DAY = 0
  INPUT " Enter the year as a number (ex. 1980)      ",YEAR
  IF YEAR = 0 THEN GOTO QUIT
  IF (YEAR < 0) THEN PRINT "ILLEGAL YEAR" : GOTO INPYR ELSE PRINT
  IF (YEAR/4    - INT(YEAR/4))    = 0 THEN LPYR = 1 ELSE LPYR = 0
  IF (YEAR/100  - INT(YEAR/100))  = 0 THEN LPYR = LPYR - 1
  IF (YEAR/400  - INT(YEAR/400))  = 0 THEN LPYR = LPYR + 1
  IF (YEAR/4000 - INT(YEAR/4000)) = 0 THEN LPYR = LPYR - 1
  IF (LPYR = 1) THEN DAPRMO(2) = 29 ELSE DAPRMO(2) = 28
  !
INPMTH:
  INPUT " Enter the month as a number (1 to 12)      ",MONTH
  IF (MONTH<1 OR MONTH>12) THEN PRINT "ILLEGAL MONTH" : GOTO INPMTH ELSE PRINT
  !
INPDAY:
  INPUT " Enter the day of the month as a number     ",DAY
  IF (DAY<1 OR DAY>DAPRMO(MONTH)) THEN PRINT "ILLEGAL DAY" : GOTO INPDAY ELSE PRINT
  CALL CALC
  PRINT " The date ";MONTH;"/";DAY;"/";YEAR;
  PRINT "will fall on a ";DAOFWK(TOTDYS) : PRINT : PRINT : PRINT
  INPUT "Would you like a calendar for the whole year?  ",DECIS
  DECIS = UCS(DECIS[1,1])
  IF DECIS <> "Y" THEN GOTO BEGIN
  ? "One moment while I generate the calendar";
  OPEN #1,"DAYCAL.PRT",OUTPUT
  POSITION = 0 : MONTH = 1 : DAY = 1 : CALL CALC
  FOR I = 1 TO 7 : PRINT #1 : NEXT
  ? ".";
  PRINT #1, SPACE(30);"CALENDAR  FOR YEAR ";YEAR : PRINT #1 : PRINT #1
  FOR I = 1 TO 4
  ?".";
  PRINT #1, TITLE(I): FRSTMO = 3*(I-1) + 1 : CALL PRINT
  NEXT I
  CLOSE #1
  ?
  INPUT LINE "Would you like to print it out now? ", DECIS
  DECIS = UCS(DECIS[1,1])
  IF DECIS <> "Y" &
      THEN &
          ? "The file is called DAYCAL.PRT and is ready for your inspection" :&
          CALL PAUSE &
      ELSE &
          XCALL SPOOL,"DAYCAL.PRT"
  GO TO BEGIN
  !
CALC:
  X = YEAR - 1
  TOTDYS=YEAR+DAY+INT(X/4)-INT(X/100)+INT(X/400)-INT(X/4000)+INT(X/1000)-INT(X/2000)
  IF (MONTH <> 1) THEN FOR I=1 TO MONTH-1 : TOTDYS=TOTDYS+DAPRMO(I) : NEXT I
  TOTDYS = 1 + INT(10*(7*((TOTDYS-1)/7 - INT((TOTDYS-1)/7))) + .5)/10
  RETURN
  !
PRINT:
  PRINT #1
  PRINT #1, HDR+"       "+HDR+"       "+HDR
  IF (POSITION = 0) THEN IF (TOTDYS = 1) THEN POSITION=7 ELSE POSITION=TOTDYS-1
  FOR J = FRSTMO TO FRSTMO+2
          FOR K = 1 TO POSITION-1
          MONTH(J+1-FRSTMO,K) = "  "
          NEXT K
          FOR K = 1 TO DAPRMO(J)
          MONTH(J+1-FRSTMO,POSITION+K-1) = STR(K)
          NEXT K
          Y = POSITION + K - 1
          POSITION = (POSITION+K-1) - 7*INT((POSITION+K-1.1)/7)
          FOR K = Y TO 42
          MONTH(J+1-FRSTMO,K) = "  "
          NEXT K
  NEXT J
  N = 0
  FOR J = 1 TO 6
  PRINT #1,"  ";
          FOR K = 1 TO 3
                  FOR L = 1 TO 7
                  IF (VAL(MONTH(K,L+N)>0)) THEN PLINE[3*L+29*K-31;2] = MONTH(K,L+N) USING "##"
                  NEXT L
          NEXT K
  PRINT #1, PLINE
  PLINE = " "
  N = N + 7
  NEXT J
  PRINT #1 : PRINT #1
  RETURN
  END
  !

QUIT:
  ? TAB(23,1);
  END

PAUSE:
  ? TAB(23,1); TAB(-1,10);
  INPUT LINE "Hit RETURN to continue --> ", DECIS
  ? tab(23,1); tab(-1,10);
  RETURN