var sp2_http = "";
var SPact_http = "";
var ps_pdf_http = "";
//following variables are used to control the progress bar/div
var blocksize=(250-2)/100;
var loaded=0;
var progress_div_1;
var progress_div_2;
var difference_array = new Array("", "");
var difference_array_name = new Array("", "");
var difference_doppler_val = new Array("", "");
var re = /\$|@|#|~|`|\%|\*|\^|\&|\?|\'|\"|\<|\>|\?|\||\\|\$/g;
//creates an HTTP request
function getHTTPObject()
{
 var xmlhttp;
 /*@cc_on
 @if (@_jscript_version >= 5)
  try {
   xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    try {
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     } catch (E) {
       xmlhttp = false;
      }
    }
 @else
 xmlhttp = false;
 @end @*/
 if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
  try {
   xmlhttp = new XMLHttpRequest();
  } catch (e) {
    xmlhttp = false;
    }
 }
return xmlhttp;
}

//this function is used to determind which spectra are selected and gather the information to do a
//plot, comparision,multiplication, or deletion of the spectra. more actions may be added later.
function spectra_action(spec_act) {
 var err_div = document.getElementById("error_div");
 var boxes_checked = document.forms['spectra_form'].elements['spectra_list'];
 var boxes_length = boxes_checked.length;
 var num_cked = 0;
 var cked_rec = new Array();
 var cked_yunits = new Array();
 var ll_array = new Array();
 var ul_array = new Array();
 var temp_val = "";
 var error = false;
 var cal_str = "";
 var tempLL = 0;
 var tempUL = 0;
 var spectra_xmin_val = 0;
 var spectra_xmax_val = 0;
 var spectra_ymin_val = 0;
 var spectra_ymax_val = 0;
 var max_xmin = 0;
 var min_xmax = 0;
//  var min_overlap = 0.0001;
 var min_max_diff = 0;
 var sel_units = "cm<sup>-1</sup>";
 var spectra_units = document.getElementById("spectra_units").value;
 if(spectra_units == "microns") {
  sel_units = "&#181;m";
 }
 var spec_act = document.getElementById("spectra_select").value;
 var spc_str = "spectra_xml=<spectra_info><action>" + spec_act + "</action><units>" + spectra_units + "</units>"; 
 var remote_address = document.getElementById("calc_remote_addr").value;
 var remote_host = document.getElementById("calc_remote_host").value;
 var user_agent = document.getElementById("calc_user_agent").value;
 var user_name = document.getElementById("user_name").value;
 spc_str+="<remote_addr>" + remote_address + "</remote_addr><remote_host>" + remote_host + "</remote_host><ua>" + user_agent + "</ua><un>" + user_name + "</un>";
 var err_str = "";
 if(isNaN(parseInt(boxes_length))) { //only one check box.
  if(document.getElementById("spectra_list0").checked == true) {
   temp_val = document.getElementById("spectra_list0").value;
   temp_val = temp_val.split("_");
   cked_rec[0] = temp_val[0];
   cked_yunits[0] = temp_val[1];
   num_cked = 1;
   spectra_xmin_val = document.getElementById("llVal0").value;
   max_xmin = spectra_xmin_val;
   spectra_xmax_val = document.getElementById("ulVal0").value;
   min_xmax = spectra_xmax_val;
  }
 } //end if isNan
 else {
  for(var i=0; i < boxes_length; i++) {
   if(boxes_checked[i].checked == true) {
    temp_val = boxes_checked[i].value;
    temp_val = temp_val.split("_");
    cked_rec[num_cked] = temp_val[0];
    cked_yunits[num_cked] = temp_val[1];
    tempLL = document.getElementById("llVal" + i).value;
    if(num_cked == 0) { //set the xmin & xmax to the first selected spectra. compare from there.
     spectra_xmin_val = document.getElementById("llVal" + i).value;
     spectra_xmax_val = document.getElementById("ulVal" + i).value;
     max_xmin = document.getElementById("llVal" + i).value;
     min_xmax =document.getElementById("ulVal" + i).value;
    }
    if(parseFloat(tempLL) < parseFloat(spectra_xmin_val)) {
     spectra_xmin_val = tempLL;
    }
    if(parseFloat(tempLL) > parseFloat(max_xmin)) {
     max_xmin = tempLL;
    }
    tempUL = document.getElementById("ulVal" + i).value;
    if(parseFloat(tempUL) > parseFloat(spectra_xmax_val)) {
     spectra_xmax_val = tempUL;
    }
    if(parseFloat(tempUL) < parseFloat(min_xmax)) {
     min_xmax = tempUL;
    } 
    ll_array[num_cked] = tempLL;
    ul_array[num_cked] = tempUL;
    num_cked++
   } //end if
  } //end for loop
 } //end else more than 1 checkbox
 min_max_diff = parseFloat(min_xmax) - parseFloat(max_xmin);
 var yunits = cked_yunits[0];
 if(num_cked < 1) {
   error = true;
   err_str = "At least one spectra must be selected.<br>";
 }
 else if((spec_act == "product") || (spec_act == "sum")) {  //n >1 & same y-units
  if((num_cked > 1) && (num_cked <=6)) {
   var offset_arry = check_offset();
   if(offset_arry[0] == "nooffset") {
    spc_str+="<offset>false</offset>"; 
   }  //end if offset_array == nooffset
   else {
    if(offset_arry[2] != "pass") {
      error = true;
      err_str+= offset_arry[2] + "<br>";
    } //end offset_array[2] != pass
    else {
     spc_str+="<offset>true</offset>"; 
     spc_str+="<offset_val>" + offset_arry[1] + "</offset_val>";
    } //end else
   } //end else
   spc_str+="<num_rec>" + cked_rec.length + "</num_rec><ptype>" + yunits + "</ptype>";
   var doppler_arry = check_doppler(num_cked);
   if(doppler_arry[0] == "nodoppler") {
    spc_str+="<doppler>false</doppler>"; 
   }
  else {  //doppler checked. get info.
    spc_str+="<doppler>true</doppler>"; 
    if(doppler_arry[1] == "pass") {
     for(var d=3; d < (3+num_cked); d++) {
       spc_str+= "<doppler_val>" + doppler_arry[d] + "</doppler_val>";
     }
    }
    else { 
     error = true;
     err_str+= doppler_arry[2] + "<br>";
    }
   }
   var xrange_array = check_range(spectra_xmin_val,spectra_xmax_val);
   if(xrange_array[0] == "norange") {
    spc_str+="<xrange>false</xrange>";
   }
   else {
    spc_str+="<xrange>true</xrange>";
    if(xrange_array[1] == "pass") {
     spc_str+="<xrange_min>" + xrange_array[3] + "</xrange_min>";
     spc_str+="<xrange_max>" + xrange_array[4] + "</xrange_max>";
    }
    else {
     error = true;
     err_str+= xrange_array[2] + "<br>";
    }
   }
 //check to see if the user wants to use a y-range and if so make sure they are numbers
//and that ymax > ymin.
  var yrange = document.getElementById("y_range").checked;
  if(yrange == true) {
    spc_str+="<yrange>true</yrange>";
   var ymin = document.getElementById("spectra_ymin").value;
   var ymax = document.getElementById("spectra_ymax").value;
    if(isNaN(parseFloat(ymin))) {
    error = true;
    err_str+= "<br>Y-min value has to be a numeric value<br>";
   }
    if(isNaN(parseFloat(ymax))) {
    error = true;
    err_str+= "<br>Y-max value has to be a numeric value<br>";
   }
   if(parseFloat(ymin) >= parseFloat(ymax)) {
    error = true;
    err_str+= "<br>Y-max value has to be greater than Y-min value<br>";
   }
   spc_str+="<ymin>" + ymin + "</ymin><ymax>" + ymax + "</ymax>";
  }
  else {
    spc_str+="<yrange>false</yrange>";
  }
  //make sure the spectra overlap.
    if (parseFloat(max_xmin) > parseFloat(min_xmax)) {
    error = true;
    err_str+= "The spectra must be overlapping to calculate a " + spec_act + " plot.<br>";
   }
   /*if(parseFloat(min_overlap) > parseFloat(min_max_diff)) {
    error = true;
    err_str+= "The minimum overlap of spectra x-range must be " + min_overlap + " " + sel_units + "<br>";
   }*/
   cal_str = "Calculating";
   var log_lin = document.getElementById("spectra_log").checked;
  if(spec_act == "product") {
   var num_rad = 0;
    for(var z=0; z < cked_yunits.length; z++) {
     spc_str+= "<rec>" + cked_rec[z] + "</rec>";
     if(cked_yunits[z] == "rad") {
      num_rad++;
     }
    } //end x for loop
    if(num_rad > 1) {
     error = true;
     err_str+= "please choose at most one radiance spectrum for product operation.<br>";
    }
   } //end else if spec_act == product
   else if(spec_act == "sum") {
    for(var z=0; z < cked_yunits.length; z++) {
     spc_str+= "<rec>" + cked_rec[z] + "</rec>";
     if(cked_yunits[z] == "trans") {
      error = true;
      err_str+= "please only choose radiance spectra for sum operation<br>";
      break;
     }
    } //end x for loop
   } //end else if spec_act == sum
  } //end num_cked > 1 & <=6
  else if (num_cked > 6) {
   error = true;
   err_str+= "please specify no more than 6 spectra for this operation.<br>";
  }
  else {
   error = true;
   err_str+= "At least two spectra must be selected.<br>";
  }
  if(log_lin == true) {
   spc_str+= "<log_lin>log</log_lin>";
  }
  else {
   spc_str+= "<log_lin>nolog</log_lin>";
  }
 } //end product
 else if(spec_act == "plot_spectra") {
  if(num_cked <= 6) {
   var log_lin = document.getElementById("spectra_log").checked;
   cal_str = "Calculating";
   var yunits_same = true;
   var offset_arry = check_offset();
   if(offset_arry[0] == "nooffset") {
    spc_str+="<offset>false</offset>"; 
   }  //end if offset_array == nooffset
   else {
    if(offset_arry[2] != "pass") {
      error = true;
      err_str+= offset_arry[2] + "<br>";
    } //end offset_array[2] != pass
    else {
     spc_str+="<offset>true</offset>"; 
     spc_str+="<offset_val>" + offset_arry[1] + "</offset_val>";
    } //end else
   } //end else
   spc_str+="<num_rec>" + cked_rec.length + "</num_rec>";
   var doppler_arry = check_doppler(num_cked);
   if(doppler_arry[0] == "nodoppler") {
    spc_str+="<doppler>false</doppler>"; 
   }
   else {  //doppler checked. get info.
    spc_str+="<doppler>true</doppler>"; 
    if(doppler_arry[1] == "pass") {
     for(var d=3; d < (3+num_cked); d++) {
       spc_str+= "<doppler_val>" + doppler_arry[d] + "</doppler_val>";
     } //end for
    } //end if
    else {
     error = true;
     err_str+= doppler_arry[2] + "<br>";
    } //end else
   } //end else
   var xrange_array = check_range(spectra_xmin_val,spectra_xmax_val);
   if(xrange_array[0] == "norange") {
    spc_str+="<xrange>false</xrange>";
   }
   else {
    spc_str+="<xrange>true</xrange>";
    if(xrange_array[1] == "pass") {
     spc_str+="<xrange_min>" + xrange_array[3] + "</xrange_min>";
     spc_str+="<xrange_max>" + xrange_array[4] + "</xrange_max>";
    }
    else {
     error = true;
     err_str+= xrange_array[2] + "<br>";
    }
   }
 //check to see if the user wants to use a y-range and if so make sure they are numbers
//and that ymax > ymin.
  var yrange = document.getElementById("y_range").checked;
  if(yrange == true) {
    spc_str+="<yrange>true</yrange>";
   var ymin = document.getElementById("spectra_ymin").value;
   var ymax = document.getElementById("spectra_ymax").value;
    if(isNaN(parseFloat(ymin))) {
    error = true;
    err_str+= "<br>Y-min value has to be a numeric value<br>";
   }
    if(isNaN(parseFloat(ymax))) {
    error = true;
    err_str+= "<br>Y-max value has to be a numeric value<br>";
   }
   if(parseFloat(ymin) >= parseFloat(ymax)) {
    error = true;
    err_str+= "<br>Y-max value has to be greater than Y-min value<br>";
   }
   spc_str+="<ymin>" + ymin + "</ymin><ymax>" + ymax + "</ymax>";
  }
  else {
    spc_str+="<yrange>false</yrange>";
  }
   for(var c=0; c < cked_rec.length; c++) {
    spc_str+= "<rec>" + cked_rec[c] + "</rec>";
    for(var e=c; e < cked_yunits.length; e++) {
     if(cked_yunits[c] != cked_yunits[e]) {
	   yunits_same = false;
	   break;
      } //end if
     } //end e for loop
   } //end c for loop
   if(yunits_same != true) {
    error = true;
    err_str+= "please choose spectra of same type (transmittance or radiance) to plot.<br>";
   } //end if yunits_same != true
   else if((log_lin == true) && (cked_yunits[0] == "trans")) {
    error = true;
    err_str+= "Log scale is only allowed for Radiance Plots.<br>";
   }
   if(error == false) {
    if(log_lin == true) {
     spc_str+= "<log_lin>log</log_lin>";
    }
    else {
     spc_str+= "<log_lin>nolog</log_lin>";
    }
   }
  } //end num_cked <=6 ;
  else {
   error = true;
   err_str+= "please specify no more than 6 spectra for this operation.<br>";
  }
 }//end if spec_action = plot_spectra
 else if(spec_act == "doppler") {
  if(num_cked == 1) {
   cal_str = "Calculating";
   var doppler_num = document.getElementById("plot_doppler_val").value;
   spc_str+= "<rec>" + cked_rec[0] + "</rec><doppler_val>" + doppler_num + "</doppler_val><ptype>" + yunits + "</ptype>";

  } //end num_cked > 1
  else {
   error = true;
   err_str+= "please specify only 1 spectrum for this operation.<br>";
  }
 } //end else spec_act = doppler
 else if(spec_act == "difference") { // n = 2 and same y units
  if(num_cked == 2) {
   var log_lin = document.getElementById("spectra_log").checked;
   cal_str = "Calculating";
   spc_str+="<ptype>" + yunits + "</ptype>";
   var doppler_arry = check_doppler(num_cked);
   if(doppler_arry[0] == "nodoppler") {
    spc_str+="<doppler>false</doppler>"; 
   }
  else {  //doppler checked. get info.
    spc_str+="<doppler>true</doppler>"; 
    if(doppler_arry[1] == "pass") {
     var dopval1 = doppler_arry[3];
     var dopval2 = doppler_arry[4];
     var dopName1 = document.getElementById("dopplerName0").innerHTML;
     var dopName2 = document.getElementById("dopplerName1").innerHTML;
     if(dopName1 == difference_array_name[0]) {
      spc_str+= "<doppler_val>" + dopval1 + "</doppler_val>";
      spc_str+= "<doppler_val>" + dopval2 + "</doppler_val>";
     }
     else {
      spc_str+= "<doppler_val>" + dopval2 + "</doppler_val>";
      spc_str+= "<doppler_val>" + dopval1 + "</doppler_val>";
     }
    } //end if doppler_arry = pass
    else {
     error = true;
     err_str+= doppler_arry[2] + "<br>";
    }
   } //end else doppler
   var xrange_array = check_range(spectra_xmin_val,spectra_xmax_val);
   if(xrange_array[0] == "norange") {
    spc_str+="<xrange>false</xrange>";
   }
   else {
    spc_str+="<xrange>true</xrange>";
    if(xrange_array[1] == "pass") {
     spc_str+="<xrange_min>" + xrange_array[3] + "</xrange_min>";
     spc_str+="<xrange_max>" + xrange_array[4] + "</xrange_max>";
    }
    else {
     error = true;
     err_str+= xrange_array[2] + "<br>";
    }
   } //end else.
 //check to see if the user wants to use a y-range and if so make sure they are numbers
//and that ymax > ymin.
  var yrange = document.getElementById("y_range").checked;
  if(yrange == true) {
    spc_str+="<yrange>true</yrange>";
   var ymin = document.getElementById("spectra_ymin").value;
   var ymax = document.getElementById("spectra_ymax").value;
    if(isNaN(parseFloat(ymin))) {
    error = true;
    err_str+= "<br>Y-min value has to be a numeric value<br>";
   }
    if(isNaN(parseFloat(ymax))) {
    error = true;
    err_str+= "<br>Y-max value has to be a numeric value<br>";
   }
   if(parseFloat(ymin) >= parseFloat(ymax)) {
    error = true;
    err_str+= "<br>Y-max value has to be greater than Y-min value<br>";
   }
   spc_str+="<ymin>" + ymin + "</ymin><ymax>" + ymax + "</ymax>";
  }
  else {
    spc_str+="<yrange>false</yrange>";
  }
  //make sure the spectra overlap.
    if (parseFloat(max_xmin) > parseFloat(min_xmax)) {
    error = true;
    err_str+= "The spectra must be overlapping to calculate a difference plot.<br>";
   }
   if(cked_yunits[0] != cked_yunits[1]) {
    error = true;
    err_str+= "please choose two spectra of same type (transmittance or radiance) to difference.<br>";
   }
   if((log_lin == true) && (cked_yunits[0] == "trans")) {
    error = true;
    err_str+= " Log scale is only allowed for Radiance Plots.<br>";
   }
   if(error != true) {
     if(log_lin == true) {
      spc_str+= "<log_lin>log</log_lin>";
     }
     else {
      spc_str+= "<log_lin>nolog</log_lin>";
     }
   } //end error! = true
 } //end num_cked = 2 ;
 else {
  error = true;
  err_str+= "please specify exactly two spectra for difference operation.<br>";
 }
 spc_str+="<rec>" + difference_array[0] + "</rec><rec>" +  difference_array[1] + "</rec>";
} //end else action = difference
 else if(spec_act == "download"){ // n=1
  if(num_cked == 1) {
   cal_str = "Extracting";
   spc_str+= "<rec>" + cked_rec[0] + "</rec>";
  } //end num_cked > 1
  else {
   error = true;
   err_str+= "please specify only 1 spectrum for this operation.<br>"
  }
 } //end else action = download
 else if(spec_act == "rename") {
   if(num_cked == 1) {
    cal_str = "Renaming";
    var new_name = document.getElementById("new_spectra_name").value;
    new_name = new_name.replace(re, ""); 
    new_name = trim(new_name);
    if (parseInt(new_name.length) < 1) {
     error = true;
     err_str+="spectra name can not be blank or contain invalid characters, please enter a name.<br>";
     err_str+="please click <font color='blue'><a onmouseover=\"popUp(event,'valid_char')\" onmouseout=\"popUp(event,'valid_char')\"'>here</a></font> for a list of valid characters.";
     document.getElementById("new_spectra_name").value = new_name;
    }
    else {
     spc_str+= "<rec>" + cked_rec[0] + "</rec><new_name>" + new_name + "</new_name>";
    }
  } //end num_cked > 1
  else {
   error = true;
   err_str+= "please specify only 1 spectrum for this operation.<br>";
  }
 }
 else if(spec_act == "delete") { // n > 0
  if(num_cked == 1) {
   cal_str = "Deleting";
   spc_str+= "<rec>" + cked_rec[0] + "</rec>";
  }
  else {
   error = true;
   err_str+= "please specify only 1 spectrum for this operation.<br>";
  }
 } //end else action = delete
 else if(spec_act == "description") {
   if(num_cked == 1) {
   cal_str = "Getting description";
   spc_str+= "<rec>" + cked_rec[0] + "</rec>";
  } //end num_cked > 1
  else {
   error = true;
   err_str+= "please specify only 1 spectrum for this operation.<br>";
  } 
 }
 if(spec_act == "none") {
  error = true;
  err_str+= "You must select an action to perform from the menu.<br>";
 }
 if(error == true) {
  err_div.innerHTML = "<font color='red'><b>ERRORS</b><br>" + err_str + "</font>";
 }
 else {
  err_div.innerHTML = "";
  var div1 = document.getElementById("progress_div");
  var div_string = "<center><img src='../images/loading.gif'><br><font color='#004D8F' size='+1'><b>" + cal_str + "</b><br></font></center>";
  document.body.style.cursor = 'wait'; 
  document.getElementById("spectra_submit").disabled = true;
  div1.innerHTML = "";
  div1.innerHTML = div_string;
  spc_str+="</spectra_info>";
  SPact_http = getHTTPObject();
  SPact_http.open("POST", "spectra_action.php", true);
  SPact_http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  SPact_http.setRequestHeader("Content-length", spc_str.length);
  SPact_http.setRequestHeader("Connection", "close");
  SPact_http.onreadystatechange = spectra_action_results;
  SPact_http.send(spc_str);
 }
} //end spectra_action

