1 const paMacros = require('./pa-macros.js'); 2 const paTypes = require('./pa-types.js'); 3 const paUtils = require('./pa-utils.js'); 4 5 /** 6 * Determine if a lunar eclipse is likely to occur. 7 */ 8 function lunarEclipseOccurrence(localDateDay, localDateMonth, localDateYear, isDaylightSaving, zoneCorrectionHours) { 9 var daylightSaving = (isDaylightSaving) ? 1 : 0; 10 11 var julianDateOfFullMoon = paMacros.fullMoon(daylightSaving, zoneCorrectionHours, localDateDay, localDateMonth, localDateYear); 12 13 var gDateOfFullMoonDay = paMacros.julianDateDay(julianDateOfFullMoon); 14 var integerDay = Math.floor(gDateOfFullMoonDay); 15 var gDateOfFullMoonMonth = paMacros.julianDateMonth(julianDateOfFullMoon); 16 var gDateOfFullMoonYear = paMacros.julianDateYear(julianDateOfFullMoon); 17 var utOfFullMoonHours = gDateOfFullMoonDay - integerDay; 18 19 var localCivilDateDay = paMacros.universalTime_LocalCivilDay(utOfFullMoonHours, 0.0, 0.0, daylightSaving, zoneCorrectionHours, integerDay, gDateOfFullMoonMonth, gDateOfFullMoonYear); 20 var localCivilDateMonth = paMacros.universalTime_LocalCivilMonth(utOfFullMoonHours, 0.0, 0.0, daylightSaving, zoneCorrectionHours, integerDay, gDateOfFullMoonMonth, gDateOfFullMoonYear); 21 var localCivilDateYear = paMacros.universalTime_LocalCivilYear(utOfFullMoonHours, 0.0, 0.0, daylightSaving, zoneCorrectionHours, integerDay, gDateOfFullMoonMonth, gDateOfFullMoonYear); 22 23 var eclipseOccurrence = paMacros.lunarEclipseOccurrence(daylightSaving, zoneCorrectionHours, localDateDay, localDateMonth, localDateYear); 24 25 var status = eclipseOccurrence; 26 var eventDateDay = localCivilDateDay; 27 var eventDateMonth = localCivilDateMonth; 28 var eventDateYear = localCivilDateYear; 29 30 return [status, eventDateDay, eventDateMonth, eventDateYear]; 31 } 32 33 /** 34 * Calculate the circumstances of a lunar eclipse. 35 */ 36 function lunarEclipseCircumstances(localDateDay, localDateMonth, localDateYear, isDaylightSaving, zoneCorrectionHours) { 37 var daylightSaving = (isDaylightSaving) ? 1 : 0; 38 39 var julianDateOfFullMoon = paMacros.fullMoon(daylightSaving, zoneCorrectionHours, localDateDay, localDateMonth, localDateYear); 40 var gDateOfFullMoonDay = paMacros.julianDateDay(julianDateOfFullMoon); 41 var integerDay = Math.floor(gDateOfFullMoonDay); 42 var gDateOfFullMoonMonth = paMacros.julianDateMonth(julianDateOfFullMoon); 43 var gDateOfFullMoonYear = paMacros.julianDateYear(julianDateOfFullMoon); 44 var utOfFullMoonHours = gDateOfFullMoonDay - integerDay; 45 46 var localCivilDateDay = paMacros.universalTime_LocalCivilDay(utOfFullMoonHours, 0.0, 0.0, daylightSaving, zoneCorrectionHours, integerDay, gDateOfFullMoonMonth, gDateOfFullMoonYear); 47 var localCivilDateMonth = paMacros.universalTime_LocalCivilMonth(utOfFullMoonHours, 0.0, 0.0, daylightSaving, zoneCorrectionHours, integerDay, gDateOfFullMoonMonth, gDateOfFullMoonYear); 48 var localCivilDateYear = paMacros.universalTime_LocalCivilYear(utOfFullMoonHours, 0.0, 0.0, daylightSaving, zoneCorrectionHours, integerDay, gDateOfFullMoonMonth, gDateOfFullMoonYear); 49 50 var utMaxEclipse = paMacros.utMaxLunarEclipse(localDateDay, localDateMonth, localDateYear, daylightSaving, zoneCorrectionHours); 51 var utFirstContact = paMacros.utFirstContactLunarEclipse(localDateDay, localDateMonth, localDateYear, daylightSaving, zoneCorrectionHours); 52 var utLastContact = paMacros.utLastContactLunarEclipse(localDateDay, localDateMonth, localDateYear, daylightSaving, zoneCorrectionHours); 53 var utStartUmbralPhase = paMacros.utStartUmbraLunarEclipse(localDateDay, localDateMonth, localDateYear, daylightSaving, zoneCorrectionHours); 54 var utEndUmbralPhase = paMacros.utEndUmbraLunarEclipse(localDateDay, localDateMonth, localDateYear, daylightSaving, zoneCorrectionHours); 55 var utStartTotalPhase = paMacros.utStartTotalLunarEclipse(localDateDay, localDateMonth, localDateYear, daylightSaving, zoneCorrectionHours); 56 var utEndTotalPhase = paMacros.utEndTotalLunarEclipse(localDateDay, localDateMonth, localDateYear, daylightSaving, zoneCorrectionHours); 57 58 var eclipseMagnitude1 = paMacros.magLunarEclipse(localDateDay, localDateMonth, localDateYear, daylightSaving, zoneCorrectionHours); 59 60 var lunarEclipseCertainDateDay = localCivilDateDay; 61 var lunarEclipseCertainDateMonth = localCivilDateMonth; 62 var lunarEclipseCertainDateYear = localCivilDateYear; 63 64 var utStartPenPhaseHour = (utFirstContact == -99.0) ? -99.0 : paMacros.decimalHoursHour(utFirstContact + 0.008333); 65 var utStartPenPhaseMinutes = (utFirstContact == -99.0) ? -99.0 : paMacros.decimalHoursMinute(utFirstContact + 0.008333); 66 67 var utStartUmbralPhaseHour = (utStartUmbralPhase == -99.0) ? -99.0 : paMacros.decimalHoursHour(utStartUmbralPhase + 0.008333); 68 var utStartUmbralPhaseMinutes = (utStartUmbralPhase == -99.0) ? -99.0 : paMacros.decimalHoursMinute(utStartUmbralPhase + 0.008333); 69 70 var utStartTotalPhaseHour = (utStartTotalPhase == -99.0) ? -99.0 : paMacros.decimalHoursHour(utStartTotalPhase + 0.008333); 71 var utStartTotalPhaseMinutes = (utStartTotalPhase == -99.0) ? -99.0 : paMacros.decimalHoursMinute(utStartTotalPhase + 0.008333); 72 73 var utMidEclipseHour = (utMaxEclipse == -99.0) ? -99.0 : paMacros.decimalHoursHour(utMaxEclipse + 0.008333); 74 var utMidEclipseMinutes = (utMaxEclipse == -99.0) ? -99.0 : paMacros.decimalHoursMinute(utMaxEclipse + 0.008333); 75 76 var utEndTotalPhaseHour = (utEndTotalPhase == -99.0) ? -99.0 : paMacros.decimalHoursHour(utEndTotalPhase + 0.008333); 77 var utEndTotalPhaseMinutes = (utEndTotalPhase == -99.0) ? -99.0 : paMacros.decimalHoursMinute(utEndTotalPhase + 0.008333); 78 79 var utEndUmbralPhaseHour = (utEndUmbralPhase == -99.0) ? -99.0 : paMacros.decimalHoursHour(utEndUmbralPhase + 0.008333); 80 var utEndUmbralPhaseMinutes = (utEndUmbralPhase == -99.0) ? -99.0 : paMacros.decimalHoursMinute(utEndUmbralPhase + 0.008333); 81 82 var utEndPenPhaseHour = (utLastContact == -99.0) ? -99.0 : paMacros.decimalHoursHour(utLastContact + 0.008333); 83 var utEndPenPhaseMinutes = (utLastContact == -99.0) ? -99.0 : paMacros.decimalHoursMinute(utLastContact + 0.008333); 84 85 var eclipseMagnitude = (eclipseMagnitude1 == -99.0) ? -99.0 : paUtils.round(eclipseMagnitude1, 2); 86 87 return [lunarEclipseCertainDateDay, lunarEclipseCertainDateMonth, lunarEclipseCertainDateYear, utStartPenPhaseHour, utStartPenPhaseMinutes, utStartUmbralPhaseHour, utStartUmbralPhaseMinutes, utStartTotalPhaseHour, utStartTotalPhaseMinutes, utMidEclipseHour, utMidEclipseMinutes, utEndTotalPhaseHour, utEndTotalPhaseMinutes, utEndUmbralPhaseHour, utEndUmbralPhaseMinutes, utEndPenPhaseHour, utEndPenPhaseMinutes, eclipseMagnitude]; 88 } 89 90 /** 91 * Determine if a solar eclipse is likely to occur. 92 */ 93 function solarEclipseOccurrence(localDateDay, localDateMonth, localDateYear, isDaylightSaving, zoneCorrectionHours) { 94 var daylightSaving = (isDaylightSaving) ? 1 : 0; 95 96 var julianDateOfNewMoon = paMacros.newMoon(daylightSaving, zoneCorrectionHours, localDateDay, localDateMonth, localDateYear); 97 var gDateOfNewMoonDay = paMacros.julianDateDay(julianDateOfNewMoon); 98 var integerDay = Math.floor(gDateOfNewMoonDay); 99 var gDateOfNewMoonMonth = paMacros.julianDateMonth(julianDateOfNewMoon); 100 var gDateOfNewMoonYear = paMacros.julianDateYear(julianDateOfNewMoon); 101 var utOfNewMoonHours = gDateOfNewMoonDay - integerDay; 102 103 var localCivilDateDay = paMacros.universalTime_LocalCivilDay(utOfNewMoonHours, 0.0, 0.0, daylightSaving, zoneCorrectionHours, integerDay, gDateOfNewMoonMonth, gDateOfNewMoonYear); 104 var localCivilDateMonth = paMacros.universalTime_LocalCivilMonth(utOfNewMoonHours, 0.0, 0.0, daylightSaving, zoneCorrectionHours, integerDay, gDateOfNewMoonMonth, gDateOfNewMoonYear); 105 var localCivilDateYear = paMacros.universalTime_LocalCivilYear(utOfNewMoonHours, 0.0, 0.0, daylightSaving, zoneCorrectionHours, integerDay, gDateOfNewMoonMonth, gDateOfNewMoonYear); 106 107 var eclipseOccurrence = paMacros.solarEclipseOccurrence(daylightSaving, zoneCorrectionHours, localDateDay, localDateMonth, localDateYear); 108 109 var status = eclipseOccurrence; 110 var eventDateDay = localCivilDateDay; 111 var eventDateMonth = localCivilDateMonth; 112 var eventDateYear = localCivilDateYear; 113 114 return [status, eventDateDay, eventDateMonth, eventDateYear]; 115 } 116 117 /** 118 * Calculate the circumstances of a solar eclipse. 119 */ 120 function solarEclipseCircumstances(localDateDay, localDateMonth, localDateYear, isDaylightSaving, zoneCorrectionHours, geogLongitudeDeg, geogLatitudeDeg) { 121 var daylightSaving = (isDaylightSaving) ? 1 : 0; 122 123 var julianDateOfNewMoon = paMacros.newMoon(daylightSaving, zoneCorrectionHours, localDateDay, localDateMonth, localDateYear); 124 var gDateOfNewMoonDay = paMacros.julianDateDay(julianDateOfNewMoon); 125 var integerDay = Math.floor(gDateOfNewMoonDay); 126 var gDateOfNewMoonMonth = paMacros.julianDateMonth(julianDateOfNewMoon); 127 var gDateOfNewMoonYear = paMacros.julianDateYear(julianDateOfNewMoon); 128 var utOfNewMoonHours = gDateOfNewMoonDay - integerDay; 129 var localCivilDateDay = paMacros.universalTime_LocalCivilDay(utOfNewMoonHours, 0.0, 0.0, daylightSaving, zoneCorrectionHours, integerDay, gDateOfNewMoonMonth, gDateOfNewMoonYear); 130 var localCivilDateMonth = paMacros.universalTime_LocalCivilMonth(utOfNewMoonHours, 0.0, 0.0, daylightSaving, zoneCorrectionHours, integerDay, gDateOfNewMoonMonth, gDateOfNewMoonYear); 131 var localCivilDateYear = paMacros.universalTime_LocalCivilYear(utOfNewMoonHours, 0.0, 0.0, daylightSaving, zoneCorrectionHours, integerDay, gDateOfNewMoonMonth, gDateOfNewMoonYear); 132 133 var utMaxEclipse = paMacros.utMaxSolarEclipse(localDateDay, localDateMonth, localDateYear, daylightSaving, zoneCorrectionHours, geogLongitudeDeg, geogLatitudeDeg); 134 var utFirstContact = paMacros.utFirstContactSolarEclipse(localDateDay, localDateMonth, localDateYear, daylightSaving, zoneCorrectionHours, geogLongitudeDeg, geogLatitudeDeg); 135 var utLastContact = paMacros.utLastContactSolarEclipse(localDateDay, localDateMonth, localDateYear, daylightSaving, zoneCorrectionHours, geogLongitudeDeg, geogLatitudeDeg); 136 var magnitude = paMacros.magSolarEclipse(localDateDay, localDateMonth, localDateYear, daylightSaving, zoneCorrectionHours, geogLongitudeDeg, geogLatitudeDeg); 137 138 var solarEclipseCertainDateDay = localCivilDateDay; 139 var solarEclipseCertainDateMonth = localCivilDateMonth; 140 var solarEclipseCertainDateYear = localCivilDateYear; 141 142 var utFirstContactHour = (utFirstContact == -99.0) ? -99.0 : paMacros.decimalHoursHour(utFirstContact + 0.008333); 143 var utFirstContactMinutes = (utFirstContact == -99.0) ? -99.0 : paMacros.decimalHoursMinute(utFirstContact + 0.008333); 144 145 var utMidEclipseHour = (utMaxEclipse == -99.0) ? -99.0 : paMacros.decimalHoursHour(utMaxEclipse + 0.008333); 146 var utMidEclipseMinutes = (utMaxEclipse == -99.0) ? -99.0 : paMacros.decimalHoursMinute(utMaxEclipse + 0.008333); 147 148 var utLastContactHour = (utLastContact == -99.0) ? -99.0 : paMacros.decimalHoursHour(utLastContact + 0.008333); 149 var utLastContactMinutes = (utLastContact == -99.0) ? -99.0 : paMacros.decimalHoursMinute(utLastContact + 0.008333); 150 151 var eclipseMagnitude = (magnitude == -99.0) ? -99.0 : paUtils.round(magnitude, 3); 152 153 return [solarEclipseCertainDateDay, solarEclipseCertainDateMonth, solarEclipseCertainDateYear, utFirstContactHour, utFirstContactMinutes, utMidEclipseHour, utMidEclipseMinutes, utLastContactHour, utLastContactMinutes, eclipseMagnitude]; 154 } 155 156 157 module.exports = { 158 lunarEclipseOccurrence, 159 lunarEclipseCircumstances, 160 solarEclipseOccurrence, 161 solarEclipseCircumstances 162 };