<?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;
        }

        /* Formato principal utilizado por el formulario: HH:MM:SS. */
        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]);
        }

        /* Compatibilidad preventiva con duraciones antiguas MM:SS. */
        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;
    }
}

/* =========================================
   ENDPOINT AJAX: PUBLICAR NOTICIA
   Se ejecuta antes de cargar el módulo completo.
========================================= */
$es_ajax_publicar_noticia = (
    isset($_SERVER["REQUEST_METHOD"]) &&
    $_SERVER["REQUEST_METHOD"] === "POST" &&
    isset($_POST["ajax_publicar_noticia"])
);

if ($es_ajax_publicar_noticia) {
    while (ob_get_level() > 0) {
        ob_end_clean();
    }

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

    $config_path = dirname(__DIR__) . "/config.php";

    if (!file_exists($config_path)) {
        http_response_code(500);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se encontró la configuración del sistema."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    require_once $config_path;

    $usuario_ajax = 0;
    if (isset($admin_id)) {
        $usuario_ajax = intval($admin_id);
    } elseif (isset($_SESSION["usuario_id"])) {
        $usuario_ajax = intval($_SESSION["usuario_id"]);
    }

    if (!isset($conn) || !($conn instanceof mysqli)) {
        http_response_code(500);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se pudo conectar con la base de datos."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    $id_publicar = isset($_POST["id"]) ? intval($_POST["id"]) : 0;

    if ($id_publicar <= 0) {
        http_response_code(400);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "La noticia seleccionada no es válida."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    $verificar_publicacion = $conn->query(
        "SELECT id FROM notas
         WHERE id='$id_publicar'
           AND caracter='NOTA'
         LIMIT 1"
    );

    if (!$verificar_publicacion || $verificar_publicacion->num_rows === 0) {
        http_response_code(404);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se encontró la noticia."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    if (!$conn->query(
        "UPDATE notas
         SET estado_publicacion='publicada'
         WHERE id='$id_publicar'
           AND caracter='NOTA'
         LIMIT 1"
    )) {
        http_response_code(500);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se pudo publicar la noticia."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    if ($usuario_ajax > 0) {
        $conn->query(
            "INSERT INTO bitacora (usuario_id, accion, nota_id)
             VALUES ('$usuario_ajax', 'Publicó noticia', '$id_publicar')"
        );
    }

    echo json_encode(array(
        "ok" => true,
        "estado" => "publicada"
    ), JSON_UNESCAPED_UNICODE);
    exit();
}


/* =========================================
   ENDPOINT AJAX: DUPLICAR NOTICIA
========================================= */
$es_ajax_duplicar_noticia = (
    isset($_SERVER["REQUEST_METHOD"]) &&
    $_SERVER["REQUEST_METHOD"] === "POST" &&
    isset($_POST["ajax_duplicar_noticia"])
);

if ($es_ajax_duplicar_noticia) {

    while (ob_get_level() > 0) {
        ob_end_clean();
    }

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

    $config_path = dirname(__DIR__) . "/config.php";

    if (!file_exists($config_path)) {
        http_response_code(500);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se encontró la configuración del sistema."
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    require_once $config_path;

    if (!isset($conn) || !($conn instanceof mysqli)) {
        http_response_code(500);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se pudo conectar con la base de datos."
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    $usuario_ajax = 0;

    if (isset($admin_id)) {
        $usuario_ajax = intval($admin_id);
    } elseif (isset($_SESSION["usuario_id"])) {
        $usuario_ajax = intval($_SESSION["usuario_id"]);
    }

    $id_original = isset($_POST["id"])
        ? intval($_POST["id"])
        : 0;

    if ($id_original <= 0) {
        http_response_code(400);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "La noticia seleccionada no es válida."
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    $buscar_original = $conn->query(
        "SELECT *
         FROM notas
         WHERE id='$id_original'
           AND caracter='NOTA'
         LIMIT 1"
    );

    if (!$buscar_original || $buscar_original->num_rows === 0) {
        http_response_code(404);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se encontró la noticia que deseas duplicar."
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    $noticia_original = $buscar_original->fetch_assoc();

    $columnas_resultado = $conn->query("SHOW COLUMNS FROM notas");

    if (!$columnas_resultado) {
        http_response_code(500);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se pudieron revisar los campos de la noticia."
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    $columnas_insertar = array();
    $valores_insertar = array();

    while ($columna = $columnas_resultado->fetch_assoc()) {

        $nombre_columna = $columna["Field"];
        $extra_columna = strtolower((string)($columna["Extra"] ?? ""));

        if ($nombre_columna === "id") {
            continue;
        }

        if ($nombre_columna === "link_publico") {
            continue;
        }

        if (strpos($extra_columna, "auto_increment") !== false) {
            continue;
        }

        if (strpos($extra_columna, "generated") !== false) {
            continue;
        }

        $columnas_insertar[] = "`" . $nombre_columna . "`";

        if (
            array_key_exists($nombre_columna, $noticia_original) &&
            $noticia_original[$nombre_columna] !== null
        ) {
            $valor_seguro = $conn->real_escape_string(
                (string)$noticia_original[$nombre_columna]
            );

            $valores_insertar[] = "'" . $valor_seguro . "'";
        } else {
            $valores_insertar[] = "NULL";
        }
    }

    if (empty($columnas_insertar)) {
        http_response_code(500);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se encontraron campos para duplicar."
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    $sql_duplicar = "
        INSERT INTO notas (
            " . implode(",", $columnas_insertar) . "
        ) VALUES (
            " . implode(",", $valores_insertar) . "
        )
    ";

    if (!$conn->query($sql_duplicar)) {
        http_response_code(500);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se pudo duplicar la noticia: " . $conn->error
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    $nuevo_id = intval($conn->insert_id);

    $nuevo_link = "https://app.emisorascruz.pe/nota.php?id=" . $nuevo_id;
    $nuevo_link_sql = $conn->real_escape_string($nuevo_link);

    $conn->query(
        "UPDATE notas
         SET link_publico='$nuevo_link_sql'
         WHERE id='$nuevo_id'
         LIMIT 1"
    );

    if ($usuario_ajax > 0) {
        $conn->query(
            "INSERT INTO bitacora (usuario_id, accion, nota_id)
             VALUES (
                '$usuario_ajax',
                'Duplicó noticia desde ID: $id_original',
                '$nuevo_id'
             )"
        );
    }

    echo json_encode(array(
        "ok" => true,
        "mensaje" => "Noticia duplicada correctamente.",
        "id_original" => $id_original,
        "nuevo_id" => $nuevo_id
    ), JSON_UNESCAPED_UNICODE);

    exit();
}



/* =========================================
   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']) : "";



/* =========================================
   ENDPOINT AJAX: PUBLICAR NOTICIA
   Se ejecuta antes de cargar el módulo completo.
========================================= */
$es_ajax_publicar_noticia = (
    isset($_SERVER["REQUEST_METHOD"]) &&
    $_SERVER["REQUEST_METHOD"] === "POST" &&
    isset($_POST["ajax_publicar_noticia"])
);

if ($es_ajax_publicar_noticia) {
    while (ob_get_level() > 0) {
        ob_end_clean();
    }

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

    $config_path = dirname(__DIR__) . "/config.php";

    if (!file_exists($config_path)) {
        http_response_code(500);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se encontró la configuración del sistema."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    require_once $config_path;

    $usuario_ajax = 0;
    if (isset($admin_id)) {
        $usuario_ajax = intval($admin_id);
    } elseif (isset($_SESSION["usuario_id"])) {
        $usuario_ajax = intval($_SESSION["usuario_id"]);
    }

    if (!isset($conn) || !($conn instanceof mysqli)) {
        http_response_code(500);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se pudo conectar con la base de datos."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    $id_publicar = isset($_POST["id"]) ? intval($_POST["id"]) : 0;

    if ($id_publicar <= 0) {
        http_response_code(400);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "La noticia seleccionada no es válida."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    $verificar_publicacion = $conn->query(
        "SELECT id FROM notas
         WHERE id='$id_publicar'
           AND caracter='NOTA'
         LIMIT 1"
    );

    if (!$verificar_publicacion || $verificar_publicacion->num_rows === 0) {
        http_response_code(404);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se encontró la noticia."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    if (!$conn->query(
        "UPDATE notas
         SET estado_publicacion='publicada'
         WHERE id='$id_publicar'
           AND caracter='NOTA'
         LIMIT 1"
    )) {
        http_response_code(500);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se pudo publicar la noticia."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    if ($usuario_ajax > 0) {
        $conn->query(
            "INSERT INTO bitacora (usuario_id, accion, nota_id)
             VALUES ('$usuario_ajax', 'Publicó noticia', '$id_publicar')"
        );
    }

    echo json_encode(array(
        "ok" => true,
        "estado" => "publicada"
    ), JSON_UNESCAPED_UNICODE);
    exit();
}


/* =========================================
   ENDPOINT AJAX: DUPLICAR NOTICIA
========================================= */
$es_ajax_duplicar_noticia = (
    isset($_SERVER["REQUEST_METHOD"]) &&
    $_SERVER["REQUEST_METHOD"] === "POST" &&
    isset($_POST["ajax_duplicar_noticia"])
);

if ($es_ajax_duplicar_noticia) {

    while (ob_get_level() > 0) {
        ob_end_clean();
    }

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

    $config_path = dirname(__DIR__) . "/config.php";

    if (!file_exists($config_path)) {
        http_response_code(500);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se encontró la configuración del sistema."
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    require_once $config_path;

    if (!isset($conn) || !($conn instanceof mysqli)) {
        http_response_code(500);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se pudo conectar con la base de datos."
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    $usuario_ajax = 0;

    if (isset($admin_id)) {
        $usuario_ajax = intval($admin_id);
    } elseif (isset($_SESSION["usuario_id"])) {
        $usuario_ajax = intval($_SESSION["usuario_id"]);
    }

    $id_original = isset($_POST["id"])
        ? intval($_POST["id"])
        : 0;

    if ($id_original <= 0) {
        http_response_code(400);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "La noticia seleccionada no es válida."
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    $buscar_original = $conn->query(
        "SELECT *
         FROM notas
         WHERE id='$id_original'
           AND caracter='NOTA'
         LIMIT 1"
    );

    if (!$buscar_original || $buscar_original->num_rows === 0) {
        http_response_code(404);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se encontró la noticia que deseas duplicar."
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    $noticia_original = $buscar_original->fetch_assoc();

    $columnas_resultado = $conn->query("SHOW COLUMNS FROM notas");

    if (!$columnas_resultado) {
        http_response_code(500);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se pudieron revisar los campos de la noticia."
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    $columnas_insertar = array();
    $valores_insertar = array();

    while ($columna = $columnas_resultado->fetch_assoc()) {

        $nombre_columna = $columna["Field"];
        $extra_columna = strtolower((string)($columna["Extra"] ?? ""));

        if ($nombre_columna === "id") {
            continue;
        }

        if ($nombre_columna === "link_publico") {
            continue;
        }

        if (strpos($extra_columna, "auto_increment") !== false) {
            continue;
        }

        if (strpos($extra_columna, "generated") !== false) {
            continue;
        }

        $columnas_insertar[] = "`" . $nombre_columna . "`";

        if (
            array_key_exists($nombre_columna, $noticia_original) &&
            $noticia_original[$nombre_columna] !== null
        ) {
            $valor_seguro = $conn->real_escape_string(
                (string)$noticia_original[$nombre_columna]
            );

            $valores_insertar[] = "'" . $valor_seguro . "'";
        } else {
            $valores_insertar[] = "NULL";
        }
    }

    if (empty($columnas_insertar)) {
        http_response_code(500);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se encontraron campos para duplicar."
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    $sql_duplicar = "
        INSERT INTO notas (
            " . implode(",", $columnas_insertar) . "
        ) VALUES (
            " . implode(",", $valores_insertar) . "
        )
    ";

    if (!$conn->query($sql_duplicar)) {
        http_response_code(500);

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se pudo duplicar la noticia: " . $conn->error
        ), JSON_UNESCAPED_UNICODE);

        exit();
    }

    $nuevo_id = intval($conn->insert_id);

    $nuevo_link = "https://app.emisorascruz.pe/nota.php?id=" . $nuevo_id;
    $nuevo_link_sql = $conn->real_escape_string($nuevo_link);

    $conn->query(
        "UPDATE notas
         SET link_publico='$nuevo_link_sql'
         WHERE id='$nuevo_id'
         LIMIT 1"
    );

    if ($usuario_ajax > 0) {
        $conn->query(
            "INSERT INTO bitacora (usuario_id, accion, nota_id)
             VALUES (
                '$usuario_ajax',
                'Duplicó noticia desde ID: $id_original',
                '$nuevo_id'
             )"
        );
    }

    echo json_encode(array(
        "ok" => true,
        "mensaje" => "Noticia duplicada correctamente.",
        "id_original" => $id_original,
        "nuevo_id" => $nuevo_id
    ), JSON_UNESCAPED_UNICODE);

    exit();
}



/* =========================================
   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']) : "";

/* =========================================
   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";
}



/* =========================================
   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();
}



/* =========================================
   CREAR NUEVO REPORTE DESDE NOTICIAS
========================================= */
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['crear_reporte_desde_noticias'])) {

    $titulo_reporte = trim((string)($_POST['titulo_reporte'] ?? ''));
    $cliente_reporte_id = intval($_POST['cliente_reporte_id'] ?? 0);
    $ids_reporte_raw = trim((string)($_POST['noticias_ids_reporte'] ?? ''));

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

    if ($titulo_reporte === '' || $cliente_reporte_id <= 0 || empty($ids_reporte)) {
        echo "<script>
            alert('Completa el título, selecciona el cliente y elige al menos una noticia.');
            window.location.href='".$dashboard_actual."?modulo=noticias';
        </script>";
        exit();
    }

    $titulo_reporte_sql = $conn->real_escape_string($titulo_reporte);
    $total_reporte = count($ids_reporte);
    $fecha_reporte = date('Y-m-d');
    $lista_ids_reporte = implode(',', $ids_reporte);

    $cliente_valido = $conn->query(
        "SELECT id FROM clientes
         WHERE id='$cliente_reporte_id'
           AND estado='activo'
         LIMIT 1"
    );

    if (!$cliente_valido || $cliente_valido->num_rows === 0) {
        echo "<script>
            alert('El cliente seleccionado no es válido o está archivado.');
            window.location.href='".$dashboard_actual."?modulo=noticias';
        </script>";
        exit();
    }

    $noticias_validas = array();
    $buscar_noticias = $conn->query(
        "SELECT id FROM notas
         WHERE caracter='NOTA'
           AND id IN ($lista_ids_reporte)
         ORDER BY id ASC"
    );

    if ($buscar_noticias) {
        while ($fila_noticia = $buscar_noticias->fetch_assoc()) {
            $noticias_validas[] = intval($fila_noticia['id']);
        }
    }

    if (empty($noticias_validas)) {
        echo "<script>
            alert('No se encontraron noticias válidas para crear el reporte.');
            window.location.href='".$dashboard_actual."?modulo=noticias';
        </script>";
        exit();
    }

    $total_reporte = count($noticias_validas);
    $conn->begin_transaction();

    try {
        $sql_crear_reporte = "INSERT INTO reportes (
                                usuario_id,
                                cliente_id,
                                titulo,
                                total_notas,
                                total_alertas,
                                estado_acceso,
                                estado,
                                fecha_reporte
                              ) VALUES (
                                '$usuario_id',
                                '$cliente_reporte_id',
                                '$titulo_reporte_sql',
                                '$total_reporte',
                                '0',
                                'desbloqueado',
                                'activo',
                                '$fecha_reporte'
                              )";

        if (!$conn->query($sql_crear_reporte)) {
            throw new Exception('No se pudo crear el reporte: ' . $conn->error);
        }

        $nuevo_reporte_id = intval($conn->insert_id);
        $orden_reporte = 1;

        foreach ($noticias_validas as $nota_reporte_id) {
            $nota_reporte_id = intval($nota_reporte_id);

            if (!$conn->query(
                "INSERT INTO reportes_notas (reporte_id, nota_id, orden)
                 VALUES ('$nuevo_reporte_id', '$nota_reporte_id', '$orden_reporte')"
            )) {
                throw new Exception('No se pudo agregar una noticia al reporte: ' . $conn->error);
            }

            $orden_reporte++;
        }

        $conn->query(
            "UPDATE clientes
             SET reportes=(
                 SELECT COUNT(*)
                 FROM reportes
                 WHERE cliente_id='$cliente_reporte_id'
                   AND estado='activo'
             )
             WHERE id='$cliente_reporte_id'
             LIMIT 1"
        );

        $accion_bitacora_reporte = $conn->real_escape_string(
            "Creó reporte desde Noticias: " . $titulo_reporte
        );

        $conn->query(
            "INSERT INTO bitacora (usuario_id, accion, nota_id)
             VALUES ('$usuario_id', '$accion_bitacora_reporte', '0')"
        );

        $conn->commit();

        echo "<script>
            alert('Reporte creado correctamente con ".$total_reporte." noticia(s).');
            window.location.href='".$dashboard_actual."?modulo=noticias';
        </script>";
        exit();

    } catch (Throwable $error_reporte) {
        $conn->rollback();
        $mensaje_error_reporte = addslashes($error_reporte->getMessage());

        echo "<script>
            alert('No se pudo crear el reporte: ".$mensaje_error_reporte."');
            window.location.href='".$dashboard_actual."?modulo=noticias';
        </script>";
        exit();
    }
}


/* =========================================
   AGREGAR NOTICIAS A REPORTE EXISTENTE
========================================= */
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['agregar_reporte_existente_desde_noticias'])) {

    $reporte_existente_id = intval($_POST['reporte_existente_id'] ?? 0);
    $ids_existente_raw = trim((string)($_POST['noticias_ids_reporte_existente'] ?? ''));

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

    if ($reporte_existente_id <= 0 || empty($ids_existente)) {
        echo "<script>
            alert('Selecciona un reporte y elige al menos una noticia.');
            window.location.href='".$dashboard_actual."?modulo=noticias';
        </script>";
        exit();
    }

    $reporte_valido = $conn->query(
        "SELECT id, titulo
         FROM reportes
         WHERE id='$reporte_existente_id'
           AND estado='activo'
         LIMIT 1"
    );

    if (!$reporte_valido || $reporte_valido->num_rows === 0) {
        echo "<script>
            alert('El reporte seleccionado no existe o no está activo.');
            window.location.href='".$dashboard_actual."?modulo=noticias';
        </script>";
        exit();
    }

    $fila_reporte_existente = $reporte_valido->fetch_assoc();
    $titulo_reporte_existente = trim((string)$fila_reporte_existente['titulo']);
    $lista_ids_existente = implode(',', $ids_existente);
    $noticias_validas_existente = array();

    $buscar_noticias_existente = $conn->query(
        "SELECT id
         FROM notas
         WHERE caracter='NOTA'
           AND id IN ($lista_ids_existente)
           AND (tipo_medio IS NULL OR tipo_medio<>'Archivo')
         ORDER BY id ASC"
    );

    if ($buscar_noticias_existente) {
        while ($fila_noticia_existente = $buscar_noticias_existente->fetch_assoc()) {
            $noticias_validas_existente[] = intval($fila_noticia_existente['id']);
        }
    }

    if (empty($noticias_validas_existente)) {
        echo "<script>
            alert('No se encontraron noticias válidas para agregar.');
            window.location.href='".$dashboard_actual."?modulo=noticias';
        </script>";
        exit();
    }

    $agregadas_existente = 0;
    $duplicadas_existente = 0;
    $conn->begin_transaction();

    try {
        $q_orden_existente = $conn->query(
            "SELECT COALESCE(MAX(orden), 0) AS ultimo_orden
             FROM reportes_notas
             WHERE reporte_id='$reporte_existente_id'"
        );

        $orden_existente = 1;
        if ($q_orden_existente && $fila_orden_existente = $q_orden_existente->fetch_assoc()) {
            $orden_existente = intval($fila_orden_existente['ultimo_orden']) + 1;
        }

        foreach ($noticias_validas_existente as $nota_existente_id) {
            $nota_existente_id = intval($nota_existente_id);

            $ya_existe = $conn->query(
                "SELECT id
                 FROM reportes_notas
                 WHERE reporte_id='$reporte_existente_id'
                   AND nota_id='$nota_existente_id'
                 LIMIT 1"
            );

            if ($ya_existe && $ya_existe->num_rows > 0) {
                $duplicadas_existente++;
                continue;
            }

            if (!$conn->query(
                "INSERT INTO reportes_notas (reporte_id, nota_id, orden)
                 VALUES ('$reporte_existente_id', '$nota_existente_id', '$orden_existente')"
            )) {
                throw new Exception('No se pudo agregar una noticia al reporte: ' . $conn->error);
            }

            $agregadas_existente++;
            $orden_existente++;
        }

        if (!$conn->query(
            "UPDATE reportes
             SET total_notas=(
                 SELECT COUNT(*)
                 FROM reportes_notas
                 WHERE reporte_id='$reporte_existente_id'
             )
             WHERE id='$reporte_existente_id'
             LIMIT 1"
        )) {
            throw new Exception('No se pudo actualizar el total del reporte: ' . $conn->error);
        }

        $accion_bitacora_existente = $conn->real_escape_string(
            "Agregó noticias al reporte existente: " . $titulo_reporte_existente
        );

        $conn->query(
            "INSERT INTO bitacora (usuario_id, accion, nota_id)
             VALUES ('$usuario_id', '$accion_bitacora_existente', '0')"
        );

        $conn->commit();

        $mensaje_resultado_existente = '';
        if ($agregadas_existente > 0) {
            $mensaje_resultado_existente .= 'Se agregaron ' . $agregadas_existente . ' noticia(s) al reporte.';
        }
        if ($duplicadas_existente > 0) {
            if ($mensaje_resultado_existente !== '') {
                $mensaje_resultado_existente .= '\\n\\n';
            }
            $mensaje_resultado_existente .= $duplicadas_existente . ' noticia(s) ya habían sido agregadas anteriormente y no se duplicaron.';
        }
        if ($mensaje_resultado_existente === '') {
            $mensaje_resultado_existente = 'No se agregó ninguna noticia.';
        }

        echo "<script>
            alert(" . json_encode($mensaje_resultado_existente, JSON_UNESCAPED_UNICODE) . ");
            window.location.href='".$dashboard_actual."?modulo=noticias';
        </script>";
        exit();

    } catch (Throwable $error_existente) {
        $conn->rollback();
        $mensaje_error_existente = addslashes($error_existente->getMessage());

        echo "<script>
            alert('No se pudieron agregar las noticias: ".$mensaje_error_existente."');
            window.location.href='".$dashboard_actual."?modulo=noticias';
        </script>";
        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_actual."?modulo=noticias".$volver_archivadas."';
      </script>";
    exit();
}

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

$fecha_nota = isset($_POST['fecha_nota'])
    ? limpiarDato($_POST['fecha_nota'])
    : "";

$tipo_medio = isset($_POST['tipo_medio'])
    ? limpiarDato($_POST['tipo_medio'])
    : "";

$hora_nota = isset($_POST['hora_nota'])
    ? trim((string)$_POST['hora_nota'])
    : "";
$hora_error = false;
$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 ($tipo_medio === "Radio" || $tipo_medio === "Televisión" || $tipo_medio === "Television") {
    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;
    }
}

/* Radio y Televisión: usar la hora escrita por el usuario. */
if ($tipo_medio === "Radio" || $tipo_medio === "Televisión") {

    if (!preg_match('/^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/', $hora_nota)) {
        $mensaje = "";
        $hora_error = true;
    } else {
        $fecha_nota = $fecha_nota . " " . $hora_nota;
    }

/* Los demás tipos conservan la fecha seleccionada y toman la hora del sistema. */
} elseif ($fecha_nota !== "") {

    $fecha_nota = $fecha_nota . " " . date("H:i:s");
}
    $subtipo_medio = isset($_POST['subtipo_medio']) ? limpiarDato($_POST['subtipo_medio']) : "";
    /* El campo Cliente fue retirado de Noticias. */
    $cliente_id = 0;
    $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') : "";
    
    /* =========================================
   GUARDAR DATOS COMPLETOS DE LA NOTICIA
========================================= */

$archivo_adjunto_ids = isset($_POST['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);

$valorizacion_prensa = calcularValorizacionPrensa(
    $conn,
    $tipo_medio,
    $subtipo_medio,
    $_POST
);

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

/* Una sola fuente para guardar medio y tarifa, según el tipo de noticia. */
$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'];
}

$datos_extra = array(

    "archivo_adjunto_ids" => $archivo_adjunto_ids,
    "departamento" => limpiarDato($_POST['departamento'] ?? ""),
    "localidad"    => limpiarDato($_POST['localidad'] ?? ""),
    "seccion"      => limpiarDato($_POST['seccion'] ?? ""),
    "pagina"       => limpiarDato($_POST['pagina'] ?? ""),
    "columnas"     => limpiarDato($_POST['columnas'] ?? ""),
    "modulos"      => limpiarDato($_POST['modulos'] ?? ""),
    "programa"     => limpiarDato($_POST['programa'] ?? ""),
    "duracion"     => limpiarDato($_POST['duracion'] ?? ""),
    "hora_nota"    => $hora_nota,
    "enlace"       => limpiarDato($_POST['enlace'] ?? ""),
    "paginas_detalle" => $valorizacion_prensa['paginas_detalle'],
    "area_cm2" => $valorizacion_prensa['area_cm2'],
    "costo_cm2" => $valorizacion_prensa['costo_cm2'],
    "valor_noticia" => $tarifa_valorizada !== null ? round($tarifa_valorizada, 2) : 0.0,
    "duracion_segundos" => $valorizacion_radio_tv['duracion_segundos'],
    "costo_segundo" => $valorizacion_radio_tv['costo_segundo']

);    
    
    
    $etiquetas_clientes = isset($_POST['etiquetas']) ? limpiarDato($_POST['etiquetas']) : "";

if ($etiquetas_clientes !== "") {

    $descripcion .= "\n\nEtiquetas: ".$etiquetas_clientes;

}

$descripcion .= "\n\n__DATOS_NOTICIA__:" . base64_encode(
    json_encode(
        $datos_extra,
        JSON_UNESCAPED_UNICODE
    )
);

    /* Usar el primer archivo adjunto seleccionado como miniatura de la noticia. */
    $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<>''
                 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 ($hora_error || $duracion_error) {

    /* La hora o duración inválida se muestra junto al campo y no se guarda la noticia. */

} elseif ($mensaje !== "") {

    /* Mantener el mensaje específico, por ejemplo, hora inválida. */

} elseif (
    $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,
                            medio_id,
                            tarifa,
                            tipo_nota,
                            cliente_id,
                            caracter,
                            titulo,
                            descripcion,
                            archivo,
                            estado,
                            correcciones
                        ) VALUES (
                            '$usuario_id',
                            '$fecha_nota',
                            '$tipo_medio',
                            '$subtipo_medio',
                            ".($medio_id_valorizado > 0 ? "'".$medio_id_valorizado."'" : "NULL").",
                            ".($tarifa_valorizada !== null ? "'".number_format($tarifa_valorizada, 2, '.', '')."'" : "NULL").",
                            '$tipo_nota',
                            ".($cliente_id > 0 ? "'$cliente_id'" : "NULL").",
                            '$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')");

            /* Después de guardar, abrir un formulario nuevo del mismo tipo de medio. */
            $formulario_siguiente = "prensa";

            if ($tipo_medio === "Radio" || $tipo_medio === "Televisión" || $tipo_medio === "Television") {
                $formulario_siguiente = "radio_tv";
            } elseif ($tipo_medio === "Redes Sociales" || $tipo_medio === "Página Web" || $tipo_medio === "Pagina Web") {
                $formulario_siguiente = "redes_web";
            }

            echo "<script>
        alert('Noticia registrada correctamente');
        window.location.href='".$dashboard_actual."?modulo=noticias&form=".$formulario_siguiente."';
        </script>";
            exit();
        } else {
            $mensaje = "No se pudo registrar la noticia.";
        }
    }
}


/* =========================================
   AJAX: ACTUALIZAR DATOS DE ARCHIVO ADJUNTO
========================================= */
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST["ajax_actualizar_adjunto"])) {

    while (ob_get_level() > 0) {
        ob_end_clean();
    }

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

    if (!isset($conn) || !($conn instanceof mysqli)) {
        http_response_code(500);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se pudo conectar con la base de datos."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    $adjunto_id = isset($_POST["id"]) ? intval($_POST["id"]) : 0;
    $adjunto_titulo = trim((string)($_POST["titulo"] ?? ""));
    $adjunto_descripcion = trim((string)($_POST["descripcion"] ?? ""));
    $adjunto_fecha = trim((string)($_POST["fecha"] ?? ""));

    if ($adjunto_id <= 0) {
        http_response_code(400);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "El archivo seleccionado no es válido."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    if ($adjunto_titulo === "") {
        http_response_code(400);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "El título es obligatorio."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    $fecha_valida = DateTime::createFromFormat("Y-m-d", $adjunto_fecha);
    $errores_fecha = DateTime::getLastErrors();

    if (
        !$fecha_valida ||
        ($errores_fecha !== false && (
            intval($errores_fecha["warning_count"]) > 0 ||
            intval($errores_fecha["error_count"]) > 0
        )) ||
        $fecha_valida->format("Y-m-d") !== $adjunto_fecha
    ) {
        http_response_code(400);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "La fecha seleccionada no es válida."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    $titulo_sql = $conn->real_escape_string($adjunto_titulo);
    $descripcion_sql = $conn->real_escape_string($adjunto_descripcion);
    $fecha_sql = $conn->real_escape_string($adjunto_fecha);

    $verificar = $conn->query(
        "SELECT id
         FROM archivos
         WHERE id='$adjunto_id'
           AND estado='activo'
         LIMIT 1"
    );

    if (!$verificar || $verificar->num_rows === 0) {
        http_response_code(404);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se encontró el archivo que deseas actualizar."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    $actualizado = $conn->query(
        "UPDATE archivos
         SET titulo='$titulo_sql',
             descripcion='$descripcion_sql',
             fecha_archivo='$fecha_sql'
         WHERE id='$adjunto_id'
         LIMIT 1"
    );

    if (!$actualizado) {
        http_response_code(500);
        echo json_encode(array(
            "ok" => false,
            "mensaje" => "No se pudieron guardar los cambios."
        ), JSON_UNESCAPED_UNICODE);
        exit();
    }

    echo json_encode(array(
        "ok" => true,
        "mensaje" => "Archivo actualizado correctamente.",
        "id" => $adjunto_id,
        "titulo" => $adjunto_titulo,
        "descripcion" => $adjunto_descripcion,
        "fecha" => $adjunto_fecha
    ), JSON_UNESCAPED_UNICODE);
    exit();
}


/* =========================================
   AJAX CARGAR ARCHIVOS ADJUNTOS AL REPOSITORIO
========================================= */
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');

    if (!isset($_FILES['archivo']) || empty($_FILES['archivo']['name'])) {
        echo json_encode(array("ok" => false, "mensaje" => "No se recibió archivo."));
        exit();
    }

    $upload_info = crearCarpetaUploadUsuario($conn, $usuario_id, dirname(__DIR__));
    $carpeta = $upload_info["dir"] . "/";
    $carpeta_relativa = $upload_info["rel"];

    $archivo_original = basename($_FILES["archivo"]["name"]);
    $nombre_limpio = preg_replace("/[^A-Za-z0-9_\.\-]/", "_", $archivo_original);
    $archivo_nombre = time() . "_" . uniqid() . "_" . $nombre_limpio;
    $archivo_relativo = $carpeta_relativa . $archivo_nombre;
    $ruta = $carpeta . $archivo_nombre;

    $archivo_repetido = false;
    $tamano_archivo = intval($_FILES["archivo"]["size"]);
    $archivos_existentes = glob($carpeta . "*_" . $nombre_limpio);

    if ($archivos_existentes) {
        foreach ($archivos_existentes as $archivo_existente) {
            if (is_file($archivo_existente) && filesize($archivo_existente) == $tamano_archivo) {
                $archivo_repetido = true;
                break;
            }
        }
    }

    if ($archivo_repetido) {
        echo json_encode(array("ok" => false, "duplicado" => true, "mensaje" => "Archivo repetido. No se subió para ahorrar espacio."));
        exit();
    }

    if (!move_uploaded_file($_FILES["archivo"]["tmp_name"], $ruta)) {
        echo json_encode(array("ok" => false, "mensaje" => "No se pudo mover el archivo al servidor."));
        exit();
    }

    $fecha_archivo = date("Y-m-d");
    $titulo = limpiarDato(pathinfo($archivo_original, PATHINFO_FILENAME));
    $descripcion = limpiarDato("Archivo cargado desde el formulario de noticias.");

    $extension_archivo = strtolower(pathinfo($archivo_original, PATHINFO_EXTENSION));
    $tipo_archivo = "documento";

    if (in_array($extension_archivo, array("mp3", "wav", "aac", "ogg", "m4a"))) {
        $tipo_archivo = "audio";
    } elseif (in_array($extension_archivo, array("mp4", "webm", "mov", "avi", "mkv"))) {
        $tipo_archivo = "video";
    } elseif (in_array($extension_archivo, array("jpg", "jpeg", "png", "gif", "webp"))) {
        $tipo_archivo = "imagen";
    } elseif ($extension_archivo === "pdf") {
        $tipo_archivo = "pdf";
    }

    $sql = "INSERT INTO archivos (
                usuario_id,
                titulo,
                descripcion,
                archivo,
                tipo_archivo,
                fecha_archivo,
                estado
            ) VALUES (
                '$usuario_id',
                '".$conn->real_escape_string($titulo)."',
                '".$conn->real_escape_string($descripcion)."',
                '".$conn->real_escape_string($archivo_relativo)."',
                '".$conn->real_escape_string($tipo_archivo)."',
                '$fecha_archivo',
                'activo'
            )";

    if ($conn->query($sql) === TRUE) {
        $archivo_id = $conn->insert_id;

        $accion_bitacora = $conn->real_escape_string(
            "Cargó archivo adjunto desde noticias: " . $archivo_original
        );

        $conn->query("INSERT INTO bitacora (usuario_id, accion, nota_id)
                      VALUES ('$usuario_id', '$accion_bitacora', '0')");

        echo json_encode(array(
            "ok" => true,
            "mensaje" => "Archivo cargado correctamente.",
            "id" => $archivo_id,
            "archivo" => $archivo_relativo,
            "titulo" => $titulo
        ));
    } else {
        if (file_exists($ruta)) {
            unlink($ruta);
        }

        echo json_encode(array(
            "ok" => false,
            "mensaje" => "El archivo subió, pero no se registró en el repositorio."
        ));
    }

    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');
        alert('Reporte enviado correctamente');
        window.location.href='".$dashboard_actual."?modulo=noticias';
      </script>";
        exit();
    }
}

/* =========================================
   MEDIOS ACTIVOS
========================================= */
$medios_array = [];
$medios_region_por_nombre = [];
$sql_medios = "SELECT id, region, provincia, ciudad, tipo_medio, nombre_medio
               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;

        /* Índice auxiliar solo para mostrar la región en las tarjetas.
           No cambia la base de datos ni la forma en que se guardan las noticias. */
        $clave_medio = mb_strtolower(
            trim((string)($medio['tipo_medio'] ?? '')) . '|' .
            trim((string)($medio['nombre_medio'] ?? '')),
            'UTF-8'
        );

        if ($clave_medio !== '|') {
            $medios_region_por_nombre[$clave_medio] = trim((string)($medio['region'] ?? '')).', '.trim((string)($medio['ciudad'] ?? ''));
        }
    }
}

/* =========================================
   CLIENTES ACTIVOS PARA CREAR REPORTES
========================================= */
$clientes_reporte = array();
$resultado_clientes_reporte = $conn->query(
    "SELECT id, razon_social
     FROM clientes
     WHERE estado='activo'
     ORDER BY razon_social ASC"
);

if ($resultado_clientes_reporte && $resultado_clientes_reporte->num_rows > 0) {
    while ($cliente_reporte = $resultado_clientes_reporte->fetch_assoc()) {
        $clientes_reporte[] = $cliente_reporte;
    }
}

/* =========================================
   REPORTES ACTIVOS PARA AGREGAR NOTICIAS
========================================= */
$reportes_existentes_noticias = array();
$resultado_reportes_existentes = $conn->query(
    "SELECT r.id, r.titulo, COALESCE(c.razon_social, 'Sin cliente asignado') AS cliente
     FROM reportes r
     LEFT JOIN clientes c ON c.id=r.cliente_id
     WHERE r.estado='activo'
     ORDER BY r.titulo ASC, r.id DESC"
);

if ($resultado_reportes_existentes && $resultado_reportes_existentes->num_rows > 0) {
    while ($reporte_existente_item = $resultado_reportes_existentes->fetch_assoc()) {
        $reportes_existentes_noticias[] = array(
            'id' => intval($reporte_existente_item['id']),
            'titulo' => trim((string)$reporte_existente_item['titulo']),
            'cliente' => trim((string)$reporte_existente_item['cliente'])
        );
    }
}


/* =========================================
   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']) : "";
$filtro_medio = isset($_GET['medio']) ? limpiarDato($_GET['medio']) : "";

/* Filtro múltiple de departamentos. */
$filtros_departamentos = array();

if (isset($_GET['departamentos']) && is_array($_GET['departamentos'])) {
    foreach ($_GET['departamentos'] as $departamento_recibido) {
        $departamento_limpio = limpiarDato($departamento_recibido);

        if ($departamento_limpio !== '') {
            $filtros_departamentos[] = $departamento_limpio;
        }
    }
}

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

$filtros_departamentos = array_values(array_unique($filtros_departamentos));

/* Filtro múltiple de etiquetas. */
$filtros_etiquetas = array();

if (isset($_GET['etiquetas']) && is_array($_GET['etiquetas'])) {
    foreach ($_GET['etiquetas'] as $etiqueta_recibida) {
        $etiqueta_limpia = limpiarDato($etiqueta_recibida);

        if ($etiqueta_limpia !== '') {
            $filtros_etiquetas[] = $etiqueta_limpia;
        }
    }
}

/* Compatibilidad con un filtro antiguo de una sola etiqueta. */
if (empty($filtros_etiquetas) && isset($_GET['etiqueta']) && $_GET['etiqueta'] !== '') {
    $filtros_etiquetas[] = limpiarDato($_GET['etiqueta']);
}

$filtros_etiquetas = array_values(array_unique($filtros_etiquetas));

// 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'";
}

if ($filtro_medio !== "") {
    $filtro_medio_sql = $conn->real_escape_string($filtro_medio);
    $where .= " AND subtipo_medio LIKE '%$filtro_medio_sql%'";
}

if (!empty($filtros_etiquetas)) {
    $condiciones_etiquetas = array();

    foreach ($filtros_etiquetas as $etiqueta_filtrada) {
        $etiqueta_sql = $conn->real_escape_string($etiqueta_filtrada);

        $condiciones_etiquetas[] =
            "(descripcion LIKE '%Etiquetas:%" . $etiqueta_sql . "%'
              OR descripcion LIKE '%Etiquetas/Clientes:%" . $etiqueta_sql . "%')";
    }

    /* Mostrar noticias que coincidan con cualquiera de las etiquetas elegidas. */
    $where .= " AND (" . implode(" OR ", $condiciones_etiquetas) . ")";
}

$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;
    }
}

/* Aplicar el filtro múltiple de departamentos sobre los datos guardados dentro de cada noticia. */
if (!empty($filtros_departamentos) && !empty($noticias)) {
    $departamentos_normalizados = array_map(function($valor) {
        return mb_strtolower(trim((string)$valor), 'UTF-8');
    }, $filtros_departamentos);

    $noticias = array_values(array_filter($noticias, function($noticia) use ($departamentos_normalizados, $medios_region_por_nombre) {
        $departamento_noticia = '';
        $descripcion_noticia = (string)($noticia['descripcion'] ?? '');

        if (preg_match('/__DATOS_NOTICIA__\s*:\s*([A-Za-z0-9+\/=]+)/', $descripcion_noticia, $coincidencia_datos)) {
            $json_datos = base64_decode($coincidencia_datos[1], true);

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

                if (is_array($datos_noticia)) {
                    $departamento_noticia = trim((string)($datos_noticia['departamento'] ?? ''));
                }
            }
        }

        /* Respaldo para noticias antiguas: obtener la región según tipo y nombre del medio. */
        if ($departamento_noticia === '') {
            $clave_medio_noticia = mb_strtolower(
                trim((string)($noticia['tipo_medio'] ?? '')) . '|' .
                trim((string)($noticia['subtipo_medio'] ?? '')),
                'UTF-8'
            );

            if (isset($medios_region_por_nombre[$clave_medio_noticia])) {
                $ubicacion_medio = trim((string)$medios_region_por_nombre[$clave_medio_noticia]);
                $partes_ubicacion = array_map('trim', explode(',', $ubicacion_medio));
                $departamento_noticia = (string)($partes_ubicacion[0] ?? '');
            }
        }

        return in_array(
            mb_strtolower($departamento_noticia, 'UTF-8'),
            $departamentos_normalizados,
            true
        );
    }));
}


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

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

$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;
}