function spectra_action_results() {
 if(SPact_http.readyState == 4) {
  document.body.style.cursor = 'default';
  document.getElementById("spectra_submit").disabled = false;
  var div1= document.getElementById("progress_div");
  div1.innerHTML = "";
  var response = SPact_http.responseXML;
  var spectra_action = "";
  var spectra_msg = "";
  var action_res = response.getElementsByTagName('action').item(0).firstChild.data;
  var out = "";
  if(action_res == "download") {
   var fn = response.getElementsByTagName('fn').item(0).firstChild.data;
   var spname = response.getElementsByTagName('spname').item(0).firstChild.data;
   out = "<a href='extract/" + fn + ".txt' target='_blank'>Spectra-- " + spname + "</a> ";
  }
  else if((action_res == "rename") || (action_res == "delete")){
   window.location.href='spectra.php';
  }
  else if(action_res == "plot_spectra") {
   spectra_result = response.getElementsByTagName("result").item(0).firstChild.data;
   if(spectra_result == "success") {
    var fn = response.getElementsByTagName('fn').item(0).firstChild.data;
    var ex_str = response.getElementsByTagName('pstr').item(0).firstChild.data; 
    out = "<img src='plots/" + fn + ".png'><br><center>";
    out+= "<font color='blue'><u><a onClick=\"generate_PsPdf_files('" + ex_str + "', '" + action_res + "', '" + fn + "', 'ps')\">Generate Postscript</a></u></font>&nbsp;&nbsp;&nbsp;";
    out+= "<font color='blue'><u><a onClick=\"generate_PsPdf_files('" + ex_str + "', '" + action_res + "', '" + fn + "','pdf')\">Generate PDF</a></u></font>&nbsp;&nbsp;&nbsp;<br><br><span id='ps_pdf_file" + fn + "'></span><br><br><br>";
    } //end if spectra_result = success.
    else {
      spectra_msg = response.getElementsByTagName("result_msg").item(0).firstChild.data;
      out = "<font color='red'><b>ERRORS</b><br>" + spectra_msg + "</font>";
    } //end else
   }
   else if((action_res == "difference") || (action_res == "product") || (action_res == "sum")|| (action_res == "doppler")) {
   spectra_result = response.getElementsByTagName("result").item(0).firstChild.data;
   if(spectra_result == "success") {
    var fn = response.getElementsByTagName('fn').item(0).firstChild.data;
    var fsz = response.getElementsByTagName('fsz').item(0).firstChild.data;
    var ptype = response.getElementsByTagName('ptype').item(0).firstChild.data;
    var ex_str = response.getElementsByTagName('pstr').item(0).firstChild.data; 
    var ctype = action_res.charAt(0).toUpperCase() + action_res.slice(1).toLowerCase();
    out = "<img src='plots/" + fn + ".png'><br>";
    out+= "<font color='blue'><u><a onClick=\"generate_PsPdf_files('" + ex_str + "', '" + action_res + "', '" + fn + "', 'ps')\">Generate Postscript</a></u></font>&nbsp;&nbsp;&nbsp;";
    out+= "<font color='blue'><u><a onClick=\"generate_PsPdf_files('" + ex_str + "', '" + action_res + "', '" + fn + "', 'pdf')\">Generate PDF</a></u></font>&nbsp;&nbsp;&nbsp;";
    var ct2 = ctype;
    if((action_res == "product") || (action_res == "sum")) {
      ct2 = "Composite";
    }
    out+="<a href='plots/" + fn + ".txt' target='_blank'>Text File (" + fsz + ")</a>";
    out+="&nbsp;&nbsp;&nbsp;<a onClick='save_spectra(\"save\", \"" + fn + "\", \"0\", \"" + ptype + "\", \"spectra\");'><font color='blue'><u>Save " + ct2 + " Spectrum</u></font></a>";
    out+="<br><div id='prof_info_0'></div><br><br><span id='ps_pdf_file" + fn + "'></span><br><br><br>\n";
   } //end spectra_result = success
    else {
      spectra_msg = response.getElementsByTagName("result_msg").item(0).firstChild.data;
      out = "<font color='red'><b>ERRORS</b><br>" + spectra_msg + "</font>";
    } //end else
  }
  else if (action_res == "description") {
   var sp_name = response.getElementsByTagName('name').item(0).firstChild.data;
   var desc = response.getElementsByTagName('desc').item(0).firstChild.data;
   out = "<div style=\"text-align:justify; align:left\"<b>Spectra Name:&nbsp;</b>" + sp_name + "<br><b>Description:&nbsp;</b>" + desc + "</div>";
  }
  out ="<center>" + out + "</center>";
  document.getElementById("spectra_results").innerHTML = out;
 } //end ready state = 4
} //end function

