
#######################################################################
#                	Location Variables                            #
#######################################################################

#$url_of_the_form = "Forms/opsf.html";
$url_of_the_form = "Forms/input/input_opsf.html";
$location_of_mail_lib = "./Library/mail-lib.pl";
$location_of_setup_file = "opsf.setup.cgi";

#section 1 - defining fields
#section 1.1 - range_variable_input {
#section 1.2 - sub check_radius {
#section 1.3 - sub check_date {
#section 1.4 - sub ra_dec_conv {
#section 2 - sub which_query {
#section 3 - sub obs_name_sub {
#section 4 - sub no_input {
#section 5 - sub validate {
#section 6 - sub print_no_row {
#section 7 - sub no_input_input { ##input checker
#section 8 - sub print_no_input_sub {
#section 9 - sub print_no_file_name_sub {
#section 10 - sub print_8_char_error_sub {
#section 11 - sub print_bad_value_sub {
#section 12 - sub check { ##input checker
#section 13 - sub file_list { ##input subroutine
#section 14 - sub quote_literals {
#section 15 - sub individual_parameters {
#section 16 - sub printrow

#######################################################################
#                  Defining your Fields                               #
#######################################################################

#section 1
# is used in section #2 and #12
@form_variables_base = ("origfile",  
		       "psf_file",   
		       "psf_orig",   
		       "xcenter",    
		       "ycenter",    
		       "xcorner",    
		       "ycorner",    
		       "ra_psf",     
		       "dec_psf",    
		       "peakint",    
		       "peakfit",    
		       "saturatd",   
		       "backgnd",    
		       "colortype",  
		       "colorval",   
		       "bvcolor",    
		       "spectral",   
		       "refspec",    
		       "psfscale",   
		       "pixfact",    
		       "focus",      
		       "v2_rms",     
		       "v2_p2p",     
		       "v3_rms",     
		       "v3_p2p",     
		       "detector",   
		       "instrume",   
		       "rootname",   
		       "filetype",   
		       "opt_elem",   
		       "filter",     
		       "aperture",   
		       "propaper",   
		       "repeller",   
		       "centera1",   
		       "centera2",   
		       "sizaxis1",   
		       "sizaxis2",   
		       "binaxis1",   
		       "binaxis2",   
		       "ccdgain",    
		       "bias",	     
		       "fgslock",    
		       "expstart",   
		       "exptime",    
		       "targname",   
		       "ra_targ",    
		       "dec_targ",   
		       "proposid"    
		       );	
		       
# is used to build the query statement, and what parameters are to be
# queried on	       
@headers =            (ORIGFILE,
		       PSF_FILE,
		       PSF_ORIG,
		       XCENTER,
		       YCENTER,
		       XCORNER,
		       YCORNER,
		       RA_PSF,
		       DEC_PSF,
		       PEAKINT,
		       PEAKFIT,
		       SATURATD,
		       BACKGND,
		       COLORTYPE,
		       COLORVAL,
		       BVCOLOR,
		       SPECTRAL,
		       REFSPEC,
		       PSFSCALE,
		       PIXFACT,
		       FOCUS,
		       V2_RMS,
		       V2_P2P,
		       V3_RMS,
		       V3_P2P,
		       DETECTOR,
		       INSTRUME,
		       ROOTNAME,
		       FILETYPE,
		       OPT_ELEM,
		       FILTER,
		       APERTURE,
		       PROPAPER,
		       REPELLER,
		       CENTERA1,
		       CENTERA2,
		       SIZAXIS1,
		       SIZAXIS2,
		       BINAXIS1,
		       BINAXIS2,
		       CCDGAIN,
		       BIAS,
		       FGSLOCK,
		       EXPSTART,
		       EXPTIME,
		       TARGNAME,
		       RA_TARG,
		       DEC_TARG,
		       PROPOSID
		       );		



 


# is used in section #2,#12,#15,#7,#4
@required_variables = ("origfile",
		       "psf_file",
		       "psf_orig",
		       "xcenter",
		       "ycenter",
		       "xcorner",
		       "ycorner",
		       "ra_psf",
		       "dec_psf",
			"peakfit_upper_limit",
			"peakfit_lower_limit",
			"peakint_upper_limit",
			"peakint_lower_limit",
		       "peakfit",
		       "saturatd",
		       "backgnd",
		       "colortype",
			"colorval_upper_limit",
			"colorval_lower_limit",
			"bvcolor_upper_limit",
			"bvcolor_lower_limit",
		       "spectral",
		       "refspec",
		       "psfscale",
		       "pixfact",
			"focus_upper_range",
			"focus_lower_range",
		       "v2_rms",
		       "v2_p2p",
		       "v3_rms",
		       "v3_p2p",
		       "detector",
		       "instrume",
		       "rootname",
		       "filetype",
		       "opt_elem",
		       "filter",
		       "aperture",
		       "propaper",
		       "repeller",
		       "centera1",
		       "centera2",
		       "sizaxis1",
		       "sizaxis2",
		       "binaxis1",
		       "binaxis2",
		       "ccdgain",
		       "bias",
		       "fgslock",
			"expstart_upper_range",
			"expstart_lower_range",
			"exptime_upper_range",
			"exptime_lower_range",
		       "targname",
		       "ra_targ",
		       "dec_targ",
		       "proposid"
		       );	       
		       
	    
