  PRO diff_ref, list, DARK=dark, NET=net, WRT=wrt, LIST_OUT=list_out, KEEP=keep, $
               layout = layout, BKG=BKG

@wload.com
@chandle.com

   ;list = rd_asc(list)

   IF N_ELEMENTS( list ) LT 2 THEN RETURN

   IF NOT KEYWORD_SET ( layout ) THEN layout =0  ; no layout
   IF NOT KEYWORD_SET ( keep ) THEN keep = 0     ; don't keep images in memory
   IF NOT KEYWORD_SET ( dark ) THEN dark = 0     ; don't subtract dark
   IF NOT KEYWORD_SET ( net ) THEN net = 0       ; don't normalize exp. time
   IF NOT KEYWORD_SET ( wrt ) THEN wrt = 0       ; don't write
   IF NOT KEYWORD_SET ( list_out ) THEN list_out = "working.lst"
   IF NOT KEYWORD_SET ( bkg ) THEN bkg = 0	 ; background image

   IF N_ELEMENTS(img_resize) EQ 0 THEN img_resize = 1.0
    
   n = N_ELEMENTS( list )

   IF KEYWORD_SET(bkg) THEN BEGIN     
     head = HEADFITS(list(0))
     h    = LASCO_FITSHDR2STRUCT(head)
     ref  = GETBKGIMG(h,hdrm) 
     ref_name = hdrm.filename
     first = 0
   ENDIF ELSE BEGIN
     ref = READFITSL( list(0), head )
     first = 1
   ENDELSE

check:
   IF N_ELEMENTS(ref) EQ 1 THEN BEGIN
    text = " Error opening file: "+list(0)
    dummy = WIDGET_MESSAGE(text,/ERROR)
    res = wyes_no(0,label='Do you now where is this image?',xs=40,ys=1)
    IF res.yn EQ "Yes" THEN BEGIN
      tmpl = pickfile()
      ref = READFITSL( tmpl, head )
      hdrm = LASCO_FITSHDR2STRUCT(head)
      ref_name = hdrm.filename
      goto,check
    ENDIF ELSE BEGIN
     RETURN
    ENDELSE
   ENDIF

   resize = img_resize 

   ; check header for SUMROW and SUMCOL
   sumrow  = FXPAR(head,"SUMROW") 
   sumcol  = FXPAR(head,"SUMCOL")
   lebxsum = FXPAR(head,"LEBXSUM")
   lebysum = FXPAR(head,"LEBYSUM")
   if ( sumrow  eq 0 ) then sumrow = 1
   if ( sumcol  eq 0 ) then sumcol = 1
   if ( lebxsum eq 0 ) then lebxsum = 1
   if ( lebysum eq 0 ) then lebysum = 1 

   nxsum = sumcol*lebxsum
   nysum = sumrow*lebysum

   naxis1 = FXPAR(head,"NAXIS1")
   naxis2 = FXPAR(head,"NAXIS2")

   resize = img_resize 
   
   IF img_resize EQ -1 THEN nxsum = sumcol ; for full resolution
   
      IF datatype(ref) EQ "INT" and min(ref) LT 0 THEN BEGIN
   
    ref = FLOAT(ref)
    ind = WHERE(ref LT 0)
    ref(ind) = ref(ind) + 65536.0
   
   
   ENDIF
   
   IF nxsum GT 0 THEN BEGIN
      resize = nxsum * ABS(img_resize)
      ref = resize_img(ref,resize,head)
   ENDIF ELSE BEGIN
      ref = resize_img(ref,resize,head)
   ENDELSE


   r1col_ref  = FXPAR(head,"R1COL") - 20
   r1row_ref  = FXPAR(head,"R1ROW") -  1
   r2col_ref  = FXPAR(head,"R2COL") - 20 
   r2row_ref  = FXPAR(head,"R2ROW") -  1
                 
   IF dark EQ 1 THEN BEGIN
        detector = STRCOMPRESS(SXPAR(head,'DETECTOR'),/REMOVE_ALL)
        readport = STRCOMPRESS(SXPAR(head,'READPORT'),/REMOVE_ALL)
	ref = TEMPORARY(ref) - get_bias(head)*lebxsum*lebysum
   ENDIF

   IF net EQ 1 THEN BEGIN
      exptime = FLOAT(chk_h4s(head,"EXPTIME"))
      IF exptime EQ -1 THEN XVAREDIT,exptime
      ref = TEMPORARY(ref) / exptime
   ENDIF

   rsz = size(ref)  ; ref image size
   
   ref_name = cat_name(list(0))

   wdir = GETENV('WORK')+!delimiter+GETENV('USER')+!delimiter+'fits'+!delimiter

   IF chk_dir(wdir) EQ 0 THEN wdir = GETENV('HOME')+!delimiter

   diff_list = ''
   FOR i=first,n-1 DO BEGIN

   next_valid_image: print,"Image ",i," : ",list(i)
   
   image = readfitsl( list(i), head )

   r1col  = FXPAR(head,"R1COL") - 20
   r1row  = FXPAR(head,"R1ROW") -  1
   r2col  = FXPAR(head,"R2COL") - 20 
   r2row  = FXPAR(head,"R2ROW") -  1

        IF N_ELEMENTS(image) EQ 1 THEN BEGIN
          undefine, image
          text = " Error opening file: "+list(i)
          dummy = WIDGET_MESSAGE(text,/ERROR)
          ;new_hdrs(j) = 'Error opening file: '+list(i)          
        IF i EQ n-1 THEN GOTO,finish
          i=i+1 & GOTO,next_valid_image
        ENDIF

   resize = img_resize 
   ; check header for SUMROW and SUMCOL
   
   sumrow  = FXPAR(head,"SUMROW") 
   sumcol  = FXPAR(head,"SUMCOL")
   lebxsum = FXPAR(head,"LEBXSUM")
   lebysum = FXPAR(head,"LEBYSUM")
   if ( sumrow  eq 0 ) then sumrow = 1
   if ( sumcol  eq 0 ) then sumcol = 1
   if ( lebxsum eq 0 ) then lebxsum = 1
   if ( lebysum eq 0 ) then lebysum = 1 

   nxsum = sumcol*lebxsum
   nysum = sumrow*lebysum

   naxis1 = FXPAR(head,"NAXIS1")
   naxis2 = FXPAR(head,"NAXIS2")

   resize = img_resize 
   
   IF img_resize EQ -1 THEN nxsum = sumcol ; for full resolution
   
   IF datatype(image) EQ "INT" and min(image) LT 0 THEN BEGIN
   
    image = FLOAT(image)
    ind = WHERE(image LT 0)
    image(ind) = image(ind) + 65536.0
   
   
   ENDIF
   
   IF nxsum GT 0 THEN BEGIN
      resize = nxsum * ABS(img_resize)
      image = resize_img(image,resize,head)
   ENDIF ELSE BEGIN
      image = resize_img(image,resize,head)
   ENDELSE

   sz = size(image)	; image size
   
   ; check image and ref image size
   
