function getCheckedIndex(radioObject) {
   for (var i=0; i<radioObject.length; i++) {
        if (radioObject[i].checked==true) {
            return i
        }
   }
   return -1
}

function getCheckedValue(radioObject) {
   for (var i=0; i<radioObject.length; i++) {
        if (radioObject[i].checked==true) {
            return radioObject[i].value
        }
   }
   return ""
}


var daysPerMonth = new Array(31, 28, 31, 30, 31, 30,
                             31, 31, 30, 31, 30 ,31)

function getJulianDay(theDate) {

  // get date components
  var year = theDate.getYear();
  var month = theDate.getMonth();  // 0<=month<12
  var day   = theDate.getDate();

  // leap year?
  if ((year%4)==0) daysPerMonth[1] = 29;
  else             daysPerMonth[1] = 28; 

  // some days from all previous months
  for (var i=0; i<month; i++) {
       day += daysPerMonth[i];
  }
  return day;

}

function getI3JulianDay(theDate) {
  var jday = getJulianDay(theDate);
  if (jday<10)       return "00"+jday;
  else if (jday<100) return "0"+jday;
  else               return jday;
}

function getDaysPerMonth(year, month) {
   if ((year%4)==0) daysPerMonth[1] = 29;
   else             daysPerMonth[1] = 28;
   if (month<1 || month>12) alert("WRONG MONTH NUMBER:"+month)
   else                     return daysPerMonth[month-1];
}

function checkTimeStamp(timeStamp) {
   if (timeStamp.indexOf(":")!=2 || timeStamp.lastIndexOf(":")!=5) 
       return false;
   var hh = timeStamp.substring(0,2);
   var mm = timeStamp.substring(3,5);
   var ss = timeStamp.substring(6);
   if ( !(hh>=0 && hh<24) || !(mm>=0 && mm<60) || !(ss>=0 && ss<60) ) {
       return false;  // bad date
   }
   return true;       // good date
}

function getSeconds(timeStamp) {
   if (checkTimeStamp(timeStamp)) {
       var hh = timeStamp.substring(0,2)-0.;
       var mm = timeStamp.substring(3,5)-0.;
       var ss = timeStamp.substring(6)-0.;
       return hh*3600 + mm*60 + ss;
   } else return -1
}                                                                                                         

function getTimeStamp(secs) {
  
   var seconds = parseInt(secs%86400)
   var hh = parseInt(seconds/3600); 
     if (hh<10) var hhStamp = "0"+hh
     else       var hhStamp = ""+hh 
   seconds = seconds-3600*hh
   var mm = parseInt(seconds/60)
     if (mm<10) var mmStamp = "0"+mm
     else       var mmStamp = ""+mm
   ss = parseInt(seconds - mm*60)
     if (ss<10) var ssStamp = "0"+ss
     else       var ssStamp = ""+ss

   return hhStamp + ":" + mmStamp + ":" + ssStamp

} // getTimeStamp

function getFullYear(theDate) {   // Y2K compliant
   var yyyy = theDate.getYear();
   if (yyyy<1000) yyyy += 1900;
   return yyyy;
}

function getYYMMDD(theDate) {

   var mm= ""+(theDate.getMonth()+1); if (theDate.getMonth()<9) mm = "0"+mm;
   var yyyy = getFullYear(theDate);
   var yy = (""+yyyy).substring(2);
   var dd  = theDate.getDate(); if (theDate.getDate()<10) dd = "0"+dd;
   return ""+yy+mm+dd;

}



function checkForm(theForm) {
    // latitude
    var lat = theForm.latitude.value
    if (lat<-90 || lat>90) {
        alert("ERROR: LATITUDE MUST BE BETWEEN -90 AND 90 DEGREES");
        return false;
    }
    // longitude
    var lon = theForm.longitude.value;
    if (lon<-180 || lon>180) {
        alert("ERROR: LONGITUDE MUST BE BETWEEN -90 AND 90 DEGREES");
        return false;  
    }
    // altitude (ground and measurement)
    var gAlt = theForm.gAltitude.value;
    if (gAlt<0) {
        alert("ERROR: GROUND ALTITUDE MUST BE >=0");
        return false;
    }
    var mAlt = theForm.mAltitude.value;
    if (mAlt<0 || mAlt>80) {
        alert("ERROR: MEASUREMENT ALTITUDE MUST BE >=0, <80 km");
        return false;
    }
    if (mAlt<gAlt) {
       alert("ERROR: ALTITUDE AT MEASURMENT MUST BE >= GROUND ALTITUDE");
       return false;
    }
    
    // time (convert hh:mm:ss --> ut)
    var ut = getSeconds(theForm.timeStamp.value);
    if (ut<0) {
        alert("ERROR: TIME MUST BE IN THE FORM hh:mm:ss");
        return false;
    } else {
        theForm.time.value = ut/3600.;
    }
    // date
    var idate=theForm.date.value;
    if (idate.length != 6) {
        alert("ERROR: DATE MUST BE IN THE FORM YYMMDD");
        return false;
    }
    for (var i=0; i<idate.length; i++) {
         var digit = idate.charAt(i);
         if (digit<"0" || digit>"9") {
             alert("ERROR: INVALID DATE");
             return false;
         }
    } 
    // SOLAR ZENITH ANGLE
    var zenith = theForm.zenith.value;
    if (zenith<0) {
        alert("ERROR: SOLAR ZENITH ANGLE MUST BE >= 0");
        return false;
    }
    // OZONE
    var ozone = theForm.ozone.value;
    if (ozone<0) {
        alert("ERROR: INVALID OZONE COLUMN");
        return false;
    }
    // ALBEDO
    var albedo = theForm.albedo.value;
    if (albedo<0. || albedo>1.0) {
        alert("ERROR: SURFACE ALBEDO MUST BE BETWEEN 0. AND 1.");
        return false;
    }
    // OUTPUT
    var oForm = parent.document.outputForm;
    var oMode; // first bit stores information from radio-button, second and third bits from checkbox
    if (oForm.outputRadio[0].checked) {
        oMode = 0;
        if (oForm.aCheckbox[0].checked) oMode += 2;
        if (oForm.aCheckbox[1].checked) oMode += 4;
    } else {
        oMode = 1;
        if (oForm.bCheckbox[0].checked) oMode += 2;
        if (oForm.bCheckbox[1].checked) oMode += 4;
    }
    if (oMode==0 || oMode==1) {
        alert("ERROR: NO OUTPUT SELECTED!");
        return false;
    }
    theForm.outputMode.value=oMode;

    // RT SCHEME
    var rtForm = parent.document.rtForm;
    var ns = getCheckedValue(rtForm.streamsRadio)
    setStreams(ns);

    // submit form
    theForm.submit();

  } // checkForm()

  function setStreams(nStreams) {
    parent.document.tuvForm.action = "http://www.acd.ucar.edu/cgi-bin/TUV/V4.1a-" + nStreams + "/tuv";
  }

