LOLICON Wide Hentai

Full width E-Hentai and Exhentai, dynamically adjusting the page width, also allows you to adjust the size and margins of the thumbnails

// ==UserScript==
// @name                LOLICON Wide Hentai
// @name:zh-CN          LOLICON 宽屏E绅士
// @name:zh-TW          LOLICON 寬屏E紳士
// @name:ja             LOLICON ワイド Hentai
// @name:ko             LOLICON 와이드 Hentai
// @name:ru             LOLICON Широкий Hentai
// @namespace           https://greasyfork.org/scripts/516145
// @version             2024.12.12
// @description         Full width E-Hentai and Exhentai, dynamically adjusting the page width, also allows you to adjust the size and margins of the thumbnails
// @description:zh-CN   全屏宽度 E 绅士,动态调整页面宽度,同时支持调整缩略图大小和边距
// @description:zh-TW   全螢幕寬度 E 紳士,動態調整頁面寬度,並支援調整縮圖大小及邊距
// @description:ja      フルスクリーン幅 E-Hentai と Exhentai、ページ幅を動的に調整し、サムネイルのサイズと余白も調整可能
// @description:ko      전체 화면 너비 E-Hentai와 Exhentai, 페이지 너비를 동적으로 조정하고 썸네일 크기와 여백도 조정 가능
// @description:ru      Полная ширина E-Hentai и Exhentai, динамически регулирующая ширину страницы, а также позволяющая изменять размер миниатюр и поля
// @icon                https://e-hentai.org/favicon.ico
// @match               https://e-hentai.org/*
// @match               https://exhentai.org/*
// @exclude             https://e-hentai.org/s/*
// @exclude             https://exhentai.org/s/*
// @run-at              document-end
// @grant               GM_setValue
// @grant               GM_getValue
// @grant               GM_registerMenuCommand
// @noframes
// ==/UserScript==

