/** * WETON & PRIMBON ENGINE * Pure JavaScript - Frontend Only * * Weton = combination of 7-day week + 5-day Pasaran cycle * Total: 7 × 5 = 35 unique Weton combinations * * Pasaran days (5-day cycle): Legi, Pahing, Pon, Wage, Kliwon * * Reference date: 1 Jan 2025 = Wednesday + Pahing * Wednesday index = 3 (0=Sun..6=Sat), Pahing index = 1 */ const PASA_NAMES = ['Legi', 'Pahing', 'Pon', 'Wage', 'Kliwon']; const PASA_NEERU = [5, 9, 7, 4, 8]; // mystical weight values const DAY_NAMES = ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu']; const DAY_NEERU = [5, 4, 3, 7, 8, 6, 9]; // mystical weight values /** Reference: 01 Jan 2025 = Rabu (index 3) + Pahing (index 1) */ const REF_Y = 2025, REF_M = 0, REF_D = 1; const REF_DOW = 3; // Wednesday const REF_PAS = 1; // Pahing /** Days since 1970-01-01 */ function daysSinceEpoch(y, m, d) { const date = new Date(y, m, d); const epoch = new Date(1970, 0, 1); return Math.floor((date - epoch) / 86400000); } /** Get day of week name (0=Sunday..6=Saturday) */ function getDayOfWeek(y, m, d) { return new Date(y, m, d).getDay(); } /** Get Pasaran name for a given date */ function getPasaran(y, m, d) { const refDays = daysSinceEpoch(REF_Y, REF_M, REF_D); const targetDays = daysSinceEpoch(y, m, d); const diff = targetDays - refDays; const pasIdx = ((REF_PAS + diff) % 5 + 5) % 5; return { index: pasIdx, name: PASA_NAMES[pasIdx], neeru: PASA_NEERU[pasIdx] }; } /** Get complete Weton info */ function getWeton(y, m, d) { const dow = getDayOfWeek(y, m, d); const pas = getPasaran(y, m, d); const totalNeeru = DAY_NEERU[dow] + pas.neeru; return { date: { year: y, month: m + 1, day: d }, day: { index: dow, name: DAY_NAMES[dow], neeru: DAY_NEERU[dow] }, pasaran: pas, weton: DAY_NAMES[dow] + ' ' + pas.name, totalNeeru: totalNeeru }; } /** Get all 35 Weton combinations with meanings */ function getWetonMeanings() { const meanings = { 'Minggu Legi': { neeru: 10, character: 'Senang belajar, bijaksana, berwibawa, tetapi mudah tersinggung', career: 'Cocok sebagai guru, penasihat, pemuka agama', wealth: 'Rezeki cukup, harus rajin menabung', love: 'Setia tetapi posesif', match: ['Rabu Pon', 'Jumat Kliwon', 'Sabtu Legi'], avoid: ['Senin Pahing', 'Selasa Wage'], animal: 'Macan (pemberani, pemimpin)', element: 'Tanah' }, 'Minggu Pahing': { neeru: 14, character: 'Berani, tegas, keras kepala, pekerja keras', career: 'Cocok sebagai pengusaha, polisi, militer', wealth: 'Rezeki besar tetapi cepat habis', love: 'Setia tetapi mudah cemburu', match: ['Selasa Kliwon', 'Kamis Legi'], avoid: ['Sabtu Pon', 'Senin Wage'], animal: 'Harimau (berwibawa, disegani)', element: 'Api' }, 'Minggu Pon': { neeru: 12, character: 'Pandai bergaul, humoris, suka membantu, sedikit ceroboh', career: 'Cocok di bidang jasa, hiburan, sales', wealth: 'Rezeki lancar, rejeki nomplok sering datang', love: 'Romantis, setia', match: ['Selasa Legi', 'Kamis Pahing', 'Sabtu Pon'], avoid: ['Rabu Wage', 'Jumat Kliwon'], animal: 'Kera (cerdas, lincah)', element: 'Kayu' }, 'Minggu Wage': { neeru: 9, character: 'Penyabar, teliti, suka keindahan, agak pemalu', career: 'Cocok sebagai seniman, desainer, peneliti', wealth: 'Rezeki cukup, harus usaha keras', love: 'Romantis tetapi sulit mengungkapkan perasaan', match: ['Senin Legi', 'Kamis Pon'], avoid: ['Selasa Pahing', 'Sabtu Kliwon'], animal: 'Rusa (lembut, waspada)', element: 'Air' }, 'Minggu Kliwon': { neeru: 13, character: 'Bijaksana, karismatik, suka merenung, pendiam', career: 'Cocok sebagai pendeta, filsuf, psikolog', wealth: 'Rezeki stabil, tidak suka bermewah-mewah', love: 'Setia, tidak suka keributan', match: ['Selasa Legi', 'Jumat Pon'], avoid: ['Kamis Pahing', 'Sabtu Wage'], animal: 'Gajah (kuat, bijaksana)', element: 'Tanah' }, 'Senin Legi': { neeru: 9, character: 'Ramah, murah hati, suka bersosialisasi, ambisius', career: 'Cocok di politik, organisasi, bisnis', wealth: 'Rezeki melimpah, pandai mengelola uang', love: 'Penuh perhatian, agak posesif', match: ['Rabu Pahing', 'Kamis Pon', 'Sabtu Kliwon'], avoid: ['Selasa Wage', 'Minggu Kliwon'], animal: 'Kerbau (ulet, pekerja keras)', element: 'Tanah' }, 'Senin Pahing': { neeru: 13, character: 'Kreatif, inovatif, suka tantangan, mudah bosan', career: 'Cocok di startup, teknologi, wirausaha', wealth: 'Rezeki besar, agak boros', love: 'Setia ketika sudah menemukan yang tepat', match: ['Kamis Legi', 'Sabtu Pon'], avoid: ['Selasa Kliwon', 'Minggu Wage'], animal: 'Elang (visioner, mandiri)', element: 'Api' }, 'Senin Pon': { neeru: 11, character: 'Cerdas, komunikatif, suka debat, keras kepala', career: 'Cocok sebagai pengacara, dosen, jurnalis', wealth: 'Rezeki cukup, kadang besar kadang kecil', love: 'Setia tetapi suka berdebat', match: ['Rabu Wage', 'Jumat Legi'], avoid: ['Kamis Pahing', 'Minggu Kliwon'], animal: 'Serigala (cerdas, sosial)', element: 'Udara' }, 'Senin Wage': { neeru: 8, character: 'Sederhana, jujur, pekerja keras, kurang percaya diri', career: 'Cocok di bidang teknik, pertanian, pegawai', wealth: 'Rezeki pas-pasan, harus disiplin menabung', love: 'Setia, tidak neko-neko', match: ['Selasa Kliwon', 'Kamis Pon', 'Sabtu Legi'], avoid: ['Rabu Pahing', 'Minggu Pon'], animal: 'Kambing (sederhana, ulet)', element: 'Tanah' }, 'Senin Kliwon': { neeru: 12, character: 'Karismatik, intuitif, spiritual, sensitif', career: 'Cocok di bidang spiritual, konsultan, psikolog', wealth: 'Rezeki tidak menentu, kadang lancar kadang macet', love: 'Setia, romantis, butuh pengertian', match: ['Rabu Legi', 'Jumat Pahing'], avoid: ['Selasa Wage', 'Kamis Pon'], animal: 'Merak (indah, karismatik)', element: 'Air' }, 'Selasa Legi': { neeru: 8, character: 'Pemberani, mandiri, suka kebebasan, keras kepala', career: 'Cocok sebagai pengusaha, atlet, explorer', wealth: 'Rezeki baik, kadang besar mendadak', love: 'Setia, tidak suka diatur', match: ['Kamis Pahing', 'Sabtu Kliwon'], avoid: ['Senin Wage', 'Minggu Pon'], animal: 'Singa (berani, pemimpin)', element: 'Api' }, 'Selasa Pahing': { neeru: 12, character: 'Cerdas, strategis, suka merencanakan, agak tertutup', career: 'Cocok sebagai analis, manajer, pengacara', wealth: 'Rezeki besar, pandai berinvestasi', love: 'Setia tapi tidak romantis', match: ['Kamis Legi', 'Sabtu Pon'], avoid: ['Senin Kliwon', 'Rabu Wage'], animal: 'Ular (cerdas, strategis)', element: 'Udara' }, 'Selasa Pon': { neeru: 10, character: 'Ramah, supel, suka traveling, kurang sabar', career: 'Cocok di pariwisata, transportasi, diplomat', wealth: 'Rezeki cukup, suka harta benda', love: 'Mudah jatuh cinta, butuh stimulasi', match: ['Kamis Kliwon', 'Sabtu Legi'], avoid: ['Senin Pahing', 'Rabu Pon'], animal: 'Kuda (bebas, suka bepergian)', element: 'Udara' }, 'Selasa Wage': { neeru: 7, character: 'Jujur, polos, pekerja keras, mudah dimanfaatkan', career: 'Cocok sebagai petani, nelayan, buruh', wealth: 'Rezeki pas-pasan, harus kerja ekstra', love: 'Setia, agak canggung', match: ['Rabu Kliwon', 'Jumat Pon'], avoid: ['Senin Legi', 'Kamis Pahing'], animal: 'Sapi (ulet, sabar)', element: 'Tanah' }, 'Selasa Kliwon': { neeru: 11, character: 'Misterius, intuitif, pendiam, berwibawa', career: 'Cocok sebagai detektif, peneliti, paranormal', wealth: 'Rezeki misterius, sering rejeki nomplok', love: 'Setia dalam diam, setia sekali', match: ['Kamis Legi', 'Sabtu Pahing'], avoid: ['Senin Wage', 'Rabu Pon'], animal: 'Burung Hantu (bijak, misterius)', element: 'Air' }, 'Rabu Legi': { neeru: 12, character: 'Pekerja keras, pantang menyerah, pendiam, tekun', career: 'Cocok sebagai engineer, arsitek, peneliti', wealth: 'Rezeki stabil meningkat, pandai menabung', love: 'Setia, setia, dan setia', match: ['Kamis Pahing', 'Sabtu Kliwon'], avoid: ['Selasa Legi', 'Minggu Wage'], animal: 'Semut (rajin, gotong royong)', element: 'Tanah' }, 'Rabu Pahing': { neeru: 16, character: 'Kuat, karismatik, pemimpin alami, agak keras', career: 'Cocok sebagai CEO, komandan, pemimpin proyek', wealth: 'Rezeki besar, rejeki nomplok sering', love: 'Posesif, protektif, setia', match: ['Jumat Legi', 'Minggu Kliwon'], avoid: ['Selasa Pon', 'Kamis Wage'], animal: 'Naga (kuat, karismatik)', element: 'Api' }, 'Rabu Pon': { neeru: 14, character: 'Komunikatif, cerdas, humoris, suka menjadi pusat perhatian', career: 'Cocok sebagai entertainer, MC, presenter', wealth: 'Rezeki lancar, pandai cari uang', love: 'Romantis, setia, suka kejutan', match: ['Sabtu Legi', 'Minggu Pahing'], avoid: ['Kamis Pon', 'Selasa Kliwon'], animal: 'Lumba-lumba (cerdas, sosial)', element: 'Udara' }, 'Rabu Wage': { neeru: 11, character: 'Penyayang, perhatian, intuitif, suka menolong', career: 'Cocok sebagai dokter, perawat, pekerja sosial', wealth: 'Rezeki cukup, sering membantu orang lain', love: 'Romantis, penuh perhatian', match: ['Senin Pahing', 'Kamis Kliwon'], avoid: ['Selasa Legi', 'Jumat Pon'], animal: 'Kucing (lembut, penyayang)', element: 'Air' }, 'Rabu Kliwon': { neeru: 15, character: 'Bijaksana, filosofis, pendiam, berwawasan luas', career: 'Cocok sebagai filsuf, penulis, akademisi', wealth: 'Rezeki sederhana, tidak materialistis', love: 'Setia, butuh kedalaman emosional', match: ['Kamis Legi', 'Sabtu Pahing'], avoid: ['Senin Pon', 'Minggu Wage'], animal: 'Kura-kura (bijak, panjang umur)', element: 'Air' }, 'Kamis Legi': { neeru: 13, character: 'Berwibawa, disegani, adil, bijaksana', career: 'Cocok sebagai hakim, pemimpin, diplomat', wealth: 'Rezeki baik, stabil', love: 'Setia, agak kaku', match: ['Sabtu Pon', 'Minggu Kliwon'], avoid: ['Selasa Wage', 'Rabu Pahing'], animal: 'Garuda (berwibawa, perkasa)', element: 'Udara' }, 'Kamis Pahing': { neeru: 17, character: 'Kreatif, bersemangat, inovatif, agak keras kepala', career: 'Cocok sebagai pengusaha, inovator, seniman', wealth: 'Rezeki melimpah, suka bermewah-mewah', love: 'Bergairah, butuh pasangan yang setara', match: ['Senin Legi', 'Sabtu Kliwon'], avoid: ['Rabu Wage', 'Minggu Pon'], animal: 'Merak (indah, percaya diri)', element: 'Api' }, 'Kamis Pon': { neeru: 15, character: 'Pandai bergaul, supel, mudah beradaptasi', career: 'Cocok sebagai diplomat, sales, public relation', wealth: 'Rezeki lancar, dari berbagai sumber', love: 'Romantis, setia, pandai mengambil hati', match: ['Selasa Pahing', 'Minggu Legi'], avoid: ['Jumat Wage', 'Sabtu Pon'], animal: 'Kupu-kupu (indah, mudah beradaptasi)', element: 'Udara' }, 'Kamis Wage': { neeru: 12, character: 'Teliti, perfeksionis, sabar, agak kaku', career: 'Cocok sebagai akuntan, auditor, quality control', wealth: 'Rezeki stabil, pandai mengatur keuangan', love: 'Setia, tidak romantis tapi bertanggung jawab', match: ['Senin Pon', 'Jumat Kliwon'], avoid: ['Selasa Legi', 'Minggu Pahing'], animal: 'Lebah (rajin, teratur)', element: 'Tanah' }, 'Kamis Kliwon': { neeru: 16, character: 'Intuitif, spiritual, pendiam, berwibawa', career: 'Cocok sebagai spiritual leader, konsultan, mentor', wealth: 'Rezeki tidak menentu, sering rejeki tak terduga', love: 'Setia, butuh pasangan yang pengertian', match: ['Selasa Legi', 'Sabtu Pon'], avoid: ['Senin Wage', 'Rabu Pahing'], animal: 'Serigala putih (bijak, mistis)', element: 'Air' }, 'Jumat Legi': { neeru: 11, character: 'Murah hati, supel, dermawan, suka bersenang-senang', career: 'Cocok sebagai pengusaha, filantropis, event organizer', wealth: 'Rezeki melimpah, suka berbagi', love: 'Romantis, setia, manja', match: ['Selasa Pahing', 'Minggu Kliwon'], avoid: ['Kamis Wage', 'Rabu Pon'], animal: 'Gajah (murah hati, kuat)', element: 'Tanah' }, 'Jumat Pahing': { neeru: 15, character: 'Ambisius, pekerja keras, agak temperamental', career: 'Cocok sebagai atlet, militer, entrepreneur', wealth: 'Rezeki besar, harus hati-hati dengan utang', love: 'Bergairah, posesif', match: ['Kamis Legi', 'Sabtu Pahing'], avoid: ['Selasa Pon', 'Minggu Wage'], animal: 'Macan tutul (gesit, agresif)', element: 'Api' }, 'Jumat Pon': { neeru: 13, character: 'Cerdas, humoris, suka belajar, ramah', career: 'Cocok sebagai guru, penulis, pembicara', wealth: 'Rezeki cukup, dari berbagai sumber', love: 'Setia, suka bercanda, menyenangkan', match: ['Senin Pahing', 'Kamis Kliwon'], avoid: ['Selasa Legi', 'Sabtu Wage'], animal: 'Monyet (cerdas, lucu)', element: 'Udara' }, 'Jumat Wage': { neeru: 10, character: 'Pendiam, perenung, setia, suka menyendiri', career: 'Cocok sebagai peneliti, pustakawan, penulis', wealth: 'Rezeki sederhana, cukup untuk hidup', love: 'Setia, setia, tidak suka drama', match: ['Selasa Kliwon', 'Kamis Pon'], avoid: ['Senin Legi', 'Minggu Pahing'], animal: 'Kancil (cerdik, pendiam)', element: 'Tanah' }, 'Jumat Kliwon': { neeru: 14, character: 'Karismatik, mistis, berwibawa, misterius', career: 'Cocok sebagai paranormal, dukun, pemuka agama', wealth: 'Rezeki mistis, sering tak terduga', love: 'Setia dalam diam, misterius', match: ['Rabu Legi', 'Sabtu Pahing'], avoid: ['Senin Pon', 'Kamis Wage'], animal: 'Kucing hitam (mistis, karismatik)', element: 'Air' }, 'Sabtu Legi': { neeru: 14, character: 'Pekerja keras, ulet, tahan banting, optimis', career: 'Cocok sebagai wirausaha, petani, kontraktor', wealth: 'Rezeki baik, rejeki dari kerja keras', love: 'Setia, tetapi sibuk bekerja', match: ['Kamis Pahing', 'Minggu Pon'], avoid: ['Selasa Wage', 'Rabu Kliwon'], animal: 'Kerbau (ulet, tangguh)', element: 'Tanah' }, 'Sabtu Pahing': { neeru: 18, character: 'Kuat, berwibawa, karismatik, suka memimpin', career: 'Cocok sebagai pemimpin, komandan, bos', wealth: 'Rezeki besar, rejeki melimpah', love: 'Posesif, protektif', match: ['Senin Kliwon', 'Rabu Legi'], avoid: ['Kamis Pon', 'Sabtu Legi'], animal: 'Singa (raja, karismatik)', element: 'Api' }, 'Sabtu Pon': { neeru: 16, character: 'Komunikatif, supel, kreatif, mudah bergaul', career: 'Cocok sebagai marketing, entertainer, public figure', wealth: 'Rezeki lancar, dari relasi dan jaringan', love: 'Romantis, setia, suka bersosialisasi', match: ['Senin Legi', 'Kamis Kliwon'], avoid: ['Selasa Pahing', 'Rabu Pon'], animal: 'Kupu-kupu sosial (ramah, supel)', element: 'Udara' }, 'Sabtu Wage': { neeru: 13, character: 'Perfeksionis, pekerja keras, sabar, detail', career: 'Cocok sebagai koki, perajin, quality control', wealth: 'Rezeki stabil, dari keterampilan tangan', love: 'Setia, perhatian pada detail kecil', match: ['Selasa Legi', 'Kamis Pahing'], avoid: ['Senin Pon', 'Minggu Kliwon'], animal: 'Berang-berang (rajin, terampil)', element: 'Tanah' }, 'Sabtu Kliwon': { neeru: 17, character: 'Bijaksana, mistis, pendiam, berwibawa', career: 'Cocok sebagai dukun, spiritual guide, healer', wealth: 'Rezeki spiritual, sering rejeki ajaib', love: 'Setia, misterius, romantis dalam diam', match: ['Rabu Pahing', 'Jumat Legi'], avoid: ['Senin Wage', 'Kamis Pon'], animal: 'Burung hantu putih (bijak, mistis)', element: 'Air' } }; return meanings; } /** Get Weton match compatibility */ function getWetonCompatibility(weton1, weton2) { const meanings = getWetonMeanings(); const m1 = meanings[weton1]; const m2 = meanings[weton2]; if (!m1 || !m2) return null; const n1 = m1.neeru; const n2 = m2.neeru; const total = n1 + n2; const mod = total % 5; const results = [ { score: 3, meaning: 'Sangat Baik', desc: 'Kedua pasangan saling melengkapi, harmonis, dan langgeng' }, { score: 2, meaning: 'Cukup Baik', desc: 'Cocok, butuh saling pengertian dan kompromi' }, { score: 1, meaning: 'Kurang Cocok', desc: 'Sering terjadi perbedaan pendapat, harus sabar' }, { score: 1, meaning: 'Kurang Cocok', desc: 'Banyak tantangan, butuh usaha ekstra' }, { score: 2, meaning: 'Cukup Baik', desc: 'Cocok dengan catatan, butuh komunikasi intensif' } ]; return { totalNeeru: total, mod: mod, compatibility: results[mod], suggestion: mod === 0 ? 'Sangat cocok! Rumah tangga harmonis dan langgeng.' : mod === 1 || mod === 3 ? 'Perlu kompromi dan saling pengertian.' : 'Cocok, asal saling menghargai.' }; } /** Zodiac date ranges */ const ZODIAC = [ { id: 'aries', en: 'Aries', idn: 'Aries', start: [3, 21], end: [4, 19], element: 'Api' }, { id: 'taurus', en: 'Taurus', idn: 'Taurus', start: [4, 20], end: [5, 20], element: 'Tanah' }, { id: 'gemini', en: 'Gemini', idn: 'Gemini', start: [5, 21], end: [6, 20], element: 'Udara' }, { id: 'cancer', en: 'Cancer', idn: 'Cancer', start: [6, 21], end: [7, 22], element: 'Air' }, { id: 'leo', en: 'Leo', idn: 'Leo', start: [7, 23], end: [8, 22], element: 'Api' }, { id: 'virgo', en: 'Virgo', idn: 'Virgo', start: [8, 23], end: [9, 22], element: 'Tanah' }, { id: 'libra', en: 'Libra', idn: 'Libra', start: [9, 23], end: [10, 22], element: 'Udara' }, { id: 'scorpio', en: 'Scorpio', idn: 'Scorpio', start: [10, 23], end: [11, 21], element: 'Air' }, { id: 'sagittarius', en: 'Sagittarius', idn: 'Sagitarius', start: [11, 22], end: [12, 21], element: 'Api' }, { id: 'capricorn', en: 'Capricorn', idn: 'Capricorn', start: [12, 22], end: [1, 19], element: 'Tanah' }, { id: 'aquarius', en: 'Aquarius', idn: 'Aquarius', start: [1, 20], end: [2, 18], element: 'Udara' }, { id: 'pisces', en: 'Pisces', idn: 'Pisces', start: [2, 19], end: [3, 20], element: 'Air' } ]; /** Get zodiac from date */ function getZodiac(y, m, d) { const md = m * 100 + d; for (const z of ZODIAC) { const s = z.start[0] * 100 + z.start[1]; const e = z.end[0] * 100 + z.end[1]; if (z.id === 'capricorn') { if (md >= s || md <= e) return z; } else { if (md >= s && md <= e) return z; } } return ZODIAC[9]; // default capricorn }