﻿// CHILLOUT TCO CALC
function numbersOnly(source, e)
{
	var keynum;
	var keychar;
	var numcheck;

	if (window.event) keynum = e.keyCode;  // IE
	else if (e.which) keynum = e.which;  // other browsers
	
	keychar = String.fromCharCode(keynum);
	numcheck = /\d/;
	
	if(!keynum || 8 == keynum) return true;  // allow navigation keys, backspace & delete
	if ("." == keychar && -1 == source.value.indexOf(".")) return true;  // allow a single decimal point
	return numcheck.test(keychar);  // otherwise, it must be a digit
}

function tcoCalc()
{
	// initial cost
	coInitial.value = (parseFloat(coUnitPrice.value) + parseFloat(coDelivery.value)).toFixed(2);
	asInitial.value = (parseFloat(asUnitPrice.value) + parseFloat(asDelivery.value)).toFixed(2);
	fsInitial.value = (parseFloat(fsUnitPrice.value) + parseFloat(fsDelivery.value)).toFixed(2);
	
	// installation
	coInstallation.value = (parseFloat(coLabor.value) * parseFloat(coTime.value) + parseFloat(coMaterials.value)).toFixed(2);
	asInstallation.value = (parseFloat(asLabor.value) * parseFloat(asTime.value) + parseFloat(asMaterials.value)).toFixed(2);
	fsInstallation.value = (parseFloat(fsLabor.value) * parseFloat(fsTime.value) + parseFloat(fsMaterials.value)).toFixed(2);
	
	// per unit installed cost
	coUnitInstalled.value = (parseFloat(coInitial.value) + parseFloat(coInstallation.value)).toFixed(2);
	asUnitInstalled.value = (parseFloat(asInitial.value) + parseFloat(asInstallation.value)).toFixed(2);
	fsUnitInstalled.value = (parseFloat(fsInitial.value) + parseFloat(fsInstallation.value)).toFixed(2);
	
	// totals
	coTotal.value = ((parseFloat(coUnits.value) + parseFloat(coFailures.value)) * parseFloat(coUnitInstalled.value)).toFixed(2);
	asTotal.value = ((parseFloat(asUnits.value) + parseFloat(asFailures.value)) * parseFloat(asUnitInstalled.value)).toFixed(2);
	fsTotal.value = ((parseFloat(fsUnits.value) + parseFloat(fsFailures.value)) * parseFloat(fsUnitInstalled.value)).toFixed(2);
	
	// combined costs
	asFsCombined.value = (parseFloat(asTotal.value) + parseFloat(fsTotal.value)).toFixed(2);
	
	// savings
	coSavings.value = (parseFloat(asFsCombined.value) - parseFloat(coTotal.value)).toFixed(2);
}


// HEATERSTAT Calculator

function selectCT198 (R, V) {
//Pick the appropriate model of CT198 for resistance R, voltage V
  var i;
  var select = -1;
  var tfit, fit = 1000; //Measure of fit

  if ((R < 4.5) || (R > 914.8)) return "Resistance out of range";
  if ((V < 5)   || (V > 50))    return "Voltage out of range";
  for (i=0; i<CTSPmin.length; i++) {
    if ((R > CTSPmin[i]) && (R < CTSPmax[i])) {
      tfit = Math.abs ((CTSPmin[i] + CTSPmax[i])/2 - R);
      if ((tfit < fit) && (V >= CTSVmin[i]) && (V <= CTSVmax[i])) {
        fit = tfit; //Better fit than previous; new selection
        select = i;  }
    }
  }
  if (select == -1) return ("Could not find a match");
  else {
    CTi = select;
    return ("CT198-"+(1000+select)); }
}

function chooseCT198 (i) {
//Manually select CT198
  autoSelect = 0;
  CTi = i;
  document.getElementById("partNumber").value = "CT198-"+(1000+i);
  calc ();
}

