MediaWiki:Common.js: Difference between revisions
From EQOA Sandstorm Wiki
Jump to navigationJump to search
RenodorDev (talk | contribs) No edit summary |
RenodorDev (talk | contribs) No edit summary |
||
| Line 179: | Line 179: | ||
'?title=MediaWiki:ClassMasteryRawData.js&action=raw&ctype=text/javascript' | '?title=MediaWiki:ClassMasteryRawData.js&action=raw&ctype=text/javascript' | ||
); | ); | ||
(function () { | (function () { | ||
| Line 192: | Line 194: | ||
localStorage.setItem('eqoa-wiki-theme', isLight ? 'light' : 'dark'); | localStorage.setItem('eqoa-wiki-theme', isLight ? 'light' : 'dark'); | ||
localStorage.setItem('eqoa-builder-theme', isLight ? 'light' : 'dark'); | localStorage.setItem('eqoa-builder-theme', isLight ? 'light' : 'dark'); | ||
localStorage.setItem('eqoa-cm-theme', isLight ? 'light' : 'dark'); | |||
} catch (e) {} | } catch (e) {} | ||
| Line 198: | Line 201: | ||
button.innerHTML = isLight ? '☾' : '☼'; | button.innerHTML = isLight ? '☾' : '☼'; | ||
button.title = isLight ? 'Switch to Dark Theme' : 'Switch to White Theme'; | button.title = isLight ? 'Switch to Dark Theme' : 'Switch to White Theme'; | ||
button.setAttribute('aria-label', isLight ? 'Switch to Dark Theme' : 'Switch to White Theme'); | button.setAttribute( | ||
'aria-label', | |||
isLight ? 'Switch to Dark Theme' : 'Switch to White Theme' | |||
); | |||
} | |||
if (window.dispatchEvent) { | |||
window.dispatchEvent(new CustomEvent('eqoa-wiki-theme-change', { | |||
detail: { | |||
theme: isLight ? 'light' : 'dark' | |||
} | |||
})); | |||
} | } | ||
} | } | ||
| Line 204: | Line 219: | ||
function getSavedWikiTheme() { | function getSavedWikiTheme() { | ||
try { | try { | ||
return localStorage.getItem('eqoa-wiki-theme') === 'light' ? 'light' : 'dark'; | return localStorage.getItem('eqoa-wiki-theme') === 'light' | ||
? 'light' | |||
: 'dark'; | |||
} catch (e) { | } catch (e) { | ||
return 'dark'; | return 'dark'; | ||
} | } | ||
} | } | ||
window.EQOA_APPLY_WIKI_THEME = applyWikiTheme; | |||
window.EQOA_GET_WIKI_THEME = getSavedWikiTheme; | |||
mw.hook('wikipage.content').add(function () { | mw.hook('wikipage.content').add(function () { | ||
var button = document.getElementById('eqoa-theme-toggle'); | |||
if (!button) { | |||
button = document.createElement('button'); | |||
button.id = 'eqoa-theme-toggle'; | button.id = 'eqoa-theme-toggle'; | ||
button.type = 'button'; | button.type = 'button'; | ||
| Line 228: | Line 250: | ||
}); | }); | ||
})(); | })(); | ||
mw.hook('wikipage.content').add(function ($content) { | mw.hook('wikipage.content').add(function ($content) { | ||
| Line 234: | Line 257: | ||
var tooltip = document.getElementById('eqoa-related-item-tooltip'); | var tooltip = document.getElementById('eqoa-related-item-tooltip'); | ||
if (!tooltip) { | if (!tooltip) { | ||
| Line 347: | Line 369: | ||
tooltip.innerHTML = 'Loading...'; | tooltip.innerHTML = 'Loading...'; | ||
tooltip.style.display = 'block'; | tooltip.style.display = 'block'; | ||
moveTooltip(event); | moveTooltip(event); | ||
Revision as of 18:37, 16 May 2026
/* Any JavaScript here will be loaded for all users on every page load. */
( function () {
// only run when DOM ready
function initRaidChecks() {
// find containers
var containers = document.querySelectorAll('.raid-checkboxify');
if (!containers.length) return;
containers.forEach(function (container, idx) {
var links = Array.from(container.querySelectorAll('a'));
links.forEach(function (a, i) {
// skip if it's already processed
if (a.classList.contains('raid-processed')) return;
// create checkbox input
var cb = document.createElement('input');
cb.type = 'checkbox';
cb.className = 'raid-checkbox-input';
cb.style.marginRight = '8px';
cb.style.verticalAlign = 'middle';
// wrap the link & checkbox in a label so clicking text toggles checkbox
var label = document.createElement('label');
label.style.display = 'block';
label.style.cursor = 'pointer';
// move link inside label
a.parentNode.insertBefore(label, a);
label.appendChild(cb);
label.appendChild(a);
a.classList.add('raid-processed');
// restore state from localStorage
var key = 'raidcheck:' + (document.title || location.pathname) + ':' + a.getAttribute('href');
try {
var stored = localStorage.getItem(key);
if (stored === '1') cb.checked = true;
} catch (e) {}
cb.addEventListener('change', function () {
try {
if (cb.checked) localStorage.setItem(key, '1');
else localStorage.removeItem(key);
} catch (e) {}
});
});
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initRaidChecks);
} else {
initRaidChecks();
}
})();
mw.hook('wikipage.content').add(function () {
var table = document.getElementById('items-found-here-table');
if (!table) return;
if (document.getElementById('items-filter-box')) return;
var box = document.createElement('div');
box.id = 'items-filter-box';
box.className = 'items-filter-box';
box.innerHTML =
'<b>Item Filters</b><br>' +
'Item: <input type="text" id="filter-item"> ' +
'Dropped By: <input type="text" id="filter-mob"> ' +
'Class: <input type="text" id="filter-class"> ' +
'Lvl ≥ <input type="number" id="filter-lvl-min"> ' +
'DMG ≥ <input type="number" id="filter-dmg-min"> ' +
'AC ≥ <input type="number" id="filter-ac-min"> ' +
'HP ≥ <input type="number" id="filter-hp-min"> ' +
'POW ≥ <input type="number" id="filter-pow-min"> ' +
'<button id="clear-item-filters">Clear</button>';
table.parentNode.insertBefore(box, table);
var filters = {
item: document.getElementById('filter-item'),
mob: document.getElementById('filter-mob'),
className: document.getElementById('filter-class'),
lvlMin: document.getElementById('filter-lvl-min'),
dmgMin: document.getElementById('filter-dmg-min'),
acMin: document.getElementById('filter-ac-min'),
hpMin: document.getElementById('filter-hp-min'),
powMin: document.getElementById('filter-pow-min')
};
var clearButton = document.getElementById('clear-item-filters');
function getCellText(row, index) {
return (row.cells[index] ? row.cells[index].textContent : '').toLowerCase();
}
function getCellNumber(row, index) {
var text = row.cells[index] ? row.cells[index].textContent.trim() : '';
var num = parseFloat(text.replace(/[^\d.-]/g, ''));
return isNaN(num) ? 0 : num;
}
function getInputNumber(input) {
if (!input || input.value === '') return null;
var num = parseFloat(input.value);
return isNaN(num) ? null : num;
}
function filterTable() {
var itemText = filters.item.value.toLowerCase();
var mobText = filters.mob.value.toLowerCase();
var classText = filters.className.value.toLowerCase();
var lvlMin = getInputNumber(filters.lvlMin);
var dmgMin = getInputNumber(filters.dmgMin);
var acMin = getInputNumber(filters.acMin);
var hpMin = getInputNumber(filters.hpMin);
var powMin = getInputNumber(filters.powMin);
for (var i = 1; i < table.rows.length; i++) {
var row = table.rows[i];
var show = true;
if (itemText && getCellText(row, 0).indexOf(itemText) === -1) show = false;
if (mobText && getCellText(row, 1).indexOf(mobText) === -1) show = false;
if (classText && getCellText(row, 2).indexOf(classText) === -1) show = false;
if (lvlMin !== null && getCellNumber(row, 3) < lvlMin) show = false;
if (dmgMin !== null && getCellNumber(row, 4) < dmgMin) show = false;
if (acMin !== null && getCellNumber(row, 5) < acMin) show = false;
if (hpMin !== null && getCellNumber(row, 13) < hpMin) show = false;
if (powMin !== null && getCellNumber(row, 15) < powMin) show = false;
row.style.display = show ? '' : 'none';
}
}
Object.keys(filters).forEach(function (key) {
filters[key].addEventListener('input', filterTable);
});
clearButton.addEventListener('click', function () {
Object.keys(filters).forEach(function (key) {
filters[key].value = '';
});
filterTable();
});
});
mw.loader.load(mw.config.get('wgScript') + '?title=MediaWiki:CharacterBuilderData.js&action=raw&ctype=text/javascript');
mw.loader.load(mw.config.get('wgScript') + '?title=MediaWiki:CharacterBuilder.js&action=raw&ctype=text/javascript');
mw.loader.load('https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js');
mw.loader.load('https://cdnjs.cloudflare.com/ajax/libs/lz-string/1.5.0/lz-string.min.js');
mw.loader.load('https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js');
var exportNotesBox = document.getElementById('cb-export-notes');
mw.loader.load(
mw.config.get('wgScript') +
'?title=MediaWiki:ClassMasteryData.js&action=raw&ctype=text/javascript'
);
mw.loader.load(
mw.config.get('wgScript') +
'?title=MediaWiki:ClassMasteryCalculator.js&action=raw&ctype=text/javascript'
);
mw.loader.load(
mw.config.get('wgScript') +
'?title=MediaWiki:ClassMasteryRawData.js&action=raw&ctype=text/javascript'
);
(function () {
function applyWikiTheme(theme) {
var isLight = theme === 'light';
document.documentElement.classList.toggle('eqoa-theme-light', isLight);
document.documentElement.classList.toggle('eqoa-theme-dark', !isLight);
document.body.classList.toggle('eqoa-theme-light', isLight);
document.body.classList.toggle('eqoa-theme-dark', !isLight);
try {
localStorage.setItem('eqoa-wiki-theme', isLight ? 'light' : 'dark');
localStorage.setItem('eqoa-builder-theme', isLight ? 'light' : 'dark');
localStorage.setItem('eqoa-cm-theme', isLight ? 'light' : 'dark');
} catch (e) {}
var button = document.getElementById('eqoa-theme-toggle');
if (button) {
button.innerHTML = isLight ? '☾' : '☼';
button.title = isLight ? 'Switch to Dark Theme' : 'Switch to White Theme';
button.setAttribute(
'aria-label',
isLight ? 'Switch to Dark Theme' : 'Switch to White Theme'
);
}
if (window.dispatchEvent) {
window.dispatchEvent(new CustomEvent('eqoa-wiki-theme-change', {
detail: {
theme: isLight ? 'light' : 'dark'
}
}));
}
}
function getSavedWikiTheme() {
try {
return localStorage.getItem('eqoa-wiki-theme') === 'light'
? 'light'
: 'dark';
} catch (e) {
return 'dark';
}
}
window.EQOA_APPLY_WIKI_THEME = applyWikiTheme;
window.EQOA_GET_WIKI_THEME = getSavedWikiTheme;
mw.hook('wikipage.content').add(function () {
var button = document.getElementById('eqoa-theme-toggle');
if (!button) {
button = document.createElement('button');
button.id = 'eqoa-theme-toggle';
button.type = 'button';
button.className = 'eqoa-theme-toggle';
button.addEventListener('click', function () {
var isLight = document.body.classList.contains('eqoa-theme-light');
applyWikiTheme(isLight ? 'dark' : 'light');
});
document.body.appendChild(button);
}
applyWikiTheme(getSavedWikiTheme());
});
})();
mw.hook('wikipage.content').add(function ($content) {
var relatedLinks = $content[0].querySelectorAll('.eqoa-related-items a');
if (!relatedLinks.length) return;
var tooltip = document.getElementById('eqoa-related-item-tooltip');
if (!tooltip) {
tooltip = document.createElement('div');
tooltip.id = 'eqoa-related-item-tooltip';
tooltip.className = 'eqoa-related-item-tooltip';
tooltip.style.display = 'none';
document.body.appendChild(tooltip);
}
var cache = {};
function getPageTitleFromLink(link) {
var href = link.getAttribute('href') || '';
var parts = href.split('/index.php/');
if (parts.length > 1) {
return decodeURIComponent(parts[1]).replace(/_/g, ' ');
}
return link.textContent.trim();
}
function parseItemTemplate(wikitext, fallbackName) {
var match = wikitext.match(/\{\{(?:ItemBox|ItemPage)([\s\S]*?)\}\}/i);
if (!match) return null;
var item = { name: fallbackName };
var lines = match[1].split('\n');
lines.forEach(function (line) {
line = line.trim();
if (line.indexOf('|') !== 0) return;
var eq = line.indexOf('=');
if (eq === -1) return;
var key = line.substring(1, eq).trim().toLowerCase();
var value = line.substring(eq + 1).trim();
item[key] = value;
});
if (!item.name) item.name = fallbackName;
return item;
}
function statLine(item, label, key) {
if (!item[key]) return '';
return '<div><span>' + label + '</span> ' + item[key] + '</div>';
}
function normalizeRarity(rarity) {
return String(rarity || 'common')
.toLowerCase()
.replace(/\s+/g, '-');
}
function buildTooltip(item) {
var html = '';
var rarityClass = 'cb-rarity-' + normalizeRarity(item.rarity);
html += '<div class="eqoa-related-tooltip-title ' + rarityClass + '">' + item.name + '</div>';
if (item.slot) html += '<div><b>Equip:</b> ' + item.slot + '</div>';
if (item.class) html += '<div><b>Class:</b> ' + item.class + '</div>';
if (item.lvl) html += '<div><b>Level:</b> ' + item.lvl + '</div>';
if (item.dur) html += '<div><b>DUR:</b> ' + item.dur + '</div>';
html += '<div class="eqoa-related-tooltip-stats">';
html += statLine(item, 'DMG:', 'dmg');
html += statLine(item, 'AC:', 'ac');
html += statLine(item, 'STR:', 'str');
html += statLine(item, 'STA:', 'sta');
html += statLine(item, 'AGI:', 'agi');
html += statLine(item, 'DEX:', 'dex');
html += statLine(item, 'WIS:', 'wis');
html += statLine(item, 'INT:', 'int');
html += statLine(item, 'CHA:', 'cha');
html += statLine(item, 'HP:', 'hp');
html += statLine(item, 'POW:', 'pow');
html += statLine(item, 'PR:', 'pr');
html += statLine(item, 'DR:', 'dr');
html += statLine(item, 'FR:', 'fr');
html += statLine(item, 'CR:', 'cr');
html += statLine(item, 'LR:', 'lr');
html += statLine(item, 'AR:', 'ar');
html += '</div>';
if (item.effect) html += '<div><b>Effect:</b> ' + item.effect + '</div>';
if (item.proc) html += '<div><b>Proc:</b> ' + item.proc + '</div>';
return html;
}
function moveTooltip(event) {
var left = event.pageX + 16;
var top = event.pageY + 16;
if (left + 360 > window.scrollX + window.innerWidth) {
left = event.pageX - 360;
}
tooltip.style.left = left + 'px';
tooltip.style.top = top + 'px';
}
function showTooltip(link, event) {
var title = getPageTitleFromLink(link);
tooltip.innerHTML = 'Loading...';
tooltip.style.display = 'block';
moveTooltip(event);
if (cache[title]) {
tooltip.innerHTML = buildTooltip(cache[title]);
return;
}
new mw.Api().get({
action: 'query',
prop: 'revisions',
titles: title,
rvprop: 'content',
rvslots: 'main',
formatversion: '2',
format: 'json'
}).then(function (data) {
var page = data.query.pages[0];
var text = '';
if (page && page.revisions && page.revisions[0]) {
if (page.revisions[0].slots && page.revisions[0].slots.main) {
text = page.revisions[0].slots.main.content || '';
} else {
text = page.revisions[0].content || '';
}
}
var item = parseItemTemplate(text, title);
if (!item) {
tooltip.innerHTML = 'No item data found.';
return;
}
cache[title] = item;
tooltip.innerHTML = buildTooltip(item);
});
}
relatedLinks.forEach(function (link) {
link.addEventListener('mouseenter', function (event) {
showTooltip(link, event);
});
link.addEventListener('mousemove', moveTooltip);
link.addEventListener('mouseleave', function () {
tooltip.style.display = 'none';
});
});
});