;+
; NAME:
;    WIMAGR
; PURPOSE:
;     User-friendly interface for producing OVSA radio maps based on the imagr.prgridso code.
; CATEGORY:
;     OVSA APC CALIBRATION ANALYSIS
; CALLING SEQUENCE:
;     WIMAGR
; INPUTS:
; OPTIONAL (KEYWORD) INPUT PARAMETERS:
;
; ROUTINES CALLED:
; imagr
;
; OUTPUTS:
; COMMENTS:
; SIDE EFFECTS:
; RESTRICTIONS:
; MODIFICATION HISTORY:
;     Written 2003 Gelu M. Nita
;     February 2004 GN
;     Added features allowing for more options regarding the cleaning box and reference maps.
;	  April 2007 SDT
;	  Added the roi tag to allow the user to use the new cleaning routines. Retained capability
;	  of using clbox.
;	  27-Jul-2010  DG
;	     Added emply freq list for case where no freq list is available on startup.
;	  14-Mar-2014  DG
;	     Changed some routine names by appending ovsa_ to avoid potential conflict with the copies of the original
;      routines located in the ssw\hessi tree
;	-
@OVSA_BASELINE_SELECTOR
@OVSA_FREQUENCY_SELECTOR
@OVSA_TIME_SELECTOR

function first,x
 return,x[0]
end

function last,x
 return,x[n_elements(x)-1]
end




pro wimagr_event,event

   ; Read the state structure from the child base
   base = event.handler
   stash = widget_info(base,/child)
   widget_control,stash,get_uvalue=state
   IF (TAG_NAMES(Event, /STRUCTURE_NAME) EQ 'WIDGET_TIMER') THEN BEGIN
    auto,state
    return
   END  
         inp=state.inp
;        inuvfile=state.inp.inuvfile
;        tbegstr=state.inp.tbegstr
;        tendstr=state.inp.tendstr
;        bif=state.inp.bif
;        eif=state.inp.eif
;        bit=state.inp.bit
;        eit=state.inp.eit
;        poln=state.inp.poln
;        imsiz=state.inp.imsiz
;        cellsiz=state.inp.cellsiz
;        niter=state.inp.niter
;        clgain=state.inp.clgain
;        clstop=state.inp.clstop
;        methodstr=state.inp.method
;        outfile=state.inp.outfile
;        clbox=state.inp.clbox
;        xroi=state.inp.xroi
;        yroi=state.inp.yroi
;        selector=state.inp.selector
;        selected_freq=state.inp.selected_freq
;        selected_time=state.inp.selected_time
;        inverted_time=state.inp.inverted_time
;        offset=state.inp.offset
;        cpixlock=state.inp.cpixlock
;        boxscale=state.inp.boxscale
;        refcellsiz=state.inp.refcellsiz
        ;Just for compatibility with IMGR
        ;-------------------------------------------------------------------------------------
        dowhatstring=['D','C','S','M','F']
        methodstring=['DIRTY MAP','CLEAN MAP','CLEAN + SelfCal','CLEAN + MEM','CLEAN + FwdFit']
        dowhat=dowhatstring[where(methodstring eq state.inp.method)]
        dowhat=dowhat[0]
        ;--------------------------------------------------------------------------------------

;   CATCH, Error_status
;   IF Error_status NE 0 THEN BEGIN
;     ans=DIALOG_MESSAGE(!ERROR_STATE.MSG,/error,display_name='WQUERY_EVENT')
;     CATCH,/CANCEL
;     widget_control,state.wtop,sensitive=1
;     goto,write_state
;   ENDIF

   ev=widget_info(event.id,/uname)

   ;If Quit
   IF (TAG_NAMES(Event, /STRUCTURE_NAME) EQ $
                            'WIDGET_KILL_REQUEST') THEN BEGIN
   answ=dialog_message('Do you want to exit WIMAGR?',/question)
   if strupcase(answ) eq 'NO' then goto,write_state
     WIDGET_CONTROL, Event.top, /DESTROY
     ptr_free,state.cal
     obj_destroy,state.refmaps
     ptr_free,state.map
     save,filename='imagr.inp',inp
;     inuvfile,tbegstr,tendstr,poln,Bif,Eif,bit,eit, $
;     imsiz,cellsiz,clbox,niter,clgain,clstop,dowhat,methodstr,outfile, $
;     xroi,yroi,selector,selected_freq,selected_time,inverted_time,offset,cpixlock,boxscale,refpixsz
     ptr_free,inp.xroi,inp.yroi,inp.selected_freq,inp.selected_time
     heap_gc
     RETURN
   ENDIF

   ;UPDATE text fields
   IF (TAG_NAMES(Event, /STRUCTURE_NAME) EQ $
                            'WIDGET_KBRD_FOCUS') THEN BEGIN
    if event.enter eq 0 then begin
    Widget_Control,event.id,Get_Value=text
    case strupcase(ev) of

     'IMSIZ':BEGIN
              widget_control,event.id,GET_VALUE=text
              imsiz=fix(text)
              text=strcompress(string(imsiz),/remove_all)
              state.inp.imsiz=text
              widget_control,event.id,Set_VALUE=text
             END
     'NITER':BEGIN
              widget_control,event.id,GET_VALUE=text
              niter=fix(text)
              text=strcompress(string(niter),/remove_all)
              state.inp.niter=text
              widget_control,event.id,Set_VALUE=text
             END
     'CMIN':BEGIN
              widget_control,event.id,GET_VALUE=text
              cmin=float(text)
              text=strcompress(string(cmin,format='(f3.1)'),/remove_all)
              state.inp.clstop=text
              widget_control,event.id,Set_VALUE=text
             END
     'CGAIN':BEGIN
              widget_control,event.id,GET_VALUE=text
              cgain=float(text)
              text=strcompress(string(cgain,format='(f5.2)'),/remove_all)
              state.inp.clgain=text
              widget_control,event.id,Set_VALUE=text
             END 
     'CPIX':BEGIN
             widget_control,event.id,GET_VALUE=text
             cpix=float(text)
             state.inp.cellsiz=cpix
             widget_control,event.id,Set_VALUE=text
           END         
     'XOFF':BEGIN
             xoff=float(text)
             widget_control,event.id,Set_VALUE=string(xoff)
             widget_control,widget_info(state.wtop,find_by_uname='yoff'),get_value=yoff
             offset=float([xoff,yoff])
             state.inp.offset=offset
             if state.off then begin
               display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
               wimagr_tp_draw,state
             end
            END 
     'YOFF':BEGIN
            yoff=float(text)
            widget_control,event.id,Set_VALUE=string(yoff)
            widget_control,widget_info(state.wtop,find_by_uname='xoff'),get_value=xoff
            offset=float([xoff,yoff])
            state.inp.offset=offset
            if state.off then begin
              display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
              wimagr_tp_draw,state
            end   
          END                     
    ELSE:
    endcase
    end
   ENDIF

   CASE strupcase(Ev) OF
    
    'OFF':BEGIN
             state.off=event.select
             display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
             wimagr_tp_draw,state
         END
          
    
    'INPOPEN':BEGIN
               inpfile=dialog_pickfile(filter='*.inp',/must)
               if inpfile ne '' then begin
                 WIDGET_CONTROL, Event.top, /DESTROY
			     ptr_free,state.cal
			     obj_destroy,state.refmaps
			     ptr_free,state.map
			     save,filename='imagr.inp',inp
;			     inuvfile,tbegstr,tendstr,poln,Bif,Eif,bit,eit, $
;			     imsiz,cellsiz,clbox,niter,clgain,clstop,dowhat,methodstr,outfile, $
;			     xroi,yroi,selector,selected_freq,selected_time,inverted_time
			     ptr_free,inp.xroi,inp.yroi,inp.selected_freq,inp.selected_time
			     heap_gc
                 wimagr,inpfile
                 RETURN
               end
              END
    'INPSAVE':BEGIN
               inpfile=dialog_pickfile(filter='*.inp',/write,/overwrite)
               if inpfile ne '' then begin
                 save,filename=inpfile,inp