function makeTable () {
//Write out table of CT198 models
  var i;
  var a;

  document.writeln ('<table class="heaterstat">');
  document.writeln ('<tr><td colspan="5" class="tableHead">');
  document.writeln ('CT198 standard models<br>');
  document.writeln ('<span style="font-weight: normal;">');
  document.writeln ('Click on the model number below to manually select.');
  document.writeln ('</span></td></tr>');
  document.writeln ('<TR>');
  document.writeln ('<TD class="colHead" ROWSPAN=2>Model number</TD>');
  document.writeln ('<TD class="colHead" COLSPAN=2>Setpoint range (ohms)</TD>');
  document.writeln ('<TD class="colHead" COLSPAN=2>Supply voltage (VDC)</TD>');
  document.writeln ('</TR><TR>');
  document.writeln ('<TD class="colHead">Min.</TD><TD class="colHead">Max.</TD><TD class="colHead">Min.</TD><TD class="colHead">Max.</TD>');
  document.writeln ('</TR>');
  for (i=0; i<CTSPmin.length; i++) {
    document.write   ('<TR><TD class="label">');
    a = "CT198-" + (1000+i);
    document.write   ('<A HREF="javascript:chooseCT198(',i,');">',a,'</A>',"</TD><TD>");
    document.write   (CTSPmin[i], "</TD><TD>");
    document.write   (CTSPmax[i], "</TD><TD>");
    document.write   (CTSVmin[i], "</TD><TD>");
    document.writeln (CTSVmax[i], "</TD></TR>");
  }
  document.writeln ("</TABLE>");
}

function calc() {
	//Calculate all new values after change to input
	var lowT, hiT;
	if (document.getElementById("foilTypeNiFe").checked) {
		foil = "NiFe"; }
	else if (document.getElementById("foilTypeNi").checked) {
		foil = "Ni"; }
	else foil = "Cu";
	
	//Calculate R0 and RT
	T = document.getElementById("Setpoint").value;
	
	//Find R0 by dividing R at Temp by ratio at temp RTemp
	var RatTemp = document.getElementById("RatTemp");
	var RTemp = document.getElementById("RTemp");
	if (foil == "NiFe") {
		R0C = RatTemp.value / NiFeResistance(RTemp.value, 1);
		RatT =  NiFeResistance (T, R0C);
	}
	else if (foil == "Cu") {
		R0C = RatTemp.value / CuResistance(RTemp.value, 1);
		RatT =  CuResistance (T, R0C);
	}
	else {
		R0C = RatTemp.value / NiResistance(RTemp.value, 1);
		RatT =  NiResistance (T, R0C);
	}
	document.getElementById("R0").value = R0C;
	document.getElementById("T").value = T;
	if (RatT != 0) document.getElementById("Rt").value = RatT;
	var V = document.getElementById("Volts").value;
	document.getElementById("current").value = V/RatT;
	document.getElementById("Watts").value = V*V/RatT;
	document.getElementById("wattDensity").value = (V*V/RatT)/document.getElementById("area").value;
	//Select CT198 model
	if (autoSelect == 1) {
		document.getElementById("partNumber").value = selectCT198 (RatT, V);
	}
	//Calculate range of setpoint
	var heaterTolerance = document.getElementById("heaterTolerance")
	var lowR = CTSPmin[CTi] + RatT*heaterTolerance.value/100;
	var hiR  = CTSPmax[CTi] - RatT*heaterTolerance.value/100;

	if (foil == "NiFe") {
		lowT =  NiFeTemperature (lowR, R0C);
		hiT  =  NiFeTemperature (hiR, R0C);
	}
	else if (foil == "Cu") {
		lowT =  CuTemperature (lowR, R0C);
		hiT  =  CuTemperature (hiR, R0C);
	}
	else {
		lowT =  NiTemperature (lowR, R0C);
		hiT  =  NiTemperature (hiR, R0C);
	}
	document.getElementById("lowTemp").value = lowT;
	document.getElementById("hiTemp").value = hiT;
}

function NiFeResistance (T, R0) {
//Return resistance of .00518 NiFE element, given temp in C and R0C
   if ((T < -100)||(T > 205)) {
      alert ("Temperature must be in range -100 to 205C");
      return (0);  }
    if (T < 0) {
    a = 4.68699e-3; b = 8.58992e-6; }
    else {
    a = 4.59818e-3; b =5.89404e-6; }
  return (R0*(1 + T*(a + T*b)));
}

