// The function below (FormSubmit) is the main, front-end to the form
// interface. Checks input value syntax, and calls functions to do the
// calcs, and report the results.

function FormSubmit(theform)
{
    
   // DETERMINE IRS wavelength range (which radio button clicked):

   radio_index = radio_active(theform.IRS_staring_mode);

   // READ BACKGROUND INDEX:

   var background_index = theform.thebackground.selectedIndex;
 
    // READ SOURCE NORMALIZATION:

    var normfac       = theform.normfac[radio_index].value;

   // READ NUMBER OF REPEATS:

   var Nrepeat = theform.Nrepeat[radio_index].value;

   // READ WAVELENGTH:

   var wavelength = theform.wavelength[radio_index].value;

   // set pixel scale for various modes (SOM, v5.0, Table 7.5:

   var phi_ll = 5.1;
   var phi_sl = 1.8;
   var phi_sh = 2.3;
   var phi_lh = 4.5;

   // SET OTHER PARAMS FOR MODE CHOSEN:

    if ( theform.IRS_staring_mode[radio_index].value == "SH" )
    {
       var mode             = "SH"
       var frametime_index  = theform.frameTime_SH.selectedIndex;	
       var frametime        = theform.frameTime_SH[theform.frameTime_SH.selectedIndex].value;

    }
    else if ( theform.IRS_staring_mode[radio_index].value == "LH" )
    {
       var mode             = "LH"
       var frametime_index  = theform.frameTime_LH.selectedIndex;	
       var frametime        = theform.frameTime_LH[theform.frameTime_LH.selectedIndex].value;

    }
    else if ( theform.IRS_staring_mode[radio_index].value == "SL1" )
    {
       var mode             = "SL1"       
       var frametime_index  = theform.frameTime_SL1.selectedIndex;	
       var frametime        = theform.frameTime_SL1[theform.frameTime_SL1.selectedIndex].value;
    }
    else if ( theform.IRS_staring_mode[radio_index].value == "SL2" )
    {
       var mode             = "SL2"
       var frametime_index  = theform.frameTime_SL2.selectedIndex;	
       var frametime        = theform.frameTime_SL2[theform.frameTime_SL2.selectedIndex].value;
    }
    else if ( theform.IRS_staring_mode[radio_index].value == "LL1" )
    {
       var mode             = "LL1"
       var frametime_index  = theform.frameTime_LL1.selectedIndex;	
       var frametime        = theform.frameTime_LL1[theform.frameTime_LL1.selectedIndex].value;
    }
    else if ( theform.IRS_staring_mode[radio_index].value == "LL2" )
    {
       var mode             = "LL2"
       var frametime_index  = theform.frameTime_LL2.selectedIndex;	
       var frametime        = theform.frameTime_LL2[theform.frameTime_LL2.selectedIndex].value;
    }
    else
    {
       alert("Bad IRS mode. SPEC-PET is confused! Please reset the form and/or reload the webpage.");
       return -1;
    }
       
    // CHECK VALIDITY OF INPUT: IS Nrepeat AN INTEGER? Is wavelength a float?
    //   Is wavelength within range for selected mode?
       
    var irs_input = check_IRS_input( Nrepeat, wavelength, mode, normfac );

    if( !irs_input ) 
       {
          irs_input_error( theform, mode, frametime, Nrepeat, wavelength );
	  return -1;
       }


    // UPDATE REPORT MESSAGE WITH IRS PARAMETERS.

    theform.selected_radio.value = "Background = " + theform.thebackground[theform.thebackground.selectedIndex].value;

    theform.selected_radio.value += "\n---------------------------------------------------------------------------------\n";

    theform.selected_radio.value += "IRS:\n   Input:\n          " + theform.IRS_staring_mode[radio_index].value + " mode ; Ramp duration = " + frametime + " sec ; Number of cycles = " + Nrepeat + "\n          Source flux density\(" + wavelength + " microns\) = " + normfac + " mJy";

    // Determine sensitivity, signal to noise:

    if (mode == "LL1" || mode == "LL2")
    {
       var sens = LL_PSSCS(wavelength, frametime_index, Nrepeat, background_index);
       var essc = 8.0 * sens / (phi_ll*phi_ll);
       var bsl = BSL_LL(frametime_index, background_index);
       var signaltonoise_faint = normfac / sens;
       var signaltonoise_bsc = signaltonoise_faint / Math.sqrt(1 + normfac/bsl);
       // Round to reasonable number of sig figs:
       sens = SigFig( sens, 3 );
       essc = SigFig( essc, 3 );
       signaltonoise_faint = SigFig( signaltonoise_faint, 2);
       signaltonoise_bsc = SigFig( signaltonoise_bsc, 2); 
       bsl = SigFig( bsl, 3);
       // Update report on webpage with results:
       theform.selected_radio.value += "\n   Output:\n          Sensitivity: " + mode + " PSSCS (" + wavelength + " microns)  = " + sens + " mJy (1-sigma)\n                           ESSC  (" + wavelength + " microns)  = " + essc + " MJy/sr"+ "\n          S/N = " + signaltonoise_bsc + " (including a correction for shot-noise, with transition knee at " + bsl + " mJy)";
    }
    else if (mode == "SL1" || mode == "SL2")
    {
       var sens = SL_PSSCS(wavelength, frametime_index, Nrepeat, background_index);
       var essc = 8.0 * sens / (phi_sl*phi_sl);
       var bsl = BSL_SL(frametime_index, background_index);
       var signaltonoise_faint = normfac / sens;
       var signaltonoise_bsc = signaltonoise_faint / Math.sqrt(1 + normfac/bsl);
       // Round to reasonable number of sig figs:
       sens = SigFig( sens, 3 ); 
       essc = SigFig( essc, 3 );
       signaltonoise_faint = SigFig( signaltonoise_faint, 2);
       signaltonoise_bsc = SigFig( signaltonoise_bsc, 2);
       bsl = SigFig( bsl, 3);
       // Update report on webpage with results:
       theform.selected_radio.value += "\n   Output:\n          Sensitivity: " + mode + " PSSCS (" + wavelength + " microns)  = " + sens + " mJy (1-sigma)\n                           ESSC  (" + wavelength + " microns)  = " + essc + " MJy/sr" + "\n          S/N = " + signaltonoise_bsc + " (including a correction for shot-noise, with transition knee at " + bsl + " mJy)";      
    }
    else if (mode == "LH" )
    {
       var sens = LH_PSSC(wavelength, frametime_index, Nrepeat, background_index);
       var essc = 8.0 * sens / (phi_lh*phi_lh);
       var bsl = BSL_LH(frametime_index, background_index);
       var signaltonoise_faint = normfac / sens;
       var signaltonoise_bsc = signaltonoise_faint / Math.sqrt(1 + normfac/bsl);
       // Round to reasonable number of sig figs:
       sens = SigFig( sens, 3 );
       essc = SigFig( essc, 3 ); 
       signaltonoise_faint = SigFig( signaltonoise_faint, 2);
       signaltonoise_bsc = SigFig( signaltonoise_bsc, 2);
       bsl = SigFig( bsl, 3);
       // Update report on webpage with results:

       theform.selected_radio.value += "\n   Output:\n          Sensitivity: LH PSSC (" + wavelength + " microns) = " + sens + " mJy (1-sigma)\n                          ESSC (" + wavelength + " microns) = " + essc + " MJy/sr\n";

       var sensl = LH_PSSL(wavelength, frametime_index, Nrepeat, background_index);
       var essl = 8.0e9 * sensl / (phi_lh*phi_lh);
       sensl = SigFig( sensl, 3 );
       essl = SigFig( essl, 3 );
       theform.selected_radio.value += "\n                       LH PSSL (" + wavelength + " microns) = " + sensl + " W/m^2 (1-sigma)\n                          ESSL (" + wavelength + " microns) = " + essl + " W/m^2/sr";
        theform.selected_radio.value += "\n          S/N = " + signaltonoise_bsc + " (including a correction for shot-noise, with transition knee at " + bsl + " mJy)";
    }
    else if (mode == "SH" )
    {
       var sens = SH_PSSC(wavelength, frametime_index, Nrepeat, background_index);
       var essc = 8.0 * sens / (phi_sh*phi_sh);
       var bsl = BSL_SH(frametime_index, background_index);
       var signaltonoise_faint = normfac / sens;
       var signaltonoise_bsc = signaltonoise_faint / Math.sqrt(1 + normfac/bsl);
       // Round to reasonable number of sig figs:
       sens = SigFig( sens, 3 );
       essc = SigFig( essc, 3 ); 
       signaltonoise_faint = SigFig( signaltonoise_faint, 2);
       signaltonoise_bsc = SigFig( signaltonoise_bsc, 2);
       bsl = SigFig( bsl, 3);
       // Update report on webpage with results:
       theform.selected_radio.value += "\n   Output:\n          Sensitivity: SH PSSC (" + wavelength + " microns) = " + sens + " mJy (1-sigma)\n                          ESSC (" + wavelength + " microns) = " + essc + " MJy/sr\n";

       var sensl = SH_PSSL(wavelength, frametime_index, Nrepeat, background_index);
       var essl = 8.0e9 * sensl / (phi_sh*phi_sh);
       sensl = SigFig( sensl, 3 ); 
       essl = SigFig( essl, 3 );
       theform.selected_radio.value += "\n                       SH PSSL (" + wavelength + " microns) = " + sensl + " W/m^2 (1-sigma)\n                          ESSL (" + wavelength + " microns) = " + essl + " W/m^2/sr";
       theform.selected_radio.value += "\n          S/N = " + signaltonoise_bsc + " (including a correction for shot-noise, with transition knee at " + bsl + " mJy)";
    }
    else
    {
       alert("Bad IRS mode. SPEC-PET is confused! Please reset the form and/or reload the webpage.");
       return false;
    }

       theform.selected_radio.value += ". NOTE: This calculation does not include pattern noise due to flat field errors and fringing. In practice, the largest continuum signal-to-noise reachable with the low-resolution modules is ~100. For the high-resolution modules, it is ~50.\n\n";


    // Now do MIPS SED calculations:

    var mips_frametime_index  = theform.sed_texp.selectedIndex;	
    var mips_texp   = theform.sed_texp[theform.sed_texp.selectedIndex].value;

    var mips_ncycles = theform.Nrepeat_SED.value;

    // Check Ncycles is valid form:

    var mips_input = check_MIPS_input( mips_ncycles );    
  
    if( !mips_input ) 
       {
          mips_input_error( theform, mips_texp, mips_ncycles );
	  return -1;
       }

    // Define MIPS wavelengths, sensitivities. Only have 
    //    sensitivities for 3 wavelengths, and 500s for now...

    var mips_sed_num_wavelengths  = 3;
    mips_sed_wavelengths = new Array(mips_sed_num_wavelengths);
    mips_sed_wavelengths = set_mips_sed_wavelengths(mips_sed_num_wavelengths);
   
    mips_sed_sens = new Array(mips_sed_num_wavelengths);
    mips_sed_sens = mips_sed_sensitivity(mips_sed_num_wavelengths, background_index, mips_texp, mips_ncycles ) 


    theform.selected_radio.value += "---------------------------------------------------------------------------------\n";

    theform.selected_radio.value += "MIPS SED:\n   Input:\n          t_exp = " +  mips_texp + " sec; Ncycles = " +  mips_ncycles + "\n   Output:\n          Integration on target = " +  mips_texp*6.0*mips_ncycles + " sec\n          Wavelengths (microns):      | " + mips_sed_wavelengths[0] + " | " + mips_sed_wavelengths[1] + " | " + mips_sed_wavelengths[2] + " |\n          Sensitivity (mJy; 1-sigma): | " + mips_sed_sens[0] + " | " + mips_sed_sens[1] + " | " + mips_sed_sens[2] + " |";  

}