;   IF (sz(1) NE rsz(1)) OR (sz(2) NE rsz(2)) THEN BEGIN
;      print,"%DIFF_REF: image size # reference image size.
;      IF i EQ n-1 THEN GOTO,finish
;      i=i+1 & GOTO,next_valid_image
;   ENDIF       
 
   IF KEYWORD_SET(bkg) THEN BEGIN
     ref1 = ref(0:r2col-r1col,0:r2row-r1row)	;bckgrd image is 1024x1024   
   ENDIF ELSE BEGIN
     ref1 = ref
   ENDELSE
   
   ; header need update for sumrow & sumcol
      
   head = fparmodify(head,'SUMROW','0')
   head = fparmodify(head,'SUMCOL','0')

   name = cat_name(list(i)) + "-" + ref_name

   IF dark EQ 1 THEN BEGIN
     detector = STRCOMPRESS(SXPAR(head,'DETECTOR'),/REMOVE_ALL)
     readport = STRCOMPRESS(SXPAR(head,'READPORT'),/REMOVE_ALL)
     image = TEMPORARY(image) - get_bias(head)*lebxsum*lebysum
   ENDIF

   IF net EQ 1 THEN BEGIN
      exptime = FLOAT(chk_h4s(head,"EXPTIME"))
      IF exptime EQ -1 THEN XVAREDIT,exptime
      image = TEMPORARY(image) / exptime
   ENDIF

   image = TEMPORARY(image) - ref1 
   
   IF keep EQ 1 THEN chandle  ; save image in memory
   
   SXADDPAR,head,'HISTORY','=' + "'" + name + "'" + '/'
   
   IF layout EQ 1 THEN BEGIN
   
    IF N_ELEMENTS(lo) EQ 0 THEN $
     lo = { layout1, cmask:1, cgrid:1, clogo:1, cdate:1, cid:1, cgrp:1 }
     
     IF keep EQ 0 THEN hindex = -1
     layout,image,name,head,hindex
   ENDIF
      
    IF wrt EQ 1 THEN BEGIN
     WRITEFITS,wdir+name,image,head
     diff_list = [diff_list, wdir + name]
    ENDIF

   ENDFOR
   finish:

    IF wrt EQ 1 THEN BEGIN

      ldir = GETENV('WORK')+!delimiter+GETENV('USER')+!delimiter+ $
	     'list'+!delimiter
      IF chk_dir(ldir) EQ 0 THEN ldir = GETENV('HOME')+!delimiter

      ind = WHERE(diff_list NE '')
      diff_list = diff_list(ind)
      wrt_asc,ldir + list_out,diff_list

    ENDIF
RETURN
END

