function id2png,hxtd,dir
z='200'+strtrim(string(hxtd.id_number),2)
i=byte('/')
z=byte(z)
z(9)=z(7) &z(8)=z(6) &z(6)=z(5) & z(5)=z(4) &z(4)=i(0) &z(7)=i(0)
z=string(z)
x=dir+'/'+z+'/'
n=strlen(x)
i=findfile(x+'hsi*_rate.png')
if i(0) eq '' then return,''
j=str2sec(strmid(i,n+13,6),/nospace)
k=hxtd.start_time mod 86400.
k=where(j le k)
if k(0) lt 0 then return,i(1)
return,i(k(n_elements(k)-2>0))
end

function data2id,data,i
reads,data(0),yy,mm,dd,format='(2x,i2,1x,i2,1x,i2)'
x=yy*1000000L+mm*10000L+dd*100+i
return,x
end

function hessi2str,data
n=n_elements(data)-1
x=strarr(n+1)
j=bytarr(12) &j(*)=32 
for i=0,n do begin
 x(i)='200'+strtrim(string(data(i).id_number),2)+'  '
; x(i)=x(i)+'dd-mmm-yyyy'+' '
 x(i)=x(i)+sec2hms(data(i).start_time mod 86400.)+'  '
 x(i)=x(i)+sec2hms(data(i).peak_time mod 86400.)+'  '
 x(i)=x(i)+sec2hms(data(i).end_time mod 86400.)+'  '
 x(i)=x(i)+string(long(data(i).end_time-data(i).start_time))+' '
 x(i)=x(i)+string(long(data(i).peak_countrate))+' '
 x(i)=x(i)+string(long(data(i).total_counts))
 z=strtrim(string(fix(data(i).energy_hi)),2)
 z=z(0)+'-'+z(1)
 k=string(j)
 i0=12-strlen(z)
 strput,k,z,i0
 x(i)=x(i)+k
end
if n eq 0 then x=x(0)
return,x
end


	pro xhessilist_event,ev

common hessi_bd, pngdb, flarelist, dbwin, chlist, cpimg


WIDGET_CONTROL,ev.id,GET_UVALUE = wuv, /hour

i=where(dbwin.kev eq ev.id)
if i(0) gt 0 then dbwin.kstat(i)=ev.select

CASE wuv OF

"QUIT"	:	begin	
	WIDGET_CONTROL,ev.top,/DESTROY
	if (findfile('idl.ps'))(0) ne '' then file_delete,'idl.ps'
		end

"SAVE"	:	begin
	if chlist(0) lt 0 then return
	file=dialog_pickfile(/write)
	if file eq '' then return
	openw, lun, file, /get
	ltmp=hessi2str(flarelist(chlist))
	n=n_elements(ltmp)
	printf,lun,string(n)+' flares selected'
	i='  Flare       Start     Peak      End              Dur'
	i=i+'         Peak        Total      Energy'
	printf,lun,i
	i=' date+N       time      time      time               s'
	i=i+'          c/s       Counts         keV'
	printf,lun,i
	for j=0, n-1 do printf, lun, ltmp(j)
	free_lun, lun
		end


"CALC" :	begin
	chlist=lindgen(n_elements(flarelist))
	widget_control,dbwin.bdate,get_val=bdate
	minid=data2id(bdate,0)
	widget_control,dbwin.edate,get_val=edate
	maxid=data2id(edate,99)
	widget_control,dbwin.btime,get_val=btime
	mintime=str2sec(strtrim(btime,2))
	widget_control,dbwin.etime,get_val=etime
	maxtime=str2sec(strtrim(etime,2))
	widget_control,dbwin.bdur,get_val=mindur
	mindur=double(mindur(0))
	widget_control,dbwin.edur,get_val=maxdur
	maxdur=double(maxdur(0))
	widget_control,dbwin.bpeak,get_val=minpeak
	minpeak=float(minpeak(0))
	widget_control,dbwin.epeak,get_val=maxpeak
	maxpeak=float(maxpeak(0))
