$('body').append(` `) $(window).resize(function () { if (window.innerHeight > window.innerWidth - 75) { $('#everything').hide(); $('#tooSmall').show(); } else { $('#everything').show(); $('#tooSmall').hide() } }); function saveUrl() { if (window.location.href.endsWith('?download')) return; sessionStorage.setItem('prevUrl', window.location.href); } function backButton() { if (window.history.length > 1 && document.referrer.startsWith(window.location.origin)){ if (window.location.href.endsWith('?download') && sessionStorage.getItem('prevUrl') === window.location.href.replace('?download', '')) window.history.go(-2); else window.history.back() } else window.location.href = "../../../../../" } let gdps = null let onePointNine = false function Fetch(link) { return new Promise(function (res, rej) { fetch(link).then(resp => { if (!resp.ok) return rej(resp) gdps = resp.headers.get('gdps') if (gdps && gdps.startsWith('1.9/')) { onePointNine = true; gdps = gdps.slice(4) } resp.json().then(res) }).catch(rej) }) } let allowEsc = true; let popupEsc = true; $(document).keydown(function(k) { if (k.keyCode == 27) { //esc if (!allowEsc) return k.preventDefault() if (popupEsc && $('.popup').is(":visible")) $('.popup').hide(); else $('#backButton').trigger('click') } }); let iconData = null let iconCanvas = null let iconRenderer = null let overrideLoader = false let renderedIcons = {} // very shitty code :) i suck at this stuff async function renderIcons() { if (overrideLoader) return let iconsToRender = $('gdicon:not([rendered], [dontload])') if (iconsToRender.length < 1) return if (!iconData) iconData = await Fetch("../api/icons") if (!iconCanvas) iconCanvas = document.createElement('canvas') if (!iconRenderer) iconRenderer = new PIXI.Application({ view: iconCanvas, width: 300, height: 300, backgroundAlpha: 0}); if (loader.loading) return overrideLoader = true buildIcon(iconsToRender, 0) } function buildIcon(elements, current) { if (current >= elements.length) return let currentIcon = elements.eq(current) let cacheID = currentIcon.attr('cacheID') let foundCache = renderedIcons[cacheID] if (foundCache) { finishIcon(currentIcon, foundCache.name, foundCache.data) return buildIcon(elements, current + 1) } let iconConfig = { id: +currentIcon.attr('iconID'), form: parseIconForm(currentIcon.attr('iconForm')), col1: parseIconColor(currentIcon.attr('col1')), col2: parseIconColor(currentIcon.attr('col2')), glow: currentIcon.attr('glow') == "true", app: iconRenderer } loadIconLayers(iconConfig.form, iconConfig.id, function(a, b, c) { if (c) iconConfig.new = true new Icon(iconConfig, function(icon) { let dataURL = icon.toDataURL() let titleStr = `${Object.values(iconData.forms).find(x => x.form == icon.form).name} ${icon.id}` if (cacheID) renderedIcons[cacheID] = {name: titleStr, data: dataURL} finishIcon(currentIcon, titleStr, dataURL) if (overrideLoader) { overrideLoader = false renderIcons() } else buildIcon(elements, current + 1) }) }) } function finishIcon(currentIcon, name, data) { currentIcon.append(``) currentIcon.attr("rendered", "true") } // reset scroll while ($(this).scrollTop() != 0) { $(this).scrollTop(0); } $(document).ready(function() { $(window).trigger('resize'); }); // Adds all necessary elements into the tab index (all buttons and links that aren't natively focusable) const inaccessibleLinkSelector = "*:not(a) > img.gdButton, .leaderboardTab, .gdcheckbox, .diffDiv, .lengthDiv"; document.querySelectorAll(inaccessibleLinkSelector).forEach(elem => { elem.setAttribute('tabindex', 0); }) document.getElementById('backButton')?.setAttribute('tabindex', 1); // Prioritize back button, first element to be focused // Event listener to run a .click() function if window.addEventListener("keydown", e => { if(e.key !== 'Enter') return; const active = document.activeElement; const isUnsupportedLink = active.hasAttribute('tabindex'); // Only click on links that aren't already natively supported to prevent double clicking if(isUnsupportedLink) active.click(); }) // stolen from stackoverflow $.fn.isInViewport = function () { let elementTop = $(this).offset().top; let elementBottom = elementTop + $(this).outerHeight(); let viewportTop = $(window).scrollTop(); let viewportBottom = viewportTop + $(window).height(); return elementBottom > viewportTop && elementTop < viewportBottom; };