HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux WebLive 5.15.0-79-generic #86-Ubuntu SMP Mon Jul 10 16:07:21 UTC 2023 x86_64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/html/wpdeskera/wp-content/plugins/bdthemes-element-pack-lite/admin/assets/js/ep-notice.js
jQuery(document).ready(function ($) {
    // Delegate to capture dynamically injected notices as well
    $(document).on('click', '.element-pack-notice.is-dismissible .notice-dismiss', function () {
        $this = $(this).parents('.element-pack-notice');
        var $id = $this.attr('id') || '';
        var $time = $this.attr('dismissible-time') || '';
        var $meta = $this.attr('dismissible-meta') || '';
        $.ajax({
            url: (window.ElementPackNoticeConfig && ElementPackNoticeConfig.ajaxurl) ? ElementPackNoticeConfig.ajaxurl : (typeof ajaxurl !== 'undefined' ? ajaxurl : ''),
            type: 'POST',
            data: {
                action: 'element-pack-notices',
                id: $id,
                meta: $meta,
                time: $time,
                _wpnonce: ElementPackNoticeConfig.nonce
            }
        });
    });

    /* ===================================
       Admin Store API NOTICE
       =================================== */
    
    /**
     * Initialize countdown timers for API notices
     * This function finds all countdown elements and starts the countdown timer
     */
    function initAPINoticeCountdown() {
        // Find all countdown elements on the page
        jQuery('.bdt-notice-countdown').each(function() {
            var $countdown = jQuery(this);
            var $timer = $countdown.find('.countdown-timer');
            var endDate = $countdown.data('end-date');
            var timezone = $countdown.data('timezone');
            
            // Skip if no end date or timer element found
            if (!endDate || !$timer.length) {
                return;
            }
            
            /**
             * Update the countdown display
             * Calculates time remaining and formats it for display
             */
            function updateCountdown() {
                var endTime = new Date(endDate + ' ' + timezone).getTime();
                var now = new Date().getTime();
                var distance = endTime - now;
                
                // If countdown has expired, hide the countdown
                if (distance < 0) {
                    $countdown.hide();
                    return;
                }
                
                // Calculate time units
                var days = Math.floor(distance / (1000 * 60 * 60 * 24));
                var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
                var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
                var seconds = Math.floor((distance % (1000 * 60)) / 1000);
                
                // Add leading zeros
                days = days < 10 ? "0" + days : days;
                hours = hours < 10 ? "0" + hours : hours; 
                minutes = minutes < 10 ? "0" + minutes : minutes;
                seconds = seconds < 10 ? "0" + seconds : seconds;
                
                // Build countdown text with wrapped numbers and labels
                var countdownText = "";
                if (days > 0) {
                    countdownText += '<div class="countdown-item"><span class="number">' + days + '</span><span class="label">days</span></div><span class="separator"></span>';
                }
                // Always show hours (even if 00) for consistent layout
                countdownText += '<div class="countdown-item"><span class="number">' + hours + '</span><span class="label">hrs</span></div><span class="separator"></span>';
                
                countdownText += '<div class="countdown-item"><span class="number">' + minutes + '</span><span class="label">min</span></div><span class="separator"></span>';
                
                countdownText += '<div class="countdown-item"><span class="number">' + seconds + '</span><span class="label">sec</span></div>';
                
                // Update the timer display
                $timer.html(countdownText);
            }
            
            // Initial update to show countdown immediately
            updateCountdown();
            
            // Set up interval to update countdown every second
            setInterval(updateCountdown, 1000);
        });
    }
    
    // Initialize countdown on page load
    initAPINoticeCountdown();
    
    // Re-initialize countdown when new notices are added (for dynamic content)
    // This ensures countdown works even if notices are loaded after page load
    jQuery(document).on('DOMNodeInserted', '.bdt-notice-countdown', function() {
        initAPINoticeCountdown();
    });

    // Fetch API notices after full page load, with try/catch
    $(window).on('load', function () {
        // Add small delay to ensure DOM is fully ready
        setTimeout(function() {
            try {
                $.ajax({
                url: (window.ElementPackNoticeConfig && ElementPackNoticeConfig.ajaxurl) ? ElementPackNoticeConfig.ajaxurl : (typeof ajaxurl !== 'undefined' ? ajaxurl : ''),
                type: 'POST',
                dataType: 'json',
                data: {
                    action: 'ep_fetch_api_notices',
                    _wpnonce: ElementPackNoticeConfig.nonce
                }
            })
            .done(function (res) {
                if (res && res.success && res.data && res.data.html) {
                    var $markup = $(res.data.html);
                    var $target = $('#wpbody-content .wrap').first();

                    if (!$target.length) {
                        $target = $('.wrap').first();
                    }
                    if (!$target.length) {
                        $target = $('#wpbody-content');
                    }

                    // Check for existing notices with same class to avoid duplicates
                     var shouldInsert = true;
                     $markup.each(function() {
                         var $notice = $(this);
                         var noticeId = $notice.attr('id');
                         
                         // Extract class pattern from notice ID (e.g., bdt-admin-notice-api-notice-class-xxxxx)
                         if (noticeId && noticeId.indexOf('bdt-admin-notice-api-notice-class-') !== -1) {
                             var classPattern = noticeId.substring(noticeId.indexOf('bdt-admin-notice-api-notice-class-'));
                             
                             // Check if any existing notice in DOM has similar class pattern from any plugin
                             var existingNotices = $('[id$="' + classPattern + '"]');
                             if (existingNotices.length > 0) {
                                 shouldInsert = false;
                                 return false; // break out of each loop
                             }
                         }
                     });

                    // Only insert if no duplicate class pattern found
                    if (shouldInsert) {
                        // insert right after the <h1> if exists, otherwise at top
                        if ($target.children('hr.wp-header-end').length) {
                            $target.children('hr.wp-header-end').first().after($markup);
                        } else if ($target.children('h1').length) {
                            $target.children('h1').first().after($markup);
                        } else {
                            $target.prepend($markup);
                        }
                    }

                    // Re-initialize WP dismiss buttons for dynamically added notices
                    if (typeof wp !== 'undefined' && wp.a11y && window.jQuery) {
                        $(document).trigger('wp-updates-notice-added');
                    } else {
                        // fallback: manually add close button + click handler
                        $markup.each(function () {
                            var $el = $(this);
                            if ($el.hasClass('is-dismissible') && !$el.find('.notice-dismiss').length) {
                                var $button = $('<button type="button" class="notice-dismiss"><span class="screen-reader-text">Dismiss this notice.</span></button>');
                                $el.append($button);
                                $button.on('click', function () {
                                    $el.fadeTo(100, 0, function () {
                                        $el.slideUp(100, function () {
                                            $el.remove();
                                        });
                                    });
                                });
                            }
                        });
                    }


                    // Initialize countdowns in injected content
                    initAPINoticeCountdown();
                }
            })
            .fail(function () {
                // swallow errors silently
            });
            } catch (e) {
                // ignore
            }
        }, 100); // 100ms delay to ensure DOM is ready
    });

    /* ===================================
       END Admin Store API NOTICE
       =================================== */

});