document.body.innerHTML = `
<- go back

Poly+ Settings

[CategoryName]

Pinned Games (enabled)
Pin your favorite games to the top of the homepage!

Forum Mentions (disabled)
Get a quick link to the popular person everyone is talking about's profile!

Best Friends (enabled)
Prioritize the bestest of friends on applicable friend lists!

Improved Friend Lists (enabled)
Accept or decline all friend requests with the click of a button or multi-remove existing friends!
* You can only remove up to 25 friends at once.

Show IRL price with Brick Count (enabled)
See the real life currency value along with Bricks across the site!
* Currencies were calculated on [DATE].
* Currencies other than USD are purely approximations.

Hide Notification Badges (disabled)
Hide the annoying red circles on the sidebar!

Simplified Profile URLs (enabled)
Makes all profile URLs simpler by allowing for you to go to "https://polytoria.com/profile/UsernameGoesHere" to redirect to the real profile URL!

Show "OWNED" Tag on Store Main Page (enabled)
Quickly see if you own the item at a glance with a little tag in the top left corner of item cards on the main store page!

Theme Creator (disabled)
Unleash your creativity and customize the Polytoria website to your liking! (this feature is still in development)

More Search Filters (enabled)
Easily find what you're looking for with more search filters side-wide! (this does not affect the main site search on the navbar)

Apply Membership Theme for Free (disabled)
Ever want the fancy membership themes for completely free? Well now you can get apply them site-wide!

Multi-Cancel Outbound Trades (enabled)
Quickly cancel several out-bound trades (trades that you have sent) all at once
* You can only cancel up to 10 trades at once.

Modify Navbar (disabled)
Customize the navbar to your liking!

Item Wishlist (enabled)
Wishlist that item that you REALLY want!

Hide Upgrade Button (disabled)
Hide the ugly blue "Upgrade" button on the sidebar!


made by Index













`; var Settings; var SaveBtn = document.getElementById('Save') var Elements = [ document.getElementById("PinnedGames"), document.getElementById("ForumMentions"), document.getElementById("BestFriends"), document.getElementById("ImprovedFriendLists"), document.getElementById("IRLPriceWithCurrency"), document.getElementById("HideNotifBadges"), document.getElementById("SimplifiedProfileURLs"), document.getElementById("StoreOwnTag"), document.getElementById("ThemeCreator"), document.getElementById("MoreSearchFilters"), document.getElementById("ApplyMembershipTheme"), document.getElementById("MultiCancelOutTrades"), document.getElementById("ModifyNav"), document.getElementById("ItemWishlist"), document.getElementById("HideUpgradeBtn") ]; var ExpectedSettings = { PinnedGamesOn: true, ForumMentsOn: false, BestFriendsOn: true, ImprovedFrListsOn: true, IRLPriceWithCurrencyOn: true, IRLPriceWithCurrencyCurrency: 0, IRLPriceWithCurrencyPackage: 0, HideNotifBadgesOn: false, SimplifiedProfileURLsOn: true, StoreOwnTagOn: true, ThemeCreatorOn: false, ThemeCreator: { BGColor: null, BGImage: null, BGImageSize: 'fit', PrimaryTextColor: null, SecondaryTextColor: null, LinkTextColor: null, WebsiteLogo: null }, ModifyNavOn: false, ModifyNav: [ { Label: "Play", Link: "https://polytoria.com/places" }, { Label: "Store", Link: "https://polytoria.com/store" }, { Label: "Guilds", Link: "https://polytoria.com/guilds" }, { Label: "People", Link: "https://polytoria.com/users" }, { Label: "Forum", Link: "https://polytoria.com/forum" } ], MoreSearchFiltersOn: true, ApplyMembershipThemeOn: false, ApplyMembershipThemeTheme: 0, MultiCancelOutTradesOn: true, ItemWishlistOn: true, HideUpgradeBtnOn: false } var ResetDefaultsModal = document.getElementById('ResetDefaults-Modal') var ThemeCreatorModal = { Modal: document.getElementById('ThemeCreator-Modal'), Save: document.getElementById('ThemeCreator-Modal-Save'), BGColor: document.getElementById('ThemeCreator-Modal-BGColor'), BGImage: document.getElementById('ThemeCreator-Modal-BGImage'), BGImageSize: document.getElementById('ThemeCreator-Modal-BGImageSize'), PrimaryTextColor: document.getElementById('ThemeCreator-Modal-PrimaryTextColor'), SecondaryTextColor: document.getElementById('ThemeCreator-Modal-SecondaryTextColor'), LinkTextColor: document.getElementById('ThemeCreator-Modal-LinkTextColor'), WebsiteLogo: document.getElementById('ThemeCreator-Modal-WebsiteLogo') } var ModifyNavModal = { Modal: document.getElementById('ModifyNav-Modal'), Save: document.getElementById('ModifyNav-Modal-Save'), "1Label": document.getElementById('ModifyNav-Modal-1Label'), "1Link": document.getElementById('ModifyNav-Modal-1Link'), "2Label": document.getElementById('ModifyNav-Modal-2Label'), "2Link": document.getElementById('ModifyNav-Modal-2Link'), "3Label": document.getElementById('ModifyNav-Modal-3Label'), "3Link": document.getElementById('ModifyNav-Modal-3Link'), "4Label": document.getElementById('ModifyNav-Modal-4Label'), "4Link": document.getElementById('ModifyNav-Modal-4Link'), "5Label": document.getElementById('ModifyNav-Modal-5Label'), "5Link": document.getElementById('ModifyNav-Modal-5Link'), } SaveBtn.addEventListener("click", function() { Save(); }); Elements.forEach(element => { let Button = element.getElementsByTagName('button')[0] let Options = element.getElementsByTagName('button')[1] let Select = element.getElementsByTagName('select') || [] if (Button) { Button.addEventListener('click', function() { console.log('button clicked!!!!') ToggleSetting(Button.getAttribute('data-setting'), element) }); } if (Options) { Options.addEventListener('click', function() { let Modal = document.getElementById(Options.getAttribute('data-modal') + '-Modal') let ModalButtons = Modal.getElementsByTagName('button') let ModalInputs = Modal.getElementsByTagName('input') let ModalSelect = Modal.getElementsByTagName('select') Array.from(ModalButtons).forEach(btn => { if (!(btn.getAttribute('data-ignore') === 'true')) { btn.addEventListener('click', function(){ let Setting = btn.getAttribute('data-setting') if (Setting === '[save]') { Array.from(ModalInputs).forEach(input => { if (!(input.getAttribute('data-ignore') === 'true')) { if (!(input.getAttribute('data-parent'))) { Settings[Modal.getAttribute('data-setting')][input.getAttribute('data-setting')] = input.value || null } else { let Parent = input.getAttribute('data-parent') if (!isNaN(parseInt(Parent))) {Parent = parseInt(Parent)} Settings[Modal.getAttribute('data-setting')][Parent][input.getAttribute('data-setting')] = input.value || null } } }); Array.from(ModalSelect).forEach(select => { if (!(select.getAttribute('data-ignore') === 'true')) { if (!(select.getAttribute('data-parent'))) { Settings[Modal.getAttribute('data-setting')][select.getAttribute('data-setting')] = select.selectedIndex } else { let Parent = input.getAttribute('data-parent') if (!isNaN(parseInt(Parent))) {Parent = parseInt(Parent)} Settings[Modal.getAttribute('data-setting')][Parent][select.getAttribute('data-setting')] = select.selectedIndex } } }); Save(); setTimeout(function () { LoadCurrent(); Modal.close(); }, 400) } else if (Setting === '[cancel]') { Modal.close(); } else if (Setting === '[callback]') { let Function = btn.getAttribute('data-onclick') if (window[Function] && typeof(window[Function]) === 'function') { console.log('is') window[Function]() } } else { if (!(btn.getAttribute('data-parent'))) { ToggleSetting(Modal.getAttribute('data-setting')[btn.getAttribute('data-setting')], null) } else { let Parent = input.getAttribute('data-parent') if (!isNaN(parseInt(Parent))) {Parent = parseInt(Parent)} ToggleSetting(Modal.getAttribute('data-setting')[Parent][btn.getAttribute('data-setting')], null) } } }); } }); Array.from(ModalInputs).forEach(input => { if (!(input.getAttribute('data-ignore') === 'true')) { if (!(input.getAttribute('data-parent'))) { if (Settings[Modal.getAttribute('data-setting')][input.getAttribute('data-setting')] !== "undefined") { input.value = Settings[Modal.getAttribute('data-setting')][input.getAttribute('data-setting')] } } else { let Parent = input.getAttribute('data-parent') if (Settings[Modal.getAttribute('data-setting')][Parent][input.getAttribute('data-setting')] !== "undefined") { if (!isNaN(parseInt(Parent))) {Parent = parseInt(Parent)} input.value = Settings[Modal.getAttribute('data-setting')][Parent][input.getAttribute('data-setting')] } } } }); Array.from(ModalSelect).forEach(select => { if (!(select.getAttribute('data-ignore') === 'true')) { if (!(select.getAttribute('data-parent'))) { if (Settings[Modal.getAttribute('data-setting')][select.getAttribute('data-setting')] !== "undefined") { select.selectedIndex = Settings[Modal.getAttribute('data-setting')][select.getAttribute('data-setting')] } } else { let Parent = input.getAttribute('data-parent') if (Settings[Modal.getAttribute('data-setting')][Parent][select.getAttribute('data-setting')] !== "undefined") { if (!isNaN(parseInt(Parent))) {Parent = parseInt(Parent)} select.selectedIndex = Settings[Modal.getAttribute('data-setting')][Parent][select.getAttribute('data-setting')] } } } }); Modal.showModal() }); } if (Select.length > 0) { Array.from(Select).forEach(element => { element.addEventListener('change', function() { SetSetting(element.getAttribute('data-setting'), element, element.selectedIndex) }); }); } }); document.getElementById('ResetDefaults').addEventListener('click', function() { ResetDefaultsModal.showModal(); }); document.getElementById('ResetDefaults-Modal-Yes').addEventListener('click', function() { Settings = ExpectedSettings Save() setTimeout(function () { LoadCurrent(); ResetDefaultsModal.close(); }, 400) }); document.getElementById('ResetDefaults-Modal-No').addEventListener('click', function() { ResetDefaultsModal.close(); }); function LoadCurrent() { chrome.storage.sync.get(["PolyPlus_Settings"], function(result) { Settings = MergeObjects(result.PolyPlus_Settings || ExpectedSettings, ExpectedSettings) console.log(Settings) Elements.forEach(element => { let Status = element.getElementsByClassName('status')[0] console.log(element, FormatBool(Settings[element.getElementsByTagName('button')[0].getAttribute('data-setting')])) Status.innerText = FormatBool(Settings[element.getElementsByTagName('button')[0].getAttribute('data-setting')]) let SelectInput = element.getElementsByTagName('select')[0] if (SelectInput) { SelectInput.selectedIndex = Settings[SelectInput.getAttribute('data-setting')] } }); }); } LoadCurrent(); function ToggleSetting(Name, Element) { if (Settings[Name] === true) { Settings[Name] = false; } else { Settings[Name] = true; } if (Element != null) { Element.getElementsByClassName('status')[0].innerText = FormatBool(Settings[Name]) } if (SaveBtn.getAttribute('disabled')) { SaveBtn.removeAttribute('disabled') } } function SetSetting(Name, Element, Value) { console.log(Settings) Settings[Name] = Value if (SaveBtn.getAttribute('disabled')) { SaveBtn.removeAttribute('disabled') } } function Save() { SaveBtn.setAttribute('disabled', 'true') chrome.storage.sync.set({ 'PolyPlus_Settings': Settings, arrayOrder: true }, function() { console.log('Saved successfully!'); }); console.log(Settings); } let LoadThemeFromJSONBtn = document.getElementById('LoadThemeFromJSONBtn') let SaveThemeToJSONInput = document.getElementById('SaveThemeToJSONInput') let CopyThemeJSONBtn = document.getElementById('CopyThemeJSONBtn') LoadThemeFromJSONBtn.addEventListener('click', function(){ LoadThemeJSON(LoadThemeFromJSONBtn.previousElementSibling.value) }); document.getElementById('ThemeCreator').getElementsByTagName('button')[1].addEventListener('click', function(){ SaveThemeToJSONInput.value = JSON.stringify(Settings.ThemeCreator) }); CopyThemeJSONBtn.addEventListener('click', function(){ if (SaveThemeToJSONInput.value.length > 0) { navigator.clipboard.writeText(SaveThemeToJSONInput.value) } }); let CurrencyDate = LoadFile(chrome.runtime.getURL('js/resources/currencies.json'), function(text){ CurrencyDate = new Date(JSON.parse(text).Date).toLocaleDateString("en-US", {day:"numeric",month:"long",year:"numeric"}) document.getElementById('IRLPriceWithCurrencyCurrency').previousElementSibling.children[1].innerText = document.getElementById('IRLPriceWithCurrencyCurrency').previousElementSibling.children[1].innerText.replace('[DATE]', CurrencyDate) }) function LoadThemeJSON(string) { try { let JSONTable = JSON.parse(string) if (JSONTable.length === ExpectedSettings.ThemeCreator.length) { if (confirm('Are you sure you\'d like to replace this theme with the theme specified in the JSON?') === true) { LoadThemeFromJSONBtn.previousElementSibling.value = '' document.getElementById('ThemeCreator-Modal').close() Settings.ThemeCreator = MergeObjects(JSONTable, ExpectedSettings.ThemeCreator) Save(); console.log(JSONTable.length, JSONTable, 'applied') document.getElementById('ThemeCreator').getElementsByTagName('button')[1].click(); } } else { alert('JSON is not a theme!') //LoadThemeFromJSONBtn.innerText = 'JSON is too short or too long!' //setTimeout(function () {LoadThemeFromJSONBtn.innerText = 'Load'}, 1250) } } catch (error) { alert('JSON is invalid!') //LoadThemeFromJSONBtn.innerText = 'JSON is invalid!' //setTimeout(function () {LoadThemeFromJSONBtn.innerText = 'Load'}, 1250) } } /* function MergeObjects(obj1, obj2) { var mergedObj = {}; // Copy the values from obj1 to the mergedObj for (var key in obj1) { mergedObj[key] = obj1[key]; } // Merge the values from obj2 into the mergedObj, favoring obj2 for non-existing keys in obj1 for (var key in obj2) { if (!obj1.hasOwnProperty(key)) { mergedObj[key] = obj2[key]; } else if (obj1[key] !== obj2[key]) { mergedObj[key] = obj2[key]; } } // Remove keys from mergedObj if they are not present in obj2 for (var key in mergedObj) { if (!obj2.hasOwnProperty(key)) { delete mergedObj[key]; } } return mergedObj; } */ function MergeObjects(obj1, obj2) { var mergedObj = {}; // Copy the values from obj1 to the mergedObj for (var key in obj1) { mergedObj[key] = obj1[key]; } // Merge the values from obj2 into the mergedObj, favoring obj2 for non-existing keys in obj1 for (var key in obj2) { if (!obj1.hasOwnProperty(key)) { mergedObj[key] = obj2[key]; } } return mergedObj; } function FormatBool(bool){ if (bool === true) { return 'enabled' } else { return 'disabled' } } function LoadFile(path, callback) { var xhr = new XMLHttpRequest(); xhr.onload = function () { return callback(this.responseText); } xhr.open("GET", path, true); xhr.send(); }