# used in section #1.1 
%range_variables_hash = (
"peakfit_upper_limit"   =>  "peakfit_lower_limit",
"peakint_upper_limit"   =>  "peakint_lower_limit",
"colorval_upper_limit"  =>  "colorval_lower_limit",
"bvcolor_upper_limit"   =>  "bvcolor_lower_limit",
"focus_upper_range"     =>  "focus_lower_range",
"expstart_upper_range"  =>  "expstart_lower_range",
"exptime_upper_range"   =>  "exptime_lower_range"
);

		       
# used in section #12 
%required_variable_type  = (
	"origfile"  =>  "char",
	"psf_file"  =>  "char",
	"psf_orig"  =>  "char",
	"xcenter"   =>  "float",
	"ycenter"   =>  "float",
	"xcorner"   =>  "float",
	"ycorner"   =>  "float",
	"ra_psf"    =>  "float",
	"dec_psf"   =>  "float",
	"peakint"   =>  "float",
	"peakfit"   =>  "float",
	"saturatd"  =>  "char",
	"backgnd"   =>  "float",
	"colortype" =>  "char",
	"colorval"  =>  "float",
	"bvcolor"   =>  "float",
	"spectral"  =>  "char",
	"refspec"   =>  "char",
	"psfscale"  =>  "float",
	"pixfact"   =>  "float",
	"focus"     =>  "float",
	"v2_rms"    =>  "float",
	"v2_p2p"    =>  "float",
	"v3_rms"    =>  "float",
	"v3_p2p"    =>  "float",
	"detector"  =>  "char",
	"instrume"  =>  "char",
	"rootname"  =>  "char",
	"filetype"  =>  "char",
	"opt_elem"  =>  "char",
	"filter"    =>  "char",
	"aperture"  =>  "char",
	"propaper"  =>  "char",
	"repeller"  =>  "char",
	"centera1"  =>  "int",
	"centera2"  =>  "int",
	"sizaxis1"  =>  "int",
	"sizaxis2"  =>  "int",
	"binaxis1"  =>  "int",
	"binaxis2"  =>  "int",
	"ccdgain"   =>  "int",
	"bias"      =>  "float",
	"fgslock"   =>  "char",
	"expstart"  =>  "float",
	"exptime"   =>  "float",
	"targname"  =>  "char",
	"ra_targ"   =>  "float",
	"dec_targ"  =>  "float",
	"proposid"  =>  "int"
    );     
    
# used in section #1.3
%month_conv  = (
	"jan"  =>  "1",
	"feb"  =>  "2",
	"mar"  =>  "3",
	"apr"  =>  "4",
	"may"  =>  "5",
	"jun"  =>  "6",
	"jul"  =>  "7",
	"aug"  =>  "8",
	"sep"  =>  "9",
	"oct"  =>  "10",
	"nov"  =>  "11",
	"dec"  =>  "12"

    );         


	$i = 0;
	$j = 0;
	$x_y_flag = "NO";
	$ra_dec_flag = "NO";
        $upper_flag = 0;    #mjd/calendar date conversion flag initialization
        $lower_flag = 0;


# parse out decision variable and file; load file into array and close file
	$doit = param('db_insert');

	$FILE = param( 'filename' );
		@file_line = <$FILE>;
		close ($FILE);

	$decide = param('query_decision');
	#print "decide = $decide <br>";
	
      $origfile = param('origfile'); #obs name to check for length
#print "origggfile = $origfile<br>";
#print "ff=$ff<br>";
       $ff = length ($origfile);
       
       

################### create the selection criteria ######################
$query_select_final = "";

$query_select_everything = param('query_select_everything');
#print "query_select_everything=$query_select_everything<br>";

 
    @query_select = param('query_select'); #pulls out the elements to select on
	foreach $query_select (@query_select) {
	#print "vvvvv = $query_select<br>";
	 $query_select_final = $query_select_final . "," . $query_select;
		}
$query_select_final =~ s/,$//; #strips off last comma
$query_select_final =~ s/^,//; #strips off last comma
#print "query_select_final = $query_select_final<br><br>";


if ($query_select_everything eq "everything") { #replace default select with
   $query_select_final = "*";                   # "*"
   @query_select=@headers;
   }
   

	#print "query_select_final=$query_select_final<br>";

###########################################################################

#print "I'm here in Master\n";
print "\n";





######################################################################
#                 check range inputs       		 	      #
#######################################################################


#section 1.1
sub range_variable_input {

	foreach $range_variable (keys %range_variables_hash) {

#print "range_variable_key = $range_variable<br>";
#print "range_variable_value = $range_variables_hash{$range_variable}<br>";

	$range1 = param($range_variable);
	$range2 = param($range_variables_hash{$range_variable});

	if ($range1 && !$range2 || !$range1 && $range2) {
	  print "You've got to have both $range_variable 
	  and $range_variables_hash{$range_variable} inputs. See
	  the help file for further information.<br>";
	  exit;
	  }
	#print "vvvvalue1 = $range1<br>";
	#print "vvvvalue2 = $range2<br>";
	}

}


######################################################################
#                 check radius inputs       		 	      #
#######################################################################



