'===========================================================================
' Subject: GRAPHICAL EVENT ORGANIZER          Date: 06-19-99 (03:20)       
'  Author: David A. Wicker                    Code: QB, QBasic, PDS        
'  Origin: topaz817@fastlane.net            Packet: MISC.ABC
'===========================================================================
' * Graphic Event Organizer v0.1 -- Written by David A. Wicker -- Jun 4, 1999
' Fort Worth Fastlane Internet Account >> topaz817@fastlane.net
' ---------------------------------------------------------------------------
' As always, if you borrow anything from any source code for your personal
' projects, please give credit to the original author!
' ---------------------------------------------------------------------------
DEFINT A-Z
'$DYNAMIC
DECLARE SUB Center (A, A$)
DECLARE SUB TTR (T$)
DECLARE SUB Ask (T$)
DECLARE SUB GetUKey ()
DECLARE SUB Title (T$)
DECLARE SUB Wdw (HH, V, XX, Y)
DECLARE SUB DEC (N)
DECLARE SUB INC (N)
DECLARE SUB Stor (N, I$)
DECLARE SUB TR (H, V, T$)
DECLARE SUB GetKey ()
DECLARE SUB ShutDown ()
DECLARE SUB Startup ()
DECLARE SUB RGB (N, R, G, B)
DECLARE SUB Main ()
DECLARE FUNCTION FILELEN& (F$)

' This is a kinna improvement on Wayne L.'s "Event" program.
' He did ask for suggestions on it so . . .
' The basic concept behind his program is sound, but the source code
' is too big!  Here is a smaller one showing my little potpourri of 8x8
' EGA images as well.  :)  (Use the [ALT]-A through [ALT]-Z to show them!)
' I don't know much about leap years and stuff so it'll take any day up to
' 31 even if the month doesn't allow it.  Yah well.

' Wayne, I was looking over your source code for the registration and the
' string, Disk1$ is never initialized but referenced ?  Check it out !
' Anyways QB programs are FREEWARE!

' Limitations!  If you want to schedule more than 32767 appointments,
' change the top command to read DEFLNG A-Z, then you can have
' up to 1,073,741,823 of them.
' If =THAT= is not enough, you are one very busy person and should get at
' least one secretary to handle your appointments for you!

' If you have more than one appointment in a single day, checkmarking it
' will place it at the end of the day for easy reference.
' Also, everything is sorted so when things jump around, it's just
' alphabetizing and sorting the calendar.

' The FreeSpace indicator and Sort may not work outside Win98!
' Also this code is not commented much because it's a quick hack.  Hang on!

DEF FNO$ (A$) = LEFT$(A$, 1)
DEF FNZ$ (A$) = RIGHT$(A$, 1)
DEF FNC$ (A$, A) = MID$(A$, A, 1)
DEF FNN$ (A) = MID$(STR$(A), 2 + (A < 0))
DEF FNPad$ (A$, A) = LEFT$(A$ + SPACE$(A - LEN(LEFT$(A$, A))), A)
DEF FNDot$ (A$, A) = A$ + STRING$(A - LEN(A$), ".")
DEF FNZPad$ (A, B) = STRING$(B - LEN(FNN$(A)), "0") + FNN$(A)
DEF FNSPad$ (A, B) = SPACE$(B - LEN(FNN$(A))) + FNN$(A)
DEF FNCTRL$ (A$) = CHR$(ASC(A$) - 64)
DEF FND$ (A$) = LEFT$(A$, LEN(A$) - 1)

DEF FNNow$
  D$ = DATE$
  FNNow$ = MID$(D$, 7) + LEFT$(D$, 2) + MID$(D$, 4, 2)
END DEF

DEF FNDate$ (A$)
  B$ = MID$("JanFebMarAprMayJunJulAugSepOctNovDec", VAL(MID$(A$, 5, 2)) * 3 - 2, 3)
  ' ^ Chee!  I bet you couldn't write that in Asic! ^
  B$ = B$ + FNSPad$(VAL(MID$(A$, 7, 2)), 2) + "," + LEFT$(A$, 4)
  FNDate$ = B$
END DEF

DIM I.TR(17, 127)

A$(0) = "freeware gr_event v0.1 written in quickbasic 4.5"
A$(1) = "you like ?  please send a postcard to let me know !"
A$(2) = "david wicker ÄÄ 3436 clayton road east ÄÄ fort worth, texas  76116"
   
FOR I = 0 TO 2
  FOR J = 1 TO LEN(A$(I))
    A = A + ASC(FNC$(A$(I), J))
  NEXT
NEXT

WHILE A <> 14857: WEND

ON TIMER(1) GOSUB Tick

Startup
Main
ShutDown
END

