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 };