'===========================================================================
' Subject: A PERPETUAL CALENDAR               Date: 05/15/94 (00:00)       
'  Author: The ABC Programmer                 Code: QB, QBasic, PDS        
'  Origin: PERPETUAL,CALENDAR               Packet: DATETIME.ABC
'===========================================================================
DECLARE FUNCTION MonthDays% (monthNum%, year%)
DECLARE SUB ClearBuffer ()
DECLARE SUB ShowSchedule ()
DECLARE SUB CenterMessage (Info$, LineNum%, Colour%)
DECLARE SUB ShowMonth (Month%, day%, year%)
DECLARE FUNCTION DayNum% (Month%, day%, year%)
DECLARE FUNCTION DateNum& (Month%, day%, year%)
DECLARE FUNCTION LeapYear% (year%)
DECLARE FUNCTION MonthName$ (monthNum%)
DECLARE FUNCTION MonthDay% (Month%, year%)

CONST MAXYEAR% = 2100
CONST MINYEAR% = 1950
CONST FALSE% = 0
CONST TRUE% = NOT FALSE%

curMonth% = VAL(LEFT$(DATE$, 2))
curDay% = VAL(MID$(DATE$, 4, 2))
curYear% = VAL(RIGHT$(DATE$, 4))
CLS
ShowMonth curMonth%, curDay%, curYear%
CALL ShowSchedule
GOSUB ShowNotes

SelectMonth:

V$ = INKEY$
  IF V$ = CHR$(0) + "H" THEN GOSUB PreviousWeek
  IF V$ = CHR$(0) + "P" THEN GOSUB NextWeek
  IF V$ = CHR$(0) + "K" THEN GOSUB PreviousDay
  IF V$ = CHR$(0) + "M" THEN GOSUB NextDay
  IF V$ = CHR$(0) + "Q" THEN GOSUB NextMonth
  IF V$ = CHR$(0) + "I" THEN GOSUB PreviousMonth
  IF V$ = CHR$(13) THEN GOTO CallCalendar
  IF V$ = CHR$(27) THEN GOTO QuitProgram


done% = FALSE%
makeCall% = FALSE%

GOTO SelectMonth

CallCalendar:
    ComLine$ = STR$(curMonth%) + "/"
    ComLine$ = ComLine$ + STR$(curDay%) + "/"
    ComLine$ = ComLine$ + STR$(curYear%)

    OPEN "SCHEDULE.DAT" FOR INPUT AS #1
      DO
        LINE INPUT #1, DAT$
        IF INSTR(DAT$, ComLine$) > 0 THEN
          GOSUB DisplaySchedule: EXIT DO
        ELSE
          GOSUB InputSchedule: EXIT DO
        END IF
      LOOP UNTIL EOF(1)
    CLOSE #1

    ShowMonth curMonth%, curDay%, curYear%

GOTO SelectMonth

PreviousDay:
  IF curDay% > 1 THEN
    curDay% = curDay% - 1
  ELSEIF curMonth% > 1 THEN
    curMonth% = curMonth% - 1
    curDay% = MonthDays%(curMonth%, curYear%)
    VIEW PRINT 1 TO 11
    CLS
    GOSUB ShowNotes
  ELSE
    curYear% = curYear% - 1
    curMonth% = 12
    curDay% = 31
  END IF
  ShowMonth curMonth%, curDay%, curYear%
RETURN

NextDay:
  IF curDay% < MonthDays%(curMonth%, curYear%) THEN
    curDay% = curDay% + 1
  ELSEIF curMonth% <> 12 THEN
    curDay% = 1
    curMonth% = curMonth% + 1
    VIEW PRINT 1 TO 11
    CLS
    GOSUB ShowNotes
  ELSE
    curDay% = 1
    curMonth% = 1
    curYear% = curYear% + 1
  END IF
  ShowMonth curMonth%, curDay%, curYear%
RETURN

PreviousWeek:
  IF curDay% > 7 THEN
    curDay% = curDay% - 7
    ShowMonth curMonth%, curDay%, curYear%
  END IF
RETURN

NextWeek:
  IF curDay% <= MonthDays%(curMonth%, curYear%) - 7 THEN
    curDay% = curDay% + 7
    ShowMonth curMonth%, curDay%, curYear%
  END IF
RETURN

