- Repetitive code is now way easier to edit as it is now stored in the utility module rather than the same code in several different files - Changed "Theme Creator" Copy JSON button to have the text "Copy" rather than rely on an icon due to me forgetting to import fontawesome - Hopefully fixed the store page randomly not working by not showing IRL prices or not showing the owned tags (may rewrite the entire code for that file since it is pretty old like Early Summer 2023) - Fixed clicking on "Poly+" in the sidebar on the settings page sending you to an invalid page (due to browser security stuff) which wasn't happening to me before public beta - Disabled importing theme data JSON for now to ensure security
400 lines
No EOL
15 KiB
JavaScript
Executable file
400 lines
No EOL
15 KiB
JavaScript
Executable file
const SaveBtn = document.getElementById('Save')
|
|
const Elements = Array.from(document.getElementsByClassName('setting-container'))
|
|
|
|
var Settings;
|
|
/*
|
|
var ExpectedSettings = {
|
|
PinnedGamesOn: true,
|
|
ForumMentsOn: false,
|
|
BestFriendsOn: true,
|
|
ImprovedFrListsOn: true,
|
|
IRLPriceWithCurrencyOn: true,
|
|
IRLPriceWithCurrencyCurrency: 0,
|
|
IRLPriceWithCurrencyPackage: 0,
|
|
HideNotifBadgesOn: false,
|
|
StoreOwnTagOn: true,
|
|
ThemeCreatorOn: false,
|
|
ThemeCreator: {
|
|
BGColor: null,
|
|
BGImage: null,
|
|
BGImageSize: 'fit',
|
|
PrimaryTextColor: null,
|
|
SecondaryTextColor: null,
|
|
LinkTextColor: null,
|
|
WebsiteLogo: null
|
|
},
|
|
ModifyNavOn: false,
|
|
ModifyNav: [
|
|
{
|
|
Label: "Places",
|
|
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 ExpectedSettings;
|
|
var Utilities;
|
|
(async () => {
|
|
Utilities = await import(chrome.runtime.getURL('/js/resources/utils.js'));
|
|
Utilities = Utilities.default
|
|
|
|
ExpectedSettings = Utilities.DefaultSettings
|
|
})();
|
|
|
|
const 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() {
|
|
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" && Settings[Modal.getAttribute('data-setting')][input.getAttribute('data-setting')] !== undefined) {
|
|
input.value = Settings[Modal.getAttribute('data-setting')][input.getAttribute('data-setting')]
|
|
} else {
|
|
input.value = ''
|
|
}
|
|
} else {
|
|
let Parent = input.getAttribute('data-parent')
|
|
if (Settings[Modal.getAttribute('data-setting')][Parent][input.getAttribute('data-setting')] !== "undefined" && 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')]
|
|
} else {
|
|
input.value = ''
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
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)
|
|
.then(() => {
|
|
alert('Successfully copied theme data to clipboard!')
|
|
})
|
|
.catch(() => {
|
|
alert('Failure to copy theme data to clipboard.')
|
|
});
|
|
}
|
|
});
|
|
|
|
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) {
|
|
alert('This feature has been disabled for now.')
|
|
return
|
|
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()
|
|
/*
|
|
for (let i = 0; i < JSONTable.length; i++) {
|
|
JSONTable[i] = new Sanitzer(JSONTable[i])
|
|
}
|
|
*/
|
|
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();
|
|
} |