From 71c588ee013e64c0baf588a4fb413d28f25e9efd Mon Sep 17 00:00:00 2001 From: Ryahn Date: Wed, 30 Apr 2025 22:02:18 +0000 Subject: [PATCH] Add F95Zone_TemplateMaker.userscript.js --- F95Zone_TemplateMaker.userscript.js | 1315 +++++++++++++++++++++++++++ 1 file changed, 1315 insertions(+) create mode 100644 F95Zone_TemplateMaker.userscript.js diff --git a/F95Zone_TemplateMaker.userscript.js b/F95Zone_TemplateMaker.userscript.js new file mode 100644 index 0000000..8d39d8a --- /dev/null +++ b/F95Zone_TemplateMaker.userscript.js @@ -0,0 +1,1315 @@ +// ==UserScript== +// @name F95 Template Maker +// @namespace https://f95zone.to +// @version 1.0 +// @description Creates a template for F95Zone +// @match https://*.f95zone.to/* +// @grant GM_setClipboard +// @author Ryahn +// @require https://cdn.jsdelivr.net/npm/choices.js/public/assets/scripts/choices.min.js +// @resource CHOICES_CSS https://cdn.jsdelivr.net/npm/choices.js/public/assets/styles/choices.min.css +// @grant GM_addStyle +// @grant GM_getResourceText +// ==/UserScript== + +(function() { + 'use strict'; + + const tags = { + technical: [ + '3D Game', '3DCG', '2D Game', + '2DCG', 'AI CG', 'Animated', + 'Censored', 'Character Creation', + 'Kinetic Novel', 'Japanese Game', + 'Male Porn', 'Male Protagonist', + 'Mobile Game', 'Female Protagonist', + 'Futa/Trans Protagonist', 'Multiple Protagonists', + 'Multiple Endings', 'Real Porn', 'Text Based', + 'Virtual Reality', 'Voiced' + ], + + sexual: [ + 'Anal Sex', + 'Ahegao', + 'Bdsm', + 'Bestiality', + 'Big Ass', + 'Big Tits', + 'Blackmail', + 'Bukkake', + 'Cheating', + 'Corruption', + 'Creampie', + 'Dilf', + 'Drugs', + 'Exhibitionism', + 'Female domination', + 'Footjob', + 'Furry', + 'Futa/Trans', + 'Gay', + 'Group sex', + 'Groping', + 'Handjob', + 'Harem', + 'Humiliation', + 'Incest', + 'Internal view', + 'Interracial', + 'Lactation', + 'Lesbian', + 'Loli', + 'Male Domination', + 'Masturbation', + 'Milf', + 'Multiple Penetration', + 'Necrophilia', + 'Netorare', + 'Oral Sex', + 'Pregnancy', + 'Prostitution', + 'Rape', + 'Scat', + 'Sex Toys', + 'Sexual Harassment', + 'Shota', + 'Sissification', + 'Slave', + 'Sleep Sex', + 'Spanking', + 'Stripping', + 'Swinging', + 'Tentacles', + 'Teasing', + 'Titfuck', + 'Transformation', + 'Trap', + 'Urination', + 'Vaginal sex', + 'Virgin', + 'Vore', + 'Voyeurism' + ], + + nosex: [ + 'Adventure', + 'Combat', + 'Cosplay', + 'Dating Sim', + 'Dystopian setting', + 'Fantasy', + 'Graphic violence', + 'Horror', + 'Humor', + 'Management', + 'Mind control', + 'Monster', + 'Monster Girl', + 'No Sexual Content', + 'Paranormal', + 'Parody', + 'Platformer', + 'Point & Click', + 'Possession', + 'PoV', + 'Puzzle', + 'Religion', + 'Romance', + 'Rpg', + 'Sandbox', + 'School setting', + 'Sci-fi', + 'Shooter', + 'Side-scroller', + 'Simulator', + 'Strategy', + 'Superpowers', + 'Trainer', + 'Turn based combat', + 'Twins' + ], + + other: [ + 'Asset-addon', + 'Asset-ai-shoujo', + 'Asset-animal', + 'Asset-animation', + 'Asset-audio', + 'Asset-bundle', + 'Asset-character', + 'Asset-clothing', + 'Asset-daz-gen1', + 'Asset-daz-gen2', + 'Asset-daz-gen3', + 'Asset-daz-gen8', + 'Asset-daz-gen81', + 'Asset-daz-gen9', + 'Asset-daz-m4', + 'Asset-daz-v4', + 'Asset-environment', + 'Asset-expression', + 'Asset-female', + 'Asset-hair', + 'Asset-hdri', + 'Asset-honey-select', + 'Asset-honey-select2', + 'Asset-koikatu', + 'Asset-light', + 'Asset-male', + 'Asset-morph', + 'Asset-nonbinary', + 'Asset-playclub', + 'Asset-plugin', + 'Asset-pose', + 'Asset-prop', + 'Asset-scene', + 'Asset-script', + 'Asset-shader', + 'Asset-texture', + 'Asset-utility', + 'Asset-vehicle' + ] + }; + + const operatingSystem = [ + 'Win', 'Linux', 'Mac', 'Android', 'iOS', 'All' + ]; + + const language = [ + 'English', 'Japanese', 'Chinese', 'Korean', 'Russian', 'Spanish', 'French', 'German', 'Italian', 'Portuguese', 'Turkish', 'Polish', 'Romanian', 'Dutch', 'Other' + ]; + + + + // Create and append the button immediately instead of waiting for DOMContentLoaded + const button = document.createElement("button"); + button.textContent = "Template Maker"; + button.style.position = "fixed"; + button.style.top = "135px"; // Match ruleselect.js positioning + button.style.right = "10px"; + button.style.zIndex = "9999"; // Match ruleselect.js z-index + button.style.padding = "10px"; + button.style.backgroundColor = "#1e66a5"; + button.style.color = "#fff"; + button.style.border = "none"; + button.style.borderRadius = "5px"; // Match ruleselect.js border-radius + button.style.cursor = "pointer"; + + // Add button to page immediately + document.body.appendChild(button); + + let isPopupOpen = false; + let popup, overlay; + + // Add click handler + button.addEventListener("click", () => { + if (isPopupOpen) { + closePopup(); + } else { + createPopup(); + } + }); + + // Popup function + function createPopup() { + overlay = document.createElement("div"); + overlay.style.position = 'fixed'; + overlay.style.top = '0'; + overlay.style.left = '0'; + overlay.style.width = '100vw'; + overlay.style.height = '100vh'; + overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'; + overlay.style.zIndex = '9998'; + + popup = document.createElement("div"); + popup.style.position = "fixed"; + popup.style.top = "20%"; + popup.style.left = "50%"; + popup.style.transform = "translate(-50%, -20%)"; + popup.style.padding = "20px"; + popup.style.backgroundColor = "#333"; + popup.style.border = "1px solid #555"; + popup.style.borderRadius = "8px"; + popup.style.zIndex = "10000"; + popup.style.width = "100%"; + popup.style.color = "#fff"; + popup.style.boxShadow = "0px 4px 8px rgba(0, 0, 0, 0.2)"; + + // Create form container first + const formContainer = document.createElement("div"); + formContainer.id = "templateForm"; + + // Update form container styling + formContainer.style.display = "flex"; + formContainer.style.flexDirection = "column"; + formContainer.style.gap = "20px"; + formContainer.style.width = "100%"; + + // Create formContent container + const formContent = document.createElement("div"); + formContent.className = "form-content"; + formContent.style.display = "grid"; + formContent.style.gridTemplateColumns = "repeat(12, 1fr)"; + formContent.style.gap = "15px"; + formContent.style.padding = "20px"; + formContent.style.backgroundColor = "#242629"; + formContent.style.borderRadius = "8px"; + formContent.style.border = "1px solid #343638"; + formContent.style.maxHeight = "80vh"; + formContent.style.overflowY = "auto"; + + // Update section styling + const sectionStyle = { + marginBottom: "30px", + gridColumn: "span 12", + display: "grid", + gap: "15px", + backgroundColor: "#242629", + padding: "20px", + borderRadius: "8px", + border: "1px solid #343638" + }; + + // Create sections container + const generalSection = document.createElement("div"); + Object.assign(generalSection.style, sectionStyle); + + // General Info Header + const generalInfoHeader = document.createElement("h4"); + createHeaderStyle(generalInfoHeader, "General Info"); + + const generalInfoDesc = document.createElement("p"); + createDescStyle(generalInfoDesc, "The important stuff"); + + // Add elements to general section + generalSection.appendChild(generalInfoHeader); + generalSection.appendChild(generalInfoDesc); + + // Overview Field + const overviewCol = document.createElement("div"); + overviewCol.className = "col-xl-12"; + overviewCol.style.display = "flex"; + overviewCol.style.flexDirection = "column"; + overviewCol.style.gap = "10px"; + + const overviewLabel = document.createElement("label"); + overviewLabel.className = "form-label"; + overviewLabel.htmlFor = "overview"; + overviewLabel.textContent = "Overview"; + overviewLabel.style.color = "#fff"; + overviewLabel.style.marginBottom = "0"; + + const overviewInput = document.createElement("textarea"); + overviewInput.className = "form-control"; + overviewInput.id = "overview"; + overviewInput.name = "overview"; + overviewInput.rows = "3"; + overviewInput.placeholder = "Enter game overview"; + overviewInput.style.backgroundColor = "#242629"; + overviewInput.style.color = "#fff"; + overviewInput.style.border = "1px solid #343638"; + overviewInput.style.borderRadius = "4px"; + overviewInput.style.padding = "8px 12px"; + overviewInput.style.marginTop = "0"; + + overviewCol.appendChild(overviewLabel); + overviewCol.appendChild(overviewInput); + + // Thread Updated Date + const threadUpdatedCol = document.createElement("div"); + threadUpdatedCol.className = "col-xl-4"; + threadUpdatedCol.id = "thread_updatedShow"; + + const threadUpdatedGroup = document.createElement("div"); + threadUpdatedGroup.className = "mb-3"; + + const threadUpdatedLabel = document.createElement("label"); + threadUpdatedLabel.className = "form-label"; + threadUpdatedLabel.htmlFor = "thread_updated"; + threadUpdatedLabel.textContent = "Thread Updated"; + threadUpdatedLabel.style.color = "#fff"; + + const threadUpdatedInput = document.createElement("input"); + threadUpdatedInput.type = "text"; + threadUpdatedInput.className = "form-control"; + threadUpdatedInput.id = "thread_updated"; + threadUpdatedInput.name = "thread_updated"; + threadUpdatedInput.placeholder = "yyyy-mm-dd"; + threadUpdatedInput.style.backgroundColor = "#444"; + threadUpdatedInput.style.color = "#fff"; + threadUpdatedInput.style.border = "1px solid #555"; + + threadUpdatedGroup.appendChild(threadUpdatedLabel); + threadUpdatedGroup.appendChild(threadUpdatedInput); + threadUpdatedCol.appendChild(threadUpdatedGroup); + + // Release Date + const releaseDateCol = document.createElement("div"); + releaseDateCol.className = "col-xl-4"; + releaseDateCol.id = "releaseDateShow"; + + const releaseDateGroup = document.createElement("div"); + releaseDateGroup.className = "mb-3"; + + const releaseDateLabel = document.createElement("label"); + releaseDateLabel.className = "form-label"; + releaseDateLabel.textContent = "Release Date"; + releaseDateLabel.style.color = "#fff"; + + const releaseDateInput = document.createElement("input"); + releaseDateInput.type = "text"; + releaseDateInput.className = "form-control"; + releaseDateInput.id = "release_date"; + releaseDateInput.name = "release_date"; + releaseDateInput.placeholder = "yyyy-mm-dd"; + releaseDateInput.style.backgroundColor = "#444"; + releaseDateInput.style.color = "#fff"; + releaseDateInput.style.border = "1px solid #555"; + + releaseDateGroup.appendChild(releaseDateLabel); + releaseDateGroup.appendChild(releaseDateInput); + releaseDateCol.appendChild(releaseDateGroup); + + // Censorship Dropdown + const censorshipCol = document.createElement("div"); + censorshipCol.className = "col-xl-4"; + censorshipCol.id = "censorsipShow"; + + const censorshipGroup = document.createElement("div"); + censorshipGroup.className = "mb-3"; + + const censorshipLabel = document.createElement("label"); + censorshipLabel.className = "form-label"; + censorshipLabel.textContent = "Censorship"; + censorshipLabel.style.color = "#fff"; + + const censorshipSelect = document.createElement("select"); + censorshipSelect.className = "form-select"; + censorshipSelect.id = "censorsip"; + censorshipSelect.name = "censorship"; + censorshipSelect.style.backgroundColor = "#242629"; + censorshipSelect.style.color = "#fff"; + censorshipSelect.style.border = "1px solid #343638"; + censorshipSelect.style.width = "100%"; + censorshipSelect.style.padding = "8px 12px"; + censorshipSelect.style.borderRadius = "4px"; + + const censorshipOptions = [ + {value: "", text: ""}, + {value: "1", text: "Yes - Mosaics"}, + {value: "2", text: "Yes - Patch w/ Mosaics"}, + {value: "3", text: "Yes - Patch w/o Mosaics"}, + {value: "4", text: "No"}, + {value: "5", text: "No Sexual Content"} + ]; + + censorshipOptions.forEach(option => { + const optionElement = document.createElement("option"); + optionElement.value = option.value; + optionElement.textContent = option.text; + censorshipSelect.appendChild(optionElement); + }); + + censorshipGroup.appendChild(censorshipLabel); + censorshipGroup.appendChild(censorshipSelect); + censorshipCol.appendChild(censorshipGroup); + + // Genre Multiselect + const genreCol = document.createElement("div"); + genreCol.className = "col-xl-4"; + genreCol.id = "genreShow"; + + const genreGroup = document.createElement("div"); + genreGroup.className = "mb-3"; + + const genreLabel = document.createElement("label"); + genreLabel.className = "form-label"; + genreLabel.textContent = "Genre"; + genreLabel.style.color = "#fff"; + + const genreSelect = document.createElement("select"); + genreSelect.className = "form-select"; + genreSelect.id = "genre"; + genreSelect.name = "genre[]"; + genreSelect.multiple = true; + + // Add options from tags object + Object.entries(tags).forEach(([category, items]) => { + const group = document.createElement("optgroup"); + group.label = category.charAt(0).toUpperCase() + category.slice(1); + + items.forEach(item => { + const option = document.createElement("option"); + option.value = item; + option.textContent = item; + group.appendChild(option); + }); + + genreSelect.appendChild(group); + }); + + genreGroup.appendChild(genreLabel); + genreGroup.appendChild(genreSelect); + genreCol.appendChild(genreGroup); + + // Initialize Choices.js + new Choices(genreSelect, { + removeItemButton: true, + searchEnabled: true, + searchPlaceholderValue: "Search genres...", + placeholder: true, + placeholderValue: "Select genres", + classNames: { + containerOuter: 'choices', + containerInner: 'choices__inner', + input: 'choices__input', + inputCloned: 'choices__input--cloned', + list: 'choices__list', + listItems: 'choices__list--multiple', + listSingle: 'choices__list--single', + listDropdown: 'choices__list--dropdown', + item: 'choices__item', + itemSelectable: 'choices__item--selectable', + itemDisabled: 'choices__item--disabled', + itemChoice: 'choices__item--choice', + placeholder: 'choices__placeholder', + group: 'choices__group', + groupHeading: 'choices__heading', + button: 'choices__button', + } + }); + + // Game Name Field + const gameNameCol = document.createElement("div"); + gameNameCol.className = "col-xl-12"; + + const gameNameGroup = document.createElement("div"); + gameNameGroup.className = "form-group mb-3"; + + const gameNameLabel = document.createElement("label"); + gameNameLabel.className = "form-label"; + gameNameLabel.htmlFor = "game_name"; + gameNameLabel.textContent = "Game Name"; + gameNameLabel.style.color = "#fff"; + + const gameNameInput = document.createElement("input"); + gameNameInput.type = "text"; + gameNameInput.className = "form-control"; + gameNameInput.id = "game_name"; + gameNameInput.name = "game_name"; + gameNameInput.style.backgroundColor = "#444"; + gameNameInput.style.color = "#fff"; + gameNameInput.style.border = "1px solid #555"; + + gameNameGroup.appendChild(gameNameLabel); + gameNameGroup.appendChild(gameNameInput); + gameNameCol.appendChild(gameNameGroup); + + // Developer Name Field + const devCol = document.createElement("div"); + devCol.className = "col-xl-6"; + + const devGroup = document.createElement("div"); + devGroup.className = "form-group mb-3"; + + const devLabel = document.createElement("label"); + devLabel.className = "form-label"; + devLabel.htmlFor = "devName"; + devLabel.textContent = "Developer Name"; + devLabel.style.color = "#fff"; + + const devInput = document.createElement("input"); + devInput.type = "text"; + devInput.className = "form-control"; + devInput.id = "devName"; + devInput.name = "devName"; + devInput.style.backgroundColor = "#444"; + devInput.style.color = "#fff"; + devInput.style.border = "1px solid #555"; + + devGroup.appendChild(devLabel); + devGroup.appendChild(devInput); + devCol.appendChild(devGroup); + + // Version Field + const versionCol = document.createElement("div"); + versionCol.className = "col-xl-6"; + versionCol.id = "versionShow"; + + const versionGroup = document.createElement("div"); + versionGroup.className = "form-group mb-3"; + + const versionLabel = document.createElement("label"); + versionLabel.className = "form-label"; + versionLabel.htmlFor = "version"; + versionLabel.textContent = "Version"; + versionLabel.style.color = "#fff"; + + const versionInput = document.createElement("input"); + versionInput.type = "text"; + versionInput.className = "form-control"; + versionInput.id = "version"; + versionInput.name = "version"; + versionInput.style.backgroundColor = "#444"; + versionInput.style.color = "#fff"; + versionInput.style.border = "1px solid #555"; + + versionGroup.appendChild(versionLabel); + versionGroup.appendChild(versionInput); + versionCol.appendChild(versionGroup); + + // Dev Links Field + const devLinksCol = document.createElement("div"); + devLinksCol.className = "col-xl-6"; + + const devLinksGroup = document.createElement("div"); + devLinksGroup.className = "form-group mb-3"; + + const devLinksLabel = document.createElement("label"); + devLinksLabel.className = "form-label"; + devLinksLabel.htmlFor = "devLinks"; + devLinksLabel.textContent = "Dev Links"; + devLinksLabel.style.color = "#fff"; + + const devLinksInput = document.createElement("input"); + devLinksInput.type = "text"; + devLinksInput.className = "form-control"; + devLinksInput.id = "devLinks"; + devLinksInput.name = "devLinks"; + devLinksInput.style.backgroundColor = "#444"; + devLinksInput.style.color = "#fff"; + devLinksInput.style.border = "1px solid #555"; + + const devLinksHelp = document.createElement("small"); + devLinksHelp.className = "form-text text-muted"; + devLinksHelp.innerHTML = 'Format: SiteName|url,Sitename|url'; + + devLinksGroup.appendChild(devLinksLabel); + devLinksGroup.appendChild(devLinksInput); + devLinksGroup.appendChild(devLinksHelp); + devLinksCol.appendChild(devLinksGroup); + + // Translator Field + const translatorCol = document.createElement("div"); + translatorCol.className = "col-xl-6"; + + const translatorGroup = document.createElement("div"); + translatorGroup.className = "form-group mb-3"; + + const translatorLabel = document.createElement("label"); + translatorLabel.className = "form-label"; + translatorLabel.htmlFor = "translator"; + translatorLabel.textContent = "Translator"; + translatorLabel.style.color = "#fff"; + + const translatorInput = document.createElement("input"); + translatorInput.type = "text"; + translatorInput.className = "form-control"; + translatorInput.id = "translator"; + translatorInput.name = "translator"; + translatorInput.style.backgroundColor = "#444"; + translatorInput.style.color = "#fff"; + translatorInput.style.border = "1px solid #555"; + + const translatorHelp = document.createElement("small"); + translatorHelp.className = "form-text text-muted"; + translatorHelp.innerHTML = 'Name of translator'; + + translatorGroup.appendChild(translatorLabel); + translatorGroup.appendChild(translatorInput); + translatorGroup.appendChild(translatorHelp); + translatorCol.appendChild(translatorGroup); + + // Translator Links Field + const translatorLinksCol = document.createElement("div"); + translatorLinksCol.className = "col-xl-6"; + + const translatorLinksGroup = document.createElement("div"); + translatorLinksGroup.className = "form-group mb-3"; + + const translatorLinksLabel = document.createElement("label"); + translatorLinksLabel.className = "form-label"; + translatorLinksLabel.htmlFor = "translatorLinks"; + translatorLinksLabel.textContent = "Translator Links"; + translatorLinksLabel.style.color = "#fff"; + + const translatorLinksInput = document.createElement("input"); + translatorLinksInput.type = "text"; + translatorLinksInput.className = "form-control"; + translatorLinksInput.id = "translatorLinks"; + translatorLinksInput.name = "translatorLinks"; + translatorLinksInput.style.backgroundColor = "#444"; + translatorLinksInput.style.color = "#fff"; + translatorLinksInput.style.border = "1px solid #555"; + + const translatorLinksHelp = document.createElement("small"); + translatorLinksHelp.className = "form-text text-muted"; + translatorLinksHelp.innerHTML = 'Format: SiteName|url,Sitename|url'; + + translatorLinksGroup.appendChild(translatorLinksLabel); + translatorLinksGroup.appendChild(translatorLinksInput); + translatorLinksGroup.appendChild(translatorLinksHelp); + translatorLinksCol.appendChild(translatorLinksGroup); + + // Store Links Field + const storeCol = document.createElement("div"); + storeCol.className = "col-xl-6"; + + const storeGroup = document.createElement("div"); + storeGroup.className = "form-group mb-3"; + + const storeLabel = document.createElement("label"); + storeLabel.className = "form-label"; + storeLabel.htmlFor = "store"; + storeLabel.textContent = "Store Links"; + storeLabel.style.color = "#fff"; + + const storeInput = document.createElement("input"); + storeInput.type = "text"; + storeInput.className = "form-control"; + storeInput.id = "store"; + storeInput.name = "store"; + storeInput.style.backgroundColor = "#444"; + storeInput.style.color = "#fff"; + storeInput.style.border = "1px solid #555"; + + const storeHelp = document.createElement("small"); + storeHelp.className = "form-text text-muted"; + storeHelp.innerHTML = 'Format: Store Name|url,Store Name|url'; + + storeGroup.appendChild(storeLabel); + storeGroup.appendChild(storeInput); + storeGroup.appendChild(storeHelp); + storeCol.appendChild(storeGroup); + + // After creating generalSection and adding the header elements, add all the general info fields: + generalSection.appendChild(overviewCol); + generalSection.appendChild(gameNameCol); + generalSection.appendChild(threadUpdatedCol); + generalSection.appendChild(releaseDateCol); + generalSection.appendChild(censorshipCol); + generalSection.appendChild(genreCol); + generalSection.appendChild(devCol); + generalSection.appendChild(versionCol); + generalSection.appendChild(devLinksCol); + generalSection.appendChild(translatorCol); + generalSection.appendChild(translatorLinksCol); + generalSection.appendChild(storeCol); + + // Notes Section + const notesSection = document.createElement("div"); + Object.assign(notesSection.style, sectionStyle); + + const notesHeader = document.createElement("h4"); + createHeaderStyle(notesHeader, "Notes"); + + const notesDesc = document.createElement("p"); + createDescStyle(notesDesc, "Notes & Stuff"); + + notesSection.appendChild(notesHeader); + notesSection.appendChild(notesDesc); + + // Installation Field + const installationCol = document.createElement("div"); + installationCol.className = "col-xl-12"; + installationCol.id = "installShow"; + + const installationGroup = document.createElement("div"); + installationGroup.className = "form-group mb-3"; + + const installationLabel = document.createElement("label"); + installationLabel.className = "form-label"; + installationLabel.htmlFor = "installation"; + installationLabel.textContent = "Installation"; + installationLabel.style.color = "#fff"; + + const installationInput = document.createElement("textarea"); + installationInput.className = "form-control"; + installationInput.id = "installation"; + installationInput.name = "installation"; + installationInput.rows = "3"; + installationInput.placeholder = "sam is always watching"; + installationInput.style.backgroundColor = "#444"; + installationInput.style.color = "#fff"; + installationInput.style.border = "1px solid #555"; + + installationGroup.appendChild(installationLabel); + installationGroup.appendChild(installationInput); + installationCol.appendChild(installationGroup); + + // Changelog Field + const changelogCol = document.createElement("div"); + changelogCol.className = "col-xl-12"; + changelogCol.id = "changelogShow"; + + const changelogGroup = document.createElement("div"); + changelogGroup.className = "form-group mb-3"; + + const changelogLabel = document.createElement("label"); + changelogLabel.className = "form-label"; + changelogLabel.htmlFor = "changelog"; + changelogLabel.textContent = "Changelog"; + changelogLabel.style.color = "#fff"; + + const changelogInput = document.createElement("textarea"); + changelogInput.className = "form-control"; + changelogInput.id = "changelog"; + changelogInput.name = "changelog"; + changelogInput.rows = "3"; + changelogInput.placeholder = "Alexander Krisnov is russia"; + changelogInput.style.backgroundColor = "#444"; + changelogInput.style.color = "#fff"; + changelogInput.style.border = "1px solid #555"; + + changelogGroup.appendChild(changelogLabel); + changelogGroup.appendChild(changelogInput); + changelogCol.appendChild(changelogGroup); + + // Dev Notes Field + const devNotesCol = document.createElement("div"); + devNotesCol.className = "col-xl-12"; + devNotesCol.id = "devNotesShow"; + + const devNotesGroup = document.createElement("div"); + devNotesGroup.className = "form-group mb-3"; + + const devNotesLabel = document.createElement("label"); + devNotesLabel.className = "form-label"; + devNotesLabel.htmlFor = "devNotes"; + devNotesLabel.textContent = "Dev Notes"; + devNotesLabel.style.color = "#fff"; + + const devNotesInput = document.createElement("textarea"); + devNotesInput.className = "form-control"; + devNotesInput.id = "devNotes"; + devNotesInput.name = "devNotes"; + devNotesInput.rows = "3"; + devNotesInput.placeholder = "rf46 FBI is looking for you"; + devNotesInput.style.backgroundColor = "#444"; + devNotesInput.style.color = "#fff"; + devNotesInput.style.border = "1px solid #555"; + + devNotesGroup.appendChild(devNotesLabel); + devNotesGroup.appendChild(devNotesInput); + devNotesCol.appendChild(devNotesGroup); + + // After creating notesSection and adding the header elements, add all the notes fields: + notesSection.appendChild(installationCol); + notesSection.appendChild(changelogCol); + notesSection.appendChild(devNotesCol); + + // Make BBCode Button + const makeBBCodeButton = document.createElement("button"); + makeBBCodeButton.className = "btn btn-outline-theme btn-lg d-block w-100 fw-500 mb-3"; + makeBBCodeButton.id = "makeBBcode"; + makeBBCodeButton.textContent = "Make"; + makeBBCodeButton.style.backgroundColor = "#444"; + makeBBCodeButton.style.color = "#fff"; + makeBBCodeButton.style.border = "1px solid #555"; + makeBBCodeButton.style.width = "100%"; + makeBBCodeButton.style.padding = "10px"; + makeBBCodeButton.style.marginBottom = "15px"; + makeBBCodeButton.style.cursor = "pointer"; + + // Then add both sections and the make button to formContent: + formContent.appendChild(generalSection); + formContent.appendChild(notesSection); + formContent.appendChild(makeBBCodeButton); + + // Update column spans and gaps + [overviewCol, gameNameCol].forEach(col => { + col.style.gridColumn = "span 12"; + col.style.marginBottom = "15px"; + }); + + [devCol, versionCol, devLinksCol, translatorCol, translatorLinksCol, storeCol].forEach(col => { + col.style.gridColumn = "span 6"; + col.style.marginBottom = "15px"; + }); + + [threadUpdatedCol, releaseDateCol, censorshipCol, genreCol].forEach(col => { + col.style.gridColumn = "span 3"; + col.style.marginBottom = "15px"; + }); + + [installationCol, changelogCol, devNotesCol].forEach(col => { + col.style.gridColumn = "span 12"; + col.style.marginBottom = "15px"; + }); + + // Style form groups + const formGroups = document.querySelectorAll('.form-group, .mb-3'); + formGroups.forEach(group => { + group.style.display = "flex"; + group.style.flexDirection = "column"; + group.style.gap = "10px"; + group.style.marginBottom = "15px"; + group.style.width = "100%"; + }); + + // Style labels + const labels = document.querySelectorAll('.form-label'); + labels.forEach(label => { + label.style.color = "#fff"; + label.style.fontSize = "14px"; + label.style.fontWeight = "600"; + label.style.marginBottom = "0"; + label.style.display = "block"; + label.style.width = "100%"; + }); + + // Style inputs + const inputs = document.querySelectorAll('input, select, textarea'); + inputs.forEach(input => { + input.style.width = "100%"; + input.style.padding = "8px 12px"; + input.style.backgroundColor = "#242629"; + input.style.border = "1px solid #343638"; + input.style.borderRadius = "4px"; + input.style.color = "#fff"; + input.style.fontSize = "14px"; + input.style.lineHeight = "1.4"; + input.style.marginTop = "0"; + }); + + // Style help texts + const helpTexts = document.querySelectorAll('.form-text'); + helpTexts.forEach(help => { + help.style.marginTop = "5px"; + help.style.fontSize = "12px"; + help.style.color = "#999"; + help.style.width = "100%"; + }); + + // Make sure the form container is added to popup first + popup.appendChild(formContainer); + formContainer.appendChild(formContent); + + // THEN add the titles and buttons AFTER the form + // Popup title + const title = document.createElement("h3"); + title.textContent = "Select Broken Rules"; + title.style.width = "100%"; + title.style.marginBottom = "5px"; + title.style.color = "#fff"; + popup.appendChild(title); + + const linksTitle = document.createElement("h3"); + linksTitle.textContent = "Rule Links"; + linksTitle.style.width = "100%"; + linksTitle.style.marginBottom = "5px"; + linksTitle.style.color = "#fff"; + popup.appendChild(linksTitle); + + // Button container + const buttonContainer = document.createElement("div"); + buttonContainer.style.display = "flex"; + buttonContainer.style.justifyContent = "space-between"; + buttonContainer.style.marginTop = "15px"; + popup.appendChild(buttonContainer); + + // Left-aligned buttons container + const leftButtonRow = document.createElement("div"); + leftButtonRow.style.display = "flex"; + leftButtonRow.style.gap = "10px"; // Space between buttons on the left + buttonContainer.appendChild(leftButtonRow); + + // Rule buttons + const generalRules = document.createElement("button"); + generalRules.textContent = "General"; + generalRules.style.marginTop = "15px"; + generalRules.style.padding = "8px 12px"; + generalRules.style.backgroundColor = "#ba4545"; + generalRules.style.color = "#fff"; + generalRules.style.border = "none"; + generalRules.style.borderRadius = "4px"; + generalRules.style.cursor = "pointer"; + generalRules.style.alignSelf = "center"; + generalRules.style.height = "35px"; + leftButtonRow.appendChild(generalRules); + generalRules.addEventListener("click", () => { + window.location.href = "https://f95zone.to/threads/general-rules-updated-2024-06-04.5589/"; + closePopup(); + }); + generalRules.addEventListener("mouseover", () => { + generalRules.style.backgroundColor = "#9e3838"; + }); + generalRules.addEventListener("mouseout", () => { + generalRules.style.backgroundColor = "#ba4545"; + }); + + const reviewRules = document.createElement("button"); + reviewRules.textContent = "Reviews"; + reviewRules.style.marginTop = "15px"; + reviewRules.style.padding = "8px 12px"; + reviewRules.style.backgroundColor = "#ba4545"; + reviewRules.style.color = "#fff"; + reviewRules.style.border = "none"; + reviewRules.style.borderRadius = "4px"; + reviewRules.style.cursor = "pointer"; + reviewRules.style.alignSelf = "center"; + reviewRules.style.height = "35px"; + leftButtonRow.appendChild(reviewRules); + reviewRules.addEventListener("click", () => { + window.location.href = "https://f95zone.to/threads/review-rating-rules-updated-2024-06-04.1753/"; + closePopup; + }); + reviewRules.addEventListener("mouseover", () => { + reviewRules.style.backgroundColor = "#9e3838"; + }); + reviewRules.addEventListener("mouseout", () => { + reviewRules.style.backgroundColor = "#ba4545"; + }); + + const gameRules = document.createElement("button"); + gameRules.textContent = "Games"; + gameRules.style.marginTop = "15px"; + gameRules.style.padding = "8px 12px"; + gameRules.style.backgroundColor = "#ba4545"; + gameRules.style.color = "#fff"; + gameRules.style.border = "none"; + gameRules.style.borderRadius = "4px"; + gameRules.style.cursor = "pointer"; + gameRules.style.alignSelf = "center"; + gameRules.style.height = "35px"; + leftButtonRow.appendChild(gameRules); + gameRules.addEventListener("click", () => { + window.location.href = "https://f95zone.to/threads/game-uploading-rules-2024-02-29.524/"; + closePopup; + }); + gameRules.addEventListener("mouseover", () => { + gameRules.style.backgroundColor = "#9e3838"; + }); + gameRules.addEventListener("mouseout", () => { + gameRules.style.backgroundColor = "#ba4545"; + }); + + const comicRules = document.createElement("button"); + comicRules.textContent = "Comics/Stills"; + comicRules.style.marginTop = "15px"; + comicRules.style.padding = "8px 12px"; + comicRules.style.backgroundColor = "#ba4545"; + comicRules.style.color = "#fff"; + comicRules.style.border = "none"; + comicRules.style.borderRadius = "4px"; + comicRules.style.cursor = "pointer"; + comicRules.style.alignSelf = "center"; + comicRules.style.height = "35px"; + leftButtonRow.appendChild(comicRules); + comicRules.addEventListener("click", () => { + window.location.href = "https://f95zone.to/threads/comics-stills-uploading-rules-2021-01-22.2922/"; + closePopup; + }); + comicRules.addEventListener("mouseover", () => { + comicRules.style.backgroundColor = "#9e3838"; + }); + comicRules.addEventListener("mouseout", () => { + comicRules.style.backgroundColor = "#ba4545"; + }); + + const animRules = document.createElement("button"); + animRules.textContent = "Animations"; + animRules.style.marginTop = "15px"; + animRules.style.padding = "8px 12px"; + animRules.style.backgroundColor = "#ba4545"; + animRules.style.color = "#fff"; + animRules.style.border = "none"; + animRules.style.borderRadius = "4px"; + animRules.style.cursor = "pointer"; + animRules.style.alignSelf = "center"; + animRules.style.height = "35px"; + leftButtonRow.appendChild(animRules); + animRules.addEventListener("click", () => { + window.location.href = "https://f95zone.to/threads/animations-loops-uploading-rules-2020-01-22.72085/"; + closePopup; + }); + animRules.addEventListener("mouseover", () => { + animRules.style.backgroundColor = "#9e3838"; + }); + animRules.addEventListener("mouseout", () => { + animRules.style.backgroundColor = "#ba4545"; + }); + + const assetRules = document.createElement("button"); + assetRules.textContent = "Assets"; + assetRules.style.marginTop = "15px"; + assetRules.style.padding = "8px 12px"; + assetRules.style.backgroundColor = "#ba4545"; + assetRules.style.color = "#fff"; + assetRules.style.border = "none"; + assetRules.style.borderRadius = "4px"; + assetRules.style.cursor = "pointer"; + assetRules.style.alignSelf = "center"; + assetRules.style.height = "35px"; + leftButtonRow.appendChild(assetRules); + assetRules.addEventListener("click", () => { + window.location.href = "https://f95zone.to/threads/asset-uploading-rules-instructions-2024-01-28.23506/"; + closePopup; + }); + assetRules.addEventListener("mouseover", () => { + assetRules.style.backgroundColor = "#9e3838"; + }); + assetRules.addEventListener("mouseout", () => { + assetRules.style.backgroundColor = "#ba4545"; + }); + + // Submit button + const submitButton = document.createElement("button"); + submitButton.textContent = "Submit" + submitButton.style.marginTop = "15px"; + submitButton.style.padding = "8px 12px"; + submitButton.style.backgroundColor = "#ba4545"; + submitButton.style.color = "#fff"; + submitButton.style.border = "none"; + submitButton.style.borderRadius = "4px"; + submitButton.style.cursor = "pointer"; + submitButton.style.alignSelf = "center"; + submitButton.style.height = "35px"; + buttonContainer.appendChild(submitButton); + submitButton.addEventListener("mouseover", () => { + submitButton.style.backgroundColor = "#9e3838"; + }); + submitButton.addEventListener("mouseout", () => { + submitButton.style.backgroundColor = "#ba4545"; + }); + + submitButton.addEventListener("click", () => { + closePopup(); + }); + + // Modify the makeBBCodeButton click event handler + makeBBCodeButton.addEventListener("click", () => { + // Get all form values + const overview = document.getElementById("overview").value; + const threadUpdated = document.getElementById("thread_updated").value; + const releaseDate = document.getElementById("release_date").value; + const gameName = document.getElementById("game_name").value; + const devName = document.getElementById("devName").value; + const devLinks = document.getElementById("devLinks").value; + const translator = document.getElementById("translator").value; + const translatorLinks = document.getElementById("translatorLinks").value; + const version = document.getElementById("version").value; + const censorship = document.getElementById("censorsip"); + const censorshipText = censorship.options[censorship.selectedIndex].text; + const store = document.getElementById("store").value; + const installation = document.getElementById("installation").value; + const changelog = document.getElementById("changelog").value; + const devNotes = document.getElementById("devNotes").value; + + // Get selected genres + const genreSelect = document.getElementById("genre"); + const selectedGenres = Array.from(genreSelect.selectedOptions).map(option => option.value); + + // Format dev links + const formattedDevLinks = devLinks.split(",").map(link => { + const [site, url] = link.split("|"); + return `[URL='${url.trim()}']${site.trim()}[/URL]`; + }).join(" - "); + + // Format translator links if they exist + const formattedTranslatorLinks = translatorLinks ? + translatorLinks.split(",").map(link => { + const [site, url] = link.split("|"); + return `[URL='${url.trim()}']${site.trim()}[/URL]`; + }).join(" - ") : ""; + + // Format store links + const formattedStoreLinks = store.split(",").map(link => { + const [site, url] = link.split("|"); + return `[URL='${url.trim()}']${site.trim()}[/URL]`; + }).join(" - "); + + // Create BBCode + let bbcode = `[CENTER] +[B]Overview[/B]: +${overview}[/CENTER] + +[B]Thread Updated[/B]: ${threadUpdated} +[B]Release Date[/B]: ${releaseDate} +[B]Developer[/B]: ${devName} ${formattedDevLinks}`; + + // Add translator if provided + if (translator) { + bbcode += `\n[B]Translator[/B]: ${translator}${formattedTranslatorLinks ? ' ' + formattedTranslatorLinks : ''}`; + } + + bbcode += `\n[B]Censored[/B]: ${censorshipText} +[B]Version[/B]: ${version} +[B]Genre[/B]: +[SPOILER] +${selectedGenres.join(", ")} +[/SPOILER]`; + + // Add installation section if provided + if (installation) { + bbcode += `\n\n[B]Installation[/B]: +[SPOILER] +${installation} +[/SPOILER]`; + } + + // Add changelog if provided + if (changelog) { + bbcode += `\n\n[B]Changelog[/B]: +[SPOILER] +${changelog} +[/SPOILER]`; + } + + // Add dev notes if provided + if (devNotes) { + bbcode += `\n\n[B]Dev Notes[/B]: +[SPOILER] +${devNotes} +[/SPOILER]`; + } + + // Add store links if provided + if (store) { + bbcode += `\n\n[B]Store[/B]: ${formattedStoreLinks}`; + } + + // Copy to clipboard + GM_setClipboard(bbcode); + alert("BBCode has been copied to clipboard!"); + }); + + // Prevent clicks within the popup from closing it + popup.addEventListener("click", (event) => event.stopPropagation()); + + // Event to close popup when clicking outside of it + overlay.addEventListener("click", closePopup); + + document.body.appendChild(overlay); + document.body.appendChild(popup); + isPopupOpen = true; + } + + // Function to close the popup + function closePopup() { + if (isPopupOpen) { + document.body.removeChild(overlay); + document.body.removeChild(popup); + isPopupOpen = false; + } + } + + // Update the header styling for both General Info and Notes sections + function createHeaderStyle(element, text) { + element.textContent = text; + element.style.color = "#fff"; + element.style.marginBottom = "10px"; + element.style.gridColumn = "span 12"; + element.style.backgroundColor = "#1e66a5"; + element.style.padding = "10px"; + element.style.borderRadius = "4px"; + element.style.width = "100%"; + element.style.display = "block"; + element.style.fontWeight = "600"; + element.style.fontSize = "16px"; + } + + // Update the description styling + function createDescStyle(element, text) { + element.textContent = text; + element.style.color = "#fff"; + element.style.marginBottom = "20px"; + element.style.gridColumn = "span 12"; + element.style.backgroundColor = "#1e66a5"; + element.style.padding = "10px"; + element.style.borderRadius = "4px"; + element.style.width = "100%"; + element.style.display = "block"; + element.style.fontSize = "14px"; + } + + // Add Choices.js CSS + GM_addStyle(GM_getResourceText('CHOICES_CSS')); + // Add custom styling for Choices.js to match the theme + GM_addStyle(` + .choices { + margin-bottom: 0; + } + .choices__inner { + background-color: #242629 !important; + border: 1px solid #343638; + color: #fff; + min-height: 38px; + padding: 6px 8px; + } + .choices__input { + background-color: #242629 !important; + color: #fff !important; + } + .choices__list--dropdown { + background-color: #242629 !important; + border: 1px solid #343638; + color: #fff; + } + .choices__list--dropdown .choices__item { + color: #fff !important; + padding: 8px; + background-color: #242629 !important; + } + .choices__list--dropdown .choices__item--selectable { + background-color: #242629 !important; + } + .choices__list--dropdown .choices__item--selectable.is-highlighted { + background-color: #1e66a5 !important; + } + .choices__list--multiple .choices__item { + background-color: #1e66a5 !important; + border: 1px solid #1e66a5; + color: #fff; + } + .choices[data-type*="select-multiple"] .choices__button { + border-left: 1px solid #fff; + background-image: url("data:image/svg+xml,%3Csvg width='21' height='21' viewBox='0 0 21 21' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%23ffffff' fill-rule='evenodd'%3E%3Cpath d='M2.592.044l18.364 18.364-2.548 2.548L.044 2.592z'/%3E%3Cpath d='M0 18.364L18.364 0l2.548 2.548L2.548 20.912z'/%3E%3C/g%3E%3C/svg%3E"); + } + .choices__list--dropdown { + z-index: 10001; + } + .choices__list--dropdown .choices__item--selectable { + padding-right: 10px; + } + .choices__list--dropdown .choices__item--selectable:after { + display: none; + } + .choices__placeholder { + color: #fff; + } + .choices__input--cloned { + background-color: transparent !important; + color: #fff !important; + } + .choices__list--multiple { + display: flex; + flex-wrap: wrap; + gap: 5px; + background-color: #242629 !important; + } + .choices__list--multiple .choices__item { + margin: 0; + border-radius: 4px; + } + .choices[data-type*="select-multiple"] .choices__inner { + padding: 5px; + background-color: #242629 !important; + } + .choices__list--dropdown .choices__list { + background-color: #242629 !important; + } + .choices__list--single { + background-color: #242629 !important; + color: #fff !important; + } + .choices__heading { + background-color: #1e66a5 !important; + color: #fff !important; + border-bottom: 1px solid #343638 !important; + } + .choices[data-type*="select-one"]:after { + border-color: #fff transparent transparent transparent !important; + } + `); +})(); \ No newline at end of file