C
C         IMPORTANT NAMES & DATES         by Bruce W. Roeckel
C       *--------------------------*
C            OPTION #3 & #4
C
$STORAGE:2
C
C
     SUBROUTINE CALEND
C
C           THIS ROUTINE WILL DISPLAY MONTH CALENDAR
C
     COMMON/REVNO/ PGM,AUTHOR,YEAR,DATE,REV
     CHARACTER PGM*21,AUTHOR*21,YEAR*4,DATE*8,REV*2
C
     COMMON/MAIN1/LAST,FIRST,ADD1,ADD2,CITY,STATE,ZIP,PH1,PH2
     CHARACTER LAST(12,200)*1,FIRST(200)*23,ADD1(200)*30,ADD2(200)*30
     CHARACTER CITY(200)*23,STATE(200)*2,ZIP(200)*5
     CHARACTER PH1(200)*14,PH2(200)*14
C
     COMMON/MAIN2/ STRID,JULIAN,MNUM
     INTEGER STRID(200),JULIAN(366,5),MNUM
C
     COMMON/MAIN3/ NAME,ANIV,BDAY,XMAS
     CHARACTER NAME(6,200)*12,ANIV(200)*8,BDAY(6,200)*8,XMAS(12,200)*2
C
     REAL LEAPYR
     INTEGER DAYS(12),DNUM,TODAY
     CHARACTER OPTION*25,RAMDSK*80,CALEN*8,DAY(7)*3,IMON(12)*6,ANS*1
C
     DATA DAY/'Sun','Mon','Tue','Wed','Thr','Fri','Sat'/
     DATA DAYS/31,28,31,30,31,30,31,31,30,31,30,31/
     DATA IMON/' Jan  ',' Feb  ','March ','April ',' May  ',' June ',
    A          ' July ',' Aug  ',' Sept ',' Oct  ',' Nov  ',' Dec  '/
C
C           SET-UP SCREEN
C
  10 CONTINUE
     OPTION='Monthly Calendar   '
     CALL HEADER(OPTION)
     IV=21
     IH=1
     CALL MOVEIT(IH,IV)
     CALL ULINE
        WRITE(*,'(80X)')
     CALL OFF
C
C            FIGURE OUT WHAT MONTH & YEAR THIS IS
C
  50 CONTINUE
     IH=1
     IV=23
     IANY=0
     CALL MOVEIT(IH,IV)
     WRITE(*,'(15X,A31,\)') 'Enter Month to Display (1-12): '
     READ(*,'(I2)',ERR=890) JMON
     IF(JMON.EQ.0) RETURN
     IF(JMON.LT.1 .OR. JMON.GT.12) GOTO 890
        WRITE(RAMDSK,'(A8)') DATE
        READ(RAMDSK,'(6X,I2)') IYEAR
        LEAPYR = (REAL(IYEAR)/4.0) - INT(REAL(IYEAR)/4.0)
        IF(LEAPYR.EQ.0.0) DAYS(2)=29
        DNUM=DAYS(JMON)
C
C            CALCULATE THE JULIAN DATE OF THE 1ST OF THIS MONTH
C            AND WHAT DAY-OF-WEEK THE FIRST IS ON
C
     WRITE(RAMDSK,'(I2.2,A4,I2.2)') JMON,'/01/',IYEAR
     READ(RAMDSK,'(A8)') CALEN
     CALL DATEJL(CALEN,IJUL)
     CALL DATEDW(CALEN,IDOW)
C
C            NOW, START DISPLAYING CALENDAR
C
     IF(IDOW.GT.0) THEN
        IH=1
        IV=7
        WRITE(RAMDSK,'(A6,I4)') IMON(JMON),IYEAR+1900
        CALL SQUISH(RAMDSK,10)
        CALL UPTOP(IH,IV)
        CALL DHTOP
           WRITE(*,'(13X,A10)') RAMDSK
        CALL DHBOT
           WRITE(*,'(13X,A10)') RAMDSK
        CALL OFF
C
C            DRAW THE DAY DESCRIPTIONS
C
        IV=9
        CALL BOLD
           DO 100 I=1,7
           IH = (I*10) - 1
           CALL UPTOP(IH,IV)
           WRITE(*,'(A3)') DAY(I)
 100       CONTINUE
        CALL OFF
C
C            NOW DRAW IN DAYS
C
        IH=(IDOW*10) - 2
        IV=10
        K=0
 200    CONTINUE
        K=K+1
        IF(K.GT.DNUM) GOTO 500