#section 1.2
sub check_radius {

	#check on x/ycenter and radius
	$value1 = param('xcenter');
	$value2 = param('ycenter');
	$value3 = param('x_y_center_radius');

	if (!$value1 && $value2) {
 		 print qq~
 		 <HTML>
 		 <HEAD>
  		 <TITLE>Error in Processing Form</TITLE>
 		 </HEAD>
 		 <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
		~;
                print "Error: You must enter a xcenter"; 
       		print qq~

 		 </BODY>
  		</HTML>~;
		exit;  
	}

	if ($value1 && !$value2) {
 		 print qq~
 		 <HTML>
 		 <HEAD>
  		 <TITLE>Error in Processing Form</TITLE>
 		 </HEAD>
 		 <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
		~;
                print "Error: You must enter a ycenter"; 
       		print qq~

 		 </BODY>
  		</HTML>~;
		exit;  

	}

	if (!$value1 && !$value2 && $value3) {
 		 print qq~
 		 <HTML>
 		 <HEAD>
  		 <TITLE>Error in Processing Form</TITLE>
 		 </HEAD>
 		 <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
		~;
                print "Error: You must enter a xcenter and a ycenter"; 
       		print qq~

 		 </BODY>
  		</HTML>~;
		exit;  
	}

	if ($value1 && $value2 && !$value3) {
 		 print qq~
 		 <HTML>
 		 <HEAD>
  		 <TITLE>Error in Processing Form</TITLE>
 		 </HEAD>
 		 <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
		~;
                print "Error: You must enter a radius for x\ycenter pair "; 
       		print qq~

 		 </BODY>
  		</HTML>~;
		exit;  
	}


#IF ALL THREE VALUES FOR X/Y/RADIUS ARE HERE, CALCULATE THE OFFSETS

  if ($value1 && $value2 && $value3) {

#print "value1 = $value1<br>";
#print "value2 = $value2<br>";
#print "value3 = $value3<br>";

	$x_y_flag = YES;
	$x_delta_plus = $value1 + $value3;
	#print "xplus = $x_delta_plus<br>";
		if ($x_delta_plus > 2048) 
			{print "You're xcenter_plus is out of bounds (>2048)<br>";}
	$x_delta_minus = $value1 - $value3;
		if ($x_delta_minus < 1) 
			{print "You're xcenter_minus is out of bounds (<1)<br>";}

	$y_delta_plus = $value2 + $value3;
		if ($y_delta_plus > 2048) 
			{print "You're ycenter_plus is out of bounds (>2048)<br>";}
	$y_delta_minus = $value2 - $value3;
		if ($y_delta_minus < 1) 
			{print "You're ycenter_minus is out of bounds (<1)<br>";}
  }
  
  
#CHECK ON RA_PSF, DEC_PSF, AND RA_DEC_RADIUS, EXISTENCE OF..........




@name = ('ra_psf', 
	 'dec_psf', 
	 'ra_dec_radius', 
	);


for $name (@name) {
    $value = param ($name);
    push (@value, $value);

    # Look for non-blank character in parameter
    push (@undefined, $name) unless $value =~ /\S/;
}

#for $j (@undefined) {print "j=$j<br>";}

if (@undefined  && @undefined !=  @name) {
    $errmsg = 'You must enter a value for the following parameter: ';
    $errmsg =~ s/:/s:/ if @undefined > 1;
    $errmsg .= join (', ', @undefined);
}

if ($errmsg) {print "$errmsg<br>";exit;}

}




######################################################################
#                  check        date      		 	      #
#######################################################################

#section 1.3

sub check_date {


#MAKE SURE EXPTIME IS FLOAT AND THAT IT EXISTS

	$upper_time = param('exptime_upper_range');
	$lower_time = param('exptime_lower_range');


        if ($upper_time =~ /^[+-]?\d+$/) {
	print "Error: upper_exptime must be a real number<br>";
        exit;
      }
      
        if ($lower_time =~ /^[+-]?\d+$/) {
	print "Error: lower_exptime must be a real number<br>";
        exit;
      }

	if (!$upper_time && $lower_time) {
	print "Error: You must enter a upper_exptime<br>";
	exit;
	}

	if ($upper_time && !$lower_time) {
	print "Error: You must enter a lower_exptime<br>";
	exit;
	}	

#MAKE SURE EXPSTART IS FLOAT AND THAT IT EXISTS
	
	$upper_date = param('expstart_upper_range');
	$lower_date = param('expstart_lower_range');

	#print "upper_expstart=$upper_date<br>";
	#print "lower_expstart=$lower_date<br>";


        if ($upper_date =~ /^[+-]?\d+$/) {
	print "Error: upper_expstart must be a real number<br>";
        exit;
      }
      
        if ($lower_date =~ /^[+-]?\d+$/) {
	print "Error: lower_expstart must be a real number<br>";
        exit;
      }


	if (!$upper_date && $lower_date) {
	print "Error: You must enter a upper_expstart<br>";
	exit;
	}

	if ($upper_date && !$lower_date) {
	print "Error: You must enter a lower_expstart<br>";
	exit;
	}	
	
	#print "upper date = $upper_date<br>";
	#print "lower date = $lower_date<br>";

 if ($upper_date =~
 /^+(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)\s+\d\d?\s+\d\d\d?\d?$/i) {

	 #print "You've got the calendar date<br>";

	#$tmp_mjd = 40587; # mjd for jan 1 1970

	#($month, $day, $year) = split (/ /, $upper_date);


	#foreach $month_conv (keys %month_conv) {

 	#	if ($month_conv eq $month) {
	  #  	  $month = $month_conv{$month_conv};
	#	  }
	#}

	#print "month = $month<br>";
	#print "day = $day<br>";
	#print "year = $year<br>";

	#$upper_tmp_date = day_number ($upper_date);

	#$final_upper_date = $upper_tmp_date + $tmp_mjd;

	$mjd_final_upper_date = julian_date (parse_date ($upper_date));
	#print "mjd_final_upper_date = $mjd_final_upper_date<br>";
        $upper_flag = 1; #if the date was a calendar date, it has come
	                 #thru here and has been converted...set this flag
			 #to be used when constructing the select statement.
}



 if ($lower_date =~
 /^+(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)\s+\d\d?\s+\d\d\d?\d?$/i) {

	# print "You've got the calendar date<br>";

	#$tmp_mjd = 40587; # mjd for jan 1 1970

	#($month, $day, $year) = split (/ /, $lower_date);


	#foreach $month_conv (keys %month_conv) {

 	#	if ($month_conv eq $month) {
	 #   	  $month = $month_conv{$month_conv};
	#	  }
	#}

	#print "month = $month<br>";
	#print "day = $day<br>";
	#print "year = $year<br>";

	#$lower_tmp_date = day_number ($lower_date);

	#$final_lower_date = $lower_tmp_date + $tmp_mjd;

	#print "final_upper_date = $final_upper_date<br>";

	$mjd_final_lower_date = julian_date (parse_date ($lower_date));
	#print "mjd_final_lower_date = $mjd_final_lower_date<br>";
        $lower_flag = 1; #if the date was a calendar date, it has come
	                 #thru here and has been converted...set this flag
			 #to be used when constructing the select statement.

}
 
 if ($upper_date =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/) {
  	#print "You've got the decimal date<br>";
 	$mjd_final_upper_date = $upper_date;
 }

 if ($lower_date =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/) {
  	#print "You've got the decimal date<br>";
 	$mjd_final_lower_date = $lower_date;
 }



} #end of sub check_date

