NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name FastZone PlusPlus
// @namespace https://fastzone.org/?32535
// @version 20250215
// @description FastZone PlusPlus
// @author zach14c
// @match https://fastzone.org/forum.php?mod=forumdisplay&fid=*
// @match https://fastzone.org/forum.php?mod=viewthread&tid=*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @icon https://www.google.com/s2/favicons?sz=64&domain=fastzone.org
// @grant unsafeWindow
// @grant GM_setClipboard
// @grant GM_log
// @license AGPL-3.0-or-later
// ==/UserScript==
const currentUrl = window.location.href;
var topTbodyDisplay = 'none';
var topTbody = [];
var currMode = 1;
var overMainFrame;
var docTitle = "";
function cleanLayout(){
const url = new URL(currentUrl);
const id = url.searchParams.get('fid');
if(id){
var ruleDiv = document.getElementById("forum_rules_" + id);
if(ruleDiv){
$(ruleDiv).css('display','none');
}
}
var tbodys = document.getElementsByTagName('tbody');
for(let i=0; i < tbodys.length; i++){
var tbody = tbodys[i];
if(tbody && (tbody.id.startsWith('mb_data_') || tbody.id.startsWith('stickthread_'))){
$(tbody).css('display',topTbodyDisplay);
topTbody.push(tbody);
}
}
var $favs = $('.num > em');
$favs.each(function(){
var $em = $(this);
var html = $em.html();
var nums = html.match(/\d+/);
if(nums){
var numOfLovs = parseInt(nums[0]);
const topicThs = $em.parent().siblings('.common');
var bakColor = '';
if(numOfLovs>=200){
bakColor = '#c7005c';
}else if(numOfLovs>=100){
bakColor = 'rgb(0 60 199)';
}
if(topicThs.length > 0){
var $th = $(topicThs[0]);
$th.css('background','radial-gradient('+bakColor+', transparent)');
}
}
});
};
function addToolButton(){
var $switchButton = $('<a>', {
class: 'menu-btn showmenu xi2', text: '切換3個月',
href: '#',
click: function(event){
event.preventDefault();
navigateTo30DaysThreads();
}
});
var $toggleButton = $('<a>', {
class: 'menu-btn showmenu xi2', text: '切換置頂',
href: '#',
click: function(event){
event.preventDefault();
toggleVisibleTbodys();
}
});
var $space1 = $('<span>', { id:'sp1', css:{'margin-right':'10px'} });
var $space2 = $('<span>', { id:'sp2', css:{'margin-right':'10px'} });
$('#filter_special').before($switchButton).before($space1);
if(topTbody.length > 0){
$switchButton.before($toggleButton).before($space2);
}
}
function navigateTo30DaysThreads(){
const switchUrl = currentUrl + "&orderby=dateline&filter=dateline&dateline=7948800";
window.location.href = switchUrl;
}
function toggleVisibleTbodys(){
if (topTbodyDisplay === "none"){
topTbodyDisplay = 'table-row-group';
} else {
topTbodyDisplay = 'none';
}
for(let i=0; i < topTbody.length; i++){
var tbody = topTbody[i];
$(tbody).css('display',topTbodyDisplay);
}
}
function createSearchMenu(){
const popupMenu = document.createElement('div');
popupMenu.id = "fastzonePlusMenu";
popupMenu.style.position = 'absolute';
popupMenu.style.background = '#000';
popupMenu.style.border = '1px solid #ccc';
popupMenu.style.padding = '5px';
popupMenu.style.display = 'none';
popupMenu.style.zIndex = '9999';
const copyClipboard = document.createElement('div');
copyClipboard.textContent = '複製';
copyClipboard.style.cursor = 'pointer';
copyClipboard.style.padding = '5px';
copyClipboard.style.borderBottom = '1px solid #ccc';
const googleSearch = document.createElement('div');
googleSearch.textContent = 'Google';
googleSearch.style.cursor = 'pointer';
googleSearch.style.padding = '5px';
googleSearch.style.borderBottom = '1px solid #ccc';
const gptSearch = document.createElement('div');
gptSearch.textContent = 'Chatgpt';
gptSearch.style.cursor = 'pointer';
gptSearch.style.padding = '5px';
gptSearch.style.borderBottom = '1px solid #ccc';
const youtubeSearch = document.createElement('div');
youtubeSearch.textContent = 'YouTube';
youtubeSearch.style.cursor = 'pointer';
youtubeSearch.style.padding = '5px';
popupMenu.appendChild(copyClipboard);
popupMenu.appendChild(googleSearch);
popupMenu.appendChild(gptSearch);
popupMenu.appendChild(youtubeSearch);
document.body.appendChild(popupMenu);
document.addEventListener('click', function(event) {
var popupMenu = document.getElementById("fastzonePlusMenu");
});
document.addEventListener('mouseup', function(event) {
const selectedText = window.getSelection().toString().trim();
if (selectedText.length > 0) {
popupMenu.style.left = event.pageX + 'px';
popupMenu.style.top = event.pageY + 'px';
popupMenu.style.display = 'block';
googleSearch.onclick = () => {
window.open("https://www.google.com/search?q=" + encodeURIComponent(selectedText), '_blank');
popupMenu.style.display = 'none';
};
youtubeSearch.onclick = () => {
window.open("https://www.youtube.com/results?search_query=" + encodeURIComponent(selectedText), '_blank');
popupMenu.style.display = 'none';
};
gptSearch.onclick = () => {
window.open("https://chatgpt.com/?q=" + encodeURIComponent(selectedText), '_blank');
popupMenu.style.display = 'none';
}
copyClipboard.onclick = () => {
GM_setClipboard(selectedText);
}
} else {
popupMenu.style.display = 'none';
}
});
}
function switchMainFrame(){
currMode = currMode*-1;
if(currMode == -1){
docTitle = document.title;
}
var displayCSS = currMode==-1?'block':'none';
var scrollCSS = currMode==-1?'hidden':'auto';
var dispTitle = currMode==-1?'無限討論區':docTitle;
if(overMainFrame){
overMainFrame.style.display = displayCSS;
} else {
overMainFrame = document.createElement('iframe');
overMainFrame.src = 'https://fastzone.org/';
overMainFrame.style.position = 'fixed';
overMainFrame.style.top = 0;
overMainFrame.style.left = 0;
overMainFrame.style.width = '100%';
overMainFrame.style.height = '100%';
overMainFrame.style.zIndex = 9999;
overMainFrame.style.border = 'none';
document.body.appendChild(overMainFrame);
overMainFrame.style.display = displayCSS;
}
document.body.style.overflowY = scrollCSS;
document.title = dispTitle;
}
(function() {
const url = new URL(currentUrl);
const mod = url.searchParams.get('mod');
window.addEventListener('load',function(){
if( mod === "forumdisplay" ){
cleanLayout();
addToolButton();
}
});
window.addEventListener('keydown',function(event){
if(event.key === 'Escape'){
switchMainFrame();
}
});
if ( mod === "viewthread" ){
createSearchMenu();
}
})();