Tick:
  PT = PadTR
  PadTR = 0
  T$ = TIME$
  Sec = VAL(MID$(T$, 7))
  TR 35, 24, FNC$(": ", (Sec MOD 2) + 1)
  Min = VAL(MID$(T$, 4, 2))
  IF LastMin <> Min THEN
    LastMin = Min
    Hr = VAL(LEFT$(T$, 2))
    IF Hr > 11 THEN APm = 1 ELSE APm = 0
    IF Hr = 0 THEN Hr = 12
    IF Hr > 12 THEN Hr = Hr - 12
    TR 33, 24, FNSPad$(Hr, 2) + ":" + FNZPad$(Min, 2) + FNC$("ap", 1 + APm) + "m"
  END IF
  D$ = DATE$
  Day = VAL(MID$(D$, 4, 2))
  IF LastDay <> Day THEN
    LastDay = Day
    TR 22, 24, FNDate$(RIGHT$(D$, 4) + LEFT$(D$, 2) + MID$(D$, 4, 2))
    SHELL "echo.|date>date.___"
    F = FREEFILE
    OPEN "i", F, "date.___"
    LINE INPUT #F, T$
    CLOSE F
    KILL "date.___"
    TR 18, 24, MID$(T$, 17, 3)
  END IF
  PadTR = PT
RETURN
    

ErrFound:
  ErrFlag = 1
  RESUME NEXT