######################################################################
#                 Bernie's date subroutines     		      #
#######################################################################
#----------------------------------------------------------------------
# Initialize constant arrays

sub BEGIN {
    @day_names = qw (Sunday Monday Tuesday Wednesday Thursday Friday Saturday);

    @month_names = qw (January February March April May June July August
		       September October November December);

    @month_length = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

    $calendar_cell_width = 67;
    $calendar_cell_height = 50;
    $calendar_event_color = "#ffff99";
}

#----------------------------------------------------------------------
# Parse a date string into day, month, year

sub parse_date {
    my ($datestring) = shift;
    my ($month, $day, $year) = split (/[-\s,\/]+/, $datestring);
    $month = lc ($month);

    if ($month =~ /^\d+$/) {
	$month --;

    } else {
	my $match;
	for (my $i = 0; $i < @month_names; $i++) {
	    $monthname = lc ($month_names[$i]);
	    if ($monthname =~ /^$month/) {
		if (defined ($match)) {
		    die "Ambiguous month: $month\n";
		} else {
		    $match = $i;
		}
	    }
	}

	if (defined $match) {
	    $month = $match;
	} else {
	    die "Unrecognized month: $month\n";
	}
    }

    die "Illegal date: $datestring\n" unless  $month < 12 &&
      $day <= month_length ($month, $year);

    return ($day, $month, $year);
}

#----------------------------------------------------------------------
# Return the modified julian date given the day, month, and year

sub julian_date {
    return day_number (@_) + 40587;
}

#----------------------------------------------------------------------
# Return the day number for a Gregorian date between 1970 and 2099

sub day_number {
    my ($day, $month, $year) = @_;
    my ($daynum);

    # Calculate years since 1970

    $year = y2k ($year);
    $year -= 1970;

    # Calculate days until Jan 1 of this year

    $daynum = 365 * $year + int (($year + 1) / 4);

    # Add number of days this year so far

    $daynum +=  $day + int ((3055 * ($month + 3)) / 100) - 92;

    # Correct for short February and leap year day

    $daynum += (($year + 2) % 4 == 0) - 2 if $month > 1;

    return $daynum;
}

#----------------------------------------------------------------------
# Return the number of days in a month

sub month_length {
    my ($month, $year) = @_;
    my ($length);

    $year = y2k ($year);

    $length = $month_length[$month];
    $length += 1 if ($year % 4) == 0 && $month == 1;

    return $length;
}
#----------------------------------------------------------------------
# Two digit to four digit year between 1970 and 2099

sub y2k {
    my ($year) = shift;

    if ($year < 70) {
	$year += 2000;
    } elsif ($year < 100) {
	$year += 1900;
    } elsif ($year < 1970 || $year > 2099) {
	die "Year out of range: $year\n";
    }
    return $year;
}






######################################################################
#                 ra & dec   conversion     		 	      #
#######################################################################