;                 inuvfile,tbegstr,tendstr,poln,Bif,Eif,bit,eit, $
;			           imsiz,cellsiz,clbox,niter,clgain,clstop,dowhat,methodstr,outfile, $
;			           xroi,yroi,selector,selected_freq,selected_time,inverted_time,offset,cpixlock
               end
              END
    'OPEN':BEGIN
            inuvfile=dialog_pickfile(filter='*.uv')
            if inuvfile ne '' then begin
                widget_control,event.top,update=0,/hourglass
                state.inp.inuvfile=inuvfile
                widget_control,state.wtop,TLB_SET_TITLE ='wIMAGR '+inuvfile
                restore,inuvfile
                ptr_free,state.cal
                state.cal=ptr_new(cal)
                freq=strarr(n_elements(cal.f))
                freq[*]=strcompress(string(cal.f[*],format='(f5.1)'),/remove_all)
                time=3.6e6*cal.t
                tp=total(real_part(sqrt(cal.tp*conj(cal.tp))),2,/nan)
                ptr_free,state.lc

                state.lc=ptr_new({time:time/1000,tp:tp})
                nt=n_elements(time)
                state.inp.bit=(nt)/2
                state.inp.eit=(nt)/2
                tbegstr=msec2str(time[state.inp.bit])
                tendstr=msec2str(time[state.inp.eit])
                state.inp.tbegstr=tbegstr
                state.inp.tendstr=tendstr

                if n_elements(aatab) eq 0 then begin
                 dim=size(cal.uv,/dim)
                 aatab=[1,2,4,5,6,7,8]
                 if dim[1] lt 21 then aatab[6]=255
                 if dim[1] lt 15 then aatab[5]=255
                end
                wbaseline=widget_info(state.wtop,find_by_uname='BASELINE_SELECTOR')
                wBaselineBase=widget_info(wbaseline,/parent)
                widget_control,wbaseline,/destroy

                wfreq=widget_info(state.wtop,find_by_uname='FREQUENCY_SELECTOR')
                wFreqBase=widget_info(wfreq,/parent)
                widget_control,wfreq,/destroy

                state.inp.bif=(n_elements(freq))/2
                state.inp.eif=(n_elements(freq))/2
                ptr_free,state.inp.selected_freq

                ptr_free,state.saved.selected_freq
                selected_freq=bytarr(n_elements(freq))
                selected_freq[state.inp.bif:state.inp.eif]=1
                state.inp.selected_freq=ptr_new(selected_freq)

                wfreq=ovsa_frequency_selector(wFreqBase,f=freq,select=*state.inp.selected_freq,uname='FREQUENCY_SELECTOR',/frame,title='Frequency Selector')

                wbaseline=ovsa_baseline_selector(wBaselineBase,aatab=aatab,active=active,select=select,uname='BASELINE_SELECTOR',title='Baseline Selector',/frame)

                state.inp.selector.active=active
                state.inp.selector.select=select



                ptr_free,state.inp.selected_time
                wtime=widget_info(state.wtop,find_by_uname='TIME_SELECTOR')
                selected_time=bytarr(n_elements(time))
                selected_time[state.inp.bit:state.inp.eit]=1
                state.inp.selected_time=ptr_new(selected_time)

                ovsa_time_selector_set,wtime,time=time,selected=selected_time


                widget_control, widget_info(widget_info(event.top,find_by_uname='AutomaticBase'),find_by_uname='auto'),sensitive=(n_elements(*state.inp.xroi) gt 1)
                widget_control, widget_info(widget_info(event.top,find_by_uname='AutoBase'),find_by_uname='auto'),sensitive=(n_elements(*state.inp.xroi) gt 1)
                widget_control, widget_info(event.top,find_by_uname='autoclean'),sensitive=(n_elements(*state.inp.xroi) gt 1)
                wimagr_tp_draw,state
                widget_control,event.top,/update
            end
           END


    'POL':BEGIN
              widget_control,event.id,GET_VALUE=POL
              state.inp.poln=pol[event.index]
          END
    'METHOD':BEGIN
              widget_control,event.id,GET_VALUE=method
              state.inp.method=method[event.index]
             END
    'SAVEMOVIE':BEGIN
            check=file_search('default.mpg')
            check=check[0]
            if check eq '' then message,'No existing movie to be saved!'
            outfile='movie.mpg'
            outfile=dialog_pickfile(file=outfile,/write,/over)
            if outfile ne '' then FILE_COPY,'default.mpg',outfile,/over
           END


    'REFMAPS':display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
    'REFDELETE': BEGIN
                 widget_control,widget_info(state.wtop,find_by_uname='PPD'),sensitive=0
                 answ=dialog_message('Are you sure you want to remove all reference maps from memory?',/question)
                 if strupcase(answ) eq 'YES' then begin
	                 value=['No reference map uploaded']
	                 obj_destroy,state.refmaps
			         widget_control,widget_info(event.handler,find_by_uname='refmaps'),set_value=value,set_droplist_select=1
			         display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
                 end
                 widget_control,widget_info(state.wtop,find_by_uname='PPD'),sensitive=1
                END
    'REF':BEGIN
            widget_control,widget_info(state.wtop,find_by_uname='PPD'),sensitive=0
            reffiles=dialog_pickfile(filter=['*.fts','*.fits','*.sav','*.map',''],/read,/must, /multiple)
            if reffiles[0] eq '' then goto,write_state
            for i=0, n_elements(reffiles)-1 do begin
            reffile=reffiles[i]
	            if reffile ne '' then begin
	             break_file,reffile,disk,dir,filename,ext,/LAST_DOT
	             case ext of
	             '.fts':refmaps=wimagr_valid_map(wimagr_fits2map(reffile))
	             '.fits':refmaps=wimagr_valid_map(wimagr_fits2map(reffile))
	             '.sav':refmaps=wimagr_valid_map(reffile)
	             '.map':refmaps=wimagr_valid_map(reffile)
	             else: begin
	                    answ= dialog_message('Unsupported file extension(format)')
	                    refmaps=obj_new()
	                   end
	             endcase
	             if obj_isa(refmaps,'MAP') then begin
	                 count=refmaps->get(/count)
	                if count gt 0 then begin
		                 if ~obj_valid(state.refmaps) then begin
		                  obj_destroy,state.refmaps
			              state.refmaps=refmaps
			              value=strarr(count)
			              for k=0,count-1 do value[k]=refmaps->get(k,/id)+' '+refmaps->get(k,/time)
		                 endif else begin
		                  prev=n_elements(value)
		                  if prev gt 0 then begin
		                  value=[value,strarr(count)]
		                  endif else begin
		                   prev=state.refmaps->get(/count)
		                   value=strarr(count+prev)
		                   for k=0,prev-1 do value[k]=state.refmaps->get(k,/id)+' '+refmaps->get(k,/time)
		                  end
		                  for k=0,count-1 do begin
		                   value[k+prev]=refmaps->get(k,/id)+' '+refmaps->get(k,/time)
		                   state.refmaps->set,k+prev,map=refmaps->get(k,/map)
		                  end

		             endelse

		          end
	             end
	            end
            end
            if n_elements(value) gt 0 then begin
    		     value=['No reference map selected',value]
             widget_control,widget_info(event.handler,find_by_uname='refmaps'),set_value=value,set_droplist_select=1
             display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
    		     widget_control,widget_info(state.wtop,find_by_uname='PPD'),sensitive=1
    		     addbase=widget_info(state.wtop,find_by_uname='addcontourbase')
             n=widget_info(addbase,/n_children)
             children=widget_info(addbase,/all)
             for k=0,n-1 do begin
              contourmap=widget_info(children[k],find_by_uname='contourmap')
              widget_control,contourmap,set_value=value
             end
            end
          END


    'ADDCONTOUR':begin
                  addbase=widget_info(state.wtop,find_by_uname='addcontourbase')
                  n=widget_info(addbase,/n_children)
                  if n lt 4 then begin
	                  wrefmaps=widget_info(event.handler,find_by_uname='refmaps')
	                  widget_control,wrefmaps,get_value=value
	                  cbase=widget_base(addbase,/column,/frame,uname='cbase')
	                  row1=widget_base(cbase,/row,uname='row1')
	                  row2=widget_base(cbase,/row,uname='row2')
	                  wimagr_colors,/reset,colors=colors
					  thick=['normal','2x','3x','4x','5x']
	                  ccolor = widget_droplist(font=!defaults.font,row1,value=colors,uname='C_COLORS')
					  cthick = widget_droplist(font=!defaults.font,row1,value=thick,uname='C_THICK')
					  ocheck = cw_bgroup(font=!defaults.font,row1,['Draw Contours'],set_value=1,uname='C_CHECK',/nonexclusive,/column)
	                  contourmap=widget_droplist(font=!defaults.font,row2,UNAME='contourmap',Value=value,xsize=240)
	                  if n+1 eq 4 then widget_control,event.id,sensitive=0
	                  widget_control,widget_info(state.wtop,find_by_uname='deletecontour'),sensitive=1
                  endif

                end
    'DELETECONTOUR':BEGIN
                     addbase=widget_info(state.wtop,find_by_uname='addcontourbase')
                     n=widget_info(addbase,/n_children)
                     if n gt 0 then begin
                      children=widget_info(addbase,/all)
                      widget_control,children[n-1],/destroy
                      widget_control,widget_info(state.wtop,find_by_uname='addcontour'),sensitive=1
                      if n-1 eq 1 then widget_control,event.id,sensitive=0
                     endif
                    END
    'CONTOURMAP':BEGIN
                  widget_control,widget_info(widget_info(widget_info(event.id,/parent),/parent),find_by_uname='C_CHECK'),get_value=check
                  if total(check) eq 1 then display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
                 END
    'C_COLORS':BEGIN
                widget_control,widget_info(widget_info(widget_info(event.id,/parent),/parent),find_by_uname='C_CHECK'),get_value=check
                if total(check) eq 1 then display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
               END
    'C_THICK':BEGIN
               widget_control,widget_info(widget_info(widget_info(event.id,/parent),/parent),find_by_uname='C_CHECK'),get_value=check
               if total(check) eq 1 then display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
              END
    'C_CHECK':BEGIN
                  display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
                 END

    'PLOT': BEGIN
              widget_control,state.wtop,sensitive=0
              file=dialog_pickfile(filter='*.ps',/write,title='Please select a postscript filename')
              if file eq '' then file='default.ps'
	               set_plot,'ps'
	               device,file=file,/color,bits=8,xsize=20,ysize=20,xoff=1,yoff=8
	               display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/preset,gcolor=255
	               device,/close
	               set_plot,'win'
              widget_control,state.wtop,sensitive=1
             END
    'TIMEOPTIONS':auto_size,state
    'FREQOPTIONS':auto_size,state
    'AUTOPOL': begin
                widget_control,event.id,get_value=pol
                if total(pol) eq 0 then begin
                 pol=[1,0,0]
                 widget_control,event.id,set_value=pol
                end
                poln=['I','R','L']

                unchecked=where(pol eq 0,count)
                if count gt 0 then poln[unchecked]=''
                state.autopol=poln
               end
    'ABORT':begin
             state.abort=1
            end

    'AUTO':BEGIN
            auto_size,state
            state.index=0
            poln=state.autopol
            poln=poln(where(poln ne '',np))
            state.np=np
            widget_control,widget_info(state.wtop,find_by_uname='tslider'),sensitive=0,set_value=0,set_slider_min=0, set_slider_max=(state.nt-1)>1
            widget_control,widget_info(state.wtop,find_by_uname='fslider'),sensitive=0,set_value=0,set_slider_min=0, set_slider_max=(state.nf-1)>1
            widget_control,widget_info(state.wtop,find_by_uname='pslider'),sensitive=0,set_value=0,set_slider_min=0, set_slider_max=(state.np-1)>1
            poln=['I','R','L']
            for i=0,2 do begin
              w=widget_info(state.wtop,find_by_uname=poln[i]+'CONTOURS')
              widget_control,w,set_value=0
            end
            ptr_free,state.maps
            state.abort=0
            auto,state
           END
;    'SAVECLEANBOX':BEGIN
;           xroi=*state.inp.xroi
;           yroi=*state.inp.yroi
;           file=dialog_pickfile(/write,/over,filter='*.roi')
;           if file ne '' then save,xroi,yroi,file=file
;         END
;    'OPENCLEANBOX':BEGIN
;           file=dialog_pickfile(/read,/must,filter='*.roi')
;           if file ne '' then begin
;            restore,file
;            if n_elements(xroi) gt 2 and n_elements(xroi) gt 2 and (n_elements(xroi) eq n_elements(xroi)) then begin
;	            ptr_free,state.inp.xroi
;	            ptr_free,state.inp.yroi
;	            state.inp.xroi=ptr_new(xroi)
;	            state.inp.yroi=ptr_new(yroi)
;	            wset,state.win_roi
;	            vx=xroi
;                vy=yroi
;                plots,[vx,vx[0]],[vy,vy[0]],linestyle=0, /device
;            endif else answ=dialog_message('Unexpected file content!')
;           end
;         END

    'MAP':BEGIN
           compute_map, state,/map_only,/cbar
           state.inp.refcellsiz=state.inp.cellsiz
         END
    'AUTOCLEAN':BEGIN
           compute_map, state,[[*state.inp.xroi],[*state.inp.yroi]],/map_only,/cbar
           state.inp.refcellsiz=state.inp.cellsiz
         END
    'TSLIDER':BEGIN
          display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
          wimagr_tp_draw,state
         END
    'FSLIDER':BEGIN
          display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
          wimagr_tp_draw,state
         END
    'PSLIDER':BEGIN
          display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
          wimagr_tp_draw,state
         END
    'PPD' :BEGIN
             wset,state.win_ppd
             CASE event.type of
             0:BEGIN
                 cursor,x,y,/nowait,/data
                 state.left_button_down=1
	               device,set_graphics_function=6
	               state.ppd_dev_xrange=[event.x,event.x]
	               state.ppd_data_xrange=[x,x]
	               state.ppd_dev_yrange=[event.y,event.y]
	               state.ppd_data_yrange=[y,y]
               END
             1:BEGIN
                if event.release eq 1 then begin
                   cursor,x,y,/nowait,/data
                   state.left_button_down=0

	               state.ppd_dev_xrange[1]=event.x
	               state.ppd_data_xrange[1]=x
	               state.ppd_dev_yrange[1]=event.y
	               state.ppd_data_yrange[1]=y
	               state.ppd_dev_xrange=state.ppd_dev_xrange[sort(state.ppd_dev_xrange)]
	               state.ppd_data_yrange=state.ppd_data_yrange[sort(state.ppd_data_yrange)]
                   x0= state.ppd_dev_xrange[0]
                   x1= state.ppd_dev_xrange[1]
                   y0= state.ppd_dev_yrange[0]
                   y1= state.ppd_dev_yrange[1]
                   plots,/dev,[x0,x0,x1,x1,x0],[y0,y1,y1,y0,y0]   ; Erase current box

	               device,set_graphics_function=3
	               if ptr_valid(state.maps) or $
	               (obj_valid(state.refmaps) and (widget_info(widget_info(state.wtop,find_by_uname='refmaps'),/droplist_select) gt 0)) then begin
	                display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
	               endif
	            end
               END
              2: BEGIN
                  if state.left_button_down eq 1 then begin
	                  x0= state.ppd_dev_xrange[0]
	                  x1= state.ppd_dev_xrange[1]
	                  y0= state.ppd_dev_yrange[0]
	                  y1= state.ppd_dev_yrange[1]
	                  state.ppd_dev_xrange[1]=(x=event.x)
		                state.ppd_dev_yrange[1]=(y=event.y)
	                  plots,/dev,[x0,x0,x1,x1,x0],[y0,y1,y1,y0,y0]   ; Erase current box
	                  plots,/dev,[x0,x0,x,x,x0],[y0,y,y,y0,y0]       ; Draw new box
                  end
                 END
             ELSE:
            ENDCASE
           END
       'CUBEOPEN':BEGIN
                    widget_control,widget_info(state.wtop,find_by_uname='PPD'),sensitive=0
                    if ptr_valid(state.maps) then begin
                     answ=dialog_message('This operation will replace the maps currently in memory. Do you want to proceed?',/question)
                     endif else answ='YES'
                     if strupcase(answ) eq 'YES' then begin
                     filename=dialog_pickfile(filter=['*.img','*.f*'],/read)
                     if filename ne '' then begin
                       CATCH, Error_status
                       IF Error_status NE 0 THEN BEGIN
                         CATCH,/CANCEL
                         answ=dialog_message(['Invalid OVSA cube FITS file format!',!ERROR_STATE.MSG,'Trying IDL sav file format.'])
                         ;THIS IS FOR BACKWARD COMPATIBILITY
                         CATCH, Error_status
                         IF Error_status NE 0 THEN BEGIN
                           CATCH,/CANCEL
                           cube_err:
                           answ=dialog_message(['Invalid OVSA cube IDL sav file format!',!ERROR_STATE.MSG,'Operation aborted!'])
                           goto, write_state
                         end
                         restore,filename
                         sz=size(maps)
                         if sz(0) gt 0 then begin
                           if (n_elements(np) eq 0 or n_elements(nf) eq 0 or n_elements(nt) eq 0) and sz[0] eq 3 then begin
                             np=sz[1]
                             nf=sz[2]
                             nt=sz[3]
                           endif else begin
                             sz=size(maps)
                             np=sz[1]
                             nf=sz[2]
                             nt=sz[3]
                           endelse
                         goto, valid_cube
                         endif else goto, cube_err
                       ENDIF
                        data=mrdfits(filename,0,/silent)
                        info=mrdfits(filename,'info',/silent)
                        index=mrdfits(filename,'index',/silent)
                        np=info.npol
                        nf=info.nfreq
                        nt=info.ntim
                        sz=size(data)
                        data=reform(data,sz[1],sz[2],np,nf,nt)
                        header=index.header
                        sz=size(header)
                        header=reform(header,sz[1],np,nf,nt)
                        index=reform(rem_tag(index,'header'),np,nf,nt)
                        maps=reform(replicate({data:data[*,*,0,0,0],header:header[*,0,0,0],index:index[0]},nf,np,nt),np,nf,nt)
                        maps.data=data
                        maps.header=header
                        valid_cube:
                        ptr_free,state.maps
                        state.maps=ptr_new(maps)
                        state.np=np
                        state.nf=nf
                        state.nt=nt
                        state.index=0
                        widget_control,widget_info(state.wtop,find_by_uname='tslider'),sensitive=state.nt gt 1,set_value=0,set_slider_min=0, set_slider_max=(state.nt-1)>1
                        widget_control,widget_info(state.wtop,find_by_uname='fslider'),sensitive=state.nf gt 1,set_value=0,set_slider_min=0, set_slider_max=(state.nf-1)>1
                        widget_control,widget_info(state.wtop,find_by_uname='pslider'),sensitive=state.np gt 1,set_value=0,set_slider_min=0, set_slider_max=(state.np-1)>1
                        display_map,state,/ppd
                      end
                     end
                   widget_control,widget_info(state.wtop,find_by_uname='PPD'),sensitive=1
                  END
                  
         'CUBESAVE':BEGIN
                  wset,state.win_roi
                  if ptr_valid(state.maps) then begin
                    header=(*state.maps)[0].header
                    date = sxpar(header,'DATE_OBS')
                    time = sxpar(header,'TIME_OBS')
                    time=strsplit((strsplit(time,'.',/extract))[0],escape=':',/extract)
                    file=strcompress(strmid(date,0,4)+strmid(date,5,2)+strmid(date,8,2)+'_'+time+'.fits',/rem)
                    outfile=dialog_pickfile(file=file,/write,/overwrite)
                    if outfile ne '' then begin
                      np=state.np
                      nf=state.nf
                      nt=state.nt
                      freq=(*state.cal).f
                      offset=state.inp.offset
                      time=anytim((*state.cal).info.date)+(*state.cal).t*3.6e3
                      maps=reform((*state.maps),np,nf,nt)
                      info={npol:np,nfreq:nf,ntim:nt,offset:offset,active_baselines:state.inp.selector.active,selected_baselines:state.inp.selector.select,freq:freq,time:time}
                      wimagr_data2fits,outfile,maps=maps,info=info
                    endif
                  endif else answ=dialog_message('No map cube created yet. Nothing to save!')
                END         
         'SAVE2MAP':BEGIN
                     if ptr_valid(state.maps) then begin
                       ;wimagr2map, *state.maps, /prompt 
                       header=(*state.maps)[0].header
                       date = sxpar(header,'DATE_OBS')
                       time = sxpar(header,'TIME_OBS')
                       time=strsplit((strsplit(time,'.',/extract))[0],escape=':',/extract)
                       file=strcompress(strmid(date,0,4)+strmid(date,5,2)+strmid(date,8,2)+'_'+time+'.sav',/rem)
                       outfile=dialog_pickfile(file=file,/write,/overwrite)
                       if outfile ne '' then begin
                         np=state.np
                         nf=state.nf
                         nt=state.nt
                         freq=(*state.cal).f
                         offset=state.inp.offset
                         time=anytim((*state.cal).info.date)+(*state.cal).t*3.6e3
                         maps=reform((*state.maps),np,nf,nt)
                         info={npol:np,nfreq:nf,ntim:nt,offset:offset,active_baselines:state.inp.selector.active,selected_baselines:state.inp.selector.select,freq:freq,time:time}
                         header=maps[0].header
                         index=reform(add_tag(maps.index,header,'header'),np,nf,nt)
                         ntags=n_tags(maps.index)
                         for i=0, n_elements(index)-1 do begin
                           for j=0, ntags-1 do index[i].(j)=maps[i].index.(j)
                           index[i].(j)=maps[i].header
                         endfor
                         map=reform(wimagr_index2map(maps.data,index,info),np,nf,nt)
                         save,map,file=outfile
                       endif  
                     endif else answ=dialog_message('No map cube created yet. Nothing to save!')
                    END
         'BSLIDER':select_baselines,state
         'DM_SELECT':select_baselines,state
         'LEVELS':display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
         'ICONTOURS':display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
         'ICOLORS':display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
         'ITHICK':display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
         'RCONTOURS':display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
         'RCOLORS':display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
         'RTHICK':display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
         'LCONTOURS':display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
         'LCOLORS':display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
         'LTHICK':display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
         'PLAYMOVIE':play_movie,state
         'LOCKPIX':begin
                     state.inp.cpixlock =event.select
                     wpix=widget_info(event.top,find_by_uname='CPix')
                     if state.inp.cpixlock eq 0 then begin
                      widget_control,wpix,set_value='' 
                     endif else widget_control,wpix,set_value=strcompress(string(state.inp.cellsiz,format='(f7.3)'),/rem)
                   end
                   
         'BOXSCALE':begin
                    widget_control,event.id,get_value=boxscale
                    state.inp.boxscale =boxscale
                 end 
         'LOADCT':begin
                   if event.index eq 0 then begin
                     tvlct,rgb_curr,/get
                     xloadct,/silent,/block
                     tvlct,user_rgb,/get
                     widget_control,event.id,get_uvalue=rgb
                     rgb[*,*,0]=user_rgb
                     widget_control,event.id,set_uvalue=rgb
                     tvlct,rgb_curr
                   end
                   display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
                  end                 


   ELSE:
   ENDCASE
   if size(event,/sname) eq 'BASELINE_SELECTOR' then select_baselines,state,event.status
   if size(event,/sname) eq 'FREQUENCY_SELECTOR' then select_frequencies,state,event.select
   if size(event,/sname) eq 'TIME_SELECTOR' then select_time,state,event.select
   write_state:
   WIDGET_CONTROL, stash, SET_UVALUE=state
 end