/* PANTALLA PRINCIPAL: filtros y barra superior fijos; solo bajan las noticias. */
.news-page:not(.form-prensa):not(.form-radio-tv):not(.form-redes-web){
    height:100vh;
    min-height:0;
    overflow:hidden;
    align-items:stretch;
}

.news-page:not(.form-prensa):not(.form-radio-tv):not(.form-redes-web) .news-filters{
    height:100vh;
    overflow-y:auto;
    overscroll-behavior:contain;
    position:sticky;
    top:0;
}

.news-page:not(.form-prensa):not(.form-radio-tv):not(.form-redes-web) .news-main{
    height:100vh;
    min-height:0;
    overflow-y:auto;
    overscroll-behavior:contain;
    position:relative;
}

.news-page:not(.form-prensa):not(.form-radio-tv):not(.form-redes-web) .news-top{
    position:sticky;
    top:-28px;
    z-index:420;
    background:#fff;
    padding-top:28px;
    padding-bottom:18px;
    margin-bottom:0;
    border-bottom:1px solid #e3e5ef;
}

.news-page:not(.form-prensa):not(.form-radio-tv):not(.form-redes-web) .news-divider{
    margin-top:15px;
}

.filtro-etiquetas-selector,
.filtro-departamentos-selector{
    margin-bottom:14px;
}

