FUNCTION SXTKaySea, idx, item, op, val, op2=op2, val2=val2, $
            op3=op3, val3=val3
;   ------------------------------------------------------------
;   ------------------------------------------------------------
;   ON_ERROR, 2 ;force a return from caller if error occurs

    Print, 'SXTKaySea Search for >>' , item, ' ', op, ' ', val

;   Define the OPERATIONAL-tag-name list for valid keyed searches: 
    taglist = ['IMG_MAX','PERCENTD','OBSREGION','SHAPE_CMD','FOV_CENTER', $
            'EXPMODE','MBE','ASPDR','SHUT','XRAY','OPT', $
            'CAD','COMP','NROIS','RES']
    ntaglist = N_Elements(taglist)
;   Notes:
;       1) ASPDR, SHUT, XRAY, OPT   are from 'PERIPH'
;       2) EXPMODE, MBE         are from 'EXPLEVMODE'
;       3) cad, comp,nRoIs, res     are from 'ImgParam'


;   SXT tag-field list (not used yet):
    sxt = ['entry_type','time','day','DP_mode','DP_rate', $
        'pfi_ffi','periph','ExpLevMode','imgparam', $
        'ObsRegion','seq_table','shape_cmd','FOV_Center', $
        'Img_Max','Img_Avg','percentD']

;   check item name for type of processing:
    item = STRUPCASE(item)
    
    ck = WHERE(item eq taglist)
    IF (ck(0) eq -1) THEN BEGIN
      Print, '**** Requested Search Tag Not SUPPORTED at this time ****'
      PRINT, '**************', item , '*******************'
      RETURN, -1        ;set no match flag
    ENDIF

    CASE item OF  
      'IMG_MAX':    BEGIN
              val = FIX(val) 
              CASE op OF
                '<':  ret = WHERE(idx.img_max lt val)
                '>':  ret = WHERE(idx.img_max gt val)
                '=':  ret = WHERE(idx.img_max eq val)
                ELSE: BEGIN
                print, '**** not a valid operator ****'
                return, -1
                      END
              ENDCASE
            END  
      'PERCENTD':   BEGIN
              val = FIX(val) 
              CASE op OF
                '<':  ret = WHERE(idx.percentd lt val)
                '>':  ret = WHERE(idx.percentd gt val)
                '=':  ret = WHERE(idx.percentd eq val)
                ELSE: BEGIN
                print, '**** not a valid operator ****'
                return, -1
                      END
              ENDCASE
            END         
      'OBSREGION':  BEGIN
              val = FIX(val) 
              CASE op OF
                '<':  ret = WHERE(idx.ObsRegion lt val)
                '>':  ret = WHERE(idx.ObsRegion gt val)
                '=':  ret = WHERE(idx.ObsRegion eq val)
                ELSE: BEGIN
                print, '**** not a valid operator ****'
                return, -1
                      END
              ENDCASE
            END
      'SHAPE_CMD':  BEGIN
;             Using op check val:
              IF (val eq '*') THEN BEGIN
;               Return all indices:
                nidx = N_Elements(idx)  ;# of elements
                ret  = INDGEN(nidx)
              ENDIF ELSE BEGIN
                val = FIX(val) 
                CASE op OF
                  '<':  ret = WHERE(idx.Shape_Cmd(0) lt val)
                  '>':  ret = WHERE(idx.Shape_Cmd(0) gt val)
                  '=':  ret = WHERE(idx.Shape_Cmd(0) eq val)
                  ELSE: BEGIN
                     print, '**** not a valid operator ****'
                     return, -1
                        END
                ENDCASE              
              ENDELSE
;             Using op2 check val2:
              IF (val2 eq '*') THEN BEGIN
;               Return all indices:
                nidx = N_Elements(idx)  ;# of elements
                ret2 = INDGEN(nidx)
              ENDIF ELSE BEGIN
                val2 = FIX(val2) 
                CASE op2 OF
                  '<':  ret2 = WHERE(idx.Shape_Cmd(1) lt val2)
                  '>':  ret2 = WHERE(idx.Shape_Cmd(1) gt val2)
                  '=':  ret2 = WHERE(idx.Shape_Cmd(1) eq val2)
                  ELSE: BEGIN
                     print, '**** not a valid operator ****'
                     return, -1
                        END
                ENDCASE              
              ENDELSE
