' , worksheetvar = '{worksheet' , worksheetvarend = '}' , base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) } , format = function (s, c) { return s.replace(/{(\w+)}/g, function (m, p) { return c[p]; }) } , wstemplate = '' , tabletemplate = ''; var els_tables = document.getElementsByTagName("table"); for (var i = 0; i < els_tables.length; ++i) { if(i === 0){ wstemplate += worksheet + worksheetvar + i + worksheetvarend + worksheetend; } tabletemplate += tablevar + i + tablevarend; } var allTemplate = template + wstemplate + tend; var allWorksheet = body + tabletemplate + bodyend; var allOfIt = allTemplate + allWorksheet; var ctx = {}; ctx['worksheet' + 0] = "Календар Май 1973 на Австрия на български - Изтеглено от Calendario.Gratis.xls"; for (var k = 0; k < els_tables.length; ++k) { var clonedTable = els_tables[k].cloneNode(true); var els_borrar_del_clon = clonedTable.querySelectorAll('.popup, .emoji, .nmes, .cambio_estacion'); els_borrar_del_clon.forEach(function(el_borrar_del_clon) { el_borrar_del_clon.parentNode.removeChild(el_borrar_del_clon); }); var els_mover_color_clon = clonedTable.querySelectorAll('td'); var els_mover_color_original = els_tables[k].querySelectorAll('td'); els_mover_color_original.forEach(function(el_mover_color_clon, index) { var el_computado = window.getComputedStyle(el_mover_color_clon); els_mover_color_clon[index].style.backgroundColor = el_computado.getPropertyValue('background-color'); }); if (els_tables[k] !== null) ctx['table' + k] = clonedTable.innerHTML; } var a = document.createElement('a'); a.href = uri + base64(format(allOfIt, ctx)); a.download = "Календар Май 1973 на Австрия на български - Изтеглено от Calendario.Gratis.xls"; a.click(); }; var adBlockTester = document.createElement('div'); adBlockTester.innerHTML = ' '; adBlockTester.id = 'publicidad'; document.body.appendChild(adBlockTester); window.setTimeout(function() { if( adBlockTester.offsetHeight === 0 ){ var v_main_content = document.getElementById("main-content"); v_main_content.innerHTML = ''; v_main_content.insertAdjacentHTML('beforeend', "
Информационно съобщение
Calendario.Gratis използва реклама, за да поддържа разходите си за поддръжка и да предоставя актуализирана информация, която желаете.
Моля, деактивирайте блокирача на реклами или вградената блокировка на Firefox и обновете страницата, за да можете да разглеждате Calendario.Gratis.
Ако не желаете да деактивирате блокирача на реклами, желая ви хубав ден и се надявам да промените мнението си. 😉
"); } document.body.removeChild(adBlockTester); }, 60); function botonDetalles(id){ var popups = document.querySelectorAll('.popup'); popups.forEach(function(popup) { popup.style.visibility = 'hidden'; }); if (id === 'ttleyenda' || id === 'editor-popup') { var el_ttdia = document.getElementById(id); if (el_ttdia.style.visibility === 'visible') { el_ttdia.style.visibility = 'hidden'; } else { el_ttdia.style.visibility = 'visible'; } return; } var el_dia = document.getElementById(id); if(el_dia){ var el_ttdia = document.getElementById('ttdia'); if(el_ttdia){ el_ttdia.setAttribute('data-fecha', id); var atr_data_festivonombre = el_dia.getAttribute('data-festivonombre'); var atr_data_festivonombre_sal = ''; if (atr_data_festivonombre !== null && atr_data_festivonombre !== '') { atr_data_festivonombre_sal = ' - ' + atr_data_festivonombre; } el_h3 = el_ttdia.querySelector('h3'); if(el_h3){ const [dia, mes, anio] = id.split('-'); el_h3.innerText = dia + ' ' + mes + ' ' + anio + atr_data_festivonombre_sal; } el_es_festivo = el_ttdia.querySelector('.es_festivo'); if (el_es_festivo) { el_es_festivo.innerText = el_dia.getAttribute('data-tipofestivo'); } el_estacion = el_ttdia.querySelector('.estacion'); if (el_estacion) { el_estacion.innerText = el_dia.getAttribute('data-estacion'); } el_faselunar = el_ttdia.querySelector('.faselunar'); if (el_faselunar) { el_faselunar.innerText = el_dia.getAttribute('data-faselunar'); } if (el_ttdia.style.visibility === 'visible') { el_ttdia.style.visibility = 'hidden'; } else { el_ttdia.style.visibility = 'visible'; } const elementos = [ document.getElementById('salida_del_sol'), document.getElementById('puesta_del_sol'), document.getElementById('mediodia_solar'), document.getElementById('duracion_del_dia'), document.getElementById('crepusculo_civil_matutino'), document.getElementById('crepusculo_civil_vespertino'), document.getElementById('crepusculo_nautico_matutino'), document.getElementById('crepusculo_nautico_vespertino'), document.getElementById('crepusculo_astronomico_matutino'), document.getElementById('crepusculo_astronomico_vespertino'), document.getElementById('momento_mas_oscuro') ]; elementos.forEach(el => { if (el) { el.innerText = ''; } }); } } } function menuDinamico(){ var x = document.getElementById("nav-menu-principal"); if (x.style.display === "none"){ x.style.display = "block"; }else{ x.style.display = "none"; } } function scrollToAnchor() { var targetId = window.location.hash.substr(1); if (targetId !== '') { targetId = decodeURIComponent(targetId); var targetElement = document.getElementById(targetId); var elementosConClase = document.querySelectorAll('.borde-animado'); elementosConClase.forEach(function(elemento) { elemento.classList.remove('borde-animado'); }); targetElement.classList.add('borde-animado'); if (targetElement) { var offset = 113; var targetPosition = targetElement.getBoundingClientRect().top + window.scrollY; window.scrollTo({ top: targetPosition - offset, behavior: 'smooth' }); } } } document.addEventListener('DOMContentLoaded', scrollToAnchor); window.addEventListener('hashchange', scrollToAnchor); function eliminarClassDeElementos(className) { const elements = document.querySelectorAll(`.${className}`); elements.forEach(element => { element.classList.remove(className); element.style.backgroundColor = ''; element.style.backgroundImage = ''; var el_es_festivo = element.querySelector('.es_festivo'); if (el_es_festivo !== null) { el_es_festivo.innerText = 'Не.'; } }); } function esMunicipal(str) { if (str.length < 3) { return false; } return str.slice(-3) === '000'; } function llamadaAjax(event) { eliminarClassDeElementos('festivos_nacionales_y_municipales'); eliminarClassDeElementos('festivos_nacionales_movibles_y_municipales'); eliminarClassDeElementos('festivos_autonomicos_y_municipales'); eliminarClassDeElementos('festivos_municipales_y_locales'); var RequestObject = false; if (window.XMLHttpRequest) RequestObject = new XMLHttpRequest(); if (window.ActiveXObject) RequestObject = new ActiveXObject("Microsoft.XMLHTTP"); var el_autonomia_id = document.getElementById("autonomias"); var lv_autonomia_id = el_autonomia_id ? el_autonomia_id.value : ''; var el_provincia_id = document.getElementById("provincias"); var lv_provincia_id = el_provincia_id ? el_provincia_id.value : ''; var el_municipio_id = document.getElementById("municipios"); var lv_municipio_id = el_municipio_id ? el_municipio_id.value : ''; var el_localidad_id = document.getElementById("localidades"); var lv_localidad_id = el_localidad_id ? el_localidad_id.value : ''; if (typeof event !== 'undefined') { lv_cambio = event.target.id; if (lv_cambio === 'autonomias') { lv_provincia_id = ''; lv_municipio_id = ''; lv_localidad_id = ''; eliminarClassDeElementos('nivel_administrativo_2'); eliminarClassDeElementos('nivel_administrativo_4'); eliminarClassDeElementos('nivel_administrativo_5'); const els_nombre_festivo_autonomicos = document.querySelectorAll('.nombre_festivo_autonomicos'); els_nombre_festivo_autonomicos.forEach(element => { element.remove(); }); const els_nombre_festivo_localidades = document.querySelectorAll('.nombre_festivo_localidades'); els_nombre_festivo_localidades.forEach(element => { element.remove(); }); const el_h3_festivos_autonomicos_lista = document.getElementById('festivos-autonomicos-lista'); if (el_h3_festivos_autonomicos_lista !== null) { const el_ul_festivos_autonomicos_lista = el_h3_festivos_autonomicos_lista.nextElementSibling; if (el_ul_festivos_autonomicos_lista && el_ul_festivos_autonomicos_lista.tagName.toLowerCase() === 'ul') { el_h3_festivos_autonomicos_lista.remove(); el_ul_festivos_autonomicos_lista.remove(); } } }else if(lv_cambio === 'provincias'){ lv_municipio_id = ''; lv_localidad_id = ''; eliminarClassDeElementos('nivel_administrativo_4'); eliminarClassDeElementos('nivel_administrativo_5'); const els_nombre_festivo_localidades = document.querySelectorAll('.nombre_festivo_localidades'); els_nombre_festivo_localidades.forEach(element => { element.remove(); }); }else if(lv_cambio === 'municipios' || lv_cambio === 'localidades'){ if(lv_cambio === 'municipios'){ lv_localidad_id = ''; } eliminarClassDeElementos('nivel_administrativo_4'); eliminarClassDeElementos('nivel_administrativo_5'); const els_nombre_festivo_localidades = document.querySelectorAll('.nombre_festivo_localidades'); els_nombre_festivo_localidades.forEach(element => { element.remove(); }); } const el_h3_festivos_localidades_lista = document.getElementById('festivos-localidades-lista'); if (el_h3_festivos_localidades_lista !== null) { const el_ul_festivos_localidades_lista = el_h3_festivos_localidades_lista.nextElementSibling; if (el_ul_festivos_localidades_lista && el_ul_festivos_localidades_lista.tagName.toLowerCase() === 'ul') { el_h3_festivos_localidades_lista.remove(); el_ul_festivos_localidades_lista.remove(); } } }else{ lv_cambio = 'autonomias'; if (localStorage.getItem("autonomias") !== null && localStorage.getItem("autonomias").trim() !== '') { lv_autonomia_id = localStorage.getItem("autonomias"); } if (localStorage.getItem("provincias") !== null && localStorage.getItem("provincias").trim() !== '') { lv_provincia_id = localStorage.getItem("provincias"); } if (localStorage.getItem("municipios") !== null && localStorage.getItem("municipios").trim() !== '') { lv_municipio_id = localStorage.getItem("municipios"); } if (localStorage.getItem("localidades") !== null && localStorage.getItem("localidades").trim() !== '') { lv_localidad_id = localStorage.getItem("localidades"); } } var lv_mes = ''; lv_mes = '05'; if ( RequestObject !== false) { RequestObject.open("GET", "https://calendario.gratis/ajax.php?"+Math.random() + '&idioma=bg&ano=1973' + lv_mes + '&cambio=' + lv_cambio + '&autonomia_id=' + lv_autonomia_id + '&provincia_id=' + lv_provincia_id + '&municipio_id=' + lv_municipio_id + '&localidad_id=' + lv_localidad_id, true); RequestObject.onreadystatechange = function() { if (RequestObject.readyState == 4 && RequestObject.status == 200 ) { if (RequestObject.responseText.indexOf('invalid') == -1 && RequestObject.responseText.trim()) { var lv_festivos_listas_html = ''; var json = JSON.parse(RequestObject.responseText); if (Array.isArray(json.autonomias_festivos)) { lv_festivos_listas_html = 'Празници на автономните общности
'; } if (Array.isArray(json.localidades_festivos)) { lv_festivos_listas_html = lv_festivos_listas_html + 'Празници на населеното място
'; } if (lv_festivos_listas_html !== '') { const el_h3_festivos_nacionales_lista = document.getElementById('festivos-nacionales-lista'); const el_ul_festivos_nacionales_lista = el_h3_festivos_nacionales_lista.nextElementSibling; if (el_ul_festivos_nacionales_lista && el_ul_festivos_nacionales_lista.tagName.toLowerCase() === 'ul') { el_ul_festivos_nacionales_lista.insertAdjacentHTML('afterend', lv_festivos_listas_html); } } if (Array.isArray(json.provincias)) { var el_select_provincias = document.getElementById('provincias'); el_select_provincias.innerHTML = ''; for (var i=0; i' + json.provincias[i].provincia_nombre + ''); } } if (Array.isArray(json.municipios)) { var el_select_municipios = document.getElementById('municipios'); el_select_municipios.innerHTML = ''; for (var i=0; i' + json.municipios[i].nombre + ''); } } if (Array.isArray(json.localidades)) { var el_select_localidades = document.getElementById('localidades'); el_select_localidades.innerHTML = ''; for (var i=0; i' + json.localidades[i].localidad_nombre + ''); } } if (typeof event !== 'undefined') { localStorage.setItem("autonomias", select_autonomias.value ); localStorage.setItem("provincias", select_provincias.value ); localStorage.setItem("municipios", select_municipios.value ); localStorage.setItem("localidades", select_localidades.value ); }else{ if (localStorage.getItem("autonomias") !== null && localStorage.getItem("autonomias").trim() !== '' ) { select_autonomias.value = localStorage.getItem("autonomias"); } if (localStorage.getItem("provincias") !== null && localStorage.getItem("provincias").trim() !== '') { select_provincias.value = localStorage.getItem("provincias"); } if (localStorage.getItem("municipios") !== null && localStorage.getItem("municipios").trim() !== '') { select_municipios.value = localStorage.getItem("municipios"); } if (localStorage.getItem("localidades") !== null && localStorage.getItem("localidades").trim() !== '') { select_localidades.value = localStorage.getItem("localidades"); } } destacarFinDeSemanaLargoYPuentes(); totalFestivos(); } } }; RequestObject.send(null); } } function obtenerSignoZodiacal12(fechaNacimiento) { let fecha = new Date(fechaNacimiento); let dia = fecha.getDate(); let mes = fecha.getMonth() + 1; let laa_zodiacal = {}; if ((mes === 3 && dia >= 21) || (mes === 4 && dia <= 20)) { laa_zodiacal.nombre = "aries"; laa_zodiacal.simbolo = "♈"; } else if ((mes === 4 && dia >= 21) || (mes === 5 && dia <= 20)) { laa_zodiacal.nombre = "tauro"; laa_zodiacal.simbolo = "♉"; } else if ((mes === 5 && dia >= 21) || (mes === 6 && dia <= 20)) { laa_zodiacal.nombre = "geminis"; laa_zodiacal.simbolo = "♊"; } else if ((mes === 6 && dia >= 21) || (mes === 7 && dia <= 22)) { laa_zodiacal.nombre = "cancer"; laa_zodiacal.simbolo = "♋"; } else if ((mes === 7 && dia >= 23) || (mes === 8 && dia <= 23)) { laa_zodiacal.nombre = "leo"; laa_zodiacal.simbolo = "♌"; } else if ((mes === 8 && dia >= 24) || (mes === 9 && dia <= 22)) { laa_zodiacal.nombre = "virgo"; laa_zodiacal.simbolo = "♍"; } else if ((mes === 9 && dia >= 23) || (mes === 10 && dia <= 23)) { laa_zodiacal.nombre = "libra"; laa_zodiacal.simbolo = "♎"; } else if ((mes === 10 && dia >= 24) || (mes === 11 && dia <= 22)) { laa_zodiacal.nombre = "escorpio"; laa_zodiacal.simbolo = "♏"; } else if ((mes === 11 && dia >= 23) || (mes === 12 && dia <= 21)) { laa_zodiacal.nombre = "sagitario"; laa_zodiacal.simbolo = "♐"; } else if ((mes === 12 && dia >= 22) || (mes === 1 && dia <= 20)) { laa_zodiacal.nombre = "capricornio"; laa_zodiacal.simbolo = "♑"; } else if ((mes === 1 && dia >= 21) || (mes === 2 && dia <= 19)) { laa_zodiacal.nombre = "acuario"; laa_zodiacal.simbolo = "♒"; } else if ((mes === 2 && dia >= 20) || (mes === 3 && dia <= 20)) { laa_zodiacal.nombre = "piscis"; laa_zodiacal.simbolo = "♓"; } return laa_zodiacal; } function obtenerSignoZodiacal13(fechaNacimiento) { let fecha = new Date(fechaNacimiento); let dia = fecha.getDate(); let mes = fecha.getMonth() + 1; let laa_zodiacal = {}; if ((mes === 4 && dia >= 17) || (mes === 5 && dia <= 14)) { laa_zodiacal.nombre = "aries"; laa_zodiacal.simbolo = "♈"; } else if ((mes === 5 && dia >= 15) || (mes === 6 && dia <= 21)) { laa_zodiacal.nombre = "tauro"; laa_zodiacal.simbolo = "♉"; } else if ((mes === 6 && dia >= 22) || (mes === 7 && dia <= 19)) { laa_zodiacal.nombre = "geminis"; laa_zodiacal.simbolo = "♊"; } else if ((mes === 7 && dia >= 20) || (mes === 8 && dia <= 10)) { laa_zodiacal.nombre = "cancer"; laa_zodiacal.simbolo = "♋"; } else if ((mes === 8 && dia >= 11) || (mes === 9 && dia <= 16)) { laa_zodiacal.nombre = "leo"; laa_zodiacal.simbolo = "♌"; } else if ((mes === 9 && dia >= 17) || (mes === 10 && dia <= 30)) { laa_zodiacal.nombre = "virgo"; laa_zodiacal.simbolo = "♍"; } else if ((mes === 10 && dia >= 31) || (mes === 11 && dia <= 22)) { laa_zodiacal.nombre = "libra"; laa_zodiacal.simbolo = "♎"; } else if (mes === 11 && dia >= 23 && dia <= 28) { laa_zodiacal.nombre = "escorpio"; laa_zodiacal.simbolo = "♏"; } else if ((mes === 11 && dia >= 29) || (mes === 12 && dia <= 17)) { laa_zodiacal.nombre = "ofiuco"; laa_zodiacal.simbolo = "⛎"; } else if ((mes === 12 && dia >= 18) || (mes === 1 && dia <= 20)) { laa_zodiacal.nombre = "sagitario"; laa_zodiacal.simbolo = "♐"; } else if ((mes === 1 && dia >= 21) || (mes === 2 && dia <= 17)) { laa_zodiacal.nombre = "capricornio"; laa_zodiacal.simbolo = "♑"; } else if ((mes === 2 && dia >= 18) || (mes === 3 && dia <= 11)) { laa_zodiacal.nombre = "acuario"; laa_zodiacal.simbolo = "♒"; } else if ((mes === 3 && dia >= 12) || (mes === 4 && dia <= 16)) { laa_zodiacal.nombre = "piscis"; laa_zodiacal.simbolo = "♓"; } return laa_zodiacal; } function obtenerSignoZodiacal14(fechaNacimiento) { let fecha = new Date(fechaNacimiento); let dia = fecha.getDate(); let mes = fecha.getMonth() + 1; let laa_zodiacal = {}; if ((mes === 4 && dia >= 18) || (mes === 5 && dia <= 13)) { laa_zodiacal.nombre = "aries"; laa_zodiacal.simbolo = "♈"; } else if ((mes === 5 && dia >= 14) || (mes === 6 && dia <= 19)) { laa_zodiacal.nombre = "tauro"; laa_zodiacal.simbolo = "♉"; } else if ((mes === 6 && dia >= 20) || (mes === 7 && dia <= 20)) { laa_zodiacal.nombre = "geminis"; laa_zodiacal.simbolo = "♊"; } else if ((mes === 7 && dia >= 21) || (mes === 8 && dia <= 9)) { laa_zodiacal.nombre = "cancer"; laa_zodiacal.simbolo = "♋"; } else if ((mes === 8 && dia >= 10) || (mes === 9 && dia <= 15)) { laa_zodiacal.nombre = "leo"; laa_zodiacal.simbolo = "♌"; } else if ((mes === 9 && dia >= 16) || (mes === 10 && dia <= 30)) { laa_zodiacal.nombre = "virgo"; laa_zodiacal.simbolo = "♍"; } else if ((mes === 10 && dia >= 31) || (mes === 11 && dia <= 22)) { laa_zodiacal.nombre = "libra"; laa_zodiacal.simbolo = "♎"; } else if (mes === 11 && dia >= 23 && dia <= 29) { laa_zodiacal.nombre = "escorpio"; laa_zodiacal.simbolo = "♏"; } else if ((mes === 11 && dia >= 30) || (mes === 12 && dia <= 17)) { laa_zodiacal.nombre = "ofiuco"; laa_zodiacal.simbolo = "⛎"; } else if ((mes === 12 && dia >= 18) || (mes === 1 && dia <= 18)) { laa_zodiacal.nombre = "sagitario"; laa_zodiacal.simbolo = "♐"; } else if ((mes === 1 && dia >= 19) || (mes === 2 && dia <= 15)) { laa_zodiacal.nombre = "capricornio"; laa_zodiacal.simbolo = "♑"; } else if ((mes === 2 && dia >= 16) || (mes === 3 && dia <= 10)) { laa_zodiacal.nombre = "acuario"; laa_zodiacal.simbolo = "♒"; } else if (((mes === 3 && dia >= 11) || (mes === 4 && dia <= 18) ) && dia !== 28 && dia !== 29 ) { laa_zodiacal.nombre = "piscis"; laa_zodiacal.simbolo = "♓"; } else if (mes === 3 && dia >= 28 && dia <= 29) { laa_zodiacal.nombre = "cetus"; laa_zodiacal.simbolo = "⛎"; } return laa_zodiacal; } async function enviarFormulario(event) { event.preventDefault(); const form = event.target.closest("form"); const formData = new FormData(form); const data = Object.fromEntries(formData.entries()); data.origen = event.target.id; data.cargarFormularioResultado = false; if (event.cargarFormularioResultado !== undefined) { const savedData = JSON.parse(localStorage.getItem(form.id + '_at')); if (savedData !== null) { data.cargarFormularioResultado = true; if (savedData.nivel_administrativo_2 !== undefined) { data.nivel_administrativo_2 = savedData.nivel_administrativo_2; } if (savedData.nivel_administrativo_3 !== undefined) { data.nivel_administrativo_3 = savedData.nivel_administrativo_3; } if (savedData.nivel_administrativo_4 !== undefined) { data.nivel_administrativo_4 = savedData.nivel_administrativo_4; } if (savedData.nivel_administrativo_5 !== undefined) { data.nivel_administrativo_5 = savedData.nivel_administrativo_5; } } } const url = 'https://calendario.gratis/ajax.php?' + Math.random(); try { const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(data) }); if (response.ok) { const jsonResponse = await response.json(); if (typeof window[form.id] === 'function') { window[form.id](await jsonResponse); } else { console.log("Respuesta recibida:", jsonResponse); } guardarFormulario(form.id); } else { console.error("Error en la solicitud:", response.statusText); } } catch (error) { console.error("Error en el envío:", error); } } function guardarFormulario(pv_id_formulario) { var formData = {}; var el_form = document.getElementById(pv_id_formulario); Array.from(el_form.elements).forEach(element => { if (element.type !== "hidden" && element.name) { if (element.type === "checkbox") { formData[element.name] = element.checked; } else { formData[element.name] = element.value; } } }); localStorage.setItem(pv_id_formulario + '_at', JSON.stringify(formData)); } function cargarFormulario(pv_id_formulario) { const savedData = JSON.parse(localStorage.getItem(pv_id_formulario + '_at')); if (savedData) { var el_form = document.getElementById(pv_id_formulario); Array.from(el_form.elements).forEach(element => { if (element.type !== "hidden" && element.name && savedData[element.name] !== undefined) { if (element.type === "checkbox") { element.checked = savedData[element.name]; } else { element.value = savedData[element.name]; } } }); return true; } return false; } function editor(json) { if (Array.isArray(json.errores)) { var el_ul_respuestas_servidor = document.getElementById('respuestas-servidor'); el_ul_respuestas_servidor.innerHTML = ''; for (var i=0; i' + json.errores[i] + ''); } } } } function convertirFechaInternaAExterna(pv_fecha){ let lv_ano = pv_fecha.substring(0, 4); let lv_mes = pv_fecha.substring(4, 6); let lv_dia = pv_fecha.substring(6, 8); if (lv_ano === '9999') { lv_ano = '1973'; } if (lv_mes.charAt(0) === '0') { lv_mes = lv_mes.substring(1); } if (lv_dia.charAt(0) === '0') { lv_dia = lv_dia.substring(1); } return lv_dia + '-' + js_meses[lv_mes] + '-' + lv_ano; } function obtenerColorDeClase(clase) { for (const sheet of document.styleSheets) { try { for (const regla of sheet.cssRules) { if (regla.selectorText === `.${clase}`) { return regla.style.backgroundColor || null; } } } catch (e) { console.warn("No se puede acceder a una hoja de estilo por restricciones CORS."); } } return null; } function aplicarGradiente(elemento) { const clases = Array.from(elemento.classList); const clasesFestivos = ["nivel_administrativo_1", "nivel_administrativo_2", "nivel_administrativo_3", "nivel_administrativo_4", "nivel_administrativo_5"]; const colores = clases .filter(clase => clasesFestivos.includes(clase)) .map(clase => obtenerColorDeClase(clase)) .filter(color => color !== null); if (colores.length > 1) { elemento.style.backgroundImage = `linear-gradient(45deg, ${colores.join(", ")})`; } } function destacarFinDeSemanaLargoYPuentes() { document.querySelectorAll('.fines_de_semana_largos, .puente').forEach(element => { element.classList.remove('fines_de_semana_largos'); element.classList.remove('puente'); }); document.querySelectorAll('#fines_de_semana_largos_ul, #puente_ul').forEach(elemento => { elemento.innerHTML = ''; }); document.querySelectorAll('[class*="nivel_administrativo_"]').forEach(element => { let fechaFestiva = new Date(element.getAttribute('data-fecha')); const diaSemana = fechaFestiva.getDay(); let diasSeleccionados = []; var lv_clase = 'fines_de_semana_largos'; if (diaSemana === 1) { diasSeleccionados.push(fechaFestiva); let domingo = new Date(fechaFestiva); domingo.setDate(domingo.getDate() - 1); diasSeleccionados.push(domingo); let sabado = new Date(fechaFestiva); sabado.setDate(sabado.getDate() - 2); diasSeleccionados.push(sabado); }else if (diaSemana === 5) { diasSeleccionados.push(fechaFestiva); let sabado = new Date(fechaFestiva); sabado.setDate(sabado.getDate() + 1); diasSeleccionados.push(sabado); let domingo = new Date(fechaFestiva); domingo.setDate(domingo.getDate() + 2); diasSeleccionados.push(domingo); }else if (diaSemana === 2) { let lunes = new Date(fechaFestiva); lunes.setDate(lunes.getDate() - 1); diasSeleccionados.push(lunes); lv_clase = 'puente'; }else if (diaSemana === 4) { let viernes = new Date(fechaFestiva); viernes.setDate(viernes.getDate() + 1); diasSeleccionados.push(viernes); lv_clase = 'puente'; } let la_compuesto_por = []; diasSeleccionados.forEach(dia => { var lv_fecha = `${dia.getFullYear()}${(dia.getMonth() + 1).toString().padStart(2, '0')}${dia.getDate().toString().padStart(2, '0')}`; var el_dia = document.getElementById(convertirFechaInternaAExterna(lv_fecha)); if (el_dia !== null) { if (lv_clase === 'puente') { const tieneClase = Array.from(el_dia.classList).some(clase => clase.startsWith('nivel_administrativo_')); if (tieneClase) { return; } } el_dia.classList.add(lv_clase); la_compuesto_por.push(el_dia.id.replace(/-/g, ' ')); } }); if (la_compuesto_por.length > 0) { if (lv_clase === 'puente') { var lv_li = 'Мост на: ' + la_compuesto_por.join(', ') + '.'; }else{ var lv_li = 'Дълги уикенди, състоящи се от: ' + la_compuesto_por.join(', ') + '.'; } const el_ul = document.getElementById(lv_clase + '_ul'); if (el_ul !== null) { el_ul.insertAdjacentHTML('beforeend', lv_li); } } }); document.querySelectorAll('#fines_de_semana_largos_ul, #puente_ul').forEach(elemento => { if (elemento.innerHTML === '') { if (elemento.id === 'fines_de_semana_largos_ul') { elemento.insertAdjacentHTML('beforeend', "Не са открити дълги уикенди."); }else{ elemento.insertAdjacentHTML('beforeend', "Не са открити мостове."); } } }); } function filtros(json){ if (json.nivel_administrativo_cambiado !== undefined) { document.querySelectorAll('[class*="nivel_administrativo_"]').forEach(element => { element.classList.forEach(clase => { const match = clase.match(/nivel_administrativo_(\d+)/); if (match) { const nivel = parseInt(match[1], 10); if (nivel >= json.nivel_administrativo_cambiado) { element.style.backgroundColor = ''; element.style.backgroundImage = ''; element.classList.remove(clase); element.setAttribute('data-festivonombre', ''); element.setAttribute('data-tipofestivo', 'Не' + '.'); } } }); }); } if (Array.isArray(json.festivos)) { for (var i=0; i { const match = element.id.match(/nivel_administrativo_(\d+)/); if (match) { const nivel = parseInt(match[1], 10); if (nivel > json.nivel_administrativo_cambiado) { element.innerHTML = ''; element.parentElement.style.display = "none"; } } }); if (Array.isArray(json.territorios)) { var laa_filtros_opciones = []; for (var i=0; i' + json.territorios[i].descripcion + ''); } for (const nivel in laa_filtros_opciones) { const el_select = document.getElementById('nivel_administrativo_' + nivel); if (el_select) { el_select.insertAdjacentHTML('beforeend', laa_filtros_opciones[nivel].join('')); el_select.parentElement.style.display = "inline-grid"; } else { console.warn(`No se encontró el elemento con ID ${nivel}`); } } } if (json.cargarFormularioResultado !== undefined && json.cargarFormularioResultado === true) { cargarFormulario('filtros'); } destacarFinDeSemanaLargoYPuentes(); totalFestivos(); } var MAYAN_COUNT_EPOCH = 584282.5; function mod(a, b) { return a - (b * Math.floor(a / b)); } function amod(a, b) { return mod(a - 1, b) + 1; } var GREGORIAN_EPOCH = 1721425.5; function leap_gregorian(year) { return ((year % 4) == 0) && (!(((year % 100) == 0) && ((year % 400) != 0))); } function gregorian_to_jd(year, month, day) { return (GREGORIAN_EPOCH - 1) + (365 * (year - 1)) + Math.floor((year - 1) / 4) + (-Math.floor((year - 1) / 100)) + Math.floor((year - 1) / 400) + Math.floor((((367 * month) - 362) / 12) + ((month <= 2) ? 0 : (leap_gregorian(year) ? -1 : -2) ) + day); } function jd_to_mayan_count(jd) { var d, baktun, katun, tun, uinal, kin; jd = Math.floor(jd) + 0.5; d = jd - MAYAN_COUNT_EPOCH; baktun = Math.floor(d / 144000); d = mod(d, 144000); katun = Math.floor(d / 7200); d = mod(d, 7200); tun = Math.floor(d / 360); d = mod(d, 360); uinal = Math.floor(d / 20); kin = mod(d, 20); return new Array(baktun, katun, tun, uinal, kin); } function jd_to_mayan_haab(jd) { var lcount, day; jd = Math.floor(jd) + 0.5; lcount = jd - MAYAN_COUNT_EPOCH; day = mod(lcount + 8 + ((18 - 1) * 20), 365); return new Array (Math.floor(day / 20) + 1, mod(day, 20)); } function jd_to_mayan_tzolkin(jd) { var lcount; jd = Math.floor(jd) + 0.5; lcount = jd - MAYAN_COUNT_EPOCH; return new Array (amod(lcount + 20, 20), amod(lcount + 4, 13)); } function calcularSignoMaya(fecha,tipo) { var signoMaya; const regex = /^(\d{4})-(\d{1,2})-(\d{1,2})$/; const match = fecha.match(regex); const [_, ano, mes, dia] = match; j = gregorian_to_jd(+ano, +mes, +dia) + (Math.floor(00 + 60 * (00 + 60 * 00) + 0.5) / 86400.0); if(tipo === 'maya_tzolkin'){ a_resultado = jd_to_mayan_tzolkin(j); const signos_tzolkin = [ { nombre: "imix", simbolo: "🐊" }, { nombre: "ik", simbolo: "💨" }, { nombre: "akbal", simbolo: "🌙" }, { nombre: "kan", simbolo: "🌽" }, { nombre: "chikchan", simbolo: "🐍" }, { nombre: "kimi", simbolo: "💀" }, { nombre: "manik", simbolo: "🦌" }, { nombre: "lamat", simbolo: "⭐" }, { nombre: "muluk", simbolo: "💧" }, { nombre: "ok", simbolo: "🐕" }, { nombre: "chuwen", simbolo: "🐒" }, { nombre: "eb", simbolo: "🌿" }, { nombre: "ben", simbolo: "🌾" }, { nombre: "ix", simbolo: "🐆" }, { nombre: "men", simbolo: "🦅" }, { nombre: "kib", simbolo: "🦉" }, { nombre: "kaban", simbolo: "🌍" }, { nombre: "etznab", simbolo: "🔪" }, { nombre: "kawak", simbolo: "⛈️" }, { nombre: "ajaw", simbolo: "☀️" } ]; signoMaya = signos_tzolkin[a_resultado[0] - 1]; }else{ a_resultado = jd_to_mayan_haab(j); const signos_haab = [ { nombre: "pop", simbolo: "🌱" }, { nombre: "uo", simbolo: "🌺" }, { nombre: "zip", simbolo: "🌿" }, { nombre: "zotz", simbolo: "🦇" }, { nombre: "tzec", simbolo: "🌕" }, { nombre: "xul", simbolo: "💀" }, { nombre: "yaxkin", simbolo: "🌞" }, { nombre: "mol", simbolo: "🌧️" }, { nombre: "chen", simbolo: "🌾" }, { nombre: "yax", simbolo: "🌳" }, { nombre: "zac", simbolo: "⚪" }, { nombre: "ceh", simbolo: "🦌" }, { nombre: "mac", simbolo: "🍂" }, { nombre: "kankin", simbolo: "🌽" }, { nombre: "muan", simbolo: "🦜" }, { nombre: "pax", simbolo: "🌻" }, { nombre: "kayab", simbolo: "🌾" }, { nombre: "cumku", simbolo: "🌋" }, { nombre: "uayeb", simbolo: "🪐" } ]; signoMaya = signos_haab[a_resultado[0] - 1]; } return signoMaya; } function palanca(p_id_filtro,p_clase_subcelda){ const els_subcelda = document.querySelectorAll(p_clase_subcelda); var el_filtro = document.getElementById(p_id_filtro); var lv_filtro_valor = el_filtro ? el_filtro.value : 0; localStorage.setItem(p_id_filtro, lv_filtro_valor ); els_subcelda.forEach(element => { if (lv_filtro_valor === '1'){ element.style.display = "block"; }else{ element.style.display = "none"; } }); } function palancaSignoZodical(){ const lc_textos = { lc_aries: "Овен", lc_tauro: "Телец", lc_geminis: "Близнаци", lc_cancer: "Рак", lc_leo: "Лъв", lc_virgo: "Дева", lc_libra: "Везни", lc_escorpio: "Скорпион", lc_sagitario: "Стрелец", lc_capricornio: "Козирог", lc_acuario: "Водолей", lc_piscis: "Риби", lc_ofiuco: "Офиукус", lc_cetus: "Цетус", lc_imix: "Крокодил или Водно Драконче", lc_ik: "Вятър", lc_akbal: "Нощ", lc_kan: "Семка или Царевица", lc_chikchan: "Змия", lc_kimi: "Смърт", lc_manik: "Елен", lc_lamat: "Звезда", lc_muluk: "Вода или Дъжд", lc_ok: "Куче", lc_chuwen: "Маймуна", lc_eb: "Трева", lc_ben: "Тръстика или Царевица", lc_ix: "Ягуар", lc_men: "Орел", lc_kib: "Совa или Гризли", lc_kaban: "Земя", lc_etznab: "Кремък", lc_kawak: "Буря", lc_ajaw: "Слънце", lc_pop: "Семка", lc_uo: "Цвят", lc_zip: "Лист", lc_zotz: "Прилеп", lc_tzec: "Пълнолуние", lc_xul: "Череп", lc_yaxkin: "Слънце", lc_mol: "Дъжд", lc_chen: "Жътва", lc_yax: "Дърво", lc_zac: "Бяло", lc_ceh: "Елен", lc_mac: "Сухи Листа", lc_kankin: "Царевица", lc_muan: "Птица", lc_pax: "Пролетен Цвят", lc_kayab: "Жътва", lc_cumku: "Вулкан", lc_uayeb: "Тайствено" }; var el_filtro = document.getElementById('signo-zodiacal-grupo'); var lv_filtro_valor = el_filtro ? el_filtro.value : 0; localStorage.setItem('signo-zodiacal-grupo', lv_filtro_valor ); const els_subcelda = document.querySelectorAll('.emoji'); els_subcelda.forEach(element => { element.remove(); }); let els_td_con_data_fecha = document.querySelectorAll('td[data-fecha]'); els_td_con_data_fecha.forEach(td => { let laa_zodiacal = {}; if(lv_filtro_valor === '12'){ laa_zodiacal = obtenerSignoZodiacal12(td.getAttribute('data-fecha')); }else if(lv_filtro_valor === '13'){ laa_zodiacal = obtenerSignoZodiacal13(td.getAttribute('data-fecha')); }else if(lv_filtro_valor === '14'){ laa_zodiacal = obtenerSignoZodiacal14(td.getAttribute('data-fecha')); }else if(lv_filtro_valor === 'maya_tzolkin' || lv_filtro_valor === 'maya_haab'){ laa_zodiacal = calcularSignoMaya(td.getAttribute('data-fecha'),lv_filtro_valor); } if (laa_zodiacal && 'simbolo' in laa_zodiacal) { td.insertAdjacentHTML('afterbegin', '' + laa_zodiacal.simbolo + '
'); var el_popup_ul = td.querySelector('ul'); if (el_popup_ul) { el_popup_ul.insertAdjacentHTML('beforeend', 'Зодиакален знак: ' + laa_zodiacal.simbolo + ' (' + lc_textos['lc_' + laa_zodiacal.nombre] + ')'); } } }); if (lv_filtro_valor !== '0') { let els_relleno = document.querySelectorAll('.relleno'); els_relleno.forEach(td => { td.insertAdjacentHTML('afterbegin', '
'); }); } } function totalFestivos(){ const clasesBuscadas = ['nivel_administrativo_1','nivel_administrativo_2','nivel_administrativo_3','nivel_administrativo_4','nivel_administrativo_5','nacionales', 'festivos_nacionales_y_autonomicos','nacionales-movibles','festivos_autonomicos','festivos_nacionales_y_municipales','festivos_nacionales_y_locales','festivos_nacionales_movibles_y_municipales','festivos_nacionales_movibles_y_locales','festivos_autonomicos_y_municipales','festivos_autonomicos_y_locales','festivos_municipales_y_locales','festivos_municipales','festivos_locales','regiones']; const elementosContados = new Set(); clasesBuscadas.forEach(claseBuscada => { const elementos = document.getElementsByClassName(claseBuscada); Array.from(elementos).forEach(elemento => elementosContados.add(elemento)); }); const total = elementosContados.size; if (total > 0) { let els_total_festivos = document.querySelectorAll('.total_festivos'); els_total_festivos.forEach(span => { span.innerText = total; }); } } function ordenarSubmenu(menuItem) { const subMenu = menuItem.querySelector('.sub-menu'); if (subMenu) { const items = Array.from(subMenu.children); items.sort(function (a, b) { const textA = a.querySelector('a').textContent.toLowerCase(); const textB = b.querySelector('a').textContent.toLowerCase(); if (menuItem.id === 'menu-item-2159') { return textB.localeCompare(textA); }else{ return textA.localeCompare(textB); } }); subMenu.innerHTML = ''; items.forEach(function (item) { subMenu.appendChild(item); }); } } function primerLunes(pv_fecha) { return calcularLunes(pv_fecha,'1'); } function segundoLunes(pv_fecha) { return calcularLunes(pv_fecha,'2'); } function tercerLunes(pv_fecha) { return calcularLunes(pv_fecha,'3'); } function ultimoLunes(pv_fecha) { return calcularLunes(pv_fecha,'ultimo'); } function calcularLunes(pv_fecha,pv_cual) { let lv_ano = pv_fecha.substring(0, 4); let lv_mes = pv_fecha.substring(4, 6); if (lv_ano === '9999') { lv_ano = '1973'; } if (pv_cual !== 'ultimo') { let lv_fecha = new Date(lv_ano, lv_mes - 1, 1); var primerLunes = 2 + ((8 - lv_fecha.getDay()) % 7); } switch (pv_cual) { case '1': return new Date(lv_ano, lv_mes - 1, primerLunes).toISOString().split('T')[0].replace(/-/g, ''); break; case '2': return new Date(lv_ano, lv_mes - 1, primerLunes + 7).toISOString().split('T')[0].replace(/-/g, ''); break; case '3': return new Date(lv_ano, lv_mes - 1, primerLunes + 14).toISOString().split('T')[0].replace(/-/g, ''); break; case 'ultimo': let ultimoDia = new Date(lv_ano, lv_mes, 0); let diaSemanaUltimoDia = ultimoDia.getDay(); let ultimoLunes = ultimoDia.getDate() - ((diaSemanaUltimoDia + 6) % 7) + 1; return new Date(lv_ano, lv_mes - 1, ultimoLunes).toISOString().split('T')[0].replace(/-/g, ''); break; } } const el_nivel_administrativo_2 = document.getElementById("nivel_administrativo_2"); if (el_nivel_administrativo_2 !== null) { enviarFormulario({ preventDefault: () => {}, target: el_nivel_administrativo_2, cargarFormularioResultado: true }); }else{ destacarFinDeSemanaLargoYPuentes(); totalFestivos(); } window.addEventListener('load', function() { var select_fase_lunar = document.getElementById("fase-lunar"); var select_signo_zodiacal = document.getElementById("signo-zodiacal"); var select_signo_zodiacal_grupo = document.getElementById("signo-zodiacal-grupo"); var select_disposicion = document.getElementById('disposicion'); if (select_fase_lunar !== null) { select_fase_lunar.addEventListener("change", function() { palanca('fase-lunar','.luna'); guardarFormulario('filtros'); }); if (localStorage.getItem("fase-lunar") !== null && localStorage.getItem("fase-lunar").trim() !== '') { select_fase_lunar.value = localStorage.getItem("fase-lunar"); } if (select_fase_lunar.value !== '0') { palanca('fase-lunar','.luna'); } } if (select_signo_zodiacal_grupo !== null) { select_signo_zodiacal_grupo.addEventListener("change", function() { palancaSignoZodical(); guardarFormulario('filtros'); }); if (localStorage.getItem("signo-zodiacal-grupo") !== null && localStorage.getItem("signo-zodiacal-grupo").trim() !== '') { select_signo_zodiacal_grupo.value = localStorage.getItem("signo-zodiacal-grupo"); } if (select_signo_zodiacal_grupo.value !== '0') { palancaSignoZodical(); } } if (select_disposicion && 1 === 2) { select_disposicion.addEventListener('change', function() { cambiarDisposicion(); guardarFormulario('filtros'); }); if (localStorage.getItem("disposicion") !== null && localStorage.getItem("disposicion").trim() !== '') { select_disposicion.value = localStorage.getItem("disposicion"); cambiarDisposicion(); } } document.getElementById('descargar')?.addEventListener('change', function() { if (this.value === 'excel') { descargarExcel(); } this.value = 0; }); document.getElementById("menu-navegador")?.insertAdjacentHTML('beforeend', ''); const lv_hoy = new Date(); const lv_fechaHoy = `${lv_hoy.getFullYear()}-${lv_hoy.getMonth() + 1}-${lv_hoy.getDate()}`; document.querySelector(`[data-fecha="${lv_fechaHoy}"]`)?.classList.add('hoy'); }); function cambiarDisposicion(){ var el_filtro = document.getElementById('disposicion'); if (el_filtro) { var lv_filtro_valor = el_filtro ? el_filtro.value : 0; localStorage.setItem('disposicion', lv_filtro_valor ); let tablas = document.querySelectorAll('table'); if (tablas.length > 0) { tablas.forEach(function(tabla) { tabla.style.width = lv_filtro_valor + '%'; }); } } } (function () { 'use strict'; var PI = Math.PI, sin = Math.sin, cos = Math.cos, tan = Math.tan, asin = Math.asin, atan = Math.atan2, acos = Math.acos, rad = PI / 180; var dayMs = 1000 * 60 * 60 * 24, J1970 = 2440588, J2000 = 2451545; function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; } function fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); } function toDays(date) { return toJulian(date) - J2000; } var e = rad * 23.4397; function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); } function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); } function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); } function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); } function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; } function astroRefraction(h) { if (h < 0) h = 0; return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179)); } function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); } function eclipticLongitude(M) { var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), P = rad * 102.9372; return M + C + P + PI; } function sunCoords(d) { var M = solarMeanAnomaly(d), L = eclipticLongitude(M); return { dec: declination(L, 0), ra: rightAscension(L, 0) }; } var SunCalc = {}; SunCalc.getPosition = function (date, lat, lng) { var lw = rad * -lng, phi = rad * lat, d = toDays(date), c = sunCoords(d), H = siderealTime(d, lw) - c.ra; return { azimuth: azimuth(H, phi, c.dec), altitude: altitude(H, phi, c.dec) }; }; var times = SunCalc.times = [ [-0.833, 'sunrise', 'sunset' ], [ -0.3, 'sunriseEnd', 'sunsetStart' ], [ -6, 'dawn', 'dusk' ], [ -12, 'nauticalDawn', 'nauticalDusk'], [ -18, 'nightEnd', 'night' ], [ 6, 'goldenHourEnd', 'goldenHour' ] ]; SunCalc.addTime = function (angle, riseName, setName) { times.push([angle, riseName, setName]); }; var J0 = 0.0009; function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); } function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; } function solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); } function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); } function getSetJ(h, lw, phi, dec, n, M, L) { var w = hourAngle(h, phi, dec), a = approxTransit(w, lw, n); return solarTransitJ(a, M, L); } SunCalc.getTimes = function (date, lat, lng) { var lw = rad * -lng, phi = rad * lat, d = toDays(date), n = julianCycle(d, lw), ds = approxTransit(0, lw, n), M = solarMeanAnomaly(ds), L = eclipticLongitude(M), dec = declination(L, 0), Jnoon = solarTransitJ(ds, M, L), i, len, time, Jset, Jrise; var result = { solarNoon: fromJulian(Jnoon), nadir: fromJulian(Jnoon - 0.5) }; for (i = 0, len = times.length; i < len; i += 1) { time = times[i]; Jset = getSetJ(time[0] * rad, lw, phi, dec, n, M, L); Jrise = Jnoon - (Jset - Jnoon); result[time[1]] = fromJulian(Jrise); result[time[2]] = fromJulian(Jset); } return result; }; function moonCoords(d) { var L = rad * (218.316 + 13.176396 * d), M = rad * (134.963 + 13.064993 * d), F = rad * (93.272 + 13.229350 * d), l = L + rad * 6.289 * sin(M), b = rad * 5.128 * sin(F), dt = 385001 - 20905 * cos(M); return { ra: rightAscension(l, b), dec: declination(l, b), dist: dt }; } SunCalc.getMoonPosition = function (date, lat, lng) { var lw = rad * -lng, phi = rad * lat, d = toDays(date), c = moonCoords(d), H = siderealTime(d, lw) - c.ra, h = altitude(H, phi, c.dec), pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H)); h = h + astroRefraction(h); return { azimuth: azimuth(H, phi, c.dec), altitude: h, distance: c.dist, parallacticAngle: pa }; }; SunCalc.getMoonIllumination = function (date) { var d = toDays(date || new Date()), s = sunCoords(d), m = moonCoords(d), sdist = 149598000, phi = acos(sin(s.dec) * sin(m.dec) + cos(s.dec) * cos(m.dec) * cos(s.ra - m.ra)), inc = atan(sdist * sin(phi), m.dist - sdist * cos(phi)), angle = atan(cos(s.dec) * sin(s.ra - m.ra), sin(s.dec) * cos(m.dec) - cos(s.dec) * sin(m.dec) * cos(s.ra - m.ra)); return { fraction: (1 + cos(inc)) / 2, phase: 0.5 + 0.5 * inc * (angle < 0 ? -1 : 1) / Math.PI, angle: angle }; }; function hoursLater(date, h) { return new Date(date.valueOf() + h * dayMs / 24); } SunCalc.getMoonTimes = function (date, lat, lng, inUTC) { var t = new Date(date); if (inUTC) t.setUTCHours(0, 0, 0, 0); else t.setHours(0, 0, 0, 0); var hc = 0.133 * rad, h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc, h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx; for (var i = 1; i <= 24; i += 2) { h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc; h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc; a = (h0 + h2) / 2 - h1; b = (h2 - h0) / 2; xe = -b / (2 * a); ye = (a * xe + b) * xe + h1; d = b * b - 4 * a * h1; roots = 0; if (d >= 0) { dx = Math.sqrt(d) / (Math.abs(a) * 2); x1 = xe - dx; x2 = xe + dx; if (Math.abs(x1) <= 1) roots++; if (Math.abs(x2) <= 1) roots++; if (x1 < -1) x1 = x2; } if (roots === 1) { if (h0 < 0) rise = i + x1; else set = i + x1; } else if (roots === 2) { rise = i + (ye < 0 ? x2 : x1); set = i + (ye < 0 ? x1 : x2); } if (rise && set) break; h0 = h2; } var result = {}; if (rise) result.rise = hoursLater(t, rise); if (set) result.set = hoursLater(t, set); if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true; return result; }; if (typeof exports === 'object' && typeof module !== 'undefined') module.exports = SunCalc; else if (typeof define === 'function' && define.amd) define(SunCalc); else window.SunCalc = SunCalc; }());