HEX
Server: LiteSpeed
System: Linux emerald.serverdnsnetwork.com 5.14.0-611.5.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Nov 11 08:09:09 EST 2025 x86_64
User: mahdetej (1135)
PHP: 8.1.34
Disabled: show_source, system, shell_exec, passthru, exec, popen, proc_open
Upload Files
File: /home/mahdetej/public_html/wp-content/plugins/Melli-shild/assets/js/admin.js
/**
 * Melli Shield — shared admin UI
 */
(function ($) {
    'use strict';

    var cfg = window.melli_shield_ajax || {};

    function servicesTextarea() {
        return $('textarea.msh-services-textarea, textarea[name="melli_shield_allowed_services"], textarea[name="melli_shield_allowed_services"]').first();
    }

    function initSidebar() {
        var $sidebar = $('#ms-sidebar');
        var $backdrop = $('#ms-sidebar-backdrop');
        var $toggle = $('#ms-sidebar-toggle');

        if (!$sidebar.length || !$toggle.length) {
            return;
        }

        function openSidebar() {
            $sidebar.addClass('is-open');
            $backdrop.addClass('is-open').attr('aria-hidden', 'false');
            $toggle.attr('aria-expanded', 'true');
        }

        function closeSidebar() {
            $sidebar.removeClass('is-open');
            $backdrop.removeClass('is-open').attr('aria-hidden', 'true');
            $toggle.attr('aria-expanded', 'false');
        }

        $toggle.on('click', function () {
            if ($sidebar.hasClass('is-open')) {
                closeSidebar();
            } else {
                openSidebar();
            }
        });

        $backdrop.on('click', closeSidebar);

        $sidebar.find('a').on('click', function () {
            if (window.matchMedia('(max-width: 900px)').matches) {
                closeSidebar();
            }
        });

        $(document).on('keydown', function (e) {
            if (e.key === 'Escape') {
                closeSidebar();
            }
        });
    }

    // Mode switch confirm
    $(document).on('submit', '.msh-mode-switch-form', function (e) {
        var msg = (cfg.strings && cfg.strings.confirm_mode) ? cfg.strings.confirm_mode : 'آیا از تغییر حالت مطمئن هستید؟';
        if (!window.confirm(msg)) {
            e.preventDefault();
        }
    });

    // URL probe
    $(document).on('click', '#msh-probe-btn', function () {
        var $btn = $(this);
        var url = $('#msh-probe-url').val().trim();
        var $result = $('#msh-probe-result');

        if (!url) {
            return;
        }

        $btn.prop('disabled', true).text('در حال بررسی...');

        $.post(cfg.ajax_url, {
            action: 'melli_shield_probe_url',
            url: url,
            _wpnonce: cfg.nonce
        })
            .done(function (res) {
                if (!res.success) {
                    $result
                        .removeClass('is-allowed')
                        .addClass('is-visible msh-probe__result is-blocked')
                        .html('<strong>خطا:</strong> ' + (res.data && res.data.message ? res.data.message : 'ناموفق'));
                    return;
                }
                var d = res.data;
                $result
                    .removeClass('is-blocked is-allowed')
                    .addClass('is-visible msh-probe__result ' + (d.blocked ? 'is-blocked' : 'is-allowed'))
                    .html(
                        '<strong>' + (d.blocked ? 'مسدود می‌شود' : 'مجاز است') + '</strong><br>' +
                        'دامنه: <code>' + $('<span>').text(d.domain).html() + '</code><br>' +
                        'حالت: ' + $('<span>').text(d.mode_label).html() + '<br>' +
                        $('<span>').text(d.reason).html()
                    );
            })
            .fail(function () {
                $result
                    .removeClass('is-allowed')
                    .addClass('is-visible msh-probe__result is-blocked')
                    .html('<strong>خطا در ارتباط با سرور</strong>');
            })
            .always(function () {
                $btn.prop('disabled', false).text('بررسی URL');
            });
    });

    // Quick-add service domains
    $(document).on('click', '.msh-quick-add', function () {
        var $btn = $(this);
        var $t = servicesTextarea();
        if (!$t.length) {
            return;
        }

        var originalLabel = $btn.data('original-label') || $btn.text().replace(/^[✅☑️]\s*/, '').trim();
        $btn.data('original-label', originalLabel);

        var cur = $t.val().trim();
        var existing = cur ? cur.split('\n').map(function (d) { return d.trim().toLowerCase(); }) : [];
        var toAdd = [];

        String($btn.data('domains') || '').split('\n').forEach(function (d) {
            d = d.trim().toLowerCase();
            if (d && existing.indexOf(d) === -1) {
                toAdd.push(d);
            }
        });

        if (toAdd.length > 0) {
            $t.val(cur ? cur + '\n' + toAdd.join('\n') : toAdd.join('\n'));
            $btn.addClass('is-added').prop('disabled', true).text('+' + originalLabel + ' (' + toAdd.length + ')');
            setTimeout(function () {
                $btn.removeClass('is-added').prop('disabled', false).text('+' + originalLabel);
            }, 2500);
        } else {
            $btn.prop('disabled', true).text('موجود: ' + originalLabel);
            setTimeout(function () {
                $btn.prop('disabled', false).text('+' + originalLabel);
            }, 1500);
        }
    });

    // Init quick-add labels
    $('.msh-quick-add').each(function () {
        var $b = $(this);
        if (!$b.data('original-label')) {
            $b.data('original-label', $b.text().replace(/^\+/, '').trim());
        }
    });

    function initToasts() {
        if (!$('body').hasClass('melli-shield-admin')) {
            return;
        }

        var $root = $('#msh-toast-root');
        if (!$root.length) {
            $root = $('<div id="msh-toast-root" class="msh-toast-root" aria-live="polite" aria-atomic="true"></div>');
            $('body').append($root);
        }

        function noticeType($el) {
            if ($el.hasClass('msh-notice--success') || $el.hasClass('notice-success') || $el.hasClass('updated')) {
                return 'success';
            }
            if ($el.hasClass('msh-notice--error') || $el.hasClass('notice-error') || $el.hasClass('error')) {
                return 'error';
            }
            if ($el.hasClass('msh-notice--warning') || $el.hasClass('notice-warning')) {
                return 'warning';
            }
            return 'info';
        }

        function extractMessage($el) {
            var $clone = $el.clone();
            $clone.find('button, .notice-dismiss').remove();
            var text = $.trim($clone.text());
            return text.replace(/\s+/g, ' ');
        }

        function showToast(message, type, duration) {
            if (!message) {
                return;
            }
            type = type || 'success';
            duration = duration || 4200;

            var $toast = $('<div class="msh-toast msh-toast--' + type + '" role="status"></div>');
            $toast.text(message);
            $root.append($toast);

            window.setTimeout(function () {
                $toast.addClass('is-leaving');
                window.setTimeout(function () {
                    $toast.remove();
                }, 240);
            }, duration);
        }

        window.MelliShieldToast = showToast;

        var selectors = [
            '.wrap > .msh-notice',
            '.msh-wrap .msh-notice',
            '.msh-wrap .notice',
            '#wpbody-content .wrap .notice'
        ].join(', ');

        $(selectors).each(function () {
            var $el = $(this);
            if ($el.data('msh-toast-done')) {
                return;
            }
            if ($el.hasClass('msh-notice--info') && !$el.hasClass('msh-notice--toast-source')) {
                return;
            }
            var msg = extractMessage($el);
            if (!msg) {
                return;
            }
            var type = noticeType($el);
            if (type === 'info' && !$el.hasClass('msh-notice--toast-source')) {
                return;
            }
            $el.data('msh-toast-done', 1);
            showToast(msg, type);
            $el.addClass('msh-notice--toast-source').attr('hidden', 'hidden').hide();
        });
    }

    initSidebar();
    initToasts();
})(jQuery);