/**
* @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');