;+
; NAME:
;     WGETSATS
; PURPOSE:
;     WIDGET program to show geostationary satellite information, including
;     HA and DEC pointing coordinates.  What is shown in the table is the
;     average position over 24 h on today's date, along with total deviation
;     from that average position.  When a satellite is selected, its actual
;     position for the current time is also shown.  Uses data from GEO.TXT,
;     updated daily from http://www.celestrak.com/NORAD/elements/geo.txt.
;     Optionally, HA and DEC for the selected satellite, for the 24 hour
;     period, can be plotted.
; CATEGORY:
;     OVRO APC SCHEDULE
; CALLING SEQUENCE:
;     wgetsats,sat=sat
; INPUTS:
; OPTIONAL (KEYWORD) INPUT PARAMETERS:
;     sat   a pointer to a structure that contains information about the
;             selected satellite.
; ROUTINES CALLED:
; OUTPUTS:
; COMMENTS:
; SIDE EFFECTS:
; RESTRICTIONS:
; MODIFICATION HISTORY:
;     Written 10-Oct-2002 by Dale E. Gary
;     08-Jul-2004  DG
;       Added a line to sort the table according to HA of satellite.
;     17-Jan-2005  DG
;       Fixed the sorting business--I was to sort the structure, not
;       the table.
;-

