
activeDivs = { 'temp'  :0,
               'chill' :0,
               'heat'  :0,
               'atmoist'  :0,
               'wind'  :0,
               'press' :0,
               'length':0,
               'time'  :0 };
currentDiv = '';
numElem = 1;

/**********************************************************
 * loadPrevConversions()				  *
 * --> Loads previously opened conversions if             *
 * 	 the visitor has already used the conversion page *
 **********************************************************/
window.onload = function loadPrevConversions() {
   var cookieString = getCookie('convert');
   if(cookieString) {
      var cookieArray = cookieString.split(',');
      var delay = 0;
      for(var i=0; i<cookieArray.length; i++) {
         setTimeout("addDiv('"+cookieArray[i]+"')",delay);
         delay += 1000;
      }
   }
}

/****************************************************************
 * setConvCookie()						*
 * --> called to prepare and set cookie of opened		*
 *	 conversions.  Uses Sortable.serialize to discover	*
 *	 the order that the user placed conversions.		*
 ****************************************************************/
function setConvCookie()
{
   var formOrder = Sortable.serialize('convField', {tag:'div',name:'form'});
   var formOrderElem = formOrder.split('&');
   var cookieString = '';
   for(var j=0; j<formOrderElem.length; j++) {
      var divNum = formOrderElem[j].split('=');
      for(var i in activeDivs) {
         if(activeDivs[i] != 0) {
            if(activeDivs[i].substr(4,1) == divNum[1]) {
               if(cookieString == '')
                  cookieString = i;
               else
                  cookieString += ',' + i;
            } // if
         } // if
      } // for
   } // for

   deleteCookie('convert');
   // set cookie to expire in one year
   setCookie('convert', cookieString, 365);
}

/****************************************************************
 * setCookie()							*
 * --> set a javascript cookie					*
 * @param cookieName [string]: name of the cookie		*
 * @param value [string]: content of cookie			*
 * @param expiredays [int]: number of days before expiration	*
 ****************************************************************/
function setCookie(cookieName, value, expiredays)
{
   var ExpireDate = new Date();
   ExpireDate.setTime(ExpireDate.getTime() + (expiredays*24*3600*1000));

   document.cookie = cookieName + "=" + escape(value) + ((expiredays == -1) ? "" : "; expires=" +
         ExpireDate.toGMTString()) + ";path=/";
}

/********************************************************
 * deleteCookie()					*
 * --> delete a cookie					*
 * @param name [string]: name of cookie to delete	*
 ********************************************************/
function deleteCookie(name)
{
   setCookie(name,"",-1);
}

/****************************************************************
 * getCookie()							*
 * --> retrieve cookie information				*
 * @param cookieName [string]: name of cookie to retrieve	*
 * @return [string]: if cookie exists, its value is returned	*
 *			   otherwise null is returned		*
 ****************************************************************/
function getCookie(cookieName)
{
   if(document.cookie.length > 0)
   {
      begin = document.cookie.indexOf(cookieName+"=");

      if(begin != -1)
      {
         begin += cookieName.length+1;
         end = document.cookie.indexOf(";", begin);
         if( end == -1 ) end = document.cookie.length;
         return unescape(document.cookie.substring(begin, end));
      }
   }
   return null;
}

/********************************************************************************
 * showEquation()								*
 * --> show the equation(s) for a conversion					*
 * 	 Equations are retrieved via an AJAX call				*
 * @param eqDiv [string]: keyword for conversion (e.g. temp, press, etc.)	*
 ********************************************************************************/
function showEquation(eqDiv)
{
   var changeDiv = activeDivs[eqDiv] + "_eq";

   var url = 'includes/conversions.inc.php';
   var pars = 'id=' + eqDiv + 'Eq';

   new Ajax.Updater(
      changeDiv,
      url,
      {
         method: 'post',
         parameters: pars
      });
}

/********************************************************************************
 * hideEquation()								*
 * --> hide the equation(s) for a conversion					*
 * @param eqDiv [string]: keyword for conversion (e.g. temp, press, etc.)	*
 * @param plural [bool]: boolean value indicating whether the text should be	*
 *				 plural ("Show Equation" vs "Show Equations")	*
 ********************************************************************************/
function hideEquation(eqDiv, plural)
{
   var changeDiv = activeDivs[eqDiv] + "_eq";
   if(plural) {
      var insertString = "&lt;&lt; Show Equations &gt;&gt;";
   } else {
      var insertString = "&lt;&lt; Show Equation &gt;&gt;";
   }

   $(changeDiv).innerHTML = "<a href=\"javascript:showEquation('" + eqDiv + "')\" class=\"bluebold\">" + insertString + "</a>";
}

