HEX
Server: LiteSpeed
System: Linux linux31.centraldnserver.com 4.18.0-553.83.1.lve.el8.x86_64 #1 SMP Wed Nov 12 10:04:12 UTC 2025 x86_64
User: salamatk (1501)
PHP: 8.1.33
Disabled: show_source, system, shell_exec, passthru, exec, popen, proc_open
Upload Files
File: /home/salamatk/public_html/wp-content/plugins/woodmart-plus/assets/admin/js/admin-campaign.js
 
 (function($){

        $(document).ready(function() {
            
             $("#sendDateTime").persianDatepicker({
                formatDate: "YYYY/MM/DD hh:mm:ss", 
            });

            // نمایش کمپین‌های نمونه
            displayCampaigns();
            
            // باز کردن پاپ آپ ایجاد کمپین
            $('#addCampaignBtn').click(function() {
                $('#campaignPopup').fadeIn(300);
            });
            
            // بستن پاپ آپ ایجاد کمپین
            $('#closePopup, #cancelBtn').click(function() {
                $('#campaignPopup').fadeOut(300);
            });
            
            // بستن پاپ آپ جزئیات
            $('#closeDetailsPopup, #closeDetailsBtn').click(function() {
                $('#detailsPopup').fadeOut(300);
            });
            
            // باز کردن پاپ آپ تست پیامک
            $('#testSmsBtn').click(function() {
                openTestSmsPopup();
            });
            
            // بستن پاپ آپ تست پیامک
            $('#closeTestSmsPopup, #closeTestSmsBtn').click(function() {
                $('#testSmsPopup').fadeOut(300);
            });
            
            // بستن پاپ آپ با کلیک روی پس زمینه
            $('.popup-overlay').click(function(e) {
                if (e.target === this) {
                    $(this).fadeOut(300);
                }
            });
            
            // شروع تست پیامک
            $('#startTestBtn').click(function() {
                startSmsTest();
            });
            
            // نمایش/مخفی کردن فیلد تاریخ بر اساس نوع زمان‌بندی
            $('#scheduleType').change(function() {
                if ($(this).val() === 'scheduled') {
                    $('#scheduleDateTime').show();
                    $('#sendDateTime').attr('required', true);
                } else {
                    $('#scheduleDateTime').hide();
                    $('#sendDateTime').removeAttr('required');
                }

                if ($(this).val() === 'dynamic') {
                    $('#scheduleTime').show();
                    // $('#sendTime').attr('required', true);
                } else {
                    $('#scheduleTime').hide();
                    $('#sendTime').removeAttr('required');
                }
            });
            
            $('#deleteCampaignBtn').click(function() {
                if (confirm('آیا از حذف این کمپین اطمینان دارید؟')) {
                    
                    var campaignId = $(this).data('campaign-id');
                    $.ajax({
                        dataType: 'json', type: 'POST', url : ajaxurl,
                        data :{
                            action : "remove_campaign",
                            campaignId : campaignId
                        },
                        success : function(response){
                            if('OK' === response.status)
                            {
                                location.reload();
                            }
                        },
                        error : function(error){}
                    });
                }
            });
            
            

            $(document).keyup(function(e) {
                if (e.keyCode === 27) {
                    $('.popup-overlay:visible').fadeOut(300);
                }
            });
            
            $(document).ready(function($) {
                var feedbackSmsEnabled = false;
                
                $('#conditionType').on('change', function() {
                    var selectedCondition = $(this).val();
                    var feedbackContainer = $('#feedbackSmsContainer');
                    var feedbackCheckbox = $('#sendFeedbackSms');
                    var feedbackInfo = $('#feedbackSmsInfo');
                    
                    if (selectedCondition === 'last_purchase') {
                        feedbackContainer.show();
                    } else {
                        feedbackContainer.hide();
                        feedbackCheckbox.prop('checked', false);
                        feedbackInfo.hide();
                        feedbackSmsEnabled = false;
                    }
                });
                
                $('#sendFeedbackSms').on('change', function() {
                    var feedbackInfo = $('#feedbackSmsInfo');
                    
                    if ($(this).is(':checked')) {
                        $('.suggestion-inputs.gray-inp').hide();
                        feedbackInfo.slideDown(300);
                        feedbackSmsEnabled = true;
                    } else {
                        $('.suggestion-inputs.gray-inp').show();
                        feedbackInfo.slideUp(300);
                        feedbackSmsEnabled = false;
                    }
                });
                
                $('#campaignForm').on('submit', function() {
                    var conditionType = $('#conditionType').val();
                    
                    if (conditionType === 'last_purchase' && feedbackSmsEnabled) {
                        if ($('input[name="conditionTypeWithFeedback"]').length === 0) {
                            $(this).append('<input type="hidden" name="conditionTypeWithFeedback" value="'+ajax_object.conditionTypeWithFeedback+'">');
                        }
                    }
                });
            });

        });
        
        $(document).ready(function($) {
            $('.popup-tab-button').on('click', function(e) {
                e.preventDefault();
                
                var targetTab = $(this).data('tab');
                
                $('.popup-tab-button').removeClass('active');
                $('.popup-tab-content').removeClass('active');
                
                $(this).addClass('active');
                $('#' + targetTab).addClass('active');
            });
        });

        function displayCampaigns() {

            $('.campaign-card').click(function() {
                var campaignId = $(this).data('campaign-id');

                showCampaignLoader();

                $.ajax({
                    dataType: 'json', type: 'POST', url : ajaxurl,
                    data :{
                        action : "get_campaign_detial",
                        campaignId : campaignId
                    },
                    success: function(response){
                        hideCampaignLoader();
                        showCampaignDetails(response.content,campaignId);   
                        loadTabButton();       
                        loadAjaxExport();  
                    },
                    error : function(error){
                        hideCampaignLoader();
                        alert('خطا در بارگذاری اطلاعات کمپین');
                    }
                });
                
            });
        }

        function loadAjaxExport()
        {
            $('#exportExcelBtn').on('click',function(){
            var $this = $(this);
            var $trans_id = $this.data('campaing_id');
            var originalText = $this.html(); 
            
            $this.html('<span class="loader-spinner"></span> در حال تولید فایل...').addClass('loading').prop('disabled', true);
            
            $.ajax({
                type: 'POST', 
                dataType: 'json', 
                url : ajaxurl,
                data :{
                    action : "export_excel",
                    campaignId : $trans_id
                },
                success: function(response){
                    $this.html(originalText).removeClass('loading').prop('disabled', false);
                    
                    if(response.success) {
                        window.location.href = response.download_url;
                    } else {
                        alert(response.msg || 'خطا در تولید فایل اکسل');
                    }
                },
                error : function(error){
                        $this.html(originalText).removeClass('loading').prop('disabled', false);
                        alert('خطا در بارگذاری اطلاعات کمپین');
                    }
                });
            });

        }
        function showCampaignLoader() {
            if ($('#campaignLoader').length === 0) {
                $('body').append(`
                    <div id="campaignLoader" class="campaign-loader-overlay">
                        <div class="campaign-loader-content">
                            <div class="campaign-spinner"></div>
                            <p>در حال بارگذاری اطلاعات کمپین...</p>
                        </div>
                    </div>
                `);
            }
            
            $('#campaignLoader').fadeIn(200);
        }

        // تابع مخفی کردن لودر
        function hideCampaignLoader() {
            $('#campaignLoader').fadeOut(200);
        }
       
        // تابع دریافت متن وضعیت
        function getStatusText(status) {
            switch(status) {
                case 'active': return 'فعال';
                case 'scheduled': return 'زمان‌بندی شده';
                case 'completed': return 'تکمیل شده';
                default: return 'نامشخص';
            }
        }
        
        // تابع دریافت متن شرط
        function getConditionText(type, operator, value) {
            var typeTexts = {
                'purchase_count': 'تعداد خرید',
                'total_spent': 'مجموع خرید',
                'last_purchase': 'آخرین خرید',
                'registration_date': 'تاریخ عضویت',
                'birthday': 'ماه تولد',
                'city': 'شهر'
            };
            
            var operatorTexts = {
                'greater_than': 'بیشتر از',
                'less_than': 'کمتر از',
                'equal': 'برابر با',
                'between': 'بین'
            };
            
            var typeText = typeTexts[type] || type;
            var operatorText = operatorTexts[operator] || operator;
            
            if (type === 'city' && operator === 'equal') {
                return `کاربرانی که در شهر ${value} زندگی می‌کنند`;
            } else if (type === 'total_spent') {
                return `کاربرانی که ${typeText} ${operatorText} ${parseInt(value).toLocaleString()} تومان`;
            } else if (type === 'birthday') {
                var months = ['', 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'];
                return `کاربرانی که در ماه ${months[parseInt(value)] || value} متولد شده‌اند`;
            } else {
                var unit = '';
                if (type === 'last_purchase' || type === 'registration_date') {
                    unit = ' روز';
                }
                return `کاربرانی که ${typeText} ${operatorText} ${value}${unit} دارند`;
            }
        }
        
        function updateConditionExample() {
            var conditionType = $('#conditionType').val();
            var conditionOperator = $('#conditionOperator').val();
            var conditionValue = $('#conditionValue').val();
            
            if (conditionType && conditionOperator && conditionValue) {
                $('#conditionExample').html('<div class="condition-loader"><span class="spinner"></span> در حال محاسبه تعداد کاربران...</div>');
                
                $.ajax({
                    url: ajaxurl,
                    type: 'POST',
                    data: {
                        action: 'estimate_campaign_users',
                        condition_type: conditionType,
                        condition_operator: conditionOperator,
                        condition_value: conditionValue,
                        // nonce: campaign_ajax.nonce
                    },
                    success: function(response) {
                        if (response.success) {
                            var conditionText = getConditionText(conditionType, conditionOperator, conditionValue);
                            var estimatedUsers = response.estimated_users;
                            
                            $('#conditionExample').html('مثال: ' + conditionText + '<br><strong>' + estimatedUsers + '</strong>');
                            $('#conditionExampleInput').attr('value', conditionText);
                        } else {
                            $('#conditionExample').html('<div class="condition-error">خطا در محاسبه تعداد کاربران</div>');
                        }
                    },
                    error: function() {
                        $('#conditionExample').html('<div class="condition-error">خطا در ارتباط با سرور</div>');
                    }
                });
            } else {
                $('#conditionExample').html('');
                $('#conditionExampleInput').attr('value', '');
            }
        }

        // اتصال تابع به تغییرات فیلدها
        $(document).ready(function() {
            $('#conditionType, #conditionOperator, #conditionValue').on('change keyup', function() {
                updateConditionExample();
            });
        });

        // تنظیمات اضافی برای فرم ایجاد کمپین
        $('#conditionType').change(function() {
            var conditionType = $(this).val();
            var valueInput = $('#conditionValue');
            var operatorSelect = $('#conditionOperator');
            var scheduleType = $('#scheduleType');
            // پاک کردن مقادیر قبلی
            valueInput.val('');
            operatorSelect.val('');
            
            // تنظیم placeholder و نوع input
            switch(conditionType) {
                case 'purchase_count':
                    valueInput.attr('type', 'number').attr('placeholder', 'مثال: 10').attr('min', '0');
                    break;
                case 'total_spent':
                    valueInput.attr('type', 'number').attr('placeholder', 'مثال: 1000000').attr('min', '0');
                    break;
                case 'last_purchase':
                case 'registration_date':
                    valueInput.attr('type', 'number').attr('placeholder', 'مثال: 30 (روز)').attr('min', '0');
                    break;
                case 'birthday':
                    valueInput.attr('type', 'number').attr('placeholder', 'مثال: 12 (ماه)').attr('min', '1').attr('max', '12');
                    break;
                case 'city':
                    valueInput.attr('type', 'text').attr('placeholder', 'مثال: تهران').removeAttr('min max');
                    break;
                default:
                    valueInput.attr('type', 'text').attr('placeholder', 'مقدار').removeAttr('min max');
            }
            
            // محدود کردن عملگرها
            operatorSelect.find('option').each(function() {
                var optionValue = $(this).val();
                
                if (conditionType === 'city') {
                    if (optionValue === 'equal' || optionValue === '') {
                        $(this).show().prop('disabled', false);
                    } else {
                        $(this).hide().prop('disabled', true);
                    }
                } else if (conditionType === 'birthday') {
                    if (optionValue === 'month') {
                        $(this).show().prop('disabled', false);
                    } else {
                        $(this).hide().prop('disabled', true);
                    }
                } else {
                    if (optionValue === 'month') {
                        $(this).hide().prop('disabled', true);
                    } else {
                        $(this).show().prop('disabled', false);
                    }
                }
            });

            if( conditionType === 'birthday'){
                scheduleType.find('option[value="birthday_day"]').show().prop('disabled', false);
            }else{
                scheduleType.find('option[value="birthday_day"]').hide().prop('disabled', true);
            }
        });
        
        // تنظیم حداقل تاریخ برای زمان‌بندی
        var now = new Date();
        var year = now.getFullYear();
        var month = String(now.getMonth() + 1).padStart(2, '0');
        var day = String(now.getDate()).padStart(2, '0');
        var hours = String(now.getHours()).padStart(2, '0');
        var minutes = String(now.getMinutes()).padStart(2, '0');
        
        var minDateTime = year + '-' + month + '-' + day + 'T' + hours + ':' + minutes;
        $('#sendDateTime').attr('min', minDateTime);

                // داده‌های نمونه لاگ پیامک‌ها
        var sampleLogs = {
            1: [ // کمپین شماره 1
                {
                    id: 1,
                    phone: "09123456789",
                    status: "delivered",
                    sentAt: "1402/08/15 14:30:25",
                    deliveredAt: "1402/08/15 14:30:28",
                    errorMessage: null
                },
                {
                    id: 2,
                    phone: "09987654321",
                    status: "delivered",
                    sentAt: "1402/08/15 14:30:26",
                    deliveredAt: "1402/08/15 14:30:31",
                    errorMessage: null
                },
                {
                    id: 3,
                    phone: "09111222333",
                    status: "failed",
                    sentAt: "1402/08/15 14:30:27",
                    deliveredAt: null,
                    errorMessage: "شماره نامعتبر"
                },
                {
                    id: 4,
                    phone: "09444555666",
                    status: "delivered",
                    sentAt: "1402/08/15 14:30:28",
                    deliveredAt: "1402/08/15 14:30:35",
                    errorMessage: null
                },
                {
                    id: 5,
                    phone: "09777888999",
                    status: "failed",
                    sentAt: "1402/08/15 14:30:29",
                    deliveredAt: null,
                    errorMessage: "اپراتور در دسترس نیست"
                }
            ],
            2: [ // کمپین شماره 2 (زمان‌بندی شده - هنوز ارسال نشده)
                // خالی چون هنوز ارسال نشده
            ],
            3: [ // کمپین شماره 3
                {
                    id: 6,
                    phone: "09123123123",
                    status: "delivered",
                    sentAt: "1402/07/10 10:15:10",
                    deliveredAt: "1402/07/10 10:15:15",
                    errorMessage: null
                },
                {
                    id: 7,
                    phone: "09456456456",
                    status: "delivered",
                    sentAt: "1402/07/10 10:15:11",
                    deliveredAt: "1402/07/10 10:15:18",
                    errorMessage: null
                },
                {
                    id: 8,
                    phone: "09789789789",
                    status: "failed",
                    sentAt: "1402/07/10 10:15:12",
                    deliveredAt: null,
                    errorMessage: "سقف ارسال روزانه تمام شده"
                }
            ],
            4: [ // کمپین شماره 4
                {
                    id: 9,
                    phone: "09111111111",
                    status: "delivered",
                    sentAt: "1402/08/22 16:45:00",
                    deliveredAt: "1402/08/22 16:45:05",
                    errorMessage: null
                },
                {
                    id: 10,
                    phone: "09222222222",
                    status: "pending",
                    sentAt: "1402/08/22 16:45:01",
                    deliveredAt: null,
                    errorMessage: null
                }
            ]
        };
        
        var currentCampaignId = null;
        var filteredLogs = [];
        
        $(document).ready(function() {
           
            $('#statusFilter, #phoneFilter, #dateFromFilter, #dateToFilter').on('change input', function() {
                if (currentCampaignId) {
                    filterLogs();
                }
            });
            
           
            $('#refreshLogsBtn').click(function() {
                if (currentCampaignId) {
                    loadCampaignLogs(currentCampaignId);
                    $(this).text('🔄 بروزرسانی شد');
                    setTimeout(() => {
                        $(this).text('🔄 بروزرسانی');
                    }, 2000);
                }
            });
        });
        
        function loadTabButton()
        {
             $('.tab-button').click(function() {
                var tabName = $(this).data('tab');
                
                // تغییر کلاس فعال تب‌ها
                $('.tab-button').removeClass('active');
                $(this).addClass('active');
                
                // نمایش محتوای تب مربوطه
                $('.tab-content').removeClass('active');
                $('#' + tabName + 'Tab').addClass('active');
                
                // اگر تب لاگ انتخاب شد، لاگ‌ها را بارگذاری کن
                if (tabName === 'logs' && currentCampaignId) {
                    loadCampaignLogs(currentCampaignId);
                }
            });
        }
        // تابع نمایش جزئیات کمپین (بروزرسانی شده)
        function showCampaignDetails(campainDetial, campaignId) {
            
            
            $('#deleteCampaignBtn').attr('data-campaign-id', campaignId);
            // $('#exportExcelBtn').attr('data-campaigns-id', campaignId);
            
            // بازگشت به تب اول
            $('.tab-button').removeClass('active');
            $('.tab-button[data-tab="overview"]').addClass('active');
            $('.tab-content').removeClass('active');
            $('#overviewTab').addClass('active');
            
            //  $('#detailsBody').html(campainDetial);
             $('.popup-body.detials-campaign').html(campainDetial);
             $('#detailsPopup').fadeIn(300);   
            
        }
        
        // تابع بارگذاری لاگ‌های کمپین
        function loadCampaignLogs(campaignId) {
            var logs = sampleLogs[campaignId] || [];
            filteredLogs = [...logs]; // کپی از لاگ‌ها برای فیلتر
            
            // نمایش خلاصه آمار لاگ
            displayLogsSummary(logs);
            
            // نمایش لاگ‌ها
            displayLogs(filteredLogs);
            
            // پاک کردن فیلترها
            $('#statusFilter').val('');
            $('#phoneFilter').val('');
            $('#dateFromFilter').val('');
            $('#dateToFilter').val('');
        }
        
        // تابع نمایش خلاصه آمار لاگ
        function displayLogsSummary(logs) {
            var total = logs.length;
            var delivered = logs.filter(log => log.status === 'delivered').length;
            var failed = logs.filter(log => log.status === 'failed').length;
            var pending = logs.filter(log => log.status === 'pending').length;
            var sent = logs.filter(log => log.status === 'sent').length;
            
            var summaryHtml = `
                <div class="summary-item">
                    <div class="summary-number">${total}</div>
                    <div class="summary-label">کل پیامک‌ها</div>
                </div>
                <div class="summary-item">
                    <div class="summary-number" style="color: #2e7d32;">${delivered}</div>
                    <div class="summary-label">تحویل شده</div>
                </div>
                <div class="summary-item">
                    <div class="summary-number" style="color: #c62828;">${failed}</div>
                    <div class="summary-label">ناموفق</div>
                </div>
                <div class="summary-item">
                    <div class="summary-number" style="color: #f57c00;">${pending}</div>
                    <div class="summary-label">در انتظار</div>
                </div>
                <div class="summary-item">
                    <div class="summary-number" style="color: #1976d2;">${sent}</div>
                    <div class="summary-label">ارسال شده</div>
                </div>
                <div class="summary-item">
                    <div class="summary-number">${total > 0 ? Math.round((delivered / total) * 100) : 0}%</div>
                    <div class="summary-label">نرخ موفقیت</div>
                </div>
            `;
            
            $('#logsSummary').html(summaryHtml);
        }
        
        // تابع نمایش لاگ‌ها در جدول
        function displayLogs(logs) {
            var tbody = $('#logsTableBody');
            tbody.empty();
            
            if (logs.length === 0) {
                tbody.append(`
                    <tr>
                        <td colspan="5" class="no-logs">
                            هیچ لاگی برای نمایش وجود ندارد
                        </td>
                    </tr>
                `);
                return;
            }
            
            logs.forEach(function(log) {
                var statusBadge = getStatusBadge(log.status);
                var deliveredTime = log.deliveredAt || '-';
                var errorInfo = log.errorMessage ? `<div class="error-message">${log.errorMessage}</div>` : '-';
                
                var rowHtml = `
                    <tr>
                        <td class="phone-number">${log.phone}</td>
                        <td>${statusBadge}</td>
                        <td>${log.sentAt}</td>
                        <td>${deliveredTime}</td>
                        <td>${errorInfo}</td>
                    </tr>
                `;
                
                tbody.append(rowHtml);
            });
        }
        
        // تابع دریافت نشان وضعیت
        function getStatusBadge(status) {
            var badges = {
                'sent': '<span class="status-badge status-sent">ارسال شده</span>',
                'delivered': '<span class="status-badge status-delivered">تحویل شده</span>',
                'failed': '<span class="status-badge status-failed">ناموفق</span>',
                'pending': '<span class="status-badge status-pending">در انتظار</span>'
            };
            
            return badges[status] || '<span class="status-badge">' + status + '</span>';
        }
        
        // تابع فیلتر کردن لاگ‌ها
        function filterLogs() {
            var statusFilter = $('#statusFilter').val();
            var phoneFilter = $('#phoneFilter').val().trim();
            var dateFromFilter = $('#dateFromFilter').val();
            var dateToFilter = $('#dateToFilter').val();
            
            var logs = sampleLogs[currentCampaignId] || [];
            
            filteredLogs = logs.filter(function(log) {
                // فیلتر وضعیت
                if (statusFilter && log.status !== statusFilter) {
                    return false;
                }
                
                // فیلتر شماره تلفن
                if (phoneFilter && !log.phone.includes(phoneFilter)) {
                    return false;
                }
                
                // فیلتر تاریخ (ساده‌سازی شده - در پروژه واقعی باید تبدیل تاریخ انجام شود)
                if (dateFromFilter || dateToFilter) {
                    // اینجا باید تاریخ‌ها را به فرمت قابل مقایسه تبدیل کرد
                    // برای سادگی، فعلاً این بخش را نادیده می‌گیریم
                }
                
                return true;
            });
            
            // نمایش لاگ‌های فیلتر شده
            displayLogs(filteredLogs);
            
            // بروزرسانی خلاصه آمار
            displayLogsSummary(filteredLogs);
        }
        
        // تولید لاگ‌های تصادفی بیشتر برای تست
        function generateMoreSampleLogs() {
            var phones = [
                "09123456789", "09987654321", "09111222333", "09444555666", 
                "09777888999", "09123123123", "09456456456", "09789789789",
                "09111111111", "09222222222", "09333333333", "09555555555",
                "09666666666", "09888888888", "09999999999", "09101010101"
            ];
            
            var statuses = ['delivered', 'delivered', 'delivered', 'failed', 'pending', 'sent'];
            var errors = [
                null, null, null, null, null,
                "شماره نامعتبر", 
                "اپراتور در دسترس نیست", 
                "سقف ارسال روزانه تمام شده",
                "شماره در لیست سیاه",
                "خطای شبکه"
            ];
            
            // اضافه کردن لاگ‌های بیشتر برای کمپین شماره 1
            for (var i = 6; i <= 50; i++) {
                var phone = phones[Math.floor(Math.random() * phones.length)];
                var status = statuses[Math.floor(Math.random() * statuses.length)];
                var error = status === 'failed' ? errors[Math.floor(Math.random() * errors.length)] : null;
                
                var hour = Math.floor(Math.random() * 2) + 14; // 14 یا 15
                var minute = Math.floor(Math.random() * 60);
                var second = Math.floor(Math.random() * 60);
                
                var sentTime = `1402/08/15 ${hour}:${minute.toString().padStart(2, '0')}:${second.toString().padStart(2, '0')}`;
                var deliveredTime = null;
                
                if (status === 'delivered') {
                    var deliveredSecond = second + Math.floor(Math.random() * 10) + 3;
                    if (deliveredSecond >= 60) {
                        deliveredSecond -= 60;
                        minute += 1;
                    }
                    deliveredTime = `1402/08/15 ${hour}:${minute.toString().padStart(2, '0')}:${deliveredSecond.toString().padStart(2, '0')}`;
                }
                
                sampleLogs[1].push({
                    id: i,
                    phone: phone,
                    status: status,
                    sentAt: sentTime,
                    deliveredAt: deliveredTime,
                    errorMessage: error
                });
            }
        }
        
        // تولید لاگ‌های نمونه بیشتر
        generateMoreSampleLogs();

        function load_tab_popup_detial()
        {
            document.addEventListener('DOMContentLoaded', function() {
                // عملکرد دکمه نمایش/مخفی کردن شورتکدها
                const toggleBtn = document.getElementById('toggleShortcodes');
                const extendedSection = document.getElementById('shortcodesExtended');
                
                if (toggleBtn && extendedSection) {
                    toggleBtn.addEventListener('click', function() {
                        const isVisible = extendedSection.style.display !== 'none';
                        const showText = toggleBtn.querySelector('.show-text');
                        const hideText = toggleBtn.querySelector('.hide-text');
                        
                        if (isVisible) {
                            // مخفی کردن
                            extendedSection.style.display = 'none';
                            showText.style.display = 'inline';
                            hideText.style.display = 'none';
                            toggleBtn.classList.remove('expanded');
                        } else {
                            // نمایش دادن
                            extendedSection.style.display = 'block';
                            showText.style.display = 'none';
                            hideText.style.display = 'inline';
                            toggleBtn.classList.add('expanded');
                        }
                    });
                }
            });
        }

        function openTestSmsPopup() {
            
            var campaignPattern = $('input[name="campaignPattern"]').val();
            var patternPreview = $('#smsPatternPreview');
            
            if (campaignPattern) {
                patternPreview.text(campaignPattern);
            } else {
                patternPreview.text('پترن پیامک وارد نشده است');
            }
            
            var variables = [];
          
            $('[data-repeater-item]').each(function() {
                var variable = $(this).find('input.variable-input').val();
                var shortcode = $(this).find('input.shortcode-input').val();
                if (variable && shortcode) {
                    variables.push({
                        variable: variable,
                        shortcode: shortcode
                    });
                }
            });
            
            var variablesPreview = $('#smsVariablesPreview');
            if (variables.length > 0) {
                var variablesHtml = '<ul>';
                variables.forEach(function(item) {
                    variablesHtml += '<li><strong>' + item.variable + ':</strong> ' + item.shortcode + '</li>';
                });
                variablesHtml += '</ul>';
                variablesPreview.html(variablesHtml);
            } else {
                variablesPreview.text('هیچ متغیری تعریف نشده است');
            }
            
            $('#testOrderNumber').val('');
            $('#testResultContainer').hide();
            $('#testResult .response-message').html('');
            $('#myListVariables').html('');
            
            $('#testSmsPopup').fadeIn(300);
        }

        function startSmsTest() {
            var orderNumber = $('#testOrderNumber').val();
            var couponCode = $('#couponCode').val();
            var campaignPattern = $('input[name="campaignPattern"]').val();
            var variables = [];
            
            $('[data-repeater-item]').each(function() {
                var variable = $(this).find('input.variable-input').val();
                var shortcode = $(this).find('input.shortcode-input').val();
                if (variable && shortcode) {
                    variables.push({
                        variable: variable,
                        shortcode: shortcode
                    });
                }
            });
            
            
            if (!orderNumber) {
                alert('لطفاً شماره سفارش را وارد کنید');
                return;
            }
            
            if (!campaignPattern) {
                alert('لطفاً ابتدا پترن پیامک را وارد کنید');
                return;
            }
            
            
            var $startBtn = $('#startTestBtn');
            var originalText = $startBtn.text();
            $startBtn.html('<span class="loader-spinner"></span> در حال ارسال...').prop('disabled', true);
            
            $.ajax({
                url: ajaxurl,
                type: 'POST',
                data: {
                    action: 'test_sms_campaign',
                    order_number: orderNumber,
                    campaign_pattern: campaignPattern,
                    variables: variables,
                    couponCode : couponCode
                },
                success: function(response) {
                    $startBtn.text(originalText).prop('disabled', false);
                    
                    if (response.success) {
                        $('#testResult .response-message').html('<div class="test-success">' + response.message + '</div>');

                        var vars = response.variables;
                        $.each(vars, function(key, value) {
                            var li = '<li>' + key + ' : ' + value + '</li>';
                            $('#myListVariables').html(li);
                        });

                    } else {
                        $('#testResult .response-message').html('<div class="test-error">' + (response.message || 'خطا در ارسال تست پیامک') + '</div>');
                    }
                    
                    $('#testResultContainer').show();
                },
                error: function(error) {
                    
                    $startBtn.text(originalText).prop('disabled', false);
                    $('#testResult').html('<div class="test-error"> '+error.responseJSON.message+' </div>');
                    $('#testResultContainer').show();
                }
            });
        }
})( jQuery );