﻿{"id":8224,"date":"2025-11-12T20:44:30","date_gmt":"2025-11-12T20:44:30","guid":{"rendered":"https:\/\/crc-osa.ciifen.org\/CST\/cst\/?page_id=8224"},"modified":"2025-11-12T21:59:39","modified_gmt":"2025-11-12T21:59:39","slug":"catalogo","status":"publish","type":"page","link":"https:\/\/crc-osa.ciifen.org\/CST\/cst\/catalogo\/","title":{"rendered":"Cat\u00e1logo"},"content":{"rendered":"<p>[et_pb_section fb_built=\u00bb1&#8243; admin_label=\u00bbActividades\u00bb _builder_version=\u00bb4.23.1&#8243; _module_preset=\u00bbdefault\u00bb background_color=\u00bbRGBA(255,255,255,0)\u00bb background_image=\u00bbhttps:\/\/crc-osa.ciifen.org\/CSTDEV\/wp-content\/uploads\/2020\/07\/montan\u0303a.jpg\u00bb background_position=\u00bbtop_center\u00bb background_blend=\u00bbmultiply\u00bb custom_margin=\u00bb||-130px|||\u00bb custom_padding=\u00bb||70px||false|false\u00bb global_colors_info=\u00bb{}\u00bb][et_pb_row _builder_version=\u00bb4.16&#8243; _module_preset=\u00bbdefault\u00bb global_colors_info=\u00bb{}\u00bb][et_pb_column type=\u00bb4_4&#8243; _builder_version=\u00bb4.16&#8243; _module_preset=\u00bbdefault\u00bb global_colors_info=\u00bb{}\u00bb][et_pb_text _builder_version=\u00bb4.16&#8243; _module_preset=\u00bbdefault\u00bb text_font=\u00bbMontserrat||||||||\u00bb text_text_color=\u00bb#ffffff\u00bb text_font_size=\u00bb4vw\u00bb text_line_height=\u00bb1.4em\u00bb header_font=\u00bbMontserrat|700|||||||\u00bb header_text_color=\u00bb#ffffff\u00bb header_font_size=\u00bb55px\u00bb text_orientation=\u00bbcenter\u00bb width=\u00bb100%\u00bb module_alignment=\u00bbleft\u00bb custom_padding=\u00bb19px||||false|false\u00bb header_text_color_tablet=\u00bb\u00bb header_text_color_phone=\u00bb\u00bb header_text_color_last_edited=\u00bbon|desktop\u00bb header_font_size_tablet=\u00bb42px\u00bb header_font_size_phone=\u00bb42px\u00bb header_font_size_last_edited=\u00bbon|phone\u00bb border_color_all=\u00bbrgba(0,0,0,0)\u00bb border_width_left=\u00bb10px\u00bb global_colors_info=\u00bb{}\u00bb]<\/p>\n<h1 class=\"sc_item_title sc_title_title sc_item_title_style_accent sc_item_title_tag\"><span style=\"color: #adadad;\">Cat\u00e1logo<\/span><\/h1>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\u00bb1&#8243; _builder_version=\u00bb4.16&#8243; _module_preset=\u00bbdefault\u00bb custom_padding=\u00bb31px||4px|||\u00bb global_colors_info=\u00bb{}\u00bb][et_pb_row _builder_version=\u00bb4.16&#8243; _module_preset=\u00bbdefault\u00bb background_color=\u00bb#ffffff\u00bb width=\u00bb100%\u00bb custom_margin=\u00bb||||false|false\u00bb custom_padding=\u00bb51px|||||\u00bb global_colors_info=\u00bb{}\u00bb][et_pb_column type=\u00bb4_4&#8243; _builder_version=\u00bb4.16&#8243; _module_preset=\u00bbdefault\u00bb custom_padding=\u00bb||||false|true\u00bb custom_padding_tablet=\u00bb|30px||30px|false|false\u00bb custom_padding_phone=\u00bb30px|20px|30px|20px|false|false\u00bb custom_padding_last_edited=\u00bbon|phone\u00bb global_colors_info=\u00bb{}\u00bb][et_pb_text _builder_version=\u00bb4.16&#8243; _module_preset=\u00bbdefault\u00bb text_font=\u00bbMontserrat||||||||\u00bb text_text_color=\u00bb#000000&#8243; text_font_size=\u00bb17px\u00bb text_line_height=\u00bb1.6em\u00bb text_orientation=\u00bbjustified\u00bb width=\u00bb100%\u00bb custom_padding=\u00bb|0px|0px|||\u00bb inline_fonts=\u00bbZhi Mang Xing\u00bb global_colors_info=\u00bb{}\u00bb]<\/p>\n<style>\n        .cst-tabs {\n            width: 100%;\n            margin: 20px 0;\n        }\n        \n        \/* Buscador global *\/\n        .cst-buscador-global {\n            margin: 20px 0 30px 0;\n            padding: 25px;\n            background: linear-gradient(135deg, #156296 0%, #FFFFFF 100%);\n            border-radius: 15px;\n            box-shadow: 0 5px 20px rgba(0,0,0,0.3);\n        }\n        \n        .cst-buscador-titulo {\n            color: white;\n            font-size: 24px;\n            font-weight: bold;\n            margin-bottom: 20px;\n            text-align: center;\n            text-shadow: 2px 2px 4px rgba(0,0,0,0.2);\n        }\n        \n        .cst-buscador-input-container {\n            display: flex;\n            gap: 10px;\n            align-items: center;\n            flex-wrap: wrap;\n        }\n        \n        .cst-buscador-input {\n            flex: 1;\n            min-width: 250px;\n            padding: 14px 20px;\n            font-size: 16px;\n            border: none;\n            border-radius: 25px;\n            outline: none;\n            box-shadow: 0 3px 10px rgba(0,0,0,0.2);\n        }\n        \n        .cst-buscador-btn {\n            padding: 8px 35px;\n            background-color: #156296;\n            color: white;\n            border: none;\n            border-radius: 25px;\n            font-size: 16px;\n            font-weight: bold;\n            cursor: pointer;\n            transition: all 0.3s;\n            box-shadow: 0 3px 10px rgba(0,0,0,0.2);\n        }\n        \n        .cst-buscador-btn:hover {\n            background-color: #156296;\n            transform: translateY(-2px);\n            box-shadow: 0 5px 15px rgba(0,0,0,0.3);\n        }\n        \n        .cst-buscador-limpiar {\n            padding: 8px 35px;\n            background-color: #E81313;\n            color: white;\n            border: none;\n            border-radius: 25px;\n            font-size: 16px;\n            font-weight: bold;\n            cursor: pointer;\n            transition: all 0.3s;\n            box-shadow: 0 3px 10px rgba(0,0,0,0.2);\n        }\n        \n        .cst-buscador-limpiar:hover {\n            background-color: #E81313;\n            transform: translateY(-2px);\n            box-shadow: 0 5px 15px rgba(0,0,0,0.3);\n        }\n        \n        .cst-estadisticas {\n            margin-top: 15px;\n            padding: 15px;\n            background-color: rgba(255,255,255,0.9);\n            border-radius: 10px;\n            display: none;\n        }\n        \n        .cst-estadisticas.visible {\n            display: block;\n        }\n        \n        .cst-stats-item {\n            display: inline-block;\n            margin: 5px 10px;\n            padding: 8px 15px;\n            background-color: #3498db;\n            color: white;\n            border-radius: 20px;\n            font-size: 14px;\n            font-weight: bold;\n        }\n        \n        \/* Resultados de b\u00fasqueda *\/\n        .cst-resultados-busqueda {\n            margin-top: 20px;\n            padding: 20px;\n            background-color: #EBF0F5;\n            border: 2px solid #BED4E5;\n            border-radius: 10px;\n            display: none;\n        }\n        \n        .cst-resultados-busqueda.visible {\n            display: block;\n        }\n        \n        .cst-resultado-header {\n            font-size: 18px;\n            font-weight: bold;\n            margin-bottom: 15px;\n            color: #2c3e50;\n        }\n        \n        .cst-resultado-item {\n            padding: 15px;\n            margin: 10px 0;\n            background-color: white;\n            border-left: 4px solid #3498db;\n            border-radius: 5px;\n            box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n            transition: all 0.3s;\n        }\n        \n        .cst-resultado-item:hover {\n            transform: translateX(5px);\n            box-shadow: 0 4px 10px rgba(0,0,0,0.15);\n        }\n        \n        .cst-resultado-categoria {\n            display: inline-block;\n            background-color: #3498db;\n            color: white;\n            padding: 4px 12px;\n            border-radius: 15px;\n            font-size: 12px;\n            font-weight: bold;\n            margin-right: 10px;\n        }\n        \n        .cst-resultado-nombre {\n            font-weight: bold;\n            font-size: 16px;\n            color: #2c3e50;\n            margin: 5px 0;\n        }\n        \n        .cst-resultado-descripcion {\n            color: #555;\n            font-size: 14px;\n            text-align: justify;\n            margin-top: 8px;\n        }\n        \n        .cst-sin-resultados {\n            text-align: center;\n            padding: 30px;\n            color: #666;\n            font-size: 16px;\n            font-style: italic;\n        }\n        \n        \/* Pesta\u00f1as *\/\n        .cst-tab-buttons {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 10px;\n            margin-bottom: 20px;\n            border-bottom: 3px solid #3498db;\n            padding-bottom: 10px;\n        }\n        \n        .cst-tab-button {\n            padding: 12px 24px;\n            background-color: #ecf0f1;\n            border: none;\n            cursor: pointer;\n            font-size: 16px;\n            font-weight: bold;\n            border-radius: 8px 8px 0 0;\n            transition: all 0.3s;\n        }\n        \n        .cst-tab-button:hover {\n            background-color: #3498db;\n            color: white;\n        }\n        \n        .cst-tab-button.active {\n            background-color: #3498db;\n            color: white;\n        }\n        \n        .cst-tab-content {\n            display: none;\n            padding: 20px;\n            background-color: #ffffff;\n            border-radius: 5px;\n            box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n            min-height: 400px;\n        }\n        \n        .cst-tab-content.active {\n            display: block;\n        }\n        \n        \/* Tabla *\/\n        .cst-tabla {\n            width: 100%;\n            border-collapse: collapse;\n            margin-bottom: 20px;\n        }\n        \n        .cst-tabla td {\n            padding: 15px;\n            border-bottom: 1px solid #e0e0e0;\n            font-size: 14px;\n            line-height: 1.6;\n            vertical-align: top;\n        }\n        \n        .cst-tabla tr:hover {\n            background-color: #f5f5f5;\n        }\n        \n        .cst-tabla a {\n            font-weight: bold;\n            color: #2980b9;\n            text-decoration: none;\n            font-size: 14px;\n        }\n        \n        .cst-tabla a:hover {\n            color: #3498db;\n            text-decoration: underline;\n        }\n        \n        .cst-tabla p {\n            margin: 8px 0;\n            text-align: justify;\n            font-size: 14px;\n        }\n        \n        .cst-tipo {\n            color: #7f8c8d;\n            font-size: 13px;\n            font-style: italic;\n        }\n        \n        \/* Paginaci\u00f3n *\/\n        .cst-paginacion {\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            gap: 10px;\n            margin: 20px 0;\n            flex-wrap: wrap;\n        }\n        \n        .cst-pag-btn {\n            padding: 8px 15px;\n            background-color: #ecf0f1;\n            border: 1px solid #bdc3c7;\n            border-radius: 5px;\n            cursor: pointer;\n            transition: all 0.3s;\n            font-weight: bold;\n        }\n        \n        .cst-pag-btn:hover {\n            background-color: #3498db;\n            color: white;\n            border-color: #3498db;\n        }\n        \n        .cst-pag-btn.active {\n            background-color: #2980b9;\n            color: white;\n            border-color: #2980b9;\n        }\n        \n        .cst-pag-info {\n            padding: 8px 15px;\n            color: #555;\n            font-weight: bold;\n        }\n        \n        .cst-items-selector {\n            margin-bottom: 15px;\n            text-align: right;\n        }\n        \n        .cst-items-selector label {\n            margin-right: 10px;\n            font-weight: bold;\n            color: #555;\n        }\n        \n        .cst-items-selector select {\n            padding: 8px 15px;\n            border: 2px solid #3498db;\n            border-radius: 5px;\n            font-size: 14px;\n            cursor: pointer;\n        }\n        \n        \/* Responsive *\/\n        @media screen and (max-width: 768px) {\n            .cst-tab-button {\n                font-size: 14px;\n                padding: 10px 15px;\n            }\n            \n            .cst-buscador-input-container {\n                flex-direction: column;\n            }\n            \n            .cst-buscador-input,\n            .cst-buscador-btn,\n            .cst-buscador-limpiar {\n                width: 100%;\n            }\n            \n            .cst-tabla td {\n                font-size: 13px;\n                padding: 10px;\n            }\n            \n            .cst-items-selector {\n                text-align: center;\n            }\n        }\n    <\/style><script>\n        \/\/ Datos cargados desde PHP\n        const datosCST = {\"herramientas\":[{\"ID\":\"1\",\"nombre\":\"Generador de mapas de TSM\",\"resumen\":\"Generaci\\u00f3n autom\\u00e1tica de mapas de Temperatura Superficial del Mar (TSM). Con este generador, se puede elegir generar mapas diarios, semanales o mensuales, tanto para valores observados como de anomal\\u00edas. Tambi\\u00e9n se pueden elegir entre cuatro distintas regiones: Pac\\u00edfico ecuatorial, Pac\\u00edfico oriental, Atl\\u00e1ntico sur y Caribe.\",\"tipo\":\"Visores y mapas interactivos\",\"tipo_id\":\"3\"},{\"ID\":\"3\",\"nombre\":\"Herramienta de Acceso a Datos Grilladas\",\"resumen\":\"Esta herramienta permite la descarga de datos clim\\u00e1ticos e hidrol\\u00f3gicos de instituciones globales en formato r\\u00e1ster, forma parte del proyecto ENANDES y est\\u00e1 destinado a mejorar la capacidad de decisi\\u00f3n de Servicios Meteorol\\u00f3gicos e Hidrol\\u00f3gicos Nacionales (SMHN), investigadores, planificadores y el p\\u00fablico en general.\",\"tipo\":\"Plataforma web de productos y servicios clim\\u00e1ticos\",\"tipo_id\":\"2\"},{\"ID\":\"5\",\"nombre\":\"Plantilla - Comparaci\\u00f3n de pluviometr\\u00eda\",\"resumen\":\"Es una plantilla excel para comparar la precipitaci\\u00f3n entre dos estaciones.\",\"tipo\":\"Plantillas o scripts para an\\u00e1lisis\",\"tipo_id\":\"6\"},{\"ID\":\"6\",\"nombre\":\"Pron\\u00f3stico subestacional\",\"resumen\":\"Portal que brinda acceso a mapas de pron\\u00f3sticos subestacionales de precipitaci\\u00f3n semanal. Los pron\\u00f3sticos se basan en el ensamble de m\\u00faltiples modelos de pron\\u00f3sticos individuales que son calculados a trav\\u00e9s de la base de datos en tiempo real SubX\\\/SubC\",\"tipo\":\"Plataforma web de productos y servicios clim\\u00e1ticos\",\"tipo_id\":\"2\"}],\"rutinas\":[{\"ID\":\"6\",\"nombre\":\"Descarga datos del CMIP6 \",\"resumen\":\"El script permite optimizar la selecci\\u00f3n y descarga de modelos y escenarios de cambio clim\\u00e1tico en la regi\\u00f3n, los datos se descargan del CMIP6 (Proyecto de Intercomparaci\\u00f3n de Modelos Acoplados, fase 6), el script permite delimitar la zona con las coordenadas geogr\\u00e1ficas, seleccionar el modelo, el escenario, la variable clim\\u00e1tico, resoluci\\u00f3n temporal, y el rango de a\\u00f1os de datos requerido.\\r\\nEl script contiene listado los 4 modelos que mejor se adaptar a la regi\\u00f3n previamente estudiados.\",\"tipo\":\"Transferencia, conversi\\u00f3n y formateo de datos\",\"tipo_id\":\"2\"},{\"ID\":\"3\",\"nombre\":\"Generaci\\u00f3n de boletines de Volunclima\",\"resumen\":\"Rutinas para generar los boletines mensuales de la red Volunclima. Internamente cuenta con la funcionalidad para graficar datos, agregar valores diarios a mensuales, descargar datos de pron\\u00f3sticos de SEAS5 y plotear mapas.\",\"tipo\":\"Transferencia, conversi\\u00f3n y formateo de datos\",\"tipo_id\":\"2\"}],\"conjuntos\":[{\"ID\":\"3\",\"nombre\":\"Volunclima\",\"resumen\":\"Volunclima es una iniciativa de ciencia ciudadana gestionada por CIIFEN. Es una red de observadores voluntarios cuyos miembros colaboran con el reporte de las precipitaciones diarias, la percepci\\u00f3n de impactos de la sequ\\u00eda y la ocurrencia de eventos hidrometeorol\\u00f3gicos extremos en un punto fijo (estaci\\u00f3n) ubicados en zonas donde primordialmente los servicios meteorol\\u00f3gicos nacionales no cuentan con redes de monitoreo. Los miembros de la red Volunclima env\\u00edan reportes desde varias localidades de Venezuela, Colombia, Ecuador, Bolivia y Chile.\",\"tipo\":\"Observaciones y monitoreo \",\"tipo_id\":\"3\"}],\"boletines\":[{\"ID\":\"36\",\"nombre\":\"Bolet\\u00edn de Sequ\\u00eda para el Oeste de Sudam\\u00e9rica\",\"resumen\":\"Bolet\\u00edn de seguimiento de la sequ\\u00eda que se genera a partir del monitor regional de sequ\\u00edas del Oeste de Sudam\\u00e9rica.\",\"tema_id\":\"60\"},{\"ID\":\"75\",\"nombre\":\"Bolet\\u00edn ENANDES\",\"resumen\":\"Los boletines exponen los avances y resultados de todos los socios del proyecto ENANDES \",\"tema_id\":\"66\"},{\"ID\":\"76\",\"nombre\":\"Boletines de pron\\u00f3sticos estacional del OSA\",\"resumen\":\"Este bolet\\u00edn se elabora a partir de los aportes de los Servicios Meteorol\\u00f3gicos e Hidrol\\u00f3gicos Nacionales de Bolivia, Chile, Colombia, Ecuador, Per\\u00fa y Venezuela, quienes generan pron\\u00f3sticos estacionales mediante m\\u00e9todos estad\\u00edsticos basados en datos observados en sus estaciones meteorol\\u00f3gicas. El bolet\\u00edn presenta informaci\\u00f3n sobre las principales variables clim\\u00e1ticas de inter\\u00e9s para la regi\\u00f3n: la temperatura del aire y la precipitaci\\u00f3n.\",\"tema_id\":\"53\"}],\"formaciones\":[{\"ID\":\"39\",\"nombre\":\"Capacitaci\\u00f3n en umbrales de sequ\\u00edas - Proyecto ENANDES+    CIIFEN\\\/CRC-OSA \\u2013 CRC-SAS \\u2013 MeteoSwiss\",\"resumen\":\"Se present\\u00f3 una introducci\\u00f3n a los umbrales de sequ\\u00eda y ejemplos de aplicaci\\u00f3n de umbrales relacionados a impactos de sequ\\u00eda en la regi\\u00f3n\",\"tipo\":\"Servicios clim\\u00e1ticos y toma de decisiones\",\"tipo_id\":\"8\"},{\"ID\":\"37\",\"nombre\":\"Capacitaci\\u00f3n sobre el monitoreo y la gesti\\u00f3n de la sequ\\u00eda del proyecto ENANDES+    CIIFEN\\\/CRC-OSA \\u2013 CRC-SAS \\u2013 MeteoSwiss\",\"resumen\":\"La capacitaci\\u00f3n se realiz\\u00f3 los d\\u00edas 3 septiembre y 10 diciembre del 2024 sobre estrategias de monitoreo de la sequ\\u00eda, el uso del monitor para el monitoreo y la gesti\\u00f3n de las sequ\\u00edas en la planificaci\\u00f3n de diferentes sectores productivos. \",\"tipo\":\"Servicios clim\\u00e1ticos y toma de decisiones\",\"tipo_id\":\"8\"},{\"ID\":\"38\",\"nombre\":\"Capacitaci\\u00f3n sobre escenarios de sequ\\u00eda del proyecto ENANDES+    CIIFEN\\\/CRC-OSA \\u2013 CRC-SAS \\u2013 MeteoSwiss\",\"resumen\":\"Se comparti\\u00f3 experiencias internacionales para la construcci\\u00f3n de escenarios de sequ\\u00edas y se trabaj\\u00f3 en grupo para la construcci\\u00f3n de una hoja de ruta inicial para la construcci\\u00f3n de escenarios de sequ\\u00edas por pa\\u00eds.\",\"tipo\":\"Servicios clim\\u00e1ticos y toma de decisiones\",\"tipo_id\":\"8\"},{\"ID\":\"36\",\"nombre\":\"Curso virtual de formaci\\u00f3n sobre an\\u00e1lisis y visualizaci\\u00f3n de datos hidrometeorol\\u00f3gicos con Python \",\"resumen\":\"Este curso se realiz\\u00f3 el 12 y 26 de noviembre y 03 de diciembre de 2024 a los SHMN relacionados al proyecto ENANDES.\",\"tipo\":\"Herramientas y analisis de datos clim\\u00e1ticos\",\"tipo_id\":\"7\"}],\"publicaciones\":[{\"ID\":\"16\",\"nombre\":\"Consejos para el registro de datos\",\"resumen\":\"Manual de consejos para observadores sobre tomar la lectura del pluvi\\u00f3metro, registro de datos y clasificaci\\u00f3n de lluvias.\",\"tipo\":\"Manuales y gu\\u00edas\",\"tipo_id\":\"1\"},{\"ID\":\"31\",\"nombre\":\"Est\\u00e1ndares de codificaci\\u00f3n y documentaci\\u00f3n\",\"resumen\":\"El archivo comprimido contiene archivos editables:\\r\\nUn archivos de documentaci\\u00f3n y un archivo de codificaci\\u00f3n, dentro de la carpeta Elementos del est\\u00e1ndar de documentaci\\u00f3n ENANDES+ hay 13 archivos.\",\"tipo\":\"Documentaci\\u00f3n de software o plataformas\",\"tipo_id\":\"10\"},{\"ID\":\"27\",\"nombre\":\"Gu\\u00eda del sistema de pron\\u00f3sticos subestacionales del Proyecto ENANDES\",\"resumen\":\"Est\\u00e1 escrito de manera que los propios pronosticadores de los Servicios Meteorol\\u00f3gicos e Hidrol\\u00f3gicos socios del Proyecto ENANDES puedan usarlo como manual de consulta r\\u00e1pida en las actividades diarias relacionadas. Adicionalmente, durante la escritura se ha hecho \\u00e9nfasis en que pueda servir como documento base para entrenar a nuevas generaciones de pronosticadores que deseen usar este sistema.\",\"tipo\":\"Manuales y gu\\u00edas\",\"tipo_id\":\"1\"},{\"ID\":\"32\",\"nombre\":\"Guidelines to enable operational production of objective seasonal forecasts in South America subregions\",\"resumen\":\"El documento recoge las fortalezas y necesidades del CRC-OSA y el CRC-SAS, y entre las principales conclusiones se resalta la urgencia de fortalecer la infraestructura y las capacidades t\\u00e9cnicas. Asimismo, se subraya la importancia de mejorar la colaboraci\\u00f3n entre los Servicios Meteorol\\u00f3gicos e Hidrol\\u00f3gicos Nacionales con actores de otros sectores clave para optimizar la toma de decisiones y la gesti\\u00f3n de riesgos clim\\u00e1ticos.\",\"tipo\":\"Manuales y gu\\u00edas\",\"tipo_id\":\"1\"},{\"ID\":\"18\",\"nombre\":\"Manual de uso de la aplicaci\\u00f3n m\\u00f3vil para observadores\",\"resumen\":\"Manual para el uso de la aplicaci\\u00f3n m\\u00f3vil orientado para observadores de la red Volunclima. En el manual se encuentra como se usa la aplicaci\\u00f3n, como se registran los datos, como se llenan las encuestas y se reportan los eventos extremos y m\\u00e1s informaci\\u00f3n importante para los observadores.\",\"tipo\":\"Manuales y gu\\u00edas\",\"tipo_id\":\"1\"},{\"ID\":\"19\",\"nombre\":\"Manual de uso de la plataforma web para observadores\",\"resumen\":\"Manual para el uso de la plataforma web orientado para observadores de la red Volunclima. En el manual se encuentra como se usa la plataforma web, como se registran los datos, como se llenan las encuestas y se reportan los eventos extremos, como se pueden revisar los datos de las estaciones de la red y m\\u00e1s informaci\\u00f3n importante para los observadores.\",\"tipo\":\"Manuales y gu\\u00edas\",\"tipo_id\":\"1\"},{\"ID\":\"21\",\"nombre\":\"Nota T\\u00e9cnica 2. Monitor y Bolet\\u00edn regional de sequ\\u00edas del Oeste de Sudam\\u00e9rica\",\"resumen\":\"Nota t\\u00e9cnica sobre el desarrollo e implementaci\\u00f3n de un monitor de sequias regional para el OSA con su respectivo bolet\\u00edn. El documento contiene informaci\\u00f3n sobre: \\r\\n- La diferencia entre un monitor nacional y regional de sequ\\u00eda\\r\\n- Metodolog\\u00eda para contar con el Monitor Regional y su respectivo Bolet\\u00edn.\\r\\n- Estado actual del desarrollo del monitor regional de sequ\\u00eda para el OSA\\r\\n- El Protocolo sobre discusi\\u00f3n de la condici\\u00f3n de la sequ\\u00eda en las fronteras nacionales.\\r\\n- El Boletin regional de sequ\\u00edas.\",\"tipo\":\"Metodolog\\u00edas\",\"tipo_id\":\"4\"},{\"ID\":\"22\",\"nombre\":\"Nota T\\u00e9cnica 3. Umbrales de sequ\\u00eda para el sector energ\\u00e9tico\",\"resumen\":\"Determinaci\\u00f3n de los umbrales de sequ\\u00eda para los sectores el\\u00e9ctrico y de recursos h\\u00eddricos. El documento contine informaci\\u00f3n para la implementaci\\u00f3n de una metodolog\\u00eda para determinar los umbrales de sequ\\u00eda para el sector el\\u00e9ctrico y recursos h\\u00eddricos para los pa\\u00edses del OSA, y un protocolo sugerido para la implementaci\\u00f3n de los umbrales de sequ\\u00eda en el marco de la gesti\\u00f3n de riesgos por sequ\\u00eda.\",\"tipo\":\"Metodolog\\u00edas\",\"tipo_id\":\"4\"},{\"ID\":\"24\",\"nombre\":\"Nota T\\u00e9cnica 4. Hoja de ruta para la formulaci\\u00f3n del monitor de sequ\\u00eda de Sudam\\u00e9rica\",\"resumen\":\"Hoja de Ruta para la formulaci\\u00f3n del monitor de sequ\\u00eda de Sudam\\u00e9rica. Se presentan alternativas para crear un solo monitor para Sudam\\u00e9rica, adem\\u00e1s de una Hoja de Ruta sugerida para la formulaci\\u00f3n del monitor de sequ\\u00eda de Sudam\\u00e9rica y un Cronograma de trabajo lograr crear un monitor que una el monitor de sequ\\u00edas del Oeste de Sudam\\u00e9rica, del Sur de Sudam\\u00e9rica y del Caribe integrando (Suriname, Guayana y Guayana Francesa).\",\"tipo\":\"Estrategias y planes de acci\\u00f3n\",\"tipo_id\":\"3\"},{\"ID\":\"20\",\"nombre\":\"Selecci\\u00f3n y priorizaci\\u00f3n de modelos CMIP6 para la elaboraci\\u00f3n de escenarios regionales de cambio clim\\u00e1tico en los pa\\u00edses ENANDES+\",\"resumen\":\"El siguiente archivo tiene comprimido los siguientes archivos:\\r\\n- Listado de modelos del CMIP6 que cumplen con los criterios de selecci\\u00f3n 1, 2, 3 y 4, propuestos de manera  consensuada con los pa\\u00edses del oeste de Sudam\\u00e9rica.\\r\\n- Propuesta metodol\\u00f3gica para la selecci\\u00f3n de modelos del CMIP6 para construcci\\u00f3n de escenarios de cambio clim\\u00e1tico para los pa\\u00edses del Oeste de Am\\u00e9rica del Sur.\\r\\n- Gu\\u00eda elaboraci\\u00f3n escenarios regionales de cambio clim\\u00e1tico.\\r\\n- Diapositivas de la presentaciones t\\u00e9cnica por los ponentes Guillermo Armenta y Jos\\u00e9 Daniel Pab\\u00f3n.\",\"tipo\":\"Metodolog\\u00edas\",\"tipo_id\":\"4\"}],\"servicios\":[],\"eventos\":[{\"ID\":\"77\",\"nombre\":\"Encuentro Nacional Volunclima - Ecuador\",\"resumen\":\"El encuentro dur\\u00f3 dos d\\u00edas, fue un espacio colaborativo y de trabajo con usuarios externos de la red.\",\"tipo\":\"Taller\",\"tipo_id\":\"12\",\"unico\":\"1\"},{\"ID\":\"52\",\"nombre\":\"Foro Regional de Perspectivas Clim\\u00e1ticas del Oeste de Sudam\\u00e9rica\",\"resumen\":\"Reuni\\u00f3n con los pa\\u00edses del OSA para revisar modelos clim\\u00e1ticos y perpectivas clim\\u00e1ticas de los pa\\u00edses. Se revisan avances en temas de sequ\\u00eda ENOS y otros acuerdos para el progreso y uni\\u00f3n en un modelo que sirva para la regi\\u00f3n.\",\"tipo\":\"Curso en l\\u00ednea\",\"tipo_id\":\"10\",\"unico\":\"0\"}]};\n        \n        \/\/ Configuraci\u00f3n de paginaci\u00f3n\n        let paginacionConfig = {\n            herramientas: { paginaActual: 1, itemsPorPagina: 10 },\n            rutinas: { paginaActual: 1, itemsPorPagina: 10 },\n            conjuntos: { paginaActual: 1, itemsPorPagina: 10 },\n            boletines: { paginaActual: 1, itemsPorPagina: 10 },\n            formaciones: { paginaActual: 1, itemsPorPagina: 10 },\n            publicaciones: { paginaActual: 1, itemsPorPagina: 10 },\n            servicios: { paginaActual: 1, itemsPorPagina: 10 },\n            eventos: { paginaActual: 1, itemsPorPagina: 10 }\n        };\n        \n        \/\/ Mostrar pesta\u00f1a\n        function mostrarTab(tabId) {\n            const categoria = tabId.replace('tab-', '');\n            \n            \/\/ Ocultar todos los contenidos\n            document.querySelectorAll('.cst-tab-content').forEach(content => {\n                content.classList.remove('active');\n            });\n            \n            \/\/ Desactivar todos los botones\n            document.querySelectorAll('.cst-tab-button').forEach(button => {\n                button.classList.remove('active');\n            });\n            \n            \/\/ Mostrar contenido seleccionado\n            document.getElementById(tabId).classList.add('active');\n            event.target.classList.add('active');\n            \n            \/\/ Renderizar tabla\n            renderizarTabla(categoria);\n        }\n        \n        \/\/ Renderizar tabla con paginaci\u00f3n\n        function renderizarTabla(categoria) {\n            const datos = datosCST[categoria];\n            const config = paginacionConfig[categoria];\n            const inicio = (config.paginaActual - 1) * config.itemsPorPagina;\n            const fin = inicio + config.itemsPorPagina;\n            const datosPagina = datos.slice(inicio, fin);\n            \n            let html = '';\n            \n            \/\/ Selector de items por p\u00e1gina\n            html += '<div class=\"cst-items-selector\">';\n            html += '<label>Mostrar:<\/label>';\n            html += '<select onchange=\"cambiarItemsPorPagina(\\'' + categoria + '\\', this.value)\">';\n            [5, 10, 20, 50, 100].forEach(num => {\n                html += '<option value=\"' + num + '\"' + (config.itemsPorPagina == num ? ' selected' : '') + '>' + num + '<\/option>';\n            });\n            html += '<\/select>';\n            html += ' <span>elementos por p\u00e1gina<\/span>';\n            html += '<\/div>';\n            \n            \/\/ Tabla\n            html += '<table class=\"cst-tabla\">';\n            \n            if (datosPagina.length === 0) {\n                html += '<tr><td colspan=\"2\" class=\"cst-sin-resultados\">No hay elementos para mostrar<\/td><\/tr>';\n            } else {\n                datosPagina.forEach(item => {\n                    html += '<tr>';\n                    html += '<td>';\n                    html += '<a href=\"' + obtenerURL(categoria, item) + '\">' + item.nombre + '<\/a>';\n                    if (item.tipo) {\n                        html += '<br><span class=\"cst-tipo\">' + item.tipo + '<\/span>';\n                    }\n                    html += '<p>' + (item.resumen || '') + '<\/p>';\n                    \n                    html += '<\/td>';\n                    html += '<\/tr>';\n                });\n            }\n            \n            html += '<\/table>';\n            \n            \/\/ Paginaci\u00f3n\n            if (datos.length > config.itemsPorPagina) {\n                html += generarPaginacion(categoria, datos.length);\n            }\n            \n            document.getElementById('tab-' + categoria).innerHTML = html;\n        }\n        \n        \/\/ Generar paginaci\u00f3n\n        function generarPaginacion(categoria, totalItems) {\n            const config = paginacionConfig[categoria];\n            const totalPaginas = Math.ceil(totalItems \/ config.itemsPorPagina);\n            \n            let html = '<div class=\"cst-paginacion\">';\n            \n            \/\/ Bot\u00f3n anterior\n            if (config.paginaActual > 1) {\n                html += '<button class=\"cst-pag-btn\" onclick=\"irPagina(\\'' + categoria + '\\', ' + (config.paginaActual - 1) + ')\">\u00ab Anterior<\/button>';\n            }\n            \n            \/\/ N\u00fameros de p\u00e1gina\n            let inicio = Math.max(1, config.paginaActual - 2);\n            let fin = Math.min(totalPaginas, inicio + 4);\n            inicio = Math.max(1, fin - 4);\n            \n            if (inicio > 1) {\n                html += '<button class=\"cst-pag-btn\" onclick=\"irPagina(\\'' + categoria + '\\', 1)\">1<\/button>';\n                if (inicio > 2) html += '<span>...<\/span>';\n            }\n            \n            for (let i = inicio; i <= fin; i++) {\n                html += '<button class=\"cst-pag-btn' + (i === config.paginaActual ? ' active' : '') + '\" onclick=\"irPagina(\\'' + categoria + '\\', ' + i + ')\">' + i + '<\/button>';\n            }\n            \n            if (fin < totalPaginas) {\n                if (fin < totalPaginas - 1) html += '<span>...<\/span>';\n                html += '<button class=\"cst-pag-btn\" onclick=\"irPagina(\\'' + categoria + '\\', ' + totalPaginas + ')\">' + totalPaginas + '<\/button>';\n            }\n            \n            \/\/ Bot\u00f3n siguiente\n            if (config.paginaActual < totalPaginas) {\n                html += '<button class=\"cst-pag-btn\" onclick=\"irPagina(\\'' + categoria + '\\', ' + (config.paginaActual + 1) + ')\">Siguiente \u00bb<\/button>';\n            }\n            \n            \/\/ Info\n            const mostrandoDesde = (config.paginaActual - 1) * config.itemsPorPagina + 1;\n            const mostrandoHasta = Math.min(config.paginaActual * config.itemsPorPagina, totalItems);\n            html += '<span class=\"cst-pag-info\">Mostrando ' + mostrandoDesde + '-' + mostrandoHasta + ' de ' + totalItems + '<\/span>';\n            \n            html += '<\/div>';\n            return html;\n        }\n        \n        \/\/ Ir a p\u00e1gina\n        function irPagina(categoria, pagina) {\n            paginacionConfig[categoria].paginaActual = pagina;\n            renderizarTabla(categoria);\n            document.getElementById('tab-' + categoria).scrollIntoView({ behavior: 'smooth', block: 'start' });\n        }\n        \n        \/\/ Cambiar items por p\u00e1gina\n        function cambiarItemsPorPagina(categoria, cantidad) {\n            paginacionConfig[categoria].itemsPorPagina = parseInt(cantidad);\n            paginacionConfig[categoria].paginaActual = 1;\n            renderizarTabla(categoria);\n        }\n        \n        \/\/ Obtener URL seg\u00fan categor\u00eda\n        function obtenerURL(categoria, item) {\n            const urls = {\n                herramientas: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-herramienta\/?id=' + item.ID + '&nombre=' + item.nombre,\n                rutinas: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-rutina\/?id=' + item.ID + '&nombre=' + item.nombre,\n                conjuntos: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-conjunto\/?id=' + item.ID + '&nombre=' + item.nombre,\n                boletines: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-boletin\/?id=' + item.ID + '&nombre=' + item.nombre,\n                formaciones: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-formacion\/?id=' + item.ID + '&nombre=' + item.nombre,\n                publicaciones: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-publicacion\/?id=' + item.ID + '&nombre=' + item.nombre,\n                servicios: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-servicio\/?id=' + item.ID + '&nombre=' + item.nombre,\n                eventos: item.unico == '1' \n                    ? 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-del-evento\/?id=' + item.ID + '&nombre=' + item.nombre + '&tipo=' + item.tipo + '&ocurrencia_id=0'\n                    : 'https:\/\/crc-osa.ciifen.org\/CST\/ocurrencias-eventos\/?id=' + item.ID + '&nombre=' + item.nombre + '&tipo=' + item.tipo\n            };\n            return urls[categoria] || '#';\n        }\n        \n        \/\/ Buscador global\n        function buscarEnRecopilacion() {\n            const termino = document.getElementById('cst-search-input').value.toLowerCase().trim();\n            \n            if (termino.length < 2) {\n                alert('Por favor ingresa al menos 2 caracteres para buscar');\n                return;\n            }\n            \n            let resultados = [];\n            let estadisticas = {};\n            \n            \/\/ Buscar en cada categor\u00eda\n            Object.keys(datosCST).forEach(categoria => {\n                let encontrados = 0;\n                datosCST[categoria].forEach(item => {\n                    const nombre = (item.nombre || '').toLowerCase();\n                    const resumen = (item.resumen || '').toLowerCase();\n                    const tipo = (item.tipo || '').toLowerCase();\n                    \n                    if (nombre.includes(termino) || resumen.includes(termino) || tipo.includes(termino)) {\n                        resultados.push({\n                            categoria: categoria,\n                            item: item\n                        });\n                        encontrados++;\n                    }\n                });\n                if (encontrados > 0) {\n                    estadisticas[categoria] = encontrados;\n                }\n            });\n            \n            mostrarResultados(resultados, estadisticas, termino);\n        }\n        \n        \/\/ Mostrar resultados\n        function mostrarResultados(resultados, estadisticas, termino) {\n            const contenedor = document.getElementById('cst-resultados-container');\n            const statsContainer = document.getElementById('cst-estadisticas');\n            \n            if (resultados.length === 0) {\n                contenedor.innerHTML = '<div class=\"cst-sin-resultados\">\ud83d\udd0d No se encontraron resultados para \"' + termino + '\"<\/div>';\n                contenedor.classList.add('visible');\n                statsContainer.classList.remove('visible');\n                return;\n            }\n            \n            \/\/ Mostrar estad\u00edsticas\n            let statsHTML = '<strong>Resultados por categor\u00eda:<\/strong><br>';\n            Object.keys(estadisticas).forEach(cat => {\n                const nombre = cat.charAt(0).toUpperCase() + cat.slice(1);\n                statsHTML += '<span class=\"cst-stats-item\">' + nombre + ': ' + estadisticas[cat] + '<\/span>';\n            });\n            statsContainer.innerHTML = statsHTML;\n            statsContainer.classList.add('visible');\n            \n            \/\/ Mostrar resultados\n            let html = '<div class=\"cst-resultado-header\">';\n            html += '\ud83d\udd0d Se encontraron <strong>' + resultados.length + '<\/strong> resultado(s) para \"<strong>' + termino + '<\/strong>\"';\n            html += '<\/div>';\n            \n            resultados.forEach(resultado => {\n                const item = resultado.item;\n                const catNombre = resultado.categoria.charAt(0).toUpperCase() + resultado.categoria.slice(1);\n                \n                html += '<div class=\"cst-resultado-item\">';\n                html += '<span class=\"cst-resultado-categoria\">' + catNombre + '<\/span>';\n                html += '<div class=\"cst-resultado-nombre\">';\n                html += '<a href=\"' + obtenerURL(resultado.categoria, item) + '\">' + item.nombre + '<\/a>';\n                html += '<\/div>';\n                if (item.tipo) {\n                    html += '<div class=\"cst-tipo\">' + item.tipo + '<\/div>';\n                }\n                if (item.resumen) {\n                    html += '<div class=\"cst-resultado-descripcion\">' + item.resumen + '<\/div>';\n                }\n                \n                html += '<\/div>';\n            });\n            \n            contenedor.innerHTML = html;\n            contenedor.classList.add('visible');\n            contenedor.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n        }\n        \n        \/\/ Limpiar b\u00fasqueda\n        function limpiarBusqueda() {\n            document.getElementById('cst-search-input').value = '';\n            document.getElementById('cst-resultados-container').classList.remove('visible');\n            document.getElementById('cst-resultados-container').innerHTML = '';\n            document.getElementById('cst-estadisticas').classList.remove('visible');\n        }\n        \n        \/\/ Inicializar al cargar\n        document.addEventListener('DOMContentLoaded', function() {\n            \/\/ Activar primera pesta\u00f1a\n            document.querySelector('.cst-tab-button').click();\n            \n            \/\/ Enter en b\u00fasqueda\n            document.getElementById('cst-search-input').addEventListener('keypress', function(e) {\n                if (e.key === 'Enter') {\n                    buscarEnRecopilacion();\n                }\n            });\n        });\n    <\/script><div class='cst-tabs'><div class='cst-buscador-global'><div class='cst-buscador-titulo'>\ud83d\udd0d Buscador Global de Recursos CST<\/div><div class='cst-buscador-input-container'><input type='text' id='cst-search-input' class='cst-buscador-input' placeholder='Buscar en todas las categor\u00edas (t\u00edtulos, descripciones, tipos)...' \/><button onclick='buscarEnRecopilacion()' class='cst-buscador-btn'>\ud83d\udd0d Buscar<\/button><button onclick='limpiarBusqueda()' class='cst-buscador-limpiar'>\u2716 Limpiar<\/button><\/div><div id='cst-estadisticas' class='cst-estadisticas'><\/div><\/div><div id='cst-resultados-container' class='cst-resultados-busqueda'><\/div><br><div class='cst-tab-buttons'><button class='cst-tab-button' onclick='mostrarTab(\"tab-herramientas\")'> Herramientas (4)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-rutinas\")'> Rutinas (2)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-conjuntos\")'> Conjuntos (1)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-boletines\")'> Boletines (3)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-formaciones\")'> Formaciones (4)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-publicaciones\")'> Publicaciones (10)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-servicios\")'> Servicios (0)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-eventos\")'> Eventos (2)<\/button><\/div><div id='tab-herramientas' class='cst-tab-content'><\/div><div id='tab-rutinas' class='cst-tab-content'><\/div><div id='tab-conjuntos' class='cst-tab-content'><\/div><div id='tab-boletines' class='cst-tab-content'><\/div><div id='tab-formaciones' class='cst-tab-content'><\/div><div id='tab-publicaciones' class='cst-tab-content'><\/div><div id='tab-servicios' class='cst-tab-content'><\/div><div id='tab-eventos' class='cst-tab-content'><\/div><\/div>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section][et_pb_section fb_built=\u00bb1&#8243; _builder_version=\u00bb4.16&#8243; _module_preset=\u00bbdefault\u00bb background_color=\u00bb#fcfcfc\u00bb custom_padding=\u00bb1px|||||\u00bb global_colors_info=\u00bb{}\u00bb][\/et_pb_section][et_pb_section fb_built=\u00bb1&#8243; fullwidth=\u00bbon\u00bb _builder_version=\u00bb4.23.1&#8243; _module_preset=\u00bbdefault\u00bb global_colors_info=\u00bb{}\u00bb][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cat\u00e1logo<style>\n        .cst-tabs {\n            width: 100%;\n            margin: 20px 0;\n        }\n        \n        \/* Buscador global *\/\n        .cst-buscador-global {\n            margin: 20px 0 30px 0;\n            padding: 25px;\n            background: linear-gradient(135deg, #156296 0%, #FFFFFF 100%);\n            border-radius: 15px;\n            box-shadow: 0 5px 20px rgba(0,0,0,0.3);\n        }\n        \n        .cst-buscador-titulo {\n            color: white;\n            font-size: 24px;\n            font-weight: bold;\n            margin-bottom: 20px;\n            text-align: center;\n            text-shadow: 2px 2px 4px rgba(0,0,0,0.2);\n        }\n        \n        .cst-buscador-input-container {\n            display: flex;\n            gap: 10px;\n            align-items: center;\n            flex-wrap: wrap;\n        }\n        \n        .cst-buscador-input {\n            flex: 1;\n            min-width: 250px;\n            padding: 14px 20px;\n            font-size: 16px;\n            border: none;\n            border-radius: 25px;\n            outline: none;\n            box-shadow: 0 3px 10px rgba(0,0,0,0.2);\n        }\n        \n        .cst-buscador-btn {\n            padding: 8px 35px;\n            background-color: #156296;\n            color: white;\n            border: none;\n            border-radius: 25px;\n            font-size: 16px;\n            font-weight: bold;\n            cursor: pointer;\n            transition: all 0.3s;\n            box-shadow: 0 3px 10px rgba(0,0,0,0.2);\n        }\n        \n        .cst-buscador-btn:hover {\n            background-color: #156296;\n            transform: translateY(-2px);\n            box-shadow: 0 5px 15px rgba(0,0,0,0.3);\n        }\n        \n        .cst-buscador-limpiar {\n            padding: 8px 35px;\n            background-color: #E81313;\n            color: white;\n            border: none;\n            border-radius: 25px;\n            font-size: 16px;\n            font-weight: bold;\n            cursor: pointer;\n            transition: all 0.3s;\n            box-shadow: 0 3px 10px rgba(0,0,0,0.2);\n        }\n        \n        .cst-buscador-limpiar:hover {\n            background-color: #E81313;\n            transform: translateY(-2px);\n            box-shadow: 0 5px 15px rgba(0,0,0,0.3);\n        }\n        \n        .cst-estadisticas {\n            margin-top: 15px;\n            padding: 15px;\n            background-color: rgba(255,255,255,0.9);\n            border-radius: 10px;\n            display: none;\n        }\n        \n        .cst-estadisticas.visible {\n            display: block;\n        }\n        \n        .cst-stats-item {\n            display: inline-block;\n            margin: 5px 10px;\n            padding: 8px 15px;\n            background-color: #3498db;\n            color: white;\n            border-radius: 20px;\n            font-size: 14px;\n            font-weight: bold;\n        }\n        \n        \/* Resultados de b\u00fasqueda *\/\n        .cst-resultados-busqueda {\n            margin-top: 20px;\n            padding: 20px;\n            background-color: #EBF0F5;\n            border: 2px solid #BED4E5;\n            border-radius: 10px;\n            display: none;\n        }\n        \n        .cst-resultados-busqueda.visible {\n            display: block;\n        }\n        \n        .cst-resultado-header {\n            font-size: 18px;\n            font-weight: bold;\n            margin-bottom: 15px;\n            color: #2c3e50;\n        }\n        \n        .cst-resultado-item {\n            padding: 15px;\n            margin: 10px 0;\n            background-color: white;\n            border-left: 4px solid #3498db;\n            border-radius: 5px;\n            box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n            transition: all 0.3s;\n        }\n        \n        .cst-resultado-item:hover {\n            transform: translateX(5px);\n            box-shadow: 0 4px 10px rgba(0,0,0,0.15);\n        }\n        \n        .cst-resultado-categoria {\n            display: inline-block;\n            background-color: #3498db;\n            color: white;\n            padding: 4px 12px;\n            border-radius: 15px;\n            font-size: 12px;\n            font-weight: bold;\n            margin-right: 10px;\n        }\n        \n        .cst-resultado-nombre {\n            font-weight: bold;\n            font-size: 16px;\n            color: #2c3e50;\n            margin: 5px 0;\n        }\n        \n        .cst-resultado-descripcion {\n            color: #555;\n            font-size: 14px;\n            text-align: justify;\n            margin-top: 8px;\n        }\n        \n        .cst-sin-resultados {\n            text-align: center;\n            padding: 30px;\n            color: #666;\n            font-size: 16px;\n            font-style: italic;\n        }\n        \n        \/* Pesta\u00f1as *\/\n        .cst-tab-buttons {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 10px;\n            margin-bottom: 20px;\n            border-bottom: 3px solid #3498db;\n            padding-bottom: 10px;\n        }\n        \n        .cst-tab-button {\n            padding: 12px 24px;\n            background-color: #ecf0f1;\n            border: none;\n            cursor: pointer;\n            font-size: 16px;\n            font-weight: bold;\n            border-radius: 8px 8px 0 0;\n            transition: all 0.3s;\n        }\n        \n        .cst-tab-button:hover {\n            background-color: #3498db;\n            color: white;\n        }\n        \n        .cst-tab-button.active {\n            background-color: #3498db;\n            color: white;\n        }\n        \n        .cst-tab-content {\n            display: none;\n            padding: 20px;\n            background-color: #ffffff;\n            border-radius: 5px;\n            box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n            min-height: 400px;\n        }\n        \n        .cst-tab-content.active {\n            display: block;\n        }\n        \n        \/* Tabla *\/\n        .cst-tabla {\n            width: 100%;\n            border-collapse: collapse;\n            margin-bottom: 20px;\n        }\n        \n        .cst-tabla td {\n            padding: 15px;\n            border-bottom: 1px solid #e0e0e0;\n            font-size: 14px;\n            line-height: 1.6;\n            vertical-align: top;\n        }\n        \n        .cst-tabla tr:hover {\n            background-color: #f5f5f5;\n        }\n        \n        .cst-tabla a {\n            font-weight: bold;\n            color: #2980b9;\n            text-decoration: none;\n            font-size: 14px;\n        }\n        \n        .cst-tabla a:hover {\n            color: #3498db;\n            text-decoration: underline;\n        }\n        \n        .cst-tabla p {\n            margin: 8px 0;\n            text-align: justify;\n            font-size: 14px;\n        }\n        \n        .cst-tipo {\n            color: #7f8c8d;\n            font-size: 13px;\n            font-style: italic;\n        }\n        \n        \/* Paginaci\u00f3n *\/\n        .cst-paginacion {\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            gap: 10px;\n            margin: 20px 0;\n            flex-wrap: wrap;\n        }\n        \n        .cst-pag-btn {\n            padding: 8px 15px;\n            background-color: #ecf0f1;\n            border: 1px solid #bdc3c7;\n            border-radius: 5px;\n            cursor: pointer;\n            transition: all 0.3s;\n            font-weight: bold;\n        }\n        \n        .cst-pag-btn:hover {\n            background-color: #3498db;\n            color: white;\n            border-color: #3498db;\n        }\n        \n        .cst-pag-btn.active {\n            background-color: #2980b9;\n            color: white;\n            border-color: #2980b9;\n        }\n        \n        .cst-pag-info {\n            padding: 8px 15px;\n            color: #555;\n            font-weight: bold;\n        }\n        \n        .cst-items-selector {\n            margin-bottom: 15px;\n            text-align: right;\n        }\n        \n        .cst-items-selector label {\n            margin-right: 10px;\n            font-weight: bold;\n            color: #555;\n        }\n        \n        .cst-items-selector select {\n            padding: 8px 15px;\n            border: 2px solid #3498db;\n            border-radius: 5px;\n            font-size: 14px;\n            cursor: pointer;\n        }\n        \n        \/* Responsive *\/\n        @media screen and (max-width: 768px) {\n            .cst-tab-button {\n                font-size: 14px;\n                padding: 10px 15px;\n            }\n            \n            .cst-buscador-input-container {\n                flex-direction: column;\n            }\n            \n            .cst-buscador-input,\n            .cst-buscador-btn,\n            .cst-buscador-limpiar {\n                width: 100%;\n            }\n            \n            .cst-tabla td {\n                font-size: 13px;\n                padding: 10px;\n            }\n            \n            .cst-items-selector {\n                text-align: center;\n            }\n        }\n    <\/style><script>\n        \/\/ Datos cargados desde PHP\n        const datosCST = {\"herramientas\":[{\"ID\":\"1\",\"nombre\":\"Generador de mapas de TSM\",\"resumen\":\"Generaci\\u00f3n autom\\u00e1tica de mapas de Temperatura Superficial del Mar (TSM). Con este generador, se puede elegir generar mapas diarios, semanales o mensuales, tanto para valores observados como de anomal\\u00edas. Tambi\\u00e9n se pueden elegir entre cuatro distintas regiones: Pac\\u00edfico ecuatorial, Pac\\u00edfico oriental, Atl\\u00e1ntico sur y Caribe.\",\"tipo\":\"Visores y mapas interactivos\",\"tipo_id\":\"3\"},{\"ID\":\"3\",\"nombre\":\"Herramienta de Acceso a Datos Grilladas\",\"resumen\":\"Esta herramienta permite la descarga de datos clim\\u00e1ticos e hidrol\\u00f3gicos de instituciones globales en formato r\\u00e1ster, forma parte del proyecto ENANDES y est\\u00e1 destinado a mejorar la capacidad de decisi\\u00f3n de Servicios Meteorol\\u00f3gicos e Hidrol\\u00f3gicos Nacionales (SMHN), investigadores, planificadores y el p\\u00fablico en general.\",\"tipo\":\"Plataforma web de productos y servicios clim\\u00e1ticos\",\"tipo_id\":\"2\"},{\"ID\":\"5\",\"nombre\":\"Plantilla - Comparaci\\u00f3n de pluviometr\\u00eda\",\"resumen\":\"Es una plantilla excel para comparar la precipitaci\\u00f3n entre dos estaciones.\",\"tipo\":\"Plantillas o scripts para an\\u00e1lisis\",\"tipo_id\":\"6\"},{\"ID\":\"6\",\"nombre\":\"Pron\\u00f3stico subestacional\",\"resumen\":\"Portal que brinda acceso a mapas de pron\\u00f3sticos subestacionales de precipitaci\\u00f3n semanal. Los pron\\u00f3sticos se basan en el ensamble de m\\u00faltiples modelos de pron\\u00f3sticos individuales que son calculados a trav\\u00e9s de la base de datos en tiempo real SubX\\\/SubC\",\"tipo\":\"Plataforma web de productos y servicios clim\\u00e1ticos\",\"tipo_id\":\"2\"}],\"rutinas\":[{\"ID\":\"6\",\"nombre\":\"Descarga datos del CMIP6 \",\"resumen\":\"El script permite optimizar la selecci\\u00f3n y descarga de modelos y escenarios de cambio clim\\u00e1tico en la regi\\u00f3n, los datos se descargan del CMIP6 (Proyecto de Intercomparaci\\u00f3n de Modelos Acoplados, fase 6), el script permite delimitar la zona con las coordenadas geogr\\u00e1ficas, seleccionar el modelo, el escenario, la variable clim\\u00e1tico, resoluci\\u00f3n temporal, y el rango de a\\u00f1os de datos requerido.\\r\\nEl script contiene listado los 4 modelos que mejor se adaptar a la regi\\u00f3n previamente estudiados.\",\"tipo\":\"Transferencia, conversi\\u00f3n y formateo de datos\",\"tipo_id\":\"2\"},{\"ID\":\"3\",\"nombre\":\"Generaci\\u00f3n de boletines de Volunclima\",\"resumen\":\"Rutinas para generar los boletines mensuales de la red Volunclima. Internamente cuenta con la funcionalidad para graficar datos, agregar valores diarios a mensuales, descargar datos de pron\\u00f3sticos de SEAS5 y plotear mapas.\",\"tipo\":\"Transferencia, conversi\\u00f3n y formateo de datos\",\"tipo_id\":\"2\"}],\"conjuntos\":[{\"ID\":\"3\",\"nombre\":\"Volunclima\",\"resumen\":\"Volunclima es una iniciativa de ciencia ciudadana gestionada por CIIFEN. Es una red de observadores voluntarios cuyos miembros colaboran con el reporte de las precipitaciones diarias, la percepci\\u00f3n de impactos de la sequ\\u00eda y la ocurrencia de eventos hidrometeorol\\u00f3gicos extremos en un punto fijo (estaci\\u00f3n) ubicados en zonas donde primordialmente los servicios meteorol\\u00f3gicos nacionales no cuentan con redes de monitoreo. Los miembros de la red Volunclima env\\u00edan reportes desde varias localidades de Venezuela, Colombia, Ecuador, Bolivia y Chile.\",\"tipo\":\"Observaciones y monitoreo \",\"tipo_id\":\"3\"}],\"boletines\":[{\"ID\":\"36\",\"nombre\":\"Bolet\\u00edn de Sequ\\u00eda para el Oeste de Sudam\\u00e9rica\",\"resumen\":\"Bolet\\u00edn de seguimiento de la sequ\\u00eda que se genera a partir del monitor regional de sequ\\u00edas del Oeste de Sudam\\u00e9rica.\",\"tema_id\":\"60\"},{\"ID\":\"75\",\"nombre\":\"Bolet\\u00edn ENANDES\",\"resumen\":\"Los boletines exponen los avances y resultados de todos los socios del proyecto ENANDES \",\"tema_id\":\"66\"},{\"ID\":\"76\",\"nombre\":\"Boletines de pron\\u00f3sticos estacional del OSA\",\"resumen\":\"Este bolet\\u00edn se elabora a partir de los aportes de los Servicios Meteorol\\u00f3gicos e Hidrol\\u00f3gicos Nacionales de Bolivia, Chile, Colombia, Ecuador, Per\\u00fa y Venezuela, quienes generan pron\\u00f3sticos estacionales mediante m\\u00e9todos estad\\u00edsticos basados en datos observados en sus estaciones meteorol\\u00f3gicas. El bolet\\u00edn presenta informaci\\u00f3n sobre las principales variables clim\\u00e1ticas de inter\\u00e9s para la regi\\u00f3n: la temperatura del aire y la precipitaci\\u00f3n.\",\"tema_id\":\"53\"}],\"formaciones\":[{\"ID\":\"39\",\"nombre\":\"Capacitaci\\u00f3n en umbrales de sequ\\u00edas - Proyecto ENANDES+    CIIFEN\\\/CRC-OSA \\u2013 CRC-SAS \\u2013 MeteoSwiss\",\"resumen\":\"Se present\\u00f3 una introducci\\u00f3n a los umbrales de sequ\\u00eda y ejemplos de aplicaci\\u00f3n de umbrales relacionados a impactos de sequ\\u00eda en la regi\\u00f3n\",\"tipo\":\"Servicios clim\\u00e1ticos y toma de decisiones\",\"tipo_id\":\"8\"},{\"ID\":\"37\",\"nombre\":\"Capacitaci\\u00f3n sobre el monitoreo y la gesti\\u00f3n de la sequ\\u00eda del proyecto ENANDES+    CIIFEN\\\/CRC-OSA \\u2013 CRC-SAS \\u2013 MeteoSwiss\",\"resumen\":\"La capacitaci\\u00f3n se realiz\\u00f3 los d\\u00edas 3 septiembre y 10 diciembre del 2024 sobre estrategias de monitoreo de la sequ\\u00eda, el uso del monitor para el monitoreo y la gesti\\u00f3n de las sequ\\u00edas en la planificaci\\u00f3n de diferentes sectores productivos. \",\"tipo\":\"Servicios clim\\u00e1ticos y toma de decisiones\",\"tipo_id\":\"8\"},{\"ID\":\"38\",\"nombre\":\"Capacitaci\\u00f3n sobre escenarios de sequ\\u00eda del proyecto ENANDES+    CIIFEN\\\/CRC-OSA \\u2013 CRC-SAS \\u2013 MeteoSwiss\",\"resumen\":\"Se comparti\\u00f3 experiencias internacionales para la construcci\\u00f3n de escenarios de sequ\\u00edas y se trabaj\\u00f3 en grupo para la construcci\\u00f3n de una hoja de ruta inicial para la construcci\\u00f3n de escenarios de sequ\\u00edas por pa\\u00eds.\",\"tipo\":\"Servicios clim\\u00e1ticos y toma de decisiones\",\"tipo_id\":\"8\"},{\"ID\":\"36\",\"nombre\":\"Curso virtual de formaci\\u00f3n sobre an\\u00e1lisis y visualizaci\\u00f3n de datos hidrometeorol\\u00f3gicos con Python \",\"resumen\":\"Este curso se realiz\\u00f3 el 12 y 26 de noviembre y 03 de diciembre de 2024 a los SHMN relacionados al proyecto ENANDES.\",\"tipo\":\"Herramientas y analisis de datos clim\\u00e1ticos\",\"tipo_id\":\"7\"}],\"publicaciones\":[{\"ID\":\"16\",\"nombre\":\"Consejos para el registro de datos\",\"resumen\":\"Manual de consejos para observadores sobre tomar la lectura del pluvi\\u00f3metro, registro de datos y clasificaci\\u00f3n de lluvias.\",\"tipo\":\"Manuales y gu\\u00edas\",\"tipo_id\":\"1\"},{\"ID\":\"31\",\"nombre\":\"Est\\u00e1ndares de codificaci\\u00f3n y documentaci\\u00f3n\",\"resumen\":\"El archivo comprimido contiene archivos editables:\\r\\nUn archivos de documentaci\\u00f3n y un archivo de codificaci\\u00f3n, dentro de la carpeta Elementos del est\\u00e1ndar de documentaci\\u00f3n ENANDES+ hay 13 archivos.\",\"tipo\":\"Documentaci\\u00f3n de software o plataformas\",\"tipo_id\":\"10\"},{\"ID\":\"27\",\"nombre\":\"Gu\\u00eda del sistema de pron\\u00f3sticos subestacionales del Proyecto ENANDES\",\"resumen\":\"Est\\u00e1 escrito de manera que los propios pronosticadores de los Servicios Meteorol\\u00f3gicos e Hidrol\\u00f3gicos socios del Proyecto ENANDES puedan usarlo como manual de consulta r\\u00e1pida en las actividades diarias relacionadas. Adicionalmente, durante la escritura se ha hecho \\u00e9nfasis en que pueda servir como documento base para entrenar a nuevas generaciones de pronosticadores que deseen usar este sistema.\",\"tipo\":\"Manuales y gu\\u00edas\",\"tipo_id\":\"1\"},{\"ID\":\"32\",\"nombre\":\"Guidelines to enable operational production of objective seasonal forecasts in South America subregions\",\"resumen\":\"El documento recoge las fortalezas y necesidades del CRC-OSA y el CRC-SAS, y entre las principales conclusiones se resalta la urgencia de fortalecer la infraestructura y las capacidades t\\u00e9cnicas. Asimismo, se subraya la importancia de mejorar la colaboraci\\u00f3n entre los Servicios Meteorol\\u00f3gicos e Hidrol\\u00f3gicos Nacionales con actores de otros sectores clave para optimizar la toma de decisiones y la gesti\\u00f3n de riesgos clim\\u00e1ticos.\",\"tipo\":\"Manuales y gu\\u00edas\",\"tipo_id\":\"1\"},{\"ID\":\"18\",\"nombre\":\"Manual de uso de la aplicaci\\u00f3n m\\u00f3vil para observadores\",\"resumen\":\"Manual para el uso de la aplicaci\\u00f3n m\\u00f3vil orientado para observadores de la red Volunclima. En el manual se encuentra como se usa la aplicaci\\u00f3n, como se registran los datos, como se llenan las encuestas y se reportan los eventos extremos y m\\u00e1s informaci\\u00f3n importante para los observadores.\",\"tipo\":\"Manuales y gu\\u00edas\",\"tipo_id\":\"1\"},{\"ID\":\"19\",\"nombre\":\"Manual de uso de la plataforma web para observadores\",\"resumen\":\"Manual para el uso de la plataforma web orientado para observadores de la red Volunclima. En el manual se encuentra como se usa la plataforma web, como se registran los datos, como se llenan las encuestas y se reportan los eventos extremos, como se pueden revisar los datos de las estaciones de la red y m\\u00e1s informaci\\u00f3n importante para los observadores.\",\"tipo\":\"Manuales y gu\\u00edas\",\"tipo_id\":\"1\"},{\"ID\":\"21\",\"nombre\":\"Nota T\\u00e9cnica 2. Monitor y Bolet\\u00edn regional de sequ\\u00edas del Oeste de Sudam\\u00e9rica\",\"resumen\":\"Nota t\\u00e9cnica sobre el desarrollo e implementaci\\u00f3n de un monitor de sequias regional para el OSA con su respectivo bolet\\u00edn. El documento contiene informaci\\u00f3n sobre: \\r\\n- La diferencia entre un monitor nacional y regional de sequ\\u00eda\\r\\n- Metodolog\\u00eda para contar con el Monitor Regional y su respectivo Bolet\\u00edn.\\r\\n- Estado actual del desarrollo del monitor regional de sequ\\u00eda para el OSA\\r\\n- El Protocolo sobre discusi\\u00f3n de la condici\\u00f3n de la sequ\\u00eda en las fronteras nacionales.\\r\\n- El Boletin regional de sequ\\u00edas.\",\"tipo\":\"Metodolog\\u00edas\",\"tipo_id\":\"4\"},{\"ID\":\"22\",\"nombre\":\"Nota T\\u00e9cnica 3. Umbrales de sequ\\u00eda para el sector energ\\u00e9tico\",\"resumen\":\"Determinaci\\u00f3n de los umbrales de sequ\\u00eda para los sectores el\\u00e9ctrico y de recursos h\\u00eddricos. El documento contine informaci\\u00f3n para la implementaci\\u00f3n de una metodolog\\u00eda para determinar los umbrales de sequ\\u00eda para el sector el\\u00e9ctrico y recursos h\\u00eddricos para los pa\\u00edses del OSA, y un protocolo sugerido para la implementaci\\u00f3n de los umbrales de sequ\\u00eda en el marco de la gesti\\u00f3n de riesgos por sequ\\u00eda.\",\"tipo\":\"Metodolog\\u00edas\",\"tipo_id\":\"4\"},{\"ID\":\"24\",\"nombre\":\"Nota T\\u00e9cnica 4. Hoja de ruta para la formulaci\\u00f3n del monitor de sequ\\u00eda de Sudam\\u00e9rica\",\"resumen\":\"Hoja de Ruta para la formulaci\\u00f3n del monitor de sequ\\u00eda de Sudam\\u00e9rica. Se presentan alternativas para crear un solo monitor para Sudam\\u00e9rica, adem\\u00e1s de una Hoja de Ruta sugerida para la formulaci\\u00f3n del monitor de sequ\\u00eda de Sudam\\u00e9rica y un Cronograma de trabajo lograr crear un monitor que una el monitor de sequ\\u00edas del Oeste de Sudam\\u00e9rica, del Sur de Sudam\\u00e9rica y del Caribe integrando (Suriname, Guayana y Guayana Francesa).\",\"tipo\":\"Estrategias y planes de acci\\u00f3n\",\"tipo_id\":\"3\"},{\"ID\":\"20\",\"nombre\":\"Selecci\\u00f3n y priorizaci\\u00f3n de modelos CMIP6 para la elaboraci\\u00f3n de escenarios regionales de cambio clim\\u00e1tico en los pa\\u00edses ENANDES+\",\"resumen\":\"El siguiente archivo tiene comprimido los siguientes archivos:\\r\\n- Listado de modelos del CMIP6 que cumplen con los criterios de selecci\\u00f3n 1, 2, 3 y 4, propuestos de manera  consensuada con los pa\\u00edses del oeste de Sudam\\u00e9rica.\\r\\n- Propuesta metodol\\u00f3gica para la selecci\\u00f3n de modelos del CMIP6 para construcci\\u00f3n de escenarios de cambio clim\\u00e1tico para los pa\\u00edses del Oeste de Am\\u00e9rica del Sur.\\r\\n- Gu\\u00eda elaboraci\\u00f3n escenarios regionales de cambio clim\\u00e1tico.\\r\\n- Diapositivas de la presentaciones t\\u00e9cnica por los ponentes Guillermo Armenta y Jos\\u00e9 Daniel Pab\\u00f3n.\",\"tipo\":\"Metodolog\\u00edas\",\"tipo_id\":\"4\"}],\"servicios\":[],\"eventos\":[{\"ID\":\"77\",\"nombre\":\"Encuentro Nacional Volunclima - Ecuador\",\"resumen\":\"El encuentro dur\\u00f3 dos d\\u00edas, fue un espacio colaborativo y de trabajo con usuarios externos de la red.\",\"tipo\":\"Taller\",\"tipo_id\":\"12\",\"unico\":\"1\"},{\"ID\":\"52\",\"nombre\":\"Foro Regional de Perspectivas Clim\\u00e1ticas del Oeste de Sudam\\u00e9rica\",\"resumen\":\"Reuni\\u00f3n con los pa\\u00edses del OSA para revisar modelos clim\\u00e1ticos y perpectivas clim\\u00e1ticas de los pa\\u00edses. Se revisan avances en temas de sequ\\u00eda ENOS y otros acuerdos para el progreso y uni\\u00f3n en un modelo que sirva para la regi\\u00f3n.\",\"tipo\":\"Curso en l\\u00ednea\",\"tipo_id\":\"10\",\"unico\":\"0\"}]};\n        \n        \/\/ Configuraci\u00f3n de paginaci\u00f3n\n        let paginacionConfig = {\n            herramientas: { paginaActual: 1, itemsPorPagina: 10 },\n            rutinas: { paginaActual: 1, itemsPorPagina: 10 },\n            conjuntos: { paginaActual: 1, itemsPorPagina: 10 },\n            boletines: { paginaActual: 1, itemsPorPagina: 10 },\n            formaciones: { paginaActual: 1, itemsPorPagina: 10 },\n            publicaciones: { paginaActual: 1, itemsPorPagina: 10 },\n            servicios: { paginaActual: 1, itemsPorPagina: 10 },\n            eventos: { paginaActual: 1, itemsPorPagina: 10 }\n        };\n        \n        \/\/ Mostrar pesta\u00f1a\n        function mostrarTab(tabId) {\n            const categoria = tabId.replace('tab-', '');\n            \n            \/\/ Ocultar todos los contenidos\n            document.querySelectorAll('.cst-tab-content').forEach(content => {\n                content.classList.remove('active');\n            });\n            \n            \/\/ Desactivar todos los botones\n            document.querySelectorAll('.cst-tab-button').forEach(button => {\n                button.classList.remove('active');\n            });\n            \n            \/\/ Mostrar contenido seleccionado\n            document.getElementById(tabId).classList.add('active');\n            event.target.classList.add('active');\n            \n            \/\/ Renderizar tabla\n            renderizarTabla(categoria);\n        }\n        \n        \/\/ Renderizar tabla con paginaci\u00f3n\n        function renderizarTabla(categoria) {\n            const datos = datosCST[categoria];\n            const config = paginacionConfig[categoria];\n            const inicio = (config.paginaActual - 1) * config.itemsPorPagina;\n            const fin = inicio + config.itemsPorPagina;\n            const datosPagina = datos.slice(inicio, fin);\n            \n            let html = '';\n            \n            \/\/ Selector de items por p\u00e1gina\n            html += '<div class=\"cst-items-selector\">';\n            html += '<label>Mostrar:<\/label>';\n            html += '<select onchange=\"cambiarItemsPorPagina(\\'' + categoria + '\\', this.value)\">';\n            [5, 10, 20, 50, 100].forEach(num => {\n                html += '<option value=\"' + num + '\"' + (config.itemsPorPagina == num ? ' selected' : '') + '>' + num + '<\/option>';\n            });\n            html += '<\/select>';\n            html += ' <span>elementos por p\u00e1gina<\/span>';\n            html += '<\/div>';\n            \n            \/\/ Tabla\n            html += '<table class=\"cst-tabla\">';\n            \n            if (datosPagina.length === 0) {\n                html += '<tr><td colspan=\"2\" class=\"cst-sin-resultados\">No hay elementos para mostrar<\/td><\/tr>';\n            } else {\n                datosPagina.forEach(item => {\n                    html += '<tr>';\n                    html += '<td>';\n                    html += '<a href=\"' + obtenerURL(categoria, item) + '\">' + item.nombre + '<\/a>';\n                    if (item.tipo) {\n                        html += '<br><span class=\"cst-tipo\">' + item.tipo + '<\/span>';\n                    }\n                    html += '<p>' + (item.resumen || '') + '<\/p>';\n                    \n                    html += '<\/td>';\n                    html += '<\/tr>';\n                });\n            }\n            \n            html += '<\/table>';\n            \n            \/\/ Paginaci\u00f3n\n            if (datos.length > config.itemsPorPagina) {\n                html += generarPaginacion(categoria, datos.length);\n            }\n            \n            document.getElementById('tab-' + categoria).innerHTML = html;\n        }\n        \n        \/\/ Generar paginaci\u00f3n\n        function generarPaginacion(categoria, totalItems) {\n            const config = paginacionConfig[categoria];\n            const totalPaginas = Math.ceil(totalItems \/ config.itemsPorPagina);\n            \n            let html = '<div class=\"cst-paginacion\">';\n            \n            \/\/ Bot\u00f3n anterior\n            if (config.paginaActual > 1) {\n                html += '<button class=\"cst-pag-btn\" onclick=\"irPagina(\\'' + categoria + '\\', ' + (config.paginaActual - 1) + ')\">\u00ab Anterior<\/button>';\n            }\n            \n            \/\/ N\u00fameros de p\u00e1gina\n            let inicio = Math.max(1, config.paginaActual - 2);\n            let fin = Math.min(totalPaginas, inicio + 4);\n            inicio = Math.max(1, fin - 4);\n            \n            if (inicio > 1) {\n                html += '<button class=\"cst-pag-btn\" onclick=\"irPagina(\\'' + categoria + '\\', 1)\">1<\/button>';\n                if (inicio > 2) html += '<span>...<\/span>';\n            }\n            \n            for (let i = inicio; i <= fin; i++) {\n                html += '<button class=\"cst-pag-btn' + (i === config.paginaActual ? ' active' : '') + '\" onclick=\"irPagina(\\'' + categoria + '\\', ' + i + ')\">' + i + '<\/button>';\n            }\n            \n            if (fin < totalPaginas) {\n                if (fin < totalPaginas - 1) html += '<span>...<\/span>';\n                html += '<button class=\"cst-pag-btn\" onclick=\"irPagina(\\'' + categoria + '\\', ' + totalPaginas + ')\">' + totalPaginas + '<\/button>';\n            }\n            \n            \/\/ Bot\u00f3n siguiente\n            if (config.paginaActual < totalPaginas) {\n                html += '<button class=\"cst-pag-btn\" onclick=\"irPagina(\\'' + categoria + '\\', ' + (config.paginaActual + 1) + ')\">Siguiente \u00bb<\/button>';\n            }\n            \n            \/\/ Info\n            const mostrandoDesde = (config.paginaActual - 1) * config.itemsPorPagina + 1;\n            const mostrandoHasta = Math.min(config.paginaActual * config.itemsPorPagina, totalItems);\n            html += '<span class=\"cst-pag-info\">Mostrando ' + mostrandoDesde + '-' + mostrandoHasta + ' de ' + totalItems + '<\/span>';\n            \n            html += '<\/div>';\n            return html;\n        }\n        \n        \/\/ Ir a p\u00e1gina\n        function irPagina(categoria, pagina) {\n            paginacionConfig[categoria].paginaActual = pagina;\n            renderizarTabla(categoria);\n            document.getElementById('tab-' + categoria).scrollIntoView({ behavior: 'smooth', block: 'start' });\n        }\n        \n        \/\/ Cambiar items por p\u00e1gina\n        function cambiarItemsPorPagina(categoria, cantidad) {\n            paginacionConfig[categoria].itemsPorPagina = parseInt(cantidad);\n            paginacionConfig[categoria].paginaActual = 1;\n            renderizarTabla(categoria);\n        }\n        \n        \/\/ Obtener URL seg\u00fan categor\u00eda\n        function obtenerURL(categoria, item) {\n            const urls = {\n                herramientas: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-herramienta\/?id=' + item.ID + '&nombre=' + item.nombre,\n                rutinas: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-rutina\/?id=' + item.ID + '&nombre=' + item.nombre,\n                conjuntos: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-conjunto\/?id=' + item.ID + '&nombre=' + item.nombre,\n                boletines: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-boletin\/?id=' + item.ID + '&nombre=' + item.nombre,\n                formaciones: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-formacion\/?id=' + item.ID + '&nombre=' + item.nombre,\n                publicaciones: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-publicacion\/?id=' + item.ID + '&nombre=' + item.nombre,\n                servicios: 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-de-servicio\/?id=' + item.ID + '&nombre=' + item.nombre,\n                eventos: item.unico == '1' \n                    ? 'https:\/\/crc-osa.ciifen.org\/CST\/ficha-del-evento\/?id=' + item.ID + '&nombre=' + item.nombre + '&tipo=' + item.tipo + '&ocurrencia_id=0'\n                    : 'https:\/\/crc-osa.ciifen.org\/CST\/ocurrencias-eventos\/?id=' + item.ID + '&nombre=' + item.nombre + '&tipo=' + item.tipo\n            };\n            return urls[categoria] || '#';\n        }\n        \n        \/\/ Buscador global\n        function buscarEnRecopilacion() {\n            const termino = document.getElementById('cst-search-input').value.toLowerCase().trim();\n            \n            if (termino.length < 2) {\n                alert('Por favor ingresa al menos 2 caracteres para buscar');\n                return;\n            }\n            \n            let resultados = [];\n            let estadisticas = {};\n            \n            \/\/ Buscar en cada categor\u00eda\n            Object.keys(datosCST).forEach(categoria => {\n                let encontrados = 0;\n                datosCST[categoria].forEach(item => {\n                    const nombre = (item.nombre || '').toLowerCase();\n                    const resumen = (item.resumen || '').toLowerCase();\n                    const tipo = (item.tipo || '').toLowerCase();\n                    \n                    if (nombre.includes(termino) || resumen.includes(termino) || tipo.includes(termino)) {\n                        resultados.push({\n                            categoria: categoria,\n                            item: item\n                        });\n                        encontrados++;\n                    }\n                });\n                if (encontrados > 0) {\n                    estadisticas[categoria] = encontrados;\n                }\n            });\n            \n            mostrarResultados(resultados, estadisticas, termino);\n        }\n        \n        \/\/ Mostrar resultados\n        function mostrarResultados(resultados, estadisticas, termino) {\n            const contenedor = document.getElementById('cst-resultados-container');\n            const statsContainer = document.getElementById('cst-estadisticas');\n            \n            if (resultados.length === 0) {\n                contenedor.innerHTML = '<div class=\"cst-sin-resultados\">\ud83d\udd0d No se encontraron resultados para \"' + termino + '\"<\/div>';\n                contenedor.classList.add('visible');\n                statsContainer.classList.remove('visible');\n                return;\n            }\n            \n            \/\/ Mostrar estad\u00edsticas\n            let statsHTML = '<strong>Resultados por categor\u00eda:<\/strong><br>';\n            Object.keys(estadisticas).forEach(cat => {\n                const nombre = cat.charAt(0).toUpperCase() + cat.slice(1);\n                statsHTML += '<span class=\"cst-stats-item\">' + nombre + ': ' + estadisticas[cat] + '<\/span>';\n            });\n            statsContainer.innerHTML = statsHTML;\n            statsContainer.classList.add('visible');\n            \n            \/\/ Mostrar resultados\n            let html = '<div class=\"cst-resultado-header\">';\n            html += '\ud83d\udd0d Se encontraron <strong>' + resultados.length + '<\/strong> resultado(s) para \"<strong>' + termino + '<\/strong>\"';\n            html += '<\/div>';\n            \n            resultados.forEach(resultado => {\n                const item = resultado.item;\n                const catNombre = resultado.categoria.charAt(0).toUpperCase() + resultado.categoria.slice(1);\n                \n                html += '<div class=\"cst-resultado-item\">';\n                html += '<span class=\"cst-resultado-categoria\">' + catNombre + '<\/span>';\n                html += '<div class=\"cst-resultado-nombre\">';\n                html += '<a href=\"' + obtenerURL(resultado.categoria, item) + '\">' + item.nombre + '<\/a>';\n                html += '<\/div>';\n                if (item.tipo) {\n                    html += '<div class=\"cst-tipo\">' + item.tipo + '<\/div>';\n                }\n                if (item.resumen) {\n                    html += '<div class=\"cst-resultado-descripcion\">' + item.resumen + '<\/div>';\n                }\n                \n                html += '<\/div>';\n            });\n            \n            contenedor.innerHTML = html;\n            contenedor.classList.add('visible');\n            contenedor.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n        }\n        \n        \/\/ Limpiar b\u00fasqueda\n        function limpiarBusqueda() {\n            document.getElementById('cst-search-input').value = '';\n            document.getElementById('cst-resultados-container').classList.remove('visible');\n            document.getElementById('cst-resultados-container').innerHTML = '';\n            document.getElementById('cst-estadisticas').classList.remove('visible');\n        }\n        \n        \/\/ Inicializar al cargar\n        document.addEventListener('DOMContentLoaded', function() {\n            \/\/ Activar primera pesta\u00f1a\n            document.querySelector('.cst-tab-button').click();\n            \n            \/\/ Enter en b\u00fasqueda\n            document.getElementById('cst-search-input').addEventListener('keypress', function(e) {\n                if (e.key === 'Enter') {\n                    buscarEnRecopilacion();\n                }\n            });\n        });\n    <\/script><div class='cst-tabs'><div class='cst-buscador-global'><div class='cst-buscador-titulo'>\ud83d\udd0d Buscador Global de Recursos CST<\/div><div class='cst-buscador-input-container'><input type='text' id='cst-search-input' class='cst-buscador-input' placeholder='Buscar en todas las categor\u00edas (t\u00edtulos, descripciones, tipos)...' \/><button onclick='buscarEnRecopilacion()' class='cst-buscador-btn'>\ud83d\udd0d Buscar<\/button><button onclick='limpiarBusqueda()' class='cst-buscador-limpiar'>\u2716 Limpiar<\/button><\/div><div id='cst-estadisticas' class='cst-estadisticas'><\/div><\/div><div id='cst-resultados-container' class='cst-resultados-busqueda'><\/div><br><div class='cst-tab-buttons'><button class='cst-tab-button' onclick='mostrarTab(\"tab-herramientas\")'> Herramientas (4)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-rutinas\")'> Rutinas (2)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-conjuntos\")'> Conjuntos (1)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-boletines\")'> Boletines (3)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-formaciones\")'> Formaciones (4)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-publicaciones\")'> Publicaciones (10)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-servicios\")'> Servicios (0)<\/button><button class='cst-tab-button' onclick='mostrarTab(\"tab-eventos\")'> Eventos (2)<\/button><\/div><div id='tab-herramientas' class='cst-tab-content'><\/div><div id='tab-rutinas' class='cst-tab-content'><\/div><div id='tab-conjuntos' class='cst-tab-content'><\/div><div id='tab-boletines' class='cst-tab-content'><\/div><div id='tab-formaciones' class='cst-tab-content'><\/div><div id='tab-publicaciones' class='cst-tab-content'><\/div><div id='tab-servicios' class='cst-tab-content'><\/div><div id='tab-eventos' class='cst-tab-content'><\/div><\/div><\/p>\n","protected":false},"author":6,"featured_media":0,"parent":0,"menu_order":36,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"_links":{"self":[{"href":"https:\/\/crc-osa.ciifen.org\/CST\/cst\/wp-json\/wp\/v2\/pages\/8224"}],"collection":[{"href":"https:\/\/crc-osa.ciifen.org\/CST\/cst\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/crc-osa.ciifen.org\/CST\/cst\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/crc-osa.ciifen.org\/CST\/cst\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/crc-osa.ciifen.org\/CST\/cst\/wp-json\/wp\/v2\/comments?post=8224"}],"version-history":[{"count":5,"href":"https:\/\/crc-osa.ciifen.org\/CST\/cst\/wp-json\/wp\/v2\/pages\/8224\/revisions"}],"predecessor-version":[{"id":8232,"href":"https:\/\/crc-osa.ciifen.org\/CST\/cst\/wp-json\/wp\/v2\/pages\/8224\/revisions\/8232"}],"wp:attachment":[{"href":"https:\/\/crc-osa.ciifen.org\/CST\/cst\/wp-json\/wp\/v2\/media?parent=8224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}