/**
* @class
* @classdesc Plugin used to manage clicks tag.
* @name Clicks
* @memberof ATInternet.Tracker.Plugins
* @type {function}
* @param tag {object} Instance of the Tag used
* @public
*/
ATInternet.Tracker.Plugins.Clicks = function (tag) {
'use strict';
var _this = this;
var _debug = {
level: 'DEBUG',
messageEnd: 'method ended'
};
var _config = {};
// Set specific plugin configuration.
// If global configuration already exists, set only undefined properties.
tag.configPlugin('Clicks', dfltPluginCfg || {}, function (newConf) {
_config = newConf;
});
/**
* Get the technical value for the click type
* @name _getClickType
* @memberof ATInternet.Tracker.Plugins.Clicks#
* @function
* @param typeclick {string} Label of the click type ('exit'/'download'/'action'/'navigation')
* @returns string {string} Click type ('S','T','A' or 'N'). Empty string if bad type provided
* @private
*/
var _getClickType = function (typeclick) {
var result = '';
switch (typeclick) {
case 'exit':
result = 'S';
break;
case 'download':
result = 'T';
break;
case 'action':
result = 'A';
break;
case 'navigation':
result = 'N';
break;
default:
break;
}
return result;
};
/**
* Get click and pclick labels with chapters
* @name _getFullName
* @memberof ATInternet.Tracker.Plugins.Clicks#
* @function
* @param tagObject {object} tag object
* @returns string {string} Click name completed with chapters present in tag object
* @private
*/
var _getFullName = function (tagObject) {
return tag.utils.manageChapters(tagObject, 'chapter', 3) + (tagObject.name ? tagObject.name : '');
};
/**
* Send click hit with a given tag ex: {elem:this,label:'myClick',level2:'',type:'navigation'}
* @name _sendClick
* @memberof ATInternet.Tracker.Plugins.Clicks#
* @function
* @param tagObject {object} tag object, can contain the following properties : label, chapter1, chapter2, chapter3, level2, type, elem, customObject
* @param elementType {string} Element type (mailto, form, redirection)
* @private
*/
var _sendClick = function (tagObject, elementType) {
var buffer = {
'p': _getFullName(tagObject),
's2': tagObject.level2 || '',
'click': _getClickType(tagObject.type) || ''
};
var hitType = ['click'];
var contextPageObject = tag.getContext('page') || {};
buffer.pclick = _getFullName(contextPageObject);
buffer.s2click = contextPageObject.level2 || '';
var customObjectValue = tagObject.customObject;
if (customObjectValue) {
var hitParam = 'stc';
customObjectValue = tag.processTagObject(hitParam, hitType, customObjectValue);
buffer[hitParam] = {
_value: ATInternet.Utils.jsonSerialize(customObjectValue),
_options: {
hitType: hitType,
encode: true,
separator: ',',
truncate: true
}
};
}
tag.sendHit(buffer, [['hitType', hitType]], tagObject.callback, _config.requestMethod, elementType);
};
/**
* [Object added by plugin {@link ATInternet.Tracker.Plugins.Clicks Clicks}] Tags for clicks.
* @name click
* @memberof ATInternet.Tracker.Tag
* @inner
* @type {Object}
* @property {function} send Tagging method for clicks (helper), see details here {@link ATInternet.Tracker.Tag#click.send}
* @property {function} set Alternative tagging method for clicks (helper), see details here {@link ATInternet.Tracker.Tag#click.set}
* @public
*/
tag.click = {};
/**
* [Object added by plugin {@link ATInternet.Tracker.Plugins.Clicks Clicks}] Tags for clicks using a listener.
* @name clickListener
* @memberof ATInternet.Tracker.Tag
* @inner
* @type {object}
* @property {function} send Tagging method for clicks (helper), see details here {@link ATInternet.Tracker.Tag#clickListener.send}
* @public
*/
tag.clickListener = {};
/**
* [Helper added by plugin {@link ATInternet.Tracker.Plugins.Clicks Clicks}] Tagging method for clicks (helper). This method should be called when the click happens.
* @alias click.send
* @memberof! ATInternet.Tracker.Tag#
* @function
* @param tagObject {object} tag object, must contain at least properties 'name' and 'type'. Should contain the property 'elem' to let the sdk manages the click redirection or submit if necessary
* @public
* @example
* <pre><code class="html"><a href="http://example.com/" onclick="return tracker.click.send({elem:this,name:'clickName',level2:'clickLvl2',type:'exit'});">link</a>
* </code></pre>
* @example
* <pre><code class="html"><a href="http://example.com/" onclick="return myFunction(this);">link</a>
* <script type="text/javascript">
* function myFunction(element){
* // your code
* return tracker.click.send({
* elem:element,
* name:'clickName',
* chapter1:'chap1',
* chapter2:'chap2',
* chapter3:'chap3',
* level2:'clickLvl2',
* type:'exit',
* event:eventObj,
* callback:callback
* });
* }
* </script>
* </code></pre>
*/
tag.click.send = function (tagObject) {
tagObject = tagObject || {};
var preservePropagation = true;
var elementType = '';
var eventObject = null;
if (tagObject.hasOwnProperty('event')) {
eventObject = tagObject.event || window.event;
}
if (tagObject.elem &&
(_config.requestMethod !== 'POST' || !ATInternet.Utils.isBeaconMethodAvailable()) &&
!ATInternet.Utils.isTabOpeningAction(eventObject)) {
var manage = tag.techClicks.manageClick(tagObject.elem, eventObject);
preservePropagation = manage.preservePropagation;
elementType = manage.elementType;
}
_sendClick(tagObject, elementType);
/* @if debug */
tag.debug('Clicks:click:send', _debug.level, _debug.messageEnd, tagObject);
/* @endif */
// Return false if the clicked element is managed
return preservePropagation;
};
/**
* [Helper added by plugin {@link ATInternet.Tracker.Plugins.Clicks Clicks}] Tagging method for clicks (helper). This method should be called when loading the page
* @alias clickListener.send
* @memberof! ATInternet.Tracker.Tag#
* @function
* @param tagObject {object} tag object
* @public
* @example
* <pre><code class="javascript">tracker.clickListener.send({
* elem:document.getElementById('myLink/myForm'),
* name:'clickName',
* chapter1:'chap1',
* chapter2:'chap2',
* chapter3:'chap3',
* level2:'clickLvl2',
* type:'exit'
* callback:callback
* });
* </code></pre>
*/
tag.clickListener.send = function (tagObject) {
tagObject = tagObject || {};
if (tagObject.elem) {
var event = 'click';
var elementType = '';
tag.plugins.exec('TechClicks', 'isFormSubmit', [tagObject.elem], function (data) {
event = data ? 'submit' : 'click';
});
ATInternet.Utils.addEvtListener(tagObject.elem, event, function (eventObject) {
if ((_config.requestMethod !== 'POST' || !ATInternet.Utils.isBeaconMethodAvailable()) &&
!ATInternet.Utils.isTabOpeningAction(eventObject)) {
elementType = tag.techClicks.manageClick(tagObject.elem, eventObject).elementType;
}
_sendClick(tagObject, elementType);
});
}
/* @if debug */
tag.debug('Clicks:clickListener:send', _debug.level, _debug.messageEnd, tagObject);
/* @endif */
};
/**
* [Helper added by plugin {@link ATInternet.Tracker.Plugins.Clicks Clicks}] Alternative tagging method for clicks (helper). Do not send the hit itself (it must be used with tracker.dispatch).
* @alias click.set
* @memberof! ATInternet.Tracker.Tag#
* @function
* @param tagObject {object} tag object, must contain at least properties 'name' and 'type' (and 'elem' if link/form with redirection/submit)
* @public
* @example
* <pre><code class="javascript">tracker.click.set({
* name:'clickName',
* chapter1:'chap1',
* chapter2:'chap2',
* chapter3:'chap3',
* level2:'clickLvl2',
* type:'exit'
* });
* //...
* tracker.dispatch();
* </code></pre>
*/
tag.click.set = function (tagObject) {
tagObject = tagObject || {};
tag.dispatchSubscribe('click');
tag.setContext('click', {
'name': _getFullName(tagObject),
'level2': (tagObject.level2 || ''),
'customObject': tagObject.customObject
});
tag.setParam('click', _getClickType(tagObject.type) || '', {hitType: ['click']});
/* @if debug */
tag.debug('Clicks:click:set', _debug.level, _debug.messageEnd, tagObject);
/* @endif */
};
/**
* [Helper added by plugin {@link ATInternet.Tracker.Plugins.Clicks Clicks}] Will be called by tracker.dispatch if any click has been set
* @alias click.onDispatch
* @memberof! ATInternet.Tracker.Tag#
* @function
* @param callback {function} Callback to execute
* @param elementType {string} Element type (mailto, form, redirection)
* @private
*/
tag.click.onDispatch = function (callback, elementType) {
var hitType = ['click'];
var contextClickObject = tag.getContext('click') || {};
var contextPageObject = tag.getContext('page') || {};
tag.setParam('pclick', _getFullName(contextPageObject), {hitType: hitType});
tag.setParam('s2click', contextPageObject.level2 || '', {hitType: hitType});
tag.setParam('p', contextClickObject.name, {hitType: hitType});
tag.setParam('s2', contextClickObject.level2, {hitType: hitType});
var contextObject = contextClickObject.customObject;
if (contextObject) {
var hitParam = 'stc';
var paramOptions = {
'hitType': hitType,
'encode': true,
'separator': ',',
'truncate': true,
'requestMethod': _config.requestMethod,
'elementType': elementType
};
tag.processContextObjectAndSendHit(hitParam, paramOptions, contextObject, callback);
} else {
tag.manageSend(function () {
tag.sendHit(null, [['hitType', hitType]], callback, _config.requestMethod, elementType);
});
}
tag.delContext('click');
};
// For unit tests on private elements !!!
/* @if test */
_this._sendClick = _sendClick;
_this._getClickType = _getClickType;
/* @endif */
};
ATInternet.Tracker.addPlugin('Clicks');