pro play_movie,state
  if ptr_valid(state.maps) then begin
   widget_control,widget_info(state.wtop,find_by_uname='MovieSelection'),get_value=MovieSelection
   if MovieSelection eq 0 then begin
    nframes=state.nt
    slider=widget_info(state.wtop,find_by_uname='tslider')
   endif else begin
    nframes=state.nf
    slider=widget_info(state.wtop,find_by_uname='fslider')
   endelse

   filename = 'default.mpg'

   wset,state.win_ppd
   ppd=!d
   wset,state.lc_win_ppd
   tpd=!d

   myDevice = !D.NAME
   mpegObj = OBJ_NEW('IDLgrMPEG',frame_rate=2)
   if obj_valid(mpegOBJ) then begin
    window,/free,xsize=ppd.x_size+tpd.x_size,ysize=ppd.y_size,/pixmap
    pixmap=!d
   end
   widget_control,widget_info(state.wtop,find_by_uname='fps'),get_value=fps
   for i=0,nframes-1 do begin
    widget_control,slider,set_value=i
    widget_control,widget_info(state.wtop,find_by_uname='contourmap'),set_droplist_select=i+1
    display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
    wimagr_tp_draw,state
    if obj_valid(mpegOBJ) then begin
      wset,pixmap.window
      erase,0
      device,copy=[0,0,tpd.x_size,tpd.y_size,0,(ppd.y_size-tpd.y_size)/2,state.lc_win]
      device,copy=[0,0,ppd.x_size,ppd.y_size,tpd.x_size,0,state.win_ppd]
      img=TVRD(/ORDER,/TRUE)
      for k=1, 24/fps do mpegObj->Put, img
    end
    wait,1./fps
   end
   if obj_valid(mpegOBJ) then mpegObj -> Save, FILENAME=filename
   if obj_valid(mpegOBJ) then obj_destroy,mpegOBJ
   SET_PLOT, myDevice
  end

end

pro select_time,state,select
      select_ptr=select
      select=*select_ptr
      ptr_free,select_ptr
	 selected=where(select.selected,count)
	 if count gt 0 then begin
		 state.inp.bit=selected[0]
		 state.inp.eit=selected[count-1]
		 state.inp.inverted_time=select.inverted
		 *state.inp.selected_time=select.selected
		 wimagr_tp_draw,state
	 end
end

pro select_frequencies,state,select
 select_ptr=select
 select=*select_ptr
 ptr_free,select_ptr
 selected=where(select,count)
 if count gt 0 then begin
  state.inp.bif=selected[0]
  state.inp.eif=selected[count-1]
  *state.inp.selected_freq=select
  wimagr_tp_draw,state
 endif else begin
  answ=dialog_message('At least one frequency must be selected!')
  wfreq=widget_info(state.wtop,find_by_uname='FREQUENCY_SELECTOR')
  if widget_valid(wfreq) then begin
   wundo=widget_info(wfreq,find_by_uname='Undo')
   OVSA_FREQUENCY_SELECTOR_EVENT,{top:state.wtop,handler:wfreq,id:wundo}
  end
 end
end

pro select_baselines,state,status
 widget_control,state.wtop,/hourglass
 !p.multi=[0,1,2]
 if keyword_set(status) then state.inp.selector=status
 inp=state.inp
 inp.selector.select[*]=1
 inp.selector.active[*]=1
 bslider=widget_info(state.wtop,find_by_uname='bslider')
 widget_control,bslider,get_value=k

 imagr_vsel, inp, uv_ij, vis_ij,/noprint,dim=dim,freq=freq


 wset,state.win_phase
 all_idx=baseline_indices(inp.selector,baselines=baselines)
 inp.selector.active=state.inp.selector.active
 inp.selector.select=state.inp.selector.active
 active_idx=baseline_indices(inp.selector,baselines=active_baselines)
 good=where((baselines[k,0] eq active_baselines[*,0]) and (baselines[k,1] eq active_baselines[*,1]),nactive)
 nt=dim[0]
 nf=dim[2]
 if nt gt 0 and nf gt 0 then begin
 x=reform(lindgen(nt*nf),nt,nf)
 title=string(baselines[k,*],format="('BASELINE ',i1,'-',i1)")
 phase=lobe(atan(imaginary(vis_ij[*,[k]]),real_part(vis_ij[*,[k]]))/!dtor)
 amp=sqrt(imaginary(vis_ij[*,[k]])^2+real_part(vis_ij[*,[k]])^2)
 symsize=0.25
 if nactive gt 0 then begin
     idx=baseline_indices(state.inp.selector,baselines=selected_baselines)
     good=where((baselines[k,0] eq selected_baselines[*,0]) and (baselines[k,1] eq selected_baselines[*,1]),count)
	 if count eq 0 then title=title + ((' (DISABLED)'))
	  plot,phase,psym=1,ytitle='PHASE',xsty=5,ymargin=[1,3],title=title,color=0,back=255,symsize=symsize,yrange=[-40,400]
	  oplot,!x.crange,!y.crange[[1,1]],color=0,symsize=symsize
	  oplot,!x.crange,!y.crange[[0,0]],color=0,symsize=symsize
	  for i=0,nf-1 do oplot,x[[0,0],i],!y.crange[[0,1]],color=0
	  plot,amp,psym=1,ytitle='AMPLITUDE',ymargin=[4,0],xsty=5,color=0,back=255,symsize=symsize
	  oplot,!x.crange,!y.crange[[1,1]],color=0,symsize=symsize
	  oplot,!x.crange,!y.crange[[0,0]],color=0,symsize=symsize
	  for i=0,nf-1 do begin
	   oplot,x[[0,0],i],!y.crange[[0,1]],color=0
	   xyouts,x[0,i],!y.crange[0]-(!y.crange[1]-!y.crange[0])*0.1,strcompress(string(freq[i],format="(f4.1)"),/rem),color=0
	  end
	 endif else begin
	  erase,255
	  xyouts,0.25,0.5,/norm, 'NO DATA FOR '+title,color=0
	 end
	 !p.multi=0
	 wset,state.win_uv
	 plot,[real_part(uv_ij),-real_part(uv_ij)],[imaginary(uv_ij),-imaginary(uv_ij)],psym=1,symsize=symsize,color=0,back=255,xmargin=[0.1,0.1],ymargin=[0.1,0.1]
	 loadct,/silent,39
	 if nactive gt 0 then begin
	  oplot,real_part(uv_ij[*,[k]]),imaginary(uv_ij[*,[k]]),psym=1,color=250,symsize=symsize
	  oplot,-real_part(uv_ij[*,[k]]),-imaginary(uv_ij[*,[k]]),psym=1,color=250,symsize=symsize
	 end
	 wdm=widget_info(state.wtop,find_by_uname='dm_select')
	 widget_control,wdm,get_value=dm_select
	 if dm_select gt 0 then begin
	  ovsa_fft_uv2xy, f_GHz, str2number(state.inp.imsiz), vis_ij, uv_ij, state.inp.cellsiz , dbeam, dmap,wsum,/noprint,selector=idx
	  wset,state.win_dm
	  loadct,/silent,0
	  tv,bytscl(congrid(dm_select eq 1? dmap:dbeam,!d.x_size,!d.y_size,/cubic))
	 end
	 endif else begin
	  wset,state.win_phase
	  erase,255
	  xyouts,0.25,0.5,/norm, 'NO DATA FOR THIS SELECTION',color=0
	  wset,state.win_uv
	  erase,255
	  xyouts,0.1,0.5,/norm, 'NO DATA FOR THIS SELECTION',color=0
	  wset,state.win_dm
	  erase,255
	  xyouts,0.1,0.5,/norm, 'NO DATA FOR THIS SELECTION',color=0
	 end
end

