MediaWiki:Common.js: Difference between revisions

From EQOA Sandstorm Wiki
Jump to navigationJump to search
No edit summary
No edit summary
Line 1: Line 1:
/* Any JavaScript here will be loaded for all users on every page load. */
(function () {
( function () {
     function rawPage(title) {
  // only run when DOM ready
         return mw.config.get('wgScript') +
  function initRaidChecks() {
            '?title=' + encodeURIComponent(title) +
    // find containers
             '&action=raw&ctype=text/javascript';
    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();
  }
})();
 
 


 
     function loadScript(title) {
 
        return mw.loader.getScript(rawPage(title));
 
 
 
 
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:ClassMasteryRawData.js&action=raw&ctype=text/javascript'
);
mw.loader.load(
    mw.config.get('wgScript') +
    '?title=MediaWiki:ClassMasteryCalculator.js&action=raw&ctype=text/javascript'
);
});
(function () {
     function applyWikiTheme(theme) {
     function applyWikiTheme(theme) {
         var isLight = theme === 'light';
         var isLight = theme === 'light';
Line 190: Line 15:
         document.documentElement.classList.toggle('eqoa-theme-light', isLight);
         document.documentElement.classList.toggle('eqoa-theme-light', isLight);
         document.documentElement.classList.toggle('eqoa-theme-dark', !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);
         if (document.body) {
            document.body.classList.toggle('eqoa-theme-light', isLight);
            document.body.classList.toggle('eqoa-theme-dark', !isLight);
        }


         try {
         try {
             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-cm-theme', isLight ? 'light' : 'dark');
         } catch (e) {}
         } catch (e) {}


         var button = document.getElementById('eqoa-theme-toggle');
         var button = document.getElementById('eqoa-theme-toggle');
         if (button) {
         if (button) {
             button.innerHTML = isLight ? '&#9790;' : '&#9788;';
             button.innerHTML = isLight ? '&#9790;' : '&#9788;';
Line 250: Line 77:
         applyWikiTheme(getSavedWikiTheme());
         applyWikiTheme(getSavedWikiTheme());
     });
     });
})();
   


mw.hook('wikipage.content').add(function ($content) {
    mw.loader.using('mediawiki.util').then(function () {
    var relatedLinks = $content[0].querySelectorAll('.eqoa-related-items a');
        loadScript('MediaWiki:CharacterBuilderData.js')
    if (!relatedLinks.length) return;
            .then(function () {
                return $.when(
                    loadScript('MediaWiki:LZString.js'),
                    loadScript('MediaWiki:QRCode.js'),
                    loadScript('MediaWiki:Html2Canvas.js')
                );
            })
            .then(function () {
                return loadScript('MediaWiki:CharacterBuilder.js');
            })
            .catch(function (error) {
                console.error('Character Builder failed to load:', error);
            });


    var tooltip = document.getElementById('eqoa-related-item-tooltip');
         loadScript('MediaWiki:ClassMasteryData.js')
 
             .then(function () {
    if (!tooltip) {
                return loadScript('MediaWiki:ClassMasteryRawData.js');
         tooltip = document.createElement('div');
             })
        tooltip.id = 'eqoa-related-item-tooltip';
             .then(function () {
        tooltip.className = 'eqoa-related-item-tooltip';
                 return loadScript('MediaWiki:ClassMasteryCalculator.js');
        tooltip.style.display = 'none';
             })
        document.body.appendChild(tooltip);
             .catch(function (error) {
    }
                console.error('Class Mastery failed to load:', error);
 
             });
    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';
        });
     });
     });
});
})();

Revision as of 19:11, 16 May 2026

(function () {
    function rawPage(title) {
        return mw.config.get('wgScript') +
            '?title=' + encodeURIComponent(title) +
            '&action=raw&ctype=text/javascript';
    }

    function loadScript(title) {
        return mw.loader.getScript(rawPage(title));
    }

    function applyWikiTheme(theme) {
        var isLight = theme === 'light';

        document.documentElement.classList.toggle('eqoa-theme-light', isLight);
        document.documentElement.classList.toggle('eqoa-theme-dark', !isLight);

        if (document.body) {
            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');
        } 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'
            );
        }

        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.loader.using('mediawiki.util').then(function () {
        loadScript('MediaWiki:CharacterBuilderData.js')
            .then(function () {
                return $.when(
                    loadScript('MediaWiki:LZString.js'),
                    loadScript('MediaWiki:QRCode.js'),
                    loadScript('MediaWiki:Html2Canvas.js')
                );
            })
            .then(function () {
                return loadScript('MediaWiki:CharacterBuilder.js');
            })
            .catch(function (error) {
                console.error('Character Builder failed to load:', error);
            });

        loadScript('MediaWiki:ClassMasteryData.js')
            .then(function () {
                return loadScript('MediaWiki:ClassMasteryRawData.js');
            })
            .then(function () {
                return loadScript('MediaWiki:ClassMasteryCalculator.js');
            })
            .catch(function (error) {
                console.error('Class Mastery failed to load:', error);
            });
    });
})();