FontData:
DATA 8,8,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,8,8,3327,3084
DATA 7421,7196,14585,14392,12531,12288,231,0,24831,24576,207,0,255,0,8
DATA 8,26367,26214,26350,26214,204,0,255,0,255,0,255,0,255,0,255,0,8,8
DATA 27903,27756,-257,-258,27884,27756,-257,-512,27884,27648,201,0,255
DATA 0,255,0,8,8,6399,6168,16127,15934,24800,24672,15615,15360,1767,1536
DATA 31996,31744,6361,6144,243,0,8,8,255,0,26367,26214,27884,27756,6361
DATA 6144,14071,13824,26342,26112,204,0,255,0,8,8,28927,28784,-10017,-10024
DATA 30455,30326,-8996,-9216,-13107,-13312,30455,30208,196,0,255,0,8,8
DATA 6399,6168,6395,6168,12531,12336,231,0,255,0,255,0,255,0,255,0,8,8
DATA 3327,3084,12529,12336,24807,24672,24815,24576,12543,12288,3311,3072
DATA 249,0,255,0,8,8,24831,24672,6367,6168,3327,3084,3325,3072,6393,6144
DATA 24819,24576,207,0,255,0,8,8,12543,12336,-18697,-18762,-772,-772,-769
DATA -1024,-18761,-18944,12532,12288,231,0,255,0,8,8,255,0,6399,6168,6395
DATA 6168,32511,32256,6360,6144,6395,6144,243,0,255,0,8,8,255,0,255,0,255
DATA 0,255,0,6399,6144,6395,6144,12531,12288,231,0,8,8,255,0,255,0,255
DATA 0,-1,-256,0,0,255,0,255,0,255,0,8,8,255,0,255,0,255,0,255,0,6399,6144
DATA 6395,6144,243,0,255,0,8,8,1791,1542,3838,3598,7420,7196,14585,14336
DATA 28915,28672,24807,24576,207,0,255,0,8,8,31999,31868,-14649,-14650
DATA -10530,-10538,-10752,-10538,-14832,-14650,31872,31868,193,0,255,0
DATA 8,8,14591,14392,6395,6168,6395,6168,6371,6168,6371,6168,15555,15420
DATA 225,0,255,0,8,8,15615,15420,26343,26214,1742,1542,6372,6168,24723
DATA 24672,32385,32382,192,0,255,0,8,8,32511,32382,1734,1542,7420,7196
DATA 1777,1542,1784,1542,31872,31868,193,0,255,0,8,8,3839,3598,6392,6168
DATA 14071,13878,26240,26214,32384,32382,1728,1542,252,0,255,0,8,8,32511
DATA 32382,24800,24672,31999,31868,1729,1542,26264,26214,15552,15420,225
DATA 0,255,0,8,8,7423,7196,12529,12336,27887,27756,26249,26214,26248,26214
DATA 15552,15420,225,0,255,0,8,8,32511,32382,1734,1542,3324,3084,6369,6168
DATA 12483,12336,12487,12336,231,0,255,0,8,8,15615,15420,26343,26214,15612
DATA 15420,26241,26214,26248,26214,15552,15420,225,0,255,0,8,8,15615,15420
DATA 26343,26214,26350,26214,14024,13878,3296,3084,14529,14392,227,0,255
DATA 0,8,8,6399,6168,6395,6168,243,0,255,0,6399,6144,6395,6144,243,0,255
DATA 0,8,8,6399,6168,6395,6168,243,0,6399,6144,6395,6144,4339,4096,8423
DATA 8192,239,0,8,8,1791,1542,6392,6168,24803,24672,6367,6144,1783,1536
DATA 252,0,255,0,255,0,8,8,255,0,32511,32382,192,0,32511,32256,192,0,255
DATA 0,255,0,255,0,8,8,24831,24672,6367,6168,1783,1542,6392,6144,24803
DATA 24576,207,0,255,0,255,0,8,8,15615,15420,26343,26214,1742,1542,7420
DATA 7168,241,0,6399,6144,243,0,255,0,8,8,14591,14392,17639,17476,-25889
DATA -25958,-21830,-22016,-17218,-17408,16609,16384,14591,14336,227,0,8
DATA 8,16127,15934,26342,26214,26350,26214,28398,28160,26350,26112,26350
DATA 26112,204,0,255,0,8,8,31999,31868,26343,26214,27884,27756,26351,26112
DATA 26350,26112,31996,31744,193,0,255,0,8,8,16127,15934,24800,24672,24815
DATA 24672,24815,24576,12543,12288,7935,7680,240,0,255,0,8,8,30975,30840
DATA 27887,27756,26351,26214,26350,26112,26350,26112,31996,31744,193,0
DATA 255,0,8,8,32511,32382,24800,24672,30975,30840,24803,24576,24815,24576
DATA 16127,15872,224,0,255,0,8,8,16127,15934,24800,24672,30975,30840,24803
DATA 24576,24815,24576,24815,24576,207,0,255,0,8,8,15615,15420,24801,24672
DATA 24815,24672,28399,28160,26350,26112,16126,15872,224,0,255,0,8,8,26367
DATA 26214,26350,26214,32510,32382,26342,26112,26350,26112,26350,26112
DATA 204,0,255,0,8,8,15615,15420,6393,6168,6395,6168,6395,6144,6395,6144
DATA 15615,15360,225,0,255,0,8,8,7935,7710,1782,1542,1790,1542,1790,1536
DATA 26366,26112,15612,15360,225,0,255,0,8,8,26367,26214,27884,27756,30969
DATA 30840,30971,30720,27887,27648,26351,26112,204,0,255,0,8,8,24831,24672
DATA 24815,24672,24815,24672,24815,24576,25327,25088,32510,32256,192,0
DATA 255,0,8,8,-14593,-14650,-4354,-4370,-258,-258,-10538,-10752,-14634
DATA -14848,-14626,-14848,156,0,255,0,8,8,26367,26214,30462,30326,32510
DATA 32382,28398,28160,26350,26112,26350,26112,204,0,255,0,8,8,15615,15420
DATA 26343,26214,26350,26214,26350,26112,26350,26112,15612,15360,225,0
DATA 255,0,8,8,31999,31868,26343,26214,26350,26214,27884,27648,24809,24576
DATA 24815,24576,207,0,255,0,8,8,15615,15420,26351,26214,26350,26214,26350
DATA 26112,27374,27136,11502,11264,1775,1536,252,0,8,8,31999,31868,26351
DATA 26214,26350,26214,30972,30720,27887,27648,26351,26112,236,0,255,0
DATA 8,8,3839,3598,6392,6168,6395,6168,6395,6144,6395,6144,28915,28672
DATA 199,0,255,0,8,8,32511,32382,192,0,6399,6168,6395,6144,6395,6144,6395
DATA 6144,243,0,255,0,8,8,26367,26214,26350,26214,26350,26214,26350,26112
DATA 28398,28160,14078,13824,228,0,255,0,8,8,28415,28270,26350,26214,27884
DATA 27756,30969,30720,28915,28672,24807,24576,207,0,255,0,8,8,-12545,-12594
DATA -14626,-14650,-14626,-14650,-10530,-10752,-258,-512,28398,28160,200
DATA 0,255,0,8,8,26367,26214,15612,15420,6393,6168,6395,6144,15615,15360
DATA 26343,26112,204,0,255,0,8,8,26367,26214,26350,26214,26350,26214,15612
DATA 15360,6393,6144,6395,6144,243,0,255,0,8,8,32511,32382,19660,19532
DATA 6361,6168,12531,12288,25319,25088,32510,32256,192,0,255,0,8,8,254
DATA 256,253,513,251,1027,247,2311,239,4879,479,10015,959,20287,192,0,8
DATA 8,24831,24672,28927,28784,14591,14392,7423,7168,3839,3584,1790,1536
DATA 252,0,255,0,8,8,255,128,127,64,63,32,31,16,15,8,7,4,3,2,0,0,8,8,24767
DATA 24608,-8637,-14782,-12876,-12924,28056,3080,3520,2304,505,257,255
DATA 0,255,0,8,8,255,0,255,0,255,0,255,0,255,0,-32001,-32126,-258,-258
DATA 128,0,8,8,15615,15420,7421,7196,3325,3084,1277,1024,253,0,255,0,255
DATA 0,255,0,8,8,255,0,15615,15420,1767,1542,14078,13824,26342,26112,16126
DATA 15872,224,0,255,0,8,8,24831,24672,27887,27756,26351,26214,26350,26112
DATA 27884,27648,30969,30720,195,0,255,0,8,8,255,0,15615,15420,24801,24672
DATA 24815,24576,24815,24576,15615,15360,225,0,255,0,8,8,1791,1542,14078
DATA 13878,26342,26214,26350,26112,26350,26112,16126,15872,224,0,255,0
DATA 8,8,255,0,15615,15420,26343,26214,28398,28160,24808,24576,15615,15360
DATA 225,0,255,0,8,8,3839,3598,6392,6168,16127,15934,6392,6144,6395,6144
DATA 6395,6144,28915,28672,199,0,8,8,255,0,16127,15934,26350,26214,26350
DATA 26112,14078,13824,1766,1536,15612,15360,225,0,8,8,24831,24672,31999
DATA 31868,26343,26214,26350,26112,26350,26112,26350,26112,204,0,255,0
DATA 8,8,6399,6168,243,0,14591,14392,6395,6144,6395,6144,6395,6144,243
DATA 0,255,0,8,8,3327,3084,249,0,7423,7196,3325,3072,3325,3072,3325,3072
DATA 30969,30720,195,0,8,8,24831,24672,26351,26214,27884,27756,30969,30720
DATA 27887,27648,26351,26112,204,0,255,0,8,8,14591,14392,6395,6168,6395
DATA 6168,6395,6144,6395,6144,7423,7168,241,0,255,0,8,8,255,0,-4865,-4884
DATA -257,-258,-10538,-10752,-14634,-14848,-14626,-14848,156,0,255,0,8
DATA 8,255,0,27903,27756,30463,30326,26342,26112,26350,26112,26350,26112
DATA 204,0,255,0,8,8,255,0,15615,15420,26343,26214,26350,26112,26350,26112
DATA 15612,15360,225,0,255,0,8,8,255,0,31999,31868,26351,26214,26350,26112
DATA 27884,27648,24809,24576,24815,24576,207,0,8,8,255,0,31999,31868,-13091
DATA -13108,-13091,-13312,27901,27648,3277,3072,7935,7680,240,0,8,8,255
DATA 0,27903,27756,30463,30326,24804,24576,24815,24576,24815,24576,207
DATA 0,255,0,8,8,255,0,3839,3598,6392,6168,6395,6144,6395,6144,28915,28672
DATA 199,0,255,0,8,8,12543,12336,15615,15420,12529,12336,12535,12288,12535
DATA 12288,7423,7168,241,0,255,0,8,8,255,0,26367,26214,26350,26214,26350
DATA 26112,28398,28160,14078,13824,228,0,255,0,8,8,255,0,26367,26214,26350
DATA 26214,26350,26112,15612,15360,6393,6144,243,0,255,0,8,8,255,0,-14593
DATA -14650,-14626,-14650,-10530,-10752,-258,-512,28398,28160,200,0,255
DATA 0,8,8,255,0,26367,26214,15612,15420,6393,6144,15615,15360,26343,26112
DATA 204,0,255,0,8,8,255,0,26367,26214,26350,26214,26350,26112,14078,13824
DATA 1766,1536,15612,15360,225,0,8,8,255,0,32511,32382,19660,19532,6361
DATA 6144,13043,12800,32510,32256,192,0,255,0,8,8,255,14,254,1598,766,7806
DATA 766,7806,254,1598,254,14,248,0,255,0,8,8,6395,6168,6395,6168,6395
DATA 6168,6395,6144,6395,6144,6395,6144,6395,6144,6395,6144,8,8,255,112
DATA 255,24700,16639,30846,16638,30846,252,24700,241,112,199,0,255,0,8
DATA 8,255,0,255,0,-16321,0,-21421,-23552,-13147,-13180,-21415,-29688,3617
DATA 2048,248,0,8,8,15615,15420,17091,16962,-16961,-16963,-20047,-20224
DATA -17985,-18176,-20045,-20224,17126,16896,15613,15360,8,8,12543,0,24807
DATA 0,-1,-32640,-1800,-32640,-1797,-32640,-3853,-32640,-32633,-32640,191
DATA 0,8,8,765,514,1786,1030,3316,2060,22697,20568,28883,8304,8423,32,239
DATA 0,255,0,8,8,1279,3598,2300,7196,4345,14392,15615,32382,2300,7196,4345
DATA 14392,8435,28784,199,0,8,8,255,0,255,0,-499,12,-444,14404,-444,14404
DATA -416,96,128,0,255,0,8,8,255,0,2287,4104,2287,4334,254,-258,-512,254
DATA -8680,222,-8680,222,144,0,8,8,14535,14392,21635,21588,-10751,-10538
DATA -512,-258,-17920,-17734,17536,17476,14529,14392,227,0,8,8,255,0,255
DATA 4096,4343,4096,14591,31760,4337,4096,247,4096,247,0,255,0,8,8,255
DATA 0,4335,4112,14575,4152,-511,-258,14464,14392,27847,10348,17545,17476
DATA 221,0,8,8,255,0,147,108,16449,27902,0,31998,128,14460,193,4152,227
DATA 16,247,0,8,8,10455,4096,24735,7168,-28051,27648,-18872,18432,11984
DATA -12288,8412,23552,12489,2048,227,0,8,8,-28417,8336,-28945,18078,-3856
DATA 26366,-29042,26366,-32640,1678,-32584,128,-32577,128,191,0,8,8,21759
DATA -428,21758,-428,10492,31784,4345,14352,251,4152,4347,14392,251,4152
DATA 227,0,8,8,31999,31868,-28013,-28014,-27978,-28014,27884,27756,14585
DATA 14392,227,0,14591,14392,227,0,8,8,255,0,2303,7176,4349,15376,10493
DATA 31776,22781,31808,253,31744,193,0,255,0,8,8,199,14392,131,17476,153
DATA 17476,153,17476,193,14392,227,4112,199,14392,231,4112,8,8,255,4096
DATA 255,14336,247,21504,213,4096,251,14336,197,17408,221,17408,249,14336
DATA 8,8,239,4096,199,10256,147,17464,169,4220,4165,14590,4096,31998,14480
DATA 31868,193,0,8,8,4351,4096,4343,4096,14591,12296,14587,8216,28927,27664
DATA 28925,27664,8441,6176,227,0,8,8,14591,4152,10475,40,27887,10348,-17733
DATA -27974,-28014,146,14526,4152,10475,10280,10475,40,8,8,3327,1036,6393
DATA 24,6651,2329,8191,3103,16126,4158,28912,8304,-7953,16608,-16161,192
DATA 8,8,255,0,255,60,4351,6270,8446,15486,254,15486,254,6270,252,60,225
DATA 0,8,8,255,0,195,60,4241,6270,8352,15486,128,15486,128,6270,192,60
DATA 225,0,8,8,255,0,195,15360,6289,30232,15520,25148,15488,16956,6272
DATA 26136,192,15360,225,0,8,8,255,0,15555,60,32401,6270,32416,15486,32384
DATA 15486,32384,6270,15552,60,225,0,8,8,255,0,15555,0,32401,6160,32416
DATA 15392,32384,15360,32384,6144,15552,0,225,0,8,8,255,0,255,15360,6399
DATA 32272,15614,32288,15614,32256,6398,32256,252,15360,225,0,8,8,255,0
DATA 0,0,255,-256,-1,-1,-1,-256,255,-256,0,0,255,0,8,8,255,0,192,0,159
DATA 7936,4031,16143,8127,16152,7359,16144,6334,15888,6332,15376,8,8,255
DATA 0,3,0,249,-2048,-3843,-784,-1795,-1008,14589,-1008,6269,31760,6205
DATA 15376,8,8,6332,15376,6334,15888,7359,16144,8127,16159,4031,16128,159
DATA 7936,192,0,255,0,8,8,6333,15376,6333,15376,6333,15376,6333,15376,6333
DATA 15376,6333,15376,6333,15376,6333,15376,8,8,6205,15376,6269,31760,14589
DATA -976,-1795,-800,-3843,-1024,249,-2048,3,0,255,0

