
; RH_REALTOTIME
;       Transforme le reel F en un STRING contenant une heure ex:
;       F=1.5   donne RH_REALTOTIME(F)='01:30:00'             

FUNCTION RH_REALTOTIME,F

IF F(0) GT 9 THEN S=STRMID(F(0) mod 24,6,2)+':' ELSE S='0'+STRMID(F(0),7,1)+':'
IF F(1) GT 9 THEN S=S+STRMID(F(1),6,2)+':' ELSE S=S+'0'+STRMID(F(1),7,1)+':'
IF F(2) GT 9 THEN S=S+STRMID(F(2),6,2)+'.' ELSE S=S+'0'+STRMID(F(2),7,1)+'.'    
IF F(3) GT 9 THEN S=S+STRMID(F(3),6,2) ELSE S=S+'0'+STRMID(F(3),7,1)    

RETURN,S
END 

;RH_TIMETOREAL
;       Transforme le STRING S en un FLOAT contenant une heure ex:
;       s='01:30:00'   donne RH_TIMETOREAL(S)=1.5
;       cette procedure verifie les passages a 24h si seuil=24, donc
;       si il y a passage a 24h et que F<MIN (MiN etant le minimum declare)
;       alors F=F-24             

FUNCtion RH_TIMETOREAL,S,SEUIL,MIN

H=FLOAT(STRMID(S,0,2))*1.
IF SEUIL EQ 24 AND H LT MIN THEN H=H+24
F=H+FLOAT(STRMID(S,3,2))/60.+FLOAT(STRMID(S,6,2))/3600.+$
		float(strmid(s,9,2))/360000.
RETURN,F
END 


;RH_STRTOTIME
;       Transforme le STRING S en un STRING contenant une heure dans un
;       format lisible par  ex:
;       s='1 3 00'   donne RH_STRTOTIME(s)='01:03:00'
       
FUNCTION RH_STRTOTIME,S

IF STRLEN(S) LT 3 THEN RETS='00:00:00.00' ELSE BEGIN
TCAR=['0','1','2','3','4','5','6','7','8','9']
N=STRLEN(S)
POSCAR=BYTARR(N)
NBC=0
FOR I=0,N-1 DO BEGIN
		    TS=STRMID(S,I,1)
		    TAB=WHERE(TCAR EQ TS,COUNT)
		    IF COUNT EQ 0 THEN BEGIN
					NBC=NBC+1
					POSCAR(NBC-1)=I
				       END
			END
IF NBC EQ 3 THEN POSCAR(3)=N
	H=0
	M=0
	SI=0    
	csi=0
IF POSCAR(0) GT 0 THEN H=FIX(FLOAT(STRMID(S,0,POSCAR(0))))
IF POSCAR(1)-POSCAR(0) GT 1 THEN $
	M=FIX(FLOAT(STRMID(S,POSCAR(0)+1,POSCAR(1)-POSCAR(0)-1)))    
IF POSCAR(2)-POSCAR(1) GT 1 THEN $
	SI=FIX(FLOAT(STRMID(S,POSCAR(1)+1,POSCAR(2)-POSCAR(1)-1)))    
IF POSCAR(3)-POSCAR(2) GT 1 THEN $
	CSI=FIX(FLOAT(STRMID(S,POSCAR(2)+1,POSCAR(3)-POSCAR(2)-1))) 
	RETS='' 
	IF H EQ 0 THEN RETS='00' ELSE $  
	IF H LT 10 THEN RETS='0'+STRMID(S,POSCAR(0)-1,1) ELSE $
			  RETS=STRMID(S,0,2)
	IF H GE 24 THEN BEGIN
			H=FIX(FLOAT(STRMID(S,0,2)))-24
IF H LT 10 THEN RETS='0'+STRMID(STRING(H),7,1) ELSE RETS=STRMID(STRING(H),6,2)
			END
	RETS=RETS+':'                                   
	IF M EQ 0 THEN RETS=RETS+'00' ELSE $                     
	IF M LT 10 THEN RETS=RETS+'0'+STRMID(S,POSCAR(1)-1,1) ELSE $
			 IF STRMID(S,POSCAR(0)+1,2) LE 59 THEN $
			RETS=RETS+STRMID(S,POSCAR(0)+1,2) ELSE RETS=RETS+'59'
	RETS=RETS+':'                  
	IF SI EQ 0 THEN RETS=RETS+'00' ELSE $                       
	IF SI LT 10 THEN RETS=RETS+'0'+STRMID(S,POSCAR(2)-1,1) ELSE $
		     IF STRMID(S,POSCAR(1)+1,2) LE 59 THEN $
			RETS=RETS+STRMID(S,POSCAR(1)+1,2) ELSE RETS=RETS+'59'
	
	RETS=RETS+'.'                  
	IF CSI EQ 0 THEN RETS=RETS+'00' ELSE $                       
	IF CSI LT 10 THEN RETS=RETS+'0'+STRMID(S,POSCAR(3)-1,1) ELSE $
		     RETS=RETS+STRMID(S,POSCAR(2)+1,2)
	
			END
RETURN,RETS
END