function save_spectra(sp_action, text_fn, div_id, sp_type, tool) {
 var user_status = get_user_status();
 var user_name = get_user_name();
 if(sp_action == "save") {
  var pout = "";
  var pif = "prof_info_" + div_id;
  if(user_status == "on") {
    pout = "<br><table><tr><td>Spectra Name: </td><td><input type='text' name='spectra_name_" + div_id + "' id='spectra_name_" + div_id + "' maxlength='32' size='32'></td></tr><tr><td>";
    pout+= "Description:</td><td><textarea rows='3' cols='30' name='spectra_desc' id='spectra_desc'></textarea><br>";
    pout+= "Please do not use any special characters in the description.</td></tr></table>";
    pout+= "<input type='image' onClick=\"save_spectra('name', '" + text_fn + "', '" + div_id + "', '" + sp_type + "', '" + tool + "'); return false;\" src='../images/save.png'><br>";
   document.getElementById(pif).innerHTML = "";
   document.getElementById(pif).innerHTML = pout;
   document.getElementById("spectra_name_" + div_id).focus();
  }
  else {
 document.getElementById("ps_ascii_div").innerHTML = "<font color='red'>Saved spectra are only available to active subscribers. Please login above, or <a href='plans.php' target='_blank'>Subscribe</a><br>";
   document.getElementById(pif).innerHTML = "";
   document.getElementById(pif).innerHTML = "";
  }
 } //end sp_action = save
 else {
  var pstr = "spectra_name_" + div_id;
  var prof_name = document.getElementById(pstr).value;
  prof_name = prof_name.replace(re, ""); 
  prof_name = trim(prof_name);
  if(prof_name.length > 0) {
   var saved_params = "user_name=" + user_name  + "&txt_fn=" + text_fn + "&spectra_name=" + prof_name + "&type=" + sp_type + "&tool=" + tool + "&divid=" + div_id;
   var sp_desc = document.getElementById("spectra_desc").value;
   // remove special characters like "$" and "," etc...
   sp_desc = sp_desc.replace(re, "");
   var re_ret = RegExp( "\\r", "g" );
   sp_desc = sp_desc.replace(re_ret, "    ");
   var re_ret2 = RegExp( "\\n", "g" );
   sp_desc = sp_desc.replace(re_ret2, "    ");
   saved_params+="&desc=" + sp_desc; 
   sp2_http = getHTTPObject();
   sp2_http.open("POST", "../spectra/save_spectra.php", true);
   sp2_http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   sp2_http.setRequestHeader("Content-length", saved_params.length);
   sp2_http.setRequestHeader("Connection", "close");
   sp2_http.onreadystatechange = spectra_res;
   sp2_http.send(saved_params);
  }
  else {
   window.alert("Spectra name can not be blank or contain invalid characters.");
  }
 } //end else
} //end save_spectra