PRO WGetSats_Event, Event

  base = Event.handler
  stash = WIDGET_INFO(base, /CHILD)
  WIDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY

  WIDGET_CONTROL,Event.Id,GET_UVALUE=Ev
  if (size(Ev,/type) ne 7) then Ev = Event.value

  CASE Ev OF
   'TAB_SEL': BEGIN
         if (Event.Type eq 4) then begin
            state.select = [Event.sel_left,Event.sel_top,$
                            Event.sel_right,Event.sel_bottom]
            (*state.pSAT).Name = ''
            if (state.select[0] eq 0 and state.select[2] eq 5) then begin
               ; This is a potentially good selection
               if (state.select[1] eq state.select[3]) then begin
                  row = state.select[1]
                  ; This is a valid selection
                  widget_control,state.TableId,get_value=satlist
                  if (state.ShowPlot eq 1) then begin
                     WIDGET_CONTROL,state.PlotiD,GET_VALUE=wid
                     wset,wid
                     ; Plot 24 hour path of satellite
                     sat = getsats(systime(/jul),/struct,num=state.Nums[row],/plot)
                  endif
                  ; Determine current HA and DEC for this satellite
                  sat = getsats(systime(/jul),/struct,num=state.Nums[row])
                  (*state.pSAT).name = sat[0].name
                  (*state.pSAT).HA  = sat[0].ha
                  (*state.pSAT).DEC = sat[0].dec
                  (*state.pSAT).Num = sat[0].Num
               endif
            endif
         endif
      END
   'Show Plot': BEGIN
         state.showplot = 1-state.showplot
         if (state.showplot eq 1) then begin
            PlotID = WIDGET_DRAW(state.CrossBase,XSIZE=210,YSIZE=200)
            WIDGET_CONTROL, PlotID, GET_VALUE=wid
            wset,wid
            erase,255
            state.PlotID = PlotID
         endif else begin
            WIDGET_CONTROL, state.PlotID, /DESTROY
            state.PlotID = 0L
         endelse
      END
   'C': BEGIN
         good = where(state.sat.bands eq 'C ' or state.sat.bands eq 'CK',ngood)
         if (ngood gt 0) then sat = state.sat[good]
         nsat = n_elements(sat)

         ; Put SATELLITE information into a nice tabular form for the table.
         table = strarr(6,nsat)
         row_labels = strarr(nsat)
         for i = 0, nsat-1 do begin
            row_labels[i] = string(sat[i].num,format='(I5)')
            table[0,i] = string(sat[i].ha,format='(F8.3)')
            table[1,i] = string(sat[i].dec,format='(F8.3)')
            table[2,i] = string(fix(sat[i].dha*1000),format='(I5)')
            table[3,i] = string(fix(sat[i].ddec*1000),format='(I5)')
            table[4,i] = sat[i].name
            table[5,i] = string(nint(sat[i].age/1440.),format='(I2)')
         endfor
         WIDGET_CONTROL,state.TableID,TABLE_YSIZE=nsat,SET_VALUE=table,ROW_LABELS=row_labels
         state.nums = row_labels
      END
   'K': BEGIN
         good = where(state.sat.bands eq 'K ' or state.sat.bands eq 'CK',ngood)
         if (ngood gt 0) then sat = state.sat[good]
         nsat = n_elements(sat)

         ; Put SATELLITE information into a nice tabular form for the table.
         table = strarr(6,nsat)
         row_labels = strarr(nsat)
         for i = 0, nsat-1 do begin
            row_labels[i] = string(sat[i].num,format='(I5)')
            table[0,i] = string(sat[i].ha,format='(F8.3)')
            table[1,i] = string(sat[i].dec,format='(F8.3)')
            table[2,i] = string(fix(sat[i].dha*1000),format='(I5)')
            table[3,i] = string(fix(sat[i].ddec*1000),format='(I5)')
            table[4,i] = sat[i].name
            table[5,i] = string(nint(sat[i].age/1440.),format='(I2)')
         endfor
         WIDGET_CONTROL,state.TableID,TABLE_YSIZE=nsat
         WIDGET_CONTROL,state.TableID,SET_VALUE=table
         WIDGET_CONTROL,state.TableID,ROW_LABELS=row_labels
         state.nums = row_labels
      END
   'C and K': BEGIN
         good = where(state.sat.bands eq 'CK',ngood)
         if (ngood gt 0) then sat = state.sat[good]
         nsat = n_elements(sat)

         ; Put SATELLITE information into a nice tabular form for the table.
         table = strarr(6,nsat)
         row_labels = strarr(nsat)
         for i = 0, nsat-1 do begin
            row_labels[i] = string(sat[i].num,format='(I5)')
            table[0,i] = string(sat[i].ha,format='(F8.3)')
            table[1,i] = string(sat[i].dec,format='(F8.3)')
            table[2,i] = string(fix(sat[i].dha*1000),format='(I5)')
            table[3,i] = string(fix(sat[i].ddec*1000),format='(I5)')
            table[4,i] = sat[i].name
            table[5,i] = string(nint(sat[i].age/1440.),format='(I2)')
         endfor
         WIDGET_CONTROL,state.TableID,TABLE_YSIZE=nsat
         WIDGET_CONTROL,state.TableID,SET_VALUE=table
         WIDGET_CONTROL,state.TableID,ROW_LABELS=row_labels
         state.nums = row_labels
      END
   'All': BEGIN
         sat = state.sat
         nsat = n_elements(sat)

         ; Put SATELLITE information into a nice tabular form for the table.
         table = strarr(6,nsat)
         row_labels = strarr(nsat)
         for i = 0, nsat-1 do begin
            row_labels[i] = string(sat[i].num,format='(I5)')
            table[0,i] = string(sat[i].ha,format='(F8.3)')
            table[1,i] = string(sat[i].dec,format='(F8.3)')
            table[2,i] = string(fix(sat[i].dha*1000),format='(I5)')
            table[3,i] = string(fix(sat[i].ddec*1000),format='(I5)')
            table[4,i] = sat[i].name
            table[5,i] = string(nint(sat[i].age/1440.),format='(I2)')
         endfor
         WIDGET_CONTROL,state.TableID,TABLE_YSIZE=nsat
         WIDGET_CONTROL,state.TableID,SET_VALUE=table
         WIDGET_CONTROL,state.TableID,ROW_LABELS=row_labels
         state.nums = row_labels
      END
   'EXIT_BUTTON': BEGIN
        (*state.pSat).Open = 0
        WIDGET_CONTROL, base, /DESTROY
        RETURN
      END
    ELSE:
  ENDCASE
WRITE_STATE:
  WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY

END

;--------------------------------------------------------------------------