PRO rh_ftime_set_value, id, tvalue1

  
  tvalue=tvalue1
  ; Set the value of both the slider and the label
  ON_ERROR, 2                                           ;return to caller
  value=tvalue(0)*1.+tvalue(1)/60.+tvalue(2)/3600.+tvalue(3)/360000.
  stash = WIDGET_INFO(id, /CHILD)
  WIDGET_CONTROL, stash, GET_UVALUE=state

  IF TOTAL((TVALUE-STATE.TBOT)*[3600.,60.,1.,0.01]) LT 0 THEN $
		TVALUE(0)=TVALUE(0)+24  
;  IF TVALUE(0) GT 23 THEN TVALUE(0)=TVALUE(0)-24

  value=tvalue(0)*1.+tvalue(1)/60.+tvalue(2)/3600.+tvalue(3)/360000.
  
  nval=1000000. * (float(value) - state.bot) / (state.top - state.bot)

  if nval lt 0 or nval gt 1000000l then return

  WIDGET_CONTROL, state.slideid, SET_VALUE = nval
  IF (state.labelid NE 0) THEN $
	WIDGET_CONTROL, state.labelid, $
		SET_VALUE = RH_REALTOTIME(tvalue)

  WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY
END

FUNCTION rh_ftime_get_value, id
 
  ; Return the value of the slider
  ON_ERROR, 2                                           ;return to caller

  stash = WIDGET_INFO(id, /CHILD)
  WIDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY
  h=intarr(4)  

  if (state.labelid eq 0) then begin
    WIDGET_CONTROL, state.slideid, GET_VALUE = tmp
    ret = ((tmp / 1000000.) * (state.top - state.bot)) + state.bot
    WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY 
    h(0)=floor(ret)
    h(1)=floor((ret-h(0))*60.)
    h(2)=floor((ret-h(0))*3600.-h(1)*60.)    
    h(3)=floor((rey-h(0))*360000.-h(1)*6000.-h(2)*100.)
  endif else begin
    WIDGET_CONTROL, state.labelid, GET_VALUE = tmp
    WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY 
    h(0)=STRMID(tmp(0),0,2)
    h(1)=STRMID(tmp(0),3,2)
    h(2)=STRMID(tmp(0),6,2) 
    h(3)=STRMID(tmp(0),9,2)
  endelse
  return, h

END 

FUNCTION rh_ftslide_event, ev

  ; Retrieve the structure from the child that contains the sub ids
  parent=ev.handler
  stash = WIDGET_INFO(parent, /CHILD)
  WIDGET_CONTROL, stash, GET_UVALUE=state, /NO_COPY

  tvalue=intarr(4)

  ; See which widget was adjusted, the slider or the label

  if (ev.id eq state.slideid) then begin
    ; Get the non-adjusted value
    WIDGET_CONTROL, state.slideid, GET_VALUE = nonadj
    ; Compute the floating point value
    value = ((nonadj / 1000000.) * (state.top - state.bot)) + state.bot
    drag = ev.drag
    tvalue(0)=floor(value)
    tvalue(1)=floor((value-tvalue(0))*60.)
    tvalue(2)=floor((value-tvalue(0))*3600.-tvalue(1)*60.)
    tvalue(3)=floor((value-tvalue(0))*360000.-tvalue(1)*6000.-tvalue(2)*100.)    
    IF (TVALUE(0) GT 23) AND (STATE.TSEUIL EQ 24) THEN TVALUE(0)=TVALUE(0)-24
    IF VALUE EQ STATE.TOP THEN TVALUE=STATE.TTOP
    IF VALUE EQ STATE.BOT THEN TVALUE=STATE.TBOT
; Update label
    IF (state.labelid NE 0) THEN $
      WIDGET_CONTROL, state.labelid, SET_VALUE=RH_REALTOTIME(tvalue)

  endif else if (ev.id eq state.labelid) then begin
    WIDGET_CONTROL, state.labelid, GET_VALUE = tmp
    TS=RH_STRTOTIME(TMP(0))
    value = rh_timetoreal(tS,STATE.TSEUIL,STATE.BOT)
    IF value GT state.ToP THEN VALUE=STATE.TOP
    IF value LT STATE.BOT THEN VALUE=state.BOT
    ;Update the slider, set new value
    WIDGET_CONTROL, state.slideid, $
	SET_VALUE = 1000000. * $
		(value - state.bot) / (state.top - state.bot)

    drag = 0
    ; Update the label so it has desired format
    if (value eq state.top) then $
		WIDGET_CONTROL, state.labelid, SET_VALUE=RH_REALTOTIME(state.ttop)
    if (value eq state.bot) then $
		WIDGET_CONTROL, state.labelid, SET_VALUE=RH_REALTOTIME(state.tbot)
    if ((value ne state.top) and (value ne state.bot)) then $ 
		WIDGET_CONTROL, state.labelid,SET_VALUE=TS
	 
endif

  WIDGET_CONTROL, stash, SET_UVALUE=state, /NO_COPY
  RETURN, { ID:parent, TOP:ev.top, HANDLER:0L, VALUE:value, DRAG:drag }
END