/********************************************************************************
 * addDiv()									*
 * --> add conversion to visible list.						*
 *	 dynamically creates a new div within div "convField";			*
 *	 an AJAX call is then issued based on ident variable			*
 *	 and the new div is filled with applicable HTML.			*
 *	 The AJAX call also adds the Scriptaculous Slide effect			*
 *	 and updates the cookie.						*
 * @param ident [string]: keyword for conversion (e.g. temp, press, etc.) 	*
 ********************************************************************************/
function addDiv(ident)
{
   // nothing to do if the element is already active
   if(activeDivs[ident] == 0)
   {
      // create new div
      var ni = $('convField');

      var num = numElem++;
      var divIdName = "div_"+num;
      var newdiv = document.createElement('div');
      newdiv.setAttribute("id",divIdName);
      newdiv.style.display = "none";
      newdiv.style.cursor = "move";
      ni.appendChild(newdiv);

      activeDivs[ident] = divIdName;	// make active
      currentDiv = ident;

      var url = 'includes/conversions.inc.php';
      var pars = 'id=' + ident + '&eqdiv=' + divIdName + '_eq';

      new Ajax.Updater(
         divIdName,
         url,
         {
            method: 'post',
            parameters: pars,
            onComplete: showResponse
         });
   } // if
}

/************************************************************************
 * showResponse()							*
 * --> finish adding new conversion.					*
 *	 This function is called when the AJAX call in the addDiv	*
 *	 function returns.  The results of the AJAX call are placed in	*
 *	 in the newly created div element, after which a Slide effect is*
 *	 added and the cookie is updated.				*
 ************************************************************************/
function showResponse()
{
   var active = activeDivs[currentDiv];
   //$(active).innerHTML = originalRequest.responseText;
   $(active).innerHTML += "<br style=\"clear:both\" />";
   new Effect.SlideDown(active);

   // create sortable div list which will
   // update cookie when elements are moved
   Sortable.create('convField',{tag:'div',
         onUpdate:setConvCookie });

   // update cookie when elements are added
   setConvCookie();
}

/************************************************************************
 * closeDiv()								*
 * --> remove a conversion from view.					*
 *	 The given conversion is removed from view and			*
 *	 subsequently deleted from the "convField" parent.	        *
 *	 The cookie is also updated to reflect changes.			*
 * @param id [string]: keyword for conversion (e.g. temp, press, etc.)  *
 ************************************************************************/
function closeDiv(id)
{
   var active = activeDivs[id];

   new Effect.SlideUp(active);

   // remove div
   // a timeout of 1 second is used to give the
   // BlindUp effect time to finish
   setTimeout(function(){ 	
      var d = $('convField');
      var olddiv = $(active);
      d.removeChild(olddiv); }, 1000);

   activeDivs[id] = 0;	// inactivate

   // update cookie when elements are added
   setConvCookie();
}

/********************************************************
 * calcMoist()                                          *
 * --> evaluate Atomospheric Moisture conversion form   *
 * @param moistForm [HTMLelement]: form to evaluate     *
 * @return clculated value                              *
 ********************************************************/
//flag for dew and rh
var flag=0;