pro STRREPLACE, Strings, Find1, Replacement1
default,find1,':'
default,replacement1,''
done=0
repeat begin
 saved=strings
         sz        = SIZE(Strings)
         ns        = n_elements(sz)
         if (sz(ns-2) ne 7) then message,'Parameter must be of string type.'

         Find      = STRING(Find1)
         pos       = STRPOS(Strings,Find)
         here      = WHERE(pos ne -1, nreplace)

         if (nreplace eq 0) then return

         Replacement=STRING(Replacement1)
         Flen      = strlen(Find)
         for i=0,nreplace-1 do begin

              j         = here(i)
              prefix    = STRMID(Strings(j),0,pos(j))
              suffix    = STRMID(Strings(j),pos(j)+Flen,$
                                       strlen(Strings(j))-(pos(j)+Flen))
              Strings(j) = prefix + replacement + suffix
         endfor
 endrep until (saved eq strings)
end

pro wimagr_tp_draw,state,skip=skip
	    win=!d.window
	    psav=!p
	    !p.multi=[0,1,2]
	    wset,state.lc_win
	    tp=(*state.lc).tp
	    time=(*state.lc).time
	    f=(*state.cal).f
	    x2=0.95
	    x1=0.2
	    y2=0.9
	    y1=0.5
	    maxdat=max(tp,/nan,min=mindat)
	    widget_control, widget_info(state.wtop,find_by_uname='tslider'),get_value=tidx
		widget_control, widget_info(state.wtop,find_by_uname='fslider'),get_value=fidx
		widget_control, widget_info(state.wtop,find_by_uname='pslider'),get_value=pidx

	    display_time_markers=widget_info(state.wtop,find_by_uname='display_time_markers')
	    if widget_valid(display_time_markers) then widget_control, display_time_markers,get_value=display_time_markers
	    if tag_exist(state.inp,'selected_time') then if ptr_valid(state.inp.selected_time) then begin
	     selected_time=*state.inp.selected_time
	     tmarker=where(selected_time)
	    endif
	    if tag_exist(state.inp,'selected_freq') then if ptr_valid(state.inp.selected_freq) then begin
	     selected_freq=*state.inp.selected_freq
	     fmarker=where(selected_freq)
	    end

	    utplot,time,f,/ylog,yran=[18,1],xsty=5,ysty=1,(*state.cal).info.date,position=[x1,y1,x2,y2],xticklen=-0.05,yticklen=-0.02,$
	          color=0,background=255,title='Data selection for '+(*state.cal).info.date,ytit='Frequency [GHz]',/nodata
	    outplot,!x.crange,10^!y.crange[[1,1]],color=0

	    loadct,/silent,39
	    tvscl,bytscl(alog10(congrid(get_ovsa_image(transpose(tp),f,time),(x2-x1)*!d.x_size,(y2-y1)*!d.y_size)>1),max=alog10(maxdat),min=alog10(mindat>1)),x1*!d.x_size+1,y1*!d.y_size+1
	    t1=time[state.inp.bit]
	    t2=time[state.inp.eit]
	    f1=f[state.inp.bif]
	    f2=f[state.inp.eif]

        outplot,t1*[1,1],10^!y.crange,color=255,linesty=1,thick=2
        outplot,t2*[1,1],10^!y.crange,color=255,linesty=1,thick=2


	    outplot,!x.crange,f1*[1,1],color=255,linesty=1,thick=2
	    outplot,!x.crange,f2*[1,1],color=255,linesty=1,thick=2



        if ptr_valid(state.maps) then begin
         outplot,[anytim(fxpar((*state.maps)[pidx,fidx,tidx].header,'TSTART')),anytim(fxpar((*state.maps)[pidx,fidx,tidx].header,'TSTART'))],$
                 10^!y.crange,color=0,linesty=0,thick=1
         outplot,[anytim(fxpar((*state.maps)[pidx,fidx,tidx].header,'TEND')),anytim(fxpar((*state.maps)[pidx,fidx,tidx].header,'TEND'))],$
                 10^!y.crange,color=0,linesty=0,thick=1
         outplot,!x.crange,f[[fxpar((*state.maps)[pidx,fidx,tidx].header,'BIF'),fxpar((*state.maps)[pidx,fidx,tidx].header,'BIF')]],color=0,linesty=0,thick=1
         outplot,!x.crange,f[[fxpar((*state.maps)[pidx,fidx,tidx].header,'EIF'),fxpar((*state.maps)[pidx,fidx,tidx].header,'EIF')]],color=0,linesty=0,thick=1

        end

	    tp=tp[*,state.inp.bif:state.inp.eif]
	    if (size(tp))[0] gt 1 then tp=total(tp,2,/nan)
	    loadct,/silent,0
	    time_zoom=widget_info(state.wtop,find_by_uname='time_zoom')
	    if widget_valid(time_zoom) then begin
	     widget_control,time_zoom,get_value=zoom
	     if zoom[0] then xrange=[t1,t2]
	    end
	    utplot,time,tp,(*state.cal).info.date,/xsty,color=0,back=255,xmargin=[6,1],position=[0.2,0.1,0.95,0.5],ytitle=' Flux [sfu]',xrange=xrange,yrange=yrange

	    outplot,t1*[1,1],!y.crange,color=0
	    outplot,t2*[1,1],!y.crange,color=0
	    if display_time_markers eq 1 and n_elements(selected_time) gt 0 then begin
         marker=where(selected_time,count)
         if count gt 2 then begin
          for i=1, count-2 do begin
           outplot,time[marker[i]]*[1,1],!y.crange,color=0,linesty=1,thick=1
          end
         end
        end


		if ptr_valid(state.maps) then begin
		 outplot,[anytim(fxpar((*state.maps)[pidx,fidx,tidx].header,'TSTART')),anytim(fxpar((*state.maps)[pidx,fidx,tidx].header,'TSTART'))],$
                 !y.crange,color=0,linesty=0,thick=1
         outplot,[anytim(fxpar((*state.maps)[pidx,fidx,tidx].header,'TEND')),anytim(fxpar((*state.maps)[pidx,fidx,tidx].header,'TEND'))],$
                 !y.crange,color=0,linesty=0,thick=1

		end

        wset,state.lc_win_ppd
        device,copy=[0,0,!d.x_size,!d.y_size,0,0,state.lc_win]

	    if ~keyword_set(skip) then begin
	     select_baselines,state
	     auto_size,state
	    end


	    !p=psav
	    wset,win

    end

pro display_map,state,ppd_only=ppd_only,preset=preset,_extra=_extra
 psav=!p
 !p.multi=0
 if n_elements(_extra) eq 0 then _extra={offset:state.inp.offset,no_offset:~state.off} else _extra=create_struct(_extra,'offset',state.inp.offset,'no_offset',~state.off)
 widget_control, widget_info(state.wtop,find_by_uname='tslider'),get_value=tidx
 widget_control, widget_info(state.wtop,find_by_uname='fslider'),get_value=fidx
 widget_control, widget_info(state.wtop,find_by_uname='pslider'),get_value=pidx
 if keyword_set(_extra) then begin
  if ~tag_exist(_extra,'CBAR') then _extra=create_struct(_extra,'cbar',1)
 endif else _extra={cbar:1}
 
 if ptr_valid(state.maps) then begin
  data=(*state.maps)[pidx,fidx,tidx].data
  header=(*state.maps)[pidx,fidx,tidx].header
  if ~keyword_set(preset) then wset,state.win_ppd
  display_amap,state,data,header,_extra=_extra
  display_contours,state,_extra=_extra
  if ~keyword_set(preset) then begin
	 if ~keyword_set(ppd_only) then begin
		 wset,state.win_map
		 display_amap,state,data,header,_extra=_extra
	 end
  end
 endif else begin
	 if obj_isa(state.refmaps,'MAP') then begin
	    
	    selected=widget_info(widget_info(state.wtop,find_by_uname='refmaps'),/droplist_select)
	    if selected gt 0 then begin
	     tvlct,rgb_cur,/get
	     wct=widget_info(state.wtop,find_by_uname='loadct')
	     widget_control,wct,get_uvalue=rgb
	     tvlct,rgb[*,*,widget_info(wct,/droplist_select)]
	     refmap=state.refmaps->getmap(selected-1)
	     if tag_exist(refmap,'offset') and tag_exist(refmap,'off') then begin
	       if refmap.off eq 1 and keyword_set(no_offset) then begin
	         refmap.xc=refmap.xc-refmap.offset[0]
	         refmap.yc=refmap.yc-refmap.offset[1]
	         refmap.off=0b
	       endif
	     endif
	     if ~keyword_set(preset) then begin
		     wset,state.win_map
		     plot_map,refmap,grid=10
	     end
	     if ~keyword_set(preset) then wset,state.win_ppd
	     plot_map,refmap,grid=10,_extra=_extra,/cbar
	     display_contours,state,_extra=_extra
	     tvlct,rgb_cur
	    end
	  end
	  
 end
 !p=psav
 WIDGET_CONTROL,widget_info(state.wtop,/child), SET_UVALUE=state
end

pro display_contours,state,no_offset=no_offset,_extra=_extra 
 c=0
 if obj_isa(state.refmaps,'MAP') and !d.name eq 'PS' then begin
   selected=widget_info(widget_info(state.wtop,find_by_uname='refmaps'),/droplist_select)
   if selected gt 0 then begin
    widget_control, widget_info(state.wtop,find_by_uname='tslider'),get_value=tidx
    widget_control, widget_info(state.wtop,find_by_uname='fslider'),get_value=fidx
    widget_control, widget_info(state.wtop,find_by_uname='pslider'),get_value=pidx
    data=(*state.maps)[pidx,fidx,tidx].data
    header=(*state.maps)[pidx,fidx,tidx].header
    poln = sxpar(header,'POLN')
    np=1
    nf=1
    nt=1
    freq=(*state.cal).f
    offset=state.inp.offset
    time=anytim((*state.cal).info.date)+(*state.cal).t*3.6e3
    maps=reform((*state.maps)[pidx,fidx,tidx],np,nf,nt)
    inp=state.inp
    info={npol:np,nfreq:nf,ntim:nt,offset:offset,active_baselines:inp.selector.active,selected_baselines:inp.selector.select,freq:freq,time:time}
    index={header:maps.header}
    map=wimagr_index2map(data,index,info)
    if tag_exist(map,'offset') and tag_exist(map,'off') then begin
      if map.off eq 1 and keyword_set(no_offset) then begin
        map.xc=map.xc-map.offset[0]
        map.yc=map.yc-map.offset[1]
        map.off=0b
      endif
    endif
    map.id=map.id+' '+map.time
	 xyouts,/norm,0.1,0.03,string(state.inp.offset,format="('offset=[',f7.1,',',f7.1,']')"),color=0
	 xyouts,/norm,0.1,0.03*c,map.id,color=0
	 c-=1
   end
 endif
 if ptr_valid(state.maps) then begin
	 widget_control, widget_info(state.wtop,find_by_uname='tslider'),get_value=tidx
	 widget_control, widget_info(state.wtop,find_by_uname='fslider'),get_value=fidx
	 widget_control, widget_info(state.wtop,find_by_uname='pslider'),get_value=pidx
	 for i=0, state.np-1 do begin
		 data=(*state.maps)[i,fidx,tidx].data
		 header=(*state.maps)[i,fidx,tidx].header
		 poln = sxpar(header,'POLN')
		 if size(poln,/tname) ne 'STRING' then return
		 widget_control,widget_info(state.wtop,find_by_uname=poln+'CONTOURS'),get_value=contours
		 if contours[0] then begin
		   np=1
		   nf=1
		   nt=1
		   freq=(*state.cal).f
		   offset=state.inp.offset
		   time=anytim((*state.cal).info.date)+(*state.cal).t*3.6e3
		   maps=reform((*state.maps)[i,fidx,tidx],np,nf,nt)
		   inp=state.inp
		   info={npol:np,nfreq:nf,ntim:nt,offset:offset,active_baselines:inp.selector.active,selected_baselines:inp.selector.select,freq:freq,time:time}
		   index={header:maps.header}
		   map=wimagr_index2map(data,index,info)
		   if tag_exist(map,'offset') and tag_exist(map,'off') then begin
		     if map.off eq 1 and keyword_set(no_offset) then begin
		       map.xc=map.xc-map.offset[0]
		       map.yc=map.yc-map.offset[1]
		       map.off=0b
		     endif
		   endif
		   map.id=map.id+' '+map.time
		   color=widget_info(widget_info(state.wtop,find_by_uname=poln+'COLORS'),/DROPLIST_SELECT)+1
		   thick=widget_info(widget_info(state.wtop,find_by_uname=poln+'THICK'),/DROPLIST_SELECT)+1
		   widget_control,widget_info(state.wtop,find_by_uname='LEVELS'),get_value=lev_idx,get_uvalue=levels
	       levels=levels[where(lev_idx)]
		   wimagr_colors
		   plot_map,map,color=color,thick=thick,/over,levels=levels,/percent
		   if !d.name eq 'PS' then begin
		    xyouts,/norm,0.1,0.03*c,map.id,color=(color ne 17)?color:3,charthick=thick
		    c-=1
		   end
		   wimagr_colors,/reset
		 end
	 end
 end
 if obj_isa(state.refmaps,'MAP') then begin
	 addbase=widget_info(state.wtop,find_by_uname='addcontourbase')
	 n=widget_info(addbase,/n_children)
	 children=widget_info(addbase,/all)
	 widget_control,widget_info(state.wtop,find_by_uname='LEVELS'),get_value=lev_idx,get_uvalue=levels
	 levels=levels[where(lev_idx)]
	 for i=0,n-1 do begin
	  widget_control,widget_info(children[i],find_by_uname='C_CHECK'),get_value=check
	  if total(check) eq 1 then begin
	  selected=widget_info(widget_info(children[i],find_by_uname='contourmap'),/droplist_select)
	   if selected gt 0 then begin
		   color=widget_info(widget_info(children[i],find_by_uname='C_COLORS'),/DROPLIST_SELECT)+1
		   thick=widget_info(widget_info(children[i],find_by_uname='C_THICK'),/DROPLIST_SELECT)+1
		   wimagr_colors
		   refmap=state.refmaps->get(selected-1,/map)
		   if tag_exist(refmap,'offset') and tag_exist(refmap,'off') then begin
		     if refmap.off eq 1 and keyword_set(no_offset) then begin
		       refmap.xc=refmap.xc-refmap.offset[0]
		       refmap.yc=refmap.yc-refmap.offset[1]
		       refmap.off=0b
		     endif
		   endif
		   plot_map,refmap,color=(color ne 17)?color:3,thick=thick,/over,levels=levels,/percent
		   if !d.name eq 'PS' then begin
		    id=state.refmaps->get(selected-1,/id)+' '+state.refmaps->get(selected-1,/time)
		    xyouts,/norm,0.1,0.03*c,id,color=color,charthick=thick
		    c-=1
		   end
		   wimagr_colors,/reset
	   end
	  end
	 end
 end
