//************************************
// DEWPOINT / HUMIDITY CALCULATOR
//************************************
//***************************
// GLOBALS ******************
var PressureUnit="bara"
var Pascals=0
//***************************
//***************************
// CHANGE UNIT OF PRESSURE
//***************************
function PUnitChange(currentValue,currentUnit,changeUnitTo){
//CONVERT TO PASCALS
Pascals=ToPascals(currentUnit,currentValue)
//CONVERT TO NEW UNIT
return(FromPascals(changeUnitTo,Pascals))
}
//***************************
// CONVERT FROM PASCALS
//***************************
function FromPascals(toUnit,pValue){
pValue=parseFloat(pValue)
if (toUnit=="bara"){newValue=pValue/101325}
if (toUnit=="barg"){newValue=(pValue/101325)-1}
if (toUnit=="psia"){newValue=(pValue/101325)*14.7}
if (toUnit=="psig"){newValue=(pValue*14.7/101325)-14.7}
if (toUnit=="KPa"){newValue=pValue/1000}
if (toUnit=="MPa"){newValue=pValue/1000000}
return(newValue)
}
//***************************
// CONVERT TO PASCALS
//***************************
function ToPascals(currentUnit,currentValue){
currentValue=parseFloat(currentValue)
if (currentUnit=="bara"){Pascals=currentValue*101325}
if (currentUnit=="barg"){Pascals=(currentValue+1)*101325}
if (currentUnit=="psia"){Pascals=(currentValue/14.7)*101325}
if (currentUnit=="psig"){Pascals=((currentValue+14.7)/14.7)*101325}
if (currentUnit=="KPa"){Pascals=currentValue*1000}
if (currentUnit=="MPa"){Pascals=currentValue*1000000}
return(Pascals)
}
//******************************
// CHANGE OF UNIT
//******************************
function UnitChange(formItem,formChange){
currentValue = formChange.value
changeUnitTo = formItem.options[formItem.selectedIndex].value
if ((changeUnitTo == "degC") || (changeUnitTo == "degF")){
AlertString="Поле температуры"}
else{
AlertString="Поле давления"}
if (typeof ValueCheck(currentValue,AlertString) != "строка"){
if ((changeUnitTo != "degC") && (changeUnitTo != "degF")){
currentUnit = PressureUnit
newValue = PUnitChange(currentValue,currentUnit,changeUnitTo)
}
else{
newValue = DegFar(currentValue,changeUnitTo)
}
formChange.value=newValue
////////////// UPDATE PRESSURE UNITS ///////////////
}
if ((changeUnitTo != "degC") && (changeUnitTo != "degF")){
PressureUnit=changeUnitTo
}
}
//******************************
// CONVERT DEGREES TO FAHRENHEIT
//******************************
function DegFar(CurrentValue,ChangeTo){
if (ChangeTo == "degF"){
return((9/5)*parseFloat(CurrentValue) + 32)
}
else{
return((parseFloat(CurrentValue)-32)*5/9)
}
}
//************************
// CHECK FOR NUMERIC ENTRY
//************************
function ValueCheck(CheckItem,ShowAlert){
ReturnString = ""
CheckLength = CheckItem.length
CheckAgainst = "0123456789.-+"
if(CheckLength<1 && ShowAlert!="NONE"){
alert(ShowAlert +" содержит недопустимое значение.")
}
for(var i = 0; i != CheckLength; i++){
aChar = CheckItem.substring(i,i+1)
if (CheckAgainst.indexOf(aChar)<0){
if(ShowAlert!="NONE"){
alert(ShowAlert +" cсодержит недопустимое значение.")
}
return("ОШИБКА")
}
else{
ReturnString= ReturnString + aChar
}
if (ReturnString.length == CheckLength){return(parseFloat(ReturnString))}
}
return("ОШИБКА")
}
//************************
// Change of gas type
//************************
function GasChange(form){
AtomicValue = form.Gas.options[form.Gas.selectedIndex].value
if(AtomicValue != "X"){
form.AtomicMass.value = AtomicValue
}
else{
form.AtomicMass.value = ""
form.AtomicMass.focus()
}
}
//--------------------------------------------
//DECIMAL FUNCTION
//--------------------------------------------
function decimal(value,NumDP){
if(NumDP==0){Numerator=1}
if(NumDP==1){Numerator=10}
if(NumDP==2){Numerator=100}
if(NumDP==3){Numerator=1000}
var WGdc="."
var M=Math.round(value*Numerator)
if(NumDP==0){var S = M}
if(NumDP==1){var S=(((M<1000)&(M>0))?"0":"")+M;}
if(NumDP==2){var S=(((M<100)&(M>0))?"00":(((M<1000)&(M>0))?"0":""))+M;}
if(NumDP==3){var S=(((M<10)&(M>0))?"000":(((M<100)&(M>0))?"00":((M<1000)&(M>0))?"0":""))+M;}
S = S+""
realvalue=((S.substring(0,(S.length-NumDP)))+WGdc+S.substring((S.length-NumDP),S.length));
//REMOVE ANY PADDING ADDED
if (realvalue.length>1){
while(realvalue.charAt(realvalue.length-1)=="0"){
realvalue=realvalue.substring(0,realvalue.length-1)
}
if(realvalue.charAt(realvalue.length-1)=="."){
realvalue=realvalue.substring(0,realvalue.length-1)
}
while((realvalue.charAt(0)=="0")&(realvalue.charAt(1)!=".")){
realvalue=realvalue.substring(1,realvalue.length)
}
}
if (realvalue.length==0){realvalue=0}
return(realvalue);
}
//************************
// FIND FIELDS FOR INPUT VALUES
//************************
function FindInput(form){
confirmAction=true; i=0; VALUE="XX"; area="XX"
if(form.a.value != ""){i++;area="AREA1";VALUE="A"}
if(form.b.value != ""){i++;area="AREA2";VALUE="B"}
if(form.c.value != ""){i++;area="AREA3";VALUE="C"}
if(form.d.value != ""){i++;area="AREA3";VALUE="D"}
if(form.e.value != ""){i++;area="AREA3";VALUE="E"}
if(form.f.value != ""){i++;area="AREA3";VALUE="F"}
if(i != 1){
alert("Пожалуйста, введите только один параметр Точки росы или Абсолютной влажности \r\r Нажмите 'Очистить форму' для нового расчета.")
}
else{
if(form.P1.value==""){form.P1.value=1}
if(typeof ValueCheck(form.P1.value,"Line Pressure")=="string"){area="XX"}
if(typeof ValueCheck(form.AtomicMass.value,"Molecular Weight")=="string"){area="XX"}
GasValue=form.Gas.options[form.Gas.selectedIndex].value
if(typeof ValueCheck(GasValue,"NONE")=="string"){
GasType="газ с молекулярной массой " + form.AtomicMass.value;
}
else{
if(GasValue==29){GasType="воздух"}
if(GasValue==28){GasType="азот"}
if(GasValue==40){GasType="аргон"}
if(GasValue==146){GasType="SF6"}
if(GasValue==32){GasType="кислород"}
if(GasValue==2){GasType="водород"}
if(GasValue==44){GasType="CO2"}
}
if((VALUE=="B")&(area!="XX")){
pUnit=form.UnitOfP.options[form.UnitOfP.selectedIndex].value
tUnit=form.TempUnitB.options[form.TempUnitB.selectedIndex].value
if(tUnit=="degC"){Temp="oC"}else{Temp="oF"}
confirmAction = confirm("Пожалуйста, подтвердите расчет Точки росы для заданного давления: \r\r" + form.b.value + Temp + " при " + form.P1.value +" "+ pUnit)
}
if((VALUE=="D")&(area!="XX")){
confirmAction = confirm("Пожалуйста, подтвердите расчет Абсолютных значений: \r\r" + form.d.value + " ppm для веса " + GasType)
}
if(form.P1.value!=""){
pUnit=form.UnitOfP.options[form.UnitOfP.selectedIndex].value
if(pUnit=="bara"){
if((form.P1.value>=0.01)&(form.P1.value<1)){form.P1.value=decimal(form.P1.value,2)}
if((form.P1.value>=1)&(form.P1.value<=401)){form.P1.value=decimal(form.P1.value,1)}
if((form.P1.value<0.01)||(form.P1.value>401)){area="XX";alert("Давление в системе (bara) вне пределов измерения. \r\rВведите значение в пределах: \r\r0.01 - 401")}
}
if(pUnit=="barg"){
if((form.P1.value>=-0.99)&(form.P1.value<1)){form.P1.value=decimal(form.P1.value,2)}
if((form.P1.value>=1)&(form.P1.value<=400)){form.P1.value=decimal(form.P1.value,1)}
if((form.P1.value<-0.99)||(form.P1.value>400)){area="XX";alert("Давление в системе (barg) вне пределов измерения. \r\rВведите значение в пределах: \r\r-0.99 - 400")}
}
if(pUnit=="psia"){
if((form.P1.value>=0)&(form.P1.value<100)){form.P1.value=decimal(form.P1.value,1)}
if((form.P1.value>=100)&(form.P1.value<=6015)){form.P1.value=decimal(form.P1.value,0)}
if((form.P1.value<0)||(form.P1.value>6015)){area="XX";alert("Давление в системе (psia) вне пределов измерения. \r\rВведите значение в пределах: \r\r0 - 6015")}
}
if(pUnit=="psig"){
if((form.P1.value>=-14.7)&(form.P1.value<100)){form.P1.value=decimal(form.P1.value,1)}
if((form.P1.value>=100)&(form.P1.value<=6000)){form.P1.value=decimal(form.P1.value,0)}
if((form.P1.value<-14.7)||(form.P1.value>6000)){area="XX";alert("Давление в системе (psig) вне пределов измерения. \r\rВведите значение в пределах: \r\r-14.7 - 6000")}
}
if(pUnit=="KPa"){
if((form.P1.value>=0.1)&(form.P1.value<1)){form.P1.value=decimal(form.P1.value,1)}
if((form.P1.value>=1)&(form.P1.value<=40000)){form.P1.value=decimal(form.P1.value,0)}
if((form.P1.value<0.1)||(form.P1.value>40000)){area="XX";alert("Давление в системе (KPa) вне пределов измерения. \r\rВведите значение в пределах: \r\r0.1 - 40000")}
}
if(pUnit=="MPa"){
if((form.P1.value>=0.1)&(form.P1.value<1)){form.P1.value=decimal(form.P1.value,1)}
if((form.P1.value>=1)&(form.P1.value<=40)){form.P1.value=decimal(form.P1.value,0)}
if((form.P1.value<0.1)||(form.P1.value>40)){area="XX";alert("Давление в системе (MPa) вне пределов измерения. \r\rВведите значение в пределах: \r\r0.1 - 40")}
}
}
tUnitA=form.TempUnitA.options[form.TempUnitA.selectedIndex].value
if(tUnitA=="degF"){
tA=DegFar(form.a.value,"degC")
}else{
tA=form.a.value
}
tUnitB=form.TempUnitB.options[form.TempUnitB.selectedIndex].value
if(tUnitB=="degF"){
tB=DegFar(form.b.value,"degC")
}else{
tB=form.b.value
}
if(VALUE=="A"){if((tA<-112)||(tA>20)){area="XX";alert("Температура вне пределов измерения.\r\rВведите значение в пределах: \r\rот -112 до 20 град.C \r\rот -170 до 68 град.F")}}
if(VALUE=="B"){if((tB<-112)||(tB>20)){area="XX";alert("Температура вне пределов измерения.\r\rВведите значение в пределах: \r\rот-112 до 20 град.C \r\rот -170 до 68 град.F")}}
if(VALUE=="C"){if((form.c.value<0.001)||(form.c.value>23000)){area="XX";alert("ppm по объему вне пределов измерения.\r\rВведите значение в пределах: \r\r0.001 - 23000")}}
if(VALUE=="D"){if((form.d.value<0.001)||(form.d.value>23000)){area="XX";alert("ppm по весу вне пределов измерения.\r\rВведите значение в пределах: \r\r0.001 - 23000")}}
if(VALUE=="E"){if((form.e.value<0.001)||(form.e.value>17.6)){area="XX";alert("Абсолютная влажность (g/m3) вне пределов измерения.\r\rВведите значение в пределах: \r\r0.001 - 17.6")}}
if(VALUE=="F"){if((form.f.value<0.001)||(form.f.value>1096)){area="XX";alert("Абсолютная влажность (lb/MMSCF) вне пределов измерения.\r\rВведите значение в пределах: \r\r0.001 - 1096")}}
if(confirmAction==true){Calc(form,area)}
}
}
//************************
// PUT RESULTS INTO TABLE
//************************
function IAmDone(form,a,b,c,d,e,f){
//alert(a+"\r"+b+"\r"+c+"\r"+d+"\r"+e+"\r"+f)
form.a.value=decimal(a,1)
//if((a>-112)&(a<20)){form.a.value=decimal(a,1)}
//else{if(a<-112){form.a.value="<112"}if(a>20){form.a.value=">20"}}
form.TempUnitA.selectedIndex=0
form.b.value=decimal(b,1)
//if((b>-112)&(b<20)){form.b.value=decimal(b,1)}
//else{if(b<-112){form.b.value="<112"}if(b>20){form.b.value=">20"}}
form.TempUnitB.selectedIndex=0
if((c>=0.001)&(c<0.01)){form.c.value=decimal(c,3)}
if((c>=0.01)&(c<1)){form.c.value=decimal(c,2)}
if((c>=1)&(c<10)){form.c.value=decimal(c,1)}
if((c>=10)&(c<=23000)){form.c.value=decimal(c,0)}
if(c<0.001){form.c.value="<0.001"}
if(c>23000){form.c.value=">23000"}
if((d>=0.001)&(d<0.01)){form.d.value=decimal(d,3)}
if((d>=0.01)&(d<1)){form.d.value=decimal(d,2)}
if((d>=1)&(d<10)){form.d.value=decimal(d,1)}
if((d>=10)&(d<=23000)){form.d.value=decimal(d,0)}
if(d<0.001){form.d.value="<0.001"}
if(d>23000){form.d.value=">23000"}
if((e>=0.001)&(e<0.01)){form.e.value=decimal(e,3)}
if((e>=0.01)&(e<0.1)){form.e.value=decimal(e,2)}
if((e>=0.1)&(e<=17.6)){form.e.value=decimal(e,1)}
if(e<0.001){form.e.value="<0.001"}
if(e>17.6){form.e.value=">17.6"}
if((f>=0.001)&(f<0.01)){form.f.value=decimal(f,3)}
if((f>=0.01)&(f<0.1)){form.f.value=decimal(f,2)}
if((f>=0.1)&(f<100)){form.f.value=decimal(f,1)}
if((f>=100)&(f<1096)){form.f.value=decimal(f,0)}
if(f<0.001){form.f.value="<0.001"}
if(f>1096){form.f.value=">1096"}
}
//************************
// DO THE CALCULATIONS
//************************
function Calc(form,area){
// AREA1 ********************************
if(area=="AREA1"){
pUnit=form.UnitOfP.options[form.UnitOfP.selectedIndex].value
tUnit=form.TempUnitA.options[form.TempUnitA.selectedIndex].value
pValue=ValueCheck(form.P1.value,"NONE")
tValue=ValueCheck(form.a.value,"Atmospheric Dewpoint Temperature")
if (typeof tValue!="string"){
if (tUnit=="degF"){
tValue=DegFar(tValue,"degC")
}
if (tValue>0){
vp2=Math.exp(Math.log(611.2) + (17.62*tValue)/(243.12+tValue))
}
else{
vp2=Math.exp(Math.log(611.2) + 22.46*tValue/(272.62+tValue))
}
if(typeof pValue=="string"){
Pascals=101325
form.P1.value=1
form.UnitOfP.selectedIndex=0
}
else{
Pascals=ToPascals(pUnit,pValue)
}
vp=vp2 * Pascals/101325
if (vp>611.2){
b=(243.12*Math.log(vp/611.2))/(17.62-Math.log(vp/611.2))
}
else{
b=(272.62*Math.log(vp/611.2))/(22.46-Math.log(vp/611.2))
}
c=(1000000*vp2)/101325
if(form.Gas.options[form.Gas.selectedIndex].value=="X"){
GasValue=ValueCheck(form.AtomicMass.value,"Molecular Weight")
if(typeof GasValue=="string"){
GasValue=29
form.AtomicMass.value=29
form.Gas.selectedIndex=0
}
}
else{
GasValue=form.Gas.options[form.Gas.selectedIndex].value
}
//d=(c*GasValue)/18
d=c*(18/GasValue)
e=(18.02*vp2)/2400.344
f=e*62.4219
a=tValue
IAmDone(form,a,b,c,d,e,f)
}
}
// AREA2 ********************************
if(area=="AREA2"){
pUnit=form.UnitOfP.options[form.UnitOfP.selectedIndex].value
tUnit=form.TempUnitB.options[form.TempUnitB.selectedIndex].value
pValue=ValueCheck(form.P1.value,"NONE")
tValue=ValueCheck(form.b.value,"Pressure Dewpoint Temperature")
if (typeof tValue!="string"){
if (tUnit=="degF"){
tValue=DegFar(tValue,"degC")
}
if (tValue>0){
vp2=Math.exp(Math.log(611.2) + (17.62*tValue)/(243.12+tValue))
}
else{
vp2=Math.exp(Math.log(611.2) + 22.46*tValue/(272.62+tValue))
}
if(typeof pValue=="string"){
Pascals=101325
form.P1.value=1
form.UnitOfP.selectedIndex=0
}
else{
Pascals=ToPascals(pUnit,pValue)
}
vp=vp2 * 101325/Pascals
if (vp>611.2){
a=(243.12*Math.log(vp/611.2))/(17.62-Math.log(vp/611.2))
}
else{
a=(272.62*Math.log(vp/611.2))/(22.46-Math.log(vp/611.2))
}
c=(1000000*vp)/101325
if(form.Gas.options[form.Gas.selectedIndex].value=="X"){
GasValue=ValueCheck(form.AtomicMass.value,"Molecular Weight")
if(typeof GasValue=="string"){
GasValue=29
form.AtomicMass.value=29
form.Gas.selectedIndex=0
}
}
else{
GasValue=form.Gas.options[form.Gas.selectedIndex].value
}
//d=(c*GasValue)/18
d=c*(18/GasValue)
e=(18.02*vp)/2400.344
f=e*62.4219
b=tValue
IAmDone(form,a,b,c,d,e,f)
}
}
// AREA3 ********************************
if(area=="AREA3"){
c="X";	d="X";	e="X";	f="X"
vp=0
pUnit=form.UnitOfP.options[form.UnitOfP.selectedIndex].value
pValue=ValueCheck(form.P1.value,"NONE")
if(form.Gas.options[form.Gas.selectedIndex].value=="X"){
GasValue=ValueCheck(form.AtomicMass.value,"Molecular Weight")
if(typeof GasValue=="string"){
GasValue=29
form.AtomicMass.value=29
form.Gas.selectedIndex=0
}
}
else{
GasValue=form.Gas.options[form.Gas.selectedIndex].value
}
if(form.c.value.length=="" && form.d.value.length=="" && form.e.value.length=="" && form.f.value.length==""){
alert("Please enter a value into one of the four humidity fields")
}
if(form.c.value.length>0){c=ValueCheck(form.c.value,"Parts per million volume (v)")}
if(form.d.value.length>0){d=ValueCheck(form.d.value,"Parts per million mass (w)")}
if(form.e.value.length>0){e=ValueCheck(form.e.value,"Absolute humidity (g/m3)")}
if(form.f.value.length>0){f=ValueCheck(form.f.value,"Absolute humidity (lb/MMSCF)")}
//typeof Value=="string"
if (typeof c !="string"){vp=(c*101325)/1000000}
if (typeof d !="string"){c=(d*GasValue)/18;vp=(c*101325)/1000000}
if (typeof e !="string"){vp=(e*2400.344)/18.02}
if (typeof f !="string"){vp=((f/62.4219)*2400.344)/18.02}
if(vp!=0){
c=(1000000*vp)/101325
//d=(c*18)/GasValue
d=c*(18/GasValue)
e=(18.02*vp)/2400.344
f=e*62.4219
if (vp>611.2){
a=(243.12*Math.log(vp/611.2))/(17.62-Math.log(vp/611.2))
}
else{
a=(272.62*Math.log(vp/611.2))/(22.46-Math.log(vp/611.2))
}
if(typeof pValue=="string"){
Pascals=101325
form.P1.value=1
form.UnitOfP.selectedIndex=0
}
else{
Pascals=ToPascals(pUnit,pValue)
}
vp2=vp * Pascals/101325
if (vp2>611.2){
b=(243.12*Math.log(vp2/611.2))/(17.62-Math.log(vp2/611.2))
}
else{
b=(272.62*Math.log(vp2/611.2))/(22.46-Math.log(vp2/611.2))
}
form.TempUnitA.selectedIndex=0
form.TempUnitB.selectedIndex=0
IAmDone(form,a,b,c,d,e,f)
}
}
AtomicValue = form.Gas.options[form.Gas.selectedIndex].value
if(AtomicValue != "X"){
form.AtomicMass.value = AtomicValue
}
}
//************************
// SHOW INSTRUCTIONS
//************************
function Instructions(){
InstructString="ИНСТРУКЦИЯ \r\rПожалуйста, заполните одно из двух полей точки росы, выбрав систему измерений или одно из четырех абсолютных значений перед нажатием кнопки калькуляции. Данные «Давление в линии» и «Тип газа» необходимы, если необходимо просчитать значение  точки росы при заданном давлении в линии и ppm по весу."
alert(InstructString)
}
//*********************************************************
// end hiding -->

