<?php
require_once dirname(__DIR__) . '/includes/gestor_archivos.php';
require_once dirname(__DIR__) . '/includes/optimizador_multimedia.php';



/* =========================================
   VALORIZACIÓN AUTOMÁTICA DE PRENSA
   - Solo se aplica a noticias tipo Diario/Prensa.
   - Usa las medidas oficiales de columnas y módulos.
   - Obtiene el costo por cm² desde Configuración > Medios.
========================================= */
if (!function_exists('calcularValorizacionPrensa')) {
    function numeroDecimalMedio($valor) {
        $valor = trim((string)$valor);
        if ($valor === '') {
            return 0.0;
        }

        $valor = str_replace(',', '.', $valor);
        if (preg_match('/([0-9]+(?:\.[0-9]+)?)/', $valor, $m)) {
            return (float)$m[1];
        }

        return 0.0;
    }

    function calcularValorizacionPrensa($conn, $tipo_medio, $nombre_medio, $post) {
        $resultado = array(
            'aplica' => false,
            'medio_id' => 0,
            'costo_cm2' => 0.0,
            'area_cm2' => 0.0,
            'valor_noticia' => 0.0,
            'paginas_detalle' => array()
        );

        $tipo_normalizado = mb_strtolower(trim((string)$tipo_medio), 'UTF-8');
        if (!in_array($tipo_normalizado, array('diario', 'prensa'), true)) {
            return $resultado;
        }

        $resultado['aplica'] = true;

        $medidas_columnas = array(
            1 => 4.02,
            2 => 8.34,
            3 => 12.77,
            4 => 17.15,
            5 => 21.52,
            6 => 25.90
        );

        $medidas_modulos = array(
            1 => 1.55,
            2 => 3.49,
            3 => 5.43,
            4 => 7.37,
            5 => 9.31,
            6 => 11.25,
            7 => 13.19,
            8 => 15.13,
            9 => 17.07,
            10 => 19.01,
            11 => 21.00,
            12 => 22.90,
            13 => 24.84,
            14 => 26.78,
            15 => 28.72,
            16 => 30.66,
            17 => 32.60,
            18 => 34.54
        );

        $paginas = array();
        $paginas[] = array(
            'pagina' => trim((string)($post['pagina'] ?? '')),
            'columnas' => intval($post['columnas'] ?? 0),
            'modulos' => intval($post['modulos'] ?? 0)
        );

        $paginas_extra = isset($post['pagina_extra']) && is_array($post['pagina_extra']) ? $post['pagina_extra'] : array();
        $columnas_extra = isset($post['columnas_extra']) && is_array($post['columnas_extra']) ? $post['columnas_extra'] : array();
        $modulos_extra = isset($post['modulos_extra']) && is_array($post['modulos_extra']) ? $post['modulos_extra'] : array();
        $max_extra = max(count($paginas_extra), count($columnas_extra), count($modulos_extra));

        for ($i = 0; $i < $max_extra; $i++) {
            $paginas[] = array(
                'pagina' => trim((string)($paginas_extra[$i] ?? '')),
                'columnas' => intval($columnas_extra[$i] ?? 0),
                'modulos' => intval($modulos_extra[$i] ?? 0)
            );
        }

        /*
           Cada fila se valoriza de manera independiente:
           área_fila = medida_columnas × medida_módulos
           valor_fila = área_fila × costo_cm²
           total_noticia = suma de todos los valores de fila

           El número escrito en "Página" solo identifica la página del diario;
           no participa en ninguna operación matemática.
        */
        $area_total = 0.0;

        $nombre_medio = trim((string)$nombre_medio);
        if ($nombre_medio !== '' && $conn instanceof mysqli) {
            $nombre_sql = $conn->real_escape_string($nombre_medio);
            /*
               Buscar el costo por el nombre exacto del medio, sin obligar a que
               Configuración lo tenga clasificado como Prensa/Diario. En la base
               real algunos medios impresos fueron registrados con otro tipo,
               pero su campo valor sigue siendo el costo por cm² válido.
            */
            $q_medio = $conn->query(
                "SELECT id, valor
                 FROM medios
                 WHERE estado='activo'
                   AND TRIM(nombre_medio)=TRIM('$nombre_sql')
                 ORDER BY
                   CASE WHEN TRIM(COALESCE(valor,''))<>'' THEN 0 ELSE 1 END,
                   id ASC
                 LIMIT 1"
            );

            if ($q_medio && $q_medio->num_rows > 0) {
                $medio = $q_medio->fetch_assoc();
                $resultado['medio_id'] = intval($medio['id'] ?? 0);
                $resultado['costo_cm2'] = round(numeroDecimalMedio($medio['valor'] ?? ''), 4);
            }
        }

        $valor_total = 0.0;

        foreach ($paginas as $pagina) {
            $num_columnas = intval($pagina['columnas']);
            $num_modulos = intval($pagina['modulos']);

            if (!isset($medidas_columnas[$num_columnas]) || !isset($medidas_modulos[$num_modulos])) {
                continue;
            }

            $ancho = (float)$medidas_columnas[$num_columnas];
            $alto = (float)$medidas_modulos[$num_modulos];
            $area_fila = round($ancho * $alto, 4);
            $valor_fila = round($area_fila * $resultado['costo_cm2'], 6);

            $area_total += $area_fila;
            $valor_total += $valor_fila;

            $resultado['paginas_detalle'][] = array(
                'pagina' => $pagina['pagina'],
                'columnas' => $num_columnas,
                'medida_columnas_cm' => $ancho,
                'modulos' => $num_modulos,
                'medida_modulos_cm' => $alto,
                'area_cm2' => $area_fila,
                'costo_cm2' => $resultado['costo_cm2'],
                'valor_fila' => $valor_fila
            );
        }

        $resultado['area_cm2'] = round($area_total, 4);
        $resultado['valor_noticia'] = round($valor_total, 2);

        return $resultado;
    }
}


/* =========================================
   VALORIZACIÓN AUTOMÁTICA DE RADIO Y TELEVISIÓN
   - El valor configurado en Medios corresponde al costo por segundo.
   - Fórmula: duración total en segundos × costo por segundo.
========================================= */
if (!function_exists('calcularValorizacionRadioTv')) {
    function convertirDuracionASegundos($duracion) {
        $duracion = trim((string)$duracion);
        if ($duracion === '') { return 0; }
        if (preg_match('/^(\d{1,3}):([0-5]\d):([0-5]\d)$/', $duracion, $m)) {
            return (intval($m[1]) * 3600) + (intval($m[2]) * 60) + intval($m[3]);
        }
        if (preg_match('/^(\d{1,5}):([0-5]\d)$/', $duracion, $m)) {
            return (intval($m[1]) * 60) + intval($m[2]);
        }
        return 0;
    }

    function calcularValorizacionRadioTv($conn, $tipo_medio, $nombre_medio, $duracion) {
        $resultado = array(
            'aplica' => false,
            'medio_id' => 0,
            'costo_segundo' => 0.0,
            'duracion_segundos' => 0,
            'valor_noticia' => 0.0
        );

        $tipo_normalizado = mb_strtolower(trim((string)$tipo_medio), 'UTF-8');
        $tipo_normalizado = str_replace('ó', 'o', $tipo_normalizado);
        if (!in_array($tipo_normalizado, array('radio', 'television'), true)) {
            return $resultado;
        }

        $resultado['aplica'] = true;
        $resultado['duracion_segundos'] = convertirDuracionASegundos($duracion);
        $nombre_medio = trim((string)$nombre_medio);

        if ($nombre_medio !== '' && $conn instanceof mysqli) {
            $nombre_sql = $conn->real_escape_string($nombre_medio);
            $tipos_validos = ($tipo_normalizado === 'radio') ? "'Radio'" : "'Televisión','Television'";
            $q_medio = $conn->query(
                "SELECT id, valor
                 FROM medios
                 WHERE estado='activo'
                   AND tipo_medio IN ($tipos_validos)
                   AND TRIM(nombre_medio)=TRIM('$nombre_sql')
                 ORDER BY CASE WHEN TRIM(COALESCE(valor,''))<>'' THEN 0 ELSE 1 END, id ASC
                 LIMIT 1"
            );
            if ($q_medio && $q_medio->num_rows > 0) {
                $medio = $q_medio->fetch_assoc();
                $resultado['medio_id'] = intval($medio['id'] ?? 0);
                $resultado['costo_segundo'] = round(numeroDecimalMedio($medio['valor'] ?? ''), 6);
            }
        }

        $resultado['valor_noticia'] = round(
            $resultado['duracion_segundos'] * $resultado['costo_segundo'], 2
        );
        return $resultado;
    }
}

/* =========================================
   DASHBOARD ACTUAL SEGÚN EL ROL
========================================= */
$dashboard_actual = "dashboard_superadmin.php";

if (isset($_SESSION["rol_id"]) && intval($_SESSION["rol_id"]) === 3) {
    $dashboard_actual = "dashboard_editor.php";

    ob_start(function ($contenido) use ($dashboard_actual) {
        return str_replace("dashboard_superadmin.php", $dashboard_actual, $contenido);
    });
}

/* =========================================
   MÓDULO NOTICIAS SUPERADMIN
========================================= */

$usuario_id = isset($admin_id) ? intval($admin_id) : intval($_SESSION['usuario_id']);
$nombre = htmlspecialchars($_SESSION['nombre'] ?? 'Editor', ENT_QUOTES, 'UTF-8');
$mensaje = "";
$mensaje_soporte = "";
$modo_formulario = isset($_GET['form']) ? limpiarDato($_GET['form']) : "";



if (!function_exists('normalizarTonoEdicion')) {
    function normalizarTonoEdicion($valor) {
        $valor = mb_strtolower(trim((string)$valor), 'UTF-8');

        $equivalencias = array(
            'positiva' => 'positivo',
            'positivo' => 'positivo',
            'negativa' => 'negativo',
            'negativo' => 'negativo',
            'neutral'  => 'neutral',
            'neutro'   => 'neutral'
        );

        return $equivalencias[$valor] ?? $valor;
    }
}

/* =========================================
   MODO EDICIÓN DE NOTICIAS
========================================= */
$modo_edicion = true;
$id_editar = isset($_GET['id']) ? intval($_GET['id']) : 0;
$noticia = null;
$mensaje = "";

if ($id_editar <= 0) {
    echo "<script>window.location.href='dashboard_superadmin.php?modulo=noticias';</script>";
    exit();
}

$q_editar = $conn->query("SELECT * FROM notas WHERE id='$id_editar' AND caracter='NOTA' LIMIT 1");
if (!$q_editar || $q_editar->num_rows === 0) {
    echo "<script>alert('La noticia no existe.');window.location.href='dashboard_superadmin.php?modulo=noticias';</script>";
    exit();
}
$noticia = $q_editar->fetch_assoc();

/* NORMALIZAR ENTIDADES DEL TÍTULO PARA EVITAR &quot; VISIBLE */
$noticia['titulo'] = html_entity_decode((string)($noticia['titulo'] ?? ''), ENT_QUOTES | ENT_HTML5, 'UTF-8');

switch ($noticia['tipo_medio']) {
    case 'Diario':
        $modo_formulario = 'prensa';
        break;
    case 'Radio':
    case 'Televisión':
        $modo_formulario = 'radio_tv';
        break;
    case 'Redes Sociales':
    case 'Página Web':
        $modo_formulario = 'redes_web';
        break;
    default:
        $modo_formulario = 'prensa';
        break;
}

/* Separar etiquetas y datos adicionales guardados dentro de la descripción. */
$descripcion_original_editar = (string)($noticia['descripcion'] ?? '');
$descripcion_editar = $descripcion_original_editar;
$etiquetas_editar = '';

/*
   Las noticias antiguas pueden contener saltos reales, \n escritos como texto,
   etiquetas HTML <br> o entidades HTML. Se normaliza una copia para leer las
   etiquetas sin alterar el contenido original de la noticia.
*/
$descripcion_editar = html_entity_decode($descripcion_editar, ENT_QUOTES | ENT_HTML5, 'UTF-8');
$descripcion_editar = preg_replace('/<br\s*\/?\s*>/iu', "\n", $descripcion_editar);
$descripcion_editar = str_replace(array('\\r\\n', '\\n', '\\r'), "\n", $descripcion_editar);

$datos_edicion = array(
    'departamento' => '',
    'localidad'    => '',
    'enlace'       => '',
    'seccion'      => '',
    'pagina'       => '',
    'columnas'     => '',
    'modulos'      => '',
    'duracion'     => '',
    'programa'     => '',
    'hora_nota'    => '',
    'archivo_adjunto_ids' => ''
);

/*
   Recuperar datos técnicos y etiquetas de noticias antiguas y nuevas.
   Algunas noticias de Radio/TV fueron guardadas con formatos distintos
   (Etiquetas:, Etiquetas/Clientes:, uno o dos saltos de línea, o el bloque
   técnico después de las etiquetas). Se procesa por líneas para no perderlas.
*/
$descripcion_editar = str_replace(array("\r\n", "\r"), "\n", $descripcion_editar);

if (preg_match('/(?:^|\n)__DATOS_NOTICIA__:([A-Za-z0-9+\/=]+)(?:\n|$)/u', $descripcion_editar, $coincide_datos)) {
    $bloque_codificado = trim($coincide_datos[1]);
    $json_datos = base64_decode($bloque_codificado, true);

    if ($json_datos !== false) {
        $datos_decodificados = json_decode($json_datos, true);

        if (is_array($datos_decodificados)) {
            $datos_edicion = array_merge($datos_edicion, $datos_decodificados);
        }
    }

    $descripcion_editar = preg_replace(
        '/(?:^|\n)__DATOS_NOTICIA__:[A-Za-z0-9+\/=]+(?=\n|$)/u',
        '',
        $descripcion_editar,
        1
    );
}

/* Recuperar la línea de etiquetas sin exigir que esté al final. */
if (preg_match('/(?:^|\n)\s*Etiquetas(?:\s*\/\s*Clientes)?\s*:\s*([^\n]*)/iu', $descripcion_editar, $coincide_etiquetas)) {
    $etiquetas_editar = trim($coincide_etiquetas[1]);

    $descripcion_editar = preg_replace(
        '/(?:^|\n)\s*Etiquetas(?:\s*\/\s*Clientes)?\s*:\s*[^\n]*/iu',
        '',
        $descripcion_editar,
        1
    );
}

$descripcion_editar = trim(preg_replace('/\n{3,}/', "\n\n", $descripcion_editar));

/* =========================================
   CARPETA DE UPLOADS POR ROL / USUARIO / FECHA
========================================= */
if (!function_exists('crearCarpetaUploadUsuario')) {
    function limpiarSegmentoRuta($valor) {
        $valor = trim((string)$valor);
        $valor = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $valor);
        $valor = preg_replace('/[^A-Za-z0-9_\-]/', '_', $valor);
        $valor = preg_replace('/_+/', '_', $valor);
        $valor = trim($valor, '_');
        return $valor !== '' ? $valor : 'usuario';
    }

    function crearCarpetaUploadUsuario($conn, $usuario_id, $base_dir) {
        $usuario_id = intval($usuario_id);
        $usuario_login = 'usuario_' . $usuario_id;
        $rol_carpeta = 'Usuario';

        $q = $conn->query("SELECT usuarios.usuario, usuarios.rol_id, roles.nombre AS rol_nombre
                           FROM usuarios
                           LEFT JOIN roles ON roles.id = usuarios.rol_id
                           WHERE usuarios.id='$usuario_id'
                           LIMIT 1");

        if ($q && $q->num_rows > 0) {
            $u = $q->fetch_assoc();

            if (!empty($u['usuario'])) {
                $usuario_login = $u['usuario'];
            }

            $rol_id = intval($u['rol_id']);

            if ($rol_id === 1) {
                $rol_carpeta = 'SuperAdministrador';
            } elseif ($rol_id === 2) {
                $rol_carpeta = 'Administrador';
            } elseif ($rol_id === 3) {
                $rol_carpeta = 'Editor';
            } elseif (!empty($u['rol_nombre'])) {
                $rol_carpeta = $u['rol_nombre'];
            }
        }

        $rol_carpeta = limpiarSegmentoRuta($rol_carpeta);
        $usuario_login = limpiarSegmentoRuta($usuario_login);

        $anio = date('Y');
        $mes = date('m');
        $dia = date('d');

        $relativa = $rol_carpeta . "/" . $usuario_login . "/" . $anio . "/" . $mes . "/" . $dia . "/";
        $absoluta = rtrim($base_dir, "/") . "/uploads/" . $relativa;

        if (!is_dir($absoluta)) {
            mkdir($absoluta, 0755, true);
        }

        return array("dir" => $absoluta, "rel" => $relativa);
    }
}


