MediaWiki:Common.js: Difference between revisions

From EQOA Sandstorm Wiki
Jump to navigationJump to search
No edit summary
No edit summary
Line 228: Line 228:
     });
     });
})();
})();
/* Hide old per-tool theme buttons now that whole-wiki theme controls everything */
#cb-theme-toggle,
#cm-theme-toggle,
.character-builder-theme-toggle,
.cm-theme-toggle,
.builder-theme-toggle {
    display: none !important;
}

Revision as of 05:07, 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');
        } catch (e) {}

        var button = document.getElementById('eqoa-theme-toggle');
        if (button) {
            button.innerHTML = isLight ? '&#9790;' : '&#9788;';
            button.title = isLight ? 'Switch to Dark Theme' : 'Switch to White Theme';
            button.setAttribute('aria-label', isLight ? 'Switch to Dark Theme' : 'Switch to White Theme');
        }
    }

    function getSavedWikiTheme() {
        try {
            return localStorage.getItem('eqoa-wiki-theme') === 'light' ? 'light' : 'dark';
        } catch (e) {
            return 'dark';
        }
    }

    mw.hook('wikipage.content').add(function () {
        if (!document.getElementById('eqoa-theme-toggle')) {
            var 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());
    });
})();

/* Hide old per-tool theme buttons now that whole-wiki theme controls everything */
#cb-theme-toggle,
#cm-theme-toggle,
.character-builder-theme-toggle,
.cm-theme-toggle,
.builder-theme-toggle {
    display: none !important;
}