(function() {
    'use strict';

    function $(id) { return document.getElementById(id); }

    function c(id) { return document.getElementsByClassName(id); }

    // 获取当前设备的设备像素比(DPR)
    const devicePixelRatio = window.devicePixelRatio || 1;

    // 获取用户语言
    const userLang = navigator.language || navigator.userLanguage;

    let columnWidthS, columnWidthSb, columnWidthG, marginAdjustmentS, marginAdjustmentG, paddingAdjustmentS;

    // 搜索类别行
    let initialTableRows = null;

    // 缩略图信息
    let thumbnailData = [];

    // 配置项
    const config = {
        zoomFactor: { step: 0.01, min: 0.5, max: 10 },
        margin: { step: 1, min: 0, max: 100 },
        pageMargin: { step: 1, min: 0, max: 1000 },
        pagePadding: { step: 1, min: 0, max: 100 },
    }

    // 设置默认值
    const defaults = { zoomFactor: 1, margin: 10, pageMargin: 10, pagePadding: 10, fullScreenMode: false, squareMode: false };

    let zoomFactor = GM_getValue('zoomFactor', defaults.zoomFactor);
    let margin = GM_getValue('margin', defaults.margin);
    let pageMargin = GM_getValue('pageMargin', defaults.pageMargin);
    let pagePadding = GM_getValue('pagePadding', defaults.pagePadding);
    let fullScreenMode = GM_getValue('fullScreenMode', defaults.fullScreenMode);
    let squareMode = GM_getValue('squareMode', defaults.squareMode);

    const isThumbnailMode = window.location.pathname.indexOf('/g/') != 0 && c('itg gld')[0]; // 非画廊页面 且 缩略图模式
    const isGalleryPage = window.location.pathname.indexOf('/g/') == 0 // /g/ 画廊页面

    /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */

    /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */

    // 定义语言包
    const translations = {
        'zoomFactor': {
            'en': 'Thumbnail Zoom :',
            'zh-CN': '缩略图缩放 :',
            'zh-TW': '縮圖縮放 :',
            'ja': 'サムネイルズーム :',
            'ko': '썸네일 확대 비율 :',
            'ru': 'Масштаб миниатюры :'
        },
        'zoomFactorRange': {
            'en': `Invalid Thumbnail zoom factor! Please enter a value between ${config.zoomFactor.min} and ${config.zoomFactor.max}. Default ${defaults.zoomFactor}`,
            'zh-CN': `缩略图缩放比例无效!请输入 ${config.zoomFactor.min} 至 ${config.zoomFactor.max} 之间的值。 默认 ${defaults.zoomFactor}`,
            'zh-TW': `縮圖縮放比例無效!請輸入 ${config.zoomFactor.min} 至 ${config.zoomFactor.max} 之間的值。 預設為 ${defaults.zoomFactor}`,
            'ja': `無効なサムネイルズーム比率! ${config.zoomFactor.min} から ${config.zoomFactor.max} の間の値を入力してください。 デフォルトは ${defaults.zoomFactor}`,
            'ko': `잘못된 썸네일 확대 비율! ${config.zoomFactor.min} 에서 ${config.zoomFactor.max} 사이의 값을 입력하세요. 기본값 ${defaults.zoomFactor}`,
            'ru': `Неверный масштаб миниатюры! Пожалуйста, введите значение от ${config.zoomFactor.min} до ${config.zoomFactor.max}. По умолчанию ${defaults.zoomFactor}`
        },
        'margin': {
            'en': 'Thumbnail Margin :',
            'zh-CN': '缩略图边距 :',
            'zh-TW': '縮圖邊距 :',
            'ja': 'サムネイルマージン :',
            'ko': '썸네일 여백 :',
            'ru': 'Отступы миниатюры :'
        },
        'marginRange': {
            'en': `Invalid Thumbnail margin! Please enter a value between ${config.margin.min} and ${config.margin.max}. Default ${defaults.margin}`,
            'zh-CN': `缩略图边距无效!请输入 ${config.margin.min} 至 ${config.margin.max} 之间的值。 默认 ${defaults.margin}`,
            'zh-TW': `縮圖邊距無效!請輸入 ${config.margin.min} 至 ${config.margin.max} 之間的值。 預設為 ${defaults.margin}`,
            'ja': `無効なサムネイルマージン! ${config.margin.min} から ${config.margin.max} の間の値を入力してください。 デフォルトは ${defaults.margin}`,
            'ko': `잘못된 썸네일 여백! ${config.margin.min} 에서 ${config.margin.max} 사이의 값을 입력하세요. 기본값 ${defaults.margin}`,
            'ru': `Неверный Отступы миниатюры! Пожалуйста, введите значение от ${config.margin.min} до ${config.margin.max}. По умолчанию ${defaults.margin}`
        },
        'pageMargin': {
            'en': 'Page Margin :',
            'zh-CN': '页面外边距 :',
            'zh-TW': '頁面外邊距 :',
            'ja': 'ページマージン :',
            'ko': '페이지 외부 여백 :',
            'ru': 'Внешний отступ страницы :'
        },
        'pageMarginRange': {
            'en': `Invalid page margin! Please enter a value between ${config.pageMargin.min} and ${config.pageMargin.max}. Default ${defaults.pageMargin}`,
            'zh-CN': `页面外边距无效!请输入 ${config.pageMargin.min} 至 ${config.pageMargin.max} 之间的值。 默认 ${defaults.pageMargin}`,
            'zh-TW': `頁面外邊距無效!請輸入 ${config.pageMargin.min} 至 ${config.pageMargin.max} 之間的值。 預設為 ${defaults.pageMargin}`,
            'ja': `無効なページマージン! ${config.pageMargin.min} から ${config.pageMargin.max} の間の値を入力してください。 デフォルトは ${defaults.pageMargin}`,
            'ko': `잘못된 페이지 외부 여백! ${config.pageMargin.min} 에서 ${config.pageMargin.max} 사이의 값을 입력하세요. 기본값 ${defaults.pageMargin}`,
            'ru': `Неверный Внешний отступ страницы! Пожалуйста, введите значение от ${config.pageMargin.min} до ${config.pageMargin.max}. По умолчанию ${defaults.pageMargin}`
        },
        'pagePadding': {
            'en': 'Page Padding :',
            'zh-CN': '页面内边距 :',
            'zh-TW': '頁面內邊距 :',
            'ja': 'ページパディング :',
            'ko': '페이지 내부 여백 :',
            'ru': 'Внутренний отступ страницы :'
        },
        'pagePaddingRange': {
            'en': `Invalid page padding! Please enter a value between ${config.pagePadding.min} and ${config.pagePadding.max}. Default ${defaults.pagePadding}`,
            'zh-CN': `页面内边距无效!请输入 ${config.pagePadding.min} 至 ${config.pagePadding.max} 之间的值。 默认 ${defaults.pagePadding}`,
            'zh-TW': `頁面內邊距無效!請輸入 ${config.pagePadding.min} 至 ${config.pagePadding.max} 之間的值。 預設為 ${defaults.pagePadding}`,
            'ja': `無効なページパディング! ${config.pagePadding.min} から ${config.pagePadding.max} の間の値を入力してください。 デフォルトは ${defaults.pagePadding}`,
            'ko': `잘못된 페이지 내부 여백! ${config.pagePadding.min} 에서 ${config.pagePadding.max} 사이의 값을 입력하세요. 기본값 ${defaults.pagePadding}`,
            'ru': `Неверный Внутренний отступ страницы! Пожалуйста, введите значение от ${config.pagePadding.min} до ${config.pagePadding.max}. По умолчанию ${defaults.pagePadding}`
        },
        'fullScreenMode': {
            'en': 'Full Screen Mode :',
            'zh-CN': '全屏模式 :',
            'zh-TW': '全螢幕模式 :',
            'ja': 'フルスクリーンモード :',
            'ko': '전체 화면 모드 :',
            'ru': 'Режим полного экрана :'
        },
        'squareMode': {
            'en': 'Square Thumbnail :',
            'zh-CN': '方形缩略图 :',
            'zh-TW': '方形縮圖 :',
            'ja': 'スクエアサムネイル :',
            'ko': '정사각형 썸네일 :',
            'ru': 'Квадратная миниатюра :'
        },
        'settings': {
            'en': 'Settings',
            'zh-CN': '设置',
            'zh-TW': '設置',
            'ja': '設定',
            'ko': '설정',
            'ru': 'Настройки'
        },
        'settingsPanel': {
            'en': 'Settings Panel',
            'zh-CN': '设置面板',
            'zh-TW': '設置面板',
            'ja': '設定パネル',
            'ko': '설정 패널',
            'ru': 'Панель настроек'
        },
        'save': {
            'en': 'Save',
            'zh-CN': '保存',
            'zh-TW': '儲存',
            'ja': '保存',
            'ko': '저장',
            'ru': 'Сохранить'
        },
        'cancel': {
            'en': 'Cancel',
            'zh-CN': '取消',
            'zh-TW': '取消',
            'ja': 'キャンセル',
            'ko': '취소',
            'ru': 'Отменить'
        },
    };

    // 根据用户语言选择对应的文本
    const translate = (key) => {
        const lang = userLang.substring(0, 2);
        switch (lang) {
            case 'zh':
                return translations[key][userLang.startsWith('zh-TW') ? 'zh-TW' : 'zh-CN'];
            case 'ja':
                return translations[key].ja;
            case 'ko':
                return translations[key].ko;
            case 'ru':
                return translations[key].ru;
            default:
                return translations[key].en;
        }
    };

    // 创建和显示设置面板
    function showSettingsPanel() {
        if (document.getElementById('settings-panel')) return;

        const panel = document.createElement('div');
        panel.id = 'settings-panel';
        panel.style.position = 'fixed';
        panel.style.top = '24px';
        panel.style.right = '24px';
        panel.style.padding = '12px 12px';
        panel.style.backgroundColor = 'rgba(255, 255, 255, 0.84)';
        panel.style.border = '2px solid #00AAFF';
        panel.style.borderRadius = '9px';
        panel.style.boxShadow = '0 0 12px rgba(0,0,0,0.24)';
        panel.style.zIndex = '999999';
        panel.style.fontFamily = '"Segoe UI", Tahoma, Geneva, Verdana, sans-serif';
        panel.style.fontSize = '12px';
        panel.style.color = '#222';

        if (isThumbnailMode) {
            panel.innerHTML = `
            <h3 style='margin: 0; margin-bottom: 10px; font-size: 16px; color: #00AAFF; text-align: center;'>${translate('settingsPanel')}</h3>
            ${createInputHTML('zoomFactor', zoomFactor, config.zoomFactor.step, config.zoomFactor.min, config.zoomFactor.max)}
            ${createInputHTML('margin', margin, config.margin.step, config.margin.min, config.margin.max)}
            ${createInputHTML('pageMargin', pageMargin, config.pageMargin.step, config.pageMargin.min, config.pageMargin.max)}
            ${createInputHTML('pagePadding', pagePadding, config.pagePadding.step, config.pagePadding.min, config.pagePadding.max)}
            ${createCheckboxHTML('fullScreenMode', fullScreenMode == true)}
            ${createCheckboxHTML('squareMode', squareMode == true)}
            ${createButtonsHTML()}
        `;
        } else if (isGalleryPage) {
            panel.innerHTML = `
            <h3 style='margin: 0; margin-bottom: 10px; font-size: 16px; color: #00AAFF; text-align: center;'>${translate('settingsPanel')}</h3>
            ${createInputHTML('pageMargin', pageMargin, config.pageMargin.step, config.pageMargin.min, config.pageMargin.max)}
            ${createCheckboxHTML('fullScreenMode', fullScreenMode == true)}
            ${createButtonsHTML()}
        `;
        }

        document.body.appendChild(panel);

        panel.addEventListener('wheel', (event) => {
            event.preventDefault();
            event.stopPropagation();
        }, { passive: false });

        bindInputEvents(panel);
        bindButtons(panel);
    }

    // 动态生成输入框HTML
    function createInputHTML(name, value, step, min, max) {
        return `
        <div style='margin-bottom: 10px; display: flex; align-items: center;'>
            <label for='${name}Input' style='font-weight: bold; margin-right: 10px;'>${translate(name)}</label>
            <input type='number' id='${name}Input' value='${value}' step='${step}' min='${min}' max='${max}' style='width: 60px; padding: 5px; border: 1px solid #ccc; border-radius: 5px; box-sizing: border-box; margin-left: auto;'>
        </div>
    `;
    }

    // 动态生成复选框HTML
    function createCheckboxHTML(name, checked) {
        return `
        <div style='margin-bottom: 10px; display: flex; align-items: center;'>
            <label for='${name}Input' style='font-weight: bold; margin-right: 10px;'>${translate(name)}</label>
            <input type='checkbox' id='${name}Input' style='width: 30px; height: 20px; cursor: pointer; margin-left: auto;' ${checked ? 'checked' : ''}>
        </div>
    `;
    }

    // 动态生成按钮HTML
    function createButtonsHTML() {
        return `
        <div style='display: flex; justify-content: space-between;'>
            <button id='saveSettingsBtn' style='padding: 8px 12px; background-color: #00AAFF; color: white; border: none; border-radius: 5px; cursor: pointer; font-weight: bold;'>${translate('save')}</button>
            <button id='cancelSettingsBtn' style='padding: 8px 12px; background-color: #FF2222; color: white; border: none; border-radius: 5px; cursor: pointer; font-weight: bold;'>${translate('cancel')}</button>
        </div>
    `;
    }

    // 绑定事件
    function bindInputEvents(panel) {
        panel.querySelectorAll('input[type="number"]').forEach(input => {
            input.addEventListener('input', handleInputChange);
            input.addEventListener('wheel', handleWheelChange);
        });
        ['#fullScreenModeInput', '#squareModeInput'].forEach(selector => {
            const input = panel.querySelector(selector);
            if (input) {
                input.addEventListener('change', handleCheckboxChange);
            }
        });
    }

    function bindButtons(panel) {
        panel.querySelectorAll('button').forEach(btn => {
            btn.addEventListener('mouseover', function() { this.style.opacity = '0.8'; });
            btn.addEventListener('mouseout', function() { this.style.opacity = '1'; });
        });
        panel.querySelector('#saveSettingsBtn').addEventListener('click', () => saveSettings(panel));
        panel.querySelector('#cancelSettingsBtn').addEventListener('click', () => cancelSettings(panel));
    }

    // 输入框变化事件
    function handleInputChange(event) {
        const { id, value } = event.target;
        const numValue = parseFloat(value);
        if (id.includes('zoomFactor') && numValue >= config.zoomFactor.min && numValue <= config.zoomFactor.max) {
            zoomFactor = numValue;
        } else if (id.includes('margin') && numValue >= config.margin.min && numValue <= config.margin.max) {
            margin = numValue;
        } else if (id.includes('pageMargin') && numValue >= config.pageMargin.min && numValue <= config.pageMargin.max) {
            pageMargin = numValue;
        } else if (id.includes('pagePadding') && numValue >= config.pagePadding.min && numValue <= config.pagePadding.max) {
            pagePadding = numValue;
        }
        applyChanges();
    }

    // 滚轮事件处理
    function handleWheelChange(event) {
        event.preventDefault();
        const input = event.target;
        let value = parseFloat(input.value);
        const step = parseFloat(input.step);
        const delta = event.deltaY < 0 ? step : -step;
        value = Math.min(parseFloat(input.max), Math.max(parseFloat(input.min), value + delta));
        if (step < 1) {
            input.value = value.toFixed(2);
        } else {
            input.value = value;
        }
        input.dispatchEvent(new Event('input'));
    }

    // 复选框变化事件
    function handleCheckboxChange(event) {
        if (event.target.id === 'fullScreenModeInput') {
            fullScreenMode = event.target.checked ? true : false;
        } else if (event.target.id === 'squareModeInput') {
            squareMode = event.target.checked ? true : false;
        }
        applyChanges();
    }

    // 保存设置
    function saveSettings(panel) {
        GM_setValue('fullScreenMode', fullScreenMode);
        GM_setValue('squareMode', squareMode);
        let errors = [];
        Object.entries(config).forEach(([settingKey, { min, max }]) => {
            const input = panel.querySelector('#' + settingKey + 'Input');
            if (input) {
                const value = parseFloat(input.value);
                if (isNaN(value) || value < min || value > max) {
                    errors.push(translate(settingKey + 'Range'));
                    return;
                }
                GM_setValue(settingKey, value);
            }
        });
        if (errors.length > 0) {
            alert(errors.join('\n\n'));
            return;
        }
        panel.remove();
    }

    // 取消设置
    function cancelSettings(panel) {
        zoomFactor = GM_getValue('zoomFactor');
        margin = GM_getValue('margin');
        pageMargin = GM_getValue('pageMargin');
        pagePadding = GM_getValue('pagePadding');
        fullScreenMode = GM_getValue('fullScreenMode');
        squareMode = GM_getValue('squareMode');
        applyChanges();
        panel.remove();
    }

    // 应用更改
    function applyChanges() {
        calculateDimensions();
        if (isThumbnailMode) {
            adjustColumnsS();
            modifyThumbnailSize();
        } else if (isGalleryPage) {
            adjustColumnsG();
        }
    }

    // 初始化设置 如果为空 先保存初始值
    function initialize() {
        for (const [key, defaultValue] of Object.entries(defaults)) {
            window[key] = GM_getValue(key, defaultValue);
            if (GM_getValue(key) === undefined) {
                GM_setValue(key, defaultValue);
            }
        }
    }

    /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */

    /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */

    // 计算尺寸
    function calculateDimensions() {
        columnWidthS = 250 * zoomFactor + margin * 2; // 每列的宽度 250-400 270
        columnWidthSb = columnWidthS + (2 / devicePixelRatio); // 加上缩略图边框,边框宽度受设备像素比影响
        columnWidthG = 240; // 画廊每列的宽度
        marginAdjustmentS = 14 + pageMargin * 2; // 页面边距调整值 body-padding:2 ido-padding:5
        marginAdjustmentG = 34 + pageMargin * 2; // 画廊页面边距调整值 body-padding:2 gdt-padding:15
        paddingAdjustmentS = pagePadding * 2; // 页面内边距调整值
    }

    // 根据页面宽度动态调整列数 非画廊页面 且 缩略图模式
    function adjustColumnsS() {
        const width = window.innerWidth;
        const minWidthNumber = parseFloat(getComputedStyle(c('ido')[0]).minWidth);
        let clientWidthS_itg = Math.max(width - marginAdjustmentS - paddingAdjustmentS, minWidthNumber); // 计算宽度
        let columnsS = Math.max(Math.floor(clientWidthS_itg / columnWidthSb), 1); // 计算列数
        clientWidthS_itg = Math.max(columnsS * columnWidthSb, fullScreenMode ? clientWidthS_itg : minWidthNumber); // 根据全屏模式调整
        let clientWidthS_ido = Math.min(clientWidthS_itg + paddingAdjustmentS, width);
        c('ido')[0].style.maxWidth = clientWidthS_ido + 'px'; // 设置最大宽度   1370
        c('itg gld')[0].style.gridTemplateColumns = 'repeat(' + columnsS + ', 1fr)'; // 设置列数
        c('itg gld')[0].style.width = clientWidthS_itg + 'px'; // 设置边距 '99%'
        const searchbox = $('searchbox'); //搜索盒子
        if (searchbox) {
            const tbody = searchbox.querySelector('tbody');
            if (tbody) {
                // 保存搜索类别行
                if (!initialTableRows) {
                    initialTableRows = tbody.innerHTML;
                }
                if (clientWidthS_ido >= 1460) {
                    // 合并搜索类别行
                    const rows = tbody.querySelectorAll('tr');
                    if (rows.length >= 2) {
                        const firstRow = rows[0];
                        const secondRow = rows[1];
                        Array.from(secondRow.children).forEach(td => {
                            firstRow.appendChild(td);
                        });
                        secondRow.remove();
                    }
                } else {
                    // 恢复为初始状态
                    tbody.innerHTML = initialTableRows;
                }
            }
            // 调整搜索盒子大小
            if (clientWidthS_ido >= 1460) {
                if (c('idi')[0]) { c('idi')[0].style.width = 720 + 670 + 'px'; }
                if (c('idi')[1]) { c('idi')[1].style.width = 720 + 670 + 'px'; }
                if ($('f_search')) { $('f_search').style.width = 560 + 670 + 'px'; }
            } else {
                if (c('idi')[0]) { c('idi')[0].style.width = 720 + 'px'; }
                if (c('idi')[1]) { c('idi')[1].style.width = 720 + 'px'; }
                if ($('f_search')) { $('f_search').style.width = 560 + 'px'; }
            }
        }
    }

    // 根据页面宽度动态调整列数 画廊页面
    function adjustColumnsG() {
        const width = window.innerWidth;
        let columnsG = Math.floor((width - marginAdjustmentG) / columnWidthG); // 减去边距,并计算列数
        columnsG = Math.max(columnsG, 3);
        let clientWidthG_gdt = 700 + (columnsG - 3) * columnWidthG;
        if (fullScreenMode && columnsG >= 6) {
            clientWidthG_gdt = width - marginAdjustmentG;
        }
        if (columnsG >= 6) {
            if (c('gm')[0]) { c('gm')[0].style.maxWidth = (clientWidthG_gdt + 20) + 'px'; } // 设置最详情大宽度 720 960 1200
            if (c('gm')[1]) { c('gm')[1].style.maxWidth = (clientWidthG_gdt + 20) + 'px'; } // 设置最评论区大宽度 720 960 1200
            if ($('gd2')) { $('gd2').style.width = (clientWidthG_gdt - 255) + 'px'; } // 设置标题栏宽度 710 925
            if ($('gmid')) { $('gmid').style.width = (clientWidthG_gdt - 250) + 'px'; } // 设置标签栏宽度 710 930
            if ($('gd4')) { $('gd4').style.width = (clientWidthG_gdt - 600) + 'px'; } // 设置标签栏宽度 360 580
            if ($('gdo')) { $('gdo').style.maxWidth = (clientWidthG_gdt + 20) + 'px'; } // 设置缩略图设置栏最大宽度 720 960 1200
        } else {
            if (c('gm')[0]) { c('gm')[0].style.maxWidth = ''; } // 设置最详情大宽度
            if (c('gm')[1]) { c('gm')[1].style.maxWidth = ''; } // 设置最评论区大宽度
            if ($('gd2')) { $('gd2').style.width = ''; } // 设置标题栏宽度
            if ($('gmid')) { $('gmid').style.width = ''; } // 设置标签栏宽度
            if ($('gd4')) { $('gd4').style.width = '' } // 设置标签栏宽度
            if ($('gdo')) { $('gdo').style.maxWidth = ''; } // 设置缩略图设置栏最大宽度
        }
        const gdt = $('gdt');
        if (gdt) {
            if (columnsG < 6) {
                const minWidthNumber = parseFloat(getComputedStyle(c('gm')[0]).maxWidth);
                clientWidthG_gdt = minWidthNumber - 20;
                columnsG = Math.floor(minWidthNumber / columnWidthG);
            }
            gdt.style.maxWidth = clientWidthG_gdt + 'px'; // 设置最大宽度 700 940 1180
            if (gdt.classList.contains('gt100')) {
                gdt.style.gridTemplateColumns = 'repeat(' + columnsG * 2 + ', 1fr)';
            } else if (gdt.classList.contains('gt200')) {
                gdt.style.gridTemplateColumns = 'repeat(' + columnsG + ', 1fr)';
            }
        }
    }

    // 收集缩略图信息
    function collectThumbnailData() {
        const gl1tElements = document.querySelectorAll('.gl1t');
        gl1tElements.forEach(gl1t => {
            const gl3t = gl1t.querySelector('.gl3t');
            const gl4t = gl1t.querySelector('.gl4t');
            const gl5t = gl1t.querySelector('.gl5t');
            const gl6t = gl1t.querySelector('.gl6t');
            const img = gl3t ? gl3t.querySelector('img') : null;
            thumbnailData.push({
                gl1t,
                gl3t,
                gl4t,
                gl5t,
                gl6t,
                img,
                originalWidth: gl3t ? gl3t.clientWidth : 0,
                originalHeight: gl3t ? gl3t.clientHeight : 0,
                originalImgWidth: img ? img.clientWidth : 0,
                originalImgHeight: img ? img.clientHeight : 0,
            });
        });
    }

    // 修改缩略图大小
    function modifyThumbnailSize() {
        const minWidthNumber = parseFloat(getComputedStyle(c('ido')[0]).minWidth);
        let columnWidthSbm = Math.max(columnWidthSb, minWidthNumber / Math.floor(Math.max(minWidthNumber / columnWidthSb, 1)));
        if (fullScreenMode) {
            columnWidthSbm = columnWidthS * 2;
        }
        thumbnailData.forEach(data => {
            const { gl1t, gl3t, gl4t, gl5t, gl6t, img, originalWidth, originalHeight, originalImgWidth, originalImgHeight } = data;
            let zoomFactorL = zoomFactor;
            if (squareMode && originalWidth < 250) {
                zoomFactorL = zoomFactor * 250 / originalWidth
            }
            // 设置 .gl1t 的宽度
            gl1t.style.minWidth = columnWidthS + 'px';
            gl1t.style.maxWidth = columnWidthSbm + 'px';
            // 调整 gl3t 的宽高
            if (gl3t) {
                const newWidth = originalWidth * zoomFactorL;
                const newHeight = originalHeight * zoomFactorL;
                gl3t.style.width = newWidth + 'px';
                if (squareMode) {
                    gl3t.style.height = newWidth + 'px';
                } else {
                    gl3t.style.height = newHeight + 'px';
                }
            }
            // 小列宽时处理 gl5t 换行逻辑
            if (gl5t) {
                if (columnWidthS <= 199) {
                    gl5t.style.flexWrap = 'wrap';
                    gl5t.style.height = '92px';
                    const firstChild = gl5t.querySelector('div:nth-child(1)');
                    if (firstChild) { firstChild.style.left = '4.5px'; }
                } else {
                    gl5t.style.flexWrap = '';
                    gl5t.style.height = '';
                    const firstChild = gl5t.querySelector('div:nth-child(1)');
                    if (firstChild) { firstChild.style.left = ''; }
                }
            }
            // 调整图片的宽高
            if (img) {
                const newImgWidth = originalImgWidth * zoomFactorL;
                const newImgHeight = originalImgHeight * zoomFactorL;
                let width = newImgWidth;
                let height = newImgHeight;
                let top = '';
                let left = '';
                if (squareMode) {
                    if (newImgWidth <= newImgHeight) {
                        top = ((originalWidth * zoomFactorL) - newImgHeight) / 2 + 'px';
                    } else {
                        left = ((originalWidth * zoomFactorL) - (newImgWidth * newImgWidth / newImgHeight)) / 2 + 'px';
                        width = newImgWidth * newImgWidth / newImgHeight;
                        height = newImgWidth;
                    }
                } else {
                    top = ((originalHeight * zoomFactorL) - newImgHeight) / 2 + 'px';
                }
                img.style.width = width + 'px';
                img.style.height = height + 'px';
                img.style.top = top;
                img.style.left = left;
            }
        });
    }

    /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */

    /* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */

    // 设置菜单
    if (isThumbnailMode || isGalleryPage) {
        GM_registerMenuCommand(translate('settings'), showSettingsPanel);
    }

    // 初始化
    initialize();
    calculateDimensions();
    if (isThumbnailMode) {
        collectThumbnailData();
        modifyThumbnailSize();
        adjustColumnsS();
        window.addEventListener('resize', adjustColumnsS); // 窗口大小变化时调整列数
    } else if (isGalleryPage) {
        adjustColumnsG();
        window.addEventListener('resize', adjustColumnsG); // 窗口大小变化时调整列数
    }

})();