function spectra_res() {
 if(sp2_http.readyState == 4) {
  var response = sp2_http.responseXML;
  var response1 = response.getElementsByTagName('res').item(0).firstChild.data;
  var div_id = response.getElementsByTagName('divid').item(0).firstChild.data;
  var sname = response.getElementsByTagName('sname').item(0).firstChild.data;
  var result = response.getElementsByTagName('result').item(0).firstChild.data;
  var res_divStr = "prof_info_" + div_id;
  var res_div = document.getElementById(res_divStr);
  if (result == "passed") {
   res_div.innerHTML = "<br><br>Spectra " + sname + " has been saved to <a href='../spectra/spectra.php' target='_self'>My Spectra</a>.";
  }
  else {
    var err_msg = response.getElementsByTagName('err_msg').item(0).firstChild.data;
    res_div.innerHTML = "The following error has occurred:<br>" + err_msg; // please try to save your spectra again.";
  }
 }
}
//if the option selected is plot, product or difference show plot options,
// if not, remove the plot options information.
function update_select() {
 var sel_val = document.getElementById("spectra_select").value;
 document.getElementById("error_div").innerHTML = "";
 var str = "";
 if(sel_val == "rename") {
  str = "Enter new name here: <input type='text' name='new_spectra_name' id='new_spectra_name' value='' maxlength='32'>";
 }
else if(sel_val == "difference") {
  str = "<table><tr><th colspan='2'><div class='hdr' id='cell_label' align='center'>Plot Options</div></th></tr><tr><td>";
  str+= "<input type='checkbox' name='spectra_log' id='spectra_log'>Log&nbsp;Scale&nbsp;(Radiance&nbsp;plots&nbsp;only)&nbsp;&nbsp;&nbsp;</td></tr>";
  str+="<tr><td><input type='checkbox' name='spectra_range' id='spectra_range' onClick='show_range();'>Specify x-axis range<span id='range_span' name='range_span'></span></td></tr>";
  str+="<tr><td><input type='checkbox' name='y_range' id='y_range' onClick='show_Y_range();'>Specify y-axis range<span id='Yrange_span' name='Yrange_span'></span></td></tr>";
  str+="<tr><td><input type='checkbox' name='doppler_shift' id='doppler_shift' onClick='show_doppler();'>Apply Doppler shift";
  str+="<br><span id='doppler_span' name='doppler_span'></span></td></tr>";
  str+="<tr><td><input type='checkbox' name='diff_option' id='diff_option' onClick='show_difference_options();'>Specify difference order<br><span id='difference_span' name='difference_span'></span></td></tr>";
  str+="</table><br>";
}
 else if((sel_val == "plot_spectra") || (sel_val == "product") || (sel_val == "sum")) {
  str = "<table><tr><th colspan='2'><div class='hdr' id='cell_label' align='center'>Plot Options</div></th></tr><tr><td>";
  str+= "<input type='checkbox' name='spectra_log' id='spectra_log'>Log&nbsp;Scale&nbsp;(Radiance&nbsp;plots&nbsp;only)&nbsp;&nbsp;&nbsp;</td></tr>";
  str+="<tr><td><input type='checkbox' name='spectra_range' id='spectra_range' onClick='show_range();'>Specify x-axis range<span id='range_span' name='range_span'></span></td></tr>";
  str+="<tr><td><input type='checkbox' name='y_range' id='y_range' onClick='show_Y_range();'>Specify y-axis range<span id='Yrange_span' name='Yrange_span'></span></td></tr>";
  str+="<tr><td><input type='checkbox' name='doppler_shift' id='doppler_shift' onClick='show_doppler();'>Apply Doppler shift<br>";
  str+="<span id='doppler_span' name='doppler_span'></span></td></tr>";
  str+="<tr><td><input type='checkbox' name='plot_offset' id='plot_offset' onClick='show_offset();'>Apply offset<br>";
  str+="<span id='offset_span' name='offset_span'></span></td></tr>";
  str+="</table><br>";
 }
 else if(sel_val == "doppler") {
   str = "<table><tr><th colspan='2'><div class='hdr' id='cell_label' align='center'>Plot Options</div></th></tr><tr><td>";
   str+="Doppler Velocity: </td><td><input type='text' name='plot_doppler_val' id='plot_doppler_val' value='0' size='6'>&nbsp;km/s</td</tr>";
   str+="<tr><td colspan='2'><font size='-1'>Valid range is between -100 and 100</font></td></tr>";
  str+="</table><br>";
 }  //end sel_val = doppler
 else {
   str = "";
 }
 document.getElementById("spectra_options").innerHTML = str;
 if(sel_val == "difference") {
  show_difference_options();
 }
}