#section 1.4
sub ra_dec_conv {

	
	$ra  = param('ra_psf');
	$dec = param('dec_psf');
	$ra_dec_radius = param('ra_dec_radius');

 # 
if ($ra =~ /^[+-]?\d+$/ || $dec =~ /^[+-]?\d+$/ 
         || $ra_dec_radius =~ /^[+-]?\d+$/) {

 		 print qq~
 		 <HTML>
 		 <HEAD>
  		 <TITLE>Error in Processing Form</TITLE>
 		 </HEAD>
 		 <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
		~;
                print "You can not use integers for ra/dec/radius!"; 
       		print qq~

 		 </BODY>
  		</HTML>~;
		exit;  
       
       } 


 if ($ra =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/ &&
     $dec =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/ &&
     $ra_dec_radius =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/){
     
     $convert_flag = "No";

 } else {
 
     $convert_flag = "YES"; 
 }   

#print "convert_flag = $convert_flag<br>";

if ($convert_flag eq "No") {

    $converted_ra = $ra;
    $converted_dec = $dec;
    $converted_ra_dec_radius = $ra_dec_radius;
    
    $final_ra_plus = $converted_ra + $converted_ra_dec_radius;
    $final_ra_minus = $converted_ra - $converted_ra_dec_radius;
    $final_dec_plus = $converted_dec + $converted_ra_dec_radius;
    $final_dec_minus = $converted_dec - $converted_ra_dec_radius;
    
#print "converted ra = $converted_ra<br>";
#print "converted dec = $converted_dec<br>";

#print "converted ra_dec radius = $converted_ra_dec_radius<br>";
#print "<br>";
#print "final_ra_plus=$final_ra_plus<br>";
#print "final_ra_minus=$final_ra_minus<br>";
#print "final_dec_plus=$final_dec_plus<br>";
#print "final_dec_minus=$final_dec_minus<br>";

    	$ra_dec_flag = YES;

} else {    


	$converted_ra = $ra;

#feed input and convert to decimal degrees

#print "ra = $ra<br>";
#print "dec = $dec<br>";
#print "radius = $ra_dec_radius<br>";

	$converted_ra = hms2deg ($ra);
	$converted_dec = dms2deg ($dec);
	$converted_ra_dec_radius = dms2deg ($ra_dec_radius);
	
#print "converted ra = $converted_ra<br>";
#print "converted dec = $converted_dec<br>";

#print "converted ra_dec radius = $converted_ra_dec_radius<br>";

	$ra_dec_flag = YES;

 $final_ra_plus = $converted_ra + $converted_ra_dec_radius;
 $final_ra_minus = $converted_ra - $converted_ra_dec_radius;
 $final_dec_plus = $converted_dec + $converted_ra_dec_radius;
 $final_dec_minus = $converted_dec - $converted_ra_dec_radius;
#print "<br>";
#print "final_ra_plus=$final_ra_plus<br>";
#print "final_ra_minus=$final_ra_minus<br>";
#print "final_dec_plus=$final_dec_plus<br>";
#print "final_dec_minus=$final_dec_minus<br>";

sub dms2deg {
    $dms = shift;

    $deg = 0;
    if ($dms =~ s/\s*-//) {
	$factor = -1;
    } else {
	$factor = 1;
    }

    @part = split (/ /, $dms, 3);

    foreach $part (@part) {
	$deg += $part * $factor;
	$factor /= 60;
    }

    return $deg;
}

sub hms2deg {
    $dms = shift;

    $deg = 0;
    if ($dms =~ s/\s*-//) {
	$factor = -1;
    } else {
	$factor = 1;
    }

    @part = split (/ /, $dms, 3);

    foreach $part (@part) {
	$deg += $part * $factor;
	$factor /= 60;
    }
    $deg = $deg * 15;

    return $deg;
}

}

}

######################################################################
#                 check which query       		 	      #
#######################################################################