C
C            PRINT THIS DAY, BLINKING IF ACTIVITY TODAY
C
        CALL UPTOP(IH,IV)
        IF(JULIAN(IJUL+K-1,1).GT.0) THEN
           IANY=1
           CALL BLINK
           CALL BOLD
           WRITE(*,'(A1,I2,A1)') '[',K,']'
           CALL OFF
        ELSE
           WRITE(*,'(A1,I2,A1)') ' ',K,' '
        ENDIF
C
C            CONTINUE WITH THE NEXT DAY
C
        IH = IH + 10
        IF(IH.GT.70) THEN
           IH = 8
           IV = IV + 2
        ENDIF
        GOTO 200
 500    CONTINUE
C
C            NOW ASK FOR DAY TO BLOW-UP
C
        IF(IANY.LE.0) THEN
           IH=1
           IV=23
           CALL MOVEIT(IH,IV)
           CALL BLINK
           CALL BOLD
           CALL BELL
           WRITE(*,'(5X,A26,\)') 'No Activity This Month ...'
           READ(*,'(A1)') ANS
           RETURN
        ELSE
           CALL BLOWUP(JMON,DNUM,IYEAR)
           GOTO 10
        ENDIF
     ENDIF
 890 CONTINUE
     CALL BELL
     GOTO 50
     END
C
C
C
     SUBROUTINE SUMMAR
C
C           THIS ROUTINE WILL PRINT NAMES&DATES REPORT
C
     COMMON/REVNO/ PGM,AUTHOR,YEAR,DATE,REV
     CHARACTER PGM*21,AUTHOR*21,YEAR*4,DATE*8,REV*2
C
     COMMON/MAIN1/LAST,FIRST,ADD1,ADD2,CITY,STATE,ZIP,PH1,PH2
     CHARACTER LAST(12,200)*1,FIRST(200)*23,ADD1(200)*30,ADD2(200)*30
     CHARACTER CITY(200)*23,STATE(200)*2,ZIP(200)*5
     CHARACTER PH1(200)*14,PH2(200)*14
C
     COMMON/MAIN2/ STRID,JULIAN,MNUM
     INTEGER STRID(200),JULIAN(366,5),MNUM
C
     COMMON/MAIN3/ NAME,ANIV,BDAY,XMAS
     CHARACTER NAME(6,200)*12,ANIV(200)*8,BDAY(6,200)*8,XMAS(12,200)*2
C
     INTEGER UNIT,PAGE
C
C          SET UP PRINTER
C
     UNIT=6
     PAGE=0
     LINE=0
     IV=21
     IH=1
     CALL MOVEIT(IH,IV)
     CALL BOLD
     CALL BLINK
     WRITE(*,'(A25)') 'Please Wait ... Printing '
     OPEN(UNIT,FILE='PRN')
C
C          PRINT ONLY THE DATA WE HAVE
C
     DO 500 I=1,200
     IF(NAME(1,I).NE.' '.OR.ANIV(I).NE.' '.OR.BDAY(1,I).NE.' '.OR.
    A   XMAS(1,I).NE.' '.OR.XMAS(7,I).NE.' ') THEN
        IF(LINE.LE.0) THEN
           LINE=8
           CALL SWIDTH(UNIT)
           WRITE(UNIT,'(X)')
           CALL PHEAD(PAGE,UNIT,PGM,DATE,YEAR,REV)
           CALL WWIDTH(UNIT)
           WRITE(UNIT,100)
 100       FORMAT(//,
    A        /,5X,' Last Name               Mailing Address        ',
    B             '           Birthdays          Xmas Cards Sent   ',
    C             '  Xmas Cards Rec"d ',
    D        /,5X,'------------    --------------------------------',
    E             '    ---------------------    -----------------  ',
    F             '  -----------------')
        ENDIF
        LINE=LINE-1
        CALL MATCH(I,KCODE)
        WRITE(UNIT,200) (LAST(M,KCODE),M=1,12),
    A      FIRST(KCODE),ANIV(I),BDAY(1,I),NAME(1,I),
    B      (XMAS(M,I),M=1,12),
    C      ADD1(KCODE),BDAY(2,I),NAME(2,I)
 200    FORMAT(5X,12A1,4X,A23,1X,A8,4X,A8,' ',A12,2(4X,5(A2,','),A2),
    A      /,21X,A30,6X,A8,' ',A12)
