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