(function () { var ctxMenu = document.getElementById('ctxMenu') if (!ctxMenu) return var targetId = null function showCtx(x, y) { ctxMenu.style.left = x + 'px' ctxMenu.style.top = y + 'px' ctxMenu.hidden = false } function hideCtx() { ctxMenu.hidden = true } document.querySelectorAll('.videoCard').forEach(function (card) { card.addEventListener('contextmenu', function (e) { e.preventDefault() targetId = card.getAttribute('data-video-id') || card.getAttribute('data-id') showCtx(e.clientX, e.clientY) }) }) document.addEventListener('click', function (e) { if (!ctxMenu.contains(e.target)) hideCtx() }) document.addEventListener('scroll', hideCtx, true) ctxMenu.addEventListener('click', function (e) { var btn = e.target.closest('button') if (!btn) return var action = btn.getAttribute('data-action') if (action === 'copyUrl' && targetId) { copyVideoUrl(targetId) } hideCtx() }) function copyVideoUrl(id) { var url = location.origin + '/file/video/' + encodeURIComponent(id) if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(url).then(function () { flashToast('주소가 복사되었습니다.') }, function () { fallbackCopy(url) }) } else { fallbackCopy(url) } } function fallbackCopy(text) { try { var ta = document.createElement('textarea') ta.value = text ta.style.position = 'fixed' ta.style.left = '-9999px' document.body.appendChild(ta) ta.focus(); ta.select() var ok = document.execCommand && document.execCommand('copy') document.body.removeChild(ta) if (ok) flashToast('주소가 복사되었습니다.') else window.prompt('주소를 복사하세요:', text) } catch (e) { window.prompt('주소를 복사하세요:', text) } } function flashToast(msg) { var el = document.createElement('div') el.className = 'flashToast' el.textContent = msg document.body.appendChild(el) requestAnimationFrame(function () { el.classList.add('show') }) setTimeout(function () { el.classList.remove('show') setTimeout(function () { el.parentNode && el.parentNode.removeChild(el) }, 200) }, 1500) } })()