﻿var airValues, inFarenheit;

function checkButton( name ) {
   var   input = document.getElementById( name );

   input.checked = true;
}

function isChecked( name ) {
   var   input = document.getElementById( name );

   return input.checked;
}

function getDoubleFromInput( name ) {
   var	daInput = document.forms[ 0 ].elements[ name ];
   return parseFloat( daInput.value );
}

function setInput( value, name ) {
   var	daInput = document.forms[ 0 ].elements[ name ];
   daInput.value = value;
}

function retrieveAirResultsFromXml() {
   var node = g_XmlRequester.responseXML.lastChild;

   if( node.nodeName == "AirResults" ) {
      for( var i = 0; i < node.childNodes.length; ++i ) {
         var theProperty = node.childNodes[ i ];
 
			if( theProperty.nodeName in airValues ) {

				if( "textContent" in theProperty )
					airValues[ theProperty.nodeName ] = theProperty.textContent;
				else
					airValues[ theProperty.nodeName ] = theProperty.text;
			}
      }
   }
}

function retrieveCalcedValues( changed, obj ) {
   airValues = obj;

   if( isChecked( "m_farenheitCheck" ) ) {
      obj.m_AirOnDb = toCentigrade( obj.m_AirOnDb );
      obj.m_AirOnWb= toCentigrade( obj.m_AirOnWb );
      obj.m_AirOffDb = toCentigrade( obj.m_AirOffDb );
      obj.m_AirOffWb = toCentigrade( obj.m_AirOffWb );
      obj.m_TargetTemperature = toCentigrade( obj.m_TargetTemperature );
   }

   var   rv = false;

   if( changed == "m_AirOnDb" || changed == "m_AirOnWb" || changed == "m_AirOffDb" ) {
      rv = StartSynchronousDownload( "Calc.asmx/DbWb?OnDb=" + obj.m_AirOnDb + "&OnWb=" + obj.m_AirOnWb + "&OffDb=" + obj.m_AirOffDb + "&TargetTemp=" + obj.m_TargetTemperature, retrieveAirResultsFromXml, true );
   } else if( changed == "m_AirOnRh" ) {
      rv = StartSynchronousDownload( "Calc.asmx/DbRh?OnDb=" + obj.m_AirOnDb + "&OnRh=" + obj.m_AirOnRh + "&OffDb=" + obj.m_AirOffDb + "&TargetTemp=" + obj.m_TargetTemperature, retrieveAirResultsFromXml, true );
   } else if( changed == "m_AirOffWb" ) {
      rv = StartSynchronousDownload( "Calc.asmx/DbWbWb?OnDb=" + obj.m_AirOnDb + "&OnWb=" + obj.m_AirOnWb + "&OffWb=" + obj.m_AirOffWb + "&TargetTemp=" + obj.m_TargetTemperature, retrieveAirResultsFromXml, true );
   }
 
   if( !rv )
      throw "XhttpRequest failed";

   if( isChecked( "m_farenheitCheck" ) ) {
      obj.m_AirOnDb = toFarenheit( obj.m_AirOnDb );
      obj.m_AirOnWb= toFarenheit( obj.m_AirOnWb );
      obj.m_AirOffDb = toFarenheit( obj.m_AirOffDb );
      obj.m_AirOffWb = toFarenheit( obj.m_AirOffWb );
      obj.m_CalcdAirOffDb = toFarenheit( obj.m_CalcdAirOffDb );
      obj.m_CalcdAirOffWb = toFarenheit( obj.m_CalcdAirOffWb );
   }

   setInput( obj.m_AirOnWb, "m_AirOnWb" );
   setInput( obj.m_AirOnRh, "m_AirOnRh" );
   setInput( obj.m_CalcdAirOffDb, "m_CalcdAirOffDb" );
   setInput( obj.m_CalcdAirOffWb, "m_CalcdAirOffWb" );
   setInput( obj.m_CalcdAirOffRh, "m_CalcdAirOffRh" );
 }

function setCurveType() {
   var   airOnDb = getDoubleFromInput( "m_AirOnDb" ),
         airOffDb = getDoubleFromInput( "m_AirOffDb" );

   if( airOffDb > airOnDb )
      checkButton( "m_hotCheck" );
   else
      checkButton( "m_coolCheck" );
}

