swisseph-wasm
Version:
High-precision Swiss Ephemeris WebAssembly library for astronomical calculations in JavaScript
830 lines (805 loc) • 44.1 kB
HTML
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Swiss Ephemeris API Explorer</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-50 min-h-screen">
<!-- Header -->
<header class="bg-white border-b border-gray-200">
<div class="container mx-auto px-4 py-6">
<div class="flex items-center justify-between">
<div>
<h1 class="text-2xl font-bold text-gray-900">
Swiss Ephemeris API Explorer
</h1>
</div>
<div class="text-right">
<div id="status" class="text-sm text-gray-500">Loading...</div>
<div id="version" class="text-xs text-gray-400 mt-1"></div>
</div>
</div>
</div>
</header>
<div class="container mx-auto px-4 py-6">
<div class="grid grid-cols-1 lg:grid-cols-4 gap-4">
<!-- Sidebar - Method Categories -->
<div class="lg:col-span-1">
<div class="bg-white rounded border border-gray-200 p-4 sticky top-4">
<h2 class="text-sm font-semibold text-gray-900 mb-3">
Method Categories
</h2>
<div class="space-y-1" id="categories">
<!-- Categories will be populated by JavaScript -->
</div>
</div>
</div>
<!-- Main Content - Method Details -->
<div class="lg:col-span-3">
<!-- Welcome Message -->
<div id="welcome" class="bg-white rounded border border-gray-200 p-6 mb-4">
<h2 class="text-lg font-semibold text-gray-900 mb-2">API Explorer</h2>
<p class="text-sm text-gray-600 mb-4">
Test all Swiss Ephemeris methods. Select a category to begin.
</p>
<div class="grid grid-cols-2 gap-3">
<div class="bg-gray-50 rounded p-3 border border-gray-200 text-center">
<div class="text-2xl font-bold text-gray-900">63</div>
<div class="text-xs text-gray-600">Methods</div>
</div>
<div class="bg-gray-50 rounded p-3 border border-gray-200 text-center">
<div class="text-2xl font-bold text-gray-900">9</div>
<div class="text-xs text-gray-600">Categories</div>
</div>
</div>
</div>
<!-- Method Details Container -->
<div id="methodDetails" class="space-y-4">
<!-- Will be populated by JavaScript -->
</div>
</div>
</div>
</div>
<script type="module">
import SwissEph from '../src/swisseph.js';
let swisseph;
const statusEl = document.getElementById('status');
const versionEl = document.getElementById('version');
const categoriesEl = document.getElementById('categories');
const methodDetailsEl = document.getElementById('methodDetails');
// Method categories with examples - ALL 68 METHODS
const methodCategories = {
'Date & Time (17 methods)': {
methods: [
{
name: 'julday',
description: 'Convert calendar date to Julian Day',
params: [
{ name: 'year', type: 'number', default: 2000 },
{ name: 'month', type: 'number', default: 1 },
{ name: 'day', type: 'number', default: 1 },
{ name: 'hour', type: 'number', default: 12.0 }
],
example: 'swisseph.julday(2000, 1, 1, 12.0)',
expectedResult: '2451545.0'
},
{
name: 'revjul',
description: 'Convert Julian Day to calendar date',
params: [
{ name: 'jd', type: 'number', default: 2451545.0 },
{ name: 'gregflag', type: 'number', default: 1 }
],
example: 'swisseph.revjul(2451545.0, 1)',
expectedResult: '{ year: 2000, month: 1, day: 1, hour: 12.0 }'
},
{
name: 'date_conversion',
description: 'Convert date to Julian Day',
params: [
{ name: 'year', type: 'number', default: 2000 },
{ name: 'month', type: 'number', default: 1 },
{ name: 'day', type: 'number', default: 1 },
{ name: 'hour', type: 'number', default: 12.0 },
{ name: 'cal', type: 'text', default: 'g' }
],
example: 'swisseph.date_conversion(2000, 1, 1, 12.0, "g")',
expectedResult: '2451545.0'
},
{
name: 'utc_to_jd',
description: 'Convert UTC to Julian Day',
params: [
{ name: 'year', type: 'number', default: 2000 },
{ name: 'month', type: 'number', default: 1 },
{ name: 'day', type: 'number', default: 1 },
{ name: 'hour', type: 'number', default: 12 },
{ name: 'min', type: 'number', default: 0 },
{ name: 'sec', type: 'number', default: 0 },
{ name: 'gregflag', type: 'number', default: 1 }
],
example: 'swisseph.utc_to_jd(2000, 1, 1, 12, 0, 0, 1)',
expectedResult: '{ julianDayET, julianDayUT }'
},
{
name: 'jdet_to_utc',
description: 'Convert JD ET to UTC',
params: [
{ name: 'jd_et', type: 'number', default: 2451545.0 },
{ name: 'gregflag', type: 'number', default: 1 }
],
example: 'swisseph.jdet_to_utc(2451545.0, 1)',
expectedResult: '{ year, month, day, hour, min, sec }'
},
{
name: 'jdut1_to_utc',
description: 'Convert JD UT1 to UTC',
params: [
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'gregflag', type: 'number', default: 1 }
],
example: 'swisseph.jdut1_to_utc(2451545.0, 1)',
expectedResult: '{ year, month, day, hour, min, sec }'
},
{
name: 'utc_time_zone',
description: 'Convert UTC with timezone',
params: [
{ name: 'year', type: 'number', default: 2000 },
{ name: 'month', type: 'number', default: 1 },
{ name: 'day', type: 'number', default: 1 },
{ name: 'hour', type: 'number', default: 12 },
{ name: 'min', type: 'number', default: 0 },
{ name: 'sec', type: 'number', default: 0 },
{ name: 'timezone', type: 'number', default: 1.0 }
],
example: 'swisseph.utc_time_zone(2000, 1, 1, 12, 0, 0, 1.0)',
expectedResult: '{ year, month, day, hour, min, sec }'
},
{
name: 'deltat',
description: 'Calculate Delta T (TT - UT)',
params: [{ name: 'jd', type: 'number', default: 2451545.0 }],
example: 'swisseph.deltat(2451545.0)',
expectedResult: '~0.000739 days'
},
{
name: 'time_equ',
description: 'Equation of time',
params: [{ name: 'jd', type: 'number', default: 2451545.0 }],
example: 'swisseph.time_equ(2451545.0)',
expectedResult: '~-0.00228 days'
},
{
name: 'sidtime',
description: 'Sidereal time',
params: [{ name: 'jd_ut', type: 'number', default: 2451545.0 }],
example: 'swisseph.sidtime(2451545.0)',
expectedResult: '~18.697 hours'
},
{
name: 'sidtime0',
description: 'Sidereal time with obliquity',
params: [
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'eps', type: 'number', default: 23.44 },
{ name: 'nut', type: 'number', default: 0 }
],
example: 'swisseph.sidtime0(2451545.0, 23.44, 0)',
expectedResult: '~18.697 hours'
},
{
name: 'day_of_week',
description: 'Get day of week (0=Mon, 6=Sun)',
params: [{ name: 'jd', type: 'number', default: 2451545.0 }],
example: 'swisseph.day_of_week(2451545.0)',
expectedResult: '5 (Saturday)'
}
]
},
'Planetary Positions (5 methods)': {
methods: [
{
name: 'calc',
description: 'Calculate planetary positions',
params: [
{ name: 'jd', type: 'number', default: 2451545.0 },
{ name: 'planet', type: 'select', default: 'SE_SUN', options: ['SE_SUN', 'SE_MOON', 'SE_MERCURY', 'SE_VENUS', 'SE_MARS', 'SE_JUPITER', 'SE_SATURN'] },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH', 'SEFLG_SPEED'] }
],
example: 'swisseph.calc(2451545.0, swisseph.SE_SUN, swisseph.SEFLG_SWIEPH)',
expectedResult: '{ longitude: 280.37°, latitude: 0.0°, ... }'
},
{
name: 'calc_ut',
description: 'Calculate positions (UT)',
params: [
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'planet', type: 'select', default: 'SE_MOON', options: ['SE_SUN', 'SE_MOON', 'SE_MERCURY', 'SE_VENUS', 'SE_MARS'] },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH', 'SEFLG_SPEED'] }
],
example: 'swisseph.calc_ut(2451545.0, swisseph.SE_MOON, swisseph.SEFLG_SWIEPH)',
expectedResult: '[lon, lat, dist, ...]'
},
{
name: 'get_planet_name',
description: 'Get planet name',
params: [
{ name: 'planet', type: 'select', default: 'SE_SUN', options: ['SE_SUN', 'SE_MOON', 'SE_MERCURY', 'SE_VENUS', 'SE_MARS', 'SE_JUPITER'] }
],
example: 'swisseph.get_planet_name(swisseph.SE_SUN)',
expectedResult: '"Sun"'
},
{
name: 'pheno',
description: 'Planetary phenomena',
params: [
{ name: 'jd', type: 'number', default: 2451545.0 },
{ name: 'planet', type: 'select', default: 'SE_MOON', options: ['SE_MOON', 'SE_VENUS', 'SE_MARS'] },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] }
],
example: 'swisseph.pheno(2451545.0, swisseph.SE_MOON, swisseph.SEFLG_SWIEPH)',
expectedResult: '[phase_angle, phase, elongation, ...]'
},
{
name: 'pheno_ut',
description: 'Planetary phenomena (UT)',
params: [
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'planet', type: 'select', default: 'SE_MOON', options: ['SE_MOON', 'SE_VENUS', 'SE_MARS'] },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] }
],
example: 'swisseph.pheno_ut(2451545.0, swisseph.SE_MOON, swisseph.SEFLG_SWIEPH)',
expectedResult: '[phase_angle, phase, elongation, ...]'
}
]
},
'Houses (6 methods)': {
methods: [
{
name: 'houses',
description: 'Calculate house cusps',
params: [
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'lat', type: 'number', default: 47.0 },
{ name: 'lon', type: 'number', default: 8.0 },
{ name: 'hsys', type: 'text', default: 'P' }
],
example: 'swisseph.houses(2451545.0, 47.0, 8.0, "P")',
expectedResult: '{ cusps: [...], ascmc: [...] }'
},
{
name: 'houses_ex',
description: 'Calculate houses with flags',
params: [
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] },
{ name: 'lat', type: 'number', default: 47.0 },
{ name: 'lon', type: 'number', default: 8.0 },
{ name: 'hsys', type: 'text', default: 'P' }
],
example: 'swisseph.houses_ex(2451545.0, swisseph.SEFLG_SWIEPH, 47.0, 8.0, "P")',
expectedResult: '{ cusps: [...], ascmc: [...] }'
},
{
name: 'houses_ex2',
description: 'Calculate houses ex2',
params: [
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] },
{ name: 'lat', type: 'number', default: 47.0 },
{ name: 'lon', type: 'number', default: 8.0 },
{ name: 'hsys', type: 'text', default: 'P' }
],
example: 'swisseph.houses_ex2(2451545.0, swisseph.SEFLG_SWIEPH, 47.0, 8.0, "P")',
expectedResult: '{ cusps: [...], ascmc: [...] }'
},
{
name: 'houses_armc',
description: 'Calculate houses with ARMC',
params: [
{ name: 'armc', type: 'number', default: 12.0 },
{ name: 'lat', type: 'number', default: 47.0 },
{ name: 'eps', type: 'number', default: 23.44 },
{ name: 'hsys', type: 'text', default: 'P' }
],
example: 'swisseph.houses_armc(12.0, 47.0, 23.44, "P")',
expectedResult: '{ cusps: [...], ascmc: [...] }'
},
{
name: 'houses_armc_ex2',
description: 'Calculate houses ARMC ex2',
params: [
{ name: 'armc', type: 'number', default: 12.0 },
{ name: 'lat', type: 'number', default: 47.0 },
{ name: 'eps', type: 'number', default: 23.44 },
{ name: 'hsys', type: 'text', default: 'P' }
],
example: 'swisseph.houses_armc_ex2(12.0, 47.0, 23.44, "P")',
expectedResult: '{ cusps: [...], ascmc: [...] }'
},
{
name: 'house_pos',
description: 'Calculate house position',
params: [
{ name: 'armc', type: 'number', default: 12.0 },
{ name: 'lat', type: 'number', default: 47.0 },
{ name: 'eps', type: 'number', default: 23.44 },
{ name: 'hsys', type: 'text', default: 'P' },
{ name: 'lon', type: 'number', default: 100.0 },
{ name: 'lat2', type: 'number', default: 0.0 }
],
example: 'swisseph.house_pos(12.0, 47.0, 23.44, "P", 100.0, 0.0)',
expectedResult: '~12.28'
}
]
},
'Math Functions (12 methods)': {
methods: [
{
name: 'degnorm',
description: 'Normalize degrees to 0-360',
params: [{ name: 'deg', type: 'number', default: 370.0 }],
example: 'swisseph.degnorm(370.0)',
expectedResult: '10.0'
},
{
name: 'radnorm',
description: 'Normalize radians to 0-2π',
params: [{ name: 'rad', type: 'number', default: 6.38 }],
example: 'swisseph.radnorm(6.38)',
expectedResult: '~0.097'
},
{
name: 'rad_midp',
description: 'Radian midpoint',
params: [
{ name: 'rad1', type: 'number', default: 0.1 },
{ name: 'rad2', type: 'number', default: 6.2 }
],
example: 'swisseph.rad_midp(0.1, 6.2)',
expectedResult: '~0.0084'
},
{
name: 'deg_midp',
description: 'Degree midpoint',
params: [
{ name: 'deg1', type: 'number', default: 10.0 },
{ name: 'deg2', type: 'number', default: 350.0 }
],
example: 'swisseph.deg_midp(10.0, 350.0)',
expectedResult: '0.0 or 180.0'
},
{
name: 'split_deg',
description: 'Split degrees into deg/min/sec',
params: [
{ name: 'deg', type: 'number', default: 123.456 },
{ name: 'roundflag', type: 'select', default: 'SE_SPLIT_DEG_ROUND_SEC', options: ['SE_SPLIT_DEG_ROUND_SEC', 'SE_SPLIT_DEG_ROUND_MIN'] }
],
example: 'swisseph.split_deg(123.456, swisseph.SE_SPLIT_DEG_ROUND_SEC)',
expectedResult: '{ degree: 123, min: 27, second: 22 }'
},
{
name: 'csnorm',
description: 'Normalize centiseconds',
params: [{ name: 'cs', type: 'number', default: 370.0 }],
example: 'swisseph.csnorm(370.0)',
expectedResult: '370'
},
{
name: 'difcsn',
description: 'Centisecond difference',
params: [
{ name: 'cs1', type: 'number', default: 10.0 },
{ name: 'cs2', type: 'number', default: 350.0 }
],
example: 'swisseph.difcsn(10.0, 350.0)',
expectedResult: '129599660'
},
{
name: 'difdegn',
description: 'Degree difference normalized',
params: [
{ name: 'deg1', type: 'number', default: 10.0 },
{ name: 'deg2', type: 'number', default: 350.0 }
],
example: 'swisseph.difdegn(10.0, 350.0)',
expectedResult: '20.0'
},
{
name: 'difcs2n',
description: 'Centisecond difference 2',
params: [
{ name: 'cs1', type: 'number', default: 10.0 },
{ name: 'cs2', type: 'number', default: 350.0 }
],
example: 'swisseph.difcs2n(10.0, 350.0)',
expectedResult: '-340'
},
{
name: 'difdeg2n',
description: 'Degree difference 2',
params: [
{ name: 'deg1', type: 'number', default: 10.0 },
{ name: 'deg2', type: 'number', default: 350.0 }
],
example: 'swisseph.difdeg2n(10.0, 350.0)',
expectedResult: '20.0'
},
{
name: 'difrad2n',
description: 'Radian difference 2',
params: [
{ name: 'rad1', type: 'number', default: 0.1 },
{ name: 'rad2', type: 'number', default: 6.2 }
],
example: 'swisseph.difrad2n(0.1, 6.2)',
expectedResult: '~0.183'
},
{
name: 'd2l',
description: 'Degrees to long',
params: [{ name: 'deg', type: 'number', default: 123.456 }],
example: 'swisseph.d2l(123.456)',
expectedResult: '123'
}
]
},
'Fixed Stars (6 methods)': {
methods: [
{
name: 'fixstar',
description: 'Calculate fixed star position',
params: [
{ name: 'star', type: 'text', default: 'Sirius' },
{ name: 'jd', type: 'number', default: 2451545.0 },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] }
],
example: 'swisseph.fixstar("Sirius", 2451545.0, swisseph.SEFLG_SWIEPH)',
expectedResult: '{ longitude, latitude, ... }'
},
{
name: 'fixstar_ut',
description: 'Fixed star position (UT)',
params: [
{ name: 'star', type: 'text', default: 'Sirius' },
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] }
],
example: 'swisseph.fixstar_ut("Sirius", 2451545.0, swisseph.SEFLG_SWIEPH)',
expectedResult: '{ longitude, latitude, ... }'
},
{
name: 'fixstar_mag',
description: 'Fixed star magnitude',
params: [{ name: 'star', type: 'text', default: 'Sirius' }],
example: 'swisseph.fixstar_mag("Sirius")',
expectedResult: '-1.46'
},
{
name: 'fixstar2',
description: 'Fixed star position v2',
params: [
{ name: 'star', type: 'text', default: 'Sirius' },
{ name: 'jd', type: 'number', default: 2451545.0 },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] }
],
example: 'swisseph.fixstar2("Sirius", 2451545.0, swisseph.SEFLG_SWIEPH)',
expectedResult: '{ longitude, latitude, ... }'
},
{
name: 'fixstar2_ut',
description: 'Fixed star position v2 (UT)',
params: [
{ name: 'star', type: 'text', default: 'Sirius' },
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] }
],
example: 'swisseph.fixstar2_ut("Sirius", 2451545.0, swisseph.SEFLG_SWIEPH)',
expectedResult: '{ longitude, latitude, ... }'
},
{
name: 'fixstar2_mag',
description: 'Fixed star magnitude v2',
params: [{ name: 'star', type: 'text', default: 'Sirius' }],
example: 'swisseph.fixstar2_mag("Sirius")',
expectedResult: '-1.46'
}
]
},
'Ayanamsa (5 methods)': {
methods: [
{
name: 'get_ayanamsa',
description: 'Get ayanamsa value',
params: [{ name: 'jd_et', type: 'number', default: 2451545.0 }],
example: 'swisseph.set_sid_mode(swisseph.SE_SIDM_LAHIRI, 0, 0); swisseph.get_ayanamsa(2451545.0)',
expectedResult: '~23.857°'
},
{
name: 'get_ayanamsa_ut',
description: 'Get ayanamsa (UT)',
params: [{ name: 'jd_ut', type: 'number', default: 2451545.0 }],
example: 'swisseph.get_ayanamsa_ut(2451545.0)',
expectedResult: '~23.857°'
},
{
name: 'get_ayanamsa_ex',
description: 'Get ayanamsa extended',
params: [
{ name: 'jd_et', type: 'number', default: 2451545.0 },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] }
],
example: 'swisseph.get_ayanamsa_ex(2451545.0, swisseph.SEFLG_SWIEPH)',
expectedResult: '~23.857°'
},
{
name: 'get_ayanamsa_ex_ut',
description: 'Get ayanamsa extended (UT)',
params: [
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] }
],
example: 'swisseph.get_ayanamsa_ex_ut(2451545.0, swisseph.SEFLG_SWIEPH)',
expectedResult: '~23.857°'
},
{
name: 'get_ayanamsa_name',
description: 'Get ayanamsa name',
params: [
{ name: 'sid_mode', type: 'select', default: 'SE_SIDM_LAHIRI', options: ['SE_SIDM_LAHIRI', 'SE_SIDM_FAGAN_BRADLEY'] }
],
example: 'swisseph.get_ayanamsa_name(swisseph.SE_SIDM_LAHIRI)',
expectedResult: '"Lahiri"'
}
]
},
'Utilities (10 methods)': {
methods: [
{
name: 'version',
description: 'Get Swiss Ephemeris version',
params: [],
example: 'swisseph.version()',
expectedResult: '"2.10.03"'
},
{
name: 'cs2timestr',
description: 'Centiseconds to time string',
params: [
{ name: 'cs', type: 'number', default: 4500000 },
{ name: 'sep', type: 'text', default: ' ' },
{ name: 'suppressZero', type: 'select', default: 'true', options: ['true', 'false'] }
],
example: 'swisseph.cs2timestr(4500000, " ", true)',
expectedResult: '"12 30"'
},
{
name: 'cs2lonlatstr',
description: 'Centiseconds to lon/lat string',
params: [
{ name: 'cs', type: 'number', default: 44444160 },
{ name: 'pchar', type: 'text', default: 'E' },
{ name: 'mchar', type: 'text', default: 'W' }
],
example: 'swisseph.cs2lonlatstr(44444160, "E", "W")',
expectedResult: '"123E27\'22"'
},
{
name: 'cs2degstr',
description: 'Centiseconds to degree string (mod 30)',
params: [{ name: 'cs', type: 'number', default: 44444160 }],
example: 'swisseph.cs2degstr(44444160)',
expectedResult: '" 3°27\'21"'
},
{
name: 'azalt',
description: 'Calculate azimuth/altitude',
params: [
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'calc_flag', type: 'select', default: 'SE_EQU2HOR', options: ['SE_EQU2HOR'] },
{ name: 'geopos', type: 'text', default: '8,47,400' },
{ name: 'atpress', type: 'number', default: 1013.25 },
{ name: 'attemp', type: 'number', default: 15.0 },
{ name: 'xin', type: 'text', default: '100,10,1' }
],
example: 'swisseph.azalt(2451545.0, swisseph.SE_EQU2HOR, [8,47,400], 1013.25, 15.0, [100,10,1])',
expectedResult: '{ azimuth, altitude, ... }'
},
{
name: 'azalt_rev',
description: 'Reverse azimuth/altitude',
params: [
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'calc_flag', type: 'select', default: 'SE_HOR2EQU', options: ['SE_HOR2EQU'] },
{ name: 'geopos', type: 'text', default: '8,47,400' },
{ name: 'xin', type: 'text', default: '180,45,1' }
],
example: 'swisseph.azalt_rev(2451545.0, swisseph.SE_HOR2EQU, [8,47,400], [180,45,1])',
expectedResult: '{ ra, dec, ... }'
},
{
name: 'cotrans',
description: 'Coordinate transformation',
params: [
{ name: 'xpo', type: 'text', default: '100,10,1' },
{ name: 'eps', type: 'number', default: 23.44 }
],
example: 'swisseph.cotrans([100,10,1], 23.44)',
expectedResult: '[x, y, z]'
},
{
name: 'cotrans_sp',
description: 'Coordinate transformation with speed',
params: [
{ name: 'xpo', type: 'text', default: '100,10,1,0,0,0' },
{ name: 'eps', type: 'number', default: 23.44 }
],
example: 'swisseph.cotrans_sp([100,10,1,0,0,0], 23.44)',
expectedResult: '[x, y, z, dx, dy, dz]'
},
{
name: 'get_tid_acc',
description: 'Get tidal acceleration',
params: [],
example: 'swisseph.get_tid_acc()',
expectedResult: '-25.8'
},
{
name: 'set_tid_acc',
description: 'Set tidal acceleration',
params: [{ name: 'acc', type: 'number', default: 0.0 }],
example: 'swisseph.set_tid_acc(0.0)',
expectedResult: 'void'
}
]
},
'Nodes & Apsides (2 methods)': {
methods: [
{
name: 'nod_aps',
description: 'Calculate nodes and apsides',
params: [
{ name: 'jd_et', type: 'number', default: 2451545.0 },
{ name: 'planet', type: 'select', default: 'SE_MOON', options: ['SE_MOON', 'SE_MERCURY', 'SE_VENUS'] },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] },
{ name: 'method', type: 'number', default: 0 }
],
example: 'swisseph.nod_aps(2451545.0, swisseph.SE_MOON, swisseph.SEFLG_SWIEPH, 0)',
expectedResult: '{ asc_node, desc_node, perihelion, aphelion }'
},
{
name: 'nod_aps_ut',
description: 'Nodes and apsides (UT)',
params: [
{ name: 'jd_ut', type: 'number', default: 2451545.0 },
{ name: 'planet', type: 'select', default: 'SE_MOON', options: ['SE_MOON', 'SE_MERCURY', 'SE_VENUS'] },
{ name: 'flags', type: 'select', default: 'SEFLG_SWIEPH', options: ['SEFLG_SWIEPH'] },
{ name: 'method', type: 'number', default: 0 }
],
example: 'swisseph.nod_aps_ut(2451545.0, swisseph.SE_MOON, swisseph.SEFLG_SWIEPH, 0)',
expectedResult: '{ asc_node, desc_node, perihelion, aphelion }'
}
]
}
};
// Initialize
async function init() {
try {
statusEl.textContent = 'Initializing...';
swisseph = new SwissEph();
await swisseph.initSwissEph();
const version = swisseph.version();
versionEl.textContent = `Swiss Ephemeris v${version}`;
statusEl.textContent = 'Ready';
statusEl.classList.add('text-green-600', 'font-medium');
renderCategories();
} catch (error) {
statusEl.textContent = 'Error: ' + error.message;
statusEl.classList.add('text-red-600');
}
}
function renderCategories() {
categoriesEl.innerHTML = Object.entries(methodCategories).map(([category, data]) => `
<button onclick="showCategory('${category}')"
class="w-full text-left px-3 py-2 rounded bg-white hover:bg-blue-50 transition-all border border-gray-200 hover:border-blue-400 group text-sm">
<div class="flex items-center justify-between">
<div>
<div class="font-medium text-gray-900">${category}</div>
<div class="text-xs text-gray-500">${data.methods.length} methods</div>
</div>
<svg class="w-4 h-4 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
</svg>
</div>
</button>
`).join('');
}
window.showCategory = function(category) {
const data = methodCategories[category];
document.getElementById('welcome').style.display = 'none';
methodDetailsEl.innerHTML = `
<div class="bg-white rounded border border-gray-200 p-4 mb-4">
<h2 class="text-lg font-semibold text-gray-900">${category}</h2>
<p class="text-sm text-gray-600">${data.methods.length} methods</p>
</div>
${data.methods.map((method, idx) => `
<div class="bg-white rounded border border-gray-200 p-4 mb-4">
<div class="flex items-start justify-between mb-3">
<div class="flex-1">
<h3 class="text-base font-semibold text-blue-600">${method.name}()</h3>
<p class="text-sm text-gray-600 mt-1">${method.description}</p>
</div>
<button onclick="runMethod('${category}', ${idx})"
class="ml-3 px-3 py-1 bg-blue-600 text-white rounded hover:bg-blue-700 transition-all text-sm font-medium">
Run
</button>
</div>
${method.params.length > 0 ? `
<div class="space-y-2 mb-3">
${method.params.map((param, pidx) => `
<div class="grid grid-cols-4 gap-2 items-center text-sm">
<label class="text-gray-700 font-medium">${param.name}:</label>
${param.type === 'select' ? `
<select id="${method.name}_${pidx}" class="col-span-3 bg-white border border-gray-300 rounded px-2 py-1 text-gray-900 text-sm">
${param.options.map(opt => `<option value="${opt}" ${opt === param.default ? 'selected' : ''}>${opt}</option>`).join('')}
</select>
` : `
<input type="${param.type}" id="${method.name}_${pidx}" value="${param.default}"
class="col-span-3 bg-white border border-gray-300 rounded px-2 py-1 text-gray-900 text-sm">
`}
</div>
`).join('')}
</div>
` : ''}
<details class="mb-2">
<summary class="cursor-pointer text-xs text-gray-600 hover:text-gray-900 font-medium">Show Example</summary>
<div class="bg-gray-50 rounded p-2 mt-2 border border-gray-200">
<code class="text-xs text-gray-900 block">${method.example}</code>
<div class="text-xs text-gray-500 mt-1">Expected: <code>${method.expectedResult}</code></div>
</div>
</details>
<div id="result_${method.name}" class="hidden bg-green-50 rounded p-3 border border-green-200 mt-2">
<div class="text-xs text-gray-600 font-medium mb-1">Result:</div>
<pre class="text-xs text-gray-900 overflow-x-auto"></pre>
</div>
</div>
`).join('')}
`;
};
window.runMethod = function(category, methodIdx) {
const method = methodCategories[category].methods[methodIdx];
const resultEl = document.getElementById(`result_${method.name}`);
try {
// Get parameter values
const params = method.params.map((param, idx) => {
const input = document.getElementById(`${method.name}_${idx}`);
let value = input.value;
if (param.type === 'number') {
value = parseFloat(value);
} else if (param.type === 'select' && value.startsWith('SE')) {
value = swisseph[value];
} else if (param.type === 'text' && value.includes(',')) {
// Parse "1,2,3" into [1, 2, 3]
value = value.split(',').map(v => parseFloat(v.trim()));
}
return value;
});
// Call the method
const result = swisseph[method.name](...params);
// Display result
resultEl.classList.remove('hidden');
resultEl.querySelector('pre').textContent = JSON.stringify(result, null, 2);
} catch (error) {
resultEl.classList.remove('hidden');
resultEl.classList.add('from-red-500/20', 'to-orange-500/20', 'border-red-500/30');
resultEl.querySelector('pre').textContent = 'Error: ' + error.message;
}
};
init();
</script>
</body>
</html>