function calcMoist(moistForm) {

   var a=moistForm.startairval.value;
   var b=moistForm.startdewval.value;
   var c=moistForm.startrhval.value;

   if(a !=''){
      calculate();
   } 
   if (a =='' && b != '' && flag == 1) {
      var dewpnt=eval(moistForm.startdewval.value);

      var dpsvp=TtoSVP(dewpnt);
      amvp=dpsvp;

      moistForm.paresult.value=Math.round(amvp);
      moistForm.kgkgresult.value=VPtoKGKG(amvp);
      
      moistForm.startrhval.value="NaN";
      moistForm.kgm3result.value="NaN";
      moistForm.svpresult.value="NaN";
   } else if (a =='' && b=='' && flag ==1) {
      moistForm.startrhval.value="NaN";
      moistForm.kgm3result.value="NaN";
      moistForm.kgkgresult.value="NaN";
      moistForm.paresult.value="NaN";
      moistForm.svpresult.value="NaN";
   }

   if (a =='' && flag == 2) {
      moistForm.startdewval.value="NaN";
      moistForm.kgm3result.value="NaN";
      moistForm.kgkgresult.value="NaN";
      moistForm.paresult.value="NaN";
      moistForm.svpresult.value="NaN";
   }

   function calculate() {
      var drytemp=0;
      var amvp=0;
      var relhem=0;
      drytemp=eval(moistForm.startairval.value);

      var svpdry=TtoSVP(drytemp);

      moistForm.svpresult.value = Math.round(svpdry);

      if (b !='' && flag == 1) {
         var dewpnt=eval(moistForm.startdewval.value);
         var dpsvp=TtoSVP(dewpnt);
         
         var airsvp=TtoSVP(drytemp);
         var rhfromdp=100*dpsvp/airsvp;
         amvp=dpsvp;
      
         moistForm.startrhval.value=Math.round(rhfromdp);
         moistForm.paresult.value=Math.round(amvp);
         moistForm.kgm3result.value=VPtoKGM3(amvp,drytemp);
         moistForm.kgkgresult.value=VPtoKGKG(amvp);
      }
      if (b =='' && flag == 1) {
         var dewpnt=eval(moistForm.startdewval.value);
         var dpsvp=TtoSVP(dewpnt);
         
         var airsvp=TtoSVP(drytemp);
         var rhfromdp=100*dpsvp/airsvp;
         amvp=dpsvp;
         
         moistForm.startrhval.value=Math.round(rhfromdp);
         moistForm.paresult.value=Math.round(amvp);
         moistForm.kgm3result.value=VPtoKGM3(amvp,drytemp);
         moistForm.kgkgresult.value=VPtoKGKG(amvp);
      }
      
      if (c !='' && flag == 2) {
         var rh=eval(moistForm.startrhval.value);
         var pa=TtoSVP(drytemp)*rh/100;
         var dp=SVPtoT(pa);
         amvp=pa;
         
         moistForm.startdewval.value=dp;
         moistForm.paresult.value=Math.round(amvp);
         moistForm.kgm3result.value=VPtoKGM3(amvp,drytemp);
         moistForm.kgkgresult.value=VPtoKGKG(amvp);
      }
      if (c =='' && flag == 2) {
         var rh=eval(moistForm.startrhval.value);
         var pa=TtoSVP(drytemp)*rh/100;
         var dp=SVPtoT(pa);
         amvp=pa;
         moistForm.startdewval.value=dp;

         moistForm.paresult.value=Math.round(amvp);
         moistForm.kgm3result.value=VPtoKGM3(amvp,drytemp);
         moistForm.kgkgresult.value=VPtoKGKG(amvp);
      }
   }
   
   function TtoSVP(t) {
      var svp=610.78*Math.exp(t/(t+238.3)*17.2694);
      return svp;
   }
   
   function SVPtoT(vp) {
      var w=Math.log(vp/610.78);
      var dp=w*238.3/(17.294-w);
      return dp;
   }
   
   function VPtoKGM3(vp,t) {
      var kgm=0.002167*vp/(t+273.16);
      return kgm;
   }
   
   function WBtoRH(t,wb) {
      var rh=(TtoSVP(wb)-(t-wb)*66.7)/TtoSVP(t)*100;
      return rh;
   }
   
   function VPtoKGKG(vp) {
      var kgprkg=0.622*vp/(101300-vp);
      return kgprkg
   }
   
}

/********************************************************
 * calcTemp()						*
 * --> evaluate temperature conversion form		*
 * @param tempForm [HTMLelement]: form to evaluate	*
 * @return calculated value				*
 ********************************************************/
function calcTemp(tempForm) {
   var startTemp = tempForm.starttempval.value;
   if(!startTemp)
   {
      tempForm.tempresult.value = '';
      return;
   }

   if(tempForm.starttemp[0].checked && tempForm.endtemp[0].checked){
      //celsius to celsius
      tempForm.tempresult.value = startTemp + '°C';
   } else if(tempForm.starttemp[0].checked && tempForm.endtemp[1].checked){
      //celsius to fahrenheit
      var result = (startTemp * 9/5) + 32;
      if(result.toFixed)
         result = result.toFixed(1);
      tempForm.tempresult.value = result + '°F';
   } else if(tempForm.starttemp[0].checked && tempForm.endtemp[2].checked){
      //celsius to Kelvin
      var result = +startTemp + 273;
      if(result.toFixed)
         result = result.toFixed(1);
      tempForm.tempresult.value = result + 'K';
   } else if(tempForm.starttemp[1].checked && tempForm.endtemp[0].checked){
      //fahrenheit to celsius
      var result = (startTemp - 32) * 5/9;
      if(result.toFixed)
         result = result.toFixed(1);
      tempForm.tempresult.value = result + '°C';
   } else if(tempForm.starttemp[1].checked && tempForm.endtemp[1].checked){
      //fahrenheit to fahrenheit
      tempForm.tempresult.value = startTemp + '°F';
   } else if(tempForm.starttemp[1].checked && tempForm.endtemp[2].checked){
      //fahrenheit to Kelvin
      var result = ((startTemp - 32) * 5/9) + 273;
      if(result.toFixed)
         result = result.toFixed(1);
      tempForm.tempresult.value = result + 'K';
   } else if(tempForm.starttemp[2].checked && tempForm.endtemp[0].checked){
      //Kelvin to celsius
      var result = startTemp - 273;
      tempForm.tempresult.value = result + '°C';
   } else if(tempForm.starttemp[2].checked && tempForm.endtemp[1].checked){
      //Kelvin to fahrenheit
      var result = ((startTemp - 273) * 9/5) + 32;
      if(result.toFixed)
         result = result.toFixed(1);
      tempForm.tempresult.value = result + '°F';
   } else if(tempForm.starttemp[2].checked && tempForm.endtemp[2].checked){
      //Kelvin to Kelvin
      tempForm.tempresult.value = startTemp + 'K';
   }
}