REM $STATIC
SUB Ask (T$) : SHARED K$
  TR -1, 16, "^~X=ERASE text and start over"
  DO
    TR 6, 18, FNPad$(T$ + "_", 28)
    GetKey
    IF K$ >= " " AND LEN(K$) = 1 AND LEN(T$) < 28 THEN T$ = T$ + K$
    IF K$ = "BS" AND T$ > "" THEN T$ = FND$(T$)
    IF K$ = FNCTRL$("X") THEN T$ = ""
  LOOP UNTIL K$ = "CR" OR K$ = "ES"
  IF K$ = "ES" THEN T$ = ""
END SUB

SUB Center (A, A$) : SHARED ColFlip
  LOCATE , 40 - LEN(A$) \ 2
  ColFlip = A
  TTR A$
  PRINT
  PRINT
END SUB

SUB ChkErr : SHARED ErrFlag
  ErrFlag = 0
  ON ERROR GOTO ErrFound
END SUB

SUB DEC (N)
  N = N - 1
END SUB

FUNCTION FILELEN& (F$)
  F = FREEFILE
  OPEN "a", F, F$
  A& = LOF(F)
  IF A& = 0 THEN
    CLOSE F
    KILL F$
  ELSE
    CLOSE F
    FILELEN& = A&
  END IF
