MediaWiki:Common.js: Difference between revisions

From Survival Servers
Jump to navigation Jump to search
No edit summary
No edit summary
Line 152: Line 152:
         var priceHtml = '';
         var priceHtml = '';
         if (pricingData && pricingData.lowestPrice) {
         if (pricingData && pricingData.lowestPrice) {
             if (pricingData.discount && pricingData.discountedPrice) {
             if (pricingData.discount && pricingData.discountedPrice && pricingData.coupon) {
                 priceHtml = '<span style="color: rgba(255,255,255,0.7); margin: 0 12px;">|</span>' +
                 priceHtml = '<span style="display: inline-flex; align-items: center; vertical-align: middle;">' +
                     '<span style="background: #00aa55; color: #fff; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: 700;">SAVE ' + pricingData.discount + '%</span>' +
                    '<span style="color: rgba(255,255,255,0.7); margin: 0 12px;">|</span>' +
                     '<span style="background: #00aa55; color: #fff; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: 700; display: inline-flex; align-items: center;">Use code ' + pricingData.coupon + ' for ' + pricingData.discount + '% OFF</span>' +
                     '<span style="color: rgba(255,255,255,0.5); margin: 0 8px;"></span>' +
                     '<span style="color: rgba(255,255,255,0.5); margin: 0 8px;"></span>' +
                     '<span style="color: #888; text-decoration: line-through; font-size: 13px;">$' + pricingData.lowestPrice + '</span>' +
                     '<span style="color: #888; text-decoration: line-through; font-size: 13px; display: inline-flex; align-items: center;">$' + pricingData.lowestPrice + '</span>' +
                     '<span style="color: #00ff88; font-weight: 700; margin-left: 6px;">$' + pricingData.discountedPrice + '/slot</span>';
                     '<span style="color: #00ff88; font-weight: 700; margin-left: 6px; display: inline-flex; align-items: center;">$' + pricingData.discountedPrice + '/mo</span>' +
                '</span>';
             } else {
             } else {
                 priceHtml = '<span style="color: rgba(255,255,255,0.7); margin: 0 12px;">|</span>' +
                 priceHtml = '<span style="display: inline-flex; align-items: center; vertical-align: middle;">' +
                     '<span style="color: #00ff88; font-weight: 700;">From $' + pricingData.lowestPrice + '/slot</span>';
                    '<span style="color: rgba(255,255,255,0.7); margin: 0 12px;">|</span>' +
                     '<span style="color: #00ff88; font-weight: 700; display: inline-flex; align-items: center;">From $' + pricingData.lowestPrice + '/mo</span>' +
                '</span>';
             }
             }
         }
         }
Line 169: Line 173:
             '<div style="padding: 16px 25px; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 15px;">' +
             '<div style="padding: 16px 25px; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 15px;">' +
                 '<div style="display: flex; align-items: center; gap: 18px; flex: 1; min-width: 280px;">' +
                 '<div style="display: flex; align-items: center; gap: 18px; flex: 1; min-width: 280px;">' +
                     '<a href="' + buildTrackingUrl('https://www.survivalservers.com/', pageName) + '" style="flex-shrink: 0;"><img src="' + LOGO_URL + '" alt="SurvivalServers" style="height: 32px; width: auto;"></a>' +
                     '<a href="' + buildTrackingUrl('https://www.survivalservers.com/', pageName) + '" style="flex-shrink: 0; display: flex; align-items: center;"><img src="' + LOGO_URL + '" alt="SurvivalServers" style="height: 32px; width: auto; vertical-align: middle;"></a>' +
                     '<div style="height: 28px; width: 1px; background: rgba(255,255,255,0.2);"></div>' +
                     '<div style="height: 28px; width: 1px; background: rgba(255,255,255,0.2);"></div>' +
                     '<div style="display: flex; align-items: center; gap: 10px;">' +
                     '<div style="display: flex; align-items: center; gap: 10px;">' +
                         '<img src="' + gameIconUrl + '" alt="" style="width: 28px; height: 28px; border-radius: 4px;" onerror="this.style.display=\'none\'">' +
                         '<img src="' + gameIconUrl + '" alt="" style="width: 28px; height: 28px; border-radius: 4px; vertical-align: middle;" onerror="this.style.display=\'none\'">' +
                         '<span style="color: rgb(219, 155, 21); font-weight: 600; font-size: 15px;">' + game.name + ' Server Hosting</span>' +
                         '<span style="color: rgb(219, 155, 21); font-weight: 600; font-size: 15px; display: inline-flex; align-items: center;">' + game.name + ' Server Hosting</span>' +
                     '</div>' +
                     '</div>' +
                     priceHtml +
                     priceHtml +