C
C            IF SECOND ADDRESS BLANK, THEN DON'T PRINT A SPACE
C
        IF(ADD2(KCODE).NE.' ') THEN
           WRITE(UNIT,250) ADD2(KCODE),BDAY(3,I),NAME(3,I),
    A         CITY(KCODE),STATE(KCODE),ZIP(KCODE),BDAY(4,I),NAME(4,I),
    B         BDAY(5,I),NAME(5,I),BDAY(6,I),NAME(6,I)
 250       FORMAT(21X,A30,6X,A8,' ',A12,
    A        /,21X,A23,1X,A2,1X,A5,4X,A8,' ',A12,
    B        /,21X,36X,A8,' ',A12,
    C        /,21X,36X,A8,' ',A12)
        ELSE
           WRITE(UNIT,300) CITY(KCODE),
    A         STATE(KCODE),ZIP(KCODE),BDAY(3,I),NAME(3,I),
    B         BDAY(4,I),NAME(4,I),BDAY(5,I),NAME(5,I),
    C         BDAY(6,I),NAME(6,I)
 300       FORMAT(
    A          21X,A23,1X,A2,1X,A5,4X,A8,' ',A12,
    B        /,21X,36X,A8,' ',A12,
    C        /,21X,36X,A8,' ',A12,
    D        /,21X,36X,A8,' ',A12)
        ENDIF
     ENDIF
 500 CONTINUE
     CALL SWIDTH(UNIT)
     CLOSE(UNIT)
     RETURN
     END
C
C
C
     SUBROUTINE BLOWUP(JMON,DNUM,IYEAR)
C
C         THIS ROUTINE LISTS ANY SINGLE DAY TO THE SCREEN
C
     COMMON/MAIN1/LAST,FIRST,ADD1,ADD2,CITY,STATE,ZIP,PH1,PH2
     CHARACTER LAST(12,200)*1,FIRST(200)*23,ADD1(200)*30,ADD2(200)*30
     CHARACTER CITY(200)*23,STATE(200)*2,ZIP(200)*5
     CHARACTER PH1(200)*14,PH2(200)*14
C
     COMMON/MAIN2/ STRID,JULIAN,MNUM
     INTEGER STRID(200),JULIAN(366,5),MNUM
C
     COMMON/MAIN3/ NAME,ANIV,BDAY,XMAS
     CHARACTER NAME(6,200)*12,ANIV(200)*8,BDAY(6,200)*8,XMAS(12,200)*2
C
     INTEGER DNUM,CNT
     CHARACTER TYPE*6,TEMP*80
     CHARACTER RAMDSK*80,CALEN*8,DAY(7)*3,IMON(12)*6,ANS*1
C
     DATA DAY/'Sun','Mon','Tue','Wed','Thr','Fri','Sat'/
     DATA IMON/' Jan  ',' Feb  ',' March',' April',' May  ',' June ',
    A          ' July ',' Aug  ',' Sept ',' Oct  ',' Nov  ',' Dec  '/
C
C         ASK WHICH DAY TO BLOW-UP
C
  50 CONTINUE
     IV=23
     IH=1
     CALL MOVEIT(IH,IV)
     WRITE(*,75) 'Enter Day to See in Detail (1-',DNUM,'): '
  75 FORMAT(15X,A30,I2,A3,\)
        READ(*,'(I2)',ERR=890) JDAY
        IF(JDAY.EQ.0) RETURN
        IF(JDAY.GT.0 .AND. JDAY.LE.DNUM) THEN
           WRITE(RAMDSK,'(I2,A1,I2,A1,I2)') JMON,'/',JDAY,'/',IYEAR
           READ(RAMDSK,'(A8)') CALEN
           CALL DATEDW(CALEN,IDOW)
           IF(IDOW.GT.0) THEN
C
C                   GO FIND OUT IF THE MATCHES ARE B'DAYS OR ANIV.
C
              CNT=0
              LHIT=0
              CALL DATEJL(CALEN,IJUL)
              DO 500 K=1,5
              IHIT=JULIAN(IJUL,K)
              IF(IHIT.LE.0) GOTO 500
              IF(IHIT.EQ.LHIT) GOTO 300
