1(function () { 2 function init(block) { 3 var cfg = window.acfvgStreaming || {}; 4 var grid = block.querySelector('[data-acfvg-grid]'); 5 var results = block.querySelector('[data-acfvg-results]'); 6 var qInput = block.querySelector('[data-acfvg-q]'); 7 var searchBtn = block.querySelector('[data-acfvg-search]'); 8 var toggleBtn = block.querySelector('[data-acfvg-filters-toggle]'); 9 var filtersWrap = block.querySelector('[data-acfvg-filters]'); 10 var applyBtn = block.querySelector('[data-acfvg-apply]'); 11 var filterSel = block.querySelectorAll('[data-acfvg-filter]'); 12 13 var perPage = parseInt(block.getAttribute('data-per-page'), 10) || 9; 14 15 function collectFilters() { 16 var f = { q: qInput ? qInput.value.trim() : '' }; 17 filterSel.forEach(function (sel) { 18 var key = sel.getAttribute('data-acfvg-filter'); 19 if (key && sel.value) f[key] = sel.value; 20 }); 21 return f; 22 } 23 24 function setLoadMore(nextPage, hasMore) { 25 var wrap = block.querySelector('[data-acfvg-loadmore-wrap]'); 26 var btn = block.querySelector('[data-acfvg-loadmore]'); 27 if (!wrap || !btn) return; 28 if (hasMore) { 29 btn.setAttribute('data-next-page', String(nextPage)); 30 btn.disabled = false; 31 wrap.hidden = false; 32 } else { 33 wrap.hidden = true; 34 } 35 } 36 37 function request(page, filters) { 38 var body = new FormData(); 39 body.append('action', 'acfvg_streaming_more'); 40 body.append('nonce', cfg.nonce || ''); 41 body.append('page', String(page)); 42 body.append('per_page', String(perPage)); 43 Object.keys(filters).forEach(function (k) { 44 body.append('filters[' + k + ']', filters[k]); 45 }); 46 return fetch(cfg.ajaxUrl, { 47 method: 'POST', 48 credentials: 'same-origin', 49 body: body 50 }).then(function (r) { return r.json(); }); 51 } 52 53 function replaceResults(filters) { 54 if (!results) return; 55 if (searchBtn) searchBtn.disabled = true; 56 if (applyBtn) applyBtn.disabled = true; 57 request(1, filters) 58 .then(function (data) { 59 if (!data || !data.success) return; 60 var payload = data.data || {}; 61 if ((payload.total | 0) === 0) { 62 results.innerHTML = 63 '<p class="acfvg-stream-empty">' + 64 (payload.emptyLabel || 'Nessun risultato.') + 65 '</p>'; 66 block.setAttribute('data-total-pages', '0'); 67 return; 68 } 69 results.innerHTML = 70 '<div class="acfvg-stream-grid" data-acfvg-grid>' + 71 (payload.html || '') + 72 '</div>' + 73 '<div class="acfvg-stream-loadmore-wrap" data-acfvg-loadmore-wrap' + 74 (payload.has_more ? '' : ' hidden') + '>' + 75 '<button type="button" class="acfvg-stream-loadmore" data-acfvg-loadmore data-next-page="2">' + 76 (payload.loadmoreLabel || 'Carica altri film') + 77 '</button>' + 78 '</div>'; 79 block.setAttribute('data-total-pages', String(payload.pages | 0)); 80 bindLoadMore(); 81 }) 82 .finally(function () { 83 if (searchBtn) searchBtn.disabled = false; 84 if (applyBtn) applyBtn.disabled = false; 85 }); 86 } 87 88 function bindLoadMore() { 89 var btn = block.querySelector('[data-acfvg-loadmore]'); 90 if (!btn || btn.__acfvgBound) return; 91 btn.__acfvgBound = true; 92 btn.addEventListener('click', function () { 93 if (btn.disabled) return; 94 var nextPage = parseInt(btn.getAttribute('data-next-page'), 10) || 2; 95 btn.disabled = true; 96 request(nextPage, collectFilters()) 97 .then(function (data) { 98 if (!data || !data.success || !data.data) { 99 btn.disabled = false;
100 return; 101 } 102 var g = block.querySelector('[data-acfvg-grid]'); 103 if (g && data.data.html) { 104 g.insertAdjacentHTML('beforeend', data.data.html); 105 } 106 setLoadMore(nextPage + 1, !!data.data.has_more); 107 }) 108 .catch(function () { btn.disabled = false; }); 109 }); 110 } 111 112 if (toggleBtn && filtersWrap) { 113 toggleBtn.addEventListener('click', function () { 114 var open = filtersWrap.hasAttribute('hidden'); 115 if (open) { 116 filtersWrap.removeAttribute('hidden'); 117 toggleBtn.setAttribute('aria-expanded', 'true'); 118 } else { 119 filtersWrap.setAttribute('hidden', ''); 120 toggleBtn.setAttribute('aria-expanded', 'false'); 121 } 122 }); 123 } 124 125 if (searchBtn) { 126 searchBtn.addEventListener('click', function () { 127 replaceResults(collectFilters()); 128 }); 129 } 130 if (qInput) { 131 qInput.addEventListener('keydown', function (e) { 132 if (e.key === 'Enter') { 133 e.preventDefault(); 134 replaceResults(collectFilters()); 135 } 136 }); 137 } 138 if (applyBtn) { 139 applyBtn.addEventListener('click', function () { 140 replaceResults(collectFilters()); 141 }); 142 } 143 144 bindLoadMore(); 145 } 146 147 function boot() { 148 var blocks = document.querySelectorAll('.acfvg--streaming-list'); 149 for (var i = 0; i < blocks.length; i++) init(blocks[i]); 150 } 151 152 if (document.readyState === 'loading') { 153 document.addEventListener('DOMContentLoaded', boot); 154 } else { 155 boot(); 156 } 157})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.