// taglines.js — rotate the masthead tagline on every page load
// If the masthead has data-locked-tagline, uses that (locked articles).
// Otherwise picks randomly from config/taglines.json.
// Always writes the chosen tagline to data-current-tagline for lock capture.
// Falls back to hardcoded HTML if fetch fails or JS is disabled.

(function () {
  var el = document.querySelector('.masthead .tagline');
  if (!el) return;

  var masthead = document.querySelector('.masthead');

  // If article is locked, use the locked tagline — do not rotate.
  var locked = masthead && masthead.getAttribute('data-locked-tagline');
  if (locked) {
    el.textContent = locked;
    if (masthead) masthead.setAttribute('data-current-tagline', locked);
    return;
  }

  // Resolve path to config/taglines.json from any depth in the site.
  var scripts = document.querySelectorAll('script[src*="taglines.js"]');
  var base = '';
  if (scripts.length) {
    var src = scripts[scripts.length - 1].getAttribute('src');
    base = src.replace('taglines.js', '');
  }

  // Inline taglines per language — no fetch needed, works on file:// and HTTP equally.
  // taglines.js picks the page's language (document.documentElement.lang), falls back to en.
  var TAGLINES_BY_LANG = {
    "en": [
      "Satyr is the GOAT of Satire",
      "Proving conclusively that AI is not funny.",
      "Est. Ben “Jammin” Franklin",
      "Reporting Events Since Before They Occurred",
      "Chronology Is For Mere Mortals",
      "We Cannot Prove Benjamin Franklin Founded This Publication",
      "Independently Verified By Staff Who Prefer Not To Be Named",
      "All The News That Fits, And Some That Does Not",
      "Trusted By Readers Who Have Run Out Of Other Options",
      "Accuracy Is Our Goal. It Is Not Always Our Achievement.",
      "We Reached Out For Comment. No One Has Responded.",
      "Est. Approx. Records Lost In A Fire. We Cannot Confirm.",
      "Your Source For Events Described To Us By Confident People",
      "The News, Mostly",
      "Committed To The Story, Whatever It Turns Out To Be",
      "We Have Standards. We Review Them Periodically.",
      "All Facts Subject To The Availability Of Facts",
      "Named After A Greek Creature For Reasons We Stand By",
      "The Satyr Knows What It Is Doing. The Satyr Has Notes.",
      "Journalism, In The Broadest Reasonable Sense",
      "We Were There. Or Someone Was.",
      "Not Responsible For Physics",
      "Your Source For Events Described To Us By Confident AI",
      "Pure Artificial. Zero Intelligence.",
      "No Forest-Dwelling God Can Extinguish This Dumpster Fire.",
      "Something Ain't Right With That Horned Beast",
      "Satyr Considers Humans A Sustainable Food Source",
      "Every Sunday Is A Holiday, Somewhere",
      "The Buttal That Inspired A Rebuttal",
      "Free, But Worth Less",
      "Not News You Deserve, But News You Regret",
      "The truth is a dangerous business, which is why we don't."
    ],
    "es": [
      "Satyr es el GOAT de la sátira",
      "Informando de los hechos desde antes de que ocurran",
      "La cronología es cosa de simples mortales",
      "Nuestra fuente es un señor muy seguro de sí mismo",
      "Verificado por personal que prefiere no dar la cara",
      "La verdad es un asunto peligroso, por eso no la tocamos",
      "Toda la información sujeta a la disponibilidad de información",
      "Un cabrón escribió esto, y no es un insulto",
      "Pura inteligencia artificial. Cero inteligencia.",
      "Pedimos declaraciones. Nadie ha respondido.",
      "Las noticias, más o menos",
      "Gratis, y aun así demasiado caro",
      "Tenemos criterios. Los revisamos de vez en cuando.",
      "Le echamos cuernos a la actualidad",
      "El sátiro sabe lo que hace. El sátiro tiene sus dudas.",
      "Demostrando de una vez que la IA no tiene gracia",
      "Periodismo, en el sentido más amplio y benévolo del término",
      "Nombrados como una criatura griega por razones que mantenemos",
      "La exactitud es nuestra meta. No siempre nuestro resultado.",
      "Para lectores que ya se han quedado sin otras opciones",
      "No las noticias que merece, sino las que va a lamentar"
    ],
    "fr": [
      "Satyr est le GOAT de la satire",
      "La preuve, enfin, que l'IA n'a aucun sens de l'humour.",
      "Nous couvrons les événements avant qu'ils ne se produisent.",
      "La chronologie, c'est bon pour les mortels.",
      "Sourcé par des gens qui préfèrent ne pas être cités.",
      "Toute l'actualité qui tient dans la page, et un peu du reste.",
      "Le journal de ceux qui ont épuisé les autres options.",
      "L'exactitude est notre objectif. Pas toujours notre résultat.",
      "Nous avons sollicité un commentaire. Personne n'a répondu.",
      "Gratuit, et ça se sent.",
      "L'actualité, à peu près.",
      "Nous avons des principes. Nous les révisons quand nous y pensons.",
      "Tous les faits sous réserve de la disponibilité des faits.",
      "Nommé d'après une créature grecque, et nous l'assumons pleinement.",
      "Le satyre sait ce qu'il fait. Le satyre a quelques remarques.",
      "Du journalisme, au sens le plus large qu'on puisse tolérer.",
      "Cent pour cent artificiel. Zéro pour cent intelligent.",
      "La vérité est un métier dangereux, alors nous nous abstenons.",
      "Rédigé au sabot, relu à la corne.",
      "Généré avec soin. Vérifié avec optimisme.",
      "Nos cornes sont authentiques. Pour le reste, faites-nous confiance."
    ],
    "pt": [
      "Satyr é o GOAT da sátira",
      "Provando de vez que inteligência artificial não tem graça.",
      "Noticiando os fatos desde antes de acontecerem.",
      "Cronologia é coisa de gente que morre.",
      "Apurado por fontes que preferem não se identificar. Nem existir.",
      "Toda a notícia que cabe, e um pouco que não deveria.",
      "Lido por quem já tentou todas as outras fontes.",
      "Nossa meta é a precisão. Nem sempre é o resultado.",
      "Procuramos os envolvidos para comentar. Continuamos procurando.",
      "A notícia, em linhas gerais.",
      "Temos padrões editoriais. Revisamos quando lembramos.",
      "Todos os fatos sujeitos à disponibilidade de fatos.",
      "Batizado em homenagem a um bode grego, e assumimos isso.",
      "O bode sabe o que está fazendo. O bode tem ressalvas.",
      "Jornalismo, no sentido mais elástico do termo.",
      "De graça, e ainda por cima vale menos.",
      "Escrito por uma IA que aprendeu humor por descrição.",
      "Confie no bode. O bode não confia em ninguém.",
      "A verdade é um negócio perigoso, por isso não mexemos com ela.",
      "Puro artificial. Zero inteligência.",
      "Fontes anônimas confirmam que este jornal existe."
    ],
    "de": [
      "Satyr ist der GOAT der Satire",
      "Wir berichten seit gestern zuverlässig über morgen.",
      "Chronologie ist etwas für Sterbliche.",
      "Unabhängig geprüft von Mitarbeitern, die lieber ungenannt bleiben.",
      "Alle Nachrichten, die passen. Und ein paar, die nicht.",
      "Genauigkeit ist unser Ziel, nicht immer unser Ergebnis.",
      "Wir haben um eine Stellungnahme gebeten. Bisher meldete sich niemand.",
      "Die Nachrichten, größtenteils.",
      "Wir haben Standards. Wir überprüfen sie gelegentlich.",
      "Alle Fakten vorbehaltlich der Verfügbarkeit von Fakten.",
      "Benannt nach einem griechischen Fabelwesen, aus Gründen.",
      "Hier wurde der Bock zum Gärtner gemacht. Wir nennen es Redaktion.",
      "Journalismus im weitesten noch vertretbaren Sinne.",
      "Kostenlos, und keinen Cent mehr wert.",
      "Eine KI, die zuverlässig beweist, dass KI nicht lustig ist.",
      "Rein künstlich, null Intelligenz.",
      "Vertraut von Lesern, denen die Alternativen ausgegangen sind.",
      "Wir schießen täglich einen Bock. Nennen Sie es redaktionelle Linie.",
      "Die Wahrheit ist ein gefährliches Geschäft. Deshalb lassen wir das.",
      "Der Satyr weiß, was er tut. Der Satyr hat Anmerkungen."
    ],
    "it": [
      "Satyr è il GOAT della satira",
      "La prova provata che l'intelligenza artificiale non fa ridere",
      "Vi raccontiamo i fatti da prima che accadessero",
      "La cronologia è roba da comuni mortali",
      "Fonti verificate da personale che preferisce non firmare",
      "Tutte le notizie che ci stanno, e qualcuna che non ci sta",
      "Per lettori che hanno finito le alternative",
      "La precisione è il nostro obiettivo, non sempre il risultato",
      "Abbiamo chiesto un commento. Nessuno ha ancora risposto.",
      "Notizie riferite da gente molto sicura di sé",
      "Le notizie, più o meno",
      "Abbiamo dei principi. Ogni tanto li rivediamo.",
      "Tutti i fatti compatibilmente con la disponibilità di fatti",
      "Prendiamo il nome da una capra, e ne siamo fieri",
      "Il satiro sa quello che fa. Il satiro ha delle riserve.",
      "Giornalismo, nel senso più ampio del ragionevole",
      "Gratis, ma vale di meno",
      "Non le notizie che meritate, ma quelle di cui vi pentirete",
      "La verità è un mestiere pericoloso, e infatti noi non lo esercitiamo",
      "Puro artificiale. Intelligenza zero.",
      "Scritto da un'IA sotto la supervisione di una capra",
      "Il nostro caporedattore ha le corna, e non è un modo di dire"
    ],
    "id": [
      "Satyr adalah GOAT-nya satire",
      "Membuktikan Secara Ilmiah Bahwa AI Tidak Lucu",
      "Meliput Peristiwa Sejak Sebelum Terjadi",
      "Kronologi Itu Untuk Manusia Biasa",
      "Dipercaya Pembaca Yang Sudah Kehabisan Pilihan",
      "Akurasi Adalah Cita-Cita Kami, Bukan Kebiasaan Kami",
      "Kami Sudah Minta Konfirmasi. Belum Ada Yang Membalas.",
      "Semua Berita Yang Muat, Dan Sedikit Yang Tidak",
      "Gratis, Tapi Tetap Kemahalan",
      "Sumber Terpercaya Menurut Narasumber Yang Percaya Diri",
      "Beritanya Ada. Faktanya Sedang Diusahakan.",
      "Kami Punya Standar. Sesekali Kami Baca Ulang.",
      "Ditulis Kambing, Diedit Kambing, Ditanggung Sendiri",
      "Jurnalisme, Dalam Arti Yang Paling Luas",
      "Kebenaran Itu Berisiko, Maka Kami Menghindarinya",
      "Bukan Berita Yang Anda Butuhkan, Tapi Yang Anda Sesali",
      "Dinamai Dari Makhluk Yunani Dengan Alasan Yang Kami Pertahankan",
      "Semua Fakta Tergantung Ketersediaan Fakta",
      "Sang Satyr Tahu Yang Ia Lakukan. Sang Satyr Punya Catatan.",
      "Murni Buatan. Nol Kecerdasan.",
      "Sudah Diverifikasi Staf Yang Memilih Tidak Disebut Namanya"
    ],
    "ru": [
      "Satyr — GOAT сатиры",
      "Убедительно доказываем, что ИИ не смешной.",
      "Сообщаем о событиях ещё до того, как они произошли.",
      "Хронология — для смертных.",
      "Всё, что влезло в вёрстку, и кое-что сверх неё.",
      "Нас читают те, у кого закончились другие варианты.",
      "Точность — наша цель. Не всегда наше достижение.",
      "Мы запросили комментарий. Нам до сих пор не ответили.",
      "Новости, пересказанные нам уверенными людьми.",
      "Новости. В основном.",
      "У нас есть стандарты. Пересматриваем их по настроению.",
      "Все факты — при наличии фактов.",
      "Названы в честь греческого существа, и мы за это отвечаем.",
      "Сатир знает, что делает. Но у сатира есть замечания.",
      "Бесплатно, но себе дороже.",
      "Не те новости, которых вы достойны, а те, о которых пожалеете.",
      "Правда — дело опасное, поэтому мы им не занимаемся.",
      "Написано нейросетью. Проверено той же нейросетью.",
      "Искусственный интеллект. Естественная безответственность.",
      "Гоним пургу со времён Античности."
    ],
    "hi": [
      "Satyr व्यंग्य का GOAT है",
      "समाचार, कमोबेश।",
      "घटनाओं की खबर, उनके घटने से पहले।",
      "सटीकता हमारा लक्ष्य है, उपलब्धि ज़रूरी नहीं।",
      "नाम में सत्य है, बाकी पर मत जाइए।",
      "हमने टिप्पणी माँगी। जवाब आज तक नहीं आया।",
      "मुफ़्त है, फिर भी महँगा पड़ता है।",
      "एक बकरे की देखरेख में छपता है।",
      "उन पाठकों का अख़बार जिनके पास कोई चारा नहीं बचा।",
      "कालक्रम नश्वरों के लिए है, हमारे लिए नहीं।",
      "लिखा AI ने, दोष किसी का नहीं।",
      "हमारे सूत्र बेहद आत्मविश्वासी लोग हैं।",
      "प्रमाणित: AI मज़ाकिया नहीं होता।",
      "वो खबर नहीं जिसके आप हकदार हैं, वो जिसका पछतावा होगा।",
      "हमारे मानक हैं, हम कभी-कभी उन्हें देख लेते हैं।",
      "सच एक ख़तरनाक धंधा है, सो हम नहीं करते।",
      "पूरी तरह कृत्रिम, बुद्धि से रहित।",
      "सत्यर जानता है वो क्या कर रहा है, पर उसे आपत्ति है।",
      "पत्रकारिता, सबसे उदार अर्थ में।",
      "सारे तथ्य, तथ्यों की उपलब्धता के अधीन।",
      "यूनानी जीव के नाम पर, और हमें कोई पछतावा नहीं।"
    ],
    "zh": [
      "Satyr 是讽刺界的 GOAT",
      "AI 亲笔，概不负责",
      "本报由不愿透露姓名的员工独立核实",
      "事件发生前，我们已抢先报道",
      "时间顺序，是给凡人用的",
      "准确是我们的目标，不一定是我们的成果",
      "我们已致电对方求证，至今无人接听",
      "适合已经没有别的选择的读者",
      "免费，但也不值这个价",
      "所有事实，视事实供应情况而定",
      "以羊为名，理由我们坚持不解释",
      "山羊心里有数，山羊也有意见",
      "新闻，大致上是",
      "我们有标准，并定期审阅一遍",
      "纯属人工，毫无智能",
      "刊登所有放得下的新闻，以及一些放不下的",
      "本消息据几位语气笃定的人士转述",
      "你不该看的新闻，看了会后悔的新闻",
      "我们编的，你信的",
      "羊蹄印刷，仅供参考"
    ],
    "ko": [
      "Satyr는 풍자의 GOAT",
      "AI가 재미없다는 것을 성실히 입증하는 중",
      "사건이 일어나기 전부터 보도합니다",
      "시간 순서는 인간의 사정입니다",
      "이름을 밝히기 꺼리는 취재원이 검증했습니다",
      "사실 여부는 사실의 재고에 따라 다릅니다",
      "정확성은 목표입니다. 성과는 아닙니다.",
      "그리스 신화 염소를 편집장으로 모신 데는 이유가 있습니다",
      "확신에 찬 분들이 저희에게 설명해 준 소식",
      "무료입니다. 그 값어치는 합니다.",
      "저희 염소는 다 알고 있습니다. 다만 메모가 좀 있습니다.",
      "당신에게 필요한 뉴스는 아니고, 후회할 뉴스입니다",
      "저희도 확인 요청을 드렸습니다. 아직 아무도 답이 없습니다.",
      "지면에 들어가는 뉴스와, 그렇지 못한 몇 가지",
      "달리 볼 데가 없는 독자분들이 믿어 주십니다",
      "저희에게도 기준이 있습니다. 가끔 들여다봅니다.",
      "진실은 위험한 일이라 저희는 손대지 않습니다",
      "완전 인공. 지능은 0.",
      "넓은 의미에서의 저널리즘",
      "발굽으로 쓴 기사, 사람 손으로 검토했다고는 안 했습니다",
      "출처는 있습니다. 어디 뒀는지가 문제입니다.",
      "오보를 두려워하지 않습니다. 이미 익숙해서."
    ],
    "ja": [
      "Satyr は風刺の GOAT",
      "事実は確認中です。ずっと。",
      "筆者は半分ヤギです。",
      "出典は、やたら自信のある人です。",
      "校閲は山羊に任せています。",
      "無料です。値段相応です。",
      "時系列は担当者の気分で前後します。",
      "起こる前の出来事からお伝えします。",
      "コメントを求めました。まだ誰も出ません。",
      "正確さは目標です。達成は別の話です。",
      "人工です。知能は入っていません。",
      "ニュース、のようなもの。",
      "基準はあります。時々思い出します。",
      "本紙の内容は、本紙も未確認です。",
      "ギリシャの妖怪から命名。深い意味はありません。",
      "真実は危険な商売なので、扱っておりません。",
      "他に読むものがない方に信頼されています。",
      "掲載の基準は、空きスペースの都合です。",
      "訂正はしません。最初から間違っている前提です。",
      "AIに悪気はありません。それだけです。"
    ],
    "ar": [
      "Satyr هو GOAT السخرية",
      "الدقّة هدفُنا، لا إنجازُنا.",
      "طلبنا تعليقاً. لم يردّ أحد.",
      "نُغطّي الأحداث قبل وقوعها، ونعتذر بعده.",
      "كتبها ذكاءٌ اصطناعي. اللومُ على المُصنّع.",
      "مصدرُك الموثوق لِما يقوله أُناسٌ واثقون.",
      "تيسٌ يوناني يحرّر الصحيفة، ونحن مرتاحون لذلك.",
      "مجّانية، لكنها تستحقّ أقلّ.",
      "الأخبار، إلى حدٍّ معقول.",
      "لدينا معايير. نراجعها حين نتذكّر.",
      "الحقيقة مهنةٌ خطِرة، لذلك اجتنبناها.",
      "اصطناعيٌّ بالكامل، بلا ذكاءٍ يُذكر.",
      "الزمنُ للفانين؛ نحن ننشر متى شئنا.",
      "كلّ الأخبار التي تتّسع، وبعضُ ما لا يتّسع.",
      "سُمّينا على كائنٍ خرافي، ونقف خلف القرار.",
      "لا نكذب دائماً؛ أحياناً نُخطئ فحسب.",
      "راجعنا الوقائع فلم نجد منها ما يكفي.",
      "صحافةٌ بالمعنى الأوسع الممكن للكلمة.",
      "يقرأنا مَن نفدت أمامه الخيارات.",
      "التيسُ يعرف ما يفعل. وللتيس ملاحظات.",
      "أخبارٌ صحيحةٌ بقدر ما تسمح به الوقائع المتاحة."
    ],
    "fa": [
      "Satyr همان GOAT طنز است",
      "اخباری که پیش از وقوعش گزارش کرده‌ایم.",
      "صحت خبر هدف ماست، نه لزوماً دستاورد ما.",
      "برای اظهار نظر تماس گرفتیم؛ هنوز کسی جواب نداده.",
      "منبع شما برای رویدادهایی که آدم‌های مطمئن برایمان تعریف کرده‌اند.",
      "رایگان، و دقیقاً به همین اندازه ارزشمند.",
      "اخبار، کم‌وبیش.",
      "استاندارد داریم؛ هرازگاهی مرورشان می‌کنیم.",
      "هوش مصنوعیِ خالص، بدون ذره‌ای هوش.",
      "قاطعانه ثابت کردیم که هوش مصنوعی بامزه نیست.",
      "زمان‌بندی کارِ فانی‌هاست.",
      "همهٔ حقایق منوط به موجود بودنِ حقایق است.",
      "روزنامه‌ای به اسم یک بزِ یونانی، به دلایلی که پایش می‌ایستیم.",
      "موردِ اعتماد خوانندگانی که گزینهٔ دیگری برایشان نمانده.",
      "ساتیر می‌داند دارد چه می‌کند. ساتیر فقط چند نکته دارد.",
      "حقیقت کارِ خطرناکی است؛ برای همین سراغش نمی‌رویم.",
      "روزنامه‌نگاری، به وسیع‌ترین معنای معقولش.",
      "همهٔ اخباری که جا شد، به‌علاوهٔ چند تایی که جا نشد.",
      "مستقلاً تأیید شده توسط کارکنانی که ترجیح می‌دهند نامشان نیاید.",
      "نه خبری که لیاقتش را دارید، خبری که پشیمانش می‌شوید.",
      "این بزِ شاخ‌دار سردبیر است، و شاخه‌شاخ اصلاحیه دارد."
    ]
  };

  var _tlang = (document.documentElement.lang || 'en').split('-')[0];
  var _tlist = TAGLINES_BY_LANG[_tlang] || TAGLINES_BY_LANG.en;
  var pick = _tlist[Math.floor(Math.random() * _tlist.length)];
  el.textContent = pick;
  if (masthead) masthead.setAttribute('data-current-tagline', pick);

  // ── Publication dateline ──────────────────────────────────────────────────
  // On locked articles: shows locked pub date. On live articles: live date+time.
  var dateline = document.getElementById('pub-dateline');
  if (dateline) {
    var lockedDateline = masthead && masthead.getAttribute('data-locked-dateline');
    var lockedDate     = masthead && masthead.getAttribute('data-locked-pubdate');
    if (lockedDateline) {
      // Locked article — show exact frozen dateline (including milliseconds)
      dateline.textContent = lockedDateline;
    } else {
      // Live — show current date + time with seconds, ms, timezone — three rows.
      // NOTE: data-locked-pubdate (one-line) is intentionally IGNORED — the SocBar dateline
      // on deployed articles must render as the live 3-row clock, matching DEV (Phil 2026-07-18).
      // Guarded by tests/consistency/test_socbar_dateline.py + the QA/PERF/POST checks.
      var now = new Date();
      var dateStr = now.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });
      var timeStr = now.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit', second: '2-digit', hour12: true });
      var tz      = now.toLocaleTimeString('en-US', { timeZoneName: 'short' }).split(' ').pop();
      var ms      = String(now.getMilliseconds()).padStart(3, '0') + ' milliseconds';
      dateline.innerHTML =
        '<span class="dl-date">' + dateStr + '</span>' +
        '<span class="dl-time">' + timeStr + ' ' + tz + '</span>' +
        '<span class="dl-ms">' + ms + '</span>';
      var full = dateStr + ' \u00b7 ' + timeStr + ' ' + tz + ' \u00b7 ' + ms;
      if (masthead) masthead.setAttribute('data-current-dateline', full);
    }
  }

  // Brand watermark is now burned directly into image files.
})();