function convert_units() {
 var Cunits = document.getElementById("spectra_units").value;
 var num_spectra = document.getElementById("num_spectra").value;
 var ll_val = 0;
 var ul_val = 0;
 var ll_temp = 0;
 var ul_temp = 0;
 for(q=0; q < num_spectra; q++) {
  ll_val = document.getElementById("llVal" + q).value;
  ul_val = document.getElementById("ulVal" + q).value;
  if(Cunits == "microns") {
   ll_temp = 10000/parseFloat(ul_val);
   ul_temp =10000/parseFloat(ll_val);
  }
  else {
   ll_temp = 10000/parseFloat(ul_val);
   ul_temp =10000/parseFloat(ll_val);
  }
  var ll_prec = ll_temp.toFixed(4);
  var ul_prec = ul_temp.toFixed(4);
  document.getElementById("ll" + q).innerHTML = ll_prec;
  document.getElementById("ul" + q).innerHTML = ul_prec;
  document.getElementById("llVal" + q).value = ll_temp;
  document.getElementById("ulVal" + q).value = ul_temp; 
 }
 var spec_act = document.getElementById("spectra_select").value;
 //if the select menu is plot, product or difference check to see if the spectra range option is checked.
//if it is checked, change the units to microns.
 if((spec_act == "plot_spectra") || (spec_act == "product") || (spec_act == "difference")) {
   var range_option = document.getElementById("spectra_range").checked;
   if(range_option == true) {
     var xmin_units = "cm<sup>-1</sup>";
     var xmax_units = "cm<sup>-1</sup>";
     if(Cunits == "microns") {
       xmin_units = "&#181;m";
       xmax_units = "&#181;m";
     }
     document.getElementById("xmin_units").innerHTML = xmin_units;
     document.getElementById("xmax_units").innerHTML = xmax_units;
   }
 }
}
//this function shows an x-min and x-max if the user selects that they want to specify the x range.
function show_range(){
  var range_option = document.getElementById("spectra_range").checked;
  var range_span = document.getElementById("range_span");
  var out = "";
  var xmin_units = "cm<sup>-1</sup>";
  var xmax_units = "cm<sup>-1</sup>"; 
  var Cunits = document.getElementById("spectra_units").value;
  if(Cunits == "microns") {
   xmin_units = "&#181;m";
   xmax_units = "&#181;m";
  }
  if(range_option == true) { //selected specify range, show input boxes.
   out = "<br><table class='opTable'><tr><td>&nbsp;X-min:</td><td><input type='text' name='spectra_xmin' id='spectra_xmin' size='9'>";
   out+= "&nbsp;<span id='xmin_units'>" + xmin_units + "</span></td></tr>";
   out+= "<tr><td>&nbsp;X-max:</td><td><input type='text' name='spectra_xmax' id='spectra_xmax' size='9'>";
   out+= "&nbsp;<span id='xmax_units'>" + xmax_units + "</span></td></tr>";
   out+= "<tr><td colspan=2><font size='-1'>Valid range is between 0 and 100000</font></td></tr>";
   out+="</table><br>";
  } 
  else {  //user does not want to specify range.
   out = "";
  }
  range_span.innerHTML = out;
}
//this function shows a y-min and y-max if the user selects that they want to specify the y range.
function show_Y_range(){
  var range_option = document.getElementById("y_range").checked;
  var range_span = document.getElementById("Yrange_span");
  var out = "";
  if(range_option == true) { //selected specify range, show input boxes.
   out = "<br><table class='opTable'><tr><td>&nbsp;Y-min:</td><td><input type='text' name='spectra_ymin' id='spectra_ymin' size='9'>";
   out+= "&nbsp;<span id='ymin_units'></span></td></tr>";
   out+= "<tr><td>&nbsp;Y-max:</td><td><input type='text' name='spectra_ymax' id='spectra_ymax' size='9'>";
   out+= "&nbsp;<span id='ymax_units'></span></td></tr>";
   out+="</table><br>";
  } 
  else {  //user does not want to specify range.
   out = "";
  }
  range_span.innerHTML = out;
}