END FUNCTION

SUB GetKey : SHARED K$
' Hey there folks!  Let's leave source code for others that aren't a one-shot
' =only=for=this=one=program kinna thingy like my keyboard nipper here!
' Feel free to borrow just give credit to me somewhere in the source or
' documentation!
  Z$ = CHR$(0)
  DO
    K$ = INKEY$
  LOOP UNTIL K$ > ""
  IF K$ = CHR$(0) THEN K$ = K$ + INKEY$
  SELECT CASE K$
    CASE CHR$(27): K$ = "ES"
    CASE CHR$(9): K$ = "TA"
    CASE CHR$(13): K$ = "CR"
    CASE CHR$(8): K$ = "BS"
    CASE Z$ + "G": K$ = "HO"
    CASE Z$ + "H": K$ = "UP"
    CASE Z$ + "I": K$ = "PU"
    CASE Z$ + "K": K$ = "LF"
    CASE Z$ + "M": K$ = "RT"
    CASE Z$ + "O": K$ = "EN"
    CASE Z$ + "P": K$ = "DN"
    CASE Z$ + "Q": K$ = "PD"
    CASE Z$ + "R": K$ = "IN"
    CASE Z$ + "S": K$ = "DE"
    CASE Z$ + CHR$(15): K$ = "BT"
  END SELECT
  IF FNO$(K$) = Z$ THEN
    FOR I = 1 TO 26
      IF FNN$(ASC(FNZ$(K$))) = MID$("3048463218333435233637385049242516193120224717452144", I * 2 - 1, 2) THEN
        K$ = CHR$(128 + I): ' << we're gonna do a little icon!
        ' ^ Change this to:  K$="ALT-"+CHR$(64+I)
        ' if you wanna have K$ return back with the true keystroke
        ' but you knew that!
        EXIT FOR
      END IF
    NEXT
  END IF