/********************************************************
 * calcSpd()						*
 * --> evaluate Wind Speed conversion form		*
 * @param spdForm [HTMLelement]: form to evaluate	*
 * @return calculated value				*
 ********************************************************/
function calcSpd(spdForm) {
   var startSpd = spdForm.startspdval.value;
   if(!startSpd)
   {
      spdForm.spdresult.value = '';
      return;
   }

   if(spdForm.startspd[0].checked && spdForm.endspd[0].checked){
      //knots to knots
      spdForm.spdresult.value = startSpd + ' Kts';
   } else if(spdForm.startspd[0].checked && spdForm.endspd[1].checked){
      //knots to mph
      var result = startSpd * 1.15078;
      if(result.toFixed)
         result = result.toFixed(2);
      spdForm.spdresult.value = result + ' mph';
   } else if(spdForm.startspd[0].checked && spdForm.endspd[2].checked){
      //knots to kph
      var result = startSpd * 1.852;
      if(result.toFixed)
         result = result.toFixed(2);
      spdForm.spdresult.value = result + ' kph';
   } else if(spdForm.startspd[1].checked && spdForm.endspd[0].checked){
      //mph to knots
      var result = startSpd / 1.15078;
      if(result.toFixed)
         result = result.toFixed(2);
      spdForm.spdresult.value = result + ' Kts';
   } else if(spdForm.startspd[1].checked && spdForm.endspd[1].checked){
      //mph to mph
      spdForm.spdresult.value = startSpd + ' mph';
   } else if(spdForm.startspd[1].checked && spdForm.endspd[2].checked){
      //mph to kph
      var result = startSpd * 1.609;
      if(result.toFixed)
         result = result.toFixed(2);
      spdForm.spdresult.value = result + ' kph';
   } else if(spdForm.startspd[2].checked && spdForm.endspd[0].checked){
      //kph to knots
      var result = startSpd / 1.852;
      if(result.toFixed)
         result = result.toFixed(2);
      spdForm.spdresult.value = result + ' Kts';
   } else if(spdForm.startspd[2].checked && spdForm.endspd[1].checked){
      //kph to mph
      var result = startSpd / 1.609;
      if(result.toFixed)
         result = result.toFixed(2);
      spdForm.spdresult.value = result + ' mph';
   } else if(spdForm.startspd[2].checked && spdForm.endspd[2].checked){
      //kph to kph
      spdForm.spdresult.value = startSpd + ' kph';
   }
}

/********************************************************
 * calcChill()						*
 * --> evaluate wind chill conversion form		*
 * @param chillForm [HTMLelement]: form to evaluate	*
 * @return calculated value				*
 ********************************************************/
function calcChill(chillForm) {
   var wind = chillForm.spdchillval.value;
   var temp = chillForm.tempchillval.value;
   if(!wind || !temp)
   {
      chillForm.chillresult.value = '';
      return;
   }

   //give alert if temp is out of range
   if(chillForm.tempchill[1].checked && temp > 7)
   {
      alert("The temperature entered is too warm for this calculation. Please enter a value less than 7°C.");
      return;
   } 
   else if(temp > 45)
   {
      alert("The temperature entered is too warm for this calculation.  Please enter a value less than 45°F");
      return;
   }

   //if there is no wind, just return the temperature
   if(wind == 0)
   {
      if(chillForm.tempchill[1].checked)
         temp += ' °C';
      else
         temp += ' °F';
      chillForm.chillresult.value = temp;
      return;
   }

   //convert from celsius to fahrenheit if necessary
   if(chillForm.tempchill[1].checked)
      temp = (temp * 9/5) + 32;
   //convert from knots to mph if necessary
   if(chillForm.spdchill[0].checked)
      wind = wind * 1.15078;
   //convert from kph to mph if necessary
   if(chillForm.spdchill[2].checked)
      wind = wind / 1.609;

   var chill = 35.74 + 0.6215*temp - 35.75*Math.pow(wind,0.16) + 0.4275*temp*Math.pow(wind,0.16);	

   //convert back to celsius if necessary
   if(chillForm.tempchill[1].checked)
   {
      chill = (chill - 32) * 5/9;
      if(chill.toFixed)
         chill = chill.toFixed(1);
      chill = chill + ' °C';
   } else {
      if(chill.toFixed)
         chill = chill.toFixed(1);
      chill = chill + ' °F'; 
   }

   //display result
   chillForm.chillresult.value = chill;
}

