/**
* @class
* @classdesc Plugin used to manage publisher and self-promotion.
* @name OnSiteAds
* @memberof ATInternet.Tracker.Plugins
* @type {function}
* @param parent {object} Instance of the Tag used
* @public
*/
window['ATInternet']['Tracker']['Plugins']['OnSiteAds'] = function (parent) {
"use strict";
var self = this;
// Plugin's dependencies
var _dependencies = ['Utils', 'TechClicks'];
// Current url
var _href = "";
/**
* Get page label with chapters
* @memberof ATInternet.Tracker.Plugins.OnSiteAds#
* @function
* @param tagObject {object} page context
* @return string {string} Page name completed with chapters (all from page context)
* @private
*/
var _getFullName = function (tagObject) {
var name = tagObject['name'];
parent['exec']('Utils', 'manageChapters', [tagObject, 'chapter', 3], function (data) {
name = data + (name ? name : '');
});
return name;
};
/**
* Get a property in an object
* @memberof ATInternet.Tracker.Plugins.OnSiteAds#
* @function
* @param object {object} object to use
* @param key {string} key wanted
* @return string {*} Either the value otherwise an empty string
* @private
*/
var _getProperty = function (object, key) {
return (object[key] ? object[key] : '');
};
/**
* Build a Publisher or Self-Promotion campaign (based on tag data)
* @memberof ATInternet.Tracker.Plugins.OnSiteAds#
* @function
* @param tagObject {object} tag object
* @param clickOrImpression {string} key indicating which object is to process (either a "click" or an "impression")
* @return string {string} Campaign formatted depending on tag data
* @private
*/
var _buildCampaign = function (tagObject, clickOrImpression) {
var campaign = _getProperty(tagObject, clickOrImpression);
if (campaign) {
var prefix = _getProperty(tagObject, 'prefix');
if (campaign['campaignId']) { // publisher
prefix = prefix || 'PUB';
var campaignId = _getProperty(campaign, 'campaignId'),
creation = _getProperty(campaign, 'creation'),
variant = _getProperty(campaign, 'variant'),
formatPublisher = _getProperty(campaign, 'format'),
generalPlacement = _getProperty(campaign, 'generalPlacement'),
detailedPlacement = _getProperty(campaign, 'detailedPlacement'),
advertiserId = _getProperty(campaign, 'advertiserId'),
url = _getProperty(campaign, 'url');
return prefix + '-' + campaignId + '-' + creation + '-' + variant + '-' + formatPublisher + '-' + generalPlacement + '-' + detailedPlacement + '-' + advertiserId + '-' + url;
}
else if (campaign['adId']) { // selfpromotion
prefix = prefix || 'INT';
var adId = _getProperty(campaign, 'adId'),
formatSelfPromotion = _getProperty(campaign, 'format'),
productId = _getProperty(campaign, 'productId');
return prefix + '-' + adId + '-' + formatSelfPromotion + '||' + productId;
}
}
return '';
};
/**
* Send an individual campaign's click hit (hiType is "onSiteAdsClick")
* @memberof ATInternet.Tracker.Plugins.OnSiteAds#
* @function
* @param tagObject {object} tag object
* @private
*/
var _sendClick = function (tagObject) {
var hitType = ['onSiteAdsClick'];
var contextPageObject = parent['getContext']('page') || {};
var buffer = {};
buffer.atc = {
value: _buildCampaign(tagObject, 'click'),
options: {
truncate: true
}
};
buffer.type = 'AT';
buffer.patc = _getFullName(contextPageObject);
buffer.s2atc = contextPageObject['level2'] || '';
var customObjectValue = tagObject['customObject'];
if (customObjectValue) {
var hitParam = 'stc';
customObjectValue = parent.processObject(hitParam, hitType, customObjectValue);
buffer[hitParam] = {
value: ATInternet.Utils.jsonSerialize(customObjectValue),
options: {
encode: true
}
};
}
parent.sendHit(buffer, [['hitType', hitType]], tagObject['callback'], null, true);
};
/**
* Send an individual campaign's impression hit (hiType is "onSiteAdsImpression")
* @memberof ATInternet.Tracker.Plugins.OnSiteAds#
* @function
* @param tagObject {object} tag object
* @private
*/
var _sendImpression = function (tagObject) {
var hitType = ['onSiteAdsImpression'];
var buffer = {};
buffer.ati = {
value: _buildCampaign(tagObject, 'impression'),
options: {
truncate: true
}
};
buffer.type = 'AT';
//Safari preview.
if (ATInternet.Utils.isPreview() && parent.getConfig('preview')) {
buffer.pvw = 1;
}
var customObjectValue = tagObject['customObject'];
if (customObjectValue) {
var hitParam = 'stc';
customObjectValue = parent.processObject(hitParam, hitType, customObjectValue);
buffer[hitParam] = {
value: ATInternet.Utils.jsonSerialize(customObjectValue),
options: {
encode: true
}
};
}
parent.manageSend(function () {
parent.sendHit(buffer, [['hitType', hitType]], tagObject['callback'], null, true);
});
};
/**
* Push a new impression's campaign to be sent at dispatch
* @memberof ATInternet.Tracker.Plugins.OnSiteAds#
* @function
* @param campaignValue {object} campaign
* @param hitType {object} Either "selfPromotion" or "publisher"
* @private
*/
var _pushImpression = function (campaignValue, hitType) {
var ati = parent.buffer.get('ati', true) || {};
if (typeof ati.value === 'string') {
ati.value = [ati.value];
} else {
ati.value = ati.value || [];
}
ati.options = ati.options || {truncate: true, hitType: [hitType, 'page']};
ati.value.push(campaignValue);
parent.buffer.set('ati', ati.value, ati.options);
};
/**
* Set a campaign for a futur dispatch
* @memberof ATInternet.Tracker.Plugins.OnSiteAds#
* @function
* @param tagObject {object} tag object
* @param hitType {object} Either "selfPromotion" or "publisher"
* @private
*/
var _simpleSet = function (tagObject, hitType) {
if (tagObject['click']) {
parent.setParam("atc", _buildCampaign(tagObject, 'click'), {truncate: true, hitType: [hitType, 'page']});
} else if (tagObject['impression']) {
parent.setParam("ati", _buildCampaign(tagObject, 'impression'), {truncate: true, hitType: [hitType, 'page']});
}
if (tagObject['customObject']) {
parent.setContext('onsiteads', {customObject: tagObject['customObject']});
var contextPageObject = parent.getContext('page') || {};
contextPageObject.customObject = ATInternet.Utils.completeFstLevelObj(contextPageObject.customObject, tagObject['customObject'], false);
parent.setContext('page', contextPageObject);
}
parent.dispatchSubscribe('onSiteAds');
};
//Définition des helpers
/**
* [Object added by plugin {@link ATInternet.Tracker.Plugins.OnSiteAds OnSiteAds}] Tags for self-promotion campaigns
* @name selfPromotion
* @memberof ATInternet.Tracker.Tag
* @inner
* @type {object}
* @property {function} set Tag helper, see details here {@link ATInternet.Tracker.Tag#selfPromotion.set}
* @property {function} add Tag helper, see details here {@link ATInternet.Tracker.Tag#selfPromotion.add}
* @property {function} send Tag helper, see details here {@link ATInternet.Tracker.Tag#selfPromotion.send}
* @public
*/
parent['selfPromotion'] = self['selfPromotion'] = {};
/**
* [Object added by plugin {@link ATInternet.Tracker.Plugins.OnSiteAds OnSiteAds}] Tags for publisher campaigns
* @name publisher
* @memberof ATInternet.Tracker.Tag
* @inner
* @type {object}
* @property {function} set Tag helper, see details here {@link ATInternet.Tracker.Tag#publisher.set}
* @property {function} add Tag helper, see details here {@link ATInternet.Tracker.Tag#publisher.add}
* @property {function} send Tag helper, see details here {@link ATInternet.Tracker.Tag#publisher.send}
* @public
*/
parent['publisher'] = self['publisher'] = {};
/**
* [Helper added by plugin {@link ATInternet.Tracker.Plugins.OnSiteAds OnSiteAds}] Tagging method for publisher campaigns, to be used with the tag.dispatch() method
* @alias publisher.set
* @memberof! ATInternet.Tracker.Tag#
* @function
* @param tagObject {object} tagObject must contain a property 'click' or 'impression', you can force a specific prefix with a property 'prefix'
* @example
* <pre><code class="javascript">tag.publisher.set({
* impression:{
* campaignId : 'id[label]',
* creation : 'id[label]',
* variant : 'id[label]',
* format : '[120x40]',
* generalPlacement : '[label]',
* detailedPlacement : 'id[label]',
* advertiserId : 'id[label]',
* url : '[urlEncoded]'
* }
* });
* tag.dispatch();
* </code></pre>
* This will send a self-promotion campaign like : &atc=PUB-id[campaignId]-id[creation]-id[variant]-id-[generalPlacement]-[detailedPlacement]-id[advertiserId]-urlencoded
* @public
*/
parent['publisher']['set'] = self['publisher']['set'] = function (tagObject) {
_simpleSet(tagObject, 'publisher');
/* @if debug */
parent.debug('OnSiteAds:publisher:set', 'DEBUG', 'method ended', tagObject);
/* @endif */
};
/**
* [Helper added by plugin {@link ATInternet.Tracker.Plugins.OnSiteAds OnSiteAds}] Tagging method for self-promotion campaigns, to be used with the tag.dispatch() method
* @alias selfPromotion.set
* @memberof! ATInternet.Tracker.Tag#
* @function
* @param tagObject {object} tagObject must contain a property 'click' or 'impression', you can force a specific prefix with a property 'prefix'
* @example
* <pre><code class="javascript">tag.selfPromotion.set({
* impression : {
* adId : 'integer',
* format : 'id[format]',
* productId : 'productId'
* }
* });
* tag.dispatch();
* </code></pre>
* This will send a self-promotion campaign like : &ati=INT-integer-id[format]||productId
* <pre><code class="javascript">tag.selfPromotion.set({
* click : {
* adId : 'integer',
* format : 'id[format]',
* productId : 'productId'
* }
* });
* tag.dispatch();
* </code></pre>
* This will send a self-promotion campaign like : &atc=INT-integer-id[format]||productId
* <pre><code class="javascript">tag.selfPromotion.set({
* click : {
* adId : 'integer',
* format : 'id[format]',
* productId : 'productId'
* },
* prefix : 'VALUE',
* customObject:{one:1,two:2}
* });
* tag.dispatch();
* </code></pre>
* This will send a self-promotion campaign like : &atc=VALUE-integer-id[format]||productId
* @public
*/
parent['selfPromotion']['set'] = self['selfPromotion']['set'] = function (tagObject) {
_simpleSet(tagObject, 'selfPromotion');
/* @if debug */
parent.debug('OnSiteAds:selfPromotion:set', 'DEBUG', 'method ended', tagObject);
/* @endif */
};
/**
* [Helper added by plugin {@link ATInternet.Tracker.Plugins.OnSiteAds OnSiteAds}] Tagging method for publisher campaigns, allow to cumulate campaigns to be sent with the tag.dispatch() method
* @alias publisher.add
* @memberof! ATInternet.Tracker.Tag#
* @function
* @param tagObject {object} tagObject must contain a property 'click' or 'impression', you can force a specific prefix with a property 'prefix'
* @example
* <pre><code class="javascript">tag.publisher.add({
* impression:{
* campaignId : 'id[label]',
* creation : 'id[label]',
* variant : 'id[label]',
* format : '[120x40]',
* generalPlacement : '[label]',
* detailedPlacement : 'id[label]',
* advertiserId : 'id[label]',
* url : '[urlEncoded]'
* }
* });
* tag.publisher.add({
* impression:{
* campaignId : 'id2[label2]',
* creation : 'id2[label2]',
* variant : 'id2[label2]',
* format : '[60x40]',
* generalPlacement : '[label2]',
* detailedPlacement : 'id2[label2]',
* advertiserId : 'id2[label2]',
* url : '[urlEncoded2]'
* }
* });
* tag.dispatch();
* </code></pre>
* This will send a self-promotion campaign like : &atc=PUB-id[campaignId]-id[creation]-id[variant]-id-[generalPlacement]-[detailedPlacement]-id[advertiserId]-urlencoded
* @public
*/
parent['publisher']['add'] = self['publisher']['add'] = function (tagObject) {
_pushImpression(_buildCampaign(tagObject, 'impression'), 'publisher');
parent.dispatchSubscribe('onSiteAds');
/* @if debug */
parent.debug('OnSiteAds:publisher:add', 'DEBUG', 'method ended', tagObject);
/* @endif */
};
/**
* [Helper added by plugin {@link ATInternet.Tracker.Plugins.OnSiteAds OnSiteAds}] Tagging method for self-promotion campaigns, allow to cumulate campaigns to be sent with the tag.dispatch() method
* @alias selfPromotion.add
* @memberof! ATInternet.Tracker.Tag#
* @function
* @param tagObject {object} tagObject must contain a property 'click' or 'impression', you can force a specific prefix with a property 'prefix'
* @example
* <pre><code class="javascript">tag.selfPromotion.add({
* impression : {
* adId : 'integer',
* format : 'id[format]',
* productId : 'productId'
* }
* });
* tag.selfPromotion.add({
* impression : {
* adId : 'integer2',
* format : 'id2[format2]',
* productId : 'productId2'
* }
* });
* tag.dispatch();
* </code></pre>
* This will send a self-promotion campaign like : &ati=INT-integer-id[format]||productId,INT-integer2-id2[format2]||productId2
* @public
*/
parent['selfPromotion']['add'] = self['selfPromotion']['add'] = function (tagObject) {
_pushImpression(_buildCampaign(tagObject, 'impression'), 'selfPromotion');
parent.dispatchSubscribe('onSiteAds');
/* @if debug */
parent.debug('OnSiteAds:selfPromotion:add', 'DEBUG', 'method ended', tagObject);
/* @endif */
};
/**
* Generic method to send self-promotion or publisher campaigns.
* @memberof ATInternet.Tracker.Plugins.OnSiteAds#
* @function
* @param tagObject {object} tagObject should contain the campaign object, optionally a "customObject" and a "elem"(HTMLElement, to manage redirections)
* @private
*/
var _advertEvent = self["advertEvent"] = function (tagObject) {
var resultCheck = true;
// check if the clicked element should be managed and return false if it is the case, manageClick also adds the callback process if needed
parent['exec']('TechClicks', 'manageClick', [tagObject['elem'], tagObject['event']], function (data) {
resultCheck = data;
});
if (tagObject['click']) {
_sendClick(tagObject);
} else if (tagObject['impression']) {
_sendImpression(tagObject);
}
return resultCheck;
};
/**
* [Helper added by plugin {@link ATInternet.Tracker.Plugins.OnSiteAds OnSiteAds}] Alternative tagging method for publisher campaigns. This method manages redirections on click if necessary
* @alias publisher.send
* @memberof! ATInternet.Tracker.Tag#
* @function
* @param tagObject {object} The campaign , you can add a "customObject" property, and an "elem" property to manage redirection
* @example
* <pre><code class="html"><a href="..." onclick="return tag.publisher.send({elem:this,click:{campaignId:'id[label]',creation:'id[label]',variant:'id[label]',format:'[120x40]',generalPlacement:'[label]',detailedPlacement:'id[label]',advertiserId:'id[label]',url:'[urlEncoded]'}});">Pub</a>
* </code></pre>
* @public
*/
parent['publisher']['send'] = self['publisher']['send'] = function (tagObject) {
/* @if debug */
parent.debug('OnSiteAds:publisher:send', 'DEBUG', 'method started', tagObject);
/* @endif */
return _advertEvent(tagObject);
};
/**
* [Helper added by plugin {@link ATInternet.Tracker.Plugins.OnSiteAds OnSiteAds}] Alternative tagging method for self-promotion campaigns. This method manages redirections on click if necessary
* @alias selfPromotion.send
* @memberof! ATInternet.Tracker.Tag#
* @function
* @param tagObject {object} The campaign , you can add a "customObject" property, and an "elem" property to manage redirection
* @example
* <pre><code class="html"><a href="..." onclick="return tag.selfPromotion.send({elem:this,click:{adId:'id',format:'[120x40]',productId:'id'}});">Pub</a>
* </code></pre>
* @public
*/
parent['selfPromotion']['send'] = self['selfPromotion']['send'] = function (tagObject) {
/* @if debug */
parent.debug('OnSiteAds:selfPromotion:send', 'DEBUG', 'method started', tagObject);
/* @endif */
return _advertEvent(tagObject);
};
//'OnSitesAds' est le helper commun aux quatre définis avant.
//Il permet de définir une seule méthode 'send' pour les quatre.
/**
* [Object added by plugin {@link ATInternet.Tracker.Plugins.OnSiteAds OnSiteAds}] Tags for campaigns
* @name onSiteAds
* @memberof ATInternet.Tracker.Tag
* @inner
* @type {object}
* @private
*/
parent['onSiteAds'] = {};
/**
* [Helper added by plugin {@link ATInternet.Tracker.Plugins.OnSiteAds OnSiteAds}] Will be called by tracker.dispatch if any self-promotion/publisher set/add has been called
* @alias onSiteAds.onDispatch
* @memberof! ATInternet.Tracker.Tag#
* @function
* @param callback {function} Callback to execute
* @private
*/
parent['onSiteAds']['onDispatch'] = self['onDispatch'] = function (callback) {
if (!parent.dispatchSubscribed('page')) {
parent.setParam('type', 'AT', {hitType: ['publisher', 'selfPromotion']});
var contextPageObject = parent['getContext']('page') || {};
if (parent.getParam('atc')) {
parent.setParam('patc', _getFullName(contextPageObject), {hitType: ['publisher', 'selfPromotion']});
parent.setParam('s2atc', contextPageObject['level2'] || '', {hitType: ['publisher', 'selfPromotion']});
}
//Safari preview.
if (ATInternet.Utils.isPreview() && parent.getConfig('preview')) {
parent.setParam('pvw', 1);
}
var hitParam = 'stc';
var hitType = ['publisher', 'selfPromotion'];
var contextOnSiteAds = parent['getContext']('onsiteads') || {};
var contextObject = contextOnSiteAds.customObject;
parent.processObjectAndSendHit(hitParam, hitType, contextObject, callback);
}
};
/**
* Run process.
* @memberof ATInternet.Tracker.Plugins.OnSiteAds#
* @function
* @private
*/
var _run = function () {
_href = document.location.href;
parent['plugins']['exec']('Utils', 'getQueryStringValue', ['xtatc', _href], function (data) {
if (data) {
parent.setParam("atc", data, {hitType: ['publisher', 'selfPromotion', 'page']});
}
});
parent.emit('OnSiteAds:Ready', {
lvl: 'INFO',
details: {
href: _href
}
});
};
/**
* Initialize plugin.
* @memberof ATInternet.Tracker.Plugins.OnSiteAds#
* @function
* @private
*/
var _init = function () {
parent['plugins']['waitForDependencies'](_dependencies, _run);
};
_init();
/* @if test */
self['_sendClick'] = _sendClick;
self['_sendImpression'] = _sendImpression;
/* @endif */
};
window['ATInternet']['Tracker']['addPlugin']('OnSiteAds');