;--------------------
	i=where(flarelist(chlist).id_number ge minid)
	if i(0) lt 0 then begin &chlist=-1& goto,hxtstr& end
	chlist=chlist(i)
	i=where(flarelist(chlist).id_number le maxid)
	if i(0) lt 0 then begin &chlist=-1& goto,hxtstr& end
	chlist=chlist(i)

	i=where((flarelist(chlist).start_time mod 86400.) ge mintime)
	if i(0) lt 0 then begin &chlist=-1& goto,hxtstr& end
	chlist=chlist(i)
	i=where((flarelist(chlist).end_time mod 86400.) le maxtime)
	if i(0) lt 0 then begin &chlist=-1& goto,hxtstr& end
	chlist=chlist(i)

	z=flarelist(chlist).end_time - flarelist(chlist).start_time
	i=where((z mod 86400.) ge mindur)
	if i(0) lt 0 then begin &chlist=-1& goto,hxtstr& end
	chlist=chlist(i)
	z=flarelist(chlist).end_time - flarelist(chlist).start_time
	i=where((z mod 86400.) le maxdur)
	if i(0) lt 0 then begin &chlist=-1& goto,hxtstr& end
	chlist=chlist(i)

	i=where(flarelist(chlist).peak_countrate le maxpeak)
	if i(0) lt 0 then begin &chlist=-1& goto,hxtstr& end
	chlist=chlist(i)
	i=where(flarelist(chlist).peak_countrate ge minpeak)
	if i(0) lt 0 then begin &chlist=-1& goto,hxtstr& end
	chlist=chlist(i)

hxtstr:
	if chlist(0) ge 0 then begin
	 ltmp=hessi2str(flarelist(chlist))
	 widget_control,dbwin.list,set_val=ltmp
	 z=string(n_elements(chlist))+' flares found'
	end else z='No FLARE for this selection' 
	widget_control,dbwin.status,set_val=z
		end

"PLOT" :	begin
	i=widget_info(dbwin.list,/list_select)
	if i lt 0 then return
	z=id2png(flarelist(chlist(i)),pngdb)
	widget_control,dbwin.status,set_val=z
	if query_image(z) eq 1 then array=read_image(z,rr,gg,bb) else return
	cpimg=z
	window,7,xs=640,ys=480,ret=2,titl=z
	z=array
	array(*)=255
	i=where(z eq 255)
	if i(0) ge 0 then array(i)=0
	for j=0,8 do begin
	 if dbwin.kstat(j) ne 0 then begin
	  i=where(z eq j+1)
	  if i(0) ge 0 then array(i)=j+1
	 end
	end
	i=where(array eq 1)
	if i(0) ge 0 then array(i)=0
	tvlct,rr,gg,bb
	tv,array
		end
"PRNT" :	begin
	if cpimg eq '' then return
	if query_image(cpimg) eq 1 then array=read_image(cpimg,rr,gg,bb) $
	else return
	z=array
	array(*)=255
	i=where(z eq 255)
	if i(0) ge 0 then array(i)=0
	for j=0,8 do begin
	 if dbwin.kstat(j) ne 0 then begin
	  i=where(z eq j+1)
	  if i(0) ge 0 then array(i)=j+1
	 end
	end
	i=where(array eq 1)
	if i(0) ge 0 then array(i)=0
	set1ps,/nocol
	tvlct,rr,gg,bb
	fitstvscl,array,/asp,/tv,psgrid=640,/noint,/notick,tickl=1e-5
	set_ps,0
	widget_control,dbwin.lpr,get_val=z
	widget_control,dbwin.status,set_val='Print image by the next command: '+z(0)
	spawn,z+' idl.ps'
		end

"COPY" :	begin
	if cpimg eq '' then return
	z=dialog_pickfile(/dir)
	if z ne '' then spawn,'cp '+cpimg+' '+z
		end

ELSE:

ENDCASE

end



   pro xhessilist,fitsname=fitsname,metadata=metadata
print,'Usage: xhessilist,[fitsname=fitsname,metadata=metadata,lpr=lpr]'
print,'       fitsname - name of the database FITS file'
print,'       metadata - root directory of the RHESSI metadata'

common hessi_bd, pngdb, flarelist, dbwin, chlist,cpimg
chlist=-1
cpimg=''

dbwin={cbase:0L, list:0L, bdate:0L, edate:0L, btime:0L, etime:0L, $
 edur:0L, bdur:0L, epeak:0L, bpeak:0L, status:0L, lpr:0L,kev:lonarr(9),kstat:intarr(9)}
dbwin.kstat(*)=1

if n_elements(fitsname) ne 0 then nfits=fitsname(0) $
	else nfits='/solardb/rhessi/dbase/hessi_flare_list.fits'