/********************************************************
 * calcHeat()						*
 * --> evaluate heat index conversion form		*
 * @param heatForm [HTMLelement]: form to evaluate	*
 * @return calculated value				*
 ********************************************************/
function calcHeat(heatForm)
{
   if(!heatForm.tempheatval.value || !heatForm.humidityval.value)
   {
      heatForm.heatresult.value = '';
      return;
   }

   if(heatForm.tempheat[0].checked)
   {
      temp_f = Number(heatForm.tempheatval.value);
      temp_c = .5556 * (temp_f - 32);
      if(temp_f < 65) {
         alert("The temperature entered is too low.  Please enter a temperature greater than 65°F");
         return;
      }
   } else {
      temp_c = Number(heatForm.tempheatval.value);
      temp_f = (temp_c * 9/5) + 32;
      if(temp_c < 19) {
         alert("The temperature entered is too low.  Please enter a temperature greater than 19°C");
         return;
      }
   }

   if(heatForm.humidity[1].checked)
   {
      //convert dewpoint temp to celsius if necessary
      hd = .5556  * (heatForm.humidityval.value - 32);

      //find relative humidity from dewpoint
      hval = 100.0*(Math.pow((112-(0.1*temp_c)+ hd)/(112+(0.9*temp_c)),8));
   } 
   else if(heatForm.humidity[2].checked)
   {
      hd = Number(heatForm.humidityval.value);

      //find relative humidity from dewpoint
      hval = 100.0*(Math.pow((112-(0.1*temp_c)+ hd)/(112+(0.9*temp_c)),8));
   } else
      hval = Number(heatForm.humidityval.value);

   //calculate heat index
   var hi = -42.379 + 2.04901523*temp_f + 10.14333127*hval - 0.22475541*temp_f*hval;
   hi +=  - 0.00683783*Math.pow(temp_f,2) - 0.05481717*Math.pow(hval,2) + 1.22874e-3*Math.pow(temp_f,2)*hval;
   hi +=  8.5282e-4*temp_f*Math.pow(hval,2) - 1.99e-6*Math.pow(temp_f*hval, 2);

   if(hi.toFixed)
      hi = hi.toFixed(1);

   if(heatForm.tempheat[0].checked)
      heatForm.heatresult.value = hi + '°F';
   else {
      hi = 5/9 * (hi - 32);
      if(hi.toFixed)
         hi = hi.toFixed(1);
      heatForm.heatresult.value = hi + '°C';
   }
}

/********************************************************
 * calcPress()						*
 * --> evaluate pressure conversion form		*
 * @param pressForm [HTMLelement]: form to evaluate	*
 * @return calculated value				*
 ********************************************************/
function calcPress(pressForm) {
   var startPress = pressForm.startpressval.value;
   if(!startPress)
   {
      pressForm.pressresult.value = '';
      return;
   }

   if(pressForm.startpress[0].checked && pressForm.endpress[0].checked){
      //inches to inches
      pressForm.pressresult.value = startPress + ' "';
   } else if(pressForm.startpress[0].checked && pressForm.endpress[1].checked){
      //inches to mb
      var result = startPress * 33.864;
      if(result.toFixed)
         result = result.toFixed(3);
      pressForm.pressresult.value = result + ' mb';
   } else if(pressForm.startpress[0].checked && pressForm.endpress[2].checked){
      //inches to Pascals
      var result = startPress * 3386.38;
      if(result.toFixed)
         result = result.toFixed(3);
      pressForm.pressresult.value = result + ' Pa';
   } else if(pressForm.startpress[0].checked && pressForm.endpress[3].checked){
      //inches to PSI
      var result = startPress / 2.036;
      if(result.toFixed)
         result = result.toFixed(3);
      pressForm.pressresult.value = result + ' PSI';
   } else if(pressForm.startpress[1].checked && pressForm.endpress[0].checked){
      //mb to inches
      var result = startPress / 33.864;
      if(result.toFixed)
         result = result.toFixed(3);
      pressForm.pressresult.value = result + ' "';
   } else if(pressForm.startpress[1].checked && pressForm.endpress[1].checked){
      //mb to mb
      pressForm.pressresult.value = startPress + ' mb';
   } else if(pressForm.startpress[1].checked && pressForm.endpress[2].checked){
      //mb to Pascals
      var result = startPress * 100;
      if(result.toFixed)
         result = result.toFixed(3);
      pressForm.pressresult.value = result + ' Pa';
   } else if(pressForm.startpress[1].checked && pressForm.endpress[3].checked){
      //mb to PSI
      var result = startPress / 68.9476;
      if(result.toFixed)
         result = result.toFixed(3);
      pressForm.pressresult.value = result + ' PSI';
   } else if(pressForm.startpress[2].checked && pressForm.endpress[0].checked){
      //Pascals to inches
      var result = startPress / 3386.38;
      if(result.toFixed)
         result = result.toFixed(3);
      pressForm.pressresult.value = result + ' "';
   } else if(pressForm.startpress[2].checked && pressForm.endpress[1].checked){
      //Pascals to mb
      var result = startPress / 100;
      if(result.toFixed)
         result = result.toFixed(3);
      pressForm.pressresult.value = result + ' mb';
   } else if(pressForm.startpress[2].checked && pressForm.endpress[2].checked){
      //Pascals to Pascals
      pressForm.pressresult.value = startPress + ' Pa';
   } else if(pressForm.startpress[2].checked && pressForm.endpress[3].checked){
      //Pascals to PSI
      var result = startPress / 6894.76;
      if(result.toFixed)
         result = result.toFixed(3);
      pressForm.pressresult.value = result + ' PSI';
   } else if(pressForm.startpress[3].checked && pressForm.endpress[0].checked){
      //PSI to inches
      var result = startPress * 2.036;
      if(result.toFixed)
         result = result.toFixed(3);
      pressForm.pressresult.value = result + ' "';
   } else if(pressForm.startpress[3].checked && pressForm.endpress[1].checked){
      //PSI to mb
      var result = startPress * 68.9476;
      if(result.toFixed)
         result = result.toFixed(3);
      pressForm.pressresult.value = result + ' mb';
   } else if(pressForm.startpress[3].checked && pressForm.endpress[2].checked){
      //PSI to Pascals
      var result = startPress * 6894.76;
      if(result.toFixed)
         result = result.toFixed(3);
      pressForm.pressresult.value = result + ' Pa';
   } else if(pressForm.startpress[3].checked && pressForm.endpress[3].checked){
      //PSI to PSI
      pressForm.pressresult.value = startPress + ' PSI';
   }
}