.filtro-etiquetas-box,
.filtro-departamentos-box{
    min-height:46px;
    width:100%;
    border:1px solid #d9dce8;
    border-radius:8px;
    background:#fff;
    padding:6px 32px 6px 8px;
    display:flex;
    align-items:center;
    align-content:center;
    flex-wrap:wrap;
    gap:5px;
    box-shadow:none;
    transition:border-color .18s ease, box-shadow .18s ease;
}

.filtro-etiquetas-box:focus-within,
.filtro-departamentos-box:focus-within{
    border-color:#ef5124;
    box-shadow:0 0 0 3px rgba(239,81,36,.10);
}

/* Evitar el efecto de cuadro dentro de otro cuadro provocado por los estilos generales del filtro. */
.filter-block .filtro-etiquetas-box .cliente-search-inline,
.filter-block .filtro-departamentos-box .cliente-search-inline{
    width:auto !important;
    min-width:55px;
    flex:1 1 70px;
    height:28px;
    margin:0 !important;
    padding:3px 2px !important;
    border:0 !important;
    border-radius:0 !important;
    outline:0 !important;
    background:transparent !important;
    box-shadow:none !important;
    color:#1e2942;
    font-size:13px;
}

.filter-block .filtro-etiquetas-box .cliente-search-inline:focus,
.filter-block .filtro-departamentos-box .cliente-search-inline:focus{
    border:0 !important;
    outline:0 !important;
    box-shadow:none !important;
}

