/* eslint-disable no-multi-spaces */
// ==UserScript==
// @name Greasyfork 快捷编辑收藏
// @name:zh-CN Greasyfork 快捷编辑收藏
// @name:zh-TW Greasyfork 快捷編輯收藏
// @name:en Greasyfork script-set-edit button
// @name:en-US Greasyfork script-set-edit button
// @name:fr Greasyfork Set Edit+
// @namespace Greasyfork-Favorite
// @version 0.2.1
// @description 在GF脚本页添加快速打开收藏集编辑页面功能
// @description:zh-CN 在GF脚本页添加快速打开收藏集编辑页面功能
// @description:zh-TW 在GF腳本頁添加快速打開收藏集編輯頁面功能
// @description:en Add / Remove script into / from script set directly in GF script info page
// @description:en-US Add / Remove script into / from script set directly in GF script info page
// @description:fr Ajouter un script à un jeu de scripts / supprimer un script d'un jeu de scripts directement sur la page d'informations sur les scripts GF
// @author PY-DNG
// @license GPL-3
// @match http*://*.greasyfork.org/*
// @match http*://*.sleazyfork.org/*
// @require https://greasyfork.org/scripts/456034-basic-functions-for-userscripts/code/script.js?version=1226884
// @require https://greasyfork.org/scripts/460385-gm-web-hooks/code/script.js?version=1221394
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAbBJREFUOE+Vk7GKGlEUhr8pAiKKDlqpCDpLUCzWBxCENBa+hBsL9wHsLWxXG4tNtcGH0MIiWopY7JSGEUWsbESwUDMw4Z7siLsZDbnlPff/7n/+e67G38sA6sAXIPVWXgA/gCdgfinRPuhfCoXCw3Q65XA4eLBl6zvw1S2eAZqmvTqOc5/NZhkMBqRSKWzbvgYxgbwquoAX4MGyLHK5HIlEgtFo9C+IOFEAo1gsWsvlUmyPx2MymYxAhsMh6XT6lpM7BXjWdf1xNpuRz+fl8GQywTAMGo0G1WpVnJxOJ692vinADPgcDAaZz+cCOR6PmKZJPB4XUb/fp1wuewF+KoBCf1JVBVE5dDodms3mWdDtdqlUKl6AX+8ALmS9XgtM0/5kvNlspKX9fv8RIgBp4bISCoXo9XqsVitKpRK6rrPb7STQ7XZ7eVRaeAYerz14OBxGOfL7/eIgmUwKzHEcJZEQ1eha1wBqPxqNihufzyeQWCzmtiPPqJYM0jWIyiISibBYLAgEAtTrdVqt1nmQXN0rcH/LicqmVqvRbrdN27bfjbKru+nk7ZD3Z7q4+b++82/YPKIrXsKZ3AAAAABJRU5ErkJggg==
// @grant GM_xmlhttpRequest
// @grant GM_setValue
// @grant GM_getValue
// @downloadURL none
// ==/UserScript==
/* global LogLevel DoLog Err $ $All $CrE $AEL $$CrE addStyle detectDom destroyEvent copyProp copyProps parseArgs escJsStr replaceText getUrlArgv dl_browser dl_GM AsyncManager */
/* global GMXHRHook GMDLHook */
(function __MAIN__() {
'use strict';
const CONST = {
Text: {
'zh-CN': {
FavEdit: '收藏集:',
Add: '加入此集',
Remove: '移出此集',
Edit: '手动编辑',
EditIframe: '页内编辑',
CloseIframe: '关闭编辑',
CopySID: '复制脚本ID',
Working: ['工作中...', '就快好了...'],
InSetStatus: ['[ ]', '[✔]'],
Error: {
AlreadyExist: '脚本已经在此收藏集中了',
NotExist: '脚本不在此收藏集中',
Unknown: '未知错误'
}
},
'zh-TW': {
FavEdit: '收藏集:',
Add: '加入此集',
Remove: '移出此集',
Edit: '手動編輯',
EditIframe: '頁內編輯',
CloseIframe: '關閉編輯',
CopySID: '複製腳本ID',
Working: ['工作中...', '就快好了...'],
InSetStatus: ['[ ]', '[✔]'],
Error: {
AlreadyExist: '腳本已經在此收藏集中了',
NotExist: '腳本不在此收藏集中',
Unknown: '未知錯誤'
}
},
'en': {
FavEdit: 'Add to/Remove from favorite list: ',
Add: 'Add',
Remove: 'Remove',
Edit: 'Edit Manually',
EditIframe: 'In-Page Edit',
CloseIframe: 'Close Editor',
CopySID: 'Copy Script-ID',
Working: ['Working...', 'Just a moment...'],
InSetStatus: ['[ ]', '[✔]'],
Error: {
AlreadyExist: 'Script is already in set',
NotExist: 'Script is not in set yet',
Unknown: 'Unknown Error'
}
},
'default': {
FavEdit: 'Add to/Remove from favorite list: ',
Add: 'Add',
Remove: 'Remove',
Edit: 'Edit Manually',
EditIframe: 'In-Page Edit',
CloseIframe: 'Close Editor',
CopySID: 'Copy Script-ID',
Working: ['Working...', 'Just a moment...'],
InSetStatus: ['[ ]', '[✔]'],
Error: {
AlreadyExist: 'Script is already in set',
NotExist: 'Script is not in set yet',
Unknown: 'Unknown Error'
}
},
}
}
// Get i18n code
let i18n = $('#language-selector-locale') ? $('#language-selector-locale').value : navigator.language;
if (!Object.keys(CONST.Text).includes(i18n)) {i18n = 'default';}
main()
function main() {
const HOST = getHost();
const API = getAPI();
// Common actions
commons();
// API-based actions
switch(API[1]) {
case "scripts":
API[2] && centerScript(API);
break;
default:
DoLog('API is {}'.replace('{}', API));
}
}
function centerScript(API) {
switch(API[3]) {
case undefined:
pageScript();
break;
case 'code':
pageCode();
break;
case 'feedback':
pageFeedback();
break;
}
}
function commons() {
// Your common actions here...
GMXHRHook(5);
}
function pageScript() {
addFavPanel();
}
function pageCode() {
addFavPanel();
}
function pageFeedback() {
addFavPanel();
}
function addFavPanel() {
if (!getUserpage()) {return false;}
GUI();
function GUI() {
// Get elements
const script_after = $('#script-feedback-suggestion+*') || $('#new-script-discussion');
const script_parent = script_after.parentElement;
// My elements
const script_favorite = $CrE('div');
script_favorite.id = 'script-favorite';
script_favorite.style.margin = '0.75em 0';
script_favorite.innerHTML = CONST.Text[i18n].FavEdit;
const favorite_groups = $CrE('select');
favorite_groups.id = 'favorite-groups';
const stored_sets = GM_getValue('script-sets', {sets: []}).sets;
for (const set of stored_sets) {
// Make