{"id":1037,"date":"2020-04-29T13:03:07","date_gmt":"2020-04-29T13:03:07","guid":{"rendered":"https:\/\/ld-wp73.template-help.com\/wordpress\/prod_11340\/v3\/?page_id=1037"},"modified":"2026-07-10T08:53:13","modified_gmt":"2026-07-10T14:53:13","slug":"usuario-financiero","status":"publish","type":"page","link":"https:\/\/fundacioncovelo.hn\/master\/usuario-financiero\/","title":{"rendered":"Atencion al Usuario Financiero"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1037\" class=\"elementor elementor-1037\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-57f2c55 elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"57f2c55\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;jet_parallax_layout_list&quot;:[{&quot;jet_parallax_layout_image&quot;:{&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;size&quot;:&quot;&quot;},&quot;_id&quot;:&quot;1dd87e4&quot;,&quot;jet_parallax_layout_image_tablet&quot;:{&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;size&quot;:&quot;&quot;},&quot;jet_parallax_layout_image_mobile&quot;:{&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;size&quot;:&quot;&quot;},&quot;jet_parallax_layout_speed&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:50,&quot;sizes&quot;:[]},&quot;jet_parallax_layout_type&quot;:&quot;scroll&quot;,&quot;jet_parallax_layout_direction&quot;:&quot;1&quot;,&quot;jet_parallax_layout_fx_direction&quot;:null,&quot;jet_parallax_layout_z_index&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_x&quot;:50,&quot;jet_parallax_layout_bg_x_tablet&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_x_mobile&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_y&quot;:50,&quot;jet_parallax_layout_bg_y_tablet&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_y_mobile&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_size&quot;:&quot;auto&quot;,&quot;jet_parallax_layout_bg_size_tablet&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_size_mobile&quot;:&quot;&quot;,&quot;jet_parallax_layout_animation_prop&quot;:&quot;transform&quot;,&quot;jet_parallax_layout_on&quot;:[&quot;desktop&quot;,&quot;tablet&quot;]}]}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-485bfc0\" data-id=\"485bfc0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-55f63a0 elementor-widget elementor-widget-text-editor\" data-id=\"55f63a0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\tWe help our clients discover and take advantage of any investment opportunity. Though&#8230;\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-0433e40 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"0433e40\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;jet_parallax_layout_list&quot;:[{&quot;jet_parallax_layout_image&quot;:{&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;size&quot;:&quot;&quot;},&quot;_id&quot;:&quot;097adb5&quot;,&quot;jet_parallax_layout_image_tablet&quot;:{&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;size&quot;:&quot;&quot;},&quot;jet_parallax_layout_image_mobile&quot;:{&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;size&quot;:&quot;&quot;},&quot;jet_parallax_layout_speed&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:50,&quot;sizes&quot;:[]},&quot;jet_parallax_layout_type&quot;:&quot;scroll&quot;,&quot;jet_parallax_layout_direction&quot;:&quot;1&quot;,&quot;jet_parallax_layout_fx_direction&quot;:null,&quot;jet_parallax_layout_z_index&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_x&quot;:50,&quot;jet_parallax_layout_bg_x_tablet&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_x_mobile&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_y&quot;:50,&quot;jet_parallax_layout_bg_y_tablet&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_y_mobile&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_size&quot;:&quot;auto&quot;,&quot;jet_parallax_layout_bg_size_tablet&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_size_mobile&quot;:&quot;&quot;,&quot;jet_parallax_layout_animation_prop&quot;:&quot;transform&quot;,&quot;jet_parallax_layout_on&quot;:[&quot;desktop&quot;,&quot;tablet&quot;]}]}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-02f6ba1\" data-id=\"02f6ba1\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-70ac6d2 elementor-widget elementor-widget-html\" data-id=\"70ac6d2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\r\n  \/* ========== CSS Custom Properties ========== *\/\r\n  :root {\r\n    --rc-primary: #1C0E66;\r\n    --rc-primary-hover: #199178;\r\n    --rc-primary-light: #eff6ff;\r\n    --rc-success: #16a34a;\r\n    --rc-success-light: #f0fdf4;\r\n    --rc-error: #dc2626;\r\n    --rc-error-light: #fef2f2;\r\n    --rc-gray-50: #f9fafb;\r\n    --rc-gray-100: #f3f4f6;\r\n    --rc-gray-200: #e5e7eb;\r\n    --rc-gray-300: #d1d5db;\r\n    --rc-gray-400: #9ca3af;\r\n    --rc-gray-500: #6b7280;\r\n    --rc-gray-600: #4b5563;\r\n    --rc-gray-700: #374151;\r\n    --rc-gray-800: #1f2937;\r\n    --rc-gray-900: #111827;\r\n    --rc-white: #ffffff;\r\n    --rc-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);\r\n    --rc-shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);\r\n    --rc-shadow-md: 0 4px 6px rgba(0, 0, 0, 0.07), 0 2px 4px rgba(0, 0, 0, 0.06);\r\n    --rc-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05);\r\n    --rc-shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.15), 0 8px 10px rgba(0, 0, 0, 0.08);\r\n    --rc-radius-sm: 6px;\r\n    --rc-radius: 8px;\r\n    --rc-radius-lg: 12px;\r\n    --rc-radius-xl: 16px;\r\n    --rc-transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n    --rc-font: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\r\n  }\r\n\r\n  \/* ========== Reset dentro del contenedor ========== *\/\r\n  .rc-wrapper,\r\n  .rc-wrapper *,\r\n  .rc-wrapper *::before,\r\n  .rc-wrapper *::after {\r\n    box-sizing: border-box;\r\n    margin: 0;\r\n    padding: 0;\r\n  }\r\n\r\n  .rc-wrapper {\r\n    font-family: var(--rc-font);\r\n    font-size: 16px;\r\n    line-height: 1.6;\r\n    color: var(--rc-gray-800);\r\n    max-width: 900px;\r\n    margin: 0 auto;\r\n    padding: 0 16px;\r\n  }\r\n\r\n  \/* ========== Progress Bar ========== *\/\r\n  .rc-progress-container {\r\n    background: var(--rc-white);\r\n    border-radius: var(--rc-radius-lg);\r\n    box-shadow: var(--rc-shadow-md);\r\n    padding: 16px 20px;\r\n    margin-bottom: 20px;\r\n    border: 1px solid var(--rc-gray-100);\r\n    display: none;\r\n  }\r\n\r\n  .rc-progress-container.rc-visible {\r\n    display: block;\r\n  }\r\n\r\n  .rc-progress-info {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    margin-bottom: 8px;\r\n    font-size: 0.85rem;\r\n    color: var(--rc-gray-600);\r\n  }\r\n\r\n  .rc-progress-percentage {\r\n    font-weight: 700;\r\n    color: var(--rc-primary);\r\n    font-size: 0.9rem;\r\n  }\r\n\r\n  .rc-progress-step {\r\n    font-weight: 500;\r\n  }\r\n\r\n  .rc-progress-bar {\r\n    width: 100%;\r\n    height: 8px;\r\n    background: var(--rc-gray-200);\r\n    border-radius: 4px;\r\n    overflow: hidden;\r\n  }\r\n\r\n  .rc-progress-fill {\r\n    height: 100%;\r\n    background: linear-gradient(90deg, #2563eb, #3b82f6);\r\n    border-radius: 4px;\r\n    width: 0%;\r\n    transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1);\r\n  }\r\n\r\n  \/* ========== Selector Card ========== *\/\r\n  .rc-selector-card {\r\n    background: var(--rc-white);\r\n    border-radius: var(--rc-radius-xl);\r\n    box-shadow: var(--rc-shadow-lg);\r\n    padding: 36px 32px;\r\n    margin-bottom: 28px;\r\n    text-align: center;\r\n    border: 1px solid var(--rc-gray-100);\r\n  }\r\n\r\n  .rc-selector-title {\r\n    font-size: 1.25rem;\r\n    font-weight: 700;\r\n    color: var(--rc-gray-900);\r\n    margin-bottom: 24px;\r\n  }\r\n\r\n  .rc-selector-buttons {\r\n    display: flex;\r\n    gap: 16px;\r\n    max-width: 480px;\r\n    margin: 0 auto;\r\n    flex-wrap: wrap;\r\n    justify-content: center;\r\n  }\r\n\r\n  .rc-selector-btn {\r\n    appearance: none;\r\n    -webkit-appearance: none;\r\n    font: inherit;\r\n    flex: 1 1 0;\r\n    width: 100%;\r\n    min-width: 0;\r\n    height: 96px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    gap: 12px;\r\n    padding: 22px 24px;\r\n    line-height: 1.25;\r\n    font-size: 1rem;\r\n    font-weight: 600;\r\n    font-family: var(--rc-font);\r\n    color: var(--rc-gray-700);\r\n    background: var(--rc-white);\r\n    border: 2px solid var(--rc-gray-200);\r\n    border-radius: var(--rc-radius-lg);\r\n    cursor: pointer;\r\n    transition: var(--rc-transition);\r\n    outline: none;\r\n  }\r\n\r\n  .rc-selector-btn:hover {\r\n    border-color: var(--rc-primary);\r\n    background: var(--rc-primary-light);\r\n    color: var(--rc-primary);\r\n    box-shadow: var(--rc-shadow-md);\r\n    transform: translateY(-2px);\r\n  }\r\n\r\n  .rc-selector-btn.rc-active {\r\n    border-color: var(--rc-primary);\r\n    background: var(--rc-primary);\r\n    color: var(--rc-white);\r\n    box-shadow: var(--rc-shadow-lg);\r\n  }\r\n\r\n  .rc-selector-btn .rc-btn-icon {\r\n    width: 32px;\r\n    height: 32px;\r\n    border-radius: var(--rc-radius);\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    flex-shrink: 0;\r\n  }\r\n\r\n  .rc-selector-btn .rc-btn-icon svg {\r\n    width: 20px;\r\n    height: 20px;\r\n  }\r\n\r\n  .rc-selector-btn .rc-btn-icon-reclamo {\r\n    background: #eff6ff;\r\n    color: #199178;\r\n  }\r\n\r\n  .rc-selector-btn.rc-active .rc-btn-icon-reclamo {\r\n    background: rgba(255,255,255,0.25);\r\n    color: #ffffff;\r\n  }\r\n\r\n  .rc-selector-btn .rc-btn-icon-consulta {\r\n    background: #eff6ff;\r\n    color: #E39F1E;\r\n  }\r\n\r\n  .rc-selector-btn.rc-active .rc-btn-icon-consulta {\r\n    background: rgba(255,255,255,0.25);\r\n    color: #ffffff;\r\n  }\r\n\r\n  .rc-selector-btn-text {\r\n    flex: 1;\r\n    text-align: left;\r\n    display: flex;\r\n    flex-direction: column;\r\n    justify-content: center;\r\n    line-height: 1.25;\r\n  }\r\n\r\n  .rc-selector-btn-text small {\r\n    display: block;\r\n    width: 100%;\r\n    font-size: .78rem;\r\n    font-weight: 400;\r\n    letter-spacing: .06em;\r\n    text-transform: uppercase;\r\n    white-space: normal;\r\n    overflow-wrap: break-word;\r\n    word-break: break-word;\r\n    opacity: 0.7;\r\n  }\r\n\r\n  \/* ========== Form Card ========== *\/\r\n  .rc-form-card {\r\n    background: var(--rc-white);\r\n    border-radius: var(--rc-radius-xl);\r\n    box-shadow: var(--rc-shadow-lg);\r\n    padding: 36px 32px;\r\n    border: 1px solid var(--rc-gray-100);\r\n    display: none;\r\n    opacity: 0;\r\n    transform: translateY(8px);\r\n    transition: opacity var(--rc-transition), transform var(--rc-transition);\r\n  }\r\n\r\n  .rc-form-card.rc-visible {\r\n    display: block;\r\n    opacity: 1;\r\n    transform: translateY(0);\r\n  }\r\n\r\n  .rc-form-card.rc-hiding {\r\n    opacity: 0;\r\n    transform: translateY(-8px);\r\n  }\r\n\r\n  .rc-form-heading {\r\n    font-size: 1.5rem;\r\n    font-weight: 700;\r\n    color: var(--rc-gray-900);\r\n    margin-bottom: 12px;\r\n    padding-bottom: 16px;\r\n    border-bottom: 2px solid var(--rc-gray-100);\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 10px;\r\n  }\r\n\r\n  .rc-form-heading .rc-icon {\r\n    width: 40px;\r\n    height: 40px;\r\n    border-radius: var(--rc-radius);\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    flex-shrink: 0;\r\n  }\r\n\r\n  .rc-form-heading .rc-icon svg {\r\n    width: 20px;\r\n    height: 20px;\r\n  }\r\n\r\n  .rc-icon-reclamo {\r\n    background: #eff6ff;\r\n    color: #199178;\r\n  }\r\n\r\n  .rc-icon-consulta {\r\n    background: #eff6ff;\r\n    color: #E39F1E;\r\n  }\r\n\r\n  \/* ========== Meta info below heading ========== *\/\r\n  .rc-form-meta {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    flex-wrap: wrap;\r\n    gap: 10px;\r\n    margin-bottom: 20px;\r\n    padding-bottom: 12px;\r\n    border-bottom: 1px solid var(--rc-gray-100);\r\n  }\r\n\r\n  .rc-fields-counter {\r\n    font-size: 0.85rem;\r\n    color: var(--rc-gray-600);\r\n    font-weight: 500;\r\n  }\r\n\r\n  .rc-fields-counter span {\r\n    color: var(--rc-primary);\r\n    font-weight: 700;\r\n  }\r\n\r\n  .rc-required-indicator {\r\n    font-size: 0.82rem;\r\n    color: var(--rc-gray-500);\r\n  }\r\n\r\n  .rc-required-indicator .rc-asterisk {\r\n    color: var(--rc-error);\r\n    font-weight: 700;\r\n  }\r\n\r\n  \/* ========== Section Subheading ========== *\/\r\n  .rc-section-title {\r\n    font-size: 0.95rem;\r\n    font-weight: 600;\r\n    color: var(--rc-gray-700);\r\n    margin: 24px 0 16px;\r\n    padding: 10px 14px;\r\n    background: var(--rc-gray-50);\r\n    border-radius: var(--rc-radius-sm);\r\n    border-left: 3px solid var(--rc-primary);\r\n  }\r\n\r\n  \/* ========== CSS Grid para formularios ========== *\/\r\n  .rc-form-grid {\r\n    display: grid;\r\n    grid-template-columns: repeat(2, 1fr);\r\n    gap: 20px;\r\n  }\r\n\r\n  .rc-form-grid .rc-field-full {\r\n    grid-column: 1 \/ -1;\r\n  }\r\n\r\n  \/* ========== Field ========== *\/\r\n  .rc-field {\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 6px;\r\n  }\r\n\r\n  .rc-field-label {\r\n    font-size: 0.875rem;\r\n    font-weight: 600;\r\n    color: var(--rc-gray-700);\r\n  }\r\n\r\n  .rc-field-label .rc-required {\r\n    color: var(--rc-error);\r\n    margin-left: 2px;\r\n  }\r\n\r\n  .rc-field-input,\r\n  .rc-field-textarea,\r\n  .rc-field-select {\r\n    width: 100%;\r\n    padding: 11px 14px;\r\n    font-size: 0.95rem;\r\n    font-family: var(--rc-font);\r\n    color: var(--rc-gray-800);\r\n    background: var(--rc-gray-50);\r\n    border: 2px solid var(--rc-gray-200);\r\n    border-radius: var(--rc-radius);\r\n    transition: var(--rc-transition);\r\n    outline: none;\r\n  }\r\n\r\n  .rc-field-input:hover,\r\n  .rc-field-textarea:hover,\r\n  .rc-field-select:hover {\r\n    border-color: var(--rc-gray-300);\r\n  }\r\n\r\n  .rc-field-input:focus,\r\n  .rc-field-textarea:focus,\r\n  .rc-field-select:focus {\r\n    border-color: var(--rc-primary);\r\n    box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.12);\r\n    background: var(--rc-white);\r\n  }\r\n\r\n  .rc-field-select {\r\n    cursor: pointer;\r\n    appearance: none;\r\n    -webkit-appearance: none;\r\n    -moz-appearance: none;\r\n    background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C\/polyline%3E%3C\/svg%3E\");\r\n    background-repeat: no-repeat;\r\n    background-position: right 12px center;\r\n    padding-right: 36px;\r\n  }\r\n\r\n  .rc-field-input.rc-valid,\r\n  .rc-field-textarea.rc-valid,\r\n  .rc-field-select.rc-valid {\r\n    border-color: var(--rc-success);\r\n    background: var(--rc-success-light);\r\n  }\r\n\r\n  .rc-field-input.rc-invalid,\r\n  .rc-field-textarea.rc-invalid,\r\n  .rc-field-select.rc-invalid {\r\n    border-color: var(--rc-error);\r\n    background: var(--rc-error-light);\r\n  }\r\n\r\n  .rc-field-error {\r\n    font-size: 0.8rem;\r\n    color: var(--rc-error);\r\n    min-height: 1.2em;\r\n    transition: var(--rc-transition);\r\n  }\r\n\r\n  .rc-field-textarea {\r\n    resize: vertical;\r\n    min-height: 140px;\r\n  }\r\n\r\n  .rc-char-counter {\r\n    font-size: 0.78rem;\r\n    color: var(--rc-gray-400);\r\n    text-align: right;\r\n    margin-top: -2px;\r\n  }\r\n\r\n  .rc-char-counter.rc-counter-warn {\r\n    color: var(--rc-error);\r\n    font-weight: 600;\r\n  }\r\n\r\n  \/* ========== Field highlight animation (scroll to error) ========== *\/\r\n  @keyframes rc-field-pulse {\r\n    0% { box-shadow: 0 0 0 0 rgba(220, 38, 38, 0.4); }\r\n    50% { box-shadow: 0 0 0 8px rgba(220, 38, 38, 0.08); }\r\n    100% { box-shadow: 0 0 0 0 rgba(220, 38, 38, 0); }\r\n  }\r\n\r\n  .rc-field-highlight {\r\n    animation: rc-field-pulse 1.5s ease-out;\r\n    border-color: var(--rc-error) !important;\r\n  }\r\n\r\n  \/* ========== Searchable Select ========== *\/\r\n  .rc-search-select {\r\n    position: relative;\r\n    width: 100%;\r\n  }\r\n\r\n  .rc-search-select-input {\r\n    width: 100%;\r\n    padding: 11px 36px 11px 14px;\r\n    font-size: 0.95rem;\r\n    font-family: var(--rc-font);\r\n    color: var(--rc-gray-800);\r\n    background: var(--rc-gray-50);\r\n    border: 2px solid var(--rc-gray-200);\r\n    border-radius: var(--rc-radius);\r\n    transition: var(--rc-transition);\r\n    outline: none;\r\n    cursor: pointer;\r\n    caret-color: var(--rc-primary);\r\n  }\r\n\r\n  .rc-search-select-input:hover {\r\n    border-color: var(--rc-gray-300);\r\n  }\r\n\r\n  .rc-search-select-input:focus {\r\n    border-color: var(--rc-primary);\r\n    box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.12);\r\n    background: var(--rc-white);\r\n  }\r\n\r\n  .rc-search-select-input.rc-valid {\r\n    border-color: var(--rc-success);\r\n    background: var(--rc-success-light);\r\n  }\r\n\r\n  .rc-search-select-input.rc-invalid {\r\n    border-color: var(--rc-error);\r\n    background: var(--rc-error-light);\r\n  }\r\n\r\n  .rc-search-select-arrow {\r\n    position: absolute;\r\n    right: 12px;\r\n    top: 50%;\r\n    transform: translateY(-50%) rotate(45deg);\r\n    width: 8px;\r\n    height: 8px;\r\n    border-right: 2px solid var(--rc-gray-500);\r\n    border-bottom: 2px solid var(--rc-gray-500);\r\n    pointer-events: none;\r\n    transition: transform 0.2s ease;\r\n  }\r\n\r\n  .rc-search-select.open .rc-search-select-arrow {\r\n    transform: translateY(-30%) rotate(-135deg);\r\n  }\r\n\r\n  .rc-search-select-dropdown {\r\n    position: absolute;\r\n    top: calc(100% + 4px);\r\n    left: 0;\r\n    right: 0;\r\n    max-height: 220px;\r\n    overflow-y: auto;\r\n    background: var(--rc-white);\r\n    border: 1px solid var(--rc-gray-200);\r\n    border-radius: var(--rc-radius);\r\n    box-shadow: var(--rc-shadow-lg);\r\n    z-index: 100;\r\n    display: none;\r\n    list-style: none;\r\n    padding: 4px 0;\r\n    margin: 0;\r\n  }\r\n\r\n  .rc-search-select.open .rc-search-select-dropdown {\r\n    display: block;\r\n  }\r\n\r\n  .rc-search-select-dropdown li {\r\n    padding: 9px 14px;\r\n    font-size: 0.92rem;\r\n    color: var(--rc-gray-800);\r\n    cursor: pointer;\r\n    transition: background 0.15s ease;\r\n    white-space: nowrap;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n  }\r\n\r\n  .rc-search-select-dropdown li:hover,\r\n  .rc-search-select-dropdown li.rc-highlighted {\r\n    background: var(--rc-primary-light);\r\n    color: var(--rc-primary);\r\n  }\r\n\r\n  .rc-search-select-dropdown li.rc-selected {\r\n    background: var(--rc-primary);\r\n    color: var(--rc-white);\r\n  }\r\n\r\n  .rc-search-select-dropdown li.rc-no-results {\r\n    color: var(--rc-gray-400);\r\n    cursor: default;\r\n    text-align: center;\r\n    font-style: italic;\r\n  }\r\n\r\n  .rc-search-select-dropdown li.rc-no-results:hover {\r\n    background: transparent;\r\n  }\r\n\r\n  \/* ========== Honeypot (oculto para humanos) ========== *\/\r\n  .rc-hp {\r\n    position: absolute;\r\n    left: -9999px;\r\n    opacity: 0;\r\n    height: 0;\r\n    width: 0;\r\n    overflow: hidden;\r\n  }\r\n\r\n  \/* ========== Submit Button ========== *\/\r\n  .rc-submit-wrapper {\r\n    margin-top: 28px;\r\n    text-align: center;\r\n  }\r\n\r\n  .rc-btn-submit {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    gap: 10px;\r\n    padding: 14px 40px;\r\n    font-size: 1rem;\r\n    font-weight: 600;\r\n    font-family: var(--rc-font);\r\n    color: var(--rc-white);\r\n    background: var(--rc-primary);\r\n    border: none;\r\n    border-radius: var(--rc-radius);\r\n    cursor: pointer;\r\n    transition: var(--rc-transition);\r\n    min-width: 200px;\r\n  }\r\n\r\n  .rc-btn-submit:hover:not(:disabled) {\r\n    background: var(--rc-primary-hover);\r\n    box-shadow: var(--rc-shadow-md);\r\n  }\r\n\r\n  .rc-btn-submit:disabled {\r\n    opacity: 0.65;\r\n    cursor: not-allowed;\r\n  }\r\n\r\n  \/* ========== Spinner ========== *\/\r\n  .rc-spinner {\r\n    display: none;\r\n    width: 20px;\r\n    height: 20px;\r\n    border: 2.5px solid rgba(255, 255, 255, 0.35);\r\n    border-top-color: var(--rc-white);\r\n    border-radius: 50%;\r\n    animation: rc-spin 0.7s linear infinite;\r\n  }\r\n\r\n  @keyframes rc-spin {\r\n    to {\r\n      transform: rotate(360deg);\r\n    }\r\n  }\r\n\r\n  \/* ========== Skeleton Loading ========== *\/\r\n  .rc-skeleton {\r\n    display: none;\r\n    padding: 36px 32px;\r\n  }\r\n\r\n  .rc-form-card.rc-skeleton-loading .rc-skeleton {\r\n    display: block;\r\n  }\r\n\r\n  .rc-form-card.rc-skeleton-loading .rc-form-heading,\r\n  .rc-form-card.rc-skeleton-loading .rc-form-meta,\r\n  .rc-form-card.rc-skeleton-loading form {\r\n    display: none;\r\n  }\r\n\r\n  .rc-skeleton-block {\r\n    height: 18px;\r\n    background: linear-gradient(90deg, var(--rc-gray-100) 25%, var(--rc-gray-200) 50%, var(--rc-gray-100) 75%);\r\n    background-size: 200% 100%;\r\n    animation: rc-shimmer 1.5s ease-in-out infinite;\r\n    border-radius: var(--rc-radius-sm);\r\n  }\r\n\r\n  .rc-skeleton-block.rc-sk-sm  { width: 40%; }\r\n  .rc-skeleton-block.rc-sk-md  { width: 65%; }\r\n  .rc-skeleton-block.rc-sk-lg  { width: 90%; }\r\n  .rc-skeleton-block.rc-sk-full { width: 100%; }\r\n  .rc-skeleton-block.rc-sk-h-sm { height: 38px; }\r\n  .rc-skeleton-block.rc-sk-h-lg { height: 120px; margin-top: 12px; }\r\n  .rc-skeleton-row { display: flex; gap: 20px; margin-bottom: 16px; }\r\n  .rc-skeleton-row .rc-skeleton-block { flex: 1; }\r\n\r\n  @keyframes rc-shimmer {\r\n    0%   { background-position: 200% 0; }\r\n    100% { background-position: -200% 0; }\r\n  }\r\n\r\n  \/* ========== Feedback Messages ========== *\/\r\n  .rc-feedback {\r\n    display: none;\r\n    padding: 16px 20px;\r\n    border-radius: var(--rc-radius);\r\n    margin-top: 20px;\r\n    font-weight: 500;\r\n    font-size: 0.95rem;\r\n    text-align: center;\r\n  }\r\n\r\n  .rc-feedback-success {\r\n    display: block;\r\n    background: var(--rc-success-light);\r\n    color: var(--rc-success);\r\n    border: 1px solid #bbf7d0;\r\n  }\r\n\r\n  .rc-feedback-error {\r\n    display: block;\r\n    background: var(--rc-error-light);\r\n    color: var(--rc-error);\r\n    border: 1px solid #fecaca;\r\n  }\r\n\r\n  \/* ========== Modal Overlay ========== *\/\r\n  .rc-modal-overlay {\r\n    display: none;\r\n    position: fixed;\r\n    top: 0;\r\n    left: 0;\r\n    right: 0;\r\n    bottom: 0;\r\n    background: rgba(0, 0, 0, 0.5);\r\n    z-index: 10000;\r\n    justify-content: center;\r\n    align-items: center;\r\n    opacity: 0;\r\n    transition: opacity var(--rc-transition);\r\n  }\r\n\r\n  .rc-modal-overlay.rc-visible {\r\n    display: flex;\r\n    opacity: 1;\r\n  }\r\n\r\n  .rc-modal {\r\n    background: var(--rc-white);\r\n    border-radius: var(--rc-radius-xl);\r\n    box-shadow: var(--rc-shadow-xl);\r\n    padding: 28px 32px;\r\n    max-width: 460px;\r\n    width: 90%;\r\n    text-align: center;\r\n    transform: translateY(12px) scale(0.96);\r\n    transition: transform var(--rc-transition);\r\n  }\r\n\r\n  .rc-modal-overlay.rc-visible .rc-modal {\r\n    transform: translateY(0) scale(1);\r\n  }\r\n\r\n  .rc-modal-icon {\r\n    width: 56px;\r\n    height: 56px;\r\n    border-radius: 50%;\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    margin-bottom: 16px;\r\n  }\r\n\r\n  .rc-modal-icon.rc-modal-icon-warn {\r\n    background: #fef3c7;\r\n    color: #d97706;\r\n  }\r\n\r\n  .rc-modal-icon.rc-modal-icon-info {\r\n    background: var(--rc-primary-light);\r\n    color: var(--rc-primary);\r\n  }\r\n\r\n  .rc-modal-icon svg {\r\n    width: 28px;\r\n    height: 28px;\r\n  }\r\n\r\n  .rc-modal-title {\r\n    font-size: 1.2rem;\r\n    font-weight: 700;\r\n    color: var(--rc-gray-900);\r\n    margin-bottom: 8px;\r\n  }\r\n\r\n  .rc-modal-body {\r\n    font-size: 0.95rem;\r\n    color: var(--rc-gray-600);\r\n    margin-bottom: 24px;\r\n    line-height: 1.5;\r\n  }\r\n\r\n  .rc-modal-footer {\r\n    display: flex;\r\n    gap: 12px;\r\n    justify-content: center;\r\n    flex-wrap: wrap;\r\n  }\r\n\r\n  .rc-modal-btn {\r\n    padding: 10px 24px;\r\n    border-radius: var(--rc-radius);\r\n    font-size: 0.95rem;\r\n    font-weight: 600;\r\n    font-family: var(--rc-font);\r\n    cursor: pointer;\r\n    border: none;\r\n    transition: var(--rc-transition);\r\n    min-width: 110px;\r\n  }\r\n\r\n  .rc-modal-btn-primary {\r\n    background: var(--rc-primary);\r\n    color: var(--rc-white);\r\n  }\r\n\r\n  .rc-modal-btn-primary:hover {\r\n    background: var(--rc-primary-hover);\r\n  }\r\n\r\n  .rc-modal-btn-secondary {\r\n    background: var(--rc-gray-100);\r\n    color: var(--rc-gray-700);\r\n    border: 1px solid var(--rc-gray-200);\r\n  }\r\n\r\n  .rc-modal-btn-secondary:hover {\r\n    background: var(--rc-gray-200);\r\n  }\r\n\r\n  .rc-modal-btn-danger {\r\n    background: var(--rc-error);\r\n    color: var(--rc-white);\r\n  }\r\n\r\n  .rc-modal-btn-danger:hover {\r\n    background: #b91c1c;\r\n  }\r\n\r\n  \/* ========== Responsive ========== *\/\r\n  @media (max-width: 768px) {\r\n    .rc-form-grid {\r\n      grid-template-columns: 1fr;\r\n      gap: 16px;\r\n    }\r\n\r\n    .rc-form-card {\r\n      padding: 24px 18px;\r\n    }\r\n\r\n    .rc-form-heading {\r\n      font-size: 1.25rem;\r\n    }\r\n\r\n    .rc-selector-card {\r\n      padding: 24px 18px;\r\n    }\r\n\r\n    .rc-btn-submit {\r\n      width: 100%;\r\n    }\r\n\r\n    .rc-modal {\r\n      padding: 22px 20px;\r\n    }\r\n\r\n    .rc-modal-footer {\r\n      flex-direction: column;\r\n    }\r\n\r\n    .rc-modal-btn {\r\n      width: 100%;\r\n    }\r\n\r\n    .rc-progress-container {\r\n      padding: 12px 16px;\r\n    }\r\n\r\n    .rc-form-meta {\r\n      flex-direction: column;\r\n      align-items: flex-start;\r\n      gap: 6px;\r\n    }\r\n  }\r\n\r\n  @media (max-width: 480px) {\r\n    .rc-wrapper {\r\n      padding: 0 8px;\r\n    }\r\n\r\n    .rc-form-card {\r\n      padding: 20px 14px;\r\n    }\r\n\r\n    .rc-selector-card {\r\n      padding: 20px 14px;\r\n    }\r\n\r\n    .rc-form-heading {\r\n      font-size: 1.15rem;\r\n    }\r\n\r\n    \/* ponytail: mobile selector buttons \u2014 stacked vertically, full width *\/\r\n    .rc-selector-buttons {\r\n      flex-direction: column;\r\n      gap: 12px;\r\n      max-width: 100%;\r\n      align-items: stretch;\r\n    }\r\n\r\n    .rc-selector-btn {\r\n      width: 100%;\r\n      flex: none;\r\n      min-height: 110px;\r\n      height: auto;\r\n      flex-direction: column;\r\n      justify-content: center;\r\n      align-items: center;\r\n      padding: 16px 8px;\r\n      gap: 6px;\r\n      font-size: 0.9rem;\r\n    }\r\n\r\n    .rc-selector-btn .rc-btn-icon {\r\n      width: 28px;\r\n      height: 28px;\r\n      margin: 0 auto;\r\n    }\r\n\r\n    .rc-selector-btn .rc-btn-icon svg {\r\n      width: 18px;\r\n      height: 18px;\r\n    }\r\n\r\n    .rc-selector-btn-text {\r\n      min-width: 0;\r\n      text-align: center;\r\n      align-items: center;\r\n    }\r\n\r\n    .rc-selector-btn-text small {\r\n      font-size: 0.69rem;\r\n      letter-spacing: 0.02em;\r\n      text-transform: none;\r\n      text-align: center;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<div class=\"rc-wrapper\">\r\n  <!-- ========== SELECTOR CARD ========== -->\r\n  <div class=\"rc-selector-card\">\r\n    <h2 class=\"rc-selector-title\">Seleccione el tipo de formulario<\/h2>\r\n    <div class=\"rc-selector-buttons\">\r\n      <button class=\"rc-selector-btn\" id=\"rcBtnSelectorConsulta\" data-form=\"consulta\">\r\n        <span class=\"rc-btn-icon rc-btn-icon-consulta\">\r\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"\/>\r\n            <path d=\"M8 9h8\"\/>\r\n            <path d=\"M8 13h6\"\/>\r\n          <\/svg>\r\n        <\/span>\r\n        <span class=\"rc-selector-btn-text\">\r\n          Consulta\r\n          <small>Consulta general<\/small>\r\n        <\/span>\r\n      <\/button>\r\n      <button class=\"rc-selector-btn\" id=\"rcBtnSelectorReclamo\" data-form=\"reclamo\">\r\n        <span class=\"rc-btn-icon rc-btn-icon-reclamo\">\r\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"\/>\r\n            <rect x=\"8\" y=\"2\" width=\"8\" height=\"4\" rx=\"1\" ry=\"1\"\/>\r\n            <path d=\"M9 14l2 2 4-4\"\/>\r\n          <\/svg>\r\n        <\/span>\r\n        <span class=\"rc-selector-btn-text\">\r\n          Hoja de Reclamo\r\n          <small>Persona Jur\u00eddica<\/small>\r\n        <\/span>\r\n      <\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- ========== PROGRESS BAR ========== -->\r\n  <div class=\"rc-progress-container\" id=\"rcProgressContainer\">\r\n    <div class=\"rc-progress-info\">\r\n      <span class=\"rc-progress-step\" id=\"rcProgressStep\">Paso 1 de 4<\/span>\r\n      <span class=\"rc-progress-percentage\" id=\"rcProgressPercentage\">0%<\/span>\r\n    <\/div>\r\n    <div class=\"rc-progress-bar\">\r\n      <div class=\"rc-progress-fill\" id=\"rcProgressFill\"><\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- ========== FORMULARIO 1: HOJA DE RECLAMO (Persona Jur\u00eddica) ========== -->\r\n  <div class=\"rc-form-card\" id=\"rcFormReclamo\">\r\n    <h3 class=\"rc-form-heading\">\r\n      <span class=\"rc-icon rc-icon-reclamo\">\r\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <path d=\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\"\/>\r\n          <rect x=\"8\" y=\"2\" width=\"8\" height=\"4\" rx=\"1\" ry=\"1\"\/>\r\n          <path d=\"M9 14l2 2 4-4\"\/>\r\n        <\/svg>\r\n      <\/span> Hoja de Reclamo - Persona Jur\u00eddica\r\n    <\/h3>\r\n\r\n    <div class=\"rc-form-meta\">\r\n      <span class=\"rc-fields-counter\">Campos completados <span id=\"rcCounterReclamoFields\">0<\/span> \/ <span id=\"rcTotalReclamoFields\">0<\/span><\/span>\r\n      <span class=\"rc-required-indicator\"><span class=\"rc-asterisk\">*<\/span> Campos obligatorios<\/span>\r\n    <\/div>\r\n\r\n    <form id=\"rcReclamoForm\" novalidate>\r\n      <!-- Honeypot invisible -->\r\n      <div class=\"rc-hp\">\r\n        <label for=\"rc_hp_reclamo\">No llenar<\/label>\r\n        <input type=\"text\" id=\"rc_hp_reclamo\" name=\"rc_hp\" tabindex=\"-1\" autocomplete=\"off\" \/>\r\n      <\/div>\r\n\r\n      <!-- Hidden: token anti-duplicado y timestamp de inicio -->\r\n      <input type=\"hidden\" id=\"rc_submit_token_reclamo\" name=\"rc_submit_token\" value=\"\" \/>\r\n      <input type=\"hidden\" id=\"rc_form_start_reclamo\" name=\"rc_form_start\" value=\"\" \/>\r\n\r\n      <!-- Campos de Persona Jur\u00eddica (siempre visibles) -->\r\n      <div class=\"rc-form-grid\" id=\"rcCamposJuridica\">\r\n        <div class=\"rc-field rc-field-full\">\r\n          <label class=\"rc-field-label\" for=\"rc_razon_social\">Raz\u00f3n Social <span class=\"rc-required\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"rc-field-input\" id=\"rc_razon_social\" name=\"rc_razon_social\" placeholder=\"Ej: Empresa S.A. de C.V.\" maxlength=\"200\" data-validate=\"razon_social\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_razon_social\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_nombre\">Nombre y Apellidos <span class=\"rc-required\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"rc-field-input\" id=\"rc_nombre\" name=\"rc_nombre\" placeholder=\"Ej: Juan P\u00e9rez\" maxlength=\"150\" data-validate=\"nombre\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_nombre\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_tipo_documento\">Tipo de Documento <span class=\"rc-required\">*<\/span><\/label>\r\n          <select class=\"rc-field-input rc-field-select\" id=\"rc_tipo_documento\" name=\"rc_tipo_documento\" data-validate=\"tipo_documento\">\r\n            <option value=\"\">Seleccione...<\/option>\r\n            <option value=\"identidad\">Identidad hondure\u00f1a<\/option>\r\n            <option value=\"pasaporte\">Pasaporte<\/option>\r\n            <option value=\"carne\">Carn\u00e9 de residente<\/option>\r\n          <\/select>\r\n          <span class=\"rc-field-error\" data-error=\"rc_tipo_documento\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_identidad\">N\u00famero de documento <span class=\"rc-required\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"rc-field-input\" id=\"rc_identidad\" name=\"rc_identidad\" placeholder=\"Seleccione tipo de documento\" maxlength=\"25\" data-validate=\"identidad\" data-mask=\"identidad\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_identidad\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field rc-field-full\">\r\n          <label class=\"rc-field-label\" for=\"rc_direccion\">Direcci\u00f3n <span class=\"rc-required\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"rc-field-input\" id=\"rc_direccion\" name=\"rc_direccion\" placeholder=\"Ej: Col. Centro, Calle Principal\" maxlength=\"250\" data-validate=\"direccion\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_direccion\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field rc-field-full\">\r\n          <label class=\"rc-field-label\" for=\"rc_rtn\">RTN <span class=\"rc-required\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"rc-field-input\" id=\"rc_rtn\" name=\"rc_rtn\" placeholder=\"Ej: 08019012345678\" maxlength=\"14\" data-validate=\"rtn\" data-mask=\"rtn\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_rtn\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_telefono\">Tel\u00e9fono <span class=\"rc-required\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"rc-field-input\" id=\"rc_telefono\" name=\"rc_telefono\" placeholder=\"Ej: 9999-9999\" maxlength=\"15\" data-validate=\"telefono\" data-mask=\"telefono\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_telefono\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_correo\">Correo electr\u00f3nico <span class=\"rc-required\">*<\/span><\/label>\r\n          <input type=\"email\" class=\"rc-field-input\" id=\"rc_correo\" name=\"rc_correo\" placeholder=\"Ej: correo@empresa.com\" maxlength=\"150\" data-validate=\"email\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_correo\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field rc-field-full\">\r\n          <label class=\"rc-field-label\" for=\"rc_domicilio_legal\">Domicilio Legal <span class=\"rc-required\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"rc-field-input\" id=\"rc_domicilio_legal\" name=\"rc_domicilio_legal\" placeholder=\"Ej: Col. Centro, Edificio Principal\" maxlength=\"250\" data-validate=\"texto\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_domicilio_legal\"><\/span>\r\n        <\/div>\r\n\r\n        <!-- Departamento (searchable select) -->\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_search_departamento\">Departamento <span class=\"rc-required\">*<\/span><\/label>\r\n          <div class=\"rc-search-select\" id=\"rcSearchDepartamento\">\r\n            <input type=\"text\" class=\"rc-search-select-input\" id=\"rc_search_departamento\" name=\"rc_departamento\" placeholder=\"Buscar departamento...\" autocomplete=\"off\" data-validate=\"texto\" data-search-type=\"departamento\" \/>\r\n            <span class=\"rc-search-select-arrow\"><\/span>\r\n            <ul class=\"rc-search-select-dropdown\" role=\"listbox\"><\/ul>\r\n          <\/div>\r\n          <input type=\"hidden\" id=\"rc_departamento\" name=\"rc_departamento_conf\" value=\"\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_departamento\"><\/span>\r\n        <\/div>\r\n\r\n        <!-- Municipio (searchable select, dependiente de departamento) -->\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_search_municipio\">Municipio <span class=\"rc-required\">*<\/span><\/label>\r\n          <div class=\"rc-search-select\" id=\"rcSearchMunicipio\">\r\n            <input type=\"text\" class=\"rc-search-select-input\" id=\"rc_search_municipio\" name=\"rc_municipio\" placeholder=\"Seleccione primero un departamento...\" autocomplete=\"off\" data-validate=\"texto\" data-search-type=\"municipio\" disabled \/>\r\n            <span class=\"rc-search-select-arrow\"><\/span>\r\n            <ul class=\"rc-search-select-dropdown\" role=\"listbox\"><\/ul>\r\n          <\/div>\r\n          <input type=\"hidden\" id=\"rc_municipio\" name=\"rc_municipio_conf\" value=\"\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_municipio\"><\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Representaci\u00f3n Legal -->\r\n      <div class=\"rc-section-title\">En caso de representaci\u00f3n<\/div>\r\n      <div class=\"rc-form-grid\">\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_rep_nombre\">Nombre y apellidos del representante legal<\/label>\r\n          <input type=\"text\" class=\"rc-field-input\" id=\"rc_rep_nombre\" name=\"rc_rep_nombre\" placeholder=\"Nombre del representante\" maxlength=\"150\" data-validate=\"nombre\" data-optional=\"true\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_rep_nombre\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_rep_identidad\">N\u00famero de identidad del representante<\/label>\r\n          <input type=\"text\" class=\"rc-field-input\" id=\"rc_rep_identidad\" name=\"rc_rep_identidad\" placeholder=\"N\u00b0 de identidad\" maxlength=\"20\" data-validate=\"identidad\" data-mask=\"identidad\" data-optional=\"true\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_rep_identidad\"><\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Descripci\u00f3n del Reclamo -->\r\n      <div class=\"rc-form-grid\" style=\"margin-top:4px;\">\r\n        <div class=\"rc-field rc-field-full\">\r\n          <label class=\"rc-field-label\" for=\"rc_descripcion_reclamo\">Descripci\u00f3n del reclamo <span class=\"rc-required\">*<\/span><\/label>\r\n          <textarea class=\"rc-field-textarea\" id=\"rc_descripcion_reclamo\" name=\"rc_descripcion_reclamo\" placeholder=\"Describa a detalle los hechos que motivaron este reclamo: (m\u00ednimo 100 caracteres)...\" maxlength=\"5000\" data-validate=\"textarea\" data-min=\"100\" data-max=\"5000\"><\/textarea>\r\n          <span class=\"rc-char-counter\" id=\"rcCounterReclamo\">0 \/ 5000 caracteres<\/span>\r\n          <span class=\"rc-field-error\" data-error=\"rc_descripcion_reclamo\"><\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Bot\u00f3n de env\u00edo -->\r\n      <div class=\"rc-submit-wrapper\">\r\n        <button type=\"submit\" class=\"rc-btn-submit\" id=\"rcBtnReclamo\">\r\n          <span class=\"rc-spinner\" id=\"rcSpinnerReclamo\"><\/span>\r\n          <span id=\"rcBtnTextReclamo\">Enviar Reclamo<\/span>\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <!-- Feedback -->\r\n      <div class=\"rc-feedback\" id=\"rcFeedbackReclamo\"><\/div>\r\n    <\/form>\r\n\r\n    <!-- Skeleton Loading -->\r\n    <div class=\"rc-skeleton\">\r\n      <div class=\"rc-skeleton-block rc-sk-sm\" style=\"margin-bottom:20px;\"><\/div>\r\n      <div class=\"rc-skeleton-row\">\r\n        <div class=\"rc-skeleton-block rc-sk-h-sm\"><\/div>\r\n        <div class=\"rc-skeleton-block rc-sk-h-sm\"><\/div>\r\n      <\/div>\r\n      <div class=\"rc-skeleton-row\">\r\n        <div class=\"rc-skeleton-block rc-sk-h-sm\"><\/div>\r\n        <div class=\"rc-skeleton-block rc-sk-h-sm\"><\/div>\r\n      <\/div>\r\n      <div class=\"rc-skeleton-row\">\r\n        <div class=\"rc-skeleton-block rc-sk-h-sm\"><\/div>\r\n      <\/div>\r\n      <div class=\"rc-skeleton-block rc-sk-h-lg\"><\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- ========== FORMULARIO 2: CONSULTA ========== -->\r\n  <div class=\"rc-form-card\" id=\"rcFormConsulta\">\r\n    <h3 class=\"rc-form-heading\">\r\n      <span class=\"rc-icon rc-icon-consulta\">\r\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"\/>\r\n          <path d=\"M8 9h8\"\/>\r\n          <path d=\"M8 13h6\"\/>\r\n        <\/svg>\r\n      <\/span> Consulta\r\n    <\/h3>\r\n\r\n    <div class=\"rc-form-meta\">\r\n      <span class=\"rc-fields-counter\">Campos completados <span id=\"rcCounterConsultaFields\">0<\/span> \/ <span id=\"rcTotalConsultaFields\">0<\/span><\/span>\r\n      <span class=\"rc-required-indicator\"><span class=\"rc-asterisk\">*<\/span> Campos obligatorios<\/span>\r\n    <\/div>\r\n\r\n    <form id=\"rcConsultaForm\" novalidate>\r\n      <!-- Honeypot invisible -->\r\n      <div class=\"rc-hp\">\r\n        <label for=\"rc_hp_consulta\">No llenar<\/label>\r\n        <input type=\"text\" id=\"rc_hp_consulta\" name=\"rc_hp\" tabindex=\"-1\" autocomplete=\"off\" \/>\r\n      <\/div>\r\n\r\n      <!-- Hidden: token anti-duplicado y timestamp de inicio -->\r\n      <input type=\"hidden\" id=\"rc_submit_token_consulta\" name=\"rc_submit_token\" value=\"\" \/>\r\n      <input type=\"hidden\" id=\"rc_form_start_consulta\" name=\"rc_form_start\" value=\"\" \/>\r\n\r\n      <div class=\"rc-form-grid\">\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_cons_nombre\">Nombre <span class=\"rc-required\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"rc-field-input\" id=\"rc_cons_nombre\" name=\"rc_cons_nombre\" placeholder=\"Ej: Mar\u00eda Garc\u00eda\" maxlength=\"150\" data-validate=\"nombre\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_cons_nombre\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_cons_institucion\">Instituci\u00f3n <span class=\"rc-required\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"rc-field-input\" id=\"rc_cons_institucion\" name=\"rc_cons_institucion\" placeholder=\"Ej: Universidad Nacional\" maxlength=\"200\" data-validate=\"institucion\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_cons_institucion\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_cons_cargo\">Cargo <span class=\"rc-required\">*<\/span><\/label>\r\n          <input type=\"text\" class=\"rc-field-input\" id=\"rc_cons_cargo\" name=\"rc_cons_cargo\" placeholder=\"Ej: Director de Proyecto\" maxlength=\"150\" data-validate=\"cargo\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_cons_cargo\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field\">\r\n          <label class=\"rc-field-label\" for=\"rc_cons_correo\">Correo Electr\u00f3nico <span class=\"rc-required\">*<\/span><\/label>\r\n          <input type=\"email\" class=\"rc-field-input\" id=\"rc_cons_correo\" name=\"rc_cons_correo\" placeholder=\"Ej: maria@institucion.edu\" maxlength=\"150\" data-validate=\"email\" \/>\r\n          <span class=\"rc-field-error\" data-error=\"rc_cons_correo\"><\/span>\r\n        <\/div>\r\n        <div class=\"rc-field rc-field-full\">\r\n          <label class=\"rc-field-label\" for=\"rc_cons_descripcion\">Descripci\u00f3n de la consulta <span class=\"rc-required\">*<\/span><\/label>\r\n          <textarea class=\"rc-field-textarea\" id=\"rc_cons_descripcion\" name=\"rc_cons_descripcion\" placeholder=\"Escriba su consulta (m\u00ednimo 20 caracteres)...\" maxlength=\"3000\" data-validate=\"textarea\" data-min=\"20\" data-max=\"3000\"><\/textarea>\r\n          <span class=\"rc-char-counter\" id=\"rcCounterConsulta\">0 \/ 3000 caracteres<\/span>\r\n          <span class=\"rc-field-error\" data-error=\"rc_cons_descripcion\"><\/span>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- Bot\u00f3n de env\u00edo -->\r\n      <div class=\"rc-submit-wrapper\">\r\n        <button type=\"submit\" class=\"rc-btn-submit\" id=\"rcBtnConsulta\">\r\n          <span class=\"rc-spinner\" id=\"rcSpinnerConsulta\"><\/span>\r\n          <span id=\"rcBtnTextConsulta\">Enviar Consulta<\/span>\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <!-- Feedback -->\r\n      <div class=\"rc-feedback\" id=\"rcFeedbackConsulta\"><\/div>\r\n    <\/form>\r\n\r\n    <!-- Skeleton Loading -->\r\n    <div class=\"rc-skeleton\">\r\n      <div class=\"rc-skeleton-block rc-sk-sm\" style=\"margin-bottom:20px;\"><\/div>\r\n      <div class=\"rc-skeleton-row\">\r\n        <div class=\"rc-skeleton-block rc-sk-h-sm\"><\/div>\r\n        <div class=\"rc-skeleton-block rc-sk-h-sm\"><\/div>\r\n      <\/div>\r\n      <div class=\"rc-skeleton-row\">\r\n        <div class=\"rc-skeleton-block rc-sk-h-sm\"><\/div>\r\n      <\/div>\r\n      <div class=\"rc-skeleton-block rc-sk-h-lg\"><\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- ========== MODAL: Restaurar formulario guardado ========== -->\r\n<div class=\"rc-modal-overlay\" id=\"rcRestoreModalOverlay\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"rcRestoreModalTitle\">\r\n  <div class=\"rc-modal\">\r\n    <div class=\"rc-modal-icon rc-modal-icon-info\">\r\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n        <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"\/>\r\n        <polyline points=\"17 8 12 3 7 8\"\/>\r\n        <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\"\/>\r\n      <\/svg>\r\n    <\/div>\r\n    <h3 class=\"rc-modal-title\" id=\"rcRestoreModalTitle\">Formulario guardado<\/h3>\r\n    <p class=\"rc-modal-body\">Se encontr\u00f3 un formulario guardado.<br>\u00bfDesea restaurarlo?<\/p>\r\n    <div class=\"rc-modal-footer\">\r\n      <button class=\"rc-modal-btn rc-modal-btn-primary\" id=\"rcRestoreBtn\">Restaurar<\/button>\r\n      <button class=\"rc-modal-btn rc-modal-btn-secondary\" id=\"rcDiscardBtn\">Descartar<\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- ========== MODAL: Confirmaci\u00f3n de env\u00edo ========== -->\r\n<div class=\"rc-modal-overlay\" id=\"rcConfirmModalOverlay\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"rcConfirmModalTitle\">\r\n  <div class=\"rc-modal\">\r\n    <div class=\"rc-modal-icon rc-modal-icon-warn\">\r\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n        <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"\/>\r\n        <polyline points=\"22 4 12 14.01 9 11.01\"\/>\r\n      <\/svg>\r\n    <\/div>\r\n    <h3 class=\"rc-modal-title\" id=\"rcConfirmModalTitle\">\u00bfDesea enviar este formulario?<\/h3>\r\n    <p class=\"rc-modal-body\" id=\"rcConfirmModalBody\">Revise los datos antes de continuar.<\/p>\r\n    <div class=\"rc-modal-footer\">\r\n      <button class=\"rc-modal-btn rc-modal-btn-primary\" id=\"rcConfirmSendBtn\">Enviar<\/button>\r\n      <button class=\"rc-modal-btn rc-modal-btn-secondary\" id=\"rcConfirmCancelBtn\">Cancelar<\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n  (function() {\r\n    'use strict';\r\n\r\n    \/* ================================================================\r\n       SISTEMA DE FORMULARIOS - HOJA DE RECLAMO Y CONSULTA\r\n       JavaScript Vanilla | No jQuery | AJAX con fetch()\r\n       v2.2 - Hardened | Exclusivo Persona Jur\u00eddica\r\n       Endurecido con OWASP: anti-XSS, anti-SQLi, anti-emoji,\r\n       normalizaci\u00f3n Unicode NFC, detecci\u00f3n texto repetitivo,\r\n       token anti-duplicado, rate limiting, y m\u00e1s.\r\n       ================================================================ *\/\r\n\r\n    \/* ---------- Referencias DOM (cache) ---------- *\/\r\n    var btnSelectorReclamo = document.getElementById('rcBtnSelectorReclamo');\r\n    var btnSelectorConsulta = document.getElementById('rcBtnSelectorConsulta');\r\n    var formReclamo = document.getElementById('rcFormReclamo');\r\n    var formConsulta = document.getElementById('rcFormConsulta');\r\n\r\n    \/* ---------- Progress Bar ---------- *\/\r\n    var progressContainer = document.getElementById('rcProgressContainer');\r\n    var progressFill = document.getElementById('rcProgressFill');\r\n    var progressPercentage = document.getElementById('rcProgressPercentage');\r\n    var progressStep = document.getElementById('rcProgressStep');\r\n\r\n    \/* ---------- Form Reclamo ---------- *\/\r\n    var reclamoForm = document.getElementById('rcReclamoForm');\r\n    var reclamoBtn = document.getElementById('rcBtnReclamo');\r\n    var reclamoSpinner = document.getElementById('rcSpinnerReclamo');\r\n    var reclamoBtnText = document.getElementById('rcBtnTextReclamo');\r\n    var reclamoFeedback = document.getElementById('rcFeedbackReclamo');\r\n    var counterReclamo = document.getElementById('rcCounterReclamo');\r\n    var textareaReclamo = document.getElementById('rc_descripcion_reclamo');\r\n\r\n    \/* ---------- Form Consulta ---------- *\/\r\n    var consultaForm = document.getElementById('rcConsultaForm');\r\n    var consultaBtn = document.getElementById('rcBtnConsulta');\r\n    var consultaSpinner = document.getElementById('rcSpinnerConsulta');\r\n    var consultaBtnText = document.getElementById('rcBtnTextConsulta');\r\n    var consultaFeedback = document.getElementById('rcFeedbackConsulta');\r\n    var counterConsulta = document.getElementById('rcCounterConsulta');\r\n    var textareaConsulta = document.getElementById('rc_cons_descripcion');\r\n\r\n    \/* ---------- Fields counters ---------- *\/\r\n    var counterReclamoFields = document.getElementById('rcCounterReclamoFields');\r\n    var totalReclamoFieldsEl = document.getElementById('rcTotalReclamoFields');\r\n    var counterConsultaFields = document.getElementById('rcCounterConsultaFields');\r\n    var totalConsultaFieldsEl = document.getElementById('rcTotalConsultaFields');\r\n\r\n    \/* ---------- Modals ---------- *\/\r\n    var restoreModalOverlay = document.getElementById('rcRestoreModalOverlay');\r\n    var restoreBtn = document.getElementById('rcRestoreBtn');\r\n    var discardBtn = document.getElementById('rcDiscardBtn');\r\n    var confirmModalOverlay = document.getElementById('rcConfirmModalOverlay');\r\n    var confirmSendBtn = document.getElementById('rcConfirmSendBtn');\r\n    var confirmCancelBtn = document.getElementById('rcConfirmCancelBtn');\r\n\r\n    \/* ---------- Estado ---------- *\/\r\n    var currentVisibleForm = null;\r\n    var isSubmitting = false;\r\n    var formSubmitted = false; \/* ponytail: evita beforeunload despu\u00e9s de env\u00edo exitoso *\/\r\n    var pendingSubmit = null; \/* ponytail: guarda el submit pendiente tras confirmaci\u00f3n *\/\r\n    var formStartTime = Date.now(); \/* ponytail: timestamp para validar tiempo m\u00ednimo *\/\r\n    var usedTokens = {}; \/* ponytail: tokens ya usados para evitar env\u00edos duplicados *\/\r\n\r\n    \/* ================================================================\r\n       NORMALIZACI\u00d3N DE TEXTO (Unicode NFC + strip invisible chars)\r\n       Se ejecuta ANTES de cualquier validaci\u00f3n.\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Normaliza un texto: NFC, elimina caracteres invisibles, normaliza espacios\r\n     * @param {string} value - Texto crudo\r\n     * @returns {string} Texto normalizado\r\n     *\/\r\n    function normalizarTexto(value) {\r\n      if (!value) return '';\r\n      var result = value;\r\n\r\n      \/* ponytail: Normalizar Unicode NFC (combina caracteres compuestos) *\/\r\n      try {\r\n        result = result.normalize('NFC');\r\n      } catch (e) {\r\n        \/* navegador antiguo sin soporte NFC, continuar *\/\r\n      }\r\n\r\n      \/* Eliminar caracteres de control (excepto tab, newline, carriage return para textareas) *\/\r\n      result = result.replace(\/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]\/g, '');\r\n\r\n      \/* Eliminar caracteres Unicode invisibles y RTL *\/\r\n      result = result.replace(\/[\\u200B-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\uFEFF\\u00AD\\u034F\\u061C\\u115F-\\u1160\\u17B4\\u17B5\\u180E\\u2000-\\u200A\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFFF0-\\uFFF8]\/g, '');\r\n\r\n      \/* Eliminar Zero-Width characters adicionales *\/\r\n      result = result.replace(\/[\\u200B\\u200C\\u200D\\uFEFF]\/g, '');\r\n\r\n      return result;\r\n    }\r\n\r\n    \/**\r\n     * Normaliza espacios: elimina dobles, iniciales, finales, secuencias enormes\r\n     * @param {string} value\r\n     * @returns {string}\r\n     *\/\r\n    function normalizarEspacios(value) {\r\n      if (!value) return '';\r\n      \/* Reemplazar cualquier secuencia de whitespace (incluyendo tabs) por un solo espacio *\/\r\n      var result = value.replace(\/[\\s\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]+\/g, ' ');\r\n      \/* Trim *\/\r\n      result = result.trim();\r\n      return result;\r\n    }\r\n\r\n    \/**\r\n     * Pipeline completo de normalizaci\u00f3n: NFC + invisibles + espacios\r\n     * @param {string} value\r\n     * @returns {string}\r\n     *\/\r\n    function normalizar(value) {\r\n      return normalizarEspacios(normalizarTexto(value));\r\n    }\r\n\r\n    \/* ================================================================\r\n       DETECCI\u00d3N DE PATRONES MALICIOSOS Y NO V\u00c1LIDOS\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Verifica si el texto contiene emojis\r\n     * @param {string} value\r\n     * @returns {boolean}\r\n     *\/\r\n    function contieneEmojis(value) {\r\n      \/* ponytail: rango Unicode completo de emojis + modificadores + secuencias *\/\r\n      return \/[\\u{1F600}-\\u{1F64F}\\u{1F300}-\\u{1F5FF}\\u{1F680}-\\u{1F6FF}\\u{1F1E0}-\\u{1F1FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}\\u{1F900}-\\u{1F9FF}\\u{1FA00}-\\u{1FA6F}\\u{1FA70}-\\u{1FAFF}\\u{2300}-\\u{23FF}\\u{2B50}\\u{2B55}\\u{2934}\\u{2935}\\u{3030}\\u{303D}\\u{3297}\\u{3299}\\u{FE0F}\\u{200D}]\/u.test(value);\r\n    }\r\n\r\n    \/**\r\n     * Verifica si el texto contiene etiquetas HTML\r\n     * @param {string} value\r\n     * @returns {boolean}\r\n     *\/\r\n    function contieneHTML(value) {\r\n      return \/<\\s*(script|div|img|iframe|style|svg|video|audio|embed|object|applet|meta|link|frame|frameset|form|input|button|textarea|select|option|a|body|head|html|base|canvas|noscript|math|plaintext|xmp|isindex|keygen|output|progress|datalist|fieldset|legend|article|aside|details|figcaption|figure|footer|header|main|mark|nav|section|summary|time|wbr|br|hr|b|i|u|s|em|strong|small|span|label|table|tr|td|th|tbody|thead|tfoot)[\\s>\\\/]\/i.test(value) ||\r\n             \/<\\\/\\s*[a-zA-Z][a-zA-Z0-9]*\\s*>\/i.test(value) ||\r\n             \/<\\s*!--\/i.test(value) ||\r\n             \/<\\s*!\\[CDATA\/i.test(value);\r\n    }\r\n\r\n    \/**\r\n     * Verifica si el texto contiene patrones de SQL Injection\r\n     * @param {string} value\r\n     * @returns {boolean}\r\n     *\/\r\n    function contieneSQL(value) {\r\n      var upper = value.toUpperCase();\r\n      return \/\\b(SELECT|DROP|INSERT|DELETE|UPDATE|UNION|ALTER|CREATE|TRUNCATE|EXEC|EXECUTE|SLEEP|BENCHMARK|LOAD_FILE|INFORMATION_SCHEMA|OUTFILE|DUMPFILE|XP_|WAITFOR|CHAR\\s*\\(|ASCII\\s*\\(|SUBSTR\\s*\\(|MID\\s*\\(|VERSION\\s*\\(|DATABASE\\s*\\(|USER\\s*\\(|CURRENT_USER\\b|SESSION_USER\\b|SYSTEM_USER\\b|PG_SLEEP\\b|SLEEP\\s*\\(|BENCHMARK\\s*\\(|ORD\\s*\\(|HEX\\s*\\()\\b\/i.test(upper) ||\r\n             \/(\\bOR\\b|\\bAND\\b)\\s+\\d+\\s*=\\s*\\d+\/i.test(upper) ||\r\n             \/'\\s*OR\\s+'1'\\s*=\\s*'1\/i.test(value) ||\r\n             \/'\\s*OR\\s+1\\s*=\\s*1\/i.test(value) ||\r\n             \/'\\s*;\\s*(DROP|DELETE|UPDATE|INSERT)\/i.test(value) ||\r\n             \/(\\bOR\\b|\\bAND\\b)\\s+'\\d+'\\s*=\\s*'\\d+\/i.test(value) ||\r\n             \/UNION\\s+(ALL\\s+)?SELECT\/i.test(upper);\r\n    }\r\n\r\n    \/**\r\n     * Verifica si el texto contiene patrones de XSS\r\n     * @param {string} value\r\n     * @returns {boolean}\r\n     *\/\r\n    function contieneXSS(value) {\r\n      var lower = value.toLowerCase();\r\n      return \/(javascript\\s*:|onload\\s*=|onerror\\s*=|onclick\\s*=|onmouseover\\s*=|onfocus\\s*=|onblur\\s*=|onchange\\s*=|onsubmit\\s*=|onkey\\w+\\s*=|src\\s*=\\s*[\"']?\\s*javascript|href\\s*=\\s*[\"']?\\s*javascript|data\\s*:\\s*text\\\/html|vbscript\\s*:|expression\\s*\\(|eval\\s*\\(|document\\.cookie|document\\.write|window\\.location|alert\\s*\\(|confirm\\s*\\(|prompt\\s*\\()\/i.test(value) ||\r\n             \/&#x?[0-9a-fA-F]+;?\/i.test(value.replace(\/&(amp|lt|gt|quot|apos|nbsp);\/g, ''));\r\n    }\r\n\r\n    \/**\r\n     * Verifica si el texto es repetitivo (patrones como aaaaa, 11111, asdfasdf, qwertyqwerty)\r\n     * @param {string} value\r\n     * @returns {boolean}\r\n     *\/\r\n    function esTextoRepetitivo(value) {\r\n      if (!value || value.length < 5) return false;\r\n      var clean = value.replace(\/\\s+\/g, '').toLowerCase();\r\n\r\n      \/* Un solo car\u00e1cter repetido 5+ veces *\/\r\n      if (\/^(.)\\1{4,}$\/.test(clean)) return true;\r\n\r\n      \/* Patrones de teclado repetidos *\/\r\n      var patronesTeclado = \/^(asdf|qwer|zxcv|qwerty|asdfg|12345|abcde){2,}$\/i;\r\n      if (patronesTeclado.test(clean)) return true;\r\n\r\n      \/* Secuencia de 2+ caracteres repetida 3+ veces *\/\r\n      if (\/(.{2,})\\1{2,}\/.test(clean)) return true;\r\n\r\n      \/* Solo contiene puntuaci\u00f3n\/s\u00edmbolos *\/\r\n      if (\/^[\\p{P}\\p{S}\\s]+$\/u.test(clean) && clean.length > 0) return true;\r\n\r\n      return false;\r\n    }\r\n\r\n    \/**\r\n     * Verifica si el texto contiene caracteres invisibles o de control\r\n     * @param {string} value\r\n     * @returns {boolean}\r\n     *\/\r\n    function contieneCaracteresInvisibles(value) {\r\n      \/* ponytail: detectar si a\u00fan quedan caracteres invisibles despu\u00e9s de normalizar *\/\r\n      return \/[\\u200B-\\u200F\\u2028-\\u202F\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\u00AD\\u180E\\u200C\\u200D]\/.test(value);\r\n    }\r\n\r\n    \/**\r\n     * Verifica si el texto contiene URLs completas maliciosas\r\n     * @param {string} value\r\n     * @returns {boolean}\r\n     *\/\r\n    function contieneURLMaliciosa(value) {\r\n      \/* Solo bloquea URLs completas con protocolos peligrosos *\/\r\n      return \/(https?:\\\/\\\/|ftp:\\\/\\\/|javascript:|data:text\\\/html|vbscript:|file:\\\/\\\/)\/i.test(value);\r\n    }\r\n\r\n    \/* ================================================================\r\n       BLOQUEO DE DOMINIOS TEMPORALES DE EMAIL (lista negra configurable)\r\n       ================================================================ *\/\r\n\r\n    var DOMINIOS_TEMPORALES = [\r\n      'mailinator.com', 'guerrillamail.com', '10minutemail.com', 'tempmail.com',\r\n      'temp-mail.org', 'throwaway.email', 'yopmail.com', 'sharklasers.com',\r\n      'trashmail.com', 'dispostable.com', 'maildrop.cc', 'getairmail.com',\r\n      'emailondeck.com', 'spam4.me', 'wegwerfemail.de', 'moakt.com',\r\n      'fakeinbox.com', 'tempinbox.com', 'mintemail.com', 'mailcatch.com',\r\n      'emailtemporanea.com', 'correotemporal.com', 'temporalmail.com',\r\n      'tmpmail.org', 'disposablemail.com', '0wnd.net', '0wnd.org',\r\n      '10minut.com.pl', '1mail.ml', '33mail.com', '3d-painting.com',\r\n      '4warding.com', '4warding.net', '4warding.org', '60minutemail.com',\r\n      '6url.com', '75hosting.com', '7days-printing.com', '9ox.net',\r\n      'a-bc.net', 'anonmails.de', 'antichef.com', 'antireg.ru',\r\n      'antispam.de', 'baxomale.ht.cx', 'binkmail.com', 'bio-muesli.net',\r\n      'bobmail.info', 'bofthew.com', 'brefmail.com', 'bsnow.net',\r\n      'bugmenot.com', 'bumpymail.com', 'cachedot.net', 'chammy.info',\r\n      'chewiemail.com', 'cool.fr.nf', 'courriel.fr.nf', 'cuvox.de',\r\n      'dacoolest.com', 'dandikmail.com', 'dayrep.com', 'dcemail.com',\r\n      'deadaddress.com', 'deadspam.com', 'despam.it', 'devnullmail.com',\r\n      'dfgh.net', 'digitalsanctuary.com', 'discardmail.com', 'discardmail.de',\r\n      'dodgeit.com', 'dodgit.com', 'donemail.ru', 'dontreg.com',\r\n      'dontsendmespam.de', 'dump-email.info', 'dumpmail.de', 'e-mail.com',\r\n      'e-mail.org', 'e4ward.com', 'easytrashmail.com', 'einrot.com',\r\n      'einrot.de', 'email60.com', 'emailgo.de', 'emaillime.com',\r\n      'emailmiser.com', 'emailproxsy.com', 'emailtemporanea.net',\r\n      'emailto.de', 'emailwarden.com', 'emailx.at.hm', 'emailxfer.com',\r\n      'emz.net', 'enterto.com', 'ephemail.net', 'ero-tube.org',\r\n      'etranquil.com', 'etranquil.net', 'etranquil.org', 'evopo.com',\r\n      'explodemail.com', 'eyepaste.com', 'fakeinbox.com', 'fakeinformation.com',\r\n      'fastacura.com', 'fastchevy.com', 'fastchrysler.com', 'fastkawasaki.com',\r\n      'fastmazda.com', 'fastmitsubishi.com', 'fastnissan.com', 'fastsubaru.com',\r\n      'fastsuzuki.com', 'fasttoyota.com', 'fastyamaha.com', 'filzmail.com',\r\n      'fivemail.de', 'fleckens.hu', 'flyingmail.com', 'frapmail.com',\r\n      'freundin.ru', 'friendlymail.co.uk', 'front14.org', 'fuckingduh.com',\r\n      'fudgerub.com', 'fyii.de', 'garliclife.com', 'gehensiemirnichtaufdienerv.de',\r\n      'get-mail.cf', 'get-mail.ga', 'get-mail.ml', 'get-mail.tk',\r\n      'get1mail.com', 'get2mail.fr', 'getonemail.com', 'ghosttexter.de',\r\n      'girlsundertheinfluence.com', 'gishpuppy.com', 'gowikibooks.com',\r\n      'gowikicampus.com', 'gowikicars.com', 'gowikifilms.com', 'gowikigames.com',\r\n      'gowikimusic.com', 'gowikinetwork.com', 'gowikitravel.com', 'gowikitv.com',\r\n      'great-host.in', 'greensloth.com', 'grr.la', 'gsrv.co.uk',\r\n      'guerrillamail.biz', 'guerrillamail.com', 'guerrillamail.de',\r\n      'guerrillamail.info', 'guerrillamail.net', 'guerrillamail.org',\r\n      'guerrillamailblock.com', 'gustr.com', 'h.mintemail.com',\r\n      'h8s.org', 'haltospam.com', 'harakirimail.com', 'hatespam.org',\r\n      'herp.in', 'hidemail.de', 'hmamail.com', 'hochsitze.com',\r\n      'hotpop.com', 'hulapla.de', 'ieatspam.eu', 'ieatspam.info',\r\n      'ihateyoualot.info', 'iheartspam.org', 'imails.info', 'inboxclean.com',\r\n      'inboxclean.org', 'incognitomail.com', 'incognitomail.net',\r\n      'incognitomail.org', 'insorg-mail.info', 'ipoo.org', 'irish2me.com',\r\n      'iwi.net', 'jetable.com', 'jetable.fr.nf', 'jetable.net',\r\n      'jetable.org', 'jnxjn.com', 'jourrapide.com', 'junk1e.com',\r\n      'kasmail.com', 'kaspop.com', 'keepmymail.com', 'kir.ch.tc',\r\n      'klassmaster.com', 'klassmaster.net', 'kloap.com', 'klzlk.com',\r\n      'kook.ml', 'koszmail.pl', 'kulturbetrieb.info', 'kurzepost.de',\r\n      'l33r.eu', 'lackmail.net', 'lags.us', 'landmail.co',\r\n      'lawlita.com', 'letthemeatspam.com', 'lhsdv.com', 'lifebyfood.com',\r\n      'link2mail.net', 'litedrop.com', 'logular.com', 'lol.ovpn.to',\r\n      'lookugly.com', 'lopl.co.cc', 'lortemail.dk', 'lovemeleaveme.com',\r\n      'lr78.com', 'm4ilweb.info', 'maboard.com', 'mail-filter.com',\r\n      'mail-temporaire.fr', 'mail.by', 'mail.mezimages.net', 'mail.zp.ua',\r\n      'mail114.net', 'mail1a.de', 'mail21.cc', 'mail2rss.org',\r\n      'mail333.com', 'mail4trash.com', 'mailbidon.com', 'mailbiz.biz',\r\n      'mailblocks.com', 'mailbucket.org', 'mailcat.biz', 'mailcatch.com',\r\n      'mailde.de', 'mailde.info', 'maildrop.cc', 'maildx.com',\r\n      'maileater.com', 'mailexpire.com', 'mailfa.tk', 'mailforspam.com',\r\n      'mailfree.li', 'mailfs.com', 'mailguard.me', 'mailhazard.com',\r\n      'mailhazard.us', 'mailhz.me', 'mailimate.com', 'mailin8r.com',\r\n      'mailinater.com', 'mailinator.com', 'mailinator.net', 'mailinator.org',\r\n      'mailinator.us', 'mailinator2.com', 'mailincubator.com', 'mailismagic.com',\r\n      'mailme.ir', 'mailme.lv', 'mailmetrash.com', 'mailmoat.com',\r\n      'mailms.com', 'mailna.biz', 'mailna.co', 'mailna.in',\r\n      'mailna.me', 'mailnator.com', 'mailnesia.com', 'mailnull.com',\r\n      'mailorg.org', 'mailpick.biz', 'mailproxsy.com', 'mailquack.com',\r\n      'mailrock.biz', 'mailscrap.com', 'mailseal.de', 'mailshell.com',\r\n      'mailshiv.com', 'mailsiphon.com', 'mailslite.com', 'mailsucker.net',\r\n      'mailtemp.info', 'mailtome.de', 'mailtothis.com', 'mailtraps.com',\r\n      'mailtrash.net', 'mailtv.net', 'mailtv.tv', 'mailzi.ru',\r\n      'mailzilla.com', 'makemetheking.com', 'manifestgenerator.com',\r\n      'manybrain.com', 'mbx.cc', 'mega.zik.dj', 'meinspamschutz.com',\r\n      'meltmail.com', 'messagebeamer.de', 'mezimages.net', 'mintemail.com',\r\n      'misterpinball.de', 'moncourrier.fr.nf', 'monemail.fr.nf',\r\n      'monmail.fr.nf', 'msa.minsmail.com', 'mt2009.com', 'mx0.wwwnew.eu',\r\n      'mycard.net.ua', 'mycleaninbox.net', 'mymail-in.net',\r\n      'mypacks.net', 'mypartyclip.de', 'myphantomemail.com', 'mysamp.de',\r\n      'myspaceinc.com', 'myspaceinc.net', 'myspaceinc.org',\r\n      'myspacepimpedup.com', 'myspamless.com', 'mytemp.email',\r\n      'mytempemail.com', 'nepwk.com', 'nervmich.net', 'nervtmich.net',\r\n      'netmails.com', 'netmails.net', 'netzidiot.de', 'neverbox.com',\r\n      'nice-4u.com', 'nincsmail.com', 'nincsmail.hu', 'noblepioneer.com',\r\n      'nobugmail.com', 'nobulk.com', 'noclickemail.com', 'nogmailspam.info',\r\n      'nomail.pw', 'nomail2me.com', 'nomorespamemails.com', 'nonspam.eu',\r\n      'nonspammer.de', 'noref.in', 'noreply.fr', 'notmailinator.com', 'nospam4.us',\r\n      'nospamfor.us', 'nospamthanks.info', 'nowmymail.com', 'nurfuerspam.de',\r\n      'nus.edu.sg', 'nwldx.com', 'objectmail.com', 'obobbo.com',\r\n      'odaymail.com', 'oneoffemail.com', 'onewaymail.com', 'online.ms',\r\n      'oopi.org', 'opayq.com', 'ordinaryamerican.net', 'otherinbox.com',\r\n      'ourklips.com', 'outlawspam.com', 'ovpn.to', 'owlpic.com',\r\n      'pancakemail.com', 'paplease.com', 'pcusers.otherinbox.com',\r\n      'pepbot.com', 'pfui.ru', 'pimpedupmyspace.com', 'pjjkp.com',\r\n      'plexolan.de', 'poczta.onet.pl', 'politikerclub.de', 'pooae.com',\r\n      'pookmail.com', 'privacy.net', 'proxymail.eu', 'prtnx.com',\r\n      'punkass.com', 'putthisinyourspamdatabase.com', 'pwrby.com',\r\n      'qasti.com', 'qisdo.com', 'qisoa.com', 'quickinbox.com',\r\n      'quietspam.com', 'rcpt.at', 'reallymymail.com', 'realtyalerts.ca',\r\n      'recode.me', 'recursor.net', 'regbypass.com', 'regbypass.comsafe-mail.net',\r\n      'rejectmail.com', 'rklips.com', 'rmqkr.net', 'royal.net',\r\n      'rppkn.com', 'rtrtr.com', 's0ny.net', 'safe-mail.net',\r\n      'safersignup.de', 'safetymail.info', 'safetypost.de', 'sandelf.de',\r\n      'saynotospams.com', 'schafmail.de', 'schrott-email.de',\r\n      'secretemail.de', 'secure-mail.biz', 'senseless-entertainment.com',\r\n      'services391.com', 'sharklasers.com', 'shieldemail.com',\r\n      'shiftmail.com', 'shitmail.de', 'shitmail.org', 'shitware.nl',\r\n      'shortmail.net', 'showslow.de', 'sibmail.com', 'skeefmail.com',\r\n      'slapsfromlastnight.com', 'slaskpost.se', 'slippery.email',\r\n      'slipry.net', 'smashmail.de', 'smellfear.com', 'snakemail.com',\r\n      'sneakemail.com', 'sneakmail.de', 'snkmail.com', 'sofimail.com',\r\n      'solowtech.com', 'soodonims.com', 'spam.la', 'spam.su',\r\n      'spam4.me', 'spamavert.com', 'spambob.com', 'spambob.net',\r\n      'spambob.org', 'spambog.com', 'spambog.de', 'spambog.net',\r\n      'spambog.ru', 'spambooger.com', 'spambox.info', 'spambox.us',\r\n      'spamcannon.com', 'spamcannon.net', 'spamcero.com', 'spamcon.org',\r\n      'spamcorptastic.com', 'spamcowboy.com', 'spamcowboy.net',\r\n      'spamcowboy.org', 'spamday.com', 'spamex.com', 'spamfree.eu',\r\n      'spamfree24.com', 'spamfree24.de', 'spamfree24.eu',\r\n      'spamfree24.info', 'spamfree24.net', 'spamfree24.org',\r\n      'spamgoes.in', 'spamgourmet.com', 'spamgourmet.net',\r\n      'spamgourmet.org', 'spamherelots.com', 'spamhole.com',\r\n      'spamify.com', 'spaminator.de', 'spamkill.info', 'spaml.com',\r\n      'spaml.de', 'spammotel.com', 'spamobox.com', 'spamoff.de',\r\n      'spamok.com', 'spamprobe.net', 'spamproofmail.com', 'spamrebellion.net',\r\n      'spamsalad.in', 'spamserver.biz', 'spamserver.net', 'spamslicer.com',\r\n      'spamspot.com', 'spamstack.com', 'spamthis.co.uk', 'spamthisplease.com',\r\n      'spamtrail.com', 'spamtroll.net', 'spamwc.cf', 'spamwc.ga',\r\n      'spamwc.gq', 'spamwc.ml', 'speed.1s.fr', 'spikio.com',\r\n      'spoofmail.de', 'squizzy.de', 'ssan.com', 'ssoia.com',\r\n      'startkeys.com', 'stinkefinger.net', 'stopmyspam.com',\r\n      'stuffmail.de', 'super-auswahl.de', 'supergreatmail.com',\r\n      'supermailer.jp', 'superrito.com', 'suremail.info', 'svk.jp',\r\n      'sweetxxx.de', 'tafmail.com', 'tagyourself.com', 'talkinator.com',\r\n      'tapchicuoihoi.com', 'techemail.com', 'techgroup.me', 'teewars.org',\r\n      'teleworm.com', 'tellos.xyz', 'temp-mail.org', 'temp-mail.ru',\r\n      'temp.emeraldwebmail.com', 'temp15min.com', 'tempail.com',\r\n      'tempalias.com', 'tempemail.biz', 'tempemail.co.za',\r\n      'tempemail.com', 'tempemail.net', 'tempinbox.co.uk',\r\n      'tempinbox.com', 'tempmail.co', 'tempmail.de', 'tempmail.eu',\r\n      'tempmail.it', 'tempmail.us', 'tempmail.ws', 'tempmail2.com',\r\n      'tempmaildemo.com', 'tempmailer.com', 'tempmailer.de',\r\n      'temporaryemail.us', 'temporaryinbox.com', 'temporarymailaddress.com',\r\n      'temporemail.com', 'temporarily.de', 'tempsky.com',\r\n      'tempthe.net', 'thankyou2010.com', 'thc.st', 'thietbivanphong.asia',\r\n      'thisisnotmyrealemail.com', 'thismail.net', 'throwawayemailaddress.com',\r\n      'tilien.com', 'tittbit.in', 'tizi.com', 'toiea.com',\r\n      'toomail.biz', 'topranklist.de', 'tradermail.info', 'trash-amil.com',\r\n      'trash-mail.at', 'trash-mail.com', 'trash-mail.de', 'trash2009.com',\r\n      'trashemail.de', 'trashmail.at', 'trashmail.com', 'trashmail.de',\r\n      'trashmail.me', 'trashmail.net', 'trashmail.org', 'trashmail.ws',\r\n      'trashmailer.com', 'trashymail.com', 'trashymail.net', 'trayna.com',\r\n      'trbvm.com', 'trbvn.com', 'trialmail.de', 'trickmail.net',\r\n      'trillianpro.com', 'tryalert.com', 'turual.com', 'twinmail.de',\r\n      'tyldd.com', 'uggsrock.com', 'umail2.com', 'upliftnow.com',\r\n      'uplipht.com', 'uroid.com', 'veryrealemail.com', 'vidchart.com',\r\n      'viralplays.com', 'vomoto.com', 'vpn.st', 'vps30.com',\r\n      'vsimcard.com', 'vubby.com', 'walala.org', 'walkmail.net',\r\n      'wasteland.rfc822.org', 'webemail.me', 'webm4il.info',\r\n      'wegwerf-email-addressen.de', 'wegwerf-emails.de', 'wegwerfadresse.de',\r\n      'wegwerfemail.com', 'wegwerfemail.de', 'wegwerfmail.de',\r\n      'wegwerfmail.info', 'wegwerfmail.net', 'wegwerfmail.org',\r\n      'wetrainbayarea.com', 'wilemail.com', 'willhackforfood.biz',\r\n      'willselfdestruct.com', 'winemaven.info', 'wins.com.br',\r\n      'wmail1.com', 'wmail2.com', 'wollan.info', 'wronghead.com',\r\n      'wuzup.net', 'wuzupmail.net', 'wwwnew.eu', 'xagloo.com',\r\n      'xemaps.com', 'xents.com', 'xmail.com', 'xmaily.com',\r\n      'xoxy.net', 'xww.ro', 'xyzfree.net', 'yapped.net',\r\n      'yeah.net', 'yep.it', 'yert.ye.vc', 'yogamaven.com',\r\n      'yopmail.com', 'yopmail.fr', 'yopmail.net', 'yopmail.org',\r\n      'ypmail.webarnak.fr.eu.org', 'yuurok.com', 'zehnminuten.de',\r\n      'zehnminutenmail.de', 'zippymail.info', 'zoaxe.com', 'zoemail.org', 'pokemail.net',\r\n      'zomg.info', 'zoominternet.net', 'zumpul.com'\r\n    ];\r\n\r\n    \/**\r\n     * Verifica si un dominio de correo es temporal\/desechable\r\n     * @param {string} email\r\n     * @returns {boolean}\r\n     *\/\r\n    function esDominioTemporal(email) {\r\n      if (!email || email.indexOf('@') === -1) return false;\r\n      var dominio = email.split('@')[1].toLowerCase().trim();\r\n      return DOMINIOS_TEMPORALES.indexOf(dominio) !== -1;\r\n    }\r\n\r\n    \/* ================================================================\r\n       DATOS: DEPARTAMENTOS Y MUNICIPIOS DE HONDURAS (oficiales)\r\n       ================================================================ *\/\r\n    var DEPARTAMENTOS_HN = {\r\n      'Atl\u00e1ntida': ['La Ceiba', 'Tela', 'El Porvenir', 'Esparta', 'Jutiapa', 'La Masica', 'San Francisco', 'Arizona'],\r\n      'Col\u00f3n': ['Trujillo', 'Tocoa', 'Sab\u00e1', 'Santa Fe', 'Santa Rosa de Agu\u00e1n', 'Sonaguera', 'Bonito Oriental', 'Iriona', 'Lim\u00f3n', 'Balfate'],\r\n      'Comayagua': ['Comayagua', 'Siguatepeque', 'El Rosario', 'La Libertad', 'Laman\u00ed', 'Las Lajas', 'Lejamani', 'Me\u00e1mbar', 'Minas de Oro', 'Ojos de Agua', 'San Jer\u00f3nimo', 'San Jos\u00e9 de Comayagua', 'San Jos\u00e9 del Potrero', 'San Luis', 'San Sebasti\u00e1n', 'Taulab\u00e9', 'Villa de San Antonio', 'Ajuterique', 'Esqu\u00edas', 'Humuya', 'La Trinidad'],\r\n      'Cop\u00e1n': ['Santa Rosa de Cop\u00e1n', 'Cop\u00e1n Ruinas', 'Corqu\u00edn', 'Cucuyagua', 'Dolores', 'El Para\u00edso', 'Florida', 'La Jigua', 'La Uni\u00f3n', 'Nueva Arcadia', 'San Agust\u00edn', 'San Antonio', 'San Jer\u00f3nimo', 'San Jos\u00e9', 'San Juan de Opoa', 'San Nicol\u00e1s', 'San Pedro', 'Santa Rita', 'Trinidad de Cop\u00e1n', 'Veracruz', 'Concepci\u00f3n', 'Caba\u00f1as', 'Dulce Nombre'],\r\n      'Cort\u00e9s': ['San Pedro Sula', 'Puerto Cort\u00e9s', 'Choloma', 'Villanueva', 'La Lima', 'Omoa', 'Pimienta', 'Potrerillos', 'San Antonio de Cort\u00e9s', 'San Francisco de Yojoa', 'San Manuel', 'Santa Cruz de Yojoa'],\r\n      'Choluteca': ['Choluteca', 'Ciudad Choluteca', 'Apacilagua', 'Concepci\u00f3n de Mar\u00eda', 'Duyure', 'El Corpus', 'El Triunfo', 'Marcovia', 'Morolica', 'Namasig\u00fce', 'Orocuina', 'Pespire', 'San Antonio de Flores', 'San Isidro', 'San Jos\u00e9', 'San Marcos de Col\u00f3n', 'Santa Ana de Yusguare'],\r\n      'El Para\u00edso': ['Yuscar\u00e1n', 'Danl\u00ed', 'Alauca', 'El Para\u00edso', 'G\u00fcinope', 'Jacaleapa', 'Liure', 'Morocel\u00ed', 'Oropol\u00ed', 'Potrerillos', 'San Antonio de Flores', 'San Lucas', 'San Mat\u00edas', 'Soledad', 'Teupasenti', 'Tex\u00edguat', 'Trojes', 'Vado Ancho', 'Yauyupe'],\r\n      'Francisco Moraz\u00e1n': ['Distrito Central (Tegucigalpa)', 'San Pedro Sula', 'Alubar\u00e9n', 'Cedros', 'Curar\u00e9n', 'El Porvenir', 'Guaimaca', 'La Libertad', 'La Venta', 'Lepaterique', 'Maraita', 'Marale', 'Nueva Armenia', 'Ojojona', 'Orica', 'Reitoca', 'Sabanagrande', 'San Antonio de Oriente', 'San Buenaventura', 'San Ignacio', 'San Juan de Flores', 'San Miguelito', 'Santa Ana', 'Santa Luc\u00eda', 'Talanga', 'Tatumbla', 'Valle de \u00c1ngeles', 'Villa de San Francisco', 'Vallecillo'],\r\n      'Gracias a Dios': ['Puerto Lempira', 'Brus Laguna', 'Ahuas', 'Juan Francisco Bulnes', 'Ram\u00f3n Villeda Morales', 'Wampusirpi'],\r\n      'Intibuc\u00e1': ['La Esperanza', 'Intibuc\u00e1', 'Camasca', 'Colomoncagua', 'Concepci\u00f3n', 'Dolores', 'Jes\u00fas de Otoro', 'Magdalena', 'Masaguara', 'San Antonio', 'San Francisco de Opalaca', 'San Isidro', 'San Juan', 'San Marcos de la Sierra', 'San Miguel Guancapla', 'Santa Luc\u00eda', 'Yamaranguila'],\r\n      'Islas de la Bah\u00eda': ['Roat\u00e1n', 'Jos\u00e9 Santos Guardiola', 'Guanaja', 'Utila'],\r\n      'La Paz': ['La Paz', 'Aguanqueterique', 'Caba\u00f1as', 'Cane', 'Chinacla', 'Guajiquiro', 'Lauterique', 'Marcala', 'Mercedes de Oriente', 'Opatoro', 'San Antonio del Norte', 'San Jos\u00e9', 'San Juan', 'San Pedro de Tutule', 'Santa Ana', 'Santa Elena', 'Santa Mar\u00eda', 'Santiago de Puringla', 'Yarula'],\r\n      'Lempira': ['Gracias', 'Bel\u00e9n', 'Candelaria', 'Cololaca', 'Erandique', 'Gualcince', 'Guarita', 'La Campa', 'La Iguala', 'Las Flores', 'La Uni\u00f3n', 'La Virtud', 'Lepaera', 'Mapulaca', 'Piraera', 'San Andr\u00e9s', 'San Francisco', 'San Juan Guarita', 'San Manuel de Colohete', 'San Marcos de Caiqu\u00edn', 'San Rafael', 'San Sebasti\u00e1n', 'Santa Cruz', 'Talgua', 'Tambla', 'Tomal\u00e1', 'Valladolid', 'Virginia'],\r\n      'Ocotepeque': ['Ocotepeque', 'Bel\u00e9n Gualcho', 'Concepci\u00f3n', 'Dolores Merend\u00f3n', 'Fraternidad', 'La Encarnaci\u00f3n', 'La Labor', 'Lucerna', 'Mercedes', 'San Fernando', 'San Francisco del Valle', 'San Jorge', 'San Marcos', 'Santa Fe', 'Sensenti', 'Sinuapa'],\r\n      'Olancho': ['Juticalpa', 'Catacamas', 'Campamento', 'Concordia', 'Dulce Nombre de Culm\u00ed', 'El Rosario', 'Esquipulas del Norte', 'Gualaco', 'Guarizama', 'Guata', 'Guayape', 'Jano', 'La Uni\u00f3n', 'Mangulile', 'Manto', 'Patuca', 'Salam\u00e1', 'San Esteban', 'San Francisco de Becerra', 'San Francisco de la Paz', 'Santa Mar\u00eda del Real', 'Silca', 'Yoc\u00f3n'],\r\n      'Santa B\u00e1rbara': ['Santa B\u00e1rbara', 'Arada', 'Atima', 'Azacualpa', 'Ceguaca', 'Chinda', 'Concepci\u00f3n del Norte', 'Concepci\u00f3n del Sur', 'El N\u00edspero', 'Gualala', 'Ilama', 'Las Vegas', 'Macuelizo', 'Naranjito', 'Nuevo Celilac', 'Petoa', 'Protecci\u00f3n', 'Quimist\u00e1n', 'San Francisco de Ojuera', 'San Jos\u00e9 de Colinas', 'San Luis', 'San Marcos', 'San Nicol\u00e1s', 'San Pedro Zacapa', 'San Vicente Centenario', 'Santa Rita', 'Trinidad'],\r\n      'Valle': ['Nacaome', 'San Lorenzo', 'Alianza', 'Amapala', 'Aramecina', 'Caridad', 'Goascor\u00e1n', 'Langue', 'San Francisco de Coray'],\r\n      'Yoro': ['Yoro', 'El Progreso', 'Arenal', 'El Negrito', 'Joc\u00f3n', 'Moraz\u00e1n', 'Olanchito', 'Santa Rita', 'Sulaco', 'Victoria', 'Yorito']\r\n    };\r\n\r\n    \/* ================================================================\r\n       PREFIJOS TELEF\u00d3NICOS V\u00c1LIDOS DE HONDURAS\r\n       ================================================================ *\/\r\n    var PREFIJOS_TELEFONO_HN = [\r\n      '2', '3', '4', '5', '6', '7',  \/* l\u00ednea fija *\/\r\n      '8', '9',                        \/* m\u00f3vil *\/\r\n      '31','32','33','34','35','36','37','38','39', \/* m\u00f3vil Tigo *\/\r\n      '87','88','89',                  \/* m\u00f3vil Claro *\/\r\n      '93','94','95','96','97','98','99' \/* m\u00f3vil *\/\r\n    ];\r\n\r\n    \/* ================================================================\r\n       VALIDACI\u00d3N DE IDENTIDAD HONDURE\u00d1A\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Valida el formato y datos de una identidad hondure\u00f1a\r\n     * Formato: DDDD-AAAA-NNNNN (departamento-municipio-a\u00f1o-n\u00famero)\r\n     * @param {string} valor - N\u00famero de identidad\r\n     * @returns {{valido: boolean, error: string}}\r\n     *\/\r\n    function validarIdentidadHondurena(valor) {\r\n      var limpio = valor.replace(\/\\D\/g, '');\r\n      if (limpio.length !== 13) {\r\n        return { valido: false, error: 'La identidad debe tener 13 d\u00edgitos.' };\r\n      }\r\n\r\n      var codigoDepto = parseInt(limpio.substring(0, 2), 10);\r\n      var codigoMuni = parseInt(limpio.substring(2, 4), 10);\r\n      var ano = parseInt(limpio.substring(4, 8), 10);\r\n      var correlativo = limpio.substring(8, 13);\r\n\r\n      \/* Departamentos v\u00e1lidos de Honduras: 01-18 *\/\r\n      if (codigoDepto < 1 || codigoDepto > 18) {\r\n        return { valido: false, error: 'C\u00f3digo de departamento inv\u00e1lido en la identidad.' };\r\n      }\r\n\r\n      \/* Municipio v\u00e1lido: 01-28 (m\u00e1ximo municipios en un departamento) *\/\r\n      if (codigoMuni < 1 || codigoMuni > 28) {\r\n        return { valido: false, error: 'C\u00f3digo de municipio inv\u00e1lido en la identidad.' };\r\n      }\r\n\r\n      \/* A\u00f1o razonable: entre 1920 y a\u00f1o actual *\/\r\n      var anoActual = new Date().getFullYear();\r\n      if (ano < 1920 || ano > anoActual) {\r\n        return { valido: false, error: 'A\u00f1o inv\u00e1lido en la identidad.' };\r\n      }\r\n\r\n      \/* Correlativo debe ser num\u00e9rico *\/\r\n      if (!\/^\\d{5}$\/.test(correlativo)) {\r\n        return { valido: false, error: 'Formato de identidad inv\u00e1lido.' };\r\n      }\r\n\r\n      return { valido: true, error: '' };\r\n    }\r\n\r\n    \/* ================================================================\r\n       LOCAL STORAGE: Autoguardado del formulario\r\n       ================================================================ *\/\r\n    var STORAGE_KEY = 'rc_form_autosave';\r\n\r\n    \/**\r\n     * Guarda todos los datos visibles del formulario en LocalStorage\r\n     * No guarda tokens, nonces ni informaci\u00f3n sensible.\r\n     *\/\r\n    function saveToLocalStorage() {\r\n      if (formSubmitted) return; \/* ponytail: no guardar despu\u00e9s de env\u00edo exitoso *\/\r\n\r\n      var data = {\r\n        formType: currentVisibleForm,\r\n        fields: {},\r\n        timestamp: Date.now()\r\n      };\r\n\r\n      \/* Recopilar todos los inputs, textareas y search-selects visibles *\/\r\n      var allInputs = document.querySelectorAll('#rcReclamoForm .rc-field-input, #rcReclamoForm .rc-field-textarea, #rcConsultaForm .rc-field-input, #rcConsultaForm .rc-field-textarea');\r\n      allInputs.forEach(function(input) {\r\n        if (input.offsetParent !== null) {\r\n          \/* ponytail: no guardar tokens, nonces ni campos sensibles *\/\r\n          if (input.name === 'rc_submit_token' || input.name === 'rc_form_start' || input.name === 'rc_hp') return;\r\n          data.fields[input.id] = input.value;\r\n        }\r\n      });\r\n\r\n      \/* Guardar tambi\u00e9n los hidden de departamento y municipio *\/\r\n      var hiddenInputs = document.querySelectorAll('#rc_departamento, #rc_municipio');\r\n      hiddenInputs.forEach(function(input) {\r\n        data.fields[input.id] = input.value;\r\n      });\r\n\r\n      \/* Guardar tambi\u00e9n el tipo de documento *\/\r\n      var tipoDocEl = document.getElementById('rc_tipo_documento');\r\n      if (tipoDocEl && tipoDocEl.offsetParent !== null) {\r\n        data.fields['rc_tipo_documento'] = tipoDocEl.value;\r\n      }\r\n\r\n      try {\r\n        localStorage.setItem(STORAGE_KEY, JSON.stringify(data));\r\n      } catch (e) {\r\n        \/* ponytail: LocalStorage lleno o no disponible, ignorar silenciosamente *\/\r\n      }\r\n    }\r\n\r\n    \/**\r\n     * Carga datos desde LocalStorage\r\n     * @returns {object|null} Los datos guardados o null\r\n     *\/\r\n    function loadFromLocalStorage() {\r\n      try {\r\n        var raw = localStorage.getItem(STORAGE_KEY);\r\n        if (!raw) return null;\r\n        return JSON.parse(raw);\r\n      } catch (e) {\r\n        return null;\r\n      }\r\n    }\r\n\r\n    \/**\r\n     * Elimina completamente los datos guardados en LocalStorage\r\n     *\/\r\n    function clearLocalStorage() {\r\n      try {\r\n        localStorage.removeItem(STORAGE_KEY);\r\n      } catch (e) {\r\n        \/* ignorar *\/\r\n      }\r\n    }\r\n\r\n    \/**\r\n     * Restaura todos los campos desde los datos guardados\r\n     * @param {object} data - Datos del LocalStorage\r\n     *\/\r\n    function restoreFormData(data) {\r\n      if (!data || !data.fields) return;\r\n\r\n      \/* Restaurar selector de tipo de formulario *\/\r\n      if (data.formType) {\r\n        selectFormType(data.formType);\r\n      }\r\n\r\n      \/* Peque\u00f1o delay para que el DOM se actualice *\/\r\n      setTimeout(function() {\r\n        \/* Restaurar campos regulares *\/\r\n        Object.keys(data.fields).forEach(function(id) {\r\n          var el = document.getElementById(id);\r\n          if (el) {\r\n            el.value = data.fields[id];\r\n            \/* Disparar evento input para validaci\u00f3n y m\u00e1scaras *\/\r\n            el.dispatchEvent(new Event('input', { bubbles: true }));\r\n          }\r\n        });\r\n\r\n        \/* Restaurar search selects *\/\r\n        restoreSearchSelectsFromData(data.fields);\r\n        updateAllCounters();\r\n      }, 200);\r\n    }\r\n\r\n    \/**\r\n     * Restaura los search selects desde datos guardados\r\n     * @param {object} fields - Objeto con valores de campos\r\n     *\/\r\n    function restoreSearchSelectsFromData(fields) {\r\n      var searchSelectsMap = [\r\n        { inputId: 'rc_search_departamento', hiddenId: 'rc_departamento', type: 'departamento' },\r\n        { inputId: 'rc_search_municipio', hiddenId: 'rc_municipio', type: 'municipio', deptoHiddenId: 'rc_departamento' }\r\n      ];\r\n\r\n      searchSelectsMap.forEach(function(map) {\r\n        var hiddenEl = document.getElementById(map.hiddenId);\r\n        var inputEl = document.getElementById(map.inputId);\r\n        if (hiddenEl && inputEl && fields[map.hiddenId]) {\r\n          hiddenEl.value = fields[map.hiddenId];\r\n          inputEl.value = fields[map.hiddenId];\r\n          \/* Si es municipio, poblar opciones basadas en el departamento guardado *\/\r\n          if (map.type === 'municipio' && map.deptoHiddenId) {\r\n            var deptoHiddenEl = document.getElementById(map.deptoHiddenId);\r\n            if (deptoHiddenEl && fields[map.deptoHiddenId]) {\r\n              deptoHiddenEl.value = fields[map.deptoHiddenId];\r\n              var deptoInput = document.getElementById('rc_search_departamento');\r\n              if (deptoInput) deptoInput.value = fields[map.deptoHiddenId];\r\n              populateMunicipioDropdown(fields[map.deptoHiddenId]);\r\n              if (inputEl) inputEl.disabled = false;\r\n              inputEl.placeholder = 'Buscar municipio...';\r\n            }\r\n          }\r\n        }\r\n      });\r\n    }\r\n\r\n    \/* ================================================================\r\n       MODAL: Restaurar formulario guardado\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Muestra el modal de restauraci\u00f3n\r\n     *\/\r\n    function showRestoreModal() {\r\n      restoreModalOverlay.classList.add('rc-visible');\r\n      restoreBtn.focus();\r\n    }\r\n\r\n    \/**\r\n     * Oculta el modal de restauraci\u00f3n\r\n     *\/\r\n    function hideRestoreModal() {\r\n      restoreModalOverlay.classList.remove('rc-visible');\r\n    }\r\n\r\n    restoreBtn.addEventListener('click', function() {\r\n      var data = loadFromLocalStorage();\r\n      if (data) {\r\n        restoreFormData(data);\r\n      }\r\n      hideRestoreModal();\r\n    });\r\n\r\n    discardBtn.addEventListener('click', function() {\r\n      clearLocalStorage();\r\n      hideRestoreModal();\r\n    });\r\n\r\n    \/* Cerrar modal con Escape *\/\r\n    restoreModalOverlay.addEventListener('keydown', function(e) {\r\n      if (e.key === 'Escape') {\r\n        hideRestoreModal();\r\n      }\r\n    });\r\n\r\n    \/* Cerrar modal con click fuera *\/\r\n    restoreModalOverlay.addEventListener('click', function(e) {\r\n      if (e.target === restoreModalOverlay) {\r\n        hideRestoreModal();\r\n      }\r\n    });\r\n\r\n    \/* ================================================================\r\n       MODAL: Confirmaci\u00f3n de env\u00edo\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Muestra el modal de confirmaci\u00f3n de env\u00edo\r\n     * @param {function} onConfirm - Callback al confirmar\r\n     *\/\r\n    function showConfirmModal(onConfirm) {\r\n      confirmModalOverlay.classList.add('rc-visible');\r\n      confirmSendBtn.focus();\r\n      pendingSubmit = onConfirm;\r\n    }\r\n\r\n    \/**\r\n     * Oculta el modal de confirmaci\u00f3n\r\n     *\/\r\n    function hideConfirmModal() {\r\n      confirmModalOverlay.classList.remove('rc-visible');\r\n      pendingSubmit = null;\r\n    }\r\n\r\n    confirmSendBtn.addEventListener('click', function() {\r\n      var submitFn = pendingSubmit;\r\n      hideConfirmModal();\r\n      if (submitFn) {\r\n        submitFn();\r\n      }\r\n    });\r\n\r\n    confirmCancelBtn.addEventListener('click', function() {\r\n      hideConfirmModal();\r\n    });\r\n\r\n    \/* Cerrar modal con Escape *\/\r\n    confirmModalOverlay.addEventListener('keydown', function(e) {\r\n      if (e.key === 'Escape') {\r\n        hideConfirmModal();\r\n      }\r\n    });\r\n\r\n    \/* Cerrar modal con click fuera *\/\r\n    confirmModalOverlay.addEventListener('click', function(e) {\r\n      if (e.target === confirmModalOverlay) {\r\n        hideConfirmModal();\r\n      }\r\n    });\r\n\r\n    \/* ================================================================\r\n       SELECTOR DE TIPO DE FORMULARIO (botones grandes)\r\n       ================================================================ *\/\r\n    function selectFormType(value) {\r\n      var targetForm = value === 'reclamo' ? formReclamo : (value === 'consulta' ? formConsulta : null);\r\n\r\n      hideAllForms();\r\n      progressContainer.classList.remove('rc-visible');\r\n\r\n      \/* Actualizar estado activo en botones *\/\r\n      btnSelectorReclamo.classList.remove('rc-active');\r\n      btnSelectorConsulta.classList.remove('rc-active');\r\n\r\n      if (value === 'reclamo') {\r\n        btnSelectorReclamo.classList.add('rc-active');\r\n        \/* ponytail: mostrar skeleton mientras carga *\/\r\n        formReclamo.classList.add('rc-skeleton-loading');\r\n        formReclamo.classList.add('rc-visible');\r\n        setTimeout(function() {\r\n          formReclamo.classList.remove('rc-skeleton-loading');\r\n        }, 600);\r\n        currentVisibleForm = 'reclamo';\r\n        progressContainer.classList.add('rc-visible');\r\n        updateProgressBar();\r\n        updateFieldsCounterReclamo();\r\n        \/* Generar token y timestamp al mostrar formulario *\/\r\n        generarTokenReclamo();\r\n        marcarInicioFormulario('reclamo');\r\n        \/* ponytail: scroll suave y lento hacia el formulario *\/\r\n        setTimeout(function() {\r\n          if (formReclamo.classList.contains('rc-visible')) {\r\n            scrollSmooth(formReclamo);\r\n          }\r\n        }, 350);\r\n      } else if (value === 'consulta') {\r\n        btnSelectorConsulta.classList.add('rc-active');\r\n        \/* ponytail: mostrar skeleton mientras carga *\/\r\n        formConsulta.classList.add('rc-skeleton-loading');\r\n        formConsulta.classList.add('rc-visible');\r\n        setTimeout(function() {\r\n          formConsulta.classList.remove('rc-skeleton-loading');\r\n        }, 600);\r\n        currentVisibleForm = 'consulta';\r\n        progressContainer.classList.add('rc-visible');\r\n        updateProgressBar();\r\n        updateFieldsCounterConsulta();\r\n        generarTokenConsulta();\r\n        marcarInicioFormulario('consulta');\r\n        \/* ponytail: scroll suave y lento hacia el formulario *\/\r\n        setTimeout(function() {\r\n          if (formConsulta.classList.contains('rc-visible')) {\r\n            scrollSmooth(formConsulta);\r\n          }\r\n        }, 350);\r\n      } else {\r\n        currentVisibleForm = null;\r\n      }\r\n    }\r\n\r\n    \/**\r\n     * Genera un token \u00fanico anti-duplicado para el formulario de reclamo\r\n     *\/\r\n    function generarTokenReclamo() {\r\n      var token = 'rc_' + Date.now() + '_' + Math.random().toString(36).substring(2, 15);\r\n      var tokenEl = document.getElementById('rc_submit_token_reclamo');\r\n      if (tokenEl) tokenEl.value = token;\r\n    }\r\n\r\n    \/**\r\n     * Genera un token \u00fanico anti-duplicado para el formulario de consulta\r\n     *\/\r\n    function generarTokenConsulta() {\r\n      var token = 'rc_' + Date.now() + '_' + Math.random().toString(36).substring(2, 15);\r\n      var tokenEl = document.getElementById('rc_submit_token_consulta');\r\n      if (tokenEl) tokenEl.value = token;\r\n    }\r\n\r\n    \/**\r\n     * Marca el timestamp de inicio del formulario (para tiempo m\u00ednimo)\r\n     *\/\r\n    function marcarInicioFormulario(tipo) {\r\n      formStartTime = Date.now();\r\n      var startEl = document.getElementById('rc_form_start_' + tipo);\r\n      if (startEl) startEl.value = formStartTime.toString();\r\n    }\r\n\r\n    btnSelectorReclamo.addEventListener('click', function() {\r\n      selectFormType('reclamo');\r\n    });\r\n\r\n    btnSelectorConsulta.addEventListener('click', function() {\r\n      selectFormType('consulta');\r\n    });\r\n\r\n    \/**\r\n     * Oculta todos los formularios con transici\u00f3n\r\n     *\/\r\n    function hideAllForms() {\r\n      [formReclamo, formConsulta].forEach(function(form) {\r\n        if (form.classList.contains('rc-visible')) {\r\n          form.classList.add('rc-hiding');\r\n          form.classList.remove('rc-visible');\r\n          \/* Remover clase hiding despu\u00e9s de la transici\u00f3n *\/\r\n          setTimeout(function() {\r\n            form.classList.remove('rc-hiding');\r\n          }, 300);\r\n        }\r\n      });\r\n    }\r\n\r\n    \/**\r\n     * Muestra un formulario con transici\u00f3n suave\r\n     * @param {HTMLElement} form - El formulario a mostrar\r\n     *\/\r\n    function showForm(form) {\r\n      \/* Peque\u00f1o delay para que la transici\u00f3n de salida se complete *\/\r\n      setTimeout(function() {\r\n        form.classList.add('rc-visible');\r\n      }, 150);\r\n    }\r\n\r\n    \/* ================================================================\r\n       MANEJO DEL SELECTOR DE TIPO DE DOCUMENTO\r\n       ================================================================ *\/\r\n    var tipoDocumentoEl = document.getElementById('rc_tipo_documento');\r\n    var identidadInput = document.getElementById('rc_identidad');\r\n\r\n    if (tipoDocumentoEl && identidadInput) {\r\n      tipoDocumentoEl.addEventListener('change', function() {\r\n        actualizarPlaceholderIdentidad();\r\n        \/* Limpiar el campo al cambiar de tipo *\/\r\n        identidadInput.value = '';\r\n        \/* Disparar evento input para validaci\u00f3n *\/\r\n        identidadInput.dispatchEvent(new Event('input', { bubbles: true }));\r\n        saveToLocalStorage();\r\n      });\r\n    }\r\n\r\n    \/**\r\n     * Actualiza el placeholder y atributos seg\u00fan el tipo de documento seleccionado\r\n     *\/\r\n    function actualizarPlaceholderIdentidad() {\r\n      if (!tipoDocumentoEl || !identidadInput) return;\r\n      var tipo = tipoDocumentoEl.value;\r\n\r\n      switch (tipo) {\r\n        case 'identidad':\r\n          identidadInput.placeholder = 'Ej: 0801-1999-12345';\r\n          identidadInput.setAttribute('maxlength', '15');\r\n          identidadInput.setAttribute('data-mask', 'identidad');\r\n          break;\r\n        case 'pasaporte':\r\n          identidadInput.placeholder = 'Ej: A12345678';\r\n          identidadInput.setAttribute('maxlength', '20');\r\n          identidadInput.removeAttribute('data-mask');\r\n          break;\r\n        case 'carne':\r\n          identidadInput.placeholder = 'Ej: RC-12345';\r\n          identidadInput.setAttribute('maxlength', '20');\r\n          identidadInput.removeAttribute('data-mask');\r\n          break;\r\n        default:\r\n          identidadInput.placeholder = 'Seleccione tipo de documento';\r\n          identidadInput.setAttribute('maxlength', '25');\r\n          identidadInput.setAttribute('data-mask', 'identidad');\r\n      }\r\n    }\r\n\r\n    \/* ================================================================\r\n       CONTADOR DE CARACTERES\r\n       ================================================================ *\/\r\n    textareaReclamo.addEventListener('input', function() {\r\n      updateCharCounter(this, counterReclamo, 5000);\r\n    });\r\n\r\n    textareaConsulta.addEventListener('input', function() {\r\n      updateCharCounter(this, counterConsulta, 3000);\r\n    });\r\n\r\n    \/**\r\n     * Actualiza el contador de caracteres visual\r\n     * @param {HTMLTextAreaElement} textarea\r\n     * @param {HTMLElement} counter\r\n     * @param {number} max\r\n     *\/\r\n    function updateCharCounter(textarea, counter, max) {\r\n      var len = textarea.value.length;\r\n      counter.textContent = len + ' \/ ' + max + ' caracteres';\r\n      if (len > max * 0.85) {\r\n        counter.classList.add('rc-counter-warn');\r\n      } else {\r\n        counter.classList.remove('rc-counter-warn');\r\n      }\r\n    }\r\n\r\n    \/* ================================================================\r\n       M\u00c1SCARAS AUTOM\u00c1TICAS\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Aplica m\u00e1scara de tel\u00e9fono: 9999-9999\r\n     * @param {HTMLInputElement} input\r\n     *\/\r\n    function applyPhoneMask(input) {\r\n      var value = input.value.replace(\/\\D\/g, '');\r\n      if (value.length > 8) value = value.substring(0, 8);\r\n      if (value.length > 4) {\r\n        value = value.substring(0, 4) + '-' + value.substring(4);\r\n      }\r\n      input.value = value;\r\n    }\r\n\r\n    \/**\r\n     * Aplica m\u00e1scara de identidad: 0801-1999-12345\r\n     * @param {HTMLInputElement} input\r\n     *\/\r\n    function applyIdentityMask(input) {\r\n      \/* Solo aplicar m\u00e1scara si el tipo de documento es identidad *\/\r\n      if (tipoDocumentoEl && tipoDocumentoEl.value !== 'identidad') return;\r\n      var value = input.value.replace(\/\\D\/g, '');\r\n      if (value.length > 15) value = value.substring(0, 15);\r\n      if (value.length > 9) {\r\n        value = value.substring(0, 4) + '-' + value.substring(4, 8) + '-' + value.substring(8);\r\n      } else if (value.length > 4) {\r\n        value = value.substring(0, 4) + '-' + value.substring(4);\r\n      }\r\n      input.value = value;\r\n    }\r\n\r\n    \/**\r\n     * Aplica m\u00e1scara de RTN: 08019012345678 (solo n\u00fameros, sin guiones)\r\n     * @param {HTMLInputElement} input\r\n     *\/\r\n    function applyRTNMask(input) {\r\n      var value = input.value.replace(\/\\D\/g, '');\r\n      if (value.length > 14) value = value.substring(0, 14);\r\n      input.value = value;\r\n    }\r\n\r\n    \/* Delegaci\u00f3n de eventos para m\u00e1scaras *\/\r\n    document.addEventListener('input', function(e) {\r\n      if (!e.target) return;\r\n      var mask = e.target.getAttribute('data-mask');\r\n      if (!mask) return;\r\n\r\n      \/* Guardar posici\u00f3n del cursor *\/\r\n      var cursorPos = e.target.selectionStart;\r\n      var prevLength = e.target.value.length;\r\n\r\n      switch (mask) {\r\n        case 'telefono':\r\n          applyPhoneMask(e.target);\r\n          break;\r\n        case 'identidad':\r\n          applyIdentityMask(e.target);\r\n          break;\r\n        case 'rtn':\r\n          applyRTNMask(e.target);\r\n          break;\r\n      }\r\n\r\n      \/* Restaurar posici\u00f3n del cursor aproximadamente *\/\r\n      var newLength = e.target.value.length;\r\n      var diff = newLength - prevLength;\r\n      if (diff > 0) cursorPos += diff;\r\n      if (cursorPos > newLength) cursorPos = newLength;\r\n      try { e.target.setSelectionRange(cursorPos, cursorPos); } catch (ex) { \/* ignorar *\/ }\r\n    });\r\n\r\n    \/* ================================================================\r\n       FILTROS DE ESCRITURA EN TIEMPO REAL (bloqueo de caracteres inv\u00e1lidos)\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Regex para campos de solo nombre: letras, tildes, \u00f1, \u00fc, ap\u00f3strofes, guiones, puntos, espacios\r\n     *\/\r\n    var REGEX_SOLO_NOMBRE = \/[^a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc'\\-\\.\\s]\/g;\r\n\r\n    \/**\r\n     * Regex para raz\u00f3n social: letras, n\u00fameros, & \/ . , ( ) ap\u00f3strofes\r\n     *\/\r\n    var REGEX_RAZON_SOCIAL = \/[^a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc\\d&\\\/\\.\\,\\(\\)'\\-_\\s]\/g;\r\n\r\n    \/**\r\n     * Regex para direcci\u00f3n: letras, n\u00fameros, \/ . , ( ) # - espacios\r\n     *\/\r\n    var REGEX_DIRECCION = \/[^a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc\\d\\\/\\.\\,\\(\\)\\#\\-\\s]\/g;\r\n\r\n    \/**\r\n     * Regex para instituci\u00f3n y cargo: letras, n\u00fameros, puntos, comas, espacios, #, -, \/\r\n     *\/\r\n    var REGEX_INSTITUCION_CARGO = \/[^a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc\\d\\.\\,\\#\\-\\\/\\s]\/g;\r\n\r\n    \/**\r\n     * Filtra caracteres inv\u00e1lidos en tiempo real seg\u00fan el tipo de campo\r\n     * @param {HTMLInputElement} input\r\n     *\/\r\n    function filtrarCaracteresEnTiempoReal(input) {\r\n      var validateType = input.getAttribute('data-validate');\r\n      var value = input.value;\r\n      var filtered = value;\r\n      var mensaje = '';\r\n      var tuvoCambio = false;\r\n\r\n      switch (validateType) {\r\n        case 'nombre':\r\n          \/* Solo letras, tildes, \u00f1, \u00fc, ap\u00f3strofes, guiones, puntos, espacios *\/\r\n          if (\/[\\d]\/.test(value)) {\r\n            filtered = value.replace(\/[\\d]\/g, '');\r\n            mensaje = 'No se permiten n\u00fameros.';\r\n            tuvoCambio = true;\r\n          }\r\n          if (REGEX_SOLO_NOMBRE.test(filtered) || \/[<>{}[\\]?!\u00a1\u00bf\"|\\\\@#$%^&*+=;:~`]\/.test(filtered)) {\r\n            filtered = filtered.replace(REGEX_SOLO_NOMBRE, '').replace(\/[<>{}[\\]?!\u00a1\u00bf\"|\\\\@#$%^&*+=;:~`]\/g, '');\r\n            if (!mensaje) mensaje = 'No se permiten caracteres especiales.';\r\n            tuvoCambio = true;\r\n          }\r\n          break;\r\n\r\n        case 'razon_social':\r\n          if (REGEX_RAZON_SOCIAL.test(value) || \/[<>{}[\\]?!\u00a1\u00bf\"|\\\\@#$%^&*+=;:~`]\/.test(value)) {\r\n            filtered = value.replace(REGEX_RAZON_SOCIAL, '').replace(\/[<>{}[\\]?!\u00a1\u00bf\"|\\\\@#$%^&*+=;:~`]\/g, '');\r\n            mensaje = 'No se permiten caracteres especiales.';\r\n            tuvoCambio = true;\r\n          }\r\n          break;\r\n\r\n        case 'direccion':\r\n          if (REGEX_DIRECCION.test(value) || \/[<>{}[\\]?!\u00a1\u00bf\"'|\\\\@$%^*+=;:~`]\/.test(value)) {\r\n            filtered = value.replace(REGEX_DIRECCION, '').replace(\/[<>{}[\\]?!\u00a1\u00bf\"'|\\\\@$%^*+=;:~`]\/g, '');\r\n            mensaje = 'No se permiten caracteres especiales.';\r\n            tuvoCambio = true;\r\n          }\r\n          break;\r\n\r\n        case 'institucion':\r\n        case 'cargo':\r\n          if (REGEX_INSTITUCION_CARGO.test(value) || \/[<>{}[\\]?!\u00a1\u00bf\"'|\\\\@$%^*+=;:~`]\/.test(value)) {\r\n            filtered = value.replace(REGEX_INSTITUCION_CARGO, '').replace(\/[<>{}[\\]?!\u00a1\u00bf\"'|\\\\@$%^*+=;:~`]\/g, '');\r\n            mensaje = 'No se permiten caracteres especiales.';\r\n            tuvoCambio = true;\r\n          }\r\n          break;\r\n\r\n        case 'identidad':\r\n          \/* Para pasaporte y carn\u00e9, permitir alfanum\u00e9rico. Para identidad, solo n\u00fameros *\/\r\n          if (tipoDocumentoEl && tipoDocumentoEl.value === 'identidad') {\r\n            if (\/[a-zA-Z]\/.test(value)) {\r\n              filtered = value.replace(\/[a-zA-Z]\/g, '');\r\n              mensaje = 'No se permiten letras.';\r\n              tuvoCambio = true;\r\n            }\r\n          }\r\n          \/* Bloquear caracteres especiales indeseados *\/\r\n          if (\/[<>{}[\\]?!\u00a1\u00bf\"'|\\\\@#$%^&*+=;:~`]\/.test(filtered)) {\r\n            filtered = filtered.replace(\/[<>{}[\\]?!\u00a1\u00bf\"'|\\\\@#$%^&*+=;:~`]\/g, '');\r\n            if (!mensaje) mensaje = 'No se permiten caracteres especiales.';\r\n            tuvoCambio = true;\r\n          }\r\n          break;\r\n\r\n        case 'rtn':\r\n          \/* Solo n\u00fameros en RTN *\/\r\n          if (\/[^0-9]\/.test(value)) {\r\n            filtered = value.replace(\/\\D\/g, '');\r\n            mensaje = 'El RTN solo permite n\u00fameros.';\r\n            tuvoCambio = true;\r\n          }\r\n          break;\r\n\r\n        case 'telefono':\r\n          \/* Solo n\u00fameros para tel\u00e9fono *\/\r\n          if (\/[a-zA-Z]\/.test(value)) {\r\n            filtered = value.replace(\/[a-zA-Z]\/g, '');\r\n            mensaje = 'No se permiten letras.';\r\n            tuvoCambio = true;\r\n          }\r\n          if (\/[<>{}[\\]?!\u00a1\u00bf\"'|\\\\@#$%^&*+=;:~`]\/.test(filtered)) {\r\n            filtered = filtered.replace(\/[<>{}[\\]?!\u00a1\u00bf\"'|\\\\@#$%^&*+=;:~`]\/g, '');\r\n            if (!mensaje) mensaje = 'No se permiten caracteres especiales.';\r\n            tuvoCambio = true;\r\n          }\r\n          break;\r\n\r\n        case 'email':\r\n          \/* Para email permitimos caracteres normales de email *\/\r\n          if (\/[<>{}[\\]?!\u00a1\u00bf\"|\\\\#$%^&*+=;~`]\/.test(value)) {\r\n            filtered = value.replace(\/[<>{}[\\]?!\u00a1\u00bf\"|\\\\#$%^&*+=;~`]\/g, '');\r\n            mensaje = 'No se permiten caracteres especiales.';\r\n            tuvoCambio = true;\r\n          }\r\n          break;\r\n\r\n        case 'texto':\r\n          \/* Para texto general (domicilio legal, etc.) *\/\r\n          if (\/[<>{}[\\]?!\u00a1\u00bf\"|\\\\@$%^*+=;~`]\/.test(value)) {\r\n            filtered = value.replace(\/[<>{}[\\]?!\u00a1\u00bf\"|\\\\@$%^*+=;~`]\/g, '');\r\n            mensaje = 'No se permiten caracteres especiales.';\r\n            tuvoCambio = true;\r\n          }\r\n          break;\r\n\r\n        default:\r\n          break;\r\n      }\r\n\r\n      \/* Siempre filtrar emojis *\/\r\n      if (contieneEmojis(filtered)) {\r\n        filtered = filtered.replace(\/[\\u{1F600}-\\u{1F64F}\\u{1F300}-\\u{1F5FF}\\u{1F680}-\\u{1F6FF}\\u{1F1E0}-\\u{1F1FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}\\u{1F900}-\\u{1F9FF}\\u{1FA00}-\\u{1FA6F}\\u{1FA70}-\\u{1FAFF}\\u{2300}-\\u{23FF}\\u{2B50}\\u{2B55}\\u{2934}\\u{2935}\\u{3030}\\u{303D}\\u{3297}\\u{3299}\\u{FE0F}\\u{200D}]\/gu, '');\r\n        if (!mensaje) mensaje = 'No se permiten emojis.';\r\n        tuvoCambio = true;\r\n      }\r\n\r\n      \/* Siempre filtrar caracteres invisibles *\/\r\n      if (contieneCaracteresInvisibles(filtered)) {\r\n        filtered = filtered.replace(\/[\\u200B-\\u200F\\u2028-\\u202F\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\u00AD\\u180E\\u200C\\u200D]\/g, '');\r\n        if (!mensaje) mensaje = 'No se permiten caracteres invisibles.';\r\n        tuvoCambio = true;\r\n      }\r\n\r\n      \/* Mostrar mensaje debajo del campo *\/\r\n      var errorSpan = input.parentElement ? input.parentElement.querySelector('.rc-field-error') : null;\r\n      if (tuvoCambio && input.value !== filtered) {\r\n        input.value = filtered;\r\n        if (errorSpan) errorSpan.textContent = mensaje;\r\n        \/* Auto-limpiar mensaje despu\u00e9s de 2 segundos si el campo es v\u00e1lido *\/\r\n        setTimeout(function() {\r\n          if (errorSpan && errorSpan.textContent === mensaje) {\r\n            errorSpan.textContent = '';\r\n          }\r\n        }, 2500);\r\n      }\r\n\r\n      return filtered;\r\n    }\r\n\r\n    \/* ================================================================\r\n       MANEJO DE PEGADO (Paste) - Sanitizar autom\u00e1ticamente\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Maneja el evento paste: sanitiza el texto pegado\r\n     *\/\r\n    function manejarPegado(e) {\r\n      var input = e.target;\r\n      if (!input.classList.contains('rc-field-input') && !input.classList.contains('rc-field-textarea')) return;\r\n\r\n      \/* Obtener texto pegado *\/\r\n      var pastedText = '';\r\n      if (e.clipboardData && e.clipboardData.getData) {\r\n        pastedText = e.clipboardData.getData('text\/plain');\r\n      } else if (window.clipboardData && window.clipboardData.getData) {\r\n        pastedText = window.clipboardData.getData('Text');\r\n      }\r\n\r\n      if (!pastedText) return;\r\n\r\n      \/* Normalizar texto pegado *\/\r\n      var sanitized = normalizar(pastedText);\r\n\r\n      \/* Eliminar emojis del texto pegado *\/\r\n      sanitized = sanitized.replace(\/[\\u{1F600}-\\u{1F64F}\\u{1F300}-\\u{1F5FF}\\u{1F680}-\\u{1F6FF}\\u{1F1E0}-\\u{1F1FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}\\u{1F900}-\\u{1F9FF}\\u{1FA00}-\\u{1FA6F}\\u{1FA70}-\\u{1FAFF}\\u{2300}-\\u{23FF}\\u{2B50}\\u{2B55}\\u{2934}\\u{2935}\\u{3030}\\u{303D}\\u{3297}\\u{3299}\\u{FE0F}\\u{200D}]\/gu, '');\r\n\r\n      \/* Eliminar HTML del texto pegado *\/\r\n      sanitized = sanitized.replace(\/<[^>]*>\/g, '');\r\n\r\n      \/* Filtrar caracteres seg\u00fan tipo de campo *\/\r\n      var validateType = input.getAttribute('data-validate');\r\n      if (validateType === 'nombre') {\r\n        sanitized = sanitized.replace(REGEX_SOLO_NOMBRE, '').replace(\/[\\d]\/g, '');\r\n        sanitized = sanitized.replace(\/[<>{}[\\]?!\u00a1\u00bf\"|\\\\@#$%^&*+=;:~`]\/g, '');\r\n      } else if (validateType === 'razon_social') {\r\n        sanitized = sanitized.replace(REGEX_RAZON_SOCIAL, '').replace(\/[<>{}[\\]?!\u00a1\u00bf\"|\\\\@#$%^&*+=;:~`]\/g, '');\r\n      } else if (validateType === 'direccion') {\r\n        sanitized = sanitized.replace(REGEX_DIRECCION, '').replace(\/[<>{}[\\]?!\u00a1\u00bf\"'|\\\\@$%^*+=;:~`]\/g, '');\r\n      } else if (validateType === 'institucion' || validateType === 'cargo') {\r\n        sanitized = sanitized.replace(REGEX_INSTITUCION_CARGO, '').replace(\/[<>{}[\\]?!\u00a1\u00bf\"'|\\\\@$%^*+=;:~`]\/g, '');\r\n      } else if (validateType === 'rtn') {\r\n        sanitized = sanitized.replace(\/\\D\/g, '');\r\n      } else if (validateType === 'telefono') {\r\n        sanitized = sanitized.replace(\/[^0-9\\-]\/g, '');\r\n      }\r\n\r\n      \/* Si el texto cambi\u00f3, prevenir el pegado original e insertar el sanitizado *\/\r\n      if (sanitized !== pastedText) {\r\n        e.preventDefault();\r\n        \/* Insertar texto sanitizado en la posici\u00f3n del cursor *\/\r\n        var start = input.selectionStart;\r\n        var end = input.selectionEnd;\r\n        var currentValue = input.value;\r\n        input.value = currentValue.substring(0, start) + sanitized + currentValue.substring(end);\r\n        input.selectionStart = input.selectionEnd = start + sanitized.length;\r\n        \/* Disparar evento input *\/\r\n        input.dispatchEvent(new Event('input', { bubbles: true }));\r\n      }\r\n    }\r\n\r\n    \/* Registrar listener de paste *\/\r\n    document.addEventListener('paste', manejarPegado);\r\n\r\n    \/* ================================================================\r\n       MANEJO DE DROP - Mismas validaciones que paste\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Maneja el evento drop: sanitiza igual que paste\r\n     *\/\r\n    function manejarDrop(e) {\r\n      var input = e.target;\r\n      if (!input.classList.contains('rc-field-input') && !input.classList.contains('rc-field-textarea')) return;\r\n\r\n      var droppedText = '';\r\n      if (e.dataTransfer && e.dataTransfer.getData) {\r\n        droppedText = e.dataTransfer.getData('text\/plain');\r\n      }\r\n\r\n      if (!droppedText) return;\r\n\r\n      \/* Reusar la misma l\u00f3gica de paste *\/\r\n      var fakeEvent = {\r\n        target: input,\r\n        clipboardData: { getData: function() { return droppedText; } },\r\n        preventDefault: function() {}\r\n      };\r\n      manejarPegado(fakeEvent);\r\n\r\n      \/* Si se previno el default (se sanitiz\u00f3), prevenir drop *\/\r\n      if (fakeEvent._prevented) {\r\n        e.preventDefault();\r\n      }\r\n    }\r\n\r\n    \/* Registrar listener de drop *\/\r\n    document.addEventListener('drop', manejarDrop);\r\n\r\n    \/* ================================================================\r\n       FILTRO DE ESCRITURA EN TIEMPO REAL (keydown + input)\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Previene la inserci\u00f3n de caracteres inv\u00e1lidos a nivel de teclado\r\n     *\/\r\n    function filtrarKeydown(e) {\r\n      var input = e.target;\r\n      if (!input.classList.contains('rc-field-input') && !input.classList.contains('rc-field-textarea')) return;\r\n\r\n      \/* Solo filtrar teclas que insertan caracteres (no flechas, backspace, etc.) *\/\r\n      if (e.key.length !== 1 || e.ctrlKey || e.metaKey || e.altKey) return;\r\n\r\n      var validateType = input.getAttribute('data-validate');\r\n      var char = e.key;\r\n\r\n      \/* Bloquear emojis a nivel de keydown *\/\r\n      if (contieneEmojis(char)) {\r\n        e.preventDefault();\r\n        mostrarErrorTemporal(input, 'No se permiten emojis.');\r\n        return;\r\n      }\r\n\r\n      \/* Bloquear caracteres invisibles *\/\r\n      if (\/[\\u200B-\\u200F\\u2028-\\u202F\\u2060-\\u2064\\uFEFF\\u00AD\\u200C\\u200D]\/.test(char)) {\r\n        e.preventDefault();\r\n        mostrarErrorTemporal(input, 'No se permiten caracteres invisibles.');\r\n        return;\r\n      }\r\n\r\n      switch (validateType) {\r\n        case 'nombre':\r\n          \/* Solo letras, tildes, \u00f1, \u00fc, ap\u00f3strofes, guiones, puntos, espacios *\/\r\n          if (\/[\\d]\/.test(char)) {\r\n            e.preventDefault();\r\n            mostrarErrorTemporal(input, 'No se permiten n\u00fameros.');\r\n            return;\r\n          }\r\n          if (!\/^[a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc'\\-\\.\\s]$\/.test(char)) {\r\n            e.preventDefault();\r\n            mostrarErrorTemporal(input, 'No se permiten caracteres especiales.');\r\n            return;\r\n          }\r\n          break;\r\n\r\n        case 'razon_social':\r\n          if (!\/^[a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc\\d&\\\/\\.\\,\\(\\)'\\-_\\s]$\/.test(char)) {\r\n            e.preventDefault();\r\n            mostrarErrorTemporal(input, 'No se permiten caracteres especiales.');\r\n            return;\r\n          }\r\n          break;\r\n\r\n        case 'direccion':\r\n          if (!\/^[a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc\\d\\\/\\.\\,\\(\\)\\#\\-\\s]$\/.test(char)) {\r\n            e.preventDefault();\r\n            mostrarErrorTemporal(input, 'No se permiten caracteres especiales.');\r\n            return;\r\n          }\r\n          break;\r\n\r\n        case 'institucion':\r\n        case 'cargo':\r\n          if (!\/^[a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc\\d\\.\\,\\#\\-\\\/\\s]$\/.test(char)) {\r\n            e.preventDefault();\r\n            mostrarErrorTemporal(input, 'No se permiten caracteres especiales.');\r\n            return;\r\n          }\r\n          break;\r\n\r\n        case 'rtn':\r\n          if (!\/^\\d$\/.test(char)) {\r\n            e.preventDefault();\r\n            mostrarErrorTemporal(input, 'El RTN solo permite n\u00fameros.');\r\n            return;\r\n          }\r\n          break;\r\n\r\n        case 'telefono':\r\n          if (!\/^[\\d\\-]$\/.test(char)) {\r\n            e.preventDefault();\r\n            mostrarErrorTemporal(input, 'No se permiten letras ni caracteres especiales.');\r\n            return;\r\n          }\r\n          break;\r\n\r\n        case 'identidad':\r\n          if (tipoDocumentoEl && tipoDocumentoEl.value === 'identidad') {\r\n            if (!\/^[\\d\\-]$\/.test(char)) {\r\n              e.preventDefault();\r\n              mostrarErrorTemporal(input, 'No se permiten letras.');\r\n              return;\r\n            }\r\n          }\r\n          break;\r\n\r\n        default:\r\n          break;\r\n      }\r\n    }\r\n\r\n    \/**\r\n     * Muestra un mensaje de error temporal debajo del campo\r\n     *\/\r\n    function mostrarErrorTemporal(input, mensaje) {\r\n      var errorSpan = input.parentElement ? input.parentElement.querySelector('.rc-field-error') : null;\r\n      if (errorSpan) {\r\n        var anterior = errorSpan.textContent;\r\n        errorSpan.textContent = mensaje;\r\n        setTimeout(function() {\r\n          if (errorSpan.textContent === mensaje) {\r\n            errorSpan.textContent = anterior || '';\r\n          }\r\n        }, 2000);\r\n      }\r\n    }\r\n\r\n    \/* Registrar listener de keydown para filtrar en tiempo real *\/\r\n    document.addEventListener('keydown', filtrarKeydown);\r\n\r\n    \/* ================================================================\r\n       VALIDACI\u00d3N EN TIEMPO REAL (input + blur)\r\n       ================================================================ *\/\r\n\r\n    \/* Delegaci\u00f3n de eventos para validaci\u00f3n en tiempo real *\/\r\n    document.getElementById('rcReclamoForm').addEventListener('input', function(e) {\r\n      if (e.target.classList.contains('rc-field-input') || e.target.classList.contains('rc-field-textarea') || e.target.classList.contains('rc-field-select')) {\r\n        \/* Normalizar y filtrar *\/\r\n        if (e.target.classList.contains('rc-field-input') || e.target.classList.contains('rc-field-textarea')) {\r\n          filtrarCaracteresEnTiempoReal(e.target);\r\n        }\r\n        validateField(e.target);\r\n        updateAllCounters();\r\n        saveToLocalStorage();\r\n      }\r\n    });\r\n\r\n    document.getElementById('rcConsultaForm').addEventListener('input', function(e) {\r\n      if (e.target.classList.contains('rc-field-input') || e.target.classList.contains('rc-field-textarea') || e.target.classList.contains('rc-field-select')) {\r\n        if (e.target.classList.contains('rc-field-input') || e.target.classList.contains('rc-field-textarea')) {\r\n          filtrarCaracteresEnTiempoReal(e.target);\r\n        }\r\n        validateField(e.target);\r\n        updateAllCounters();\r\n        saveToLocalStorage();\r\n      }\r\n    });\r\n\r\n    \/* Tambi\u00e9n validar en blur *\/\r\n    document.getElementById('rcReclamoForm').addEventListener('blur', function(e) {\r\n      if (e.target.classList.contains('rc-field-input') || e.target.classList.contains('rc-field-textarea') || e.target.classList.contains('rc-search-select-input')) {\r\n        validateField(e.target);\r\n        updateAllCounters();\r\n        saveToLocalStorage();\r\n      }\r\n    }, true);\r\n\r\n    document.getElementById('rcConsultaForm').addEventListener('blur', function(e) {\r\n      if (e.target.classList.contains('rc-field-input') || e.target.classList.contains('rc-field-textarea') || e.target.classList.contains('rc-search-select-input')) {\r\n        validateField(e.target);\r\n        updateAllCounters();\r\n        saveToLocalStorage();\r\n      }\r\n    }, true);\r\n\r\n    \/**\r\n     * Valida un campo individual y muestra feedback visual\r\n     * Incluye todas las validaciones de hardening: HTML, SQL, XSS, emojis,\r\n     * texto repetitivo, caracteres invisibles, normalizaci\u00f3n, etc.\r\n     * @param {HTMLElement} field - El input, textarea o select a validar\r\n     * @returns {boolean} true si es v\u00e1lido\r\n     *\/\r\n    function validateField(field) {\r\n      \/* Campos ocultos no se validan *\/\r\n      if (field.offsetParent === null && !field.closest('.rc-search-select')) {\r\n        return true;\r\n      }\r\n\r\n      var value = field.value;\r\n      var validateType = field.getAttribute('data-validate');\r\n      var isOptional = field.getAttribute('data-optional') === 'true';\r\n      var fieldId = field.id;\r\n\r\n      \/* Normalizar el valor ANTES de validar (texto completo) *\/\r\n      if (field.tagName !== 'SELECT') {\r\n        value = normalizar(value);\r\n      }\r\n\r\n      \/* Para search selects, obtener el error span correcto *\/\r\n      var errorSpanId = fieldId;\r\n      if (field.hasAttribute('data-search-type')) {\r\n        errorSpanId = field.name || fieldId.replace('rc_search_', 'rc_');\r\n      }\r\n      var errorSpan = document.querySelector('[data-error=\"' + errorSpanId + '\"]');\r\n      if (!errorSpan) {\r\n        errorSpan = field.parentElement && field.parentElement.parentElement\r\n          ? field.parentElement.parentElement.querySelector('.rc-field-error')\r\n          : null;\r\n      }\r\n\r\n      \/* Limpiar clases previas *\/\r\n      field.classList.remove('rc-valid', 'rc-invalid');\r\n      if (errorSpan) errorSpan.textContent = '';\r\n\r\n      \/* Campo opcional vac\u00edo: sin error *\/\r\n      if (isOptional && value.trim() === '') {\r\n        field.classList.add('rc-valid');\r\n        return true;\r\n      }\r\n\r\n      \/* Campo requerido vac\u00edo *\/\r\n      if (!isOptional && value.trim() === '') {\r\n        field.classList.add('rc-invalid');\r\n        if (errorSpan) errorSpan.textContent = 'Este campo es obligatorio.';\r\n        return false;\r\n      }\r\n\r\n      \/* Si est\u00e1 vac\u00edo y es opcional, salir *\/\r\n      if (value.trim() === '') return true;\r\n\r\n      \/* --- Validaciones universales (todos los campos) --- *\/\r\n\r\n      \/* Detectar HTML *\/\r\n      if (contieneHTML(value)) {\r\n        field.classList.add('rc-invalid');\r\n        if (errorSpan) errorSpan.textContent = 'No se permite HTML.';\r\n        return false;\r\n      }\r\n\r\n      \/* Detectar SQL Injection *\/\r\n      if (contieneSQL(value)) {\r\n        field.classList.add('rc-invalid');\r\n        if (errorSpan) errorSpan.textContent = 'No se permite c\u00f3digo.';\r\n        return false;\r\n      }\r\n\r\n      \/* Detectar XSS *\/\r\n      if (contieneXSS(value)) {\r\n        field.classList.add('rc-invalid');\r\n        if (errorSpan) errorSpan.textContent = 'No se permite c\u00f3digo.';\r\n        return false;\r\n      }\r\n\r\n      \/* Detectar emojis *\/\r\n      if (contieneEmojis(value)) {\r\n        field.classList.add('rc-invalid');\r\n        if (errorSpan) errorSpan.textContent = 'No se permiten emojis.';\r\n        return false;\r\n      }\r\n\r\n      \/* Detectar caracteres invisibles residuales *\/\r\n      if (contieneCaracteresInvisibles(value)) {\r\n        field.classList.add('rc-invalid');\r\n        if (errorSpan) errorSpan.textContent = 'No se permiten caracteres invisibles.';\r\n        return false;\r\n      }\r\n\r\n      \/* Detectar texto repetitivo (solo para campos de texto libre) *\/\r\n      if (validateType === 'textarea' || validateType === 'texto') {\r\n        if (esTextoRepetitivo(value)) {\r\n          field.classList.add('rc-invalid');\r\n          if (errorSpan) errorSpan.textContent = 'Texto repetitivo detectado.';\r\n          return false;\r\n        }\r\n      }\r\n\r\n      \/* --- Validaciones por tipo --- *\/\r\n\r\n      switch (validateType) {\r\n        case 'nombre':\r\n          \/* Solo letras, espacios, tildes, \u00f1, \u00fc, ap\u00f3strofes, guiones, puntos *\/\r\n          if (!\/^[a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc'\\-\\.\\s]+$\/.test(value)) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'Solo se permiten letras.';\r\n            return false;\r\n          }\r\n          \/* Longitud m\u00ednima para nombres *\/\r\n          if (value.trim().length < 2) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'El nombre debe tener al menos 2 caracteres.';\r\n            return false;\r\n          }\r\n          break;\r\n\r\n        case 'razon_social':\r\n          \/* Letras, n\u00fameros, & \/ . , ( ) ap\u00f3strofes guiones *\/\r\n          if (!\/^[a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc\\d&\\\/\\.\\,\\(\\)'\\-_\\s]+$\/.test(value)) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'La raz\u00f3n social contiene caracteres no permitidos.';\r\n            return false;\r\n          }\r\n          break;\r\n\r\n        case 'direccion':\r\n          \/* Letras, n\u00fameros, \/ . , ( ) # - espacios *\/\r\n          if (!\/^[a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc\\d\\\/\\.\\,\\(\\)\\#\\-\\s]+$\/.test(value)) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'La direcci\u00f3n contiene caracteres no permitidos.';\r\n            return false;\r\n          }\r\n          break;\r\n\r\n        case 'institucion':\r\n          \/* Permite n\u00fameros, letras, puntos, comas, espacio, #, -, \/ *\/\r\n          if (!\/^[a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc\\d\\.\\,\\#\\-\\\/\\s]+$\/.test(value)) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'La instituci\u00f3n contiene caracteres no permitidos.';\r\n            return false;\r\n          }\r\n          break;\r\n\r\n        case 'cargo':\r\n          \/* Permite n\u00fameros, letras, puntos, comas, espacio, #, -, \/ *\/\r\n          if (!\/^[a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc\\d\\.\\,\\#\\-\\\/\\s]+$\/.test(value)) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'El cargo contiene caracteres no permitidos.';\r\n            return false;\r\n          }\r\n          break;\r\n\r\n        case 'texto':\r\n          \/* Texto general (domicilio legal, etc.): permitir letras, n\u00fameros, espacios y caracteres comunes *\/\r\n          if (!\/^[a-zA-Z\u00e1\u00e9\u00ed\u00f3\u00fa\u00c1\u00c9\u00cd\u00d3\u00da\u00f1\u00d1\u00fc\u00dc\\d\\s\\.\\,\\#\\-\\\/\\(\\)]+$\/.test(value)) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'Este campo contiene caracteres no permitidos.';\r\n            return false;\r\n          }\r\n          break;\r\n\r\n        case 'numeros':\r\n          \/* Solo n\u00fameros *\/\r\n          if (!\/^\\d+$\/.test(value.replace(\/\\D\/g, ''))) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'Este campo solo permite n\u00fameros.';\r\n            return false;\r\n          }\r\n          break;\r\n\r\n        case 'identidad':\r\n          var tipoDoc = tipoDocumentoEl ? tipoDocumentoEl.value : 'identidad';\r\n          var idClean = value.replace(\/[^a-zA-Z0-9]\/g, '');\r\n\r\n          if (tipoDoc === 'identidad') {\r\n            \/* Validar identidad hondure\u00f1a *\/\r\n            var soloDigitos = value.replace(\/\\D\/g, '');\r\n            if (soloDigitos.length > 0 && soloDigitos.length !== 13) {\r\n              field.classList.add('rc-invalid');\r\n              if (errorSpan) errorSpan.textContent = 'La identidad debe tener 13 d\u00edgitos.';\r\n              return false;\r\n            }\r\n            if (soloDigitos.length === 13) {\r\n              var validacion = validarIdentidadHondurena(value);\r\n              if (!validacion.valido) {\r\n                field.classList.add('rc-invalid');\r\n                if (errorSpan) errorSpan.textContent = validacion.error;\r\n                return false;\r\n              }\r\n            }\r\n          } else if (tipoDoc === 'pasaporte') {\r\n            \/* Alfanum\u00e9rico, entre 5 y 20 caracteres *\/\r\n            if (!\/^[a-zA-Z0-9]+$\/.test(idClean)) {\r\n              field.classList.add('rc-invalid');\r\n              if (errorSpan) errorSpan.textContent = 'El pasaporte solo permite letras y n\u00fameros.';\r\n              return false;\r\n            }\r\n            if (idClean.length < 5) {\r\n              field.classList.add('rc-invalid');\r\n              if (errorSpan) errorSpan.textContent = 'El pasaporte debe tener al menos 5 caracteres.';\r\n              return false;\r\n            }\r\n            if (idClean.length > 20) {\r\n              field.classList.add('rc-invalid');\r\n              if (errorSpan) errorSpan.textContent = 'El pasaporte no debe exceder 20 caracteres.';\r\n              return false;\r\n            }\r\n          } else if (tipoDoc === 'carne') {\r\n            \/* Alfanum\u00e9rico, entre 4 y 20 caracteres *\/\r\n            if (!\/^[a-zA-Z0-9]+$\/.test(idClean)) {\r\n              field.classList.add('rc-invalid');\r\n              if (errorSpan) errorSpan.textContent = 'El carn\u00e9 solo permite letras y n\u00fameros.';\r\n              return false;\r\n            }\r\n            if (idClean.length < 4) {\r\n              field.classList.add('rc-invalid');\r\n              if (errorSpan) errorSpan.textContent = 'El carn\u00e9 debe tener al menos 4 caracteres.';\r\n              return false;\r\n            }\r\n            if (idClean.length > 20) {\r\n              field.classList.add('rc-invalid');\r\n              if (errorSpan) errorSpan.textContent = 'El carn\u00e9 no debe exceder 20 caracteres.';\r\n              return false;\r\n            }\r\n          } else {\r\n            \/* No se ha seleccionado tipo *\/\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'Seleccione el tipo de documento.';\r\n            return false;\r\n          }\r\n          break;\r\n\r\n        case 'tipo_documento':\r\n          if (!value || value === '') {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'Seleccione el tipo de documento.';\r\n            return false;\r\n          }\r\n          if (['identidad', 'pasaporte', 'carne'].indexOf(value) === -1) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'Tipo de documento inv\u00e1lido.';\r\n            return false;\r\n          }\r\n          break;\r\n\r\n        case 'rtn':\r\n          \/* RTN: solo d\u00edgitos, exactamente 14 *\/\r\n          var rtnClean = value.replace(\/\\D\/g, '');\r\n          if (rtnClean.length > 0 && !\/^\\d+$\/.test(rtnClean)) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'El RTN solo permite n\u00fameros.';\r\n            return false;\r\n          }\r\n          if (rtnClean.length > 0 && rtnClean.length !== 14) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'El RTN debe tener 14 d\u00edgitos (actual: ' + rtnClean.length + ').';\r\n            return false;\r\n          }\r\n          break;\r\n\r\n        case 'telefono':\r\n          \/* Tel\u00e9fono: 8 d\u00edgitos, prefijo v\u00e1lido de Honduras *\/\r\n          var telClean = value.replace(\/\\D\/g, '');\r\n          if (telClean.length > 0 && !\/^\\d+$\/.test(telClean)) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'Formato de tel\u00e9fono inv\u00e1lido.';\r\n            return false;\r\n          }\r\n          if (telClean.length > 0 && telClean.length !== 8) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'El tel\u00e9fono debe tener 8 d\u00edgitos (actual: ' + telClean.length + ').';\r\n            return false;\r\n          }\r\n          if (telClean.length === 8) {\r\n            var prefijo = telClean.substring(0, 2);\r\n            if (PREFIJOS_TELEFONO_HN.indexOf(prefijo) === -1 && PREFIJOS_TELEFONO_HN.indexOf(telClean.substring(0, 1)) === -1) {\r\n              field.classList.add('rc-invalid');\r\n              if (errorSpan) errorSpan.textContent = 'Prefijo telef\u00f3nico inv\u00e1lido para Honduras.';\r\n              return false;\r\n            }\r\n            \/* No aceptar n\u00fameros imposibles como 0000-0000 o 1111-1111 *\/\r\n            if (\/^(\\d)\\1{7}$\/.test(telClean)) {\r\n              field.classList.add('rc-invalid');\r\n              if (errorSpan) errorSpan.textContent = 'N\u00famero de tel\u00e9fono inv\u00e1lido.';\r\n              return false;\r\n            }\r\n          }\r\n          break;\r\n\r\n        case 'email':\r\n          \/* Validaci\u00f3n de email con regex est\u00e1ndar *\/\r\n          if (!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(value)) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'Ingrese un correo electr\u00f3nico v\u00e1lido.';\r\n            return false;\r\n          }\r\n          \/* Verificar dominio temporal *\/\r\n          if (esDominioTemporal(value)) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'Correo temporal no permitido.';\r\n            return false;\r\n          }\r\n          \/* Longitud m\u00e1xima de email seg\u00fan est\u00e1ndares *\/\r\n          if (value.length > 254) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'El correo electr\u00f3nico es demasiado largo.';\r\n            return false;\r\n          }\r\n          break;\r\n\r\n        case 'textarea':\r\n          var min = parseInt(field.getAttribute('data-min'), 10) || 0;\r\n          var max = parseInt(field.getAttribute('data-max'), 10) || 99999;\r\n          if (value.length < min) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'M\u00ednimo ' + min + ' caracteres (actual: ' + value.length + ').';\r\n            return false;\r\n          }\r\n          if (value.length > max) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'M\u00e1ximo ' + max + ' caracteres.';\r\n            return false;\r\n          }\r\n          \/* Validar URL maliciosa solo en textareas *\/\r\n          if (contieneURLMaliciosa(value)) {\r\n            field.classList.add('rc-invalid');\r\n            if (errorSpan) errorSpan.textContent = 'No se permiten enlaces con protocolos no v\u00e1lidos.';\r\n            return false;\r\n          }\r\n          break;\r\n\r\n        default:\r\n          break;\r\n      }\r\n\r\n      \/* Si pas\u00f3 todas las validaciones *\/\r\n      field.classList.add('rc-valid');\r\n      return true;\r\n    }\r\n\r\n    \/**\r\n     * Valida todos los campos visibles de un formulario\r\n     * @param {HTMLFormElement} form\r\n     * @returns {boolean} true si todos son v\u00e1lidos\r\n     *\/\r\n    function validateForm(form) {\r\n      var fields = form.querySelectorAll('.rc-field-input, .rc-field-textarea, .rc-field-select');\r\n      var allValid = true;\r\n\r\n      fields.forEach(function(field) {\r\n        \/* Saltar campos en secciones ocultas *\/\r\n        if (field.offsetParent === null && field.closest('[style*=\"display: none\"]')) {\r\n          return;\r\n        }\r\n        \/* Saltar honeypot *\/\r\n        if (field.closest('.rc-hp')) return;\r\n\r\n        if (!validateField(field)) {\r\n          allValid = false;\r\n        }\r\n      });\r\n\r\n      return allValid;\r\n    }\r\n\r\n    \/**\r\n     * Sanitiza el valor de un campo (sin espacios al inicio, sin dobles espacios)\r\n     * @param {string} value\r\n     * @returns {string}\r\n     *\/\r\n    function sanitizeValue(value) {\r\n      return normalizar(value);\r\n    }\r\n\r\n    \/* ================================================================\r\n       PROGRESS BAR\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Cuenta campos visibles y obligatorios completados en el formulario activo\r\n     * @returns {object} { completed, total, percentage }\r\n     *\/\r\n    function countCompletedFields() {\r\n      var form = currentVisibleForm === 'reclamo' ? reclamoForm : (currentVisibleForm === 'consulta' ? consultaForm : null);\r\n      if (!form) return { completed: 0, total: 0, percentage: 0 };\r\n\r\n      var fields = form.querySelectorAll('.rc-field-input, .rc-field-textarea, .rc-field-select');\r\n      var completed = 0;\r\n      var total = 0;\r\n\r\n      fields.forEach(function(field) {\r\n        \/* Saltar campos ocultos *\/\r\n        if (field.offsetParent === null && field.closest('[style*=\"display: none\"]')) return;\r\n        \/* Saltar honeypot *\/\r\n        if (field.closest('.rc-hp')) return;\r\n        \/* Saltar campos opcionales *\/\r\n        if (field.getAttribute('data-optional') === 'true') return;\r\n\r\n        total++;\r\n        if (field.tagName === 'SELECT') {\r\n          if (field.value !== '' && !field.classList.contains('rc-invalid')) {\r\n            completed++;\r\n          }\r\n        } else {\r\n          if (field.value.trim() !== '' && !field.classList.contains('rc-invalid')) {\r\n            completed++;\r\n          }\r\n        }\r\n      });\r\n\r\n      var percentage = total > 0 ? Math.round((completed \/ total) * 100) : 0;\r\n      return { completed: completed, total: total, percentage: percentage };\r\n    }\r\n\r\n    \/**\r\n     * Actualiza la barra de progreso visual\r\n     *\/\r\n    function updateProgressBar() {\r\n      if (!currentVisibleForm) return;\r\n\r\n      var stats = countCompletedFields();\r\n      progressFill.style.width = stats.percentage + '%';\r\n      progressPercentage.textContent = stats.percentage + '%';\r\n\r\n      \/* Calcular paso actual *\/\r\n      var step = 1;\r\n      if (stats.percentage >= 25) step = 2;\r\n      if (stats.percentage >= 50) step = 3;\r\n      if (stats.percentage >= 100) step = 4;\r\n\r\n      var totalSteps = currentVisibleForm === 'reclamo' ? 4 : 2;\r\n      progressStep.textContent = 'Paso ' + step + ' de ' + totalSteps;\r\n    }\r\n\r\n    \/* ================================================================\r\n       CONTADOR DE CAMPOS COMPLETADOS\r\n       ================================================================ *\/\r\n\r\n    function updateFieldsCounterReclamo() {\r\n      var form = reclamoForm;\r\n      if (!form) return;\r\n      var fields = form.querySelectorAll('.rc-field-input, .rc-field-textarea, .rc-field-select');\r\n      var completed = 0;\r\n      var totalVisible = 0;\r\n\r\n      fields.forEach(function(field) {\r\n        if (field.offsetParent === null) return;\r\n        if (field.closest('.rc-hp')) return;\r\n        if (field.getAttribute('data-optional') === 'true') return;\r\n        totalVisible++;\r\n        if (field.tagName === 'SELECT') {\r\n          if (field.value !== '') completed++;\r\n        } else {\r\n          if (field.value.trim() !== '') completed++;\r\n        }\r\n      });\r\n\r\n      counterReclamoFields.textContent = completed;\r\n      totalReclamoFieldsEl.textContent = totalVisible;\r\n    }\r\n\r\n    function updateFieldsCounterConsulta() {\r\n      var form = consultaForm;\r\n      if (!form) return;\r\n      var fields = form.querySelectorAll('.rc-field-input, .rc-field-textarea, .rc-field-select');\r\n      var completed = 0;\r\n      var totalVisible = 0;\r\n\r\n      fields.forEach(function(field) {\r\n        if (field.offsetParent === null) return;\r\n        if (field.closest('.rc-hp')) return;\r\n        if (field.getAttribute('data-optional') === 'true') return;\r\n        totalVisible++;\r\n        if (field.value.trim() !== '') completed++;\r\n      });\r\n\r\n      counterConsultaFields.textContent = completed;\r\n      totalConsultaFieldsEl.textContent = totalVisible;\r\n    }\r\n\r\n    \/**\r\n     * Actualiza todos los contadores y barra de progreso\r\n     *\/\r\n    function updateAllCounters() {\r\n      updateProgressBar();\r\n      if (currentVisibleForm === 'reclamo') {\r\n        updateFieldsCounterReclamo();\r\n      } else if (currentVisibleForm === 'consulta') {\r\n        updateFieldsCounterConsulta();\r\n      }\r\n    }\r\n\r\n    \/* ================================================================\r\n       CUSTOM SMOOTH SCROLL (lento y fluido)\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Scroll suave personalizado m\u00e1s lento que el nativo\r\n     * ponytail: duraci\u00f3n ~800ms, easing easeInOutCubic\r\n     * @param {HTMLElement} target - Elemento hacia el cual hacer scroll\r\n     *\/\r\n    function scrollSmooth(target) {\r\n      if (!target) return;\r\n      var start = window.pageYOffset || document.documentElement.scrollTop;\r\n      var end = target.getBoundingClientRect().top + start - 60; \/* 60px offset para margen superior *\/\r\n      var distance = end - start;\r\n      var duration = 800; \/* ms *\/\r\n      var startTime = null;\r\n\r\n      function animation(currentTime) {\r\n        if (startTime === null) startTime = currentTime;\r\n        var elapsed = currentTime - startTime;\r\n        var progress = Math.min(elapsed \/ duration, 1);\r\n        \/* easing easeInOutCubic: m\u00e1s natural que linear *\/\r\n        var eased = progress < 0.5\r\n          ? 4 * progress * progress * progress\r\n          : 1 - Math.pow(-2 * progress + 2, 3) \/ 2;\r\n        window.scrollTo(0, start + distance * eased);\r\n        if (progress < 1) {\r\n          requestAnimationFrame(animation);\r\n        }\r\n      }\r\n\r\n      requestAnimationFrame(animation);\r\n    }\r\n\r\n    \/* ================================================================\r\n       SCROLL MEJORADO HACIA ERRORES\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Hace scroll suave al primer error, centra el campo y lo resalta\r\n     * @param {HTMLFormElement} form\r\n     *\/\r\n    function scrollToFirstError(form) {\r\n      var firstError = form.querySelector('.rc-invalid');\r\n      if (!firstError) return;\r\n\r\n      \/* Buscar el contenedor .rc-field m\u00e1s cercano para resaltar *\/\r\n      var fieldContainer = firstError.closest('.rc-field');\r\n      if (!fieldContainer) fieldContainer = firstError.closest('.rc-search-select');\r\n\r\n      \/* Scroll suave centrando el campo *\/\r\n      firstError.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n\r\n      \/* Focus en el campo *\/\r\n      setTimeout(function() {\r\n        firstError.focus();\r\n      }, 400);\r\n\r\n      \/* Resaltar temporalmente *\/\r\n      if (fieldContainer) {\r\n        \/* Si es un search select, resaltar el contenedor *\/\r\n        var highlightTarget = fieldContainer.classList.contains('rc-search-select') ? fieldContainer.querySelector('.rc-search-select-input') : firstError;\r\n        highlightTarget.classList.add('rc-field-highlight');\r\n        setTimeout(function() {\r\n          highlightTarget.classList.remove('rc-field-highlight');\r\n        }, 1800);\r\n      } else {\r\n        firstError.classList.add('rc-field-highlight');\r\n        setTimeout(function() {\r\n          firstError.classList.remove('rc-field-highlight');\r\n        }, 1800);\r\n      }\r\n    }\r\n\r\n    \/* ================================================================\r\n       VERIFICACI\u00d3N DE TIEMPO M\u00cdNIMO (5 segundos)\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Verifica que el formulario no se haya enviado antes de 5 segundos\r\n     * @returns {boolean}\r\n     *\/\r\n    function verificarTiempoMinimo() {\r\n      var tiempoTranscurrido = (Date.now() - formStartTime) \/ 1000;\r\n      return tiempoTranscurrido >= 5;\r\n    }\r\n\r\n    \/* ================================================================\r\n       ENV\u00cdO POR AJAX (fetch)\r\n       ================================================================ *\/\r\n    reclamoForm.addEventListener('submit', function(e) {\r\n      e.preventDefault();\r\n      if (isSubmitting) return;\r\n\r\n      \/* Verificar tiempo m\u00ednimo *\/\r\n      if (!verificarTiempoMinimo()) {\r\n        reclamoFeedback.classList.remove('rc-feedback-success');\r\n        reclamoFeedback.classList.add('rc-feedback-error');\r\n        reclamoFeedback.textContent = 'Por favor espere al menos 5 segundos antes de enviar.';\r\n        reclamoFeedback.style.display = 'block';\r\n        setTimeout(function() {\r\n          reclamoFeedback.style.display = 'none';\r\n          reclamoFeedback.classList.remove('rc-feedback-error');\r\n        }, 3000);\r\n        return;\r\n      }\r\n\r\n      \/* Verificar token anti-duplicado *\/\r\n      var tokenEl = document.getElementById('rc_submit_token_reclamo');\r\n      var token = tokenEl ? tokenEl.value : '';\r\n      if (!token || usedTokens[token]) {\r\n        reclamoFeedback.classList.remove('rc-feedback-success');\r\n        reclamoFeedback.classList.add('rc-feedback-error');\r\n        reclamoFeedback.textContent = 'Este formulario ya fue enviado. Si necesita enviar otro, recargue la p\u00e1gina.';\r\n        reclamoFeedback.style.display = 'block';\r\n        return;\r\n      }\r\n\r\n      \/* Validar primero *\/\r\n      if (!validateForm(reclamoForm)) {\r\n        scrollToFirstError(reclamoForm);\r\n        return;\r\n      }\r\n\r\n      \/* Mostrar modal de confirmaci\u00f3n *\/\r\n      showConfirmModal(function() {\r\n        handleSubmit(reclamoForm, 'reclamo', reclamoBtn, reclamoSpinner, reclamoBtnText, reclamoFeedback);\r\n      });\r\n    });\r\n\r\n    consultaForm.addEventListener('submit', function(e) {\r\n      e.preventDefault();\r\n      if (isSubmitting) return;\r\n\r\n      \/* Verificar tiempo m\u00ednimo *\/\r\n      if (!verificarTiempoMinimo()) {\r\n        consultaFeedback.classList.remove('rc-feedback-success');\r\n        consultaFeedback.classList.add('rc-feedback-error');\r\n        consultaFeedback.textContent = 'Por favor espere al menos 5 segundos antes de enviar.';\r\n        consultaFeedback.style.display = 'block';\r\n        setTimeout(function() {\r\n          consultaFeedback.style.display = 'none';\r\n          consultaFeedback.classList.remove('rc-feedback-error');\r\n        }, 3000);\r\n        return;\r\n      }\r\n\r\n      \/* Verificar token anti-duplicado *\/\r\n      var tokenEl = document.getElementById('rc_submit_token_consulta');\r\n      var token = tokenEl ? tokenEl.value : '';\r\n      if (!token || usedTokens[token]) {\r\n        consultaFeedback.classList.remove('rc-feedback-success');\r\n        consultaFeedback.classList.add('rc-feedback-error');\r\n        consultaFeedback.textContent = 'Este formulario ya fue enviado. Si necesita enviar otro, recargue la p\u00e1gina.';\r\n        consultaFeedback.style.display = 'block';\r\n        return;\r\n      }\r\n\r\n      \/* Validar primero *\/\r\n      if (!validateForm(consultaForm)) {\r\n        scrollToFirstError(consultaForm);\r\n        return;\r\n      }\r\n\r\n      \/* Mostrar modal de confirmaci\u00f3n *\/\r\n      showConfirmModal(function() {\r\n        handleSubmit(consultaForm, 'consulta', consultaBtn, consultaSpinner, consultaBtnText, consultaFeedback);\r\n      });\r\n    });\r\n\r\n    \/**\r\n     * Maneja el env\u00edo del formulario\r\n     * @param {HTMLFormElement} form - El formulario\r\n     * @param {string} tipo - 'reclamo' o 'consulta'\r\n     * @param {HTMLElement} btn - Bot\u00f3n submit\r\n     * @param {HTMLElement} spinner - Elemento spinner\r\n     * @param {HTMLElement} btnText - Texto del bot\u00f3n\r\n     * @param {HTMLElement} feedback - Elemento de feedback\r\n     *\/\r\n    function handleSubmit(form, tipo, btn, spinner, btnText, feedback) {\r\n      \/* Validar todo el formulario *\/\r\n      if (!validateForm(form)) {\r\n        scrollToFirstError(form);\r\n        return;\r\n      }\r\n\r\n      \/* Marcar token como usado *\/\r\n      var tokenEl = form.querySelector('[name=\"rc_submit_token\"]');\r\n      if (tokenEl && tokenEl.value) {\r\n        usedTokens[tokenEl.value] = true;\r\n      }\r\n\r\n      \/* Estado de env\u00edo *\/\r\n      isSubmitting = true;\r\n      setButtonLoading(btn, spinner, btnText, true);\r\n      feedback.classList.remove('rc-feedback-success', 'rc-feedback-error');\r\n      feedback.style.display = 'none';\r\n      feedback.textContent = '';\r\n\r\n      \/* Recopilar datos del formulario *\/\r\n      var formData = new FormData(form);\r\n\r\n      \/* Asegurar que los valores de los search selects est\u00e9n en los hidden *\/\r\n      syncSearchSelectsToHidden(form);\r\n\r\n      \/* Reconstruir FormData con los hidden actualizados *\/\r\n      formData = new FormData(form);\r\n\r\n      \/* Sanitizar valores *\/\r\n      var data = {};\r\n      formData.forEach(function(value, key) {\r\n        data[key] = sanitizeValue(value);\r\n      });\r\n\r\n      \/* Agregar acci\u00f3n, tipo y persona jur\u00eddica forzada *\/\r\n      data.action = 'rc_procesar_formulario';\r\n      data.rc_tipo = tipo;\r\n      data.rc_persona_juridica = 'si'; \/* ponytail: siempre Persona Jur\u00eddica *\/\r\n      data.rc_nonce = window.rc_ajax_nonce || '';\r\n\r\n      \/* Incluir tipo de documento en los datos *\/\r\n      if (tipo === 'reclamo') {\r\n        var tipoDocEl = document.getElementById('rc_tipo_documento');\r\n        if (tipoDocEl) {\r\n          data.rc_tipo_documento = tipoDocEl.value;\r\n        }\r\n      }\r\n\r\n      \/* Construir URL-encoded string para fetch *\/\r\n      var urlEncoded = Object.keys(data).map(function(key) {\r\n        return encodeURIComponent(key) + '=' + encodeURIComponent(data[key]);\r\n      }).join('&');\r\n\r\n      \/* URL de admin-ajax.php - se define desde PHP *\/\r\n      var ajaxUrl = window.rc_ajax_url || '\/wp-admin\/admin-ajax.php';\r\n\r\n      \/* Enviar con fetch *\/\r\n      fetch(ajaxUrl, {\r\n          method: 'POST',\r\n          headers: {\r\n            'Content-Type': 'application\/x-www-form-urlencoded',\r\n            'X-Requested-With': 'XMLHttpRequest'\r\n          },\r\n          body: urlEncoded\r\n        })\r\n        .then(function(response) {\r\n          if (!response.ok) {\r\n            throw new Error('Error de red: ' + response.status);\r\n          }\r\n          return response.json();\r\n        })\r\n        .then(function(json) {\r\n          isSubmitting = false;\r\n          setButtonLoading(btn, spinner, btnText, false);\r\n\r\n          if (json.success) {\r\n            \/* \u00c9xito *\/\r\n            formSubmitted = true;\r\n            feedback.classList.add('rc-feedback-success');\r\n            feedback.textContent = json.data.message || 'Formulario enviado correctamente.';\r\n            feedback.style.display = 'block';\r\n            \/* Limpiar formulario *\/\r\n            form.reset();\r\n            \/* Limpiar search selects *\/\r\n            clearAllSearchSelects(form);\r\n            \/* Limpiar estilos de validaci\u00f3n *\/\r\n            form.querySelectorAll('.rc-field-input, .rc-field-textarea, .rc-field-select').forEach(function(f) {\r\n              f.classList.remove('rc-valid', 'rc-invalid');\r\n            });\r\n            form.querySelectorAll('.rc-field-error').forEach(function(e) {\r\n              e.textContent = '';\r\n            });\r\n            \/* Resetear contadores *\/\r\n            updateCharCounter(textareaReclamo, counterReclamo, 5000);\r\n            updateCharCounter(textareaConsulta, counterConsulta, 3000);\r\n            \/* Eliminar LocalStorage completamente *\/\r\n            clearLocalStorage();\r\n            \/* Resetear barra de progreso *\/\r\n            progressFill.style.width = '0%';\r\n            progressPercentage.textContent = '0%';\r\n            progressStep.textContent = 'Paso 1 de 4';\r\n            \/* Actualizar contadores *\/\r\n            updateAllCounters();\r\n            \/* Resetear tipo de documento *\/\r\n            if (tipoDocumentoEl) tipoDocumentoEl.value = '';\r\n            if (identidadInput) identidadInput.placeholder = 'Seleccione tipo de documento';\r\n            \/* ponytail: fade-out suave tras env\u00edo exitoso *\/\r\n            var formCard = form.closest('.rc-form-card');\r\n            \/* Fase 1: esperar 2 segundos mostrando el feedback, luego fade-out *\/\r\n            setTimeout(function() {\r\n              if (formCard) {\r\n                formCard.classList.add('rc-hiding');\r\n                formCard.classList.remove('rc-visible');\r\n              }\r\n              progressContainer.classList.remove('rc-visible');\r\n              btnSelectorReclamo.classList.remove('rc-active');\r\n              btnSelectorConsulta.classList.remove('rc-active');\r\n              \/* Fase 2: despu\u00e9s de la transici\u00f3n CSS, limpiar y restaurar *\/\r\n              setTimeout(function() {\r\n                if (formCard) formCard.classList.remove('rc-hiding');\r\n                currentVisibleForm = null;\r\n                feedback.style.display = 'none';\r\n                feedback.classList.remove('rc-feedback-success');\r\n              }, 350);\r\n            }, 2000);\r\n          } else {\r\n            \/* Error del servidor *\/\r\n            feedback.classList.add('rc-feedback-error');\r\n            feedback.textContent = json.data.message || 'Ocurri\u00f3 un error al enviar el formulario. Intente nuevamente.';\r\n            feedback.style.display = 'block';\r\n          }\r\n\r\n          \/* Re-habilitar beforeunload despu\u00e9s del env\u00edo *\/\r\n          formSubmitted = json.success;\r\n        })\r\n        .catch(function(error) {\r\n          isSubmitting = false;\r\n          setButtonLoading(btn, spinner, btnText, false);\r\n          feedback.classList.add('rc-feedback-error');\r\n          feedback.textContent = 'Error de conexi\u00f3n. Verifique su internet e intente nuevamente.';\r\n          feedback.style.display = 'block';\r\n          \/* ponytail: solo loguear en consola si no hay informaci\u00f3n sensible *\/\r\n          if (window.console && window.console.error) {\r\n            \/* No exponer detalles internos en producci\u00f3n *\/\r\n          }\r\n        });\r\n    }\r\n\r\n    \/**\r\n     * Cambia el estado visual del bot\u00f3n (loading \/ normal)\r\n     * @param {HTMLElement} btn\r\n     * @param {HTMLElement} spinner\r\n     * @param {HTMLElement} btnText\r\n     * @param {boolean} loading\r\n     *\/\r\n    function setButtonLoading(btn, spinner, btnText, loading) {\r\n      if (loading) {\r\n        btn.disabled = true;\r\n        spinner.style.display = 'inline-block';\r\n        btnText.textContent = 'Enviando...';\r\n      } else {\r\n        btn.disabled = false;\r\n        spinner.style.display = 'none';\r\n        btnText.textContent = btnText.getAttribute('data-original') || btnText.textContent;\r\n      }\r\n    }\r\n\r\n    \/* Guardar textos originales de los botones *\/\r\n    reclamoBtnText.setAttribute('data-original', reclamoBtnText.textContent);\r\n    consultaBtnText.setAttribute('data-original', consultaBtnText.textContent);\r\n\r\n    \/* ================================================================\r\n       EVITAR REENV\u00cdO CON BOT\u00d3N ATR\u00c1S (back button)\r\n       ================================================================ *\/\r\n\r\n    \/* Reemplazar el estado del historial para evitar reenv\u00edo al volver atr\u00e1s *\/\r\n    if (window.history && window.history.replaceState) {\r\n      window.history.replaceState({ rc_form: true }, document.title, window.location.href);\r\n    }\r\n\r\n    window.addEventListener('popstate', function(e) {\r\n      \/* Si se naveg\u00f3 hacia atr\u00e1s despu\u00e9s de enviar, evitar resubmit *\/\r\n      if (formSubmitted) {\r\n        window.history.pushState({ rc_form: true }, document.title, window.location.href);\r\n      }\r\n    });\r\n\r\n    \/* ================================================================\r\n       SEARCHABLE SELECTS\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Inicializa un search select\r\n     * @param {string} wrapperId - ID del contenedor .rc-search-select\r\n     * @param {string} inputId - ID del input de b\u00fasqueda\r\n     * @param {string} hiddenId - ID del input hidden que almacena el valor real\r\n     * @param {string} type - 'departamento' | 'municipio'\r\n     * @param {string} linkedDeptoHiddenId - ID del hidden del departamento (para municipios)\r\n     *\/\r\n    function initSearchSelect(wrapperId, inputId, hiddenId, type, linkedDeptoHiddenId) {\r\n      var wrapper = document.getElementById(wrapperId);\r\n      var input = document.getElementById(inputId);\r\n      var hidden = document.getElementById(hiddenId);\r\n      if (!wrapper || !input || !hidden) return;\r\n\r\n      var dropdown = wrapper.querySelector('.rc-search-select-dropdown');\r\n      var highlightedIndex = -1;\r\n\r\n      \/* Mostrar dropdown al hacer focus *\/\r\n      input.addEventListener('focus', function() {\r\n        openDropdown();\r\n        filterOptions();\r\n      });\r\n\r\n      \/* Reabrir dropdown al hacer click (incluso si ya est\u00e1 seleccionado) *\/\r\n      input.addEventListener('click', function() {\r\n        openDropdown();\r\n        \/\/ filterOptions();\r\n      });\r\n\r\n      \/* Filtrar mientras escribe *\/\r\n      input.addEventListener('input', function() {\r\n        filterOptions();\r\n        validateField(input);\r\n        updateAllCounters();\r\n        saveToLocalStorage();\r\n        \/* Sincronizar valor al hidden *\/\r\n        var selectedLi = dropdown.querySelector('.rc-selected');\r\n        if (selectedLi) {\r\n          hidden.value = selectedLi.getAttribute('data-value') || '';\r\n        } else {\r\n          hidden.value = '';\r\n        }\r\n      });\r\n\r\n      \/* Navegaci\u00f3n con teclado *\/\r\n      input.addEventListener('keydown', function(e) {\r\n        var items = dropdown.querySelectorAll('li:not(.rc-no-results)');\r\n        if (items.length === 0) return;\r\n\r\n        if (e.key === 'ArrowDown') {\r\n          e.preventDefault();\r\n          highlightedIndex = Math.min(highlightedIndex + 1, items.length - 1);\r\n          updateHighlight(items, highlightedIndex);\r\n        } else if (e.key === 'ArrowUp') {\r\n          e.preventDefault();\r\n          highlightedIndex = Math.max(highlightedIndex - 1, 0);\r\n          updateHighlight(items, highlightedIndex);\r\n        } else if (e.key === 'Enter') {\r\n          e.preventDefault();\r\n          if (highlightedIndex >= 0 && highlightedIndex < items.length) {\r\n            selectOption(items[highlightedIndex], input, hidden, dropdown, type, linkedDeptoHiddenId);\r\n          }\r\n          closeDropdown();\r\n        } else if (e.key === 'Escape') {\r\n          closeDropdown();\r\n        }\r\n      });\r\n\r\n      \/* Cerrar al hacer blur (con delay para permitir click en opciones) *\/\r\n      input.addEventListener('blur', function() {\r\n        setTimeout(function() {\r\n          closeDropdown();\r\n        }, 200);\r\n      });\r\n\r\n      \/**\r\n       * Abre el dropdown\r\n       *\/\r\n      function openDropdown() {\r\n        \/* Cerrar otros dropdowns *\/\r\n        document.querySelectorAll('.rc-search-select.open').forEach(function(el) {\r\n          if (el !== wrapper) el.classList.remove('open');\r\n        });\r\n        wrapper.classList.add('open');\r\n        highlightedIndex = -1;\r\n        \/* Poblar opciones seg\u00fan tipo *\/\r\n        populateDropdown();\r\n      }\r\n\r\n      \/**\r\n       * Cierra el dropdown\r\n       *\/\r\n      function closeDropdown() {\r\n        wrapper.classList.remove('open');\r\n      }\r\n\r\n      \/**\r\n       * Puebla el dropdown con las opciones seg\u00fan el tipo\r\n       *\/\r\n      function populateDropdown() {\r\n        dropdown.innerHTML = '';\r\n        var options = [];\r\n\r\n        if (type === 'departamento') {\r\n          options = Object.keys(DEPARTAMENTOS_HN);\r\n        } else if (type === 'municipio') {\r\n          var deptoHidden = linkedDeptoHiddenId ? document.getElementById(linkedDeptoHiddenId) : null;\r\n          if (deptoHidden && deptoHidden.value && DEPARTAMENTOS_HN[deptoHidden.value]) {\r\n            options = DEPARTAMENTOS_HN[deptoHidden.value];\r\n          }\r\n        }\r\n\r\n        options.forEach(function(opt) {\r\n          var li = document.createElement('li');\r\n          li.setAttribute('role', 'option');\r\n          li.setAttribute('data-value', opt);\r\n          li.textContent = opt;\r\n\r\n          \/* Marcar como seleccionado si coincide con el hidden *\/\r\n          if (hidden.value === opt) {\r\n            li.classList.add('rc-selected');\r\n          }\r\n\r\n          li.addEventListener('mousedown', function(e) {\r\n            e.preventDefault();\r\n            selectOption(li, input, hidden, dropdown, type, linkedDeptoHiddenId);\r\n            closeDropdown();\r\n          });\r\n\r\n          dropdown.appendChild(li);\r\n        });\r\n\r\n        if (options.length === 0 && type === 'municipio') {\r\n          var li = document.createElement('li');\r\n          li.classList.add('rc-no-results');\r\n          li.textContent = 'Seleccione primero un departamento';\r\n          dropdown.appendChild(li);\r\n        }\r\n      }\r\n\r\n      \/**\r\n       * Filtra las opciones seg\u00fan el texto ingresado\r\n       *\/\r\n      function filterOptions() {\r\n        var searchTerm = input.value.toLowerCase().trim();\r\n        var items = dropdown.querySelectorAll('li:not(.rc-no-results)');\r\n        var hasVisible = false;\r\n\r\n        items.forEach(function(li) {\r\n          if (li.textContent.toLowerCase().indexOf(searchTerm) !== -1) {\r\n            li.style.display = '';\r\n            hasVisible = true;\r\n          } else {\r\n            li.style.display = 'none';\r\n          }\r\n        });\r\n\r\n        \/* Mostrar mensaje si no hay resultados *\/\r\n        var noResults = dropdown.querySelector('.rc-no-results');\r\n        if (!hasVisible && searchTerm.length > 0) {\r\n          if (!noResults) {\r\n            noResults = document.createElement('li');\r\n            noResults.classList.add('rc-no-results');\r\n            noResults.textContent = 'Sin resultados';\r\n            dropdown.appendChild(noResults);\r\n          }\r\n          noResults.style.display = '';\r\n        } else if (noResults && noResults.textContent === 'Sin resultados') {\r\n          noResults.style.display = 'none';\r\n        }\r\n\r\n        highlightedIndex = -1;\r\n      }\r\n\r\n      \/**\r\n       * Actualiza el resaltado del elemento actual\r\n       *\/\r\n      function updateHighlight(items, index) {\r\n        items.forEach(function(item, i) {\r\n          if (i === index) {\r\n            item.classList.add('rc-highlighted');\r\n            item.scrollIntoView({ block: 'nearest' });\r\n          } else {\r\n            item.classList.remove('rc-highlighted');\r\n          }\r\n        });\r\n      }\r\n    }\r\n\r\n    \/**\r\n     * Selecciona una opci\u00f3n del dropdown\r\n     *\/\r\n    function selectOption(li, input, hidden, dropdown, type, linkedDeptoHiddenId) {\r\n      var value = li.getAttribute('data-value');\r\n      input.value = value;\r\n      hidden.value = value;\r\n\r\n      \/* Quitar selecci\u00f3n previa *\/\r\n      dropdown.querySelectorAll('.rc-selected').forEach(function(el) {\r\n        el.classList.remove('rc-selected');\r\n      });\r\n      li.classList.add('rc-selected');\r\n\r\n      \/* Si es departamento, habilitar y poblar el municipio *\/\r\n      if (type === 'departamento') {\r\n        var munInput = document.getElementById('rc_search_municipio');\r\n        var munHidden = document.getElementById('rc_municipio');\r\n        if (munInput && munHidden) {\r\n          munInput.value = '';\r\n          munHidden.value = '';\r\n          munInput.disabled = false;\r\n          munInput.placeholder = 'Buscar municipio...';\r\n          munInput.classList.remove('rc-valid', 'rc-invalid');\r\n          \/* Limpiar dropdown de municipio *\/\r\n          var munDropdown = document.getElementById('rcSearchMunicipio').querySelector('.rc-search-select-dropdown');\r\n          if (munDropdown) munDropdown.innerHTML = '';\r\n        }\r\n      }\r\n\r\n      \/* Disparar eventos *\/\r\n      input.dispatchEvent(new Event('input', { bubbles: true }));\r\n      input.dispatchEvent(new Event('change', { bubbles: true }));\r\n    }\r\n\r\n    \/**\r\n     * Puebla el dropdown de municipio basado en el departamento seleccionado\r\n     *\/\r\n    function populateMunicipioDropdown(departamentoValue) {\r\n      var munInput = document.getElementById('rc_search_municipio');\r\n      var munDropdown = document.getElementById('rcSearchMunicipio').querySelector('.rc-search-select-dropdown');\r\n      if (!munInput || !munDropdown || !departamentoValue || !DEPARTAMENTOS_HN[departamentoValue]) return;\r\n\r\n      var municipios = DEPARTAMENTOS_HN[departamentoValue];\r\n      munDropdown.innerHTML = '';\r\n      municipios.forEach(function(mun) {\r\n        var li = document.createElement('li');\r\n        li.setAttribute('role', 'option');\r\n        li.setAttribute('data-value', mun);\r\n        li.textContent = mun;\r\n        li.addEventListener('mousedown', function(e) {\r\n          e.preventDefault();\r\n          var hidden = document.getElementById('rc_municipio');\r\n          var input = document.getElementById('rc_search_municipio');\r\n          var dropdown = document.getElementById('rcSearchMunicipio').querySelector('.rc-search-select-dropdown');\r\n          selectOption(li, input, hidden, dropdown, 'municipio', null);\r\n          var wrapper = document.getElementById('rcSearchMunicipio');\r\n          if (wrapper) wrapper.classList.remove('open');\r\n        });\r\n        munDropdown.appendChild(li);\r\n      });\r\n    }\r\n\r\n    \/**\r\n     * Sincroniza los valores de search selects a los inputs hidden\r\n     *\/\r\n    function syncSearchSelectsToHidden(form) {\r\n      var searchInputs = form.querySelectorAll('.rc-search-select-input');\r\n      searchInputs.forEach(function(input) {\r\n        \/* Encontrar el hidden correspondiente *\/\r\n        var hiddenId = input.id.replace('rc_search_', 'rc_');\r\n        var hidden = document.getElementById(hiddenId);\r\n        if (hidden) {\r\n          hidden.value = input.value;\r\n        }\r\n      });\r\n    }\r\n\r\n    \/**\r\n     * Limpia todos los search selects de un formulario\r\n     *\/\r\n    function clearAllSearchSelects(form) {\r\n      var wrappers = form.querySelectorAll('.rc-search-select');\r\n      wrappers.forEach(function(wrapper) {\r\n        var input = wrapper.querySelector('.rc-search-select-input');\r\n        var dropdown = wrapper.querySelector('.rc-search-select-dropdown');\r\n        if (input) {\r\n          input.value = '';\r\n          input.classList.remove('rc-valid', 'rc-invalid');\r\n          if (input.getAttribute('data-search-type') === 'municipio') {\r\n            input.disabled = true;\r\n            input.placeholder = 'Seleccione primero un departamento...';\r\n          }\r\n        }\r\n        if (dropdown) dropdown.innerHTML = '';\r\n      });\r\n      \/* Limpiar tambi\u00e9n los hidden *\/\r\n      var hiddens = form.querySelectorAll('#rc_departamento, #rc_municipio');\r\n      hiddens.forEach(function(h) { h.value = ''; });\r\n    }\r\n\r\n    \/* Inicializar search selects (solo los de Persona Jur\u00eddica) *\/\r\n    initSearchSelect('rcSearchDepartamento', 'rc_search_departamento', 'rc_departamento', 'departamento', null);\r\n    initSearchSelect('rcSearchMunicipio', 'rc_search_municipio', 'rc_municipio', 'municipio', 'rc_departamento');\r\n\r\n    \/* ================================================================\r\n       ADVERTENCIA AL ABANDONAR LA P\u00c1GINA (beforeunload)\r\n       ================================================================ *\/\r\n    window.addEventListener('beforeunload', function(e) {\r\n      if (formSubmitted) return; \/* No advertir si ya se envi\u00f3 exitosamente *\/\r\n\r\n      \/* Verificar si hay datos en LocalStorage o campos llenos *\/\r\n      var saved = loadFromLocalStorage();\r\n      if (saved && saved.fields && Object.keys(saved.fields).length > 0) {\r\n        var hasContent = false;\r\n        Object.keys(saved.fields).forEach(function(key) {\r\n          if (saved.fields[key] && saved.fields[key].trim() !== '') {\r\n            hasContent = true;\r\n          }\r\n        });\r\n        if (hasContent) {\r\n          e.preventDefault();\r\n          e.returnValue = 'Hay cambios sin guardar. \u00bfDesea salir?';\r\n          return e.returnValue;\r\n        }\r\n      }\r\n    });\r\n\r\n    \/* ================================================================\r\n       SUPRESI\u00d3N DE CONSOLA EN PRODUCCI\u00d3N\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Suprime logs de consola con informaci\u00f3n sensible en producci\u00f3n.\r\n     * Si WP_DEBUG est\u00e1 desactivado (normal en producci\u00f3n), no mostrar\r\n     * tokens, nonces, datos de usuario ni stack traces.\r\n     * ponytail: Si se necesita debug, activar WP_DEBUG en wp-config.php\r\n     *\/\r\n    var RC_DEBUG = window.rc_debug || false;\r\n\r\n    function rcLog(mensaje, data) {\r\n      if (RC_DEBUG && window.console && window.console.log) {\r\n        window.console.log('[RC Form]', mensaje, data || '');\r\n      }\r\n    }\r\n\r\n    function rcError(mensaje, data) {\r\n      if (RC_DEBUG && window.console && window.console.error) {\r\n        window.console.error('[RC Form Error]', mensaje, data || '');\r\n      }\r\n      \/* En producci\u00f3n, no exponer errores internos *\/\r\n    }\r\n\r\n    \/* ================================================================\r\n       INICIALIZACI\u00d3N\r\n       ================================================================ *\/\r\n\r\n    \/**\r\n     * Verifica si hay un formulario guardado al cargar la p\u00e1gina\r\n     *\/\r\n    function checkForSavedForm() {\r\n      var saved = loadFromLocalStorage();\r\n\r\n      if (saved && saved.fields) {\r\n        \/* Verificar que haya al menos un campo con contenido *\/\r\n        var hasContent = false;\r\n        Object.keys(saved.fields).forEach(function(key) {\r\n          if (saved.fields[key] && saved.fields[key].trim() !== '') {\r\n            hasContent = true;\r\n          }\r\n        });\r\n\r\n        \/* Verificar antig\u00fcedad: m\u00e1ximo 24 horas *\/\r\n        var maxAge = 24 * 60 * 60 * 1000;\r\n        var isExpired = saved.timestamp && (Date.now() - saved.timestamp > maxAge);\r\n\r\n        if (hasContent && !isExpired) {\r\n          showRestoreModal();\r\n        } else if (isExpired) {\r\n          clearLocalStorage();\r\n        }\r\n      }\r\n    }\r\n\r\n    \/* Inicializar al cargar *\/\r\n    checkForSavedForm();\r\n    \/* Inicializar total de campos *\/\r\n    setTimeout(function() {\r\n      updateFieldsCounterReclamo();\r\n      updateFieldsCounterConsulta();\r\n    }, 100);\r\n\r\n    \/* Marcar timestamp global de inicio *\/\r\n    formStartTime = Date.now();\r\n\r\n  })();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ec6dfb1 elementor-hidden-desktop elementor-hidden-tablet elementor-hidden-mobile elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ec6dfb1\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;jet_parallax_layout_list&quot;:[{&quot;jet_parallax_layout_image&quot;:{&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;size&quot;:&quot;&quot;},&quot;_id&quot;:&quot;7e623e4&quot;,&quot;jet_parallax_layout_image_tablet&quot;:{&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;size&quot;:&quot;&quot;},&quot;jet_parallax_layout_image_mobile&quot;:{&quot;url&quot;:&quot;&quot;,&quot;id&quot;:&quot;&quot;,&quot;size&quot;:&quot;&quot;},&quot;jet_parallax_layout_speed&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:50,&quot;sizes&quot;:[]},&quot;jet_parallax_layout_type&quot;:&quot;scroll&quot;,&quot;jet_parallax_layout_direction&quot;:&quot;1&quot;,&quot;jet_parallax_layout_fx_direction&quot;:null,&quot;jet_parallax_layout_z_index&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_x&quot;:50,&quot;jet_parallax_layout_bg_x_tablet&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_x_mobile&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_y&quot;:50,&quot;jet_parallax_layout_bg_y_tablet&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_y_mobile&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_size&quot;:&quot;auto&quot;,&quot;jet_parallax_layout_bg_size_tablet&quot;:&quot;&quot;,&quot;jet_parallax_layout_bg_size_mobile&quot;:&quot;&quot;,&quot;jet_parallax_layout_animation_prop&quot;:&quot;transform&quot;,&quot;jet_parallax_layout_on&quot;:[&quot;desktop&quot;,&quot;tablet&quot;]}]}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-28710b7\" data-id=\"28710b7\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b09faf1 single-service-accordion elementor-widget elementor-widget-jet-accordion\" data-id=\"b09faf1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"jet-accordion.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"jet-accordion\" data-settings=\"{&quot;collapsible&quot;:false,&quot;ajaxTemplate&quot;:false,&quot;switchScrolling&quot;:false,&quot;switchScrollingOffset&quot;:0,&quot;switchScrollingDelay&quot;:500}\">\n\t\t\t<div class=\"jet-accordion__inner\">\n\t\t\t\t<div class=\" jet-accordion__item jet-toggle jet-toggle-move-up-effect \">\n\t\t\t\t\t\t\t<div id=\"jet-toggle-control-1851\" class=\"jet-toggle__control elementor-menu-anchor\" data-toggle=\"1\" role=\"button\" tabindex=\"0\" aria-controls=\"jet-toggle-content-1851\" aria-expanded=\"false\" data-template-id=\"false\">\n\t\t\t\t\t\t\t\t<div class=\"jet-toggle__label-icon jet-toggle-icon-position-left\"><span class=\"jet-toggle__icon icon-normal jet-tabs-icon\"><svg class=\"e-font-icon-svg e-fas-angle-right\" viewBox=\"0 0 256 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"><\/path><\/svg><\/span><span class=\"jet-toggle__icon icon-active jet-tabs-icon\"><svg class=\"e-font-icon-svg e-fas-angle-down\" viewBox=\"0 0 320 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.2 9.4-24.4 9.4-33.8 0z\"><\/path><\/svg><\/span><\/div><div class=\"jet-toggle__label-text\">Strategy Building<\/div>\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div id=\"jet-toggle-content-1851\" class=\"jet-toggle__content\" data-toggle=\"1\" role=\"region\" data-template-id=\"false\">\n\t\t\t\t\t\t\t\t<div class=\"jet-toggle__content-inner\">A successful strategy is a key part on the way to the success of the whole company. It solves everything, so it is so important to develop the exact solution that will allow to beat the competitors and enter the market with those services and goods that will be in demand. Everyone can use the services of planning and building a strategy, from a small business owner to a large corporation. We will develop the most successful strategy that will allow your business develop and prosper for many years to come.<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div><div class=\" jet-accordion__item jet-toggle jet-toggle-move-up-effect \">\n\t\t\t\t\t\t\t<div id=\"jet-toggle-control-1852\" class=\"jet-toggle__control elementor-menu-anchor\" data-toggle=\"2\" role=\"button\" tabindex=\"0\" aria-controls=\"jet-toggle-content-1852\" aria-expanded=\"false\" data-template-id=\"false\">\n\t\t\t\t\t\t\t\t<div class=\"jet-toggle__label-icon jet-toggle-icon-position-left\"><span class=\"jet-toggle__icon icon-normal jet-tabs-icon\"><svg class=\"e-font-icon-svg e-fas-angle-right\" viewBox=\"0 0 256 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"><\/path><\/svg><\/span><span class=\"jet-toggle__icon icon-active jet-tabs-icon\"><svg class=\"e-font-icon-svg e-fas-angle-down\" viewBox=\"0 0 320 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.2 9.4-24.4 9.4-33.8 0z\"><\/path><\/svg><\/span><\/div><div class=\"jet-toggle__label-text\"> For Small and Meduim Business<\/div>\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div id=\"jet-toggle-content-1852\" class=\"jet-toggle__content\" data-toggle=\"2\" role=\"region\" data-template-id=\"false\">\n\t\t\t\t\t\t\t\t<div class=\"jet-toggle__content-inner\">Obviously, the strategy for small businesses will differ from the strategy for a large corporation. We offer you to take advantage of unique approaches that will help you maintain a balance in the volatile economic world of the market.<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div><div class=\" jet-accordion__item jet-toggle jet-toggle-move-up-effect \">\n\t\t\t\t\t\t\t<div id=\"jet-toggle-control-1853\" class=\"jet-toggle__control elementor-menu-anchor\" data-toggle=\"3\" role=\"button\" tabindex=\"0\" aria-controls=\"jet-toggle-content-1853\" aria-expanded=\"false\" data-template-id=\"false\">\n\t\t\t\t\t\t\t\t<div class=\"jet-toggle__label-icon jet-toggle-icon-position-left\"><span class=\"jet-toggle__icon icon-normal jet-tabs-icon\"><svg class=\"e-font-icon-svg e-fas-angle-right\" viewBox=\"0 0 256 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z\"><\/path><\/svg><\/span><span class=\"jet-toggle__icon icon-active jet-tabs-icon\"><svg class=\"e-font-icon-svg e-fas-angle-down\" viewBox=\"0 0 320 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.2 9.4-24.4 9.4-33.8 0z\"><\/path><\/svg><\/span><\/div><div class=\"jet-toggle__label-text\">For Corporations<\/div>\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div id=\"jet-toggle-content-1853\" class=\"jet-toggle__content\" data-toggle=\"3\" role=\"region\" data-template-id=\"false\">\n\t\t\t\t\t\t\t\t<div class=\"jet-toggle__content-inner\">We have vast experience in creating successful strategies for large corporations. Take advantage of our services to ensure the development of your business and understand the most important directions.<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>We help our clients discover and take advantage of any investment opportunity. Though&#8230; Seleccione el tipo de formulario Consulta Consulta general Hoja de Reclamo Persona Jur\u00eddica Paso 1 de 4 0% Hoja de Reclamo &#8211; Persona Jur\u00eddica Campos completados 0 \/ 0 * Campos obligatorios No llenar Raz\u00f3n Social * Nombre y Apellidos * Tipo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"om_disable_all_campaigns":false,"footnotes":""},"class_list":["post-1037","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/fundacioncovelo.hn\/master\/wp-json\/wp\/v2\/pages\/1037","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fundacioncovelo.hn\/master\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/fundacioncovelo.hn\/master\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/fundacioncovelo.hn\/master\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fundacioncovelo.hn\/master\/wp-json\/wp\/v2\/comments?post=1037"}],"version-history":[{"count":5,"href":"https:\/\/fundacioncovelo.hn\/master\/wp-json\/wp\/v2\/pages\/1037\/revisions"}],"predecessor-version":[{"id":3340,"href":"https:\/\/fundacioncovelo.hn\/master\/wp-json\/wp\/v2\/pages\/1037\/revisions\/3340"}],"wp:attachment":[{"href":"https:\/\/fundacioncovelo.hn\/master\/wp-json\/wp\/v2\/media?parent=1037"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}