✦ SEDANG MEMBUKA LANGIT DAN WAKTU ✦

TUNGGULAH SEJENAK HINGGA TABIR FALAK TERBUKA...

Falaqyah Digital Al-Hikmah
Sistem Falakiyah Ruhaniyah Digital Pertama di Dunia
Akurat • Presisi • Terverifikasi
Founder & System Architect: Endry Arya

بِسْمِ اللّٰهِ الرَّحْمٰنِ الرَّحِيْمِ

Donasi bersifat sukarela untuk biaya sistem, dan akan kami tampilkan di sini.

Terima kasih atas kunjungannya dan partisipasinya.

"Langit dan waktu adalah cermin ketetapan, tempat ruh menapaki garis takdir."

✦ Jejak Pengunjung di Falaqyah Digital CBA ✦ Loading...

Donasi untuk Kode Rahasia

Untuk mendapat Kode Rahasia, silakan donasi seikhlasnya. Anda akan menerima Kode via WhatsApp setelah mengirim bukti transfer.

Kirim Bukti via WhatsApp

Perhitungan Falaqiyah Al-Hikmah

سر الوقت — Rahasia Waktu

“Hari-hari dalam sepekan berada di bawah kekuasaan planet-planet; tiap hari memiliki tabiat serta pengaruhnya masing-masing.”
Shams al-Ma‘ārif
...
🌞 Penguasa Hari: ...
⏳ Planet Jam Aktif: ...
🕒 ...
☀ Pergantian Penguasa Hari: ...
Durasi Jam Sa'at: memuat...
Tafsir Saat Ini: ...

✦ Coba klik planet di langit untuk melihat info energinya ✦

Falaqyah Digital Al-Hikmah
Sistem Falakiyah Ruhaniyah Digital Pertama di Dunia
Akurat • Presisi • Terverifikasi