FUNCTION rh_cw_time, parent, $
		  TITLE = title,  FRAME = frame, $
		  MINIMUM = tmin, MAXIMUM = tmax,$ 
                  XOFFSET = XOFFSET, YOFFSET = YOFFSET, $
		  VALUE = tval,   UVALUE = uval,$ 
                  XSIZE = XSIZE, SCROLL = SCROLL

;+
; NAME:
;       RH_CW_TIME
;
; PURPOSE:
;       Permet de selectionner rapidemment une heure a l'aide d'un
;       slider ou plus precisement manuellement.
;
; CALLING SEQUENCE:
;       widget = RH_CW_TIME(Parent)
;
; INPUTS:
;       Parent: ID du widget pere.
;
; KEYWORD PARAMETERS:
;       TITLE:          titre du widget, pas de titre par defaut.
;       FRAME:          bordure autour du widget, pas de bordure par defaut.
;       MINIMUM:        valeur minimum du slider, [0,0,0,0] par defaut.
;       MAXIMUM:        valeur maximum du slider, [23,59,59,99] par defaut. 
;	XOFFSET         offset en x, 0 par defaut.
;	YOFFSET:	offset en y, 0 par defaut.
;       VALUE:          valeur initiale du slider.
;       UVALUE:         user value du widget.
;
; OUTPUTS:
;       ID du widget cree.
;
; PROCEDURE:
;             Pour changer la valeur courante
;                  WIDGET_CONTROL, id, SET_VALUE=value 
;             Pour obtenir la valeur courante.
;                  WIDGET_CONTROL, id, GET_VALUE=var 
;
; MODIFICATION HISTORY:
;       28 Fevrier 1995 value represente une heure
;                       tvalue est un tableau de 4 entiers
;-

  IF (N_PARAMS() EQ 0) THEN MESSAGE, 'Incorrect number of arguments'

  ON_ERROR, 2                                           ;return to caller

  ; Defaults for keywords
  
IF NOT (KEYWORD_SET(frame)) THEN frame = 0
IF N_ELEMENTS(tmax) NE 4     THEN tmax = [24,0,0,0]
IF N_ELEMENTS(tmin) NE 4     THEN tmin = [0,0,0,0] 
max=tmax(0)*1.+tmax(1)/60.+tmax(2)/3600.+tmax(3)/360000.      
min=tmin(0)*1.+tmin(1)/60.+tmin(2)/3600.+tmin(3)/360000.  
IF MIN GT MAX THEN BEGIN
			SEUIL=24
			MAX=MAX+24.
		     END ELSE SEUIL=0
IF NOT (KEYWORD_SET(title)) THEN title = ""
IF NOT (KEYWORD_SET(XSIZE)) THEN XSIZE = 0
IF NOT (KEYWORD_SET(XOFFSET)) THEN XOFFSET = 0
IF NOT (KEYWORD_SET(YOFFSET)) THEN YOFFSET = 0
IF NOT (KEYWORD_SET(SCROLL)) THEN SCROLL = 10000
if SCROLL LT 10 then SCROLL = 100
IF NOT (KEYWORD_SET(uval))  THEN uval = 0
IF N_ELEMENTS(tval) EQ 0     THEN tval =tmin
val=(tval(0)*1.+tval(1)/60.+tval(2)/3600.+tval(3)/360000.) 

IF SEUIL EQ 24 AND VAL LT MIN THEN VAL=VAL+24

state = {slideid:0L, labelid:1L, top:max,bot:min, $
		ttop:tmax,tbot:tmin,TSEUIL:SEUIL }
 
version = WIDGET_INFO(/version)
newer_motif = (version.style eq 'Motif') and (version.release ne '1.0')
;xsize = 0
;ysize = 0
if (not (newer_motif)) then begin
;   xsize = 120
   IF (TITLE NE '') THEN ysize = 37           
endif

mainbase = WIDGET_BASE(parent, FRAME = frame, /COLUMN, $
           XOFFSET=XOFFSET, YOFFSET = YOFFSET,/BASE_ALIGN_CENTER,$
		XSIZE=XSIZE)

WIDGET_CONTROL, mainbase, SET_UVALUE = uval,EVENT_FUNC = 'rh_ftslide_event', $
	PRO_SET_VALUE='rh_Ftime_Set_Value', FUNC_GET_VALUE='rh_Ftime_GET_VALUE' 

IF (TITLE NE "") THEN l = WIDGET_LABEL(mainbase, VALUE = TITLE)

state.labelid = WIDGET_TEXT(mainbase, VALUE = rh_realtotime(tval), $
                XSIZE= 12, /edit)

state.slideid = WIDGET_SLIDER(mainbase, $
		XSIZE = xsize, YSIZE = ysize, $
		/SUPPRESS_VALUE, SCROLL = SCROLL*2, $
		MINIMUM = 0, MAXIMUM = 1000000, $
		VALUE = 1000000. * $
			(float(val) - state.bot) / $
			(state.top - state.bot))
 
WIDGET_CONTROL, WIDGET_INFO(mainbase, /CHILD), SET_UVALUE=state, /NO_COPY

RETURN, mainbase
END
