{"id":6265,"date":"2024-11-14T18:07:53","date_gmt":"2024-11-14T18:07:53","guid":{"rendered":"https:\/\/panelbiblio.uca.es\/?page_id=6265"},"modified":"2026-02-26T11:38:27","modified_gmt":"2026-02-26T11:38:27","slug":"ctan","status":"publish","type":"page","link":"https:\/\/panelbiblio.uca.es\/index.php\/ctan\/","title":{"rendered":"CTAN"},"content":{"rendered":"\r\n<div class=\"wp-block-group alignwide has-global-padding is-layout-constrained wp-container-core-group-is-layout-d8d5de73 wp-block-group-is-layout-constrained has-background\" style=\"padding: 0px;background-image:url(&apos;https:\/\/panelbiblio.uca.es\/wp-content\/uploads\/2024\/11\/relojes-transparentes.png&apos;);background-position:50% 0;background-size:cover;\">\r\n<figure class=\"wp-block-image alignwide size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"403\" class=\"wp-image-6414\" src=\"https:\/\/panelbiblio.uca.es\/wp-content\/uploads\/2024\/11\/michael-fousert-G1t_kE6HrE0-unsplash-1024x403.png\" alt=\"\" srcset=\"https:\/\/panelbiblio.uca.es\/wp-content\/uploads\/2024\/11\/michael-fousert-G1t_kE6HrE0-unsplash-1024x403.png 1024w, https:\/\/panelbiblio.uca.es\/wp-content\/uploads\/2024\/11\/michael-fousert-G1t_kE6HrE0-unsplash-300x118.png 300w, https:\/\/panelbiblio.uca.es\/wp-content\/uploads\/2024\/11\/michael-fousert-G1t_kE6HrE0-unsplash-768x302.png 768w, https:\/\/panelbiblio.uca.es\/wp-content\/uploads\/2024\/11\/michael-fousert-G1t_kE6HrE0-unsplash-1536x605.png 1536w, https:\/\/panelbiblio.uca.es\/wp-content\/uploads\/2024\/11\/michael-fousert-G1t_kE6HrE0-unsplash-2048x806.png 2048w, https:\/\/panelbiblio.uca.es\/wp-content\/uploads\/2024\/11\/michael-fousert-G1t_kE6HrE0-unsplash-200x79.png 200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\r\n\r\n\r\n <style>\r\n    \/* Estilo general de la tabla *\/\r\n    .styled-table {\r\n        width: 100%;\r\n        border-collapse: collapse;\r\n        font-family: Arial, sans-serif;\r\n\r\n        font-size: 14px; \r\n        margin: 0 auto;\r\n    }\r\n    \/* Encabezado de la tabla *\/\r\n    .styled-table thead tr {\r\n\r\n        background-color: #7D2F1B;\r\n        color: white;\r\n        text-align: center;\r\n    }\r\n    \/* Bordes y espacio entre celdas *\/\r\n    .styled-table td, .styled-table th {\r\n        padding: 12px 15px;\r\n        border: 1px solid #ddd;\r\n        white-space: pre-line;  \/* Esto permite que los saltos de l\u00ednea se muestren correctamente *\/\r\n    }\r\n    \/* Colores para filas pares e impares *\/\r\n    .styled-table tbody tr:nth-child(even) {\r\n        background-color: #f3f3f3;\r\n    }\r\n    .styled-table tbody tr:nth-child(odd) {\r\n        background-color: #e9e9e9;\r\n    }\r\n    \/* Estilo para filas destacadas *\/\r\n    .uca_celdadestacada td {\r\n        background-color: #f5e6e0;\r\n        color: #7D2F1B;\r\n        font-weight: bold;\r\n        text-align: center;\r\n        border: none;\r\n    }\r\n    \/* Enlaces de la tabla *\/\r\n    .styled-table a, .texto-sin-enlace {\r\n        color: #7D2F1B;\r\n        text-decoration: none;\r\n    }\r\n    .styled-table a:hover {\r\n        text-decoration: underline;\r\n    }\r\n   \/* Estilo para el t\u00edtulo *\/\r\nh1 {\r\n    color: #003366; \/* Azul oscuro *\/\r\n   font-size: 3em;\r\n    font-weight: bold;\r\n    text-align: center; \/* Centrar el t\u00edtulo *\/\r\n}\r\nh3 {\r\n    color: #003366; \/* Azul oscuro *\/\r\n    font-size: 24px; \/* Aumentar el tama\u00f1o de la fuente *\/\r\n \r\n    text-align: left; \r\n}\r\n\/* Estilo para las etiquetas (origen y destino) *\/\r\nlabel {\r\n    color: #003366;\r\n     font-size: 40px; \r\n    font-weight: bold; \/* Hacer las etiquetas en negrita *\/\r\n}\r\n\/* Definir ancho de las columnas *\/\r\n    .col-paradas {\r\n        width: 35%;      }\r\n    .col-frec {\r\n        width: 10%;  \r\n    }\r\n    <\/style><style>\r\n    \/* Estilo para los selectores *\/\r\n   select {\r\n    font-size: 28px !important;\r\n    padding: 10px !important;\r\n    width: 350px !important;\r\n    border: 2px solid #003366 !important;\r\n    border-radius: 5px !important;\r\n}\r\n\r\n<\/style>\r\n<div style=\"margin-bottom: 40px;\">\r\n<h1><b>Consorcio de Transportes de Andaluc\u00eda en la provincia de C\u00e1diz<\/b><\/h1>\r\n<\/div>\r\n<!-- Selector de origen --> <label for=\"origenSelect\">Selecciona el origen: <\/label><select id=\"origenSelect\">\r\n<option value=\"\">Seleccionar origen<\/option>\r\n<\/select>\r\n<p>&nbsp;<\/p>\r\n<!-- Selector de destino --> <label for=\"destinoSelect\">Selecciona el destino: <\/label><select id=\"destinoSelect\">\r\n<option value=\"\">Seleccionar destino<\/option>\r\n<\/select>\r\n<p>&nbsp;<\/p>\r\n<div style=\"margin-bottom: 30px;\">\r\n<h3>Seleccionar &#8220;Campus Universitario&#8221; para el Campus de Puerto Real y la ESI.<\/h3>\r\n<\/div>\r\n<p>&nbsp;<\/p>\r\n<p>&nbsp;<\/p>\r\n<!-- Tabla para mostrar los horarios -->\r\n<table id=\"horariosTabla\" class=\"styled-table\">\r\n<thead>\r\n<tr>\r\n<th class=\"col-frec\">L\u00ednea<\/th>\r\n<th class=\"col-frec\">Frecuencia<\/th>\r\n<th class=\"col-paradas\">Paradas<\/th>\r\n<th>Horas<\/th>\r\n<th>Observaciones<\/th>\r\n<\/tr>\r\n<\/thead>\r\n<tbody>\r\n<tr>\r\n<td colspan=\"5\">Selecciona origen y destino para ver los horarios<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n<script>\r\n        \/\/ Funci\u00f3n para obtener los n\u00facleos\r\n        async function fetchNucleos() {\r\n            try {\r\n                const response = await fetch('https:\/\/api.ctan.es\/v1\/Consorcios\/2\/nucleos');\r\n                if (!response.ok) throw new Error(`Error HTTP: ${response.status}`);\r\n                const data = await response.json();\r\n                return data.nucleos;\r\n            } catch (error) {\r\n                console.error('Error al obtener los n\u00facleos:', error);\r\n                return [];\r\n            }\r\n        }\r\n\r\n        \/\/ Funci\u00f3n para obtener los horarios\r\n        async function fetchHorarios(origen, destino) {\r\n            if (!origen || !destino) {\r\n               \/\/ alert(\"Por favor, selecciona tanto origen como destino.\"); Esto hace que salga un mensajito recordando que debes incluir esos datos, desactivo porque es un incordio\r\n                return;\r\n            }\r\n\r\n            const tbody = document.getElementById('horariosTabla').getElementsByTagName('tbody')[0];\r\n            tbody.innerHTML = \"<tr><td colspan='5'>Cargando horarios...<\/td><\/tr>\";\r\n\r\n            try {\r\n                const url = `https:\/\/api.ctan.es\/v1\/Consorcios\/2\/horarios_origen_destino?destino=${destino}&lang=ES&origen=${origen}`;\r\n                const response = await fetch(url);\r\n\r\n                if (response.status === 400) {\r\n                    tbody.innerHTML = \"<tr><td colspan='5'>No existen l\u00edneas para este trayecto<\/td><\/tr>\";\r\n                    return;\r\n                }\r\n\r\n                if (!response.ok) throw new Error(`Error HTTP: ${response.status}`);\r\n\r\n                const data = await response.json();\r\n\r\n                if (!data.horario || data.horario.length === 0) {\r\n                    tbody.innerHTML = \"<tr><td colspan='5'>No hay l\u00edneas para este trayecto<\/td><\/tr>\";\r\n                    return;\r\n                }\r\n\r\n                const horarios = data.horario;\r\n                tbody.innerHTML = \"\"; \/\/ Limpiar la tabla\r\n\r\n                horarios.forEach(horario => {\r\n                    const row = document.createElement('tr');\r\n\r\n                    \/\/ L\u00ednea\r\n                    const lineaCell = document.createElement('td');\r\n                    lineaCell.textContent = horario.codigo || \"N\/A\";\r\n                    row.appendChild(lineaCell);\r\n\r\n                    \/\/ Frecuencia\r\n                    const freqCell = document.createElement('td');\r\n                    freqCell.textContent = horario.dias || \"N\/A\";\r\n                    row.appendChild(freqCell);\r\n\r\n                    \/\/ Paradas\r\n                    const paradasCell = document.createElement('td');\r\n                    const paradasList = data.bloques\r\n                        .filter(bloque => ![\"Lineas\", \"Frecuencia\", \"Observaciones\"].includes(bloque.nombre.trim()))\r\n                        .map(bloque => bloque.nombre)\r\n                        .join('\\n');  \/\/ Reemplaza las comas por saltos de l\u00ednea\r\n                    paradasCell.textContent = paradasList || \"Sin paradas\";\r\n                    row.appendChild(paradasCell);\r\n\r\n                    \/\/ Horas\r\n                    const horasCell = document.createElement('td');\r\n                    const horasList = horario.horas ? horario.horas.join('\\n') : \"Sin horas\";  \/\/ Usamos '\\n' para los saltos de l\u00ednea\r\n                    horasCell.textContent = horasList;\r\n                    row.appendChild(horasCell);\r\n\r\n                    \/\/ Observaciones\r\n                    const obsCell = document.createElement('td');\r\n                    obsCell.textContent = horario.observaciones || \"Sin observaciones\";\r\n                    row.appendChild(obsCell);\r\n\r\n                    tbody.appendChild(row);\r\n                });\r\n\r\n                \/\/ A\u00f1adir la fila con la informaci\u00f3n adicional\r\n                const finalRow = document.createElement('tr');\r\n                finalRow.classList.add('uca_celdadestacada');\r\n                \r\n                const finalCell = document.createElement('td');\r\n                finalCell.colSpan = 5;\r\n                finalCell.innerHTML = `\r\n                    <b>Medio de transporte:<\/b> AUTOB\u00daS INTERURBANO<br>\r\n                    <b>Observaciones:<\/b> Los tiempos de salida de cabecera son fijos, mientras que los tiempos de paso por las zonas intermedias estar\u00e1n sujetos a las condiciones del tr\u00e1fico, y est\u00e1n referidas al tiempo de paso por la primera parada dentro de la zona.\r\n                `;\r\n                finalRow.appendChild(finalCell);\r\n                tbody.appendChild(finalRow);\r\n\r\n            } catch (error) {\r\n                console.error('Error al obtener los horarios:', error);\r\n                tbody.innerHTML = `<tr><td colspan=\"5\">Error al cargar los datos<\/td><\/tr>`;\r\n            }\r\n        }\r\n\r\n        \/\/ Funci\u00f3n para llenar los selectores de origen y destino\r\n        async function populateSelects() {\r\n            const nucleos = await fetchNucleos();\r\n\r\n            const origenSelect = document.getElementById('origenSelect');\r\n            const destinoSelect = document.getElementById('destinoSelect');\r\n\r\n            if (nucleos.length === 0) {\r\n                console.error('No se encontraron n\u00facleos.');\r\n                return;\r\n            }\r\n\r\n            nucleos.forEach(nucleo => {\r\n                const optionOrigen = document.createElement('option');\r\n                optionOrigen.value = nucleo.idNucleo;\r\n                optionOrigen.textContent = nucleo.nombre;\r\n                origenSelect.appendChild(optionOrigen);\r\n\r\n                const optionDestino = document.createElement('option');\r\n                optionDestino.value = nucleo.idNucleo;\r\n                optionDestino.textContent = nucleo.nombre;\r\n                destinoSelect.appendChild(optionDestino);\r\n            });\r\n        }\r\n\r\n        \/\/ Actualiza los horarios cuando se cambian las opciones\r\n        document.getElementById('origenSelect').addEventListener('change', function() {\r\n            const origen = this.value;\r\n            const destino = document.getElementById('destinoSelect').value;\r\n            fetchHorarios(origen, destino);\r\n        });\r\n\r\n        document.getElementById('destinoSelect').addEventListener('change', function() {\r\n            const destino = this.value;\r\n            const origen = document.getElementById('origenSelect').value;\r\n            fetchHorarios(origen, destino);\r\n        });\r\n\r\n        \/\/ Llamada inicial para cargar los selectores\r\n        populateSelects();\r\n    <\/script><\/div>\r\n\r\n\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Consorcio de Transportes de Andaluc\u00eda en la provincia de C\u00e1diz Selecciona el origen: Seleccionar origen &nbsp; Selecciona el destino: Seleccionar destino &nbsp; Seleccionar &#8220;Campus Universitario&#8221; para el Campus de Puerto Real y la ESI. &nbsp; &nbsp; L\u00ednea Frecuencia Paradas Horas Observaciones Selecciona origen y destino para ver los horarios<\/p>\n","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"wp-custom-template-individual-2","meta":{"_eb_attr":"","footnotes":""},"class_list":["post-6265","page","type-page","status-publish","hentry"],"publishpress_future_action":{"enabled":false,"date":"2026-05-12 22:44:13","action":"change-status","newStatus":"draft","terms":[],"taxonomy":""},"_links":{"self":[{"href":"https:\/\/panelbiblio.uca.es\/index.php\/wp-json\/wp\/v2\/pages\/6265","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/panelbiblio.uca.es\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/panelbiblio.uca.es\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/panelbiblio.uca.es\/index.php\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/panelbiblio.uca.es\/index.php\/wp-json\/wp\/v2\/comments?post=6265"}],"version-history":[{"count":65,"href":"https:\/\/panelbiblio.uca.es\/index.php\/wp-json\/wp\/v2\/pages\/6265\/revisions"}],"predecessor-version":[{"id":7316,"href":"https:\/\/panelbiblio.uca.es\/index.php\/wp-json\/wp\/v2\/pages\/6265\/revisions\/7316"}],"wp:attachment":[{"href":"https:\/\/panelbiblio.uca.es\/index.php\/wp-json\/wp\/v2\/media?parent=6265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}