function validateAirValues( obj ) {

   if( obj.m_AirOnWb > obj.m_AirOnDb )
      obj.m_AirOnWb = obj.m_AirOnDb;

   // relative humitidy is between 0% & 100% inclusive
   if( obj.m_AirOnRh < 0 )
      obj.m_AirOnRh = 0;

   if( obj.m_AirOnRh > 100 )
      obj.m_AirOnRh = 100;

   // can't cool below target temperature & if AirOffDb is greater than AirOnDb, it's a heating curve
   if( obj.m_AirOffDb < obj.m_TargetTemperature )
      obj.m_AirOffDb = obj.m_TargetTemperature;
}

function getAirValues( obj ) {
   obj.m_AirOnDb = getDoubleFromInput( "m_AirOnDb" );
   obj.m_AirOnWb = getDoubleFromInput( "m_AirOnWb" );
   obj.m_AirOnRh = getDoubleFromInput( "m_AirOnRh" );
   obj.m_AirOffDb = getDoubleFromInput( "m_AirOffDb" );
   obj.m_AirOffWb = getDoubleFromInput( "m_AirOffWb" );
   obj.m_CalcdAirOffDb = getDoubleFromInput( "m_AirOffDb" );
   obj.m_CalcdAirOffWb = getDoubleFromInput( "m_AirOffWb" );
   obj.m_CalcdAirOffRh = 0;
   obj.m_TargetTemperature = getDoubleFromInput( "m_TargetTemperature" );
}

function inputValueChange( e ) {
   var src;

   if( e.target )
      src = e.target;
   else
      src = e.srcElement;

   if( src.name.substring( 0, 5 ) != "m_Air" )
      return;

   var obj = new Object;
   var changed = src.name;

   if( changed == "m_AirOffDb" ) {
      checkButton( "m_DbPriority" );
      setInput( "", "m_AirOffWb" );
   } else if ( changed == "m_AirOffWb" ) {
      checkButton( "m_WbPriority" );
      setInput( "", "m_AirOffDb" );
   }
   getAirValues( obj );
   validateAirValues( obj );
   retrieveCalcedValues( changed, obj );
   setCurveType();
}

function toCentigrade( farenheit ) {
   return (farenheit - 32) / 1.8;
}

function toFarenheit( centigrade ) {
   return centigrade * 1.8 + 32;
}

function convertInput( inputName, conversionFunction ) {
   var input = document.getElementById( inputName );
   var convertedVal = conversionFunction( parseFloat( input.value ) );

   if( isFinite( convertedVal) )
      input.value = convertedVal.toFixed( 4 );
   else
      input = "";
}

function convertToCentigrade() {
   convertInput( "m_AirOnDb", toCentigrade );
   convertInput( "m_AirOnWb", toCentigrade );
   convertInput( "m_AirOffDb", toCentigrade );
   convertInput( "m_AirOffWb", toCentigrade );
   convertInput( "m_CalcdAirOffDb", toCentigrade );
   convertInput( "m_CalcdAirOffWb", toCentigrade );
   convertInput( "m_TargetTemperature", toCentigrade );
}

function convertToFarenheit() {
   convertInput( "m_AirOnDb", toFarenheit );
   convertInput( "m_AirOnWb", toFarenheit );
   convertInput( "m_AirOffDb", toFarenheit );
   convertInput( "m_AirOffWb", toFarenheit );
   convertInput( "m_CalcdAirOffDb", toFarenheit );
   convertInput( "m_CalcdAirOffWb", toFarenheit );
   convertInput( "m_TargetTemperature", toFarenheit );
}

function hideWarning() {
   var ele = document.getElementById( "javaScriptWarning" );
   ele.style.display = "none";
}

function pageInit() {
   hideWarning();
  
   var inputs = document.getElementsByTagName("INPUT");

   for( var i = 0; i < inputs.length; ++i ) {
      var daInput = inputs[ i ];

      if( daInput.type == "text" ) {
         if( daInput.addEventListener )
            daInput.addEventListener( "change", inputValueChange, false )
         else
            daInput.attachEvent( "onchange", inputValueChange )
      }
   }

   var   tempCheck = document.getElementById( "m_centigradeCheck" );

   // we use change for firefox, cos it works properly, and onclick for ie
   if( tempCheck.addEventListener )
      tempCheck.addEventListener( "change", convertToCentigrade, false );
   else
      tempCheck.attachEvent( "onclick", convertToCentigrade );

   tempCheck = document.getElementById( "m_farenheitCheck" );

   if( tempCheck.addEventListener )
      tempCheck.addEventListener( "change", convertToFarenheit, false );
   else
      tempCheck.attachEvent( "onclick", convertToFarenheit );

   g_XmlRequester = CreateRequester();
}