end

pro plot_map_colorbar, prange, bottom, ncolors, cb_title=cb_title, log=log, $
  charsize=charsize, position=position, color=color, _extra=extra
    bottom=1
 	colorbar = obj_new('colorbar2', title=cb_title)
 	default, charsize, 1.
 	format = '(f8.1)'
 	if max(abs(prange)) gt 9999. then format='(i6)'
 	if max(abs(prange)) gt 99999. then format='(g9.2)'
 	if max(abs(prange)) lt 100. then format='(f8.2)'
 	if max(abs(prange)) lt 1. then format='(g9.2)'
 	datarange = float(prange)
 	if abs(datarange[1]-datarange[0]) lt 1.e-6  then datarange[1] = datarange[0] + .001
 	colorbar -> setproperty, range=datarange,position=[0.92, 0.15, 0.94, 0.85], $
 		bottom=bottom, ncolors=ncolors, ticklen=-.2, format=format, log=log, color=color,/vertical
 	ytitle_sav = !y.title
 	; colorbar draw uses xcharsize which is a scaling factor on !p.charsize, so don't
 	; pass charsize in through set - if !p.charsize is already set, characters will be huge
 	pcharsize_sav = !p.charsize
 	!y.title = ''
 	!p.charsize = .8 * charsize
 	colorbar -> draw
 	!y.title = ytitle_sav
 	!p.charsize = pcharsize_sav
 	obj_destroy, colorbar

end


pro display_amap,state,data,header,_extra=_extra
 freq=(*state.cal).f
 time=anytim((*state.cal).info.date)+(*state.cal).t*3600.
 info={npol:1,nfreq:1,ntim:1,offset:[0.0,0.],freq:freq,time:time}
 index={header:header}
 ovsa=wimagr_index2map(data,index,info)
 widget_control,widget_info(state.wtop,find_by_uname='beam'), set_value=string(ovsa.a,format="('a=',f7.3,' arcsec')")+string([13b,10b])$
  +string(ovsa.b,format="('b=',f7.3,' arcsec')")+string([13b,10b])+string(ovsa.phi/!dtor,format="('phi=',f7.3,' deg')")
 if obj_isa(state.refmaps,'MAP') then begin
    selected=widget_info(widget_info(state.wtop,find_by_uname='refmaps'),/droplist_select)
    if selected gt 0 then refmap=state.refmaps->getmap(selected-1)
 end
 widget_control,widget_info(state.wtop,find_by_uname='LEVELS'),get_value=lev_idx,get_uvalue=levels
 levels=levels[where(lev_idx)]
 tvlct,rgb_curr,/get
 wct=widget_info(state.wtop,find_by_uname='loadct')
 widget_control,wct,get_uvalue=rgb
 tvlct,rgb[*,*,widget_info(wct,/droplist_select)]
 if (keyword_set(refmap)) then begin
  ovsa = display_ovsamap(ovsa,refmap=refmap,charsize=0.75,freq_array=freq,levels=levels,$
    /percent,_extra=_extra)
  state.inp.outfile=ovsa.id+ovsa.time
  xyouts,!x.crange[0],!y.crange[0]-(max(!y.crange,min=m)-m)/8, state.inp.outfile,color=255
 endif else begin
  ovsa = display_ovsamap(ovsa,charsize=0.75,freq=freq,_extra=_extra)
  state.inp.outfile=ovsa.id+ovsa.time
 endelse
 tvlct,rgb_curr
end



pro auto,state
     !p.multi=0
     idx=array_indices([state.np,state.nf,state.nt],state.index, /dim)
     cbox=[[*state.inp.xroi],[*state.inp.yroi]]
     widget_control,widget_info(state.wtop,find_by_uname='TimeOptions'),get_value=time_synthesis
     widget_control,widget_info(state.wtop,find_by_uname='FreqOptions'),get_value=freq_synthesis

     poln=state.autopol
     poln=poln(where(poln ne ''))
     state.inp.poln=poln[idx[0]]

     if state.nf gt 1 then begin
      if freq_synthesis[0] eq 0 then begin
	      (*state.inp.selected_freq)[*]=0
	      (*state.inp.selected_freq)[(*state.saved.selected_freq)[idx[1]]]=1
	       state.inp.bif=(*state.saved.selected_freq)[idx[1]]
	       state.inp.eif=state.inp.bif
      endif else begin
         (*state.inp.selected_freq)[*]=0
         (*state.inp.selected_freq)[*state.saved.selected_freq]=1
         *state.inp.selected_freq=wimagr_select(*state.inp.selected_freq,idx[1])
          selected_freq=where(*state.inp.selected_freq)
	        state.inp.bif=min(selected_freq,max=eif)
	        state.inp.eif=eif
	  end
     end

     if state.nt gt 1 then begin
      if time_synthesis[0] eq 0 then begin
         (*state.inp.selected_time)[*]=0
         (*state.inp.selected_time)[(*state.saved.selected_time)[idx[2]]]=1
	       state.inp.bit=(*state.saved.selected_time)[idx[2]]
	       state.inp.eit=state.inp.bit
	  endif else begin
	     (*state.inp.selected_time)[*]=0
	     (*state.inp.selected_time)[*state.saved.selected_time]=1
	      *state.inp.selected_time=wimagr_select(*state.inp.selected_time,idx[2])
        selected_time=where(*state.inp.selected_time)
	      state.inp.bit=min(selected_time,max=eit)
	      state.inp.eit=eit
	  end
     end
;     if state.inp.boxscale ne 0 then begin
;       ratio=max((*state.cal).f[where(*state.inp.selected_freq)])/max((*state.cal).f[*state.saved.selected_freq])
;       if state.inp.boxscale eq 1 then ratio=1/ratio
;       cbox[*,0]=(cbox[*,0]-256.d)*ratio+256
;       cbox[*,1]=(cbox[*,1]-256.d)*ratio+256
;     end
     compute_map,state,cbox,header=header,data=data,inp=inp,/noprint,/cbar,/map_only,/auto
;     if state.inp.boxscale ne 0 then begin
;      print,'Clean Box Mean-Center (arcsecs):',[mean(cbox[*,0])-256,mean(cbox[*,1])-256]*state.inp.cellsiz
;      if state.inp.boxscale eq 2 then print,'Clean Box Ratio:',[ratio,max((*state.cal).f[where(*state.inp.selected_freq)]),max((*state.cal).f[*state.saved.selected_freq])] else $
;        print,'Clean Box Ratio:',[ratio,max((*state.cal).f[*state.saved.selected_freq]),max((*state.cal).f[where(*state.inp.selected_freq)])]
;     end
     if n_elements(header) eq 0 or n_elements(data) eq 0 then begin
      answ=dialog_message(['No good data at this position',$
                                 'Operation Aborted!','Please remove bad data from selection and try again.'])
      ptr_free,state.maps
      state.np=0
      state.nf=0
      state.nt=0
      goto,exit_point
     end
     index={cbox:cbox,selected_time:*state.inp.selected_time,selected_freq:*state.inp.selected_freq}
     if state.index eq 0 then begin
      state.maps=ptr_new(reform(replicate({header:strarr(n_elements(header)),data:data*0,index:index},state.np,state.nf,state.nt),state.np,state.nf,state.nt))
      (*state.maps)[0,0,0].header=temporary(header)
      (*state.maps)[0,0,0].data=temporary(data)
      (*state.maps)[0,0,0].index=temporary(index)
     endif else begin
      (*state.maps)[idx[0],idx[1],idx[2]].header=temporary(header)
      (*state.maps)[idx[0],idx[1],idx[2]].data=temporary(data)
      (*state.maps)[idx[0],idx[1],idx[2]].index=temporary(index)
     endelse
     widget_control,widget_info(state.wtop,find_by_uname='tslider'),set_value=idx[2]
     widget_control,widget_info(state.wtop,find_by_uname='fslider'),set_value=idx[1]
     widget_control,widget_info(state.wtop,find_by_uname='pslider'),set_value=idx[0]
     widget_control,widget_info(state.wtop,find_by_uname='TimeFrames'),set_value=strcompress(string(idx[2]+1,state.nt,format="(i12,'/',i12)"),/rem)
     widget_control,widget_info(state.wtop,find_by_uname='FreqFrames'),set_value=strcompress(string(idx[1]+1,state.nf,format="(i12,'/',i12)"),/rem)
     state.index+=1
     if state.index lt state.np*state.nf*state.nt then begin
       if state.abort then begin
         header=(*state.maps)[0:idx[0],0:idx[1],0:idx[2]].header
         data=(*state.maps)[0:idx[0],0:idx[1],0:idx[2]].data
         state.np=idx[0]+1
         state.nf=idx[1]+1
         state.nt=idx[2]+1
         maps=(*state.maps)[0]
         ptr_free,state.maps
         state.maps=ptr_new(reform(replicate(maps,state.np,state.nf,state.nt),state.np,state.nf,state.nt))
         (*state.maps).header=temporary(header)
         (*state.maps).data=temporary(data)
         goto,exit_point
       endif else begin
        WIDGET_CONTROL,state.timer, timer=0
       endelse
     endif else begin
      exit_point:
      state.inp.bit=state.saved.bit
      state.inp.eit=state.saved.eit
      state.inp.bif=state.saved.bif
      state.inp.eif=state.saved.eif
      state.inp.poln=state.saved.poln
      (*state.inp.selected_freq)[*]=0
      (*state.inp.selected_freq)[(*state.saved.selected_freq)]=1
      (*state.inp.selected_time)[*]=0
      (*state.inp.selected_time)[(*state.saved.selected_time)]=1
      widget_control,widget_info(state.wtop,find_by_uname='tslider'),sensitive=(state.nt gt 1),set_slider_min=0, set_slider_max=(state.nt-1)>1
      widget_control,widget_info(state.wtop,find_by_uname='fslider'),sensitive=(state.nf gt 1),set_slider_min=0, set_slider_max=(state.nf-1)>1
      widget_control,widget_info(state.wtop,find_by_uname='pslider'),sensitive=(state.np gt 1),set_slider_min=0, set_slider_max=(state.np-1)>1
      ;IT IS IMPORTANT NOT TO CALL THIS SOONER THAN THIS POINT
      wimagr_tp_draw,state,/skip  
      ;auto_size,state
      ;select_baselines,state
     end
     WIDGET_CONTROL,widget_info(state.wtop,/child), SET_UVALUE=state
     display_map,state,xrange=state.ppd_data_xrange,yrange=state.ppd_data_yrange,/ppd
end

pro auto_size,state
      widget_control,widget_info(state.wtop,find_by_uname='TimeOptions'),get_value=time_synthesis
      widget_control,widget_info(state.wtop,find_by_uname='FreqOptions'),get_value=freq_synthesis
      if time_synthesis[0] eq 1 then begin
       selected_time=wimagr_select(*state.inp.selected_time,count=nt)
       state.nt=nt
      endif else begin
       state.nt=n_elements(where(*state.inp.selected_time))
      endelse
      if freq_synthesis[0] eq 1 then begin
       selected_freq=wimagr_select(*state.inp.selected_freq,count=nf)
       state.nf=nf
      endif else begin
       state.nf=n_elements(where(*state.inp.selected_freq))
      endelse
      widget_control,widget_info(state.wtop,find_by_uname='TimeFrames'),set_value=string(state.nt,format='(i12)')
      widget_control,widget_info(state.wtop,find_by_uname='FreqFrames'),set_value=string(state.nf,format='(i12)')
      state.saved.bit=state.inp.bit
      state.saved.eit=state.inp.eit
      state.saved.bif=state.inp.bif
      state.saved.eif=state.inp.eif
      state.saved.poln=state.inp.poln
      if ptr_valid(state.saved.selected_freq) then *state.saved.selected_freq=where(*state.inp.selected_freq) $
      else state.saved.selected_freq=ptr_new(where(*state.inp.selected_freq))
      if ptr_valid(state.saved.selected_time) then *state.saved.selected_time=where(*state.inp.selected_time) $
      else state.saved.selected_time=ptr_new(where(*state.inp.selected_time))