;             Merge ret and ret2:
              nret2 = N_Elements(ret2)  ;number of elements
              IF (nret2 GT 0) THEN BEGIN
                both  = ret2        ;initialize 
                            FOR i=0, nret2-1 DO BEGIN
                  both(i) = WHERE( ret eq ret2(i) ) ;same index
                ENDFOR
                iboth = WHERE(both ne -1)   ;delete invalid matches
                IF (iboth(0) ne -1) THEN BEGIN
                  ret = ret( both(iboth) )  ;remap index-ptr
                ENDIF ELSE BEGIN
                  ret=iboth
                ENDELSE
              ENDIF
            END
      'FOV_CENTER': BEGIN
              print,'start FOV-center: val, val2, val3 '
            help,val,val2,val3                                
              IF (NOT N_Elements(val3)) THEN BEGIN  ;undefined
                op3 = '='       ;default value of oper
                val3= '180'     ;3arcmin 
                          ENDIF
              CASE val3 OF      ;handle west,east,n and s
                'E': val3='112'
                'W': val3='112'
                'NA': val3='150'
                'SA': val3='150'
                ELSE:
              ENDCASE
              val3= FIX(val3)
              print,'FOV-center: val, val2, val3 '
            help,val,val2,val3                                

              IF (val eq '*') THEN BEGIN    ;get all
               ret = INDGEN(N_ELEMENTS(idx))
              ENDIF ELSE BEGIN      ;select
                           val = FIX(val)   ;convert to integer
               CASE op OF 
                '<':  ret = WHERE(idx.FOV_Center(0) lt val)
                '>':  ret = WHERE(idx.FOV_Center(0) gt val)
                '=':  ret = WHERE((idx.FOV_Center(0) gt val-val3) $
                     AND (idx.FOV_Center(0) lt val+val3))
                ELSE: BEGIN
                       print, '**** not a valid operator ****'
                       return, -1
                  END
               ENDCASE      
              ENDELSE

              IF (val2 eq '*') THEN BEGIN   ;get all
               ret2 = INDGEN(N_ELEMENTS(idx))
              ENDIF ELSE BEGIN      ;select   
               val2= FIX(val2)  
               CASE op2 OF
                '<':  ret2 = WHERE(idx.FOV_Center(1) lt val2)
                '>':  ret2 = WHERE(idx.FOV_Center(1) gt val2)
                '=':  ret2 = WHERE((idx.FOV_Center(1) gt val2-val3) $
                     AND (idx.FOV_Center(1) lt val2+val3))
                ELSE: BEGIN
                       print, '**** not a valid operator ****'
                       return, -1
                  END
               ENDCASE            
              ENDELSE
        stop,'ck ret2 values '
;             Merge ret and ret2:
              nret2 = N_Elements(ret2)  ;number of elements
              IF (nret2 GT 0) THEN BEGIN
                both  = ret2        ;initialize 
                            FOR i=0, nret2-1 DO BEGIN
                  both(i) = WHERE( ret eq ret2(i) ) ;same index
                ENDFOR
                iboth = WHERE(both ne -1)   ;delete invalid matches
                IF (iboth(0) ne -1) THEN BEGIN
                  ret = ret( both(iboth) )  ;remap index-ptr
                ENDIF ELSE BEGIN
                  ret=iboth
                ENDELSE
              ENDIF
            END
      'EXPMODE':    BEGIN       ;*** Begin ExpLevMode ***
              val = STRUPCASE(val)
              seaval = ReqExpVal(expMode=val)
              expmode= MskExpLev(idx.ExpLevMode,/expMode)
              ret    = WHERE(expmode eq seaval(0))
            END
      'MBE':    BEGIN
                          val = BYTE(fix(val))  ;convert to byte value
              seaval = ReqExpVal(expLev=val)
              explev = MskExpLev(idx.ExpLevMode,/expLev)
              ret    = WHERE(explev eq seaval(0)) 
            END
      'ASPDR':  BEGIN       ;*** Begin Periph *** 
              val = STRUPCASE(val)
              IF (val eq 'OPEN') THEN BEGIN
                seaval = ReqPerVal(aspdr=val)
                aspdr  = MskPer(idx.periph,/aspdr)
                ret = WHERE(aspdr eq seaval(0))
              ENDIF ELSE BEGIN
                seaval = ReqPerVal()    ;door closed
                aspdr  = MskPer(idx.periph,/aspdr)
                ret = WHERE(aspdr eq seaval(0))
              ENDELSE 
            END
      'SHUT':   BEGIN       ;*** periph ***
              val = STRUPCASE(val)
              IF (val eq 'OPEN') THEN BEGIN
                seaval = ReqPerVal(shut=val)
                shutter = MskPer(idx.periph,/shut)
                ret = WHERE(shutter eq seaval(0))
              ENDIF ELSE BEGIN
                seaval = ReqPerVal()    ;frame-Transfer
                shutter = MskPer(idx.periph,/shut)
                ret = WHERE(shutter eq seaval(0))
              ENDELSE
            END
      'XRAY':   BEGIN       ;*** periph ***
              val = STRUPCASE(val)
              seaval = ReqPerVal(xray=val)
              xray   = MskPer(idx.periph,/xray)
              ret = WHERE(xray eq seaval(0))
            END
      'OPT':    BEGIN       ;*** periph ***
              val = STRUPCASE(val)
              seaval = ReqPerVal(opt=val)
              opt    = MskPer(idx.periph,/opt)
              ret    = WHERE(opt eq seaval(0))
            END
      'CAD':    BEGIN       ;*** ImgParam ***
              val = STRUPCASE(val)
              seaval = ReqImgVal(cad=val)
              cad    = MskImg(idx.ImgParam,/cad)
              ret    = WHERE(cad eq seaval(0))
            END
      'COMP':   BEGIN       ;*** ImgParam ***
              val = STRUPCASE(val)
              seaval = ReqImgVal(comp=val)
              comp   = MskImg(idx.ImgParam,/comp)
              ret    = WHERE(comp eq seaval(0))
            END
      'RES':    BEGIN       ;*** ImgParam ***
              val = STRUPCASE(val)
              seaval = ReqImgVal(res=val)
              res    = MskImg(idx.ImgParam,/res)
              ret    = WHERE(res eq seaval(0))
            END
      'NROIS':  BEGIN       ;*** ImgParam ***
              val = STRUPCASE(val)
              seaval = ReqImgVal(nrois=val)
              nrois  = MskImg(idx.ImgParam,/nrois)
              ret    = WHERE(nrois eq seaval(0))
            END
      ELSE: BEGIN

        END 
    ENDCASE

    RETURN, ret
    END