C
C                   FIRST, SEE IF POINTER IS FOR ANNIVERSARY
C
              LHIT=IHIT
              CALL FINDA(IHIT,JMON,JDAY,LINE)
              IF(LINE.EQ.0) THEN
                 CALL MATCH(IHIT,KCODE)
                 CALL BOLD
                 CALL MOVEIT(IH,IV)
                 WRITE(RAMDSK,200) DAY(IDOW),CALEN,'Anniversary, ',
    A                         FIRST(KCODE),(LAST(L,KCODE),L=1,12)
 200             FORMAT(A3,', ',A8,' ... ',A13,A23,12A1)
                 CALL SQUISH(RAMDSK,66)
                 TYPE='CENTER'
                 CALL JUSTIF(TYPE,RAMDSK,66)
                 WRITE(*,'(7X,A66,\)') RAMDSK
                 READ(*,'(A1)') ANS
                 CALL OFF
                 GOTO 500
              ENDIF
C
C                   NOW, LOOK FOR ALL BIRTHDAYS
C
 300          CONTINUE
              LHIT=IHIT
              CNT=CNT+1
              CALL FINDB(CNT,IHIT,JMON,JDAY,LINE)
C
C                 CHECK TO SEE IF IT WAS A BIRTHDAY
C
              IF(LINE.GT.0) THEN
                 CALL MATCH(IHIT,KCODE)
                 CALL BOLD
                 CALL MOVEIT(IH,IV)
                 WRITE(RAMDSK,350) DAY(IDOW),CALEN,'Birthday, ',
    A                         NAME(LINE,IHIT),(LAST(L,KCODE),L=1,12)
 350             FORMAT(A3,', ',A8,' ... ',A10,A12,12A1)
                 CALL SQUISH(RAMDSK,52)
                 TYPE='CENTER'
                 CALL JUSTIF(TYPE,RAMDSK,52)
                 WRITE(*,'(7X,A52,\)') RAMDSK
                 READ(*,'(A1)') ANS
                 CALL OFF
              ELSEIF(CNT.LT.6) THEN
                 GOTO 300
              ENDIF
 500          CONTINUE
              GOTO 50
           ENDIF
        ENDIF
 890 CONTINUE
     CALL BELL
     GOTO 50
     END
C
C
C
     SUBROUTINE MATCH(I,KCODE)
C
C           WILL FIND MATCHING LAST NAME, BY USING STRUCTURE ID
C
     COMMON/MAIN2/ STRID,JULIAN,MNUM
     INTEGER STRID(200),JULIAN(366,5),MNUM
C
     KCODE=0
     DO 100 K=1,MNUM
     IF(STRID(K).EQ.I) THEN
        KCODE=K
        RETURN
     ENDIF
 100 CONTINUE
     RETURN
     END
C
C
C
     SUBROUTINE FINDA(IHIT,JMON,JDAY,LINE)
C
C           WILL FIND MATCHING ANNIVERSARIES FOR SELECTED DAY
C
     COMMON/MAIN3/ NAME,ANIV,BDAY,XMAS
     CHARACTER NAME(6,200)*12,ANIV(200)*8,BDAY(6,200)*8,XMAS(12,200)*2
C
     CHARACTER RAMDSK*80
C
C            SEARCH NAMES & DATES AND DETERMINE IF ITS AN
C            ANNIVERSARY OR A BIRTHDAY THAT MATCHES
C
     LINE=-1
     WRITE(RAMDSK,'(A8)') ANIV(IHIT)
     READ(RAMDSK,'(I2,1X,I2)',ERR=900) IMON,IDAY
     IF(IMON.EQ.JMON .AND. IDAY.EQ.JDAY) THEN
        LINE=0
        RETURN
     ENDIF
 900 CONTINUE
     RETURN
     END
C
C
C
     SUBROUTINE FINDB(LOC,IHIT,JMON,JDAY,LINE)
C
C           WILL FIND MATCHING BIRTHDAYS FOR SELECTED DAY
C
     COMMON/MAIN3/ NAME,ANIV,BDAY,XMAS
     CHARACTER NAME(6,200)*12,ANIV(200)*8,BDAY(6,200)*8,XMAS(12,200)*2
C
     CHARACTER RAMDSK*80
C
C            SEARCH NAMES & DATES AND DETERMINE IF ITS
C            A BIRTHDAY THAT MATCHES
C
     LINE=-1
     WRITE(RAMDSK,'(A8)') BDAY(LOC,IHIT)
     READ(RAMDSK,'(I2,1X,I2)',ERR=900) IMON,IDAY
     IF(IMON.EQ.JMON .AND. IDAY.EQ.JDAY) THEN
        LINE=LOC
        RETURN
     ENDIF
 900 CONTINUE
     RETURN
     END