function NiFeTemperature (R, R0) {
//Return temperature of .00518 NiFE element, given R and R0C
    if (R < R0) {
    a = 4.68699e-3; b = 8.58992e-6; }
    else {
    a = 4.59818e-3; b =5.89404e-6; }
    return ((Math.sqrt(a*a - 4*b*(1 - R/R0)) - a)/(2*b));
}

function NiResistance (T, R0) {
//Return resistance of .00672 Ni element, given temp in C and R0C
   if ((T < -80)||(T > 260)) {
      alert ("Temperature must be in range -80 to 260C");
      return (0);  }
    if (T < -60) { a = 9.98038e-1; b = 5.77901e-3; c = 4.51922e-6; d = 1.88301e-8; }
    else if (T < -30) { a = 9.99555e-1; b = 5.85481e-3; c = 5.78261e-6; d = 2.58489e-8; }
    else if (T < 0) { a = 1.0; b = 5.89936e-3; c = 7.26759e-6; d = 4.23487e-8; }
    else if (T < 30) {  a = 1.0; b =  5.89936e-3; c = 7.26759e-6; d = 1.15464e-8; }
    else if (T < 60) {  a = 1.00012; b = 5.88747e-3; c = 7.66375e-6; d = 7.14468e-9; }
    else if (T < 90) {  a = 1.00233; b = 5.77696e-3; c = 9.50564e-6; d = -3.08809e-9; }
    else if (T < 120) { a = 9.94032e-1; b = 6.05347e-3; c = 6.43246e-6; d = 8.29409e-9; }
    else if (T < 150) { a = 1.00702; b =    5.72876e-3; c = 9.13899e-6; d = 7.75926e-10; }
    else if (T < 180) { a = 8.91859e-1; b = 8.03204e-3; c =-6.21616e-6; d = 3.48985e-8; }
    else if (T < 210) { a = 9.06025e-1; b = 7.79594e-3; c =-4.90454e-6; d = 3.24696e-8; }
    else if (T < 240) { a = 1.10347; b =    4.97525e-3; c = 8.52733e-6; d = 1.11491e-8; }
    else if (T < 260) { a = 1.43736; b =    8.01716e-4; c = 2.59170e-5; d = -1.30033e-8; }
  return (R0*(a + T*(b + T*(c + T*d))));
}

function NiTemperature (R, R0) {
//Return temperature of .00672 Ni element, given R and R0C
  ratio = R/R0;
    if (ratio < 0.666) { a = -1.78625e2; b = 1.63867e2; c =  3.73917e1; d =  -2.24575e1; }
  else if (ratio < 0.833) { a = -1.77281e2; b = 1.57822e2; c =  4.64596e1; d =  -2.69914e1; }
  else if (ratio < 1) { a =     -1.76171e2; b = 1.53826e2; c =  5.12549e1; d =  -2.89095e1; }
  else if (ratio < 1.167) { a = -2.09427e2; b = 2.53594e2; c = -4.85127e1; d =   4.34632;   }
  else if (ratio < 1.333) { a = -2.21409e2; b = 2.84403e2; c = -7.49206e1; d =   1.18914e1; }
  else if (ratio < 1.5) { a =   -2.04110e2; b = 2.45481e2; c = -4.57290e1; d =   4.59354;   }
  else if (ratio < 1.667) { a = -2.26501e2; b = 2.90263e2; c = -7.55841e1; d =   1.12280e1; }
  else if (ratio < 1.833) { a = -1.77027e2; b = 2.01210e2; c = -2.21522e1; d =   5.41630e-1; }
  else if (ratio < 2) { a =     -2.20525e2; b = 2.72389e2; c = -6.09769e1; d =   7.60067;   }
  else if (ratio < 2.167) { a = -1.52012e2; b = 1.69619e2; c = -9.59181; d =    -9.63518e-1; }
  else if (ratio < 2.333) { a = -1.46333e2; b = 1.61756e2; c = -5.96297; d =    -1.52180;   }
  else if (ratio < 2.5) { a =   -1.89380e2; b = 2.17102e2; c = -2.96826e1; d =   1.86672;   }
  else if (ratio < 2.667) { a = -1.73971e2; b = 1.98611e2; c = -2.22861e1; d =   8.80522e-1; }
  else if (ratio < 2.833) { a = -2.20154e2; b = 2.50567e2; c = -4.17699e1; d =   3.31599;   }
  else if (ratio < 3) { a =     -2.50440e2; b = 2.82635e2; c = -5.30878e1; d =   4.64751;   }
  else if (ratio < 3.169) { a = -1.41772e2; b = 1.73966e2; c = -1.68650e1; d =   6.22755e-1; }

  return (a + ratio*(b + ratio*(c + ratio*d)));
}

