From 898b52edcb47bcb3e9d6106e74ca73e74ea01e70 Mon Sep 17 00:00:00 2001 From: sillylaird Date: Thu, 3 Sep 2026 00:33:59 +0000 Subject: import live www.sillylaird.ca webroot --- assets/js/pages/404.js | 5 + assets/js/pages/50x.js | 5 + assets/js/pages/admin-vibe.js | 71 ++++ assets/js/pages/admin.js | 714 ++++++++++++++++++++++++++++++++++ assets/js/pages/guestbook-comments.js | 39 ++ assets/js/pages/guestbook_jp.js | 91 +++++ assets/js/pages/guestbook_zh.js | 91 +++++ assets/js/pages/hitcounter.js | 26 ++ assets/js/pages/latest.js | 10 + assets/js/pages/mstartpage-index.js | 118 ++++++ assets/js/pages/radio-nowplaying.js | 41 ++ assets/js/pages/vibe-admin.js | 48 +++ assets/js/pages/whatsleft.js | 16 + 13 files changed, 1275 insertions(+) create mode 100644 assets/js/pages/404.js create mode 100644 assets/js/pages/50x.js create mode 100644 assets/js/pages/admin-vibe.js create mode 100644 assets/js/pages/admin.js create mode 100644 assets/js/pages/guestbook-comments.js create mode 100644 assets/js/pages/guestbook_jp.js create mode 100644 assets/js/pages/guestbook_zh.js create mode 100644 assets/js/pages/hitcounter.js create mode 100644 assets/js/pages/latest.js create mode 100644 assets/js/pages/mstartpage-index.js create mode 100644 assets/js/pages/radio-nowplaying.js create mode 100644 assets/js/pages/vibe-admin.js create mode 100644 assets/js/pages/whatsleft.js (limited to 'assets/js/pages') diff --git a/assets/js/pages/404.js b/assets/js/pages/404.js new file mode 100644 index 0000000..a97a5b1 --- /dev/null +++ b/assets/js/pages/404.js @@ -0,0 +1,5 @@ +(function(){ + var el = document.getElementById('y'); + if (!el) return; + el.textContent = String(new Date().getFullYear()); + })(); diff --git a/assets/js/pages/50x.js b/assets/js/pages/50x.js new file mode 100644 index 0000000..a97a5b1 --- /dev/null +++ b/assets/js/pages/50x.js @@ -0,0 +1,5 @@ +(function(){ + var el = document.getElementById('y'); + if (!el) return; + el.textContent = String(new Date().getFullYear()); + })(); diff --git a/assets/js/pages/admin-vibe.js b/assets/js/pages/admin-vibe.js new file mode 100644 index 0000000..0f7b79e --- /dev/null +++ b/assets/js/pages/admin-vibe.js @@ -0,0 +1,71 @@ +function detectType(url) { + if (!url) return 'none'; + try { new URL(url); } catch(e) { return 'none'; } + const path = (new URL(url)).pathname.toLowerCase(); + const ext = path.split('.').pop(); + const imgs = ['jpg','jpeg','png','gif','webp','bmp','svg','avif']; + const vids = ['mp4','webm','ogv','mov']; + const auds = ['mp3','flac','wav','ogg','aac','opus','m4a']; + if (imgs.includes(ext)) return 'image'; + if (vids.includes(ext)) return 'video'; + if (auds.includes(ext)) return 'audio'; + if (/(?:youtube\.com\/watch\?.*v=|youtu\.be\/)([A-Za-z0-9_-]{11})/.test(url)) return 'youtube'; + if (/vimeo\.com\/(\d+)/.test(url)) return 'vimeo'; + return 'link'; +} + +function getYTId(url) { + const m = url.match(/(?:v=|youtu\.be\/)([A-Za-z0-9_-]{11})/); + return m ? m[1] : null; +} +function getVimeoId(url) { + const m = url.match(/vimeo\.com\/(\d+)/); + return m ? m[1] : null; +} + +function updateBadge(type) { + const b = document.getElementById('type-badge'); + b.textContent = type; +} + +function updatePreview(url) { + const body = document.getElementById('preview-body'); + if (!url) { body.innerHTML = '

// no url set

'; return; } + const type = detectType(url); + const safeUrl = url.replace(/"/g, '%22'); + let html = `
${url}
`; + if (type === 'image') { + html += `vibe preview`; + } else if (type === 'video') { + html += ``; + } else if (type === 'audio') { + html += ``; + } else if (type === 'youtube') { + const id = getYTId(url); + if (id) html += `
`; + } else if (type === 'vimeo') { + const id = getVimeoId(url); + if (id) html += `
`; + } else { + html += `${url}`; + } + body.innerHTML = html; + updateBadge(type); +} + +const urlInput = document.getElementById('url'); +let debounce; +urlInput.addEventListener('input', () => { + clearTimeout(debounce); + debounce = setTimeout(() => updatePreview(urlInput.value.trim()), 400); +}); + +document.querySelectorAll('.preset-btn').forEach(btn => { + btn.addEventListener('click', () => { + const url = btn.dataset.url; + const desc = btn.dataset.desc; + urlInput.value = url; + if (desc) document.getElementById('description').value = desc; + updatePreview(url); + }); +}); diff --git a/assets/js/pages/admin.js b/assets/js/pages/admin.js new file mode 100644 index 0000000..076c5e9 --- /dev/null +++ b/assets/js/pages/admin.js @@ -0,0 +1,714 @@ +/* Unified admin panel client behaviour. + * Lives in an external file because the site's enforced CSP (nginx) uses + * script-src 'self' with no 'unsafe-inline' — inline