.filtro-etiquetas-box .cliente-tag,
.filtro-departamentos-box .cliente-tag{
    min-height:26px;
    max-width:100%;
    margin:0;
    padding:4px 8px;
    border:1px solid #f2b39f;
    border-radius:14px;
    background:#fff0ea;
    color:#c73f18;
    font-size:12px;
    line-height:1.15;
    gap:5px;
}

.filtro-etiquetas-box .cliente-tag button,
.filtro-departamentos-box .cliente-tag button{
    color:#c73f18;
    font-size:14px;
    line-height:1;
}

.filtro-etiquetas-selector .clientes-dropdown,
.filtro-departamentos-selector .clientes-dropdown{
    z-index:700;
    max-height:245px;
    margin-top:4px;
    border:1px solid #d9dce8;
    border-radius:8px;
    box-shadow:0 10px 24px rgba(0,0,0,.14);
    overflow:hidden auto;
}

.filtro-etiquetas-selector .cliente-option,
.filtro-departamentos-selector .cliente-option{
    padding:10px 12px;
    border-bottom:1px solid #eef0f5;
    font-size:13px;
}

.filtro-etiquetas-selector .cliente-option:last-child,
.filtro-departamentos-selector .cliente-option:last-child{
    border-bottom:0;
}

.filtro-etiquetas-selector .cliente-option:hover,
.filtro-departamentos-selector .cliente-option:hover{
    background:#fff0ea;
    color:#ef5124;
}
.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:none;background:#efeff7;color:#9ca3b5;padding:15px;border-radius:8px;font-weight:bold;cursor:pointer;text-transform:uppercase;font-size:12px;}
.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;}