' >> Leaving a Hot Key to exit anywhere in your program is nice!
  IF K$ = FNCTRL$("Q") THEN ShutDown
END SUB

SUB GetUKey : SHARED K$
  GetKey
  K$ = UCASE$(K$)
END SUB

SUB INC (N)
  N = N + 1
END SUB

SUB Main : SHARED K$, InsFlag, PadTR, DelFlag
  TR 0, 11, CHR$(128)
Main.2:
  IF FILELEN&("events.dat") = 0 THEN
    OPEN "o", 1, "events.dat"
    PRINT #1, FNNow$ + " I'm your first Event!"
    CLOSE 1
  END IF
  SHELL "sort events.dat>events2.dat"
  ' ^ This may not work outside Win98! ^
  KILL "events.dat"
  NAME "events2.dat" AS "events.dat"
  OPEN "i", 1, "events.dat"
  L = 0
  T2$ = T$
  WHILE EOF(1) = 0
    LINE INPUT #1, T$
    IF T2$ > "" AND T$ = T2$ THEN P = L
    INC L
  WEND
  CLOSE 1
  IF P >= L THEN P = L - 1
  IF P < 0 THEN P = 0
Main.3:
  LP = P
  InsFlag = 0
  DelFlag = 0
  TR 0, 11, CHR$(128)
  OPEN "i", 1, "events.dat"
  FOR I = 1 TO P - 8
    LINE INPUT #1, T$
  NEXT
  FOR I = -8 TO 8
    T$ = ""
    IF I + P >= 0 AND EOF(1) = 0 THEN
      LINE INPUT #1, T$
      IF I = 0 THEN CT$ = T$
    END IF
    IF T$ > "" THEN T$ = FNDate$(LEFT$(T$, 8)) + MID$(T$, 9)
    PadTR = 1
    TR 1, 11 + I, T$
  NEXT
  CLOSE 1
Main.4:
  GetUKey
  IF K$ = " " THEN
    T$ = CT$
    IF MID$(T$, 9, 1) = " " THEN
      MID$(T$, 9, 1) = CHR$(129)
    ELSE
      MID$(T$, 9, 1) = " "
    END IF
    Stor P, T$
    GOTO Main.2
  END IF
  IF K$ = "UP" OR K$ = "LF" THEN DEC P
  IF K$ = "DN" OR K$ = "RT" OR K$ = "CR" THEN INC P
  IF K$ = "PU" THEN P = P - 16
  IF K$ = "PD" THEN P = P + 16
  IF K$ = "HO" OR P < 0 THEN P = 0
  IF K$ = "EN" OR P > L - 1 THEN P = L - 1
  IF K$ = "DE" THEN
    TR 0, 11, " "
    Title "delete"
    TR -1, 10, FNDate$(LEFT$(CT$, 8))
    TR -1, 12, CHR$(34) + MID$(CT$, 10) + CHR$(34)
    TR -1, 14, STRING$(30, "-")
    TR -1, 16, "Really okay to " + CHR$(130) + "ZAP" + CHR$(130) + " it?"
    TR -1, 18, CHR$(128) + " {Y}es / {N}o"
    GetUKey
    IF K$ = "Y" THEN
      DelFlag = 1
      Stor P, ""
      GOTO Main.2
    END IF
    GOTO Main.3
  END IF
  IF K$ = "IN" OR K$ = "E" THEN
    TR 0, 11, " "
    IF K$ = "IN" THEN InsFlag = 1
    IF InsFlag = 1 THEN Title "insert" ELSE Title "edit"
    TR -1, 10, "Use all 4 arrow keys and"
    TR -1, 11, "{ENTER} to select date"
    TR -1, 12, "of appointment"
    IF InsFlag = 1 THEN D$ = FNNow$ ELSE D$ = LEFT$(CT$, 8)
    Y = VAL(LEFT$(D$, 4))
    M = VAL(MID$(D$, 5, 2))
    D = VAL(RIGHT$(D$, 2))
