Source: Events/events.js

/**
 * @class
 * @classdesc Plugin used to manage events sending for NDF.
 * @name Events
 * @memberof ATInternet.Tracker.Plugins
 * @type {function}
 * @param tag {object} Instance of the Tag used
 * @public
 */
ATInternet.Tracker.Plugins.Events = function (tag) {

    'use strict';

    var _debug = {
        level: 'DEBUG',
        messageEnd: 'method ended',
        messageCall: 'method called'
    };
    var _origin = 'events';

    /**
     * Get final formatted object from properties.
     * @memberof ATInternet.Tracker.Plugins.Events#
     * @param data {object}
     * @function
     * @return {object}
     * @private
     */
    var _getFinalObject = function (data) {
        var flattenData = {};
        var clonedData = ATInternet.Utils.cloneSimpleObject(data);
        ATInternet.Utils.object2Flatten(clonedData, null, flattenData, null, true);
        var content = {};
        for (var key in flattenData) {
            if (flattenData.hasOwnProperty(key)) {
                ATInternet.Utils.flatten2Object(content, key, flattenData[key]);
            }
        }
        return ATInternet.Utils.getFormattedObject(content);
    };

    // **************** EVENTS (public helpers for NDF customers) ***************** //

    tag.events = {};

    /**
     * [Helper added by plugin {@link ATInternet.Tracker.Plugins.Events Events}] Tagging method for events sending (helper).
     * @alias events.send
     * @memberof! ATInternet.Tracker.Tag#
     * @function
     * @param name {String} Event name
     * @param data {object} Event value
     * @param options {object} (optional) Technical configuration of the tag
     * @examples
     * <pre><code class="javascript">
     tag.events.send('product.display',
     {
        's:placement': 'homepage_slider',
        'a:product': [{
            's:id': 'id1',
            's:name': 'name1',
            's:brand': 'brand1',
            'f:original_price': 16.50,
            'f:price': 14.00,
            's:currency': 'EUR',
            'b:stock': 1,
            's:category1': 'category1',
            's:category2': 'category2',
            's:category3': 'category3',
            's:category4': 'category4',
            's:category5': 'category5',
            's:category6': 'category6',
            'n:position': 1
        }]
     },
     {
        elem: this, // (optional) Tagged DOM element
        event: event, // (optional) JavaScript event (prevent event propagation)
        callback: callback // (optional) function to execute
     });
     * </code></pre>
     * @public
     */
    tag.events.send = function (name, data, options) {
        options = options || {};
        options.origin = _origin;
        var finalData = data;
        if (ATInternet.Utils.isObject(data)) {
            finalData = _getFinalObject(data);
        }
        tag.event.send(name, finalData, options);
        /* @if debug */
        tag.debug('Events:events:send', _debug.level, _debug.messageEnd, {
            'name': name,
            'data': data,
            'origin': _origin
        });
        /* @endif */
    };

    /**
     * [Helper added by plugin {@link ATInternet.Tracker.Plugins.Events Events}] Add events.
     * @alias events.add
     * @memberof! ATInternet.Tracker.Tag#
     * @function
     * @param name {String} Event name
     * @param data {object} Event value
     * @examples
     * <pre><code class="javascript">
     tag.events.add('product.display', {
        's:placement': 'homepage_slider',
            'a:product': [{
            's:id': 'id1',
            's:name': 'name1',
            's:brand': 'brand1',
            'f:original_price': 16.50,
            'f:price': 14.00,
            's:currency': 'EUR',
            'b:stock': 1,
            's:category1': 'category1',
            's:category2': 'category2',
            's:category3': 'category3',
            's:category4': 'category4',
            's:category5': 'category5',
            's:category6': 'category6',
            'n:position': 1
        }]
     });
     * </code></pre>
     * @public
     */
    tag.events.add = function (name, data) {
        var finalData = data;
        if (ATInternet.Utils.isObject(data)) {
            finalData = _getFinalObject(data);
        }
        var contextEventObject = tag.getContext(_origin) || [];
        var existingEvent = false;
        for (var i = 0; i < contextEventObject.length; i++) {
            if (typeof contextEventObject[i].hasOwnProperty(name)) {
                existingEvent = true;
                break;
            }
        }
        if (existingEvent) {
            tag.event.add(name, finalData, _origin);
        } else {
            tag.event.set(name, finalData, null, _origin);
        }
        /* @if debug */
        tag.debug('Events:events:add', _debug.level, _debug.messageEnd, {
            'name': name,
            'data': data,
            'origin': _origin,
            'existingEvent': existingEvent
        });
        /* @endif */
    };

    /**
     * [Helper added by plugin {@link ATInternet.Tracker.Plugins.Events Events}] Will be called by tracker.dispatch if any event has been set.
     * @alias event.onDispatch
     * @memberof! ATInternet.Tracker.Tag#
     * @function
     * @param callback {function} Callback to execute
     * @param elementType {string} Element type (mailto, form, redirection)
     * @private
     */
    tag.events.onDispatch = function (callback, elementType) {
        tag.event.onDispatch(callback, elementType, _origin);
    };

    // For unit tests on private elements !!!
    /* @if test */
    var _this = this;
    _this._getFinalObject = _getFinalObject;
    /* @endif */
};
ATInternet.Tracker.addPlugin('Events');