/********************************************************
 * calcLength()						*
 * --> evaluate length conversion form			*
 * @param lengthForm [HTMLelement]: form to evaluate	*
 * @return calculated value				*
 ********************************************************/
function calcLength(lengthForm) {
   var startLength = lengthForm.startlengthval.value;
   if(!startLength)
   {
      lengthForm.lengthresult.value = '';
      return;
   }

   if(lengthForm.startlength[0].checked && lengthForm.endlength[0].checked){
      //inches to inches
      lengthForm.lengthresult.value = startLength + ' in';
   } else if(lengthForm.startlength[0].checked && lengthForm.endlength[1].checked){
      //inches to mm
      var result = startLength * 25.4;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' mm';
   } else if(lengthForm.startlength[0].checked && lengthForm.endlength[2].checked){
      //inches to cm
      var result = startLength * 2.54;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' cm';
   } else if(lengthForm.startlength[0].checked && lengthForm.endlength[3].checked){
      //inches to metres
      var result = startLength / 39.37;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' m';
   } else if(lengthForm.startlength[0].checked && lengthForm.endlength[4].checked){
      //inches to feet
      var result = startLength / 12;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' ft';
   } else if(lengthForm.startlength[0].checked && lengthForm.endlength[5].checked){
      //inches to yards
      var result = startLength / 36;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' yd';
   } else if(lengthForm.startlength[1].checked && lengthForm.endlength[0].checked){
      //mm to inches
      var result = startLength / 25.4;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' in';
   } else if(lengthForm.startlength[1].checked && lengthForm.endlength[1].checked){
      //mm to mm
      lengthForm.lengthresult.value = startLength + ' mm';
   } else if(lengthForm.startlength[1].checked && lengthForm.endlength[2].checked){
      //mm to cm 
      var result = startLength / 10;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' cm';
   } else if(lengthForm.startlength[1].checked && lengthForm.endlength[3].checked){
      //mm to metres
      var result = startLength / 1000;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' m';
   } else if(lengthForm.startlength[1].checked && lengthForm.endlength[4].checked){
      //mm to feet
      var result = startLength / 304.8;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' ft';
   } else if(lengthForm.startlength[1].checked && lengthForm.endlength[5].checked){
      //mm to yards
      var result = startLength / 914.4;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' yd';
   } else if(lengthForm.startlength[2].checked && lengthForm.endlength[0].checked){
      //cm to inches
      var result = startLength / 2.54;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' in';
   } else if(lengthForm.startlength[2].checked && lengthForm.endlength[1].checked){
      //cm to mm
      var result = startLength * 10;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' mm';
   } else if(lengthForm.startlength[2].checked && lengthForm.endlength[2].checked){
      //cm to cm
      lengthForm.lengthresult.value = startLength + ' cm';
   } else if(lengthForm.startlength[2].checked && lengthForm.endlength[3].checked){
      //cm to metres
      var result = startLength / 100;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' m';
   } else if(lengthForm.startlength[2].checked && lengthForm.endlength[4].checked){
      //cm to feet
      var result = startLength / 30.48;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' ft';
   } else if(lengthForm.startlength[2].checked && lengthForm.endlength[5].checked){
      //cm to yards
      var result = startLength / 91.44;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' yd';
   } else if(lengthForm.startlength[3].checked && lengthForm.endlength[0].checked){
      //metres to inches
      var result = startLength * 39.37;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' in';
   } else if(lengthForm.startlength[3].checked && lengthForm.endlength[1].checked){
      //metres to mm
      var result = startLength * 1000;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' mm';
   } else if(lengthForm.startlength[3].checked && lengthForm.endlength[2].checked){
      //metres to cm
      var result = startLength * 100;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' cm';
   } else if(lengthForm.startlength[3].checked && lengthForm.endlength[3].checked){
      //metres to metres
      lengthForm.lengthresult.value = startLength + ' m';
   } else if(lengthForm.startlength[3].checked && lengthForm.endlength[4].checked){
      //metres to ft
      var result = startLength * 3.2808;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' ft';
   } else if(lengthForm.startlength[3].checked && lengthForm.endlength[5].checked){
      //metres to yards
      var result = startLength * 1.0936;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' yd';
   } else if(lengthForm.startlength[4].checked && lengthForm.endlength[0].checked){
      //ft to inches
      var result = startLength * 12;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' in';
   } else if(lengthForm.startlength[4].checked && lengthForm.endlength[1].checked){
      //ft to mm
      var result = startLength * 304.8;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' mm';
   } else if(lengthForm.startlength[4].checked && lengthForm.endlength[2].checked){
      //ft to cm
      var result = startLength * 30.48;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' cm';
   } else if(lengthForm.startlength[4].checked && lengthForm.endlength[3].checked){
      //ft to metres
      var result = startLength / 3.2808;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' m';
   } else if(lengthForm.startlength[4].checked && lengthForm.endlength[4].checked){
      //ft to ft
      lengthForm.lengthresult.value = startLength + ' ft';
   } else if(lengthForm.startlength[4].checked && lengthForm.endlength[5].checked){
      //ft to yards
      var result = startLength / 3;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' yd';
   } else if(lengthForm.startlength[5].checked && lengthForm.endlength[0].checked){
      //yards to inches
      var result = startLength * 36;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' in';
   } else if(lengthForm.startlength[5].checked && lengthForm.endlength[1].checked){
      //yards to mm
      var result = startLength * 914.4;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' cm';
   } else if(lengthForm.startlength[5].checked && lengthForm.endlength[2].checked){
      //yards to cm
      var result = startLength * 91.44;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' cm';
   } else if(lengthForm.startlength[5].checked && lengthForm.endlength[3].checked){
      //yards to metres
      var result = startLength / 1.0936;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' m';
   } else if(lengthForm.startlength[5].checked && lengthForm.endlength[4].checked){
      //yards to ft
      var result = startLength * 3;
      if(result.toFixed)
         result = result.toFixed(3);
      lengthForm.lengthresult.value = result + ' ft';
   } else if(lengthForm.startlength[5].checked && lengthForm.endlength[5].checked){
      //yards to yards
      lengthForm.lengthresult.value = startLength + ' yd';
   }
}