PRO WGetSats, wBase, GROUP=Group, sat=pSAT

  IF N_ELEMENTS(Group) EQ 0 THEN GROUP=0

  SAT = {SAT,Name:'',HA:0.d,DEC:0.d,Open:1,Num:''}
  IF (n_elements(pSAT) NE 0) THEN *pSAT = SAT else pSat = ptr_new(SAT)

  IF (n_elements(wBase) eq 0) THEN BEGIN
      wBase = WIDGET_BASE(GROUP_LEADER=Group, $
                 COLUMN=1, $
                 MAP=1, XOFFSET=400,YOFFSET=278,$
                 TITLE='WGetSats : Geostationary Satellite Info', $
                 UVALUE='GetSatMain')
  ENDIF

  BASE2 = WIDGET_BASE(wBase, $
      COLUMN=1, $
      MAP=1, $
      TITLE='ExtraBase', $
      UVALUE='BASE2')

  Crossbase = WIDGET_BASE(wBase, ROW=1, MAP=1,TITLE='Crossbase')

  curtime = strmid(systime(),10,6)

  ; Get Julian date for today
  jd = systime(/jul)

  ; Convert to modified Julian date
  mjd = jd - 2400000.5D

  ; Get satellite list for today
  sat = getsats(jd,/struct)
  nsat = n_elements(sat)

  ; Sort the structure according to HA of satellite
  sat = sat[sort(sat.ha*1.0)]

  ; Put SATELLITE information into a nice tabular form for the table.
  table = strarr(6,nsat)
  row_labels = strarr(nsat)
  for i = 0, nsat-1 do begin
     row_labels[i] = string(sat[i].num,format='(I5)')
     table[0,i] = string(sat[i].ha,format='(F8.3)')
     table[1,i] = string(sat[i].dec,format='(F8.3)')
     table[2,i] = string(fix(sat[i].dha*1000),format='(I5)')
     table[3,i] = string(fix(sat[i].ddec*1000),format='(I5)')
     table[4,i] = sat[i].name
     table[5,i] = string(nint(sat[i].age/1440.),format='(I2)')
  endfor

  yr = strmid(systime(),20,4)
  doy = string(sysdoy(systime()),format='(I3.3)')
  timestr = ' Average Satellite Coordinates for '+yr+','+doy

  colbase = WIDGET_BASE(Crossbase,/COLUMN)
  titleBase = WIDGET_BASE(colBase,/ROW)

  font = 'Arial*20*Bold'
  clock = WIDGET_LABEL(titleBase,/dynamic_resize,FONT=font,VALUE=timestr,FRAME=1)
  font = !defaults.font
  X = WIDGET_BUTTON(titleBase,VALUE='X',UVALUE='EXIT_BUTTON')
  TableId = WIDGET_TABLE(ColBASE,VALUE=table,COLUMN_WIDTHS=[50,50,30,30,80,20],$;[70,40,100,70,70],$
       COLUMN_LABELS=['HA','Dec','dHA','dDec','NAME','Age'],ROW_LABELS=row_labels,$
       XSIZE=6,YSIZE=nsat,Y_SCROLL_SIZE=8,ALIGNMENT=1,UVALUE='TAB_SEL',$;FONT=font,
       /ALL_EVENTS)

  ButtonBase = WIDGET_BASE(ColBase,ROW=1,MAP=1)
  BandID = CW_BGROUP(ButtonBase,/EXCLUSIVE,['C','K','C and K','All'],$
      SET_VALUE=3, /ROW, /RETURN_NAME,/FRAME)
  ShowID = CW_BGROUP(ButtonBase,['Show Plot'],/NON,SET_VALUE=0, /COLUMN, /RETURN_NAME)

  WIDGET_CONTROL, wBase, /REALIZE

  state = {TableID:TableID,CLOCK:clock,JD:JD,pSat:pSat,select:[0,0,0,0],$
             sat:sat,Nums:row_labels,crossbase:crossbase,showplot:0b,plotID:0L}

  ; Connect the STATE structure to the first child of the base widget

  WIDGET_CONTROL, WIDGET_INFO(wBase, /CHILD), SET_UVALUE=state, /NO_COPY

  XMANAGER, 'WGetSats', wBase, /NO_BLOCK

END