//this function checks which plot type is selected (difference, product etc).
//if the doppler shift is selected it will refresh the list of options under the doppler.
function show_doppler() {
 var spec_act = document.getElementById("spectra_select").value;
 if((spec_act == "plot_spectra") || (spec_act == "product") || (spec_act == "difference") || (spec_act == "sum")) {
  var doppler_option = document.getElementById("doppler_shift").checked;
  var doppler_span = document.getElementById("doppler_span");
  var boxes_checked = document.forms['spectra_form'].elements['spectra_list'];
  var boxes_length = boxes_checked.length;
  var num_cked = 0;
  var cked_rec = new Array();
  var out = "";
  if(doppler_option == true) { //selected doppler shift, show input boxes.
    out+= "<table class='opTable'><tr><th>Name</th><th>Doppler Velocity</th></tr>";
    if(isNaN(parseInt(boxes_length))) { //only one check box.
     if(document.getElementById("spectra_list0").checked == true) {
      temp_val = document.getElementById("snm0").innerHTML;
      out+="<tr><td><span id='dopplerName0' name='dopplerName0'>" + temp_val + "</span></td><td><input type='text' name='doppler0' id='doppler0' value=0 size='6'>&nbsp;km/s";
      num_cked = 1;
     }
    } //end if isNan
   else {
    var repl_str = "";
    for(var i=0; i < boxes_length; i++) {
     if(boxes_checked[i].checked == true) {
      temp_val = document.getElementById("snmName" + i).value;
      out+="<tr><td><span id='dopplerName" + num_cked + "' name='dopplerName" + num_cked + "'>" + temp_val + "</span></td><td align='center'3><input type='text' name='doppler" + num_cked + "' id='doppler" + num_cked + "' value=0 size='6'>&nbsp;km/s";
      num_cked++
     }
    } //end for loop
   } //end else more than 1 checkbox
    out+="<tr><td colspan='2'><font size='-1'>Valid range is between -100 and 100</font></td></tr></table><br>";
  if(num_cked == 0) { //if no spectra selected show error message.
   out = "<font color='red' size='-1'>You must select at least one<br>spectra to apply a doppler shift.</font>";
  }
  }
   doppler_span.innerHTML = out;
 }
 if(spec_act == "difference") {
  show_difference_options();
 }
} //end function show_doppler

