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