end


pro compute_map,state,cbox,header=header,data=data,inp=inp,noprint=noprint,map_only=map_only,auto=auto,_extra=_extra
          inp=state.inp
         ;________________________________________________________________________________________
	        inuvfile=state.inp.inuvfile
	        tbegstr=state.inp.tbegstr
	        tendstr=state.inp.tendstr
	        bif=state.inp.bif
	        eif=state.inp.eif
	        bit=state.inp.bit
	        eit=state.inp.eit
	        poln=state.inp.poln
	        imsiz=state.inp.imsiz
	        cellsiz=state.inp.cellsiz
	        niter=state.inp.niter
	        clgain=state.inp.clgain
	        clstop=state.inp.clstop
	        methodstr=state.inp.method
	        outfile=state.inp.outfile
	        clbox=state.inp.clbox
	        xroi=state.inp.xroi
	        yroi=state.inp.yroi
	     ;Just for compatibility with IMGR
	     ;-------------------------------------------------------------------------------------
	        dowhatstring=['D','C','S','M','F']
	        methodstring=['DIRTY MAP','CLEAN MAP','CLEAN + SelfCal','CLEAN + MEM','CLEAN + FwdFit']
	        dowhat=dowhatstring[where(methodstring eq methodstr)]
	        dowhat=dowhat[0]
         ;_______________________________________________________________________________________
         ; store wimagr time range and perform timeframe selection
            widget_control,widget_info(state.wtop,find_by_uname='TIME_SELECTOR'),Get_UVALUE=time_selector
            time=time_selector.selector.time
            tbegstr=state.inp.tbegstr
	        tendstr=state.inp.tendstr
	        inp.tbegstr=msec2str(time[state.inp.bit])
	        inp.tendstr=msec2str(time[state.inp.eit])
         ;
         imagr_vsel, inp, uv_ij, vis_ij, wgt_ij, vsl,noprint=noprint
         if vsl.chk eq 0 then begin
          answ=dialog_message('Either no data or wrong time selected.')
          return
         end
         ;-------------------------------
         ;   Imaging
         ;-------------------------------

         misc =['Remark: '+methodstr] ; will be altered if not 'D' or 'C'
          ;Just for compatibility with IMGR
            ;-------------------------------------------------------------------------------------
            dowhatstring=['D','C','S','M','F']
            methodstring=['DIRTY MAP','CLEAN MAP','CLEAN + SelfCal','CLEAN + MEM','CLEAN + FwdFit']
            dowhat=dowhatstring[where(methodstring eq methodstr)]
            dowhat=dowhat[0]
            ;--------------------------------------------------------------------------------------
         if ~keyword_set(auto) then inp.refcellsiz=0.0
         case dowhat of
         'D' : ovsa_clean, uv_ij, vis_ij, inp, vsl, map, cln, /dirty, win_roi=state.win_roi,win_3maps=state.win_3maps,noprint=noprint
         'C' : ovsa_clean, uv_ij, vis_ij, inp, vsl, map, cln,clbox=cbox , win_roi=state.win_roi,win_3maps=state.win_3maps,noprint=noprint
         'S' : begin
               ovsa_clean, uv_ij, vis_ij, inp, vsl, cmap, cln,clbox=cbox, win_roi=state.win_roi,win_3maps=state.win_3maps,noprint=noprint
               slfcal, cln, uv_ij, vis_ij, map, misc,noprint=noprint
               end
         'M' : begin
               ovsa_clean, uv_ij, vis_ij, inp, vsl, cmap, cln,clbox=cbox, win_roi=state.win_roi,win_3maps=state.win_3maps,noprint=noprint
               ovsa_mem, cmap, cln, uv_ij, vis_ij, wgt_ij, map, misc
               end
         'F' : begin
               clean2, uv_ij, vis_ij, inp, vsl, cmap, cln,clbox=cbox
               fwdfit, cmap, cln, uv_ij, vis_ij, wgt_ij, map, misc
               end
         endcase


            data=map
            header=imagr_whdr(inp,vsl,cln,misc)
            date = sxpar(header,'DATE_OBS')
            time = sxpar(header,'TIME_OBS')
            f = sxpar(header,'FREQ')

            ;__________________________
            ; save all state changes but restore first wimagr global timerange
            inp.tbegstr=tbegstr
	          inp.tendstr=tendstr
            state.inp = inp
            wpix=widget_info(state.wtop,find_by_uname='CPix')
            state.inp.cellsiz=cln.xyint
            widget_control,wpix,set_value=strcompress(string(state.inp.cellsiz),/remove_all)
            freq=(*state.cal).f
             ;___________________________________
             ;Save into the default file (GN: no longer needed)
             np=1
             nf=1
             nt=1
             freq=(*state.cal).f
             offset=[0.0,0.0]
             time=anytim((*state.cal).info.date)+(*state.cal).t*3.6e3
             ;maps=reform({data:data,header:header,index:{selected_freq:*inp.selected_freq,selected_time:*inp.selected_time}},np,nf,nt)
             info={npol:np,nfreq:nf,ntim:nt,offset:offset,active_baselines:inp.selector.active,selected_baselines:inp.selector.select,freq:freq,time:time}
             index={header:header,selected_freq:*inp.selected_freq,selected_time:*inp.selected_time}
             
             tvlct,rgb_curr,/get
             wct=widget_info(state.wtop,find_by_uname='loadct')
             widget_control,wct,get_uvalue=rgb
             tvlct,rgb[*,*,widget_info(wct,/droplist_select)]
             ovsa=wimagr_index2map(data,index, info)
             state.inp.outfile=ovsa.id+ovsa.time
      	     if ~keyword_set(map_only) then begin
      		     wset,state.win_ppd
      			 if obj_isa(state.refmaps,'MAP') then begin
                    selected=widget_info(widget_info(state.wtop,find_by_uname='refmaps'),/droplist_select)
                    if selected gt 0 then refmap=state.refmaps->getmap(selected-1)
                   end
      			 if (keyword_set(refmap)) then begin
      			  o = display_ovsamap(ovsa,refmap=refmap,charsize=0.75,freq=freq,_extra=_extra)
      			  xyouts,!x.crange[0],!y.crange[0]-(max(!y.crange,min=m)-m)/8, state.inp.outfile,color=255
      			 endif else o = display_ovsamap(ovsa,freq=freq,charsize=0.75,_extra=_extra)
      	     end
        		 wset,state.win_map
        		 if obj_isa(state.refmaps,'MAP') then begin
                      selected=widget_info(widget_info(state.wtop,find_by_uname='refmaps'),/droplist_select)
                      if selected gt 0 then refmap=state.refmaps->getmap(selected-1)
                 end
        		 if (keyword_set(refmap)) then begin
        		 o = display_ovsamap(ovsa,refmap=refmap,charsize=0.75,freq=freq,_extra=_extra)
        		  xyouts,!x.crange[0],!y.crange[0]-(max(!y.crange,min=m)-m)/8, state.inp.outfile,color=255
        		 endif else o = display_ovsamap(ovsa,charsize=0.75,freq=freq,_extra=_extra)
        		 tvlct,rgb_curr
                 widget_control,widget_info(state.wtop,find_by_uname='plot'),sensitive=1
                 widget_control, widget_info(widget_info(state.wtop,find_by_uname='AutomaticBase'),find_by_uname='auto'),sensitive=(n_elements(*state.inp.xroi) gt 1)
                 widget_control, widget_info(widget_info(state.wtop,find_by_uname='AutoBase'),find_by_uname='auto'),sensitive=(n_elements(*state.inp.xroi) gt 1)
                 widget_control, widget_info(state.wtop,find_by_uname='autoclean'),sensitive=(n_elements(*state.inp.xroi) gt 1)
  end



pro wimagr_colors, reset=reset,colors=colors
 common saved_colors, r, g, b
 if ~keyword_set(reset) then begin
  tvlct,r,g,b,/get
  tvlct,new_r,new_g,new_b,/get
  distinct_r = [128, 140, 0,128,255,255,255,213,128,  0,  0,  0,  0,  0,255,128,255]
  distinct_g = [  0, 255, 0,  0,  0,  0,128,213,128,255,128,255,  0,  0,  0,  0,255]
  distinct_b = [170,   0, 0,  0,  0,128,  0,  0,  0,  0,  0,255,255,128,255,128,255]
  new_r[1:17] = distinct_r
  new_g[1:17] = distinct_g
  new_b[1:17] = distinct_b
  tvlct,new_r,new_g,new_b
 endif else if n_elements(r)*n_elements(g)*n_elements(b) gt 0 then tvlct,r, g, b
 colors=['violet','lime','black', 'maroon','red','pink',$
			   'orange','yellow','olive','green','dkgreen','cyan',$
			   'blue','dkblue','magenta','purple','white']
end


pro wimagr,inpfile,Group=Group
 if !version.os_family eq 'Windows' then set_plot,'win' else set_plot,'X'
 defsysv,'!DEFAULTS',EXISTS=exists
 if not exists then defparms
 xy= GET_SCREEN_SIZE(RESOLUTION=resolution)
 scr=double(xy[0])/1920
if xy[0] lt 3200 then fontsize=12 else fontsize=24
!defaults.font=strcompress('lucida console*'+string(fontsize),/rem)
if xy[0] lt 3200 then fontsize=12 else fontsize=48
;device,set_font=fontsize
 ;if !d.window ge 0 then wdelete,!d.window
 
 if n_elements(inpfile) eq 0 then inpfile='imagr.inp'

;INITIALIZATION

   input=FILE_SEARCH(inpfile)
   if input[0] ne '' then begin
     restore,input
     if n_elements(inuvfile) ne 0 then goto, has_input
     ntags=n_tags(inp)
     if ntags gt 0 then tagnames=tag_names(inp) else goto,no_input
     for k=0,ntags-1 do begin
      result=execute(tagnames(k)+'=inp.(k)')
     endfor
;     if n_elements(inverted_time) eq 0 then inverted_time=0
   endif else begin
     no_input:
     inuvfile=''
     tbegstr ='00:00:00.000'
     tendstr ='00:00:00.000'
     bit=0
     eit=0
     nt=1
     poln    ='I'
     Bif     =0 ; >=1
     Eif     =0 ; <=nf
     imsiz   =256
     cellsiz =0.0 ;
     clbox   =[-10,-10,10,10]
     niter   =2000
     clgain  =0.05
     clstop  =5.0
     cpixlock =0b
     dowhat  ='C'
     methodstr ='Clean'
     xroi=ptr_new([0])
     yroi=ptr_new([0])
     selected_freq=ptr_new()
     selected_time=ptr_new()
     inverted_time=0
     offset=[0.0,0.0]
     boxscale=0b
     refcellsiz=0.0
     outfile=''
   endelse
    has_input:
    if n_elements(selector) eq 0 then selector={status,active:bytarr(7,7)+1,select:bytarr(7,7)+1}
    if (n_elements(clgain) eq 0) then clgain  =0.05
    if (n_elements(clstop) eq 0) then clstop  =5.    ; Note clgain should be less or equal to clstop/100.
    if (n_elements(cellsiz) eq 0) then cellsiz =0.0
    if (n_elements(offset) ne 2) then offset =[0.0,0.0]
    if (n_elements(cpixlock) eq 0) then cpixlock =0b
    if (n_elements(boxscale) eq 0) then boxscale =0b
    if (n_elements(refcellsiz) eq 0) then refcellsiz =0.0

    imsiz=strcompress(string(imsiz),/remove_all)
    CGain=strcompress(string(clgain,format='(f5.2)'),/remove_all)
    CMin=strcompress(string(clstop,format='(f5.2)'),/remove_all)
    Iter=strcompress(string(niter,format='(i6)'),/remove_all)
    if inuvfile ne '' then begin
        uvfiles=File_Search(inuvfile)
        if uvfiles eq '' then begin
          answ=dialog_message('File '+inuvfile+' not found. Select an existing uv file!')
          uvfiles=dialog_pickfile(filter='*.uv')
        end
        if uvfiles eq '' then begin
        answ=dialog_message('No UV file selected. Application aborted')
         return
        end
        inuvfile=uvfiles[0]
        if inuvfile ne '' then begin
           restore,inuvfile
           freq=strarr(n_elements(cal.f))
           freq[*]=strcompress(string(cal.f[*],format='(f5.1)'),/remove_all)
           time=cal.t*3.6e6
           tp=total(real_part(sqrt(cal.tp*conj(cal.tp))),2,/nan)
           nt=n_elements(time)
           if tbegstr eq '00:00:00.000' then tbegstr=msec2str(time[bit])
           if tendstr eq '00:00:00.000'then tendstr=msec2str(time[eit])
           tsens=1
           f=cal.f
        endif else begin
           tsens=0
           time=[0,0]
           tp=fltarr(2,40)
           cal=''
           freq = ['']
           bit=0
           eit=0
           f=0
           freq_array=ptr_new()
        endelse
    endif else begin
        tsens=0
        time=[0,0]
        tp=fltarr(2,40)
        cal=''
        freq = ['']
        bit=0
        eit=0
        f=0
        freq_array=ptr_new()
    endelse
    if ptr_valid(selected_freq) eq 0 then begin
	   selected_freq=ptr_new(bytarr(n_elements(f)))
	   (*selected_freq)[bif:eif]=1
    end
    if ptr_valid(selected_time) eq 0 then begin
	   selected_time=ptr_new(bytarr(n_elements(time)))
	   (*selected_time)[bit:eit]=1
    end