Main.Edit:
    D$ = FNZPad$(Y, 4) + FNZPad$(M, 2) + FNZPad$(D, 2)
    IF F$ = "" OR InsFlag = 1 THEN F$ = " "
    TR -1, 14, CHR$(128) + FNDate$(D$)
    GetKey
    IF K$ = "LF" THEN DEC D
    IF K$ = "RT" THEN INC D
    IF D < 1 THEN K$ = "UP"
    IF D > 31 THEN K$ = "DN"
    IF D < 1 OR K$ = "EN" THEN D = 31
    IF D > 31 OR K$ = "HO" THEN D = 1
    IF K$ = "UP" THEN DEC M
    IF K$ = "DN" THEN INC M
    IF M < 1 THEN DEC Y
    IF M > 12 THEN INC Y
    IF M < 1 OR K$ = "PD" THEN M = 12
    IF M > 12 OR K$ = "PU" THEN M = 1
    IF K$ <> "ES" AND K$ <> "CR" THEN GOTO Main.Edit
    IF K$ = "ES" THEN
      GOTO Main.3
    END IF
    TR 15, 14, " "
    IF InsFlag = 0 THEN T$ = MID$(CT$, 10) ELSE T$ = ""
    TR 5, 18, CHR$(128)
    Ask T$
    IF T$ > "" THEN
      T$ = D$ + F$ + T$
      Stor P, T$
      GOTO Main.2
    END IF
    LP = -1
  END IF
  IF K$ = "S" THEN
    TR 0, 11, " "
    Title "search"
    TR -1, 10, "What would you like"
    TR -1, 11, "to search for ?"
    TR -1, 13, "-Upper/Lowercase ignored-"
    TR -1, 14, STRING$(30, "-")
    T$ = ST$
    Ask T$
    IF T$ = "" THEN GOTO Main.3
    ST$ = T$
    LP = P
    P2 = P
    Title "search"
    TR -1, 14, "Searching . . ."
    OPEN "i", 1, "events.dat"
    FOR I = 1 TO P
      LINE INPUT #1, T$
    NEXT
    OK = 0
    WHILE OK <> 2
      LINE INPUT #1, T$
      IF INSTR(UCASE$(T$), UCASE$(ST$)) > 0 AND (OK = 1 OR P <> LP) THEN
        CLOSE 1
        GOTO Main.3
      END IF
      IF OK = 1 AND P = LP THEN OK = 2
      INC P
      IF P >= L THEN
        CLOSE 1
        OPEN "i", 1, "events.dat"
        IF OK = 0 THEN OK = 1
        P = 0
      END IF
    WEND
    CLOSE 1
    Title "error"
    TR -1, 12, "String Not Found!"
    TR -1, 14, CHR$(128) + " {OKAY}"
    ST$ = ""
    GetKey
    P = P2
    GOTO Main.3
  END IF
  IF K$ = "ES" THEN ShutDown
  IF P <> LP THEN GOTO Main.3 ELSE GOTO Main.4
END SUB

SUB Nano : SHARED TT!
  WHILE TIMER = TT!: WEND
  TT! = TIMER
END SUB

SUB NoChkErr : SHARED ErrFlaga
  ErrFlag = 0
  ON ERROR GOTO 0
END SUB

SUB PushWdw

END SUB

SUB RGB (N, R, G, B)
  OUT &H3C8, N
  OUT &H3C9, R
  OUT &H3C9, G
  OUT &H3C9, B
END SUB

SUB ShutDown : SHARED A$()
  TIMER OFF
  SCREEN 0, 1, 0, 0
  WIDTH 80
  COLOR 7, 0
  CLS
  PRINT STRING$(80, " ");
  LOCATE 10
  Center 1, A$(0)
  Center 5, A$(1)
  Center 4, A$(2)
  COLOR 7, 0
  LOCATE 23, 1, 1
  TT! = TIMER: WHILE (TIMER - TT! < 1 AND TIMER >= TT!) OR INKEY$ > "": WEND
  DO: LOOP UNTIL INKEY$ = ""
  DO: LOOP UNTIL INKEY$ > ""
  END