/********************************************************
 * calculateGMT()					*
 * --> calculates the local time from the GMT offset	*
 * @return calculated value				*
 ********************************************************/
function calculateGMT()
{
   if(!document.GMTlist.datestring.value) {
      document.GMTlist.GMTresult.value = '';
      return;
   }


   var datestring = document.GMTlist.datestring.value;	
   var datearrays = datestring.split(" ");
   var date = datearrays[0].split("-");
   var time = datearrays[1].split(":");

   // if no seconds were specified, infer 00
   if(time.length == 2) time.push("00");

   var selectedIndex = document.GMTlist.TimeZones.selectedIndex;
   var offset = document.GMTlist.TimeZones.options[selectedIndex].value;

   // convert to local time
   time[0] = Number(time[0]) + Number(offset);

   var myDate = new Date();
   myDate.setUTCFullYear(date[0],date[1]-1,date[2]);
   myDate.setUTCHours(time[0],time[1],time[2]);

   if(isDST(myDate) && (offset >= -10 && offset <= -5))
      myDate.setUTCHours(myDate.getUTCHours()+1);

   year = myDate.getUTCFullYear();
   month = myDate.getUTCMonth() + 1;
   if(month < 10)
      month = '0' + month;
   day = myDate.getUTCDate();
   if(day < 10)
      day = '0' + day;
   hour = myDate.getUTCHours();
   if(hour < 10)
      hour = '0' + hour;
   minute = myDate.getUTCMinutes();
   if(minute < 10)
      minute = '0' + minute;
   second = myDate.getUTCSeconds();
   if(second < 10)
      second = '0' + second;

   document.GMTlist.GMTresult.value = year+'-'+month+'-'+day+' '+hour+':'+minute+':'+second;
}

