;+
;
; NAME: 
;  	UVSP_CATPARAM
;
; PURPOSE:
;       Assign the user's choice of parameter inputs to the structure, "STR".
;
; CATEGORY:
;       UVSP Catalog
;
; CALLING SEQUENCE:
;       UVSP_CATPARAM, str=str, out=out
;
; CALLED BY:
;       UVSP_CATSCREEN, UVSP_CATWIDGET
;
; CALLS TO:
;	none
;
; INPUTS:
;       none explicit, only through commons;
;
; OPTIONAL INPUTS:
;	none
;
; OUTPUTS:
;       none
;
; OPTIONAL OUTPUTS:
;	none
;
; COMMON BLOCKS:
;	none
;
; SIDE EFFECTS:
;	none
;
; RESTRICTIONS:
;	none
;
; PROCEDURE:
;	none
;
; MODIFICATION HISTORY:
;
;-

pro uvsp_catparam, str=str, out=out, input=input, legal=legal, nofull=nofull

 legal = 0                          		; assume user input junk

 input = strcompress(strtrim(input,2))   	; a request for modification
 incase = strmid(input, 0, 3)  			; only 3 char. min. required
 len_input = strlen(input) 			; how much did the user input

 com_only = ['RAN', 'NAM', 'TYP', 'SLI', 'DET', 'XPI', 'YPI', 'XRE',    $
	     'YRE', 'SPE', 'ANG', 'WLD', 'SHI', 'INT', 'POL',           $
 	     'NPO', 'DUR', 'RSU', 'NOA', 'MAN',				$
             'NAME', 'TYPE', 'SLIT', 'XPIX', 'YPIX', 'XRES', 'YRES',    $
             'SPEC', 'ANGS', 'SHIF', 'INTV', 'NPOL', 'RSUN', 'NOAA',    $
	     'SHIFT', 'INTVL' ]

 ;
 ; If only the command was entered then prompt user for new parameter,
 ; else parse off the parameter part of the users input.
 ;

 if (where(com_only eq input))(0) ne -1 $    		; no value entered	
 then read,'Enter your '+ incase+ ' value > ',input $ 	; ask for a value
 else begin 				                ; value was included

    delim = where(byte(input) eq 32b or byte(input) eq 44b $
		or (byte(input) eq 61b)) 	; blank or comma or equal


    if delim(0) eq -1 then begin	; no delimeter
         print,'ERROR - Invalid command, "',input,'".'
         return
    endif else begin 	; ok there is a delimeter, was the command legal
        if (where(com_only eq strmid(input,0,delim(0))))(0) eq -1 then begin
            print,'ERROR - Invalid command, "',strmid(input,0,delim(0)),'".'
            return
        endif
    endelse

    input = strmid(input, delim(0)+1, 999)	; just the parameter values
 endelse

 new_param = strcompress(strtrim(input,2)) 	; just the parameter part

 case incase of
    'RAN' : begin  		; it's a range but is it time or number
	       ;
	       ; This range input is assumed to be a time if there is a
	       ; colon or letter (letter W, L, D are ignored for !WLD,
	       ;			 A, E, R, O for !AERO).
	       ;

	       bline = byte(new_param)            
	       is_time = where( bline eq 58b or $     		     ; ":"
			(bline ge 98b and bline le 99b) or     $  ; b-c
			(bline ge 102b and bline le 107b) or   $  ; f-k
			(bline ge 109b and bline le 110b) or   $  ; m-n
			(bline ge 112b and bline le 113b) or   $  ; p-q
			(bline ge 115b and bline le 118b) or   $  ; s-v
			(bline ge 120b and bline le 122b) or   $  ; x-z
			(bline ge 66b and bline le 67b)   or $  ; B-C
			(bline ge 70b and bline le 75b)   or $  ; F-K
			(bline ge 77b and bline le 78b)   or $  ; M-N
			(bline ge 80b and bline le 81b)   or $  ; P-Q
			(bline ge 83b and bline le 86b)   or $  ; S-V
			(bline ge 88b and bline le 90b) )       ; X-Z


	       rmin = 1   &   rmax=99771

	       if is_time(0) ne -1 then begin    ; letters or ":" indicate time 
                  
		  ;
		  ; Turn new_param of times into experiment number
		  ;

		  exp_ran = uvsp_cat_ptime(new_param=new_param, nofull=nofull)

		  if exp_ran eq '' then begin 
		  	print,'No valid values input, RAN is unchanged.' 
			return
		  endif else if exp_ran eq 'none' then begin
		  	print,'*** WARNING *** No experiments in time range.'+$
				' RAN is unchanged.'
        		return
		  endif
	
	          legal = uvsp_catparse(new_param=exp_ran, rmin=rmin,rmax=rmax)

	          if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.range_flag = 0         ; now using time not exp #
		     str.tim = new_param        ; cleaned up version for "SHOW"
		     str.exp = exp_ran          ; UVSP_CATREAD only uses exp #

		     out.ran_min = rmin-1  	; -1 to get index ranges
		     out.ran_max = rmax-1	; -1 to get index ranges
	          endif else print,'No valid values input, RAN is unchanged.' 

	       endif else begin           	 ; no "/" or ":" not time 

	          legal = uvsp_catparse(new_param=new_param,rmin=rmin,rmax=rmax)

	          if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.range_flag = 1         ; now using exp # not time
		     str.exp = new_param        ; cleaned up version for "SHOW"

		     out.ran_min = rmin-1  	; -1 to get index ranges
		     out.ran_max = rmax-1	; -1 to get index ranges
	          endif else print,'No valid values input, RAN is unchanged.' 
	       endelse

	    end

    'NAM' : begin

	     new_param = strupcase(new_param)
	     legal = 1				; user may enter anything
	     str.name = strcompress(new_param,/remove)
	     out.name = 1b

            end

    'TYP' : begin

		legal = uvsp_catparse(new_param=new_param, rmin=1, rmax=21)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.type = new_param       ; cleaned up version for "SHOW"
		     if str.type ne '1-21' then out.type=1b else out.type=0b 
		endif else print,'No valid values input, TYPE is unchanged.' 
	    end

    'SLI' : begin

		legal = uvsp_catparse(new_param=new_param, rmin=1, rmax=22)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.slit = new_param       ; cleaned up version for "SHOW"
		     if str.slit ne '1-22' then out.slit=1b else out.slit=0b
		endif else print,'No valid values input, SLIT is unchanged.' 
	    end

    'DET' : begin

		legal = uvsp_catparse(new_param=new_param, rmin=1, rmax=5)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.det = new_param        ; cleaned up version for "SHOW"
		     if str.det ne '1-5' then out.det=1b else out.det=0b
		endif else print,'No valid values input, DET is unchanged.' 
	    end

    'XPI' : begin
		; there are some cases of NX equal to 0 (13761)
		legal = uvsp_catparse(new_param=new_param, rmin=0, rmax=255)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.xpix = new_param       ; cleaned up version for "SHOW"
		     if str.xpix ne '0-255' then out.xpix=1b else out.xpix=0b
		endif else print,'No valid values input, XPIX is unchanged.' 
	    end

    'YPI' : begin
		; there are some cases of NY equal to 0 (13761)
		legal = uvsp_catparse(new_param=new_param, rmin=0, rmax=255)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.ypix = new_param       ; cleaned up version for "SHOW"
		     if str.ypix ne '0-255' then out.ypix=1b else out.ypix=0b
		endif else print,'No valid values input, YPIX is unchanged.' 
	    end

    'XRE' : begin

		legal = uvsp_catparse(new_param=new_param, rmin=0, rmax=32)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.xres = new_param       ; cleaned up version for "SHOW"
		     if str.xres ne '0-32' then out.xres=1b else out.xres=0b
		endif else print,'No valid values input, XRES is unchanged.' 
	    end

    'YRE' : begin

		legal = uvsp_catparse(new_param=new_param, rmin=0, rmax=32)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.yres = new_param       ; cleaned up version for "SHOW"
		     if str.yres ne '0-32' then out.yres=1b else out.yres=0b
		endif else print,'No valid values input, YRES is unchanged.' 
	    end

    'SPE' : begin      ; same as entering 0 or 1 for WLD
		legal = 1                       ; for widgets
		if (strupcase(strmid(new_param, 0, 1)) eq 'Y') then begin
		   str.spec = 'YES'
		   out.spec = 1b
		endif else begin
		   str.spec = 'NO'
		   out.spec = 0b
		endelse
	    end

    'ANG' : begin 

		legal = uvsp_catparse(new_param=new_param, rmin=1000, rmax=3600)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.angs = new_param       ; cleaned up version for "SHOW"
		   if str.angs ne '1000-3600' then out.angs=1b else out.angs=0b
		endif else print,'No valid values input, ANGS is unchanged.' 
	    end

    'WLD' : begin

		legal = uvsp_catparse(new_param=new_param, rmin=0, rmax=7500)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.wld = new_param        ; cleaned up version for "SHOW"
		     if str.wld ne '0-7500' then out.wld=1b else out.wld=0b
		endif else print,'No valid values input, WLD is unchanged.' 
	    end

    'SHI' : begin

		legal = uvsp_catparse(new_param=new_param, rmin=0, rmax=60)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.shft = new_param       ; cleaned up version for "SHOW"
		     if str.shft ne '0-60' then out.shft=1b else out.shft=0b
		endif else print,'No valid values input, SHIFT is unchanged.' 
	    end

    'INT' : begin

		legal = uvsp_catparse(new_param=new_param, rmin=0, rmax=255)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.intvl = new_param      ; cleaned up version for "SHOW"
		     if str.intvl ne '0-255' then out.intvl=1b else out.intvl=0b
		endif else print,'No valid values input, INTVL is unchanged.' 
	    end

    'POL' : begin
		
		; turn any accidental zeroes into the letter "O"
		new_param = strupcase(new_param)
		wzero = where(byte(new_param) eq 48b, nzero) 	; any zeroes
		for i = 0, nzero-1 do strput, new_param, 'O', wzero(i)

                valid = ['A','B','O']	; only valid user inputs
                n_pol = ['1','2','0']	; catalog # value for polarimeter
		polar = ''

                ;
		; Are any of the valid pol. parameters in the user's input
                ;

		for i = 0, n_elements(valid)-1 do $
                   if (strpos(new_param, valid(i)) ne -1)  $ ; a valid input
		      and (strpos(polar, valid(i)) eq -1)  $ ; don't have, yet 
		   then polar = polar + ',' + valid(i)

		if strlen(polar) ne 0 then begin	
		   legal = 1				; for widgets
		   str.pol  = strmid(polar,1,99) 	; version for "SHOW"
		   if str.pol ne 'A,B,O' then out.pol=1b else out.pol=0b
		endif else print,'No valid values input, POL is unchanged.' 
	    end

    'NPO' : begin

		legal = uvsp_catparse(new_param=new_param, rmin=0, rmax=16)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.npol = new_param       ; cleaned up version for "SHOW"
		     if str.npol ne '0-16' then out.npol=1b else out.npol=0b 
		endif else print,'No valid values input, NPOL is unchanged.' 
	    end

    'DUR' : begin

		legal = uvsp_catparse(new_param=new_param, rmin=0, rmax=13000)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.dur = new_param        ; cleaned up version for "SHOW"
		     if str.dur  ne '0-13000' then out.dur=1b else out.dur=0b
		endif else print,'No valid values input, DUR is unchanged.' 
	    end

    'RSU' : begin

		legal = uvsp_catparse(new_param=new_param, $
					rmin=0.0, rmax=3.5, /floater)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		    str.rsun = new_param        ; cleaned up version for "SHOW"
		    if str.rsun ne '0.00-3.50' then out.rsun=1b else out.rsun=0b
		endif else print,'No valid values input, DUR is unchanged.' 
	    end

    'NOA' : begin

		legal = uvsp_catparse(new_param=new_param, rmin=0, rmax=5786)

		if legal gt 0 then begin 	; if parsed out any legal inputs
		     str.noaa = new_param       ; cleaned up version for "SHOW"
		     if str.noaa ne '0-16,2287-5786' then out.noaa=1b $
						     else out.noaa=0b
		endif else print,'No valid values input, NOAA is unchanged.' 
	    end

    'MAN' : begin
		legal = 1			  ; for widgets
		out.man = '(' + new_param + ')'   ; no checking performed
	    end

    else: print, 'ERROR - Invalid command, "',input,'".'

 endcase

return
end