//this function will list the 2 selected spectra and allow the user to pick how the spectra are differenced.
function show_difference_options() {
 var order_option = document.getElementById("diff_option").checked;
 var out = "";
 var boxes_checked = document.forms['spectra_form'].elements['spectra_list'];
 var boxes_length = boxes_checked.length;
 var diff_span = document.getElementById("difference_span");
 var num_cked = 0;
 if(isNaN(parseInt(boxes_length))) { //only one check box, 2 needed to perform calculation.
  num_cked = 1;
 } //end if isNan
 else {
  var repl_str = "";
  var temp_val = "";
  var temp_val2 = "";
  for(var i=0; i < boxes_length; i++) {
   if(boxes_checked[i].checked == true) {
    temp_val = document.getElementById("snmName" + i).value;
    difference_array_name[num_cked] = temp_val;
    temp_val2 = document.getElementById("spectra_list" + i).value;
    temp_val2 = temp_val2.split("_"); 
    difference_array[num_cked] = temp_val2[0];
    num_cked++
   }
  } //end for loop
 } //end else more than 1 checkbox
 if(order_option == true) {
  if(parseInt(num_cked) != 2) {
   out = "<font color='red' size='-1'>please specify exactly two<br>spectra for difference operation.</font><br>";
   diff_span.innerHTML = out;
  }
  else {
   show_diff_list();
  }
 } //end if order_option = true (box is checked)
 else {
   diff_span.innerHTML = out;
 }
} //end function show_difference_options
//this function is used to swap the order of difference spectra when the user presses the "swap" button.
function swap_diff_list() {
 var diff_name0 = difference_array_name[0];
 var diff_val0 = difference_array[0];
 var diff_name1 = difference_array_name[1];
 var diff_val1 = difference_array[1];
 var diff_doppler0 = difference_doppler_val[0];
 var diff_doppler1 = difference_doppler_val[1];
 difference_array_name[0] = diff_name1;
 difference_array_name[1] = diff_name0;
 difference_array[0] = diff_val1;
 difference_array[1] = diff_val0;
 difference_doppler_val[0] = diff_doppler1;
 difference_doppler_val[1] = diff_doppler0;
 show_diff_list();
}

function show_diff_list() {
 var diff_span = document.getElementById("difference_span");
  var out = "<br><table class='opTable'><tr><th>Computes B - A</th></tr><tr><td>";
  out+="A)&nbsp;" + difference_array_name[0] + "<br>B)&nbsp;" + difference_array_name[1] + "<br><center>";
  out+="<input type='button' name='swap_diff' id='swap_diff' onClick='swap_diff_list();' value='Swap'></center></td></tr></table>";
  diff_span.innerHTML = out;
}

//this function checks the values in the doppler shift inputs.
function check_doppler(num_cked) {
 var doppler_array = new Array();
 var doppler_sel = document.getElementById("doppler_shift").checked;
 var err_msg = "none";
 if(doppler_sel == true) { //return values if correct, error message if not.
  var doppler_val = 0;
  doppler_array[0] = "doppler";
  var doppler_msg = "pass";
  var count = 3;
  for(var q=0; q < num_cked; q++) {
   doppler_val = document.getElementById("doppler" + q).value;
   doppler_array[count] = doppler_val;
   doppler_val = Math.abs(doppler_val);
   if((doppler_val) < 0 || (doppler_val > 100)) {
    doppler_msg = "fail";
    err_msg = "Doppler values must be between -100 and 100.";
   }
    count++;
  }
  doppler_array[1] = doppler_msg;
  doppler_array[2] = err_msg;
 } //end if doppler_val = true
 else {
  doppler_array[0] = "nodoppler";
 }
return doppler_array;
}