.filtro-medio-inteligente{position:relative;}
.filtro-medio-inteligente input[type="text"]{
    width:100%;
    border:1px solid #d9dce8;
    border-radius:8px;
    padding:13px;
    color:#1e2942;
    font-size:14px;
    margin-bottom:14px;
    background:white;
}
.filtro-medio-resultados{
    display:none;
    position:absolute;
    left:0;
    right:0;
    top:49px;
    max-height:260px;
    overflow-y:auto;
    background:#fff;
    border:1px solid #d9dce8;
    border-radius:8px;
    box-shadow:0 10px 24px rgba(0,0,0,.14);
    z-index:500;
}
.filtro-medio-resultados.show{display:block;}
.filtro-medio-opcion{
    padding:10px 12px;
    border-bottom:1px solid #eef0f5;
    cursor:pointer;
    background:#fff;
}
.filtro-medio-opcion:last-child{border-bottom:0;}
.filtro-medio-opcion:hover{background:#fff0ea;}
.filtro-medio-opcion strong{
    display:block;
    color:#1e2942;
    font-size:13px;
    margin-bottom:3px;
}
.filtro-medio-opcion small{
    display:block;
    color:#8a90a3;
    font-size:11px;
    line-height:1.3;
}
.filtro-medio-vacio{
    padding:12px;
    color:#8a90a3;
    font-size:12px;
    text-align:center;
}


/* =========================
   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 EMISIÓN - RADIO Y TELEVISIÓN */
.radio-fecha-hora-cabecera{
    display:flex;
    align-items:center;
    justify-content:space-between;
    gap:12px;
    margin-bottom:9px;
}

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

.radio-hora-inline{
    display:flex;
    align-items:center;
    justify-content:flex-end;
    gap:7px;
    margin-left:auto;
}

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

.radio-hora-input{
    width:94px;
    height:32px;
    border:1px solid #d9dce8;
    border-radius:5px;
    background:#fff;
    color:#1e2942;
    font-size:14px;
    text-align:center;
    padding:5px 7px;
    outline:none;
}

.radio-hora-input:focus{
    border-color:#ef5124;
}
    
.radio-hora-input.error{
    border:2px solid #dc3545 !important;
    background:#fff5f5;
    box-shadow:0 0 0 3px rgba(220,53,69,.16);
}
.hora-error-mensaje{
    color:#dc3545;
    font-size:12px;
    font-weight:bold;
    margin-top:5px;
    width:100%;
}
.hora-error-parpadeo{
    animation:horaErrorParpadeo .75s ease-in-out 4;
}
@keyframes horaErrorParpadeo{
    0%,100%{box-shadow:0 0 0 3px rgba(220,53,69,.16);}
    50%{box-shadow:0 0 0 6px rgba(239,81,36,.40);}
}

.radio-hora-input::placeholder{
    color:#9ca3b5;
}
.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 220px 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:220px;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:24px;color:#9aa0b5;font-size:14px;margin-bottom:16px;align-items:center;}
.news-title{font-size:17px;font-weight:bold;color:#1e2942;text-decoration:underline;margin-bottom:18px;display:block;line-height:1.35;}
.tags{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:18px;min-height:23px;}
.tag{background:#e8eaf2;color:#1e2942;padding:5px 10px;border-radius:12px;font-size:11px;font-weight:bold;text-transform:uppercase;}
.tone-line-wrap{height:9px;display:flex;align-items:center;margin-bottom:18px;}
.tone-line{display:block;width:62px;height:4px;border-radius:4px;}
.news-source{display:flex;align-items:center;gap:14px;font-size:15px;color:#1e2942;margin-top:4px;}
.news-source strong{color:#ef5124;text-transform:uppercase;font-size:14px;white-space:nowrap;}
.news-source-separator{display:inline-block;width:24px;height:1px;background:#1e2942;flex:0 0 24px;}
.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;
    display:inline-flex;
    align-items:center;
    justify-content:center;
    padding:0;
    transition:.18s ease;
}
.action-mini:hover{transform:translateY(-1px);filter:brightness(.98);}
.action-mini svg{width:18px;height:18px;display:block;}
.action-mini.btn-publicar{
    background:#f0f1f8;
    color:#a4a9ba;
}
.action-mini.btn-publicada{
    background:#54d99a;
    color:#fff;
}
.action-mini.btn-publicar:disabled{
    opacity:.6;
    cursor:wait;
    transform:none;
}
.acciones-publicadas-extra{
    display:inline-flex;
    align-items:center;
    gap:10px;
}
.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;}
.news-value-empty{align-items:center;padding-left:0;}
.news-value-placeholder{display:block;width:55px;height:2px;background:#d9dce8;border-radius:2px;}
.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;}
.adjunto-card{border:1px solid #d9dce8;border-radius:8px;overflow:hidden;background:white;cursor:pointer;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;}

.reporte-modal-overlay{
    display:none;
    position:fixed;
    inset:0;
    background:rgba(15,23,42,.62);
    z-index:1200;
    align-items:center;
    justify-content:center;
    padding:20px;
}
.reporte-modal-overlay.show{display:flex;}
.reporte-modal-box{
    width:100%;
    max-width:560px;
    background:#fff;
    border-radius:14px;
    box-shadow:0 24px 65px rgba(0,0,0,.28);
    padding:28px;
    position:relative;
}
.reporte-modal-box h2{color:#1e2942;margin:0 40px 8px 0;font-size:23px;}
.reporte-modal-box p{color:#7b8193;font-size:13px;line-height:1.45;margin-bottom:22px;}
.reporte-modal-cerrar{position:absolute;right:18px;top:14px;border:0;background:transparent;font-size:30px;color:#7b8193;cursor:pointer;}
.reporte-modal-field{margin-bottom:17px;}
.reporte-modal-field label{display:block;color:#1e2942;font-size:13px;font-weight:bold;margin-bottom:7px;}
.reporte-modal-field input,.reporte-modal-field select{width:100%;border:1px solid #d9dce8;border-radius:8px;padding:13px 14px;font-size:14px;color:#1e2942;background:#fff;}
.reporte-modal-count{background:#fff0ea;color:#ef5124;border-radius:8px;padding:11px 13px;font-weight:bold;font-size:13px;margin-bottom:18px;}
.reporte-modal-actions{display:flex;justify-content:flex-end;gap:10px;}
.reporte-modal-cancelar{border:1px solid #d9dce8;background:#fff;color:#1e2942;border-radius:8px;padding:12px 16px;font-weight:bold;cursor:pointer;}
.reporte-modal-crear{border:0;background:#ef5124;color:#fff;border-radius:8px;padding:12px 18px;font-weight:bold;cursor:pointer;}
.reporte-modal-crear:hover{background:#d9431b;}
.reporte-buscador-wrap{position:relative;}
.reporte-buscador-input{width:100%;border:1px solid #d9dce8;border-radius:8px;padding:13px 14px;font-size:14px;color:#1e2942;background:#fff;outline:none;}
.reporte-buscador-input:focus{border-color:#ef5124;box-shadow:0 0 0 3px rgba(239,81,36,.10);}
.reporte-buscador-resultados{display:none;position:absolute;left:0;right:0;top:calc(100% + 5px);max-height:260px;overflow-y:auto;background:#fff;border:1px solid #d9dce8;border-radius:8px;box-shadow:0 12px 28px rgba(0,0,0,.16);z-index:1300;}
.reporte-buscador-resultados.show{display:block;}
.reporte-buscador-item{padding:11px 13px;border-bottom:1px solid #eef0f5;cursor:pointer;background:#fff;}
.reporte-buscador-item:last-child{border-bottom:0;}
.reporte-buscador-item:hover{background:#fff0ea;}
.reporte-buscador-item strong{display:block;color:#1e2942;font-size:13px;margin-bottom:3px;}
.reporte-buscador-item small{display:block;color:#8a90a3;font-size:11px;}
.reporte-buscador-vacio{padding:14px;color:#8a90a3;font-size:12px;text-align:center;}
.reporte-seleccionado{display:none;margin-top:9px;padding:10px 12px;border:1px solid #9eddb8;background:#f1fff6;border-radius:8px;color:#176b3a;font-size:12px;font-weight:bold;}
.reporte-seleccionado.show{display:block;}

.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%;}

    .news-page:not(.form-prensa):not(.form-radio-tv):not(.form-redes-web){
        height:auto;
        min-height:100vh;
        overflow:visible;
    }

    .news-page:not(.form-prensa):not(.form-radio-tv):not(.form-redes-web) .news-filters,
    .news-page:not(.form-prensa):not(.form-radio-tv):not(.form-redes-web) .news-main{
        height:auto;
        overflow:visible;
        position:relative;
    }

    .news-page:not(.form-prensa):not(.form-radio-tv):not(.form-redes-web) .news-top{
        top:0;
    }
}
@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;
}

.noticia-adjunto-card{position:relative}
.noticia-adjunto-card[data-tooltip]:hover::after{
content:attr(data-tooltip);
position:absolute;
left:50%;
bottom:calc(100% + 10px);
transform:translateX(-50%);
background:#1f2937;
color:#fff;
padding:8px 10px;
border-radius:8px;
font-size:12px;
line-height:1.35;
max-width:280px;
min-width:120px;
white-space:normal;
word-break:break-word;
box-shadow:0 4px 14px rgba(0,0,0,.25);
z-index:99999;
pointer-events:none;
opacity:1;
}
.noticia-adjunto-card[data-tooltip]::after{opacity:0;transition:opacity .18s ease;}
</style>

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

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

    // ===== BUSCADOR INTELIGENTE DE MEDIOS =====
    inicializarBuscadorInteligenteMedios();

    // ===== BUSCADOR INTELIGENTE DE DEPARTAMENTOS =====
    inicializarSelectorDepartamentos();

});


const departamentosDisponibles = Array.from(new Set(
    medios
        .map(function(m){ return String(m.region || '').trim(); })
        .filter(function(dep){ return dep !== ''; })
)).sort(function(a, b){ return a.localeCompare(b, 'es'); });

let departamentosSeleccionados = <?php echo json_encode(
    $filtros_departamentos,
    JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
); ?>;

function inicializarSelectorDepartamentos(){
    actualizarDepartamentosSeleccionados();
}

function enfocarBuscadorDepartamentos(){
    const input = document.getElementById('departamento_buscar_filtro');
    if(input){
        input.focus();
        abrirListaDepartamentos();
    }
}

function abrirListaDepartamentos(){
    renderListaDepartamentos();
    const dropdown = document.getElementById('departamentos_dropdown_filtro');
    if(dropdown){ dropdown.classList.add('show'); }
}

function filtrarListaDepartamentos(){
    renderListaDepartamentos();
}

function renderListaDepartamentos(){
    const dropdown = document.getElementById('departamentos_dropdown_filtro');
    const input = document.getElementById('departamento_buscar_filtro');
    if(!dropdown || !input){ return; }

    const termino = normalizarTextoMedio(input.value);
    const filtrados = departamentosDisponibles.filter(function(dep){
        return normalizarTextoMedio(dep).includes(termino) &&
               !departamentosSeleccionados.includes(dep);
    });

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

    dropdown.innerHTML = filtrados.map(function(dep){
        const seguro = dep.replace(/'/g, "\\'");
        return "<div class='cliente-option' " +
               "onmousedown=\"event.preventDefault();\" " +
               "onclick=\"event.preventDefault(); event.stopPropagation(); agregarDepartamento('" + seguro + "')\">" +
               dep +
               "</div>";
    }).join('');
}

function agregarDepartamento(departamento){
    if(!departamentosSeleccionados.includes(departamento)){
        departamentosSeleccionados.push(departamento);
    }

    const input = document.getElementById('departamento_buscar_filtro');
    const dropdown = document.getElementById('departamentos_dropdown_filtro');

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

    actualizarDepartamentosSeleccionados();
    renderListaDepartamentos();

    if(dropdown){ dropdown.classList.add('show'); }

    window.setTimeout(function(){
        if(input){ input.focus({preventScroll:true}); }
        if(dropdown){ dropdown.classList.add('show'); }
    }, 0);
}

function quitarDepartamento(departamento){
    departamentosSeleccionados = departamentosSeleccionados.filter(function(dep){
        return dep !== departamento;
    });

    actualizarDepartamentosSeleccionados();
    renderListaDepartamentos();

    window.setTimeout(function(){
        const input = document.getElementById('departamento_buscar_filtro');
        const dropdown = document.getElementById('departamentos_dropdown_filtro');
        if(input){ input.focus({preventScroll:true}); }
        if(dropdown){ dropdown.classList.add('show'); }
    }, 0);
}

function actualizarDepartamentosSeleccionados(){
    const tags = document.getElementById('departamentos_tags_filtro');
    const hidden = document.getElementById('departamentos_filtro');
    const input = document.getElementById('departamento_buscar_filtro');

    if(hidden){ hidden.value = departamentosSeleccionados.join(', '); }

    if(tags){
        tags.innerHTML = departamentosSeleccionados.map(function(dep){
            const seguro = dep.replace(/'/g, "\\'");
            return "<span class='cliente-tag'><button type='button' onclick=\"event.stopPropagation(); quitarDepartamento('" + seguro + "')\">×</button>" + dep + "</span>";
        }).join('');
    }

    if(input){
        input.placeholder = departamentosSeleccionados.length > 0
            ? ''
            : 'Buscar o seleccionar departamentos';
    }

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

function normalizarTextoMedio(valor){
    return String(valor ?? '')
        .normalize('NFD')
        .replace(/[\u0300-\u036f]/g, '')
        .toLowerCase()
        .trim();
}

function inicializarBuscadorInteligenteMedios(){
    const buscador = document.getElementById('f_medio_buscar');
    const oculto = document.getElementById('f_medio');
    const resultados = document.getElementById('f_medio_resultados');

    if(!buscador || !oculto || !resultados){
        return;
    }

    const mostrarResultados = function(){
        const termino = normalizarTextoMedio(buscador.value);
        resultados.innerHTML = '';

        if(termino === ''){
            oculto.value = '';
            resultados.classList.remove('show');
            return;
        }

        const coincidencias = medios.filter(function(m){
            const textoCompleto = [
                m.nombre_medio,
                m.region,
                m.provincia,
                m.ciudad,
                m.tipo_medio
            ].map(normalizarTextoMedio).join(' ');

            return textoCompleto.includes(termino);
        }).slice(0, 80);

        if(coincidencias.length === 0){
            resultados.innerHTML = '<div class="filtro-medio-vacio">No se encontraron medios.</div>';
            resultados.classList.add('show');
            oculto.value = '';
            return;
        }

        coincidencias.forEach(function(m){
            const opcion = document.createElement('div');
            opcion.className = 'filtro-medio-opcion';

            const nombre = document.createElement('strong');
            nombre.textContent = m.nombre_medio || '';

            const ubicacion = document.createElement('small');
            ubicacion.textContent = [
                m.region,
                m.provincia,
                m.ciudad,
                m.tipo_medio
            ].filter(Boolean).join(' / ');

            opcion.appendChild(nombre);
            opcion.appendChild(ubicacion);

            opcion.addEventListener('mousedown', function(event){
                event.preventDefault();

                buscador.value = m.nombre_medio || '';
                oculto.value = m.nombre_medio || '';
                resultados.classList.remove('show');

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

            resultados.appendChild(opcion);
        });

        resultados.classList.add('show');
    };

    buscador.addEventListener('input', function(){
        oculto.value = '';
        mostrarResultados();
    });

    buscador.addEventListener('focus', function(){
        if(buscador.value.trim() !== ''){
            mostrarResultados();
        }
    });

    buscador.addEventListener('keydown', function(event){
        if(event.key === 'Escape'){
            resultados.classList.remove('show');
        }
    });

}


function iconoEstadoRegistrada(){
    return '<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="7.5" fill="none" stroke="currentColor" stroke-width="2.2"></circle><path d="M7.2 7.2l9.6 9.6" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"></path></svg>';
}

function iconoEstadoPublicada(){
    return '<svg viewBox="0 0 24 24" aria-hidden="true"><circle cx="12" cy="12" r="7" fill="#fff"></circle><path d="M8.7 12.1l2.1 2.1 4.5-4.7" fill="none" stroke="#54d99a" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg>';
}

function iconoCadena(){
    return '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9.5 14.5l5-5M7.2 16.8l-1 1a3.4 3.4 0 0 1-4.8-4.8l3.2-3.2a3.4 3.4 0 0 1 4.8 0M16.8 7.2l1-1a3.4 3.4 0 1 1 4.8 4.8l-3.2 3.2a3.4 3.4 0 0 1-4.8 0" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path></svg>';
}

function iconoAbrirExterno(){
    return '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M14 5h5v5M19 5l-8 8M18 13v5a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"></path></svg>';
}

function crearAccionesPublicadas(contenedor, id){
    let extras = contenedor.querySelector('.acciones-publicadas-extra');

    if(!extras){
        extras = document.createElement('span');
        extras.className = 'acciones-publicadas-extra';
        extras.innerHTML =
            '<button class="action-mini btn-enlace-publicado" type="button" title="Enlace" data-id="' + id + '">' + iconoCadena() + '</button>' +
            '<button class="action-mini btn-abrir-publicado" type="button" title="Abrir Vista Pública" data-id="' + id + '">' + iconoAbrirExterno() + '</button>';

        const botonWhatsApp = contenedor.querySelector('.btn-whatsapp-noticia');
        if(botonWhatsApp){
            contenedor.insertBefore(extras, botonWhatsApp);
        }else{
            contenedor.appendChild(extras);
        }
    }
}

function publicarNoticiaDesdeBoton(boton){
    if(!boton || boton.disabled){
        return;
    }

    const id = parseInt(boton.dataset.id || '0', 10);

    if(id <= 0){
        alert('La noticia seleccionada no es válida.');
        return;
    }

    boton.disabled = true;

    const datos = new FormData();
    datos.append('id', String(id));

    fetch("ajax_publicar_noticia.php", {
        method: 'POST',
        body: datos,
        credentials: 'same-origin'
    })
    .then(function(respuesta){
        if(!respuesta.ok){
            throw new Error('Respuesta inválida del servidor.');
        }
        return respuesta.json();
    })
    .then(function(respuesta){
        if(!respuesta.ok){
            throw new Error(respuesta.mensaje || 'No se pudo cambiar el estado de la noticia.');
        }

        const contenedor = boton.parentElement;
        const extras = contenedor.querySelector('.acciones-publicadas-extra');

        boton.disabled = false;

        if(respuesta.estado === 'publicada'){
            boton.classList.remove('btn-publicar');
            boton.classList.add('btn-publicada');
            boton.title = 'Noticia publicada';
            boton.innerHTML = iconoEstadoPublicada();

            crearAccionesPublicadas(contenedor, id);
        }else{
            boton.classList.remove('btn-publicada');
            boton.classList.add('btn-publicar');
            boton.title = 'Publicar noticia';
            boton.innerHTML = iconoEstadoRegistrada();

            if(extras){
                extras.remove();
            }
        }
    })
    .catch(function(error){
        boton.disabled = false;
        alert(error.message || 'No se pudo cambiar el estado de la noticia.');
    });
}

document.addEventListener('click', function(event){
    const botonEstado = event.target.closest('.btn-publicar, .btn-publicada');

    if(botonEstado){
        event.preventDefault();
        publicarNoticiaDesdeBoton(botonEstado);
    }
});

function duplicarNoticiaDesdeBoton(boton){

    if(!boton || boton.disabled){
        return;
    }

    const id = parseInt(boton.dataset.id || '0', 10);

    if(id <= 0){
        alert('La noticia seleccionada no es válida.');
        return;
    }

    const confirmar = window.confirm(
        '¿Deseas duplicar esta noticia con todos sus datos?'
    );

    if(!confirmar){
        return;
    }

    boton.disabled = true;

    const datos = new FormData();
    datos.append('ajax_duplicar_noticia', '1');
    datos.append('id', String(id));

    fetch(window.location.href, {
        method: 'POST',
        body: datos,
        credentials: 'same-origin'
    })
    .then(function(respuesta){
        if(!respuesta.ok){
            throw new Error('No se pudo duplicar la noticia.');
        }

        /*
         * El dashboard devuelve HTML porque este módulo está incluido dentro
         * de la página principal. La duplicación ya se ejecutó correctamente,
         * por eso no intentamos convertir la respuesta a JSON.
         */
        return respuesta.text();
    })
    .then(function(){
        boton.disabled = false;
        alert('Noticia duplicada correctamente.');
        window.location.reload();
    })
    .catch(function(error){
        boton.disabled = false;
        alert(
            error.message ||
            'No se pudo duplicar la noticia.'
        );
    });
}

document.addEventListener('click', function(event){

    const botonDuplicar = event.target.closest(
        '.btn-duplicar-noticia'
    );

    if(!botonDuplicar){
        return;
    }

    event.preventDefault();
    event.stopPropagation();

    duplicarNoticiaDesdeBoton(botonDuplicar);
});
    
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);
    });

    const medioSeleccionado = document.getElementById('f_medio');
    if(medioSeleccionado && medioSeleccionado.value.trim() !== ''){
        parametros.set('medio', medioSeleccionado.value.trim());
    }

    const etiquetasSeleccionadasFiltro = clientesSeleccionados.filtro || [];
    etiquetasSeleccionadasFiltro.forEach(function(etiqueta){
        parametros.append('etiquetas[]', etiqueta);
    });

    departamentosSeleccionados.forEach(function(departamento){
        parametros.append('departamentos[]', departamento);
    });

    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 = '<?php echo $dashboard_actual; ?>?' + parametros.toString();
}

function limpiarFiltrosNoticias(){
    window.location.href = '<?php echo $dashboard_actual; ?>?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();
    actualizarClientesSeleccionados('filtro');
});

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 adjuntoEditorId = "";
let adjuntosSeleccionadosPorContexto = { prensa: [], radio: [], redes: [] };

function abrirAdjuntosModal(contexto){
    adjuntoContextoActual = contexto;
    adjuntoDetalleActual = null;
    adjuntoEditorId = "";

    /*
       Cada vez que se abre el modal, la selección se reconstruye únicamente
       con los archivos que ya están adjuntados en el formulario actual.
       Así se evita arrastrar checks de aperturas anteriores o de otro formulario.
    */
    adjuntosSeleccionadosModal = (adjuntosSeleccionadosPorContexto[contexto] || [])
        .map(function(archivo){ return String(archivo.id || ""); })
        .filter(function(id){ return id !== "" && id !== "actual"; });

    document.getElementById("adjuntosModal").classList.add("show");
    document.body.style.overflow = "hidden";
    cambiarTabAdjuntos("repo");
    limpiarDetalleAdjunto();

    setTimeout(function(){
        document.querySelectorAll(".adjunto-check").forEach(function(check){
            check.checked = adjuntosSeleccionadosModal.includes(
                String(check.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");

    }

}

function filtrarAdjuntosRepo(){
    let q = document.getElementById("buscarAdjuntoRepo").value.toLowerCase();
    document.querySelectorAll(".adjunto-card").forEach(card => {
        let txt = (card.dataset.titulo || "").toLowerCase();
        card.style.display = txt.includes(q) ? "block" : "none";
    });
}

function limpiarDetalleAdjunto(){
    let detail = document.getElementById("adjuntosDetail");
    if(detail){ detail.innerHTML = '<div class="adjuntos-detail-empty">Selecciona un archivo del repositorio para ver sus datos y agregarlo.</div>'; }
    document.querySelectorAll(".adjunto-card").forEach(c => c.classList.remove("selected"));
}
    
function refrescarRepositorioAdjuntos(){

    fetch(window.location.href, {
        method: "GET",
        cache: "no-store"
    })
    .then(r => r.text())
    .then(html => {

        let parser = new DOMParser();
        let doc = parser.parseFromString(html, "text/html");

        let nuevo = doc.getElementById("adjuntosGrid");
        let actual = document.getElementById("adjuntosGrid");

        if(nuevo && actual){
            actual.innerHTML = nuevo.innerHTML;

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

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

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

    })
    .catch(err=>{
        console.error("Error refrescando repositorio:",err);
    });

}    
    

function aplicarDestacadoAdjuntosNuevos(){

    adjuntosNuevosDestacados.forEach(function(id){

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

        if(card){
            card.classList.add("nuevo-destacado");
        }

    });

}

function cambiarSeleccionAdjunto(check){

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

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

    if(check.checked){

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

        adjuntosNuevosDestacados =
            adjuntosNuevosDestacados.filter(function(idNuevo){
                return String(idNuevo) !== id;
            });

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

        if(cardNuevo){
            cardNuevo.classList.remove("nuevo-destacado");
        }

    }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);
        }

        alert("Cambios guardados correctamente.");
    })
    .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){

    document.querySelectorAll(".adjunto-card").forEach(function(c){
        c.classList.remove("selected");
    });

    card.classList.add("selected");

    const idCard = String(card.dataset.id || "");
    const chk = card.querySelector(".adjunto-check");

    if(chk){
        chk.checked = adjuntosSeleccionadosModal.includes(idCard);
    }

    /* Si ya existen archivos marcados para adjuntar, no borrar la lista.
       Una tarjeta marcada pasa a ser el archivo que se edita. */
    if(adjuntosSeleccionadosModal.length > 0){

        if(adjuntosSeleccionadosModal.includes(idCard)){
            editarAdjuntoSeleccionado(idCard);
        }

        return;
    }

    adjuntoDetalleActual = obtenerAdjuntoDesdeCard(idCard);

    if(!adjuntoDetalleActual){
        return;
    }

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

    detail.innerHTML = `
        <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>

        <label class="adjuntos-detail-title">Ruta del archivo</label>

        <div class="adjuntos-detail-url">
            <a href="javascript:void(0)" onclick="previsualizarAdjunto()">
                ${escaparHtmlAdjunto(adjuntoDetalleActual.url)}
            </a>
        </div>

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

}

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 se agregan los archivos cuyo checklist está marcado.
       El borde naranja identifica archivos recién subidos, pero no los selecciona.
    */
    if(adjuntosSeleccionadosModal.length === 0){
        alert("Marca al menos un archivo usando el checklist.");
        return;
    }

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

    /* Mantener solo un adjunto antiguo que no tenga ID de repositorio. */
    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);
        }

    });

    adjuntosSeleccionadosPorContexto[adjuntoContextoActual] = listaNueva;
    actualizarAdjuntosFormulario(adjuntoContextoActual);

    /* Al confirmar, solo los archivos realmente marcados pierden el resaltado. */
    adjuntosNuevosDestacados = adjuntosNuevosDestacados.filter(function(idNuevo){
        return !adjuntosSeleccionadosModal.includes(String(idNuevo));
    });

    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;} 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;}
    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);
        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);
        }

        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: [],
    filtro: <?php echo json_encode(
        $filtros_etiquetas,
        JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES
    ); ?>
};

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); }

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' " +
               "onmousedown=\"event.preventDefault();\" " +
               "onclick=\"event.preventDefault(); event.stopPropagation(); 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);

    /*
     * En el filtro principal, después de elegir una etiqueta:
     * - se mantiene abierto el desplegable;
     * - el cursor regresa al buscador;
     * - se puede escribir la siguiente etiqueta sin otro clic.
     */
    if(contexto === "filtro"){
        if(dropdown){
            dropdown.classList.add("show");
        }

        window.setTimeout(function(){
            if(input){
                input.focus({preventScroll:true});
                input.setSelectionRange(input.value.length, input.value.length);
            }

            if(dropdown){
                dropdown.classList.add("show");
            }
        }, 0);
    }else{
        enfocarBuscadorClientes(contexto);
    }
}

function quitarClienteEtiqueta(contexto, cliente){
    if(!clientesSeleccionados[contexto]){ return; }

    clientesSeleccionados[contexto] = clientesSeleccionados[contexto].filter(c => c !== cliente);
    actualizarClientesSeleccionados(contexto);
    renderListaClientes(contexto);

    if(contexto === "filtro"){
        window.setTimeout(function(){
            let input = document.getElementById("cliente_buscar_filtro");
            let dropdown = document.getElementById("clientes_dropdown_filtro");

            if(input){
                input.focus({preventScroll:true});
            }

            if(dropdown){
                dropdown.classList.add("show");
            }
        }, 0);
    }
}

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
            ? ""
            : (contexto === "filtro" ? "Buscar o seleccionar etiquetas" : "Seleccione una opción");
    }

    if(contexto === "filtro"){
        const btnAplicar = document.getElementById('btn_aplicar_fecha_noticias');
        if(btnAplicar){
            btnAplicar.disabled = false;
            btnAplicar.classList.add('active');
        }
    }
}


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);
        alert(data.mensaje || 'Etiqueta registrada correctamente.');
    })
    .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';
}

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';
    }
});

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>
            </select>
        </div>
    `;

    contenedor.insertBefore(nuevoBloque, accion);

    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 abrirModalNuevoReporte(){
    cerrarMenuAccionesNoticias();

    const ids = obtenerIdsNoticiasSeleccionadas();

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

    const modal = document.getElementById('modalNuevoReporte');
    const campoIds = document.getElementById('noticias_ids_reporte');
    const contador = document.getElementById('cantidadNoticiasReporte');
    const titulo = document.getElementById('titulo_reporte');

    if(!modal || !campoIds || !contador){
        alert('No se pudo abrir la ventana para crear el reporte.');
        return;
    }

    campoIds.value = ids.join(',');
    contador.textContent = ids.length + (ids.length === 1
        ? ' noticia seleccionada'
        : ' noticias seleccionadas');

    modal.classList.add('show');
    modal.setAttribute('aria-hidden', 'false');
    document.body.style.overflow = 'hidden';

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

function cerrarModalNuevoReporte(){
    const modal = document.getElementById('modalNuevoReporte');

    if(modal){
        modal.classList.remove('show');
        modal.setAttribute('aria-hidden', 'true');
    }

    document.body.style.overflow = '';
}

const reportesExistentesNoticias = <?php echo json_encode($reportes_existentes_noticias, JSON_UNESCAPED_UNICODE); ?>;

function normalizarBusquedaReporte(texto){
    return String(texto || '')
        .normalize('NFD')
        .replace(/[\u0300-\u036f]/g, '')
        .toLowerCase()
        .trim();
}

function renderizarReportesExistentes(filtro){
    const resultados = document.getElementById('resultados_reporte_existente');
    if(!resultados){ return; }

    const termino = normalizarBusquedaReporte(filtro);
    resultados.innerHTML = '';

    const encontrados = reportesExistentesNoticias.filter(function(reporte){
        const contenido = normalizarBusquedaReporte(
            String(reporte.titulo || '') + ' ' + String(reporte.cliente || '')
        );
        return termino === '' || contenido.indexOf(termino) !== -1;
    });

    if(encontrados.length === 0){
        const vacio = document.createElement('div');
        vacio.className = 'reporte-buscador-vacio';
        vacio.textContent = 'No se encontraron reportes activos.';
        resultados.appendChild(vacio);
    }else{
        encontrados.forEach(function(reporte){
            const item = document.createElement('div');
            item.className = 'reporte-buscador-item';

            const titulo = document.createElement('strong');
            titulo.textContent = reporte.titulo || 'Reporte sin título';

            const cliente = document.createElement('small');
            cliente.textContent = reporte.cliente || 'Sin cliente asignado';

            item.appendChild(titulo);
            item.appendChild(cliente);
            item.addEventListener('click', function(){
                seleccionarReporteExistente(reporte);
            });

            resultados.appendChild(item);
        });
    }

    resultados.classList.add('show');
}

function seleccionarReporteExistente(reporte){
    const id = document.getElementById('reporte_existente_id');
    const buscador = document.getElementById('buscar_reporte_existente');
    const seleccionado = document.getElementById('reporte_existente_seleccionado');
    const resultados = document.getElementById('resultados_reporte_existente');

    if(id){ id.value = reporte.id; }
    if(buscador){ buscador.value = reporte.titulo || ''; }
    if(seleccionado){
        seleccionado.textContent = 'Seleccionado: ' + (reporte.titulo || 'Reporte sin título') + ' — ' + (reporte.cliente || 'Sin cliente asignado');
        seleccionado.classList.add('show');
    }
    if(resultados){ resultados.classList.remove('show'); }
}

function abrirModalReporteExistente(){
    cerrarMenuAccionesNoticias();

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

    if(reportesExistentesNoticias.length === 0){
        alert('No existen reportes activos. Primero crea un reporte nuevo.');
        return;
    }

    const modal = document.getElementById('modalReporteExistente');
    const campoIds = document.getElementById('noticias_ids_reporte_existente');
    const contador = document.getElementById('cantidadNoticiasReporteExistente');
    const campoReporte = document.getElementById('reporte_existente_id');
    const buscador = document.getElementById('buscar_reporte_existente');
    const seleccionado = document.getElementById('reporte_existente_seleccionado');

    if(!modal || !campoIds || !contador){
        alert('No se pudo abrir la ventana para seleccionar el reporte.');
        return;
    }

    campoIds.value = ids.join(',');
    contador.textContent = ids.length + (ids.length === 1
        ? ' noticia seleccionada'
        : ' noticias seleccionadas');

    if(campoReporte){ campoReporte.value = ''; }
    if(buscador){ buscador.value = ''; }
    if(seleccionado){
        seleccionado.textContent = '';
        seleccionado.classList.remove('show');
    }

    modal.classList.add('show');
    modal.setAttribute('aria-hidden', 'false');
    document.body.style.overflow = 'hidden';

    renderizarReportesExistentes('');
    if(buscador){ setTimeout(function(){ buscador.focus(); }, 80); }
}

function cerrarModalReporteExistente(){
    const modal = document.getElementById('modalReporteExistente');
    const resultados = document.getElementById('resultados_reporte_existente');

    if(modal){
        modal.classList.remove('show');
        modal.setAttribute('aria-hidden', 'true');
    }
    if(resultados){ resultados.classList.remove('show'); }
    document.body.style.overflow = '';
}

function exportarNoticiasExcel(){
    cerrarMenuAccionesNoticias();

    const ids = obtenerIdsNoticiasSeleccionadas();

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

    const formulario = document.createElement('form');
    formulario.method = 'POST';
    formulario.action = 'modulos/exportar_noticias_excel.php';
    formulario.target = '_blank';
    formulario.style.display = 'none';

    const campoIds = document.createElement('input');
    campoIds.type = 'hidden';
    campoIds.name = 'noticias_ids';
    campoIds.value = ids.join(',');

    formulario.appendChild(campoIds);
    document.body.appendChild(formulario);
    formulario.submit();

    setTimeout(function(){
        if(formulario.parentNode){
            formulario.parentNode.removeChild(formulario);
        }
    }, 1000);
}

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);
    });

    const buscadorReporteExistente = document.getElementById('buscar_reporte_existente');
    if(buscadorReporteExistente){
        buscadorReporteExistente.addEventListener('input', function(){
            const campoReporte = document.getElementById('reporte_existente_id');
            const seleccionado = document.getElementById('reporte_existente_seleccionado');
            if(campoReporte){ campoReporte.value = ''; }
            if(seleccionado){ seleccionado.classList.remove('show'); seleccionado.textContent = ''; }
            renderizarReportesExistentes(this.value);
        });
        buscadorReporteExistente.addEventListener('focus', function(){
            renderizarReportesExistentes(this.value);
        });
    }

    const formReporteExistente = document.getElementById('formAgregarReporteExistente');
    if(formReporteExistente){
        formReporteExistente.addEventListener('submit', function(event){
            const reporteId = document.getElementById('reporte_existente_id');
            if(!reporteId || parseInt(reporteId.value, 10) <= 0){
                event.preventDefault();
                alert('Busca y selecciona un reporte de la lista.');
            }
        });
    }

    actualizarSeleccionNoticias();
});

document.addEventListener('click', function(event){
    const modalReporte = document.getElementById('modalNuevoReporte');
    if(modalReporte && event.target === modalReporte){
        cerrarModalNuevoReporte();
    }

    const modalReporteExistente = document.getElementById('modalReporteExistente');
    if(modalReporteExistente && event.target === modalReporteExistente){
        cerrarModalReporteExistente();
    }

    const buscadorReporteWrap = event.target.closest('.reporte-buscador-wrap');
    if(!buscadorReporteWrap){
        const resultadosReporte = document.getElementById('resultados_reporte_existente');
        if(resultadosReporte){ resultadosReporte.classList.remove('show'); }
    }

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

document.addEventListener('keydown', function(event){
    if(event.key === 'Escape'){
        cerrarModalNuevoReporte();
        cerrarModalReporteExistente();
    }
});

/* =========================================
   ABRIR VISTA PÚBLICA DE LA NOTICIA
========================================= */
document.addEventListener('click', async function(event){

    const botonAbrir = event.target.closest('.btn-abrir-publicado');

    if(!botonAbrir){
        return;
    }

    event.preventDefault();
    event.stopPropagation();

    const id = parseInt(botonAbrir.dataset.id || '0', 10);

    if(id <= 0){
        alert('La noticia seleccionada no es válida.');
        return;
    }

    const nuevaPestana = window.open('', '_blank');

    if(!nuevaPestana){
        alert('El navegador bloqueó la nueva pestaña. Permite las ventanas emergentes para este sitio.');
        return;
    }

    const datos = new FormData();
    datos.append('id', String(id));

    try{
        const respuesta = await fetch('ajax_generar_link_noticia.php', {
            method: 'POST',
            body: datos,
            credentials: 'same-origin'
        });

        const resultado = await respuesta.json();

        if(!respuesta.ok || !resultado.ok || !resultado.url){
            nuevaPestana.close();
            alert(resultado.mensaje || 'No se pudo abrir la vista pública.');
            return;
        }

        nuevaPestana.location.href = resultado.url;

    }catch(error){
        nuevaPestana.close();
        alert('No fue posible abrir la vista pública.');
    }
});

document.addEventListener('click',async function(e){
    const b=e.target.closest('.btn-enlace-publicado');
    if(!b) return;
    e.preventDefault();
    const fd=new FormData();
    fd.append('id',b.dataset.id);
    try{
      const r=await fetch('ajax_generar_link_noticia.php',{method:'POST',body:fd,credentials:'same-origin'});
      const j=await r.json();
      if(!j.ok){alert(j.mensaje||'No se pudo generar el enlace');return;}
      await navigator.clipboard.writeText(j.url);
      alert('Enlace copiado al portapapeles');
    }catch(err){
      alert('Error al generar el enlace');
    }
});

/* =========================================
   COPIAR CONTENIDO DE NOTICIA
   BOTÓN WHATSAPP
========================================= */
document.addEventListener('click', async function(event){

    const boton = event.target.closest('.btn-whatsapp-noticia');

    if(!boton){
        return;
    }

    event.preventDefault();
    event.stopPropagation();

    const tarjeta = boton.closest('.news-card');

    if(!tarjeta){
        alert('No se pudo encontrar la información de la noticia.');
        return;
    }

    const tituloElemento = tarjeta.querySelector('.news-title');
    const medioElemento = tarjeta.querySelector('.news-source span:last-child');
    const ubicacionElemento = tarjeta.querySelector('.news-info-top span:nth-child(2)');

    const titulo = tituloElemento
        ? tituloElemento.textContent.trim()
        : '';

    const medio = medioElemento
        ? medioElemento.textContent.trim()
        : '';

    let region = ubicacionElemento
        ? ubicacionElemento.textContent.trim()
        : '';

    region = region.replace(/^📍\s*/, '');

    const id = parseInt(boton.dataset.id || '0', 10);

    if(id <= 0){
        alert('La noticia seleccionada no es válida.');
        return;
    }

    const datos = new FormData();
    datos.append('id', String(id));

    try{

        const respuesta = await fetch(
            'ajax_generar_link_noticia.php',
            {
                method: 'POST',
                body: datos,
                credentials: 'same-origin'
            }
        );

        const resultado = await respuesta.json();

        if(!respuesta.ok || !resultado.ok || !resultado.url){
            alert(
                resultado.mensaje ||
                'No se pudo obtener el enlace de la noticia.'
            );
            return;
        }

        const rContenido = await fetch(
    'modulos/ajax_contenido_noticia.php',
    {
        method:'POST',
        body:datos,
        credentials:'same-origin'
    }
);

const noticia = await rContenido.json();

if(!rContenido.ok || !noticia.ok){
    alert(
        noticia.mensaje ||
        'No se pudo obtener el contenido de la noticia.'
    );
    return;
}

const contenido = [
    'REGIÓN:',
    noticia.region || region || 'Sin ubicación',
    '',
    'TÍTULO:',
    noticia.titulo || titulo,
    '',
    'CONTENIDO:',
    noticia.contenido || '',
    '',
    'MEDIO:',
    noticia.medio || medio,
    '',
    'ENLACE:',
    resultado.url
].join('\n');

        await navigator.clipboard.writeText(contenido);

        alert('Contenido copiado al portapapeles.');

    }catch(error){

        alert('No se pudo copiar el contenido de la noticia.');

    }

});
    

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

    if (!formulario || !hora || !duracion) return;

    function quitarError(campo, idAviso) {
        campo.classList.remove("error", "hora-error-parpadeo");
        campo.removeAttribute("aria-invalid");
        const aviso = document.getElementById(idAviso);
        if (aviso) aviso.remove();
    }

    function mostrarError(campo, idAviso, texto) {
        campo.classList.add("error", "hora-error-parpadeo");
        campo.setAttribute("aria-invalid", "true");

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

        aviso.textContent = texto;
        campo.focus();
        campo.scrollIntoView({ behavior: "smooth", block: "center" });
    }

    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;
    }

    formulario.addEventListener("submit", function (e) {
        const patronHora = /^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/;
        const horaCorrecta = patronHora.test(hora.value.trim());
        const duracionCorrecta = duracionValida(duracion.value.trim());

        if (!horaCorrecta || !duracionCorrecta) {
            e.preventDefault();
            e.stopPropagation();

            if (!horaCorrecta) {
                mostrarError(hora, "hora_error", "Hora incorrecta. Use HH:MM:SS");
            } else {
                quitarError(hora, "hora_error");
                mostrarError(duracion, "duracion_error", "Falta agregar la duración o es incorrecta. Use HH:MM:SS");
            }
            return false;
        }

        quitarError(hora, "hora_error");
        quitarError(duracion, "duracion_error");
    }, true);

    hora.addEventListener("input", function () {
        if (/^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/.test(hora.value.trim())) {
            quitarError(hora, "hora_error");
        }
    });

    duracion.addEventListener("input", function () {
        if (duracionValida(duracion.value.trim())) {
            quitarError(duracion, "duracion_error");
        }
    });
});


/* =========================================================
   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=20260720_2"></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'];}}
?>
<div>
    <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="<?php echo $dashboard_actual; ?>?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>
                <div class="filtro-medio-inteligente">
                    <input
                        type="text"
                        id="f_medio_buscar"
                        value="<?php echo htmlspecialchars($filtro_medio, ENT_QUOTES, 'UTF-8'); ?>"
                        placeholder="Buscar medio, región, provincia o ciudad..."
                        autocomplete="off">
                    <input
                        type="hidden"
                        id="f_medio"
                        value="<?php echo htmlspecialchars($filtro_medio, ENT_QUOTES, 'UTF-8'); ?>">
                    <div id="f_medio_resultados" class="filtro-medio-resultados"></div>
                </div>

                <label>Etiquetas</label>
                <div class="clientes-selector filtro-etiquetas-selector" data-contexto="filtro">
                    <input
                        type="hidden"
                        id="etiquetas_filtro"
                        value="<?php echo htmlspecialchars(implode(', ', $filtros_etiquetas), ENT_QUOTES, 'UTF-8'); ?>">

                    <div class="clientes-box filtro-etiquetas-box" onclick="enfocarBuscadorClientes('filtro')">
                        <div id="clientes_tags_filtro" style="display:contents;"></div>

                        <input
                            id="cliente_buscar_filtro"
                            class="cliente-search-inline"
                            type="text"
                            placeholder="Buscar o seleccionar etiquetas"
                            autocomplete="off"
                            onfocus="abrirListaClientes('filtro')"
                            onkeyup="filtrarListaClientes('filtro')">
                    </div>

                    <div id="clientes_dropdown_filtro" class="clientes-dropdown"></div>
                </div>

                <label>Departamentos</label>
                <div class="clientes-selector filtro-departamentos-selector">
                    <input
                        type="hidden"
                        id="departamentos_filtro"
                        value="<?php echo htmlspecialchars(implode(', ', $filtros_departamentos), ENT_QUOTES, 'UTF-8'); ?>">

                    <div class="clientes-box filtro-departamentos-box" onclick="enfocarBuscadorDepartamentos()">
                        <div id="departamentos_tags_filtro" style="display:contents;"></div>

                        <input
                            id="departamento_buscar_filtro"
                            class="cliente-search-inline"
                            type="text"
                            placeholder="Buscar o seleccionar departamentos"
                            autocomplete="off"
                            onfocus="abrirListaDepartamentos()"
                            onkeyup="filtrarListaDepartamentos()">
                    </div>

                    <div id="departamentos_dropdown_filtro" class="clientes-dropdown"></div>
                </div>

                <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 == ""){ ?>
                    <?php
                    $rol_actual_noticias = intval($_SESSION['rol_id'] ?? 0);
                    $es_editor_noticias = ($rol_actual_noticias === 3);
                    ?>
                    <div class="news-top-left">
                        <?php if(!$es_editor_noticias){ ?>
                        <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="abrirModalNuevoReporte()">
                                        📊 Agregar a nuevo reporte
                                    </button>
                                    <button type="button" onclick="abrirModalReporteExistente()">
                                        ➕ Agregar a reporte existente
                                    </button>
                                <?php } ?>

                                <?php if(!$ver_archivadas){ ?>
                                    <button type="button" onclick="exportarNoticiasExcel()">
                                        📥 Exportar a Excel
                                    </button>
                                <?php } ?>

                                <?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>
                        <?php } ?>

                        <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='<?php echo $dashboard_actual; ?>?modulo=noticias';">
                                VOLVER
                            </button>
                        <?php } else { ?>
                            <button
                                type="button"
                                class="btn-news-secondary"
                                onclick="window.location.href='<?php echo $dashboard_actual; ?>?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="<?php echo $dashboard_actual; ?>?modulo=noticias&form=prensa">Prensa</a>
                                <a href="<?php echo $dashboard_actual; ?>?modulo=noticias&form=radio_tv">Radio o TV</a>
                                <a href="<?php echo $dashboard_actual; ?>?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 id="modalNuevoReporte" class="reporte-modal-overlay" aria-hidden="true">
                <div class="reporte-modal-box" role="dialog" aria-modal="true" aria-labelledby="tituloModalNuevoReporte">
                    <button type="button" class="reporte-modal-cerrar" onclick="cerrarModalNuevoReporte()">×</button>

                    <h2 id="tituloModalNuevoReporte">Crear nuevo reporte</h2>
                    <p>Las noticias seleccionadas quedarán vinculadas al reporte. No se duplicarán.</p>

                    <form id="formCrearReporteNoticias" method="POST">
                        <input type="hidden" name="crear_reporte_desde_noticias" value="1">
                        <input type="hidden" name="noticias_ids_reporte" id="noticias_ids_reporte" value="">

                        <div id="cantidadNoticiasReporte" class="reporte-modal-count">
                            0 noticias seleccionadas
                        </div>

                        <div class="reporte-modal-field">
                            <label for="titulo_reporte">Título del reporte</label>
                            <input
                                type="text"
                                name="titulo_reporte"
                                id="titulo_reporte"
                                maxlength="255"
                                placeholder="Ejemplo: Reporte diario de noticias"
                                required>
                        </div>

                        <div class="reporte-modal-field">
                            <label for="cliente_reporte_id">Cliente</label>
                            <select name="cliente_reporte_id" id="cliente_reporte_id" required>
                                <option value="">Selecciona un cliente</option>
                                <?php foreach($clientes_reporte as $cliente_reporte_item){ ?>
                                    <option value="<?php echo intval($cliente_reporte_item['id']); ?>">
                                        <?php echo htmlspecialchars($cliente_reporte_item['razon_social'], ENT_QUOTES, 'UTF-8'); ?>
                                    </option>
                                <?php } ?>
                            </select>
                        </div>

                        <div class="reporte-modal-actions">
                            <button type="button" class="reporte-modal-cancelar" onclick="cerrarModalNuevoReporte()">
                                CANCELAR
                            </button>
                            <button type="submit" class="reporte-modal-crear">
                                CREAR Y AGREGAR
                            </button>
                        </div>
                    </form>
                </div>
            </div>

            <div id="modalReporteExistente" class="reporte-modal-overlay" aria-hidden="true">
                <div class="reporte-modal-box" role="dialog" aria-modal="true" aria-labelledby="tituloModalReporteExistente">
                    <button type="button" class="reporte-modal-cerrar" onclick="cerrarModalReporteExistente()">×</button>

                    <h2 id="tituloModalReporteExistente">Agregar a reporte existente</h2>
                    <p>Busca y selecciona el reporte donde deseas agregar las noticias. Las noticias repetidas no se duplicarán.</p>

                    <form id="formAgregarReporteExistente" method="POST">
                        <input type="hidden" name="agregar_reporte_existente_desde_noticias" value="1">
                        <input type="hidden" name="noticias_ids_reporte_existente" id="noticias_ids_reporte_existente" value="">
                        <input type="hidden" name="reporte_existente_id" id="reporte_existente_id" value="">

                        <div id="cantidadNoticiasReporteExistente" class="reporte-modal-count">
                            0 noticias seleccionadas
                        </div>

                        <div class="reporte-modal-field">
                            <label for="buscar_reporte_existente">Buscar reporte</label>
                            <div class="reporte-buscador-wrap">
                                <input
                                    type="text"
                                    id="buscar_reporte_existente"
                                    class="reporte-buscador-input"
                                    placeholder="Escribe parte del título o del cliente"
                                    autocomplete="off">
                                <div id="resultados_reporte_existente" class="reporte-buscador-resultados"></div>
                            </div>
                            <div id="reporte_existente_seleccionado" class="reporte-seleccionado"></div>
                        </div>

                        <div class="reporte-modal-actions">
                            <button type="button" class="reporte-modal-cancelar" onclick="cerrarModalReporteExistente()">
                                CANCELAR
                            </button>
                            <button type="submit" class="reporte-modal-crear">
                                SELECCIONAR Y AGREGAR
                            </button>
                        </div>
                    </form>
                </div>
            </div>

            <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="<?php echo $dashboard_actual; ?>?modulo=noticias" class="prensa-back">← Volver a Noticias</a>

                    <form method="POST" 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" placeholder="Titular de la noticia" value="<?php echo htmlspecialchars(html_entity_decode((string)($_POST['titulo'] ?? ''), ENT_QUOTES | ENT_HTML5, 'UTF-8'), ENT_QUOTES, 'UTF-8'); ?>" required>
                            </div>

                            <div class="prensa-field">
                                <label>Resumen</label>
                                <textarea class="prensa-textarea" name="descripcion" required></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($_POST['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 $fecha_radio_mostrar = $_POST['fecha_nota'] ?? date('Y-m-d'); echo htmlspecialchars(date('d/m/Y', strtotime($fecha_radio_mostrar)), ENT_QUOTES, 'UTF-8'); ?></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"
                                            placeholder="Buscar medio..."
                                            value="<?php echo htmlspecialchars($_POST['subtipo_medio'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"
                                            autocomplete="off"
                                            onfocus="mostrarMediosPrensa()"
                                            onclick="event.stopPropagation(); mostrarMediosPrensa();"
                                            oninput="filtrarMediosPrensa(this.value)">

                                        <input
                                            type="hidden"
                                            name="subtipo_medio"
                                            id="subtipo_medio_prensa">

                                        <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'); ?>"
                                                    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" 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" required>
                                    </div>

                                    <div class="prensa-field">
                                        <label>Columnas <span class="req">*</span></label>
                                        <select class="prensa-select" name="columnas" 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" 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>
                                        </select>
                                    </div>
                                </div>

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

                            <div class="prensa-adjuntos-title">Archivos Adjuntos</div>
                            <div id="lista_adjuntos_prensa" class="noticia-adjuntos-list"></div>
                            <button type="button" class="prensa-upload-circle" onclick="abrirAdjuntosModal('prensa')">+</button>
                            <input type="hidden" name="archivo_adjunto_ids" id="adjunto_id_prensa">
                        </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 (($_POST['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">
                            </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">
                                    <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')">
                                    </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()){
                                            echo '<option value="'.htmlspecialchars($tono["nombre"],ENT_QUOTES,'UTF-8').'">'.htmlspecialchars($tono["nombre"],ENT_QUOTES,'UTF-8').'</option>';
                                        }
                                    }
                                    ?>
                                </select>
                            </div>

                            <button type="submit" name="guardar_noticia" class="prensa-submit">CREAR NOTICIA ⌄</button>
                        </aside>

                    </form>
                </div>

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

                <div class="radio-wrapper">
                    <a href="<?php echo $dashboard_actual; ?>?modulo=noticias" class="radio-back">← Volver a Noticias</a>

                    <form method="POST" enctype="multipart/form-data" class="radio-form-layout" id="form_nueva_noticia_radio_tv">

                        <div class="radio-left">
                            <input type="hidden" name="tipo_medio" id="radio_tipo_medio_hidden" value="<?php echo htmlspecialchars($_POST['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" placeholder="Titular de la noticia" required>
                            </div>

                            <div class="radio-field">
                                <label>Resumen</label>
                                <textarea class="radio-textarea" name="descripcion" required><?php echo htmlspecialchars($_POST['descripcion'] ?? '', 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 (($_POST['tipo_medio'] ?? 'Radio') === 'Radio') ? 'checked' : ''; ?> onclick="actualizarTipoRadioTv('Radio')">
                                        Radio
                                    </label>

                                    <label>
                                        <input type="radio" name="tipo_radio_tv_opcion" value="Televisión" <?php echo (($_POST['tipo_medio'] ?? 'Radio') === '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="radio_hora_nota">
            Hora <span class="req">*</span>
        </label>

        <input
            type="text"
            id="hora_nota"
            name="hora_nota"
            class="radio-hora-input<?php echo !empty($hora_error) ? ' error hora-error-parpadeo' : ''; ?>"
            value="<?php echo htmlspecialchars($_POST['hora_nota'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"
            placeholder="HH:MM:SS"
            maxlength="8"
            <?php echo !empty($hora_error) ? 'aria-invalid="true"' : ''; ?>>
        <?php if (!empty($hora_error)) { ?>
            <div id="hora_error" class="hora-error-mensaje">Hora incorrecta. Use HH:MM:SS</div>
        <?php } ?>

    </div>

</div>

<div class="custom-date-box">
                                        <input
                                            type="hidden"
                                            name="fecha_nota"
                                            id="radio_fecha_nota"
                                            value="<?php echo 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 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"
                                        placeholder="00:00:00"
                                        maxlength="9"
                                        value="<?php echo htmlspecialchars($_POST['duracion'] ?? '', ENT_QUOTES, 'UTF-8'); ?>"
                                        <?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"
                                            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($_POST['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'); ?>"
                                                        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($_POST['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"></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($_POST['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 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($_POST['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($_POST['etiquetas'] ?? '', ENT_QUOTES, 'UTF-8'); ?>">
                                    <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')">
                                    </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>
                                    <option value="positivo" <?php echo (($_POST['tipo_nota'] ?? '') === 'positivo') ? 'selected' : ''; ?>>Positivo</option>
                                    <option value="neutral" <?php echo (($_POST['tipo_nota'] ?? '') === 'neutral') ? 'selected' : ''; ?>>Neutral</option>
                                    <option value="negativo" <?php echo (($_POST['tipo_nota'] ?? '') === 'negativo') ? 'selected' : ''; ?>>Negativo</option>
                                </select>
                            </div>

                            <button type="submit" name="guardar_noticia" class="radio-submit">CREAR NOTICIA ⌄</button>
                        </aside>

                    </form>
                </div>

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

                <div class="redes-wrapper">
                    <a href="<?php echo $dashboard_actual; ?>?modulo=noticias" class="redes-back">← Volver a Noticias</a>

                    <form method="POST" enctype="multipart/form-data" class="redes-form-layout">

                        <div class="redes-left">
                            <input type="hidden" name="tipo_medio" id="redes_tipo_medio_hidden" value="Redes Sociales">

                            <div class="redes-field">
                                <label>Titular <span class="req">*</span></label>
                                <input class="redes-input redes-title-input" type="text" name="titulo" placeholder="Titular de la noticia" required>
                            </div>

                            <div class="redes-field">
                                <label>Resumen</label>
                                <textarea class="redes-textarea" name="descripcion" required></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" checked onclick="actualizarTipoRedesWeb('Redes Sociales')">
                                        Redes Sociales
                                    </label>

                                    <label>
                                        <input type="radio" name="tipo_redes_web_opcion" value="Página Web" 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 date('Y-m-d'); ?>">

                                        <div
                                            id="date_display_redes"
                                            class="date-display"
                                            onclick="abrirCalendarioRedes(event)">

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

                                            <span id="date_text_redes">
                                                <em><?php echo 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"
                                            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"
                                            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'); ?>"
                                                        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" 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"></div>
                            <button type="button" class="redes-upload-circle" onclick="abrirAdjuntosModal('redes')">+</button>
                            <input type="hidden" name="archivo_adjunto_ids" id="adjunto_id_redes">
                        </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 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">
                            </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">
                                    <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')">
                                    </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>
                                    <option value="positivo">Positivo</option>
                                    <option value="neutral">Neutral</option>
                                    <option value="negativo">Negativo</option>
                                </select>
                            </div>

                            <button type="submit" name="guardar_noticia" class="redes-submit">CREAR 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_raw = trim((string)($n['tipo_medio'] ?? ''));
                            $subtipo_raw = trim((string)($n['subtipo_medio'] ?? ''));
                            $tipo_medio = htmlspecialchars($tipo_medio_raw, ENT_QUOTES, 'UTF-8');
                            $subtipo = htmlspecialchars($subtipo_raw, ENT_QUOTES, 'UTF-8');
                            $descripcion_raw = (string)($n['descripcion'] ?? '');
                            $descripcion = htmlspecialchars($descripcion_raw, ENT_QUOTES, 'UTF-8');
                            $tipo_nota = htmlspecialchars(strtoupper((string)($n['tipo_nota'] ?? 'Neutral')), ENT_QUOTES, 'UTF-8');

                            /* Datos completos ya guardados dentro de la noticia. */
                            $datos_noticia_tarjeta = array();
                            if (preg_match('/__DATOS_NOTICIA__:\s*([A-Za-z0-9+\/=]+)/', $descripcion_raw, $coincidencia_datos)) {
                                $json_datos = base64_decode($coincidencia_datos[1], true);
                                if ($json_datos !== false) {
                                    $datos_decodificados = json_decode($json_datos, true);
                                    if (is_array($datos_decodificados)) {
                                        $datos_noticia_tarjeta = $datos_decodificados;
                                    }
                                }
                            }

                            /* Todas las etiquetas seleccionadas. */
                            $etiquetas_tarjeta = array();
                            if (preg_match('/(?:Etiquetas\/Clientes|Etiquetas):\s*(.+?)(?:\r?\n\r?\n__DATOS_NOTICIA__|$)/si', $descripcion_raw, $coincidencia_etiquetas)) {
                                $texto_etiquetas = trim($coincidencia_etiquetas[1]);
                                foreach (preg_split('/\s*,\s*/', $texto_etiquetas) as $etiqueta_item) {
                                    $etiqueta_item = trim($etiqueta_item);
                                    if ($etiqueta_item !== '' && !in_array($etiqueta_item, $etiquetas_tarjeta, true)) {
                                        $etiquetas_tarjeta[] = $etiqueta_item;
                                    }
                                }
                            }

                            $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 = "📄";
                                }
                            }
                            
                            /* Región: usar primero el departamento guardado en la propia noticia. */
                            $departamento = trim((string)($datos_noticia_tarjeta['departamento'] ?? ''));
$localidad = trim((string)($datos_noticia_tarjeta['localidad'] ?? ''));

if ($departamento !== '' && $localidad !== '') {
    $ubicacion = $departamento . ', ' . $localidad;
} elseif ($departamento !== '') {
    $ubicacion = $departamento;
} elseif ($localidad !== '') {
    $ubicacion = $localidad;
} else {
    $ubicacion = '';
}
                            if ($ubicacion === '') {
                                $ubicacion = trim((string)($n['region'] ?? ''));
                            }

                            /* Respaldo para registros antiguos con formato Región / Provincia / Ciudad / Medio. */
                            $medio_nombre_raw = $subtipo_raw;
                            $partes_medio = explode(" / ", $subtipo_raw);
                            if (count($partes_medio) >= 4) {
                                if ($ubicacion === '') {
                                    $ubicacion = trim($partes_medio[0]);
                                }
                                $medio_nombre_raw = trim($partes_medio[3]);
                            }

                            $medio_nombre = htmlspecialchars($medio_nombre_raw, ENT_QUOTES, 'UTF-8');

                            $hora_tarjeta = trim((string)($datos_noticia_tarjeta['hora_nota'] ?? ''));
                            $mostrar_hora_tarjeta = in_array($tipo_medio_raw, array('Radio', 'Televisión', 'Television'), true)
                                && preg_match('/^(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d)?$/', $hora_tarjeta);

                            $icono_tipo_medio = '▦';
                            if ($tipo_medio_raw === 'Radio') {
                                $icono_tipo_medio = '🎙';
                            } elseif ($tipo_medio_raw === 'Televisión' || $tipo_medio_raw === 'Television') {
                                $icono_tipo_medio = '📺';
                            } elseif ($tipo_medio_raw === 'Redes Sociales') {
                                $icono_tipo_medio = '⌘';
                            } elseif ($tipo_medio_raw === 'Página Web' || $tipo_medio_raw === 'Pagina Web') {
                                $icono_tipo_medio = '🌐';
                            }

                            $sin_valorizacion = in_array($tipo_medio_raw, array('Redes Sociales', 'Página Web', 'Pagina Web'), true);

                            $tarifa_real_noticia = isset($n['tarifa']) && is_numeric($n['tarifa'])
                                ? (float)$n['tarifa']
                                : 0.0;
                            $valor = "S/" . number_format($tarifa_real_noticia, 2);
                                $color_tono = "#d9dce8";

                            $tipo_nota_sql = $conn->real_escape_string($n['tipo_nota']);
                            $tipo_busqueda = trim($tipo_nota_sql);

                            if($tipo_busqueda=="positivo") $tipo_busqueda="positivo";
                            if($tipo_busqueda=="negativo") $tipo_busqueda="negativo";
                            if($tipo_busqueda=="neutral")  $tipo_busqueda="neutral";

                            $sql_color = "
                                SELECT color
                                FROM tonos
                                WHERE LOWER(nombre)=LOWER('$tipo_busqueda')
                                LIMIT 1
                            ";

                            $qColor = $conn->query($sql_color);

                            if($qColor && $qColor->num_rows > 0){

                                $rColor = $qColor->fetch_assoc();

                                if(!empty($rColor['color'])){
                                    $color_tono = $rColor['color'];
                                }

                            }
                            
                        ?>
                        <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)); ?><?php if($mostrar_hora_tarjeta){ ?> <?php echo htmlspecialchars(substr($hora_tarjeta, 0, 5), ENT_QUOTES, 'UTF-8'); ?> hrs<?php } ?></span>
                                    <span><svg xmlns="http://www.w3.org/2000/svg" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:-2px;margin-right:6px;color:#9aa0b5;"><path d="M21 10c0 7-9 13-9 13S3 17 3 10a9 9 0 1 1 18 0z"></path><circle cx="12" cy="10" r="3"></circle></svg><?php echo ($ubicacion !== "" ? htmlspecialchars($ubicacion, ENT_QUOTES, 'UTF-8') : 'Sin ubicación'); ?></span>
                                </div>

                                <a class="news-title"
                                   href="<?php echo $dashboard_actual; ?>?modulo=editar_noticia&id=<?php echo $id; ?>">
                                    <?php echo $titulo; ?>
                                </a>

                                <div class="tags">
                                    <?php foreach($etiquetas_tarjeta as $etiqueta_tarjeta){ ?>
                                        <span class="tag"><?php echo htmlspecialchars($etiqueta_tarjeta, ENT_QUOTES, 'UTF-8'); ?></span>
                                    <?php } ?>
                                </div>

                                <div class="tone-line-wrap" title="<?php echo $tipo_nota; ?>">
                                    <span class="tone-line" style="background:<?php echo $color_tono; ?>;"></span>
                                </div>

                                <div class="news-source">
                                    <strong><?php echo $icono_tipo_medio; ?> <?php echo $tipo_medio; ?></strong>
                                    <span class="news-source-separator"></span>
                                    <span><?php echo $medio_nombre; ?></span>
                                </div>

                                <div class="news-actions" data-noticia-id="<?php echo $id; ?>">
                                    <?php
                                    $estado_publicacion = strtolower(trim((string)($n['estado_publicacion'] ?? 'registrada')));
                                    $esta_publicada = ($estado_publicacion === 'publicada');
                                    ?>

                                    <button
                                        class="action-mini <?php echo $esta_publicada ? 'btn-publicada' : 'btn-publicar'; ?>"
                                        type="button"
                                        title="<?php echo $esta_publicada ? 'Noticia publicada' : 'Publicar noticia'; ?>"
                                        data-id="<?php echo $id; ?>">
                                        <?php if($esta_publicada){ ?>
                                            <svg viewBox="0 0 24 24" aria-hidden="true">
                                                <circle cx="12" cy="12" r="7" fill="#fff"></circle>
                                                <path d="M8.7 12.1l2.1 2.1 4.5-4.7" fill="none" stroke="#54d99a" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
                                            </svg>
                                        <?php }else{ ?>
                                            <svg viewBox="0 0 24 24" aria-hidden="true">
                                                <circle cx="12" cy="12" r="7.5" fill="none" stroke="currentColor" stroke-width="2.2"></circle>
                                                <path d="M7.2 7.2l9.6 9.6" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"></path>
                                            </svg>
                                        <?php } ?>
                                    </button>

                                    <button class="action-mini btn-duplicar-noticia" type="button" title="Duplicar noticia" data-id="<?php echo $id; ?>">
                                        <svg viewBox="0 0 24 24" aria-hidden="true">
                                            <rect x="5" y="5" width="11" height="11" rx="1.5" fill="none" stroke="currentColor" stroke-width="1.7"></rect>
                                            <path d="M15 9h4v10H9v-4M12 8v5M9.5 10.5h5" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"></path>
                                        </svg>
                                    </button>

                                    <?php if($esta_publicada){ ?>
                                        <span class="acciones-publicadas-extra">
                                            <button class="action-mini btn-enlace-publicado" type="button" title="Enlace" data-id="<?php echo $id; ?>">
                                                <svg viewBox="0 0 24 24" aria-hidden="true">
                                                    <path d="M9.5 14.5l5-5M7.2 16.8l-1 1a3.4 3.4 0 0 1-4.8-4.8l3.2-3.2a3.4 3.4 0 0 1 4.8 0M16.8 7.2l1-1a3.4 3.4 0 1 1 4.8 4.8l-3.2 3.2a3.4 3.4 0 0 1-4.8 0" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path>
                                                </svg>
                                            </button>

                                            <button
                                                class="action-mini btn-abrir-publicado"
                                                type="button"
                                                title="Abrir Vista Pública"
                                                data-id="<?php echo $id; ?>">
                                                <svg viewBox="0 0 24 24" aria-hidden="true">
                                                    <path d="M14 5h5v5M19 5l-8 8M18 13v5a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h5" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"></path>
                                                </svg>
                                            </button>
                                        </span>
                                    <?php } ?>

                                    <button class="action-mini btn-whatsapp-noticia" type="button" title="WhatsApp" data-id="<?php echo $id; ?>">
                                        <svg viewBox="0 0 24 24" aria-hidden="true">
                                            <path d="M20 11.6a8 8 0 0 1-11.8 7L4 20l1.4-4A8 8 0 1 1 20 11.6Z" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"></path>
                                            <path d="M9 8.8c.3 2.5 1.7 4 4.2 4.7l1.1-1.1 1.8.9c-.3 1.2-1.2 1.8-2.4 1.7-3.5-.5-6-3-6.5-6.4 0-1.2.5-2.1 1.7-2.4l.9 1.8-.8.8Z" fill="none" stroke="currentColor" stroke-width="1.25" stroke-linejoin="round"></path>
                                        </svg>
                                    </button>
                                </div>
                            </div>

                            <div class="news-value <?php echo $sin_valorizacion ? 'news-value-empty' : ''; ?>">
                                <?php if($sin_valorizacion){ ?>
                                    <span class="news-value-placeholder"></span>
                                <?php }else{ ?>
                                    <strong><?php echo $valor; ?></strong>
                                <?php } ?>
                            </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="positivo">Positivo</option>
                <option value="negativo">Negativo</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>


<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; ?>"
                            onclick="abrirDetalleAdjunto(this)"
                        >
                            <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>