/********************************************************
 * isDST()						*
 * --> determine if given date is in Daylight		*
 Saving Time. The Energy Policy Act of 2005 is	        *
 also supported, which extends DST.  New times	        *
 are from the second Sunday in March until the	        *
 first Sunday in November, starting in 2007.	        *
 * @param dDate [Date]: date to evaluate		*
 * @return true if in DST, false otherwise		*
 ********************************************************/
function isDST (dDate)
{
   /* Energy Policy Act of 2005 (effective in 2007) */
   bEnergyPolicyAct2005 = (dDate.getUTCFullYear() >= 2007);

   if (bEnergyPolicyAct2005) {
      /* FROM 2007 */
      /* DST START (Second Sunday in March at 2am) */
      var dMarch2ndSunday = new Date();
      dMarch2ndSunday.setUTCFullYear(dDate.getUTCFullYear(),2,1);
      dMarch2ndSunday.setUTCHours(0,0,0);
      dMarch2ndSunday.setUTCDate(((7-dMarch2ndSunday.getUTCDay())%7)+8);

      var dDstStart = new Date();
      dDstStart.setUTCFullYear(dMarch2ndSunday.getUTCFullYear(),
            dMarch2ndSunday.getUTCMonth(),
            dMarch2ndSunday.getUTCDate());
      dDstStart.setUTCHours(2,0,0);

      /* DST END (First Sunday in November at 2am) */
      var dNovember1stSunday = new Date();
      dNovember1stSunday.setUTCFullYear(dDate.getUTCFullYear(),10,1);
      dNovember1stSunday.setUTCHours(0,0,0);
      dNovember1stSunday.setUTCDate(((7-dNovember1stSunday.getUTCDay())%7)+1);

      var dDstEnd = new Date();
      dDstEnd.setUTCFullYear(dNovember1stSunday.getUTCFullYear(),
            dNovember1stSunday.getUTCMonth(),
            dNovember1stSunday.getUTCDate());
      dDstEnd.setUTCHours(2,0,0);
   } else {
      /* BEFORE 2007 */
      /* DST START (First Sunday in April at 2am) */
      var dApril1stSunday = new Date();
      dApril1stSunday.setUTCFullYear(dDate.getUTCFullYear(),3,1);
      dApril1stSunday.setUTCHours(0,0,0);
      dApril1stSunday.setUTCDate(((7-dApril1stSunday.getUTCDay())%7)+1);

      var dDstStart = new Date();
      dDstStart.setUTCFullYear(dApril1stSunday.getUTCFullYear(),
            dApril1stSunday.getUTCMonth(),
            dApril1stSunday.getUTCDate());
      dDstStart.setUTCHours(2,0,0);

      /* DST END (Last Sunday in October at 2am) */
      var dOctoberLastSunday = new Date();
      dOctoberLastSunday.setUTCFullYear(dDate.getUTCFullYear(), 10, 0);
      dOctoberLastSunday.setUTCHours(0,0,0);
      dOctoberLastSunday.setUTCDate(31-dOctoberLastSunday.getUTCDay());

      var dDstEnd = new Date();
      dDstEnd.setUTCFullYear(dOctoberLastSunday.getUTCFullYear(),
            dOctoberLastSunday.getUTCMonth(),
            dOctoberLastSunday.getUTCDate());
      dDstEnd.setUTCHours(2,0,0);
   }

   /* DST INDEX */
   return (  dDate >= dDstStart
         && dDate < dDstEnd);
}
/************************************************
 * monthdays()				        *
 * --> find number of days in month		*
 * @param month [int]: numeric month	        *
 * @param year [int]: year			*
 * @return [int]: nuber of days in month	*
 ************************************************/
function monthdays(month, year)
{
   month = month * 1;
   year = year * 1;

   if(month == 0)
      month = 12;

   var months = new Array();
   months[1] = 31;
   months[3] = 31;
   months[4] = 30;
   months[5] = 31;
   months[6] = 30;
   months[7] = 31;
   months[8] = 31;
   months[9] = 30;
   months[10] = 31;
   months[11] = 30;
   months[12] = 31;

   if(month != 2)
      return months[month];

   if(isleap(year))
      return 29;

   return 28;
}

/********************************************************
 * isleap()						*
 * --> determine if given year is a leap year		*
 * @param year [int]: year to evaluate			*
 * @return [bool]: true if leap year, false otherwise	*
 ********************************************************/
function isleap(year)
{
   if(year%4 != 0)
      return false;
   if(year%100 != 0)
      return true;
   if(year%400 == 0)
      return true;
   return false;
}


