{"id":9824,"date":"2025-05-08T11:25:10","date_gmt":"2025-05-08T09:25:10","guid":{"rendered":"https:\/\/retrofixer.it\/?page_id=9824"},"modified":"2026-10-28T15:00:41","modified_gmt":"2026-10-28T14:00:41","slug":"videoteca","status":"publish","type":"page","link":"https:\/\/retrofixer.it\/en\/videoteca\/","title":{"rendered":"Video library"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"9824\" class=\"elementor elementor-9824\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e1b1495 e-con-full e-flex e-con e-parent\" data-id=\"e1b1495\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-22e0d18 elementor-widget elementor-widget-html\" data-id=\"22e0d18\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>window.RF_EN=\/^en\/i.test(document.documentElement.lang||'');if(window.RF_EN)document.documentElement.classList.add('rf-en');<\/script>\r\n<style>.rf-en .rf-it{display:none!important}<\/style>\r\n<div class=\"rf-it\" data-no-translation>\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Press+Start+2P&family=VT323&family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\r\n\r\n<style>\r\n.rfv{\r\n  --bg:#0f0c24; --bg2:#171338; --panel:#1d1846; --line:#342c74; --text:#eceaff; --muted:#aaa5d8;\r\n  --c64:#3e31a2; --c64l:#7c70da; --mag:#e0398a; --yel:#ffd23f; --grn:#5ad15f; --cya:#3fd8ff; --ora:#f8961e; --red:#f94144;\r\n  font-family:'Inter',system-ui,-apple-system,Segoe UI,Roboto,sans-serif; color:var(--text); background:var(--bg); line-height:1.5;\r\n  position:relative; padding:44px 0 70px; overflow:hidden;\r\n}\r\n.rfv *,.rfv *::before,.rfv *::after{box-sizing:border-box}\r\n.rfv h2,.rfv h3,.rfv p{margin:0;padding:0}\r\n.rfv h2,.rfv h3{font-family:'Inter',system-ui,sans-serif!important;letter-spacing:0;text-transform:none;font-weight:700}\r\n.rfv a{color:inherit;text-decoration:none}\r\n.rfv button,.rfv select,.rfv input{font:inherit;color:inherit}\r\n.rfv button{cursor:pointer}\r\n.rfv [hidden]{display:none!important}\r\n.rfv .wrap{max-width:1200px;margin:0 auto;padding:0 20px}\r\n.rfv .stripe{height:6px;background:linear-gradient(90deg,var(--red) 0 16.6%,var(--ora) 0 33.3%,var(--yel) 0 50%,var(--grn) 0 66.6%,var(--cya) 0 83.3%,var(--c64l) 0);position:absolute;left:0;right:0;top:0}\r\n\r\n\/* intestazione *\/\r\n.rfv .top{display:flex;gap:24px;align-items:flex-end;justify-content:space-between;flex-wrap:wrap;margin-bottom:22px}\r\n.rfv .kicker{display:inline-block;font-family:'Press Start 2P',monospace;font-size:10px;color:var(--yel);letter-spacing:.06em;margin-bottom:12px}\r\n.rfv .h2{font-family:'Press Start 2P',monospace!important;font-size:clamp(17px,2.4vw,26px);line-height:1.45;color:#fff;text-shadow:3px 3px 0 #000;margin-bottom:10px}\r\n.rfv .sub{color:var(--muted);font-size:15.5px;max-width:640px}\r\n.rfv .lcd{font-family:'VT323',monospace;font-size:26px;line-height:1;color:var(--grn);background:#05040f;border:2px solid #000;border-radius:8px;padding:10px 14px;\r\n  box-shadow:inset 0 0 18px rgba(90,209,95,.15);text-shadow:0 0 6px rgba(90,209,95,.6);white-space:nowrap}\r\n.rfv .lcd small{font-size:18px;color:#3f8f43}\r\n\r\n\/* ricerca *\/\r\n.rfv .term{background:var(--c64);border:10px solid var(--c64l);border-radius:12px;padding:14px 16px;box-shadow:0 0 0 3px #000,0 18px 40px rgba(0,0,0,.45);position:relative}\r\n.rfv .term::after{content:\"\";position:absolute;inset:0;pointer-events:none;background:repeating-linear-gradient(0deg,rgba(0,0,0,.14) 0 1px,transparent 1px 3px)}\r\n.rfv .term label{display:block;font-family:'VT323',monospace;font-size:20px;color:#b3abff;margin-bottom:4px}\r\n.rfv .qrow{display:flex;align-items:center;gap:10px}\r\n.rfv .qrow span{font-family:'VT323',monospace;font-size:30px;color:#fff}\r\n.rfv .q{flex:1;min-width:0;background:transparent;border:0;outline:0;font-family:'VT323',monospace!important;font-size:30px;color:#fff;caret-color:#fff;caret-shape:block;padding:2px 0;text-transform:uppercase}\r\n.rfv .q::placeholder{color:#8e86e0;text-transform:none}\r\n.rfv .clr{background:#000;border:2px solid #b3abff;color:#fff;border-radius:6px;font-family:'Press Start 2P',monospace;font-size:9px;padding:9px 10px;position:relative;z-index:1}\r\n.rfv .clr[hidden]{display:none}\r\n\r\n\/* filtri *\/\r\n.rfv .filters{margin-top:18px;display:grid;gap:14px}\r\n.rfv .filters>*{min-width:0}\r\n.rfv .row{display:flex;flex-wrap:wrap;gap:8px;align-items:center}\r\n.rfv .lbl{font-family:'Press Start 2P',monospace;font-size:9px;color:var(--muted);margin-right:4px;min-width:64px}\r\n.rfv .chip{display:inline-flex;align-items:center;gap:7px;border:2px solid var(--line);background:var(--panel);border-radius:999px;padding:7px 13px;font-size:13px;font-weight:600;color:var(--muted);transition:color .15s,border-color .15s,background .15s}\r\n.rfv .chip:hover{color:#fff;border-color:var(--c64l)}\r\n.rfv .chip.on{background:var(--acc,var(--yel));border-color:var(--acc,var(--yel));color:#15102e}\r\n.rfv .chip svg{width:16px;height:16px}\r\n.rfv .chip .n{opacity:.65;font-weight:500}\r\n.rfv .chip.tag{font-size:12.5px;padding:5px 11px}\r\n.rfv .sel{display:flex;gap:10px;flex-wrap:wrap}\r\n.rfv .sel label{display:flex;align-items:center;gap:8px;background:var(--panel);border:2px solid var(--line);border-radius:10px;padding:4px 6px 4px 12px}\r\n.rfv .sel label span{font-family:'Press Start 2P',monospace;font-size:8px;color:var(--muted)}\r\n.rfv .sel select{background:#0b0920;border:0;border-radius:6px;padding:8px 10px;max-width:230px;color:#fff;font-size:14px}\r\n.rfv .sel select:focus,.rfv .sel select:active{background-color:#1a1638 !important;color:#fff !important;outline:1px solid #5a5296;outline-offset:1px}\r\n.rfv .sel select{color-scheme:dark}\r\n.rfv .sel select option{background:#0b0920;color:#fff}\r\n.rfv .sel select option:checked{background:#342c74;color:#ffd23f}\r\n.rfv .more-tags{background:none;border:0;color:var(--cya);font-size:13px;font-weight:600;padding:6px}\r\n.rfv .active{display:flex;flex-wrap:wrap;gap:8px;align-items:center;min-height:0}\r\n.rfv .pill{display:inline-flex;align-items:center;gap:6px;background:#2a2350;border:2px solid var(--c64l);border-radius:8px;padding:4px 6px 4px 10px;font-size:13px}\r\n.rfv .pill button{background:#000;border:0;border-radius:4px;color:#fff;width:20px;height:20px;line-height:20px;padding:0;font-size:12px}\r\n.rfv .reset{background:none;border:0;color:var(--mag);font-weight:700;font-size:13px}\r\n\r\n\/* risultati *\/\r\n.rfv .bar{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin:26px 0 14px}\r\n.rfv .bar .info{font-size:14px;color:var(--muted)}\r\n.rfv .bar .info b{color:#fff}\r\n.rfv .grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}\r\n.rfv .vc{display:flex;flex-direction:column;background:var(--panel);border:2px solid var(--line);border-radius:12px;overflow:hidden;transition:transform .18s,border-color .18s,box-shadow .18s;animation:rfv-in .35s ease both}\r\n.rfv .vc:hover,.rfv .vc:focus-visible{transform:translateY(-4px);border-color:var(--acc,var(--c64l));box-shadow:0 12px 28px rgba(0,0,0,.45);outline:0}\r\n@keyframes rfv-in{from{opacity:0;transform:translateY(10px)}}\r\n.rfv .th{position:relative;aspect-ratio:16\/9;background:#05040f;overflow:hidden}\r\n.rfv .th img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .3s,filter .3s}\r\n.rfv .vc:hover .th img{transform:scale(1.05);filter:brightness(.8)}\r\n.rfv .th .play{position:absolute;left:50%;top:50%;width:54px;height:40px;margin:-20px 0 0 -27px;border-radius:10px;background:rgba(0,0,0,.65);border:2px solid #fff;display:flex;align-items:center;justify-content:center;\r\n  opacity:.85;transition:opacity .2s,background .2s,transform .2s}\r\n.rfv .th .play::before{content:\"\";border-left:14px solid #fff;border-top:9px solid transparent;border-bottom:9px solid transparent;margin-left:4px}\r\n.rfv .vc:hover .play{opacity:1;background:#ff0000;transform:scale(1.08)}\r\n.rfv .th .code{position:absolute;top:8px;left:8px;font-family:'VT323',monospace;font-size:18px;line-height:1;background:#000;color:var(--grn);padding:3px 6px;border-radius:4px;border:1px solid #2c6b34}\r\n.rfv .th .tipo{position:absolute;bottom:8px;left:8px;font-family:'Press Start 2P',monospace;font-size:7px;background:var(--acc);color:#15102e;padding:4px 6px;border-radius:4px}\r\n.rfv .bd{padding:12px 14px 14px;display:flex;flex-direction:column;gap:6px;flex:1}\r\n.rfv .vc h3{font-size:14.5px;line-height:1.35;color:#fff}\r\n.rfv .vc mark{background:var(--yel);color:#15102e;border-radius:2px;padding:0 1px}\r\n.rfv .mac{font-size:12.5px;font-weight:700;color:var(--acc,var(--c64l));text-transform:uppercase;letter-spacing:.03em}\r\n.rfv .gs{font-size:12.5px;color:#ffb3c8}\r\n.rfv .tg{font-size:12px;color:var(--muted);margin-top:auto}\r\n.rfv .loadmore{display:flex;justify-content:center;margin-top:26px}\r\n.rfv .btn{display:inline-flex;align-items:center;gap:8px;font-family:'Press Start 2P',monospace;font-size:10px;padding:13px 16px;border-radius:8px;border:2px solid var(--line);background:rgba(255,255,255,.04);color:#fff;transition:transform .12s,filter .12s}\r\n.rfv .btn:hover{transform:translateY(-2px);filter:brightness(1.15)}\r\n.rfv .btn.y{background:var(--yel);border-color:var(--yel);color:#231a00;box-shadow:0 4px 0 #a07d00}\r\n.rfv .btn.r{background:#ff0000;border-color:#ff0000;color:#fff;box-shadow:0 4px 0 #8a0000}\r\n.rfv .empty{grid-column:1\/-1;text-align:center;padding:40px 16px;font-family:'VT323',monospace;font-size:26px;color:#b3abff;background:var(--c64);border:10px solid var(--c64l);border-radius:12px}\r\n.rfv .empty p{font-family:'Inter',sans-serif;font-size:14px;color:#d6d1ff;margin:10px 0 16px}\r\n.rfv .sk{border-radius:12px;background:linear-gradient(90deg,#1d1846 0,#2a2460 50%,#1d1846 100%) 0 0\/200% 100%;animation:rfv-sk 1.2s linear infinite;aspect-ratio:4\/3.6}\r\n@keyframes rfv-sk{to{background-position:-200% 0}}\r\n\r\n\/* finestra video *\/\r\n.rfv dialog{width:min(960px,94vw);max-height:94vh;padding:0;border:0;border-radius:14px;background:var(--bg2);color:var(--text);box-shadow:0 30px 80px rgba(0,0,0,.7);overflow:auto}\r\n.rfv dialog::backdrop{background:rgba(5,4,15,.82)}\r\n.rfv .dlg-top{display:flex;align-items:center;gap:10px;padding:10px 12px;background:#000;border-bottom:4px solid var(--c64l)}\r\n.rfv .dlg-top b{font-family:'Press Start 2P',monospace;font-size:9px;color:var(--yel);flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\r\n.rfv .ico-btn{background:#1d1846;border:2px solid var(--line);color:#fff;border-radius:8px;width:38px;height:38px;font-size:16px;display:flex;align-items:center;justify-content:center;flex:none}\r\n.rfv .ico-btn:hover{border-color:var(--yel)}\r\n.rfv .player{aspect-ratio:16\/9;background:#000}\r\n.rfv .player iframe{width:100%;height:100%;border:0;display:block}\r\n.rfv .dlg-bd{padding:16px 18px 20px;display:grid;gap:10px}\r\n.rfv .dlg-bd h3{font-size:18px;color:#fff}\r\n.rfv .dlg-bd .chips{display:flex;flex-wrap:wrap;gap:6px}\r\n.rfv .dlg-bd .k{font-family:'Press Start 2P',monospace;font-size:8px;color:var(--muted);margin-right:4px;align-self:center}\r\n.rfv .dlg-act{display:flex;gap:10px;flex-wrap:wrap;margin-top:6px}\r\n\r\n@media (max-width:1024px){.rfv .grid{grid-template-columns:repeat(3,1fr)}}\r\n@media (max-width:760px){\r\n  .rfv .grid{grid-template-columns:repeat(2,1fr);gap:12px}\r\n  .rfv .q,.rfv .qrow span{font-size:24px}\r\n  .rfv .lbl{min-width:0;width:100%}\r\n  .rfv .sel{display:grid;grid-template-columns:1fr}\r\n  .rfv .sel select{max-width:none;flex:1;min-width:0;width:100%}\r\n  .rfv .sel label{display:flex;min-width:0}\r\n  .rfv .sel label span{flex:none;width:70px}\r\n}\r\n@media (max-width:480px){\r\n  .rfv{padding:30px 0 50px}\r\n  .rfv .wrap{padding:0 14px}\r\n  .rfv .grid{grid-template-columns:1fr}\r\n  .rfv .term{border-width:7px;padding:10px 12px}\r\n}\r\n@media (prefers-reduced-motion:reduce){.rfv *{transition:none!important}.rfv .vc{animation:none}}\r\n\/* riga del contatore visite (Post Views) prima del footer: diventa un separatore *\/\r\nbody:has(.rfv) .post-views.entry-meta{display:block;margin:0;padding:7px 16px;text-align:center;\r\n  font:12px\/1.4 'Inter',system-ui,sans-serif;color:#aaa5d8;background:#0f0c24;border-top:2px solid #342c74;border-bottom:2px solid #5ad15f}\r\n<\/style>\r\n\r\n<div class=\"rfv\" id=\"rfv\">\r\n  <div class=\"stripe\"><\/div>\r\n  <div class=\"wrap\">\r\n    <div class=\"top\">\r\n      <div>\r\n        <span class=\"kicker\">ARCHIVIO VIDEO RETROFIXER<\/span>\r\n        <h2 class=\"h2\">Cerca un video<\/h2>\r\n        <p class=\"sub\">Cerca per macchina, tipo di guasto, componente o argomento. Clicca su un video per guardarlo subito.<\/p>\r\n      <\/div>\r\n      <div class=\"lcd\" id=\"rfvCount\" aria-live=\"polite\">--- <small>VIDEO<\/small><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"term\">\r\n      <label for=\"rfvQ\">SEARCH \"VIDEOTECA\",8,1<\/label>\r\n      <div class=\"qrow\">\r\n        <span aria-hidden=\"true\">&gt;<\/span>\r\n        <input class=\"q\" id=\"rfvQ\" type=\"search\" placeholder=\"es. dead test, 1541, condensatori, Amiga 500\u2026\" autocomplete=\"off\" spellcheck=\"false\">\r\n        <button class=\"clr\" id=\"rfvClr\" type=\"button\" hidden>CLR<\/button>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"filters\">\r\n      <div class=\"row\" id=\"rfvTipi\" role=\"group\" aria-label=\"Tipo di video\"><span class=\"lbl\">TIPO<\/span><\/div>\r\n      <div class=\"sel\">\r\n        <label><span>MACCHINA<\/span><select id=\"rfvMac\"><option value=\"\">Tutte<\/option><\/select><\/label>\r\n        <label><span>GUASTO<\/span><select id=\"rfvGua\"><option value=\"\">Tutti<\/option><\/select><\/label>\r\n        <label><span>ORDINA<\/span><select id=\"rfvSort\">\r\n          <option value=\"new\">Pi\u00f9 recenti<\/option><option value=\"old\">Meno recenti<\/option><option value=\"az\">Titolo A-Z<\/option><option value=\"mac\">Per macchina<\/option>\r\n        <\/select><\/label>\r\n      <\/div>\r\n      <div class=\"row\" id=\"rfvTags\" role=\"group\" aria-label=\"Tag\"><span class=\"lbl\">TAG<\/span><\/div>\r\n      <div class=\"active\" id=\"rfvActive\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"bar\"><div class=\"info\" id=\"rfvInfo\"><\/div><\/div>\r\n    <div class=\"grid\" id=\"rfvGrid\"><\/div>\r\n    <div class=\"loadmore\"><button class=\"btn\" id=\"rfvMore\" type=\"button\" hidden>\u25bc MOSTRA ALTRI<\/button><\/div>\r\n  <\/div>\r\n\r\n  <dialog id=\"rfvDlg\" aria-labelledby=\"rfvDlgTitle\">\r\n    <div class=\"dlg-top\">\r\n      <b id=\"rfvDlgCode\">VIDEO<\/b>\r\n      <button class=\"ico-btn\" id=\"rfvPrev\" type=\"button\" aria-label=\"Video precedente\">\u25c0<\/button>\r\n      <button class=\"ico-btn\" id=\"rfvNext\" type=\"button\" aria-label=\"Video successivo\">\u25b6<\/button>\r\n      <button class=\"ico-btn\" id=\"rfvClose\" type=\"button\" aria-label=\"Chiudi\">\u2715<\/button>\r\n    <\/div>\r\n    <div class=\"player\" id=\"rfvPlayer\"><\/div>\r\n    <div class=\"dlg-bd\">\r\n      <h3 id=\"rfvDlgTitle\"><\/h3>\r\n      <div class=\"chips\" id=\"rfvDlgChips\"><\/div>\r\n      <div class=\"dlg-act\">\r\n        <a class=\"btn r\" id=\"rfvYt\" href=\"#\" target=\"_blank\" rel=\"noopener\">\u25b6 APRI SU YOUTUBE \u2197<\/a>\r\n      <\/div>\r\n    <\/div>\r\n  <\/dialog>\r\n<\/div>\r\n\r\n<script>if(!window.RF_EN){\r\n(function () {\r\n  var root = document.getElementById('rfv');\r\n  if (!root || root.dataset.ready) return;\r\n  root.dataset.ready = '1';\r\n  var SITE = 'https:\/\/retrofixer.it';\r\n  var PAGE = 24;\r\n  var $ = function (id) { return document.getElementById(id); };\r\n  function esc(s) { return String(s == null ? '' : s).replace(\/[&<>\"']\/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]; }); }\r\n  function norm(s) { return String(s || '').toLowerCase().normalize('NFD').replace(\/[\u0300-\u036f]\/g, ''); }\r\n  function list(s) { return String(s || '').split(',').map(function (x) { return x.trim(); }).filter(Boolean); }\r\n\r\n  \/* icone pixel (10x10) per i tipi di video *\/\r\n  var ICONS = {\r\n    Hardware:    ['.c.c.c.c..', 'aaaaaaaaa.', 'abbbbbbbac', 'ab.....ba.', 'ab.aaa.bac', 'ab.....ba.', 'abbbbbbbac', 'aaaaaaaaa.', '.c.c.c.c..', '..........'],\r\n    Riparazione: ['.aa.......', 'a..a......', 'a...a.....', '.a..aa....', '..aa.aa...', '.....aa...', '......aa..', '.......aa.', '........aa', '.........a'],\r\n    Speciale:    ['....a.....', '....a.....', '...aaa....', 'aaaaaaaaa.', '.aaaaaaa..', '..aaaaa...', '..aa.aa...', '.aa...aa..', '.a.....a..', '..........'],\r\n    Tutorial:    ['aaaa.aaaa.', 'abba.abba.', 'abbaaabba.', 'abba.abba.', 'abba.abba.', 'abba.abba.', 'abbaaabba.', 'aaaa.aaaa.', '....c.....', '..........']\r\n  };\r\n  var TIPO_COL = { Hardware: '#3fd8ff', Riparazione: '#ffd23f', Speciale: '#e0398a', Tutorial: '#5ad15f' };\r\n  function icon(name, col) {\r\n    var map = ICONS[name], s = '';\r\n    if (!map) return '';\r\n    for (var y = 0; y < 10; y++) for (var x = 0; x < 10; x++) { var ch = map[y][x]; if (ch !== '.') s += '<rect x=\"' + x + '\" y=\"' + y + '\" width=\"1.02\" height=\"1.02\" fill=\"' + (ch === 'a' ? col : ch === 'b' ? '#fff' : '#ff5a7a') + '\"\/>'; }\r\n    return '<svg viewBox=\"0 0 10 10\" shape-rendering=\"crispEdges\" aria-hidden=\"true\">' + s + '<\/svg>';\r\n  }\r\n\r\n  var ALL = [], view = [], shown = 0, cur = -1;\r\n  var st = { q: '', tipo: '', mac: '', gua: '', tag: '', sort: 'new' };\r\n  var tagsOpen = false;\r\n\r\n  \/* ---------- stato nell'indirizzo, cosi' una ricerca si puo' condividere ---------- *\/\r\n  function readUrl() {\r\n    var p = new URLSearchParams(location.search);\r\n    st.q = p.get('q') || ''; st.tipo = p.get('tipo') || ''; st.mac = p.get('macchina') || ''; st.gua = p.get('guasto') || ''; st.tag = p.get('tag') || ''; st.sort = p.get('ordina') || 'new';\r\n  }\r\n  function writeUrl() {\r\n    var p = new URLSearchParams(location.search);\r\n    [['q', st.q], ['tipo', st.tipo], ['macchina', st.mac], ['guasto', st.gua], ['tag', st.tag], ['ordina', st.sort === 'new' ? '' : st.sort]].forEach(function (kv) { if (kv[1]) p.set(kv[0], kv[1]); else p.delete(kv[0]); });\r\n    var s = p.toString();\r\n    try { history.replaceState(null, '', location.pathname + (s ? '?' + s : '') + location.hash); } catch (e) { \/* ignora *\/ }\r\n  }\r\n\r\n  \/* ---------- dati ---------- *\/\r\n  function prepare(r) {\r\n    var m = \/\\(([A-Z]{2}\\d+)\\)\\s*$\/.exec(r.title || '');\r\n    var yt = \/(?:youtu\\.be\\\/|v=|embed\\\/|shorts\\\/)([\\w-]{11})\/.exec(r.url || '');\r\n    var o = {\r\n      id: r.id, url: r.url, yt: yt ? yt[1] : '', code: m ? m[1] : '',\r\n      title: (r.title || '').replace(\/\\s*\\([A-Z]{2}\\d+\\)\\s*$\/, ''),\r\n      tipo: r.tipo_video || '', mac: r.macchina || '', gua: list(r.guasto), tags: list(r.tags)\r\n    };\r\n    o.text = norm([o.title, o.code, o.tipo, o.mac, o.gua.join(' '), o.tags.join(' ')].join(' '));\r\n    return o;\r\n  }\r\n  function load() {\r\n    $('rfvGrid').innerHTML = new Array(8).join('<div class=\"sk\"><\/div>') + '<div class=\"sk\"><\/div>';\r\n    var src = SITE + '\/videoarchive\/fetch.php?page=1&limit=1000';\r\n    fetch(src).then(function (r) { if (!r.ok) throw 0; return r.json(); })\r\n      .catch(function () { return fetch('dati-locali.json').then(function (r) { return r.json(); }); }) \/\/ solo per le prove in locale\r\n      .then(function (d) {\r\n        ALL = (d.results || []).map(prepare);\r\n        buildTipi(); update(true);\r\n      })\r\n      .catch(function () {\r\n        $('rfvGrid').innerHTML = '<div class=\"empty\">?DEVICE NOT PRESENT  ERROR<p>Non riesco a caricare l\\'archivio dei video. Riprova tra poco.<\/p><\/div>';\r\n      });\r\n  }\r\n\r\n  \/* ---------- filtri ---------- *\/\r\n  function match(o, skip) {\r\n    if (st.tipo && skip !== 'tipo' && o.tipo !== st.tipo) return false;\r\n    if (st.mac && skip !== 'mac' && o.mac !== st.mac) return false;\r\n    if (st.gua && skip !== 'gua' && o.gua.indexOf(st.gua) < 0) return false;\r\n    if (st.tag && skip !== 'tag' && o.tags.indexOf(st.tag) < 0) return false;\r\n    if (st.q) { var words = norm(st.q).split(\/\\s+\/).filter(Boolean); for (var i = 0; i < words.length; i++) if (o.text.indexOf(words[i]) < 0) return false; }\r\n    return true;\r\n  }\r\n  function counts(field, skip) {\r\n    var c = {};\r\n    ALL.forEach(function (o) { if (!match(o, skip)) return; var v = o[field]; (Array.isArray(v) ? v : [v]).forEach(function (x) { if (x) c[x] = (c[x] || 0) + 1; }); });\r\n    return c;\r\n  }\r\n  function buildTipi() {\r\n    var box = $('rfvTipi'), html = '<span class=\"lbl\">TIPO<\/span><button type=\"button\" class=\"chip\" data-t=\"\">Tutti<\/button>';\r\n    Object.keys(TIPO_COL).forEach(function (t) { html += '<button type=\"button\" class=\"chip\" data-t=\"' + t + '\" style=\"--acc:' + TIPO_COL[t] + '\">' + icon(t, TIPO_COL[t]) + t + ' <span class=\"n\"><\/span><\/button>'; });\r\n    box.innerHTML = html;\r\n  }\r\n  function fillSelect(sel, c, value, allLabel) {\r\n    var keys = Object.keys(c).sort(function (a, b) { return c[b] - c[a] || a.localeCompare(b); });\r\n    if (value && keys.indexOf(value) < 0) keys.unshift(value);\r\n    sel.innerHTML = '<option value=\"\">' + allLabel + '<\/option>' + keys.map(function (k) { return '<option value=\"' + esc(k) + '\"' + (k === value ? ' selected' : '') + '>' + esc(k) + ' (' + (c[k] || 0) + ')<\/option>'; }).join('');\r\n  }\r\n  function renderFilters() {\r\n    var ct = counts('tipo', 'tipo');\r\n    $('rfvTipi').querySelectorAll('.chip').forEach(function (b) {\r\n      var t = b.dataset.t; b.classList.toggle('on', t === st.tipo); b.setAttribute('aria-pressed', t === st.tipo);\r\n      var n = b.querySelector('.n'); if (n) n.textContent = ct[t] || 0;\r\n    });\r\n    fillSelect($('rfvMac'), counts('mac', 'mac'), st.mac, 'Tutte');\r\n    fillSelect($('rfvGua'), counts('gua', 'gua'), st.gua, 'Tutti');\r\n    $('rfvSort').value = st.sort;\r\n    var tc = counts('tags', 'tag'), keys = Object.keys(tc).sort(function (a, b) { return tc[b] - tc[a] || a.localeCompare(b); });\r\n    if (st.tag && keys.indexOf(st.tag) < 0) keys.unshift(st.tag);\r\n    var max = tagsOpen ? 60 : 14, html = '<span class=\"lbl\">TAG<\/span>';\r\n    keys.slice(0, max).forEach(function (k) { html += '<button type=\"button\" class=\"chip tag' + (k === st.tag ? ' on' : '') + '\" data-tag=\"' + esc(k) + '\">#' + esc(k) + ' <span class=\"n\">' + (tc[k] || 0) + '<\/span><\/button>'; });\r\n    if (keys.length > 14) html += '<button type=\"button\" class=\"more-tags\" data-more>' + (tagsOpen ? '\u2212 meno tag' : '+ altri ' + Math.min(keys.length, 60) + ' tag') + '<\/button>';\r\n    $('rfvTags').innerHTML = html;\r\n    var pills = [];\r\n    if (st.q) pills.push(['q', 'Ricerca: \u201c' + st.q + '\u201d']);\r\n    if (st.tipo) pills.push(['tipo', 'Tipo: ' + st.tipo]);\r\n    if (st.mac) pills.push(['mac', 'Macchina: ' + st.mac]);\r\n    if (st.gua) pills.push(['gua', 'Guasto: ' + st.gua]);\r\n    if (st.tag) pills.push(['tag', '#' + st.tag]);\r\n    $('rfvActive').innerHTML = pills.map(function (p) { return '<span class=\"pill\">' + esc(p[1]) + '<button type=\"button\" data-rm=\"' + p[0] + '\" aria-label=\"Togli filtro\">\u2715<\/button><\/span>'; }).join('') +\r\n      (pills.length > 1 ? '<button type=\"button\" class=\"reset\" data-reset>AZZERA TUTTO<\/button>' : '');\r\n    $('rfvClr').hidden = !st.q;\r\n  }\r\n\r\n  \/* ---------- risultati ---------- *\/\r\n  \/\/ evidenzia le parole cercate (il confronto ignora maiuscole e accenti)\r\n  function hl(text) {\r\n    text = String(text || '');\r\n    var words = norm(st.q).split(\/\\s+\/).filter(function (w) { return w.length > 1; });\r\n    if (!words.length) return esc(text);\r\n    var nt = norm(text), on = [];\r\n    if (nt.length !== text.length) return esc(text);\r\n    words.forEach(function (w) { var i = 0, k; while ((k = nt.indexOf(w, i)) >= 0) { for (var j = k; j < k + w.length; j++) on[j] = true; i = k + w.length; } });\r\n    var out = '', run = '', mode = false;\r\n    for (var c = 0; c <= text.length; c++) {\r\n      var m = !!on[c];\r\n      if (c === text.length || m !== mode) { out += mode ? '<mark>' + esc(run) + '<\/mark>' : esc(run); run = ''; mode = m; }\r\n      if (c < text.length) run += text[c];\r\n    }\r\n    return out;\r\n  }\r\n  function card(o, i) {\r\n    var col = TIPO_COL[o.tipo] || '#7c70da';\r\n    return '<a class=\"vc\" href=\"' + esc(o.url) + '\" data-i=\"' + i + '\" target=\"_blank\" rel=\"noopener\" style=\"--acc:' + col + ';animation-delay:' + Math.min(i % PAGE, 12) * 30 + 'ms\">' +\r\n      '<div class=\"th\">' + (o.yt ? '<img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i.ytimg.com\/vi\/' + o.yt + '\/mqdefault.jpg\" alt=\"\">' : '') +\r\n      (o.code ? '<span class=\"code\">' + esc(o.code) + '<\/span>' : '') + '<span class=\"play\"><\/span>' + (o.tipo ? '<span class=\"tipo\">' + esc(o.tipo.toUpperCase()) + '<\/span>' : '') + '<\/div>' +\r\n      '<div class=\"bd\"><span class=\"mac\">' + hl(o.mac) + '<\/span><h3>' + hl(o.title) + '<\/h3>' +\r\n      (o.gua.length ? '<span class=\"gs\">\u26a0 ' + hl(o.gua.join(', ')) + '<\/span>' : '') +\r\n      (o.tags.length ? '<span class=\"tg\">' + o.tags.slice(0, 4).map(function (t) { return '#' + hl(t); }).join(' ') + '<\/span>' : '') + '<\/div><\/a>';\r\n  }\r\n  function sortView() {\r\n    var f = {\r\n      new: function (a, b) { return b.id - a.id; },\r\n      old: function (a, b) { return a.id - b.id; },\r\n      az: function (a, b) { return a.title.localeCompare(b.title, 'it'); },\r\n      mac: function (a, b) { return a.mac.localeCompare(b.mac, 'it') || b.id - a.id; }\r\n    }[st.sort] || function (a, b) { return b.id - a.id; };\r\n    view.sort(f);\r\n  }\r\n  function update(first) {\r\n    view = ALL.filter(function (o) { return match(o); });\r\n    sortView();\r\n    shown = 0;\r\n    $('rfvGrid').innerHTML = '';\r\n    renderFilters();\r\n    var n = view.length;\r\n    $('rfvCount').innerHTML = String(n).padStart(3, '0') + ' <small>' + (n === ALL.length ? 'VIDEO' : 'TROVATI') + '<\/small>';\r\n    $('rfvInfo').innerHTML = n === ALL.length ? 'Tutti i <b>' + n + '<\/b> video dell\\'archivio' : '<b>' + n + '<\/b> video su ' + ALL.length;\r\n    if (!n) {\r\n      $('rfvGrid').innerHTML = '<div class=\"empty\">?FILE NOT FOUND  ERROR<p>Nessun video con questi filtri. Prova a togliere un filtro o a cercare una parola diversa.<\/p><button type=\"button\" class=\"btn y\" data-reset>AZZERA LA RICERCA<\/button><\/div>';\r\n      $('rfvMore').hidden = true;\r\n    } else more();\r\n    if (!first) writeUrl();\r\n  }\r\n  function more() {\r\n    var html = '';\r\n    for (var i = shown; i < Math.min(view.length, shown + PAGE); i++) html += card(view[i], i);\r\n    $('rfvGrid').insertAdjacentHTML('beforeend', html);\r\n    shown = Math.min(view.length, shown + PAGE);\r\n    var left = view.length - shown;\r\n    $('rfvMore').hidden = left <= 0;\r\n    $('rfvMore').textContent = '\u25bc MOSTRA ALTRI ' + Math.min(left, PAGE) + ' (' + left + ')';\r\n  }\r\n\r\n  \/* ---------- finestra video ---------- *\/\r\n  var dlg = $('rfvDlg');\r\n  function openVideo(i) {\r\n    var o = view[i]; if (!o) return;\r\n    cur = i;\r\n    $('rfvDlgCode').textContent = (o.code ? o.code + ' \u00b7 ' : '') + (o.tipo || 'VIDEO').toUpperCase() + ' \u00b7 ' + (i + 1) + '\/' + view.length;\r\n    $('rfvDlgTitle').textContent = o.title;\r\n    $('rfvPlayer').innerHTML = o.yt ? '<iframe src=\"https:\/\/www.youtube-nocookie.com\/embed\/' + o.yt + '?autoplay=1&rel=0\" title=\"' + esc(o.title) + '\" allow=\"autoplay; encrypted-media; picture-in-picture; fullscreen\" allowfullscreen><\/iframe>' : '';\r\n    var ch = '';\r\n    if (o.mac) ch += '<span class=\"k\">MACCHINA<\/span><button type=\"button\" class=\"chip\" data-f=\"mac\" data-v=\"' + esc(o.mac) + '\">' + esc(o.mac) + '<\/button>';\r\n    o.gua.forEach(function (g, k) { ch += (k ? '' : '<span class=\"k\">GUASTO<\/span>') + '<button type=\"button\" class=\"chip\" data-f=\"gua\" data-v=\"' + esc(g) + '\">' + esc(g) + '<\/button>'; });\r\n    o.tags.forEach(function (t, k) { ch += (k ? '' : '<span class=\"k\">TAG<\/span>') + '<button type=\"button\" class=\"chip tag\" data-f=\"tag\" data-v=\"' + esc(t) + '\">#' + esc(t) + '<\/button>'; });\r\n    $('rfvDlgChips').innerHTML = ch;\r\n    $('rfvYt').href = o.url;\r\n    $('rfvPrev').disabled = i <= 0; $('rfvNext').disabled = i >= view.length - 1;\r\n    if (!dlg.open) { if (dlg.showModal) dlg.showModal(); else dlg.setAttribute('open', ''); }\r\n  }\r\n  function closeVideo() { $('rfvPlayer').innerHTML = ''; if (dlg.open) { if (dlg.close) dlg.close(); else dlg.removeAttribute('open'); } }\r\n  dlg.addEventListener('close', function () { $('rfvPlayer').innerHTML = ''; });\r\n  dlg.addEventListener('click', function (e) {\r\n    if (e.target === dlg) return closeVideo();\r\n    var c = e.target.closest('[data-f]');\r\n    if (c) { st[c.dataset.f] = c.dataset.v; closeVideo(); update(); root.scrollIntoView({ behavior: 'smooth', block: 'start' }); }\r\n  });\r\n  $('rfvClose').onclick = closeVideo;\r\n  $('rfvPrev').onclick = function () { openVideo(cur - 1); };\r\n  $('rfvNext').onclick = function () { if (cur + 1 >= shown && shown < view.length) more(); openVideo(cur + 1); };\r\n  dlg.addEventListener('keydown', function (e) {\r\n    if (e.key === 'ArrowLeft' && cur > 0) openVideo(cur - 1);\r\n    if (e.key === 'ArrowRight' && cur < view.length - 1) $('rfvNext').click();\r\n  });\r\n\r\n  \/* ---------- eventi ---------- *\/\r\n  var qt;\r\n  $('rfvQ').addEventListener('input', function (e) { clearTimeout(qt); qt = setTimeout(function () { st.q = e.target.value.trim(); update(); }, 150); });\r\n  $('rfvClr').onclick = function () { $('rfvQ').value = ''; st.q = ''; update(); $('rfvQ').focus(); };\r\n  $('rfvMac').onchange = function (e) { st.mac = e.target.value; update(); };\r\n  $('rfvGua').onchange = function (e) { st.gua = e.target.value; update(); };\r\n  $('rfvSort').onchange = function (e) { st.sort = e.target.value; update(); };\r\n  $('rfvMore').onclick = more;\r\n  root.addEventListener('click', function (e) {\r\n    var t;\r\n    if ((t = e.target.closest('#rfvTipi .chip'))) { st.tipo = t.dataset.t === st.tipo ? '' : t.dataset.t; update(); return; }\r\n    if ((t = e.target.closest('[data-tag]'))) { st.tag = t.dataset.tag === st.tag ? '' : t.dataset.tag; update(); return; }\r\n    if (e.target.closest('[data-more]')) { tagsOpen = !tagsOpen; renderFilters(); return; }\r\n    if ((t = e.target.closest('[data-rm]'))) { st[t.dataset.rm] = ''; if (t.dataset.rm === 'q') $('rfvQ').value = ''; update(); return; }\r\n    if (e.target.closest('[data-reset]')) { st.q = st.tipo = st.mac = st.gua = st.tag = ''; $('rfvQ').value = ''; update(); return; }\r\n    if ((t = e.target.closest('.vc')) && !e.ctrlKey && !e.metaKey && !e.shiftKey && e.button === 0) { e.preventDefault(); openVideo(+t.dataset.i); }\r\n  });\r\n\r\n  readUrl();\r\n  $('rfvQ').value = st.q;\r\n  load();\r\n})();\r\n\r\n}<\/script>\r\n<\/div>\r\n<script type=\"text\/plain\" class=\"rf-en-src\" data-no-translation><link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Press+Start+2P&family=VT323&family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\r\n\r\n<style>\r\n.rfv{\r\n  --bg:#0f0c24; --bg2:#171338; --panel:#1d1846; --line:#342c74; --text:#eceaff; --muted:#aaa5d8;\r\n  --c64:#3e31a2; --c64l:#7c70da; --mag:#e0398a; --yel:#ffd23f; --grn:#5ad15f; --cya:#3fd8ff; --ora:#f8961e; --red:#f94144;\r\n  font-family:'Inter',system-ui,-apple-system,Segoe UI,Roboto,sans-serif; color:var(--text); background:var(--bg); line-height:1.5;\r\n  position:relative; padding:44px 0 70px; overflow:hidden;\r\n}\r\n.rfv *,.rfv *::before,.rfv *::after{box-sizing:border-box}\r\n.rfv h2,.rfv h3,.rfv p{margin:0;padding:0}\r\n.rfv h2,.rfv h3{font-family:'Inter',system-ui,sans-serif!important;letter-spacing:0;text-transform:none;font-weight:700}\r\n.rfv a{color:inherit;text-decoration:none}\r\n.rfv button,.rfv select,.rfv input{font:inherit;color:inherit}\r\n.rfv button{cursor:pointer}\r\n.rfv [hidden]{display:none!important}\r\n.rfv .wrap{max-width:1200px;margin:0 auto;padding:0 20px}\r\n.rfv .stripe{height:6px;background:linear-gradient(90deg,var(--red) 0 16.6%,var(--ora) 0 33.3%,var(--yel) 0 50%,var(--grn) 0 66.6%,var(--cya) 0 83.3%,var(--c64l) 0);position:absolute;left:0;right:0;top:0}\r\n\r\n\/* intestazione *\/\r\n.rfv .top{display:flex;gap:24px;align-items:flex-end;justify-content:space-between;flex-wrap:wrap;margin-bottom:22px}\r\n.rfv .kicker{display:inline-block;font-family:'Press Start 2P',monospace;font-size:10px;color:var(--yel);letter-spacing:.06em;margin-bottom:12px}\r\n.rfv .h2{font-family:'Press Start 2P',monospace!important;font-size:clamp(17px,2.4vw,26px);line-height:1.45;color:#fff;text-shadow:3px 3px 0 #000;margin-bottom:10px}\r\n.rfv .sub{color:var(--muted);font-size:15.5px;max-width:640px}\r\n.rfv .lcd{font-family:'VT323',monospace;font-size:26px;line-height:1;color:var(--grn);background:#05040f;border:2px solid #000;border-radius:8px;padding:10px 14px;\r\n  box-shadow:inset 0 0 18px rgba(90,209,95,.15);text-shadow:0 0 6px rgba(90,209,95,.6);white-space:nowrap}\r\n.rfv .lcd small{font-size:18px;color:#3f8f43}\r\n\r\n\/* ricerca *\/\r\n.rfv .term{background:var(--c64);border:10px solid var(--c64l);border-radius:12px;padding:14px 16px;box-shadow:0 0 0 3px #000,0 18px 40px rgba(0,0,0,.45);position:relative}\r\n.rfv .term::after{content:\"\";position:absolute;inset:0;pointer-events:none;background:repeating-linear-gradient(0deg,rgba(0,0,0,.14) 0 1px,transparent 1px 3px)}\r\n.rfv .term label{display:block;font-family:'VT323',monospace;font-size:20px;color:#b3abff;margin-bottom:4px}\r\n.rfv .qrow{display:flex;align-items:center;gap:10px}\r\n.rfv .qrow span{font-family:'VT323',monospace;font-size:30px;color:#fff}\r\n.rfv .q{flex:1;min-width:0;background:transparent;border:0;outline:0;font-family:'VT323',monospace!important;font-size:30px;color:#fff;caret-color:#fff;caret-shape:block;padding:2px 0;text-transform:uppercase}\r\n.rfv .q::placeholder{color:#8e86e0;text-transform:none}\r\n.rfv .clr{background:#000;border:2px solid #b3abff;color:#fff;border-radius:6px;font-family:'Press Start 2P',monospace;font-size:9px;padding:9px 10px;position:relative;z-index:1}\r\n.rfv .clr[hidden]{display:none}\r\n\r\n\/* filtri *\/\r\n.rfv .filters{margin-top:18px;display:grid;gap:14px}\r\n.rfv .filters>*{min-width:0}\r\n.rfv .row{display:flex;flex-wrap:wrap;gap:8px;align-items:center}\r\n.rfv .lbl{font-family:'Press Start 2P',monospace;font-size:9px;color:var(--muted);margin-right:4px;min-width:64px}\r\n.rfv .chip{display:inline-flex;align-items:center;gap:7px;border:2px solid var(--line);background:var(--panel);border-radius:999px;padding:7px 13px;font-size:13px;font-weight:600;color:var(--muted);transition:color .15s,border-color .15s,background .15s}\r\n.rfv .chip:hover{color:#fff;border-color:var(--c64l)}\r\n.rfv .chip.on{background:var(--acc,var(--yel));border-color:var(--acc,var(--yel));color:#15102e}\r\n.rfv .chip svg{width:16px;height:16px}\r\n.rfv .chip .n{opacity:.65;font-weight:500}\r\n.rfv .chip.tag{font-size:12.5px;padding:5px 11px}\r\n.rfv .sel{display:flex;gap:10px;flex-wrap:wrap}\r\n.rfv .sel label{display:flex;align-items:center;gap:8px;background:var(--panel);border:2px solid var(--line);border-radius:10px;padding:4px 6px 4px 12px}\r\n.rfv .sel label span{font-family:'Press Start 2P',monospace;font-size:8px;color:var(--muted)}\r\n.rfv .sel select{background:#0b0920;border:0;border-radius:6px;padding:8px 10px;max-width:230px;color:#fff;font-size:14px}\r\n.rfv .sel select:focus,.rfv .sel select:active{background-color:#1a1638 !important;color:#fff !important;outline:1px solid #5a5296;outline-offset:1px}\r\n.rfv .sel select{color-scheme:dark}\r\n.rfv .sel select option{background:#0b0920;color:#fff}\r\n.rfv .sel select option:checked{background:#342c74;color:#ffd23f}\r\n.rfv .more-tags{background:none;border:0;color:var(--cya);font-size:13px;font-weight:600;padding:6px}\r\n.rfv .active{display:flex;flex-wrap:wrap;gap:8px;align-items:center;min-height:0}\r\n.rfv .pill{display:inline-flex;align-items:center;gap:6px;background:#2a2350;border:2px solid var(--c64l);border-radius:8px;padding:4px 6px 4px 10px;font-size:13px}\r\n.rfv .pill button{background:#000;border:0;border-radius:4px;color:#fff;width:20px;height:20px;line-height:20px;padding:0;font-size:12px}\r\n.rfv .reset{background:none;border:0;color:var(--mag);font-weight:700;font-size:13px}\r\n\r\n\/* risultati *\/\r\n.rfv .bar{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin:26px 0 14px}\r\n.rfv .bar .info{font-size:14px;color:var(--muted)}\r\n.rfv .bar .info b{color:#fff}\r\n.rfv .grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}\r\n.rfv .vc{display:flex;flex-direction:column;background:var(--panel);border:2px solid var(--line);border-radius:12px;overflow:hidden;transition:transform .18s,border-color .18s,box-shadow .18s;animation:rfv-in .35s ease both}\r\n.rfv .vc:hover,.rfv .vc:focus-visible{transform:translateY(-4px);border-color:var(--acc,var(--c64l));box-shadow:0 12px 28px rgba(0,0,0,.45);outline:0}\r\n@keyframes rfv-in{from{opacity:0;transform:translateY(10px)}}\r\n.rfv .th{position:relative;aspect-ratio:16\/9;background:#05040f;overflow:hidden}\r\n.rfv .th img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .3s,filter .3s}\r\n.rfv .vc:hover .th img{transform:scale(1.05);filter:brightness(.8)}\r\n.rfv .th .play{position:absolute;left:50%;top:50%;width:54px;height:40px;margin:-20px 0 0 -27px;border-radius:10px;background:rgba(0,0,0,.65);border:2px solid #fff;display:flex;align-items:center;justify-content:center;\r\n  opacity:.85;transition:opacity .2s,background .2s,transform .2s}\r\n.rfv .th .play::before{content:\"\";border-left:14px solid #fff;border-top:9px solid transparent;border-bottom:9px solid transparent;margin-left:4px}\r\n.rfv .vc:hover .play{opacity:1;background:#ff0000;transform:scale(1.08)}\r\n.rfv .th .code{position:absolute;top:8px;left:8px;font-family:'VT323',monospace;font-size:18px;line-height:1;background:#000;color:var(--grn);padding:3px 6px;border-radius:4px;border:1px solid #2c6b34}\r\n.rfv .th .tipo{position:absolute;bottom:8px;left:8px;font-family:'Press Start 2P',monospace;font-size:7px;background:var(--acc);color:#15102e;padding:4px 6px;border-radius:4px}\r\n.rfv .bd{padding:12px 14px 14px;display:flex;flex-direction:column;gap:6px;flex:1}\r\n.rfv .vc h3{font-size:14.5px;line-height:1.35;color:#fff}\r\n.rfv .vc mark{background:var(--yel);color:#15102e;border-radius:2px;padding:0 1px}\r\n.rfv .mac{font-size:12.5px;font-weight:700;color:var(--acc,var(--c64l));text-transform:uppercase;letter-spacing:.03em}\r\n.rfv .gs{font-size:12.5px;color:#ffb3c8}\r\n.rfv .tg{font-size:12px;color:var(--muted);margin-top:auto}\r\n.rfv .loadmore{display:flex;justify-content:center;margin-top:26px}\r\n.rfv .btn{display:inline-flex;align-items:center;gap:8px;font-family:'Press Start 2P',monospace;font-size:10px;padding:13px 16px;border-radius:8px;border:2px solid var(--line);background:rgba(255,255,255,.04);color:#fff;transition:transform .12s,filter .12s}\r\n.rfv .btn:hover{transform:translateY(-2px);filter:brightness(1.15)}\r\n.rfv .btn.y{background:var(--yel);border-color:var(--yel);color:#231a00;box-shadow:0 4px 0 #a07d00}\r\n.rfv .btn.r{background:#ff0000;border-color:#ff0000;color:#fff;box-shadow:0 4px 0 #8a0000}\r\n.rfv .empty{grid-column:1\/-1;text-align:center;padding:40px 16px;font-family:'VT323',monospace;font-size:26px;color:#b3abff;background:var(--c64);border:10px solid var(--c64l);border-radius:12px}\r\n.rfv .empty p{font-family:'Inter',sans-serif;font-size:14px;color:#d6d1ff;margin:10px 0 16px}\r\n.rfv .sk{border-radius:12px;background:linear-gradient(90deg,#1d1846 0,#2a2460 50%,#1d1846 100%) 0 0\/200% 100%;animation:rfv-sk 1.2s linear infinite;aspect-ratio:4\/3.6}\r\n@keyframes rfv-sk{to{background-position:-200% 0}}\r\n\r\n\/* finestra video *\/\r\n.rfv dialog{width:min(960px,94vw);max-height:94vh;padding:0;border:0;border-radius:14px;background:var(--bg2);color:var(--text);box-shadow:0 30px 80px rgba(0,0,0,.7);overflow:auto}\r\n.rfv dialog::backdrop{background:rgba(5,4,15,.82)}\r\n.rfv .dlg-top{display:flex;align-items:center;gap:10px;padding:10px 12px;background:#000;border-bottom:4px solid var(--c64l)}\r\n.rfv .dlg-top b{font-family:'Press Start 2P',monospace;font-size:9px;color:var(--yel);flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\r\n.rfv .ico-btn{background:#1d1846;border:2px solid var(--line);color:#fff;border-radius:8px;width:38px;height:38px;font-size:16px;display:flex;align-items:center;justify-content:center;flex:none}\r\n.rfv .ico-btn:hover{border-color:var(--yel)}\r\n.rfv .player{aspect-ratio:16\/9;background:#000}\r\n.rfv .player iframe{width:100%;height:100%;border:0;display:block}\r\n.rfv .dlg-bd{padding:16px 18px 20px;display:grid;gap:10px}\r\n.rfv .dlg-bd h3{font-size:18px;color:#fff}\r\n.rfv .dlg-bd .chips{display:flex;flex-wrap:wrap;gap:6px}\r\n.rfv .dlg-bd .k{font-family:'Press Start 2P',monospace;font-size:8px;color:var(--muted);margin-right:4px;align-self:center}\r\n.rfv .dlg-act{display:flex;gap:10px;flex-wrap:wrap;margin-top:6px}\r\n\r\n@media (max-width:1024px){.rfv .grid{grid-template-columns:repeat(3,1fr)}}\r\n@media (max-width:760px){\r\n  .rfv .grid{grid-template-columns:repeat(2,1fr);gap:12px}\r\n  .rfv .q,.rfv .qrow span{font-size:24px}\r\n  .rfv .lbl{min-width:0;width:100%}\r\n  .rfv .sel{display:grid;grid-template-columns:1fr}\r\n  .rfv .sel select{max-width:none;flex:1;min-width:0;width:100%}\r\n  .rfv .sel label{display:flex;min-width:0}\r\n  .rfv .sel label span{flex:none;width:70px}\r\n}\r\n@media (max-width:480px){\r\n  .rfv{padding:30px 0 50px}\r\n  .rfv .wrap{padding:0 14px}\r\n  .rfv .grid{grid-template-columns:1fr}\r\n  .rfv .term{border-width:7px;padding:10px 12px}\r\n}\r\n@media (prefers-reduced-motion:reduce){.rfv *{transition:none!important}.rfv .vc{animation:none}}\r\n\/* riga del contatore visite (Post Views) prima del footer: diventa un separatore *\/\r\nbody:has(.rfv) .post-views.entry-meta{display:block;margin:0;padding:7px 16px;text-align:center;\r\n  font:12px\/1.4 'Inter',system-ui,sans-serif;color:#aaa5d8;background:#0f0c24;border-top:2px solid #342c74;border-bottom:2px solid #5ad15f}\r\n<\/style>\r\n\r\n<div class=\"rfv\" id=\"rfv\">\r\n  <div class=\"stripe\"><\/div>\r\n  <div class=\"wrap\">\r\n    <div class=\"top\">\r\n      <div>\r\n        <span class=\"kicker\">RETROFIXER VIDEO ARCHIVE<\/span>\r\n        <h2 class=\"h2\">Find a video<\/h2>\r\n        <p class=\"sub\">Search by machine, type of fault, component or topic. Click a video to watch it straight away.<\/p>\r\n      <\/div>\r\n      <div class=\"lcd\" id=\"rfvCount\" aria-live=\"polite\">--- <small>VIDEO<\/small><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"term\">\r\n      <label for=\"rfvQ\">SEARCH \"VIDEOS\",8,1<\/label>\r\n      <div class=\"qrow\">\r\n        <span aria-hidden=\"true\">&gt;<\/span>\r\n        <input class=\"q\" id=\"rfvQ\" type=\"search\" placeholder=\"e.g. dead test, 1541, capacitors, Amiga 500\u2026\" autocomplete=\"off\" spellcheck=\"false\">\r\n        <button class=\"clr\" id=\"rfvClr\" type=\"button\" hidden>CLR<\/button>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"filters\">\r\n      <div class=\"row\" id=\"rfvTipi\" role=\"group\" aria-label=\"Video type\"><span class=\"lbl\">TYPE<\/span><\/div>\r\n      <div class=\"sel\">\r\n        <label><span>MACHINE<\/span><select id=\"rfvMac\"><option value=\"\">All<\/option><\/select><\/label>\r\n        <label><span>FAULT<\/span><select id=\"rfvGua\"><option value=\"\">All<\/option><\/select><\/label>\r\n        <label><span>SORT<\/span><select id=\"rfvSort\">\r\n          <option value=\"new\">Newest first<\/option><option value=\"old\">Oldest first<\/option><option value=\"az\">Title A-Z<\/option><option value=\"mac\">By machine<\/option>\r\n        <\/select><\/label>\r\n      <\/div>\r\n      <div class=\"row\" id=\"rfvTags\" role=\"group\" aria-label=\"Tag\"><span class=\"lbl\">TAG<\/span><\/div>\r\n      <div class=\"active\" id=\"rfvActive\"><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"bar\"><div class=\"info\" id=\"rfvInfo\"><\/div><\/div>\r\n    <div class=\"grid\" id=\"rfvGrid\"><\/div>\r\n    <div class=\"loadmore\"><button class=\"btn\" id=\"rfvMore\" type=\"button\" hidden>\u25bc SHOW MORE<\/button><\/div>\r\n  <\/div>\r\n\r\n  <dialog id=\"rfvDlg\" aria-labelledby=\"rfvDlgTitle\">\r\n    <div class=\"dlg-top\">\r\n      <b id=\"rfvDlgCode\">VIDEO<\/b>\r\n      <button class=\"ico-btn\" id=\"rfvPrev\" type=\"button\" aria-label=\"Previous video\">\u25c0<\/button>\r\n      <button class=\"ico-btn\" id=\"rfvNext\" type=\"button\" aria-label=\"Next video\">\u25b6<\/button>\r\n      <button class=\"ico-btn\" id=\"rfvClose\" type=\"button\" aria-label=\"Close\">\u2715<\/button>\r\n    <\/div>\r\n    <div class=\"player\" id=\"rfvPlayer\"><\/div>\r\n    <div class=\"dlg-bd\">\r\n      <h3 id=\"rfvDlgTitle\"><\/h3>\r\n      <div class=\"chips\" id=\"rfvDlgChips\"><\/div>\r\n      <div class=\"dlg-act\">\r\n        <a class=\"btn r\" id=\"rfvYt\" href=\"#\" target=\"_blank\" rel=\"noopener\">\u25b6 OPEN ON YOUTUBE \u2197<\/a>\r\n      <\/div>\r\n    <\/div>\r\n  <\/dialog>\r\n<\/div>\r\n\r\n<script>\r\n(function () {\r\n  var root = document.getElementById('rfv');\r\n  if (!root || root.dataset.ready) return;\r\n  root.dataset.ready = '1';\r\n  var SITE = 'https:\/\/retrofixer.it';\r\n  var PAGE = 24;\r\n  var $ = function (id) { return document.getElementById(id); };\r\n  function esc(s) { return String(s == null ? '' : s).replace(\/[&<>\"']\/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]; }); }\r\n  function norm(s) { return String(s || '').toLowerCase().normalize('NFD').replace(\/[\u0300-\u036f]\/g, ''); }\r\n  function list(s) { return String(s || '').split(',').map(function (x) { return x.trim(); }).filter(Boolean); }\r\n\r\n  \/* icone pixel (10x10) per i tipi di video *\/\r\n  var ICONS = {\r\n    Hardware:    ['.c.c.c.c..', 'aaaaaaaaa.', 'abbbbbbbac', 'ab.....ba.', 'ab.aaa.bac', 'ab.....ba.', 'abbbbbbbac', 'aaaaaaaaa.', '.c.c.c.c..', '..........'],\r\n    Riparazione: ['.aa.......', 'a..a......', 'a...a.....', '.a..aa....', '..aa.aa...', '.....aa...', '......aa..', '.......aa.', '........aa', '.........a'],\r\n    Speciale:    ['....a.....', '....a.....', '...aaa....', 'aaaaaaaaa.', '.aaaaaaa..', '..aaaaa...', '..aa.aa...', '.aa...aa..', '.a.....a..', '..........'],\r\n    Tutorial:    ['aaaa.aaaa.', 'abba.abba.', 'abbaaabba.', 'abba.abba.', 'abba.abba.', 'abba.abba.', 'abbaaabba.', 'aaaa.aaaa.', '....c.....', '..........']\r\n  };\r\n  var TIPO_COL = { Hardware: '#3fd8ff', Riparazione: '#ffd23f', Speciale: '#e0398a', Tutorial: '#5ad15f' };  var TIPO_EN = { Riparazione: 'Repair', Speciale: 'Special' };  function tl(t) { return TIPO_EN[t] || t; }\r\n  function icon(name, col) {\r\n    var map = ICONS[name], s = '';\r\n    if (!map) return '';\r\n    for (var y = 0; y < 10; y++) for (var x = 0; x < 10; x++) { var ch = map[y][x]; if (ch !== '.') s += '<rect x=\"' + x + '\" y=\"' + y + '\" width=\"1.02\" height=\"1.02\" fill=\"' + (ch === 'a' ? col : ch === 'b' ? '#fff' : '#ff5a7a') + '\"\/>'; }\r\n    return '<svg viewBox=\"0 0 10 10\" shape-rendering=\"crispEdges\" aria-hidden=\"true\">' + s + '<\/svg>';\r\n  }\r\n\r\n  var ALL = [], view = [], shown = 0, cur = -1;\r\n  var st = { q: '', tipo: '', mac: '', gua: '', tag: '', sort: 'new' };\r\n  var tagsOpen = false;\r\n\r\n  \/* ---------- stato nell'indirizzo, cosi' una ricerca si puo' condividere ---------- *\/\r\n  function readUrl() {\r\n    var p = new URLSearchParams(location.search);\r\n    st.q = p.get('q') || ''; st.tipo = p.get('tipo') || ''; st.mac = p.get('macchina') || ''; st.gua = p.get('guasto') || ''; st.tag = p.get('tag') || ''; st.sort = p.get('ordina') || 'new';\r\n  }\r\n  function writeUrl() {\r\n    var p = new URLSearchParams(location.search);\r\n    [['q', st.q], ['tipo', st.tipo], ['macchina', st.mac], ['guasto', st.gua], ['tag', st.tag], ['ordina', st.sort === 'new' ? '' : st.sort]].forEach(function (kv) { if (kv[1]) p.set(kv[0], kv[1]); else p.delete(kv[0]); });\r\n    var s = p.toString();\r\n    try { history.replaceState(null, '', location.pathname + (s ? '?' + s : '') + location.hash); } catch (e) { \/* ignora *\/ }\r\n  }\r\n\r\n  \/* ---------- dati ---------- *\/\r\n  function prepare(r) {\r\n    var m = \/\\(([A-Z]{2}\\d+)\\)\\s*$\/.exec(r.title || '');\r\n    var yt = \/(?:youtu\\.be\\\/|v=|embed\\\/|shorts\\\/)([\\w-]{11})\/.exec(r.url || '');\r\n    var o = {\r\n      id: r.id, url: r.url, yt: yt ? yt[1] : '', code: m ? m[1] : '',\r\n      title: (r.title || '').replace(\/\\s*\\([A-Z]{2}\\d+\\)\\s*$\/, ''),\r\n      tipo: r.tipo_video || '', mac: r.macchina || '', gua: list(r.guasto), tags: list(r.tags)\r\n    };\r\n    o.text = norm([o.title, o.code, o.tipo, tl(o.tipo), o.mac, o.gua.join(' '), o.tags.join(' ')].join(' '));\r\n    return o;\r\n  }\r\n  function load() {\r\n    $('rfvGrid').innerHTML = new Array(8).join('<div class=\"sk\"><\/div>') + '<div class=\"sk\"><\/div>';\r\n    var src = SITE + '\/videoarchive\/fetch.php?page=1&limit=1000';\r\n    fetch(src).then(function (r) { if (!r.ok) throw 0; return r.json(); })\r\n      .catch(function () { return fetch('dati-locali.json').then(function (r) { return r.json(); }); }) \/\/ solo per le prove in locale\r\n      .then(function (d) {\r\n        ALL = (d.results || []).map(prepare);\r\n        buildTipi(); update(true);\r\n      })\r\n      .catch(function () {\r\n        $('rfvGrid').innerHTML = '<div class=\"empty\">?DEVICE NOT PRESENT  ERROR<p>Could not load the video archive. Please try again shortly.<\/p><\/div>';\r\n      });\r\n  }\r\n\r\n  \/* ---------- filtri ---------- *\/\r\n  function match(o, skip) {\r\n    if (st.tipo && skip !== 'tipo' && o.tipo !== st.tipo) return false;\r\n    if (st.mac && skip !== 'mac' && o.mac !== st.mac) return false;\r\n    if (st.gua && skip !== 'gua' && o.gua.indexOf(st.gua) < 0) return false;\r\n    if (st.tag && skip !== 'tag' && o.tags.indexOf(st.tag) < 0) return false;\r\n    if (st.q) { var words = norm(st.q).split(\/\\s+\/).filter(Boolean); for (var i = 0; i < words.length; i++) if (o.text.indexOf(words[i]) < 0) return false; }\r\n    return true;\r\n  }\r\n  function counts(field, skip) {\r\n    var c = {};\r\n    ALL.forEach(function (o) { if (!match(o, skip)) return; var v = o[field]; (Array.isArray(v) ? v : [v]).forEach(function (x) { if (x) c[x] = (c[x] || 0) + 1; }); });\r\n    return c;\r\n  }\r\n  function buildTipi() {\r\n    var box = $('rfvTipi'), html = '<span class=\"lbl\">TYPE<\/span><button type=\"button\" class=\"chip\" data-t=\"\">All<\/button>';\r\n    Object.keys(TIPO_COL).forEach(function (t) { html += '<button type=\"button\" class=\"chip\" data-t=\"' + t + '\" style=\"--acc:' + TIPO_COL[t] + '\">' + icon(t, TIPO_COL[t]) + tl(t) + ' <span class=\"n\"><\/span><\/button>'; });\r\n    box.innerHTML = html;\r\n  }\r\n  function fillSelect(sel, c, value, allLabel) {\r\n    var keys = Object.keys(c).sort(function (a, b) { return c[b] - c[a] || a.localeCompare(b); });\r\n    if (value && keys.indexOf(value) < 0) keys.unshift(value);\r\n    sel.innerHTML = '<option value=\"\">' + allLabel + '<\/option>' + keys.map(function (k) { return '<option value=\"' + esc(k) + '\"' + (k === value ? ' selected' : '') + '>' + esc(k) + ' (' + (c[k] || 0) + ')<\/option>'; }).join('');\r\n  }\r\n  function renderFilters() {\r\n    var ct = counts('tipo', 'tipo');\r\n    $('rfvTipi').querySelectorAll('.chip').forEach(function (b) {\r\n      var t = b.dataset.t; b.classList.toggle('on', t === st.tipo); b.setAttribute('aria-pressed', t === st.tipo);\r\n      var n = b.querySelector('.n'); if (n) n.textContent = ct[t] || 0;\r\n    });\r\n    fillSelect($('rfvMac'), counts('mac', 'mac'), st.mac, 'All');\r\n    fillSelect($('rfvGua'), counts('gua', 'gua'), st.gua, 'All');\r\n    $('rfvSort').value = st.sort;\r\n    var tc = counts('tags', 'tag'), keys = Object.keys(tc).sort(function (a, b) { return tc[b] - tc[a] || a.localeCompare(b); });\r\n    if (st.tag && keys.indexOf(st.tag) < 0) keys.unshift(st.tag);\r\n    var max = tagsOpen ? 60 : 14, html = '<span class=\"lbl\">TAG<\/span>';\r\n    keys.slice(0, max).forEach(function (k) { html += '<button type=\"button\" class=\"chip tag' + (k === st.tag ? ' on' : '') + '\" data-tag=\"' + esc(k) + '\">#' + esc(k) + ' <span class=\"n\">' + (tc[k] || 0) + '<\/span><\/button>'; });\r\n    if (keys.length > 14) html += '<button type=\"button\" class=\"more-tags\" data-more>' + (tagsOpen ? '\u2212 fewer tags' : '+ ' + Math.min(keys.length, 60) + ' more tags') + '<\/button>';\r\n    $('rfvTags').innerHTML = html;\r\n    var pills = [];\r\n    if (st.q) pills.push(['q', 'Search: \u201c' + st.q + '\u201d']);\r\n    if (st.tipo) pills.push(['tipo', 'Type: ' + tl(st.tipo)]);\r\n    if (st.mac) pills.push(['mac', 'Machine: ' + st.mac]);\r\n    if (st.gua) pills.push(['gua', 'Fault: ' + st.gua]);\r\n    if (st.tag) pills.push(['tag', '#' + st.tag]);\r\n    $('rfvActive').innerHTML = pills.map(function (p) { return '<span class=\"pill\">' + esc(p[1]) + '<button type=\"button\" data-rm=\"' + p[0] + '\" aria-label=\"Remove filter\">\u2715<\/button><\/span>'; }).join('') +\r\n      (pills.length > 1 ? '<button type=\"button\" class=\"reset\" data-reset>CLEAR ALL<\/button>' : '');\r\n    $('rfvClr').hidden = !st.q;\r\n  }\r\n\r\n  \/* ---------- risultati ---------- *\/\r\n  \/\/ evidenzia le parole cercate (il confronto ignora maiuscole e accenti)\r\n  function hl(text) {\r\n    text = String(text || '');\r\n    var words = norm(st.q).split(\/\\s+\/).filter(function (w) { return w.length > 1; });\r\n    if (!words.length) return esc(text);\r\n    var nt = norm(text), on = [];\r\n    if (nt.length !== text.length) return esc(text);\r\n    words.forEach(function (w) { var i = 0, k; while ((k = nt.indexOf(w, i)) >= 0) { for (var j = k; j < k + w.length; j++) on[j] = true; i = k + w.length; } });\r\n    var out = '', run = '', mode = false;\r\n    for (var c = 0; c <= text.length; c++) {\r\n      var m = !!on[c];\r\n      if (c === text.length || m !== mode) { out += mode ? '<mark>' + esc(run) + '<\/mark>' : esc(run); run = ''; mode = m; }\r\n      if (c < text.length) run += text[c];\r\n    }\r\n    return out;\r\n  }\r\n  function card(o, i) {\r\n    var col = TIPO_COL[o.tipo] || '#7c70da';\r\n    return '<a class=\"vc\" href=\"' + esc(o.url) + '\" data-i=\"' + i + '\" target=\"_blank\" rel=\"noopener\" style=\"--acc:' + col + ';animation-delay:' + Math.min(i % PAGE, 12) * 30 + 'ms\">' +\r\n      '<div class=\"th\">' + (o.yt ? '<img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/i.ytimg.com\/vi\/' + o.yt + '\/mqdefault.jpg\" alt=\"\">' : '') +\r\n      (o.code ? '<span class=\"code\">' + esc(o.code) + '<\/span>' : '') + '<span class=\"play\"><\/span>' + (o.tipo ? '<span class=\"tipo\">' + esc(tl(o.tipo).toUpperCase()) + '<\/span>' : '') + '<\/div>' +\r\n      '<div class=\"bd\"><span class=\"mac\">' + hl(o.mac) + '<\/span><h3>' + hl(o.title) + '<\/h3>' +\r\n      (o.gua.length ? '<span class=\"gs\">\u26a0 ' + hl(o.gua.join(', ')) + '<\/span>' : '') +\r\n      (o.tags.length ? '<span class=\"tg\">' + o.tags.slice(0, 4).map(function (t) { return '#' + hl(t); }).join(' ') + '<\/span>' : '') + '<\/div><\/a>';\r\n  }\r\n  function sortView() {\r\n    var f = {\r\n      new: function (a, b) { return b.id - a.id; },\r\n      old: function (a, b) { return a.id - b.id; },\r\n      az: function (a, b) { return a.title.localeCompare(b.title, 'en'); },\r\n      mac: function (a, b) { return a.mac.localeCompare(b.mac, 'en') || b.id - a.id; }\r\n    }[st.sort] || function (a, b) { return b.id - a.id; };\r\n    view.sort(f);\r\n  }\r\n  function update(first) {\r\n    view = ALL.filter(function (o) { return match(o); });\r\n    sortView();\r\n    shown = 0;\r\n    $('rfvGrid').innerHTML = '';\r\n    renderFilters();\r\n    var n = view.length;\r\n    $('rfvCount').innerHTML = String(n).padStart(3, '0') + ' <small>' + (n === ALL.length ? 'VIDEOS' : 'FOUND') + '<\/small>';\r\n    $('rfvInfo').innerHTML = n === ALL.length ? 'All <b>' + n + '<\/b> videos in the archive' : '<b>' + n + '<\/b> video' + (n === 1 ? '' : 's') + ' out of ' + ALL.length;\r\n    if (!n) {\r\n      $('rfvGrid').innerHTML = '<div class=\"empty\">?FILE NOT FOUND  ERROR<p>No videos match these filters. Try removing a filter or searching for a different word.<\/p><button type=\"button\" class=\"btn y\" data-reset>CLEAR SEARCH<\/button><\/div>';\r\n      $('rfvMore').hidden = true;\r\n    } else more();\r\n    if (!first) writeUrl();\r\n  }\r\n  function more() {\r\n    var html = '';\r\n    for (var i = shown; i < Math.min(view.length, shown + PAGE); i++) html += card(view[i], i);\r\n    $('rfvGrid').insertAdjacentHTML('beforeend', html);\r\n    shown = Math.min(view.length, shown + PAGE);\r\n    var left = view.length - shown;\r\n    $('rfvMore').hidden = left <= 0;\r\n    $('rfvMore').textContent = '\u25bc SHOW ' + Math.min(left, PAGE) + ' MORE (' + left + ')';\r\n  }\r\n\r\n  \/* ---------- finestra video ---------- *\/\r\n  var dlg = $('rfvDlg');\r\n  function openVideo(i) {\r\n    var o = view[i]; if (!o) return;\r\n    cur = i;\r\n    $('rfvDlgCode').textContent = (o.code ? o.code + ' \u00b7 ' : '') + (tl(o.tipo) || 'VIDEO').toUpperCase() + ' \u00b7 ' + (i + 1) + '\/' + view.length;\r\n    $('rfvDlgTitle').textContent = o.title;\r\n    $('rfvPlayer').innerHTML = o.yt ? '<iframe src=\"https:\/\/www.youtube-nocookie.com\/embed\/' + o.yt + '?autoplay=1&rel=0\" title=\"' + esc(o.title) + '\" allow=\"autoplay; encrypted-media; picture-in-picture; fullscreen\" allowfullscreen><\/iframe>' : '';\r\n    var ch = '';\r\n    if (o.mac) ch += '<span class=\"k\">MACHINE<\/span><button type=\"button\" class=\"chip\" data-f=\"mac\" data-v=\"' + esc(o.mac) + '\">' + esc(o.mac) + '<\/button>';\r\n    o.gua.forEach(function (g, k) { ch += (k ? '' : '<span class=\"k\">FAULT<\/span>') + '<button type=\"button\" class=\"chip\" data-f=\"gua\" data-v=\"' + esc(g) + '\">' + esc(g) + '<\/button>'; });\r\n    o.tags.forEach(function (t, k) { ch += (k ? '' : '<span class=\"k\">TAG<\/span>') + '<button type=\"button\" class=\"chip tag\" data-f=\"tag\" data-v=\"' + esc(t) + '\">#' + esc(t) + '<\/button>'; });\r\n    $('rfvDlgChips').innerHTML = ch;\r\n    $('rfvYt').href = o.url;\r\n    $('rfvPrev').disabled = i <= 0; $('rfvNext').disabled = i >= view.length - 1;\r\n    if (!dlg.open) { if (dlg.showModal) dlg.showModal(); else dlg.setAttribute('open', ''); }\r\n  }\r\n  function closeVideo() { $('rfvPlayer').innerHTML = ''; if (dlg.open) { if (dlg.close) dlg.close(); else dlg.removeAttribute('open'); } }\r\n  dlg.addEventListener('close', function () { $('rfvPlayer').innerHTML = ''; });\r\n  dlg.addEventListener('click', function (e) {\r\n    if (e.target === dlg) return closeVideo();\r\n    var c = e.target.closest('[data-f]');\r\n    if (c) { st[c.dataset.f] = c.dataset.v; closeVideo(); update(); root.scrollIntoView({ behavior: 'smooth', block: 'start' }); }\r\n  });\r\n  $('rfvClose').onclick = closeVideo;\r\n  $('rfvPrev').onclick = function () { openVideo(cur - 1); };\r\n  $('rfvNext').onclick = function () { if (cur + 1 >= shown && shown < view.length) more(); openVideo(cur + 1); };\r\n  dlg.addEventListener('keydown', function (e) {\r\n    if (e.key === 'ArrowLeft' && cur > 0) openVideo(cur - 1);\r\n    if (e.key === 'ArrowRight' && cur < view.length - 1) $('rfvNext').click();\r\n  });\r\n\r\n  \/* ---------- eventi ---------- *\/\r\n  var qt;\r\n  $('rfvQ').addEventListener('input', function (e) { clearTimeout(qt); qt = setTimeout(function () { st.q = e.target.value.trim(); update(); }, 150); });\r\n  $('rfvClr').onclick = function () { $('rfvQ').value = ''; st.q = ''; update(); $('rfvQ').focus(); };\r\n  $('rfvMac').onchange = function (e) { st.mac = e.target.value; update(); };\r\n  $('rfvGua').onchange = function (e) { st.gua = e.target.value; update(); };\r\n  $('rfvSort').onchange = function (e) { st.sort = e.target.value; update(); };\r\n  $('rfvMore').onclick = more;\r\n  root.addEventListener('click', function (e) {\r\n    var t;\r\n    if ((t = e.target.closest('#rfvTipi .chip'))) { st.tipo = t.dataset.t === st.tipo ? '' : t.dataset.t; update(); return; }\r\n    if ((t = e.target.closest('[data-tag]'))) { st.tag = t.dataset.tag === st.tag ? '' : t.dataset.tag; update(); return; }\r\n    if (e.target.closest('[data-more]')) { tagsOpen = !tagsOpen; renderFilters(); return; }\r\n    if ((t = e.target.closest('[data-rm]'))) { st[t.dataset.rm] = ''; if (t.dataset.rm === 'q') $('rfvQ').value = ''; update(); return; }\r\n    if (e.target.closest('[data-reset]')) { st.q = st.tipo = st.mac = st.gua = st.tag = ''; $('rfvQ').value = ''; update(); return; }\r\n    if ((t = e.target.closest('.vc')) && !e.ctrlKey && !e.metaKey && !e.shiftKey && e.button === 0) { e.preventDefault(); openVideo(+t.dataset.i); }\r\n  });\r\n\r\n  readUrl();\r\n  $('rfvQ').value = st.q;\r\n  load();\r\n})();\r\n<\\\/script><\/script>\r\n<script>(function(){if(!window.RF_EN)return;var s=document.currentScript,src=s.previousElementSibling,it=src.previousElementSibling;var box=document.createElement('div');box.setAttribute('data-no-translation','');box.innerHTML=src.textContent.replace(\/<\\\\(\\\/script|!--)\/gi,'<$1');it.parentNode.replaceChild(box,it);[].forEach.call(box.querySelectorAll('script'),function(o){var n=document.createElement('script');[].forEach.call(o.attributes,function(a){n.setAttribute(a.name,a.value)});n.textContent=o.textContent;o.parentNode.replaceChild(n,o)});})();<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>ARCHIVIO VIDEO RETROFIXER Cerca un video Cerca per macchina, tipo di guasto, componente o argomento. Clicca su un video per guardarlo subito. &#8212; VIDEO SEARCH &#8220;VIDEOTECA&#8221;,8,1<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[],"tags":[542,165],"class_list":["post-9824","page","type-page","status-publish","hentry","tag-cerca","tag-guasto"],"_links":{"self":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages\/9824","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/comments?post=9824"}],"version-history":[{"count":196,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages\/9824\/revisions"}],"predecessor-version":[{"id":11338,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/pages\/9824\/revisions\/11338"}],"wp:attachment":[{"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/media?parent=9824"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/categories?post=9824"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/retrofixer.it\/en\/wp-json\/wp\/v2\/tags?post=9824"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}