Файл: sys/static/js/ds-ajax.js
Строк: 111
<?php
/**
* Разработано для CMS-Social v3
* Project URL:  https://cms-social.ru
*
* Система интервального опроса сервера
* Позволяет регистрировать различные типы уведомлений с гибкой 
* настройкой callback параметров в момент опроса
* И при получении данных от сервера выполнять пользовательскую callback функцию
* 
* Author:       alex-borisi
* E-Mail:       alex-borisi@ya.ru
* Author URL:   https://andryushkin.ru
*/ 
function DS_Ajax_Events() 
{
    this.ds_events = {}; 
    /**
    * $events.setEvents(eventName, {data, success})
    * eventName (string) Название (идентификатор) события 
    * data (function | [string, object, ..]) Данные для отправки на сервер
    * success (function) Функция будет отработана если пришел ответ с результатом
    */ 
    this.setEvents = function(eventName, eventArgs) {
        let obj = {
            data: true, 
        }
        // Если нет данных для передачи
        eventArgs = Object.assign(obj, eventArgs);
        Object.defineProperty(this.ds_events, eventName, {
            value: {
                eventName : eventName, 
                eventArgs : eventArgs, 
            }, 
            enumerable: true, 
            configurable: true, 
        }); 
    }
    /**
    * Получить все зарегистрированные запросы
    * $events.getEvents()
    * @return object
    */ 
    this.getEvents = function() {
        return this.ds_events; 
    }
    /**
    * $events.doEvent() 
    * Запускает callback функцию при получении результа
    */ 
    this.doEvent = function(eventName, eventResult) {
        var objectEvent = Object.getOwnPropertyDescriptor(this.ds_events, eventName); 
        if (typeof objectEvent == 'object') {
            objectEvent.value.eventArgs.success(eventResult);  
        }
    }
    /**
    * $events.delete(eventName) 
    * Удаляет зарегистрированное уведомление
    */ 
    this.delete = function(eventName) {
        delete this.ds_events[eventName]; 
    }
}
/**
* Глобальный объект Ajax уведомлений
* $events.setEvents()
* $events.getEvents()
* $events.doEvent()
*/ 
var $events = new DS_Ajax_Events();  
/**
* Система работает в связке с jQuery, поэтому регистрировать собственные обработчики
* лучше всего, когда jQuery был инициализирован. 
*/ 
jQuery(function($) {
    setInterval(function() {
        var events = $events.getEvents(); 
        /**
        * С каждым опросом сервера, формируем данные для отправки на сервер
        */ 
        var ajax_data_setup = {}; 
        for(let key in events) {
            if (typeof events[key].eventArgs.data == 'function') {
                var data = events[key].eventArgs.data(); 
            } else {
                var data = events[key].eventArgs.data; 
            }
            /** Если callback_data вернет false то данный тип не будет отправлен **/
            if (data !== false) {
                Object.defineProperty(ajax_data_setup, events[key].eventName, {
                    value: data, 
                    enumerable: true, 
                });            
            }
        }
        $.ajax({
            type: "POST",
            url: '/ds-ajax/?action=ds_events',
            data: {
                json: JSON.stringify(ajax_data_setup)
            },
            dataType: 'json',
            success: function(events) {
                /**
                * Ответ содержит массив данных, с ключом ie равным идентификатору 
                * зарегистрированного типа уведомлений, и event с данными ответа.
                */ 
                $.each(events, function(ie, event) {
                    $events.doEvent(ie, event); 
                });
            }
        }); 
    }, 1000); 
});
?>