if n_elements(metadata) ne 0 then pngdb=metadata(0) $
	else pngdb='/solardb/rhessi/metadata'

flarelist=mrdfits(nfits,3,i,status=j,/sil)
if j lt 0 then return
j=fxpar(i,'EXTNAME')
if string(j) ne 'HSI_FLARELISTDATA' then return


IF(XRegistered("xhessilist") NE 0) THEN return


	device,get_scr=scr



dbwin.cbase= widget_base(title='HESSI Flare List', /column)

menubase=widget_base(dbwin.cbase, /row)

button=widget_button(menubase, val="QUIT", uval="QUIT")

mbase=widget_base(dbwin.cbase, /row,/frame)

menubase=widget_base(mbase, /column,/frame)
button=widget_label(menubase,val='Start date')
dbwin.bdate=widget_text(menubase, val='2002-03-01',/edit,uval='e')
button=widget_label(menubase,val='End date')
dbwin.edate=widget_text(menubase, val='2002-12-31',/edit,uval='e')

menubase=widget_base(mbase, /column,/frame)
button=widget_label(menubase,val='Start time')
dbwin.btime=widget_text(menubase, val='00:00:00',/edit,uval='e')
button=widget_label(menubase,val='End time')
dbwin.etime=widget_text(menubase, val='24:00:00',/edit,uval='e')

menubase=widget_base(mbase, /column,/frame)
button=widget_label(menubase,val='Min duration')
dbwin.bdur=widget_text(menubase, val='0',/edit,uval='e')
button=widget_label(menubase,val='Max duration')
dbwin.edur=widget_text(menubase, val='1000',/edit,uval='e')

menubase=widget_base(mbase, /column,/frame)
button=widget_label(menubase,val='Min peak counts')
dbwin.bpeak=widget_text(menubase, val='0',/edit,uval='e')
button=widget_label(menubase,val='Max peak counts')
dbwin.epeak=widget_text(menubase, val='1000',/edit,uval='e')

menubase=widget_base(mbase, /column)
button=widget_button(menubase, val="Run request", uval="CALC")
button=widget_button(menubase, val="Save As Text", uval="SAVE")

menubase=widget_base(dbwin.cbase, /row)
button=widget_button(menubase, val="View Time profile", uval="PLOT")
button=widget_button(menubase, val="Copy Image ...", uval="COPY")
button=widget_button(menubase, val="Print time profile", uval="PRNT")
button=widget_label(menubase,/ALIGN_LEFT, val=' Print command :')
dbwin.lpr=widget_text(menubase, val='lpr',/edit,uval='e')

menubase=widget_base(dbwin.cbase, /row,/nonexc,title='print options',/frame)
dbwin.kev[0]=widget_button(menubase, val='3-6keV', uval="k3")
dbwin.kev[1]=widget_button(menubase, val='6-12keV', uval="k6")
dbwin.kev[2]=widget_button(menubase, val='12-25keV', uval="k12")
dbwin.kev[3]=widget_button(menubase, val='25-50keV', uval="k25")
dbwin.kev[4]=widget_button(menubase, val='50-100keV', uval="k50")
dbwin.kev[5]=widget_button(menubase, val='100-300keV', uval="k100")
dbwin.kev[6]=widget_button(menubase, val='300-800keV', uval="k300")
dbwin.kev[7]=widget_button(menubase, val='0.8-7MeV', uval="k800")
dbwin.kev[8]=widget_button(menubase, val='7-20MeV', uval="k7000")
widget_control,menubase,/set_butt

i='  Flare       Start     Peak      End               Dur'
i=i+'         Peak        Total      Energy'
button=widget_label(dbwin.cbase,/ALIGN_LEFT, val=i)
i=' date+N       time      time      time                s'
i=i+'          c/s       Counts         keV'
button=widget_label(dbwin.cbase,/ALIGN_LEFT, val=i)
i=hessi2str(flarelist)
dbwin.list = WIDGET_list(dbwin.CBASE,/frame, value=i,uval='LIST',ysize=20)
dbwin.status=widget_label(dbwin.cbase,/ALIGN_LEFT, val=' ',/dynamic_res)
WIDGET_CONTROL, dbwin.cbase, /realize, /hourglass


xmanager,'xhessilist', dbwin.CBASE, GROUP_LEADER = GROUP_LEADER, /no_block

end
