diff --git a/index.html b/index.html
index f91c8a4..5b8eccb 100644
--- a/index.html
+++ b/index.html
@@ -364,58 +364,60 @@
}
function getMoonPosition(now, moonTimes) {
- var rise = moonTimes.rise;
- var set = moonTimes.set;
+ try {
+ var rise = moonTimes.rise;
+ var set = moonTimes.set;
- if (!rise || !set) {
- return { point: pointOnCircle(now, MOON_ORBIT_RADIUS), isVisible: false };
- }
-
- // Determine if moon is visible (above horizon)
- var isVisible;
- if (rise <= set) {
- isVisible = (now >= rise && now <= set);
- } else {
- isVisible = (now >= rise || now <= set);
- }
-
- if (!isVisible) {
- // Below horizon - position based on current time (grayed out)
- return { point: pointOnCircle(now, MOON_ORBIT_RADIUS), isVisible: false };
- }
-
- // Above horizon - interpolate between moonrise and moonset
- var riseAngle = angleForTime(rise);
- var setAngle = angleForTime(set);
-
- // Calculate the angular difference (could be negative if crossing midnight)
- var diff = setAngle - riseAngle;
- // Normalize so we take the "shorter" path that matches the moon arc
- if (diff > Math.PI) diff -= 2 * Math.PI;
- if (diff < -Math.PI) diff += 2 * Math.PI;
-
- // Calculate progress (0 at rise, 1 at set)
- var progress;
- if (rise <= set) {
- progress = (now.getTime() - rise.getTime()) / (set.getTime() - rise.getTime());
- } else {
- if (now >= rise) {
- var endMs = set.getTime() + 24 * 3600 * 1000;
- progress = (now.getTime() - rise.getTime()) / (endMs - rise.getTime());
- } else {
- progress = (now.getTime() + 24 * 3600 * 1000 - rise.getTime()) /
- (set.getTime() + 24 * 3600 * 1000 - rise.getTime());
+ if (!rise || !set) {
+ return { point: pointOnCircle(now, MOON_ORBIT_RADIUS), isVisible: false };
}
- }
- var moonAngle = riseAngle + diff * progress;
- return {
- point: {
- x: 100 + Math.cos(moonAngle) * MOON_ORBIT_RADIUS,
- y: 100 + Math.sin(moonAngle) * MOON_ORBIT_RADIUS
- },
- isVisible: true
- };
+ // Determine if moon is visible (above horizon)
+ var isVisible;
+ if (rise <= set) {
+ isVisible = (now >= rise && now <= set);
+ } else {
+ isVisible = (now >= rise || now <= set);
+ }
+
+ if (!isVisible) {
+ return { point: pointOnCircle(now, MOON_ORBIT_RADIUS), isVisible: false };
+ }
+
+ // Above horizon - interpolate between moonrise and moonset
+ var riseAngle = angleForTime(rise);
+ var setAngle = angleForTime(set);
+
+ // Calculate the angular difference (could be negative if crossing midnight)
+ var diff = setAngle - riseAngle;
+ if (diff > Math.PI) diff -= 2 * Math.PI;
+ if (diff < -Math.PI) diff += 2 * Math.PI;
+
+ // Calculate progress (0 at rise, 1 at set)
+ var progress;
+ if (rise <= set) {
+ progress = (now.getTime() - rise.getTime()) / (set.getTime() - rise.getTime());
+ } else {
+ if (now >= rise) {
+ var endMs = set.getTime() + 24 * 3600 * 1000;
+ progress = (now.getTime() - rise.getTime()) / (endMs - rise.getTime());
+ } else {
+ progress = (now.getTime() + 24 * 3600 * 1000 - rise.getTime()) /
+ (set.getTime() + 24 * 3600 * 1000 - rise.getTime());
+ }
+ }
+
+ var moonAngle = riseAngle + diff * progress;
+ return {
+ point: {
+ x: 100 + Math.cos(moonAngle) * MOON_ORBIT_RADIUS,
+ y: 100 + Math.sin(moonAngle) * MOON_ORBIT_RADIUS
+ },
+ isVisible: true
+ };
+ } catch (e) {
+ return { point: pointOnCircle(now, MOON_ORBIT_RADIUS), isVisible: false };
+ }
}
function renderMoonPhaseIcon(phase) {
@@ -538,8 +540,15 @@
// Moon position - interpolated between moonrise and moonset on the orbit
var moonPos = getMoonPosition(now, moonTimes);
- rpgMoon.setAttribute('transform', 'translate(' + moonPos.point.x + ', ' + moonPos.point.y + ')');
- rpgMoon.setAttribute('opacity', moonPos.isVisible ? '1' : '0.35');
+ if (!moonPos || !moonPos.point || isNaN(moonPos.point.x) || isNaN(moonPos.point.y)) {
+ // Fallback to current time position
+ var fallbackP = pointOnCircle(now, MOON_ORBIT_RADIUS);
+ rpgMoon.setAttribute('transform', 'translate(' + fallbackP.x + ', ' + fallbackP.y + ')');
+ rpgMoon.setAttribute('opacity', '0.35');
+ } else {
+ rpgMoon.setAttribute('transform', 'translate(' + moonPos.point.x + ', ' + moonPos.point.y + ')');
+ rpgMoon.setAttribute('opacity', moonPos.isVisible ? '1' : '0.35');
+ }
// Sun rise/set arrows
var srP = pointOnCircle(sunTimes.sunrise, SUN_ORBIT_RADIUS);