if n_elements(inp) eq 0 then inp ={inuvfile:inuvfile, tbegstr:tbegstr,tendstr:tendstr, bit:bit, eit:eit, $
    bif:bif, eif:eif, poln:poln, imsiz:imsiz, cellsiz:float(cellsiz), $
    niter:niter, clgain:clgain, clstop:clstop, $
    method:methodstr, outfile:outfile, clbox:clbox,xroi:xroi,yroi:yroi,selector:selector,$
    selected_freq:selected_freq,selected_time:selected_time,inverted_time:inverted_time,offset:offset,cpixlock:cpixlock,boxscale:boxscale,refcellsiz:refcellsiz}

;WIDGET DESIGN

IF N_ELEMENTS(Group) EQ 0 THEN GROUP=0

   wBase = WIDGET_BASE(GROUP_LEADER=Group, $
      Column=1, $
      MAP=1, $
      MBAR=mbar, $
      /TLB_KILL_REQUEST_EVENTS,$
      TITLE='wIMAGR '+inp.inuvfile, $
      UVALUE='MainBase')

   subdirectory=['resource', 'bitmaps']
   Row1=widget_base(wBase,/row,/toolbar)
   ; This base to carry the STATE structure
   Column1=WIDGET_BASE(wBase, Column=1, MAP=1)
   Column2=WIDGET_BASE(wBase, Column=1, MAP=1)

   wTab=widget_tab(font=!defaults.font,Column2,location=0,uname='displaytab')

   wDataSelection=widget_base(wTab,title='Data Selection',/row)
   


   geometry={xsize:long(300*scr),ysize:long(300*scr)}


   LightCurveBase = WIDGET_BASE(wDataSelection, $
      Column=1, $
      MAP=1,/Frame)

   wFileMenu=widget_button(font=!defaults.font,mbar,/menu,value='File')
   wOpenMenu=widget_button(font=!defaults.font,wFileMenu,value='Upload uv OVSA File',uname='open')

   wOpenRef=widget_button(font=!defaults.font,wFileMenu,value='Add Reference Maps',uname='ref',/sep)
   wDelRef=widget_button(font=!defaults.font,wFileMenu,value='Delete All Reference Maps',uname='refdelete')
   CubeOpen=widget_button(font=!defaults.font,wFileMenu,uname='CubeOpen',value='Open Map Cube from FITS',/sep)
   CubeSave=widget_button(font=!defaults.font,wFileMenu,uname='CubeSave',value='Save Map Cube to FITS')
   Save2Map=widget_button(font=!defaults.font,wFileMenu,uname='Save2Map',value='Save Map Cube as Map Structure')

   InpOpen=widget_button(font=!defaults.font,wFileMenu,uname='InpOpen',value='Open Configuration',/sep)
   InpSave=widget_button(font=!defaults.font,wFileMenu,uname='InpSave',value='Save Configuration')

   FileBase  = WIDGET_BASE(Row1, ROW=1, MAP=1)
   wOpen=widget_button(font=!defaults.font,FileBase,value=filepath('open.bmp', subdirectory=subdirectory),/bitmap,uname='open',tooltip='Upload OVSA uv file')

   CubeBase  = WIDGET_BASE(Row1, ROW=1, MAP=1)
   wCubeOpen=widget_button(font=!defaults.font,CubeBase,uname='CubeOpen',value=filepath('dataspace.bmp', subdirectory=subdirectory),/bitmap,tooltip='Open Map Cube from FITS')
   wCubeSave=widget_button(font=!defaults.font,CubeBase,uname='CubeSave',value=filepath('save.bmp', subdirectory=subdirectory),/bitmap,tooltip='Save Map Cube to FITS')
   wSave2Map=widget_button(font=!defaults.font,CubeBase,uname='Save2Map',value=filepath('export.bmp', subdirectory=subdirectory),/bitmap,tooltip='Save Map Cube as Map Structure')

   AutoBase=Widget_Base(Row1,/row,uname='AutoBase')
   wAuto=widget_button(font=!defaults.font,AutoBase, VALUE=filepath('gears.bmp', subdirectory=subdirectory),/bitmap,tooltip='Compute all maps in range',uname='auto',sensitive=(n_elements(*inp.xroi) gt 1 ))
   wAbort=widget_button(font=!defaults.font,AutoBase, VALUE=filepath('stop.bmp', subdirectory=subdirectory),/bitmap,tooltip='Abort automatic map computation',uname='abort',sensitive=(n_elements(*inp.xroi) gt 1 ))


   MapExportBase  = WIDGET_BASE(Row1, ROW=1, MAP=1)
   wPlot=widget_button(font=!defaults.font,MapExportBase ,value=filepath('plot.bmp', subdirectory=subdirectory),/bitmap,tooltip='Plot current map to PostScript file',uvalue='plot',uname='plot')


   LightCurveDisplayBase= WIDGET_BASE(LightCurveBase, $
     Column=1, $
      MAP=1,Frame=0)

   draw_lc=widget_draw(LightCurveDisplayBase,xsize=geometry.xsize,ysize=geometry.ysize)
   SelectionBase = WIDGET_BASE(LightCurveBase, $
      ROW=1, $
      MAP=1)

   
   nt=n_elements(time)


   wSelectionTab=widget_tab(font=!defaults.font,LightCurveBase)
   g={xsize:300*scr*0.47/0.5,ysize:300*scr*0.47/0.5}
   wtime=ovsa_time_selector(wSelectionTab,time=time,selected=*inp.selected_time,inverted=inp.inverted_time,uname='TIME_SELECTOR',title='Time Selector',geometry=g)
   wfrequency=ovsa_frequency_selector(wSelectionTab,f=freq,select=*inp.selected_freq,uname='FREQUENCY_SELECTOR',title='Frequency Selector',/frame)
   wBaselineSelection=widget_base(wDataSelection,title='Data Selection',/column,/frame)
   if n_elements(aatab) eq 0 then aatab=[1,2,4,5,6,7,8]
   for i=0, 6 do aatab[i]=inp.selector.active[i,i]?aatab[i]:255
   wphase=widget_draw(wbaselineselection,xsize=820*scr,ysize=315*scr,uname='PHASE')
   bslider=widget_slider(font=!defaults.font,wbaselineselection,UNAME='bslider',Value=0,min=0,max=20,sensitive=1,xsize=800);,title='Baseline Index')
   wb=widget_base(wBaselineSelection,/row)
   uvbase=widget_base(wb)
   wbbase=wSelectionTab;widget_base(wb)
   wbaseline=ovsa_baseline_selector(wbbase,aatab=aatab,select=inp.selector.select,uname='BASELINE_SELECTOR',title='Baseline Selector',/frame)
   g=widget_info(wtime,/geometry)
   wuv=widget_draw(uvbase,xsize=g.ysize,ysize=g.ysize,uname='uv')
   dbase=widget_base(wb)
   wdm=widget_draw(dbase,xsize=g.ysize,ysize=g.ysize,uname='dm')
   wdmgroup=cw_bgroup(font=!defaults.font,wb,/exclusive,['None','Dirty Map','Dirty Beam'],set_value=0,uname='dm_select',/column)
   children=widget_info(widget_info(widget_info(wdmgroup,/all),/all),/all)
   widget_control,children[0],tooltip='Do not display dirty map or beam'
   widget_control,children[1],tooltip='Display dirty map'
   widget_control,children[2],tooltip='Display dirty beam'



   wImageProductionBase=widget_base(wTab,title='Image Production',/row)
   wImageOptionBase=widget_base(wImageProductionBase,/column,/frame)


   RefBase  = WIDGET_BASE(Row1, ROW=1, MAP=1,/toolbar)
   wref=widget_button(font=!defaults.font,RefBase, VALUE=filepath('plus.bmp', subdirectory=subdirectory),uname='ref',/bitmap,/Align_Left,xsize=geometry.xsize/10,tooltip='Add reference maps')
   wrefdelete=widget_button(font=!defaults.font,RefBase,VALUE=filepath('delete.bmp', subdirectory=subdirectory),uname='refdelete',/bitmap,/Align_Left,xsize=geometry.xsize/10,tooltip='Delete all reference maps')
   wrefmap=widget_droplist(font=!defaults.font,RefBase,UNAME='refmaps',Value='No reference map uploaded',scr_xsize=4*geometry.xsize/5)
   wimagr_ct,rgb,ct
   wloadct=widget_droplist(font=!defaults.font,RefBase,value=ct,uname='loadct',uvalue=rgb)
   widget_control,wloadct,SET_DROPLIST_SELECT=2
   MapOptionTab=widget_base( wImageOptionBase,uname='mapoptiontab',/column)

   MapOptionBase=WIDGET_BASE(MapOptionTab, Column=1, MAP=1,title='Computation Options',/frame)
   lw=widget_label(font=!defaults.font,MapOptionBase,value='MAP COMPUTATION OPTIONS',/align_center)
   lw=widget_label(font=!defaults.font,MapOptionTab,value='.')
   InteractiveBase= WIDGET_BASE(MapOptionTab, Column=1, MAP=1,title='Interactive Map',/frame)
   lw=widget_label(font=!defaults.font,InteractiveBase,value='INTERACTIVE SYNTHESIS MAP',/align_center)
   lw=widget_label(font=!defaults.font,MapOptionTab,value='.')
   AutomaticBase= WIDGET_BASE(MapOptionTab, Column=1, MAP=1,title='Automatic Maps',/frame,uname='AutomaticBase')
   lw=widget_label(font=!defaults.font,AutomaticBase,value='AUTOMATIC MAP GENERATION',/align_center)


   CellBase = WIDGET_BASE(MapOptionBase, Row=1, MAP=1,/Frame)
   
   


;   MBase = WIDGET_BASE(MapOptionBase, column=1, MAP=1,/Frame)



;   methodstring=['DIRTY MAP','CLEAN MAP','CLEAN + SelfCal','CLEAN + MEM','CLEAN + FwdFit']
;   MethodList = widget_droplist(font=!defaults.font,MBase,$
;              VALUE=methodstring,$
;              /DYNAMIC_RESIZE,UNAME='method',UVALUE='method',Title='',xsize=geometry.xsize/2);Computing Method: 