/* =========================================
   AJAX: REGISTRAR ETIQUETA DESDE NOTICIAS
========================================= */
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['ajax_guardar_etiqueta'])) {

    header('Content-Type: application/json; charset=utf-8');

    // El perfil Editor puede asignar etiquetas existentes, pero no crear etiquetas nuevas.
    if (intval($_SESSION['rol_id'] ?? 0) === 3) {
        http_response_code(403);
        echo json_encode(array(
            'ok' => false,
            'mensaje' => 'El perfil Editor no tiene permiso para crear etiquetas.'
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    $nombre_etiqueta = trim($_POST['nombre_etiqueta'] ?? '');

    if ($nombre_etiqueta === '') {
        echo json_encode(array(
            'ok' => false,
            'mensaje' => 'Escribe el nombre de la etiqueta.'
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    $nombre_sql = $conn->real_escape_string($nombre_etiqueta);

    $verificar_etiqueta = $conn->query("SELECT id, nombre, estado
                                         FROM etiquetas
                                         WHERE TRIM(nombre)=TRIM('$nombre_sql')
                                         LIMIT 1");

    if ($verificar_etiqueta && $verificar_etiqueta->num_rows > 0) {
        $etiqueta_existente = $verificar_etiqueta->fetch_assoc();
        $etiqueta_id = intval($etiqueta_existente['id']);
        $nombre_guardado = $etiqueta_existente['nombre'];

        if ($etiqueta_existente['estado'] !== 'activo') {
            $conn->query("UPDATE etiquetas SET estado='activo' WHERE id='$etiqueta_id' LIMIT 1");
        }

        echo json_encode(array(
            'ok' => true,
            'id' => $etiqueta_id,
            'nombre' => $nombre_guardado,
            'existia' => true,
            'mensaje' => 'La etiqueta ya existía y quedó disponible.'
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    if ($conn->query("INSERT INTO etiquetas (nombre, estado) VALUES ('$nombre_sql', 'activo')")) {
        echo json_encode(array(
            'ok' => true,
            'id' => intval($conn->insert_id),
            'nombre' => $nombre_etiqueta,
            'existia' => false,
            'mensaje' => 'Etiqueta registrada correctamente.'
        ), JSON_UNESCAPED_UNICODE);
    } else {
        echo json_encode(array(
            'ok' => false,
            'mensaje' => 'No se pudo registrar la etiqueta.'
        ), JSON_UNESCAPED_UNICODE);
    }

    exit();
}



/* =========================================
   ACCIONES DE NOTICIAS
========================================= */
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['noticias_accion'])) {

    $accion_noticias = trim((string)($_POST['noticias_accion'] ?? ''));
    $ids_noticias_raw = trim((string)($_POST['noticias_ids'] ?? ''));

    $ids_noticias = array_values(array_unique(array_filter(
        array_map('intval', explode(',', $ids_noticias_raw)),
        function($id){ return $id > 0; }
    )));

    if (!empty($ids_noticias)) {
        $lista_ids_noticias = implode(',', $ids_noticias);

        if ($accion_noticias === 'archivar') {
            $conn->query("UPDATE notas
                          SET estado='archivado'
                          WHERE caracter='NOTA'
                            AND id IN ($lista_ids_noticias)");
        } elseif ($accion_noticias === 'desarchivar') {
            $conn->query("UPDATE notas
                          SET estado='aprobada'
                          WHERE caracter='NOTA'
                            AND id IN ($lista_ids_noticias)");
        } elseif ($accion_noticias === 'eliminar') {
            $conn->query("DELETE FROM notas
                          WHERE caracter='NOTA'
                            AND (tipo_medio IS NULL OR tipo_medio<>'Archivo')
                            AND id IN ($lista_ids_noticias)");
        }
    }

    $volver_archivadas = ($accion_noticias === 'desarchivar' || isset($_POST['desde_archivadas']))
        ? '&archivadas=1'
        : '';

    echo "<script>
            window.location.href='dashboard_superadmin.php?modulo=noticias".$volver_archivadas."';
          </script>";
    exit();
}

/* =========================================
   ACTUALIZAR NOTICIA EXISTENTE
========================================= */
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['actualizar_noticia'])) {

    $fecha_nota = limpiarDato($_POST['fecha_nota'] ?? '');
    $hora_nota = limpiarDato($_POST['hora_nota'] ?? '');
    $tipo_medio = limpiarDato($_POST['tipo_medio'] ?? ($noticia['tipo_medio'] ?? ''));
    $duracion_valor = trim((string)($_POST['duracion'] ?? ''));
    $duracion_error = false;

    /* Radio y Televisión: la duración debe usar HH:MM:SS y ser mayor que cero. */
    if (in_array($tipo_medio, array('Radio', 'Televisión', 'Television'), true)) {
        if (
            !preg_match('/^(\d{1,3}):([0-5]\d):([0-5]\d)$/', $duracion_valor, $duracion_partes) ||
            ((intval($duracion_partes[1] ?? 0) * 3600) + (intval($duracion_partes[2] ?? 0) * 60) + intval($duracion_partes[3] ?? 0)) <= 0
        ) {
            $duracion_error = true;
        }
    }

    /* El calendario de Radio/TV trabaja solo con YYYY-MM-DD. */
    if (strpos($fecha_nota, 'T') !== false) {
        $fecha_nota = substr($fecha_nota, 0, 10);
    } elseif (strlen($fecha_nota) > 10) {
        $fecha_nota = substr($fecha_nota, 0, 10);
    }

    /* Solo Radio/TV agrega la hora al valor que se intenta guardar en fecha_nota. */
    if (in_array($tipo_medio, array('Radio', 'Televisión', 'Television'), true) && $hora_nota !== '') {
        $fecha_nota .= ' ' . $hora_nota;
    }
    $subtipo_medio = limpiarDato($_POST['subtipo_medio'] ?? '');

    /* En edición, algunos formularios muestran el medio en el campo visible,
       pero el input oculto puede llegar vacío. En ese caso conservar el medio
       que ya tenía la noticia para no obligar a seleccionarlo nuevamente. */
    if ($subtipo_medio === '') {
        $subtipo_medio = limpiarDato($noticia['subtipo_medio'] ?? '');
    }

    $tipo_nota = limpiarDato($_POST['tipo_nota'] ?? ($noticia['tipo_nota'] ?? 'Neutral'));
    /* El campo Cliente fue retirado de Noticias. */
    $cliente_id = 0;
    $titulo = html_entity_decode(limpiarDato($_POST['titulo'] ?? ''), ENT_QUOTES | ENT_HTML5, 'UTF-8');
    $descripcion_base = html_entity_decode(limpiarDato($_POST['descripcion'] ?? ''), ENT_QUOTES | ENT_HTML5, 'UTF-8');
    $etiquetas_clientes = limpiarDato($_POST['etiquetas'] ?? '');

    /*
       Protección específica para Radio y Televisión:
       si una noticia antigua sí tenía etiquetas, pero el selector no llegó a
       enviarlas porque el formato legado no pudo precargarse en el navegador,
       se conservan en vez de borrarlas al actualizar. El campo
       etiquetas_modificadas permite eliminarlas voluntariamente cuando el
       usuario realmente cambió el selector.
    */
    $etiquetas_modificadas = isset($_POST['etiquetas_modificadas'])
        ? intval($_POST['etiquetas_modificadas'])
        : 0;

    if (
        $etiquetas_clientes === '' &&
        $etiquetas_modificadas !== 1 &&
        $etiquetas_editar !== ''
    ) {
        $etiquetas_clientes = $etiquetas_editar;
    }

    $archivo_adjunto_ids = trim((string)($_POST['archivo_adjunto_ids'] ?? ''));
    $ids_adjuntos = array_values(array_unique(array_filter(
        array_map('intval', explode(',', $archivo_adjunto_ids)),
        function($id){ return $id > 0; }
    )));
    $archivo_adjunto_ids = implode(',', $ids_adjuntos);

    /* Calcular valorización según el tipo de medio, sin mezclar las fórmulas. */
    $valorizacion_prensa = calcularValorizacionPrensa(
        $conn,
        $tipo_medio,
        $subtipo_medio,
        $_POST
    );

    $valorizacion_radio_tv = calcularValorizacionRadioTv(
        $conn,
        $tipo_medio,
        $subtipo_medio,
        $_POST['duracion'] ?? ''
    );

    $medio_id_valorizado = 0;
    $tarifa_valorizada = null;
    if ($valorizacion_prensa['aplica']) {
        $medio_id_valorizado = intval($valorizacion_prensa['medio_id']);
        $tarifa_valorizada = (float)$valorizacion_prensa['valor_noticia'];
    } elseif ($valorizacion_radio_tv['aplica']) {
        $medio_id_valorizado = intval($valorizacion_radio_tv['medio_id']);
        $tarifa_valorizada = (float)$valorizacion_radio_tv['valor_noticia'];
    }

    /* Campos adicionales del formulario. */
    $datos_edicion = array(
        'archivo_adjunto_ids' => $archivo_adjunto_ids,
        'departamento' => limpiarDato($_POST['departamento'] ?? ''),
        'localidad'    => limpiarDato($_POST['localidad'] ?? ''),
        'enlace'       => limpiarDato($_POST['enlace'] ?? ''),
        'seccion'      => limpiarDato($_POST['seccion'] ?? ''),
        'pagina'       => limpiarDato($_POST['pagina'] ?? ''),
        'columnas'     => limpiarDato($_POST['columnas'] ?? ''),
        'modulos'      => limpiarDato($_POST['modulos'] ?? ''),
        'duracion'     => limpiarDato($_POST['duracion'] ?? ''),
        'programa'     => limpiarDato($_POST['programa'] ?? ''),
        'hora_nota'    => $hora_nota,
        'paginas_detalle' => $valorizacion_prensa['paginas_detalle'],
        'area_cm2' => $valorizacion_prensa['area_cm2'],
        'costo_cm2' => $valorizacion_prensa['costo_cm2'],
        'duracion_segundos' => $valorizacion_radio_tv['duracion_segundos'],
        'costo_segundo' => $valorizacion_radio_tv['costo_segundo'],
        'valor_noticia' => $tarifa_valorizada !== null ? round($tarifa_valorizada, 2) : 0.0
    );

    /*
       Guardar los campos que no tienen columna propia dentro de la descripción.
       Esto permite que vuelvan a cargarse en futuras ediciones sin crear otra noticia.
    */
    $descripcion_guardar = $descripcion_base;

    if ($etiquetas_clientes !== '') {
        $descripcion_guardar .= "

Etiquetas: " . $etiquetas_clientes;
    }

    $json_datos = json_encode($datos_edicion, JSON_UNESCAPED_UNICODE);
    if ($json_datos !== false) {
        $descripcion_guardar .= "

__DATOS_NOTICIA__:" . base64_encode($json_datos);
    }

    /* Mantener el archivo existente, salvo que el usuario elija otro. */
    $archivo_noticia = trim((string)($noticia['archivo'] ?? ''));

    if (isset($_POST['eliminar_archivo_actual']) && $_POST['eliminar_archivo_actual'] === '1') {
        $archivo_noticia = '';
    }
    if ($archivo_adjunto_ids !== '') {
        if (!empty($ids_adjuntos)) {
            $primer_adjunto_id = intval(reset($ids_adjuntos));

            $q_adjunto = $conn->query("
                SELECT archivo
                FROM archivos
                WHERE id='$primer_adjunto_id'
                  AND archivo<>''
                  AND estado='activo'
                LIMIT 1
            ");

            if ($q_adjunto && $q_adjunto->num_rows > 0) {
                $adjunto = $q_adjunto->fetch_assoc();
                $archivo_noticia = trim((string)$adjunto['archivo']);
            }
        }
    }

    /*
       Solo se validan los datos que realmente pertenecen al registro principal.
       Los campos adicionales se guardan cuando existan, pero no bloquean la actualización.
    */
    if ($duracion_error) {
        $mensaje = '';

        /* Conservar lo escrito y mostrar el error junto al campo Duración. */
        $noticia['fecha_nota'] = $fecha_nota;
        $noticia['tipo_medio'] = $tipo_medio;
        $noticia['subtipo_medio'] = $subtipo_medio;
        $noticia['tipo_nota'] = $tipo_nota;
        $noticia['cliente_id'] = $cliente_id;
        $noticia['titulo'] = $titulo;
        $descripcion_editar = $descripcion_base;
        $etiquetas_editar = $etiquetas_clientes;

    } elseif (
        $fecha_nota === '' ||
        $tipo_medio === '' ||
        $subtipo_medio === '' ||
        $titulo === '' ||
        $descripcion_base === ''
    ) {
        $mensaje = 'Completa el título, resumen, fecha y medio para actualizar la noticia.';

        /* Conservar lo escrito después de una validación. */
        $noticia['fecha_nota'] = $fecha_nota;
        $noticia['tipo_medio'] = $tipo_medio;
        $noticia['subtipo_medio'] = $subtipo_medio;
        $noticia['tipo_nota'] = $tipo_nota;
        $noticia['cliente_id'] = $cliente_id;
        $noticia['titulo'] = $titulo;
        $descripcion_editar = $descripcion_base;
        $etiquetas_editar = $etiquetas_clientes;

    } else {

        $sql_update = "
            UPDATE notas
            SET
                fecha_nota='" . $conn->real_escape_string($fecha_nota) . "',
                tipo_medio='" . $conn->real_escape_string($tipo_medio) . "',
                subtipo_medio='" . $conn->real_escape_string($subtipo_medio) . "',
                medio_id=" . ($medio_id_valorizado > 0 ? "'" . intval($medio_id_valorizado) . "'" : "NULL") . ",
                tarifa=" . ($tarifa_valorizada !== null ? "'" . number_format((float)$tarifa_valorizada, 2, '.', '') . "'" : "NULL") . ",
                tipo_nota='" . $conn->real_escape_string($tipo_nota) . "',
                cliente_id=NULL,
                titulo='" . $conn->real_escape_string($titulo) . "',
                descripcion='" . $conn->real_escape_string($descripcion_guardar) . "',
                archivo='" . $conn->real_escape_string($archivo_noticia) . "'
            WHERE id='$id_editar'
            LIMIT 1
        ";

        if ($conn->query($sql_update) === TRUE) {

            $conn->query("
                INSERT INTO bitacora (usuario_id, accion, nota_id)
                VALUES ('$usuario_id', 'Actualizó noticia', '$id_editar')
            ");

            echo "<script>
                    window.location.replace('dashboard_superadmin.php?modulo=noticias');
                  </script>
                  <noscript>
                    <meta http-equiv='refresh' content='0;url=dashboard_superadmin.php?modulo=noticias'>
                  </noscript>";
            exit();

        } else {
            $mensaje = 'No se pudo actualizar la noticia: ' . $conn->error;
        }
    }
}

/* =========================================
   REGISTRAR NOTICIA
========================================= */
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['guardar_noticia'])) {

    $fecha_nota = isset($_POST['fecha_nota']) ? limpiarDato($_POST['fecha_nota']) : "";
    if (strpos($fecha_nota, "T") !== false) {
        $fecha_nota = substr($fecha_nota, 0, 10);
    }
    $tipo_medio = isset($_POST['tipo_medio']) ? limpiarDato($_POST['tipo_medio']) : "";
    $subtipo_medio = isset($_POST['subtipo_medio']) ? limpiarDato($_POST['subtipo_medio']) : "";
    $tipo_nota = isset($_POST['tipo_nota']) ? limpiarDato($_POST['tipo_nota']) : "neutral";
    $titulo = isset($_POST['titulo']) ? html_entity_decode(limpiarDato($_POST['titulo']), ENT_QUOTES | ENT_HTML5, 'UTF-8') : "";
    $descripcion = isset($_POST['descripcion']) ? html_entity_decode(limpiarDato($_POST['descripcion']), ENT_QUOTES | ENT_HTML5, 'UTF-8') : "";
    $etiquetas_clientes = isset($_POST['etiquetas']) ? limpiarDato($_POST['etiquetas']) : "";
    if ($etiquetas_clientes !== "") {
        $descripcion .= "\n\nEtiquetas: " . $etiquetas_clientes;
    }

    /* Usar el primer archivo adjunto seleccionado como miniatura de la noticia. */
    $archivo_noticia = "";
    $archivo_adjunto_ids = isset($_POST['archivo_adjunto_ids'])
        ? trim((string)$_POST['archivo_adjunto_ids'])
        : "";

    if ($archivo_adjunto_ids !== "") {
        $ids_adjuntos = array_filter(array_map('intval', explode(',', $archivo_adjunto_ids)));

        if (!empty($ids_adjuntos)) {
            $primer_adjunto_id = intval(reset($ids_adjuntos));

            $q_adjunto = $conn->query(
                "SELECT archivo
                 FROM archivos
                 WHERE id='$primer_adjunto_id'
                   AND archivo<>''
                   AND estado='activo'
                 LIMIT 1"
            );

            if ($q_adjunto && $q_adjunto->num_rows > 0) {
                $adjunto_encontrado = $q_adjunto->fetch_assoc();
                $archivo_noticia = trim((string)$adjunto_encontrado['archivo']);
            }
        }
    }

    $caracter = "NOTA";

    if ($fecha_nota === "" || $tipo_medio === "" || $subtipo_medio === "" || $titulo === "" || $descripcion === "") {
        $mensaje = "Completa todos los campos obligatorios para registrar la noticia.";
    } else {

        $sql_noticia = "INSERT INTO notas (
                            usuario_id,
                            fecha_nota,
                            tipo_medio,
                            subtipo_medio,
                            tipo_nota,
                            caracter,
                            titulo,
                            descripcion,
                            archivo,
                            estado,
                            correcciones
                        ) VALUES (
                            '$usuario_id',
                            '$fecha_nota',
                            '$tipo_medio',
                            '$subtipo_medio',
                            '$tipo_nota',
                            '$caracter',
                            '$titulo',
                            '$descripcion',
                            '".$conn->real_escape_string($archivo_noticia)."',
                            'aprobada',
                            0
                        )";

        if ($conn->query($sql_noticia) === TRUE) {
            $nota_id = $conn->insert_id;
            $link_publico = "https://app.emisorascruz.pe/nota.php?id=" . $nota_id;

            $conn->query("UPDATE notas SET link_publico='$link_publico' WHERE id='$nota_id'");
            $conn->query("INSERT INTO bitacora (usuario_id, accion, nota_id)
                          VALUES ('$usuario_id', 'Registró noticia desde sección noticias', '$nota_id')");

            echo "<script>
                    window.location.href='dashboard_superadmin.php?modulo=noticias';
                  </script>";
            exit();
        } else {
            $mensaje = "No se pudo registrar la noticia.";
        }
    }
}


/* =========================================
   AJAX CARGAR ARCHIVOS ADJUNTOS - GESTOR ÚNICO
========================================= */
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['ajax_upload_adjunto'])) {
    while (ob_get_level() > 0) { ob_end_clean(); }
    header('Content-Type: application/json; charset=utf-8');
    $respuesta = isset($_FILES['archivo'])
        ? ec_gestor_subir($conn, $_FILES['archivo'], intval($usuario_id), dirname(__DIR__), 'Archivo cargado desde el formulario de noticias.')
        : array('ok'=>false,'mensaje'=>'No se recibió archivo.');
    echo json_encode($respuesta, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    exit();
}



/* =========================================
   SOPORTE
========================================= */
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['enviar_soporte'])) {

    $mensaje_editor = trim($_POST['mensaje_soporte'] ?? '');

    if ($mensaje_editor === "") {
        $mensaje_soporte = "Debes escribir un mensaje.";
    } else {
        $mensaje_editor = limpiarDato($mensaje_editor);
        $numero_soporte = "51997525318";

        $texto_whatsapp = urlencode(
            "🛠️ REPORTE DE PLATAFORMA\n\n" .
            "Editor ID: " . $usuario_id . "\n" .
            "Editor: " . $_SESSION['nombre'] . "\n" .
            "Mensaje: " . $mensaje_editor
        );

        echo "<script>
                window.open('https://wa.me/".$numero_soporte."?text=".$texto_whatsapp."', '_blank');
                window.location.href='dashboard_superadmin.php?modulo=noticias';
              </script>";
        exit();
    }
}

/* =========================================
   MEDIOS ACTIVOS
========================================= */
$medios_array = [];
$sql_medios = "SELECT id, region, provincia, ciudad, tipo_medio, nombre_medio, valor
               FROM medios
               WHERE estado='activo'
               ORDER BY region ASC, provincia ASC, ciudad ASC, nombre_medio ASC";

$resultado_medios = $conn->query($sql_medios);

if ($resultado_medios && $resultado_medios->num_rows > 0) {
    while ($medio = $resultado_medios->fetch_assoc()) {
        $medios_array[] = $medio;
    }
}

/* =========================================
   CLIENTES ACTIVOS PARA LOS FORMULARIOS
========================================= */
$clientes_noticias = [];
$resultado_clientes_noticias = $conn->query("SELECT id, razon_social FROM clientes WHERE estado='activo' ORDER BY razon_social ASC");

if ($resultado_clientes_noticias && $resultado_clientes_noticias->num_rows > 0) {
    while ($cliente_noticia = $resultado_clientes_noticias->fetch_assoc()) {
        $clientes_noticias[] = $cliente_noticia;
    }
}

/*
   Compatibilidad con noticias antiguas:
   si Departamento o Localidad no fueron guardados, intentar obtenerlos
   desde el medio registrado.
*/
if (($datos_edicion['departamento'] ?? '') === '' || ($datos_edicion['localidad'] ?? '') === '') {
    $nombre_medio_actual = trim((string)($noticia['subtipo_medio'] ?? ''));

    foreach ($medios_array as $medio_actual) {
        $nombre_catalogo = trim((string)($medio_actual['nombre_medio'] ?? ''));

        if (
            $nombre_catalogo !== '' &&
            (
                strcasecmp($nombre_catalogo, $nombre_medio_actual) === 0 ||
                stripos($nombre_medio_actual, $nombre_catalogo) !== false
            )
        ) {
            if (($datos_edicion['departamento'] ?? '') === '') {
                $datos_edicion['departamento'] = (string)($medio_actual['region'] ?? '');
            }

            if (($datos_edicion['localidad'] ?? '') === '') {
                $datos_edicion['localidad'] = (string)($medio_actual['ciudad'] ?? '');
            }

            break;
        }
    }
}

/* Para páginas web antiguas, usar el dominio como enlace cuando no exista otro. */
if (($datos_edicion['enlace'] ?? '') === '' && ($noticia['tipo_medio'] ?? '') === 'Página Web') {
    $dominio_actual = trim((string)($noticia['subtipo_medio'] ?? ''));

    if ($dominio_actual !== '') {
        if (!preg_match('#^https?://#i', $dominio_actual)) {
            $datos_edicion['enlace'] = 'https://' . $dominio_actual;
        } else {
            $datos_edicion['enlace'] = $dominio_actual;
        }
    }
}

/* =========================================
   FILTROS Y LISTADO DE NOTICIAS
========================================= */
$filtros_tipo = array();

if (isset($_GET['tipos']) && is_array($_GET['tipos'])) {
    foreach ($_GET['tipos'] as $tipo_recibido) {
        $tipo_limpio = limpiarDato($tipo_recibido);
        if ($tipo_limpio !== '') {
            $filtros_tipo[] = $tipo_limpio;
        }
    }
}

/* Compatibilidad con el filtro antiguo de un solo tipo. */
if (empty($filtros_tipo) && isset($_GET['tipo']) && $_GET['tipo'] !== '') {
    $filtros_tipo[] = limpiarDato($_GET['tipo']);
}

$filtros_tipo = array_values(array_unique($filtros_tipo));
$filtro_tipo = count($filtros_tipo) === 1 ? $filtros_tipo[0] : "";

$ver_archivadas = isset($_GET['archivadas']) && intval($_GET['archivadas']) === 1;
$filtro_fecha_inicio = isset($_GET['fecha_inicio']) ? limpiarDato($_GET['fecha_inicio']) : "";
$filtro_fecha_fin = isset($_GET['fecha_fin']) ? limpiarDato($_GET['fecha_fin']) : "";

// Compatibilidad por si llega un filtro antiguo de una sola fecha
if ($filtro_fecha_inicio === "" && isset($_GET['fecha'])) {
    $filtro_fecha_inicio = limpiarDato($_GET['fecha']);
    $filtro_fecha_fin = $filtro_fecha_inicio;
}

$where = "WHERE caracter='NOTA'";

$where .= " AND (tipo_medio IS NULL OR tipo_medio<>'Archivo')";

if ($ver_archivadas) {
    $where .= " AND estado='archivado'";
} else {
    $where .= " AND (estado IS NULL OR estado<>'archivado')";
}

if (!empty($filtros_tipo)) {
    $tipos_sql = array();

    foreach ($filtros_tipo as $tipo_filtrado) {
        $tipos_sql[] = "'" . $conn->real_escape_string($tipo_filtrado) . "'";
    }

    $where .= " AND tipo_medio IN (" . implode(",", $tipos_sql) . ")";
}

if ($filtro_fecha_inicio !== "" && $filtro_fecha_fin !== "") {
    $where .= " AND fecha_nota BETWEEN '$filtro_fecha_inicio' AND '$filtro_fecha_fin'";
} elseif ($filtro_fecha_inicio !== "") {
    $where .= " AND fecha_nota='$filtro_fecha_inicio'";
}

$sql_noticias = "SELECT * FROM notas $where ORDER BY id DESC";
$resultado_noticias = $conn->query($sql_noticias);

$noticias = [];
if ($resultado_noticias && $resultado_noticias->num_rows > 0) {
    while ($n = $resultado_noticias->fetch_assoc()) {
        $noticias[] = $n;
    }
}


/* =========================================
   ARCHIVOS DEL REPOSITORIO PARA ADJUNTOS
========================================= */
$archivos_repo = [];

$sql_repo = "SELECT
                id,
                titulo,
                descripcion,
                archivo,
                fecha_archivo AS fecha_nota
             FROM archivos
             WHERE estado='activo'
               AND archivo<>''
             ORDER BY id DESC
             LIMIT 40";

$resultado_repo = $conn->query($sql_repo);

if ($resultado_repo && $resultado_repo->num_rows > 0) {
    while ($a = $resultado_repo->fetch_assoc()) {

        $ext_repo = strtolower(pathinfo($a['archivo'], PATHINFO_EXTENSION));
        $categoria_repo = "documento";
        $icono_repo = "📄";

        if (in_array($ext_repo, array('mp3','wav','aac','ogg','m4a'))) {
            $categoria_repo = "audio";
            $icono_repo = "🎧";
        } elseif (in_array($ext_repo, array('mp4','webm','mov','avi','mkv'))) {
            $categoria_repo = "video";
            $icono_repo = "🎬";
        } elseif (in_array($ext_repo, array('jpg','jpeg','png','gif','webp'))) {
            $categoria_repo = "imagen";
            $icono_repo = "🖼";
        } elseif ($ext_repo == "pdf") {
            $categoria_repo = "pdf";
            $icono_repo = "📕";
        }

        $a['extension_repo'] = strtoupper($ext_repo);
        $a['categoria_repo'] = $categoria_repo;
        $a['icono_repo'] = $icono_repo;

        /* Conservar la ruta completa guardada en la base de datos.
           No usar basename(), porque elimina las subcarpetas por rol, usuario y fecha. */
        $archivo_repo_relativo = ltrim(str_replace('\\', '/', (string)$a['archivo']), '/');
        if (strpos($archivo_repo_relativo, 'uploads/') === 0) {
            $a['url_repo'] = $archivo_repo_relativo;
        } else {
            $a['url_repo'] = 'uploads/' . $archivo_repo_relativo;
        }

        $archivos_repo[] = $a;
    }
}

function contarNoticias($conn, $usuario_id, $tipo = "") {
    $where = "WHERE caracter='NOTA'";
    if ($tipo !== "") {
        $tipo = $conn->real_escape_string($tipo);
        $where .= " AND tipo_medio='$tipo'";
    }
    $r = $conn->query("SELECT COUNT(*) AS total FROM notas $where");
    if ($r && $row = $r->fetch_assoc()) {
        return intval($row['total']);
    }
    return 0;
}

$total_todas = contarNoticias($conn, $usuario_id);
$total_diario = contarNoticias($conn, $usuario_id, "Diario");
$total_radio = contarNoticias($conn, $usuario_id, "Radio");
$total_redes = contarNoticias($conn, $usuario_id, "Redes Sociales");
$total_tv = contarNoticias($conn, $usuario_id, "Televisión");
$total_web = contarNoticias($conn, $usuario_id, "Página Web");
?>







<style>
*{margin:0;padding:0;box-sizing:border-box;font-family:Arial,sans-serif;}
body{background:#fff;color:#1e2942;overflow-x:hidden;}
.app{display:flex;min-height:100vh;}
.sidebar{width:86px;background:#1e2942;color:white;position:fixed;top:0;left:0;bottom:0;display:flex;flex-direction:column;align-items:center;padding:18px 10px;z-index:50;}
.logo{width:56px;height:56px;border-radius:14px;background:white;display:flex;align-items:center;justify-content:center;margin-bottom:30px;overflow:hidden;}
.logo-text{color:#1e2942;font-size:14px;font-weight:bold;text-align:center;line-height:1.05;}
.nav-icon{width:58px;height:58px;border-radius:14px;display:flex;flex-direction:column;justify-content:center;align-items:center;color:white;text-decoration:none;margin-bottom:14px;font-size:11px;cursor:pointer;}
.nav-icon span{font-size:22px;margin-bottom:3px;}
.nav-icon.active,.nav-icon:hover{background:#f05a28;}
.sidebar-bottom{margin-top:auto;}

.news-page{margin-left:0;width:100%;display:grid;grid-template-columns:265px 1fr;min-height:100vh;}
.news-page.form-prensa,
.news-page.form-radio-tv,
.news-page.form-redes-web{grid-template-columns:1fr;}
.news-page.form-prensa .news-filters,
.news-page.form-radio-tv .news-filters,
.news-page.form-redes-web .news-filters{display:none;}
.news-page.form-prensa .news-main,
.news-page.form-radio-tv .news-main,
.news-page.form-redes-web .news-main{padding:28px 32px;background:#fff;}
.news-page.form-prensa .news-top,
.news-page.form-radio-tv .news-top,
.news-page.form-redes-web .news-top{justify-content:flex-end;}
.news-page.form-prensa .news-divider,
.news-page.form-radio-tv .news-divider,
.news-page.form-redes-web .news-divider{margin-bottom:25px;}
.news-filters{border-right:1px solid #e3e5ef;padding:30px 24px;background:white;}
.news-filters small{display:block;color:#8a90a3;font-size:11px;text-transform:uppercase;margin-bottom:2px;}
.news-filters h1{font-size:28px;color:#1e2942;margin-bottom:24px;}
.type-list{margin-bottom:10px;}
.type-list-all{
    display:block;
    text-decoration:none;
    color:#ef5124;
    background:#fff0ea;
    padding:12px 14px;
    border-radius:22px;
    margin-bottom:10px;
    font-weight:bold;
    font-size:15px;
}
.type-check-row{
    display:flex;
    align-items:center;
    gap:10px;
    padding:9px 12px;
    margin-bottom:3px;
    border-radius:8px;
    color:#1e2942;
    font-weight:bold;
    font-size:14px;
    cursor:pointer;
    user-select:none;
}
.type-check-row:hover{background:#fff0ea;}
.type-check-row input{
    width:17px;
    height:17px;
    margin:0;
    accent-color:#ef5124;
    cursor:pointer;
}
.type-check-row.active{background:#fff0ea;color:#ef5124;}
.filter-block{margin-top:28px;}
.filter-block label{display:block;font-size:13px;margin-bottom:7px;font-weight:bold;}
.filter-block select,.filter-block input{width:100%;border:1px solid #d9dce8;border-radius:8px;padding:13px;color:#1e2942;font-size:14px;margin-bottom:14px;background:white;}
.btn-filter{
    width:100%;
    border:1px solid #ef5124;
    background:#ffffff;
    color:#ef5124;
    padding:13px;
    border-radius:8px;
    font-weight:bold;
    cursor:pointer;
    text-transform:uppercase;
    font-size:12px;
    margin-top:10px;
}
.btn-clear{display:block;width:100%;text-align:center;margin-top:10px;text-decoration:none;color:#ef5124;font-weight:bold;font-size:12px;background:white;border:1px solid #ef5124;border-radius:8px;padding:13px;cursor:pointer;}


/* =========================
   CALENDARIO RANGO DE FECHAS - NOTICIAS
========================= */
.custom-date-box{position:relative;}
.date-display{border:1px solid #d9dce8;border-radius:8px;padding:14px 12px;background:white;cursor:pointer;display:flex;align-items:center;gap:9px;color:#6f7480;font-size:14px;margin-bottom:14px;min-height:50px;}
.date-display.active{border:2px solid #b6b8c4;box-shadow:0 0 0 2px #d4d5dd;}
.date-display .calendar-icon{font-size:17px;}
.date-display em{font-style:italic;}
.calendar-popup{display:none;position:absolute;top:62px;left:0;width:230px;background:white;border-radius:5px;box-shadow:0 4px 15px rgba(0,0,0,0.14);border:1px solid #eee;padding:10px;z-index:120;}
.calendar-popup.show{display:block;}
.calendar-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;}
.calendar-head button{border:none;background:white;font-size:20px;color:#777;cursor:pointer;width:24px;height:24px;}
.calendar-title{font-size:16px;color:#333;display:flex;align-items:center;gap:8px;}
.calendar-title select{border:none;background:white;font-size:15px;color:#333;cursor:pointer;padding:0;margin:0;width:auto;}
.week-days{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;font-size:10px;color:#999;margin-bottom:6px;}
.days-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;}
.day-cell{height:29px;display:flex;justify-content:center;align-items:center;font-size:11px;color:#555;cursor:pointer;position:relative;user-select:none;border-radius:0;}
.day-cell.empty-day{cursor:default;}
.day-cell:hover{background:#eaf3ff;}
.day-cell.selected-start,.day-cell.selected-end{background:#5aa2f2;color:white;border-radius:50%;z-index:2;}
.day-cell.in-range{background:#d5d5d5;color:#555;border-radius:0;}
.day-cell.preview-range{background:#e3eefc;color:#555;border-radius:0;}
.day-cell.same-day{background:#5aa2f2;color:white;border-radius:50%;}

.news-main{padding:28px 32px;background:#fff;}
.news-top{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:25px;}
.news-top-left,.news-top-right{display:flex;align-items:center;gap:10px;}
.news-actions-wrap{position:relative;}
.btn-news-secondary{
    background:#fff;
    border:1px solid #ef5124;
    color:#ef5124;
    padding:14px 18px;
    border-radius:7px;
    font-weight:bold;
    cursor:pointer;
    text-transform:uppercase;
}
.btn-news-secondary:hover{background:#fff0ea;}
.btn-news-select-all{
    display:none;
    background:#1e2942;
    border:1px solid #1e2942;
    color:#fff;
    padding:14px 18px;
    border-radius:7px;
    font-weight:bold;
    cursor:pointer;
    text-transform:uppercase;
}
.news-actions-menu{
    display:none;
    position:absolute;
    top:52px;
    left:0;
    min-width:190px;
    background:#fff;
    border:1px solid #e3e5ef;
    border-radius:8px;
    box-shadow:0 8px 22px rgba(0,0,0,.12);
    overflow:hidden;
    z-index:300;
}
.news-actions-menu.show{display:block;}
.news-actions-menu button{
    width:100%;
    border:0;
    background:#fff;
    color:#1e2942;
    text-align:left;
    padding:12px 15px;
    cursor:pointer;
    font-size:14px;
}
.news-actions-menu button:hover{background:#fff0ea;color:#ef5124;}
.news-actions-menu button.danger{color:#b42318;}
.bulk-check{width:22px;height:22px;accent-color:#ef5124;}
.btn-new{background:#ef5124;color:white;border:none;padding:15px 20px;border-radius:7px;font-weight:bold;cursor:pointer;text-transform:uppercase;}
.btn-new:hover{background:#d9431b;}
.new-dropdown-wrap{position:relative;}
.new-dropdown{display:none;position:absolute;right:0;top:54px;width:265px;background:white;border:1px solid #e3e5ef;box-shadow:0 8px 22px rgba(0,0,0,.08);z-index:80;padding:10px 0;}
.new-dropdown.show{display:block;}
.new-dropdown a{display:block;padding:13px 20px;text-decoration:none;color:#8a90a3;font-size:15px;}
.new-dropdown a:hover{background:#fff0ea;color:#ef5124;}

/* =========================
   FORMULARIO PRENSA
========================= */
.prensa-wrapper{padding:0 45px 35px;}
.prensa-form-layout{display:grid;grid-template-columns:1fr 430px;gap:95px;align-items:start;max-width:1500px;margin:0 auto;}
.prensa-left{padding-top:18px;}
.prensa-right{background:#f5f6fb;border-radius:14px;padding:34px 38px;margin-top:28px;}
.prensa-field{margin-bottom:24px;}
.prensa-field label{display:block;font-size:14px;color:#1e2942;font-weight:bold;margin-bottom:9px;}
.prensa-field label .req{color:#ef5124;}
.prensa-input,.prensa-select,.prensa-textarea{width:100%;border:1px solid #d9dce8;border-radius:5px;background:white;color:#1e2942;font-size:15px;padding:14px 16px;outline:none;}
.prensa-input:focus,.prensa-select:focus,.prensa-textarea:focus{border-color:#ef5124;}
.prensa-title-input{height:62px;border-color:#ff6b4a;font-size:20px;font-weight:bold;color:#ef5124;font-style:italic;}
.prensa-title-input::placeholder{color:#ff9078;}
.prensa-textarea{min-height:125px;resize:vertical;}
.prensa-note{font-size:13px;color:#8a90a3;font-style:italic;margin-top:-16px;margin-bottom:28px;}
.prensa-row{display:grid;grid-template-columns:1fr 1fr 1fr;gap:22px;}
.prensa-pages-box{background:#f5f6fb;border-radius:6px;padding:28px 24px;margin:6px -24px 28px;}
.prensa-add-page{text-align:right;margin-top:5px;}
.prensa-add-page a{color:#ef5124;font-size:12px;font-weight:bold;text-decoration:underline;}
.prensa-adjuntos-title{font-size:15px;color:#1e2942;font-weight:bold;margin-bottom:18px;}
.prensa-upload-circle{width:62px;height:62px;border-radius:50%;border:1px solid #ef5124;background:#fff0ea;color:#ef5124;font-size:34px;font-weight:bold;display:flex;align-items:center;justify-content:center;cursor:pointer;}
.prensa-upload-circle:hover{background:#ef5124;color:white;}
.prensa-side-line{height:1px;background:#dfe2ec;margin:28px 0;}
.prensa-new-tag{display:block;text-align:right;color:#8a90a3;font-size:12px;font-weight:bold;text-decoration:underline;margin-top:-8px;margin-bottom:28px;}
.prensa-submit{width:100%;background:#ef5124;color:white;border:none;padding:16px;border-radius:6px;font-weight:bold;cursor:pointer;text-transform:uppercase;font-size:14px;display:flex;justify-content:center;align-items:center;gap:10px;}
.prensa-submit:hover{background:#d9431b;}
.prensa-back{display:inline-block;margin-bottom:18px;color:#ef5124;text-decoration:none;font-weight:bold;font-size:13px;}
@media(max-width:1100px){.prensa-form-layout{grid-template-columns:1fr;gap:20px}.prensa-wrapper{padding:0 20px 25px}.prensa-row{grid-template-columns:1fr}.prensa-right{margin-top:0}}

/* =========================
   FORMULARIO RADIO O TV
========================= */
.radio-wrapper{padding:0 45px 35px;}
.radio-form-layout{display:grid;grid-template-columns:1fr 430px;gap:95px;align-items:start;max-width:1500px;margin:0 auto;}
.radio-left{padding-top:18px;}
.radio-right{background:#f5f6fb;border-radius:14px;padding:34px 38px;margin-top:28px;}
.radio-field{margin-bottom:24px;}
.radio-field label{display:block;font-size:14px;color:#1e2942;font-weight:bold;margin-bottom:9px;}
.radio-field label .req{color:#ef5124;}
.radio-input,.radio-select,.radio-textarea{width:100%;border:1px solid #d9dce8;border-radius:5px;background:white;color:#1e2942;font-size:15px;padding:14px 16px;outline:none;}
.radio-input:focus,.radio-select:focus,.radio-textarea:focus{border-color:#ef5124;}
.radio-title-input{height:62px;border-color:#ff6b4a;font-size:20px;font-weight:bold;color:#ef5124;font-style:italic;}
.radio-title-input::placeholder{color:#ff9078;}
.radio-textarea{min-height:125px;resize:vertical;}
.radio-note{font-size:13px;color:#8a90a3;font-style:italic;margin-top:-16px;margin-bottom:28px;}
.radio-type-options{display:flex;gap:24px;align-items:center;margin-bottom:28px;color:#8a90a3;font-size:15px;}
.radio-type-options label{display:flex;align-items:center;gap:8px;font-weight:normal;color:#8a90a3;margin:0;}
.radio-type-options input{accent-color:#ef5124;}
.radio-row{display:grid;grid-template-columns:1fr 1fr;gap:22px;}
/* Fecha y hora de Radio/TV en una sola cabecera */
.radio-fecha-hora-cabecera{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:16px;
    margin-bottom:9px;
}

.radio-fecha-hora-cabecera > label{
    margin:0;
}

.radio-hora-inline{
    display:flex;
    align-items:center;
    justify-content:flex-end;
    gap:8px;
    flex-shrink:0;
}

.radio-hora-inline label{
    display:block;
    margin:0;
    white-space:nowrap;
}

.radio-hora-input{
    width:94px;
    height:34px;
    box-sizing:border-box;
    border:1px solid #d9dce8;
    border-radius:5px;
    background:#ffffff;
    color:#1e2942;
    font-size:14px;
    padding:6px 9px;
    outline:none;
}

.radio-hora-input:focus{
    border-color:#ef5124;
}

.radio-fecha-hora-cabecera + .custom-date-box{
    width:100%;
}
.radio-adjuntos-title{font-size:15px;color:#1e2942;font-weight:bold;margin-bottom:18px;margin-top:8px;}
.radio-upload-circle{width:62px;height:62px;border-radius:50%;border:1px solid #ef5124;background:#fff0ea;color:#ef5124;font-size:34px;font-weight:bold;display:flex;align-items:center;justify-content:center;cursor:pointer;}
.radio-upload-circle:hover{background:#ef5124;color:white;}
.radio-side-line{height:1px;background:#dfe2ec;margin:28px 0;}
.radio-new-tag{display:block;text-align:right;color:#8a90a3;font-size:12px;font-weight:bold;text-decoration:underline;margin-top:-8px;margin-bottom:28px;}
.radio-submit{width:100%;background:#ef5124;color:white;border:none;padding:16px;border-radius:6px;font-weight:bold;cursor:pointer;text-transform:uppercase;font-size:14px;display:flex;justify-content:center;align-items:center;gap:10px;}
.radio-submit:hover{background:#d9431b;}
.radio-back{display:inline-block;margin-bottom:18px;color:#ef5124;text-decoration:none;font-weight:bold;font-size:13px;}
@media(max-width:1100px){.radio-form-layout{grid-template-columns:1fr;gap:20px}.radio-wrapper{padding:0 20px 25px}.radio-row{grid-template-columns:1fr}.radio-right{margin-top:0}}


/* =========================
   FORMULARIO REDES SOCIALES O PÁGINAS WEB
========================= */
.redes-wrapper{padding:0 45px 35px;}
.redes-form-layout{display:grid;grid-template-columns:1fr 430px;gap:95px;align-items:start;max-width:1500px;margin:0 auto;}
.redes-left{padding-top:18px;}
.redes-right{background:#f5f6fb;border-radius:14px;padding:34px 38px;margin-top:28px;}
.redes-field{margin-bottom:24px;}
.redes-field label{display:block;font-size:14px;color:#1e2942;font-weight:bold;margin-bottom:9px;}
.redes-field label .req{color:#ef5124;}
.redes-input,.redes-select,.redes-textarea{width:100%;border:1px solid #d9dce8;border-radius:5px;background:white;color:#1e2942;font-size:15px;padding:14px 16px;outline:none;}
.redes-input:focus,.redes-select:focus,.redes-textarea:focus{border-color:#ef5124;}
.redes-title-input{height:62px;border-color:#ff6b4a;font-size:20px;font-weight:bold;color:#ef5124;font-style:italic;}
.redes-title-input::placeholder{color:#ff9078;}
.redes-textarea{min-height:125px;resize:vertical;}
.redes-note{font-size:13px;color:#8a90a3;font-style:italic;margin-top:-16px;margin-bottom:28px;}
.redes-type-options{display:flex;gap:24px;align-items:center;margin-bottom:28px;color:#8a90a3;font-size:15px;}
.redes-type-options label{display:flex;align-items:center;gap:8px;font-weight:normal;color:#8a90a3;margin:0;}
.redes-type-options input{accent-color:#ef5124;}
.redes-row{display:grid;grid-template-columns:1fr 1fr;gap:22px;}
.redes-adjuntos-title{font-size:15px;color:#1e2942;font-weight:bold;margin-bottom:18px;margin-top:8px;}
.redes-upload-circle{width:62px;height:62px;border-radius:50%;border:1px solid #ef5124;background:#fff0ea;color:#ef5124;font-size:34px;font-weight:bold;display:flex;align-items:center;justify-content:center;cursor:pointer;}
.redes-upload-circle:hover{background:#ef5124;color:white;}
.redes-side-line{height:1px;background:#dfe2ec;margin:28px 0;}
.redes-new-tag{display:block;text-align:right;color:#8a90a3;font-size:12px;font-weight:bold;text-decoration:underline;margin-top:-8px;margin-bottom:28px;}
.redes-submit{width:100%;background:#ef5124;color:white;border:none;padding:16px;border-radius:6px;font-weight:bold;cursor:pointer;text-transform:uppercase;font-size:14px;display:flex;justify-content:center;align-items:center;gap:10px;}
.redes-submit:hover{background:#d9431b;}
.redes-back{display:inline-block;margin-bottom:18px;color:#ef5124;text-decoration:none;font-weight:bold;font-size:13px;}
@media(max-width:1100px){.redes-form-layout{grid-template-columns:1fr;gap:20px}.redes-wrapper{padding:0 20px 25px}.redes-row{grid-template-columns:1fr}.redes-right{margin-top:0}}

.news-divider{border-bottom:1px solid #e3e5ef;margin-bottom:15px;}
.news-card{display:grid;grid-template-columns:28px 170px 1fr 185px;gap:20px;align-items:center;border:1px solid #e3e5ef;border-radius:13px;padding:16px;margin-bottom:16px;background:white;box-shadow:0 2px 8px rgba(0,0,0,0.02);}
.news-card:hover{box-shadow:0 5px 18px rgba(0,0,0,0.08);}
.news-check{width:20px;height:20px;accent-color:#ef5124;}
.news-thumb{height:150px;border:1px solid #e3e5ef;border-radius:9px;background:#fbebe4;display:flex;align-items:center;justify-content:center;color:#ef5124;font-size:42px;overflow:hidden;}
.news-thumb img,.news-thumb video{width:100%;height:100%;object-fit:cover;}
.news-info-top{display:flex;gap:20px;color:#9aa0b5;font-size:13px;margin-bottom:9px;}
.news-title{font-size:17px;font-weight:bold;color:#1e2942;text-decoration:underline;margin-bottom:10px;display:block;}
.tags{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px;}
.tag{background:#e8eaf2;color:#1e2942;padding:5px 9px;border-radius:12px;font-size:11px;font-weight:bold;text-transform:uppercase;}
.news-source{display:flex;align-items:center;gap:14px;font-size:13px;color:#1e2942;}
.news-source strong{color:#ef5124;text-transform:uppercase;font-size:12px;}
.news-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:18px;}
.action-mini{width:36px;height:36px;border:none;border-radius:9px;background:#fff0ea;color:#ef5124;cursor:pointer;font-size:16px;}
.news-value{border-left:1px solid #e3e5ef;padding-left:28px;min-height:145px;display:flex;flex-direction:column;justify-content:center;}
.news-value small{color:#9aa0b5;font-size:13px;margin-bottom:8px;}
.news-value strong{font-size:26px;color:#1e2942;margin-bottom:8px;}
.empty{padding:45px;border:1px solid #e3e5ef;border-radius:13px;color:#777;text-align:center;}

.drawer-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:100;}
.drawer-overlay.show{display:block;}
.news-drawer{position:fixed;top:0;right:-540px;width:540px;height:100vh;background:white;z-index:110;box-shadow:-8px 0 28px rgba(0,0,0,.25);transition:.25s;overflow-y:auto;}
.news-drawer.open{right:0;}
.drawer-head{padding:22px 26px;border-bottom:1px solid #e3e5ef;display:flex;justify-content:space-between;align-items:flex-start;}
.drawer-head small{display:block;color:#9aa0b5;font-size:11px;text-transform:uppercase;font-weight:bold;margin-bottom:6px;}
.drawer-head h2{font-size:22px;color:#1e2942;}
.drawer-close{border:none;background:transparent;color:#1e2942;font-size:36px;cursor:pointer;}
.drawer-body{padding:24px 26px;}
.drawer-body label{display:block;font-size:13px;color:#1e2942;margin-bottom:7px;font-weight:bold;}
.drawer-body input,.drawer-body select,.drawer-body textarea{width:100%;padding:12px;border:1px solid #d9dce8;border-radius:8px;margin-bottom:14px;font-size:14px;color:#1e2942;}
.drawer-body textarea{min-height:120px;resize:vertical;}
.news-help{background:#fff6f2;border:1px solid #ffd7c8;color:#6d3a27;padding:12px;border-radius:10px;font-size:13px;line-height:1.45;margin-bottom:18px;}
.medios-box{border:1px solid #ddd;border-radius:10px;padding:10px;background:#fafafa;margin-bottom:14px;}
.medio-seleccionado{background:#e8f5e9;border:1px solid #2f9e44;color:#1e2942;padding:9px;border-radius:8px;margin-bottom:9px;font-size:12px;font-weight:bold;}
.medios-lista{max-height:210px;overflow:auto;border:1px solid #ddd;border-radius:8px;background:white;padding:8px;white-space:nowrap;}
.region-title{background:#1e2942;color:white;padding:7px;border-radius:6px;font-size:12px;font-weight:bold;}
.provincia-title{background:#5a657a;color:white;padding:6px;border-radius:6px;margin:6px 0 4px 12px;font-size:12px;font-weight:bold;}
.ciudad-title{color:#ef5124;margin:6px 0 4px 25px;font-size:12px;font-weight:bold;}
.medio-item{margin:0;padding:10px 14px;background:#f4f4f4;border-radius:0;margin-bottom:2px;cursor:pointer;width:100%;min-width:0;display:block;box-sizing:border-box;font-size:13px;}
.medio-item:hover{background:#ef5124;color:white;}
.news-save{width:100%;background:#ef5124;color:white;border:none;padding:15px;border-radius:9px;font-weight:bold;cursor:pointer;text-transform:uppercase;margin-top:8px;}
.news-save:hover{background:#d9431b;}
.alert-msg{background:#fff3cd;color:#856404;padding:12px;border-radius:8px;margin-bottom:15px;font-weight:bold;}


/* =========================
   ARCHIVOS ADJUNTOS AVANZADO
========================= */
.adjuntos-modal{display:none;position:fixed;inset:0;background:white;z-index:11000;color:#1e2942;}
.adjuntos-modal.show{display:block;}
.adjuntos-close{position:fixed;top:18px;right:20px;width:48px;height:48px;border-radius:50%;border:1px solid #e3e5ef;background:#f7f7fb;color:#1e2942;font-size:28px;font-weight:bold;cursor:pointer;z-index:11020;}
.adjuntos-close:hover{background:#fff0ea;color:#ef5124;}
.adjuntos-tabs{height:56px;display:flex;align-items:stretch;border-bottom:1px solid #e3e5ef;background:white;}
.adjuntos-tab{border:none;background:white;color:#8a90a3;font-size:18px;padding:0 24px;cursor:pointer;font-weight:bold;}
.adjuntos-tab.active{color:#ef5124;background:white;}
.adjuntos-tab:not(.active){background:#f5f6fb;}
.adjuntos-layout{display:grid;grid-template-columns:1fr 410px;height:calc(100vh - 56px);}
.adjuntos-left{overflow:auto;padding:26px 32px;}
.adjuntos-right{background:#f5f6fb;border-left:1px solid #e3e5ef;padding:30px 28px;overflow:auto;position:relative;}
.adjuntos-search{width:285px;border:1px solid #d9dce8;border-radius:28px;padding:14px 18px;font-size:15px;color:#1e2942;margin-bottom:34px;}
.adjuntos-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(205px,1fr));gap:20px;}

/* =========================================================
   SEPARACIÓN VISUAL DEL REPOSITORIO DE ADJUNTOS
========================================================= */
.adjuntos-grupo-titulo{
    grid-column:1 / -1;
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:12px;
    width:100%;
    box-sizing:border-box;
    margin:2px 0 0;
    padding:11px 14px;
    border-radius:8px;
    font-size:13px;
    font-weight:800;
    letter-spacing:.35px;
}

.adjuntos-grupo-titulo strong{
    min-width:28px;
    height:28px;
    padding:0 8px;
    box-sizing:border-box;
    border-radius:14px;
    display:inline-flex;
    align-items:center;
    justify-content:center;
    font-size:12px;
}

.adjuntos-grupo-titulo-nuevos{
    color:#9b3418;
    background:#fff0e9;
    border:1px solid rgba(239,81,36,.38);
}

.adjuntos-grupo-titulo-nuevos strong{
    color:#ffffff;
    background:#ef5124;
}

.adjuntos-grupo-titulo-general{
    margin-top:8px;
    color:#27324a;
    background:#f3f5f9;
    border:1px solid #d9dce8;
}

.adjuntos-grupo-titulo-general strong{
    color:#27324a;
    background:#ffffff;
    border:1px solid #d9dce8;
}

.adjunto-card{border:1px solid #d9dce8;border-radius:8px;overflow:hidden;background:white;cursor:default;transition:.18s;position:relative;}
.adjunto-card:hover{transform:translateY(-2px);box-shadow:0 8px 20px rgba(0,0,0,.1);border-color:#ef5124;}
.adjunto-card.selected{outline:3px solid #ff9b86;border-color:#ef5124;}

.adjunto-card.nuevo-destacado{
    border-color:#ef5124;
    outline:3px solid rgba(239,81,36,.72);
    box-shadow:
        0 0 0 6px rgba(239,81,36,.13),
        0 0 24px rgba(239,81,36,.58);
    animation:adjuntoNuevoAura 1.35s ease-in-out infinite;
}

.adjunto-card.nuevo-destacado:hover{
    border-color:#ef5124;
    box-shadow:
        0 0 0 7px rgba(239,81,36,.16),
        0 0 30px rgba(239,81,36,.68);
}

@keyframes adjuntoNuevoAura{
    0%,100%{
        box-shadow:
            0 0 0 4px rgba(239,81,36,.10),
            0 0 14px rgba(239,81,36,.40);
    }
    50%{
        box-shadow:
            0 0 0 8px rgba(239,81,36,.18),
            0 0 30px rgba(239,81,36,.72);
    }
}

    
.adjunto-check-wrap{

    position:absolute;
    top:10px;
    right:10px;
    z-index:30;

}

.adjunto-check{

    width:22px;
    height:22px;

    cursor:pointer;

    accent-color:#ef5124;

    background:#ffffff;

    border-radius:4px;

    box-shadow:0 2px 8px rgba(0,0,0,.25);

}    
    
.adjunto-preview{height:118px;background:#fff0ea;display:flex;align-items:center;justify-content:center;color:#ef5124;font-size:42px;overflow:hidden;position:relative;}
.adjunto-preview img,.adjunto-preview video{width:100%;height:100%;object-fit:cover;}
.adjunto-play{
position:absolute;
left:50%;
top:50%;
transform:translate(-50%,-50%);
width:54px;
height:54px;
border:0;
border-radius:50%;
background:rgba(30,41,66,.86);
color:#fff;
display:flex;
align-items:center;
justify-content:center;
font-size:22px;
cursor:pointer;
z-index:20;
box-shadow:0 4px 14px rgba(0,0,0,.35);
transition:.18s ease;
padding:0 0 0 3px;
}
.adjunto-play:hover{
background:#ef5124;
transform:translate(-50%,-50%) scale(1.08);
}

/* VISOR DE PREVISUALIZACIÓN */
.adjunto-visor-modal{
display:none;
position:fixed;
inset:0;
background:rgba(13,19,32,.92);
z-index:11100;
align-items:center;
justify-content:center;
padding:28px;
}
.adjunto-visor-modal.show{display:flex;}
.adjunto-visor-box{
width:min(1100px,96vw);
height:min(780px,92vh);
background:#111827;
border-radius:14px;
overflow:hidden;
display:flex;
flex-direction:column;
box-shadow:0 20px 70px rgba(0,0,0,.55);
}
.adjunto-visor-head{
min-height:58px;
display:flex;
align-items:center;
justify-content:space-between;
gap:18px;
padding:12px 18px;
background:#fff;
border-bottom:1px solid #e3e5ef;
}
.adjunto-visor-titulo{
font-size:15px;
font-weight:bold;
color:#1e2942;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
.adjunto-visor-cerrar{
width:38px;
height:38px;
border:0;
border-radius:50%;
background:#fff0ea;
color:#ef5124;
font-size:25px;
line-height:1;
cursor:pointer;
flex:0 0 auto;
}
.adjunto-visor-cerrar:hover{background:#ef5124;color:#fff;}
.adjunto-visor-contenido{
flex:1;
min-height:0;
display:flex;
align-items:center;
justify-content:center;
padding:18px;
overflow:auto;
}
.adjunto-visor-contenido img{
max-width:100%;
max-height:100%;
object-fit:contain;
border-radius:6px;
}
.adjunto-visor-contenido video{
max-width:100%;
max-height:100%;
background:#000;
border-radius:6px;
}
.adjunto-visor-contenido audio{
width:min(760px,90%);
}
.adjunto-visor-contenido iframe{
width:100%;
height:100%;
border:0;
background:#fff;
border-radius:6px;
}
.adjunto-visor-documento{
color:#fff;
text-align:center;
font-size:15px;
line-height:1.5;
}
.adjunto-visor-documento a{
display:inline-block;
margin-top:18px;
padding:13px 20px;
border-radius:7px;
background:#ef5124;
color:#fff;
text-decoration:none;
font-weight:bold;
}

.adjunto-ext{position:absolute;left:8px;bottom:7px;background:white;border:1px solid #e3e5ef;border-radius:4px;padding:3px 8px;font-size:11px;font-weight:bold;color:#1e2942;}
.adjunto-body{padding:12px;}
.adjunto-title{font-size:13px;font-weight:bold;line-height:1.25;min-height:34px;color:#1e2942;}
.adjunto-date{font-size:12px;color:#8a90a3;margin-top:8px;}
.adjuntos-detail-empty{height:100%;display:flex;align-items:center;justify-content:center;color:#8a90a3;text-align:center;font-style:italic;}
.adjuntos-detail-title{font-size:14px;color:#1e2942;font-weight:bold;margin-bottom:10px;}
.adjuntos-detail-input,.adjuntos-detail-textarea{width:100%;border:1px solid #d9dce8;border-radius:6px;background:white;color:#1e2942;font-size:14px;padding:13px 14px;margin-bottom:18px;}
.adjuntos-detail-textarea{min-height:110px;resize:vertical;}
.adjuntos-detail-url{font-size:13px;color:#1e2942;line-height:1.45;word-break:break-all;margin-bottom:24px;}
.adjuntos-detail-btn{width:100%;background:#ef5124;color:white;border:none;padding:15px;border-radius:7px;font-size:14px;font-weight:bold;cursor:pointer;text-transform:uppercase;}
.adjuntos-detail-btn:hover{background:#d9431b;}
.adjuntos-rutas-seleccionadas{margin-bottom:18px;}
.adjunto-seleccionado-item{
    background:#fff;
    border:1px solid #d9dce8;
    border-radius:7px;
    padding:12px;
    margin-bottom:10px;
}
.adjunto-seleccionado-item.editando{
    border-color:#ef5124;
    box-shadow:0 0 0 2px rgba(239,81,36,.14);
}
.adjunto-seleccionado-cabecera{
    display:flex;
    align-items:flex-start;
    justify-content:space-between;
    gap:12px;
    margin-bottom:8px;
}
.adjunto-seleccionado-nombre{
    min-width:0;
    font-size:12px;
    font-weight:bold;
    color:#1e2942;
    line-height:1.35;
}
.adjunto-radio-editar{
    display:flex;
    align-items:center;
    gap:6px;
    flex:0 0 auto;
    cursor:pointer;
    font-size:12px;
    color:#1e2942;
}
.adjunto-radio-editar input{
    width:17px;
    height:17px;
    margin:0;
    accent-color:#ef5124;
    cursor:pointer;
}
.adjunto-seleccionado-ruta{
    color:#0645d6;
    font-size:13px;
    line-height:1.45;
    word-break:break-all;
}
.adjunto-editor-separador{
    height:1px;
    background:#d9dce8;
    margin:22px 0;
}
.adjunto-editor-titulo-seccion{
    color:#ef5124;
    font-size:13px;
    font-weight:bold;
    margin-bottom:18px;
    word-break:break-word;
}
.adjuntos-upload-pane{height:calc(100vh - 56px);display:none;align-items:center;justify-content:center;text-align:center;}
.adjuntos-upload-pane.active{display:flex;}
.adjuntos-repo-pane{display:block;}
.adjuntos-repo-pane.hidden{display:none;}
.adjuntos-upload-center{margin-top:-80px;}
.adjuntos-upload-text{font-size:14px;color:#8a90a3;font-style:italic;margin-bottom:18px;}
.adjuntos-upload-btn{background:#ef5124;color:white;border:none;border-radius:7px;padding:15px 24px;font-weight:bold;cursor:pointer;text-transform:uppercase;font-size:14px;}
.adjuntos-upload-btn:hover{background:#d9431b;}
.adjuntos-upload-list{width:420px;max-width:90vw;margin:22px auto 0;text-align:left;}
.adjuntos-upload-item{border:1px solid #e3e5ef;border-radius:8px;padding:10px 12px;margin-bottom:8px;font-size:13px;color:#1e2942;background:#fff;}
.adjuntos-upload-item.ok{border-color:#28a745;background:#f4fff7;}
.adjuntos-upload-item.error{border-color:#dc3545;background:#fff5f5;}
.noticia-adjuntos-list{display:flex;flex-wrap:wrap;gap:18px;align-items:flex-start;margin-top:12px;}
.noticia-adjunto-card{width:125px;height:125px;border:1px solid #d9dce8;border-radius:9px;background:white;overflow:hidden;position:relative;}
.noticia-adjunto-card.active{outline:3px solid #ffb09f;}
.noticia-adjunto-preview{height:100%;background:#fff0ea;display:flex;align-items:center;justify-content:center;color:#ef5124;font-size:36px;overflow:hidden;}
.noticia-adjunto-preview img,.noticia-adjunto-preview video{width:100%;height:100%;object-fit:cover;}
.noticia-adjunto-menu-btn{position:absolute;top:7px;right:7px;width:24px;height:30px;border:none;border-radius:7px;background:white;color:#8a90a3;cursor:pointer;font-size:20px;line-height:20px;box-shadow:0 2px 8px rgba(0,0,0,.12);}
.noticia-adjunto-remove{display:none;position:absolute;inset:0;background:rgba(30,41,66,.86);color:white;align-items:center;justify-content:center;flex-direction:column;font-weight:bold;font-size:13px;}
.noticia-adjunto-remove.show{display:flex;}
.noticia-adjunto-remove .remove-x{position:absolute;top:7px;right:9px;font-size:20px;cursor:pointer;}
.noticia-adjunto-remove button{border:none;background:transparent;color:white;font-weight:bold;cursor:pointer;font-size:13px;}

.modal{display:none;position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:200;}
.modal-box{background:white;width:90%;max-width:480px;margin:8% auto;padding:24px;border-radius:14px;position:relative;}
.modal-close{position:absolute;top:10px;right:14px;font-size:26px;cursor:pointer;}
.modal-box h2{color:#1e2942;margin-bottom:15px;text-align:center;}
.modal-box textarea{width:100%;min-height:145px;padding:12px;border:1px solid #ddd;border-radius:8px;}
.modal-box button{width:100%;background:#25D366;color:white;border:none;padding:13px;border-radius:8px;margin-top:12px;font-weight:bold;}

@media(max-width:1000px){.news-page{grid-template-columns:1fr;}.news-filters{border-right:none;border-bottom:1px solid #e3e5ef;}.news-card{grid-template-columns:28px 130px 1fr;}.news-value{grid-column:2/4;border-left:none;border-top:1px solid #e3e5ef;padding-left:0;padding-top:12px;min-height:auto;}.news-drawer{width:100%;right:-100%;}}
@media(max-width:650px){.news-page{margin-left:0;width:100%;}.news-card{grid-template-columns:1fr;}.news-thumb{height:180px;}.news-value{grid-column:auto;}.news-main{padding:18px;}}

/* =========================
   SELECTOR MULTIPLE DE ETIQUETAS / CLIENTES
========================= */
.clientes-selector{
    position:relative;
    margin-bottom:12px;
}
.clientes-box{
    min-height:38px;
    width:100%;
    border:1px solid #bfc3cf;
    border-radius:4px;
    background:white;
    padding:5px 34px 5px 6px;
    display:flex;
    align-items:center;
    flex-wrap:wrap;
    gap:4px;
    cursor:text;
    position:relative;
}
.clientes-box:after{
    content:"⌄";
    position:absolute;
    right:12px;
    top:50%;
    transform:translateY(-50%);
    color:#1e2942;
    font-size:14px;
    pointer-events:none;
}
.cliente-tag{
    background:#e6e6e6;
    border:1px solid #aaa;
    border-radius:3px;
    padding:3px 7px;
    font-size:13px;
    color:#1e2942;
    display:inline-flex;
    align-items:center;
    gap:5px;
    line-height:1;
}
.cliente-tag button{
    border:none;
    background:transparent;
    color:#777;
    font-weight:bold;
    font-size:14px;
    cursor:pointer;
    line-height:1;
    padding:0;
}
.cliente-search-inline{
    border:none;
    outline:none;
    min-width:90px;
    flex:1;
    padding:5px;
    font-size:13px;
    color:#1e2942;
}
.cliente-search-inline::placeholder{
    color:#777;
    font-style:italic;
}
.clientes-dropdown{
    display:none;
    position:absolute;
    left:0;
    right:0;
    top:100%;
    background:white;
    border:1px solid #1e2942;
    border-top:none;
    z-index:160;
    max-height:170px;
    overflow-y:auto;
    box-shadow:0 8px 18px rgba(0,0,0,.08);
}
.clientes-dropdown.show{display:block;}
.cliente-option{
    padding:9px 10px;
    font-size:14px;
    color:#1e2942;
    cursor:pointer;
    background:white;
}
.cliente-option:hover{background:#4e8df5;color:white;}
    
.lista-medios{

    position:absolute;
    top:100%;
    left:0;
    right:0;
    width:100%;
    box-sizing:border-box;

    background:#fff;
    border:1px solid #dcdcdc;
    border-radius:10px;

    box-shadow:0 10px 25px rgba(0,0,0,.12);

    max-height:320px;
    overflow-y:auto;
    overflow-x:hidden;

    z-index:9999;

}

.medio-selector{

    position:relative;
    width:100%;

}

.medio-item{

    width:100%;
    box-sizing:border-box;

    padding:11px 15px;

    cursor:pointer;

    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;

}

.medio-item:hover{

    background:#f5f5f5;

}

.medio-sin-resultados{
    display:none;
    padding:14px 15px;
    color:#8a90a3;
    font-size:13px;
    background:#fff;
}    

    


/* =========================
   MODAL NUEVA ETIQUETA DESDE NOTICIAS
========================= */
.nueva-etiqueta-overlay{
    display:none;
    position:fixed;
    inset:0;
    background:rgba(20,28,48,.55);
    z-index:999990;
    align-items:center;
    justify-content:center;
    padding:20px;
}
.nueva-etiqueta-overlay.show{display:flex;}
.nueva-etiqueta-modal{
    width:100%;
    max-width:610px;
    background:#fff;
    border-radius:14px;
    box-shadow:0 20px 55px rgba(0,0,0,.28);
    overflow:hidden;
}
.nueva-etiqueta-head{
    display:flex;
    align-items:center;
    justify-content:space-between;
    padding:24px 28px 16px;
}
.nueva-etiqueta-head h2{
    color:#1e2942;
    font-size:25px;
    font-weight:800;
    margin:0;
}
.nueva-etiqueta-close{
    width:38px;
    height:38px;
    border:0;
    border-radius:50%;
    background:#f1f2f7;
    color:#1e2942;
    font-size:22px;
    cursor:pointer;
}
.nueva-etiqueta-body{padding:6px 28px 28px;}
.nueva-etiqueta-body label{
    display:block;
    color:#1e2942;
    font-size:14px;
    font-weight:700;
    margin-bottom:9px;
}
.nueva-etiqueta-body input{
    width:100%;
    height:54px;
    border:1px solid #d9dce8;
    border-radius:6px;
    padding:0 16px;
    color:#1e2942;
    font-size:15px;
    outline:none;
    margin-bottom:18px;
}
.nueva-etiqueta-body input:focus{border-color:#ef5124;}
.nueva-etiqueta-guardar{
    width:100%;
    height:54px;
    border:0;
    border-radius:6px;
    background:#ef5124;
    color:#fff;
    font-size:14px;
    font-weight:800;
    cursor:pointer;
    text-transform:uppercase;
}
.nueva-etiqueta-guardar:hover{background:#d9431b;}
.nueva-etiqueta-guardar:disabled{opacity:.65;cursor:wait;}
.nueva-etiqueta-error{
    display:none;
    color:#b42318;
    background:#fff1f0;
    border:1px solid #ffc9c5;
    border-radius:6px;
    padding:10px 12px;
    margin-bottom:14px;
    font-size:13px;
}
</style>

<script>
const medios = <?php echo json_encode($medios_array, JSON_UNESCAPED_UNICODE); ?>;

document.addEventListener("DOMContentLoaded", function(){

    // ===== MEDIOS =====
    let comboMedio = document.getElementById("f_medio");

    if(comboMedio){

        comboMedio.innerHTML = '<option value="">Todos los medios</option>';

        medios.forEach(function(m){

            let op = document.createElement("option");
            op.value = m.nombre_medio;
            op.textContent = m.nombre_medio;

            comboMedio.appendChild(op);

        });

    }

    // ===== DEPARTAMENTOS =====
    let comboDep = document.querySelector(".filter-block select:nth-of-type(3)");

    if(comboDep){

        comboDep.innerHTML = '<option value="">Todos los departamentos</option>';

        let deps = [];

        medios.forEach(function(m){

            if(deps.indexOf(m.region)===-1){
                deps.push(m.region);
            }

        });

        deps.sort();

        deps.forEach(function(dep){

            let op = document.createElement("option");
            op.value = dep;
            op.textContent = dep;

            comboDep.appendChild(op);

        });

    }

});

function toggleNuevaNoticiaMenu(event){
    if(event){ event.stopPropagation(); }
    let menu = document.getElementById('newDropdown');
    if(menu){ menu.classList.toggle('show'); }
}

function cerrarNuevaNoticiaMenu(){
    let menu = document.getElementById('newDropdown');
    if(menu){ menu.classList.remove('show'); }
}

function abrirNuevaNoticia(){
    document.getElementById('drawerOverlay').classList.add('show');
    document.getElementById('newsDrawer').classList.add('open');
}

function cerrarNuevaNoticia(){
    document.getElementById('drawerOverlay').classList.remove('show');
    document.getElementById('newsDrawer').classList.remove('open');
}

function abrirSoporte(){
    document.getElementById('modalSoporte').style.display='block';
}

function cerrarSoporte(){
    document.getElementById('modalSoporte').style.display='none';
}

function filtrarMediosNoticias(){

    let tipo = document.getElementById('tipo_medio').value;
    let busqueda = document.getElementById('buscar_medio').value.toLowerCase();
    let lista = document.getElementById('lista_medios');

    document.getElementById('subtipo_medio').value = '';
    document.getElementById('medio_seleccionado').innerHTML = 'Ningún medio seleccionado';
    lista.innerHTML = '';

    if(tipo === ''){
        lista.innerHTML = '<p>Primero selecciona un tipo de medio.</p>';
        return;
    }

    let filtrados = medios.filter(m =>
        m.tipo_medio === tipo &&
        (
            m.region.toLowerCase().includes(busqueda) ||
            m.provincia.toLowerCase().includes(busqueda) ||
            m.ciudad.toLowerCase().includes(busqueda) ||
            m.nombre_medio.toLowerCase().includes(busqueda)
        )
    );

    if(filtrados.length === 0){
        lista.innerHTML = '<p>No se encontraron medios.</p>';
        return;
    }

    let html = '';
    let regionActual = '';
    let provinciaActual = '';
    let ciudadActual = '';

    filtrados.forEach(m => {
        if(m.region !== regionActual){
            regionActual = m.region;
            provinciaActual = '';
            ciudadActual = '';
            html += '<div class="region-title">' + m.region + '</div>';
        }

        if(m.provincia !== provinciaActual){
            provinciaActual = m.provincia;
            ciudadActual = '';
            html += '<div class="provincia-title">' + m.provincia + '</div>';
        }

        if(m.ciudad !== ciudadActual){
            ciudadActual = m.ciudad;
            html += '<div class="ciudad-title">' + m.ciudad + '</div>';
        }

        const texto = m.region + ' / ' + m.provincia + ' / ' + m.ciudad + ' / ' + m.nombre_medio;
        html += '<div class="medio-item" onclick="seleccionarMedioNoticias(\'' + texto.replace(/'/g, "\\'") + '\')">' + m.nombre_medio + '</div>';
    });

    lista.innerHTML = html;
}

function seleccionarMedioNoticias(texto){
    document.getElementById('subtipo_medio').value = texto;
    document.getElementById('medio_seleccionado').innerHTML = 'Medio seleccionado: ' + texto;
}

let noticiasRangoInicio = <?php echo json_encode($filtro_fecha_inicio); ?>;
let noticiasRangoFin = <?php echo json_encode($filtro_fecha_fin); ?>;
let noticiasRangoHover = null;
let noticiasCalendarioAbierto = false;
let noticiasFechaSistema = new Date();
let noticiasMesActual = noticiasRangoInicio ? parseInt(noticiasRangoInicio.split('-')[1], 10) - 1 : noticiasFechaSistema.getMonth();
let noticiasAnioActual = noticiasRangoInicio ? parseInt(noticiasRangoInicio.split('-')[0], 10) : noticiasFechaSistema.getFullYear();

function abrirCalendarioNoticias(event){
    if(event){ event.stopPropagation(); }
    noticiasCalendarioAbierto = true;
    document.getElementById('calendar_popup_noticias').classList.add('show');
    document.getElementById('date_display_noticias').classList.add('active');
    renderCalendarioNoticias();
}

function cerrarCalendarioNoticias(){
    noticiasCalendarioAbierto = false;
    document.getElementById('calendar_popup_noticias').classList.remove('show');
    document.getElementById('date_display_noticias').classList.remove('active');
}

function mesAnteriorNoticias(){
    noticiasMesActual--;
    if(noticiasMesActual < 0){ noticiasMesActual = 11; noticiasAnioActual--; }
    renderCalendarioNoticias();
}

function mesSiguienteNoticias(){
    noticiasMesActual++;
    if(noticiasMesActual > 11){ noticiasMesActual = 0; noticiasAnioActual++; }
    renderCalendarioNoticias();
}
    
function mesAnteriorPrensa(){

    prensaMesActual--;

    if(prensaMesActual<0){

        prensaMesActual=11;
        prensaAnioActual--;

    }

    renderCalendarioPrensa();

}

function mesSiguientePrensa(){

    prensaMesActual++;

    if(prensaMesActual>11){

        prensaMesActual=0;
        prensaAnioActual++;

    }

    renderCalendarioPrensa();

}    
    

function cambiarMesNoticias(){
    noticiasMesActual = parseInt(document.getElementById('select_mes_noticias').value, 10);
    renderCalendarioNoticias();
}

function cambiarAnioNoticias(){
    noticiasAnioActual = parseInt(document.getElementById('select_anio_noticias').value, 10);
    renderCalendarioNoticias();
}

function renderCalendarioNoticias(){
    const meses = ['Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];
    let opcionesMes = '';
    for(let i=0; i<12; i++){
        opcionesMes += "<option value='" + i + "' " + (i === noticiasMesActual ? 'selected' : '') + ">" + meses[i] + "</option>";
    }

    let opcionesAnio = '';

    for(let y = 1970; y <= new Date().getFullYear() + 10; y++){

        opcionesAnio +=
            "<option value='" + y + "' " +
            (y === noticiasAnioActual ? 'selected' : '') +
            ">" + y + "</option>";

    }

    document.getElementById('calendar_title_noticias').innerHTML =
        "<select id='select_mes_noticias' onchange='cambiarMesNoticias()'>" + opcionesMes + "</select>" +
        "<select id='select_anio_noticias' onchange='cambiarAnioNoticias()'>" + opcionesAnio + "</select>";

    let contenedor = document.getElementById('calendar_days_noticias');
    contenedor.innerHTML = '';

    let primerDia = new Date(noticiasAnioActual, noticiasMesActual, 1).getDay();
    primerDia = primerDia === 0 ? 6 : primerDia - 1;
    let totalDias = new Date(noticiasAnioActual, noticiasMesActual + 1, 0).getDate();

    for(let i=0; i<primerDia; i++){
        contenedor.innerHTML += "<div class='day-cell empty-day'></div>";
    }

    for(let d=1; d<=totalDias; d++){
        let fecha = noticiasAnioActual + '-' + String(noticiasMesActual + 1).padStart(2, '0') + '-' + String(d).padStart(2, '0');
        let clase = 'day-cell';

        if(noticiasRangoInicio && noticiasRangoFin){
            if(fecha === noticiasRangoInicio && fecha === noticiasRangoFin){
                clase += ' same-day';
            }else if(fecha === noticiasRangoInicio){
                clase += ' selected-start';
            }else if(fecha === noticiasRangoFin){
                clase += ' selected-end';
            }else if(fecha > noticiasRangoInicio && fecha < noticiasRangoFin){
                clase += ' in-range';
            }
        }else if(noticiasRangoInicio && noticiasRangoHover){
            let inicioTmp = noticiasRangoInicio;
            let finTmp = noticiasRangoHover;
            if(finTmp < inicioTmp){ let temp = inicioTmp; inicioTmp = finTmp; finTmp = temp; }
            if(fecha === noticiasRangoInicio){
                clase += ' selected-start';
            }else if(fecha > inicioTmp && fecha <= finTmp){
                clase += ' preview-range';
            }
        }else if(noticiasRangoInicio && fecha === noticiasRangoInicio){
            clase += ' selected-start';
        }

        contenedor.innerHTML += "<div class='" + clase + "' onmousedown=\"event.stopPropagation(); seleccionarFechaNoticias('" + fecha + "'); return false;\" onmouseover=\"previsualizarRangoNoticias('" + fecha + "')\">" + d + "</div>";
    }
}
    
    
function renderCalendarioPrensa(){

    const meses = [
        'Enero','Febrero','Marzo','Abril','Mayo','Junio',
        'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'
    ];

    let opcionesMes = '';

    for(let i=0;i<12;i++){

        opcionesMes +=
        "<option value='"+i+"' "+
        (i===prensaMesActual?'selected':'')+
        ">"+meses[i]+"</option>";

    }

    let opcionesAnio='';

    for(let y=1970;y<=new Date().getFullYear()+10;y++){

        opcionesAnio +=
        "<option value='"+y+"' "+
        (y===prensaAnioActual?'selected':'')+
        ">"+y+"</option>";

    }

    document.getElementById("calendar_title_prensa").innerHTML=

        "<select id='select_mes_prensa' onchange='cambiarMesPrensa()'>"
        +opcionesMes+
        "</select>"

        +

        "<select id='select_anio_prensa' onchange='cambiarAnioPrensa()'>"
        +opcionesAnio+
        "</select>";

    let contenedor=document.getElementById("calendar_days_prensa");

    contenedor.innerHTML="";

    let primerDia=new Date(prensaAnioActual,prensaMesActual,1).getDay();

    primerDia=primerDia===0?6:primerDia-1;

    let totalDias=new Date(prensaAnioActual,prensaMesActual+1,0).getDate();

    for(let i=0;i<primerDia;i++){

        contenedor.innerHTML+="<div class='day-cell empty-day'></div>";

    }

    for(let d=1;d<=totalDias;d++){

        let fecha=

        prensaAnioActual+"-"

        +String(prensaMesActual+1).padStart(2,"0")

        +"-"

        +String(d).padStart(2,"0");

        let clase="day-cell";

        if(fecha===prensaFecha){

            clase+=" same-day";

        }

        contenedor.innerHTML+=

        "<div class='"+clase+"' "

        +"onmousedown=\"event.stopPropagation();"

        +"seleccionarFechaPrensa('"+fecha+"');"

        +"return false;\">"

        +d+

        "</div>";

    }

}  
    
    
function cambiarMesPrensa(){

    prensaMesActual=parseInt(
        document.getElementById("select_mes_prensa").value
    );

    renderCalendarioPrensa();

}

function cambiarAnioPrensa(){

    prensaAnioActual=parseInt(
        document.getElementById("select_anio_prensa").value
    );

    renderCalendarioPrensa();

}    
    
    
    
    
    

function previsualizarRangoNoticias(fecha){
    if(noticiasRangoInicio && !noticiasRangoFin){
        if(noticiasRangoHover === fecha){ return; }
        noticiasRangoHover = fecha;
        renderCalendarioNoticias();
    }
}

function seleccionarFechaNoticias(fecha){
    if(!noticiasRangoInicio || (noticiasRangoInicio && noticiasRangoFin)){
        noticiasRangoInicio = fecha;
        noticiasRangoFin = null;
        noticiasRangoHover = null;
        document.getElementById('date_text_noticias').innerHTML = '<em>' + fecha + '</em>';
        document.getElementById('btn_aplicar_fecha_noticias').classList.add('active');
        document.getElementById('btn_aplicar_fecha_noticias').disabled = false;
        renderCalendarioNoticias();
        return;
    }

    if(noticiasRangoInicio && !noticiasRangoFin){
        noticiasRangoFin = fecha;
        if(noticiasRangoFin < noticiasRangoInicio){
            let temp = noticiasRangoInicio;
            noticiasRangoInicio = noticiasRangoFin;
            noticiasRangoFin = temp;
        }

        if(noticiasRangoInicio === noticiasRangoFin){
            document.getElementById('date_text_noticias').innerHTML = '<em>' + noticiasRangoInicio + '</em>';
        }else{
            document.getElementById('date_text_noticias').innerHTML = '<em>' + noticiasRangoInicio + ' al ' + noticiasRangoFin + '</em>';
        }

        document.getElementById('btn_aplicar_fecha_noticias').classList.add('active');
        document.getElementById('btn_aplicar_fecha_noticias').disabled = false;
        renderCalendarioNoticias();

        setTimeout(function(){
            cerrarCalendarioNoticias();
            aplicarFiltroNoticias();
        }, 180);
    }
}

let prensaFecha = "<?php echo date('Y-m-d'); ?>";
let prensaCalendarioAbierto = false;
let prensaMesActual = new Date().getMonth();
let prensaAnioActual = new Date().getFullYear();

function abrirCalendarioPrensa(event){
    if(event){ event.stopPropagation(); }

    prensaCalendarioAbierto = true;

    document.getElementById('calendar_popup_prensa').classList.add('show');
    document.getElementById('date_display_prensa').classList.add('active');

    renderCalendarioPrensa();
}

function cerrarCalendarioPrensa(){

    prensaCalendarioAbierto = false;

    document.getElementById('calendar_popup_prensa').classList.remove('show');
    document.getElementById('date_display_prensa').classList.remove('active');

}

function seleccionarFechaPrensa(fecha){

    prensaFecha = fecha;

    document.getElementById("prensa_fecha_nota").value = fecha;

    document.getElementById("date_text_prensa").innerHTML =
        "<em>"+fecha+"</em>";

    renderCalendarioPrensa();

    setTimeout(function(){

        cerrarCalendarioPrensa();

    },150);

}


let radioFecha = "<?php echo date('Y-m-d'); ?>";
let radioCalendarioAbierto = false;
let radioMesActual = new Date().getMonth();
let radioAnioActual = new Date().getFullYear();

function abrirCalendarioRadio(event){
    if(event){ event.stopPropagation(); }

    const popup = document.getElementById('calendar_popup_radio');
    const display = document.getElementById('date_display_radio');
    if(!popup || !display){ return; }

    radioCalendarioAbierto = true;
    popup.classList.add('show');
    display.classList.add('active');
    renderCalendarioRadio();
}

function cerrarCalendarioRadio(){
    const popup = document.getElementById('calendar_popup_radio');
    const display = document.getElementById('date_display_radio');

    radioCalendarioAbierto = false;
    if(popup){ popup.classList.remove('show'); }
    if(display){ display.classList.remove('active'); }
}

function mesAnteriorRadio(){
    radioMesActual--;
    if(radioMesActual < 0){
        radioMesActual = 11;
        radioAnioActual--;
    }
    renderCalendarioRadio();
}

function mesSiguienteRadio(){
    radioMesActual++;
    if(radioMesActual > 11){
        radioMesActual = 0;
        radioAnioActual++;
    }
    renderCalendarioRadio();
}

function cambiarMesRadio(){
    const select = document.getElementById('select_mes_radio');
    if(!select){ return; }
    radioMesActual = parseInt(select.value, 10);
    renderCalendarioRadio();
}

function cambiarAnioRadio(){
    const select = document.getElementById('select_anio_radio');
    if(!select){ return; }
    radioAnioActual = parseInt(select.value, 10);
    renderCalendarioRadio();
}

function renderCalendarioRadio(){
    const titulo = document.getElementById('calendar_title_radio');
    const contenedor = document.getElementById('calendar_days_radio');
    if(!titulo || !contenedor){ return; }

    const meses = [
        'Enero','Febrero','Marzo','Abril','Mayo','Junio',
        'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'
    ];

    let opcionesMes = '';
    for(let i = 0; i < 12; i++){
        opcionesMes += "<option value='" + i + "' " +
            (i === radioMesActual ? 'selected' : '') + ">" +
            meses[i] + "</option>";
    }

    let opcionesAnio = '';
    for(let y = 1970; y <= new Date().getFullYear() + 10; y++){
        opcionesAnio += "<option value='" + y + "' " +
            (y === radioAnioActual ? 'selected' : '') + ">" +
            y + "</option>";
    }

    titulo.innerHTML =
        "<select id='select_mes_radio' onchange='cambiarMesRadio()'>" +
        opcionesMes +
        "</select>" +
        "<select id='select_anio_radio' onchange='cambiarAnioRadio()'>" +
        opcionesAnio +
        "</select>";

    contenedor.innerHTML = '';

    let primerDia = new Date(radioAnioActual, radioMesActual, 1).getDay();
    primerDia = primerDia === 0 ? 6 : primerDia - 1;

    const totalDias = new Date(radioAnioActual, radioMesActual + 1, 0).getDate();

    for(let i = 0; i < primerDia; i++){
        contenedor.innerHTML += "<div class='day-cell empty-day'></div>";
    }

    for(let d = 1; d <= totalDias; d++){
        const fecha =
            radioAnioActual + '-' +
            String(radioMesActual + 1).padStart(2, '0') + '-' +
            String(d).padStart(2, '0');

        let clase = 'day-cell';
        if(fecha === radioFecha){
            clase += ' same-day';
        }

        contenedor.innerHTML +=
            "<div class='" + clase + "' " +
            "onmousedown=\"event.stopPropagation(); seleccionarFechaRadio('" +
            fecha + "'); return false;\">" +
            d +
            "</div>";
    }
}

function seleccionarFechaRadio(fecha){
    radioFecha = fecha;

    const oculto = document.getElementById('radio_fecha_nota');
    const texto = document.getElementById('date_text_radio');

    if(oculto){ oculto.value = fecha; }

    if(texto){
        const partes = fecha.split('-');
        texto.innerHTML = '<em>' +
            partes[2] + '/' + partes[1] + '/' + partes[0] +
            '</em>';
    }

    renderCalendarioRadio();

    setTimeout(function(){
        cerrarCalendarioRadio();
    }, 150);
}



let redesFecha = "<?php echo date('Y-m-d'); ?>";
let redesCalendarioAbierto = false;
let redesMesActual = new Date().getMonth();
let redesAnioActual = new Date().getFullYear();

function abrirCalendarioRedes(event){
    if(event){ event.stopPropagation(); }

    const popup = document.getElementById('calendar_popup_redes');
    const display = document.getElementById('date_display_redes');
    if(!popup || !display){ return; }

    redesCalendarioAbierto = true;
    popup.classList.add('show');
    display.classList.add('active');
    renderCalendarioRedes();
}

function cerrarCalendarioRedes(){
    const popup = document.getElementById('calendar_popup_redes');
    const display = document.getElementById('date_display_redes');

    redesCalendarioAbierto = false;
    if(popup){ popup.classList.remove('show'); }
    if(display){ display.classList.remove('active'); }
}

function mesAnteriorRedes(){
    redesMesActual--;
    if(redesMesActual < 0){
        redesMesActual = 11;
        redesAnioActual--;
    }
    renderCalendarioRedes();
}

function mesSiguienteRedes(){
    redesMesActual++;
    if(redesMesActual > 11){
        redesMesActual = 0;
        redesAnioActual++;
    }
    renderCalendarioRedes();
}

function cambiarMesRedes(){
    const select = document.getElementById('select_mes_redes');
    if(!select){ return; }
    redesMesActual = parseInt(select.value, 10);
    renderCalendarioRedes();
}

function cambiarAnioRedes(){
    const select = document.getElementById('select_anio_redes');
    if(!select){ return; }
    redesAnioActual = parseInt(select.value, 10);
    renderCalendarioRedes();
}

function renderCalendarioRedes(){
    const titulo = document.getElementById('calendar_title_redes');
    const contenedor = document.getElementById('calendar_days_redes');
    if(!titulo || !contenedor){ return; }

    const meses = [
        'Enero','Febrero','Marzo','Abril','Mayo','Junio',
        'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'
    ];

    let opcionesMes = '';
    for(let i = 0; i < 12; i++){
        opcionesMes += "<option value='" + i + "' " +
            (i === redesMesActual ? 'selected' : '') + ">" +
            meses[i] + "</option>";
    }

    let opcionesAnio = '';
    for(let y = 1970; y <= new Date().getFullYear() + 10; y++){
        opcionesAnio += "<option value='" + y + "' " +
            (y === redesAnioActual ? 'selected' : '') + ">" +
            y + "</option>";
    }

    titulo.innerHTML =
        "<select id='select_mes_redes' onchange='cambiarMesRedes()'>" +
        opcionesMes +
        "</select>" +
        "<select id='select_anio_redes' onchange='cambiarAnioRedes()'>" +
        opcionesAnio +
        "</select>";

    contenedor.innerHTML = '';

    let primerDia = new Date(redesAnioActual, redesMesActual, 1).getDay();
    primerDia = primerDia === 0 ? 6 : primerDia - 1;

    const totalDias = new Date(redesAnioActual, redesMesActual + 1, 0).getDate();

    for(let i = 0; i < primerDia; i++){
        contenedor.innerHTML += "<div class='day-cell empty-day'></div>";
    }

    for(let d = 1; d <= totalDias; d++){
        const fecha =
            redesAnioActual + '-' +
            String(redesMesActual + 1).padStart(2, '0') + '-' +
            String(d).padStart(2, '0');

        let clase = 'day-cell';
        if(fecha === redesFecha){
            clase += ' same-day';
        }

        contenedor.innerHTML +=
            "<div class='" + clase + "' " +
            "onmousedown=\"event.stopPropagation(); seleccionarFechaRedes('" +
            fecha + "'); return false;\">" +
            d +
            "</div>";
    }
}

function seleccionarFechaRedes(fecha){
    redesFecha = fecha;

    const oculto = document.getElementById('redes_fecha_nota');
    const texto = document.getElementById('date_text_redes');

    if(oculto){ oculto.value = fecha; }

    if(texto){
        const partes = fecha.split('-');
        texto.innerHTML = '<em>' +
            partes[2] + '/' + partes[1] + '/' + partes[0] +
            '</em>';
    }

    renderCalendarioRedes();

    setTimeout(function(){
        cerrarCalendarioRedes();
    }, 150);
}

function aplicarFiltroNoticias(){
    let parametros = new URLSearchParams();
    parametros.set('modulo', 'noticias');

    document.querySelectorAll('.filtro-tipo-check:checked').forEach(function(check){
        parametros.append('tipos[]', check.value);
    });

    if(noticiasRangoInicio !== null && noticiasRangoInicio !== ''){
        if(!noticiasRangoFin){
            noticiasRangoFin = noticiasRangoInicio;
        }

        parametros.set('fecha_inicio', noticiasRangoInicio);
        parametros.set('fecha_fin', noticiasRangoFin);
    }

    <?php if($ver_archivadas){ ?>
    parametros.set('archivadas', '1');
    <?php } ?>

    window.location.href = 'dashboard_superadmin.php?' + parametros.toString();
}

function limpiarFiltrosNoticias(){
    window.location.href = 'dashboard_superadmin.php?modulo=noticias';
}

function actualizarTiposNoticiasVisual(){
    document.querySelectorAll('.filtro-tipo-check').forEach(function(check){
        const fila = check.closest('.type-check-row');

        if(fila){
            fila.classList.toggle('active', check.checked);
        }
    });

    const btn = document.getElementById('btn_aplicar_fecha_noticias');
    if(btn){
        btn.disabled = false;
        btn.classList.add('active');
    }
}

document.addEventListener('DOMContentLoaded', function(){
    document.querySelectorAll('.filtro-tipo-check').forEach(function(check){
        check.addEventListener('change', actualizarTiposNoticiasVisual);
    });

    actualizarTiposNoticiasVisual();
});

function inicializarTextoFechaNoticias(){
    let texto = document.getElementById('date_text_noticias');
    let btn = document.getElementById('btn_aplicar_fecha_noticias');
    if(!texto || !btn){ return; }

    if(noticiasRangoInicio && noticiasRangoFin){
        if(noticiasRangoInicio === noticiasRangoFin){
            texto.innerHTML = '<em>' + noticiasRangoInicio + '</em>';
        }else{
            texto.innerHTML = '<em>' + noticiasRangoInicio + ' al ' + noticiasRangoFin + '</em>';
        }
        btn.classList.add('active');
        btn.disabled = false;
    }else{
        texto.innerHTML = '<em>Seleccionar fecha</em>';
        btn.classList.remove('active');
        btn.disabled = true;
    }
}

document.addEventListener('DOMContentLoaded', function(){

    inicializarTextoFechaNoticias();

    if(document.getElementById('calendar_days_prensa')){
        renderCalendarioPrensa();
    }

    if(document.getElementById('calendar_days_radio')){
        renderCalendarioRadio();
    }

    if(document.getElementById('calendar_days_redes')){
        renderCalendarioRedes();
    }

});

window.onclick = function(event){
    if(event.target == document.getElementById('modalSoporte')){
        cerrarSoporte();
    }

    if(!event.target.closest || !event.target.closest('.new-dropdown-wrap')){
        cerrarNuevaNoticiaMenu();
    }

    let calendario = document.getElementById('calendar_popup_noticias');
    let selector = document.getElementById('date_display_noticias');

    if(
        calendario &&
        selector &&
        noticiasCalendarioAbierto &&
        !calendario.contains(event.target) &&
        !selector.contains(event.target)
    ){
        cerrarCalendarioNoticias();
    }
    
let calendarioPrensa = document.getElementById('calendar_popup_prensa');
let selectorPrensa = document.getElementById('date_display_prensa');

if(
    calendarioPrensa &&
    selectorPrensa &&
    prensaCalendarioAbierto &&
    !calendarioPrensa.contains(event.target) &&
    !selectorPrensa.contains(event.target)
){
    cerrarCalendarioPrensa();
}

let calendarioRadio = document.getElementById('calendar_popup_radio');
let selectorRadio = document.getElementById('date_display_radio');

if(
    calendarioRadio &&
    selectorRadio &&
    radioCalendarioAbierto &&
    !calendarioRadio.contains(event.target) &&
    !selectorRadio.contains(event.target)
){
    cerrarCalendarioRadio();
}

let calendarioRedes = document.getElementById('calendar_popup_redes');
let selectorRedes = document.getElementById('date_display_redes');

if(
    calendarioRedes &&
    selectorRedes &&
    redesCalendarioAbierto &&
    !calendarioRedes.contains(event.target) &&
    !selectorRedes.contains(event.target)
){
    cerrarCalendarioRedes();
}

}

let adjuntoDetalleActual = null;
let adjuntoContextoActual = "";
let adjuntosSeleccionadosModal = [];
let adjuntosNuevosDestacados = [];
let adjuntosNuevosPendientesResaltado = [];
let adjuntoEditorId = "";
let adjuntosSeleccionadosPorContexto = { prensa: [], radio: [], redes: [] };


<?php
$adjuntos_actuales_edicion = array();
$ids_adjuntos_edicion = array_values(array_unique(array_filter(
    array_map('intval', explode(',', (string)($datos_edicion['archivo_adjunto_ids'] ?? ''))),
    function($id){ return $id > 0; }
)));

if (!empty($ids_adjuntos_edicion)) {
    $lista_ids_adjuntos_edicion = implode(',', $ids_adjuntos_edicion);
    $q_adjuntos_edicion = $conn->query(
        "SELECT id, titulo, descripcion, archivo, fecha_archivo
         FROM archivos
         WHERE id IN ($lista_ids_adjuntos_edicion)
           AND archivo<>''"
    );
    $por_id_adjuntos = array();
    if ($q_adjuntos_edicion) {
        while ($fila = $q_adjuntos_edicion->fetch_assoc()) {
            $por_id_adjuntos[intval($fila['id'])] = $fila;
        }
    }
    foreach ($ids_adjuntos_edicion as $id_adjunto) {
        if (!isset($por_id_adjuntos[$id_adjunto])) continue;
        $fila = $por_id_adjuntos[$id_adjunto];
        $archivo_rel = ltrim(str_replace('\\', '/', (string)$fila['archivo']), '/');
        $url = (strpos($archivo_rel, 'uploads/') === 0) ? $archivo_rel : 'uploads/' . $archivo_rel;
        $ext = strtolower(pathinfo($archivo_rel, PATHINFO_EXTENSION));
        $cat = 'documento'; $icon = '📄';
        if (in_array($ext, array('jpg','jpeg','png','gif','webp'))) { $cat='imagen'; $icon='🖼'; }
        elseif (in_array($ext, array('mp4','webm','mov','avi','mkv'))) { $cat='video'; $icon='🎬'; }
        elseif (in_array($ext, array('mp3','wav','aac','ogg','m4a'))) { $cat='audio'; $icon='🎧'; }
        elseif ($ext === 'pdf') { $cat='pdf'; $icon='📕'; }
        $adjuntos_actuales_edicion[] = array(
            'id' => intval($fila['id']), 'url' => $url, 'cat' => $cat, 'icon' => $icon,
            'titulo' => trim((string)($fila['titulo'] ?? basename($archivo_rel))),
            'desc' => trim((string)($fila['descripcion'] ?? '')),
            'fecha' => trim((string)($fila['fecha_archivo'] ?? '')), 'es_actual' => true
        );
    }
}

/* Compatibilidad con noticias antiguas que solo guardaron un archivo. */
if (empty($adjuntos_actuales_edicion) && !empty($noticia['archivo'])) {
    $archivo_rel = ltrim(str_replace('\\', '/', (string)$noticia['archivo']), '/');
    $archivo_sin_uploads = preg_replace('#^uploads/#i', '', $archivo_rel);
    $archivo_busqueda = $conn->real_escape_string($archivo_rel);
    $q = $conn->query("SELECT id,titulo,descripcion,archivo,fecha_archivo FROM archivos WHERE REPLACE(archivo,'\\\\','/')='$archivo_busqueda' OR REPLACE(archivo,'\\\\','/')='".$conn->real_escape_string($archivo_sin_uploads)."' OR CONCAT('uploads/',REPLACE(archivo,'\\\\','/'))='$archivo_busqueda' ORDER BY id DESC LIMIT 1");
    $fila = ($q && $q->num_rows > 0) ? $q->fetch_assoc() : null;
    $id = $fila ? intval($fila['id']) : 'actual';
    $url = (strpos($archivo_rel, 'uploads/') === 0) ? $archivo_rel : 'uploads/' . $archivo_rel;
    $ext = strtolower(pathinfo($archivo_rel, PATHINFO_EXTENSION));
    $cat='documento'; $icon='📄';
    if (in_array($ext,array('jpg','jpeg','png','gif','webp'))) {$cat='imagen';$icon='🖼';}
    elseif (in_array($ext,array('mp4','webm','mov','avi','mkv'))) {$cat='video';$icon='🎬';}
    elseif (in_array($ext,array('mp3','wav','aac','ogg','m4a'))) {$cat='audio';$icon='🎧';}
    elseif ($ext==='pdf') {$cat='pdf';$icon='📕';}
    $adjuntos_actuales_edicion[] = array('id'=>$id,'url'=>$url,'cat'=>$cat,'icon'=>$icon,'titulo'=>$fila['titulo']??basename($archivo_rel),'desc'=>$fila['descripcion']??'','fecha'=>$fila['fecha_archivo']??'','es_actual'=>true);
}
?>

const adjuntosActualesEdicion = <?php echo json_encode($adjuntos_actuales_edicion, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); ?>;

document.addEventListener('DOMContentLoaded', function(){
    if (!Array.isArray(adjuntosActualesEdicion) || adjuntosActualesEdicion.length === 0) return;
    let contextoActual = '';
    <?php if ($modo_formulario === 'prensa') { ?> contextoActual = 'prensa';
    <?php } elseif ($modo_formulario === 'radio_tv') { ?> contextoActual = 'radio';
    <?php } elseif ($modo_formulario === 'redes_web') { ?> contextoActual = 'redes'; <?php } ?>
    if (contextoActual && document.getElementById('lista_adjuntos_' + contextoActual)) {
        adjuntosSeleccionadosPorContexto[contextoActual] = adjuntosActualesEdicion.slice();
        actualizarAdjuntosFormulario(contextoActual);
    }
});

function abrirAdjuntosModal(contexto){
    adjuntoContextoActual = contexto;
    adjuntoDetalleActual = null;
    adjuntoEditorId = "";
    document.getElementById("adjuntosModal").classList.add("show");
    document.body.style.overflow = "hidden";
    cambiarTabAdjuntos("repo");
    limpiarDetalleAdjunto();

    adjuntosSeleccionadosModal = (adjuntosSeleccionadosPorContexto[contexto] || [])
        .map(function(a){ return String(a.id); })
        .filter(function(id){ return id !== "" && id !== "actual"; });

    setTimeout(function(){
        document.querySelectorAll(".adjunto-check").forEach(function(chk){
            chk.checked = adjuntosSeleccionadosModal.includes(String(chk.dataset.id || ""));
        });
        actualizarPanelArchivosSeleccionados();
    }, 120);
}

function cerrarAdjuntosModal(){
    document.getElementById("adjuntosModal").classList.remove("show");
    document.body.style.overflow = "";
    adjuntoDetalleActual = null;
    adjuntoEditorId = "";
}

function cambiarTabAdjuntos(tab){

    let repoPane=document.getElementById("adjuntosRepoPane");
    let uploadPane=document.getElementById("adjuntosUploadPane");
    let tabRepo=document.getElementById("tabAdjuntosRepo");
    let tabUpload=document.getElementById("tabAdjuntosUpload");

    if(tab==="repo"){

        repoPane.classList.remove("hidden");
        uploadPane.classList.remove("active");

        tabRepo.classList.add("active");
        tabUpload.classList.remove("active");

        if(typeof refrescarRepositorioAdjuntos==="function"){
            refrescarRepositorioAdjuntos();
        }

    }else{

        repoPane.classList.add("hidden");
        uploadPane.classList.add("active");

        tabRepo.classList.remove("active");
        tabUpload.classList.add("active");

    }

}

let adjuntosRepoOffset = 40;
let adjuntosRepoLimit = 40;
let adjuntosRepoHayMas = true;
let adjuntosRepoCargando = false;
let adjuntosRepoTimer = null;
let adjuntosRepoControlador = null;
let adjuntosRepoSecuencia = 0;
let adjuntosRepoScrollInstalado = false;

function restaurarChecksAdjuntos(){
    document.querySelectorAll(".adjunto-check").forEach(function(check){
        check.checked = adjuntosSeleccionadosModal.includes(
            String(check.dataset.id || "")
        );
    });
}

function cargarRepositorioAdjuntos(reiniciar){
    const grid = document.getElementById("adjuntosGrid");
    const panel = document.querySelector(".adjuntos-left");
    const buscador = document.getElementById("buscarAdjuntoRepo");

    if(!grid || !panel){
        return;
    }

    if(reiniciar){
        if(adjuntosRepoControlador){
            adjuntosRepoControlador.abort();
        }

        adjuntosRepoControlador = new AbortController();
        adjuntosRepoSecuencia++;
        adjuntosRepoOffset = 0;
        adjuntosRepoHayMas = true;
        adjuntosRepoCargando = false;
    }

    if(adjuntosRepoCargando || !adjuntosRepoHayMas){
        return;
    }

    adjuntosRepoCargando = true;
    const miSecuencia = adjuntosRepoSecuencia;

    const url = "modulos/adjuntos_repo_ajax.php?offset="
        + encodeURIComponent(adjuntosRepoOffset)
        + "&limit=" + encodeURIComponent(adjuntosRepoLimit)
        + "&q=" + encodeURIComponent(buscador ? buscador.value.trim() : "");

    fetch(url,{
        credentials:"same-origin",
        cache:"no-store",
        signal: adjuntosRepoControlador ? adjuntosRepoControlador.signal : undefined
    })
    .then(function(r){
        if(!r.ok){
            throw new Error("No se pudo consultar el repositorio.");
        }
        return r.json();
    })
    .then(function(data){
        if(miSecuencia !== adjuntosRepoSecuencia){
            return;
        }

        if(!data || data.ok !== true){
            throw new Error(data && data.mensaje ? data.mensaje : "Respuesta inválida.");
        }

        /*
         * IMPORTANTE:
         * Al reiniciar NO vaciamos el modal antes de recibir respuesta.
         * Así se elimina el parpadeo/pantalla vacía.
         */
        if(reiniciar){
            grid.innerHTML = data.html || "";
        }else{
            grid.insertAdjacentHTML("beforeend", data.html || "");
        }

        adjuntosRepoOffset = Number(data.siguiente_offset || 0);
        adjuntosRepoHayMas = !!data.hay_mas;

        restaurarChecksAdjuntos();

        if(typeof aplicarDestacadoAdjuntosNuevos === "function"){
            aplicarDestacadoAdjuntosNuevos();
        }

        if(typeof ordenarRepositorioAdjuntosNaturalmente === "function"){
            ordenarRepositorioAdjuntosNaturalmente();
        }

        if(typeof actualizarPanelArchivosSeleccionados === "function"){
            actualizarPanelArchivosSeleccionados();
        }
    })
    .catch(function(err){
        if(err && err.name === "AbortError"){
            return;
        }
        console.error("Error cargando repositorio de adjuntos:",err);
    })
    .finally(function(){
        if(miSecuencia !== adjuntosRepoSecuencia){
            return;
        }
        adjuntosRepoCargando = false;
    });
}

function instalarScrollAdjuntosRepo(){
    if(adjuntosRepoScrollInstalado){
        return;
    }

    const panel = document.querySelector(".adjuntos-left");
    if(!panel){
        return;
    }

    adjuntosRepoScrollInstalado = true;

    panel.addEventListener("scroll", function(){
        /*
         * Sin IntersectionObserver:
         * sólo carga otro bloque cuando el usuario realmente baja.
         * Esto evita el bucle/parpadeo observado en la versión anterior.
         */
        if(
            panel.scrollTop + panel.clientHeight
            >= panel.scrollHeight - 450
        ){
            cargarRepositorioAdjuntos(false);
        }
    });
}

function filtrarAdjuntosRepo(){
    clearTimeout(adjuntosRepoTimer);

    adjuntosRepoTimer = setTimeout(function(){
        cargarRepositorioAdjuntos(true);
    },280);
}

function refrescarRepositorioAdjuntos(){
    instalarScrollAdjuntosRepo();
    cargarRepositorioAdjuntos(true);
}


/* =========================================================
   ORDEN NATURAL DE ARCHIVOS
   Respeta _1, _2, _10 y también orden alfabético general.
========================================================= */
function compararNombresAdjuntosNaturales(a, b){
    return String(a || "").localeCompare(
        String(b || ""),
        "es",
        {
            numeric: true,
            sensitivity: "base",
            ignorePunctuation: false
        }
    );
}

function actualizarTitulosGruposAdjuntos(){

    const grid = document.getElementById("adjuntosGrid");

    if(!grid){
        return;
    }

    [
        {grupo:"nuevos", clase:".nuevo-sesion"},
        {grupo:"general", clase:":not(.nuevo-sesion)"}
    ].forEach(function(config){

        const titulo = grid.querySelector(
            '.adjuntos-grupo-titulo[data-grupo="' + config.grupo + '"]'
        );

        if(!titulo){
            return;
        }

        const visibles = Array.from(
            grid.querySelectorAll(".adjunto-card" + config.clase)
        ).filter(function(card){
            return card.style.display !== "none";
        });

        titulo.style.display = visibles.length > 0 ? "flex" : "none";

        const contador = titulo.querySelector("strong");

        if(contador){
            contador.textContent = visibles.length;
        }

    });

}

function ordenarRepositorioAdjuntosNaturalmente(){

    const grid = document.getElementById("adjuntosGrid");

    if(!grid){
        return;
    }

    /*
       Se eliminan únicamente los separadores creados por esta función.
       Las tarjetas originales permanecen intactas.
    */
    grid.querySelectorAll(".adjuntos-grupo-titulo").forEach(function(titulo){
        titulo.remove();
    });

    const tarjetas = Array.from(
        grid.querySelectorAll(".adjunto-card")
    );

    const idsNuevos = new Set(
        adjuntosNuevosDestacados.map(function(id){
            return String(id);
        })
    );

    const tarjetasNuevas = [];
    const tarjetasGenerales = [];

    tarjetas.forEach(function(card){

        const id = String(card.dataset.id || "");

        if(idsNuevos.has(id)){
            tarjetasNuevas.push(card);
        }else{
            tarjetasGenerales.push(card);
        }

    });

    const ordenarTarjetas = function(lista){

        lista.sort(function(cardA, cardB){
            return compararNombresAdjuntosNaturales(
                cardA.dataset.titulo || "",
                cardB.dataset.titulo || ""
            );
        });

    };

    ordenarTarjetas(tarjetasNuevas);
    ordenarTarjetas(tarjetasGenerales);

    /*
       Los archivos nuevos aparecen primero y se ordenan únicamente
       entre ellos. El repositorio anterior conserva su propio orden natural.
    */
    if(tarjetasNuevas.length > 0){

        const tituloNuevos = document.createElement("div");
        tituloNuevos.className =
            "adjuntos-grupo-titulo adjuntos-grupo-titulo-nuevos";
        tituloNuevos.dataset.grupo = "nuevos";
        tituloNuevos.innerHTML =
            '<span>ARCHIVOS NUEVOS</span>' +
            '<strong>' + tarjetasNuevas.length + '</strong>';

        grid.appendChild(tituloNuevos);

        tarjetasNuevas.forEach(function(card){
            grid.appendChild(card);
        });

    }

    if(tarjetasGenerales.length > 0){

        const tituloGeneral = document.createElement("div");
        tituloGeneral.className =
            "adjuntos-grupo-titulo adjuntos-grupo-titulo-general";
        tituloGeneral.dataset.grupo = "general";
        tituloGeneral.innerHTML =
            '<span>REPOSITORIO GENERAL</span>' +
            '<strong>' + tarjetasGenerales.length + '</strong>';

        grid.appendChild(tituloGeneral);

        tarjetasGenerales.forEach(function(card){
            grid.appendChild(card);
        });

    }

    actualizarTitulosGruposAdjuntos();

}

document.addEventListener("DOMContentLoaded", function(){
    aplicarDestacadoAdjuntosNuevos();
});

function aplicarDestacadoAdjuntosNuevos(){

    const idsNuevosSesion = new Set(
        adjuntosNuevosDestacados.map(function(id){
            return String(id);
        })
    );

    const idsPendientesResaltado = new Set(
        adjuntosNuevosPendientesResaltado.map(function(id){
            return String(id);
        })
    );

    document.querySelectorAll("#adjuntosGrid .adjunto-card").forEach(function(card){

        const id = String(card.dataset.id || "");

        /*
           nuevo-sesion mantiene el archivo dentro del grupo ARCHIVOS NUEVOS.
           nuevo-destacado controla únicamente el borde naranja y la animación.
        */
        card.classList.toggle("nuevo-sesion", idsNuevosSesion.has(id));
        card.classList.toggle("nuevo-destacado", idsPendientesResaltado.has(id));

        const check = card.querySelector(".adjunto-check");
        if(check){
            check.checked = adjuntosSeleccionadosModal.includes(id);
        }

    });

    ordenarRepositorioAdjuntosNaturalmente();

}

function cambiarSeleccionAdjunto(check){

    const id = String(check.dataset.id || "");

    if(id === ""){
        return;
    }

    if(check.checked){

        if(!adjuntosSeleccionadosModal.includes(id)){
            adjuntosSeleccionadosModal.push(id);
        }

        /*
           El checklist selecciona el archivo para la noticia. El archivo sigue
           perteneciendo al grupo ARCHIVOS NUEVOS, pero su borde naranja se
           retirará al pulsar Agregar archivos.
        */

    }else{

        adjuntosSeleccionadosModal =
            adjuntosSeleccionadosModal.filter(function(idGuardado){
                return String(idGuardado) !== id;
            });

    }

    actualizarPanelArchivosSeleccionados();

}    
    
function obtenerAdjuntoDesdeCard(id){

    const card = document.getElementById("adjunto_card_" + id);

    if(!card){
        return null;
    }

    return {
        id: String(card.dataset.id || ""),
        titulo: card.dataset.titulo || "",
        desc: card.dataset.desc || "",
        url: card.dataset.url || "",
        ext: card.dataset.ext || "",
        cat: card.dataset.cat || "",
        icon: card.dataset.icon || "📄",
        fecha: card.dataset.fecha || ""
    };

}

function actualizarPanelArchivosSeleccionados(){

    const detail = document.getElementById("adjuntosDetail");

    if(!detail){
        return;
    }

    const archivosSeleccionados = [];

    adjuntosSeleccionadosModal.forEach(function(id){

        const archivo = obtenerAdjuntoDesdeCard(id);

        if(archivo){
            archivosSeleccionados.push(archivo);
        }

    });

    if(archivosSeleccionados.length === 0){

        adjuntoEditorId = "";
        adjuntoDetalleActual = null;

        detail.innerHTML = `
            <div class="adjuntos-detail-empty">
                Selecciona uno o varios archivos del repositorio para agregarlos.
            </div>
        `;

        return;
    }

    const editorTodaviaSeleccionado = archivosSeleccionados.some(function(archivo){
        return String(archivo.id) === String(adjuntoEditorId);
    });

    if(!editorTodaviaSeleccionado){
        adjuntoEditorId = String(archivosSeleccionados[0].id);
    }

    adjuntoDetalleActual = archivosSeleccionados.find(function(archivo){
        return String(archivo.id) === String(adjuntoEditorId);
    }) || archivosSeleccionados[0];

    let rutasHtml = "";

    archivosSeleccionados.forEach(function(archivo, indice){

        const estaEditando = String(archivo.id) === String(adjuntoEditorId);

        rutasHtml += `
            <div class="adjunto-seleccionado-item ${estaEditando ? "editando" : ""}">

                <div class="adjunto-seleccionado-cabecera">

                    <div class="adjunto-seleccionado-nombre">
                        ${indice + 1}. ${escaparHtmlAdjunto(archivo.titulo)}
                    </div>

                    <label class="adjunto-radio-editar">

                        <input
                            type="radio"
                            name="adjuntoEditar"
                            value="${escaparAttrAdjunto(archivo.id)}"
                            ${estaEditando ? "checked" : ""}
                            onchange="editarAdjuntoSeleccionado('${escaparAttrAdjunto(archivo.id)}')"
                        >

                        Editar

                    </label>

                </div>

                <a
                    href="javascript:void(0)"
                    onclick="previsualizarAdjuntoDesdeId('${escaparAttrAdjunto(archivo.id)}')"
                    class="adjunto-seleccionado-ruta"
                >
                    ${escaparHtmlAdjunto(archivo.url)}
                </a>

            </div>
        `;

    });

    detail.innerHTML = `

        <div class="adjunto-editor-titulo-seccion">
            Editando: ${escaparHtmlAdjunto(adjuntoDetalleActual.titulo || "")}
        </div>

        <label class="adjuntos-detail-title">
            Título <span style="color:#ef5124">*</span>
        </label>

        <input
            id="adjunto_edit_titulo"
            class="adjuntos-detail-input"
            type="text"
            value="${escaparAttrAdjunto(adjuntoDetalleActual.titulo || "")}"
            autocomplete="off"
        >

        <label class="adjuntos-detail-title">Descripción</label>

        <textarea
            id="adjunto_edit_desc"
            class="adjuntos-detail-textarea"
        >${escaparHtmlAdjunto(adjuntoDetalleActual.desc || "")}</textarea>

        <label class="adjuntos-detail-title">
            Fecha de publicación <span style="color:#ef5124">*</span>
        </label>

        <input
            id="adjunto_edit_fecha"
            class="adjuntos-detail-input"
            type="date"
            value="${escaparAttrAdjunto(adjuntoDetalleActual.fecha || "")}"
        >

        <button
            type="button"
            class="adjuntos-detail-btn"
            onclick="guardarCambiosAdjuntoActual(this)"
            style="margin-bottom:18px;"
        >
            GUARDAR CAMBIOS
        </button>

        <div class="adjunto-editor-separador"></div>

        <label class="adjuntos-detail-title">
            Archivos seleccionados: ${archivosSeleccionados.length}
        </label>

        <div class="adjuntos-detail-url adjuntos-rutas-seleccionadas">
            ${rutasHtml}
        </div>

        <button
            type="button"
            class="adjuntos-detail-btn"
            onclick="agregarAdjuntoActual()"
        >
            AGREGAR ARCHIVOS
        </button>

    `;

}

function previsualizarAdjuntoDesdeId(id){

    const archivo = obtenerAdjuntoDesdeCard(id);

    if(!archivo){
        return;
    }

    adjuntoDetalleActual = archivo;
    previsualizarAdjunto();

}

function editarAdjuntoSeleccionado(id){

    const archivo = obtenerAdjuntoDesdeCard(id);

    if(!archivo){
        return;
    }

    adjuntoEditorId = String(archivo.id);
    adjuntoDetalleActual = archivo;

    actualizarPanelArchivosSeleccionados();

}

function actualizarFormularioEdicionAdjunto(){

    if(!adjuntoDetalleActual){
        return;
    }

    adjuntoEditorId = String(adjuntoDetalleActual.id || "");
    actualizarPanelArchivosSeleccionados();

}



function guardarCambiosAdjuntoActual(boton){

    if(!adjuntoDetalleActual || !adjuntoDetalleActual.id){
        alert("Selecciona un archivo para editar.");
        return;
    }

    const tituloInput = document.getElementById("adjunto_edit_titulo");
    const descInput = document.getElementById("adjunto_edit_desc");
    const fechaInput = document.getElementById("adjunto_edit_fecha");

    if(!tituloInput || !descInput || !fechaInput){
        alert("No se pudo encontrar el formulario de edición.");
        return;
    }

    const titulo = String(tituloInput.value || "").trim();
    const descripcion = String(descInput.value || "").trim();
    const fecha = String(fechaInput.value || "").trim();

    if(titulo === ""){
        alert("El título es obligatorio.");
        tituloInput.focus();
        return;
    }

    if(fecha === ""){
        alert("La fecha de publicación es obligatoria.");
        fechaInput.focus();
        return;
    }

    const textoOriginal = boton ? boton.textContent : "";

    if(boton){
        boton.disabled = true;
        boton.textContent = "GUARDANDO...";
    }

    const formData = new FormData();
    formData.append("ajax_actualizar_adjunto", "1");
    formData.append("id", String(adjuntoDetalleActual.id));
    formData.append("titulo", titulo);
    formData.append("descripcion", descripcion);
    formData.append("fecha", fecha);

    fetch("<?php echo $dashboard_actual; ?>?modulo=noticias", {
        method: "POST",
        body: formData
    })
    .then(function(respuesta){
        return respuesta.text().then(function(texto){
            const contenido = String(texto || "").trim();

            try{
                return JSON.parse(contenido);
            }catch(error){
                const inicioJson = contenido.lastIndexOf('{"ok"');

                if(inicioJson === -1){
                    throw new Error("El servidor no devolvió una respuesta válida.");
                }

                return JSON.parse(contenido.substring(inicioJson));
            }
        });
    })
    .then(function(data){

        if(!data || !data.ok){
            throw new Error((data && data.mensaje) ? data.mensaje : "No se pudieron guardar los cambios.");
        }

        const id = String(adjuntoDetalleActual.id);
        const card = document.getElementById("adjunto_card_" + id);

        if(card){
            card.dataset.titulo = titulo;
            card.dataset.desc = descripcion;
            card.dataset.fecha = fecha;

            const tituloCard = card.querySelector(".adjunto-title");
            const fechaCard = card.querySelector(".adjunto-date");

            if(tituloCard){
                tituloCard.textContent = titulo;
            }

            if(fechaCard){
                fechaCard.textContent = fecha;
            }
        }

        adjuntoDetalleActual.titulo = titulo;
        adjuntoDetalleActual.desc = descripcion;
        adjuntoDetalleActual.fecha = fecha;

        Object.keys(adjuntosSeleccionadosPorContexto).forEach(function(contexto){

            const lista = adjuntosSeleccionadosPorContexto[contexto] || [];

            lista.forEach(function(archivo){
                if(String(archivo.id) === id){
                    archivo.titulo = titulo;
                    archivo.desc = descripcion;
                    archivo.fecha = fecha;
                }
            });

            actualizarAdjuntosFormulario(contexto);
        });

        if(adjuntosSeleccionadosModal.length > 0){
            actualizarPanelArchivosSeleccionados();
        }else if(card){
            abrirDetalleAdjunto(card);
        }

    })
    .catch(function(error){
        alert(error && error.message ? error.message : "No se pudieron guardar los cambios.");
    })
    .finally(function(){
        if(boton){
            boton.disabled = false;
            boton.textContent = textoOriginal || "GUARDAR CAMBIOS";
        }
    });
}

function abrirPrevisualizacionAdjunto(evento, boton){

    if(evento){
        evento.preventDefault();
        evento.stopPropagation();
    }

    const card = boton ? boton.closest(".adjunto-card") : null;

    if(!card){
        return false;
    }

    const url = String(card.dataset.url || "").trim();
    const categoria = String(card.dataset.cat || "documento").toLowerCase();
    const titulo = String(card.dataset.titulo || "Previsualización");

    if(url === ""){
        alert("No se encontró la ruta del archivo.");
        return false;
    }

    const modal = document.getElementById("adjuntoVisorModal");
    const contenido = document.getElementById("adjuntoVisorContenido");
    const tituloModal = document.getElementById("adjuntoVisorTitulo");

    if(!modal || !contenido || !tituloModal){
        alert("No se pudo abrir el visor.");
        return false;
    }

    cerrarPrevisualizacionAdjunto();

    tituloModal.textContent = titulo;
    contenido.innerHTML = "";

    let elemento = null;

    if(categoria === "imagen"){

        elemento = document.createElement("img");
        elemento.src = url;
        elemento.alt = titulo;

    }else if(categoria === "video"){

        elemento = document.createElement("video");
        elemento.src = url;
        elemento.controls = true;
        elemento.autoplay = true;
        elemento.playsInline = true;
        elemento.preload = "metadata";

    }else if(categoria === "audio"){

        elemento = document.createElement("audio");
        elemento.src = url;
        elemento.controls = true;
        elemento.autoplay = true;
        elemento.preload = "metadata";

    }else if(categoria === "pdf"){

        elemento = document.createElement("iframe");
        elemento.src = url;
        elemento.title = titulo;

    }else{

        const bloque = document.createElement("div");
        bloque.className = "adjunto-visor-documento";
        bloque.innerHTML =
            "<div>Este tipo de archivo no puede mostrarse directamente en el navegador.</div>" +
            '<a href="' + escaparHtmlAdjunto(url) + '" target="_blank" rel="noopener">ABRIR ARCHIVO</a>';

        elemento = bloque;
    }

    contenido.appendChild(elemento);
    modal.classList.add("show");
    document.body.style.overflow = "hidden";

    return false;
}

function cerrarPrevisualizacionAdjunto(){

    const modal = document.getElementById("adjuntoVisorModal");
    const contenido = document.getElementById("adjuntoVisorContenido");

    if(contenido){
        const medios = contenido.querySelectorAll("audio, video");

        medios.forEach(function(medio){
            try{
                medio.pause();
                medio.removeAttribute("src");
                medio.load();
            }catch(error){}
        });

        contenido.innerHTML = "";
    }

    if(modal){
        modal.classList.remove("show");
    }

    if(
        !document.getElementById("adjuntosModal") ||
        !document.getElementById("adjuntosModal").classList.contains("show")
    ){
        document.body.style.overflow = "";
    }else{
        document.body.style.overflow = "hidden";
    }
}

function cerrarVisorAlFondo(evento){

    if(evento && evento.target && evento.target.id === "adjuntoVisorModal"){
        cerrarPrevisualizacionAdjunto();
    }
}

document.addEventListener("keydown", function(evento){

    if(evento.key === "Escape"){

        const visor = document.getElementById("adjuntoVisorModal");

        if(visor && visor.classList.contains("show")){
            cerrarPrevisualizacionAdjunto();
        }
    }

});

function abrirDetalleAdjunto(card){

    /*
       La tarjeta no selecciona ni agrega archivos.
       Las únicas acciones válidas son:
       1. Play para previsualizar.
       2. Checklist para seleccionar.
    */
    return false;

}

function previsualizarAdjunto(){

    if(!adjuntoDetalleActual) return;

    let visor=document.getElementById("visorAdjuntoModal");

    if(!visor){

        document.body.insertAdjacentHTML("beforeend",`

<div id="visorAdjuntoModal"
style="
position:fixed;
left:0;
top:0;
width:100%;
height:100%;
background:rgba(0,0,0,.75);
z-index:999999;
display:flex;
align-items:center;
justify-content:center;
">

<div
style="
width:90%;
height:90%;
background:#fff;
border-radius:10px;
overflow:hidden;
position:relative;
">

<button
type="button"
onclick="document.getElementById('visorAdjuntoModal').remove();"
style="
position:absolute;
right:15px;
top:15px;
width:38px;
height:38px;
border:none;
border-radius:50%;
cursor:pointer;
font-size:22px;
">

✕

</button>

<div
id="visorContenidoAdjunto"
style="
width:100%;
height:100%;
padding-top:50px;
box-sizing:border-box;
">

</div>

</div>

</div>

`);

        visor=document.getElementById("visorAdjuntoModal");

    }

    let cont=document.getElementById("visorContenidoAdjunto");

    let url=adjuntoDetalleActual.url.toLowerCase();

    if(url.endsWith(".jpg")||
       url.endsWith(".jpeg")||
       url.endsWith(".png")||
       url.endsWith(".gif")||
       url.endsWith(".webp")){

        cont.innerHTML=
        "<img src='"+adjuntoDetalleActual.url+"' style='max-width:100%;max-height:100%;display:block;margin:auto;'>";

    }else if(url.endsWith(".mp4")){

        cont.innerHTML=
        "<video controls autoplay style='width:100%;height:100%;'><source src='"+adjuntoDetalleActual.url+"'></video>";

    }else if(url.endsWith(".mp3")){

        cont.innerHTML=
        "<div style='padding:40px'><audio controls autoplay style='width:100%'><source src='"+adjuntoDetalleActual.url+"'></audio></div>";

    }else if(url.endsWith(".pdf")){

        cont.innerHTML=
        "<iframe src='"+adjuntoDetalleActual.url+"' style='width:100%;height:100%;border:none'></iframe>";

    }else{

        window.open(adjuntoDetalleActual.url,"_blank");

    }

}    
    
    

function agregarAdjuntoActual(cerrarModal = true){

    if(!adjuntoContextoActual){
        return;
    }

    /*
       Solo los archivos marcados mediante el checklist se agregan.
       El borde naranja de "recién subido" no equivale a selección.
    */
    if(adjuntosSeleccionadosModal.length === 0){
        alert("Marca al menos un archivo usando el checklist.");
        return;
    }

    const listaAnterior =
        adjuntosSeleccionadosPorContexto[adjuntoContextoActual] || [];

    /*
       Conservar únicamente un posible archivo antiguo sin ID de repositorio.
       Los demás adjuntos quedan sincronizados exactamente con los checks.
    */
    const listaNueva = listaAnterior.filter(function(archivo){
        return String(archivo.id || "") === "actual";
    });

    adjuntosSeleccionadosModal.forEach(function(idSeleccionado){

        const card = document.getElementById(
            "adjunto_card_" + String(idSeleccionado)
        );

        if(!card){
            return;
        }

        const nuevoAdjunto = {
            id: String(card.dataset.id || ""),
            titulo: card.dataset.titulo || "",
            desc: card.dataset.desc || "",
            url: card.dataset.url || "",
            ext: card.dataset.ext || "",
            cat: card.dataset.cat || "",
            icon: card.dataset.icon || "📄",
            fecha: card.dataset.fecha || ""
        };

        if(
            nuevoAdjunto.id !== "" &&
            !listaNueva.some(function(archivo){
                return String(archivo.id) === nuevoAdjunto.id;
            })
        ){
            listaNueva.push(nuevoAdjunto);
        }

    });

    listaNueva.sort(function(a, b){
        return compararNombresAdjuntosNaturales(
            a.titulo || "",
            b.titulo || ""
        );
    });

    adjuntosSeleccionadosPorContexto[adjuntoContextoActual] = listaNueva;

    /*
       Los archivos confirmados conservan el check y siguen en ARCHIVOS NUEVOS,
       pero dejan de parpadear y pierden el borde naranja.
    */
    adjuntosNuevosPendientesResaltado =
        adjuntosNuevosPendientesResaltado.filter(function(idPendiente){
            return !adjuntosSeleccionadosModal.includes(String(idPendiente));
        });

    actualizarAdjuntosFormulario(adjuntoContextoActual);
    aplicarDestacadoAdjuntosNuevos();

    if(cerrarModal){
        cerrarAdjuntosModal();
    }

}


function formatearDuracionAdjunto(segundos){
    segundos = Math.max(0, Math.round(Number(segundos) || 0));
    const horas = Math.floor(segundos / 3600);
    const minutos = Math.floor((segundos % 3600) / 60);
    const resto = segundos % 60;
    return String(horas).padStart(2,'0') + ':' + String(minutos).padStart(2,'0') + ':' + String(resto).padStart(2,'0');
}

function calcularDuracionDesdeUrl(url, boton){
    if(!url){ alert('No se encontró la ruta del archivo adjunto.'); return; }
    const campo = document.querySelector('form input[name="duracion"]');
    if(!campo){ alert('No se encontró el campo Duración.'); return; }

    const textoOriginal = boton ? boton.textContent : '';
    if(boton){ boton.disabled = true; boton.textContent = 'Calculando...'; }

    const medio = document.createElement('video');
    medio.preload = 'metadata';
    medio.muted = true;
    medio.style.display = 'none';
    document.body.appendChild(medio);

    let terminado = false;
    const limpiar = function(){
        if(terminado){ return; }
        terminado = true;
        medio.removeAttribute('src');
        medio.load();
        medio.remove();
        if(boton){ boton.disabled = false; boton.textContent = textoOriginal || 'Calcular duración'; }
    };

    medio.onloadedmetadata = function(){
        const duracion = Number(medio.duration);
        if(!Number.isFinite(duracion) || duracion <= 0){
            limpiar();
            alert('No se pudo obtener una duración válida del archivo.');
            return;
        }
        campo.value = formatearDuracionAdjunto(duracion);
        campo.dispatchEvent(new Event('input', {bubbles:true}));
        campo.dispatchEvent(new Event('change', {bubbles:true}));
        limpiar();
        const menu = boton ? boton.closest('.noticia-adjunto-remove') : null;
        if(menu){ menu.classList.remove('show'); }
    };

    medio.onerror = function(){
        limpiar();
        alert('El navegador no pudo leer la duración de este archivo. Verifica que sea un audio o video válido.');
    };

    setTimeout(function(){
        if(!terminado){
            limpiar();
            alert('La lectura de la duración tardó demasiado. Intenta nuevamente.');
        }
    }, 15000);

    medio.src = url;
}

function calcularDuracionAdjunto(contexto, index, boton){
    const lista = adjuntosSeleccionadosPorContexto[contexto] || [];
    const adjunto = lista[index];
    if(!adjunto){ alert('No se encontró el archivo adjunto seleccionado.'); return; }
    calcularDuracionDesdeUrl(adjunto.url || '', boton);
}

function actualizarAdjuntosFormulario(contexto){
    let lista = adjuntosSeleccionadosPorContexto[contexto] || [];
    let contenedor = document.getElementById("lista_adjuntos_" + contexto);
    let input = document.getElementById("adjunto_id_" + contexto);
    if(input){ input.value = lista.map(a => a.id).join(","); }
    if(!contenedor){ return; }
    contenedor.innerHTML = "";
    lista.forEach((a, index) => {
        let preview = "";
        if(a.cat === "imagen"){ preview = `<img src="${escaparAttrAdjunto(a.url)}" alt="">`; }
        else if(a.cat === "video"){ preview = `<video src="${escaparAttrAdjunto(a.url)}" muted preload="metadata" playsinline></video>`; }
        else{ preview = escaparHtmlAdjunto(a.icon || "📄"); }
        let card = document.createElement("div");
        card.className = "noticia-adjunto-card";
        card.setAttribute("title", a.titulo || "");
        card.setAttribute("data-tooltip", a.titulo || "");
        let botonOcr = "";
        if(a.cat === "imagen"){
            botonOcr = '<button type="button" onclick="event.stopPropagation(); abrirOCRModal(\'' + escaparAttrAdjunto(a.url) + '\');">Convertir a texto</button>';
        }
        let botonDuracion = "";
        if(contexto === "radio" && (a.cat === "audio" || a.cat === "video")){
            botonDuracion = '<button type="button" onclick="event.stopPropagation(); calcularDuracionAdjunto(\'' + contexto + '\', ' + index + ', this);">Calcular duración</button>';
        }
        card.innerHTML = `
            <div class="noticia-adjunto-preview">${preview}</div>
            <button type="button" class="noticia-adjunto-menu-btn" onclick="event.stopPropagation(); mostrarEliminarAdjunto('${contexto}', ${index})">⋮</button>
            <div id="remove_${contexto}_${index}" class="noticia-adjunto-remove">
                <span class="remove-x" onclick="event.stopPropagation(); cerrarEliminarAdjunto('${contexto}', ${index})">×</span>
                <button type="button" onclick="event.stopPropagation(); eliminarAdjuntoSeleccionado('${contexto}', ${index})">Eliminar</button>
                ${botonDuracion}
                ${botonOcr}
            </div>`;
        contenedor.appendChild(card);
    });
}
function mostrarEliminarAdjunto(contexto, index){ document.querySelectorAll(".noticia-adjunto-remove").forEach(e => e.classList.remove("show")); let box=document.getElementById("remove_"+contexto+"_"+index); if(box){box.classList.add("show");} }
function cerrarEliminarAdjunto(contexto, index){ let box=document.getElementById("remove_"+contexto+"_"+index); if(box){box.classList.remove("show");} }
function eliminarAdjuntoSeleccionado(contexto, index){
    if(!adjuntosSeleccionadosPorContexto[contexto]){return;}
    const eliminado = adjuntosSeleccionadosPorContexto[contexto][index];
    if(eliminado && eliminado.es_actual){
        const bandera = document.getElementById('eliminar_archivo_actual');
        if(bandera){ bandera.value = '1'; }
    }
    adjuntosSeleccionadosPorContexto[contexto].splice(index,1);
    actualizarAdjuntosFormulario(contexto);
}
function escaparHtmlAdjunto(texto){ return String(texto || "").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"); }
function escaparAttrAdjunto(texto){ return escaparHtmlAdjunto(texto).replace(/`/g,"&#096;"); }
function abrirSelectorCargaAdjuntos(){ let input=document.getElementById("inputCargaAdjuntos"); input.value=""; input.click(); }
function cargarArchivosAdjuntos(input){
    let archivos=Array.from(input.files || []); if(archivos.length===0){return;}
    abrirClasificacionArchivos(archivos, function(files, clasificacion){ ejecutarCargaAdjuntosClasificada(files, clasificacion); });
    input.value="";
}
function ejecutarCargaAdjuntosClasificada(archivos, clasificacion){
    let lista=document.getElementById("adjuntosUploadList"); lista.innerHTML="";
    archivos.forEach((archivo,index)=>{
        let item=document.createElement("div"); item.className="adjuntos-upload-item"; item.innerHTML="Cargando: "+escaparHtmlAdjunto(archivo.name); lista.appendChild(item);
        let formData=new FormData(); formData.append("ajax_upload_adjunto","1"); formData.append("archivo",archivo); formData.append("region_clasificacion",clasificacion.region); formData.append("tipo_medio_clasificacion",clasificacion.tipo); formData.append("medio_id_clasificacion",clasificacion.medio_id);
        console.log("SUBIENDO DESDE REPOSITORIO_NOTICIAS");

fetch("<?php echo $dashboard_actual; ?>?modulo=noticias",{
    method:"POST",
    body:formData
})
.then(function(respuesta){
    return respuesta.text().then(function(texto){
        var contenido = String(texto || "").trim();
        var data = null;

        try {
            data = JSON.parse(contenido);
        } catch (errorDirecto) {
            var inicioJson = contenido.lastIndexOf('{"ok"');

            if (inicioJson === -1) {
                throw new Error("El servidor no devolvió una respuesta válida.");
            }

            data = JSON.parse(contenido.substring(inicioJson));
        }

        if (!respuesta.ok && (!data || data.ok !== true)) {
            throw new Error((data && data.mensaje) ? data.mensaje : "Error del servidor.");
        }

        return data;
    });
})
.then(function(data){
    if(data.ok){
        item.classList.add("ok");
        item.innerHTML="✓ "+escaparHtmlAdjunto(archivo.name)+" cargado correctamente";

        const nuevoIdAdjunto = String(data.id || "");

        if(
            nuevoIdAdjunto !== "" &&
            !adjuntosNuevosDestacados.includes(nuevoIdAdjunto)
        ){
            adjuntosNuevosDestacados.push(nuevoIdAdjunto);
        }

        if(
            nuevoIdAdjunto !== "" &&
            !adjuntosNuevosPendientesResaltado.includes(nuevoIdAdjunto)
        ){
            adjuntosNuevosPendientesResaltado.push(nuevoIdAdjunto);
        }

        adjuntoDetalleActual={
            id:data.id,
            titulo:data.titulo||archivo.name,
            desc:"",
            url:"uploads/"+(data.archivo||""),
            ext:(archivo.name.split(".").pop()||"").toUpperCase(),
            cat:obtenerCategoriaAdjunto(archivo.name),
            icon:obtenerIconoAdjunto(archivo.name),
            fecha:new Date().toISOString().slice(0,10)
        };

        /* El archivo queda resaltado, pero no se adjunta hasta marcar su checklist. */
/* ===== NUEVO ===== */
setTimeout(function(){

    cambiarTabAdjuntos("repo");

    if(typeof refrescarRepositorioAdjuntos==="function"){
        refrescarRepositorioAdjuntos();
    }

},300);
/* ===== FIN NUEVO ===== */
    }else{
        item.classList.add("error");
        item.innerHTML="Error: "+escaparHtmlAdjunto(data.mensaje||archivo.name);
    }
})
.catch(function(error){
    item.classList.add("error");
    item.innerHTML="Error: "+escaparHtmlAdjunto(error.message||archivo.name);
});
    });
}
function obtenerCategoriaAdjunto(nombre){ let ext=(nombre.split(".").pop()||"").toLowerCase(); if(["jpg","jpeg","png","gif","webp"].includes(ext)){return "imagen";} if(["mp4","webm","mov","avi","mkv"].includes(ext)){return "video";} if(["mp3","wav","aac","ogg","m4a"].includes(ext)){return "audio";} if(ext==="pdf"){return "pdf";} return "documento"; }
function obtenerIconoAdjunto(nombre){ let cat=obtenerCategoriaAdjunto(nombre); if(cat==="imagen"){return "🖼";} if(cat==="video"){return "🎬";} if(cat==="audio"){return "🎧";} if(cat==="pdf"){return "📕";} return "📄"; }


/* =========================
   SELECTOR MULTIPLE DE ETIQUETAS / CLIENTES
========================= */
const clientesDisponibles = <?php
    $etiquetas_formulario = [];

    $consulta_etiquetas_formulario = $conn->query(
        "SELECT nombre
         FROM etiquetas
         WHERE estado='activo'
         ORDER BY nombre ASC"
    );

    if ($consulta_etiquetas_formulario) {
        while ($fila_etiqueta = $consulta_etiquetas_formulario->fetch_assoc()) {
            $etiquetas_formulario[] = $fila_etiqueta['nombre'];
        }
    }

    echo json_encode(
        $etiquetas_formulario,
        JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
    );
?>;

let clientesSeleccionados = { prensa: [], radio: [], redes: [] };

/* Precargar las etiquetas guardadas al abrir el formulario de edición. */
function precargarEtiquetasEdicion(){
    ['prensa', 'radio', 'redes'].forEach(function(contexto){
        const hidden = document.getElementById('etiquetas_' + contexto);
        if(!hidden){ return; }

        const etiquetasGuardadas = String(hidden.value || '')
            .split(',')
            .map(function(etiqueta){ return etiqueta.trim(); })
            .filter(function(etiqueta, indice, lista){
                return etiqueta !== '' && lista.indexOf(etiqueta) === indice;
            });

        clientesSeleccionados[contexto] = etiquetasGuardadas;
        actualizarClientesSeleccionados(contexto);
    });
}

document.addEventListener('DOMContentLoaded', precargarEtiquetasEdicion);

function enfocarBuscadorClientes(contexto){
    let input = document.getElementById("cliente_buscar_" + contexto);
    if(input){ input.focus(); abrirListaClientes(contexto); }
}

function abrirListaClientes(contexto){
    renderListaClientes(contexto);
    let dd = document.getElementById("clientes_dropdown_" + contexto);
    if(dd){ dd.classList.add("show"); }
}

function cerrarListasClientes(){
    document.querySelectorAll(".clientes-dropdown").forEach(dd => dd.classList.remove("show"));
}

function filtrarListaClientes(contexto){
    renderListaClientes(contexto);

    let input = document.getElementById("cliente_buscar_" + contexto);
    let dd = document.getElementById("clientes_dropdown_" + contexto);

    /* Después de elegir una etiqueta el listado se cierra. Al comenzar a
       escribir la siguiente, vuelve a abrirse sin necesitar otro clic. */
    if(input && dd && input.value.trim() !== ""){
        dd.classList.add("show");
    }
}

function manejarTecladoClientes(evento, contexto){
    let dd = document.getElementById("clientes_dropdown_" + contexto);

    if(evento.key === "Escape"){
        if(dd){ dd.classList.remove("show"); }
        return;
    }

    if(evento.key !== "Enter"){
        return;
    }

    evento.preventDefault();
    evento.stopPropagation();

    let primeraOpcion = dd ? dd.querySelector(".cliente-option[data-etiqueta]") : null;
    if(!primeraOpcion){
        return;
    }

    agregarClienteEtiqueta(contexto, primeraOpcion.getAttribute("data-etiqueta"));
}

function renderListaClientes(contexto){
    let dd = document.getElementById("clientes_dropdown_" + contexto);
    let input = document.getElementById("cliente_buscar_" + contexto);
    if(!dd || !input){ return; }

    let q = input.value.toLowerCase().trim();
    let seleccionados = clientesSeleccionados[contexto] || [];

    let filtrados = clientesDisponibles.filter(c =>
        c.toLowerCase().includes(q) && !seleccionados.includes(c)
    );

    if(filtrados.length === 0){
        dd.innerHTML = "<div class='cliente-option'>No se encontraron etiquetas.</div>";
        return;
    }

    dd.innerHTML = filtrados.map(c => {
        let safe = c.replace(/'/g, "\\'");
        return "<div class='cliente-option' data-etiqueta='" + c.replace(/&/g, "&amp;").replace(/'/g, "&#39;").replace(/"/g, "&quot;") + "' onclick=\"agregarClienteEtiqueta('" + contexto + "','" + safe + "')\">" + c + "</div>";
    }).join("");
}

function agregarClienteEtiqueta(contexto, cliente){
    if(!clientesSeleccionados[contexto]){ clientesSeleccionados[contexto] = []; }
    if(!clientesSeleccionados[contexto].includes(cliente)){
        clientesSeleccionados[contexto].push(cliente);
    }

    let input = document.getElementById("cliente_buscar_" + contexto);
    let dropdown = document.getElementById("clientes_dropdown_" + contexto);

    if(input){ input.value = ""; }

    actualizarClientesSeleccionados(contexto);
    renderListaClientes(contexto);

    /* Ocultar la lista tras elegir y mantener el foco para la siguiente. */
    if(dropdown){ dropdown.classList.remove("show"); }
    window.setTimeout(function(){
        if(input){ input.focus({preventScroll:true}); }
        if(dropdown){ dropdown.classList.remove("show"); }
    }, 0);
}

function quitarClienteEtiqueta(contexto, cliente){
    if(!clientesSeleccionados[contexto]){ return; }
    clientesSeleccionados[contexto] = clientesSeleccionados[contexto].filter(c => c !== cliente);
    actualizarClientesSeleccionados(contexto);
    renderListaClientes(contexto);
}

function actualizarClientesSeleccionados(contexto){
    let tagsBox = document.getElementById("clientes_tags_" + contexto);
    let hidden = document.getElementById("etiquetas_" + contexto);
    let seleccionados = clientesSeleccionados[contexto] || [];

    if(hidden){ hidden.value = seleccionados.join(", "); }

    if(tagsBox){
        tagsBox.innerHTML = seleccionados.map(c => {
            let safe = c.replace(/'/g, "\\'");
            return "<span class='cliente-tag'><button type='button' onclick=\"event.stopPropagation(); quitarClienteEtiqueta('" + contexto + "','" + safe + "')\">×</button>" + c + "</span>";
        }).join("");
    }

    let input = document.getElementById("cliente_buscar_" + contexto);
    if(input){ input.placeholder = seleccionados.length > 0 ? "" : "Seleccione una opción"; }
}

    
let nuevaEtiquetaContexto = 'prensa';

function abrirNuevaEtiquetaNoticias(contexto){
    nuevaEtiquetaContexto = contexto || 'prensa';

    let overlay = document.getElementById('nuevaEtiquetaNoticiasOverlay');
    let input = document.getElementById('nueva_etiqueta_noticias_nombre');
    let error = document.getElementById('nueva_etiqueta_noticias_error');

    if(error){ error.style.display = 'none'; error.textContent = ''; }
    if(input){ input.value = ''; }
    if(overlay){ overlay.classList.add('show'); }

    cerrarListasClientes();

    setTimeout(function(){
        if(input){ input.focus(); }
    }, 80);
}

function cerrarNuevaEtiquetaNoticias(){
    let overlay = document.getElementById('nuevaEtiquetaNoticiasOverlay');
    if(overlay){ overlay.classList.remove('show'); }
}

function guardarNuevaEtiquetaNoticias(){
    let input = document.getElementById('nueva_etiqueta_noticias_nombre');
    let error = document.getElementById('nueva_etiqueta_noticias_error');
    let boton = document.getElementById('btnGuardarNuevaEtiquetaNoticias');
    let nombre = input ? input.value.trim() : '';

    if(nombre === ''){
        if(error){
            error.textContent = 'Escribe el nombre de la etiqueta.';
            error.style.display = 'block';
        }
        if(input){ input.focus(); }
        return;
    }

    let datos = new FormData();
    datos.append('ajax_guardar_etiqueta', '1');
    datos.append('nombre_etiqueta', nombre);

    if(boton){ boton.disabled = true; boton.textContent = 'REGISTRANDO...'; }
    if(error){ error.style.display = 'none'; error.textContent = ''; }

    fetch(window.location.href, {
        method: 'POST',
        body: datos
    })
    .then(function(respuesta){ return respuesta.text(); })
    .then(function(textoRespuesta){
        /* El dashboard puede imprimir HTML antes del JSON del módulo.
           Extraemos únicamente la respuesta JSON final. */
        let inicioJson = textoRespuesta.lastIndexOf('{"ok"');

        if(inicioJson === -1){
            throw new Error('El servidor no devolvió una respuesta válida.');
        }

        let textoJson = textoRespuesta.substring(inicioJson).trim();
        let data;

        try{
            data = JSON.parse(textoJson);
        }catch(e){
            throw new Error('No se pudo interpretar la respuesta del servidor.');
        }

        if(!data || data.ok !== true){
            throw new Error((data && data.mensaje) ? data.mensaje : 'No se pudo registrar la etiqueta.');
        }

        let nombreGuardado = String(data.nombre || nombre).trim();

        if(nombreGuardado !== '' && !clientesDisponibles.includes(nombreGuardado)){
            clientesDisponibles.push(nombreGuardado);
            clientesDisponibles.sort(function(a,b){
                return a.localeCompare(b, 'es', {sensitivity:'base'});
            });
        }

        let filtroPrincipal = document.getElementById('f_etiqueta');
        if(filtroPrincipal && nombreGuardado !== ''){
            let yaExiste = Array.from(filtroPrincipal.options).some(function(op){
                return op.value === nombreGuardado;
            });
            if(!yaExiste){
                let opcion = document.createElement('option');
                opcion.value = nombreGuardado;
                opcion.textContent = nombreGuardado;
                filtroPrincipal.appendChild(opcion);
            }
        }

        cerrarNuevaEtiquetaNoticias();
        agregarClienteEtiqueta(nuevaEtiquetaContexto, nombreGuardado);
    })
    .catch(function(err){
        if(error){
            error.textContent = err.message || 'No se pudo registrar la etiqueta.';
            error.style.display = 'block';
        }
    })
    .finally(function(){
        if(boton){ boton.disabled = false; boton.textContent = 'REGISTRAR ETIQUETA'; }
    });
}

function teclaNuevaEtiquetaNoticias(event){
    if(event.key === 'Enter'){
        event.preventDefault();
        guardarNuevaEtiquetaNoticias();
    }
}

document.addEventListener("click", function(e){

    if(
        prensaCalendarioAbierto &&
        !document.getElementById("calendar_popup_prensa").contains(e.target) &&
        !document.getElementById("date_display_prensa").contains(e.target)
    ){

        cerrarCalendarioPrensa();

    }

});    
    
document.addEventListener("click", function(e){
    if(!e.target.closest(".clientes-selector")){ cerrarListasClientes(); }
});
    
function normalizarBusquedaMedio(texto){
    return String(texto || '')
        .toLocaleLowerCase('es')
        .normalize('NFD')
        .replace(/[\u0300-\u036f]/g, '')
        .trim();
}

function mostrarMediosPrensa(){
    const lista = document.getElementById('lista_medios_prensa');
    const buscador = document.getElementById('buscar_medio_prensa');
    if(!lista || !buscador){ return; }
    lista.style.display = 'block';
    filtrarMediosPrensa(buscador.value);
}

function filtrarMediosPrensa(texto){
    const lista = document.getElementById('lista_medios_prensa');
    if(!lista){ return; }

    const consulta = normalizarBusquedaMedio(texto);
    let visibles = 0;

    lista.querySelectorAll('.medio-item').forEach(function(item){
        const nombre = normalizarBusquedaMedio(item.dataset.busqueda || item.dataset.valor || item.textContent);
        const coincide = nombre.includes(consulta);
        item.style.display = coincide ? 'block' : 'none';
        if(coincide){ visibles++; }
    });

    let aviso = lista.querySelector('.medio-sin-resultados');
    if(!aviso){
        aviso = document.createElement('div');
        aviso.className = 'medio-sin-resultados';
        aviso.textContent = 'No se encontraron medios.';
        lista.appendChild(aviso);
    }
    aviso.style.display = visibles === 0 ? 'block' : 'none';
    lista.style.display = 'block';
}

function seleccionarMedioPrensa(item){
    const buscador = document.getElementById('buscar_medio_prensa');
    const oculto = document.getElementById('subtipo_medio_prensa');
    const lista = document.getElementById('lista_medios_prensa');
    if(!item || !buscador || !oculto || !lista){ return; }

    const valor = item.dataset.valor || item.textContent.trim();
    buscador.value = valor;
    oculto.value = valor;
    lista.style.display = 'none';

    const costoTexto = String(item.dataset.costo || '').replace(',', '.');
    const coincidenciaCosto = costoTexto.match(/([0-9]+(?:\.[0-9]+)?)/);
    costoCm2PrensaSeleccionado = coincidenciaCosto ? parseFloat(coincidenciaCosto[1]) : 0;
    actualizarValorizacionPrensaVista();
}

document.addEventListener('click', function(e){
    const selector = document.querySelector('.medio-selector');
    const lista = document.getElementById('lista_medios_prensa');
    if(selector && lista && !selector.contains(e.target)){
        lista.style.display = 'none';
    }
});
    
    

function actualizarTipoRadioTv(tipo){
    const tipoOculto = document.getElementById('radio_tipo_medio_hidden');
    const buscador = document.getElementById('buscar_medio_radio');
    const medioOculto = document.getElementById('subtipo_medio_radio');
    const lista = document.getElementById('lista_medios_radio');

    if(tipoOculto){ tipoOculto.value = tipo; }
    if(buscador){ buscador.value = ''; }
    if(medioOculto){ medioOculto.value = ''; }
    if(lista){ lista.style.display = 'none'; }
}

function mostrarMediosRadio(){
    const lista = document.getElementById('lista_medios_radio');
    const buscador = document.getElementById('buscar_medio_radio');
    if(!lista || !buscador){ return; }

    lista.style.display = 'block';
    filtrarMediosRadio(buscador.value);
}

function filtrarMediosRadio(texto){
    const lista = document.getElementById('lista_medios_radio');
    const tipoOculto = document.getElementById('radio_tipo_medio_hidden');
    if(!lista || !tipoOculto){ return; }

    const consulta = normalizarBusquedaMedio(texto);
    const tipoSeleccionado = tipoOculto.value || 'Radio';
    let visibles = 0;

    lista.querySelectorAll('.medio-item').forEach(function(item){
        const nombre = normalizarBusquedaMedio(
            item.dataset.busqueda || item.dataset.valor || item.textContent
        );
        const tipoItem = item.dataset.tipo || '';
        const coincideTipo = (
            tipoItem === 'Radio' ||
            tipoItem === 'Televisión' ||
            tipoItem === 'Television'
        );
        const coincideTexto = nombre.includes(consulta);
        const visible = coincideTipo && coincideTexto;

        item.style.display = visible ? 'block' : 'none';
        if(visible){ visibles++; }
    });

    let aviso = lista.querySelector('.medio-sin-resultados');
    if(!aviso){
        aviso = document.createElement('div');
        aviso.className = 'medio-sin-resultados';
        aviso.textContent = 'No se encontraron medios.';
        lista.appendChild(aviso);
    }

    aviso.style.display = visibles === 0 ? 'block' : 'none';
    lista.style.display = 'block';
}

function seleccionarMedioRadio(item){
    const buscador = document.getElementById('buscar_medio_radio');
    const oculto = document.getElementById('subtipo_medio_radio');
    const lista = document.getElementById('lista_medios_radio');
    if(!item || !buscador || !oculto || !lista){ return; }

    const valor = item.dataset.valor || item.textContent.trim();
    buscador.value = valor;
    oculto.value = valor;
    lista.style.display = 'none';
}

document.addEventListener('click', function(e){
    const buscador = document.getElementById('buscar_medio_radio');
    const lista = document.getElementById('lista_medios_radio');

    if(
        buscador &&
        lista &&
        !buscador.closest('.medio-selector').contains(e.target)
    ){
        lista.style.display = 'none';
    }
});





function actualizarTipoRedesWeb(tipo){
    const tipoOculto = document.getElementById('redes_tipo_medio_hidden');
    const buscador = document.getElementById('buscar_medio_redes');
    const medioOculto = document.getElementById('subtipo_medio_redes');
    const lista = document.getElementById('lista_medios_redes');

    if(tipoOculto){ tipoOculto.value = tipo; }
    if(buscador){ buscador.value = ''; }
    if(medioOculto){ medioOculto.value = ''; }
    if(lista){ lista.style.display = 'none'; }
}

function mostrarMediosRedes(){
    const lista = document.getElementById('lista_medios_redes');
    const buscador = document.getElementById('buscar_medio_redes');
    if(!lista || !buscador){ return; }

    lista.style.display = 'block';
    filtrarMediosRedes(buscador.value);
}

function filtrarMediosRedes(texto){
    const lista = document.getElementById('lista_medios_redes');
    const tipoOculto = document.getElementById('redes_tipo_medio_hidden');
    if(!lista || !tipoOculto){ return; }

    const consulta = normalizarBusquedaMedio(texto);
    const tipoSeleccionado = tipoOculto.value || 'Redes Sociales';
    let visibles = 0;

    lista.querySelectorAll('.medio-item').forEach(function(item){
        const nombre = normalizarBusquedaMedio(
            item.dataset.busqueda || item.dataset.valor || item.textContent
        );
        const tipoItem = item.dataset.tipo || '';
        const coincideTipo = tipoItem === tipoSeleccionado;
        const coincideTexto = nombre.includes(consulta);
        const visible = coincideTipo && coincideTexto;

        item.style.display = visible ? 'block' : 'none';
        if(visible){ visibles++; }
    });

    let aviso = lista.querySelector('.medio-sin-resultados');
    if(!aviso){
        aviso = document.createElement('div');
        aviso.className = 'medio-sin-resultados';
        aviso.textContent = 'No se encontraron medios.';
        lista.appendChild(aviso);
    }

    aviso.style.display = visibles === 0 ? 'block' : 'none';
    lista.style.display = 'block';
}

function seleccionarMedioRedes(item){
    const buscador = document.getElementById('buscar_medio_redes');
    const oculto = document.getElementById('subtipo_medio_redes');
    const lista = document.getElementById('lista_medios_redes');
    if(!item || !buscador || !oculto || !lista){ return; }

    const valor = item.dataset.valor || item.textContent.trim();
    buscador.value = valor;
    oculto.value = valor;
    lista.style.display = 'none';
}

document.addEventListener('click', function(e){
    const buscador = document.getElementById('buscar_medio_redes');
    const lista = document.getElementById('lista_medios_redes');

    if(
        buscador &&
        lista &&
        buscador.closest('.medio-selector') &&
        !buscador.closest('.medio-selector').contains(e.target)
    ){
        lista.style.display = 'none';
    }
});



const MEDIDAS_COLUMNAS_PRENSA = {1:4.02,2:8.34,3:12.77,4:17.15,5:21.52,6:25.90};
const MEDIDAS_MODULOS_PRENSA = {1:1.55,2:3.49,3:5.43,4:7.37,5:9.31,6:11.25,7:13.19,8:15.13,9:17.07,10:19.01,11:21.00,12:22.90,13:24.84,14:26.78,15:28.72,16:30.66,17:32.60,18:34.54};
let costoCm2PrensaSeleccionado = 0;

function actualizarValorizacionPrensaVista(){
    const caja = document.getElementById('valorizacion_prensa_resumen');
    if(!caja){ return; }

    let areaTotal = 0;
    document.querySelectorAll('#prensa_paginas_contenedor .prensa-pagina-item').forEach(function(bloque){
        const columnas = parseInt((bloque.querySelector('select[name="columnas"], select[name="columnas_extra[]"]') || {}).value || 0, 10);
        const modulos = parseInt((bloque.querySelector('select[name="modulos"], select[name="modulos_extra[]"]') || {}).value || 0, 10);
        if(MEDIDAS_COLUMNAS_PRENSA[columnas] && MEDIDAS_MODULOS_PRENSA[modulos]){
            areaTotal += MEDIDAS_COLUMNAS_PRENSA[columnas] * MEDIDAS_MODULOS_PRENSA[modulos];
        }
    });

    const valor = areaTotal * costoCm2PrensaSeleccionado;
    const areaEl = document.getElementById('val_prensa_area');
    const costoEl = document.getElementById('val_prensa_costo');
    const totalEl = document.getElementById('val_prensa_total');
    if(areaEl){ areaEl.textContent = areaTotal.toFixed(2) + ' cm²'; }
    if(costoEl){ costoEl.textContent = 'S/ ' + costoCm2PrensaSeleccionado.toFixed(2) + ' por cm²'; }
    if(totalEl){ totalEl.textContent = 'S/ ' + valor.toFixed(2); }
}

document.addEventListener('change', function(e){
    if(e.target && e.target.closest && e.target.closest('#prensa_paginas_contenedor')){
        actualizarValorizacionPrensaVista();
    }
});

function agregarOtraPaginaPrensa(event){
    if(event){
        event.preventDefault();
        event.stopPropagation();
    }

    const contenedor = document.getElementById('prensa_paginas_contenedor');
    const accion = document.getElementById('prensa_agregar_pagina_accion');

    if(!contenedor || !accion){
        return false;
    }

    const nuevoBloque = document.createElement('div');
    nuevoBloque.className = 'prensa-row prensa-pagina-item';
    nuevoBloque.style.marginTop = '22px';
    nuevoBloque.innerHTML = `
        <div class="prensa-field">
            <label>Página <span class="req">*</span></label>
            <input class="prensa-input" type="text" name="pagina_extra[]" required>
        </div>

        <div class="prensa-field">
            <label>Columnas <span class="req">*</span></label>
            <select class="prensa-select" name="columnas_extra[]" required>
                <option value="">Seleccionar</option>
                <option>1</option><option>2</option><option>3</option>
                <option>4</option><option>5</option><option>6</option>
            </select>
        </div>

        <div class="prensa-field">
            <label>Módulos <span class="req">*</span></label>
            <select class="prensa-select" name="modulos_extra[]" required>
                <option value="">Seleccionar</option>
                <option>1</option><option>2</option><option>3</option><option>4</option>
                <option>5</option><option>6</option><option>7</option><option>8</option>
                <option>9</option><option>10</option><option>11</option><option>12</option>
                <option>13</option><option>14</option><option>15</option><option>16</option><option>17</option><option>18</option>
            </select>
        </div>
    `;

    contenedor.insertBefore(nuevoBloque, accion);
    actualizarValorizacionPrensaVista();

    const primerCampo = nuevoBloque.querySelector('input');
    if(primerCampo){
        primerCampo.focus();
    }

    return false;
}

/* ==========================================
   ACCIONES Y SELECCIÓN DE NOTICIAS
========================================== */
function obtenerChecksNoticias(){
    return Array.from(document.querySelectorAll('.news-check'));
}

function obtenerIdsNoticiasSeleccionadas(){
    return obtenerChecksNoticias()
        .filter(function(check){ return check.checked; })
        .map(function(check){ return parseInt(check.value, 10); })
        .filter(function(id){ return Number.isInteger(id) && id > 0; });
}

function actualizarSeleccionNoticias(){
    const checks = obtenerChecksNoticias();
    const seleccionadas = checks.filter(function(check){ return check.checked; }).length;
    const boton = document.getElementById('btnSeleccionarTodasNoticias');

    if(!boton){ return; }

    boton.style.display = seleccionadas > 0 ? 'inline-block' : 'none';
    boton.textContent = checks.length > 0 && seleccionadas === checks.length
        ? 'DESELECCIONAR TODAS'
        : 'SELECCIONAR TODAS';
}

function alternarSeleccionTodasNoticias(){
    const checks = obtenerChecksNoticias();
    if(checks.length === 0){ return; }

    const todasSeleccionadas = checks.every(function(check){ return check.checked; });

    checks.forEach(function(check){
        check.checked = !todasSeleccionadas;
    });

    actualizarSeleccionNoticias();
}

function toggleMenuAccionesNoticias(event){
    if(event){ event.stopPropagation(); }

    const menu = document.getElementById('menuAccionesNoticias');
    if(menu){ menu.classList.toggle('show'); }
}

function cerrarMenuAccionesNoticias(){
    const menu = document.getElementById('menuAccionesNoticias');
    if(menu){ menu.classList.remove('show'); }
}

function ejecutarAccionNoticias(accion){
    cerrarMenuAccionesNoticias();

    const ids = obtenerIdsNoticiasSeleccionadas();

    if(ids.length === 0){
        alert('Selecciona al menos una noticia.');
        return;
    }

    let mensaje = '';
    if(accion === 'archivar'){
        mensaje = '¿Archivar las noticias seleccionadas?';
    }else if(accion === 'desarchivar'){
        mensaje = '¿Desarchivar las noticias seleccionadas?';
    }else if(accion === 'eliminar'){
        mensaje = '¿Eliminar definitivamente las noticias seleccionadas?';
    }else{
        return;
    }

    if(!confirm(mensaje)){ return; }

    const campoAccion = document.getElementById('noticias_accion');
    const campoIds = document.getElementById('noticias_ids');
    const formulario = document.getElementById('formAccionesNoticias');

    if(!campoAccion || !campoIds || !formulario){
        alert('No se pudo ejecutar la acción.');
        return;
    }

    campoAccion.value = accion;
    campoIds.value = ids.join(',');
    formulario.submit();
}

document.addEventListener('DOMContentLoaded', function(){
    obtenerChecksNoticias().forEach(function(check){
        check.addEventListener('change', actualizarSeleccionNoticias);
    });

    actualizarSeleccionNoticias();
});

document.addEventListener('click', function(event){
    const envoltura = document.querySelector('.news-actions-wrap');
    if(envoltura && !envoltura.contains(event.target)){
        cerrarMenuAccionesNoticias();
    }
});

document.addEventListener('DOMContentLoaded', function(){
    const formulario = document.querySelector('form.radio-form-layout');
    const duracion = formulario ? formulario.querySelector('input[name="duracion"]') : null;

    if(!formulario || !duracion){ return; }

    function duracionValida(valor){
        const coincidencia = valor.match(/^(\d{1,3}):([0-5]\d):([0-5]\d)$/);
        if(!coincidencia){ return false; }
        return (Number(coincidencia[1]) * 3600 + Number(coincidencia[2]) * 60 + Number(coincidencia[3])) > 0;
    }

    function quitarErrorDuracion(){
        duracion.classList.remove('error', 'hora-error-parpadeo');
        duracion.removeAttribute('aria-invalid');
        const aviso = document.getElementById('duracion_error');
        if(aviso){ aviso.remove(); }
    }

    function mostrarErrorDuracion(){
        duracion.classList.add('error', 'hora-error-parpadeo');
        duracion.setAttribute('aria-invalid', 'true');

        let aviso = document.getElementById('duracion_error');
        if(!aviso){
            aviso = document.createElement('div');
            aviso.id = 'duracion_error';
            aviso.className = 'hora-error-mensaje';
            duracion.insertAdjacentElement('afterend', aviso);
        }

        aviso.textContent = 'Falta agregar la duración o es incorrecta. Use HH:MM:SS';
        duracion.focus();
        duracion.scrollIntoView({behavior:'smooth', block:'center'});
    }

    formulario.addEventListener('submit', function(event){
        if(!duracionValida(duracion.value.trim())){
            event.preventDefault();
            event.stopPropagation();
            mostrarErrorDuracion();
            return false;
        }

        quitarErrorDuracion();
    }, true);

    duracion.addEventListener('input', function(){
        if(duracionValida(duracion.value.trim())){
            quitarErrorDuracion();
        }
    });
});


/* =========================================================
   ESCRITURA RÁPIDA DEL CAMPO HORA (HH:MM:SS)
   - El usuario escribe únicamente números.
   - Mientras escribe, se conserva el buffer completo.
   - Después de 700 ms sin pulsar otra tecla se completa HH:MM:SS.
   - Aunque ya se haya mostrado 10:00:00, si continúa con 02 y 03
     el resultado será 10:02:03, sin perder los números anteriores.
========================================================= */
document.addEventListener('DOMContentLoaded', function () {
    const camposHora = document.querySelectorAll('input[name="hora_nota"]');

    camposHora.forEach(function (campo) {
        if (campo.dataset.horaRapidaActiva === '1') return;
        campo.dataset.horaRapidaActiva = '1';

        let digitos = String(campo.value || '').replace(/\D/g, '').slice(0, 6);
        let temporizador = null;
        let reemplazarAlEscribir = false;

        function formatearHora(valor) {
            const numeros = String(valor || '').replace(/\D/g, '').slice(0, 6);
            if (!numeros) return '';

            const hora = numeros.slice(0, 2).padEnd(2, '0');
            const minutos = numeros.length > 2
                ? numeros.slice(2, 4).padEnd(2, '0')
                : '00';
            const segundos = numeros.length > 4
                ? numeros.slice(4, 6).padEnd(2, '0')
                : '00';

            return hora + ':' + minutos + ':' + segundos;
        }

        function colocarCursorAlFinal() {
            window.requestAnimationFrame(function () {
                const fin = campo.value.length;
                try { campo.setSelectionRange(fin, fin); } catch (e) {}
            });
        }

        function asignarValor(valor) {
            campo.dataset.actualizandoHoraRapida = '1';
            campo.value = valor;
            campo.dispatchEvent(new Event('input', { bubbles: true }));
            delete campo.dataset.actualizandoHoraRapida;
            colocarCursorAlFinal();
        }

        function mostrarDigitosMientrasEscribe() {
            asignarValor(digitos);
        }

        function completarHoraAhora() {
            if (temporizador) {
                window.clearTimeout(temporizador);
                temporizador = null;
            }
            asignarValor(formatearHora(digitos));
        }

        function programarCompletado() {
            if (temporizador) window.clearTimeout(temporizador);

            if (digitos.length >= 6) {
                completarHoraAhora();
                return;
            }

            temporizador = window.setTimeout(function () {
                completarHoraAhora();
            }, 700);
        }

        campo.addEventListener('focus', function () {
            /* Una hora existente se reemplaza al comenzar a escribir. */
            reemplazarAlEscribir = digitos.length > 0;
        });

        campo.addEventListener('keydown', function (evento) {
            if (/^\d$/.test(evento.key)) {
                evento.preventDefault();

                if (reemplazarAlEscribir || digitos.length >= 6) {
                    digitos = '';
                    reemplazarAlEscribir = false;
                }

                digitos += evento.key;
                mostrarDigitosMientrasEscribe();
                programarCompletado();
                return;
            }

            if (evento.key === 'Backspace') {
                evento.preventDefault();
                reemplazarAlEscribir = false;
                digitos = digitos.slice(0, -1);
                mostrarDigitosMientrasEscribe();
                programarCompletado();
                return;
            }

            if (evento.key === 'Delete') {
                evento.preventDefault();
                reemplazarAlEscribir = false;
                digitos = '';
                if (temporizador) window.clearTimeout(temporizador);
                asignarValor('');
                return;
            }

            if (evento.key === ':' || evento.key === ' ') {
                evento.preventDefault();
            }
        });

        campo.addEventListener('paste', function (evento) {
            evento.preventDefault();
            const texto = (evento.clipboardData || window.clipboardData).getData('text');
            const pegados = String(texto || '').replace(/\D/g, '').slice(0, 6);

            if (pegados) {
                reemplazarAlEscribir = false;
                digitos = pegados;
                completarHoraAhora();
            }
        });

        campo.addEventListener('blur', function () {
            reemplazarAlEscribir = false;
            completarHoraAhora();
        });

        /* Respaldo para autocompletado o cambios realizados por el navegador. */
        campo.addEventListener('input', function () {
            if (campo.dataset.actualizandoHoraRapida === '1') return;
            digitos = String(campo.value || '').replace(/\D/g, '').slice(0, 6);
        });

        if (digitos) {
            campo.value = formatearHora(digitos);
        }
    });
});

</script>
<?php include dirname(__DIR__) . "/modal_convertir_texto.php"; ?>
<script src="ocr_noticias.js?v=20260719_1"></script>






    

    
<?php
$lista_etiquetas=[];
$q=$conn->query("SELECT nombre FROM etiquetas WHERE estado='activo' ORDER BY nombre ASC");
if($q){while($r=$q->fetch_assoc()){$lista_etiquetas[]=$r['nombre'];}}
?>
<main class="news-page <?php echo ($modo_formulario == "prensa" ? "form-prensa" : ($modo_formulario == "radio_tv" ? "form-radio-tv" : ($modo_formulario == "redes_web" ? "form-redes-web" : ""))); ?>">

        <aside class="news-filters">
                        <h1>Noticias</h1>

            <div class="type-list">
                <a class="type-list-all" href="dashboard_superadmin.php?modulo=noticias<?php echo $ver_archivadas ? '&archivadas=1' : ''; ?>">
                    Todos los tipos (<?php echo $total_todas; ?>)
                </a>

                <label class="type-check-row <?php echo in_array('Diario', $filtros_tipo, true) ? 'active' : ''; ?>">
                    <input class="filtro-tipo-check" type="checkbox" value="Diario"
                           <?php echo in_array('Diario', $filtros_tipo, true) ? 'checked' : ''; ?>>
                    <span>Diario (<?php echo $total_diario; ?>)</span>
                </label>

                <label class="type-check-row <?php echo in_array('Radio', $filtros_tipo, true) ? 'active' : ''; ?>">
                    <input class="filtro-tipo-check" type="checkbox" value="Radio"
                           <?php echo in_array('Radio', $filtros_tipo, true) ? 'checked' : ''; ?>>
                    <span>Radio (<?php echo $total_radio; ?>)</span>
                </label>

                <label class="type-check-row <?php echo in_array('Redes Sociales', $filtros_tipo, true) ? 'active' : ''; ?>">
                    <input class="filtro-tipo-check" type="checkbox" value="Redes Sociales"
                           <?php echo in_array('Redes Sociales', $filtros_tipo, true) ? 'checked' : ''; ?>>
                    <span>Redes Sociales (<?php echo $total_redes; ?>)</span>
                </label>

                <label class="type-check-row <?php echo in_array('Televisión', $filtros_tipo, true) ? 'active' : ''; ?>">
                    <input class="filtro-tipo-check" type="checkbox" value="Televisión"
                           <?php echo in_array('Televisión', $filtros_tipo, true) ? 'checked' : ''; ?>>
                    <span>Televisión (<?php echo $total_tv; ?>)</span>
                </label>

                <label class="type-check-row <?php echo in_array('Página Web', $filtros_tipo, true) ? 'active' : ''; ?>">
                    <input class="filtro-tipo-check" type="checkbox" value="Página Web"
                           <?php echo in_array('Página Web', $filtros_tipo, true) ? 'checked' : ''; ?>>
                    <span>Páginas Web (<?php echo $total_web; ?>)</span>
                </label>
            </div>

            <div class="filter-block">
                <label>Medio</label>
                <select id="f_medio">
                    <option value="">Todos los medios</option>
                </select>

                <label>Etiquetas</label>
                <select id="f_etiqueta">
                    <option value="">Todas las etiquetas</option>
                    <?php foreach($lista_etiquetas as $et){ ?>
                    <option value="<?php echo htmlspecialchars($et); ?>"><?php echo htmlspecialchars($et); ?></option>
                    <?php } ?>
                </select>

                <label>Departamentos</label>
                <select>
                    <option>Todos los departamentos</option>
                </select>

                <label>Filtrar por fechas</label>

                <div class="custom-date-box">
                    <div id="date_display_noticias" class="date-display" onclick="abrirCalendarioNoticias(event)">
                        <span class="calendar-icon">📅</span>
                        <span id="date_text_noticias"><em>Seleccionar fecha</em></span>
                    </div>

                    <div id="calendar_popup_noticias" class="calendar-popup" onclick="event.stopPropagation()">
                        <div class="calendar-head">
                            <button type="button" onclick="event.stopPropagation(); mesAnteriorNoticias()">‹</button>
                            <div id="calendar_title_noticias" class="calendar-title"></div>
                            <button type="button" onclick="event.stopPropagation(); mesSiguienteNoticias()">›</button>
                        </div>

                        <div class="week-days">
                            <div>Lun</div>
                            <div>Mar</div>
                            <div>Mié</div>
                            <div>Jue</div>
                            <div>Vie</div>
                            <div>Sáb</div>
                            <div>Dom</div>
                        </div>

                        <div id="calendar_days_noticias" class="days-grid"></div>
                    </div>
                </div>

                <button id="btn_aplicar_fecha_noticias" class="btn-filter" type="button" onclick="aplicarFiltroNoticias()">APLICAR FILTROS</button>
                <button class="btn-clear" type="button" onclick="limpiarFiltrosNoticias()">LIMPIAR FILTROS</button>
            </div>
        </aside>

        <section class="news-main">
            <div class="news-top">
                <?php if($modo_formulario == ""){ ?>
                    <div class="news-top-left">
                        <div class="news-actions-wrap">
                            <button
                                type="button"
                                class="btn-news-secondary"
                                onclick="toggleMenuAccionesNoticias(event)">
                                ACCIONES⌄
                            </button>

                            <div id="menuAccionesNoticias" class="news-actions-menu">
                                <?php if($ver_archivadas){ ?>
                                    <button type="button" onclick="ejecutarAccionNoticias('desarchivar')">
                                        ↩ Desarchivar
                                    </button>
                                <?php } else { ?>
                                    <button type="button" onclick="ejecutarAccionNoticias('archivar')">
                                        📦 Archivar
                                    </button>
                                <?php } ?>

                                <button type="button" class="danger" onclick="ejecutarAccionNoticias('eliminar')">
                                    🗑 Eliminar
                                </button>
                            </div>
                        </div>

                        <button
                            type="button"
                            id="btnSeleccionarTodasNoticias"
                            class="btn-news-select-all"
                            onclick="alternarSeleccionTodasNoticias()">
                            SELECCIONAR TODAS
                        </button>

                        <?php if($ver_archivadas){ ?>
                            <button
                                type="button"
                                class="btn-news-secondary"
                                onclick="window.location.href='dashboard_superadmin.php?modulo=noticias';">
                                VOLVER
                            </button>
                        <?php } else { ?>
                            <button
                                type="button"
                                class="btn-news-secondary"
                                onclick="window.location.href='dashboard_superadmin.php?modulo=noticias&archivadas=1';">
                                ARCHIVADAS
                            </button>
                        <?php } ?>
                    </div>

                    <div class="news-top-right">
                        <div class="new-dropdown-wrap">
                            <button class="btn-new" type="button" onclick="toggleNuevaNoticiaMenu(event)">NUEVA NOTICIA⌄</button>
                            <div id="newDropdown" class="new-dropdown">
                                <a href="dashboard_superadmin.php?modulo=noticias&form=prensa">Prensa</a>
                                <a href="dashboard_superadmin.php?modulo=noticias&form=radio_tv">Radio o TV</a>
                                <a href="dashboard_superadmin.php?modulo=noticias&form=redes_web">Redes Sociales o Pags. Web</a>
                            </div>
                        </div>
                    </div>
                <?php } ?>
            </div>

            <form id="formAccionesNoticias" method="POST" style="display:none;">
                <input type="hidden" name="noticias_accion" id="noticias_accion" value="">
                <input type="hidden" name="noticias_ids" id="noticias_ids" value="">
                <?php if($ver_archivadas){ ?>
                    <input type="hidden" name="desde_archivadas" value="1">
                <?php } ?>
            </form>

            <div class="news-divider"></div>

            <?php if($mensaje != ""){ ?>
                <div class="alert-msg"><?php echo htmlspecialchars($mensaje, ENT_QUOTES, 'UTF-8'); ?></div>
            <?php } ?>

            <?php if($modo_formulario == "prensa"){ ?>

                <div class="prensa-wrapper">
                    <a href="dashboard_superadmin.php?modulo=noticias" class="prensa-back">← Volver a Noticias</a>

                    <form method="POST" action="dashboard_superadmin.php?modulo=editar_noticia&id=<?php echo intval($id_editar); ?>" enctype="multipart/form-data" class="prensa-form-layout">

                        <div class="prensa-left">
                            <input type="hidden" name="tipo_medio" value="Diario">

                            <div class="prensa-field">
                                <label>Titular <span class="req">*</span></label>
                                <input class="prensa-input prensa-title-input" type="text" name="titulo" value="<?php echo htmlspecialchars(html_entity_decode((string)($noticia['titulo'] ?? ''), ENT_QUOTES | ENT_HTML5, 'UTF-8'), ENT_QUOTES, 'UTF-8'); ?>" placeholder="Titular de la noticia" required>
                            </div>

                            <div class="prensa-field">
                                <label>Resumen</label>
                                <textarea class="prensa-textarea" name="descripcion" required><?php echo htmlspecialchars($descripcion_editar, ENT_QUOTES, 'UTF-8'); ?></textarea>
                            </div>

                            <div class="prensa-note">* Para convertir una imagen a texto, primero agréguela a Archivos Adjuntos.</div>

                            <div class="prensa-row">
                                <div class="prensa-field">
                                <label>Fecha <span class="req">*</span></label>

                                <div class="custom-date-box">

                                <input
                                    type="hidden"
                                    name="fecha_nota"
                                    id="prensa_fecha_nota"
                                    value="<?php echo htmlspecialchars($noticia['fecha_nota'] ?? date('Y-m-d'), ENT_QUOTES, 'UTF-8'); ?>">

                                <div
                                    id="date_display_prensa"
                                    class="date-display"
                                    onclick="abrirCalendarioPrensa(event)">

                                    <span class="calendar-icon">📅</span>

                                    <span id="date_text_prensa">
                                        <em><?php echo !empty($noticia['fecha_nota']) ? date('d/m/Y', strtotime($noticia['fecha_nota'])) : date('d/m/Y'); ?></em>
                                    </span>

                                </div>

                                <div
                                    id="calendar_popup_prensa"
                                    class="calendar-popup"
                                    onclick="event.stopPropagation()">

                                    <div class="calendar-head">

                                        <button
                                            type="button"
                                            onclick="event.stopPropagation(); mesAnteriorPrensa()">

                                            ‹

                                        </button>

                                        <div
                                            id="calendar_title_prensa"
                                            class="calendar-title">
                                        </div>

                                        <button
                                            type="button"
                                            onclick="event.stopPropagation(); mesSiguientePrensa()">

                                            ›

                                        </button>

                                    </div>

                                    <div class="week-days">
                                        <div>Lun</div>
                                        <div>Mar</div>
                                        <div>Mié</div>
                                        <div>Jue</div>
                                        <div>Vie</div>
                                        <div>Sáb</div>
                                        <div>Dom</div>
                                    </div>

                                    <div
                                        id="calendar_days_prensa"
                                        class="days-grid">
                                    </div>

                                </div>

                                </div>

                            </div>

                                <div class="prensa-field">
                                    <label>Medio <span class="req">*</span></label>
                                    <div class="medio-selector">

                                        <input
                                            type="text"
                                            id="buscar_medio_prensa"
                                            class="prensa-input"
                                            value="<?php echo htmlspecialchars($noticia['subtipo_medio'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"
                                            placeholder="Buscar medio..."
                                            autocomplete="off"
                                            onfocus="mostrarMediosPrensa()"
                                            onclick="event.stopPropagation(); mostrarMediosPrensa();"
                                            oninput="filtrarMediosPrensa(this.value)">

                                        <input
                                            type="hidden"
                                            name="subtipo_medio"
                                            id="subtipo_medio_prensa"
                                            value="<?php echo htmlspecialchars($noticia['subtipo_medio'] ?? '', ENT_QUOTES, 'UTF-8'); ?>">

                                        <div
                                            id="lista_medios_prensa"
                                            class="lista-medios"
                                            style="display:none;">

                                            <?php foreach($medios_array as $m){ ?>

                                                <div
                                                    class="medio-item"
                                                    data-busqueda="<?php echo htmlspecialchars(mb_strtolower($m['nombre_medio'],'UTF-8'), ENT_QUOTES, 'UTF-8'); ?>"
                                                    data-valor="<?php echo htmlspecialchars($m['nombre_medio'], ENT_QUOTES, 'UTF-8'); ?>"
                                                    data-costo="<?php echo htmlspecialchars((string)($m['valor'] ?? ''), ENT_QUOTES, 'UTF-8'); ?>"
                                                    onclick="event.stopPropagation(); seleccionarMedioPrensa(this);">

                                                    <?php echo htmlspecialchars($m['nombre_medio'], ENT_QUOTES, 'UTF-8'); ?>

                                                </div>

                                            <?php } ?>

                                        </div>

                                    </div>
                                </div>

                                <div class="prensa-field">
                                    <label>Sección <span class="req">*</span></label>
                                    <input class="prensa-input" type="text" name="seccion" value="<?php echo htmlspecialchars($datos_edicion['seccion'] ?? '', ENT_QUOTES, 'UTF-8'); ?>" required>
                                </div>
                            </div>

                            <div class="prensa-pages-box" id="prensa_paginas_contenedor">
                                <div class="prensa-row prensa-pagina-item">
                                    <div class="prensa-field">
                                        <label>Página <span class="req">*</span></label>
                                        <input class="prensa-input" type="text" name="pagina" value="<?php echo htmlspecialchars($datos_edicion['pagina'] ?? '', ENT_QUOTES, 'UTF-8'); ?>" required>
                                    </div>

                                    <div class="prensa-field">
                                        <label>Columnas <span class="req">*</span></label>
                                        <select class="prensa-select" name="columnas" required>
                                            <option value="">Seleccionar</option>
                                            <?php for($i=1;$i<=6;$i++){ ?>
                                                <option value="<?php echo $i; ?>" <?php echo ((string)($datos_edicion['columnas'] ?? '') === (string)$i) ? 'selected' : ''; ?>><?php echo $i; ?></option>
                                            <?php } ?>
                                        </select>
                                    </div>

                                    <div class="prensa-field">
                                        <label>Módulos <span class="req">*</span></label>
                                        <select class="prensa-select" name="modulos" required>
                                            <option value="">Seleccionar</option>
                                            <?php for($i=1;$i<=18;$i++){ ?>
                                                <option value="<?php echo $i; ?>" <?php echo ((string)($datos_edicion['modulos'] ?? '') === (string)$i) ? 'selected' : ''; ?>><?php echo $i; ?></option>
                                            <?php } ?>
                                        </select>
                                    </div>
                                </div>

                                <?php
                                /*
                                   Restaurar las páginas adicionales guardadas en paginas_detalle.
                                   La primera posición corresponde a los campos principales; desde
                                   la segunda se reconstruyen los bloques creados con "Agregar otra página".
                                */
                                $paginas_detalle_edicion = (isset($datos_edicion['paginas_detalle']) && is_array($datos_edicion['paginas_detalle']))
                                    ? $datos_edicion['paginas_detalle']
                                    : array();

                                if (count($paginas_detalle_edicion) > 1) {
                                    for ($indice_pagina = 1; $indice_pagina < count($paginas_detalle_edicion); $indice_pagina++) {
                                        $pagina_extra_edicion = $paginas_detalle_edicion[$indice_pagina];
                                        $valor_pagina_extra = (string)($pagina_extra_edicion['pagina'] ?? '');
                                        $valor_columnas_extra = (string)($pagina_extra_edicion['columnas'] ?? '');
                                        $valor_modulos_extra = (string)($pagina_extra_edicion['modulos'] ?? '');
                                ?>
                                <div class="prensa-row prensa-pagina-item" style="margin-top:22px;">
                                    <div class="prensa-field">
                                        <label>Página <span class="req">*</span></label>
                                        <input
                                            class="prensa-input"
                                            type="text"
                                            name="pagina_extra[]"
                                            value="<?php echo htmlspecialchars($valor_pagina_extra, ENT_QUOTES, 'UTF-8'); ?>"
                                            required>
                                    </div>

                                    <div class="prensa-field">
                                        <label>Columnas <span class="req">*</span></label>
                                        <select class="prensa-select" name="columnas_extra[]" required>
                                            <option value="">Seleccionar</option>
                                            <?php for ($opcion_columna = 1; $opcion_columna <= 6; $opcion_columna++) { ?>
                                                <option
                                                    value="<?php echo $opcion_columna; ?>"
                                                    <?php echo ($valor_columnas_extra === (string)$opcion_columna) ? 'selected' : ''; ?>>
                                                    <?php echo $opcion_columna; ?>
                                                </option>
                                            <?php } ?>
                                        </select>
                                    </div>

                                    <div class="prensa-field">
                                        <label>Módulos <span class="req">*</span></label>
                                        <select class="prensa-select" name="modulos_extra[]" required>
                                            <option value="">Seleccionar</option>
                                            <?php for ($opcion_modulo = 1; $opcion_modulo <= 18; $opcion_modulo++) { ?>
                                                <option
                                                    value="<?php echo $opcion_modulo; ?>"
                                                    <?php echo ($valor_modulos_extra === (string)$opcion_modulo) ? 'selected' : ''; ?>>
                                                    <?php echo $opcion_modulo; ?>
                                                </option>
                                            <?php } ?>
                                        </select>
                                    </div>
                                </div>
                                <?php
                                    }
                                }
                                ?>

                                <div class="prensa-add-page" id="prensa_agregar_pagina_accion">
                                    <a href="#" onclick="agregarOtraPaginaPrensa(event);">AGREGAR OTRA PÁGINA</a>
                                </div>
                            </div>


                            <!-- Valorización de prensa calculada internamente al guardar. -->
                            <div class="prensa-adjuntos-title">Archivos Adjuntos</div>
                            <div id="lista_adjuntos_prensa" class="noticia-adjuntos-list">
<?php if (!empty($noticia['archivo'])) {
    $archivo_actual_rel = ltrim(str_replace('\\','/', (string)$noticia['archivo']), '/');
    $archivo_actual_url = (strpos($archivo_actual_rel, 'uploads/') === 0) ? $archivo_actual_rel : 'uploads/' . $archivo_actual_rel;
    $ext_actual = strtolower(pathinfo($archivo_actual_rel, PATHINFO_EXTENSION));
?>
<div class="noticia-adjunto-card active">
  <div class="noticia-adjunto-preview">
  <?php if (in_array($ext_actual, ['jpg','jpeg','png','gif','webp'])) { ?>
    <img src="<?php echo htmlspecialchars($archivo_actual_url, ENT_QUOTES, 'UTF-8'); ?>" alt="Adjunto actual">
  <?php } elseif (in_array($ext_actual, ['mp4','webm','mov'])) { ?>
    <video src="<?php echo htmlspecialchars($archivo_actual_url, ENT_QUOTES, 'UTF-8'); ?>" muted preload="metadata"></video>
  <?php } else { ?>📎<?php } ?>
  </div>
</div>
<?php } ?>
</div>
                            <button type="button" class="prensa-upload-circle" onclick="abrirAdjuntosModal('prensa')">+</button>
                            <input type="hidden" name="archivo_adjunto_ids" id="adjunto_id_prensa" value="<?php echo htmlspecialchars($datos_edicion['archivo_adjunto_ids'] ?? '', ENT_QUOTES, 'UTF-8'); ?>">
                        </div>

                        <aside class="prensa-right">
                            <div class="prensa-field">
                                <label>Departamento <span class="req">*</span></label>
                                <select class="prensa-select" name="departamento" required>
                                    <option value="">Seleccionar</option>
                                    <?php
                                    $regiones_tmp = [];
                                    foreach($medios_array as $m){ $regiones_tmp[$m['region']] = true; }
                                    foreach(array_keys($regiones_tmp) as $region){
                                    ?>
                                        <option value="<?php echo htmlspecialchars($region, ENT_QUOTES, 'UTF-8'); ?>" <?php echo (($datos_edicion['departamento'] ?? '') === $region) ? 'selected' : ''; ?>><?php echo htmlspecialchars($region, ENT_QUOTES, 'UTF-8'); ?></option>
                                    <?php } ?>
                                </select>
                            </div>

                            <div class="prensa-field">
                                <label>Localidad</label>
                                <input class="prensa-input" type="text" name="localidad" value="<?php echo htmlspecialchars($datos_edicion['localidad'] ?? '', ENT_QUOTES, 'UTF-8'); ?>">
                            </div>

                            <div class="prensa-side-line"></div>

                            <div class="prensa-field">
                                <label>Etiquetas</label>
                                <div class="clientes-selector" data-contexto="prensa">
                                    <input type="hidden" name="etiquetas" id="etiquetas_prensa" value="<?php echo htmlspecialchars($etiquetas_editar ?? '', ENT_QUOTES, 'UTF-8'); ?>">
                                    <div class="clientes-box" onclick="enfocarBuscadorClientes('prensa')">
                                        <div id="clientes_tags_prensa" style="display:contents;"></div>
                                        <input id="cliente_buscar_prensa" class="cliente-search-inline" type="text" placeholder="Seleccione una opción" onfocus="abrirListaClientes('prensa')" onkeyup="filtrarListaClientes('prensa')" onkeydown="manejarTecladoClientes(event, 'prensa')">
                                    </div>
                                    <div id="clientes_dropdown_prensa" class="clientes-dropdown"></div>
                                </div>
                                <?php if (intval($_SESSION['rol_id'] ?? 0) !== 3) { ?>
                                <a class="prensa-new-tag" href="#" onclick="abrirNuevaEtiquetaNoticias('prensa'); return false;">NUEVA ETIQUETA</a>
                                <?php } ?>
                            </div>

                            <div class="prensa-field">
                                <label>Tono <span class="req">*</span></label>
                                <select class="prensa-select" name="tipo_nota" required>
                                    <option value="">Seleccionar...</option>
                                    <?php
                                    $q_tonos=$conn->query("SELECT nombre FROM tonos WHERE estado='activo' ORDER BY CASE nombre WHEN 'Negativo' THEN 1 WHEN 'Neutral' THEN 2 WHEN 'Positivo' THEN 3 ELSE 4 END,nombre ASC");
                                    if($q_tonos){
                                        while($tono=$q_tonos->fetch_assoc()){
                                            $sel_tono = (normalizarTonoEdicion($noticia["tipo_nota"] ?? "") === normalizarTonoEdicion($tono["nombre"])) ? " selected" : ""; echo '<option value="'.htmlspecialchars($tono["nombre"],ENT_QUOTES,'UTF-8').'"'.$sel_tono.'>'.htmlspecialchars($tono["nombre"],ENT_QUOTES,'UTF-8').'</option>';
                                        }
                                    }
                                    ?>
                                </select>
                            </div>

                            <button type="submit" name="actualizar_noticia" class="prensa-submit">ACTUALIZAR NOTICIA</button>
                        </aside>

                    </form>
                </div>

            <?php } elseif($modo_formulario == "radio_tv"){ ?>

                <div class="radio-wrapper">
                    <a href="dashboard_superadmin.php?modulo=noticias" class="radio-back">← Volver a Noticias</a>

                    <form method="POST" action="dashboard_superadmin.php?modulo=editar_noticia&id=<?php echo intval($id_editar); ?>" enctype="multipart/form-data" class="radio-form-layout">

                        <div class="radio-left">
                            <input type="hidden" name="tipo_medio" id="radio_tipo_medio_hidden" value="<?php echo htmlspecialchars($noticia['tipo_medio'] ?? 'Radio', ENT_QUOTES, 'UTF-8'); ?>">

                            <div class="radio-field">
                                <label>Titular <span class="req">*</span></label>
                                <input class="radio-input radio-title-input" type="text" name="titulo" value="<?php echo htmlspecialchars(html_entity_decode((string)($noticia['titulo'] ?? ''), ENT_QUOTES | ENT_HTML5, 'UTF-8'), ENT_QUOTES, 'UTF-8'); ?>" placeholder="Titular de la noticia" required>
                            </div>

                            <div class="radio-field">
                                <label>Resumen</label>
                                <textarea class="radio-textarea" name="descripcion" required><?php echo htmlspecialchars($descripcion_editar, ENT_QUOTES, 'UTF-8'); ?></textarea>
                            </div>

                            <div class="radio-note">* Para convertir una imagen a texto, primero agréguela a Archivos Adjuntos.</div>

                            <div class="radio-field">
                                <label>Tipo de Noticia</label>
                                <div class="radio-type-options">
                                    <label>
                                        <input type="radio" name="tipo_radio_tv_opcion" value="Radio" <?php echo (($noticia['tipo_medio'] ?? 'Radio') === 'Radio') ? 'checked' : ''; ?> onclick="actualizarTipoRadioTv('Radio')">
                                        Radio
                                    </label>

                                    <label>
                                        <input type="radio" name="tipo_radio_tv_opcion" value="Televisión" <?php echo (($noticia['tipo_medio'] ?? '') === 'Televisión') ? 'checked' : ''; ?> onclick="actualizarTipoRadioTv('Televisión')">
                                        Televisión
                                    </label>
                                </div>
                            </div>

                            <div class="radio-row">
                                <div class="radio-field">
                                    <div class="radio-fecha-hora-cabecera">
                                        <label>Fecha <span class="req">*</span></label>

                                        <div class="radio-hora-inline">
                                            <label for="hora_nota">Hora <span class="req">*</span></label>
                                            <input
                                                type="text"
                                                id="hora_nota"
                                                name="hora_nota"
                                                class="radio-hora-input"
                                                value="<?php
                                                    $hora_editar = trim((string)($datos_edicion['hora_nota'] ?? ''));
                                                    if ($hora_editar === '' && !empty($noticia['fecha_nota'])) {
                                                        $hora_fecha_bd = date('H:i:s', strtotime($noticia['fecha_nota']));
                                                        if ($hora_fecha_bd !== '00:00:00') {
                                                            $hora_editar = $hora_fecha_bd;
                                                        }
                                                    }
                                                    echo htmlspecialchars($hora_editar, ENT_QUOTES, 'UTF-8');
                                                ?>"
                                                placeholder="HH:MM:SS"
                                                pattern="^([01]\d|2[0-3]):([0-5]\d):([0-5]\d)$"
                                                maxlength="8"
                                                required>
                                        </div>
                                    </div>

                                    <div class="custom-date-box">
                                        <input
                                            type="hidden"
                                            name="fecha_nota"
                                            id="radio_fecha_nota"
                                            value="<?php echo !empty($noticia['fecha_nota']) ? htmlspecialchars(date('Y-m-d', strtotime($noticia['fecha_nota'])), ENT_QUOTES, 'UTF-8') : date('Y-m-d'); ?>">

                                        <div id="date_display_radio" class="date-display" onclick="abrirCalendarioRadio(event)">
                                            <span class="calendar-icon">📅</span>
                                            <span id="date_text_radio"><em><?php echo !empty($noticia['fecha_nota']) ? date('d/m/Y', strtotime($noticia['fecha_nota'])) : date('d/m/Y'); ?></em></span>
                                        </div>

                                        <div id="calendar_popup_radio" class="calendar-popup" onclick="event.stopPropagation()">
                                            <div class="calendar-head">
                                                <button type="button" onclick="event.stopPropagation(); mesAnteriorRadio()">‹</button>
                                                <div id="calendar_title_radio" class="calendar-title"></div>
                                                <button type="button" onclick="event.stopPropagation(); mesSiguienteRadio()">›</button>
                                            </div>
                                            <div class="week-days">
                                                <div>Lun</div><div>Mar</div><div>Mié</div><div>Jue</div><div>Vie</div><div>Sáb</div><div>Dom</div>
                                            </div>
                                            <div id="calendar_days_radio" class="days-grid"></div>
                                        </div>
                                    </div>
                                </div>

                                <div class="radio-field">
                                    <label>Duración <span class="req">*</span></label>
                                    <input
                                        class="radio-input<?php echo !empty($duracion_error) ? ' error hora-error-parpadeo' : ''; ?>"
                                        type="text"
                                        name="duracion"
                                        id="duracion_radio"
                                        value="<?php echo htmlspecialchars($datos_edicion['duracion'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"
                                        placeholder="00:00:00"
                                        maxlength="9"
                                        <?php echo !empty($duracion_error) ? 'aria-invalid="true"' : ''; ?>
                                        required>
                                    <?php if (!empty($duracion_error)) { ?>
                                        <div id="duracion_error" class="hora-error-mensaje">Falta agregar la duración o es incorrecta. Use HH:MM:SS</div>
                                    <?php } ?>
                                </div>
                            </div>

                            <div class="radio-row">
                                <div class="radio-field">
                                    <label>Medio <span class="req">*</span></label>

                                    <div class="medio-selector">
                                        <input
                                            type="text"
                                            id="buscar_medio_radio"
                                            class="radio-input"
                                            value="<?php echo htmlspecialchars($noticia['subtipo_medio'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"
                                            placeholder="Buscar medio..."
                                            autocomplete="off"
                                            onfocus="mostrarMediosRadio()"
                                            onclick="event.stopPropagation(); mostrarMediosRadio();"
                                            oninput="filtrarMediosRadio(this.value)">

                                        <input
                                            type="hidden"
                                            name="subtipo_medio"
                                            id="subtipo_medio_radio"
                                            value="<?php echo htmlspecialchars($noticia['subtipo_medio'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"
                                            required>

                                        <div
                                            id="lista_medios_radio"
                                            class="lista-medios"
                                            style="display:none;">

                                            <?php foreach($medios_array as $m){ ?>
                                                <?php if($m['tipo_medio'] == 'Radio' || $m['tipo_medio'] == 'Televisión'){ ?>
                                                    <div
                                                        class="medio-item"
                                                        data-tipo="<?php echo htmlspecialchars($m['tipo_medio'], ENT_QUOTES, 'UTF-8'); ?>"
                                                        data-busqueda="<?php echo htmlspecialchars(mb_strtolower($m['nombre_medio'],'UTF-8'), ENT_QUOTES, 'UTF-8'); ?>"
                                                        data-valor="<?php echo htmlspecialchars($m['nombre_medio'], ENT_QUOTES, 'UTF-8'); ?>"
                                                    data-costo="<?php echo htmlspecialchars((string)($m['valor'] ?? ''), ENT_QUOTES, 'UTF-8'); ?>"
                                                        onclick="event.stopPropagation(); seleccionarMedioRadio(this);">

                                                        <?php echo htmlspecialchars($m['nombre_medio'], ENT_QUOTES, 'UTF-8'); ?>
                                                    </div>
                                                <?php } ?>
                                            <?php } ?>
                                        </div>
                                    </div>
                                </div>

                                <div class="radio-field">
                                    <label>Nombre del Programa <span class="req">*</span></label>
                                    <input class="radio-input" type="text" name="programa" value="<?php echo htmlspecialchars($datos_edicion['programa'] ?? '', ENT_QUOTES, 'UTF-8'); ?>" required>
                                </div>
                            </div>

                            <div class="radio-adjuntos-title">Archivos Adjuntos</div>
                            <div id="lista_adjuntos_radio" class="noticia-adjuntos-list">
<?php if (!empty($noticia['archivo'])) {
    $archivo_actual_rel = ltrim(str_replace('\\','/', (string)$noticia['archivo']), '/');
    $archivo_actual_url = (strpos($archivo_actual_rel, 'uploads/') === 0) ? $archivo_actual_rel : 'uploads/' . $archivo_actual_rel;
    $ext_actual = strtolower(pathinfo($archivo_actual_rel, PATHINFO_EXTENSION));
?>
<div class="noticia-adjunto-card active">
  <div class="noticia-adjunto-preview">
  <?php if (in_array($ext_actual, ['jpg','jpeg','png','gif','webp'])) { ?>
    <img src="<?php echo htmlspecialchars($archivo_actual_url, ENT_QUOTES, 'UTF-8'); ?>" alt="Adjunto actual">
  <?php } elseif (in_array($ext_actual, ['mp4','webm','mov'])) { ?>
    <video src="<?php echo htmlspecialchars($archivo_actual_url, ENT_QUOTES, 'UTF-8'); ?>" muted preload="metadata"></video>
  <?php } else { ?>📎<?php } ?>
  </div>
</div>
<?php } ?>
</div>
                            <button type="button" class="radio-upload-circle" onclick="abrirAdjuntosModal('radio')">+</button>
                            <input type="hidden" name="archivo_adjunto_ids" id="adjunto_id_radio" value="<?php echo htmlspecialchars($datos_edicion['archivo_adjunto_ids'] ?? '', ENT_QUOTES, 'UTF-8'); ?>">
                        </div>

                        <aside class="radio-right">
                            <div class="radio-field">
                                <label>Departamento <span class="req">*</span></label>
                                <select class="radio-select" name="departamento" required>
                                    <option value="">Seleccionar</option>
                                    <?php
                                    $regiones_tmp = [];
                                    foreach($medios_array as $m){ $regiones_tmp[$m['region']] = true; }
                                    foreach(array_keys($regiones_tmp) as $region){
                                    ?>
                                        <option value="<?php echo htmlspecialchars($region, ENT_QUOTES, 'UTF-8'); ?>" <?php echo (($datos_edicion['departamento'] ?? '') === $region) ? 'selected' : ''; ?>><?php echo htmlspecialchars($region, ENT_QUOTES, 'UTF-8'); ?></option>
                                    <?php } ?>
                                </select>
                            </div>

                            <div class="radio-field">
                                <label>Localidad</label>
                                <input class="radio-input" type="text" name="localidad" value="<?php echo htmlspecialchars($datos_edicion['localidad'] ?? '', ENT_QUOTES, 'UTF-8'); ?>">
                            </div>

                            <div class="radio-side-line"></div>

                            <div class="radio-field">
                                <label>Etiquetas</label>
                                <div class="clientes-selector" data-contexto="radio">
                                    <input type="hidden" name="etiquetas" id="etiquetas_radio" value="<?php echo htmlspecialchars($etiquetas_editar ?? '', ENT_QUOTES, 'UTF-8'); ?>">
                                    <input type="hidden" name="etiquetas_modificadas" id="etiquetas_modificadas_radio" value="0">
                                    <div class="clientes-box" onclick="enfocarBuscadorClientes('radio')">
                                        <div id="clientes_tags_radio" style="display:contents;"></div>
                                        <input id="cliente_buscar_radio" class="cliente-search-inline" type="text" placeholder="Seleccione una opción" onfocus="abrirListaClientes('radio')" onkeyup="filtrarListaClientes('radio')" onkeydown="manejarTecladoClientes(event, 'radio')">
                                    </div>
                                    <div id="clientes_dropdown_radio" class="clientes-dropdown"></div>
                                </div>
                                <?php if (intval($_SESSION['rol_id'] ?? 0) !== 3) { ?>
                                <a class="radio-new-tag" href="#" onclick="abrirNuevaEtiquetaNoticias('radio'); return false;">NUEVA ETIQUETA</a>
                                <?php } ?>
                            </div>

                            <div class="radio-field">
                                <label>Tono <span class="req">*</span></label>
                                <select class="radio-select" name="tipo_nota" required>
                                    <option value="">Seleccionar...</option>
                                    <?php
                                    $q_tonos = $conn->query("SELECT nombre FROM tonos WHERE estado='activo' ORDER BY CASE nombre WHEN 'Negativo' THEN 1 WHEN 'Neutral' THEN 2 WHEN 'Positivo' THEN 3 ELSE 4 END, nombre ASC");
                                    if ($q_tonos) {
                                        while ($tono = $q_tonos->fetch_assoc()) {
                                            $tono_nombre = (string)$tono['nombre'];
                                            $seleccionado = (normalizarTonoEdicion($tono_nombre) === normalizarTonoEdicion($noticia['tipo_nota'] ?? '')) ? ' selected' : '';
                                            echo '<option value="'.htmlspecialchars($tono_nombre, ENT_QUOTES, 'UTF-8').'"'.$seleccionado.'>'.htmlspecialchars($tono_nombre, ENT_QUOTES, 'UTF-8').'</option>';
                                        }
                                    }
                                    ?>
                                </select>
                            </div>

                            <button type="submit" name="actualizar_noticia" class="radio-submit">ACTUALIZAR NOTICIA</button>
                        </aside>

                    </form>
                </div>

            <?php } elseif($modo_formulario == "redes_web"){ ?>

                <div class="redes-wrapper">
                    <a href="dashboard_superadmin.php?modulo=noticias" class="redes-back">← Volver a Noticias</a>

                    <form method="POST" action="dashboard_superadmin.php?modulo=editar_noticia&id=<?php echo intval($id_editar); ?>" enctype="multipart/form-data" class="redes-form-layout">

                        <div class="redes-left">
                            <input type="hidden" name="tipo_medio" id="redes_tipo_medio_hidden" value="<?php echo htmlspecialchars($noticia['tipo_medio'] ?? 'Redes Sociales', ENT_QUOTES, 'UTF-8'); ?>">

                            <div class="redes-field">
                                <label>Titular <span class="req">*</span></label>
                                <input class="redes-input redes-title-input" type="text" name="titulo" value="<?php echo htmlspecialchars(html_entity_decode((string)($noticia['titulo'] ?? ''), ENT_QUOTES | ENT_HTML5, 'UTF-8'), ENT_QUOTES, 'UTF-8'); ?>" placeholder="Titular de la noticia" required>
                            </div>

                            <div class="redes-field">
                                <label>Resumen</label>
                                <textarea class="redes-textarea" name="descripcion" required><?php echo htmlspecialchars($descripcion_editar, ENT_QUOTES, 'UTF-8'); ?></textarea>
                            </div>

                            <div class="redes-note">* Para convertir una imagen a texto, primero agréguela a Archivos Adjuntos.</div>

                            <div class="redes-field">
                                <label>Tipo de Noticia</label>
                                <div class="redes-type-options">
                                    <label>
                                        <input type="radio" name="tipo_redes_web_opcion" value="Redes Sociales" <?php echo (($noticia['tipo_medio'] ?? 'Redes Sociales') === 'Redes Sociales') ? 'checked' : ''; ?> onclick="actualizarTipoRedesWeb('Redes Sociales')">
                                        Redes Sociales
                                    </label>

                                    <label>
                                        <input type="radio" name="tipo_redes_web_opcion" value="Página Web" <?php echo (($noticia['tipo_medio'] ?? '') === 'Página Web') ? 'checked' : ''; ?> onclick="actualizarTipoRedesWeb('Página Web')">
                                        Páginas Web
                                    </label>
                                </div>
                            </div>

                            <div class="redes-row">
                                <div class="redes-field">
                                    <label>Fecha de Publicación <span class="req">*</span></label>

                                    <div class="custom-date-box">
                                        <input
                                            type="hidden"
                                            name="fecha_nota"
                                            id="redes_fecha_nota"
                                            value="<?php echo htmlspecialchars($noticia['fecha_nota'] ?? date('Y-m-d'), ENT_QUOTES, 'UTF-8'); ?>">

                                        <div
                                            id="date_display_redes"
                                            class="date-display"
                                            onclick="abrirCalendarioRedes(event)">

                                            <span class="calendar-icon">📅</span>

                                            <span id="date_text_redes">
                                                <em><?php echo !empty($noticia['fecha_nota']) ? date('d/m/Y', strtotime($noticia['fecha_nota'])) : date('d/m/Y'); ?></em>
                                            </span>
                                        </div>

                                        <div
                                            id="calendar_popup_redes"
                                            class="calendar-popup"
                                            onclick="event.stopPropagation()">

                                            <div class="calendar-head">
                                                <button type="button"
                                                        onclick="event.stopPropagation(); mesAnteriorRedes()">‹</button>

                                                <div id="calendar_title_redes"
                                                     class="calendar-title"></div>

                                                <button type="button"
                                                        onclick="event.stopPropagation(); mesSiguienteRedes()">›</button>
                                            </div>

                                            <div class="week-days">
                                                <div>Lun</div>
                                                <div>Mar</div>
                                                <div>Mié</div>
                                                <div>Jue</div>
                                                <div>Vie</div>
                                                <div>Sáb</div>
                                                <div>Dom</div>
                                            </div>

                                            <div id="calendar_days_redes"
                                                 class="days-grid"></div>
                                        </div>
                                    </div>
                                </div>

                                <div class="redes-field">
                                    <label>Medio <span class="req">*</span></label>

                                    <div class="medio-selector">
                                        <input
                                            type="text"
                                            id="buscar_medio_redes"
                                            class="redes-input"
                                            value="<?php echo htmlspecialchars($noticia['subtipo_medio'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"
                                            placeholder="Buscar medio..."
                                            autocomplete="off"
                                            onfocus="mostrarMediosRedes()"
                                            onclick="event.stopPropagation(); mostrarMediosRedes();"
                                            oninput="filtrarMediosRedes(this.value)">

                                        <input
                                            type="hidden"
                                            name="subtipo_medio"
                                            id="subtipo_medio_redes"
                                            value="<?php echo htmlspecialchars($noticia['subtipo_medio'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"
                                            required>

                                        <div
                                            id="lista_medios_redes"
                                            class="lista-medios"
                                            style="display:none;">

                                            <?php foreach($medios_array as $m){ ?>
                                                <?php if($m['tipo_medio'] == 'Redes Sociales' || $m['tipo_medio'] == 'Página Web'){ ?>
                                                    <div
                                                        class="medio-item"
                                                        data-tipo="<?php echo htmlspecialchars($m['tipo_medio'], ENT_QUOTES, 'UTF-8'); ?>"
                                                        data-busqueda="<?php echo htmlspecialchars(mb_strtolower($m['nombre_medio'],'UTF-8'), ENT_QUOTES, 'UTF-8'); ?>"
                                                        data-valor="<?php echo htmlspecialchars($m['nombre_medio'], ENT_QUOTES, 'UTF-8'); ?>"
                                                    data-costo="<?php echo htmlspecialchars((string)($m['valor'] ?? ''), ENT_QUOTES, 'UTF-8'); ?>"
                                                        onclick="event.stopPropagation(); seleccionarMedioRedes(this);">

                                                        <?php echo htmlspecialchars($m['nombre_medio'], ENT_QUOTES, 'UTF-8'); ?>
                                                    </div>
                                                <?php } ?>
                                            <?php } ?>
                                        </div>
                                    </div>
                                </div>
                            </div>

                            <div class="redes-field" style="max-width:780px;">
                                <label>Enlace <span class="req">*</span></label>
                                <input class="redes-input" type="url" name="enlace" value="<?php echo htmlspecialchars($datos_edicion['enlace'] ?? '', ENT_QUOTES, 'UTF-8'); ?>" placeholder="Ej. https://www.google.com" required>
                            </div>

                            <div class="redes-adjuntos-title">Archivos Adjuntos</div>
                            <div id="lista_adjuntos_redes" class="noticia-adjuntos-list">
<?php if (!empty($noticia['archivo'])) {
    $archivo_actual_rel = ltrim(str_replace('\\','/', (string)$noticia['archivo']), '/');
    $archivo_actual_url = (strpos($archivo_actual_rel, 'uploads/') === 0) ? $archivo_actual_rel : 'uploads/' . $archivo_actual_rel;
    $ext_actual = strtolower(pathinfo($archivo_actual_rel, PATHINFO_EXTENSION));
?>
<div class="noticia-adjunto-card active">
  <div class="noticia-adjunto-preview">
  <?php if (in_array($ext_actual, ['jpg','jpeg','png','gif','webp'])) { ?>
    <img src="<?php echo htmlspecialchars($archivo_actual_url, ENT_QUOTES, 'UTF-8'); ?>" alt="Adjunto actual">
  <?php } elseif (in_array($ext_actual, ['mp4','webm','mov'])) { ?>
    <video src="<?php echo htmlspecialchars($archivo_actual_url, ENT_QUOTES, 'UTF-8'); ?>" muted preload="metadata"></video>
  <?php } else { ?>📎<?php } ?>
  </div>
</div>
<?php } ?>
</div>
                            <button type="button" class="redes-upload-circle" onclick="abrirAdjuntosModal('redes')">+</button>
                            <input type="hidden" name="archivo_adjunto_ids" id="adjunto_id_redes" value="<?php echo htmlspecialchars($datos_edicion['archivo_adjunto_ids'] ?? '', ENT_QUOTES, 'UTF-8'); ?>">
                        </div>

                        <aside class="redes-right">
                            <div class="redes-field">
                                <label>Departamento <span class="req">*</span></label>
                                <select class="redes-select" name="departamento" required>
                                    <option value="">Seleccionar</option>
                                    <?php
                                    $regiones_tmp = [];
                                    foreach($medios_array as $m){ $regiones_tmp[$m['region']] = true; }
                                    foreach(array_keys($regiones_tmp) as $region){
                                    ?>
                                        <option value="<?php echo htmlspecialchars($region, ENT_QUOTES, 'UTF-8'); ?>" <?php echo (($datos_edicion['departamento'] ?? '') === $region) ? 'selected' : ''; ?>><?php echo htmlspecialchars($region, ENT_QUOTES, 'UTF-8'); ?></option>
                                    <?php } ?>
                                </select>
                            </div>

                            <div class="redes-field">
                                <label>Localidad</label>
                                <input class="redes-input" type="text" name="localidad" value="<?php echo htmlspecialchars($datos_edicion['localidad'] ?? '', ENT_QUOTES, 'UTF-8'); ?>">
                            </div>

                            <div class="redes-side-line"></div>

                            <div class="redes-field">
                                <label>Etiquetas</label>
                                <div class="clientes-selector" data-contexto="redes">
                                    <input type="hidden" name="etiquetas" id="etiquetas_redes" value="<?php echo htmlspecialchars($etiquetas_editar ?? '', ENT_QUOTES, 'UTF-8'); ?>">
                                    <div class="clientes-box" onclick="enfocarBuscadorClientes('redes')">
                                        <div id="clientes_tags_redes" style="display:contents;"></div>
                                        <input id="cliente_buscar_redes" class="cliente-search-inline" type="text" placeholder="Seleccione una opción" onfocus="abrirListaClientes('redes')" onkeyup="filtrarListaClientes('redes')" onkeydown="manejarTecladoClientes(event, 'redes')">
                                    </div>
                                    <div id="clientes_dropdown_redes" class="clientes-dropdown"></div>
                                </div>
                                <?php if (intval($_SESSION['rol_id'] ?? 0) !== 3) { ?>
                                <a class="redes-new-tag" href="#" onclick="abrirNuevaEtiquetaNoticias('redes'); return false;">NUEVA ETIQUETA</a>
                                <?php } ?>
                            </div>

                            <div class="redes-field">
                                <label>Tono <span class="req">*</span></label>
                                <select class="redes-select" name="tipo_nota" required>
                                    <option value="">Seleccionar...</option>
                                    <?php
                                    $q_tonos = $conn->query("SELECT nombre FROM tonos WHERE estado='activo' ORDER BY CASE nombre WHEN 'Negativo' THEN 1 WHEN 'Neutral' THEN 2 WHEN 'Positivo' THEN 3 ELSE 4 END, nombre ASC");
                                    if ($q_tonos) {
                                        while ($tono = $q_tonos->fetch_assoc()) {
                                            $tono_nombre = (string)$tono['nombre'];
                                            $seleccionado = (normalizarTonoEdicion($tono_nombre) === normalizarTonoEdicion($noticia['tipo_nota'] ?? '')) ? ' selected' : '';
                                            echo '<option value="'.htmlspecialchars($tono_nombre, ENT_QUOTES, 'UTF-8').'"'.$seleccionado.'>'.htmlspecialchars($tono_nombre, ENT_QUOTES, 'UTF-8').'</option>';
                                        }
                                    }
                                    ?>
                                </select>
                            </div>

                            <button type="submit" name="actualizar_noticia" class="redes-submit">ACTUALIZAR NOTICIA</button>
                        </aside>

                    </form>
                </div>

            <?php } else { ?>

                <?php if(count($noticias) > 0){ ?>
                    <?php foreach($noticias as $n){ ?>
                        <?php
                            $id = intval($n['id']);
                            $titulo = htmlspecialchars(html_entity_decode((string)$n['titulo'], ENT_QUOTES | ENT_HTML5, 'UTF-8'), ENT_QUOTES, 'UTF-8');
                            $fecha = htmlspecialchars($n['fecha_nota'], ENT_QUOTES, 'UTF-8');
                            $tipo_medio = htmlspecialchars($n['tipo_medio'], ENT_QUOTES, 'UTF-8');
                            $subtipo = htmlspecialchars($n['subtipo_medio'], ENT_QUOTES, 'UTF-8');
                            $descripcion = htmlspecialchars($n['descripcion'], ENT_QUOTES, 'UTF-8');
                            $tipo_nota = htmlspecialchars(strtoupper($n['tipo_nota']), ENT_QUOTES, 'UTF-8');
                            $thumb = "";
                            $thumb_tipo = "";
                            $thumb_icono = "📰";

                            if(!empty($n['archivo'])){
                                $archivo_thumb = ltrim(str_replace('\\', '/', (string)$n['archivo']), '/');

                                if(strpos($archivo_thumb, 'uploads/') === 0){
                                    $thumb = $archivo_thumb;
                                }else{
                                    $thumb = "uploads/" . $archivo_thumb;
                                }

                                $ext = strtolower(pathinfo($archivo_thumb, PATHINFO_EXTENSION));

                                if(in_array($ext, ['jpg','jpeg','png','gif','webp'])){
                                    $thumb_tipo = "imagen";
                                }elseif(in_array($ext, ['mp4','webm','mov','avi','mkv'])){
                                    $thumb_tipo = "video";
                                }elseif(in_array($ext, ['mp3','wav','aac','ogg','m4a'])){
                                    $thumb_tipo = "audio";
                                    $thumb_icono = "🎧";
                                }elseif($ext === 'pdf'){
                                    $thumb_tipo = "pdf";
                                    $thumb_icono = "📕";
                                }else{
                                    $thumb_tipo = "archivo";
                                    $thumb_icono = "📄";
                                }
                            }

                            $partes_medio = explode(" / ", $subtipo);
                            $ubicacion = "";
                            $medio_nombre = $subtipo;
                            if(count($partes_medio) >= 4){
                                $ubicacion = $partes_medio[0] . ", " . $partes_medio[1];
                                $medio_nombre = $partes_medio[3];
                            }

                            $valor = "S/" . number_format(max(1, strlen($descripcion)) * 0.75, 2);
                        ?>
                        <article class="news-card">
                            <input class="news-check" type="checkbox" value="<?php echo $id; ?>">

                            <div class="news-thumb">
                                <?php if($thumb_tipo === "imagen"){ ?>
                                    <img
                                        src="<?php echo htmlspecialchars($thumb, ENT_QUOTES, 'UTF-8'); ?>"
                                        alt="Miniatura de la noticia"
                                        loading="lazy">
                                <?php } elseif($thumb_tipo === "video"){ ?>
                                    <video
                                        src="<?php echo htmlspecialchars($thumb, ENT_QUOTES, 'UTF-8'); ?>"
                                        muted
                                        preload="metadata"
                                        playsinline></video>
                                <?php } elseif($thumb != ""){ ?>
                                    <?php echo $thumb_icono; ?>
                                <?php } else { ?>
                                    📰
                                <?php } ?>
                            </div>

                            <div class="news-info">
                                <div class="news-info-top">
                                    <span>🕘 <?php echo date('d/m/Y', strtotime($fecha)); ?></span>
                                    <span>📍 <?php echo ($ubicacion != "" ? htmlspecialchars($ubicacion, ENT_QUOTES, 'UTF-8') : 'Sin ubicación'); ?></span>
                                </div>

                                <a class="news-title"
                                   href="dashboard_superadmin.php?modulo=editar_noticia&id=<?php echo $id; ?>">
                                    <?php echo $titulo; ?>
                                </a>

                                <div class="tags">
                                    <span class="tag"><?php echo ($tipo_nota != "" ? $tipo_nota : "NOTA"); ?></span>
                                </div>

                                <div class="news-source">
                                    <strong>▦ <?php echo $tipo_medio; ?></strong>
                                    <span>—</span>
                                    <span><?php echo htmlspecialchars($medio_nombre, ENT_QUOTES, 'UTF-8'); ?></span>
                                </div>

                                <div class="news-actions">
                                    <button class="action-mini" type="button" title="Abrir" onclick="window.open('nota.php?id=<?php echo $id; ?>','_blank')">↗</button>
                                    <button class="action-mini" type="button" title="WhatsApp">☏</button>
                                </div>
                            </div>

                            <div class="news-value">
                                <small>1 cm2 = S/7.60</small>
                                <strong><?php echo $valor; ?></strong>
                                <small>1 Página</small>
                            </div>
                        </article>
                    <?php } ?>
                <?php } else { ?>
                    <div class="empty">No tienes noticias registradas.</div>
                <?php } ?>

            <?php } ?>
        </section>

    </main>
</div>


<div id="drawerOverlay" class="drawer-overlay" onclick="cerrarNuevaNoticia()"></div>

<div id="newsDrawer" class="news-drawer">
    <div class="drawer-head">
        <div>
            <small>Registro editorial</small>
            <h2>Nueva Noticia</h2>
        </div>
        <button type="button" class="drawer-close" onclick="cerrarNuevaNoticia()">×</button>
    </div>

    <div class="drawer-body">
        <div class="news-help">
            Registra aquí la noticia del medio correspondiente. Esta sección es independiente del repositorio de archivos.
        </div>

        <form method="POST">
            <label>Fecha de Publicación *</label>
            <input type="date" name="fecha_nota" required>

            <label>Tipo de Medio *</label>
            <select name="tipo_medio" id="tipo_medio" onchange="filtrarMediosNoticias()" required>
                <option value="">Seleccione</option>
                <option value="Diario">Diario</option>
                <option value="Radio">Radio</option>
                <option value="Televisión">Televisión</option>
                <option value="Redes Sociales">Redes Sociales</option>
                <option value="Página Web">Página Web</option>
            </select>

            <label>Medio *</label>
            <input type="hidden" name="subtipo_medio" id="subtipo_medio" required>

            <div class="medios-box">
                <input type="text" id="buscar_medio" placeholder="Buscar región, provincia, ciudad o medio..." onkeyup="filtrarMediosNoticias()">
                <div id="medio_seleccionado" class="medio-seleccionado">Ningún medio seleccionado</div>
                <div id="lista_medios" class="medios-lista">Primero selecciona un tipo de medio.</div>
            </div>

            <label>Tipo de Nota *</label>
            <select name="tipo_nota" required>
                <option value="neutral">Neutral</option>
                <option value="positiva">Positiva</option>
                <option value="negativa">Negativa</option>
            </select>

            <label>Título *</label>
            <input type="text" name="titulo" required>

            <label>Descripción / Transcripción *</label>
            <textarea name="descripcion" required></textarea>

            <button type="submit" name="guardar_noticia" class="news-save">GUARDAR NOTICIA</button>
        </form>
    </div>
</div>


<div id="nuevaEtiquetaNoticiasOverlay" class="nueva-etiqueta-overlay" onclick="if(event.target===this){cerrarNuevaEtiquetaNoticias();}">
    <div class="nueva-etiqueta-modal" role="dialog" aria-modal="true" aria-labelledby="tituloNuevaEtiquetaNoticias">
        <div class="nueva-etiqueta-head">
            <h2 id="tituloNuevaEtiquetaNoticias">Registrar etiqueta</h2>
            <button type="button" class="nueva-etiqueta-close" onclick="cerrarNuevaEtiquetaNoticias()">×</button>
        </div>
        <div class="nueva-etiqueta-body">
            <div id="nueva_etiqueta_noticias_error" class="nueva-etiqueta-error"></div>
            <label for="nueva_etiqueta_noticias_nombre">Descripción *</label>
            <input
                type="text"
                id="nueva_etiqueta_noticias_nombre"
                placeholder="Nombre de la etiqueta"
                autocomplete="off"
                onkeydown="teclaNuevaEtiquetaNoticias(event)">
            <button
                type="button"
                id="btnGuardarNuevaEtiquetaNoticias"
                class="nueva-etiqueta-guardar"
                onclick="guardarNuevaEtiquetaNoticias()">
                REGISTRAR ETIQUETA
            </button>
        </div>
    </div>
</div>



<style>
.ec-classify-modal{display:none;position:fixed;inset:0;background:rgba(15,23,42,.55);z-index:12050;align-items:center;justify-content:center;padding:20px}.ec-classify-modal.show{display:flex}.ec-classify-box{background:#fff;width:min(620px,96vw);border-radius:16px;padding:24px;box-shadow:0 24px 70px rgba(0,0,0,.25)}.ec-classify-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.ec-classify-head h2{margin:0;color:#0f2344}.ec-classify-head button{border:0;background:transparent;font-size:30px;cursor:pointer}.ec-classify-box p{color:#64748b;margin:0 0 18px}.ec-classify-box label{display:block;font-weight:700;margin:14px 0 6px}.ec-classify-box select,.ec-classify-box input[type=text]{width:100%;height:46px;border:1px solid #d8deea;border-radius:8px;padding:0 12px;font-size:14px;box-sizing:border-box}.ec-classify-actions{display:flex;gap:12px;justify-content:flex-end;margin-top:22px}.ec-classify-actions button{border:0;border-radius:8px;padding:13px 22px;font-weight:700;cursor:pointer}.ec-cancel{background:#e5e7eb;color:#334155}.ec-continue{background:#f4511e;color:#fff}.ec-classify-error{min-height:20px;color:#c62828;font-weight:700;margin-top:10px}.ec-medio-wrap{position:relative}.ec-medio-results{display:none;position:absolute;left:0;right:0;top:50px;max-height:250px;overflow:auto;background:#fff;border:1px solid #cbd5e1;border-radius:8px;box-shadow:0 14px 35px rgba(15,23,42,.18);z-index:5}.ec-medio-results.show{display:block}.ec-medio-option{padding:10px 12px;cursor:pointer;border-bottom:1px solid #eef2f7}.ec-medio-option:last-child{border-bottom:0}.ec-medio-option:hover,.ec-medio-option.active{background:#fff3ed}.ec-medio-option strong{display:block;color:#172554}.ec-medio-option small{display:block;color:#64748b;margin-top:2px}.ec-medio-empty{padding:12px;color:#64748b}.ec-classify-modal.embedded{position:static;inset:auto;background:transparent;z-index:auto;padding:0;margin:18px auto 0;display:block;width:100%}.ec-classify-modal.embedded .ec-classify-box{width:min(620px,100%);box-shadow:none;border:1px solid #e2e8f0;text-align:left;margin:0 auto}.ec-upload-hidden{display:none!important}
</style>

<div id="modalClasificacionArchivos" class="ec-classify-modal" aria-hidden="true">
  <div class="ec-classify-box">
    <div class="ec-classify-head"><h2>Clasificar archivos</h2><button type="button" onclick="cerrarClasificacionArchivos()">×</button></div>
    <p>Los tres campos son obligatorios. La clasificación se aplicará a todos los archivos seleccionados.</p>
    <label>Región *</label><select id="ecRegion"><?= ec_gestor_opciones_regiones($conn) ?></select>
    <label>Tipo de medio *</label><select id="ecTipo"><option value="">Seleccionar tipo</option><option value="Diario">Diario (DR)</option><option value="Radio">Radio (RD)</option><option value="Televisión">Televisión (TV)</option><option value="Redes Sociales">Redes Sociales (RS)</option><option value="Página Web">Página Web (PW)</option></select>
    <label>Medio *</label>
    <div class="ec-medio-wrap"><input id="ecMedioBuscar" type="text" placeholder="Escribe una parte del nombre del medio..." autocomplete="off"><div id="ecMediosResultados" class="ec-medio-results"></div></div>
    <input id="ecMedioId" type="hidden">
    <div id="ecClasificacionError" class="ec-classify-error"></div>
    <div class="ec-classify-actions"><button type="button" class="ec-cancel" onclick="cerrarClasificacionArchivos()">CANCELAR</button><button type="button" class="ec-continue" onclick="confirmarClasificacionArchivos()">CONTINUAR</button></div>
  </div>
</div>

<script>
const ecMediosClasificacion = <?php echo json_encode($medios_array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); ?>;
let ecArchivosPendientes = [];
let ecCallbackClasificacion = null;
let ecMediosFiltrados = [];
let ecMedioActivo = -1;
let ecClasificacionEmbebida = false;
function ecNormalizar(v){return String(v||'').normalize('NFD').replace(/[\u0300-\u036f]/g,'').toLowerCase().trim();}
function ecTipoCompatible(tipoBD,tipoElegido){
 const b=ecNormalizar(tipoBD), e=ecNormalizar(tipoElegido);
 if(!e)return true;
 if(e==='diario')return b.includes('diario')||b.includes('prensa')||b.includes('periodico');
 if(e==='radio')return b.includes('radio');
 if(e==='television')return b.includes('television')||b==='tv'||b.includes('televis');
 if(e==='redes sociales')return b.includes('redes')||b.includes('social');
 if(e==='pagina web')return b.includes('web')||b.includes('pagina')||b.includes('digital');
 return b.includes(e)||e.includes(b);
}
function ecMediosDisponibles(){
 const r=document.getElementById('ecRegion').value, t=document.getElementById('ecTipo').value;
 return ecMediosClasificacion.filter(m=>(!r||ecNormalizar(m.region)===ecNormalizar(r))&&ecTipoCompatible(m.tipo_medio,t));
}
function ecRenderResultados(forzar){
 const inp=document.getElementById('ecMedioBuscar'), caja=document.getElementById('ecMediosResultados');
 if(!inp||!caja)return;
 const q=ecNormalizar(inp.value), terminos=q.split(/\s+/).filter(Boolean);
 ecMediosFiltrados=ecMediosDisponibles().filter(m=>{const texto=ecNormalizar([m.nombre_medio,m.region,m.provincia,m.ciudad,m.tipo_medio].join(' '));return terminos.every(x=>texto.includes(x));}).slice(0,60);
 ecMedioActivo=-1; caja.innerHTML='';
 if(!forzar && !q){caja.classList.remove('show');return;}
 if(ecMediosFiltrados.length===0){caja.innerHTML='<div class="ec-medio-empty">No se encontraron medios relacionados.</div>';caja.classList.add('show');return;}
 ecMediosFiltrados.forEach((m,i)=>{const d=document.createElement('div');d.className='ec-medio-option';d.dataset.index=i;d.innerHTML='<strong>'+ecEscapar(m.nombre_medio)+'</strong><small>'+ecEscapar([m.region,m.provincia,m.ciudad,m.tipo_medio].filter(Boolean).join(' · '))+'</small>';d.addEventListener('mousedown',e=>{e.preventDefault();ecSeleccionarMedio(i);});caja.appendChild(d);});
 caja.classList.add('show');
}
function ecEscapar(v){const d=document.createElement('div');d.textContent=String(v||'');return d.innerHTML;}
function ecMarcarActivo(){document.querySelectorAll('#ecMediosResultados .ec-medio-option').forEach((x,i)=>x.classList.toggle('active',i===ecMedioActivo));const a=document.querySelector('#ecMediosResultados .ec-medio-option.active');if(a)a.scrollIntoView({block:'nearest'});}
function ecSeleccionarMedio(i){const m=ecMediosFiltrados[i];if(!m)return;document.getElementById('ecMedioBuscar').value=m.nombre_medio;document.getElementById('ecMedioId').value=m.id;document.getElementById('ecMediosResultados').classList.remove('show');document.getElementById('ecClasificacionError').textContent='';}
function ecRestaurarModal(){
 const modal=document.getElementById('modalClasificacionArchivos');
 modal.classList.remove('embedded');
 if(modal.parentNode!==document.body)document.body.appendChild(modal);
 document.querySelectorAll('.adjuntos-upload-text,.adjuntos-upload-btn').forEach(e=>e.classList.remove('ec-upload-hidden'));
 ecClasificacionEmbebida=false;
}
function abrirClasificacionArchivos(archivos, callback){
 ecArchivosPendientes=archivos;ecCallbackClasificacion=callback;ecMedioActivo=-1;
 document.getElementById('ecClasificacionError').textContent='';document.getElementById('ecMedioBuscar').value='';document.getElementById('ecMedioId').value='';document.getElementById('ecRegion').value='';document.getElementById('ecTipo').value='';
 const modal=document.getElementById('modalClasificacionArchivos');
 const adj=document.getElementById('adjuntosModal'), pane=document.getElementById('adjuntosUploadPane');
 ecClasificacionEmbebida=!!(adj&&adj.classList.contains('show')&&pane&&pane.classList.contains('active'));
 if(ecClasificacionEmbebida){
   pane.appendChild(modal);modal.classList.add('embedded');
   document.querySelectorAll('.adjuntos-upload-text,.adjuntos-upload-btn').forEach(e=>e.classList.add('ec-upload-hidden'));
 }
 modal.classList.add('show');modal.setAttribute('aria-hidden','false');
 setTimeout(()=>document.getElementById('ecRegion').focus(),20);
}
function cerrarClasificacionArchivos(){
 const modal=document.getElementById('modalClasificacionArchivos');modal.classList.remove('show');modal.setAttribute('aria-hidden','true');document.getElementById('ecMediosResultados').classList.remove('show');ecArchivosPendientes=[];ecCallbackClasificacion=null;ecRestaurarModal();
}
function confirmarClasificacionArchivos(){
 const r=document.getElementById('ecRegion').value,t=document.getElementById('ecTipo').value,id=String(document.getElementById('ecMedioId').value||'');
 const m=ecMediosClasificacion.find(x=>String(x.id)===id);
 if(!r||!t||!m||ecNormalizar(m.region)!==ecNormalizar(r)||!ecTipoCompatible(m.tipo_medio,t)){document.getElementById('ecClasificacionError').textContent='Selecciona una región, un tipo de medio y un medio de la lista.';return;}
 const data={region:r,tipo:t,medio_id:m.id,medio_nombre:m.nombre_medio},cb=ecCallbackClasificacion,files=ecArchivosPendientes.slice();
 const modal=document.getElementById('modalClasificacionArchivos');modal.classList.remove('show');modal.setAttribute('aria-hidden','true');document.getElementById('ecMediosResultados').classList.remove('show');ecRestaurarModal();ecArchivosPendientes=[];ecCallbackClasificacion=null;if(cb)cb(files,data);
}
document.addEventListener('DOMContentLoaded',()=>{
 ['ecRegion','ecTipo'].forEach(id=>{const e=document.getElementById(id);if(e)e.addEventListener('change',()=>{document.getElementById('ecMedioBuscar').value='';document.getElementById('ecMedioId').value='';ecRenderResultados(false);});});
 const inp=document.getElementById('ecMedioBuscar');
 if(inp){
  inp.addEventListener('focus',()=>ecRenderResultados(!!inp.value));
  inp.addEventListener('input',()=>{document.getElementById('ecMedioId').value='';ecRenderResultados(true);});
  inp.addEventListener('keydown',e=>{
   if(e.key==='ArrowDown'){e.preventDefault();if(!document.getElementById('ecMediosResultados').classList.contains('show'))ecRenderResultados(true);if(ecMediosFiltrados.length){ecMedioActivo=(ecMedioActivo+1)%ecMediosFiltrados.length;ecMarcarActivo();}}
   else if(e.key==='ArrowUp'){e.preventDefault();if(ecMediosFiltrados.length){ecMedioActivo=(ecMedioActivo<=0?ecMediosFiltrados.length-1:ecMedioActivo-1);ecMarcarActivo();}}
   else if(e.key==='Enter'&&ecMedioActivo>=0){e.preventDefault();ecSeleccionarMedio(ecMedioActivo);}
   else if(e.key==='Escape'){document.getElementById('ecMediosResultados').classList.remove('show');}
  });
 }
 document.addEventListener('mousedown',e=>{const w=document.querySelector('.ec-medio-wrap');if(w&&!w.contains(e.target)){const c=document.getElementById('ecMediosResultados');if(c)c.classList.remove('show');}});
});
</script>

<div id="adjuntosModal" class="adjuntos-modal">
    <button type="button" class="adjuntos-close" onclick="cerrarAdjuntosModal()">×</button>

    <div class="adjuntos-tabs">
        <button id="tabAdjuntosRepo" type="button" class="adjuntos-tab active" onclick="cambiarTabAdjuntos('repo')">Repositorio</button>
        <button id="tabAdjuntosUpload" type="button" class="adjuntos-tab" onclick="cambiarTabAdjuntos('upload')">Cargar archivos</button>
    </div>

    <div id="adjuntosRepoPane" class="adjuntos-repo-pane">
        <div class="adjuntos-layout">
            <div class="adjuntos-left">
                <input id="buscarAdjuntoRepo" class="adjuntos-search" type="text" placeholder="🔍 Buscar..." onkeyup="filtrarAdjuntosRepo()">

                <div id="adjuntosGrid" class="adjuntos-grid">
                    <?php foreach($archivos_repo as $ar){ ?>
                        <?php
                            $ar_id = intval($ar['id']);
                            $ar_titulo = htmlspecialchars($ar['titulo'], ENT_QUOTES, 'UTF-8');
                            $ar_desc = htmlspecialchars($ar['descripcion'] ?? '', ENT_QUOTES, 'UTF-8');
                            $ar_url = htmlspecialchars($ar['url_repo'], ENT_QUOTES, 'UTF-8');
                            $ar_ext = htmlspecialchars($ar['extension_repo'], ENT_QUOTES, 'UTF-8');
                            $ar_cat = htmlspecialchars($ar['categoria_repo'], ENT_QUOTES, 'UTF-8');
                            $ar_icon = htmlspecialchars($ar['icono_repo'], ENT_QUOTES, 'UTF-8');
                            $ar_fecha_raw = htmlspecialchars($ar['fecha_nota'], ENT_QUOTES, 'UTF-8');
                            $ar_fecha = !empty($ar['fecha_nota']) ? date('d/m/Y h:i a', strtotime($ar['fecha_nota'])) : '';
                        ?>
                        <div
                            id="adjunto_card_<?php echo $ar_id; ?>"
                            class="adjunto-card"
                            data-id="<?php echo $ar_id; ?>"
                            data-titulo="<?php echo $ar_titulo; ?>"
                            data-desc="<?php echo $ar_desc; ?>"
                            data-url="<?php echo $ar_url; ?>"
                            data-ext="<?php echo $ar_ext; ?>"
                            data-cat="<?php echo $ar_cat; ?>"
                            data-icon="<?php echo $ar_icon; ?>"
                            data-fecha="<?php echo $ar_fecha_raw; ?>"
                        >
                            <div class="adjunto-preview">
                                <?php if($ar_cat == "imagen"){ ?>
                                    <img src="<?php echo $ar_url; ?>" alt="">
                                <?php } elseif($ar_cat == "video"){ ?>
                                    <video src="<?php echo $ar_url; ?>" muted preload="metadata" playsinline></video>
                                <?php } else { ?>
                                    <?php echo $ar_icon; ?>
                                <?php } ?>

                                <?php if($ar_cat=="imagen" || $ar_cat=="video" || $ar_cat=="audio"){ ?>
                                <button
                                    type="button"
                                    class="adjunto-play"
                                    title="Previsualizar archivo"
                                    aria-label="Previsualizar archivo"
                                    onclick="return abrirPrevisualizacionAdjunto(event, this);"
                                >▶</button>
                                <?php } ?>

                                <span class="adjunto-ext"><?php echo $ar_ext; ?></span>
                            </div>
                            
                            <div class="adjunto-check-wrap">

    <input
        type="checkbox"
        class="adjunto-check"
        data-id="<?php echo $ar_id; ?>"
        onclick="event.stopPropagation(); cambiarSeleccionAdjunto(this);"

    >

</div>
                            
                            <div class="adjunto-body">
                                <div class="adjunto-title"><?php echo $ar_titulo; ?></div>
                                <div class="adjunto-date"><?php echo htmlspecialchars($ar_fecha, ENT_QUOTES, 'UTF-8'); ?></div>
                            </div>
                        </div>
                    <?php } ?>
                </div>
            </div>

            <aside id="adjuntosDetail" class="adjuntos-right">
                <div class="adjuntos-detail-empty">Selecciona un archivo del repositorio para ver sus datos y agregarlo.</div>
            </aside>
        </div>
    </div>

    <div id="adjuntosUploadPane" class="adjuntos-upload-pane">
        <div class="adjuntos-upload-center">
            <div class="adjuntos-upload-text">Selecciona y carga los archivos que necesites.</div>
            <button type="button" class="adjuntos-upload-btn" onclick="abrirSelectorCargaAdjuntos()">+ CARGAR ARCHIVOS</button>
            <input id="inputCargaAdjuntos" type="file" multiple style="display:none;" onchange="cargarArchivosAdjuntos(this)">
            <div id="adjuntosUploadList" class="adjuntos-upload-list"></div>
        </div>
    </div>
</div>


<div
    id="adjuntoVisorModal"
    class="adjunto-visor-modal"
    onclick="cerrarVisorAlFondo(event)"
    role="dialog"
    aria-modal="true"
    aria-labelledby="adjuntoVisorTitulo"
>
    <div class="adjunto-visor-box">
        <div class="adjunto-visor-head">
            <div id="adjuntoVisorTitulo" class="adjunto-visor-titulo">Previsualización</div>
            <button
                type="button"
                class="adjunto-visor-cerrar"
                onclick="cerrarPrevisualizacionAdjunto()"
                aria-label="Cerrar previsualización"
                title="Cerrar"
            >×</button>
        </div>

        <div id="adjuntoVisorContenido" class="adjunto-visor-contenido"></div>
    </div>
</div>

<div id="modalSoporte" class="modal">
    <div class="modal-box">
        <span class="modal-close" onclick="cerrarSoporte()">×</span>
        <h2>Soporte</h2>
        <form method="POST">
            <textarea name="mensaje_soporte" placeholder="Describe el problema técnico o incidencia..." required></textarea>
            <button type="submit" name="enviar_soporte">ENVIAR</button>

            <?php if($mensaje_soporte != ""){ ?>
                <div style="color:red; text-align:center; margin-top:10px; font-weight:bold;">
                    <?php echo htmlspecialchars($mensaje_soporte, ENT_QUOTES, 'UTF-8'); ?>
                </div>
            <?php } ?>
        </form>
    </div>