//check to make sure the ranges entered for xmin and xmax are valid.
function check_range(sp_xmin, sp_xmax) {
 var specify_range = document.getElementById("spectra_range").checked;
 var range_array = new Array();
 var range_result = "pass";
 var range_err = "";
 if(specify_range == true) {
 range_array[0] = "range";
 var xmin = document.getElementById("spectra_xmin");
 var xmin_val = xmin.value;
 var xmax = document.getElementById("spectra_xmax");
 var xmax_val = xmax.value;
 var range_err = "";
 var spectra_units = document.getElementById("spectra_units").value;
//  var min_overlap = 0.0001;
 var sel_units = "cm<sup>-1</sup>";
 if(parseFloat(xmin_val) > parseFloat(xmax_val)) {
  var tempMin = xmin_val;
  xmin_val = xmax_val;
  xmax_val = tempMin;
  xmin.value = xmin_val;
  xmax.value = xmax_val;
 }
 range_array[3] = xmin_val;
 range_array[4] = xmax_val;
 if(parseFloat(xmin_val) < 0) {
  range_result = "fail";
  range_err="X-min value must be greater than/equal to 0.<br>";
 }
 if((parseFloat(xmax_val) <= 0) || (parseFloat(xmax_val) > 100000)) {
  range_result = "fail";
  range_err="X-max values must be greater than 0 and less than/equal to 100,000 cm<sup>-1</sup>.<br>";
 }
 if((parseFloat(xmin_val) > parseFloat(sp_xmax)) || (parseFloat(xmax_val) < parseFloat(sp_xmin))) {
  range_result = "fail";
  range_err+= "User defined x-axis values must fall within the actual x-axis range of the spectra being plotted.<br>";
 }
 if(spectra_units == "microns") {
  sel_units = "&#181;m";
 }
 range_array[1] = range_result;
 range_array[2] = range_err;
}
 else {
 range_array[0] = "norange";
}
 return range_array
}

//this function will show the option for the user to enter an offset value.
function show_offset() {
 var os_out = "";
 var offset_val = document.getElementById("plot_offset").checked;
 if(offset_val == true) {
  os_out = "<table  class='opTable'><tr><td>Offset:</td><td><input type='text' name='offset_val' id='offset_val' value='1' size='5'></td></tr>";
  os_out+= "<tr><td colspan='2'><font size='-1'>Valid range is between 0 and 2</font></td></tr></table>";
 } //end offset_val = true
 document.getElementById("offset_span").innerHTML = os_out;
} //end function show_offset

//this function will check the offset for proper values and return
//the value or any error messages.
function check_offset() {
 var offset_array = new Array();
 var offset_sel = document.getElementById("plot_offset").checked;
 if(offset_sel == true) { //return values if correct, error message if not.
  var offset_val = document.getElementById("offset_val").value;
  var offset_msg = "pass";
  offset_array[0] = "offset";
  offset_array[1] = offset_val;
//   offset_val = Math.abs(offset_val);
  if((offset_val > 2) || (offset_val < 0) || isNaN(parseFloat(offset_val))) {
   offset_msg = "Offset values must be between 0 and 2.";
  }  //end if abs(offset_val) <=2
  offset_array[2] = offset_msg;
 } //end if offset_val = true
 else {
  offset_array[0] = "nooffset";
 }
return offset_array;
} //end check_offset

function generate_PsPdf_files(estr, ptype, fn, act) {
 var ps_pdf_params = "action=" + act + "&exstr=" + estr + "&fn=" + fn + "&ptype=" + ptype;
 document.getElementById("ps_pdf_file" + fn).innerHTML = "<center><img src='../images/loading.gif'>&nbsp;&nbsp;<b><font color='#004D8F'>Generating</font></b><br></center>";
 ps_pdf_http = getHTTPObject();
 ps_pdf_http.open("POST", "get_ps_pdf.php", true);
 ps_pdf_http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 ps_pdf_http.setRequestHeader("Content-length", ps_pdf_params.length);
 ps_pdf_http.setRequestHeader("Connection", "close");
 ps_pdf_http.onreadystatechange = show_ps_pdf;
 ps_pdf_http.send(ps_pdf_params);
} //end generate_pspdf_files

function show_ps_pdf() {
 if(ps_pdf_http.readyState == 4) {
  var ps_file = ps_pdf_http.responseText;
  var file_info = ps_file.split(':');
  var file_type = file_info[0];
  var file_name = file_info[1];
  var spn_info = file_name.split('.');
  var spn_num = spn_info[0];
  var pspdf_link = "plots/" + file_name;
  var outstr = "<a href='" + pspdf_link + "' target='_blank'>" + file_type + " Image</a><br>";
  document.getElementById("ps_pdf_file" + spn_num).innerHTML = outstr; }
} //end show_ps function


//this function is used to check the check box next to the spectra name when the user clicks on the spectra name.

function change_SPCclicked(click_action) {
 var boxes_checked = document.forms['spectra_form'].elements['spectra_list'];
 if(boxes_checked[click_action].checked == true) {
  boxes_checked[click_action].checked = false;
 }
 else {
  boxes_checked[click_action].checked = true;
 }
show_doppler();
} //end function change_SPCclicked


//this function will check the name entered on the spectra upload form to make sure 
//they arent entering an empty name.
function check_empty_name() {
 var sp_name = document.getElementById("spectra_name").value;
 sp_name = sp_name.replace(re, ""); 
 sp_name = trim(sp_name);
 document.getElementById("spectra_name").value = sp_name;
 if(parseInt(sp_name.length) < 1) {
 var err_str = "<font color='red'><strong>Error:</strong> Spectra name can not be blank or contain invalid characters, please enter a name.<br>";
 err_str+="please click <font color='blue'><a onmouseover=\"popUp(event,'valid_char')\" onmouseout=\"popUp(event,'valid_char')\"'>here</a></font> for a list of valid characters.";
   document.getElementById("error_div").innerHTML = err_str;
 }
 else {

  document.getElementById("error_div").innerHTML = "";
  document.spectra_upload.submit();
 }
}

function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}
function ltrim(stringToTrim) {
	return stringToTrim.replace(/^\s+/,"");
}
function rtrim(stringToTrim) {
	return stringToTrim.replace(/\s+$/,"");
}

//this function is used to sort the spectra by the selected parameter.
function order_spectra(order_by_val) {
 var order_info = document.getElementById("order_by");
 var curr_order = order_info.value;
 if(curr_order == order_by_val) {
  if(document.getElementById("asc_desc_order").value == "ASC"){
   document.getElementById("asc_desc_order").value = "DESC";
  }
  else {
   document.getElementById("asc_desc_order").value = "ASC"
  }
 }
 order_info.value = order_by_val;
 document.spectra_form.submit();
}
