  OPTION SCALE, 96
  TITLE By Mac
  DIALOG CREATE, "Timer - Alarm", 0, @diff(@div(@sysinfo(SCREENWIDTH), 2), 100),200,20,ONTOP
  DIALOG ADD,BUTTON,Icon,0,168,32,20
  DIALOG ADD,BUTTON,ReSet,0,0,50,20,"Set/Stop"
  DIALOG ADD,BUTTON,OK,0,136,30,20
  DIALOG ADD,BUTTON,Start,0,120,30,20
  DIALOG ADD,BUTTON,Normal,0,0,74,20,"Normal Alarm"
  DIALOG ADD,BUTTON,Periodic,0,76,90,20,"Periodic Alarm"
  DIALOG ADD,TEXT,Status,4,52,,,""

  DIALOG ADD,COMBO,Hour,0,0,36,,,LIST
  DIALOG ADD,COMBO,Minute,0,36,40,,,LIST
  DIALOG ADD,COMBO,AMPM,0,76,40,,,LIST
  DIALOG ADD,TASKICON,TaskBar,," Mac's Timer "
  DIALOG SHOW

  rem -- Load hours and minutes --
  %x = 0
  REPEAT 
    if @greater(10, %x)
      %x = "0"%x
    end 
    if @greater(13, %x)
      if @greater(%x, 0)
        LIST ADD, Hour, %x
      end 
    end 
    LIST ADD, Minute, ":"%x
    %x = @succ(%x)
  UNTIL @greater(%x, 59)

  rem -- Load am and pm --
  LIST ADD, AMPM, "am"
  LIST ADD, AMPM, "pm"

  rem -- Seek to display current hour, minute, am/pm --
  PARSE "%h;%m;%a", @datetime(hh|nn|am/pm)
  LIST SEEK, Hour, @diff(%h, 1)
  LIST SEEK, Minute, %m
  if @match(AMPM, %a)
    rem -- Find correct am or pm --
  end 

  GOSUB HideCOMBO
  GOSUB ShowReset

:EVLOOP
  %%loop = EVLOOP
  WAIT EVENT
  Parse "%e;%d", @event(d)
  goto %e

:TIMERLOOP
  WAIT EVENT, 1
  Parse "%e;%d", @event(d)
  goto %e

:TIMER
  PARSE "%%currenthour", @datetime(hh|am/pm)
  if %%periodic
    if @equal(%%currenthour, %%alarmtime)
      %%alarmtime = @sum(%%currenthour, %%between)
      rem -- Adjust if %%alarmtime over 12 --
      if @greater(%%alarmtime, 12)
        %%alarmtime = @diff(%%alarmtime, 12)
      end 
      if @not(@winexists("Timer Notice"))
        GOSUB CreateChild
      end 
      if @file(alarm.wav)
        PLAY alarm.wav
        WAIT 
        PLAY alarm.wav
      end 
    end 
  else 
    rem -- Normal alarm --
    DIALOG SET, Status, %t - @datetime(hh:nn:ss am/pm)
    rem -- Check for same hour and same or greater minute --
    if @equal(%h, %%currenthour)
      if @equal(@datetime(nn), %m)@greater(@datetime(nn), %m)
        if @not(@winexists("Timer Notice"))
          GOSUB CreateChild
        end 
        if @file(alarm.wav)
          PLAY alarm.wav
        end 
      end 
    end 
  end 
  goto TIMERLOOP

:TaskBarCLICK
  DIALOG SELECT, 0
  DIALOG SHOW
  goto %%loop

:IconBUTTON
  DIALOG SELECT, 0
  DIALOG HIDE
  goto %%loop

:StartBUTTON
  %h = @dlgtext(Hour)
  %m = @substr(@dlgtext(Minute),2,3)
  %a = @dlgtext(AMPM)
  %t = %h:%m" "%a
  GOSUB HideCOMBO
  %%loop = TIMERLOOP
  goto %%loop

:ReSetBUTTON
  %%periodic = ""
  %%between = ""
  GOSUB HideReset
  if @winexists("Timer Notice")
    DIALOG SELECT, 1
    DIALOG CLOSE
    DIALOG SELECT, 0
    %e = @event()
  end 
  goto EVLOOP

:OKBUTTON
  if @not(%%between)
    %%between = @dlgtext(Hour)
    DIALOG SET, Status, "Hour to start?"
  else 
    %%alarmtime = @dlgtext(Hour)
    DIALOG SET, Status, On %%between hrs - Start %%alarmtime:00
    GOSUB HideCOMBO
    %%loop = TIMERLOOP
    goto %%loop
  end 
  goto EVLOOP

:NormalBUTTON
  %%periodic = ""
  %%between = ""
  GOSUB ShowCOMBO
  goto EVLOOP

:PeriodicBUTTON
  %%periodic = 1
  DIALOG SET, Status, "Hours between?"
  GOSUB ShowHour
  goto EVLOOP

:CLOSE
  if @greater(%d, 0)
    DIALOG SELECT, %d
    DIALOG CLOSE
  else 
    EXIT 
  end 
  rem -- Kill any extra events --
  %e = @event()
  rem -- If periodic, continue running --
  if %%periodic
    goto %%loop
  else 
    DIALOG SELECT, 0
    DIALOG SHOW
    goto ReSetBUTTON
  end 

  rem -- GOSUB --------------------------

:CreateChild
  DIALOG CREATE,"Timer Notice",-1,0,200,20,NOMIN,ONTOP
  DIALOG ADD,TEXT,D2Tx1,3,5,,,"Timer alarm activated at "@datetime(hh:nn:ss am/pm)
  DIALOG SHOW
  DIALOG SELECT, 0
  exit 

:HideCOMBO
  DIALOG HIDE, OK
  DIALOG HIDE, Start
  DIALOG HIDE, Hour
  DIALOG HIDE, Minute
  DIALOG HIDE, AMPM
  DIALOG SHOW, ReSet
  DIALOG SHOW, Status
  exit 

:ShowCOMBO
  DIALOG HIDE, Normal
  DIALOG HIDE, Periodic
  DIALOG HIDE, ReSet
  DIALOG HIDE, Status
  DIALOG SHOW, Start
  DIALOG SHOW, Hour
  DIALOG SHOW, Minute
  DIALOG SHOW, AMPM
  exit 

:ShowHour
  DIALOG HIDE, Normal
  DIALOG HIDE, Periodic
  DIALOG HIDE, ReSet
  DIALOG SHOW, Hour
  DIALOG SHOW, OK
  exit 

:ShowReset
  DIALOG HIDE, Normal
  DIALOG HIDE, Periodic
  DIALOG SHOW, ReSet
  exit 

:HideReset
  DIALOG CLEAR, Status
  DIALOG HIDE, ReSet
  DIALOG SHOW, Normal
  DIALOG SHOW, Periodic
  exit 
