Яндекс поиск по дате (Тёмная тема)

Добавляет плавающее окно с дорками для Яндекса, включая фильтр по одной дате или диапазону. Запоминает последний запрос.

// ==UserScript==
// @name         Яндекс поиск по дате (Тёмная тема)
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  Добавляет плавающее окно с дорками для Яндекса, включая фильтр по одной дате или диапазону. Запоминает последний запрос.
// @author       Your Name
// @match        https://ya.ru/*
// @match        https://yandex.ru/*
// @match        https://yandex.by/*
// @match        https://yandex.com.tr/*
// @license MIT
// @grant        GM_addStyle
// ==/UserScript==

(function() {
    'use strict';

    // Стили для окна и кнопки в тёмной теме
    GM_addStyle(`
        .dork-widget-button {
            position: fixed;
            bottom: 20px;
            right: 20px;
            background-color: #333;
            color: #ffcc00;
            border: 1px solid #555;
            border-radius: 50%;
            width: 50px;
            height: 50px;
            font-size: 24px;
            cursor: pointer;
            box-shadow: 0 4px 8px rgba(0,0,0,0.4);
            z-index: 10000;
            transition: background-color 0.2s;
        }
        .dork-widget-button:hover {
            background-color: #444;
        }
        .dork-widget-window {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            width: 350px;
            background-color: #2d2d2d;
            color: #f0f0f0;
            border: 1px solid #555;
            border-radius: 8px;
            box-shadow: 0 4px 12px rgba(0,0,0,0.5);
            z-index: 10001;
            display: none;
            flex-direction: column;
            padding: 0;
            font-family: Arial, sans-serif;
        }
        .dork-widget-header {
            cursor: move;
            padding: 10px;
            background-color: #3a3a3a;
            border-bottom: 1px solid #555;
            text-align: center;
            font-weight: bold;
            border-top-left-radius: 8px;
            border-top-right-radius: 8px;
            position: relative;
        }
        .dork-widget-content {
            padding: 15px;
            display: flex;
            flex-direction: column;
        }
        .dork-widget-content label {
            margin-top: 10px;
            margin-bottom: 5px;
        }
        .dork-widget-content input {
            padding: 8px;
            border: 1px solid #555;
            background-color: #444;
            color: #f0f0f0;
            border-radius: 4px;
            width: calc(100% - 18px);
        }
        .dork-widget-content input[type="date"]::-webkit-calendar-picker-indicator {
            filter: invert(1);
        }
        .dork-widget-content button {
            margin-top: 15px;
            padding: 10px;
            background-color: #ffcc00;
            color: #000;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-weight: bold;
            transition: background-color 0.2s;
        }
        .dork-widget-content button:hover {
            background-color: #e6b800;
        }
        .dork-widget-close {
            position: absolute;
            top: 50%;
            transform: translateY(-50%);
            right: 15px;
            background: none;
            border: none;
            font-size: 24px;
            line-height: 1;
            color: #ccc;
            cursor: pointer;
            padding: 0;
            transition: color 0.2s;
        }
        .dork-widget-close:hover {
            color: #fff;
        }
    `);

    // Создание кнопки
    const widgetButton = document.createElement('button');
    widgetButton.innerHTML = '🔍';
    widgetButton.className = 'dork-widget-button';
    document.body.appendChild(widgetButton);

    // Создание окна
    const widgetWindow = document.createElement('div');
    widgetWindow.className = 'dork-widget-window';
    widgetWindow.innerHTML = `
        <div class="dork-widget-header">
            Яндекс Дорки
            <button class="dork-widget-close">×</button>
        </div>
        <div class="dork-widget-content">
            <label for="dork-query">Запрос:</label>
            <input type="text" id="dork-query" placeholder="Введите запрос">

            <label for="dork-start-date">С даты (или конкретная дата):</label>
            <input type="date" id="dork-start-date">

            <label for="dork-end-date">По дату (для диапазона):</label>
            <input type="date" id="dork-end-date">

            <button id="dork-search-button">Искать</button>
        </div>
    `;
    document.body.appendChild(widgetWindow);

    const closeButton = widgetWindow.querySelector('.dork-widget-close');
    const searchButton = widgetWindow.querySelector('#dork-search-button');
    const queryInput = widgetWindow.querySelector('#dork-query');
    const startDateInput = widgetWindow.querySelector('#dork-start-date');
    const endDateInput = widgetWindow.querySelector('#dork-end-date');

    // --- Функция: Загрузка сохраненных данных ---
    function loadSavedData() {
        const savedQuery = localStorage.getItem('dorkQuery');
        const savedStartDate = localStorage.getItem('dorkStartDate');
        const savedEndDate = localStorage.getItem('dorkEndDate');

        if (savedQuery) {
            queryInput.value = savedQuery;
        } else {
            // Если сохраненного запроса нет, берем с текущей страницы
            const currentSearchInput = document.querySelector('input[name="text"]') || document.querySelector('.search3__input');
            if (currentSearchInput) {
                queryInput.value = currentSearchInput.value.replace(/date:\d{8}(\.\.\d{8})?/g, '').trim();
            }
        }

        if (savedStartDate) {
            startDateInput.value = savedStartDate;
        }
        if (savedEndDate) {
            endDateInput.value = savedEndDate;
        }
    }

    // --- Показать/скрыть окно ---
    function toggleWidget() {
         if (widgetWindow.style.display === 'none' || widgetWindow.style.display === '') {
            loadSavedData(); // Загружаем данные при каждом открытии
            widgetWindow.style.display = 'flex';
        } else {
            widgetWindow.style.display = 'none';
        }
    }


    widgetButton.addEventListener('click', toggleWidget);
    closeButton.addEventListener('click', toggleWidget);

    // --- Обновленная функция поиска ---
    searchButton.addEventListener('click', () => {
        let query = queryInput.value.trim().replace(/date:\d{8}(\.\.\d{8})?/g, '').trim();
        const startDate = startDateInput.value;
        const endDate = endDateInput.value;
        let dateDork = '';

        // Логика для одной даты или диапазона
        if (startDate && endDate) {
            // Диапазон дат
            const formattedStartDate = startDate.replace(/-/g, '');
            const formattedEndDate = endDate.replace(/-/g, '');
            dateDork = ` date:${formattedStartDate}..${formattedEndDate}`;
        } else if (startDate) {
            // Только одна дата
            const formattedSingleDate = startDate.replace(/-/g, '');
            dateDork = ` date:${formattedSingleDate}`;
        }

        if (query) {
            const finalQuery = query + dateDork;

            // --- Функция: Сохранение данных ---
            localStorage.setItem('dorkQuery', query);
            localStorage.setItem('dorkStartDate', startDate);
            localStorage.setItem('dorkEndDate', endDate);

            // --- ИЗМЕНЕНО: Поиск на текущем домене ---
            const currentDomain = window.location.hostname;
            window.location.href = `https://${currentDomain}/search/?text=${encodeURIComponent(finalQuery)}`;
        }
    });

    // Реализация перетаскивания окна
    const header = widgetWindow.querySelector('.dork-widget-header');
    let isDragging = false;
    let offsetX, offsetY;

    header.addEventListener('mousedown', (e) => {
        // Не начинать перетаскивание, если кликнули на кнопку закрытия
        if (e.target.classList.contains('dork-widget-close')) return;
        isDragging = true;
        offsetX = e.clientX - widgetWindow.offsetLeft;
        offsetY = e.clientY - widgetWindow.offsetTop;
        document.addEventListener('mousemove', onMouseMove);
        document.addEventListener('mouseup', onMouseUp);
    });

    function onMouseMove(e) {
        if (isDragging) {
            widgetWindow.style.left = `${e.clientX - offsetX}px`;
            widgetWindow.style.top = `${e.clientY - offsetY}px`;
        }
    }

    function onMouseUp() {
        isDragging = false;
        document.removeEventListener('mousemove', onMouseMove);
        document.removeEventListener('mouseup', onMouseUp);
    }

    // Инициализация при загрузке скрипта
    loadSavedData();

})();