END SUB

SUB Startup : SHARED I.TR(), LastMin, LastDay
  CLS
  LOCATE 12, 32
  PRINT "Just A Moment ..."
  RESTORE FontData
  FOR I = 0 TO 127
    FOR J = 0 TO 17
      READ A
      I.TR(J, I) = A
    NEXT
  NEXT
  SCREEN 7
  RGB 3, 63, 50, 50: ' Gotta have our fleshtone for our pointing hand!
  LINE (0, 0)-(319, 199), 1, BF
  TR 15, 0, CHR$(127) + "reeware GrEvent v0.1 []"
  TR 0, 1, STRING$(40, "-")
  TR 0, 23, STRING$(40, "-")
  SHELL "dir>dir.___"
  OPEN "i", 1, "dir.___"
  WHILE EOF(1) = 0
    LINE INPUT #1, T$
  WEND
  CLOSE 1
  KILL "dir.___"
 
  A$ = MID$(T$, 18)
  ' ^ The position where we start to read the amount of disk space left ^
  ' This number may need to be "fudged" for operating systems other than
  ' Win98.

  T$ = ""
  FOR I = 1 TO LEN(A$)
    C$ = FNC$(A$, I)
    IF C$ <> "," THEN T$ = T$ + C$
  NEXT
  HDSpac! = VAL(T$) \ 100000

  ' Very gross error if we divide 721 by 10 in a longint& variable!
  ' HDSpac&=721:PRINT HDSpac&/10   'Yields a mess!
  ' So, we use variable HDSpac!  instead.

  TR 0, 24, "HD=" + MID$(STR$(HDSpac! / 10), 2) + "megs"
  TR -1, 20, "{INS}ert {E}dit {DEL}ete {S}earch"
  TR -1, 22, "{SPACE}=Mark {ESC}=Quit"
  LastMin = -1
  LastDay = -1
  TIMER ON
END SUB

SUB Stor (N, I$) : SHARED InsFlag, DelFlag
  OPEN "i", 1, "events.dat"
  OPEN "o", 2, "events2.dat"
  FOR I = 1 TO N
    LINE INPUT #1, T$
    PRINT #2, T$
  NEXT
  IF InsFlag = 0 THEN LINE INPUT #1, T$
  IF DelFlag = 0 THEN PRINT #2, I$
  WHILE EOF(1) = 0
    LINE INPUT #1, T$
    PRINT #2, T$
  WEND
  CLOSE
  KILL "events.dat"
  NAME "events2.dat" AS "events.dat"
END SUB

SUB Title (T$)
  FOR I = 1 TO LEN(T$)
    A$ = A$ + UCASE$(FNC$(T$, I))
    IF I < LEN(T$) THEN A$ = A$ + " "
  NEXT
  Wdw -1, 3, LEN(A$) + 4, 7
  Wdw -1, 8, 32, 19
  TR -1, 5, A$
END SUB

SUB TR (HH, V, T$) : SHARED I.TR(), PadTR
  H = HH
  IF H < 0 THEN H = 20 - LEN(T$) \ 2
  FOR I = 1 TO LEN(T$)
    PUT ((H + I - 1) * 8, V * 8), I.TR(0, ASC(FNC$(T$, I)) - 32), PSET
  NEXT
  IF PadTR = 1 THEN
    PadTR = 0
    LINE ((H + I - 1) * 8, V * 8)-(319, V * 8 + 7), 1, BF
  END IF
END SUB

SUB TTR (T$) : SHARED ColFlip
  FOR I = 1 TO LEN(T$)
    C$ = FNC$(T$, I)
    IF C$ = "_" THEN
      NextUp = 1
      INC I
      C$ = FNC$(T$, I)
      COLOR ColFlip + 8
    END IF
    IF C$ = "`" THEN C$ = CHR$(34)
    IF C$ < "A" OR I = 1 THEN COLOR ColFlip + 8: NextUp = 1
    IF NextUp = 1 THEN C$ = UCASE$(C$)
    PRINT C$;
    IF C$ <> " " THEN COLOR ColFlip: NextUp = 0
  NEXT
END SUB

SUB Wdw (HH, V, XX, Y)
  H = HH
  X = XX
  IF H < 0 THEN
    H = 20 - (X \ 2)
    X = H + X - 1
  END IF
  LINE (H * 8, V * 8)-(X * 8 + 7, Y * 8 + 7), 1, BF
  FOR I = V TO Y
    FOR J = H TO X
      C = 0
      IF I = V OR I = Y THEN C = 154
      IF J = H OR J = X THEN C = 158
      IF I = V AND J = H THEN C = 155
      IF I = V AND J = X THEN C = 156
      IF I = Y AND J = H THEN C = 157
      IF I = Y AND J = X THEN C = 159
      IF C > 0 THEN TR J, I, CHR$(C)
    NEXT
  NEXT
END SUB
