Source: Tracker/callbacks.js

/**
 * @class
 * @classdesc Callbacks Management.
 * @name CallbacksManager
 * @param parent {object} Instance of the Tag used
 * @public
 */
var CallbacksManager = function (parent) {
    'use strict';
    var self = this, callbacksToProcess = {}, callbacksLoaded = {};
    /**
     * Create an instance of each callback declared.
     * @name init
     * @memberof CallbacksManager#
     * @function
     * @public
     */
    self['init'] = function () {
        if (!!parent.getConfig('activateCallbacks')) {
            var configuration = parent.getConfig('callbacks');
            var _process = function () {
                // Define callbacks to process
                if (typeof configuration !== 'undefined' && configuration.include instanceof Array) {
                    for (var i = 0; i < configuration.include.length; i++) {
                        if (ATInternet.Callbacks && ATInternet.Callbacks.hasOwnProperty(configuration.include[i])) {
                            callbacksToProcess[configuration.include[i]] = {
                                function: ATInternet.Callbacks[configuration.include[i]]
                            };
                            if (!ATInternet.Tracker.callbackProtos[configuration.include[i]]) {
                                ATInternet.Tracker.callbackProtos[configuration.include[i]] = callbacksToProcess[configuration.include[i]];
                            }
                        }
                    }
                }
                else {
                    for (var name in ATInternet.Callbacks) {
                        if (ATInternet.Callbacks.hasOwnProperty(name)) {
                            callbacksToProcess[name] = {
                                function: ATInternet.Callbacks[name]
                            };
                            if (!ATInternet.Tracker.callbackProtos[name]) {
                                ATInternet.Tracker.callbackProtos[name] = callbacksToProcess[name];
                            }
                        }
                    }
                }
                // Remove callbacks to exclude
                if (typeof configuration !== 'undefined' && configuration.exclude instanceof Array) {
                    for (var j = 0; j < configuration.exclude.length; j++) {
                        if (callbacksToProcess[configuration.exclude[j]]) {
                            callbacksToProcess[configuration.exclude[j]] = undefined;
                        }
                    }
                }
                // Execute valid callbacks
                for (var key in callbacksToProcess) {
                    if (callbacksToProcess.hasOwnProperty(key) && callbacksToProcess[key]) {
                        _load(key, callbacksToProcess[key].function);
                    }
                }
            };
            var _processEvent = function (e) {
                if (e.name) {
                    // Define if callback can be processed
                    var toProcess = true;
                    if (typeof configuration !== 'undefined') {
                        if (configuration.include instanceof Array && ATInternet.Utils.arrayIndexOf(configuration.include, e.name) === -1) {
                            toProcess = false;
                        }
                        if (configuration.exclude instanceof Array && ATInternet.Utils.arrayIndexOf(configuration.exclude, e.name) !== -1) {
                            toProcess = false;
                        }
                    }
                    if (ATInternet.Callbacks && ATInternet.Callbacks.hasOwnProperty(e.name)) {
                        var callbackToAdd = {};
                        callbackToAdd[e.name] = {
                            function: ATInternet.Callbacks[e.name]
                        };
                        if (toProcess) {
                            _load(e.name, callbackToAdd[e.name].function);
                        }
                        if (!ATInternet.Tracker.callbackProtos[e.name]) {
                            ATInternet.Tracker.callbackProtos[e.name] = callbackToAdd[e.name];
                        }
                    }
                }
            };
            // Run process for loaded callbacks
            _process();
            // Attach event in order to process asynchronous callbacks
            ATInternet.Utils.addCallbackEvent(_processEvent);
        }
    };

    /**
     * Load a callback.
     * @name load
     * @memberof CallbacksManager#
     * @function
     * @public
     * @param name {string} Callback's name
     * @param Callback {function} Callback's code
     * @returns parent {object} Instance of the Tag used
     */
    var _load = self['load'] = function (name, Callback) {
        if (typeof(Callback) === 'function') {
            callbacksLoaded[name] = new Callback(parent);
            parent.emit('Tracker:Callback:Load:' + name + ':Ok', {
                lvl: 'INFO',
                details: {obj: Callback}
            });
        }
        else {
            parent.emit('Tracker:Callback:Load:' + name + ':Error', {
                lvl: 'ERROR',
                msg: 'not a function',
                details: {obj: Callback}
            });
        }
        return parent;
    };

};