#section 2
sub which_query {

	foreach $variable (@form_variables_base) {

#print "variable1 = $variable\n";

#check on the query decision to determine the flow
#	if ($variable eq "query_decision") {
		

	#  print qq~
	#  <HTML>
	#  <HEAD>
	#  <TITLE>i'm here</TITLE>
	#  </HEAD>
	#  <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
#	~;


   if ($decide eq "Submit Query") {

	$cmmd = qq|select $query_select_final from stis_psf where |;

#print "query_select_final = $query_select_final<br>";
		undef $where_clause;


		foreach $key (@required_variables) {



		  $value = param($key);
		  $value=~tr/a-z/A-Z/;  # set all to uppercase
		#print "value = $value\n";

   		 	if ($value) {
			$where_clause .= " and " if $where_clause;

			$value2 = $value;
			$value2 = "'$value2'" unless $value2 =~ 
	  		  /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;

	#set $value with quotes unless tested out to be non-character




#if "saturatd","colortyp","pixfact","detector","filetype","ccdgain" = ANY,
#by pass using these for selection criteria in the where clause else
#construct and append the where clause

# also, if $x_y_flag eq 'YES', meaning xcenter,ycenter, and the radius are
# all populated, then include this in the where clause


#print "key=$key<br>";
#print "value2=$value2<br>";

    #$value3 = $value2;
    #$value3 =~ s/'//g;

	
	if ($value2 eq "\'ANY\'") {
	    $where_clause = $where_clause . "1 = 1";

} elsif ($key eq 'filter' && ($value2 eq "'25MAMA'" | $value2 eq "'F25LYA'"  |    
$value2 eq "'F25ND3'"  |    
$value2 eq "'F25ND5'"  |    
$value2 eq "'F25NDQ1'" |    
$value2 eq "'F25NDQ2'" |    
$value2 eq "'F25NDQ3'" |    
$value2 eq "'F25NDQ4'" |    
$value2 eq "'F25QTZ'"  |    
$value2 eq "'F25SRF2'" |    
$value2 eq "'F25MGII'" |    
$value2 eq "'F25CN270'" |   
$value2 eq "'F25CIII'" |    
$value2 eq "'F25CN182'" |   
$value2 eq "'50CCD'"  |     
$value2 eq "'F28X50LP'"  |  
$value2 eq "'F28X50OII'" |  
$value2 eq "'F28X50OIII'" | 
$value2 eq "'50CORON'")) {

	$where_clause .= "aperture = $value2";
	
} elsif ($key eq 'filter' && ($value2 eq "'BAR10'" |   
$value2 eq  "'WEDGEA1.0'" |	
$value2 eq  "'WEDGEA1.8'" |	
$value2 eq  "'WEDGEA2.0'" |	
$value2 eq  "'WEDGEA2.5'" |	
$value2 eq  "'WEDGEA2.8'" |	
$value2 eq  "'WEDGEB1.0'" |	
$value2 eq  "'WEDGEB1.8'" |	
$value2 eq  "'WEDGEB2.0'" |	
$value2 eq  "'WEDGEB2.5'" |	
$value2 eq "'WEDGEB2.8'")) {
 
 	$where_clause .= "propaper = $value2";	

	    
} elsif ($key eq 'peakfit_upper_limit') {
	$where_clause .= "peakfit <= $value2";
} elsif ($key eq 'peakfit_lower_limit') {	
	$where_clause .= "peakfit >= $value2";

} elsif ($key eq 'peakint_upper_limit') {
	$where_clause .= "peakint >= $value2";
} elsif ($key eq 'peakint_lower_limit') {	
	$where_clause .= "peakint <= $value2";

} elsif ($key eq 'colorval_upper_limit') {
	$where_clause .= "colorval <= $value2";
} elsif ($key eq 'colorval_lower_limit') {	
	$where_clause .= "colorval >= $value2";	

} elsif ($key eq 'bvcolor_upper_limit') {
	$where_clause .= "bvcolor >= $value2";
} elsif ($key eq 'bvcolor_lower_limit') {	
	$where_clause .= "bvcolor <= $value2";	

} elsif ($key eq 'focus_upper_range') {
	$where_clause .= "focus >= $value2";
} elsif ($key eq 'focus_lower_range') {	
	$where_clause .= "focus <= $value2";	

} elsif ($key eq 'expstart_upper_range') {
#uses either the converted calendar or mjd value

        if ($upper_flag == 1) {
	$where_clause .= "expstart <= $mjd_final_upper_date"; 
        } else {
	$where_clause .= "expstart <= $value2";
	}
	
} elsif ($key eq 'expstart_lower_range') {	
#uses either the converted calendar or mjd value

        if ($lower_flag == 1) {
	$where_clause .= "expstart >= $mjd_final_lower_date"; 
        } else {
	$where_clause .= "expstart >= $value2";	
	}
	
} elsif ($key eq 'exptime_upper_range') {
	$where_clause .= "exptime <= $value2";
} elsif ($key eq 'exptime_lower_range') {	
	$where_clause .= "exptime >= $value2";		    

} elsif ($x_y_flag eq 'YES') {

	$where_clause .= "xcenter between $x_delta_minus and $x_delta_plus
	and ycenter between $y_delta_minus and $y_delta_plus";

} elsif ($ra_dec_flag eq 'YES') {

	$where_clause .= "ra_psf between $final_ra_minus and $final_ra_plus
	and dec_psf between $final_dec_minus and $final_dec_plus";

	    
	} else {
		
	$where_clause .= "$key = $value2";
  
	}

   			 } # end of if (exists)
		} #end foreach

	
		$where_clause = "1 = 1" unless $where_clause;

		$cmmd = $cmmd . $where_clause;

      } else {exit;}
      
  print qq~

  </BODY>
  </HTML>~;	
	}
#}

$cmmd;

}



#######################################################################
#                 check input                            	      #
#######################################################################

#section 12
sub check {

#check file input, create hash with required fields and values, and then run thru 
#char,int,real check routines

#print "i'm in check<br>";
#print "doit=$doit<br>";

if ($doit eq "Send File of Datasets"){ 

 foreach $line_blue (@file_line) { #reads first line of data.....
  	 chop $line_blue;
  	 $line_blue=~tr/a-z/A-Z/;

  # print "line_blue=$line_blue<br>";

   	@value_blue = split (/,\s*/, $line_blue); 
     	  #removes comma and whitespace...pushes it into an array
  	 @value_blue = map (quote_literals ($_), @value_blue); 
      	 #sub that quotes characters

     foreach $name_blue (@form_variables_base) { #populates a hash with name/value

       $value_blue = shift @value_blue; #pulls element off left side of list
       $hash{$name_blue} = $value_blue;

  #   print "key=$name_blue,value=$hash{$name_blue}<br>";
     #$name_blue->keyword,$hash{$name_blue}->value
		}


     foreach $name (keys %hash) { 
      # print "NAME_next=$name,hash_value=$hash{$name}<br>";
 	 if ($name eq "origfile") {    #check origfile length .... 
       #  print "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB<br>";
         $ff=length($hash{$name});
	#   print "variable_name=$name<br>";
	#   print "variable_value=$hash{$name}<br>";
	#  print "length=$ff<br>";
	
		if($save_name) {
 			$save_name = $save_name . "," . $hash{$name};
 		} else {
 			$save_name = $hash{$name};
 		}	   
			#print "save_name= $save_name<br>";

 		if ($ff < 20 || $ff >20) { 

		print qq~
 		 <HTML>
 		 <HEAD>
  		 <TITLE>Results in writing to the database</TITLE>
 		 </HEAD>
 		 <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
		~;		

         print "Observation names must be 20 characters long(with quotes)<br>";
	 print "Nothing has been written to the database\n"; 
		 print qq~

 		 </BODY>
  		</HTML>~;
		  
		  exit;
 			}
 		}


	if ($hash{$name} eq 'NULL') {
#print "BBBBBBBBBB<br><br>";
	 $required_variable_type{$name} = $joe;
	} else {
 	$joe = validate ($hash{$name}); #send to validate and check all values
	}

#print "joe equals character_type = $joe<br>";
#print "$name,$hash{$name},$joe,$required_variable_type{$name}<br>";
#print "NAME=$name,REQUIRED_VARIABLE=$required_variable_type{$name}<br>";


 		if ($required_variable_type{$name} ne $joe) { 
		$exit_flag=yes;
		print qq~
 		 <HTML>
 		 <HEAD>
  		 <TITLE>Results in writing to the database</TITLE>
 		 </HEAD>
 		 <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
		~;		
		
 			print "Bad value for $name<br>"; 
			print "Nothing has been written to the database<br>"; 
		     		print qq~

 		 </BODY>
  		</HTML>~;
		
		
			
			} #else {print "everything is okkkkkkk!!!!!!<br>";} 
			 
		
	} #end foreach3
  } #end if1
  
			if ($exit_flag eq "yes") {exit;}

#form input, single row entry

     } elsif ($doit eq "Submit Input"){
print "you're in the wrong place<br><br><br>";
	foreach $name (@required_variables) {

	    if ($name eq "origfile") {    #check origfile length .... 
 
 		$ff=length(param($name));
  		if ($ff < 18 || $ff >18) { 

		&print_8_char_error_sub;
			 
 		}
 	    }

		$value = param($name);#print "value=$value\n";
		$joe = validate ($value);
	
		if ($required_variable_type{$name} ne $joe) {
		
			&print_bad_value_sub;
	
		} 
		
	}	
	
  
   } #end elsif ($doit eq "Submit Input")

return;

} #end sub check