PreviousMonth:
  IF curMonth% > 1 THEN
    curMonth% = curMonth% - 1
  ELSEIF curYear% > MINYEAR% THEN
    curYear% = curYear% - 1
    curMonth% = 12
  END IF
  maxDay% = MonthDays%(curMonth%, curYear%)
  IF curDay% > maxDay% THEN curDay% = maxDay%
  VIEW PRINT 1 TO 11
  CLS
  ShowMonth curMonth%, curDay%, curYear%
  GOSUB ShowNotes
RETURN

NextMonth:
  IF curMonth% < 12 THEN
    curMonth% = curMonth% + 1
  ELSEIF curYear% < MAXYEAR% THEN
    curYear% = curYear% + 1
    curMonth% = 1
  END IF
  maxDay% = MonthDays%(curMonth%, curYear%)
  IF curDay% > maxDay% THEN curDay% = maxDay%
  VIEW PRINT 1 TO 11
  CLS
  ShowMonth curMonth%, curDay%, curYear%
  GOSUB ShowNotes
RETURN

PreviousYear:
  IF curYear% > MINTEAR% THEN
    curYear% = curYear% - 1
    maxDay% = MonthDays%(curMonth%, curYear%)
    IF curDay% > maxDay% THEN curDay% = maxDay%
    ShowMonth curMonth%, curDay%, curYear%
  END IF
RETURN

NextYear:
  IF curYear% < MAXYEAR% THEN
    curYear% = curYear% + 1
    maxDay% = MonthDays%(curMonth%, curYear%)
    IF curDay% > maxDay% THEN curDay% = maxDay%
    ShowMonth curMonth%, curDay%, curYear%
  END IF
RETURN

DisplaySchedule:
  INPUT #1, Info1$, Info2$, Info3$
  VIEW PRINT 12 TO 23
  IF curMonth% = 1 THEN curMonth$ = " January"
  IF curMonth% = 2 THEN curMonth$ = " February"
  IF curMonth% = 3 THEN curMonth$ = " March"
  IF curMonth% = 4 THEN curMonth$ = " April"
  IF curMonth% = 5 THEN curMonth$ = " May"
  IF curMonth% = 6 THEN curMonth$ = " June"
  IF curMonth% = 7 THEN curMonth$ = " July"
  IF curMonth% = 8 THEN curMonth$ = " August"
  IF curMonth% = 9 THEN curMonth$ = " September"
  IF curMonth% = 10 THEN curMonth$ = " October"
  IF curMonth% = 11 THEN curMonth$ = " November"
  IF curMonth% = 12 THEN curMonth$ = " December"
  LOCATE 17, 5: COLOR 14: PRINT curMonth$; curDay%; curYear%
  CALL CenterMessage(Info1$, 19, 15)
  CALL CenterMessage(Info2$, 20, 7)
  CALL CenterMessage(Info3$, 21, 7)
  VIEW PRINT 1 TO 11
RETURN

ShowNotes:
VIEW PRINT 13 TO 15
LOCATE 14, 3: COLOR 7: PRINT "Notes:"
COLOR 10
currentDay% = curDay%
GOSUB NextCurDay
M = 7
OPEN "SCHEDULE.DAT" FOR INPUT AS #1
  DO
    LINE INPUT #1, DAT$
    IF INSTR(DAT$, ComLine$) THEN M = M + 2: LOCATE 14, M: PRINT currentDay%: currentDay% = currentDay% + 1: GOSUB NextCurDay
  LOOP UNTIL EOF(1)
CLOSE #1
VIEW PRINT 1 TO 11
RETURN

NextCurDay:
    ComLine$ = STR$(curMonth%) + "/"
    ComLine$ = ComLine$ + STR$(currentDay%) + "/"
    ComLine$ = ComLine$ + STR$(curYear%)
RETURN

InputSchedule:
RETURN

QuitProgram:
  done% = TRUE%

SUB CenterMessage (Info$, LineNum%, Colour%)
LOCATE LineNum%, 15
LOCATE LineNum%, INT((80 - LEN(Info$)) / 2)
COLOR Colour%, 0
PRINT LEFT$(Info$, 77)
END SUB

SUB ClearBuffer

  DO WHILE INKEY$ <> ""
  LOOP

END SUB

FUNCTION DateNum& (Month%, day%, year%)

  startYear% = 1900
  january% = 1
  daysPerYr& = 365

  tooEarly% = (year% < startYear%)
  badMonth% = (Month% < 1 OR Month% > 12)
  badDay% = (day% < 1 OR day% > MonthDays%(Month%, year%))
  IF tooEarly% OR badMonth% OR badDay% THEN
    DateNum& = 0
    EXIT FUNCTION
  END IF

  num& = daysPerYr& * (year% - startYear%)

  FOR curYear% = startYear% TO year% - 1 STEP 4
    IF LeapYear%(curYear%) THEN num& = num& + 1
  NEXT curYear%

  FOR curMonth% = january% TO Month% - 1
    num& = num& + MonthDays%(curMonth%, year%)
  NEXT curMonth%

  num& = num& + day%
  DateNum& = num&