function CuResistance  (T, R0) {
//Return resistance of CA RTD, given temp in C and R0C
   if ((T < -100)||(T > 260)) {
      alert ("Temperature must be in range -100 to 260C");
      return (0);  }
    if (T < -50) {
      T += 200;
      a = 1.17058e-1; b = 3.92313e-2; c = -7.45044e-6; }
    else if (T < 150) {
      a = 1; b = 4.2743e-3; c = 0; }
    else {
      T -= 150;
      a = 1.641145; b = 2.62628e-3; c = 2.43732e-8; }
  return (R0*a*(1 + T*(b + T*c)));
}

function CuTemperature (R, R0) {
//Return temperature of CA RTD, given R and R0C
  var ratio = R/R0;
  var t;
  t1 = (ratio - 1)/4.2743e-3; //First approximation of t
    if (t1 < -50) {
      a = 1.17058e-1; b = 3.92313e-2; c = -7.45044e-6;
      t = (Math.sqrt(b*b - 4*c*(1 - R/(R0*a))) - b)/(2*c);
      t -= 200;  }
    else if (T < 150) {
      a = 1; b = 4.2743e-3; c = 0;
      t = t1; }
    else {
      t -= 150;
      a = 1.641145; b = 2.62628e-3; c = 2.43732e-8;
      t = (Math.sqrt(b*b - 4*c*(1 - R/(R0*a))) - b)/(2*c);
      t += 150; }
  return t;
}

// Ohm's LAW CALCULATOR

function validateOHMS(element)
{
	if (isFinite(element.value))
	{
		element.style.borderColor = "#cccccc";
	}
	else
	{
		element.style.borderColor = "red"
	}
}

function calculateOHMS(changedElement)
{
	var allValid = (isFinite(txtVolts.value) && isFinite(txtAmps.value) &&
					isFinite(txtOhms.value) && isFinite(txtWatts.value));
	
	if (null != previous && changedElement != previous && allValid)
	{
		if (changedElement == txtVolts)
		{
			if (previous == txtAmps)
			{
				txtOhms.value = txtVolts.value / txtAmps.value;
				txtWatts.value = txtVolts.value * txtAmps.value;
			}
			else if (previous == txtOhms)
			{
				txtAmps.value = txtVolts.value / txtOhms.value;
				txtWatts.value = Math.pow(txtVolts.value,2) / txtOhms.value;
			}
			else if (previous == txtWatts)
			{
				txtAmps.value = txtWatts.value / txtVolts.value;
				txtOhms.value = Math.pow(txtVolts.value,2) / txtWatts.value;
			}
		}
		else if (changedElement == txtAmps)
		{
			if (previous == txtVolts)
			{
				txtOhms.value = txtVolts.value / txtAmps.value;
				txtWatts.value = txtVolts.value * txtAmps.value;
			}
			else if (previous == txtOhms)
			{
				txtVolts.value = txtAmps.value * txtOhms.value;
				txtWatts.value = Math.pow(txtAmps.value,2) * txtOhms.value;
			}
			else if (previous == txtWatts)
			{
				txtVolts.value = txtWatts.value / txtAmps.value;
				txtOhms.value = txtWatts.value / Math.pow(txtAmps.value,2);
			}
		}
		else if (changedElement == txtOhms)
		{
			if (previous == txtVolts)
			{
				txtWatts.value = Math.pow(txtVolts.value,2) / txtOhms.value;
				txtAmps.value = txtVolts.value / txtOhms.value;
			}
			else if (previous == txtAmps)
			{
				txtVolts.value = txtOhms.value * txtAmps.value;
				txtWatts.value = txtOhms.value * Math.pow(txtAmps.value,2);
			}
			else if (previous == txtWatts)
			{
				txtVolts.value = Math.sqrt(txtOhms.value * txtWatts.value);
				txtAmps.value = Math.sqrt(txtWatts.value / txtOhms.value);
			}
		}
		else if (changedElement == txtWatts)
		{
			if (previous == txtVolts)
			{
				txtAmps.value = txtWatts.value / txtVolts.value;
				txtOhms.value = Math.pow(txtVolts.value,2) / txtWatts.value;
			}
			else if (previous == txtAmps)
			{
				txtVolts.value = txtWatts.value / txtAmps.value;
				txtOhms.value = txtWatts.value / Math.pow(txtAmps.value,2);
			}
			else if (previous == txtOhms)
			{
				txtVolts.value = Math.sqrt(txtWatts.value * txtOhms.value);
				txtAmps.value = Math.sqrt(txtWatts.value / txtOhms.value);
			}
		}
	}
	
	previous = changedElement;
}

