{"id":365063,"date":"2025-09-16T10:26:57","date_gmt":"2025-09-16T08:26:57","guid":{"rendered":"https:\/\/ets2.lt\/?page_id=365063"},"modified":"2026-02-04T16:05:05","modified_gmt":"2026-02-04T14:05:05","slug":"submit-mod","status":"publish","type":"page","link":"https:\/\/ets2.lt\/en\/submit-mod\/","title":{"rendered":"Submit mod"},"content":{"rendered":"<?xml encoding=\"utf-8\" ?><p>Here you can submit and share your own mods with the community.<br>\nUse the form below to upload your mod and provide all required details. Before submitting, please read the guidelines carefully.<\/p><p>&ndash; We reserve the right to edit the title, description, download links, or any other inaccurate or incomplete information.<br>\n&ndash; Description and Title must be in <strong>English<\/strong><br>\n&ndash; Only <strong>in-game screenshots<\/strong><br>\n&ndash; No ads, alcohol, drugs, adult content<br>\n&ndash; Please upload only your <strong>own<\/strong> mods or <strong>have permission<\/strong> from mod authors<br>\n&ndash; <strong>Leak paid mods are strictly forbidden &mdash; sharing them will result in a permanent ban<\/strong><br>\n&ndash; If you need help, email <strong>ets2.moderator@yandex.com<\/strong><\/p><p><strong>Thank you!<\/strong><\/p><p>        <\/p><form id=\"fsp_form\" class=\"fsp-form\" method=\"post\" action=\"\" enctype=\"multipart\/form-data\" autocomplete=\"off\">\r\n            \r\n            <section class=\"fsp-group\">\r\n                <div class=\"fsp-title\">Contact Details<\/div>\r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_email\">Email *<\/label>\r\n                    <input type=\"email\" id=\"fsp_email\" name=\"fsp_email\" placeholder=\"Your Email Address\" value=\"\" required>\r\n\t\t\t\t\t<small>Your email address will not be shown. It will only be stored to identify the sender of the mod.<\/small>\r\n                <\/div>\r\n            <\/section>\r\n\r\n            <section class=\"fsp-group\">\r\n                <div class=\"fsp-title\">Mod Details<\/div>\r\n    \r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_title\">Mod Name *<\/label>\r\n                    <input type=\"text\" id=\"fsp_title\" name=\"fsp_title\" placeholder=\"Mod Title in English\" value=\"\" required>\r\n                <\/div>\r\n    \r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_category\">Mod Category *<\/label>\r\n                    <select required name=\"fsp_category\" id=\"fsp_category\" class=\"postform\">\n\t<option value=\"-1\">Select Category<\/option>\n\t<option class=\"level-0\" value=\"3\">Trucks<\/option>\n\t<option class=\"level-0\" value=\"4\">Trailers<\/option>\n\t<option class=\"level-0\" value=\"5\">Maps<\/option>\n\t<option class=\"level-0\" value=\"6\">Others<\/option>\n\t<option class=\"level-0\" value=\"8\">Blog<\/option>\n\t<option class=\"level-0\" value=\"11\">Parts\/Tuning<\/option>\n\t<option class=\"level-0\" value=\"12\">Sounds<\/option>\n\t<option class=\"level-0\" value=\"13\">Interiors<\/option>\n\t<option class=\"level-0\" value=\"14\">Truck skins<\/option>\n\t<option class=\"level-0\" value=\"28\">Combo skin packs<\/option>\n\t<option class=\"level-0\" value=\"35\">AI traffic<\/option>\n\t<option class=\"level-0\" value=\"39\">Interior addons<\/option>\n\t<option class=\"level-0\" value=\"172\">Cars<\/option>\n\t<option class=\"level-0\" value=\"1211\">Bus mods<\/option>\n\t<option class=\"level-0\" value=\"8909\">Bus skins<\/option>\n<\/select>\n                <\/div>\r\n    \r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_description\">Description *<\/label>\r\n                    <textarea id=\"fsp_description\" name=\"fsp_description\" placeholder=\"Provide complete details about the mod, including its purpose, key features, supported game versions, installation notes, and changelog. Use only English language.\" rows=\"8\" minlength=\"100\" required><\/textarea>\r\n                    <small>Minimum 100 characters.<\/small>\r\n                <\/div>\r\n    \r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_credits\">Credits *<\/label>\r\n                    <textarea id=\"fsp_credits\" name=\"fsp_credits\" placeholder=\"List the names and\/or any third-party assets or content used in the mod.\" rows=\"4\" required><\/textarea>\r\n                <\/div>\r\n            <\/section>\r\n\r\n            <section class=\"fsp-group\">\r\n                <div class=\"fsp-title\">Download Links<\/div>\r\n<div class=\"sharemods\">\r\n<a href=\"https:\/\/sharemods.com\" target=\"_blank\" rel=\"ugc nofollow noopener\">\r\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-365123\" src=\"https:\/\/ets2.lt\/wp-content\/uploads\/2025\/09\/logo.png\" alt=\"Submit mod\" width=\"170\" height=\"34\"><\/a>\r\n<p>ShareMods.com offers exclusive bonuses for ETS2.LT mod creators.<br>Email info@sharemods.com for details.<\/p>\r\n<\/div>\r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_download1\">Download Link 1 *<\/label>\r\n                    <input type=\"url\" id=\"fsp_download1\" placeholder=\"Download link from external file host\" name=\"fsp_download1\" value=\"\" required>\r\n                <\/div>\r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_size1\">File Size 1 *<\/label>\r\n                    <section>\r\n                        <input type=\"number\" id=\"fsp_size1\" name=\"fsp_size1\" min=\"0\" step=\"0.01\" value=\"\" required style=\"width: 70%; display: inline-block;\">\r\n                        <select name=\"fsp_unit1\" id=\"fsp_unit1\" required style=\"width: 25%; display: inline-block;\">\r\n                            <option value=\"KB\">KB<\/option>\r\n                            <option value=\"MB\">MB<\/option>\r\n                            <option value=\"GB\">GB<\/option>\r\n                        <\/select>\r\n                    <\/section>\r\n                <\/div>\r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_download2\">Download Link 2 (optional)<\/label>\r\n                    <input type=\"url\" id=\"fsp_download2\" name=\"fsp_download2\" value=\"\">\r\n                <\/div>\r\n                <div class=\"fsp-field\" id=\"size2_field\" style=\"display: none;\">\r\n                    <label for=\"fsp_size2\">File Size 2 (required if Download Link 2 is provided)<\/label>\r\n                    <section class=\"fsp-url-additional\">\r\n                        <input type=\"number\" id=\"fsp_size2\" name=\"fsp_size2\" min=\"0\" step=\"0.01\" value=\"\" style=\"width: 50%; display: inline-block;\">\r\n                        <select name=\"fsp_unit2\" id=\"fsp_unit2\" style=\"width: 20%; display: inline-block;\">\r\n                            <option value=\"KB\">KB<\/option>\r\n                            <option value=\"MB\">MB<\/option>\r\n                            <option value=\"GB\">GB<\/option>\r\n                        <\/select>\r\n                        <select name=\"fsp_comment2\" id=\"fsp_comment2\" style=\"width: 25%; display: inline-block;\">\r\n                            <option value=\"Mirror\">Mirror<\/option>\r\n                            <option value=\"Part 2\">Part 2<\/option>\r\n                        <\/select>\r\n                    <\/section>\r\n                <\/div>\r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_download3\">Download Link 3 (optional)<\/label>\r\n                    <input type=\"url\" id=\"fsp_download3\" name=\"fsp_download3\" value=\"\">\r\n                <\/div>\r\n                <div class=\"fsp-field\" id=\"size3_field\" style=\"display: none;\">\r\n                    <label for=\"fsp_size3\">File Size 3 (required if Download Link 3 is provided)<\/label>\r\n                    <section class=\"fsp-url-additional\">\r\n                        <input type=\"number\" id=\"fsp_size3\" name=\"fsp_size3\" min=\"0\" step=\"0.01\" value=\"\" style=\"width: 50%; display: inline-block;\">\r\n                        <select name=\"fsp_unit3\" id=\"fsp_unit3\" style=\"width: 20%; display: inline-block;\">\r\n                            <option value=\"KB\">KB<\/option>\r\n                            <option value=\"MB\">MB<\/option>\r\n                            <option value=\"GB\">GB<\/option>\r\n                        <\/select>\r\n                        <select name=\"fsp_comment3\" id=\"fsp_comment3\" style=\"width: 25%; display: inline-block;\">\r\n                            <option value=\"Mirror\">Mirror<\/option>\r\n                            <option value=\"Part 3\">Part 3<\/option>\r\n                        <\/select>\r\n                    <\/section>\r\n                <\/div>\r\n            <\/section>\r\n\r\n            <section class=\"fsp-group\">\r\n                <div class=\"fsp-title\">Mod Images<\/div>\r\n                <p>Attach images wider than 800px (recommended).<\/p>\r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_image1\">Image 1 *<\/label>\r\n                    <input type=\"file\" id=\"fsp_image1\" name=\"fsp_image1\" accept=\"image\/jpeg,image\/jpg,image\/png,image\/webp\" required>\r\n                    <small>Upload the first image (required). Only JPG, PNG, WebP allowed.<\/small>\r\n                <\/div>\r\n                \r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_image2\">Image 2 (optional)<\/label>\r\n                    <input type=\"file\" id=\"fsp_image2\" name=\"fsp_image2\" accept=\"image\/jpeg,image\/jpg,image\/png,image\/webp\">\r\n                    <small>Upload a second image (optional).<\/small>\r\n                <\/div>\r\n                \r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_image3\">Image 3 (optional)<\/label>\r\n                    <input type=\"file\" id=\"fsp_image3\" name=\"fsp_image3\" accept=\"image\/jpeg,image\/jpg,image\/png,image\/webp\">\r\n                    <small>Upload a third image (optional).<\/small>\r\n                <\/div>\r\n            <\/section>\r\n\r\n            <section class=\"fsp-group\">\r\n            <details class=\"fsp-collapsible-video\">\r\n                <summary class=\"fsp-collapsible-summary\">\r\n                    <span>Have a YouTube video for this mod?<\/span>\r\n                    <span aria-hidden=\"true\" class=\"fsp-summary-svg fsp-summary-svg--youtube\">\r\n                        <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-youtube\" viewbox=\"0 0 16 16\">\r\n                          <path d=\"M8.051 1.999h.089c.822.003 4.987.033 6.11.335a2.01 2.01 0 0 1 1.415 1.42c.101.38.172.883.22 1.402l.01.104.022.26.008.104c.065.914.073 1.77.074 1.957v.075c-.001.194-.01 1.108-.082 2.06l-.008.105-.009.104c-.05.572-.124 1.14-.235 1.558a2.01 2.01 0 0 1-1.415 1.42c-1.16.312-5.569.334-6.18.335h-.142c-.309 0-1.587-.006-2.927-.052l-.17-.006-.087-.004-.171-.007-.171-.007c-1.11-.049-2.167-.128-2.654-.26a2.01 2.01 0 0 1-1.415-1.419c-.111-.417-.185-.986-.235-1.558L.09 9.82l-.008-.104A31 31 0 0 1 0 7.68v-.123c.002-.215.01-.958.064-1.778l.007-.103.003-.052.008-.104.022-.26.01-.104c.048-.519.119-1.023.22-1.402a2.01 2.01 0 0 1 1.415-1.42c.487-.13 1.544-.21 2.654-.26l.17-.007.172-.006.086-.003.171-.007A100 100 0 0 1 7.858 2zM6.4 5.209v4.818l4.157-2.408z\"><\/path>\r\n                        <\/svg>\r\n                    <\/span>\r\n                <\/summary>\r\n\r\n                <div class=\"fsp-details-content\">\r\n                <div class=\"fsp-field\">\r\n                    <label for=\"fsp_youtube\">YouTube video Link<\/label>\r\n                    <input type=\"url\" id=\"fsp_youtube\" name=\"fsp_youtube\" value=\"\" placeholder=\"https:\/\/www.youtube.com\/watch?v=...\">\r\n                    <small>Add a gameplay preview or showcase video (optional).<\/small>\r\n                <\/div>\r\n                <\/div>\r\n            <\/details>\r\n            <\/section>\r\n\r\n            <section class=\"fsp-group\">\r\n            <details class=\"fsp-collapsible-video\">\r\n                    <summary class=\"fsp-collapsible-summary\">\r\n                        <span>Have a Discord server invite for this mod?<\/span>\r\n                        <span aria-hidden=\"true\" class=\"fsp-summary-svg fsp-summary-svg--discord\">\r\n                            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-discord\" viewbox=\"0 0 16 16\">\r\n                              <path d=\"M13.545 2.907a13.2 13.2 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.2 12.2 0 0 0-3.658 0 8 8 0 0 0-.412-.833.05.05 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.04.04 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032q.003.022.021.037a13.3 13.3 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019q.463-.63.818-1.329a.05.05 0 0 0-.01-.059l-.018-.011a9 9 0 0 1-1.248-.595.05.05 0 0 1-.02-.066l.015-.019q.127-.095.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.05.05 0 0 1 .053.007q.121.1.248.195a.05.05 0 0 1-.004.085 8 8 0 0 1-1.249.594.05.05 0 0 0-.03.03.05.05 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.2 13.2 0 0 0 4.001-2.02.05.05 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.03.03 0 0 0-.02-.019m-8.198 7.307c-.789 0-1.438-.724-1.438-1.612s.637-1.613 1.438-1.613c.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612m5.316 0c-.788 0-1.438-.724-1.438-1.612s.637-1.613 1.438-1.613c.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612\"><\/path>\r\n                            <\/svg>\r\n                        <\/span>\r\n                    <\/summary>\r\n\r\n                    <div class=\"fsp-details-content\">\r\n                        <div class=\"fsp-field\">\r\n                            <label for=\"fsp_discord\">Discord invite link<\/label>\r\n                            <input type=\"url\" id=\"fsp_discord\" name=\"fsp_discord\" value=\"\" placeholder=\"https:\/\/discord.gg\/... or https:\/\/discord.com\/invite\/...\">\r\n                            <small>Add a Discord invite link for support or updates (optional).<\/small>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/details>\r\n            <\/section>\r\n\r\n            <section class=\"fsp-group\">\r\n            <details class=\"fsp-collapsible-video\">\r\n                    <summary class=\"fsp-collapsible-summary\">\r\n                        <span>Enable donations for this mod?<\/span>\r\n                        <span aria-hidden=\"true\" class=\"fsp-summary-svg fsp-summary-svg--donation\">   \r\n                            <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-currency-exchange\" viewbox=\"0 0 16 16\">\r\n                                <path d=\"M0 5a5 5 0 0 0 4.027 4.905 6.5 6.5 0 0 1 .544-2.073C3.695 7.536 3.132 6.864 3 5.91h-.5v-.426h.466V5.05q-.001-.07.004-.135H2.5v-.427h.511C3.236 3.24 4.213 2.5 5.681 2.5c.316 0 .59.031.819.085v.733a3.5 3.5 0 0 0-.815-.082c-.919 0-1.538.466-1.734 1.252h1.917v.427h-1.98q-.004.07-.003.147v.422h1.983v.427H3.93c.118.602.468 1.03 1.005 1.229a6.5 6.5 0 0 1 4.97-3.113A5.002 5.002 0 0 0 0 5m16 5.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0m-7.75 1.322c.069.835.746 1.485 1.964 1.562V14h.54v-.62c1.259-.086 1.996-.74 1.996-1.69 0-.865-.563-1.31-1.57-1.54l-.426-.1V8.374c.54.06.884.347.966.745h.948c-.07-.804-.779-1.433-1.914-1.502V7h-.54v.629c-1.076.103-1.808.732-1.808 1.622 0 .787.544 1.288 1.45 1.493l.358.085v1.78c-.554-.08-.92-.376-1.003-.787zm1.96-1.895c-.532-.12-.82-.364-.82-.732 0-.41.311-.719.824-.809v1.54h-.005zm.622 1.044c.645.145.943.38.943.796 0 .474-.37.8-1.02.86v-1.674z\"><\/path>\r\n                            <\/svg>\r\n                        <\/span>\r\n                    <\/summary>\r\n\r\n                    <div class=\"fsp-details-content\">\r\n                        <p>If you fill in the fields below, we will display your donation buttons on the mod page.<\/p>\r\n                        <div class=\"fsp-field\">\r\n                            <label for=\"fsp_paypal\">PayPal link<\/label>\r\n                            <input type=\"url\" id=\"fsp_paypal\" name=\"fsp_paypal\" value=\"\" placeholder=\"https:\/\/paypal.me\/... or https:\/\/www.paypal.com\/...\">\r\n                            <small>Add your PayPal donation page link (optional).<\/small>\r\n                        <\/div>\r\n                        <div class=\"fsp-field\">\r\n                            <label for=\"fsp_buymeacoffee\">Buy Me a Coffee link<\/label>\r\n                            <input type=\"url\" id=\"fsp_buymeacoffee\" name=\"fsp_buymeacoffee\" value=\"\" placeholder=\"https:\/\/buymeacoffee.com\/...\">\r\n                            <small>Add your Buy Me a Coffee page link (optional).<\/small>\r\n                        <\/div>\r\n                        <div class=\"fsp-field\">\r\n                            <label for=\"fsp_kofi\">Ko-fi link<\/label>\r\n                            <input type=\"url\" id=\"fsp_kofi\" name=\"fsp_kofi\" value=\"\" placeholder=\"https:\/\/ko-fi.com\/...\">\r\n                            <small>Add your Ko-fi page link (optional).<\/small>\r\n                        <\/div>\r\n                        <div class=\"fsp-field\">\r\n                            <label for=\"fsp_patreon\">Patreon link<\/label>\r\n                            <input type=\"url\" id=\"fsp_patreon\" name=\"fsp_patreon\" value=\"\" placeholder=\"https:\/\/www.patreon.com\/...\">\r\n                            <small>Add your Patreon page link (optional).<\/small>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/details>\r\n            <\/section>\r\n\r\n            <!-- Cloudflare Turnstile CAPTCHA -->\r\n                        <div class=\"fsp-field fsp-turnstile\">\r\n                <div class=\"cf-turnstile\" data-sitekey=\"0x4AAAAAAB0zEdP4KEly_mGB\"><\/div>\r\n            <\/div>\r\n            \r\n            <!-- Honeypot (hide with CSS) -->\r\n            <div class=\"fsp-field fsp-honeypot\">\r\n                <label for=\"fsp_website\">Website<\/label>\r\n                <input type=\"text\" id=\"fsp_website\" name=\"website\" value=\"\">\r\n            <\/div>\r\n\r\n            <input type=\"hidden\" id=\"fsp_submit_post_nonce\" name=\"fsp_submit_post_nonce\" value=\"cadfe1e8f7\"><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/365063\">            <input type=\"hidden\" name=\"fsp_action\" value=\"fsp_submit_post_action\">\r\n            <button type=\"submit\" id=\"fsp_submit_btn\" class=\"btn btn-primary\">\r\n                <span>Submit Mod<\/span>\r\n                <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" height=\"24px\" viewbox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\"><path d=\"M120-160v-640l760 320-760 320Zm80-120 474-200-474-200v140l240 60-240 60v140Zm0 0v-400 400Z\"><\/path><\/svg>\r\n            <\/button>\r\n        <\/form><script>\r\n        function showError(fieldId, message) {\r\n            var field = document.getElementById(fieldId);\r\n            var errorDiv = field.parentNode.querySelector('.fsp-error');\r\n            if (!errorDiv) {\r\n                errorDiv = document.createElement('div');\r\n                errorDiv.className = 'fsp-error';\r\n                field.parentNode.appendChild(errorDiv);\r\n            }\r\n            errorDiv.textContent = message;\r\n            errorDiv.style.display = 'block';\r\n            field.style.borderColor = '#c62828';\r\n        }\r\n\r\n        function hideError(fieldId) {\r\n            var field = document.getElementById(fieldId);\r\n            var errorDiv = field.parentNode.querySelector('.fsp-error');\r\n            if (errorDiv) {\r\n                errorDiv.style.display = 'none';\r\n            }\r\n            field.style.borderColor = '#ddd';\r\n        }\r\n\r\n        function validateEmail(email) {\r\n            var re = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\r\n            return re.test(email);\r\n        }\r\n\r\n        function validateDiscordUrl(url) {\r\n            var re = \/^(https?:\\\/\\\/)(www\\.)?(discord\\.gg\\\/[A-Za-z0-9_-]+|discord(?:app)?\\.com\\\/invite\\\/[A-Za-z0-9_-]+)(\\\/)?(\\?.*)?$\/i;\r\n            return re.test(url);\r\n        }\r\n\r\n        function validateHttpUrl(url) {\r\n            try {\r\n                var parsed = new URL(url);\r\n                return parsed.protocol === 'http:' || parsed.protocol === 'https:';\r\n            } catch (e) {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        function validateForm() {\r\n            console.log('validateForm() called');\r\n            var isValid = true;\r\n            var firstErrorField = null;\r\n\r\n            \/\/ Clear all previous errors\r\n            document.querySelectorAll('.fsp-error').forEach(function(error) {\r\n                error.style.display = 'none';\r\n            });\r\n            document.querySelectorAll('.fsp-field input, .fsp-field select, .fsp-field textarea').forEach(function(field) {\r\n                field.style.borderColor = '#ddd';\r\n            });\r\n\r\n            \/\/ Validate email\r\n            var email = document.getElementById('fsp_email').value.trim();\r\n            if (!email) {\r\n                showError('fsp_email', 'Email is required.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_email';\r\n            } else if (!validateEmail(email)) {\r\n                showError('fsp_email', 'Please enter a valid email address.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_email';\r\n            }\r\n\r\n            \/\/ Validate title\r\n            var title = document.getElementById('fsp_title').value.trim();\r\n            if (!title) {\r\n                showError('fsp_title', 'Mod name is required.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_title';\r\n            } else if (title.length > 200) {\r\n                showError('fsp_title', 'Mod name must be less than 100 characters.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_title';\r\n            }\r\n\r\n            \/\/ Validate category\r\n            var categorySelect = document.getElementById('fsp_category');\r\n            var category = categorySelect.value;\r\n            console.log('Category value:', category, 'selectedIndex:', categorySelect.selectedIndex);\r\n\r\n            \/\/ Check if no valid category is selected (empty value or first option which is \"Select Category\")\r\n            if (!category || category === '' || category == '0' || category == 0 || categorySelect.selectedIndex === 0) {\r\n                showError('fsp_category', 'Please select a category.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_category';\r\n            }\r\n\r\n            \/\/ Validate description\r\n            var description = document.getElementById('fsp_description').value.trim();\r\n            if (!description) {\r\n                showError('fsp_description', 'Description is required.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_description';\r\n            } else if (description.length < 100) {\r\n                showError('fsp_description', 'Description must be at least 100 characters.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_description';\r\n            } else if (description.length > 5000) {\r\n                showError('fsp_description', 'Description must be less than 5000 characters.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_description';\r\n            }\r\n\r\n            \/\/ Validate credits\r\n            var credits = document.getElementById('fsp_credits').value.trim();\r\n            if (!credits) {\r\n                showError('fsp_credits', 'Credits is required.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_credits';\r\n            } else if (credits.length > 500) {\r\n                showError('fsp_credits', 'Credits must be less than 500 characters.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_credits';\r\n            }\r\n\r\n            \/\/ Validate download link 1\r\n            var download1 = document.getElementById('fsp_download1').value.trim();\r\n            if (!download1) {\r\n                showError('fsp_download1', 'Download link 1 is required.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_download1';\r\n            }\r\n\r\n            \/\/ Validate size 1\r\n            var size1 = document.getElementById('fsp_size1').value;\r\n            var unit1 = document.getElementById('fsp_unit1').value;\r\n            if (!size1 || size1 <= 0) {\r\n                showError('fsp_size1', 'File size 1 is required and must be greater than 0.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_size1';\r\n            } else if (!unit1 || !['KB', 'MB', 'GB'].includes(unit1)) {\r\n                showError('fsp_unit1', 'Please select a valid unit for file size 1.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_unit1';\r\n            }\r\n\r\n            \/\/ Validate download link 2 (if provided)\r\n            var download2 = document.getElementById('fsp_download2').value.trim();\r\n            if (download2) {\r\n                var size2 = document.getElementById('fsp_size2').value;\r\n                var unit2 = document.getElementById('fsp_unit2').value;\r\n                var comment2 = document.getElementById('fsp_comment2').value;\r\n\r\n                if (!size2 || size2 <= 0) {\r\n                    showError('fsp_size2', 'File size 2 is required when download link 2 is provided.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_size2';\r\n                } else if (!unit2 || unit2 === '' || !['KB', 'MB', 'GB'].includes(unit2)) {\r\n                    showError('fsp_unit2', 'Please select a valid unit for file size 2.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_unit2';\r\n                } else if (!comment2 || comment2 === '' || !['Mirror', 'Part 2'].includes(comment2)) {\r\n                    showError('fsp_comment2', 'Please select a comment for download link 2.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_comment2';\r\n                }\r\n            }\r\n\r\n            \/\/ Validate download link 3 (if provided)\r\n            var download3 = document.getElementById('fsp_download3').value.trim();\r\n            if (download3) {\r\n                var size3 = document.getElementById('fsp_size3').value;\r\n                var unit3 = document.getElementById('fsp_unit3').value;\r\n                var comment3 = document.getElementById('fsp_comment3').value;\r\n\r\n                if (!size3 || size3 <= 0) {\r\n                    showError('fsp_size3', 'File size 3 is required when download link 3 is provided.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_size3';\r\n                } else if (!unit3 || unit3 === '' || !['KB', 'MB', 'GB'].includes(unit3)) {\r\n                    showError('fsp_unit3', 'Please select a valid unit for file size 3.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_unit3';\r\n                } else if (!comment3 || comment3 === '' || !['Mirror', 'Part 3'].includes(comment3)) {\r\n                    showError('fsp_comment3', 'Please select a comment for download link 3.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_comment3';\r\n                }\r\n            }\r\n\r\n            \/\/ Validate image 1\r\n            var image1 = document.getElementById('fsp_image1').files[0];\r\n            if (!image1) {\r\n                showError('fsp_image1', 'Image 1 is required.');\r\n                isValid = false;\r\n                if (!firstErrorField) firstErrorField = 'fsp_image1';\r\n            } else {\r\n                var allowedTypes = ['image\/jpeg', 'image\/jpg', 'image\/png', 'image\/webp'];\r\n                if (!allowedTypes.includes(image1.type)) {\r\n                    showError('fsp_image1', 'Image 1 must be JPG, PNG, or WebP.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_image1';\r\n                } else if (image1.size > 3 * 1024 * 1024) { \/\/ 3MB\r\n                    showError('fsp_image1', 'Image 1 must be smaller than 3MB.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_image1';\r\n                }\r\n            }\r\n\r\n            \/\/ Validate image 2 (optional, but validate if provided)\r\n            var image2 = document.getElementById('fsp_image2').files[0];\r\n            if (image2) {\r\n                if (!allowedTypes.includes(image2.type)) {\r\n                    showError('fsp_image2', 'Image 2 must be JPG, PNG, or WebP.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_image2';\r\n                } else if (image2.size > 3 * 1024 * 1024) { \/\/ 3MB\r\n                    showError('fsp_image2', 'Image 2 must be smaller than 3MB.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_image2';\r\n                }\r\n            }\r\n\r\n            \/\/ Validate image 3 (optional, but validate if provided)\r\n            var image3 = document.getElementById('fsp_image3').files[0];\r\n            if (image3) {\r\n                if (!allowedTypes.includes(image3.type)) {\r\n                    showError('fsp_image3', 'Image 3 must be JPG, PNG, or WebP.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_image3';\r\n                } else if (image3.size > 3 * 1024 * 1024) { \/\/ 3MB\r\n                    showError('fsp_image3', 'Image 3 must be smaller than 3MB.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_image3';\r\n                }\r\n            }\r\n\r\n            \/\/ Validate Discord link (optional)\r\n            var discord = document.getElementById('fsp_discord');\r\n            if (discord) {\r\n                var discordValue = discord.value.trim();\r\n                if (discordValue && !validateDiscordUrl(discordValue)) {\r\n                    showError('fsp_discord', 'Please enter a valid Discord invite link (discord.gg or discord.com\/invite).');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = 'fsp_discord';\r\n                }\r\n            }\r\n\r\n            \/\/ Validate donation links (all optional)\r\n            var donationFields = [\r\n                { id: 'fsp_paypal', label: 'PayPal' },\r\n                { id: 'fsp_buymeacoffee', label: 'Buy Me a Coffee' },\r\n                { id: 'fsp_kofi', label: 'Ko-fi' },\r\n                { id: 'fsp_patreon', label: 'Patreon' }\r\n            ];\r\n\r\n            donationFields.forEach(function(item) {\r\n                var field = document.getElementById(item.id);\r\n                if (!field) return;\r\n\r\n                var value = field.value.trim();\r\n                if (value && !validateHttpUrl(value)) {\r\n                    showError(item.id, 'Please enter a valid ' + item.label + ' URL.');\r\n                    isValid = false;\r\n                    if (!firstErrorField) firstErrorField = item.id;\r\n                }\r\n            });\r\n\r\n            \/\/ Scroll to first error\r\n            if (firstErrorField && !isValid) {\r\n                document.getElementById(firstErrorField).scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n                document.getElementById(firstErrorField).focus();\r\n            }\r\n\r\n            return isValid;\r\n        }\r\n\r\n        function toggleDownloadFields(downloadId, sizeFieldId, sizeId, unitId, commentId) {\r\n            var downloadInput = document.getElementById(downloadId);\r\n            var sizeField = document.getElementById(sizeFieldId);\r\n            var sizeInput = document.getElementById(sizeId);\r\n            var unitSelect = document.getElementById(unitId);\r\n            var commentSelect = document.getElementById(commentId);\r\n\r\n            downloadInput.addEventListener('input', function() {\r\n                if (this.value.trim() !== '') {\r\n                    sizeField.style.display = 'block';\r\n                    sizeInput.required = true;\r\n                    unitSelect.required = true;\r\n                    if (commentSelect) commentSelect.required = true;\r\n                } else {\r\n                    sizeField.style.display = 'none';\r\n                    sizeInput.required = false;\r\n                    unitSelect.required = false;\r\n                    if (commentSelect) commentSelect.required = false;\r\n                }\r\n            });\r\n\r\n            \/\/ Trigger on page load if value exists\r\n            if (downloadInput.value.trim() !== '') {\r\n                sizeField.style.display = 'block';\r\n                sizeInput.required = true;\r\n                unitSelect.required = true;\r\n                if (commentSelect) commentSelect.required = true;\r\n            }\r\n        }\r\n\r\n        document.addEventListener('DOMContentLoaded', function() {\r\n            toggleDownloadFields('fsp_download2', 'size2_field', 'fsp_size2', 'fsp_unit2', 'fsp_comment2');\r\n            toggleDownloadFields('fsp_download3', 'size3_field', 'fsp_size3', 'fsp_unit3', 'fsp_comment3');\r\n\r\n            \/\/ Add form validation\r\n            var form = document.getElementById('fsp_form');\r\n            var submitBtn = document.getElementById('fsp_submit_btn');\r\n\r\n            \/\/ Prevent browser autofill on all fields except email\r\n            if (form) {\r\n                var controls = form.querySelectorAll('input, textarea, select');\r\n                controls.forEach(function(control) {\r\n                    if (control.id === 'fsp_email') {\r\n                        control.setAttribute('autocomplete', 'email');\r\n                    } else {\r\n                        control.setAttribute('autocomplete', 'off');\r\n                    }\r\n                });\r\n            }\r\n\r\n            if (form) {\r\n                form.addEventListener('submit', function(e) {\r\n                    console.log('Form submit event triggered');\r\n                    if (!validateForm()) {\r\n                        console.log('Validation failed, preventing submit');\r\n                        e.preventDefault();\r\n                        e.stopPropagation();\r\n                        return false;\r\n                    }\r\n                    console.log('Validation passed, allowing submit');\r\n                });\r\n            }\r\n\r\n            \/\/ Also prevent submit on button click as backup\r\n            if (submitBtn) {\r\n                submitBtn.addEventListener('click', function(e) {\r\n                    console.log('Submit button clicked');\r\n                    if (!validateForm()) {\r\n                        console.log('Validation failed on button click');\r\n                        e.preventDefault();\r\n                        e.stopPropagation();\r\n                        return false;\r\n                    }\r\n                });\r\n            }\r\n\r\n        });\r\n        <\/script><script src=\"https:\/\/challenges.cloudflare.com\/turnstile\/v0\/api.js\" async defer><\/script><p>\r\n        \r\n\r\n<\/p>","protected":false},"excerpt":{"rendered":"<p>Here you can submit and share your own mods with the community. Use the form below to upload your mod and provide all required details. Before submitting, please read the guidelines carefully. &#8211; We reserve the right to edit the title, description, download links, or any other inaccurate or incomplete information. &#8211; Description and Title [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"footnotes":""},"class_list":["post-365063","page","type-page","status-publish","hentry"],"acf":[],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"Here you can submit and share your own mods with the community. Use the form below to upload your mod and provide all required details. Before submitting, please read the guidelines carefully. - We reserve the right to edit the title, description, download links, or any other inaccurate or incomplete information. - Description and Title\" \/>\n\t<meta name=\"robots\" content=\"max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/ets2.lt\/en\/submit-mod\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ets2.lt\\\/en\\\/submit-mod\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ets2.lt\\\/en#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ets2.lt\\\/en\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ets2.lt\\\/en\\\/submit-mod\\\/#listItem\",\"name\":\"Submit mod\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ets2.lt\\\/en\\\/submit-mod\\\/#listItem\",\"position\":2,\"name\":\"Submit mod\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ets2.lt\\\/en#listItem\",\"name\":\"Home\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ets2.lt\\\/en\\\/#organization\",\"name\":\"ETS 2 mods\",\"description\":\"Euro Truck Simulator 2 mods\",\"url\":\"https:\\\/\\\/ets2.lt\\\/en\\\/\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ets2.lt\\\/en\\\/submit-mod\\\/#webpage\",\"url\":\"https:\\\/\\\/ets2.lt\\\/en\\\/submit-mod\\\/\",\"name\":\"Submit mod | ETS 2 mods\",\"description\":\"Here you can submit and share your own mods with the community. Use the form below to upload your mod and provide all required details. Before submitting, please read the guidelines carefully. - We reserve the right to edit the title, description, download links, or any other inaccurate or incomplete information. - Description and Title\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ets2.lt\\\/en\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ets2.lt\\\/en\\\/submit-mod\\\/#breadcrumblist\"},\"datePublished\":\"2025-09-16T10:26:57+02:00\",\"dateModified\":\"2026-02-04T16:05:05+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ets2.lt\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/ets2.lt\\\/en\\\/\",\"name\":\"ETS2 mods\",\"alternateName\":\"Euro Truck Simulator 2 mods\",\"description\":\"Euro Truck Simulator 2 mods\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/ets2.lt\\\/en\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Submit mod | ETS 2 mods","description":"Here you can submit and share your own mods with the community. Use the form below to upload your mod and provide all required details. Before submitting, please read the guidelines carefully. - We reserve the right to edit the title, description, download links, or any other inaccurate or incomplete information. - Description and Title","canonical_url":"https:\/\/ets2.lt\/en\/submit-mod\/","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/ets2.lt\/en\/submit-mod\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/ets2.lt\/en#listItem","position":1,"name":"Home","item":"https:\/\/ets2.lt\/en","nextItem":{"@type":"ListItem","@id":"https:\/\/ets2.lt\/en\/submit-mod\/#listItem","name":"Submit mod"}},{"@type":"ListItem","@id":"https:\/\/ets2.lt\/en\/submit-mod\/#listItem","position":2,"name":"Submit mod","previousItem":{"@type":"ListItem","@id":"https:\/\/ets2.lt\/en#listItem","name":"Home"}}]},{"@type":"Organization","@id":"https:\/\/ets2.lt\/en\/#organization","name":"ETS 2 mods","description":"Euro Truck Simulator 2 mods","url":"https:\/\/ets2.lt\/en\/"},{"@type":"WebPage","@id":"https:\/\/ets2.lt\/en\/submit-mod\/#webpage","url":"https:\/\/ets2.lt\/en\/submit-mod\/","name":"Submit mod | ETS 2 mods","description":"Here you can submit and share your own mods with the community. Use the form below to upload your mod and provide all required details. Before submitting, please read the guidelines carefully. - We reserve the right to edit the title, description, download links, or any other inaccurate or incomplete information. - Description and Title","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/ets2.lt\/en\/#website"},"breadcrumb":{"@id":"https:\/\/ets2.lt\/en\/submit-mod\/#breadcrumblist"},"datePublished":"2025-09-16T10:26:57+02:00","dateModified":"2026-02-04T16:05:05+02:00"},{"@type":"WebSite","@id":"https:\/\/ets2.lt\/en\/#website","url":"https:\/\/ets2.lt\/en\/","name":"ETS2 mods","alternateName":"Euro Truck Simulator 2 mods","description":"Euro Truck Simulator 2 mods","inLanguage":"en-US","publisher":{"@id":"https:\/\/ets2.lt\/en\/#organization"}}]}},"aioseo_meta_data":{"post_id":"365063","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"titles":[],"descriptions":[],"socialPosts":{"email":[],"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2025-09-16 08:23:03","updated":"2026-02-04 14:05:06","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/ets2.lt\/en\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tSubmit mod\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/ets2.lt\/en"},{"label":"Submit mod","link":"https:\/\/ets2.lt\/en\/submit-mod\/"}],"_links":{"self":[{"href":"https:\/\/ets2.lt\/en\/wp-json\/wp\/v2\/pages\/365063","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ets2.lt\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ets2.lt\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ets2.lt\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ets2.lt\/en\/wp-json\/wp\/v2\/comments?post=365063"}],"version-history":[{"count":0,"href":"https:\/\/ets2.lt\/en\/wp-json\/wp\/v2\/pages\/365063\/revisions"}],"wp:attachment":[{"href":"https:\/\/ets2.lt\/en\/wp-json\/wp\/v2\/media?parent=365063"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}