END FUNCTION

FUNCTION DayNum% (Month%, day%, year%)

  d& = DateNum&(Month%, day%, year%)
  IF d& <> 0 THEN dow% = d& MOD 7 + 1 ELSE dow% = 0

  DayNum% = dow%

END FUNCTION

FUNCTION LeapYear% (year%)

  divBy4% = (year% MOD 4 = 0)
  century% = (year% MOD 100 = 0)
  century400% = (year% MOD 400 = 0)

  LeapYear% = divBy4% AND (century% IMP century400%)

END FUNCTION

FUNCTION MonthDays% (monthNum%, year%)

  IF monthNum% < 1 OR monthNum% > 12 THEN
    MonthDays% = 0
    EXIT FUNCTION
  END IF

  SELECT CASE monthNum%
   
    CASE 2
      days% = 28
      IF LeapYear%(year%) THEN days% = days% + 1
    CASE 4, 6, 9, 11
      days% = 30
    CASE ELSE
      days% = 31
  END SELECT

  MonthDays% = days%

END FUNCTION

FUNCTION MonthName$ (monthNum%)

       M$ = "January   February  March     April     "
  M$ = M$ + "May       June      July      August    "
  M$ = M$ + "September October   Novemeber December  "

  IF monthNum% >= 1 AND monthNum% <= 12 THEN
    moStr$ = MID$(M$, (monthNum% - 1) * 10 + 1, 10)
    moStr$ = RTRIM$(moStr$)
  ELSE
    moStr$ = ""
  END IF
  MonthName$ = moStr$

END FUNCTION

SUB ShowMonth (Month%, day%, year%)

  firstDay% = DayNum%(Month%, 1, year%)
  monthLength% = MonthDays%(Month%, year%)
  moStr$ = MonthName$(Month%)
  LOCATE 1, 1
  COLOR 14, 0: PRINT SPACE$(35 - LEN(moStr$) \ 2); moStr$; year%
  PRINT
  COLOR 15
  PRINT " Sunday     Monday     Tuesday   Wednesday   Thursday   Friday    Saturday"
  PRINT
  COLOR 7

  curDate% = 0
  DO
    PRINT "  ";
    FOR curDay% = 1 TO 7
      isFirstDay% = (curDay% = firstDay% AND curDate% = 0)
      isInMonth% = (curDate% > 0 AND curDate% < monthLength%)
      IF isFirstDay% OR isInMonth% THEN
        curDate% = curDate% + 1
        IF curDate% = day% THEN COLOR 15, 1
        PRINT USING "###"; curDate%;
        PRINT "        ";
        COLOR 7, 0
      ELSE
        PRINT "           ";
      END IF
    NEXT curDay%
    PRINT
  LOOP UNTIL curDate% = monthLength%

 
END SUB

SUB ShowSchedule
VIEW PRINT 12 TO 24
COLOR 11
LOCATE 13, 1: PRINT CHR$(218); STRING$(77, 196); CHR$(191)
LOCATE 14, 1: PRINT CHR$(179); STRING$(77, 0); CHR$(179)
LOCATE 15, 1: PRINT CHR$(192); STRING$(77, 196); CHR$(217)
LOCATE 17, 1: PRINT CHR$(218); STRING$(77, 196); CHR$(191)
LOCATE 18, 1: PRINT CHR$(179); STRING$(77, 0); CHR$(179)
LOCATE 19, 1: PRINT CHR$(179); STRING$(77, 0); CHR$(179)
LOCATE 20, 1: PRINT CHR$(179); STRING$(77, 0); CHR$(179)
LOCATE 21, 1: PRINT CHR$(179); STRING$(77, 0); CHR$(179)
LOCATE 22, 1: PRINT CHR$(179); STRING$(77, 0); CHR$(179)
LOCATE 23, 1: PRINT CHR$(192); STRING$(77, 196); CHR$(217)
VIEW PRINT 1 TO 11
END SUB


--------------[ Cut and save this as SCHEDULE.DAT ]-----------------
 8/ 28/ 1995
"This is the Schedule.Dat file","To save notes press enter on any day","Enjoy!"
