{"id":94970,"date":"2025-10-21T09:46:35","date_gmt":"2025-10-21T14:46:35","guid":{"rendered":"https:\/\/uninavarra.edu.co\/?page_id=94970"},"modified":"2026-03-06T09:53:07","modified_gmt":"2026-03-06T14:53:07","slug":"buscador-de-convenios","status":"publish","type":"page","link":"https:\/\/uninavarra.edu.co\/en\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/","title":{"rendered":"Agreement Finder"},"content":{"rendered":"<div class=\"wpb-content-wrapper\"><div class=\"wpb-container \"><div class=\"container\"><div class=\"vc_row wpb_row vc_row-fluid row \"><div class=\"col-sm-12  vc_\">\n\t\t<div class=\"wpb_wrapper \">\n\t\t\t\n\t<div class=\"wpb_raw_code wpb_raw_html wpb_content_element\" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t<div id=\"convenios-app\" class=\"convenios-container\">\n    <div id=\"loading\" class=\"loading\">\n        <div class=\"loading-spinner\"><\/div>\n        <p>Cargando informaci\u00f3n de convenios...<\/p>\n    <\/div>\n\n    <div id=\"filtros-container\" class=\"filtros-container\" style=\"display:none;\">\n        <div class=\"search-container\">\n            <form id=\"search-form\">\n                <input type=\"text\" id=\"search-input\" placeholder=\"Buscar convenios...\">\n                <button type=\"submit\" id=\"search-button\" title=\"Buscar\">\n                    <i class=\"fas fa-search\"><\/i>\n                <\/button>\n                <button id=\"limpiar-filtros\" class=\"icon-button\" type=\"button\" title=\"Limpiar filtros\">\n                    <i class=\"fas fa-eraser\"><\/i>\n                <\/button>\n                <button id=\"descargar-informe\" class=\"icon-button\" type=\"button\" title=\"Descargar informe\">\n                    <i class=\"fas fa-file-excel\"><\/i>\n                <\/button>\n            <\/form>\n        <\/div>\n\n        <div class=\"form-row\">\n            <div class=\"form-group\">\n                <label for=\"filter-programa\">Programa Acad\u00e9mico UNINAVARRA (en actualizaci\u00f3n)<\/label>\n                <select id=\"filter-programa\" class=\"form-control filter\" data-filter=\"programa\">\n                    <option value=\"\">Todos los programas<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"filter-pais\">Pa\u00eds<\/label>\n                <select id=\"filter-pais\" class=\"form-control filter\" data-filter=\"pais\">\n                    <option value=\"\">Todos los pa\u00edses<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"filter-ciudad\">Ciudad<\/label>\n                <select id=\"filter-ciudad\" class=\"form-control filter\" data-filter=\"ciudad\">\n                    <option value=\"\">Todas las ciudades<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n\n        <div class=\"form-row\">\n            <div class=\"form-group\">\n                <label for=\"filter-colaboracion\">Tipo de Colaboraci\u00f3n<\/label>\n                <select id=\"filter-colaboracion\" class=\"form-control filter\" data-filter=\"colaboracion\">\n                    <option value=\"\">Todos los tipos<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"filter-movilidad\">Tipo de Movilidad<\/label>\n                <select id=\"filter-movilidad\" class=\"form-control filter\" data-filter=\"movilidad\">\n                    <option value=\"\">Todos los tipos de movilidad<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"form-group\">\n                <label for=\"filter-grupo\">Grupo de Convenio<\/label>\n                <select id=\"filter-grupo\" class=\"form-control filter\" data-filter=\"grupo\">\n                    <option value=\"\">Todos los grupos<\/option>\n                <\/select>\n            <\/div>\n        <\/div>\n\n        <div id=\"tarjetas-container\" class=\"tarjetas-grid\"><\/div>\n\n        <div id=\"paginacion-container\" class=\"paginacion-container\" style=\"display:none;\">\n            <button id=\"btn-anterior\" class=\"btn-paginacion\">\u2190 Anterior<\/button>\n            <span id=\"info-pagina\" class=\"info-pagina\"><\/span>\n            <button id=\"btn-siguiente\" class=\"btn-paginacion\">Siguiente \u2192<\/button>\n        <\/div>\n\n        <div id=\"no-results\" class=\"no-results\" style=\"display:none;\">\n            <h3>No se encontraron resultados<\/h3>\n            <p>Intenta cambiar los filtros o realizar una b\u00fasqueda diferente.<\/p>\n        <\/div>\n\n        <div id=\"popup-overlay\" class=\"popup-overlay\">\n            <div class=\"popup-container\">\n                <div class=\"popup-header\">\n                    <h2 id=\"popup-title\" class=\"popup-title\"><\/h2>\n                    <button id=\"popup-close\" class=\"popup-close\">&times;<\/button>\n                <\/div>\n                <div class=\"popup-body\"><\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/xlsx\/0.18.5\/xlsx.full.min.js\"><\/script>\n\t\t<\/div>\n\t<\/div>\n\n\t\t<\/div> \n\t<\/div><\/div><\/div><\/div><div class=\"wpb-container \"><div class=\"container\"><div class=\"vc_row wpb_row vc_row-fluid row \"><div class=\"col-sm-12  vc_\">\n\t\t<div class=\"wpb_wrapper \">\n\t\t\t\n\t<div class=\"wpb_raw_code wpb_raw_js\" >\n\t\t<div class=\"wpb_wrapper\">\n\t\t\t<script>\nconst API_KEY = 'AIzaSyBnk4I7IbLq1GV4wVuIypF6lAXijdVknSw';\nconst SPREADSHEET_ID = '1yHt6UCf9JSIhJ3uStlQlWeApkRZeAqC42FllDOYz3zk';\nlet webData = [];\nlet filtersObject = {};\nlet paginaActual = 1;\nconst tarjetasPorPagina = 6;\n\n\/\/ Opciones originales de cada filtro (se llenan una sola vez)\nlet opcionesOriginales = {\n    pais: [],\n    ciudad: [],\n    programa: [],\n    colaboracion: [],\n    movilidad: [],\n    grupo: []\n};\n\n$(document).ready(function() {\n    cargarDatos();\n\n    $(\".filter\").on(\"change\", function() {\n        let filterName = $(this).data(\"filter\");\n        let filterVal = $(this).val();\n\n        if (filterName === \"pais\") {\n            $(\"#filter-ciudad\").val(\"\");\n            delete filtersObject[\"ciudad\"];\n        }\n\n        if (filterVal == \"\") {\n            delete filtersObject[filterName];\n        } else {\n            filtersObject[filterName] = filterVal;\n        }\n\n        $(\"#search-input\").val(\"\");\n        $(\".tarjeta\").removeClass('oculta');\n        actualizarFiltros();\n    });\n\n    $(\"#search-form\").submit(function(e) {\n        e.preventDefault();\n        aplicarBusqueda();\n    });\n\n    $(\"#search-input\").on('input', function() {\n        aplicarBusqueda();\n    });\n\n    $(\"#btn-anterior\").click(function() { mostrarPagina(paginaActual - 1); });\n    $(\"#btn-siguiente\").click(function() { mostrarPagina(paginaActual + 1); });\n\n    $(\"#popup-close\").click(function() {\n        $(\"#popup-overlay\").fadeOut(300);\n        $(\"body\").removeClass(\"popup-open\");\n    });\n\n    $(document).on('click', '.popup-overlay', function(e) {\n        if ($(e.target).closest('.popup-container').length === 0) {\n            $(\"#popup-overlay\").fadeOut(300);\n            $(\"body\").removeClass(\"popup-open\");\n        }\n    });\n\n    $(document).keydown(function(e) {\n        if (e.keyCode === 27) {\n            $(\"#popup-overlay\").fadeOut(300);\n            $(\"body\").removeClass(\"popup-open\");\n        }\n    });\n\n    $(\"#limpiar-filtros\").click(function() {\n        $(\".filter\").val(\"\");\n        filtersObject = {};\n        $(\"#search-input\").val(\"\");\n        $(\".tarjeta\").removeClass('oculta');\n        restaurarOpcionesFiltros();\n        verificarResultados();\n    });\n\n    $(\"#descargar-informe\").click(function() {\n        generarInformeExcel();\n    });\n});\n\n\/\/ \u2500\u2500\u2500 Filtros articulados \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction actualizarOpcionesFiltros() {\n    let tarjetasVisibles = $(\".tarjeta\").not('.oculta');\n\n    let valores = {\n        pais: new Set(),\n        ciudad: new Set(),\n        programa: new Set(),\n        colaboracion: new Set(),\n        movilidad: new Set(),\n        grupo: new Set()\n    };\n\n    tarjetasVisibles.each(function() {\n        let pais = $(this).data('pais');\n        if (pais) valores.pais.add(pais);\n\n        let ciudades = $(this).data('ciudades');\n        if (ciudades) ciudades.toString().split(',').forEach(c => { if (c.trim()) valores.ciudad.add(c.trim()); });\n\n        let programas = $(this).data('programas-uninavarra');\n        if (programas) programas.toString().split(',').forEach(p => { if (p.trim()) valores.programa.add(p.trim()); });\n\n        let colaboracion = $(this).data('colaboracion');\n        if (colaboracion) colaboracion.toString().split(',').forEach(c => { if (c.trim()) valores.colaboracion.add(c.trim()); });\n\n        let movilidad = $(this).data('movilidad');\n        if (movilidad) movilidad.toString().split(',').forEach(m => { if (m.trim()) valores.movilidad.add(m.trim()); });\n\n        let grupo = $(this).data('grupo');\n        if (grupo) grupo.toString().split(',').forEach(g => { if (g.trim()) valores.grupo.add(g.trim()); });\n    });\n\n    const config = {\n        pais:        { selector: '#filter-pais',         defaultText: 'Todos los pa\u00edses' },\n        ciudad:      { selector: '#filter-ciudad',        defaultText: 'Todas las ciudades' },\n        programa:    { selector: '#filter-programa',      defaultText: 'Todos los programas' },\n        colaboracion:{ selector: '#filter-colaboracion',  defaultText: 'Todos los tipos' },\n        movilidad:   { selector: '#filter-movilidad',     defaultText: 'Todos los tipos de movilidad' },\n        grupo:       { selector: '#filter-grupo',         defaultText: 'Todos los grupos' }\n    };\n\n    for (let key in config) {\n        \/\/ No tocar el filtro que est\u00e1 activo actualmente\n        if (filtersObject[key]) continue;\n\n        let currentVal = $(config[key].selector).val();\n        let sortedValues = Array.from(valores[key]).sort();\n\n        $(config[key].selector).empty();\n        $(config[key].selector).append(`<option value=\"\">${config[key].defaultText}<\/option>`);\n        sortedValues.forEach(val => {\n            $(config[key].selector).append(`<option value=\"${val}\">${val}<\/option>`);\n        });\n\n        if (currentVal && valores[key].has(currentVal)) {\n            $(config[key].selector).val(currentVal);\n        }\n    }\n}\n\nfunction restaurarOpcionesFiltros() {\n    const config = {\n        pais:        { selector: '#filter-pais',         defaultText: 'Todos los pa\u00edses' },\n        ciudad:      { selector: '#filter-ciudad',        defaultText: 'Todas las ciudades' },\n        programa:    { selector: '#filter-programa',      defaultText: 'Todos los programas' },\n        colaboracion:{ selector: '#filter-colaboracion',  defaultText: 'Todos los tipos' },\n        movilidad:   { selector: '#filter-movilidad',     defaultText: 'Todos los tipos de movilidad' },\n        grupo:       { selector: '#filter-grupo',         defaultText: 'Todos los grupos' }\n    };\n\n    for (let key in config) {\n        $(config[key].selector).empty();\n        $(config[key].selector).append(`<option value=\"\">${config[key].defaultText}<\/option>`);\n        opcionesOriginales[key].forEach(val => {\n            $(config[key].selector).append(`<option value=\"${val}\">${val}<\/option>`);\n        });\n    }\n}\n\n\/\/ \u2500\u2500\u2500 Carga de datos \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction cargarDatos() {\n    getSheetData(SPREADSHEET_ID, 'WEB!A:AZ', API_KEY)\n        .then(response => {\n            webData = procesarDatosWeb(response);\n            generarTarjetasAgrupadas();\n            $(\"#loading\").hide();\n            $(\"#filtros-container\").show();\n        })\n        .catch(error => {\n            console.error('Error al cargar datos:', error);\n            $(\"#loading\").html('<p>Error al cargar los datos. Intente recargar la p\u00e1gina.<\/p>');\n        });\n}\n\nasync function getSheetData(id, rango, key) {\n    let url = `https:\/\/sheets.googleapis.com\/v4\/spreadsheets\/${id}\/values\/${rango}?key=${key}`;\n    const response = await fetch(url);\n    return response.json();\n}\n\nfunction procesarDatosWeb(infoJson) {\n    let entries = infoJson.values;\n    if (!entries || entries.length === 0) return [];\n\n    let campos = entries[0];\n    let datos = [];\n\n    for (let f = 1; f < entries.length; f++) {\n        let fila = entries[f];\n        let obj = {};\n        for (let c = 0; c < fila.length; c++) {\n            if (c < campos.length) obj[campos[c]] = fila[c] || '';\n        }\n        if (obj.INSTITUCI\u00d3N) datos.push(obj);\n    }\n\n    return datos;\n}\n\n\/\/ \u2500\u2500\u2500 Generaci\u00f3n de tarjetas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction generarTarjetasAgrupadas() {\n    let tarjetasAgrupadas = {};\n    let conveniosPorInstitucion = {};\n    let paisesSet = new Set();\n    let ciudadesSet = new Set();\n    let programasSet = new Set();\n    let tiposMovilidadSet = new Set();\n    let gruposConvenioSet = new Set();\n    let colaboracionesSet = new Set();\n\n    webData.forEach(fila => {\n        if (fila.ESTADO && fila.ESTADO.toLowerCase() !== 'vigente') return;\n\n        let institucion = fila.INSTITUCI\u00d3N;\n        let tipoAcuerdo = fila[\"TIPO DE ACUERDO\"];\n        let grupoConvenio = fila[\"GRUPO DE CONVENIO\"] || '';\n        let claveConvenio = `${tipoAcuerdo}-${grupoConvenio}`;\n\n        if (fila[\"PA\u00cdS DE LA INSTITUCI\u00d3N\"]) paisesSet.add(fila[\"PA\u00cdS DE LA INSTITUCI\u00d3N\"]);\n\n        let ciudadPrincipal = fila[\"CIUDAD PRINCIPAL DE LA INSTITUCI\u00d3N\"] ? fila[\"CIUDAD PRINCIPAL DE LA INSTITUCI\u00d3N\"].trim() : '';\n        let otrasCiudades = fila[\"OTRAS CIUDADES DE LA INSTITUCI\u00d3N\"] ? fila[\"OTRAS CIUDADES DE LA INSTITUCI\u00d3N\"].split(',').map(c => c.trim()).filter(c => c !== '') : [];\n\n        if (ciudadPrincipal) ciudadesSet.add(ciudadPrincipal);\n        otrasCiudades.forEach(ciudad => { if (ciudad) ciudadesSet.add(ciudad); });\n\n        if (fila[\"PROGRAMAS ACAD\u00c9MICOS AFINES UNINAVARRA\"]) {\n            fila[\"PROGRAMAS ACAD\u00c9MICOS AFINES UNINAVARRA\"].split(',').map(p => p.trim()).forEach(p => { if (p) programasSet.add(p); });\n        }\n\n        if (fila[\"TIPOS MOVILIDAD\"]) {\n            fila[\"TIPOS MOVILIDAD\"].split(',').map(t => t.trim()).forEach(t => { if (t) tiposMovilidadSet.add(t); });\n        }\n\n        if (fila[\"GRUPO DE CONVENIO\"]) gruposConvenioSet.add(fila[\"GRUPO DE CONVENIO\"]);\n\n        \/\/ Colaboraciones\n        const camposColab = { 'Docencia': 'Docencia', 'Investigaci\u00f3n': 'Investigaci\u00f3n', 'Proyecci\u00f3n Social': 'Proyecci\u00f3n Social', 'Extensi\u00f3n': 'Extensi\u00f3n', 'Administrativa': 'Administrativa', 'Pr\u00e1cticas estudiantiles': 'Pr\u00e1cticas estudiantiles', 'Otras': 'Otras' };\n        for (let campo in camposColab) {\n            if (fila[campo]) colaboracionesSet.add(camposColab[campo]);\n        }\n\n        if (!tarjetasAgrupadas[institucion]) {\n            tarjetasAgrupadas[institucion] = {\n                institucion, pais: fila[\"PA\u00cdS DE LA INSTITUCI\u00d3N\"] || '',\n                departamento: fila[\"DEPARTAMENTO\/ESTADO DE LA INSTITUCI\u00d3N\"] || '',\n                ciudadPrincipal, otrasCiudades,\n                imagenUrl: fila[\"LINK IMAGEN INSTITUCI\u00d3N\"] || '',\n                enlaceInstitucion: fila[\"LINK P\u00c1GINA WEB INSTITUCI\u00d3N\"] || '',\n                tiposMovilidad: fila[\"TIPOS MOVILIDAD\"] ? fila[\"TIPOS MOVILIDAD\"].split(',').map(t => t.trim()).filter(t => t !== '') : [],\n                anotaciones: fila[\"ANOTACIONES\"] || '',\n                convenios: {}\n            };\n            conveniosPorInstitucion[institucion] = {};\n        } else {\n            otrasCiudades.forEach(ciudad => {\n                if (ciudad && !tarjetasAgrupadas[institucion].otrasCiudades.includes(ciudad))\n                    tarjetasAgrupadas[institucion].otrasCiudades.push(ciudad);\n            });\n            if (fila[\"TIPOS MOVILIDAD\"]) {\n                fila[\"TIPOS MOVILIDAD\"].split(',').map(t => t.trim()).filter(t => t !== '').forEach(tipo => {\n                    if (!tarjetasAgrupadas[institucion].tiposMovilidad.includes(tipo))\n                        tarjetasAgrupadas[institucion].tiposMovilidad.push(tipo);\n                });\n            }\n        }\n\n        if (!conveniosPorInstitucion[institucion][claveConvenio]) {\n            conveniosPorInstitucion[institucion][claveConvenio] = {\n                tipoAcuerdo, grupoConvenio,\n                objeto: fila[\"OBJETO DEL ACUERDO\"] || '',\n                observacion: fila[\"OBSERVACI\u00d3N\"] || '',\n                tiposMovilidad: fila[\"TIPOS MOVILIDAD\"] ? fila[\"TIPOS MOVILIDAD\"].split(',').map(t => t.trim()).filter(t => t !== '') : [],\n                docencia: fila.Docencia || '', investigacion: fila.Investigaci\u00f3n || '',\n                proyeccionSocial: fila[\"Proyecci\u00f3n Social\"] || '', extension: fila.Extensi\u00f3n || '',\n                administrativa: fila.Administrativa || '', practicasEstudiantiles: fila[\"Pr\u00e1cticas estudiantiles\"] || '',\n                otras: fila.Otras || '', estado: fila.ESTADO || '',\n                fechaInicio: fila[\"FECHA DE INICIO\"] || '', fechaModificacion: fila[\"FECHA DE ADICI\u00d3N \/ MODIFICACI\u00d3N\"] || '',\n                fechaVencimiento: fila[\"FECHA DE VENCIMIENTO\"] || '', vigenciaActual: fila[\"VIGENCIA ACTUAL (d\u00edas)\"] || '',\n                programasUninavarra: [], programasDestino: [], linksProgramasDestino: [],\n                ciudadesProgramasDestino: [], modalidadesProgramasDestino: []\n            };\n        } else {\n            if (fila[\"TIPOS MOVILIDAD\"]) {\n                fila[\"TIPOS MOVILIDAD\"].split(',').map(t => t.trim()).filter(t => t !== '').forEach(tipo => {\n                    if (!conveniosPorInstitucion[institucion][claveConvenio].tiposMovilidad.includes(tipo))\n                        conveniosPorInstitucion[institucion][claveConvenio].tiposMovilidad.push(tipo);\n                });\n            }\n        }\n\n        if (fila[\"PROGRAMAS ACAD\u00c9MICOS AFINES UNINAVARRA\"]) {\n            let programasUninavarra = fila[\"PROGRAMAS ACAD\u00c9MICOS AFINES UNINAVARRA\"].split(',').map(p => p.trim());\n            let programasDestino = fila[\"PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] ? fila[\"PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"].split(',').map(p => p.trim()) : [];\n            let linkProgramas = fila[\"LINK PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] || '';\n            let ciudadesProgramasDestino = fila[\"CIUDAD SEDE PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] ? fila[\"CIUDAD SEDE PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"].split(',').map(c => c.trim()) : [];\n            let modalidadesProgramasDestino = fila[\"MODALIDAD PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] ? fila[\"MODALIDAD PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"].split(',').map(m => m.trim()) : [];\n\n            programasUninavarra.forEach((programa, index) => {\n                if (!programa) return;\n                let programaDestino = index < programasDestino.length ? programasDestino[index] : '';\n                let ciudadSedeDestino = index < ciudadesProgramasDestino.length ? ciudadesProgramasDestino[index] : '';\n                let modalidadDestino = index < modalidadesProgramasDestino.length ? modalidadesProgramasDestino[index] : '';\n\n                let yaExiste = false;\n                let conv = conveniosPorInstitucion[institucion][claveConvenio];\n                for (let i = 0; i < conv.programasUninavarra.length; i++) {\n                    if (conv.programasUninavarra[i] === programa && conv.programasDestino[i] === programaDestino &&\n                        conv.ciudadesProgramasDestino[i] === ciudadSedeDestino && conv.modalidadesProgramasDestino[i] === modalidadDestino) {\n                        yaExiste = true; break;\n                    }\n                }\n                if (!yaExiste) {\n                    conv.programasUninavarra.push(programa);\n                    conv.programasDestino.push(programaDestino);\n                    conv.linksProgramasDestino.push(linkProgramas);\n                    conv.ciudadesProgramasDestino.push(ciudadSedeDestino);\n                    conv.modalidadesProgramasDestino.push(modalidadDestino);\n                }\n            });\n        }\n    });\n\n    for (let institucion in tarjetasAgrupadas) {\n        tarjetasAgrupadas[institucion].convenios = conveniosPorInstitucion[institucion];\n    }\n\n    \/\/ Guardar opciones originales\n    opcionesOriginales.pais         = Array.from(paisesSet).sort();\n    opcionesOriginales.ciudad       = Array.from(ciudadesSet).sort();\n    opcionesOriginales.programa     = Array.from(programasSet).sort();\n    opcionesOriginales.colaboracion = Array.from(colaboracionesSet).sort();\n    opcionesOriginales.movilidad    = Array.from(tiposMovilidadSet).sort();\n    opcionesOriginales.grupo        = Array.from(gruposConvenioSet).sort();\n\n    llenarFiltros();\n\n    let tarjetasArray = Object.values(tarjetasAgrupadas);\n    generarTarjetasHTML(tarjetasArray);\n}\n\nfunction llenarFiltros() {\n    opcionesOriginales.pais.forEach(p => $(\"#filter-pais\").append(`<option value=\"${p}\">${p}<\/option>`));\n    opcionesOriginales.ciudad.forEach(c => $(\"#filter-ciudad\").append(`<option value=\"${c}\">${c}<\/option>`));\n    opcionesOriginales.programa.forEach(p => $(\"#filter-programa\").append(`<option value=\"${p}\">${p}<\/option>`));\n    opcionesOriginales.colaboracion.forEach(c => $(\"#filter-colaboracion\").append(`<option value=\"${c}\">${c}<\/option>`));\n    opcionesOriginales.movilidad.forEach(t => $(\"#filter-movilidad\").append(`<option value=\"${t}\">${t}<\/option>`));\n    opcionesOriginales.grupo.forEach(g => $(\"#filter-grupo\").append(`<option value=\"${g}\">${g}<\/option>`));\n}\n\n\/\/ \u2500\u2500\u2500 Paginaci\u00f3n \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction mostrarPagina(pagina) {\n    let tarjetasVisibles = [];\n    $(\".tarjeta\").each(function() {\n        if (!$(this).hasClass('oculta')) tarjetasVisibles.push(this);\n    });\n\n    const totalTarjetas = tarjetasVisibles.length;\n    const totalPaginas = Math.ceil(totalTarjetas \/ tarjetasPorPagina);\n\n    if (pagina < 1) pagina = 1;\n    if (pagina > totalPaginas) pagina = totalPaginas;\n    if (totalPaginas === 0) pagina = 0;\n\n    paginaActual = pagina;\n\n    const inicio = (pagina - 1) * tarjetasPorPagina;\n    const fin = inicio + tarjetasPorPagina;\n\n    $(\".tarjeta\").not('.oculta').addClass('paginacion-oculta');\n    for (let i = inicio; i < fin && i < totalTarjetas; i++) {\n        $(tarjetasVisibles[i]).removeClass('paginacion-oculta');\n    }\n\n    $(\"#info-pagina\").text(`P\u00e1gina ${pagina} de ${totalPaginas}`);\n    $(\"#btn-anterior\").prop('disabled', pagina === 1 || totalPaginas === 0);\n    $(\"#btn-siguiente\").prop('disabled', pagina === totalPaginas || totalPaginas === 0);\n    $(\"#paginacion-container\").toggle(totalPaginas > 1);\n}\n\n\/\/ \u2500\u2500\u2500 HTML de tarjetas \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction generarTarjetasHTML(tarjetasData) {\n    let contenedorTarjetas = $(\"#tarjetas-container\");\n    contenedorTarjetas.empty();\n\n    if (tarjetasData.length === 0) { $(\"#no-results\").show(); return; }\n\n    tarjetasData.forEach((tarjeta, index) => {\n        let tarjetaId = `tarjeta-${index}`;\n\n        let todosLosProgramas = [];\n        for (let clave in tarjeta.convenios) {\n            tarjeta.convenios[clave].programasUninavarra.forEach(p => {\n                if (!todosLosProgramas.includes(p)) todosLosProgramas.push(p);\n            });\n        }\n\n        let tiposColaboracion = new Set();\n        for (let clave in tarjeta.convenios) {\n            let c = tarjeta.convenios[clave];\n            if (c.docencia) tiposColaboracion.add(\"Docencia\");\n            if (c.investigacion) tiposColaboracion.add(\"Investigaci\u00f3n\");\n            if (c.proyeccionSocial) tiposColaboracion.add(\"Proyecci\u00f3n Social\");\n            if (c.extension) tiposColaboracion.add(\"Extensi\u00f3n\");\n            if (c.administrativa) tiposColaboracion.add(\"Administrativa\");\n            if (c.practicasEstudiantiles) tiposColaboracion.add(\"Pr\u00e1cticas estudiantiles\");\n            if (c.otras) tiposColaboracion.add(\"Otras\");\n        }\n\n        let todasCiudades = [tarjeta.ciudadPrincipal];\n        if (tarjeta.otrasCiudades && tarjeta.otrasCiudades.length > 0)\n            todasCiudades = todasCiudades.concat(tarjeta.otrasCiudades);\n\n        let todosLosGrupos = [];\n        for (let clave in tarjeta.convenios) {\n            let g = tarjeta.convenios[clave].grupoConvenio;\n            if (g && !todosLosGrupos.includes(g)) todosLosGrupos.push(g);\n        }\n\n        let tarjetaHTML = `\n            <div id=\"${tarjetaId}\" class=\"tarjeta\"\n                data-institucion=\"${tarjeta.institucion}\"\n                data-pais=\"${tarjeta.pais}\"\n                data-departamento=\"${tarjeta.departamento}\"\n                data-ciudades=\"${todasCiudades.filter(c => c && c.trim() !== '').join(',')}\"\n                data-colaboracion=\"${Array.from(tiposColaboracion).join(',')}\"\n                data-programas-uninavarra=\"${todosLosProgramas.join(',')}\"\n                data-movilidad=\"${tarjeta.tiposMovilidad ? tarjeta.tiposMovilidad.join(',') : ''}\"\n                data-grupo=\"${todosLosGrupos.join(',')}\">\n\n                <div class=\"tarjeta-img\">\n                    <img decoding=\"async\" src=\"${tarjeta.imagenUrl || 'https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2025\/11\/defecto-buscador.jpg'}\"\n                         alt=\"${tarjeta.institucion}\"\n                         onerror=\"this.onerror=null; this.src='https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2025\/11\/defecto-buscador.jpg';\">\n                    <div class=\"tarjeta-overlay\"><\/div>\n                    <h3 class=\"tarjeta-titulo\">${tarjeta.institucion}<\/h3>\n                    ${tarjeta.enlaceInstitucion ?\n                      `<a href=\"${tarjeta.enlaceInstitucion}\" target=\"_blank\" class=\"tarjeta-web-link\" title=\"Visitar sitio web\">\n                        <i class=\"fas fa-globe\"><\/i><\/a>` : ''}\n                <\/div>\n                <div class=\"tarjeta-content\">\n                    <div class=\"tarjeta-datos\">\n                        ${tarjeta.pais ? `<div class=\"uninavarra-card-info-item\"><div class=\"uninavarra-card-info-label\">Pa\u00eds:<\/div><div class=\"uninavarra-card-info-value\">${tarjeta.pais}<\/div><\/div>` : ''}\n                        ${tarjeta.ciudadPrincipal ? `<div class=\"uninavarra-card-info-item\"><div class=\"uninavarra-card-info-label\">Ciudad:<\/div><div class=\"uninavarra-card-info-value\">${tarjeta.ciudadPrincipal}<\/div><\/div>` : ''}\n                        ${tarjeta.otrasCiudades && tarjeta.otrasCiudades.length > 0 ? `<div class=\"uninavarra-card-info-item\"><div class=\"uninavarra-card-info-label\">Otras<br>Ciudades:<\/div><div class=\"uninavarra-card-info-value\">${tarjeta.otrasCiudades.join(', ')}<\/div><\/div>` : ''}\n                        ${tarjeta.anotaciones && tarjeta.anotaciones.trim() !== '' ? `<div class=\"uninavarra-card-info-item\"><div class=\"uninavarra-card-info-label\">Anotaciones:<\/div><div class=\"uninavarra-card-info-value\">${tarjeta.anotaciones}<\/div><\/div>` : ''}\n                    <\/div>\n                <\/div>\n                <div class=\"tarjeta-footer\">\n                    <a href=\"javascript:void(0);\" class=\"conoce-mas-btn\">Conoce m\u00e1s<\/a>\n                <\/div>\n            <\/div>\n        `;\n\n        contenedorTarjetas.append(tarjetaHTML);\n\n        $(`#${tarjetaId}`).click(function() { mostrarPopup(tarjeta); });\n        $(`#${tarjetaId} .tarjeta-web-link`).on('click', function(e) {\n            e.stopPropagation(); e.preventDefault();\n            window.open($(this).attr('href'), '_blank');\n            return false;\n        });\n    });\n\n    $(\"#no-results\").hide();\n    paginaActual = 1;\n    mostrarPagina(1);\n}\n\n\/\/ \u2500\u2500\u2500 Filtrado \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction actualizarFiltros() {\n    if (Object.keys(filtersObject).length === 0) {\n        $(\".tarjeta\").removeClass('oculta');\n        restaurarOpcionesFiltros();\n        verificarResultados();\n        return;\n    }\n\n    $(\".tarjeta\").removeClass('oculta');\n\n    $(\".tarjeta\").each(function() {\n        let mostrar = true;\n\n        for (let key in filtersObject) {\n            if (!filtersObject.hasOwnProperty(key)) continue;\n            let valor = filtersObject[key];\n\n            if (key === 'programa') {\n                let programas = $(this).data('programas-uninavarra');\n                if (!programas || !programas.toString().split(',').includes(valor)) { mostrar = false; break; }\n            } else if (key === 'colaboracion') {\n                let colaboraciones = $(this).data('colaboracion');\n                if (!colaboraciones || !colaboraciones.toString().split(',').includes(valor)) { mostrar = false; break; }\n            } else if (key === 'ciudad') {\n                let ciudades = $(this).data('ciudades');\n                if (!ciudades || !ciudades.toString().split(',').includes(valor)) { mostrar = false; break; }\n            } else if (key === 'movilidad') {\n                let movilidades = $(this).data('movilidad');\n                if (!movilidades || !movilidades.toString().split(',').includes(valor)) { mostrar = false; break; }\n            } else if (key === 'grupo') {\n                let grupos = $(this).data('grupo');\n                if (!grupos || !grupos.toString().split(',').includes(valor)) { mostrar = false; break; }\n            } else {\n                let dataValue = $(this).data(key);\n                if (dataValue !== valor) { mostrar = false; break; }\n            }\n        }\n\n        if (!mostrar) $(this).addClass('oculta');\n    });\n\n    actualizarOpcionesFiltros();\n    verificarResultados();\n}\n\nfunction aplicarBusqueda() {\n    let query = $(\"#search-input\").val().toLowerCase().trim();\n\n    if (query === \"\") { actualizarFiltros(); return; }\n\n    $(\".tarjeta\").removeClass('oculta');\n\n    $(\".tarjeta\").each(function() {\n        let textos = [\n            $(this).data(\"institucion\"), $(this).data(\"pais\"),\n            $(this).data(\"ciudades\"), $(this).data(\"programas-uninavarra\"),\n            $(this).data(\"movilidad\"), $(this).data(\"grupo\"), $(this).data(\"colaboracion\")\n        ].map(v => v ? v.toString().toLowerCase() : '').join(' ');\n\n        if (textos.indexOf(query) === -1) { $(this).addClass('oculta'); return; }\n\n        let cumpleFiltros = true;\n        for (let key in filtersObject) {\n            if (!filtersObject.hasOwnProperty(key)) continue;\n            let valor = filtersObject[key];\n\n            if (['ciudad', 'programa', 'colaboracion', 'movilidad', 'grupo'].includes(key)) {\n                let attrMap = { ciudad: 'ciudades', programa: 'programas-uninavarra', colaboracion: 'colaboracion', movilidad: 'movilidad', grupo: 'grupo' };\n                let datos = $(this).data(attrMap[key]);\n                if (!datos || !datos.toString().split(',').includes(valor)) { cumpleFiltros = false; break; }\n            } else {\n                if ($(this).data(key) !== valor) { cumpleFiltros = false; break; }\n            }\n        }\n\n        if (!cumpleFiltros) $(this).addClass('oculta');\n    });\n\n    actualizarOpcionesFiltros();\n    verificarResultados();\n}\n\nfunction verificarResultados() {\n    const tarjetasVisibles = $(\".tarjeta\").not('.oculta').length;\n    if (tarjetasVisibles === 0) {\n        $(\"#no-results\").show();\n        $(\"#paginacion-container\").hide();\n    } else {\n        $(\"#no-results\").hide();\n        paginaActual = 1;\n        mostrarPagina(1);\n    }\n}\n\n\/\/ \u2500\u2500\u2500 Popup \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction mostrarPopup(tarjeta) {\n    $(\"#popup-title\").text(tarjeta.institucion);\n\n    let conveniosHTML = '';\n\n    if (tarjeta.enlaceInstitucion && tarjeta.enlaceInstitucion.trim() !== '') {\n        conveniosHTML += `\n            <div class=\"popup-website-button-container\">\n                <a href=\"${tarjeta.enlaceInstitucion}\" target=\"_blank\" class=\"popup-website-button\">\n                    <i class=\"fas fa-globe\"><\/i> Visitar sitio web\n                <\/a>\n            <\/div>`;\n    }\n\n    for (let clave in tarjeta.convenios) {\n        let convenio = tarjeta.convenios[clave];\n        conveniosHTML += `\n            <div class=\"popup-section convenio-section\">\n                <h3 class=\"popup-section-title\">${convenio.tipoAcuerdo}<\/h3>\n                <div class=\"popup-info-item\">\n                    <div class=\"popup-info-label\">Grupo de Convenio:<\/div>\n                    <div class=\"popup-info-value\">${convenio.grupoConvenio}<\/div>\n                <\/div>\n                <div class=\"popup-info-item\">\n                    <div class=\"popup-info-label\">Objeto del Acuerdo:<\/div>\n                    <div class=\"popup-info-value\">${convenio.objeto}<\/div>\n                <\/div>\n                ${convenio.observacion && convenio.observacion.trim() !== '' ? `\n                <div class=\"popup-info-item\">\n                    <div class=\"popup-info-label\">Observaci\u00f3n:<\/div>\n                    <div class=\"popup-info-value\">${convenio.observacion}<\/div>\n                <\/div>` : ''}\n            <\/div>`;\n    }\n\n    let programasHTML = '';\n    let hayProgramas = Object.values(tarjeta.convenios).some(c => c.programasUninavarra && c.programasUninavarra.length > 0);\n\n    if (hayProgramas) {\n        programasHTML = `\n            <div id=\"programas-section\" class=\"popup-section\">\n                <h3 class=\"popup-section-title\">Programas Acad\u00e9micos<\/h3>\n                <table class=\"programas-table\">\n                    <thead><tr>\n                        <th>Programas UNINAVARRA<\/th>\n                        <th>Programas Destino<\/th>\n                        <th>Ciudad Sede<\/th>\n                        <th>Modalidad<\/th>\n                    <\/tr><\/thead>\n                    <tbody>`;\n\n        for (let clave in tarjeta.convenios) {\n            let convenio = tarjeta.convenios[clave];\n            convenio.programasUninavarra.forEach((programa, i) => {\n                let programaDestino = convenio.programasDestino[i] || '';\n                let linkProgramaDestino = convenio.linksProgramasDestino[i] || '';\n                let ciudadSede = convenio.ciudadesProgramasDestino[i] || tarjeta.ciudadPrincipal || '';\n                let modalidad = convenio.modalidadesProgramasDestino[i] || '';\n\n                programasHTML += `\n                    <tr>\n                        <td>${programa}<\/td>\n                        <td>${linkProgramaDestino ? `<a href=\"${linkProgramaDestino}\" target=\"_blank\" class=\"programa-link\">${programaDestino}<\/a>` : programaDestino}<\/td>\n                        <td>${ciudadSede}<\/td>\n                        <td>${modalidad}<\/td>\n                    <\/tr>`;\n            });\n        }\n\n        programasHTML += `<\/tbody><\/table><\/div>`;\n    }\n\n    $(\".popup-body\").html(conveniosHTML + programasHTML);\n    $(\"#popup-overlay\").fadeIn(300);\n    $(\"body\").addClass(\"popup-open\");\n}\n\n\/\/ \u2500\u2500\u2500 Exportar Excel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction generarInformeExcel() {\n    const tarjetasParaExportar = $(\".tarjeta\").not('.oculta');\n\n    if (tarjetasParaExportar.length === 0) {\n        alert(\"No hay resultados para generar el informe. Ajusta los filtros.\");\n        return;\n    }\n\n    $(\"#descargar-informe\").prop('disabled', true).html('<i class=\"fas fa-spinner fa-spin\"><\/i>');\n\n    let datosInstituciones = [], datosConvenios = [], datosProgramas = [];\n\n    tarjetasParaExportar.each(function() {\n        const institucion = $(this).data('institucion');\n        const datosInstitucion = webData.filter(item => item.INSTITUCI\u00d3N === institucion);\n\n        if (datosInstitucion.length > 0) {\n            const r = datosInstitucion[0];\n            if (!datosInstituciones.find(i => i.Instituci\u00f3n === institucion)) {\n                datosInstituciones.push({\n                    'Instituci\u00f3n': institucion, 'Pa\u00eds': r[\"PA\u00cdS DE LA INSTITUCI\u00d3N\"] || '',\n                    'Departamento\/Estado': r[\"DEPARTAMENTO\/ESTADO DE LA INSTITUCI\u00d3N\"] || '',\n                    'Ciudad Principal': r[\"CIUDAD PRINCIPAL DE LA INSTITUCI\u00d3N\"] || '',\n                    'Otras Ciudades': r[\"OTRAS CIUDADES DE LA INSTITUCI\u00d3N\"] || '',\n                    'P\u00e1gina Web': r[\"LINK P\u00c1GINA WEB INSTITUCI\u00d3N\"] || '',\n                    'Tipos de Movilidad': r[\"TIPOS MOVILIDAD\"] || '',\n                    'Anotaciones': r[\"ANOTACIONES\"] || ''\n                });\n            }\n\n            datosInstitucion.forEach(registro => {\n                datosConvenios.push({\n                    'Instituci\u00f3n': institucion,\n                    'Tipo de Acuerdo': registro[\"TIPO DE ACUERDO\"] || '',\n                    'Grupo de Convenio': registro[\"GRUPO DE CONVENIO\"] || '',\n                    'Objeto del Acuerdo': registro[\"OBJETO DEL ACUERDO\"] || '',\n                    'Observaci\u00f3n': registro[\"OBSERVACI\u00d3N\"] || '',\n                    'Estado': registro[\"ESTADO\"] || '',\n                    'Fecha de Inicio': registro[\"FECHA DE INICIO\"] || '',\n                    'Fecha de Vencimiento': registro[\"FECHA DE VENCIMIENTO\"] || '',\n                    'Vigencia Actual (d\u00edas)': registro[\"VIGENCIA ACTUAL (d\u00edas)\"] || '',\n                    'Docencia': registro[\"Docencia\"] || '',\n                    'Investigaci\u00f3n': registro[\"Investigaci\u00f3n\"] || '',\n                    'Proyecci\u00f3n Social': registro[\"Proyecci\u00f3n Social\"] || '',\n                    'Extensi\u00f3n': registro[\"Extensi\u00f3n\"] || '',\n                    'Administrativa': registro[\"Administrativa\"] || '',\n                    'Pr\u00e1cticas Estudiantiles': registro[\"Pr\u00e1cticas estudiantiles\"] || '',\n                    'Otras Colaboraciones': registro[\"Otras\"] || '',\n                    'Tipos de Movilidad': registro[\"TIPOS MOVILIDAD\"] || ''\n                });\n\n                if (registro[\"PROGRAMAS ACAD\u00c9MICOS AFINES UNINAVARRA\"]) {\n                    let pU = registro[\"PROGRAMAS ACAD\u00c9MICOS AFINES UNINAVARRA\"].split(',');\n                    let pD = registro[\"PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] ? registro[\"PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"].split(',') : [];\n                    let cD = registro[\"CIUDAD SEDE PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] ? registro[\"CIUDAD SEDE PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"].split(',') : [];\n                    let mD = registro[\"MODALIDAD PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] ? registro[\"MODALIDAD PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"].split(',') : [];\n                    let lD = registro[\"LINK PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] || '';\n\n                    pU.forEach((prog, i) => {\n                        datosProgramas.push({\n                            'Instituci\u00f3n': institucion,\n                            'Tipo de Acuerdo': registro[\"TIPO DE ACUERDO\"] || '',\n                            'Programa UNINAVARRA': prog.trim(),\n                            'Programa Destino': (pD[i] || '').trim(),\n                            'Ciudad Sede Destino': (cD[i] || '').trim(),\n                            'Modalidad Destino': (mD[i] || '').trim(),\n                            'Link Programa Destino': lD\n                        });\n                    });\n                }\n            });\n        }\n    });\n\n    const wb = XLSX.utils.book_new();\n    XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(datosInstituciones), \"Instituciones\");\n    XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(datosConvenios), \"Convenios\");\n    if (datosProgramas.length > 0)\n        XLSX.utils.book_append_sheet(wb, XLSX.utils.json_to_sheet(datosProgramas), \"Programas\");\n\n    const fecha = new Date().toISOString().split('T')[0];\n    XLSX.writeFile(wb, `Informe_Convenios_${fecha}.xlsx`);\n\n    setTimeout(() => {\n        $(\"#descargar-informe\").prop('disabled', false).html('<i class=\"fas fa-file-excel\"><\/i>');\n        alert(`Informe Excel generado exitosamente con ${tarjetasParaExportar.length} instituciones.`);\n    }, 1000);\n}\n<\/script>\n\t\t<\/div>\n\t<\/div>\n\n\t\t<\/div> \n\t<\/div><\/div><\/div><\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"Cargando informaci\u00f3n de convenios... Programa Acad\u00e9mico UNINAVARRA (en actualizaci\u00f3n) Todos los programas Pa\u00eds Todos los pa\u00edses Ciudad Todas las ciudades Tipo de Colaboraci\u00f3n Todos los tipos Tipo de Movilidad Todos [...]","protected":false},"author":13,"featured_media":68058,"parent":89329,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-94970","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Buscador de convenios - Uninavarra<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/uninavarra.edu.co\/en\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Buscador de convenios - Uninavarra\" \/>\n<meta property=\"og:url\" content=\"https:\/\/uninavarra.edu.co\/en\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/\" \/>\n<meta property=\"og:site_name\" content=\"Uninavarra\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/UninavarraEduca\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-06T14:53:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2023\/12\/banner-generico.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2480\" \/>\n\t<meta property=\"og:image:height\" content=\"276\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@uninavarraeduca\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"29 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/\",\"url\":\"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/\",\"name\":\"Buscador de convenios - Uninavarra\",\"isPartOf\":{\"@id\":\"https:\/\/uninavarra.edu.co\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2023\/12\/banner-generico.png\",\"datePublished\":\"2025-10-21T14:46:35+00:00\",\"dateModified\":\"2026-03-06T14:53:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/#primaryimage\",\"url\":\"https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2023\/12\/banner-generico.png\",\"contentUrl\":\"https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2023\/12\/banner-generico.png\",\"width\":2480,\"height\":276,\"caption\":\"banner generico\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/uninavarra.edu.co\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Internacionalizaci\u00f3n\",\"item\":\"https:\/\/uninavarra.edu.co\/internacionalizacion\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Convenios de Cooperaci\u00f3n Nacional e Internacional\",\"item\":\"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Buscador de convenios\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/uninavarra.edu.co\/#website\",\"url\":\"https:\/\/uninavarra.edu.co\/\",\"name\":\"UNINAVARRA\",\"description\":\"Haz realidad tu deseo de aprender\",\"publisher\":{\"@id\":\"https:\/\/uninavarra.edu.co\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/uninavarra.edu.co\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/uninavarra.edu.co\/#organization\",\"name\":\"Fundaci\u00f3n Universitaria Navarra - UNINAVARRA\",\"url\":\"https:\/\/uninavarra.edu.co\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/uninavarra.edu.co\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2024\/06\/Escudo-uninavarra-Solo.png\",\"contentUrl\":\"https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2024\/06\/Escudo-uninavarra-Solo.png\",\"width\":1500,\"height\":1401,\"caption\":\"Fundaci\u00f3n Universitaria Navarra - UNINAVARRA\"},\"image\":{\"@id\":\"https:\/\/uninavarra.edu.co\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/UninavarraEduca\",\"https:\/\/x.com\/uninavarraeduca\",\"https:\/\/www.instagram.com\/uninavarra\/?hl=es\",\"https:\/\/www.linkedin.com\/in\/fundacin-universitaria-navarra-uninavarra-b41225222\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Buscador de convenios - Uninavarra","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/uninavarra.edu.co\/en\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/","og_locale":"en_US","og_type":"article","og_title":"Buscador de convenios - Uninavarra","og_url":"https:\/\/uninavarra.edu.co\/en\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/","og_site_name":"Uninavarra","article_publisher":"https:\/\/www.facebook.com\/UninavarraEduca","article_modified_time":"2026-03-06T14:53:07+00:00","og_image":[{"width":2480,"height":276,"url":"https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2023\/12\/banner-generico.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@uninavarraeduca","twitter_misc":{"Est. reading time":"29 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/","url":"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/","name":"Buscador de convenios - Uninavarra","isPartOf":{"@id":"https:\/\/uninavarra.edu.co\/#website"},"primaryImageOfPage":{"@id":"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/#primaryimage"},"image":{"@id":"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/#primaryimage"},"thumbnailUrl":"https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2023\/12\/banner-generico.png","datePublished":"2025-10-21T14:46:35+00:00","dateModified":"2026-03-06T14:53:07+00:00","breadcrumb":{"@id":"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/#primaryimage","url":"https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2023\/12\/banner-generico.png","contentUrl":"https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2023\/12\/banner-generico.png","width":2480,"height":276,"caption":"banner generico"},{"@type":"BreadcrumbList","@id":"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/buscador-de-convenios\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/uninavarra.edu.co\/"},{"@type":"ListItem","position":2,"name":"Internacionalizaci\u00f3n","item":"https:\/\/uninavarra.edu.co\/internacionalizacion\/"},{"@type":"ListItem","position":3,"name":"Convenios de Cooperaci\u00f3n Nacional e Internacional","item":"https:\/\/uninavarra.edu.co\/internacionalizacion\/convenios-cooperacion-nacional-internacional\/"},{"@type":"ListItem","position":4,"name":"Buscador de convenios"}]},{"@type":"WebSite","@id":"https:\/\/uninavarra.edu.co\/#website","url":"https:\/\/uninavarra.edu.co\/","name":"UNINAVARRA","description":"Make your desire to learn a reality","publisher":{"@id":"https:\/\/uninavarra.edu.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/uninavarra.edu.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/uninavarra.edu.co\/#organization","name":"Navarre University Foundation - UNINAVARRA","url":"https:\/\/uninavarra.edu.co\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/uninavarra.edu.co\/#\/schema\/logo\/image\/","url":"https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2024\/06\/Escudo-uninavarra-Solo.png","contentUrl":"https:\/\/uninavarra.edu.co\/wp-content\/uploads\/2024\/06\/Escudo-uninavarra-Solo.png","width":1500,"height":1401,"caption":"Fundaci\u00f3n Universitaria Navarra - UNINAVARRA"},"image":{"@id":"https:\/\/uninavarra.edu.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/UninavarraEduca","https:\/\/x.com\/uninavarraeduca","https:\/\/www.instagram.com\/uninavarra\/?hl=es","https:\/\/www.linkedin.com\/in\/fundacin-universitaria-navarra-uninavarra-b41225222\/"]}]}},"_links":{"self":[{"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/pages\/94970","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/comments?post=94970"}],"version-history":[{"count":0,"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/pages\/94970\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/pages\/89329"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/media\/68058"}],"wp:attachment":[{"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/media?parent=94970"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/categories?post=94970"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/tags?post=94970"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}