{"id":1181,"date":"2026-06-04T16:32:19","date_gmt":"2026-06-04T16:32:19","guid":{"rendered":"https:\/\/ideastarragonafilmfestival.org\/?page_id=1181"},"modified":"2026-06-05T08:48:42","modified_gmt":"2026-06-05T08:48:42","slug":"catalogo","status":"publish","type":"page","link":"https:\/\/ideastarragonafilmfestival.org\/it\/catalogo\/","title":{"rendered":"CAT\u00c1LOGO"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1181\" class=\"elementor elementor-1181\">\n\t\t\t\t<div class=\"elementor-element elementor-element-447da03 e-con e-atomic-element e-flexbox-base e-80ce661 \" data-id=\"447da03\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"447da03\">\n    \t\t<div class=\"elementor-element elementor-element-9005945 elementor-widget elementor-widget-html\" data-id=\"9005945\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!doctype html>\r\n<html lang=\"es\">\r\n<head>\r\n  <meta charset=\"utf-8\">\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n  <title>Catalogo Ideas Tarragona Film Festival 2026<\/title>\r\n  <style>\r\n    :root {\r\n      --bg: #f4f7fb;\r\n      --panel: #ffffff;\r\n      --line: #d7e2ee;\r\n      --text: #16324a;\r\n      --muted: #5f7285;\r\n      --accent: #0073aa;\r\n      --accent-soft: #e9f5fb;\r\n      --shadow: 0 10px 28px rgba(12, 42, 66, 0.08);\r\n      --radius: 12px;\r\n    }\r\n\r\n    * {\r\n      box-sizing: border-box;\r\n    }\r\n\r\n    html,\r\n    body {\r\n      margin: 0;\r\n      padding: 0;\r\n      background: var(--bg);\r\n      color: var(--text);\r\n      font-family: \"Segoe UI\", Arial, sans-serif;\r\n    }\r\n\r\n    .app {\r\n      max-width: 1600px;\r\n      margin: 0 auto;\r\n      padding: 14px;\r\n      display: grid;\r\n      grid-template-columns: 320px minmax(0, 1fr);\r\n      gap: 14px;\r\n    }\r\n\r\n    .toc {\r\n      background: var(--panel);\r\n      border: 1px solid var(--line);\r\n      border-radius: var(--radius);\r\n      box-shadow: var(--shadow);\r\n      padding: 10px;\r\n      position: sticky;\r\n      top: 14px;\r\n      height: calc(100vh - 28px);\r\n      overflow: auto;\r\n    }\r\n\r\n    .toc h2 {\r\n      margin: 4px 4px 8px;\r\n      font-size: 1rem;\r\n    }\r\n\r\n    .toc h3 {\r\n      margin: 12px 4px 6px;\r\n      font-size: 0.74rem;\r\n      text-transform: uppercase;\r\n      letter-spacing: 0.07em;\r\n      color: var(--muted);\r\n    }\r\n\r\n    .toc-list {\r\n      list-style: none;\r\n      margin: 0;\r\n      padding: 0;\r\n    }\r\n\r\n    .toc-list li + li {\r\n      margin-top: 4px;\r\n    }\r\n\r\n    .toc-btn {\r\n      width: 100%;\r\n      border: 1px solid var(--line);\r\n      border-radius: 8px;\r\n      background: #fff;\r\n      color: var(--text);\r\n      padding: 7px 8px;\r\n      text-align: left;\r\n      cursor: pointer;\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: space-between;\r\n      gap: 8px;\r\n      font-size: 0.82rem;\r\n      line-height: 1.2;\r\n    }\r\n\r\n    .toc-btn:hover,\r\n    .toc-btn:focus-visible {\r\n      background: var(--accent-soft);\r\n      border-color: #9fc9df;\r\n      outline: none;\r\n    }\r\n\r\n    .toc-btn.is-active {\r\n      border-color: var(--accent);\r\n      box-shadow: inset 2px 0 0 var(--accent);\r\n      font-weight: 600;\r\n    }\r\n\r\n    .toc-page {\r\n      color: var(--muted);\r\n      font-size: 0.75rem;\r\n      flex: 0 0 auto;\r\n    }\r\n\r\n    .main {\r\n      min-width: 0;\r\n    }\r\n\r\n    .topbar {\r\n      background: var(--panel);\r\n      border: 1px solid var(--line);\r\n      border-radius: var(--radius);\r\n      box-shadow: var(--shadow);\r\n      padding: 10px;\r\n      margin-bottom: 12px;\r\n      display: flex;\r\n      flex-wrap: wrap;\r\n      align-items: center;\r\n      gap: 8px;\r\n    }\r\n\r\n    .topbar strong {\r\n      font-size: 0.95rem;\r\n    }\r\n\r\n    .status {\r\n      font-size: 0.85rem;\r\n      color: var(--muted);\r\n      margin-left: auto;\r\n    }\r\n\r\n    .mobile-jump {\r\n      display: none;\r\n      width: 100%;\r\n      margin-top: 8px;\r\n    }\r\n\r\n    .mobile-jump select {\r\n    width: 100%;\r\n    border: 1px solid var(--line);\r\n    border-radius: 8px;\r\n    padding: 8px;\r\n    background: #ffff00;\r\n    color: #000000;\r\n    font-size: 0.9rem;\r\n    font-weight: 500;\r\n    font-family: 'Poppins';\r\n}\r\n\r\n    .pages {\r\n      display: flex;\r\n      flex-direction: column;\r\n      gap: 12px;\r\n    }\r\n\r\n    .page-card {\r\n      background: var(--panel);\r\n      border: 1px solid var(--line);\r\n      border-radius: var(--radius);\r\n      box-shadow: var(--shadow);\r\n      padding: 8px;\r\n      scroll-margin-top: 86px;\r\n    }\r\n\r\n    .page-head {\r\n      display: flex;\r\n      align-items: center;\r\n      justify-content: space-between;\r\n      padding: 2px 4px 8px;\r\n      color: var(--muted);\r\n      font-size: 0.78rem;\r\n    }\r\n\r\n    .page-head-right {\r\n      display: inline-flex;\r\n      align-items: center;\r\n      gap: 8px;\r\n    }\r\n\r\n    .page-full-btn {\r\n      border: 1px solid #c8d8e6;\r\n    border-radius: 7px;\r\n    padding: 4px 8px;\r\n    background: #ffff00;\r\n    color: #000000;\r\n    font-size: 0.72rem;\r\n    cursor: pointer;\r\n    font-weight: 600;\r\n    font-family: 'Poppins';\r\n    }\r\n\r\n    .page-full-btn:hover,\r\n    .page-full-btn:focus-visible {\r\n      border-color: #9fc9df;\r\n      background: #e9f5fb;\r\n      outline: none;\r\n    }\r\n\r\n    .page-quality {\r\n      display: inline-block;\r\n      margin-left: 8px;\r\n      border: 1px solid #c8d8e6;\r\n      border-radius: 999px;\r\n      padding: 2px 7px;\r\n      font-size: 0.7rem;\r\n      color: #5d7287;\r\n      background: #f7fbff;\r\n    }\r\n\r\n    .page-card.is-enhanced {\r\n      border-color: #9fc9df;\r\n      box-shadow: 0 10px 28px rgba(12, 42, 66, 0.12);\r\n    }\r\n\r\n    .page-card.is-enhanced .page-quality {\r\n      color: #0d5d87;\r\n      border-color: #95c3de;\r\n      background: #e9f5fb;\r\n      font-weight: 600;\r\n    }\r\n\r\n    .page-canvas-wrap {\r\n      width: 100%;\r\n      overflow: auto;\r\n      border-radius: 8px;\r\n      background: #eef3f8;\r\n      min-height: 150px;\r\n      display: grid;\r\n      place-items: center;\r\n      touch-action: pan-x pan-y;\r\n      cursor: zoom-in;\r\n    }\r\n\r\n    .page-card.is-enhanced .page-canvas-wrap {\r\n      cursor: zoom-out;\r\n    }\r\n\r\n    .page-canvas-wrap canvas {\r\n      display: block;\r\n      width: 100%;\r\n      height: auto;\r\n      border-radius: 6px;\r\n      background: #fff;\r\n    }\r\n\r\n    .page-card:fullscreen {\r\n      padding: 12px;\r\n      width: 100vw;\r\n      height: 100vh;\r\n      max-width: none;\r\n      max-height: none;\r\n      border-radius: 0;\r\n      border: none;\r\n      background: #0d1722;\r\n    }\r\n\r\n    .page-card:fullscreen .page-head {\r\n      color: #d7e5f3;\r\n      padding-bottom: 10px;\r\n    }\r\n\r\n    .page-card:fullscreen .page-quality {\r\n      color: #d9eefc;\r\n      border-color: #4d7291;\r\n      background: #1e354a;\r\n    }\r\n\r\n    .page-card:fullscreen .page-full-btn {\r\n      color: #eef8ff;\r\n      border-color: #4d7291;\r\n      background: #1e354a;\r\n    }\r\n\r\n    .page-card:fullscreen .page-canvas-wrap {\r\n      background: #0d1722;\r\n      min-height: calc(100vh - 62px);\r\n      height: calc(100vh - 62px);\r\n      overflow: auto;\r\n      border-radius: 8px;\r\n    }\r\n\r\n    .page-card:fullscreen .page-canvas-wrap canvas {\r\n      width: auto;\r\n      max-width: 100%;\r\n      max-height: none;\r\n      margin: 0 auto;\r\n    }\r\n\r\n    .loader {\r\n      color: var(--muted);\r\n      font-size: 0.82rem;\r\n      padding: 16px;\r\n      text-align: center;\r\n    }\r\n\r\n    @media (max-width: 1000px) {\r\n      .app {\r\n        grid-template-columns: 1fr;\r\n      }\r\n\r\n      .toc {\r\n        display: none;\r\n      }\r\n\r\n      .mobile-jump {\r\n        display: block;\r\n      }\r\n\r\n      .status {\r\n        width: 100%;\r\n        margin-left: 0;\r\n      }\r\n\r\n    }\r\n  <\/style>\r\n<\/head>\r\n<body data-rsssl=1>\r\n  <div class=\"app\">\r\n    <aside class=\"toc\" aria-label=\"Tabla de contenidos\">\r\n      <h2>Tabla de contenidos<\/h2>\r\n      <div id=\"toc-desktop\"><\/div>\r\n    <\/aside>\r\n\r\n    <main class=\"main\">\r\n      <div class=\"topbar\">\r\n        <strong>Catalogo Ideas Tarragona Film Festival 2026<\/strong>\r\n        <span id=\"status\" class=\"status\">Cargando PDF...<\/span>\r\n        <div class=\"mobile-jump\">\r\n          <select id=\"toc-mobile-select\" aria-label=\"Ir a una pagina\"><\/select>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div id=\"pages\" class=\"pages\"><\/div>\r\n    <\/main>\r\n  <\/div>\r\n\r\n  <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.min.js\"><\/script>\r\n  <script>\r\n    const PDF_URL = \"https:\/\/ideastarragonafilmfestival.org\/wp-content\/uploads\/2026\/06\/IDEAS.CATALOGO-2026-P001-PDF-combinado-comprimido-2.pdf\";\r\n\r\n    const TOC = [\r\n      {\r\n        group: \"Bloque inicial\",\r\n        items: [\r\n          { title: \"Portada\", page: 1 },\r\n          { title: \"Creemos una...\", page: 2 },\r\n          { title: \"Indice general del proyecto\", page: 3 },\r\n          { title: \"01 Carta de presentacion\", page: 4 },\r\n          { title: \"02 El programa\", page: 7 },\r\n          { title: \"03 Catalogo innovador\", page: 9 },\r\n          { title: \"04 Recuperemos el cineclub\", page: 10 },\r\n          { title: \"05 Que hacer\", page: 11 },\r\n          { title: \"07 Filosofia\", page: 16 }\r\n        ]\r\n      },\r\n      {\r\n        group: \"Programa\",\r\n        items: [\r\n          { title: \"Agenda\", page: 22 },\r\n          { title: \"Diccionario inteligente\", page: 26 }\r\n        ]\r\n      },\r\n      {\r\n        group: \"Diccionario de peliculas\",\r\n        items: [\r\n          { title: \"Que te dice esa naturaleza?\", page: 27 },\r\n          { title: \"2000 Metros hasta Andriivka\", page: 30 },\r\n          { title: \"Aro Berria (Nueva Era)\", page: 33 },\r\n          { title: \"Black Dog\", page: 36 },\r\n          { title: \"La Buena Hija\", page: 39 },\r\n          { title: \"Corredora\", page: 42 },\r\n          { title: \"Dos Fiscales\", page: 45 },\r\n          { title: \"El Agente Secreto\", page: 48 },\r\n          { title: \"El Mago del Kremlin\", page: 51 },\r\n          { title: \"El Sendero Azul\", page: 54 },\r\n          { title: \"El Sonido de la Caida\", page: 57 },\r\n          { title: \"Espejos 3\", page: 60 },\r\n          { title: \"Estrany Riu\", page: 63 },\r\n          { title: \"Hangar Rojo\", page: 66 },\r\n          { title: \"Historias del Buen Valle\", page: 69 },\r\n          { title: \"Incontrolable\", page: 72 },\r\n          { title: \"La Grazia\", page: 75 },\r\n          { title: \"La Hija Pequena\", page: 78 },\r\n          { title: \"La Plaga\", page: 81 },\r\n          { title: \"La Risa y la Navaja\", page: 84 },\r\n          { title: \"La Semilla de la Higuera Sagrada\", page: 87 },\r\n          { title: \"La Sombra de mi Padre\", page: 90 },\r\n          { title: \"La Tarta del Presidente\", page: 93 },\r\n          { title: \"La Virgen de la Tosquera\", page: 96 },\r\n          { title: \"La Voz de Hind\", page: 99 },\r\n          { title: \"Mr. Nobody contra Putin\", page: 102 },\r\n          { title: \"No Hay Otra Opcion\", page: 105 },\r\n          { title: \"Nouvelle Vague\", page: 108 },\r\n          { title: \"Pillion\", page: 111 },\r\n          { title: \"Queer\", page: 114 },\r\n          { title: \"Renoir\", page: 117 },\r\n          { title: \"Resurrection\", page: 120 },\r\n          { title: \"The Mastermind\", page: 123 },\r\n          { title: \"Todo lo que Fuimos\", page: 126 },\r\n          { title: \"Un Altre Home\", page: 129 },\r\n          { title: \"Un Mundo Fragil y Maravilloso\", page: 132 },\r\n          { title: \"Un Simple Accidente\", page: 135 },\r\n          { title: \"Una Pelicula Inacabada\", page: 138 },\r\n          { title: \"Urchin\", page: 141 },\r\n          { title: \"Valor Sentimental\", page: 144 },\r\n          { title: \"Yo No Morire de Amor\", page: 147 }\r\n        ]\r\n      }\r\n    ];\r\n\r\n    const tocDesktop = document.getElementById(\"toc-desktop\");\r\n    const tocMobileSelect = document.getElementById(\"toc-mobile-select\");\r\n    const pagesRoot = document.getElementById(\"pages\");\r\n    const statusEl = document.getElementById(\"status\");\r\n\r\n    let pdfDoc = null;\r\n    let observer = null;\r\n    let activePage = 1;\r\n    let renderObserver = null;\r\n    let resizeTimer = null;\r\n    let jumpResumeTimer = null;\r\n    let isProgrammaticJump = false;\r\n    let lastViewportWidth = window.innerWidth;\r\n    const rendered = new Set();\r\n    const rendering = new Map();\r\n    const enhancedPages = new Set();\r\n    const isMobile = window.matchMedia(\"(max-width: 1000px)\").matches;\r\n    const INITIAL_UNLOCK_PAGES = 10;\r\n    const LOW_QUALITY_SCALE = isMobile ? 0.62 : 0.72;\r\n    const HIGH_QUALITY_SCALE = isMobile ? 1.28 : 1.45;\r\n    let navigationLocked = false;\r\n\r\n    function setNavigationEnabled(enabled) {\r\n      navigationLocked = !enabled;\r\n      document.querySelectorAll(\".toc-btn\").forEach((btn) => {\r\n        btn.disabled = !enabled;\r\n      });\r\n      tocMobileSelect.disabled = !enabled;\r\n    }\r\n\r\n    async function preloadPagesRange(startPage, endPage, totalPages) {\r\n      const safeEnd = Math.min(endPage, totalPages);\r\n      for (let page = startPage; page <= safeEnd; page += 1) {\r\n        await renderPage(page, true);\r\n      }\r\n      return safeEnd;\r\n    }\r\n\r\n    function buildTOC() {\r\n      const fragment = document.createDocumentFragment();\r\n      const mobileFragment = document.createDocumentFragment();\r\n\r\n      TOC.forEach((section) => {\r\n        const h3 = document.createElement(\"h3\");\r\n        h3.textContent = section.group;\r\n        fragment.appendChild(h3);\r\n\r\n        const ul = document.createElement(\"ul\");\r\n        ul.className = \"toc-list\";\r\n\r\n        const optGroup = document.createElement(\"optgroup\");\r\n        optGroup.label = section.group;\r\n\r\n        section.items.forEach((item) => {\r\n          const li = document.createElement(\"li\");\r\n          const btn = document.createElement(\"button\");\r\n          btn.type = \"button\";\r\n          btn.className = \"toc-btn\";\r\n          btn.dataset.page = String(item.page);\r\n          btn.innerHTML = \"<span>\" + item.title + \"<\/span><span class=\\\"toc-page\\\">\" + item.page + \"<\/span>\";\r\n          btn.addEventListener(\"click\", () => goToPage(item.page));\r\n          li.appendChild(btn);\r\n          ul.appendChild(li);\r\n\r\n          const option = document.createElement(\"option\");\r\n          option.value = String(item.page);\r\n          option.textContent = item.title + \" (\" + item.page + \")\";\r\n          optGroup.appendChild(option);\r\n        });\r\n\r\n        fragment.appendChild(ul);\r\n        mobileFragment.appendChild(optGroup);\r\n      });\r\n\r\n      tocDesktop.appendChild(fragment);\r\n      tocMobileSelect.appendChild(mobileFragment);\r\n\r\n      tocMobileSelect.addEventListener(\"change\", (event) => {\r\n        const page = Number(event.target.value || 1);\r\n        goToPage(page);\r\n      });\r\n    }\r\n\r\n    function createPageSlots(numPages) {\r\n      const docFrag = document.createDocumentFragment();\r\n      for (let page = 1; page <= numPages; page += 1) {\r\n        const section = document.createElement(\"section\");\r\n        section.id = \"page-\" + page;\r\n        section.className = \"page-card\";\r\n        section.dataset.page = String(page);\r\n\r\n        const head = document.createElement(\"div\");\r\n        head.className = \"page-head\";\r\n        head.innerHTML = \"<span>Pagina \" + page + \" <\/span><span class=\\\"page-head-right\\\"><span>#\" + page + \" \/ \" + numPages + \"<\/span><button class=\\\"page-full-btn\\\" type=\\\"button\\\" data-full-page=\\\"\" + page + \"\\\">Pantalla completa<\/button><\/span>\";\r\n\r\n        const wrap = document.createElement(\"div\");\r\n        wrap.className = \"page-canvas-wrap\";\r\n        wrap.id = \"canvas-wrap-\" + page;\r\n\r\n        const loader = document.createElement(\"div\");\r\n        loader.className = \"loader\";\r\n        loader.textContent = \"Cargando pagina \" + page + \"...\";\r\n        wrap.appendChild(loader);\r\n        wrap.addEventListener(\"click\", () => togglePageEnhancement(page));\r\n\r\n        const fullBtn = head.querySelector(\"[data-full-page]\");\r\n        if (fullBtn) {\r\n          fullBtn.addEventListener(\"click\", (event) => {\r\n            event.stopPropagation();\r\n            openPageFullscreen(page);\r\n          });\r\n        }\r\n\r\n        section.appendChild(head);\r\n        section.appendChild(wrap);\r\n        docFrag.appendChild(section);\r\n      }\r\n      pagesRoot.appendChild(docFrag);\r\n    }\r\n\r\n    function setActivePage(page) {\r\n      activePage = page;\r\n      document.querySelectorAll(\".toc-btn\").forEach((btn) => {\r\n        const isCurrent = Number(btn.dataset.page) === page;\r\n        btn.classList.toggle(\"is-active\", isCurrent);\r\n      });\r\n      tocMobileSelect.value = String(page);\r\n    }\r\n\r\n    function goToPage(page) {\r\n      if (navigationLocked) {\r\n        return;\r\n      }\r\n      const target = document.getElementById(\"page-\" + page);\r\n      if (!target) {\r\n        return;\r\n      }\r\n\r\n      \/\/ Evita que el scroll suave dispare renders masivos de paginas intermedias.\r\n      isProgrammaticJump = true;\r\n      if (renderObserver) {\r\n        renderObserver.disconnect();\r\n      }\r\n      if (jumpResumeTimer) {\r\n        clearTimeout(jumpResumeTimer);\r\n      }\r\n\r\n      target.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n      setActivePage(page);\r\n      renderPage(page);\r\n\r\n      \/\/ Precalienta destino y vecinas; despues reanuda lazy-render por viewport.\r\n      [page - 1, page + 1].forEach((nearPage) => {\r\n        if (nearPage >= 1 && nearPage <= (pdfDoc ? pdfDoc.numPages : 0)) {\r\n          renderPage(nearPage);\r\n        }\r\n      });\r\n\r\n      jumpResumeTimer = setTimeout(() => {\r\n        isProgrammaticJump = false;\r\n        if (renderObserver) {\r\n          document.querySelectorAll(\".page-card\").forEach((section) => {\r\n            renderObserver.observe(section);\r\n          });\r\n        }\r\n      }, 700);\r\n    }\r\n\r\n    function setPageQualityState(pageNumber) {\r\n      const card = document.getElementById(\"page-\" + pageNumber);\r\n      const badge = document.getElementById(\"quality-\" + pageNumber);\r\n      const enhanced = enhancedPages.has(pageNumber);\r\n      if (card) {\r\n        card.classList.toggle(\"is-enhanced\", enhanced);\r\n      }\r\n      \r\n    }\r\n\r\n    async function openPageFullscreen(pageNumber) {\r\n      const pageEl = document.getElementById(\"page-\" + pageNumber);\r\n      if (!pageEl) {\r\n        return;\r\n      }\r\n\r\n      \/\/ En pantalla completa forzamos alta calidad para la pagina actual.\r\n      if (!enhancedPages.has(pageNumber)) {\r\n        enhancedPages.add(pageNumber);\r\n        setPageQualityState(pageNumber);\r\n        rendered.delete(pageNumber);\r\n        await renderPage(pageNumber, true);\r\n      }\r\n\r\n      if (document.fullscreenElement === pageEl) {\r\n        await document.exitFullscreen();\r\n        return;\r\n      }\r\n\r\n      if (pageEl.requestFullscreen) {\r\n        await pageEl.requestFullscreen();\r\n      }\r\n    }\r\n\r\n    function rerenderVisiblePages(showAdjustingLoader = true) {\r\n      const pageCards = Array.from(document.querySelectorAll(\".page-card\"));\r\n      const visible = pageCards.filter((card) => {\r\n        const rect = card.getBoundingClientRect();\r\n        return rect.bottom > -120 && rect.top < window.innerHeight + 120;\r\n      });\r\n\r\n      visible.forEach((card) => {\r\n        const pageNum = Number(card.dataset.page);\r\n        if (rendering.has(pageNum)) {\r\n          return;\r\n        }\r\n        rendered.delete(pageNum);\r\n        const wrap = document.getElementById(\"canvas-wrap-\" + pageNum);\r\n        if (wrap && showAdjustingLoader) {\r\n          wrap.innerHTML = \"<div class=\\\"loader\\\">Ajustando pagina \" + pageNum + \"...<\/div>\";\r\n        }\r\n        renderPage(pageNum, true);\r\n      });\r\n    }\r\n\r\n    function togglePageEnhancement(pageNumber) {\r\n      if (navigationLocked) {\r\n        return;\r\n      }\r\n      if (enhancedPages.has(pageNumber)) {\r\n        enhancedPages.delete(pageNumber);\r\n      } else {\r\n        enhancedPages.add(pageNumber);\r\n      }\r\n\r\n      setPageQualityState(pageNumber);\r\n\r\n      if (rendering.has(pageNumber)) {\r\n        return;\r\n      }\r\n\r\n      rendered.delete(pageNumber);\r\n      const wrap = document.getElementById(\"canvas-wrap-\" + pageNumber);\r\n      if (wrap) {\r\n        wrap.innerHTML = \"<div class=\\\"loader\\\">\" + (enhancedPages.has(pageNumber) ? \"Ampliando\" : \"Reduciendo\") + \" pagina \" + pageNumber + \"...<\/div>\";\r\n      }\r\n      renderPage(pageNumber, true);\r\n    }\r\n\r\n    \/\/ Mantiene compatibilidad con botones antiguos inline onclick=\"irAPagina(x)\".\r\n    function irAPagina(page) {\r\n      goToPage(Number(page));\r\n    }\r\n    window.irAPagina = irAPagina;\r\n\r\n    function getScaleForWidth(page, wrapEl) {\r\n      const unscaled = page.getViewport({ scale: 1 });\r\n      const maxWidth = Math.max(280, wrapEl.clientWidth - 4);\r\n      const baseFitScale = maxWidth \/ unscaled.width;\r\n      return baseFitScale;\r\n    }\r\n\r\n    async function renderPage(pageNumber, force = false) {\r\n      if (!pdfDoc) {\r\n        return;\r\n      }\r\n\r\n      if (!force && rendered.has(pageNumber)) {\r\n        return;\r\n      }\r\n\r\n      if (rendering.has(pageNumber)) {\r\n        return rendering.get(pageNumber);\r\n      }\r\n\r\n      const renderPromise = (async () => {\r\n        const wrapEl = document.getElementById(\"canvas-wrap-\" + pageNumber);\r\n        if (!wrapEl) {\r\n          return;\r\n        }\r\n\r\n        const page = await pdfDoc.getPage(pageNumber);\r\n        const baseScale = getScaleForWidth(page, wrapEl);\r\n        const isEnhanced = enhancedPages.has(pageNumber);\r\n        const qualityScale = isEnhanced ? HIGH_QUALITY_SCALE : LOW_QUALITY_SCALE;\r\n        const cssScale = baseScale * qualityScale;\r\n        const viewport = page.getViewport({ scale: cssScale });\r\n        const lowDpr = isMobile ? 0.95 : 1;\r\n        const highDpr = isMobile ? 1.4 : 1.8;\r\n        const dprTarget = isEnhanced ? highDpr : lowDpr;\r\n        const dpr = Math.min(dprTarget, window.devicePixelRatio || 1);\r\n\r\n        const canvas = document.createElement(\"canvas\");\r\n        const ctx = canvas.getContext(\"2d\", { alpha: false });\r\n        canvas.width = Math.floor(viewport.width * dpr);\r\n        canvas.height = Math.floor(viewport.height * dpr);\r\n        canvas.style.width = Math.floor(viewport.width) + \"px\";\r\n        canvas.style.height = Math.floor(viewport.height) + \"px\";\r\n\r\n        await page.render({\r\n          canvasContext: ctx,\r\n          viewport,\r\n          transform: dpr === 1 ? null : [dpr, 0, 0, dpr, 0, 0]\r\n        }).promise;\r\n\r\n        wrapEl.innerHTML = \"\";\r\n        wrapEl.appendChild(canvas);\r\n        rendered.add(pageNumber);\r\n        setPageQualityState(pageNumber);\r\n      })();\r\n\r\n      rendering.set(pageNumber, renderPromise);\r\n      try {\r\n        await renderPromise;\r\n      } finally {\r\n        rendering.delete(pageNumber);\r\n      }\r\n    }\r\n\r\n    function setupObservers() {\r\n      renderObserver = new IntersectionObserver(\r\n        (entries) => {\r\n          if (isProgrammaticJump) {\r\n            return;\r\n          }\r\n          entries.forEach((entry) => {\r\n            if (!entry.isIntersecting) {\r\n              return;\r\n            }\r\n            const page = Number(entry.target.dataset.page);\r\n            renderPage(page);\r\n          });\r\n        },\r\n        {\r\n          root: null,\r\n          rootMargin: isMobile ? \"120px 0px\" : \"240px 0px\",\r\n          threshold: 0.01\r\n        }\r\n      );\r\n\r\n      document.querySelectorAll(\".page-card\").forEach((section) => {\r\n        renderObserver.observe(section);\r\n      });\r\n\r\n      observer = new IntersectionObserver(\r\n        (entries) => {\r\n          let nearest = null;\r\n          entries.forEach((entry) => {\r\n            if (!entry.isIntersecting) {\r\n              return;\r\n            }\r\n            const top = Math.abs(entry.boundingClientRect.top);\r\n            if (!nearest || top < nearest.top) {\r\n              nearest = { top, page: Number(entry.target.dataset.page) };\r\n            }\r\n          });\r\n\r\n          if (nearest) {\r\n            setActivePage(nearest.page);\r\n          }\r\n        },\r\n        {\r\n          root: null,\r\n          threshold: 0.6\r\n        }\r\n      );\r\n\r\n      document.querySelectorAll(\".page-card\").forEach((section) => {\r\n        observer.observe(section);\r\n      });\r\n    }\r\n\r\n    async function init() {\r\n      try {\r\n        buildTOC();\r\n        pdfjsLib.GlobalWorkerOptions.workerSrc = \"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/pdf.js\/3.11.174\/pdf.worker.min.js\";\r\n\r\n        const task = pdfjsLib.getDocument({ url: PDF_URL });\r\n        pdfDoc = await task.promise;\r\n\r\n        createPageSlots(pdfDoc.numPages);\r\n        statusEl.textContent = \"Cargando primeras paginas...\";\r\n\r\n        const totalPages = pdfDoc.numPages;\r\n        const unlockedUntil = await preloadPagesRange(1, INITIAL_UNLOCK_PAGES, totalPages);\r\n\r\n        setupObservers();\r\n        \r\n        setActivePage(1);\r\n      } catch (error) {\r\n        statusEl.textContent = \"No se pudo cargar el PDF\";\r\n        pagesRoot.innerHTML = \"<div class=\\\"page-card\\\"><div class=\\\"loader\\\">Error al cargar el PDF. Comprueba la ruta del archivo y que la pagina se sirva desde HTTP\/HTTPS.<\/div><\/div>\";\r\n        console.error(error);\r\n      }\r\n    }\r\n\r\n    window.addEventListener(\"resize\", () => {\r\n      if (resizeTimer) {\r\n        clearTimeout(resizeTimer);\r\n      }\r\n      resizeTimer = setTimeout(() => {\r\n        const widthDelta = Math.abs(window.innerWidth - lastViewportWidth);\r\n        if (widthDelta < 24) {\r\n          return;\r\n        }\r\n        lastViewportWidth = window.innerWidth;\r\n\r\n        const aroundActive = [activePage - 1, activePage, activePage + 1].filter(\r\n          (page) => page >= 1 && page <= (pdfDoc ? pdfDoc.numPages : 0)\r\n        );\r\n\r\n        aroundActive.forEach((pageNum) => {\r\n          if (rendering.has(pageNum)) {\r\n            return;\r\n          }\r\n          rendered.delete(pageNum);\r\n          renderPage(pageNum, true);\r\n        });\r\n      }, 220);\r\n    });\r\n\r\n    init();\r\n  <\/script>\r\n<\/body>\r\n<\/html>\r\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Catalogo Ideas Tarragona Film Festival 2026 Tabla de contenidos Catalogo Ideas Tarragona Film Festival 2026 Cargando PDF&#8230;<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1181","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>CAT\u00c1LOGO - Ideas Tarragona Film Festival<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ideastarragonafilmfestival.org\/it\/catalogo\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CAT\u00c1LOGO - Ideas Tarragona Film Festival\" \/>\n<meta property=\"og:description\" content=\"Catalogo Ideas Tarragona Film Festival 2026 Tabla de contenidos Catalogo Ideas Tarragona Film Festival 2026 Cargando PDF&#8230;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ideastarragonafilmfestival.org\/it\/catalogo\/\" \/>\n<meta property=\"og:site_name\" content=\"Ideas Tarragona Film Festival\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-05T08:48:42+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data1\" content=\"10 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ideastarragonafilmfestival.org\\\/catalogo\\\/\",\"url\":\"https:\\\/\\\/ideastarragonafilmfestival.org\\\/catalogo\\\/\",\"name\":\"CAT\u00c1LOGO - Ideas Tarragona Film Festival\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ideastarragonafilmfestival.org\\\/#website\"},\"datePublished\":\"2026-06-04T16:32:19+00:00\",\"dateModified\":\"2026-06-05T08:48:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ideastarragonafilmfestival.org\\\/catalogo\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ideastarragonafilmfestival.org\\\/catalogo\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ideastarragonafilmfestival.org\\\/catalogo\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/ideastarragonafilmfestival.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CAT\u00c1LOGO\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ideastarragonafilmfestival.org\\\/#website\",\"url\":\"https:\\\/\\\/ideastarragonafilmfestival.org\\\/\",\"name\":\"Ideas Tarragona Film Festival\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ideastarragonafilmfestival.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"CAT\u00c1LOGO - Ideas Tarragona Film Festival","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ideastarragonafilmfestival.org\/it\/catalogo\/","og_locale":"it_IT","og_type":"article","og_title":"CAT\u00c1LOGO - Ideas Tarragona Film Festival","og_description":"Catalogo Ideas Tarragona Film Festival 2026 Tabla de contenidos Catalogo Ideas Tarragona Film Festival 2026 Cargando PDF&#8230;","og_url":"https:\/\/ideastarragonafilmfestival.org\/it\/catalogo\/","og_site_name":"Ideas Tarragona Film Festival","article_modified_time":"2026-06-05T08:48:42+00:00","twitter_card":"summary_large_image","twitter_misc":{"Tempo di lettura stimato":"10 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/ideastarragonafilmfestival.org\/catalogo\/","url":"https:\/\/ideastarragonafilmfestival.org\/catalogo\/","name":"CAT\u00c1LOGO - Ideas Tarragona Film Festival","isPartOf":{"@id":"https:\/\/ideastarragonafilmfestival.org\/#website"},"datePublished":"2026-06-04T16:32:19+00:00","dateModified":"2026-06-05T08:48:42+00:00","breadcrumb":{"@id":"https:\/\/ideastarragonafilmfestival.org\/catalogo\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ideastarragonafilmfestival.org\/catalogo\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/ideastarragonafilmfestival.org\/catalogo\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/ideastarragonafilmfestival.org\/"},{"@type":"ListItem","position":2,"name":"CAT\u00c1LOGO"}]},{"@type":"WebSite","@id":"https:\/\/ideastarragonafilmfestival.org\/#website","url":"https:\/\/ideastarragonafilmfestival.org\/","name":"Ideas Festival Cinematografico de Tarragona","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ideastarragonafilmfestival.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"}]}},"_links":{"self":[{"href":"https:\/\/ideastarragonafilmfestival.org\/it\/wp-json\/wp\/v2\/pages\/1181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ideastarragonafilmfestival.org\/it\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ideastarragonafilmfestival.org\/it\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ideastarragonafilmfestival.org\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ideastarragonafilmfestival.org\/it\/wp-json\/wp\/v2\/comments?post=1181"}],"version-history":[{"count":61,"href":"https:\/\/ideastarragonafilmfestival.org\/it\/wp-json\/wp\/v2\/pages\/1181\/revisions"}],"predecessor-version":[{"id":1246,"href":"https:\/\/ideastarragonafilmfestival.org\/it\/wp-json\/wp\/v2\/pages\/1181\/revisions\/1246"}],"wp:attachment":[{"href":"https:\/\/ideastarragonafilmfestival.org\/it\/wp-json\/wp\/v2\/media?parent=1181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}