;   widget_control,MethodList,set_droplist_select=where(methodstring eq methodstr)



   LCellBase = WIDGET_BASE(CellBase, Col=1, MAP=1,/frame,xsize=0.49*geometry.xsize)
   RCellBase = WIDGET_BASE(CellBase, Col=1, MAP=1,/frame,xsize=0.49*geometry.xsize)


   ImsizLabel=widget_label(font=!defaults.font,LCellBase, VALUE='Image Size',/Align_Left)
   wImsiz=widget_text(font=!defaults.font,LCellBase,UNAME='Imsiz',Value=imsiz,UVALUE='Imsiz',/editable,/KBRD_FOCUS_EVENTS)
   
   CPixLabel=widget_label(font=!defaults.font,LCellBase, VALUE='Pixel Size',/Align_Left)
   wCPix=widget_text(font=!defaults.font,LCellBase,UNAME='CPix',Value=strcompress(string(inp.cellsiz),/rem),/editable,/KBRD_FOCUS_EVENTS)
   
   methodstring=['DIRTY MAP','CLEAN MAP','CLEAN + SelfCal','CLEAN + MEM','CLEAN + FwdFit']
   wlabel=widget_label(font=!defaults.font,LCellBase,value='Computing Method',/align_left)
   MethodList = widget_droplist(font=!defaults.font,LCellBase,$
     VALUE=methodstring,$
     /DYNAMIC_RESIZE,UNAME='method',UVALUE='method',Title='',xsize=0.49*geometry.xsize);Computing Method:
   widget_control,MethodList,set_droplist_select=where(methodstring eq inp.method)
   
  
   cLockPixelSize=cw_bgroup(font=!defaults.font,LCellBase,['Lock Pixel Size'],UNAME='LockPix',/nonexclusive,/row,set_value=inp.cpixlock)
  

   CGainLabel=widget_label(font=!defaults.font,RCellBase, VALUE='CGain',/Align_Left)
   wCGain=widget_text(font=!defaults.font,RCellBase,UNAME='CGain',Value=CGain,UVALUE='CGain',/editable,/KBRD_FOCUS_EVENTS)
   
 

   CMinLabel=widget_label(font=!defaults.font,RCellBase, VALUE='CMin',/Align_Left)
   wCMin=widget_text(font=!defaults.font,RCellBase,UNAME='CMin',Value=CMin,UVALUE='CMin',/editable,/KBRD_FOCUS_EVENTS)
   
   
   NIterLabel=widget_label(font=!defaults.font,RCellBase, VALUE='# Iterations',/Align_Left)
   wNIterSize=widget_text(font=!defaults.font,RCellBase,UNAME='NIter',Value=iter,UVALUE='NIter',/editable,/KBRD_FOCUS_EVENTS)
   
   boxscale = cw_bgroup(set_value=inp.boxscale,font=!defaults.font,RCellBase,['Lock Clean Box Area'],UNAME='BOXSCALE',/nonexclusive,/row,xsize=0.49*geometry.xsize)


   ColOptionBase=widget_base(AutomaticBase,/row,/frame)
   AutoPol= cw_bgroup(font=!defaults.font,ColOptionBase,['I','R','L'],UNAME='AutoPol',/nonexclusive,/column,set_value=1)
   LeftOptionBase=widget_base(ColOptionBase,/Column,/frame,xsize=0.4*geometry.xsize)
   RightOptionBase=widget_base(ColOptionBase,/Column,/frame,xsize=0.4*geometry.xsize)
   wAuto=widget_button(font=!defaults.font,AutomaticBase, VALUE=strupcase('Compute all maps in range'),uname='auto',/Align_Center,sensitive=(n_elements(*inp.xroi) gt 1 ),xsize=geometry.xsize)
   wAbort=widget_button(font=!defaults.font,AutomaticBase, VALUE=strupcase('Abort map computation'),uname='abort',/Align_Center,sensitive=(n_elements(*inp.xroi) gt 1 ),xsize=geometry.xsize)


   FreqOptions=cw_bgroup(font=!defaults.font,LeftOptionbase,['Freq. synthesis'],/column,/nonexclusive,set_value=[1],uname='FreqOptions')
   TimeOptions=cw_bgroup(font=!defaults.font,RightOptionbase,['Time synthesis'],/column,/nonexclusive,set_value=[1],uname='TimeOptions')

   base=widget_base(RightOptionbase,/row)
   ;Label=widget_label(font=!defaults.font,base, VALUE='Time Frames: ',/Align_Left)
   wTimeFrames=widget_text(font=!defaults.font,base,UNAME='TimeFrames',Value='1')
   base=widget_base(LeftOptionbase,/row)
   ;Label=widget_label(font=!defaults.font,base, VALUE='Freq. Frames: ',/Align_Left)
   wFreqFrames=widget_text(font=!defaults.font,base,UNAME='FreqFrames',Value='1')

   InteractiveButtonBase=widget_base(InteractiveBase,/column,/frame)
   xsize=geometry.xsize
   wMap=widget_button(font=!defaults.font, InteractiveButtonBase,  VALUE=strupcase('Compute synthesis map (select clean box)'),UVALUE='map',UNAME='map',/Align_Left,xsize=xsize)
   ;wSaveCleanBox=widget_button(font=!defaults.font, InteractiveButtonBase, VALUE='Save current clean box to file',uname='savecleanbox',/Align_Left,xsize=xsize)
   ;wOpenCleanBox=widget_button(font=!defaults.font, InteractiveButtonBase, VALUE='Restore clean box from file',uname='opencleanbox',/Align_Left,xsize=xsize)

   PolList= widget_droplist(font=!defaults.font,widget_base(InteractiveBase,/frame),$
              VALUE=['I','R','L'],$
              /DYNAMIC_RESIZE,UNAME='Pol',UVALUE='Pol',Title='Syntesis Map Polarization:')
   widget_control,PolList,set_droplist_select=where(['I','R','L'] eq poln)
   wAutoCleanMap=widget_button(font=!defaults.font, widget_base(InteractiveBase,/frame), VALUE=strupcase('Compute synthesis map (same clean box) '),uname='autoclean',sensitive=(n_elements(*inp.xroi) gt 1 ),/Align_Left,xsize=xsize)


   wImageProductionPage=widget_base(wImageProductionBase,/column)
   w3Maps=widget_draw(wImageProductionPage,xsize=800*scr,ysize=250*scr)
   extra=widget_base(wImageProductionPage,/row)
   mapsize=400*scr
   roisize=512*scr
   wROI=widget_draw(extra,xsize=roisize,ysize=roisize,X_SCROLL_SIZE=mapsize-20, Y_SCROLL_SIZE=mapsize-20)
   wMap=widget_draw(extra,xsize=mapsize,ysize=mapsize)



   wPostProductionPage=widget_base(wTab,title='Image Post Production',/row)
   Column0=widget_base( wPostProductionPage,/column,ysize=geometry.ysize,/frame)

   lc_geo=widget_info(draw_lc,/geo)
   draw_lc_ppd=widget_draw(Column0,xsize=lc_geo.xsize,ysize=lc_geo.ysize,uname='TPD')
   SelectionBase = WIDGET_BASE(LightCurveBase, $
      ROW=1, $
      MAP=1)
   wMovieBase=widget_base(Column0,/row,xsize=lc_geo.xsize,/frame)
   wMovieSelection=cw_bgroup(font=!defaults.font,wMovieBase,/exclusive,['Time','Frequency'],uname='MovieSelection',set_value=0,/row,/frame)
   wMovieToolBase=widget_base(wMovieBase,/toolbar,/row)
   wPlayMovie=widget_button(font=!defaults.font,wMovieToolBase,value=filepath('eba_meth_ex_cm.bmp',subdirectory=subdirectory),/bitmap,tooltip='Play Selected Frames',uname='PlayMovie')
   wSaveMovie=widget_button(font=!defaults.font,wMovieToolBase,value=filepath('export.bmp',subdirectory=subdirectory),/bitmap,tooltip='Save Movie',uname='SaveMovie')
   wMovieRate=widget_slider(font=!defaults.font,Column0,xsize=lc_geo.xsize,value=24,min=1, max=24,title='Playback Frames/Second',uname='fps')
  
   
   Column1=widget_base( wPostProductionPage,/column,/frame)
   wDisplay=widget_draw(Column1,xsize=512*scr,ysize=512*scr, /BUTTON_EVENTS, /motion_events,uname='PPD')
   ScrollBase=widget_base(Column1,/row)
   pslider=widget_slider(font=!defaults.font, ScrollBase,UNAME='pslider',Value=0,min=0,max=1,sensitive=0,xsize=92,title='Polarization')
   fslider=widget_slider(font=!defaults.font, ScrollBase,UNAME='fslider',Value=0,min=0,max=1,sensitive=0,xsize=210,title='Frequency')
   tslider=widget_slider(font=!defaults.font, ScrollBase,UNAME='tslider',Value=0,min=0,max=1,sensitive=0,xsize=210,title='Time')
   beam=widget_text(font=!defaults.font, ScrollBase,UNAME='beam',value='a=undefined'+string([13B, 10B])+'b=undefined'+string([13B, 10B])+'phi=undefined',ysize=3)
   geometry=widget_info(Column1,/geometry)
   Column2=widget_base( wPostProductionPage,/column,ysize=geometry.ysize,/frame)


   wimagr_colors,/reset,colors=colors
   thick=['normal','2x','3x','4x','5x']
   wOffsetBase=widget_base(column2,/row,/frame,xsize=lc_geo.xsize) 
   cbase=widget_base(column2,/frame,/column)
    
   Ibase=widget_base(cbase,/row,uname='IBASE')
   Icolor = widget_droplist(font=!defaults.font,Ibase,value=colors,uname='ICOLORS')
   widget_control,icolor,set_droplist_select=16
   Ithick = widget_droplist(font=!defaults.font,Ibase,value=thick,uname='ITHICK')
   Icontours=cw_bgroup(font=!defaults.font,Ibase,['I Contours'],/nonexclusive,set_value=0,uname='ICONTOURS')
   Rbase=widget_base(cbase,/row,uname='RBASE',sensitive=1)
   Rcolor = widget_droplist(font=!defaults.font,Rbase,value=colors,uname='RCOLORS')
   widget_control,rcolor,set_droplist_select=4
   Rthick = widget_droplist(font=!defaults.font,Rbase,value=thick,uname='RTHICK')
   Icontours=cw_bgroup(font=!defaults.font,Rbase,['R Contours'],/nonexclusive,set_value=0,uname='RCONTOURS')
   Lbase=widget_base(cbase,/row,uname='LBASE',sensitive=1)
   Lcolor = widget_droplist(font=!defaults.font,Lbase,value=colors,uname='LCOLORS')
   widget_control,lcolor,set_droplist_select=12
   Lthick = widget_droplist(font=!defaults.font,Lbase,value=thick,uname='LTHICK')
   Lcontours=cw_bgroup(font=!defaults.font,Lbase,['L Contours'],/nonexclusive,set_value=0,uname='LCONTOURS')
   levels=(1+indgen(9))*10
   value=[0,       0,       1,       0,       1,       0,       1,       0,1]
   wlevels=cw_bgroup(font=!defaults.font,column1,string(levels,format="(i3,'%')"),/nonexclusive,/row,set_value=value,uname='LEVELS',/frame)
   widget_control,wlevels,set_uvalue=levels

   cbase=widget_base(column2,/frame,/column)
   AddContourBase=widget_base(cbase,uname='addcontourbase',/column)
   cbuttonbase=widget_base(cbase,/row)
   wadd=widget_button(font=!defaults.font,cbuttonbase,VALUE=filepath('plus.bmp', subdirectory=subdirectory),uname='addcontour',/bitmap,/Align_Left,tooltip='Add contour map')
   wdelete=widget_button(font=!defaults.font,cbuttonbase,VALUE=filepath('delete.bmp', subdirectory=subdirectory),uname='deletecontour',/bitmap,/Align_Left,tooltip='Delete contour map',sensitive=0)

  addbase=widget_info(wbase,find_by_uname='addcontourbase')
  wrefmaps=widget_info(wbase,find_by_uname='refmaps')
  widget_control,wrefmaps,get_value=value
  cbase=widget_base(addbase,/column,/frame,uname='cbase')
  row1=widget_base(cbase,/row,uname='row1')
  row2=widget_base(cbase,/row,uname='row2')
  wimagr_colors,/reset,colors=colors
  thick=['normal','2x','3x','4x','5x']
  ccolor = widget_droplist(font=!defaults.font,row1,value=colors,uname='C_COLORS')
  cthick = widget_droplist(font=!defaults.font,row1,value=thick,uname='C_THICK')
  ocheck = cw_bgroup(font=!defaults.font,row1,['Draw Contours'],set_value=1,uname='C_CHECK',/nonexclusive,/column)
  contourmap=widget_droplist(font=!defaults.font,row2,UNAME='contourmap',Value=value,xsize=240)

  xbase=widget_base(wOffsetBase,/column)
  xoffLabel=widget_label(font=!defaults.font,xbase, VALUE='OVSA X Offset',/Align_Left)
  geo=widget_info(cbase,/geo)
  wxoff=widget_text(font=!defaults.font,xbase,UNAME='xoff',Value=string(inp.offset[0]),/editable,/KBRD_FOCUS_EVENTS,scr_xsize=geo.xsize/3)
  ybase=widget_base(wOffsetBase,/column)
  yoffLabel=widget_label(font=!defaults.font,ybase, VALUE='OVSA Y Offset',/Align_Left)
  wyoff=widget_text(font=!defaults.font,ybase,UNAME='yoff',Value=string(inp.offset[1]),/editable,/KBRD_FOCUS_EVENTS,scr_xsize=geo.xsize/3)
  woff=cw_bgroup(font=!defaults.font,wOffsetBase,[' '],/nonexclusive,set_value=0,uname='off',label_top='Apply Offset')


   ; Realize the heirarchy

   widget_control,wbase,/realize
   device,set_font=fontsize

   widget_control,draw_lc,get_value=lc_win
   widget_control,draw_lc_ppd,get_value=lc_win_ppd
   widget_control,w3Maps,get_value=win_3maps
   widget_control,wRoi,get_value=win_roi
   widget_control,wMap,get_value=win_map
   widget_control,wDisplay,get_value=win_ppd
   widget_control,wPhase,get_value=win_phase
   widget_control,wuv,get_value=win_uv
   widget_control,wdm,get_value=win_dm
   state={inp:inp,cal:ptr_new(cal),map:ptr_new(''),refmaps:obj_new(),$
   lc:ptr_new({time:time/1000,tp:tp}),lc_win:lc_win,lc_win_ppd:lc_win_ppd,win_roi:win_roi,win_map:win_map,win_phase:win_phase,win_uv:win_uv,win_dm:win_dm,$
   win_ppd:win_ppd,ppd_dev_xrange:[0,0],ppd_dev_yrange:[0,0],ppd_data_xrange:[0.0,0.0],ppd_data_yrange:[0.0,0.0],$
   left_button_down:0,win_3maps:win_3maps,wtop:wbase,nt:0l, nf: 0l,np:1,$
   index:0l,maps:ptr_new(),timer:AutomaticBase,saved:{bit:0l,eit:0l,bif:0l,eif:0l,poln:'',selected_freq:ptr_new(),selected_time:ptr_new()},autopol:['I','',''],abort:0,off:0}
   if state.inp.inuvfile ne '' then wimagr_tp_draw,state
   widget_control,widget_info(wBase,/child),set_uvalue=state, /no_copy
   
   ; Call XMANAGER to handle the event messages
   xmanager,'WImagr',wBase, /NO_BLOCK

end