您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Provide a seemingly useless clock in the corner of the screen.
// ==UserScript== // @name Digital Clock Widget by Chua Nghi Ten // @namespace http://tampermonkey.net/ // @version 2024.05.19.15.49 // @license GNU GPLv3 // @description Provide a seemingly useless clock in the corner of the screen. // @author Chua Nghi Ten // @match *://*/* // @icon https://github.com/chuanghiten/chuanghiten.github.io/raw/main/favicon.ico // @grant none // ==/UserScript== (() => { "use strict"; window.addEventListener("load", () => { let cfr = 0, time = 0, seconds = 0, minutes = 0, hours = 0, oldSeconds, oldMinutes, oldHours, menuActive = false, widgetMove = false, secondsHided = false, smoothSeconds = true, hour12 = true, showAMPM = true, autoCheckUpdate = true, updateChecking = false, cntDelayMs = 0, cntDelayEnable = false, cntDelayCallBack = () => {}, cntDelayFollowCallBack = () => {}; const bodyElement = window.document.querySelector("html body"), cntTimeWidget = window.document.createElement("div"), cntStyle = window.document.createElement("style"), currentVersion = "2024.05.19.15.49", windowSize = { width: window.innerWidth, height: window.innerHeight, }, cntTimeOnWindowSize = { width: 1, height: 1, }, updateSeconds = Object.freeze({ size: (clockWidth, clockHeight) => { let w1 = clockWidth - 1, h10d5 = clockHeight - 9, h0d4 = clockHeight - 4.6, w0d4 = clockWidth - 4.6, h1 = clockHeight - 1, w10d5 = clockWidth - 9; window.document .querySelectorAll( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntSecondsProgress svg path" ) .forEach((c) => { c.setAttribute( "d", `M 1 9 C 1 4.6 4.6 1 9 1 H ${w10d5} C ${ clockWidth - 4.6 } 1 ${w1} 4.6 ${w1} 9 V ${h10d5} C ${w1} ${h0d4} ${w0d4} ${h1} ${w10d5} ${h1} H 9 C 4.6 ${h1} 1 ${h0d4} 1 ${h10d5} Z` ); }); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntSecondsProgress svg" ) .setAttribute("width", clockWidth); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntSecondsProgress svg" ) .setAttribute("height", clockHeight); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntSecondsProgress svg" ) .setAttribute("viewbox", `0 0 ${clockWidth} ${clockHeight}`); window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntSecondsProgress svg path + path" ).style.strokeDasharray = `${window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntSecondsProgress svg path + path" ) .getTotalLength()}px`; }, seconds: (s) => { window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntSecondsProgress svg path + path" ).style.strokeDashoffset = `${ (1 - s) * window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntSecondsProgress svg path + path" ) .getTotalLength() }px`; }, }), getViTriWidget = (wWidth, wHeight) => { if ( (cntTimeWidget.getBoundingClientRect().left + cntTimeWidget.getBoundingClientRect().width / 2) / wWidth < 0.5 ) { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .removeAttribute("cntright"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .setAttribute("cntleft", ""); } else { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .removeAttribute("cntleft"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .setAttribute("cntright", ""); } if ( (cntTimeWidget.getBoundingClientRect().top + cntTimeWidget.getBoundingClientRect().height / 2) / wHeight < 0.5 ) { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .removeAttribute("cntbottom"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .setAttribute("cnttop", ""); } else { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .removeAttribute("cnttop"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .setAttribute("cntbottom", ""); } }, fr = 10, cntDelay = () => { cntDelayFollowCallBack(); if (cntDelayMs < Date.now()) { cntDelayCallBack(); cntDelayEnable = false; } }, updateTimeWithFPS = () => { time = new Date(); if (cfr > fr) { cfr = 0; seconds = time.getSeconds(); if (seconds != oldSeconds) { oldSeconds = seconds; minutes = time.getMinutes(); if (minutes != oldMinutes) { oldMinutes = minutes; hours = time.getHours(); if (hours != oldHours) { oldHours = hours; if (hour12) { if (hours <= 12) window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntHours" ).innerHTML = hours; else window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntHours" ).innerHTML = hours - 12; } else window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntHours" ).innerHTML = hours; if (autoCheckUpdate && !updateChecking) checkForUpdate(); } if (minutes < 10) window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntMinutes" ).innerHTML = `0${minutes}`; else window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntMinutes" ).innerHTML = minutes; if (showAMPM && hour12) { if (hours * 60 + minutes < 720) window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntAmPm" ).innerHTML = " AM"; else window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntAmPm" ).innerHTML = " PM"; } } if (!secondsHided) { if (seconds < 10) window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntSeconds" ).innerHTML = `:0${seconds}`; else window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntSeconds" ).innerHTML = `:${seconds}`; } if (!smoothSeconds) updateSeconds.seconds(time.getSeconds() / 60); updateSeconds.size( window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().width, window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().height ); } } else ++cfr; if (smoothSeconds) updateSeconds.seconds( (time.getSeconds() + time.getMilliseconds() / 999) / 60 ); if (cntDelayEnable) cntDelay(); window.requestAnimationFrame(updateTimeWithFPS); }, cntUserData = Object.freeze({ write: (key, value) => { window.localStorage.setItem(`${key}`, `${value}`); }, read: (key) => { return window.localStorage.getItem(`${key}`); }, remove: (key) => { window.localStorage.removeItem(`${key}`); }, }), setViTriWidget = (w, h) => { if (h < 0.5) { cntTimeWidget.style.bottom = "auto"; if ( h < cntTimeWidget.getBoundingClientRect().height / windowSize.height ) cntTimeWidget.style.top = "0"; else cntTimeWidget.style.top = `${ windowSize.height * h - cntTimeWidget.getBoundingClientRect().height / 2 }px`; } else { cntTimeWidget.style.top = "auto"; if ( h > 1 - cntTimeWidget.getBoundingClientRect().height / windowSize.height ) cntTimeWidget.style.bottom = "0"; else cntTimeWidget.style.bottom = `${ windowSize.height * (1 - h) - cntTimeWidget.getBoundingClientRect().height / 2 }px`; } if (w < 0.5) { cntTimeWidget.style.right = "auto"; if ( w < cntTimeWidget.getBoundingClientRect().width / windowSize.width ) cntTimeWidget.style.left = "0"; else cntTimeWidget.style.left = `${ windowSize.width * w - cntTimeWidget.getBoundingClientRect().width / 2 }px`; } else { cntTimeWidget.style.left = "auto"; if ( w > 1 - cntTimeWidget.getBoundingClientRect().width / windowSize.width ) cntTimeWidget.style.right = "0"; else cntTimeWidget.style.right = `${ windowSize.width * (1 - w) - cntTimeWidget.getBoundingClientRect().width / 2 }px`; } }, mouseMoveOnDocumentEvent = (e) => { if (widgetMove) { cntTimeOnWindowSize.width = e.clientX / windowSize.width; cntTimeOnWindowSize.height = e.clientY / windowSize.height; setViTriWidget(cntTimeOnWindowSize.width, cntTimeOnWindowSize.height); } }, blockHoverDoubleClick = (e) => { if (widgetMove) { e.preventDefault(); widgetMove = false; getViTriWidget(windowSize.width, windowSize.height); cntUserData.write("cntWidgetWidth", cntTimeOnWindowSize.width); cntUserData.write("cntWidgetHeight", cntTimeOnWindowSize.height); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntBlockHover" ) .removeAttribute("active"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntMoveButton" ) .removeEventListener("click", cntMoveButtonClicked); window.document.removeEventListener( "mousemove", mouseMoveOnDocumentEvent ); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu" ) .removeAttribute("active"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntMoveButton" ) .removeEventListener("click", cntMoveButtonClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown span" ) .removeEventListener("click", cntSecondDropdownClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntShowSecondsSwitch" ) .removeEventListener("click", cntShowSecondsClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntSmoothSecondsSwitch" ) .removeEventListener("click", cntSmoothSecondsClicked); if ( window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul" ).attributes.length == 1 ) cntSecondDropdownClicked(); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.hour12Switch" ) .removeEventListener("click", hour12SwitchClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntShowAMPMSwitch.cntSwitch" ) .removeEventListener("click", showAMPMClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntAutoUpdateSwitch.cntSwitch" ) .removeEventListener("click", autoUpdateSwitchClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li > span.cntUpdate + ul li > span" ) .removeEventListener("click", checkUpdateClicked); } }, cntMoveButtonClicked = () => { widgetMove = true; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu" ) .removeAttribute("active"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntBlockHover" ) .setAttribute("active", ""); menuActive = false; window.document.addEventListener("mousemove", mouseMoveOnDocumentEvent); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntBlockHover" ) .addEventListener("dblclick", blockHoverDoubleClick, { once: true }); }, cntShowSecondsClicked = () => { if (!secondsHided) { cntUserData.write("cntHideSeconds", "1"); window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntSeconds" ).style.display = "none"; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntShowSecondsSwitch" ) .removeAttribute("active"); } else { cntUserData.write("cntHideSeconds", "0"); window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntSeconds" ).style.display = "inline"; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntShowSecondsSwitch" ) .setAttribute("active", ""); } updateSeconds.size( window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().width, window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().height ); secondsHided = !secondsHided; }, cntSmoothSecondsClicked = () => { if (smoothSeconds) { smoothSeconds = false; cntUserData.write("cntSmoothSeconds", "0"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntSmoothSecondsSwitch" ) .removeAttribute("active"); } else { smoothSeconds = true; cntUserData.write("cntSmoothSeconds", "1"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntSmoothSecondsSwitch" ) .setAttribute("active", ""); } }, cntSecondDropdownClicked = () => { if ( window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul" ).attributes.length == 1 ) { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul" ) .removeAttribute("active"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntShowSecondsSwitch" ) .removeEventListener("click", cntShowSecondsClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntSmoothSecondsSwitch" ) .removeEventListener("click", cntSmoothSecondsClicked); } else { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul" ) .setAttribute("active", ""); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntShowSecondsSwitch" ) .addEventListener("click", cntShowSecondsClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntSmoothSecondsSwitch" ) .addEventListener("click", cntSmoothSecondsClicked); } }, showAMPMClicked = () => { if (showAMPM) { showAMPM = false; cntUserData.write("cntShowAMPM", "0"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntShowAMPMSwitch.cntSwitch" ) .removeAttribute("active"); window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntAmPm" ).style.display = "none"; } else { showAMPM = true; cntUserData.write("cntShowAMPM", "1"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntShowAMPMSwitch.cntSwitch" ) .setAttribute("active", ""); window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntAmPm" ).style.display = "inline"; if (hours * 60 + minutes < 720) window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntAmPm" ).innerHTML = " AM"; else window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntAmPm" ).innerHTML = " PM"; } updateSeconds.size( window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().width, window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().height ); }, hour12SwitchClicked = () => { if (hour12) { hour12 = false; cntUserData.write("cnt12Hour", "0"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.hour12Switch" ) .removeAttribute("active"); window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntHours" ).innerHTML = hours; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntShowAMPM ul" ) .removeAttribute("active"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntShowAMPMSwitch.cntSwitch" ) .removeEventListener("click", showAMPMClicked); if (!showAMPM) showAMPM = !showAMPM; showAMPMClicked(); } else { hour12 = true; cntUserData.write("cnt12Hour", "1"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.hour12Switch" ) .setAttribute("active", ""); if (hours <= 12) window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntHours" ).innerHTML = hours; else window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntHours" ).innerHTML = hours - 12; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntShowAMPM ul" ) .setAttribute("active", ""); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntShowAMPMSwitch.cntSwitch" ) .addEventListener("click", showAMPMClicked); if (showAMPM) { showAMPM = !showAMPM; showAMPMClicked(); } } updateSeconds.size( window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().width, window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().height ); }, checkForUpdate = async () => { const data = await fetch( "https://raw.githubusercontent.com/chuanghiten/CNT-User-Script/main/cntDigitalClockWidget/version.json" ) .then((v) => { if (v.status == 200 || v.status == 304) return v.json(); else return false; }) .catch((e) => { console.log(e); return false; }); // console.log(data.version); if (data) { const currentVersionArray = currentVersion.split("."), newVersionArray = data.version.split("."); const updateStatus = currentVersionArray.every((c, i) => { if (c < newVersionArray[i]) { window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus" ).innerHTML = '<span><a href="https:/' + '/raw.githubusercontent.com/chuanghiten/CNT-User-Script/main/cntDigitalClockWidget/script.user.js">A new update is available. Check it now !!!</a></span><span title="Close" style="margin-left: 50px;">[ <span style="color: #f94b53; cursor: pointer;">X</span> ]</span>'; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus" ) .setAttribute("active", ""); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus span + span span" ) .addEventListener( "click", () => { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus" ) .removeAttribute("active"); }, { once: true, } ); return false; } else return true; }); if (updateStatus) { let dl = 10000; window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus" ).innerHTML = '<div>No updates available!<div style="width: 100%; height: 1px; background: #fff; transform-origin: 0 0; margin-top: 2px"></div></div>'; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus" ) .setAttribute("active", ""); cntDelayMs = Date.now() + dl; cntDelayCallBack = () => { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus" ) .removeAttribute("active"); }; cntDelayFollowCallBack = () => { let progress = cntDelayMs - Date.now(); window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus div div" ).style.transform = `scaleX(${progress / dl})`; if (progress < dl / 3) window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus div div" ).style.background = "#f94b53"; }; cntDelayEnable = true; } } else { let dl = 10000; window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus" ).innerHTML = '<div><a href="https:/' + '/raw.githubusercontent.com/chuanghiten/CNT-User-Script/main/cntDigitalClockWidget/script.user.js" style="display: inline; color: #f94b53; font-weight: bold">Update check failed! Check manually now.</a><div style="width: 100%; height: 1px; background: #fff; transform-origin: 0 0; margin-top: 2px"></div></div>'; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus" ) .setAttribute("active", ""); cntDelayMs = Date.now() + dl; cntDelayCallBack = () => { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus" ) .removeAttribute("active"); }; cntDelayFollowCallBack = () => { let progress = cntDelayMs - Date.now(); window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus div div" ).style.transform = `scaleX(${progress / dl})`; if (progress < dl / 3) window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus div div" ).style.background = "#f94b53"; }; cntDelayEnable = true; } updateChecking = false; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li > span.cntUpdate + ul li span span + span" ) .removeAttribute("active"); }, checkUpdateClicked = () => { if (!updateChecking) { updateChecking = true; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li > span.cntUpdate + ul li span span + span" ) .setAttribute("active", ""); checkForUpdate(); } }, autoUpdateSwitchClicked = () => { if (autoCheckUpdate) { autoCheckUpdate = false; cntUserData.write("cntAutoCheckUpdate", "0"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntAutoUpdateSwitch.cntSwitch" ) .removeAttribute("active"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span.cntUpdate + ul" ) .setAttribute("active", ""); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li > span.cntUpdate + ul li > span" ) .addEventListener("click", checkUpdateClicked); } else { autoCheckUpdate = true; cntUserData.write("cntAutoCheckUpdate", "1"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntAutoUpdateSwitch.cntSwitch" ) .setAttribute("active", ""); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span.cntUpdate + ul" ) .removeAttribute("active"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li > span.cntUpdate + ul li > span" ) .removeEventListener("click", checkUpdateClicked); } }, cntButtonMenuClicked = () => { if (!menuActive) { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu" ) .setAttribute("active", ""); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntMoveButton" ) .addEventListener("click", cntMoveButtonClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown span" ) .addEventListener("click", cntSecondDropdownClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.hour12Switch" ) .addEventListener("click", hour12SwitchClicked); if (hour12) window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntShowAMPMSwitch.cntSwitch" ) .addEventListener("click", showAMPMClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntAutoUpdateSwitch.cntSwitch" ) .addEventListener("click", autoUpdateSwitchClicked); if (!autoCheckUpdate) window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li > span.cntUpdate + ul li > span" ) .addEventListener("click", checkUpdateClicked); } else { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu" ) .removeAttribute("active"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntMoveButton" ) .removeEventListener("click", cntMoveButtonClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown span" ) .removeEventListener("click", cntSecondDropdownClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntShowSecondsSwitch" ) .removeEventListener("click", cntShowSecondsClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntSmoothSecondsSwitch" ) .removeEventListener("click", cntSmoothSecondsClicked); if ( window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul" ).attributes.length == 1 ) cntSecondDropdownClicked(); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.hour12Switch" ) .removeEventListener("click", hour12SwitchClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntShowAMPMSwitch.cntSwitch" ) .removeEventListener("click", showAMPMClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntAutoUpdateSwitch.cntSwitch" ) .removeEventListener("click", autoUpdateSwitchClicked); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li > span.cntUpdate + ul li > span" ) .removeEventListener("click", checkUpdateClicked); } menuActive = !menuActive; }, mouseEnterCntClock = () => { updateSeconds.size( window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().width, window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().height ); updateSeconds.seconds( (time.getSeconds() + time.getMilliseconds() / 999) / 60 ); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .addEventListener("mouseleave", mouseLeaveCntClock, { once: true }); window.document .querySelectorAll( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntButtonMenu" ) .forEach((c) => { c.addEventListener("click", cntButtonMenuClicked); }); }, mouseLeaveCntClock = () => { updateSeconds.size( window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().width, window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().height ); updateSeconds.seconds( (time.getSeconds() + time.getMilliseconds() / 999) / 60 ); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .addEventListener("mouseenter", mouseEnterCntClock, { once: true }); window.document .querySelectorAll( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntButtonMenu" ) .forEach((c) => { c.removeEventListener("click", cntButtonMenuClicked); }); }; cntTimeWidget.setAttribute("class", "Chua Nghi Ten Digital Clock Widget"); cntStyle.innerHTML = '@keyframes scaleOut {0%, 12.5%, 50%, 62.5%, 100% {opacity: .25} 25%, 37.5%, 75%, 87.5% {opacity: 1}} html body .Chua.Nghi.Ten.Digital.Clock.Widget, html body .Chua.Nghi.Ten.Digital.Clock.Widget * {margin: 0; padding: 0; border: 0; box-sizing: border-box; position: relative; display: block; font-family: Roboto, Arial, sans-serif; font-size: 16px; line-height: 19px; user-select: none; white-space: nowrap} html body .Chua.Nghi.Ten.Digital.Clock.Widget span {display: inline} html body .Chua.Nghi.Ten.Digital.Clock.Widget a {color: #fff; text-decoration: none} html body .Chua.Nghi.Ten.Digital.Clock.Widget {position: fixed; padding: 10px; z-index: 2147483647} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock {background: #0009; color: #fff; border-radius: 10px; padding: 6px 10px; box-shadow: 0 0 15px 0 #00000044; min-width: 20px; min-height: 20px; backdrop-filter: blur(5px)} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntButtonMenu {display: none} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntButtonMenu span {cursor: pointer} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock[cntright]:hover .cntleftButtonMenu {display: inline} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock[cntleft]:hover .cntrightButtonMenu {display: inline} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntSecondsProgress {position: absolute; top: 0; left: 0; width: 100%; height: 100%} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntSecondsProgress svg {width: 100%; height: 100%} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntSecondsProgress svg path {fill: #0000; stroke-width: 2px; stroke: #fff} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntSecondsProgress svg path:first-child {stroke: #fff3} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu, html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus {position: absolute; background: #0009; border-radius: 10px; box-shadow: 0 0 15px 0 #00000044; backdrop-filter: blur(5px); border: 2px solid #fff; padding: 6px 10px; color: #fff; display: none} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu[active], html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntNotiStatus[active] {display: flex} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock[cntleft] + .cntNotiStatus + .cntMenu[active], html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock[cntleft] + .cntNotiStatus[active] {left: 10px} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock[cntright] + .cntNotiStatus + .cntMenu[active], html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock[cntright] + .cntNotiStatus[active] {right: 10px} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock[cntbottom] + .cntNotiStatus[active], html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock[cntbottom] + .cntNotiStatus + .cntMenu[active] {bottom: 100%} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock[cnttop] + .cntNotiStatus[active], html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock[cnttop] + .cntNotiStatus + .cntMenu[active] {top: 100%} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock[cntbottom] + .cntNotiStatus[active] + .cntMenu[active] {bottom: 200%} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock[cnttop] + .cntNotiStatus[active] + .cntMenu[active] {top: 200%} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li {cursor: pointer; border-bottom: 1px solid #fff; padding-bottom: 5px; margin-bottom: 5px} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li:hover {background: #fff2} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li:last-child {border: 0; padding: 0; margin: 0} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntBlockHover {width: 100%; height: 100%; position: absolute; top: 0; left: 0; display: none} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntBlockHover[active] {display: block; cursor: all-scroll} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText {white-space: nowrap} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li ul {margin: 5px 0 5px 20px; display: none} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li ul[active] {display: block} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li > span {display: flex; justify-content: space-between} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li > span > span + span {margin-left: 50px} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntSwitch, html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntSwitch {width: 35px; height: 20px; border: 2px solid #fff; border-radius: 10px; display: flex; justify-content: flex-start} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntSwitch[active], html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntSwitch[active] {justify-content: flex-end} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntSwitch:before, html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntSwitch:before {content: ""; display: block; position: relative; width: 12px; height: 12px; border-radius: 50%; background: #fff; margin: 2px} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li > span.cntUpdate + ul li span span + span span {display: none} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu[active] ul li > span.cntUpdate + ul[active] li span span + span[active] span {display: inline; animation: scaleOut 1.5s linear .1s infinite} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu[active] ul li > span.cntUpdate + ul[active] li span span + span[active] span:last-child {animation-delay: .2s} html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu[active] ul li > span.cntUpdate + ul[active] li span span + span[active] span:first-child {animation-delay: 0s}'; cntTimeWidget.innerHTML = '<div class="cntClock" cntleft cntright><div class="cntSecondsProgress"><svg><path stroke-linecap="round" stroke-linejoin="round"></path><path stroke-linecap="round" stroke-linejoin="round"></path></svg></div><span class="cntleftButtonMenu cntButtonMenu"><span title="Open or Close settings">•••</span> | </span><span class="cntClockText"><span class="cntHours">88</span>:<span class="cntMinutes">88</span><span class="cntSeconds">:88</span><span class="cntAmPm"></span></span><span class="cntrightButtonMenu cntButtonMenu"> | <span title="Open or Close settings">•••</span></span></div><div class="cntNotiStatus"></div><div class="cntMenu"><ul><li class="cntMoveButton" title="Move to...">Move</li><li class="cntSecondsDropdown"><span><span title="Seconds settings">Seconds</span><span title="Expand / Collapse">•••</span></span><ul><li><span><span>Show Seconds</span><span class="cntShowSecondsSwitch cntSwitch" title="Disable / Enable"></span></span></li><li><span><span>Smooth Seconds Progress Bar</span><span class="cntSmoothSecondsSwitch cntSwitch" title="Disable / Enable"></span></span></li></ul></li><li class="cntShowAMPM"><span><span>12 - Hour time</span><span class="hour12Switch cntSwitch" title="Disable / Enable"></span></span><ul><li><span><span>Show AM / PM</span><span class="cntShowAMPMSwitch cntSwitch" title="Disable / Enable"></span></span></li></ul></li><li><span class="cntUpdate"><span>Auto check update</span><span class="cntAutoUpdateSwitch cntSwitch" title="Disable / Enable"></span></span><ul><li><span><span>Check for Update</span><span><span>•</span><span>•</span><span>•</span></span></span></span></li></ul></li></ul></div><div class="cntBlockHover" title="Double click to set and exit"></div>'; bodyElement.appendChild(cntTimeWidget); window.document.querySelector("html").appendChild(cntStyle); updateSeconds.size( window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().width, window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock" ) .getBoundingClientRect().height ); window.document .querySelector("html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock") .addEventListener("mouseenter", mouseEnterCntClock, { once: true }); window.document .querySelector("html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock") .addEventListener("mouseleave", mouseLeaveCntClock, { once: true }); if (cntUserData.read("cntHideSeconds") != null) secondsHided = Number(cntUserData.read("cntHideSeconds")); if (cntUserData.read("cntSmoothSeconds") != null) smoothSeconds = Number(cntUserData.read("cntSmoothSeconds")); if (smoothSeconds) window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntSmoothSecondsSwitch" ) .setAttribute("active", ""); if (cntUserData.read("cnt12Hour") != null) hour12 = Number(cntUserData.read("cnt12Hour")); if (hour12) { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.hour12Switch" ) .setAttribute("active", ""); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntShowAMPM ul" ) .setAttribute("active", ""); } if (secondsHided) { window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntSeconds" ).style.display = "none"; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntShowSecondsSwitch" ) .removeAttribute("active"); } else window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li.cntSecondsDropdown ul li span span.cntShowSecondsSwitch" ) .setAttribute("active", ""); if (cntUserData.read("cntShowAMPM") != null) showAMPM = Number(cntUserData.read("cntShowAMPM")); window.requestAnimationFrame(updateTimeWithFPS); if (showAMPM) { if (hours * 60 + minutes < 720) window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntAmPm" ).innerHTML = " AM"; else window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntAmPm" ).innerHTML = " PM"; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntShowAMPMSwitch.cntSwitch" ) .setAttribute("active", ""); } else { window.document.querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntClock .cntClockText .cntAmPm" ).style.display = "none"; window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntShowAMPMSwitch.cntSwitch" ) .removeAttribute("active"); } if (cntUserData.read("cntWidgetWidth") != null) cntTimeOnWindowSize.width = Number(cntUserData.read("cntWidgetWidth")); if (cntUserData.read("cntWidgetHeight") != null) cntTimeOnWindowSize.height = Number(cntUserData.read("cntWidgetHeight")); if (cntUserData.read("cntAutoCheckUpdate") != null) autoCheckUpdate = Number(cntUserData.read("cntAutoCheckUpdate")); if (autoCheckUpdate) { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntAutoUpdateSwitch.cntSwitch" ) .setAttribute("active", ""); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span.cntUpdate + ul" ) .removeAttribute("active"); } else { window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span span.cntAutoUpdateSwitch.cntSwitch" ) .removeAttribute("active"); window.document .querySelector( "html body .Chua.Nghi.Ten.Digital.Clock.Widget .cntMenu ul li span.cntUpdate + ul" ) .setAttribute("active", ""); } setViTriWidget(cntTimeOnWindowSize.width, cntTimeOnWindowSize.height); getViTriWidget(windowSize.width, windowSize.height); if (autoCheckUpdate) { checkForUpdate(); updateChecking = true; } }); })();