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:'© CARTO © 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.