Founder & System Architect:
Endry Arya
© CAKRABUANAALHIKMAH2025
🔊
/* FalaqTimesAdvanced.js - Versi lanjutan: auratic highlights (sa'at 1/2/3), JSON output, overrides - Works offline (no external libs). Compatible with Acode/local. - Auto-uses existing page location vars if present. */ const FalaqTimesAdvanced = (function(){ // ---------- Utilities ---------- function toRad(d){ return d*Math.PI/180; } function toDeg(r){ return r*180/Math.PI; } function fixAngle(a){ return (a%360+360)%360; } function pad(n){ return (n<10? '0':'') + n; } // Julian / NOAA helpers (same robust algo as before) function dateToJulian(date){ const y = date.getUTCFullYear(); const m = date.getUTCMonth() + 1; const D = date.getUTCDate() + (date.getUTCHours() + date.getUTCMinutes()/60 + date.getUTCSeconds()/3600)/24; let A = Math.floor(y/100); let B = 2 - A + Math.floor(A/4); let Y = y; let M = m; if (m <= 2) { Y = y - 1; M = m + 12; } const JD = Math.floor(365.25*(Y+4716)) + Math.floor(30.6001*(M+1)) + D + B - 1524.5; return JD; } function julianCenturies(jd){ return (jd - 2451545.0) / 36525.0; } function geomMeanLongSun(T){ return fixAngle(280.46646 + T*(36000.76983 + T*0.0003032)); } function geomMeanAnomalySun(T){ return 357.52911 + T*(35999.05029 - 0.0001537*T); } function eccentricityEarthOrbit(T){ return 0.016708634 - T*(0.000042037 + 0.0000001267*T); } function sunEqOfCenter(T,M){ const Mr = toRad(M); return Math.sin(Mr)*(1.914602 - T*(0.004817 + 0.000014*T)) + Math.sin(2*Mr)*(0.019993 - 0.000101*T) + Math.sin(3*Mr)*0.000289; } function sunTrueLong(L0,C){ return L0 + C; } function sunApparentLong(T,theta){ const omega = 125.04 - 1934.136 * T; return theta - 0.00569 - 0.00478 * Math.sin(toRad(omega)); } function meanObliquityOfEcliptic(T){ return 23 + (26 + ((21.448 - T*(46.815 + T*(0.00059 - T*0.001813))))/60)/60; } function obliquityCorrection(T, eps0){ const omega = 125.04 - 1934.136 * T; return eps0 + 0.00256 * Math.cos(toRad(omega)); } function sunDeclination(eps, lambda){ return toDeg(Math.asin(Math.sin(toRad(eps)) * Math.sin(toRad(lambda)))); } function eqOfTime(T, L0, e, M, eps) { const y = Math.tan(toRad(eps/2)) * Math.tan(toRad(eps/2)); const L0r = toRad(L0), Mr = toRad(M); const term1 = y * Math.sin(2*L0r); const term2 = -2 * e * Math.sin(Mr); const term3 = 4 * e * y * Math.sin(Mr) * Math.cos(2*L0r); const term4 = -0.5 * y*y * Math.sin(4*L0r); const term5 = -1.25 * e*e * Math.sin(2*Mr); return 4 * toDeg(term1 + term2 + term3 + term4 + term5); // minutes } function hourAngleSunrise(lat, decl){ const latR = toRad(lat), declR = toRad(decl); const HA = Math.acos( Math.cos(toRad(90.833)) / (Math.cos(latR)*Math.cos(declR)) - Math.tan(latR)*Math.tan(declR) ); return toDeg(HA); } function computeSunriseSunsetUTC(dateLocalMidnightUTC, lat, lng){ const jd = dateToJulian(dateLocalMidnightUTC); const T = julianCenturies(jd); const L0 = geomMeanLongSun(T); const M = geomMeanAnomalySun(T); const e = eccentricityEarthOrbit(T); const C = sunEqOfCenter(T, M); const theta = sunTrueLong(L0, C); const lambda = sunApparentLong(T, theta); const eps0 = meanObliquityOfEcliptic(T); const eps = obliquityCorrection(T, eps0); const decl = sunDeclination(eps, lambda); const eqt = eqOfTime(T, L0, e, M, eps); const ha = hourAngleSunrise(lat, decl); const solarNoonUTC = (720 - 4*lng - eqt); const sunriseUTCmin = solarNoonUTC - ha*4; const sunsetUTCmin = solarNoonUTC + ha*4; return { sunriseUTCmin, sunsetUTCmin, decl, eqt, solarNoonUTC }; } function minutesToLocalDate(baseDateLocal, minutesUTC){ const tzOffsetMin = baseDateLocal.getTimezoneOffset(); const utcMidnight = new Date(Date.UTC(baseDateLocal.getFullYear(), baseDateLocal.getMonth(), baseDateLocal.getDate(), 0, 0, 0) - tzOffsetMin*60000); const dt = new Date(utcMidnight.getTime() + Math.round(minutesUTC*60000)); return dt; } function formatHM(d){ return pad(d.getHours()) + ':' + pad(d.getMinutes()); } // ---------- Helper: find location from page globals ---------- function findLocationFromPage(){ // common names developers use for stored user location if (window.USER_LAT && window.USER_LNG) return { lat: +window.USER_LAT, lng: +window.USER_LNG }; if (window.userLat && window.userLng) return { lat: +window.userLat, lng: +window.userLng }; if (window.userLocation && typeof window.userLocation === 'object' && window.userLocation.lat && window.userLocation.lng) return { lat: +window.userLocation.lat, lng: +window.userLocation.lng }; // check dataset on body or meta tags optionally const body = document.body; if (body && body.dataset && body.dataset.lat && body.dataset.lng) return { lat: +body.dataset.lat, lng: +body.dataset.lng }; // not found -> return null (caller may fallback to geolocation) return null; } // Build saats with configurable length (minutes) function buildSaatsWithLength(sunriseDate, sunsetDate, hourLengthMinutes){ const saats = []; const msLen = hourLengthMinutes * 60000; for (let i=0;i<12;i++){ const start = new Date(sunriseDate.getTime() + i*msLen); const end = new Date(sunriseDate.getTime() + (i+1)*msLen); saats.push({ idx: i+1, start, end, origin: 'sunrise' }); } for (let i=0;i<12;i++){ const start = new Date(sunsetDate.getTime() + i*msLen); const end = new Date(sunsetDate.getTime() + (i+1)*msLen); saats.push({ idx: 13+i, start, end, origin: 'sunset' }); } return saats; } // Render table with auratic highlights (gold for sa'at 1..3) function render(container, info, opts){ const { lat, lng, sunriseDate, sunsetDate, saats, dateStr } = info; const el = (typeof container === 'string') ? document.getElementById(container) : container; if (!el) return; // style variables (keemasan auratik) const goldStyle = "background:linear-gradient(90deg,#fff6d1,#f9e0a6);color:#1b1b12;padding:4px 8px;border-radius:6px;font-weight:700;"; const faint = "color:rgba(255,255,255,0.9);"; let html = ''; html += `
`; html += `

Waktu Falakiyah — ${dateStr}

`; html += `
`; html += `
Latitude
${lat.toFixed(5)}
`; html += `
Longitude
${lng.toFixed(5)}
`; html += `
Syurūq
${formatHM(sunriseDate)}
`; html += `
Maghrib
${formatHM(sunsetDate)}
`; html += `

`; html += ``; html += ``; saats.forEach(s => { let note = ''; if (s.idx === 1) note = `Puncak (Syurūq)`; else if (s.idx === 2) note = `Sa'at Ke-2 (Sekunder)`; else if (s.idx === 3) note = `Sa'at Ke-3 (Tersier)`; else if (s.idx === 13) note = `Awal Malam (Maghrib)`; html += ``; }); html += `
Sa'atMulaiSelesaiCatatan
Sa'at ${s.idx}${formatHM(s.start)}${formatHM(s.end)}${note}
`; // JSON area (hidden) if requested if (opts && opts.showJsonBlock) { const jsonId = (typeof container === 'string' ? container + '-json' : 'falaq-json'); html += `
Tampilkan Data JSON (untuk integrasi)
`; } html += `

Catatan: Sa'at 1 = Puncak syurūq (penguasa hari). Sa'at 2 & 3 diberi prioritas sekunder & tersier.

`; html += `
`; el.innerHTML = html; } // Build a JSON structure for external usage function buildOutputJson(info, meta){ // info contains saats etc. return { dateLocal: meta.dateLocalISO, lat: info.lat, lng: info.lng, sunrise: info.sunriseDate.toISOString(), sunset: info.sunsetDate.toISOString(), hourLengthMinutes: meta.hourLengthMinutes, saats: info.saats.map(s => ({ index: s.idx, startIso: s.start.toISOString(), endIso: s.end.toISOString(), startLocal: `${pad(s.start.getHours())}:${pad(s.start.getMinutes())}`, endLocal: `${pad(s.end.getHours())}:${pad(s.end.getMinutes())}`, origin: s.origin })) }; } // Main compute function with overrides and callback async function computeAndRenderAdvanced(opts){ // opts: { containerId, dateLocal (Date), hourLengthMinutes, overrideSunriseIso, overrideSunsetIso, onJson (fn), showJsonBlock } const containerId = opts.containerId || 'falaq-times'; const container = (typeof containerId === 'string') ? document.getElementById(containerId) : containerId; if (!container) { console.warn('FalaqTimesAdvanced: container not found'); return; } // Find location from page first let loc = findLocationFromPage(); if (!loc && opts.forceUsePageLocation) { container.innerHTML = `
Lokasi tidak ditemukan di halaman. Tambahkan window.USER_LAT / USER_LNG atau userLat / userLng, atau non-aktifkan 'forceUsePageLocation'.
`; return; } if (!loc) { // fallback to geolocation if (!navigator.geolocation) { container.innerHTML = `
Geolocation tidak tersedia. Pastikan lokasi tersedia di halaman atau browser mendukung Geolocation.
`; return; } try { const pos = await new Promise((res, rej) => navigator.geolocation.getCurrentPosition(res, rej, { enableHighAccuracy:true, timeout:30000 })); loc = { lat: pos.coords.latitude, lng: pos.coords.longitude }; } catch (e) { container.innerHTML = `
Izin lokasi ditolak atau waktu habis. Pastikan halaman memiliki akses lokasi.
`; return; } } const dateLocal = opts.dateLocal instanceof Date ? opts.dateLocal : new Date(); const hourLengthMinutes = (typeof opts.hourLengthMinutes === 'number' && opts.hourLengthMinutes>0) ? opts.hourLengthMinutes : 60; // If user provided override sunrise/sunset (ISO strings), use them; else compute let sunriseDateLocal, sunsetDateLocal; if (opts.overrideSunriseIso && opts.overrideSunsetIso) { sunriseDateLocal = new Date(opts.overrideSunriseIso); sunsetDateLocal = new Date(opts.overrideSunsetIso); } else { // Compute using NOAA algorithm // Build UTC midnight Date for that local date: const utcYear = dateLocal.getUTCFullYear(); const utcMonth = dateLocal.getUTCMonth(); const utcDay = dateLocal.getUTCDate(); const dateUTCmidnight = new Date(Date.UTC(utcYear, utcMonth, utcDay, 0, 0, 0)); const sun = computeSunriseSunsetUTC(dateUTCmidnight, loc.lat, loc.lng); if (isNaN(sun.sunriseUTCmin) || isNaN(sun.sunsetUTCmin)) { container.innerHTML = `
Fenomena polar: matahari tidak terbit/terbenam pada tanggal ini di lokasi Anda.
`; return; } sunriseDateLocal = minutesToLocalDate(dateLocal, sun.sunriseUTCmin); sunsetDateLocal = minutesToLocalDate(dateLocal, sun.sunsetUTCmin); } // Build saats with configurable length (minutes) const saats = buildSaatsWithLength(sunriseDateLocal, sunsetDateLocal, hourLengthMinutes); const dateStr = dateLocal.toLocaleDateString(); // Render HTML render(container, { lat: loc.lat, lng: loc.lng, sunriseDate: sunriseDateLocal, sunsetDate: sunsetDateLocal, saats, dateStr }, { showJsonBlock: !!opts.showJsonBlock }); // Build JSON const meta = { dateLocalISO: dateLocal.toISOString(), hourLengthMinutes }; const outJson = buildOutputJson({ lat: loc.lat, lng: loc.lng, sunriseDate: sunriseDateLocal, sunsetDate: sunsetDateLocal, saats }, meta); // Post JSON to callback if present if (typeof opts.onJson === 'function') { try { opts.onJson(outJson); } catch(e){ console.warn('onJson callback error', e); } } // Also write JSON to details block if requested if (opts.showJsonBlock) { const jsonId = (typeof containerId === 'string' ? containerId + '-json' : 'falaq-json'); const pre = document.getElementById(jsonId); if (pre) pre.textContent = JSON.stringify(outJson, null, 2); } return outJson; } // Public API return { init: function(initOpts){ // initOpts defaults const opts = Object.assign({ containerId: 'falaq-times', dateLocal: new Date(), hourLengthMinutes: 60, overrideSunriseIso: null, overrideSunsetIso: null, onJson: null, showJsonBlock: false, forceUsePageLocation:false }, initOpts || {}); // initial placeholder const container = (typeof opts.containerId === 'string') ? document.getElementById(opts.containerId) : opts.containerId; if (!container) { console.warn('FalaqTimesAdvanced: container not found'); return; } container.innerHTML = `
Menghitung waktu falakiyah... (memanfaatkan lokasi halaman jika ada).
`; // compute computeAndRenderAdvanced(opts).then(result => { // result is JSON if success // optionally you can handle result here }).catch(err => { console.error(err); }); }, computeForDate: function(opts){ // same options as init but required: dateLocal return computeAndRenderAdvanced(opts); } }; })(); // Inisialisasi: tampilkan di div id="falaq-times" FalaqTimesAdvanced.init({ containerId: 'falaq-times', hourLengthMinutes: 60, // biasanya 60; ubah kalau mau showJsonBlock: true, // tampilkan JSON (bisa dimatikan) // forceUsePageLocation: false, // aktifkan kalau mau paksa pakai lokasi page saja onJson: function(json){ console.log('Falaq JSON', json); } });

Waktu Thalsim Pelet (Mahabbah)

Hari: Zuhrah (Jum'at)

Syurūq (puncak): --:--

Sa'at 1 (Puncak)--:-- – --:--
Sa'at 2 (Sekunder)--:-- – --:--
Sa'at 3 (Tersier)--:-- – --:--

/* FalaqTimesAdvanced - chunk 1/4 */ const FalaqTimesAdvanced = (function(){ function toRad(d){ return d*Math.PI/180; } function toDeg(r){ return r*180/Math.PI; } function fixAngle(a){ return (a%360+360)%360; } function pad(n){ return (n<10? '0':'') + n; } function dateToJulian(date){ const y = date.getUTCFullYear(); const m = date.getUTCMonth() + 1; const D = date.getUTCDate() + (date.getUTCHours() + date.getUTCMinutes()/60 + date.getUTCSeconds()/3600)/24; let A = Math.floor(y/100); let B = 2 - A + Math.floor(A/4); let Y = y; let M = m; if (m <= 2) { Y = y - 1; M = m + 12; } const JD = Math.floor(365.25*(Y+4716)) + Math.floor(30.6001*(M+1)) + D + B - 1524.5; return JD; } function julianCenturies(jd){ return (jd - 2451545.0) / 36525.0; } function geomMeanLongSun(T){ return fixAngle(280.46646 + T*(36000.76983 + T*0.0003032)); } function geomMeanAnomalySun(T){ return 357.52911 + T*(35999.05029 - 0.0001537*T); } function eccentricityEarthOrbit(T){ return 0.016708634 - T*(0.000042037 + 0.0000001267*T); } function sunEqOfCenter(T,M){ const Mr = toRad(M); return Math.sin(Mr)*(1.914602 - T*(0.004817 + 0.000014*T)) + Math.sin(2*Mr)*(0.019993 - 0.000101*T) + Math.sin(3*Mr)*0.000289; } function sunTrueLong(L0,C){ return L0 + C; } function sunApparentLong(T,theta){ const omega = 125.04 - 1934.136 * T; return theta - 0.00569 - 0.00478 * Math.sin(toRad(omega)); } function meanObliquityOfEcliptic(T){ return 23 + (26 + ((21.448 - T*(46.815 + T*(0.00059 - T*0.001813))))/60)/60; } function obliquityCorrection(T, eps0){ const omega = 125.04 - 1934.136 * T; return eps0 + 0.00256 * Math.cos(toRad(omega)); } function sunDeclination(eps, lambda){ return toDeg(Math.asin(Math.sin(toRad(eps)) * Math.sin(toRad(lambda)))); } function eqOfTime(T, L0, e, M, eps) { const y = Math.tan(toRad(eps/2)) * Math.tan(toRad(eps/2)); const L0r = toRad(L0), Mr = toRad(M); const term1 = y * Math.sin(2*L0r); const term2 = -2 * e * Math.sin(Mr); const term3 = 4 * e * y * Math.sin(Mr) * Math.cos(2*L0r); const term4 = -0.5 * y*y * Math.sin(4*L0r); const term5 = -1.25 * e*e * Math.sin(2*Mr); return 4 * toDeg(term1 + term2 + term3 + term4 + term5); // minutes } function hourAngleSunrise(lat, decl){ const latR = toRad(lat), declR = toRad(decl); const HA = Math.acos( Math.cos(toRad(90.833)) / (Math.cos(latR)*Math.cos(declR)) - Math.tan(latR)*Math.tan(declR) ); return toDeg(HA); } function computeSunriseSunsetUTC(dateLocalMidnightUTC, lat, lng){ const jd = dateToJulian(dateLocalMidnightUTC); const T = julianCenturies(jd); const L0 = geomMeanLongSun(T); const M = geomMeanAnomalySun(T); const e = eccentricityEarthOrbit(T); const C = sunEqOfCenter(T, M); const theta = sunTrueLong(L0, C); const lambda = sunApparentLong(T, theta); const eps0 = meanObliquityOfEcliptic(T); const eps = obliquityCorrection(T, eps0); const decl = sunDeclination(eps, lambda); const eqt = eqOfTime(T, L0, e, M, eps); const ha = hourAngleSunrise(lat, decl); const solarNoonUTC = (720 - 4*lng - eqt); const sunriseUTCmin = solarNoonUTC - ha*4; const sunsetUTCmin = solarNoonUTC + ha*4; return { sunriseUTCmin, sunsetUTCmin, decl, eqt, solarNoonUTC }; } function minutesToLocalDate(baseDateLocal, minutesUTC){ const tzOffsetMin = baseDateLocal.getTimezoneOffset(); const utcMidnight = new Date( Date.UTC( baseDateLocal.getFullYear(), baseDateLocal.getMonth(), baseDateLocal.getDate(), 0,0,0 ) - tzOffsetMin*60000 ); const dt = new Date(utcMidnight.getTime() + Math.round(minutesUTC*60000)); return dt; } function formatHM(d){ const hh = d.getHours(); const mm = d.getMinutes(); return (hh<10?"0":"")+hh+":"+(mm<10?"0":"")+mm; } /* ------------------------- Cari lokasi dari halaman ------------------------- */ function findLocationFromPage(){ if(window.USER_LAT && window.USER_LNG) return {lat:+window.USER_LAT,lng:+window.USER_LNG}; if(window.userLat && window.userLng) return {lat:+window.userLat,lng:+window.userLng}; if(window.userLocation && typeof window.userLocation==="object" && window.userLocation.lat && window.userLocation.lng) return {lat:+window.userLocation.lat,lng:+window.userLocation.lng}; const body = document.body; if(body && body.dataset && body.dataset.lat && body.dataset.lng) return {lat:+body.dataset.lat,lng:+body.dataset.lng}; return null; } /* ----------------------- Bangun Sa'at siang/malam ----------------------- */ function buildSaatsWithLength(sunriseDate, sunsetDate, hourLengthMinutes){ const saats = []; const msLen = hourLengthMinutes * 60000; // Sa'at 1–12 (siang) for(let i=0; i<12; i++){ const start = new Date(sunriseDate.getTime() + i*msLen); const end = new Date(sunriseDate.getTime() + (i+1)*msLen); saats.push({idx:i+1, start, end, origin:"sunrise"}); } // Sa'at 13–24 (malam) for(let i=0; i<12; i++){ const start = new Date(sunsetDate.getTime() + i*msLen); const end = new Date(sunsetDate.getTime() + (i+1)*msLen); saats.push({idx:13+i, start, end, origin:"sunset"}); } return saats; } /* ----------------------- HTML render utama ----------------------- */ function render(container, info, opts){ const { lat, lng, sunriseDate, sunsetDate, saats, dateStr } = info; const el = (typeof container==="string") ? document.getElementById(container) : container; if(!el) return; const goldStyle = "background:linear-gradient(90deg,#fff6d1,#f9e0a6);color:#1b1b12;padding:4px 8px;border-radius:6px;font-weight:700;"; const softGold = "background:#ffdca8;padding:4px 6px;border-radius:6px;font-weight:700;"; const paleGold = "background:#ffecd6;padding:4px 6px;border-radius:6px;font-weight:600;"; let html = ""; html += `
`; html += `

Waktu Falakiyah — ${dateStr}

`; html += `
Latitude
${lat.toFixed(5)}
Longitude
${lng.toFixed(5)}
Syurūq
${formatHM(sunriseDate)}
Maghrib
${formatHM(sunsetDate)}
`; html += `
`; html += ``; saats.forEach(s=>{ let note=""; if(s.idx===1) note = `Puncak (Syurūq)`; else if(s.idx===2) note = `Sa'at 2 (Sekunder)`; else if(s.idx===3) note = `Sa'at 3 (Tersier)`; else if(s.idx===13) note = `Awal Malam`; html += ``; }); html += `
Sa'at Mulai Selesai Catatan
Sa'at ${s.idx} ${formatHM(s.start)} ${formatHM(s.end)} ${note}
`; if(opts && opts.showJsonBlock){ const jsonId = (typeof container==="string") ? container+"-json" : "falaq-json"; html += `
Data JSON

               
`; } html += `

Catatan: Sa'at 1 = Puncak Syurūq (penguasa hari). Sa'at 2 & 3 = sekunder & tersier.

`; html += `
`; el.innerHTML = html; } /* ----------------------- Build JSON output ----------------------- */ function buildOutputJson(info, meta){ return { dateLocal: meta.dateLocalISO, lat: info.lat, lng: info.lng, sunrise: info.sunriseDate.toISOString(), sunset: info.sunsetDate.toISOString(), hourLengthMinutes: meta.hourLengthMinutes, saats: info.saats.map(s => ({ index: s.idx, startIso: s.start.toISOString(), endIso: s.end.toISOString(), startLocal: formatHM(s.start), endLocal: formatHM(s.end), origin: s.origin })) }; } /* ----------------------- Compute & Render Main ----------------------- */ async function computeAndRenderAdvanced(opts){ // opts: { containerId, dateLocal, hourLengthMinutes, overrideSunriseIso, overrideSunsetIso, onJson, showJsonBlock, forceUsePageLocation } const containerId = opts.containerId || 'falaq-times'; const container = (typeof containerId === 'string') ? document.getElementById(containerId) : containerId; if(!container){ console.warn('FalaqTimesAdvanced: container not found'); return null; } // find location from page let loc = findLocationFromPage(); if(!loc && opts.forceUsePageLocation){ container.innerHTML = `
Lokasi tidak ditemukan di halaman. Tambahkan window.USER_LAT / USER_LNG atau non-aktifkan forceUsePageLocation.
`; return null; } if(!loc){ if(!navigator.geolocation){ container.innerHTML = `
Geolocation tidak tersedia di browser ini.
`; return null; } try { const pos = await new Promise((res, rej) => navigator.geolocation.getCurrentPosition(res, rej, { enableHighAccuracy:true, timeout:30000 })); loc = { lat: pos.coords.latitude, lng: pos.coords.longitude }; } catch(e){ container.innerHTML = `
Izin lokasi ditolak atau waktu habis. Pastikan akses lokasi diberikan.
`; return null; } } const dateLocal = (opts.dateLocal instanceof Date) ? opts.dateLocal : new Date(); const hourLengthMinutes = (typeof opts.hourLengthMinutes === 'number' && opts.hourLengthMinutes>0) ? opts.hourLengthMinutes : 60; // compute sunrise/sunset (or use overrides) let sunriseDateLocal, sunsetDateLocal; if(opts.overrideSunriseIso && opts.overrideSunsetIso){ sunriseDateLocal = new Date(opts.overrideSunriseIso); sunsetDateLocal = new Date(opts.overrideSunsetIso); } else { // build UTC midnight for the dateLocal const utcYear = dateLocal.getUTCFullYear(); const utcMonth = dateLocal.getUTCMonth(); const utcDay = dateLocal.getUTCDate(); const dateUTCmidnight = new Date(Date.UTC(utcYear, utcMonth, utcDay, 0,0,0)); const sun = computeSunriseSunsetUTC(dateUTCmidnight, loc.lat, loc.lng); if(isNaN(sun.sunriseUTCmin) || isNaN(sun.sunsetUTCmin)){ container.innerHTML = `
Fenomena polar: matahari tidak terbit/terbenam pada tanggal ini di lokasi Anda.
`; return null; } sunriseDateLocal = minutesToLocalDate(dateLocal, sun.sunriseUTCmin); sunsetDateLocal = minutesToLocalDate(dateLocal, sun.sunsetUTCmin); } // build saats const saats = buildSaatsWithLength(sunriseDateLocal, sunsetDateLocal, hourLengthMinutes); const dateStr = dateLocal.toLocaleDateString(); // render html render(container, { lat: loc.lat, lng: loc.lng, sunriseDate: sunriseDateLocal, sunsetDate: sunsetDateLocal, saats, dateStr }, { showJsonBlock: !!opts.showJsonBlock }); // build json const meta = { dateLocalISO: dateLocal.toISOString(), hourLengthMinutes }; const outJson = buildOutputJson({ lat: loc.lat, lng: loc.lng, sunriseDate: sunriseDateLocal, sunsetDate: sunsetDateLocal, saats }, meta); // callback if(typeof opts.onJson === 'function'){ try{ opts.onJson(outJson); } catch(e){ console.warn('onJson callback error', e); } } // write json block if present if(opts.showJsonBlock){ const jsonId = (typeof containerId === 'string') ? containerId + '-json' : 'falaq-json'; const pre = document.getElementById(jsonId); if(pre) pre.textContent = JSON.stringify(outJson, null, 2); } return outJson; } /* ----------------------- PUBLIC API ----------------------- */ return { init: function(initOpts){ const opts = Object.assign({ containerId: 'falaq-times', dateLocal: new Date(), hourLengthMinutes: 60, overrideSunriseIso: null, overrideSunsetIso: null, onJson: null, showJsonBlock: false, forceUsePageLocation:false }, initOpts || {}); const container = (typeof opts.containerId === 'string') ? document.getElementById(opts.containerId) : opts.containerId; if(!container){ console.warn('FalaqTimesAdvanced: container not found'); return; } container.innerHTML = `
Menghitung waktu falakiyah... (menggunakan lokasi halaman bila tersedia)
`; computeAndRenderAdvanced(opts) .then(result => {}) .catch(err => console.error(err)); }, computeForDate: function(opts){ // sama seperti init tapi wajib ada dateLocal return computeAndRenderAdvanced(opts); } }; })(); // END FalaqTimesAdvanced
Falaqyah Digital Al-Hikmah
Sistem Falakiyah Ruhaniyah Digital Pertama di Dunia
Akurat • Presisi • Terverifikasi

Founder & System Architect:
Endry Arya Hukama
AL-HIKMAH
EMERALD MASTER SYSTEM CAKRA BUANA
◈ ◈ ◈

Web Falaqyah ini disusun dengan presisi dan kebenaran,
berdasarkan petunjuk para Guru serta tiga rujukan Falaqyah utama:

Manba‘u Ushûl al-Hikmah al-Lum‘ah fî al-Syams al-Ma‘ārif Mujarrabât al-Dairabî al-Kubrā
◈ ◈ ◈