######################################################################
#                 observation name subroutine     	 	      #
#######################################################################
#section 3
sub obs_name_sub {

       if ($ff < 18 || $ff > 18) { print "ff=$ff<br>";
               print qq~
               <HTML>
               <HEAD>
               <TITLE>Results in writing to the database</TITLE>
               </HEAD>
               <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
               ~;      
               print "Observation names must be 18 characters longggg\n";
               print qq~

               </BODY>
               </HTML>~;
               exit;					
       }
}





#######################################################################
#                	 print_no_row  section   subroutine           #
#######################################################################

#section 6
sub print_no_row {
  	print qq~
 	 <HTML>
  	<HEAD>
  	<TITLE>build sql query</TITLE>
  	</HEAD>
  	<BODY BGCOLOR = "FFFFFF" TEXT = "000000">
 	<br>	   
	      There isn't any data in the PSF Library that matches the query 
	      parameters supplied. Try again.

	</BODY>
  	</HTML>~;

}

#######################################################################
#                print no input subroutine & no filename  & 8 char    #
#######################################################################

#section 8
sub print_no_input_sub {

 		 print qq~
 		 <HTML>
 		 <HEAD>
  		 <TITLE>Error in Processing Form - Required Fields</TITLE>
 		 </HEAD>
 		 <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
		~;
                print "You didn't supply any input"; 
       		print qq~

 		 </BODY>
  		</HTML>~;
		exit;  

	}

#section 9
sub print_no_file_name_sub {

		print qq~
 		 <HTML>
 		 <HEAD>
  		 <TITLE>Error in Processing Form - Required Fields</TITLE>
 		 </HEAD>
 		 <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
		~;		
		print "You forgot to enter a file name";
		print qq~
		</BODY>
  		</HTML>~;
		exit;

	}

#section 10	
sub print_8_char_error_sub {

	print qq~
 	<HTML>
 	<HEAD>
  	<TITLE>Results in writing to the database</TITLE>
 	</HEAD>
 	<BODY BGCOLOR = "FFFFFF" TEXT = "000000">
	~;	
 	print "Observation names must be 18 characters long\n";
	print "Nothing has been written to the database\n";
	print qq~

 	</BODY>
  	</HTML>~;
	exit;	
}

#section 11
sub print_bad_value_sub {

     print qq~
      <HTML>
     <HEAD>
     <TITLE>Results in writing to the database</TITLE>
     </HEAD>
     <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
     ~;      

     print "Bad value for $name\n"; 
     print "Nothing has been written to the database\n"; 

     print qq~

     </BODY>
     </HTML>~;
     exit;		     
}



#######################################################################
#                 get input from the form and build query     	      #
#######################################################################


#section 15
sub individual_parameters {




	$input_cmd = "insert into stis_psf values("; 

	foreach $name (@required_variables) {
		$value = param($name);
		$value=~tr/a-z/A-Z/;

		$value = "'$value'" unless $value =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
		#set $value with quotes unless tested out to be non-character
	$input_cmd = $input_cmd . $value . ',';
	}
		chop $input_cmd;
		$input_cmd = $input_cmd . ')';

	foreach $name (param()) {

		$value = param($name);
		push(@list,$value); 
	}


	$input_cmd; #send cmd back to processor


	}#end subindividual_parameter
			
			
			



#######################################################################
#                 subroutine validate                    	      #
#######################################################################
# VALIDATE -- Test a data type validation subroutine

#section 5
sub validate {
    my $value = shift;

    # Remove leading and trailing whitespace and quotes from the strings
#print "im in validate<br>";
    $value =~ s/^\s+//;
    $value =~ s/\s+$//;
    $value =~ s/"//g;

    # Start with most restrictive pattern and go to least
    # Numeric patterns from Perl cookbook, 2.1
    # Date allows two digit year

    return 'int' if 
      $value =~ /^[+-]?\d+$/;
    return 'float' 
      if $value =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
    return 'date'
      if $value =~ /^+(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)\s+\d\d?\s+\d\d\d?\d?$/i;
    return 'char';
}





#######################################################################
#                 no input subroutine       		 	      #
#######################################################################


