/* Functions: event-driven functions: - onLoadBody () when html-body is loaded - onChangeTabCalculation () when activating the calculation bar - onChangeCalculationItem () when changing the item to be calculated in sink-rate-dialog - onChangeItem () when changing editable items in sink-rate-dialog - onChangeUnits () when changing editable units in ?-dialog - onChangeProperties () when changing properties in ?-dialog - onChangeShowAircraftInfos () when selecting an other aircraft to show its infos internal functions: - setObjectVariables () set the calculation input-object-variables - setCalculationDefault () determine option-group-field that should be calculated - setConnotationHeadline () display connotation h2 as sub navigation - setConnotationHeadlineLinks () set connotation headline links (only called, when they have been conversted into html links) - setFocusToCalculationElement () set focus to most edited field - clearCssClassOfInputFields () removes css-class from all input fields except the one to be calculated - clearCssClassOfInputField () removes css-class from the given input field - calculateDefaultItem () calculate default item - calculateItem () calculate given item - convertTimeToHMM () converts numeric value to time in h:mm-format calculation functions: - calculateDistance () calculate distance in nm - calculateHeight () calculate height in hundreds of feet - calculateSpeed () calculate speed in kts - calculateRate () calculate rate in ft / min - calculateDegrees () calculate slope in degrees - calculateTime () calculate time in h:mm */ // CONSTANTS const NUMBER_OF_MINUTES_IN_HOUR = 60; const NAUTIC_MILE_IN_FEET = 6076.12; const METER_IN_FEET = 3.28; const METER_PER_SECOND_IN_KNOTS = 1.94; const KILOMETER_IN_KNOTS = 0.54; const KILOMETER_IN_MILES_PER_HOUR = 0.62; const MILES_PER_HOUR_IN_KNOTS = 0.87; // VARIABLES // html-input-field-objects var objHorizontalDistanceInNauticMiles; var objVerticalDistanceInFeet; var objGroundSpeedInKts; var objRateInFtPerMinute; var objRateInDegrees; var objAmountOfTime; // EVENT-DRIVEN FUNCTIONS function onLoadBody () { setCalculationDefault (); setObjectVariables (); setConnotationHeadline (); } function onChangeTabCalculation () { setFocusToCalculationElement (); calculateDefaultItem (); } function onChangeCalculationItem (item) { var currentCalculationItem = item.value; clearCssClassOfInputFields (currentCalculationItem); document.getElementById(currentCalculationItem).className = "disabled"; document.getElementById(currentCalculationItem).disabled = true; } function onChangeItem (item) { calculateItem (document.calculation_form.calculation_group.value); } function onChangeUnits (item) { var val = 0; var objUnits = document.getElementById("units"); var objInputLeft = document.getElementById("input_left"); var objInputRight = document.getElementById("input_right"); var objLabelLeft = document.getElementById("label_input_left"); var objLabelRight = document.getElementById("label_input_right"); switch (objUnits.value) { case 'm_ft': if (item.id == "input_left") { val = item.value * METER_IN_FEET; objInputRight.value = val.toFixed(0); } else if (item.id == "input_right") { val = item.value / METER_IN_FEET; objInputLeft.value = val.toFixed(0); } else if (item.id == "units") { objLabelLeft.innerHTML = "m"; objInputLeft.value = 0; objInputLeft.step = 100; objLabelRight.innerHTML = "ft"; objInputRight.value = 0; objInputRight.step = 500; } break; case 'm/s_kts': if (item.id == "input_left") { val = item.value * METER_PER_SECOND_IN_KNOTS; objInputRight.value = val.toFixed(0); } else if (item.id == "input_right") { val = item.value / METER_PER_SECOND_IN_KNOTS; objInputLeft.value = val.toFixed(0); } else if (item.id == "units") { objLabelLeft.innerHTML = "m/s"; objInputLeft.value = 0; objInputLeft.step = 1; objLabelRight.innerHTML = "kts"; objInputRight.value = 0; objInputRight.step = 1; } break; case 'kmh_kts': if (item.id == "input_left") { val = item.value * KILOMETER_IN_KNOTS; objInputRight.value = val.toFixed(0); } else if (item.id == "input_right") { val = item.value / KILOMETER_IN_KNOTS; objInputLeft.value = val.toFixed(0); } else if (item.id == "units") { objLabelLeft.innerHTML = "km/h"; objInputLeft.value = 0; objInputLeft.step = 10; objLabelRight.innerHTML = "kts"; objInputRight.value = 0; objInputRight.step = 10; } break; case 'kmh_mph': if (item.id == "input_left") { val = item.value * KILOMETER_IN_MILES_PER_HOUR; objInputRight.value = val.toFixed(0); } else if (item.id == "input_right") { val = item.value / KILOMETER_IN_MILES_PER_HOUR; objInputLeft.value = val.toFixed(0); } else if (item.id == "units") { objLabelLeft.innerHTML = "km/h"; objInputLeft.value = 0; objInputLeft.step = 10; objLabelRight.innerHTML = "mph"; objInputRight.value = 0; objInputRight.step = 10; } break; case 'mph_kts': if (item.id == "input_left") { val = item.value * MILES_PER_HOUR_IN_KNOTS; objInputRight.value = val.toFixed(0); } else if (item.id == "input_right") { val = item.value / MILES_PER_HOUR_IN_KNOTS; objInputLeft.value = val.toFixed(0); } else if (item.id == "units") { objLabelLeft.innerHTML = "mph"; objInputLeft.value = 0; objInputLeft.step = 10; objLabelRight.innerHTML = "kts"; objInputRight.value = 0; objInputRight.step = 10; } break; case 'km_nm': if (item.id == "input_left") { val = item.value * KILOMETER_IN_KNOTS; objInputRight.value = val.toFixed(0); } else if (item.id == "input_right") { val = item.value / KILOMETER_IN_KNOTS; objInputLeft.value = val.toFixed(0); } else if (item.id == "units") { objLabelLeft.innerHTML = "km"; objInputLeft.value = 0; objInputLeft.step = 10; objLabelRight.innerHTML = "nm"; objInputRight.value = 0; objInputRight.step = 10; } break; } } function onChangeProperties (item) { var objTableDiv = document.getElementById("property_table"); switch (item.value) { case 'default': objTableDiv.innerHTML = ""; break; case 'rw_departure': objTableDiv.innerHTML = "
Volocopter Volocity | no data | ft |
Wright Flyer | no data | ft ft |
Zlin Savage Carbon | 200 100 | ft ft |
Zlin Savage Shock Ultra | 200 100 | ft ft |
Zlin Savage Cub | 400 250 | ft ft |
Pitts Special | 500 | ft |
DHC-2 Beaver | 560 | ft |
Icon A5 | 590 450 | ft ft |
Cub Crafters XCub | 600 280 | ft ft |
Cub Crafters NXCub | 600 150 | ft ft |
JMB VL-3 915 | 600 420 | ft ft |
Extra 330 LT | 1000 700 | ft ft |
Whittaker MW6 | 1000 700 | ft ft |
Pipistrel Virus SW 121 | 1050 525 | ft ft |
Diamond Aircraft DV20 | 1100 | ft |
Diamond Aircraft DA40 TDI | 1200 950 | ft ft |
Diamond Aircraft DA40 NG | 1300 990 | ft ft |
Cessna 152 | 1385 750 | ft ft |
Ryan Spirit Of St. Louis NYP | 1500 | ft |
Curtiss JN-4D | 1500 | ft |
Cessna 172 Skyhawk | 1525 865 | ft ft |
Cirrus SR22 | 1593 1082 | ft ft |
Douglas DC-3 S | 1600 900 | ft ft |
Robin Regent DR400-180 | 2000 1034 | ft ft |
Cessna 208B Grand Caravan EX | 2160 1400 | ft ft |
Beechcraft Bonanza G36 | 2180 1300 | ft ft |
Beechcraft Baron G58 | 2345 1373 | ft ft |
Daher TBM 930 | 2380 1800 | ft ft |
Diamond Aircraft DA62 | 2897 1574 | ft ft |
Rutan Boomerang | 3000 | ft |
Beechcraft King Air 350i | 3300 | ft |
Cessna CJ4 Citation | 4000 5000 | ft ft |
Cessna Citation Longitude | 4810 | ft |
Volocopter Volocity | no data | ft |
Wright Flyer | no data | ft ft |
Zlin Savage Carbon | 200 15 15 | ft ft kts |
Zlin Savage Shock Ultra | 200 58 16 | ft ft kts |
Zlin Savage Cub | 400 200 15 | ft ft kts |
DHC-2 Beaver | 500 10 | ft kts |
Cub Crafters XCub | 500 170 11 | ft ft kts |
Cub Crafters NXCub | 500 150 11 | ft ft kts |
Icon A5 | 530 450 12 | ft ft kts |
JMB VL-3 915 | 600 420 10 | ft ft kts |
Diamond Aircraft DV20 | 750 15 | ft kts |
Whittaker MW6 | 800 300 | ft ft |
Diamond Aircraft DA40 TDI | 942 850 20 | ft ft kts |
Extra 330 LT | 1000 500 15 | ft ft kts |
Diamond Aircraft DA40 NG | 1040 890 20 | ft ft kts |
Pipistrel Virus SW 121 | 1050 525 18 | ft ft kts |
Cessna 152 | 1075 500 15 | ft ft kts |
Cessna 172 Skyhawk | 1250 520 17 | ft ft kts |
Pitts Special | 1500 17 | ft kts |
Curtiss JN-4D | 1500 10 | ft kts |
Douglas DC-3 S | 1600 15 | ft kts |
Beechcraft Bonanza G36 | 1700 920 17 | ft ft kts |
Robin Regent DR400-180 | 1740 820 22 | ft ft kts |
Cessna 208B Grand Caravan EX | 1850 1000 20 | ft ft kts |
Ryan Spirit Of St. Louis NYP | 2000 | ft |
Cirrus SR22 | 2343 1178 21 | ft ft kts |
Daher TBM 930 | 2430 1300 20 | ft ft kts |
Beechcraft Baron G58 | 2490 1440 22 | ft ft kts |
Diamond Aircraft DA62 | 2556 1447 25 | ft ft kts |
Beechcraft King Air 350i | 2700 20 | ft kts |
Cessna CJ4 Citation | 3000 19 | ft kts |
Cessna Citation Longitude | 3170 25 | ft kts |
Rutan Boomerang | 3200 1500 25 | ft ft kts |
Cessna CJ4 Citation | no data | KIAS |
Beechcraft King Air 350i | no data | KIAS |
Cessna Citation Longitude | no data | KIAS |
Wright Flyer | 22 | mph |
Curtiss JN-4D | 52 | kts |
Volocopter Volocity | 54 | kts |
Whittaker MW6 | 55 | mph |
Icon A5 | 84 | KTAS |
Ryan Spirit Of St. Louis NYP | 100 | mph |
Cessna 152 | 107 | KIAS |
Zlin Savage Carbon | 110 | kts |
Diamond Aircraft DV20 | 117 | KIAS |
Pipistrel Virus SW 121 | 120 | KIAS |
Cessna 172 Skyhawk | 122 | KIAS |
Diamond Aircraft DA40 NG | 125 | KIAS |
Cub Crafters NXCub | 126 | KIAS |
Cub Crafters XCub | 126 | KIAS |
Diamond Aircraft DA40 TDI | 129 | KIAS |
Pitts Special | 137 | mph |
Zlin Savage Shock Ultra | 140 | IAS |
JMB VL-3 915 | 153 | KIAS |
DHC-2 Beaver | 156 | mph |
Beechcraft Baron G58 | 163 | KIAS |
Cessna 208B Grand Caravan EX | 164 | KIAS |
Zlin Savage Cub | 165 | IAS |
Cirrus SR22 | 170 | KIAS |
Diamond Aircraft DA62 | 171 | KIAS |
Extra 330 LT | 173 | KIAS |
Beechcraft Bonanza G36 | 174 | KIAS |
Douglas DC-3 S | 204 | mph |
Rutan Boomerang | 220 | KIAS |
Daher TBM 930 | 252 | KIAS |
Robin Regent DR400-180 | 254 | km/h |
Whittaker MW6 | no data | ft |
Wright Flyer | 30 | ft |
Volocopter Volocity | 6500 | ft |
Curtiss JN-4D | 6500 | ft |
Diamond Aircraft DV20 | 13120 | ft |
Cessna 172 Skyhawk | 13500 | ft |
Cub Crafters XCub | 14000 | ft |
Cub Crafters NXCub | 14000 | ft |
Zlin Savage Cub | 14400 | ft |
Cessna 152 | 14700 | ft |
Icon A5 | 15000 | ft |
Robin Regent DR400-180 | 15500 | ft |
Zlin Savage Shock Ultra | 15750 | ft |
Extra 330 LT | 16000 | ft |
Ryan Spirit Of St. Louis NYP | 16400 | ft |
Diamond Aircraft DA40 NG | 16400 | ft |
Diamond Aircraft DA40 TDI | 16400 | ft |
Cirrus SR22 | 17500 | ft |
Pipistrel Virus SW 121 | 18000 | ft |
Zlin Savage Carbon | 18000 | ft |
DHC-2 Beaver | 18000 | ft |
Beechcraft Bonanza G36 | 18500 | ft |
JMB VL-3 915 | 20000 | ft |
Diamond Aircraft DA62 | 20000 | ft |
Pitts Special | 20000 | ft |
Beechcraft Baron G58 | 20000 | ft |
Cessna 208B Grand Caravan EX | 20000 | ft |
Douglas DC-3 S | 20800 | ft |
Rutan Boomerang | 22000 | ft |
Daher TBM 930 | 31000 | ft |
Beechcraft King Air 350i | 35000 | ft |
Cessna Citation Longitude | 45000 | ft |
Cessna CJ4 Citation | 45000 28000 | ft ft |
Wright Flyer | no data | nm |
Whittaker MW6 | no data | nm |
Volocopter Volocity | 20 | nm |
Curtiss JN-4D | 135 | nm |
Pitts Special | 277 | nm |
Extra 330 LT | 350 | nm |
DHC-2 Beaver | 395 | nm |
Zlin Savage Carbon | 400 | nm |
Cessna 152 | 415 | nm |
Icon A5 | 427 | nm |
Zlin Savage Shock Ultra | 598 | km |
Diamond Aircraft DV20 | 629 | nm |
Pipistrel Virus SW 121 | 642 | nm |
Cirrus SR22 | 659 | nm |
Diamond Aircraft DA40 NG | 675 | nm |
Cessna 172 Skyhawk | 696 | nm |
Cub Crafters NXCub | 700 | nm |
Zlin Savage Cub | 700 | km |
Cub Crafters XCub | 700 | nm |
Diamond Aircraft DA40 TDI | 741 | nm |
Robin Regent DR400-180 | 790 | nm |
JMB VL-3 915 | 800 | nm |
Beechcraft Bonanza G36 | 820 | nm |
Beechcraft Baron G58 | 942 | nm |
Cessna 208B Grand Caravan EX | 1052 | nm |
Diamond Aircraft DA62 | 1290 | nm |
Daher TBM 930 | 1440 1730 | nm nm |
Beechcraft King Air 350i | 1500 1800 | nm nm |
Rutan Boomerang | 2053 | nm |
Cessna CJ4 Citation | 2140 | nm |
Douglas DC-3 S | 2500 3000 | nm nm |
Cessna Citation Longitude | 3500 | nm |
Ryan Spirit Of St. Louis NYP | 3600 | nm |
unknown value '" + item.value + "'.
"; break; } } function onChangeShowAircraftInfos (item) { window.location.href = "?aircraft=" + item.value; } // INTERNAL FUNCTIONS function setObjectVariables () { objHorizontalDistanceInNauticMiles = document.getElementById('distance-in-nm'); objVerticalDistanceInFeet = document.getElementById('height-difference-in-ft'); objGroundSpeedInKts = document.getElementById('speed-in-kts'); objRateInFtPerMinute = document.getElementById('rate-in-ft-per-min'); objRateInDegrees = document.getElementById('rate-in-degrees'); objAmountOfTime = document.getElementById('time-in-hmm'); } function setCalculationDefault () { calculationDefaultItem = 'distance-in-nm'; // option-group-value of the element that should be calculated by default document.calculation_form.calculation_group.value = calculationDefaultItem; // set input-field properties via css-class: border and background-color document.getElementById(calculationDefaultItem).className = "disabled"; document.getElementById(calculationDefaultItem).disabled = true; } function setConnotationHeadline () { var s = ''; var sHeadline = document.getElementById('connotations').innerHTML; var objCommonSpecialsPreparings = document.getElementById('common-specials-preparings'); var objCommonSpecialsBeforeTakeOff = document.getElementById('common-specials-before-take-off'); var objCommonSpecialsAfterTakeOff = document.getElementById('common-specials-after-take-off'); var objCommonSpecialsAutopilot = document.getElementById('common-specials-autopilot'); var objCommonSpecialsCutOff = document.getElementById('common-specials-cut-off'); // check additional common-specials for transforming the connotation-headline into a html-link if (objCommonSpecialsPreparings || objCommonSpecialsBeforeTakeOff || objCommonSpecialsAfterTakeOff || objCommonSpecialsAutopilot || objCommonSpecialsCutOff) sHeadline = '' + sHeadline + ''; // check additional common-specials for extending the connotations-headline if (objCommonSpecialsPreparings) s = s + ' / preparings'; if (objCommonSpecialsBeforeTakeOff) s = s + ' / < take-off'; if (objCommonSpecialsAfterTakeOff) s = s + ' / > take-off'; if (objCommonSpecialsAutopilot) s = s + ' / autopilot'; if (objCommonSpecialsCutOff) s = s + ' / cut-off'; // returning connotations-headline with html links if (s) document.getElementById('connotations').innerHTML = sHeadline + s; } function setConnotationHeadlineLinks (obj) { var clickedLinkText = obj.innerHTML; var connotations = document.getElementById('connotations'); for (var link=connotations.firstChild; link; link=link.nextSibling) { // loop through the html links inside the extended connotation headline, setting headline links and hiding/displaying according content if (link.tagName == 'A') { if (clickedLinkText == link.innerHTML) { link.style.color = 'black'; document.getElementById(link.name).style.display = 'block'; } else { link.style.color = 'grey'; document.getElementById(link.name).style.display = 'none'; } } } } function setFocusToCalculationElement () { // set focus to the calculation element as given in the ini-file document.getElementById('height-difference-in-ft').focus(); } function clearCssClassOfInputFields (currentCalculationItem) { clearCssClassOfInputField (currentCalculationItem, 'distance-in-nm'); clearCssClassOfInputField (currentCalculationItem, 'height-difference-in-ft'); clearCssClassOfInputField (currentCalculationItem, 'speed-in-kts'); clearCssClassOfInputField (currentCalculationItem, 'rate-in-ft-per-min'); } function clearCssClassOfInputField (currentCalculationItem, item) { if (currentCalculationItem != item) { document.getElementById (item).className = ''; document.getElementById (item).disabled = false; } } function calculateDefaultItem () { calculateItem ('distance-in-nm'); } function calculateItem (itemHtmlId) { switch (itemHtmlId) { case 'distance-in-nm': calculateDistance (); break; case 'height-difference-in-ft': calculateHeight (); break; case 'speed-in-kts': calculateSpeed (); break; case 'rate-in-ft-per-min': calculateRate (); break; default: calculateItem ('distance-in-nm'); } calculateDegrees (); calculateTime (); } function convertTimeToHMM (num) { num = parseInt (num); var hours = Math.floor (num / NUMBER_OF_MINUTES_IN_HOUR); var minutes = num % NUMBER_OF_MINUTES_IN_HOUR; minutes = minutes.toString (); return hours + ":" + minutes.padStart (2, '0'); } // CALCULATION FUNCTIONS function calculateDistance () { var distance = parseInt (objGroundSpeedInKts.value) * parseInt (objVerticalDistanceInFeet.value) / parseInt (objRateInFtPerMinute.value) / NUMBER_OF_MINUTES_IN_HOUR; if (Number.isInteger(distance)) objHorizontalDistanceInNauticMiles.value = distance; else { distance = distance.toFixed(1); objHorizontalDistanceInNauticMiles.value = distance; } } function calculateHeight () { var height = parseFloat (objHorizontalDistanceInNauticMiles.value) / parseInt (objGroundSpeedInKts.value) * parseInt (objRateInFtPerMinute.value) * NUMBER_OF_MINUTES_IN_HOUR; var heightInHundreds = height / 100; heightInHundreds = heightInHundreds.toFixed(0); height = heightInHundreds * 100; objVerticalDistanceInFeet.value = height; } function calculateSpeed () { var speed = parseFloat (objHorizontalDistanceInNauticMiles.value) / parseInt (objVerticalDistanceInFeet.value) * parseInt (objRateInFtPerMinute.value) * NUMBER_OF_MINUTES_IN_HOUR; objGroundSpeedInKts.value = speed.toFixed(0); } function calculateRate () { var rate = parseInt (objGroundSpeedInKts.value) / NUMBER_OF_MINUTES_IN_HOUR / parseFloat (objHorizontalDistanceInNauticMiles.value) * parseInt (objVerticalDistanceInFeet.value); objRateInFtPerMinute.value = rate.toFixed(0); } function calculateDegrees () { var horizontalDistance = parseFloat (objHorizontalDistanceInNauticMiles.value) * NAUTIC_MILE_IN_FEET; var verticalDistance = parseInt (objVerticalDistanceInFeet.value); var gradientInPercent = verticalDistance / horizontalDistance; var gradientInDegree = Math.atan (gradientInPercent) * 180 / Math.PI; objRateInDegrees.value = gradientInDegree.toFixed(1); } function calculateTime () { var horizontalDistance = parseFloat (objHorizontalDistanceInNauticMiles.value); var groundSpeed = parseInt (objGroundSpeedInKts.value); objAmountOfTime.value = convertTimeToHMM (horizontalDistance / groundSpeed * NUMBER_OF_MINUTES_IN_HOUR); }