// UNIT CALCULATOR

function calc1(invalue,multiplyer,adder)
{
	return (invalue * multiplyer + adder);
}
function calc2(invalue,multiplyer,adder)
{
	return (invalue - adder) / multiplyer;
}
function EntKey (kCode) {
	if(kCode==13) return 9;
}

// SENSOR CALCULATOR - Heater, Rtd, Thermocouple

function quick_calc()
{
	Wquick = window.open('quickcalc.aspx', 'QuickCalc', 'width=280,height=470');
	Wquick.resizeTo(280,470);
	Wquick.focus();
}

function getcoeffs()
{
	coeffwin = window.open("coeffs.aspx","",'toolbar=no menubar=no status=no height=550 width=530 innerHeight=550 innerWidth=530 top=0 top=0 left=100 screenX=100 screenY=0 resizable=yes');
	coeffwin.resizeTo(530, 580);
	coeffwin.moveTo(100,0);
	coeffwin.focus();
}

function DispMessage(idname)	{
	switch (idname)
	{
		case 'message1':		text = message1;	break;			
		case 'message2':		text = message2;	break;		
		case 'message3':		text = message3;	break;		
		case 'message4':		text = message4;	break;		
		case 'message5':		text = message5;	break;		
		case 'message6':		text = message6;	break;		
		case 'message7':		text = message7;	break;		
		default :		text = "&nbsp;";
	}
	
	version = navigator.appVersion.substring(0,4);

	if(navigator.appName == "Netscape" && version < 5)
	{
		document.layers.message.moveToAbsolute(
		(document.layers.message.window.innerWidth/2)-(text.length * 3.5),170);
		
		document.layers.message.document.write(
		'<strong><font face="sans-serif" size="2">'+text+"</font></strong>");
		
		document.layers.message.document.close();
	}
	else
	{
		myobj = document.getElementById(idname);
		if(window.innerWidth != null)
		{
			myobj.style.width = window.innerWidth;
		}
		else
		{
			myobj.style.width = document.body.clientWidth;
		}
	
		myobj.style.visibility = 'visible';
		return true;		
	}
}

function HideMessage(idname)
{
	var text = "&nbsp;";
		
	version = navigator.appVersion.substring(0,4);

	if(navigator.appName == "Netscape" && version < 5)
	{
		document.layers.message.moveToAbsolute(
		(document.layers.message.window.innerWidth/2)-(text.length * 3.5),165);
		
		document.layers.message.document.write(
		'<strong><font face="sans-serif" size="2">'+text+'</font></strong>');
		
		document.layers.message.document.close();
	}
	else
	{
		myobj = document.getElementById(idname);
		myobj.style.visibility = 'hidden';
		return true;		
	}
}

// SENSOR CALCULATOR - RTD

function PassValues(){
	window.opener.document.forms(0).submit();
	self.close();		
}