PageSourceSearch

https://lunarapp-urania-production.up.railway.app/static/js/carta-fase.js

js lunarapp-urania-production.up.railway.app collected 2026-10-03 12:13:02 UTC 19,133 bytes, 254 lines download raw bytes

1/**
2 * CARTA FASE - Carta natal para fases lunares
3 * Se incluye en index.html y calendario.html
4 * Usa /api/eclipse/carta y /api/eclipse/astrocartografia
5 * IDs con prefijo 'cf-' para no colisionar con eclipses.html
6 * z-index:10000 para estar encima del modal del calendario (9998)
7 */
8var cfUserLat=-41.1335, cfUserLon=-71.3103, cfUserCiudad='San Carlos de Bariloche';
9var cfCurrentData=null, cfAstrocartoLoaded=false, cfAstrocartoMap=null;
10
11// Convertir fecha JS a Día Juliano (UTC)
12function cfDateToJD(date){
13    var y=date.getUTCFullYear(),m=date.getUTCMonth()+1,d=date.getUTCDate()+date.getUTCHours()/24+date.getUTCMinutes()/1440+date.getUTCSeconds()/86400;
14    if(m<=2){y--;m+=12;}
15    var A=Math.floor(y/100),B=2-A+Math.floor(A/4);
16    return Math.floor(365.25*(y+4716))+Math.floor(30.6001*(m+1))+d+B-1524.5;
17}
18// Calcular JD para un día del calendario usando hora local actual
19function cfJDParaDia(year,month,day){
20    var ahora=new Date();
21    var fecha=new Date(year,month-1,day,ahora.getHours(),ahora.getMinutes(),ahora.getSeconds());
22    return cfDateToJD(fecha);
23}
24
25var CF_SIGNOS={'Aries':'\u2648','Tauro':'\u2649','G\u00e9minis':'\u264a','C\u00e1ncer':'\u264b','Leo':'\u264c','Virgo':'\u264d','Libra':'\u264e','Escorpio':'\u264f','Sagitario':'\u2650','Capricornio':'\u2651','Acuario':'\u2652','Piscis':'\u2653'};
26var CF_PLANETAS={'Sol':'\u2609','Luna':'\u263d','Mercurio':'\u263f','Venus':'\u2640','Marte':'\u2642','J\u00fapiter':'\u2643','Saturno':'\u2644','Urano':'\u2645','Neptuno':'\u2646','Plut\u00f3n':'\u2647','Nodo Norte':'\u260a','Nodo Sur':'\u260b'};
27var CF_COLORES={'Sol':'#FFD700','Luna':'#FFFFFF','Mercurio':'#00FF88','Venus':'#FF69B4','Marte':'#FF2222','J\u00fapiter':'#AA77FF','Saturno':'#DDAA44','Urano':'#00CCDD','Neptuno':'#4488FF','Plut\u00f3n':'#CC5555'};
28var CF_SIMB={'Sol':'\u2609','Luna':'\u263d','Mercurio':'\u263f','Venus':'\u2640','Marte':'\u2642','J\u00fapiter':'\u2643','Saturno':'\u2644','Urano':'\u2645','Neptuno':'\u2646','Plut\u00f3n':'\u2647'};
29
30function cfObtenerUbicacion(){
31    if(navigator.geolocation){
32        navigator.geolocation.getCurrentPosition(function(pos){
33            cfUserLat=pos.coords.latitude; cfUserLon=pos.coords.longitude;
34            cfUserCiudad=cfUserLat.toFixed(2)+'\u00b0, '+cfUserLon.toFixed(2)+'\u00b0';
35            fetch('https://nominatim.openstreetmap.org/reverse?lat='+cfUserLat+'&lon='+cfUserLon+'&format=json&accept-language=es')
36            .then(function(r){return r.json();}).then(function(d){if(d.address)cfUserCiudad=d.address.city||d.address.town||d.address.village||cfUserCiudad;}).catch(function(){});
37        },function(){},{timeout:5000});
38    }
39}
40function cfUsarGPS(){
41    if(!navigator.geolocation){alert('GPS no disponible');return;}
42    navigator.geolocation.getCurrentPosition(function(pos){
43        cfUserLat=pos.coords.latitude;cfUserLon=pos.coords.longitude;
44        fetch('https://nominatim.openstreetmap.org/reverse?lat='+cfUserLat+'&lon='+cfUserLon+'&format=json&accept-language=es')
45        .then(function(r){return r.json();}).then(function(d){
46            if(d.address)cfUserCiudad=d.address.city||d.address.town||d.address.village||cfUserLat.toFixed(2)+'\u00b0, '+cfUserLon.toFixed(2)+'\u00b0';
47            if(cfCurrentData)cfRecargarCarta();
48        }).catch(function(){if(cfCurrentData)cfRecargarCarta();});
49    },function(){alert('No se pudo obtener GPS');},{timeout:10000});
50}
51function cfCambiarUbicacion(){
52    var c=prompt('Ingres\u00e1 la ciudad (ej: Buenos Aires, Madrid, New York):');
53    if(!c)return;
54    fetch('https://nominatim.openstreetmap.org/search?q='+encodeURIComponent(c)+'&format=json&limit=1&accept-language=es')
55    .then(function(r){return r.json();}).then(function(d){
56        if(d.length>0){cfUserLat=parseFloat(d[0].lat);cfUserLon=parseFloat(d[0].lon);cfUserCiudad=d[0].display_name.split(',')[0];
57        alert('Ubicaci\u00f3n: '+cfUserCiudad+' ('+cfUserLat.toFixed(2)+'\u00b0, '+cfUserLon.toFixed(2)+'\u00b0)');
58        if(cfCurrentData)cfRecargarCarta();}
59        else alert('Ciudad no encontrada.');
60    }).catch(function(){alert('Error buscando la ciudad');});
61}
62function cfRecargarCarta(){if(cfCurrentData)cfAbrirCarta(cfCurrentData.jd,cfCurrentData.titulo);}
63
64async function cfAbrirCarta(jd,titulo){
65    cfCurrentData={jd:jd,titulo:titulo};
66    cfAstrocartoLoaded=false;
67    document.getElementById('cf-carta-titulo').textContent=titulo;
68    document.getElementById('cf-ubicacion-texto').textContent=cfUserCiudad+' ('+cfUserLat.toFixed(2)+'\u00b0, '+cfUserLon.toFixed(2)+'\u00b0)';
69    var modal=document.getElementById('cf-modal-carta');
70    modal.style.display='block';
71    document.body.style.overflow='hidden';
72    document.querySelectorAll('.cf-tab-btn').forEach(function(b){
73        b.style.background='#1a1a3e';b.style.color='#ccc';b.style.borderColor='#2a2a4a';b.style.fontWeight='normal';
74    });
75    document.querySelectorAll('.cf-tab-content').forEach(function(c){c.style.display='none';});
76    var firstTab=document.querySelector('.cf-tab-btn[data-tab="cf-carta"]');
77    firstTab.style.background='linear-gradient(135deg,#d4af37,#b8962e)';firstTab.style.color='#0f0f1e';firstTab.style.borderColor='#d4af37';firstTab.style.fontWeight='600';
78    document.getElementById('cf-carta').style.display='block';
79    document.getElementById('cf-astrochart-container').innerHTML='<p style="text-align:center;color:#888;padding:2rem;">\u23f3 Calculando carta astral...</p>';
80    try{
81        var r=await fetch('/api/eclipse/carta?jd='+jd+'&lat='+cfUserLat+'&lon='+cfUserLon+'&tipo=solar');
82        var data=await r.json();
83        if(data.exito){cfDibujarCarta(data);cfLlenarPosiciones(data.planetas);cfLlenarAspectos(data.aspectos);cfLlenarCasas(data.casas,data.angulares);cfLlenarTecnicos(data.datos_tecnicos);}
84        else{document.getElementById('cf-astrochart-container').innerHTML='<p style="color:#ff6347;">\u274c '+data.error+'</p>';}
85    }catch(e){document.getElementById('cf-astrochart-container').innerHTML='<p style="color:#ff6347;">\u274c '+e.message+'</p>';}
86}
87function cfCerrarCarta(){document.getElementById('cf-modal-carta').style.display='none';document.body.style.overflow='';}
88
89function cfCambiarTab(btn,tabId){
90    document.querySelectorAll('.cf-tab-btn').forEach(function(b){
91        b.style.background='#1a1a3e';b.style.color='#ccc';b.style.borderColor='#2a2a4a';b.style.fontWeight='normal';
92    });
93    document.querySelectorAll('.cf-tab-content').forEach(function(c){c.style.display='none';});
94    btn.style.background='linear-gradient(135deg,#d4af37,#b8962e)';btn.style.color='#0f0f1e';btn.style.borderColor='#d4af37';btn.style.fontWeight='600';
95    document.getElementById(tabId).style.display='block';
96    if(tabId==='cf-astrocarto'&&cfCurrentData&&!cfAstrocartoLoaded)cfCargarAstrocartografia();
97}
98
99function cfDibujarCarta(data){
100    var container=document.getElementById('cf-astrochart-container');container.innerHTML='';
101    var planetMap={'Sol':'Sun','Luna':'Moon','Mercurio':'Mercury','Venus':'Venus','Marte':'Mars','J\u00fapiter':'Jupiter','Saturno':'Saturn','Urano':'Uranus','Neptuno':'Neptune','Plut\u00f3n':'Pluto','Nodo Norte':'NNode'};
102    var planets={};
103    for(var nombre in planetMap){var p=data.planetas[nombre];if(p){var key=planetMap[nombre];if(p.retrogrado&&nombre!=='Nodo Norte'&&nombre!=='Nodo Sur'){planets[key]=[p.lon,-1];}else{planets[key]=[p.lon];}}}
104    var cusps=[];for(var i=1;i<=12;i++){var casa=data.casas['Casa '+i];cusps.push(casa?casa.lon:(i-1)*30);}
105    var settings={
106        SYMBOL_SCALE:1, COLOR_BACKGROUND:"#0f0f1e", POINTS_COLOR:"#d4af37", SIGNS_COLOR:"#d4af37",
107        CIRCLE_COLOR:"#5a5a8a", LINE_COLOR:"#4a4a7a", CUSPS_FONT_COLOR:"#aaa",
108        MARGIN:50, PADDING:24, INNER_CIRCLE_RADIUS_RATIO:6,
109        COLORS_SIGNS:["#CC3333","#339933","#CCCC33","#6699CC","#FF8800","#886644","#CC66AA","#993333","#9966CC","#336655","#339999","#4466BB"],
110        ASPECTS:{"conjunction":{"degree":0,"orbit":8,"color":"#FFD700"},"sextile":{"degree":60,"orbit":6,"color":"#44DDDD"},"square":{"degree":90,"orbit":7,"color":"#FF4444"},"trine":{"degree":120,"orbit":8,"color":"#44FF88"},"opposition":{"degree":180,"orbit":8,"color":"#FF6666"}}
111    };
112    var cs=700;
113    var chartDiv=document.createElement('div');chartDiv.id='cf-paper-'+Date.now();chartDiv.style.cssText='width:100%;display:flex;justify-content:center;';container.appendChild(chartDiv);
114    try{
115        var chart=new astrochart.Chart(chartDiv.id,cs,cs,settings);
116        var radix=chart.radix({planets:planets,cusps:cusps});
117        radix.addPointsOfInterest({"As":[cusps[0]],"Ic":[cusps[3]],"Ds":[cusps[6]],"Mc":[cusps[9]]});
118        radix.aspects();
119        var svgEl=chartDiv.querySelector('svg');
120        if(svgEl){svgEl.style.maxWidth='100%';svgEl.style.height='auto';}
121    }catch(e){container.innerHTML='<p style="color:#ff6347;text-align:center;">Error: '+e.message+'</p>';}
122}
123
124function cfLlenarPosiciones(pl){
125    var tbody=document.querySelector('#cf-tabla-planetas tbody');
126    var orden=['Sol','Luna','Mercurio','Venus','Marte','J\u00fapiter','Saturno','Urano','Neptuno','Plut\u00f3n','Nodo Norte','Nodo Sur'];
127    tbody.innerHTML=orden.map(function(n){var p=pl[n];if(!p)return '';
128    var ret=p.retrogrado&&n!=='Nodo Norte'&&n!=='Nodo Sur'?'<span style="color:#ff6b6b;">R</span>':'';
129    return '<tr><td>'+(CF_PLANETAS[n]||'')+' '+n+'</td><td>'+(CF_SIGNOS[p.signo]||'')+' '+p.signo+'</td><td>'+p.grado+'</td><td>'+p.lon.toFixed(2)+'\u00b0</td><td>'+ret+'</td></tr>';}).join('');
130}
131function cfLlenarAspectos(asp){
132    var c=document.getElementById('cf-aspectos-lista');
133    if(!asp||!asp.length){c.innerHTML='<p style="color:#888;">Sin aspectos</p>';return;}
134    c.innerHTML=asp.map(function(a){return '<div style="display:flex;justify-content:space-between;padding:0.4rem 0;border-bottom:1px solid rgba(255,255,255,0.05);font-size:0.85rem;"><span>'+(CF_PLANETAS[a.planeta1]||'')+' '+a.planeta1+' '+a.simbolo+' '+(CF_PLANETAS[a.planeta2]||'')+' '+a.planeta2+'</span><span style="color:#888;">'+a.aspecto+' ('+a.orbe+'\u00b0)</span></div>';}).join('');
135}
136function cfLlenarCasas(casas,ang){
137    var c=document.getElementById('cf-casas-info');var h='<h3 style="color:#d4af37;margin-bottom:0.5rem;">Puntos Angulares</h3>';
138    ['ASC','MC','DSC','IC'].forEach(function(p){var a=ang[p];if(a)h+='<div style="display:flex;justify-content:space-between;padding:0.6rem 0;border-bottom:1px solid rgba(255,255,255,0.06);"><span style="color:#888;">'+p+'</span><span style="color:#d4af37;font-weight:600;">'+(CF_SIGNOS[a.signo]||'')+' '+a.signo+' '+a.grado+'</span></div>';});
139    h+='<h3 style="color:#d4af37;margin:1rem 0 0.5rem;">C\u00faspides (Placidus)</h3><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:0.5rem;">';
140    for(var i=1;i<=12;i++){var ca=casas['Casa '+i];if(ca)h+='<div style="padding:0.5rem;background:rgba(255,255,255,0.03);border-radius:4px;font-size:0.85rem;"><span style="color:#d4af37;font-weight:600;">Casa '+i+':</span> '+(CF_SIGNOS[ca.signo]||'')+' '+ca.signo+' '+ca.grado+'</div>';}
141    h+='</div>';c.innerHTML=h;
142}
143function cfLlenarTecnicos(d){
144    var c=document.getElementById('cf-datos-tecnicos');if(!d){c.innerHTML='';return;}
145    var h='';
146    h+='<div style="display:flex;justify-content:space-between;padding:0.6rem 0;border-bottom:1px solid rgba(255,255,255,0.06);"><span style="color:#888;">Fecha UTC</span><span style="color:#d4af37;font-weight:600;">'+d.fecha_utc+'</span></div>';
147    h+='<div style="display:flex;justify-content:space-between;padding:0.6rem 0;border-bottom:1px solid rgba(255,255,255,0.06);"><span style="color:#888;">D\u00eda Juliano</span><span style="color:#d4af37;font-weight:600;">'+d.jd.toFixed(4)+'</span></div>';
148    h+='<div style="display:flex;justify-content:space-between;padding:0.6rem 0;border-bottom:1px solid rgba(255,255,255,0.06);"><span style="color:#888;">Ubicaci\u00f3n</span><span style="color:#d4af37;font-weight:600;">'+d.ubicacion_calculo.lat.toFixed(4)+'\u00b0, '+d.ubicacion_calculo.lon.toFixed(4)+'\u00b0</span></div>';
149    c.innerHTML=h;
150}
151
152async function cfCargarAstrocartografia(){
153    if(!cfCurrentData)return;
154    var mapDiv=document.getElementById('cf-astrocarto-map');
155    mapDiv.innerHTML='<p style="text-align:center;color:#888;padding:3rem;">\u23f3 Calculando l\u00edneas astrocartogr\u00e1ficas...</p>';
156    try{
157        var r=await fetch('/api/eclipse/astrocartografia?jd='+cfCurrentData.jd+'&tipo=solar');
158        if(!r.ok){mapDiv.innerHTML='<p style="color:#ff6347;text-align:center;padding:2rem;">Error del servidor ('+r.status+')</p>';return;}
159        var data=await r.json();
160        if(data.exito&&data.lineas){cfDibujarAstrocartografia(data);cfAstrocartoLoaded=true;}
161        else{mapDiv.innerHTML='<p style="color:#ff6347;text-align:center;padding:2rem;">'+(data.error||'Sin datos')+'</p>';}
162    }catch(e){mapDiv.innerHTML='<p style="color:#ff6347;text-align:center;padding:2rem;">Error: '+e.message+'</p>';}
163}
164function cfDibujarAstrocartografia(data){
165    var mapDiv=document.getElementById('cf-astrocarto-map');
166    if(cfAstrocartoMap){try{cfAstrocartoMap.remove();}catch(e){}cfAstrocartoMap=null;}
167    mapDiv.innerHTML='';
168    setTimeout(function(){
169        try{
170            cfAstrocartoMap=L.map(mapDiv,{center:[20,0],zoom:2,minZoom:1,maxZoom:8,worldCopyJump:true});
171            L.tileLayer('https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png',{attribution:'&copy; CARTO &copy; OSM',subdomains:'abcd',maxZoom:19}).addTo(cfAstrocartoMap);
172            var lineas=data.lineas,tipos=['mc','ic','asc','dsc'];
173            var tipoEstilo={mc:{weight:1.8,dashArray:null},ic:{weight:1.3,dashArray:'6,4'},asc:{weight:1.8,dashArray:null},dsc:{weight:1.3,dashArray:'4,3'}};
174            var tipoLabel={mc:' MC',ic:' IC',asc:' ASC',dsc:' DSC'};
175            for(var planeta in lineas){var info=lineas[planeta];var color=CF_COLORES[planeta]||'#FFF';
176                for(var ti=0;ti<tipos.length;ti++){var tipo=tipos[ti];var segs=info[tipo];if(!segs)continue;var est=tipoEstilo[tipo];
177                    for(var si=0;si<segs.length;si++){var seg=segs[si];if(!seg||seg.length<2)continue;
178                        var polyOpts={color:color,weight:est.weight,opacity:0.85,smoothFactor:1.5};
179                        if(est.dashArray)polyOpts.dashArray=est.dashArray;
180                        L.polyline(seg,polyOpts).addTo(cfAstrocartoMap).bindTooltip(CF_SIMB[planeta]+' '+planeta+tipoLabel[tipo],{sticky:true});
181                    }
182                }
183            }
184            if(data.eclipse_point&&data.eclipse_point.lat){var ep=data.eclipse_point;
185                L.marker([ep.lat,ep.lon],{icon:L.divIcon({html:'<div style="width:8px;height:8px;background:#FF4500;border:1.5px solid #fff;border-radius:50%;"></div>',className:'',iconSize:[11,11],iconAnchor:[5,5]}),zIndexOffset:1000}).addTo(cfAstrocartoMap);
186            }
187            L.marker([cfUserLat,cfUserLon],{icon:L.divIcon({html:'<span style="font-size:22px;">\ud83d\udccd</span>',className:'',iconSize:[24,24],iconAnchor:[12,24]})}).addTo(cfAstrocartoMap).bindPopup('<b>'+cfUserCiudad+'</b>');
188            cfAstrocartoMap.setView([cfUserLat,cfUserLon],3);
189            var leyDiv=document.getElementById('cf-astrocarto-leyenda');var lh='';
190            for(var pl in lineas){var co=CF_COLORES[pl]||'#888';lh+='<div style="display:flex;align-items:center;gap:0.3rem;"><div style="width:24px;height:3px;border-radius:2px;background:'+co+';"></div><span>'+(CF_SIMB[pl]||'')+' '+pl+'</span></div>';}
191            lh+='<span style="color:#555;margin:0 0.3rem;">|</span>';
192            lh+='<div style="display:flex;align-items:center;gap:0.3rem;"><div style="width:24px;height:3px;background:#aaa;"></div><span>MC/ASC</span></div>';
193            lh+='<div style="display:flex;align-items:center;gap:0.3rem;"><div style="width:24px;height:0;border-top:3px dashed #aaa;"></div><span>IC/DSC</span></div>';
194            leyDiv.innerHTML=lh;
195            setTimeout(function(){cfAstrocartoMap.invalidateSize();},200);
196
197            // Boton fullscreen personalizado
198            (function() {
199                var isFs = false;
200                var origStyle = '';
201                var FullscreenCtrl = L.Control.extend({
202                    options: { position: 'topright' },
203                    onAdd: function(map) {
204                        var btn = L.DomUtil.create('button');
205                        btn.innerHTML = '⛶';
206                        btn.title = 'Pantalla completa';
207                        btn.style.cssText = 'width:34px;height:34px;border:none;border-radius:4px;' +
208                            'background:#fff;cursor:pointer;font-size:18px;line-height:1;' +
209                            'display:flex;align-items:center;justify-content:center;' +
210                            'box-shadow:0 2px 6px rgba(0,0,0,0.4);';
211                        L.DomEvent.on(btn, 'click', function(e) {
212                            L.DomEvent.stopPropagation(e);
213                            var md = document.getElementById('cf-astrocarto-map');
214                            if (!isFs) {
215                                origStyle = {
216                                    position: md.style.position, top: md.style.top,
217                                    left: md.style.left, right: md.style.right,
218                                    bottom: md.style.bottom, width: md.style.width,
219                                    height: md.style.height, zIndex: md.style.zIndex,
220                                    borderRadius: md.style.borderRadius
221                                };
222                                md.style.cssText += ';position:fixed;top:0;left:0;right:0;bottom:0;' +
223                                    'width:100vw;height:100vh;z-index:999999;border-radius:0;';
224                                btn.innerHTML = '✖';
225                                btn.title = 'Reducir';
226                                isFs = true;
227                            } else {
228                                Object.assign(md.style, origStyle);
229                                btn.innerHTML = '⛶';
230                                btn.title = 'Pantalla completa';
231                                isFs = false;
232                            }
233                            setTimeout(function() { cfAstrocartoMap.invalidateSize(); }, 150);
234                        });
235                        return btn;
236                    }
237                });
238                cfAstrocartoMap.addControl(new FullscreenCtrl());
239            })();
240
241        }catch(err){mapDiv.innerHTML='<p style="color:#ff6347;text-align:center;padding:2rem;">Error: '+err.message+'</p>';}
242    },150);
243}
244
245document.addEventListener('DOMContentLoaded',function(){
246    document.querySelectorAll('.cf-tab-btn').forEach(function(b){
247        b.addEventListener('click',function(){cfCambiarTab(this,this.dataset.tab);});
248    });
249    var cerrar=document.getElementById('cf-btn-cerrar');
250    if(cerrar)cerrar.addEventListener('click',cfCerrarCarta);
251    var modal=document.getElementById('cf-modal-carta');
252    if(modal)modal.addEventListener('click',function(e){if(e.target===modal)cfCerrarCarta();});
253    cfObtenerUbicacion();
254});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.