Line 199: Line 203:
         var couponHtml = '';
         var couponHtml = '';
         if (pricingData && pricingData.discount && pricingData.coupon) {
         if (pricingData && pricingData.discount && pricingData.coupon) {
             couponHtml = '<span style="color: rgba(255,255,255,0.7); margin: 0 12px;">|</span>' +
             couponHtml = '<span style="display: inline-flex; align-items: center; vertical-align: middle;">' +
                 '<span style="background: #00aa55; color: #fff; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: 700;">SAVE ' + pricingData.discount + '% with code ' + pricingData.coupon + '</span>';
                '<span style="color: rgba(255,255,255,0.7); margin: 0 12px;">|</span>' +
                 '<span style="background: #00aa55; color: #fff; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: 700; display: inline-flex; align-items: center;">Use code ' + pricingData.coupon + ' for ' + pricingData.discount + '% OFF</span>' +
            '</span>';
         }
         }


Line 208: Line 214:
             '<div style="padding: 16px 25px; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 15px;">' +
             '<div style="padding: 16px 25px; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 15px;">' +
                 '<div style="display: flex; align-items: center; gap: 18px; flex: 1; min-width: 280px;">' +
                 '<div style="display: flex; align-items: center; gap: 18px; flex: 1; min-width: 280px;">' +
                     '<a href="' + trackingUrl + '" style="flex-shrink: 0;"><img src="' + LOGO_URL + '" alt="SurvivalServers" style="height: 32px; width: auto;"></a>' +
                     '<a href="' + trackingUrl + '" style="flex-shrink: 0; display: flex; align-items: center;"><img src="' + LOGO_URL + '" alt="SurvivalServers" style="height: 32px; width: auto; vertical-align: middle;"></a>' +
                     '<div style="height: 28px; width: 1px; background: rgba(255,255,255,0.2);"></div>' +
                     '<div style="height: 28px; width: 1px; background: rgba(255,255,255,0.2);"></div>' +
                     '<span style="color: rgb(219, 155, 21); font-weight: 600; font-size: 15px;">Premium Game Server Hosting</span>' +
                     '<span style="color: rgb(219, 155, 21); font-weight: 600; font-size: 15px; display: inline-flex; align-items: center;">Premium Game Server Hosting</span>' +
                     '<span style="color: rgba(255,255,255,0.7); margin: 0 8px;">|</span>' +
                     '<span style="color: rgba(255,255,255,0.7); margin: 0 8px; display: inline-flex; align-items: center;">|</span>' +
                     '<span style="color: rgba(255,255,255,0.9); font-size: 14px;">100+ Games Available</span>' +
                     '<span style="color: rgba(255,255,255,0.9); font-size: 14px; display: inline-flex; align-items: center;">100+ Games Available</span>' +
                     couponHtml +
                     couponHtml +
                 '</div>' +
                 '</div>' +

Revision as of 16:06, 8 December 2025

/**
 * SurvivalServers Wiki - Game Server Banner System
 * Dark theme with gold accents matching main site design
 * Includes affiliate tracking: trckaff=3881, trckit=WIKI<PageName>
 * Dynamic pricing via API
 */
