{"id":93266,"date":"2025-08-04T11:44:33","date_gmt":"2025-08-04T16:44:33","guid":{"rendered":"https:\/\/uninavarra.edu.co\/?page_id=93266"},"modified":"2025-08-04T11:44:33","modified_gmt":"2025-08-04T16:44:33","slug":"desarrollo-convenios-nacionales","status":"publish","type":"page","link":"https:\/\/uninavarra.edu.co\/en\/desarrollo-convenios-nacionales\/","title":{"rendered":"Development of National Agreements"},"content":{"rendered":"<div class=\"wpb-content-wrapper\"><div data-vc-full-width=\"true\" data-vc-full-width-init=\"false\" data-vc-stretch-content=\"true\" class=\"wpb-container vc_row-no-padding\"><div class=\"container-full\"><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        <!-- Estado de carga -->\n        <div id=\"loading\" class=\"loading\">\n            <div class=\"loading-spinner\"><\/div>\n            <p>Cargando informaci\u00f3n de convenios nacionales...<\/p>\n        <\/div>\n\n        <!-- Filtros -->\n        <div id=\"filtros-container\" class=\"filtros-container\" style=\"display:none;\">\n            <!-- Barra de b\u00fasqueda -->\n            <div class=\"search-container\">\n                <form id=\"search-form\">\n                    <input type=\"text\" id=\"search-input\" placeholder=\"Buscar convenios nacionales...\">\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-departamento\">Departamento<\/label>\n                    <select id=\"filter-departamento\" class=\"form-control filter\" data-filter=\"departamento\">\n                        <option value=\"\">Todos los departamentos<\/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 class=\"form-group\">\n                    <label for=\"filter-ciudad-sede\">Ciudad Sede Programa<\/label>\n                    <select id=\"filter-ciudad-sede\" class=\"form-control filter\" data-filter=\"ciudad-sede\">\n                        <option value=\"\">Todas las ciudades sede<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n            <div class=\"form-row\">\n                <div class=\"form-group\">\n                    <label for=\"filter-programa\">Programa Acad\u00e9mico UNINAVARRA<\/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-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                        <option value=\"Docencia\">Docencia<\/option>\n                        <option value=\"Investigaci\u00f3n\">Investigaci\u00f3n<\/option>\n                        <option value=\"Proyecci\u00f3n Social\">Proyecci\u00f3n Social<\/option>\n                        <option value=\"Extensi\u00f3n\">Extensi\u00f3n<\/option>\n                        <option value=\"Administrativa\">Administrativa<\/option>\n                        <option value=\"Pr\u00e1cticas estudiantiles\">Pr\u00e1cticas estudiantiles<\/option>\n                        <option value=\"Intercambio estudiantil\">Intercambio estudiantil<\/option>\n                        <option value=\"Otras\">Otras<\/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        <\/div>\n\n        <!-- Contenedor de tarjetas -->\n        <div id=\"tarjetas-container\" class=\"tarjetas-grid\"><\/div>\n\n        <!-- Mensaje de no resultados -->\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        <!-- Popup detalle -->\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\">\n                    <!-- El contenido se insertar\u00e1 din\u00e1micamente desde JavaScript -->\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\t\t<\/div>\n\t<\/div>\n\n\t\t<\/div> \n\t<\/div><\/div><\/div><\/div><div class=\"vc_row-full-width\"><\/div><div id=\"configuracion\" 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>\n\/\/ Variables globales\nconst API_KEY = 'AIzaSyBnk4I7IbLq1GV4wVuIypF6lAXijdVknSw';\nconst SPREADSHEET_ID = '1yHt6UCf9JSIhJ3uStlQlWeApkRZeAqC42FllDOYz3zk';\nlet webData = [];\nlet filtersObject = {};\n\n\/\/ Al cargar el documento\n$(document).ready(function() {\n    cargarDatos();\n    \n    \/\/ Eventos para filtros\n    $(\".filter\").on(\"change\", function() {\n        let filterName = $(this).data(\"filter\");\n        let filterVal = $(this).val();\n        \n        if (filterVal == \"\") {\n            delete filtersObject[filterName];\n        } else {\n            filtersObject[filterName] = filterVal;\n        }\n        \n        actualizarFiltros();\n    });\n    \n    \/\/ Evento para b\u00fasqueda\n    $(\"#search-form\").submit(function(e) {\n        e.preventDefault();\n        let query = $(\"#search-input\").val().toLowerCase();\n        \n        if (query == \"\") {\n            \/\/ Si la b\u00fasqueda est\u00e1 vac\u00eda, volver a mostrar todo seg\u00fan los filtros actuales\n            actualizarFiltros();\n            return;\n        }\n        \n        $(\".tarjeta\").hide();\n        $(\".tarjeta\").each(function() {\n            let institucion = $(this).data(\"institucion\").toLowerCase();\n            let pais = $(this).data(\"pais\").toLowerCase();\n            let departamento = $(this).data(\"departamento\").toLowerCase();\n            let ciudades = $(this).data(\"ciudades\") ? $(this).data(\"ciudades\").toLowerCase() : \"\";\n            let tipoAcuerdo = $(this).data(\"tipo-acuerdo\") ? $(this).data(\"tipo-acuerdo\").toLowerCase() : \"\";\n            let programasUninavarra = $(this).data(\"programas-uninavarra\") ? $(this).data(\"programas-uninavarra\").toLowerCase() : \"\";\n            let programasDestino = $(this).data(\"programas-destino\") ? $(this).data(\"programas-destino\").toLowerCase() : \"\";\n            let tiposMovilidad = $(this).data(\"movilidad\") ? $(this).data(\"movilidad\").toLowerCase() : \"\";\n            let gruposConvenio = $(this).data(\"grupo\") ? $(this).data(\"grupo\").toLowerCase() : \"\";\n            let ciudadesSede = $(this).data(\"ciudades-sede\") ? $(this).data(\"ciudades-sede\").toLowerCase() : \"\"; \/\/ NUEVO\n            \n            \/\/ No incluimos \"NOTAS INTERNAS\" en la b\u00fasqueda\n            \n            if (institucion.indexOf(query) > -1 || \n                pais.indexOf(query) > -1 || \n                departamento.indexOf(query) > -1 || \n                ciudades.indexOf(query) > -1 ||\n                tipoAcuerdo.indexOf(query) > -1 ||\n                programasUninavarra.indexOf(query) > -1 ||\n                programasDestino.indexOf(query) > -1 ||\n                tiposMovilidad.indexOf(query) > -1 ||\n                gruposConvenio.indexOf(query) > -1 ||\n                ciudadesSede.indexOf(query) > -1) { \/\/ NUEVO\n                \n                \/\/ Verificar tambi\u00e9n los filtros seleccionados\n                let mostrar = true;\n                for (let key in filtersObject) {\n                    if (filtersObject.hasOwnProperty(key)) {\n                        if (key === 'ciudad') {\n                            \/\/ Caso especial para ciudades (puede ser array)\n                            let ciudadesArray = $(this).data('ciudades') ? $(this).data('ciudades').split(',') : [];\n                            if (!ciudadesArray.includes(filtersObject[key])) {\n                                mostrar = false;\n                                break;\n                            }\n                        }\n                        else if (key === 'programa') {\n                            \/\/ Caso especial para programas (puede ser array)\n                            let programas = $(this).data('programas-uninavarra');\n                            if (!programas || !programas.split(',').includes(filtersObject[key])) {\n                                mostrar = false;\n                                break;\n                            }\n                        }\n                        else if (key === 'colaboracion') {\n                            \/\/ Caso especial para tipos de colaboraci\u00f3n (puede ser array)\n                            let colaboraciones = $(this).data('colaboracion');\n                            if (!colaboraciones || !colaboraciones.split(',').includes(filtersObject[key])) {\n                                mostrar = false;\n                                break;\n                            }\n                        }\n                        else if (key === 'movilidad') {\n                            \/\/ Caso especial para tipos de movilidad (puede ser array)\n                            let movilidades = $(this).data('movilidad');\n                            if (!movilidades || !movilidades.split(',').includes(filtersObject[key])) {\n                                mostrar = false;\n                                break;\n                            }\n                        }\n                        else if (key === 'grupo') {\n                            \/\/ Caso especial para grupos de convenio (puede ser array)\n                            let grupos = $(this).data('grupo');\n                            if (!grupos || !grupos.split(',').includes(filtersObject[key])) {\n                                mostrar = false;\n                                break;\n                            }\n                        }\n                        else if (key === 'ciudad-sede') {\n                            \/\/ NUEVO: Caso especial para ciudades sede\n                            let ciudadesSedeArray = $(this).data('ciudades-sede') ? $(this).data('ciudades-sede').split(',') : [];\n                            if (!ciudadesSedeArray.includes(filtersObject[key])) {\n                                mostrar = false;\n                                break;\n                            }\n                        }\n                        else {\n                            \/\/ Caso general\n                            let dataAttr = $(this).data(key);\n                            if (dataAttr === undefined || dataAttr === null || \n                                dataAttr !== filtersObject[key]) {\n                                mostrar = false;\n                                break;\n                            }\n                        }\n                    }\n                }\n                \n                if (mostrar) {\n                    $(this).show();\n                }\n            }\n        });\n        \n        verificarResultados();\n    });\n    \n    \/\/ Cerrar popup\n    $(\"#popup-close\").click(function() {\n        $(\"#popup-overlay\").fadeOut(300);\n        $(\"body\").removeClass(\"popup-open\");\n    });\n    \n    \/\/ Cerrar popup al hacer clic fuera\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    \/\/ Cerrar popup con ESC\n    $(document).keydown(function(e) {\n        if (e.keyCode === 27) { \/\/ ESC\n            $(\"#popup-overlay\").fadeOut(300);\n            $(\"body\").removeClass(\"popup-open\");\n        }\n    });\n\n\n\n        $(\"#limpiar-filtros\").click(function() {\n        \/\/ Resetear todos los selects de filtros\n        $(\".filter\").val(\"\");\n        \n        \/\/ Limpiar el objeto de filtros\n        filtersObject = {};\n        \n        \/\/ Limpiar la b\u00fasqueda\n        $(\"#search-input\").val(\"\");\n        \n        \/\/ Mostrar todas las tarjetas\n        $(\".tarjeta\").show();\n        \n        \/\/ Verificar resultados\n        verificarResultados();\n        \n        \/\/ Mensaje opcional de confirmaci\u00f3n\n        console.log(\"Filtros limpiados\");\n    });\n\n    \/\/ Evento para descargar informe\n    $(\"#descargar-informe\").click(function() {\n       generarInformeExcel();\n     });\n});\n\n\n\/\/ Funci\u00f3n para cargar datos de Google Sheets\nfunction cargarDatos() {\n    \/\/ Cambiar el rango a A:AZ\n    getSheetData(SPREADSHEET_ID, 'WEB!A:AZ', API_KEY)\n        .then(response => {\n            webData = procesarDatosWeb(response);\n            \n            \/\/ Generar tarjetas agrupadas por instituci\u00f3n y tipo de acuerdo\n            generarTarjetasAgrupadas();\n            \n            \/\/ Ocultamos el mensaje de carga y mostramos los filtros\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\n\/\/ Funci\u00f3n para obtener datos de una hoja de Google Sheets\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\n\/\/ Funci\u00f3n para procesar los datos de la hoja WEB\nfunction procesarDatosWeb(infoJson) {\n    let entries = infoJson.values;\n    if (!entries || entries.length === 0) {\n        return [];\n    }\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        \n        for (let c = 0; c < fila.length; c++) {\n            let celda = fila[c];\n            if (c < campos.length) {\n                obj[campos[c]] = celda || ''; \/\/ Asegurar que no sea undefined\n            }\n        }\n        \n        \/\/ Solo a\u00f1adimos filas con datos relevantes\n        if (obj.INSTITUCI\u00d3N) {\n            datos.push(obj);\n        }\n    }\n    \n    return datos;\n}\n\n\/\/ Funci\u00f3n para generar tarjetas agrupadas por instituci\u00f3n\nfunction generarTarjetasAgrupadas() {\n    let tarjetasAgrupadas = {};\n    let conveniosPorInstitucion = {};\n    let paisesSet = new Set();\n    let departamentosSet = new Set();\n    let ciudadesSet = new Set();\n    let programasSet = new Set();\n    let tiposMovilidadSet = new Set(); \/\/ Nuevo conjunto para tipos de movilidad\n    let gruposConvenioSet = new Set(); \n\nlet ciudadesSedeSet = new Set(); \/\/ Nuevo conjunto para ciudades sede de programas\n    \n    \/\/ Agrupar filas por instituci\u00f3n primero\n    webData.forEach(fila => {\n        \/\/ Verificar si el estado es \"vigente\" - si no lo es, saltar esta fila\n        if (fila.ESTADO && fila.ESTADO.toLowerCase() !== 'vigente') {\n            return; \/\/ Saltar a la siguiente iteraci\u00f3n\n        }\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        \/\/ Agregar a los conjuntos para filtros - USANDO LOS NUEVOS NOMBRES DE CAMPOS\n        if (fila[\"PA\u00cdS DE LA INSTITUCI\u00d3N\"]) paisesSet.add(fila[\"PA\u00cdS DE LA INSTITUCI\u00d3N\"]);\n        if (fila[\"DEPARTAMENTO\/ESTADO DE LA INSTITUCI\u00d3N\"]) departamentosSet.add(fila[\"DEPARTAMENTO\/ESTADO DE LA INSTITUCI\u00d3N\"]);\n        \n        \/\/ Manejar ciudades - USANDO LOS NUEVOS NOMBRES DE CAMPOS\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        \/\/ Agregar ciudades al conjunto para filtros\n        if (ciudadPrincipal) ciudadesSet.add(ciudadPrincipal);\n        otrasCiudades.forEach(ciudad => {\n            if (ciudad) ciudadesSet.add(ciudad);\n        });\n\n\/\/ Manejar ciudades sede de programas destino\nif (fila[\"CIUDAD SEDE PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"]) {\n    let ciudadesSede = fila[\"CIUDAD SEDE PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"].split(',').map(c => c.trim());\n    ciudadesSede.forEach(ciudad => {\n        if (ciudad) ciudadesSedeSet.add(ciudad);\n    });\n}\n        \n        \/\/ Manejar programas Uninavarra\n        if (fila[\"PROGRAMAS ACAD\u00c9MICOS AFINES UNINAVARRA\"]) {\n            let programas = fila[\"PROGRAMAS ACAD\u00c9MICOS AFINES UNINAVARRA\"].split(',').map(p => p.trim());\n            programas.forEach(programa => {\n                if (programa) programasSet.add(programa);\n            });\n        }\n        \n        \/\/ Manejar tipos de movilidad\n        if (fila[\"TIPOS MOVILIDAD\"]) {\n            let tiposMovilidad = fila[\"TIPOS MOVILIDAD\"].split(',').map(t => t.trim());\n            tiposMovilidad.forEach(tipo => {\n                if (tipo) tiposMovilidadSet.add(tipo);\n            });\n        }\n\n        \/\/ Manejar grupos de convenio\n        if (fila[\"GRUPO DE CONVENIO\"]) {\n            gruposConvenioSet.add(fila[\"GRUPO DE CONVENIO\"]);\n        }\n        \n        \/\/ Si no existe esta instituci\u00f3n, inicializar objeto\n        if (!tarjetasAgrupadas[institucion]) {\n            tarjetasAgrupadas[institucion] = {\n                institucion: institucion,\n                pais: fila[\"PA\u00cdS DE LA INSTITUCI\u00d3N\"] || '',\n                departamento: fila[\"DEPARTAMENTO\/ESTADO DE LA INSTITUCI\u00d3N\"] || '',\n                ciudadPrincipal: ciudadPrincipal,\n                otrasCiudades: 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 !== '') : [], \/\/ A\u00f1adir tipos de movilidad\n                anotaciones: fila[\"ANOTACIONES\"] || '', \/\/ A\u00f1adir campo de anotaciones\n                \/\/ Lista de convenios de esta instituci\u00f3n\n                convenios: {}\n            };\n            \n            \/\/ Inicializar la estructura para guardar los convenios\n            conveniosPorInstitucion[institucion] = {};\n        } else {\n            \/\/ Actualizar ciudades si hay nuevas\n            \/\/ La ciudad principal se mantiene\n            otrasCiudades.forEach(ciudad => {\n                if (ciudad && !tarjetasAgrupadas[institucion].otrasCiudades.includes(ciudad)) {\n                    tarjetasAgrupadas[institucion].otrasCiudades.push(ciudad);\n                }\n            });\n            \n            \/\/ Actualizar tipos de movilidad si hay nuevos\n            if (fila[\"TIPOS MOVILIDAD\"]) {\n                let nuevosMovilidad = fila[\"TIPOS MOVILIDAD\"].split(',').map(t => t.trim()).filter(t => t !== '');\n                nuevosMovilidad.forEach(tipo => {\n                    if (tipo && !tarjetasAgrupadas[institucion].tiposMovilidad.includes(tipo)) {\n                        tarjetasAgrupadas[institucion].tiposMovilidad.push(tipo);\n                    }\n                });\n            }\n        }\n        \n        \/\/ Si no existe este convenio para esta instituci\u00f3n, inicializarlo\n        if (!conveniosPorInstitucion[institucion][claveConvenio]) {\n            conveniosPorInstitucion[institucion][claveConvenio] = {\n                tipoAcuerdo: tipoAcuerdo,\n                grupoConvenio: 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 !== '') : [], \/\/ A\u00f1adir tipos de movilidad\n                \/\/ Tipos de colaboraci\u00f3n\n                docencia: fila.Docencia || '',\n                investigacion: fila.Investigaci\u00f3n || '',\n                proyeccionSocial: fila[\"Proyecci\u00f3n Social\"] || '',\n                extension: fila.Extensi\u00f3n || '',\n                administrativa: fila.Administrativa || '',\n                practicasEstudiantiles: fila[\"Pr\u00e1cticas estudiantiles\"] || '',\n                intercambioEstudiantil: fila[\"Intercambio estudiantil\"] || '',\n                otras: fila.Otras || '',\n                \/\/ Estado\n                estado: fila.ESTADO || '',\n                \/\/ Fechas\n                fechaInicio: fila[\"FECHA DE INICIO\"] || '',\n                fechaModificacion: fila[\"FECHA DE ADICI\u00d3N \/ MODIFICACI\u00d3N\"] || '',\n                fechaVencimiento: fila[\"FECHA DE VENCIMIENTO\"] || '',\n                vigenciaActual: fila[\"VIGENCIA ACTUAL (d\u00edas)\"] || '',\n                \/\/ Programas\n                programasUninavarra: [],\n                programasDestino: [],\n                linksProgramasDestino: [],\n                ciudadesProgramasDestino: [], \/\/ NUEVO: Array para las ciudades sede de los programas destino\n                modalidadesProgramasDestino: [] \n            };\n        } else {\n            \/\/ Actualizar tipos de movilidad si hay nuevos\n            if (fila[\"TIPOS MOVILIDAD\"]) {\n                let nuevosMovilidad = fila[\"TIPOS MOVILIDAD\"].split(',').map(t => t.trim()).filter(t => t !== '');\n                nuevosMovilidad.forEach(tipo => {\n                    if (tipo && !conveniosPorInstitucion[institucion][claveConvenio].tiposMovilidad.includes(tipo)) {\n                        conveniosPorInstitucion[institucion][claveConvenio].tiposMovilidad.push(tipo);\n                    }\n                });\n            }\n        }\n        \n        \/\/ Agregar programas de esta fila a este convenio\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\"] ? \n                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\"] ? \n                fila[\"CIUDAD SEDE PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"].split(',').map(c => c.trim()) : [];\n            let modalidadesProgramasDestino = fila[\"MODALIDAD PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] ? \n                fila[\"MODALIDAD PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"].split(',').map(m => m.trim()) : [];\n            \n            \/\/ Procesar cada programa de UNINAVARRA - PERMITIR DUPLICADOS CON DIFERENTES CIUDADES\n            programasUninavarra.forEach((programa, index) => {\n                if (programa) {\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                    \/\/ Crear una clave \u00fanica para verificar si esta combinaci\u00f3n ya existe\n                    let claveUnica = `${programa}|${programaDestino}|${ciudadSedeDestino}|${modalidadDestino}`;\n                    \n                    \/\/ Verificar si esta combinaci\u00f3n espec\u00edfica ya existe\n                    let yaExiste = false;\n                    for (let i = 0; i < conveniosPorInstitucion[institucion][claveConvenio].programasUninavarra.length; i++) {\n                        let programaExistente = conveniosPorInstitucion[institucion][claveConvenio].programasUninavarra[i];\n                        let destinoExistente = conveniosPorInstitucion[institucion][claveConvenio].programasDestino[i];\n                        let ciudadExistente = conveniosPorInstitucion[institucion][claveConvenio].ciudadesProgramasDestino[i];\n                        let modalidadExistente = conveniosPorInstitucion[institucion][claveConvenio].modalidadesProgramasDestino[i];\n                        \n                        if (programaExistente === programa && destinoExistente === programaDestino && \n                            ciudadExistente === ciudadSedeDestino && modalidadExistente === modalidadDestino) {\n                            yaExiste = true;\n                            break;\n                        }\n                    }\n                    \n                    \/\/ Solo agregar si esta combinaci\u00f3n espec\u00edfica no existe\n                    if (!yaExiste) {\n                        conveniosPorInstitucion[institucion][claveConvenio].programasUninavarra.push(programa);\n                        conveniosPorInstitucion[institucion][claveConvenio].programasDestino.push(programaDestino);\n                        conveniosPorInstitucion[institucion][claveConvenio].linksProgramasDestino.push(linkProgramas);\n                        conveniosPorInstitucion[institucion][claveConvenio].ciudadesProgramasDestino.push(ciudadSedeDestino);\n                        conveniosPorInstitucion[institucion][claveConvenio].modalidadesProgramasDestino.push(modalidadDestino);\n                    }\n                }\n            });\n        }\n    });\n    \n    \/\/ Agregar la lista de convenios a cada tarjeta\n    for (let institucion in tarjetasAgrupadas) {\n        tarjetasAgrupadas[institucion].convenios = conveniosPorInstitucion[institucion];\n    }\n    \n    \/\/ Llenar los filtros\n    llenarFiltros({\n        paises: Array.from(paisesSet).sort(),\n        departamentos: Array.from(departamentosSet).sort(),\n        ciudades: Array.from(ciudadesSet).sort(),\n        programas: Array.from(programasSet).sort(),\n        tiposMovilidad: Array.from(tiposMovilidadSet).sort(), \/\/ Agregar tipos de movilidad a los filtros\n        gruposConvenio: Array.from(gruposConvenioSet).sort(),\nciudadesSede: Array.from(ciudadesSedeSet).sort() \/\/ NUEVA L\u00cdNEA\n    });\n    \n    \/\/ Convertir el objeto agrupado a un array de tarjetas\n    let tarjetasArray = Object.values(tarjetasAgrupadas);\n    \n    \/\/ Generar las tarjetas HTML\n    generarTarjetasHTML(tarjetasArray);\n}\n\n\/\/ Funci\u00f3n para llenar los filtros con opciones\nfunction llenarFiltros(opciones) {\n    \/\/ Llenar filtro de pa\u00edses\n    opciones.paises.forEach(pais => {\n        $(\"#filter-pais\").append(`<option value=\"${pais}\">${pais}<\/option>`);\n    });\n    \n    \/\/ Llenar filtro de departamentos\n    opciones.departamentos.forEach(depto => {\n        $(\"#filter-departamento\").append(`<option value=\"${depto}\">${depto}<\/option>`);\n    });\n    \n    \/\/ Llenar filtro de ciudades\n    opciones.ciudades.forEach(ciudad => {\n        $(\"#filter-ciudad\").append(`<option value=\"${ciudad}\">${ciudad}<\/option>`);\n    });\n    \n    \/\/ Llenar filtro de programas\n    opciones.programas.forEach(programa => {\n        $(\"#filter-programa\").append(`<option value=\"${programa}\">${programa}<\/option>`);\n    });\n    \n    \/\/ Llenar filtro de tipos de movilidad\n    opciones.tiposMovilidad.forEach(tipo => {\n        $(\"#filter-movilidad\").append(`<option value=\"${tipo}\">${tipo}<\/option>`);\n    });\n\n    \/\/ Llenar filtro de grupos de convenio\n    opciones.gruposConvenio.forEach(grupo => {\n        $(\"#filter-grupo\").append(`<option value=\"${grupo}\">${grupo}<\/option>`);\n    });\n\nopciones.ciudadesSede.forEach(ciudad => {\n    $(\"#filter-ciudad-sede\").append(`<option value=\"${ciudad}\">${ciudad}<\/option>`);\n});\n}\n\n\/\/ Funci\u00f3n para generar las tarjetas HTML\nfunction generarTarjetasHTML(tarjetasData) {\n    let contenedorTarjetas = $(\"#tarjetas-container\");\n    contenedorTarjetas.empty();\n    \n    if (tarjetasData.length === 0) {\n        $(\"#no-results\").show();\n        return;\n    }\n    \n    tarjetasData.forEach((tarjeta, index) => {\n        \/\/ Crear un ID \u00fanico para la tarjeta\n        let tarjetaId = `tarjeta-${index}`;\n        \n        \/\/ Recopilar todos los programas de todos los convenios de esta instituci\u00f3n\n        let todosLosProgramas = [];\n        for (let claveConvenio in tarjeta.convenios) {\n            tarjeta.convenios[claveConvenio].programasUninavarra.forEach(programa => {\n                if (!todosLosProgramas.includes(programa)) {\n                    todosLosProgramas.push(programa);\n                }\n            });\n        }\n        \n        \/\/ Recopilar todos los tipos de colaboraci\u00f3n de todos los convenios\n        let tiposColaboracion = new Set();\n        for (let claveConvenio in tarjeta.convenios) {\n            let convenio = tarjeta.convenios[claveConvenio];\n            if (convenio.docencia) tiposColaboracion.add(\"Docencia\");\n            if (convenio.investigacion) tiposColaboracion.add(\"Investigaci\u00f3n\");\n            if (convenio.proyeccionSocial) tiposColaboracion.add(\"Proyecci\u00f3n Social\");\n            if (convenio.extension) tiposColaboracion.add(\"Extensi\u00f3n\");\n            if (convenio.administrativa) tiposColaboracion.add(\"Administrativa\");\n            if (convenio.practicasEstudiantiles) tiposColaboracion.add(\"Pr\u00e1cticas estudiantiles\");\n            if (convenio.intercambioEstudiantil) tiposColaboracion.add(\"Intercambio estudiantil\");\n            if (convenio.otras) tiposColaboracion.add(\"Otras\");\n        }\n        \n        \/\/ Convertir Set a Array\n        let tiposColaboracionArray = Array.from(tiposColaboracion);\n        \n        \/\/ Para mantener compatibilidad con el resto del c\u00f3digo, creamos una lista combinada de ciudades\n        let todasCiudades = [tarjeta.ciudadPrincipal];\n        if (tarjeta.otrasCiudades && tarjeta.otrasCiudades.length > 0) {\n            todasCiudades = todasCiudades.concat(tarjeta.otrasCiudades);\n        }\n\n        \/\/ Recopilar todos los grupos de convenio de todos los convenios de esta instituci\u00f3n\n        let todosLosGrupos = [];\n        for (let claveConvenio in tarjeta.convenios) {\n            let grupo = tarjeta.convenios[claveConvenio].grupoConvenio;\n            if (grupo && !todosLosGrupos.includes(grupo)) {\n                todosLosGrupos.push(grupo);\n            }\n        }\n        \n        \/\/ *** NUEVO: Recopilar todas las ciudades sede de programas destino ***\n        let todasCiudadesSede = [];\n        for (let claveConvenio in tarjeta.convenios) {\n            let convenio = tarjeta.convenios[claveConvenio];\n            if (convenio.ciudadesProgramasDestino) {\n                convenio.ciudadesProgramasDestino.forEach(ciudad => {\n                    if (ciudad && ciudad.trim() !== '' && !todasCiudadesSede.includes(ciudad)) {\n                        todasCiudadesSede.push(ciudad);\n                    }\n                });\n            }\n        }\n        \n        \/\/ Crear el HTML de la tarjeta con el icono web - AGREGANDO data-ciudades-sede\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=\"${tiposColaboracionArray.join(',')}\"\n                data-programas-uninavarra=\"${todosLosProgramas.join(',')}\"\n                data-movilidad=\"${tarjeta.tiposMovilidad ? tarjeta.tiposMovilidad.join(',') : ''}\"\n                data-grupo=\"${todosLosGrupos.join(',')}\"\n                data-ciudades-sede=\"${todasCiudadesSede.join(',')}\">\n                \n                <div class=\"tarjeta-img\">\n                    <img decoding=\"async\" src=\"${tarjeta.imagenUrl || 'https:\/\/via.placeholder.com\/300x220?text=Universidad'}\" alt=\"${tarjeta.institucion}\">\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>\n                       <\/a>` : ''}\n                <\/div>\n                <div class=\"tarjeta-content\">\n                    <div class=\"tarjeta-datos\">\n                        ${tarjeta.pais ? `\n                        <div class=\"uninavarra-card-info-item\">\n                            <div class=\"uninavarra-card-info-label\">Pa\u00eds:<\/div>\n                            <div class=\"uninavarra-card-info-value\">${tarjeta.pais}<\/div>\n                        <\/div>` : ''}\n                        ${tarjeta.departamento ? `\n                        <div class=\"uninavarra-card-info-item\">\n                            <div class=\"uninavarra-card-info-label\">Dep.\/Estado:<\/div>\n                            <div class=\"uninavarra-card-info-value\">${tarjeta.departamento}<\/div>\n                        <\/div>` : ''}\n                        ${tarjeta.ciudadPrincipal ? `\n                        <div class=\"uninavarra-card-info-item\">\n                            <div class=\"uninavarra-card-info-label\">Ciudad:<\/div>\n                            <div class=\"uninavarra-card-info-value\">${tarjeta.ciudadPrincipal}<\/div>\n                        <\/div>` : ''}\n                        ${tarjeta.otrasCiudades && tarjeta.otrasCiudades.length > 0 ? `\n                        <div class=\"uninavarra-card-info-item\">\n                            <div class=\"uninavarra-card-info-label\">Otras <\/br> Ciudades:<\/div>\n                            <div class=\"uninavarra-card-info-value\">${tarjeta.otrasCiudades.join(', ')}<\/div>\n                        <\/div>` : ''}\n                        ${tarjeta.anotaciones && tarjeta.anotaciones.trim() !== '' ? `\n                        <div class=\"uninavarra-card-info-item\">\n                            <div class=\"uninavarra-card-info-label\">Anotaciones:<\/div>\n                            <div class=\"uninavarra-card-info-value\">${tarjeta.anotaciones}<\/div>\n                        <\/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        \/\/ A\u00f1adir la tarjeta al contenedor\n        contenedorTarjetas.append(tarjetaHTML);\n        \n        \/\/ Agregar evento click para mostrar el popup\n        $(`#${tarjetaId}`).click(function() {\n            mostrarPopup(tarjeta);\n        });\n        \n        \/\/ Evitar que el clic en el enlace web active el popup\n        \/\/ Permitir que el enlace web funcione correctamente\n        $(`#${tarjetaId} .tarjeta-web-link`).on('click', function(e) {\n            e.stopPropagation();\n            e.preventDefault();\n            window.open($(this).attr('href'), '_blank');\n            return false;\n        });\n    });\n    \n    \/\/ Ocultar mensaje de no resultados\n    $(\"#no-results\").hide();\n}\n\n\/\/ Funci\u00f3n para actualizar los filtros y mostrar\/ocultar tarjetas\nfunction actualizarFiltros() {\n    \/\/ Si no hay filtros, mostrar todas las tarjetas\n    if (Object.keys(filtersObject).length === 0) {\n        $(\".tarjeta\").show();\n        verificarResultados();\n        return;\n    }\n    \n    \/\/ Ocultar todas las tarjetas primero\n    $(\".tarjeta\").hide();\n    \n    \/\/ Mostrar solo las que cumplen con los filtros\n    $(\".tarjeta\").each(function() {\n        let mostrar = true;\n        \n        for (let key in filtersObject) {\n            if (filtersObject.hasOwnProperty(key)) {\n                let valor = filtersObject[key];\n                \n                if (key === 'programa') {\n                    \/\/ Caso especial para programas (puede ser array)\n                    let programas = $(this).data('programas-uninavarra');\n                    if (!programas || !programas.split(',').includes(valor)) {\n                        mostrar = false;\n                        break;\n                    }\n                } \n                else if (key === 'colaboracion') {\n                    \/\/ Caso especial para tipos de colaboraci\u00f3n (puede ser array)\n                    let colaboraciones = $(this).data('colaboracion');\n                    if (!colaboraciones || !colaboraciones.split(',').includes(valor)) {\n                        mostrar = false;\n                        break;\n                    }\n                }\n                else if (key === 'ciudad') {\n                    \/\/ Caso especial para ciudades (puede ser array)\n                    let ciudades = $(this).data('ciudades');\n                    if (!ciudades || !ciudades.split(',').includes(valor)) {\n                        mostrar = false;\n                        break;\n                    }\n                }\n                else if (key === 'movilidad') {\n                    \/\/ Caso especial para tipos de movilidad (puede ser array)\n                    let movilidades = $(this).data('movilidad');\n                    if (!movilidades || !movilidades.split(',').includes(valor)) {\n                        mostrar = false;\n                        break;\n                    }\n                }\n                else if (key === 'grupo') {\n                    \/\/ Caso especial para grupos de convenio (puede ser array)\n                    let grupos = $(this).data('grupo');\n                    if (!grupos || !grupos.split(',').includes(valor)) {\n                        mostrar = false;\n                        break;\n                    }\n                }\n                else if (key === 'ciudad-sede') {\n                    \/\/ CORREGIDO: Caso especial para ciudades sede de programas\n                    let ciudadesSede = $(this).data('ciudades-sede');\n                    if (!ciudadesSede || !ciudadesSede.split(',').includes(valor)) {\n                        mostrar = false;\n                        break;\n                    }\n                }\n                else {\n                    \/\/ Caso general\n                    let dataValue = $(this).data(key);\n                    if (dataValue !== valor) {\n                        mostrar = false;\n                        break;\n                    }\n                }\n            }\n        }\n        \n        if (mostrar) {\n            $(this).show();\n        }\n    });\n    \n    verificarResultados();\n}\n\n\/\/ Funci\u00f3n para verificar si hay resultados y mostrar mensaje\nfunction verificarResultados() {\n    if ($(\".tarjeta:visible\").length === 0) {\n        $(\"#no-results\").show();\n    } else {\n        $(\"#no-results\").hide();\n    }\n}\n\n\/\/ Funci\u00f3n para mostrar el popup con detalles\n\/\/ Funci\u00f3n para mostrar el popup con detalles\nfunction mostrarPopup(tarjeta) {\n    \/\/ Llenar el t\u00edtulo\n    $(\"#popup-title\").text(tarjeta.institucion);\n    \n    \/\/ Generar secciones para cada convenio\n    let conveniosHTML = '';\n    \n    \/\/ A\u00f1adir un bot\u00f3n para el sitio web solo si existe el enlace\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    \n    let programasUninavarra = new Set();\n    let programasDestinoObj = {}; \/\/ Objeto para relacionar programa UNINAVARRA con destino\n    let index = 0;\n    \n    for (let claveConvenio in tarjeta.convenios) {\n        let convenio = tarjeta.convenios[claveConvenio];\n        \n        \/\/ Generar secci\u00f3n de informaci\u00f3n del convenio\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        `;\n        \n        \/\/ Mostrar observaci\u00f3n solo si hay informaci\u00f3n\n        if (convenio.observacion && convenio.observacion.trim() !== '') {\n            conveniosHTML += `\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            `;\n        }\n        \n        \/\/ Elimin\u00e9 la secci\u00f3n de instrucciones como solicitaste\n        \n        \/\/ Cerramos la secci\u00f3n del convenio\n        conveniosHTML += `\n            <\/div>\n        `;\n        \n        \/\/ Recopilar todos los programas para la tabla final\n        convenio.programasUninavarra.forEach((programa, i) => {\n            programasUninavarra.add(programa);\n            programasDestinoObj[programa] = {\n                destino: convenio.programasDestino[i] || '',\n                link: convenio.linksProgramasDestino[i] || ''\n            };\n        });\n        \n        index++;\n    }\n    \n    \/\/ Generar tabla de programas acad\u00e9micos\n    let programasHTML = '';\n    let hayProgramas = false;\n\n\/\/ Verificar si hay programas en alg\u00fan convenio\nfor (let claveConvenio in tarjeta.convenios) {\n    let convenio = tarjeta.convenios[claveConvenio];\n    if (convenio.programasUninavarra && convenio.programasUninavarra.length > 0) {\n        hayProgramas = true;\n        break;\n    }\n}\n\nif (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>\n                    <tr>\n                        <th>Programas UNINAVARRA<\/th>\n                        <th>Programas Destino<\/th>\n                        <th>Ciudad Sede<\/th>\n                        <th>Modalidad<\/th>\n                    <\/tr>\n                <\/thead>\n                <tbody>\n    `;\n    \n    \/\/ Mostrar TODOS los programas sin eliminar duplicados\n    \/\/ Mostrar TODOS los programas manteniendo las combinaciones \u00fanicas programa-ciudad\n    for (let claveConvenio in tarjeta.convenios) {\n        let convenio = tarjeta.convenios[claveConvenio];\n        convenio.programasUninavarra.forEach((programa, i) => {\n            let programaDestino = convenio.programasDestino[i] || '';\n            let linkProgramaDestino = convenio.linksProgramasDestino[i] || '';\n            let ciudadSede = convenio.ciudadesProgramasDestino[i] || '';\n            let modalidad = convenio.modalidadesProgramasDestino[i] || '';\n            \n            \/\/ Si no hay ciudad sede espec\u00edfica, usar la ciudad principal de la instituci\u00f3n\n            if (!ciudadSede || ciudadSede.trim() === '') {\n                ciudadSede = tarjeta.ciudadPrincipal || '';\n            }\n            \n            programasHTML += `\n                <tr>\n                    <td>${programa}<\/td>\n                    <td>${linkProgramaDestino ? \n                        `<a href=\"${linkProgramaDestino}\" target=\"_blank\" class=\"programa-link\">${programaDestino}<\/a>` : \n                        programaDestino}\n                    <\/td>\n                    <td>${ciudadSede}<\/td>\n                    <td>${modalidad}<\/td>\n                <\/tr>\n            `;\n        });\n    }\n    \n    programasHTML += `\n                <\/tbody>\n            <\/table>\n        <\/div>\n    `;\n}\n\n\n    \n    \/\/ Combinar todo el HTML del popup - sin incluir la secci\u00f3n de informaci\u00f3n b\u00e1sica\n    let popupBodyHTML = conveniosHTML + programasHTML;\n    \n    \/\/ Actualizar el contenido del popup\n    $(\".popup-body\").html(popupBodyHTML);\n    \n    \/\/ Mostrar el popup\n    $(\"#popup-overlay\").fadeIn(300);\n    $(\"body\").addClass(\"popup-open\");\n}\n\nfunction generarInformeExcel() {\n    \/\/ Verificar si hay resultados visibles\n    const tarjetasVisibles = $(\".tarjeta:visible\");\n    \n    if (tarjetasVisibles.length === 0) {\n        alert(\"No hay resultados para generar el informe. Ajusta los filtros.\");\n        return;\n    }\n    \n    \/\/ Deshabilitar el bot\u00f3n mientras se genera\n    $(\"#descargar-informe\").prop('disabled', true).html('<i class=\"fas fa-spinner fa-spin\"><\/i>');\n    \n    \/\/ Crear arrays para las diferentes hojas\n    let datosInstituciones = [];\n    let datosConvenios = [];\n    let datosProgramas = [];\n    \n    \/\/ Procesar cada tarjeta visible\n    tarjetasVisibles.each(function() {\n        const $tarjeta = $(this);\n        const institucion = $tarjeta.data('institucion');\n        \n        \/\/ Buscar los datos completos de esta instituci\u00f3n\n        const datosInstitucion = webData.filter(item => item.INSTITUCI\u00d3N === institucion);\n        \n        if (datosInstitucion.length > 0) {\n            const primerRegistro = datosInstitucion[0];\n            \n            \/\/ Datos de la instituci\u00f3n (una fila por instituci\u00f3n)\n            let institucionData = {\n                'Instituci\u00f3n': institucion,\n                'Pa\u00eds': primerRegistro[\"PA\u00cdS DE LA INSTITUCI\u00d3N\"] || '',\n                'Departamento\/Estado': primerRegistro[\"DEPARTAMENTO\/ESTADO DE LA INSTITUCI\u00d3N\"] || '',\n                'Ciudad Principal': primerRegistro[\"CIUDAD PRINCIPAL DE LA INSTITUCI\u00d3N\"] || '',\n                'Otras Ciudades': primerRegistro[\"OTRAS CIUDADES DE LA INSTITUCI\u00d3N\"] || '',\n                'P\u00e1gina Web': primerRegistro[\"LINK P\u00c1GINA WEB INSTITUCI\u00d3N\"] || '',\n                'Tipos de Movilidad': primerRegistro[\"TIPOS MOVILIDAD\"] || '',\n                'Anotaciones': primerRegistro[\"ANOTACIONES\"] || ''\n            };\n            \n            \/\/ Verificar si ya existe esta instituci\u00f3n\n            if (!datosInstituciones.find(item => item.Instituci\u00f3n === institucion)) {\n                datosInstituciones.push(institucionData);\n            }\n            \n            \/\/ Datos de convenios (una fila por convenio)\n            datosInstitucion.forEach(registro => {\n                let convenioData = {\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                    'Intercambio Estudiantil': registro[\"Intercambio estudiantil\"] || '',\n                    'Otras Colaboraciones': registro[\"Otras\"] || '',\n                    'Tipos de Movilidad': registro[\"TIPOS MOVILIDAD\"] || ''\n                };\n                \n                datosConvenios.push(convenioData);\n                \n                \/\/ Datos de programas (una fila por programa)\n                if (registro[\"PROGRAMAS ACAD\u00c9MICOS AFINES UNINAVARRA\"]) {\n                    let programasUninavarra = registro[\"PROGRAMAS ACAD\u00c9MICOS AFINES UNINAVARRA\"].split(',');\n                    let programasDestino = registro[\"PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] ? \n                        registro[\"PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"].split(',') : [];\n                    let ciudadesDestino = registro[\"CIUDAD SEDE PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] ? \n                        registro[\"CIUDAD SEDE PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"].split(',') : [];\n                    let modalidadesDestino = registro[\"MODALIDAD PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] ? \n                        registro[\"MODALIDAD PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"].split(',') : [];\n                    let linkDestino = registro[\"LINK PROGRAMAS ACAD\u00c9MICOS AFINES DESTINO\"] || '';\n                    \n                    programasUninavarra.forEach((programa, index) => {\n                        let programaData = {\n                            'Instituci\u00f3n': institucion,\n                            'Tipo de Acuerdo': registro[\"TIPO DE ACUERDO\"] || '',\n                            'Programa UNINAVARRA': programa.trim(),\n                            'Programa Destino': (programasDestino[index] || '').trim(),\n                            'Ciudad Sede Destino': (ciudadesDestino[index] || '').trim(),\n                            'Modalidad Destino': (modalidadesDestino[index] || '').trim(),\n                            'Link Programa Destino': linkDestino\n                        };\n                        \n                        datosProgramas.push(programaData);\n                    });\n                }\n            });\n        }\n    });\n    \n    \/\/ Crear el libro de Excel\n    const wb = XLSX.utils.book_new();\n    \n    \/\/ Hoja 1: Resumen de Instituciones\n    const wsInstituciones = XLSX.utils.json_to_sheet(datosInstituciones);\n    XLSX.utils.book_append_sheet(wb, wsInstituciones, \"Instituciones\");\n    \n    \/\/ Hoja 2: Detalles de Convenios\n    const wsConvenios = XLSX.utils.json_to_sheet(datosConvenios);\n    XLSX.utils.book_append_sheet(wb, wsConvenios, \"Convenios\");\n    \n    \/\/ Hoja 3: Programas Acad\u00e9micos\n    if (datosProgramas.length > 0) {\n        const wsProgramas = XLSX.utils.json_to_sheet(datosProgramas);\n        XLSX.utils.book_append_sheet(wb, wsProgramas, \"Programas\");\n    }\n    \n    \/\/ Generar archivo Excel\n    const fecha = new Date().toISOString().split('T')[0];\n    const nombreArchivo = `Informe_Convenios_${fecha}.xlsx`;\n    \n    XLSX.writeFile(wb, nombreArchivo);\n    \n    \/\/ Mostrar mensaje de \u00e9xito y rehabilitar bot\u00f3n\n    setTimeout(() => {\n        $(\"#descargar-informe\").prop('disabled', false).html('<i class=\"fas fa-file-excel\"><\/i>');\n        alert(`Informe Excel generado exitosamente con ${tarjetasVisibles.length} instituciones.`);\n    }, 1000);\n}\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 nacionales... Departamento Todos los departamentos Ciudad Todas las ciudades Ciudad Sede Programa Todas las ciudades sede Programa Acad\u00e9mico UNINAVARRA Todos los programas Tipo de Colaboraci\u00f3n Todos [...]","protected":false},"author":13,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-93266","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Desarrollo Convenios Nacionales - 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\/desarrollo-convenios-nacionales\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Desarrollo Convenios Nacionales - Uninavarra\" \/>\n<meta property=\"og:url\" content=\"https:\/\/uninavarra.edu.co\/en\/desarrollo-convenios-nacionales\/\" \/>\n<meta property=\"og:site_name\" content=\"Uninavarra\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/UninavarraEduca\" \/>\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=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/uninavarra.edu.co\\\/desarrollo-convenios-nacionales\\\/\",\"url\":\"https:\\\/\\\/uninavarra.edu.co\\\/desarrollo-convenios-nacionales\\\/\",\"name\":\"Desarrollo Convenios Nacionales - Uninavarra\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/uninavarra.edu.co\\\/#website\"},\"datePublished\":\"2025-08-04T16:44:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/uninavarra.edu.co\\\/desarrollo-convenios-nacionales\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/uninavarra.edu.co\\\/desarrollo-convenios-nacionales\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/uninavarra.edu.co\\\/desarrollo-convenios-nacionales\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/uninavarra.edu.co\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Desarrollo Convenios Nacionales\"}]},{\"@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":"Desarrollo Convenios Nacionales - 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\/desarrollo-convenios-nacionales\/","og_locale":"en_US","og_type":"article","og_title":"Desarrollo Convenios Nacionales - Uninavarra","og_url":"https:\/\/uninavarra.edu.co\/en\/desarrollo-convenios-nacionales\/","og_site_name":"Uninavarra","article_publisher":"https:\/\/www.facebook.com\/UninavarraEduca","twitter_card":"summary_large_image","twitter_site":"@uninavarraeduca","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/uninavarra.edu.co\/desarrollo-convenios-nacionales\/","url":"https:\/\/uninavarra.edu.co\/desarrollo-convenios-nacionales\/","name":"Desarrollo Convenios Nacionales - Uninavarra","isPartOf":{"@id":"https:\/\/uninavarra.edu.co\/#website"},"datePublished":"2025-08-04T16:44:33+00:00","breadcrumb":{"@id":"https:\/\/uninavarra.edu.co\/desarrollo-convenios-nacionales\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/uninavarra.edu.co\/desarrollo-convenios-nacionales\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/uninavarra.edu.co\/desarrollo-convenios-nacionales\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/uninavarra.edu.co\/"},{"@type":"ListItem","position":2,"name":"Desarrollo Convenios Nacionales"}]},{"@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\/93266","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=93266"}],"version-history":[{"count":0,"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/pages\/93266\/revisions"}],"wp:attachment":[{"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/media?parent=93266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/categories?post=93266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/uninavarra.edu.co\/en\/wp-json\/wp\/v2\/tags?post=93266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}