#section 7
sub no_input_input {

	if ($doit eq "Send File of Datasets"){
			
		if (param( 'filename' ) eq ""){
			
			&print_no_file_name_sub;

		} else { return;}


	} elsif ($doit eq "Submit Input"){

		$flag=1;

		foreach $variable (@required_variables) {
   		 	next if (param($variable) eq "");
   		 	$flag = 0;
    			last;
 		}

			if ($flag) {
 
 	 	 		&print_no_input_sub;
	  
			} #end if (flag)
	
	} #end if ($doit eq

} #end of sub no_input

######################################################################
#                 no input subroutine  for query     	 	      #
#######################################################################

#section 4
sub no_input {

	$flag=1;

	foreach $variable (@required_variables) {
 	   next if (param($variable) eq "");
  	  $flag = 0;
   	 last;
 
	}

		if ($flag) {
 	 	   &print_no_input_sub;
		}

}


#######################################################################
#                 get input from a file and build insert command      #
#######################################################################

#section 13
sub file_list {


	foreach $element_red (@file_line) {
#print "element=$element_red\n";
		@value_red = split (/,\s*/, $element_red); #
		@value_red = map (quote_literals ($_), @value_red);
		$value_red = join (',', @value_red);
	#	print "insert into stis_psf values ($value_red)\n";
		push (@cmds,"insert into stis_psf values ($value_red)\n");

	}

	@input_cmd = @cmds;
	return @input_cmd;

} #end sub file_list.=========================================




#######################################################################
#                 subroutine quote literals             	      #
#######################################################################

#section 14
	sub quote_literals {
	    $_ = shift;
            $_ =~ s/\s+$//;
	    if ($_ eq 'NULL') {return $_;}
	    $_ = "\"$_\""unless /^-?\d+\.?\d*$/;
	    return $_;
	} 





#######################################################################
#                	 printrow  section   subroutine               #
#######################################################################
#section 16
sub printrow
	{
  print qq~
  <HTML>
  <HEAD>
  <TITLE>build sql query</TITLE>
  </HEAD><center><H1>STIS PSF Library Results</H1>
  <BODY BGCOLOR = "FFFFFF" TEXT = "000000">
             <table border=3>	   
             <center>
             <td>origfile</td>
             <td>psf_file</td>
             <td>psf_orig</td>
             <td>xcenter</td>
             <td>ycenter</td><tr>
             <td>$data[0]</td>
             <td>$data[1]</td>
             <td>$data[2]</td>
             <td>$data[3]</td>
             <td>$data[4]</td><tr><br>
	
             <td>xcorner</td>
             <td>ycorner</td>
             <td>ra_psf</td>
             <td>dec_psf</td>
             <td>peakint</td><tr><br>
             <td>$data[5]</td>
             <td>$data[6]</td>
             <td>$data[7]</td>
             <td>$data[8]</td>
             <td>$data[9]</td><tr><br>

             <td>peakfit</td>
             <td>saturatd</td>
             <td>backgnd</td>
             <td>colortype</td>
             <td>colorval</td><tr>
             <td>$data[10]</td>
             <td>$data[11]</td>
             <td>$data[12]</td>
             <td>$data[13]</td>
             <td>$data[14]</td><tr><br>

             <td>bvcolor</td>
             <td>spectral</td>
             <td>refspec</td>
             <td>psfscale</td>
             <td>pixfact</td><tr>
             <td>$data[15]</td>
             <td>$data[16]</td>
             <td>$data[17]</td>
             <td>$data[18]</td>
             <td>$data[19]</td><tr><br>

             <td>focus</td>
             <td>v2_rms</td>
             <td>v2_p2p</td>
             <td>v3_rms</td>
             <td>v3_p2p</td><tr>
             <td>$data[20]</td>
             <td>$data[21]</td>
             <td>$data[22]</td>
             <td>$data[23]</td>
             <td>$data[24]</td><tr><br>

             <td>detector</td>
             <td>instrume</td>
             <td>rootname</td>
             <td>filetype</td><tr>
             <td>$data[25]</td>
             <td>$data[26]</td>
             <td>$data[27]</td>
             <td>$data[28]</td><tr><br>
	     
	     <td>opt_elem</td>
             <td>filter</td>
             <td>aperture</td>
             <td>propaper</td><tr>
             <td>$data[29]</td>
             <td>$data[30]</td>
             <td>$data[31]</td>
             <td>$data[32]</td><tr><br>
	     
	     
	     <td>repeller</td>
             <td>centera1</td>
             <td>centera2</td>
             <td>sizaxis1</td><tr>
             <td>$data[33]</td>
             <td>$data[34]</td>
             <td>$data[35]</td>
             <td>$data[36]</td><tr><br>
	     
	     
	     <td>sizaxis2</td>
             <td>binaxis1</td>
             <td>binaxis2</td>
             <td>ccdgain</td><tr>
             <td>$data[37]</td>
             <td>$data[38]</td>
             <td>$data[39]</td>
             <td>$data[40]</td><tr><br>
	     
	     
	     <td>bias</td>
             <td>fgslock</td>
             <td>expstart</td>
             <td>exptime</td><tr>
             <td>$data[41]</td>
             <td>$data[42]</td>
             <td>$data[43]</td>
             <td>$data[44]</td><tr><br>
	     
	     
	     <td>targname</td>
             <td>ra_targ</td>
             <td>dec_targ</td>
             <td>proposid</td><tr>
             <td>$data[45]</td>
             <td>$data[46]</td>
             <td>$data[47]</td>
             <td>$data[48]</td><tr><br>
	     
	     	     	     	     	     
             </tr></table>

  </BODY>
  </HTML>~;

}



#######################################################################
#                               The End                  	      #
#######################################################################



	