(function() {
    'use strict';

    var TRACK_AFF_ID = '3881';
    var MAX_TRCKIT_LENGTH = 41;
    var API_URL = 'https://www.survivalservers.com/includes/wiki_pricing_api.php';
    var LOGO_URL = 'https://www.survivalservers.com/themes/epona/images/logo.png';
    var GAME_ICON_BASE = 'https://www.survivalservers.com/themes/epona/images/sspanel/game-server-icons/';

    var gameConfig = {
        'valheim': { name: 'Valheim', slug: 'valheim', dbname: 'valheim' },
        'ark': { name: 'ARK: Survival Evolved', slug: 'ark', dbname: 'ark' },
        'arksurvivalascended': { name: 'ARK: Survival Ascended', slug: 'arksurvivalascended', dbname: 'arksurvivalascended' },
        'asa': { name: 'ARK: Survival Ascended', slug: 'arksurvivalascended', dbname: 'arksurvivalascended' },
        'rust': { name: 'Rust', slug: 'rust', dbname: 'rust' },
        'minecraft': { name: 'Minecraft', slug: 'minecraft', dbname: 'minecraft' },
        'palworld': { name: 'Palworld', slug: 'palworld', dbname: 'palworld' },
        'dayz': { name: 'DayZ', slug: 'dayz', dbname: 'dayz' },
        'conan': { name: 'Conan Exiles', slug: 'conanexiles', dbname: 'conanexiles' },
        'conanexiles': { name: 'Conan Exiles', slug: 'conanexiles', dbname: 'conanexiles' },
        '7daystodie': { name: '7 Days to Die', slug: '7daystodie', dbname: '7daystodie' },
        '7days': { name: '7 Days to Die', slug: '7daystodie', dbname: '7daystodie' },
        'theforest': { name: 'The Forest', slug: 'theforest', dbname: 'theforest' },
        'forest': { name: 'The Forest', slug: 'theforest', dbname: 'theforest' },
        'sonsoftheforest': { name: 'Sons of the Forest', slug: 'sonsoftheforest', dbname: 'sonsoftheforest' },
        'sons of the forest': { name: 'Sons of the Forest', slug: 'sonsoftheforest', dbname: 'sonsoftheforest' },
        'terraria': { name: 'Terraria', slug: 'terraria', dbname: 'terraria' },
        'projectzomboid': { name: 'Project Zomboid', slug: 'projectzomboid', dbname: 'projectzomboid' },
        'zomboid': { name: 'Project Zomboid', slug: 'projectzomboid', dbname: 'projectzomboid' },
        'enshrouded': { name: 'Enshrouded', slug: 'enshrouded', dbname: 'enshrouded' },
        'satisfactory': { name: 'Satisfactory', slug: 'satisfactory', dbname: 'satisfactory' },
        'v rising': { name: 'V Rising', slug: 'vrising', dbname: 'vrising' },
        'vrising': { name: 'V Rising', slug: 'vrising', dbname: 'vrising' },
        'aska': { name: 'ASKA', slug: 'aska', dbname: 'aska' },
        'unturned': { name: 'Unturned', slug: 'unturned', dbname: 'unturned' },
        'factorio': { name: 'Factorio', slug: 'factorio', dbname: 'factorio' },
        'csgo': { name: 'CS2', slug: 'csgo', dbname: 'csgo' },
        'cs2': { name: 'CS2', slug: 'csgo', dbname: 'csgo' },
        'counterstrike': { name: 'CS2', slug: 'csgo', dbname: 'csgo' },
        'theisle': { name: 'The Isle', slug: 'theisle', dbname: 'theisle' },
        'isle': { name: 'The Isle', slug: 'theisle', dbname: 'theisle' },
        'squad': { name: 'Squad', slug: 'squad', dbname: 'squad' },
        'arma': { name: 'Arma 3', slug: 'arma3', dbname: 'arma3' },
        'arma3': { name: 'Arma 3', slug: 'arma3', dbname: 'arma3' },
        'starbound': { name: 'Starbound', slug: 'starbound', dbname: 'starbound' },
        'empyrion': { name: 'Empyrion', slug: 'empyrion', dbname: 'empyrion' },
        'pixark': { name: 'PixARK', slug: 'pixark', dbname: 'pixark' },
        'dontstarve': { name: "Don't Starve Together", slug: 'dontstarve', dbname: 'dontstarvetogether' },
        "don't starve": { name: "Don't Starve Together", slug: 'dontstarve', dbname: 'dontstarvetogether' },
        'scum': { name: 'SCUM', slug: 'scum', dbname: 'scum' },
        'barotrauma': { name: 'Barotrauma', slug: 'barotrauma', dbname: 'barotrauma' },
        'corekeeper': { name: 'Core Keeper', slug: 'corekeeper', dbname: 'corekeeper' },
        'core keeper': { name: 'Core Keeper', slug: 'corekeeper', dbname: 'corekeeper' },
        'stationeers': { name: 'Stationeers', slug: 'stationeers', dbname: 'stationeers' },
        'icarus': { name: 'Icarus', slug: 'icarus', dbname: 'icarus' },
        'avorion': { name: 'Avorion', slug: 'avorion', dbname: 'avorion' },
        'spaceengineers': { name: 'Space Engineers', slug: 'spaceengineers', dbname: 'spaceengineers' },
        'space engineers': { name: 'Space Engineers', slug: 'spaceengineers', dbname: 'spaceengineers' },
        'mordhau': { name: 'Mordhau', slug: 'mordhau', dbname: 'mordhau' },
        'hurtworld': { name: 'Hurtworld', slug: 'hurtworld', dbname: 'hurtworld' },
        'miscreated': { name: 'Miscreated', slug: 'miscreated', dbname: 'miscreated' },
        'fivem': { name: 'FiveM', slug: 'fivem', dbname: 'fivem' },
        'redm': { name: 'RedM', slug: 'redm', dbname: 'redm' },
        'assettocorsa': { name: 'Assetto Corsa', slug: 'assettocorsa', dbname: 'assettocorsa' },
        'assetto': { name: 'Assetto Corsa', slug: 'assettocorsa', dbname: 'assettocorsa' },
        'renown': { name: 'Renown', slug: 'renown', dbname: 'renown' },
        'brickadia': { name: 'Brickadia', slug: 'brickadia', dbname: 'brickadia' },
        'holdfast': { name: 'Holdfast: Nations At War', slug: 'holdfast', dbname: 'holdfast' },
        'left4dead': { name: 'Left 4 Dead 2', slug: 'left4dead2', dbname: 'left4dead2' },
        'l4d2': { name: 'Left 4 Dead 2', slug: 'left4dead2', dbname: 'left4dead2' },
        'deadmatter': { name: 'Dead Matter', slug: 'deadmatter', dbname: 'deadmatter' },
        'soulmask': { name: 'Soulmask', slug: 'soulmask', dbname: 'soulmask' },
        'nightingale': { name: 'Nightingale', slug: 'nightingale', dbname: 'nightingale' },
        'abiotic': { name: 'Abiotic Factor', slug: 'abiotic_factor', dbname: 'abioticfactor' },
        'abiotic factor': { name: 'Abiotic Factor', slug: 'abiotic_factor', dbname: 'abioticfactor' },
        'hytale': { name: 'Hytale', slug: 'hytale', dbname: 'hytale' }
    };

    function getPageName() {
        var urlParams = new URLSearchParams(window.location.search);
        var title = urlParams.get('title');
        if (!title) {
            var path = window.location.pathname;
            var match = path.match(/\/wiki\/(.+)$/);
            if (match) title = decodeURIComponent(match[1]);
        }
        if (!title) {
            var heading = document.getElementById('firstHeading');
            if (heading) title = heading.textContent;
        }
        if (title) {
            title = title.replace(/[^a-zA-Z0-9]/g, '_').replace(/_+/g, '_').substring(0, MAX_TRCKIT_LENGTH);
        }
        return title || 'Unknown';
    }

    function buildTrackingUrl(baseUrl, pageName) {
        var separator = baseUrl.indexOf('?') === -1 ? '?' : '&';
        return baseUrl + separator + 'trckaff=' + TRACK_AFF_ID + '&trckit=WIKI' + pageName;
    }

    function detectGame() {
        var pageTitle = document.title.toLowerCase();
        var bodyContent = document.getElementById('bodyContent');

        var manualGame = document.querySelector('[data-ss-game]');
        if (manualGame) return manualGame.getAttribute('data-ss-game').toLowerCase();

        var content = bodyContent ? bodyContent.innerHTML : '';
        var markerMatch = content.match(/<!--\s*SSGAME:\s*(\w+)\s*-->/i);
        if (markerMatch) return markerMatch[1].toLowerCase();

        var keywords = Object.keys(gameConfig).sort(function(a, b) { return b.length - a.length; });
        for (var i = 0; i < keywords.length; i++) {
            if (pageTitle.indexOf(keywords[i]) !== -1) return keywords[i];
        }
        return null;
    }

    function fetchPricing(gameSlug, callback) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', API_URL + '?game=' + encodeURIComponent(gameSlug), true);
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4) {
                if (xhr.status === 200) {
                    try {
                        var data = JSON.parse(xhr.responseText);
                        callback(data);
                    } catch (e) {
                        callback(null);
                    }
                } else {
                    callback(null);
                }
            }
        };
        xhr.send();
    }

    function createGameBanner(gameKey, pageName, pricingData) {
        var game = gameConfig[gameKey];
        if (!game) return null;
        var trackingUrl = buildTrackingUrl('https://www.survivalservers.com/services/game_servers/' + game.slug + '/', pageName);
        var gameIconUrl = GAME_ICON_BASE + game.dbname + '.png';

        var priceHtml = '';
        if (pricingData && pricingData.lowestPrice) {
            if (pricingData.discount && pricingData.discountedPrice && pricingData.coupon) {
                priceHtml = '<span style="display: inline-flex; align-items: center; vertical-align: middle;">' +
                    '<span style="color: rgba(255,255,255,0.7); margin: 0 12px;">|</span>' +
                    '<span style="background: #00aa55; color: #fff; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: 700; display: inline-flex; align-items: center;">Use code ' + pricingData.coupon + ' for ' + pricingData.discount + '% OFF</span>' +
                    '<span style="color: rgba(255,255,255,0.5); margin: 0 8px;"></span>' +
                    '<span style="color: #888; text-decoration: line-through; font-size: 13px; display: inline-flex; align-items: center;">$' + pricingData.lowestPrice + '</span>' +
                    '<span style="color: #00ff88; font-weight: 700; margin-left: 6px; display: inline-flex; align-items: center;">$' + pricingData.discountedPrice + '/mo</span>' +
                '</span>';
            } else {
                priceHtml = '<span style="display: inline-flex; align-items: center; vertical-align: middle;">' +
                    '<span style="color: rgba(255,255,255,0.7); margin: 0 12px;">|</span>' +
                    '<span style="color: #00ff88; font-weight: 700; display: inline-flex; align-items: center;">From $' + pricingData.lowestPrice + '/mo</span>' +
                '</span>';
            }
        }

        var banner = document.createElement('div');
        banner.id = 'ss-game-banner';
        banner.innerHTML = '<div style="background: #1a1a1a; border-radius: 6px; padding: 0; margin: 0 0 20px 0; box-shadow: 0 2px 10px rgba(0,0,0,0.5); overflow: hidden; border: 2px solid rgb(219, 155, 21);">' +
            '<div style="padding: 16px 25px; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 15px;">' +
                '<div style="display: flex; align-items: center; gap: 18px; flex: 1; min-width: 280px;">' +
                    '<a href="' + buildTrackingUrl('https://www.survivalservers.com/', pageName) + '" style="flex-shrink: 0; display: flex; align-items: center;"><img src="' + LOGO_URL + '" alt="SurvivalServers" style="height: 32px; width: auto; vertical-align: middle;"></a>' +
                    '<div style="height: 28px; width: 1px; background: rgba(255,255,255,0.2);"></div>' +
                    '<div style="display: flex; align-items: center; gap: 10px;">' +
                        '<img src="' + gameIconUrl + '" alt="" style="width: 28px; height: 28px; border-radius: 4px; vertical-align: middle;" onerror="this.style.display=\'none\'">' +
                        '<span style="color: rgb(219, 155, 21); font-weight: 600; font-size: 15px; display: inline-flex; align-items: center;">' + game.name + ' Server Hosting</span>' +
                    '</div>' +
                    priceHtml +
                '</div>' +
                '<div style="display: flex; align-items: center; gap: 20px;">' +
                    '<div style="color: rgba(255,255,255,0.8); font-size: 13px; display: flex; align-items: center; gap: 12px;">' +
                        '<span>High Performance</span>' +
                        '<span style="color: rgba(255,255,255,0.4);">&#8226;</span>' +
                        '<span>Custom Control Panel</span>' +
                        '<span style="color: rgba(255,255,255,0.4);">&#8226;</span>' +
                        '<span>Instant Setup</span>' +
                    '</div>' +
                    '<a href="' + trackingUrl + '" style="background: rgb(219, 155, 21); color: #1a1a1a; padding: 10px 28px; border-radius: 4px; text-decoration: none; font-weight: 700; font-size: 14px; display: inline-flex; align-items: center; gap: 8px; transition: all 0.2s ease; white-space: nowrap;" onmouseover="this.style.background=\'rgb(239, 175, 41)\';this.style.transform=\'translateY(-1px)\';" onmouseout="this.style.background=\'rgb(219, 155, 21)\';this.style.transform=\'translateY(0)\';">' +
                        'Order Now <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"><path d="M5 12h14M12 5l7 7-7 7"/></svg>' +
                    '</a>' +
                '</div>' +
            '</div>' +
        '</div>';
        return banner;
    }

    function createGenericBanner(pageName, pricingData) {
        var trackingUrl = buildTrackingUrl('https://www.survivalservers.com/', pageName);

        var couponHtml = '';
        if (pricingData && pricingData.discount && pricingData.coupon) {
            couponHtml = '<span style="display: inline-flex; align-items: center; vertical-align: middle;">' +
                '<span style="color: rgba(255,255,255,0.7); margin: 0 12px;">|</span>' +
                '<span style="background: #00aa55; color: #fff; padding: 2px 8px; border-radius: 3px; font-size: 12px; font-weight: 700; display: inline-flex; align-items: center;">Use code ' + pricingData.coupon + ' for ' + pricingData.discount + '% OFF</span>' +
            '</span>';
        }

        var banner = document.createElement('div');
        banner.id = 'ss-game-banner';
        banner.innerHTML = '<div style="background: #1a1a1a; border-radius: 6px; padding: 0; margin: 0 0 20px 0; box-shadow: 0 2px 10px rgba(0,0,0,0.5); overflow: hidden; border: 2px solid rgb(219, 155, 21);">' +
            '<div style="padding: 16px 25px; display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 15px;">' +
                '<div style="display: flex; align-items: center; gap: 18px; flex: 1; min-width: 280px;">' +
                    '<a href="' + trackingUrl + '" style="flex-shrink: 0; display: flex; align-items: center;"><img src="' + LOGO_URL + '" alt="SurvivalServers" style="height: 32px; width: auto; vertical-align: middle;"></a>' +
                    '<div style="height: 28px; width: 1px; background: rgba(255,255,255,0.2);"></div>' +
                    '<span style="color: rgb(219, 155, 21); font-weight: 600; font-size: 15px; display: inline-flex; align-items: center;">Premium Game Server Hosting</span>' +
                    '<span style="color: rgba(255,255,255,0.7); margin: 0 8px; display: inline-flex; align-items: center;">|</span>' +
                    '<span style="color: rgba(255,255,255,0.9); font-size: 14px; display: inline-flex; align-items: center;">100+ Games Available</span>' +
                    couponHtml +
                '</div>' +
                '<div style="display: flex; align-items: center; gap: 20px;">' +
                    '<div style="color: rgba(255,255,255,0.8); font-size: 13px; display: flex; align-items: center; gap: 12px;">' +
                        '<span>High Performance</span>' +
                        '<span style="color: rgba(255,255,255,0.4);">&#8226;</span>' +
                        '<span>Custom Control Panel</span>' +
                        '<span style="color: rgba(255,255,255,0.4);">&#8226;</span>' +
                        '<span>Instant Setup</span>' +
                    '</div>' +
                    '<a href="' + trackingUrl + '" style="background: rgb(219, 155, 21); color: #1a1a1a; padding: 10px 28px; border-radius: 4px; text-decoration: none; font-weight: 700; font-size: 14px; display: inline-flex; align-items: center; gap: 8px; transition: all 0.2s ease; white-space: nowrap;" onmouseover="this.style.background=\'rgb(239, 175, 41)\';this.style.transform=\'translateY(-1px)\';" onmouseout="this.style.background=\'rgb(219, 155, 21)\';this.style.transform=\'translateY(0)\';">' +
                        'Browse Games <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3"><path d="M5 12h14M12 5l7 7-7 7"/></svg>' +
                    '</a>' +
                '</div>' +
            '</div>' +
        '</div>';
        return banner;
    }

    function insertBanner(banner) {
        if (!banner) return;
        var contentDiv = document.getElementById('bodyContent');
        if (contentDiv) contentDiv.insertBefore(banner, contentDiv.firstChild);
    }

    function init() {
        var pageTitle = document.title;
        if (pageTitle.indexOf('Main Page') !== -1) return;
        if (window.location.href.indexOf('Special:') !== -1) return;

        var pageName = getPageName();
        var gameKey = detectGame();
        var game = gameKey ? gameConfig[gameKey] : null;

        if (game) {
            fetchPricing(game.dbname, function(pricingData) {
                var banner = createGameBanner(gameKey, pageName, pricingData);
                insertBanner(banner);
            });
        } else {
            fetchPricing('', function(pricingData) {
                var banner = createGenericBanner(pageName, pricingData);
                insertBanner(banner);
            });
        }
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
})();