function where_within, range, valid_range, count, bad_count=bad_count, bad_ind=bad_ind

count = 0
bad_count = 0
bad_ind = -1

inrange = range
;allow range to have 2 elements along either axis or be a 1-D array of edges
dimrange = size(/dim,inrange)
case 1 of
  n_elements(dimrange) eq 1: inrange = get_edges(inrange, /edges_2)
    (dimrange[1] eq 2) and (dimrange[0] ne 2): inrange = transpose(inrange)
    else:
endcase
dimrange = size(/dim,inrange)
if dimrange[0] ne 2  or n_elements(dimrange) gt 2 then begin
    message,'Range to check must be [2,n], nx2, or n array', /cont
    return, -1
endif

if n_elements(valid_range) ne 2 then begin
    message,'Valid range must be 2-element array', /cont
    return, -1
endif

nint = dimrange[1]

bad_ind = where  (inrange[0,*] lt valid_range[0] or $
            inrange[0,*] gt valid_range[1] or $
            inrange[1,*] lt valid_range[0] or $
            inrange[1,*] gt valid_range[1], bad_count)

if bad_count eq nint then return, -1

ret = lindgen(nint)
count = nint - bad_count

if bad_count eq 0 then return, ret else return, rem_elem(ret, bad_ind)

en