PageSourceSearch

https://eylenburg.github.io/supporting/banner.js

js eylenburg.github.io collected 2026-10-03 09:10:48 UTC 7,597 bytes, 193 lines download raw bytes

1/**
2 * Licensed under the GNU General Public License v3.0
3 * SPDX-License-Identifier: GPL-3.0-only
4 *
5 * Based on https://keepandroidopen.org/banner.js
6 */
7
8(function () {
9  "use strict";
10
11  // ── Localized banner strings ──────────────────────────────────────────
12  var messages = {
13    fa:      "به تأیید سن آنلاین نه بگویید",
14    ar:      "قل لا للتحقق من العمر عبر الإنترنت",
15    he:      "אמור לא לאימות גיל מקוון",
16    en:      "Say No to Online Age Verification",
17    ca:      "Digues no a la verificació d'edat en línia",
18    cs:      "Řekněte ne online ověřování věku",
19    de:      "Sagen Sie Nein zur Online-Altersverifikation",
20    da:      "Sig nej til online aldersverifikation",
21    nl:      "Zeg nee tegen online leeftijdsverificatie",
22    el:      "Πείτε όχι στην επαλήθευση ηλικίας στο διαδίκτυο",
23    es:      "Di no a la verificación de edad en línea",
24    fr:      "Dites non à la vérification d’âge en ligne",
25    id:      "Katakan tidak pada verifikasi usia online",
26    it:      "Dì no alla verifica dell’età online",
27    ko:      "온라인 연령 확인에 반대하세요",
28    pl:      "Powiedz nie weryfikacji wieku online",
29    "pt-BR": "Diga não à verificação de idade online",
30    ru:      "Скажите нет онлайн-проверке возраста",
31    sk:      "Povedzte nie overovaniu veku online",
32    th:      "ปฏิเสธการยืนยันอายุออนไลน์",
33    tr:      "Çevrimiçi yaş doğrulamasına hayır deyin",
34    uk:      "Скажіть ні онлайн-перевірці віку",
35    "zh-CN": "对在线年龄验证说不",
36    "zh-TW": "對線上年齡驗證說不",
37    ja:      "オンライン年齢確認に反対しよう",
38    fi:      "Sano ei verkkoiän varmistukselle",
39    hu:      "Mondj nemet az online életkor-ellenőrzésre",
40    vi:      "Nói không với xác minh độ tuổi trực tuyến",
41  };
42
43  // ── Parse query parameters ────────────────────────────────────────────
44  function getScriptParams() {
45    var params = {};
46    try {
47      var src = document.currentScript && document.currentScript.src;
48      if (!src) return params;
49      var q = src.indexOf("?");
50      if (q === -1) return params;
51      var pairs = src.substring(q + 1).split("&");
52      for (var i = 0; i < pairs.length; i++) {
53        var kv = pairs[i].split("=");
54        params[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1] || "");
55      }
56    } catch (e) {}
57    return params;
58  }
59
60  var params = getScriptParams();
61
62  // ── Determine locale ──────────────────────────────────────────────────
63  function resolveLocale(tag) {
64    if (!tag) return "en";
65    if (messages[tag]) return tag;
66
67    var lower = tag.toLowerCase();
68
69    for (var key in messages) {
70      if (key.toLowerCase() === lower) return key;
71    }
72
73    var base = lower.split("-")[0];
74
75    for (var key2 in messages) {
76      if (key2.toLowerCase() === base) return key2;
77    }
78
79    for (var key3 in messages) {
80      if (key3.toLowerCase().split("-")[0] === base) return key3;
81    }
82
83    return "en";
84  }
85
86  var locale = resolveLocale(
87    params.lang ||
88    document.documentElement.lang ||
89    navigator.language ||
90    navigator.userLanguage
91  );
92
93  // ── Size variant ──────────────────────────────────────────────────────
94  var size = params.size === "mini" ? "mini"
95      : params.size === "minimal"
96        ? "minimal"
97        : "normal";
98
99  // ── Link ───────────────────────────────────────────────────
100  var linkParam = params.link;
101  var defaultLink = "https://reclaimthenet.org/age-verification";
102  var linkUrl = linkParam === "none" ? null : (linkParam || defaultLink);
103
104  // ── Close button ─────────────────────────────────────────────────────
105  var showClose = params.hidebutton !== "off";
106  var storageKey = "kao-banner-hidden";
107  var dismissDays = 30;
108
109  // ── CSS ──────────────────────────────────────────────────
110  var cssNormal =
111    ".kao-banner{" +
112      "position:relative;" +
113      "background:linear-gradient(180deg,#d32f2f 0%,#b71c1c 100%);" +
114      "border-bottom:4px solid #801313;" +
115      "color:#fff;" +
116      "font-family:'Arial Black',sans-serif;" +
117      "font-weight:900;" +
118      "text-transform:uppercase;" +
119      "letter-spacing:2px;" +
120      "font-size:1.5rem;" +
121      "text-align:center;" +
122      "padding:0.5rem 2.5rem;" +
123    "}";
124
125  var cssMini =
126    ".kao-banner{" +
127      "font-size:0.75rem;padding:0.25rem 1.5rem;" +
128    "}";
129
130  var cssMinimal = cssMini;
131
132  var cssCommon =
133    ".kao-banner a{color:#fff;text-decoration:none;}" +
134    ".kao-banner-close{position:absolute;right:0.5rem;top:50%;transform:translateY(-50%);}";
135
136  var style = document.createElement("style");
137  style.textContent =
138    (size === "mini" ? cssMini : size === "minimal" ? cssMinimal : cssNormal)
139    + cssCommon;
140  document.head.appendChild(style);
141
142  // ── Dismiss check ─────────────────────────────────────────────────────
143  if (showClose) {
144    try {
145      var dismissed = localStorage.getItem(storageKey);
146      if (dismissed) {
147        var elapsed = Date.now() - Number(dismissed);
148        if (elapsed < dismissDays * 86400000) return;
149        localStorage.removeItem(storageKey);
150      }
151    } catch (e) {}
152  }
153
154  // ── Create banner ─────────────────────────────────────────────────────
155  var banner = document.createElement("div");
156  banner.className = "kao-banner";
157
158  var messageText = messages[locale] || messages.en;
159
160  if (linkUrl) {
161    var link = document.createElement("a");
162    link.href = linkUrl;
163    link.target = "_blank";
164    link.rel = "noopener";
165    link.textContent = messageText;
166    banner.appendChild(link);
167  } else {
168    banner.appendChild(document.createTextNode(messageText));
169  }
170
171  // Close button
172  if (showClose) {
173    var closeBtn = document.createElement("button");
174    closeBtn.className = "kao-banner-close";
175    closeBtn.textContent = "✕";
176    closeBtn.onclick = function () {
177      banner.style.display = "none";
178      try { localStorage.setItem(storageKey, Date.now()); } catch (e) {}
179    };
180    banner.appendChild(closeBtn);
181  }
182
183  // Insert banner
184  var targetId = params.id;
185  if (targetId) {
186    var target = document.getElementById(targetId);
187    if (target) target.appendChild(banner);
188    else document.body.prepend(banner);
189  } else {
190    document.body.prepend(banner);
191  }
192
193})();

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.